Richard Hughes f9061b7
--- spectro/colorhug.c.old	2012-08-21 10:25:31.822454477 +0100
Richard Hughes f9061b7
+++ spectro/colorhug.c	2012-08-21 10:46:44.867367427 +0100
Richard Hughes f9061b7
@@ -213,15 +213,16 @@ colorhug_command(colorhug *p,
Richard Hughes f9061b7
 	rv = colorhug_interp_code((inst *)p, icoms2colorhug_err(ua));
Richard Hughes f9061b7
 	if (isdeb)
Richard Hughes f9061b7
 		fprintf(stderr,"colorhug: ICOM err 0x%x\n",ua);
Richard Hughes f9061b7
-	if (rv == inst_ok && wbytes != in_size + 1)
Richard Hughes f9061b7
+	if (rv == inst_ok && (wbytes != in_size + 1 && rbytes != 64))
Richard Hughes f9061b7
 		rv = colorhug_interp_code((inst *)p, COLORHUG_BAD_WR_LENGTH);
Richard Hughes f9061b7
 
Richard Hughes f9061b7
 	if (rv != inst_ok) {
Richard Hughes f9061b7
 		/* Flush any response if write failed */
Richard Hughes f9061b7
+		fprintf(stderr,"colorhug: flushing as write failed\n");
Richard Hughes f9061b7
 		if (p->icom->is_hid) {
Richard Hughes f9061b7
-			p->icom->hid_read(p->icom, buf, out_size + 2, &rbytes, timeout);
Richard Hughes f9061b7
+			p->icom->hid_read(p->icom, buf, 64, &rbytes, timeout);
Richard Hughes f9061b7
 		} else {
Richard Hughes f9061b7
-			p->icom->usb_read(p->icom, 0x81, buf, out_size + 2, &rbytes, timeout);
Richard Hughes f9061b7
+			p->icom->usb_read(p->icom, 0x81, buf, 64, &rbytes, timeout);
Richard Hughes f9061b7
 		}
Richard Hughes f9061b7
 		p->icom->debug = isdeb;
Richard Hughes f9061b7
 		return rv;
Richard Hughes f9061b7
@@ -232,11 +233,16 @@ colorhug_command(colorhug *p,
Richard Hughes f9061b7
 		fprintf(stderr,"colorhug: Reading response\n");
Richard Hughes f9061b7
 
Richard Hughes f9061b7
 	if (p->icom->is_hid) {
Richard Hughes f9061b7
-		se = p->icom->hid_read(p->icom, buf, out_size + 2, &rbytes, timeout);
Richard Hughes f9061b7
+		se = p->icom->hid_read(p->icom, buf, 64, &rbytes, timeout);
Richard Hughes f9061b7
 	} else {
Richard Hughes f9061b7
-		se = p->icom->usb_read(p->icom, 0x81, buf, out_size + 2, &rbytes, timeout);
Richard Hughes f9061b7
+		se = p->icom->usb_read(p->icom, 0x81, buf, 64, &rbytes, timeout);
Richard Hughes f9061b7
 	}
Richard Hughes f9061b7
 
Richard Hughes f9061b7
+	/* ColorHug firmware < 1.2.0 returned less than 64 bytes which was
Richard Hughes f9061b7
+	 * specified in the HID descriptor */
Richard Hughes f9061b7
+	if ((se & ICOM_SHORT) > 0)
Richard Hughes f9061b7
+		se &= ~ICOM_SHORT;
Richard Hughes f9061b7
+
Richard Hughes f9061b7
 	if (isdeb && rbytes >= 2) {
Richard Hughes f9061b7
 		fprintf(stderr,"Recieved cmd '%s' error '%s' args '%s'\n",
Richard Hughes f9061b7
 				inst_desc(buf[1]),
Richard Hughes f9061b7
@@ -254,7 +260,7 @@ colorhug_command(colorhug *p,
Richard Hughes f9061b7
 		}
Richard Hughes f9061b7
 
Richard Hughes f9061b7
 		/* deal with underrun or overrun */
Richard Hughes f9061b7
-		if (rbytes != out_size + 2) {
Richard Hughes f9061b7
+		if (rbytes != out_size + 2 && rbytes != 64) {
Richard Hughes f9061b7
 			rv = colorhug_interp_code((inst *)p, COLORHUG_BAD_RD_LENGTH);
Richard Hughes f9061b7
 			p->icom->debug = isdeb;
Richard Hughes f9061b7
 			return rv;