#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 signal) { 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 = signal; epoll_ctl(pollQue, EPOLL_CTL_ADD, signal, &ev); struct epoll_event event; int ret; while((ret = epoll_wait(pollQue, &event, 1, -1)) > 0) { if(event.data.fd == signal) break; std::this_thread::sleep_for(std::chrono::milliseconds(100)); char buffer[4096]; int readlen = sRead(serial, buffer, 4096); if(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; int ret; while((ret = epoll_wait(pollQue, &event, 1, -1)) > 0) { if(event.data.fd == sigfd) break; else rl_callback_read_char(); } readThread.join(); close(pollQue); close(sigfd); rl_callback_handler_remove(); std::cout<