X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=client%2Fbodet.cpp;h=4a2e14d83162642d5465b1cb8d7465fad18d9184;hb=4d2991a8d05b23222912fb904b436af5f4d740c2;hp=840094a840f048cc7d7dc79c616d449edf10eb2c;hpb=736f1e8c2166cf327506423b05dd1ab7b17a4d68;p=ultimatescore diff --git a/client/bodet.cpp b/client/bodet.cpp index 840094a..4a2e14d 100644 --- a/client/bodet.cpp +++ b/client/bodet.cpp @@ -1,13 +1,26 @@ // Bodet BT-6000 decoder. +#include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include +#include + using namespace std; +int sock; +sockaddr_in6 saddr6; + void process(const string &buf) { unsigned char checksum = 0; @@ -22,19 +35,64 @@ void process(const string &buf) // fprintf(stderr, "discarding message with broken checksum: [%s] [%x vs. %x]\n", buf.c_str(), checksum, buf.back()); } else { string realmsg = buf.substr(3, buf.size() - 5); - fprintf(stderr, "msg: [%s]\n", realmsg.c_str()); + sendto(sock, realmsg.data(), realmsg.size(), 0, (sockaddr *)&saddr6, sizeof(saddr6)); } } int main(int argc, char **argv) { - // TODO: open serial port + sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); + if (sock == -1) { + perror("socket"); + exit(1); + } + + int one = 1; + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1) { + perror("setsockopt"); + exit(1); + } + + memset(&saddr6, 0, sizeof(saddr6)); + saddr6.sin6_family = AF_INET6; + if (argc >= 2) { + if (inet_pton(AF_INET6, argv[1], &saddr6.sin6_addr) != 1) { + fprintf(stderr, "Invalid address '%s'\n", argv[1]); + exit(1); + } + } else { + inet_pton(AF_INET6, "::1", &saddr6.sin6_addr); + } + + int port = 6000; + if (argc >= 3) { + port = atoi(argv[2]); + } + saddr6.sin6_port = htons(port); + + const char *serialpath = "/dev/ttyUSB0"; + if (argc >= 4) { + serialpath = argv[3]; + } + int serialfd = open(serialpath, O_RDWR); + if (serialfd == -1) { + perror(serialpath); + exit(1); + } + + struct termios options; + memset(&options, 0, sizeof(options)); + options.c_cflag = B9600 | CS8 | CLOCAL | CREAD; + options.c_iflag = IGNBRK | IGNPAR; + options.c_lflag = 0; + options.c_cc[VMIN] = 1; // Blocking read, minimum one byte. + tcsetattr(serialfd, TCSANOW, &options); string buf; for ( ;; ) { char ch; - int ret = read(0, &ch, 1); + int ret = read(serialfd, &ch, 1); if (ret == -1) { perror("read"); exit(1); @@ -44,6 +102,8 @@ int main(int argc, char **argv) exit(1); } + putchar(ch); + fflush(stdout); if (ch == 1) { // SOH buf = ch; continue;