#error BYTE_ORDER not defined/known!
#endif
-#define USB_ERROR(x) do { if (x < 0) { fprintf(stderr, "usb: %s\n", usb_strerror()); exit(EXIT_FAILURE); } } while(0)
+#define USB_ERROR(s, x) do { if (x < 0) { fprintf(stderr, "usb %s: %s\n", s, usb_strerror()); usb_reset(sc->usb.dev); return 0; } } while(0)
/* This routine locates a scope by VID/PID and returns a struct scope* for it */
static struct scope* usbtmc_find_scope() {
r=usb_bulk_write(sc->usb.dev, sc->usb.ep_bulk_out,
(char*)req, sizeof(struct usbtmc_header),
USB_TIMEOUT);
- USB_ERROR(r);
+ USB_ERROR("USBTMC_DEV_DEP_MSG_OUT1", r);
r=usb_bulk_write(sc->usb.dev, sc->usb.ep_bulk_out,
(char*)&(req->msg), len - sizeof(struct usbtmc_header),
USB_TIMEOUT);
- USB_ERROR(r);
+ USB_ERROR("USBTMC_DEV_DEP_MSG_OUT2", r);
} else {
r=usb_bulk_write(sc->usb.dev, sc->usb.ep_bulk_out,
(char*)req, len, USB_TIMEOUT);
- USB_ERROR(r);
+ USB_ERROR("USBTMC_DEV_DEP_MSG_OUT", r);
}
free(req);
req->bTag = sc->usb.bTag;
req->bTagInverse = ~sc->usb.bTag;
req->TransferSize = LE32(sc->usb.wMaxPacketSize_in);
- req->bmTransferAttributes = 0;
+ req->bmTransferAttributes = USBTMC_TRANSFERATTRIB_EOM;
req->TermChar = 0;
/* send read command */
r=usb_bulk_write(sc->usb.dev, sc->usb.ep_bulk_out,
(char*)req, sizeof(struct usbtmc_header), USB_TIMEOUT);
- USB_ERROR(r);
+ USB_ERROR("USBTMC_REQUEST_DEV_DEP_MSG_IN", r);
free(req);
r=usb_bulk_read(sc->usb.dev, sc->usb.ep_bulk_in,
(char*)buff, sc->usb.wMaxPacketSize_in, USB_TIMEOUT);
- USB_ERROR(r);
+ USB_ERROR("USBTMC_DEV_DEP_MSG_IN1", r);
if (r < sizeof(struct usbtmc_header)) {
fprintf(stderr, "Short read!\n");
r=usb_bulk_read(sc->usb.dev, sc->usb.ep_bulk_in,
(char*)buff + bytes_read, len - bytes_read,
USB_TIMEOUT);
- USB_ERROR(r);
+ USB_ERROR("USBTMC_DEV_DEP_MSG_INx", r);
bytes_read += r;
}