Mercurial > ~darius > hgwebdir.cgi > pyinst
changeset 1:e2089824735a
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.
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Wed, 13 May 2009 15:02:09 +0930 |
parents | a43a47dfc902 |
children | adaff1c4fd6b |
files | usb488.py |
diffstat | 1 files changed, 51 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- 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"""