annotate usb488.py @ 28:c6be52360c2f

Handle default port better so passing None in picks the default.
author Daniel O'Connor <darius@dons.net.au>
date Wed, 21 Sep 2011 14:56:55 +0930
parents 876d951bbcc0
children ad5942d22f78
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
1 #!/usr/bin/env python
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
2
7
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
3 # Copyright (c) 2009
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
4 # Daniel O'Connor <darius@dons.net.au>. All rights reserved.
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
5 #
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
6 # Redistribution and use in source and binary forms, with or without
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
7 # modification, are permitted provided that the following conditions
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
8 # are met:
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
9 # 1. Redistributions of source code must retain the above copyright
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
10 # notice, this list of conditions and the following disclaimer.
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
11 # 2. Redistributions in binary form must reproduce the above copyright
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
12 # notice, this list of conditions and the following disclaimer in the
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
13 # documentation and/or other materials provided with the distribution.
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
14 #
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
15 # THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
18 # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
25 # SUCH DAMAGE.
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
26 #
813e183cfd49 Add 2 clause BSDL.
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
27
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
28 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
29 # Spec/info..
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
30 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31 # http://www.usb.org/developers/devclass_docs/USBTMC_1_006a.zip
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
32 # http://svn.openmoko.org/developers/werner/ahrt/host/tmc/README
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
33 # http://www.home.agilent.com/agilent/redirector.jspx?action=ref&cname=AGILENT_EDITORIAL&ckey=1189335&lc=eng&cc=US&nfr=-35560.0.00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
34 # linux-2.6.29.3/drivers/usb/class/usbtmc.c
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
35 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
36
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
37 import usb
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
38
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
39 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
40 # The usual SCPI commands are wrapped before being sent.
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
41 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
42 # Write:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
43 # Offset Field Size Value Description
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
44 # 0 MsgID 1 0x01 DEV_DEP_MSG_OUT
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
45 # 1 bTag 1 0x01 Varies with each transfer
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
46 # 2 bTagInverse 1 0xfe Inverse of previous field
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
47 # 3 Reserved 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
48 # 4 TransferSize 4 0x06
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
49 # 5 .. 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
50 # 6 .. 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
51 # 7 .. 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
52 # 8 bmTransferAttr 1 0x01 1 == end of msg
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
53 # 9 Reserved 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
54 # 10 Reserved 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
55 # 11 Reserved 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
56 # 12 Msg itself 1 0x2a '*'
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
57 # 13 1 0x49 'I'
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
58 # 14 1 0x44 'D'
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
59 # 15 1 0x4e 'N'
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
60 # 16 1 0x3f '?'
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
61 # 17 1 0x0a '\n'
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
62 # 18-19 Alignment 2 0x0000 Bring into 4 byte alignment
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
63 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
64 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
65 # Send a read request:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
66 # Offset Field Size Value Description
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
67 # 0 MsgID 1 0x02 REQUEST_DEV_DEP_MSG_IN
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
68 # 1 bTag 1 0x02 Varies with each transfer
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
69 # 2 bTagInverse 1 0xfd Inverse of previous field
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
70 # 3 Reserved 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
71 # 4 TransferSize 4 0x64
9
a6b746654ae2 Fix comment mangle.
Daniel O'Connor <darius@dons.net.au>
parents: 8
diff changeset
72 # 5 .. 0x00
a6b746654ae2 Fix comment mangle.
Daniel O'Connor <darius@dons.net.au>
parents: 8
diff changeset
73 # 6 .. 0x00
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
74 # 7 .. 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
75 # 8 bmTransferAttr 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
76 # 9 Term char 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
77 # 10 Reserved 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
78 # 11 Reserved 1 0x00
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
79
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
80 # No libusb versions of these available
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
81 USB_CLASS_APP_SPECIFIC = 254
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
82 USB_SUBCLASS_TMC = 3
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
83 USB_PROTOCOL_488 = 1
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
84
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
85 # USB488 message IDs
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
86 DEV_DEP_MSG_OUT = 1
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
87 REQUEST_DEV_DEP_MSG_IN = 2
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
88 DEV_DEP_MSG_IN = 2
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
89
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
90 class USB488Device(object):
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
91 def __init__(self, vendor = None, product = None, serial = None, path = None):
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
92 """Search for a USB488 class device, if specified vendor,
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
93 product, serial and path will refine the search"""
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
94
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
95 busses = usb.busses()
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
96
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
97 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
98 # Search for the device we want
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
99 #
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
100 found = False
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
101 for bus in busses:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
102 for dev in bus.devices:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
103 # Skip ones that don't match
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
104 if vendor != None and dev.idVendor != vendor:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
105 continue
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
106 if product != None and dev.idProduct != product:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
107 continue
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
108 if serial != None and dev.idSerialNumber != serial:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
109 continue
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
110 if path != None and dev.filename != path:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
111 continue
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
112
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
113 # The libusb examples say you can check for device
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
114 # class and then open, however in that case you can't
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
115 # find the endpoint number which seems pretty useless
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
116 # unless you want to hard code everything.
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
117 for confidx in xrange(len(dev.configurations)):
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
118 for iface in dev.configurations[confidx].interfaces:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
119 for altif in iface:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
120 # Check if this is a USB488 capable interface
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
121 if altif.interfaceClass == USB_CLASS_APP_SPECIFIC and \
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
122 altif.interfaceSubClass == USB_SUBCLASS_TMC and \
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
123 altif.interfaceProtocol == USB_PROTOCOL_488:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
124 found = True
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
125 break
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
126 if found:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
127 break
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
128 if found:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
129 break
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
130 if found:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
131 break
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
132 if found:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
133 break
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
134 if not found:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
135 raise "Could not find a suitable USB device"
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
136
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
137 # Open the device and claim the USB interface that supports the spec
8
381ed6f3d2d7 Save handle after using it, makes the code look nicer.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
138 handle = dev.open()
381ed6f3d2d7 Save handle after using it, makes the code look nicer.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
139 handle.setConfiguration(dev.configurations[confidx].value)
381ed6f3d2d7 Save handle after using it, makes the code look nicer.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
140 handle.claimInterface(altif.interfaceNumber)
381ed6f3d2d7 Save handle after using it, makes the code look nicer.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
141 handle.setAltInterface(altif.alternateSetting)
381ed6f3d2d7 Save handle after using it, makes the code look nicer.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
142 self.dev = dev
381ed6f3d2d7 Save handle after using it, makes the code look nicer.
Daniel O'Connor <darius@dons.net.au>
parents: 7
diff changeset
143 self.handle = handle
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
144
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
145 # Get some info for humans
10
154dab1e474f Use short form of handle which looks nicer..
Daniel O'Connor <darius@dons.net.au>
parents: 9
diff changeset
146 self.vendname = handle.getString(dev.iManufacturer, 1024)
154dab1e474f Use short form of handle which looks nicer..
Daniel O'Connor <darius@dons.net.au>
parents: 9
diff changeset
147 self.prodname = handle.getString(dev.iProduct, 1024)
154dab1e474f Use short form of handle which looks nicer..
Daniel O'Connor <darius@dons.net.au>
parents: 9
diff changeset
148 self.serial = handle.getString(dev.iSerialNumber, 1024)
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
149
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
150 # Determine the endpoints for each operation type
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
151 self.intrep = self.bulkinep = self.bulkoutep = None
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
152
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
153 for ep in altif.endpoints:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
154 if ep.type == usb.ENDPOINT_TYPE_INTERRUPT and \
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
155 ep.address & usb.ENDPOINT_IN == usb.ENDPOINT_IN:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
156 self.intrep = ep.address
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
157
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
158 if ep.type == usb.ENDPOINT_TYPE_BULK:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
159 if ep.address & usb.ENDPOINT_IN == usb.ENDPOINT_IN:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
160 self.bulkinep = ep.address
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
161 else:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
162 self.bulkoutep = ep.address
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
163 self.maxPacket = ep.maxPacketSize
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
164
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
165 # Required for 488.2 devices, optional otherwise
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
166 if self.intrep == None:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
167 print "Can't find interrupt endpoint"
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
168
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
169 # Data from the scope (mandatory)
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
170 if self.bulkinep == None:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
171 raise "Can't find bulk-in endpoint"
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
172
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
173 # Data to the scope (mandatory)
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
174 if self.bulkoutep == None:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
175 raise "Can't find bulk-out endpoint"
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
176
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
177 self.tag = 1
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
178
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
179 def __str__(self):
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
180 rtn = "Mfg: %s Prod: %s" % (self.vendname, self.prodname)
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
181 if self.serial != "":
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
182 rtn += " S/N: " + self.serial
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
183
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
184 return rtn
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
185
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
186 def incrtag(self):
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
187 self.tag += 1
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
188 if self.tag == 0:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
189 self.tag += 1
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
190
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
191 def write(self, data):
12
5ff9130cc953 This code isn't scope specific.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
192 """Send data (string) to the instrument"""
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
193
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
194 orddata = map(ord, data)
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
195 # The device needs a \n at the end, enfore this
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
196 if orddata[-1] != '\n':
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
197 orddata += [ord('\n')]
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
198 datalen = len(orddata)
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
199
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
200 # Build the packet
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
201 pkt = [ DEV_DEP_MSG_OUT, self.tag, ~self.tag & 0xff, 0x00,
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
202 datalen & 0xff, datalen >> 8 & 0xff, datalen >> 16 & 0xff,
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
203 datalen >> 24 & 0xff, 1, 0, 0, 0 ]
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
204
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
205 # Add the data
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
206 pkt = pkt + orddata
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
207
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
208 # Align to 4 bytes
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
209 alignlen = ((len(pkt) / 4) + 1) * 4
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
210 pkt = pkt + [0] * (alignlen - len(pkt))
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
211
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
212 # Bump the tag
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
213 self.incrtag()
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
214
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
215 # Split it up into maxPacket sized chunks and send..
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
216 while len(pkt) > 0:
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
217 chunk = pkt[0:self.maxPacket]
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
218 pkt = pkt[self.maxPacket:]
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
219
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
220 #print "Sending %s bytes of data: %s" % (len(chunk), chunk)
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
221 wrote = self.handle.bulkWrite(self.bulkoutep, chunk)
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
222 if wrote != len(chunk):
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
223 raise "Short write, got %d, expected %d" % (wrote, len(chunk))
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
224
23
876d951bbcc0 Redo timeout in a more sensible way (also change it to 100ms)
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
225 def read(self, timeout = None):
5
51d1fc44a753 Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
226 """Read data from the device, waits for up to timeout seconds for each USB transaction"""
51d1fc44a753 Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
227
23
876d951bbcc0 Redo timeout in a more sensible way (also change it to 100ms)
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
228 if timeout == None:
876d951bbcc0 Redo timeout in a more sensible way (also change it to 100ms)
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
229 timeout = 0.1
876d951bbcc0 Redo timeout in a more sensible way (also change it to 100ms)
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
230
5
51d1fc44a753 Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
231 # Mangle into milliseconds
51d1fc44a753 Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
232 _timeout = int(timeout * 1000.0)
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
233
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
234 # Maximum we accept at once
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
235 # Was 2^31 - 1 but that seems to make things take too long to
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
236 # read (perhaps libusb tries to malloc it..)
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
237 datalen = 10240
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
238 data = []
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
239
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
240 while True:
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
241 # Ask the device to send us something
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
242 pkt = [ REQUEST_DEV_DEP_MSG_IN, self.tag, ~self.tag & 0xff, 0x00,
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
243 datalen & 0xff, datalen >> 8 & 0xff, datalen >> 16 & 0xff,
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
244 datalen >> 24 & 0xff, 0, 0, 0, 0]
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
245
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
246 # Expected tag
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
247 exptag = self.tag
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
248
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
249 # Bump tag
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
250 self.incrtag()
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
251
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
252 # Send it
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
253 #print "Sending " + str(pkt)
5
51d1fc44a753 Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
254 wrote = self.handle.bulkWrite(self.bulkoutep, pkt, _timeout)
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
255 if wrote != len(pkt):
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
256 print "Short write, got %d, expected %d" % (wrote, len(pkt))
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
257
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
258 #print "Reading.."
5
51d1fc44a753 Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents: 4
diff changeset
259 read = self.handle.bulkRead(self.bulkinep, datalen, _timeout)
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
260 #print "Read %s bytes: %s" % (len(read), str(read))
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
261
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
262 if read[0] != DEV_DEP_MSG_IN:
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
263 raise "Unexpected Msg ID, got %s expected %d" % (read[0], DEV_DEP_MSG_IN)
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
264 if read[1] != exptag:
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
265 raise "Unexpected tag, got %d expected %d" % (read[1], exptag)
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
266 if read[2] != ~exptag & 0xff:
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
267 raise "Unexpected tag inverse, got %d expected %d" % (read[1], ~exptag & 0xff)
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
268
1
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
269 actualdata = read[4] | read[5] << 8 | read[6] << 16 | read[7] << 24
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
270 #print "Computed datalen is %d" % (actualdata)
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
271 data += read[12:12 + actualdata]
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
272 if read[8] & 0x01:
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
273 #print "Breaking out due to EOM"
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
274 break
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
275
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
276 # Stringify result for easier consumption
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
277 result = reduce(lambda x, y: x+y, map(chr, data))
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
278 # Trim off \n if present
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
279 if result[-1] == '\n':
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
280 result = result[0:-1]
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
281
e2089824735a Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
282 return result
0
a43a47dfc902 First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
283
11
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
284 def isConnected(self):
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
285 """Check if the device is present"""
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
286
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
287 # libusb makes it very hard (at least on FreeBSD) to determine if we're still connected.
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
288 # This is a reasonable proxy..
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
289 try:
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
290 self.handle.getString(self.dev.iManufacturer, 100)
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
291 except USBError, e:
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
292 return False
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
293
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
294 return True
f588f5bc834a Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
295