visomat-data-downloader: increase the eeprom buffer size
[visomat-utils.git] / src / visomat-data-downloader.c
index 69f62d6..b471dc9 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include <stdio.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
@@ -57,6 +58,7 @@ static void debug_dump_buffer(const char *filename, uint8_t *buffer, unsigned in
 #define VISOMAT_INTERFACE     1
 #define VISOMAT_EP_IN         0x82
 #define VISOMAT_EP_OUT        0x03
+#define VISOMAT_PACKET_SIZE   64
 
 #define STX 0x02
 #define ETX 0x03
@@ -280,7 +282,7 @@ static int get_response(libusb_device_handle *dev,
 {
        int ret;
        int transferred;
-       uint8_t response[64] = { 0 };
+       uint8_t response[VISOMAT_PACKET_SIZE] = { 0 };
        unsigned int i;
 
        i = 0;
@@ -313,8 +315,8 @@ static int get_response(libusb_device_handle *dev,
 #define visomat_device libusb_device_handle
 static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask)
 {
-       /* Assuming an EEPROM of 1 KiB  */
-       uint8_t buffer[1024] = { 0 };
+       /* Assuming an EEPROM of 4 KiB  */
+       uint8_t buffer[4096] = { 0 };
        int ret;
 
        ret = send_command(dev, VISOMAT_CMD_DUMP_EEPROM);
@@ -322,12 +324,11 @@ static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask)
                return ret;
 
        ret = get_response(dev, buffer, sizeof(buffer));
+       debug("buffer size: %d\n", ret);
+       debug_dump_buffer("eeprom.bin", buffer, sizeof(buffer));
        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;
@@ -355,12 +356,38 @@ static int visomat_get_datetime(visomat_device *dev)
        return 0;
 }
 
-int main(void)
+static void usage(const char *name)
+{
+       printf("usage: %s [OPTIONS]\n\n", name);
+       printf("OPTIONS:\n");
+       printf("\t-D\t\tenable libusb debug output\n");
+       printf("\t-h\t\tthis help message\n");
+}
+
+int main(int argc, char *argv[])
 {
        int ret;
+       int opt;
+       bool enable_libusb_debug = false;
        libusb_device_handle *dev;
        int current_configuration;
 
+       while ((opt = getopt(argc, argv, "Dh")) != -1) {
+               switch (opt) {
+               case 'D':
+                       enable_libusb_debug = true;
+                       break;
+               case 'h':
+                       usage(argv[0]);
+                       ret = 0;
+                       goto out;
+               default: /* '?' */
+                       usage(argv[0]);
+                       ret = -EINVAL;
+                       goto out;
+               }
+       }
+
        ret = libusb_init(NULL);
        if (ret < 0) {
                fprintf(stderr, "libusb_init failed: %s\n",
@@ -368,7 +395,8 @@ int main(void)
                goto out;
        }
 
-       libusb_set_debug(NULL, LIBUSB_LOG_LEVEL_INFO);
+       libusb_set_debug(NULL, enable_libusb_debug ?
+                        LIBUSB_LOG_LEVEL_DEBUG : LIBUSB_LOG_LEVEL_INFO);
 
        dev = libusb_open_device_with_vid_pid(NULL,
                                              VISOMAT_DEVICE_VID,