# HG changeset patch # User Daniel O'Connor # Date 1242192729 -34200 # Node ID e2089824735a4f42bf6325639453f484a7e2f1d9 # Parent a43a47dfc9025955f57e0f3a41a9c4577d0c170c Make the read support work properly & check what the device gives us. - Comment out debugging. - Stringify result. - Handle >1 packet reads (theoretically). - Validate returned packet. diff -r a43a47dfc902 -r e2089824735a usb488.py --- a/usb488.py Wed May 13 14:44:40 2009 +0930 +++ b/usb488.py Wed May 13 15:02:09 2009 +0930 @@ -167,7 +167,11 @@ def write(self, data): """Send data (string) to the scope""" + orddata = map(ord, data) + # The device needs a \n at the end, enfore this + if orddata[-1] != '\n': + orddata += [ord('\n')] datalen = len(orddata) # Build the packet @@ -190,7 +194,7 @@ chunk = pkt[0:self.maxPacket] pkt = pkt[self.maxPacket:] - print "Sending %s bytes of data: %s" % (len(chunk), chunk) + #print "Sending %s bytes of data: %s" % (len(chunk), chunk) wrote = self.handle.bulkWrite(self.bulkoutep, chunk) if wrote != len(chunk): raise "Short write, got %d, expected %d" % (wrote, len(chunk)) @@ -198,25 +202,56 @@ def read(self): """Read data from the device""" + # Maximum we accept at once + # Was 2^31 - 1 but that seems to make things take too long to + # read (perhaps libusb tries to malloc it..) + datalen = 10240 + data = [] + + while True: + # Ask the device to send us something + pkt = [ REQUEST_DEV_DEP_MSG_IN, self.tag, ~self.tag & 0xff, 0x00, + datalen & 0xff, datalen >> 8 & 0xff, datalen >> 16 & 0xff, + datalen >> 24 & 0xff, 0, 0, 0, 0] - datalen = 1024 - # Ask the device to send us something - pkt = [ REQUEST_DEV_DEP_MSG_IN, self.tag, ~self.tag & 0xff, 0x00, - datalen & 0xff, datalen >> 8 & 0xff, datalen >> 16 & 0xff, - datalen >> 24 & 0xff, 0, 0, 0, 0] + # Expected tag + exptag = self.tag + + # Bump tag + self.incrtag() - # Bump tag - self.incrtag() + # Send it + #print "Sending " + str(pkt) + wrote = self.handle.bulkWrite(self.bulkoutep, pkt) + if wrote != len(pkt): + print "Short write, got %d, expected %d" % (wrote, len(pkt)) - # Send it - wrote = self.handle.bulkWrite(self.bulkoutep, pkt) - if wrote != len(pkt): - print "Short write, got %d, expected %d" % (wrote, len(pkt)) + #print "Reading.." + read = self.handle.bulkRead(self.bulkinep, datalen) + #print "Read %s bytes: %s" % (len(read), str(read)) + + if read[0] != DEV_DEP_MSG_IN: + raise "Unexpected Msg ID, got %s expected %d" % (read[0], DEV_DEP_MSG_IN) + if read[1] != exptag: + raise "Unexpected tag, got %d expected %d" % (read[1], exptag) + if read[2] != ~exptag & 0xff: + raise "Unexpected tag inverse, got %d expected %d" % (read[1], ~exptag & 0xff) - read = self.handle.bulkRead(self.bulkinep, datalen) - print "Read %s bytes: %s" % (len(read), str(read)) - return read - + actualdata = read[4] | read[5] << 8 | read[6] << 16 | read[7] << 24 + #print "Computed datalen is %d" % (actualdata) + data += read[12:12 + actualdata] + if read[8] & 0x01: + #print "Breaking out due to EOM" + break + + # Stringify result for easier consumption + result = reduce(lambda x, y: x+y, map(chr, data)) + # Trim off \n if present + if result[-1] == '\n': + result = result[0:-1] + + return result + def find488(): """Search for a USB488 device, returns a handle, iface, dev tuple for it"""