#include #include #include #include #include #include #include #include #include #include #include #include "serial_io.h" #include "Socket.h" #define VERSION "v0.4" volatile bool stop = false; volatile bool resettSerialPort = false; void intHandler(int sig) { stop = true; } void alarmHandler(int sig) { resettSerialPort = true; signal(sig, alarmHandler); alarm(600); } static void printUsage() { std::cout<<"usage mulitplexer [option]\n\ Available options:\n\ -h, --help print this help\n\ -p, --serialport serial port device to use\n\ -P, --port tcp port to use\n\ -b, --baud set baud rate with termios id\n\ -r, --rates list Available baud rates\n\ -v, --verbose Run in verbose mode\n\ -i, --spreint Peridoicly reinit serialport\n\ -s, --sinkless run without serial port\n"; } struct Config { std::string portFileName = "/dev/ttyUSB0"; unsigned short port = 6856; int baud = B9600; bool noSerial = false; bool verbose = false; bool reinit = false; }; static int parseCmdArgs(int argc, char** argv, Config *config) { for (int i = 1; i < argc; i++) { if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h") { printUsage(); return -1; } else if (std::string(argv[i]) == "--serialport" || std::string(argv[i]) == "-p") { if(argc > i) config->portFileName = argv[i+1]; else return -1; } else if (std::string(argv[i]) == "--port" || std::string(argv[i]) == "-P") { if(argc > i) config->port = atoi(argv[i+1]); else return -1; } else if (std::string(argv[i]) == "--baud" || std::string(argv[i]) == "-b") { if(argc > i) config->baud = atoi(argv[i+1]); else return -1; } else if (std::string(argv[i]) == "--sinkless" || std::string(argv[i]) == "-s" ) { config->noSerial=true; } else if (std::string(argv[i]) == "-r" || std::string(argv[i]) == "--rates") { printRates(); return -1; } else if (std::string(argv[i]) == "-v" || std::string(argv[i]) == "--verbose") { config->verbose=true; } else if (std::string(argv[i]) == "-i" || std::string(argv[i]) == "--spreint") { config->reinit=true; } } return 0; } void acceptThreadFunction( TCPServerSocket* servSock, std::vector* clientSockets ) { while(!stop) { TCPSocket* newSock = servSock->accept(); if(newSock != nullptr) { clientSockets->push_back(newSock); // Wait for a client to connect clientSockets->back()->send("UVOS serial multiplexer " VERSION "\n", sizeof("UVOS serial multiplexer " VERSION "\n")-1); std::cout<<"got client\n"; } std::this_thread::sleep_for(std::chrono::milliseconds(200)); } } int openSerialPort(const Config& config) { int serial = -1; if(!config.noSerial) { std::cout<<"Opeing serial port: "< clientSockets; std::thread* acceptThread; TCPServerSocket* servSock; std::cout<<"opening TCP socket on port "<setBlocking(false); acceptThread = new std::thread(acceptThreadFunction, servSock, &clientSockets); } catch(SocketException &e) { std::cerr<<"Could not open port"< 0) { if(config.verbose) { std::cout<<"bcst: "; for( int j = 0; j < readlen; j++ )std::cout<send(buffer, readlen); } char inBuffer[4096]; int reclen = clientSockets[i]->recv(inBuffer, 4096); if( reclen > 0 ) { if(config.verbose) { std::cout<<"rec: "; for( int j = 0; j < reclen; j++ )std::cout<send(inBuffer+6, reclen-6); } else if(strncmp( inBuffer, "reinitsp", 8) == 0 && serial != -1) { if(serialport_set_config(serial, config.baud) == 0) { char response[] = "reinit serial port succsesfull\n"; std::cerr<send(response, sizeof(response)); } else { char response[] = "reinit serial port failed!\n"; std::cerr<send(response, sizeof(response)); } } else { if(config.verbose) { std::cout<<"wrote \""; for( int j = 0; j < reclen; j++ )std::cout<cleanUp(); clientSockets.erase(clientSockets.begin()+i); i--; if(i < 0) i=0; } } catch(SocketException &e) { std::cout<cleanUp(); clientSockets.erase(clientSockets.begin()+i); i--; if(i < 0) i=0; } } if(resettSerialPort) { close(serial); serial = openSerialPort(config); resettSerialPort = false; } std::this_thread::sleep_for(std::chrono::milliseconds(10)); } acceptThread->join(); delete acceptThread; for(unsigned int i = 0; i < clientSockets.size(); i++) clientSockets[i]->cleanUp(); servSock->cleanUp(); delete servSock; return 0; }