X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/e2776af8fe91dec685980fd5ef75736be9d6402d..58151f8289c0da0d173bdfb0452e98dc784f64c2:/hmsniff.c diff --git a/hmsniff.c b/hmsniff.c index 9ce1fce..39133d3 100644 --- a/hmsniff.c +++ b/hmsniff.c @@ -32,6 +32,7 @@ #include #include +#include "version.h" #include "hexdump.h" #include "hmcfgusb.h" @@ -134,16 +135,29 @@ static void dissect_hm(uint8_t *buf, int len) } -static void parse_hmcfgusb(uint8_t *buf, int buf_len, void *data) +struct recv_data { + int wrong_hmid; +}; + +static int parse_hmcfgusb(uint8_t *buf, int buf_len, void *data) { + struct recv_data *rdata = data; + if (buf_len < 1) - return; + return 1; switch(buf[0]) { case 'E': dissect_hm(buf + 13, buf[13] + 1); break; case 'H': + if ((buf[27] != 0x00) || + (buf[28] != 0x00) || + (buf[29] != 0x00)) { + printf("hmId is currently set to: %02x%02x%02x\n", buf[27], buf[28], buf[29]); + rdata->wrong_hmid = 1; + } + break; case 'R': case 'I': break; @@ -151,39 +165,61 @@ static void parse_hmcfgusb(uint8_t *buf, int buf_len, void *data) hexdump(buf, buf_len, "Unknown> "); break; } -} + return 1; +} int main(int argc, char **argv) { struct hmcfgusb_dev *dev; + struct recv_data rdata; int quit = 0; hmcfgusb_set_debug(0); - dev = hmcfgusb_init(parse_hmcfgusb, NULL); - if (!dev) { - fprintf(stderr, "Can't initialize HM-CFG-USB!\n"); - return EXIT_FAILURE; - } + do { + memset(&rdata, 0, sizeof(rdata)); + rdata.wrong_hmid = 0; - hmcfgusb_send(dev, (unsigned char*)"A\00\00\00", 3, 1); + dev = hmcfgusb_init(parse_hmcfgusb, &rdata); + if (!dev) { + fprintf(stderr, "Can't initialize HM-CFG-USB, retrying in 1s...\n"); + sleep(1); + continue; + } + printf("HM-CFG-USB opened!\n"); - while(!quit) { - int fd; + hmcfgusb_send_null_frame(dev, 1); + hmcfgusb_send(dev, (unsigned char*)"K", 1, 1); - fd = hmcfgusb_poll(dev, 3600); - if (fd >= 0) { - fprintf(stderr, "activity on unknown fd %d!\n", fd); - continue; - } else if (fd == -1) { - if (errno) { - perror("hmcfgusb_poll"); - quit = 1; + while(!quit) { + int fd; + + if (rdata.wrong_hmid) { + printf("changing hmId to 000000, this might reboot the device!\n"); + hmcfgusb_send(dev, (unsigned char*)"A\00\00\00", 4, 1); + rdata.wrong_hmid = 0; + hmcfgusb_send(dev, (unsigned char*)"K", 1, 1); + } + fd = hmcfgusb_poll(dev, 1); + if (fd >= 0) { + fprintf(stderr, "activity on unknown fd %d!\n", fd); + continue; + } else if (fd == -1) { + if (errno) { + if (errno != ETIMEDOUT) { + perror("hmcfgusb_poll"); + break; + } else { + /* periodically wakeup the device */ + hmcfgusb_send_null_frame(dev, 1); + } + } } } - } - hmcfgusb_close(dev); + hmcfgusb_close(dev); + } while (!quit); + return EXIT_SUCCESS; }