X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/8292227818502c3b791fc8b92f45f26ca8e7c551..b229c8789d8ad902ebc32da0e6f0ec95871b45e8:/hmsniff.c diff --git a/hmsniff.c b/hmsniff.c index 7cc20c1..a3cbe7a 100644 --- a/hmsniff.c +++ b/hmsniff.c @@ -29,12 +29,10 @@ #include #include #include -#include -#include -#include -#include +#include #include +#include "version.h" #include "hexdump.h" #include "hmcfgusb.h" @@ -95,8 +93,17 @@ char *hm_message_types(uint8_t type) static void dissect_hm(uint8_t *buf, int len) { + struct timeval tv; + struct tm *tmp; + char ts[32]; int i; + gettimeofday(&tv, NULL); + tmp = localtime(&tv.tv_sec); + memset(ts, 0, sizeof(ts)); + strftime(ts, sizeof(ts)-1, "%Y-%m-%d %H:%M:%S", tmp); + printf("%s.%06ld: ", ts, tv.tv_usec); + for (i = 0; i < len; i++) { printf("%02X", buf[i]); } @@ -128,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; @@ -145,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, 1000); + 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; }