libftdi: (tomj) reset internal readbuffer offsets for reset()/purge_buffers()
[libftdi] / ftdi / ftdi.c
index e7aaae7..557a38e 100644 (file)
@@ -20,7 +20,7 @@
 
 /* ftdi_init return codes:
    0: all fine
-  -1: couldn't allocate (64 byte) read buffer
+  -1: couldn't allocate read buffer
 */
 int ftdi_init(struct ftdi_context *ftdi) {
     ftdi->usb_dev = NULL;
@@ -117,6 +117,9 @@ int ftdi_usb_reset(struct ftdi_context *ftdi) {
         return -1;
     }
 
+    ftdi->readbuffer_offset = 0;
+    ftdi->readbuffer_remaining = 0;
+
     return 0;
 }
 
@@ -125,6 +128,9 @@ int ftdi_usb_purge_buffers(struct ftdi_context *ftdi) {
         ftdi->error_str = "FTDI purge of RX buffer failed";
         return -1;
     }
+    
+    ftdi->readbuffer_offset = 0;
+    ftdi->readbuffer_remaining = 0;
 
     if (usb_control_msg(ftdi->usb_dev, 0x40, 0, 2, 0, NULL, 0, ftdi->usb_timeout) != 0) {
         ftdi->error_str = "FTDI purge of TX buffer failed";
@@ -276,10 +282,8 @@ int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) {
 
        // printf("Got bytes from buffer: %d\n", ftdi->readbuffer_remaining);
 
-       // Fix offsets
+       // Fix offset
        offset += ftdi->readbuffer_remaining;
-       ftdi->readbuffer_remaining = 0;
-       ftdi->readbuffer_offset = 0;
     }
     
     // do the actual USB read
@@ -318,10 +322,11 @@ int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) {
 
                ftdi->readbuffer_offset += part_size;
                ftdi->readbuffer_remaining = ret-part_size;
+               offset += part_size;
                
                // printf("Returning part: %d - size: %d - offset: %d - ret: %d - remaining: %d\n", part_size, size, offset, ret, ftdi->readbuffer_remaining);
 
-               return part_size;
+               return offset;
            }
        }
     }