|
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;
|