- //send read command
- buff[0]=2; //func
- seq++;
- buff[1]=seq; buff[2]=~seq; //nseq
- int2chars(buff+4,0x40);
- buff[8]=1;
- buff[9]=0xA;
- buff[10]=0;
- buff[11]=0;
- //fprintf(stderr,"Writing resp req header\n");
- //printb(buff,12);
- r=usb_bulk_write(dev, 1, (char*)buff, 12, 1000);
- //fprintf(stderr,"%i bytes written. Reading response hdr\n",r);
- r=usb_bulk_read(dev, 2, (char*)buff, 0x40, 1000);
- //printb(buff,r);
- len=chars2int(buff+4);
- //fprintf(stderr,"%i bytes read. Resplen=%i\n",r,len);
- for (i=0; i<(r-12); i++) {
- if (i<resplen) resp[i] = buff[i+12];
+ unsigned char *buff;
+ struct usbtmc_header *res;
+ int bytes_read;
+
+ sc->usb.bTag++;
+
+ req = calloc(1, sizeof(struct usbtmc_header));
+ if (req == NULL) {
+ perror("calloc");
+ exit(EXIT_FAILURE);
+ }
+
+ req->MsgID = USBTMC_REQUEST_DEV_DEP_MSG_IN;
+ req->bTag = sc->usb.bTag;
+ req->bTagInverse = ~sc->usb.bTag;
+ req->TransferSize = LE32(sc->usb.wMaxPacketSize_in);
+ 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("USBTMC_REQUEST_DEV_DEP_MSG_IN", r);
+
+ free(req);
+
+ buff=malloc(sc->usb.wMaxPacketSize_in);
+ if (buff == NULL) {
+ perror("malloc");
+ exit(EXIT_FAILURE);
+ }
+
+ r=usb_bulk_read(sc->usb.dev, sc->usb.ep_bulk_in,
+ (char*)buff, sc->usb.wMaxPacketSize_in, USB_TIMEOUT);
+ USB_ERROR("USBTMC_DEV_DEP_MSG_IN1", r);
+
+ if (r < sizeof(struct usbtmc_header)) {
+ fprintf(stderr, "Short read!\n");
+ return 0;
+ }
+
+ bytes_read = r - sizeof(struct usbtmc_header);
+
+ res = (struct usbtmc_header*)buff;
+ len = LE32(res->TransferSize);
+
+ memmove(buff, buff + sizeof(struct usbtmc_header), bytes_read);
+
+ buff = realloc(buff, len);
+ if (buff == NULL) {
+ perror("realloc");
+ exit(EXIT_FAILURE);