visomat-data-downloader: add some debug facilities
[visomat-utils.git] / src / visomat-data-downloader.c
index b0a8007..69f62d6 100644 (file)
 #include <unistd.h>
 #include <libusb.h>
 
+#ifdef DEBUG
+#define debug(...) fprintf(stderr, __VA_ARGS__)
+static void debug_dump_buffer(const char *filename, uint8_t *buffer, unsigned int len)
+{
+       FILE *dump_file;
+
+       dump_file = fopen(filename, "wb");
+       if (dump_file == NULL) {
+               fprintf(stderr, "Failed to open %s: %s\n", filename, strerror(errno));
+               return;
+       }
+
+       fwrite(buffer, 1, len, dump_file);
+       fclose(dump_file);
+}
+#else
+#define debug(...) do {} while(0)
+static void debug_dump_buffer(const char *filename, uint8_t *buffer, unsigned int len)
+{
+       (void)filename;
+       (void)buffer;
+       (void)len;
+}
+#endif
+
 #define VISOMAT_DEVICE_VID    0x1247
 #define VISOMAT_DEVICE_PID    0x00f8
 #define VISOMAT_CONFIGURATION 1
@@ -71,7 +96,7 @@ struct pressure  {
        unsigned int pulses;
 };
 
-static inline int extract_datetime(unsigned char *buffer, struct datetime *d)
+static inline int extract_datetime(uint8_t *buffer, struct datetime *d)
 {
        int ret;
 
@@ -120,7 +145,7 @@ static void print_record_csv_compat(struct datetime *d, struct pressure *p)
 }
 
 /* TODO: it would be better to separate decoding data from printing it */
-static int decode_eeprom(unsigned char *buffer,
+static int decode_eeprom(uint8_t *buffer,
                         unsigned int len,
                         unsigned int user_mask)
 {
@@ -133,8 +158,15 @@ static int decode_eeprom(unsigned char *buffer,
        struct datetime d;
        struct pressure p;
 
-       if (buffer[0] != STX || buffer[1] != 'M' || buffer[len - 1] != ETX)
+       if (buffer[0] != STX || buffer[1] != 'M') {
+               fprintf(stderr, "Usupported data.\n");
                return -EINVAL;
+       }
+
+       if (buffer[len - 1] != ETX) {
+               fprintf(stderr, "Bad terminator in data. Buffer too small?\n");
+               return -EINVAL;
+       }
 
        /* skip the initial STX */
        i = 1;
@@ -196,12 +228,12 @@ static int decode_eeprom(unsigned char *buffer,
        return 0;
 }
 
-static int decode_datetime(unsigned char *buffer, unsigned int len)
+static int decode_datetime(uint8_t *buffer, unsigned int len)
 {
        int ret;
-       unsigned char code[4] = { 0 };
+       uint8_t code[4] = { 0 };
        struct datetime d;
-       unsigned char *pbuffer = buffer;
+       uint8_t *pbuffer = buffer;
 
        if (len != 15)
                return -EINVAL;
@@ -224,7 +256,7 @@ static int send_command(libusb_device_handle *dev, visomat_command cmd)
 {
        int ret;
        int transferred;
-       unsigned char request[5];
+       uint8_t request[5];
 
        request[0] = STX;
        request[1] = command_codes[cmd][0];
@@ -243,12 +275,12 @@ static int send_command(libusb_device_handle *dev, visomat_command cmd)
 }
 
 static int get_response(libusb_device_handle *dev,
-                       unsigned char *buffer,
+                       uint8_t *buffer,
                        unsigned int len)
 {
        int ret;
        int transferred;
-       unsigned char response[64] = { 0 };
+       uint8_t response[64] = { 0 };
        unsigned int i;
 
        i = 0;
@@ -282,7 +314,7 @@ static int get_response(libusb_device_handle *dev,
 static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask)
 {
        /* Assuming an EEPROM of 1 KiB  */
-       unsigned char buffer[1024] = { 0 };
+       uint8_t buffer[1024] = { 0 };
        int ret;
 
        ret = send_command(dev, VISOMAT_CMD_DUMP_EEPROM);
@@ -293,6 +325,9 @@ static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask)
        if (ret < 0)
                return ret;
 
+       debug("buffer len: %d\n", ret);
+       debug_dump_buffer("eeprom.bin", buffer, sizeof(buffer));
+
        ret = decode_eeprom(buffer, ret, user_mask);
        if (ret < 0)
                return ret;
@@ -302,7 +337,7 @@ static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask)
 
 static int visomat_get_datetime(visomat_device *dev)
 {
-       unsigned char buffer[255] = { 0 };
+       uint8_t buffer[255] = { 0 };
        int ret;
 
        ret = send_command(dev, VISOMAT_CMD_GET_DATETIME);
@@ -386,7 +421,7 @@ int main(void)
        }
 
        if (current_configuration != VISOMAT_CONFIGURATION) {
-               fprintf(stderr, "libusb configuration changed (expected: %d, current: %d\n",
+               fprintf(stderr, "libusb configuration changed (expected: %d, current: %d)\n",
                        VISOMAT_CONFIGURATION, current_configuration);
                ret = -EINVAL;
                goto out_libusb_release_interface;