#include #include #include #include #include #include #include #include #include #include #include #include "serial_io.h" sig_atomic_t stop = false; constexpr int HISTORY_SIZE = 100; void intHandler(int dummy) { stop = true; } 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" <<"-s, --sinkless run without serial port\n"; } struct Config { std::string portFileName = "/dev/ttyUSB0"; unsigned short port = 6856; int baud = B9600; bool noSerial = 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]) == "--baud" || std::string(argv[i]) == "-b") { if(argc > i) config->baud = atoi(argv[i+1]); else return -1; } else if (std::string(argv[i]) == "-r" || std::string(argv[i]) == "--rates") { printRates(); return -1; } } return 0; } void recvThreadFunction(int serial, int exitfd) { int pollQue = epoll_create1(0); struct epoll_event ev = {}; ev.events = EPOLLIN; ev.data.fd = serial; epoll_ctl(pollQue, EPOLL_CTL_ADD, serial, &ev); ev.events = EPOLLIN; ev.data.fd = exitfd; epoll_ctl(pollQue, EPOLL_CTL_ADD, exitfd, &ev); struct epoll_event event; int ret; while((ret = epoll_wait(pollQue, &event, 1, -1)) > 0) { if(event.data.fd == exitfd) break; std::this_thread::sleep_for(std::chrono::milliseconds(100)); char buffer[4096]; int readlen = sRead(serial, buffer, 4095); if(readlen > 0) { buffer[readlen] = '\0'; rl_clear_visible_line(); std::cout< ", cb_linehandler); int pollQue = epoll_create1(0); struct epoll_event ev = {}; ev.events = EPOLLIN; ev.data.fd = fileno(rl_instream); epoll_ctl(pollQue, EPOLL_CTL_ADD, fileno(rl_instream), &ev); ev.events = EPOLLIN; ev.data.fd = sigfd; epoll_ctl(pollQue, EPOLL_CTL_ADD, sigfd, &ev); struct epoll_event event; while((ret = epoll_wait(pollQue, &event, 1, -1)) > 0) { if(event.data.fd == sigfd) { write(exitPipe[1], "\n", 1); break; } else { rl_callback_read_char(); } } readThread.join(); close(pollQue); close(sigfd); rl_callback_handler_remove(); std::cout<