Mercurial > ~darius > hgwebdir.cgi > pyinst
annotate usb488.py @ 75:576f112e0aba
Fix read timeout handling so it works over imperfect links.
author | Daniel O'Connor <doconnor@gsoft.com.au> |
---|---|
date | Fri, 27 Sep 2024 09:27:33 +0930 |
parents | 7386f2888508 |
children |
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 | 3 # Copyright (c) 2009 |
4 # Daniel O'Connor <darius@dons.net.au>. All rights reserved. | |
5 # | |
6 # Redistribution and use in source and binary forms, with or without | |
7 # modification, are permitted provided that the following conditions | |
8 # are met: | |
9 # 1. Redistributions of source code must retain the above copyright | |
10 # notice, this list of conditions and the following disclaimer. | |
11 # 2. Redistributions in binary form must reproduce the above copyright | |
12 # notice, this list of conditions and the following disclaimer in the | |
13 # documentation and/or other materials provided with the distribution. | |
14 # | |
15 # THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
18 # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE | |
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
25 # SUCH DAMAGE. | |
26 # | |
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 |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
35 # http://sdpha2.ucsd.edu/Lab_Equip_Manuals/usbtmc_usb488_subclass_1_00.pdf |
0
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 |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
38 import time |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
39 import usb |
56 | 40 from functools import reduce |
0
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 # |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
43 # 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
|
44 # |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
45 # Write: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
46 # Offset Field Size Value Description |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
47 # 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
|
48 # 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
|
49 # 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
|
50 # 3 Reserved 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
51 # 4 TransferSize 4 0x06 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
52 # 5 .. 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
53 # 6 .. 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
54 # 7 .. 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
55 # 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
|
56 # 9 Reserved 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
57 # 10 Reserved 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
58 # 11 Reserved 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
59 # 12 Msg itself 1 0x2a '*' |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
60 # 13 1 0x49 'I' |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
61 # 14 1 0x44 'D' |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
62 # 15 1 0x4e 'N' |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
63 # 16 1 0x3f '?' |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
64 # 17 1 0x0a '\n' |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
65 # 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
|
66 # |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
67 # |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
68 # Send a read request: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
69 # Offset Field Size Value Description |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
70 # 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
|
71 # 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
|
72 # 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
|
73 # 3 Reserved 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
74 # 4 TransferSize 4 0x64 |
9 | 75 # 5 .. 0x00 |
76 # 6 .. 0x00 | |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
77 # 7 .. 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
78 # 8 bmTransferAttr 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
79 # 9 Term char 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
80 # 10 Reserved 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
81 # 11 Reserved 1 0x00 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
82 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
83 # No libusb versions of these available |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
84 USB_CLASS_APP_SPECIFIC = 254 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
85 USB_SUBCLASS_TMC = 3 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
86 USB_PROTOCOL_488 = 1 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
87 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
88 # USB488 message IDs |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
89 DEV_DEP_MSG_OUT = 1 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
90 REQUEST_DEV_DEP_MSG_IN = 2 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
91 DEV_DEP_MSG_IN = 2 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
92 |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
93 # USB TMC control requests |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
94 INITIATE_ABORT_BULK_OUT = 1 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
95 CHECK_ABORT_BULK_OUT_STATUS = 2 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
96 INITIATE_ABORT_BULK_IN = 3 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
97 CHECK_ABORT_BULK_IN_STATUS = 4 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
98 INITIATE_CLEAR = 5 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
99 CHECK_CLEAR_STATUS = 6 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
100 GET_CAPABILITIES = 7 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
101 INDICATOR_PULSE = 64 |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
102 # USB488 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
103 READ_STATUS_BYTE = 128 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
104 REN_CONTROL = 160 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
105 GO_TO_LOCAL = 161 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
106 LOCAL_LOCKOUT = 162 |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
107 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
108 # Interface capability bits |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
109 IF_CAP_LISTEN_ONLY = 0x01 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
110 IF_CAP_TALK_ONLY = 0x02 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
111 IF_CAP_HAS_INDICATOR = 0x04 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
112 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
113 # Device capability bits |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
114 DEV_CAP_TERM_CHAR = 0x01 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
115 |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
116 # USB488 interface capbility bits |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
117 USB488_IFCAP_TRIG = 0x01 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
118 USB488_IFCAP_GO_LOC = 0x02 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
119 USB488_IFCAP_488_2 = 0x04 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
120 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
121 # USB488 device capbility bits |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
122 USB488_DEVCAP_DT1 = 0x01 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
123 USB488_DEVCAP_RL1 = 0x02 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
124 USB488_DEVCAP_SR1 = 0x04 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
125 USB488_DEVCAP_SCPI = 0x08 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
126 |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
127 # USBTMC status definitions |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
128 STATUS_SUCCESS = 0x01 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
129 STATUS_PENDING = 0x02 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
130 STATUS_FAILED = 0x80 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
131 STATUS_TRANSFER_NOT_IN_PROGRESS = 0x81 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
132 STATUS_SPLIT_NOT_IN_PROGRESS = 0x82 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
133 STATUS_SPLIT_IN_PROGRESS = 0x83 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
134 |
66
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
135 # SCPI error/event queue status register bit |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
136 STATUS_EVE_QUEUE = 0x04 |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
137 |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
138 class USB488Device(object): |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
139 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
|
140 """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
|
141 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
|
142 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
143 busses = usb.busses() |
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 # |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
146 # Search for the device we want |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
147 # |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
148 found = False |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
149 for bus in busses: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
150 for dev in bus.devices: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
151 # Skip ones that don't match |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
152 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
|
153 continue |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
154 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
|
155 continue |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
156 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
|
157 continue |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
158 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
|
159 continue |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
160 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
161 # 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
|
162 # 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
|
163 # 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
|
164 # unless you want to hard code everything. |
56 | 165 for confidx in range(len(dev.configurations)): |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
166 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
|
167 for altif in iface: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
168 # 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
|
169 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
|
170 altif.interfaceSubClass == USB_SUBCLASS_TMC and \ |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
171 altif.interfaceProtocol == USB_PROTOCOL_488: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
172 found = True |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
173 break |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
174 if found: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
175 break |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
176 if found: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
177 break |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
178 if found: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
179 break |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
180 if found: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
181 break |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
182 if not found: |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
183 raise BaseException("Could not find a suitable USB device") |
57
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
184 |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
185 # 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
|
186 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
|
187 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
|
188 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
|
189 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
|
190 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
|
191 self.handle = handle |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
192 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
193 # Get some info for humans |
57
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
194 try: |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
195 self.vendname = handle.getString(dev.iManufacturer, 1024) |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
196 except ValueError: |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
197 self.vendname = None |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
198 try: |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
199 self.prodname = handle.getString(dev.iProduct, 1024) |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
200 except ValueError: |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
201 self.prodname = None |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
202 try: |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
203 self.serial = handle.getString(dev.iSerialNumber, 1024) |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
204 except ValueError: |
19045ad9f5f5
Make it more tolerant if we can't read strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
56
diff
changeset
|
205 self.serial = None |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
206 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
207 # 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
|
208 self.intrep = self.bulkinep = self.bulkoutep = None |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
209 |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
210 for ep in altif.endpoints: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
211 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
|
212 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
|
213 self.intrep = ep.address |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
214 |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
215 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
|
216 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
|
217 self.bulkinep = ep.address |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
218 else: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
219 self.bulkoutep = ep.address |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
220 self.maxPacket = ep.maxPacketSize |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
221 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
222 # 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
|
223 if self.intrep == None: |
56 | 224 print("Can't find interrupt endpoint") |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
225 |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
226 # Data from the device (mandatory) |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
227 if self.bulkinep == None: |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
228 raise BaseException("Can't find bulk-in endpoint") |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
229 |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
230 # Data to the device (mandatory) |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
231 if self.bulkoutep == None: |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
232 raise BaseException("Can't find bulk-out endpoint") |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
233 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
234 self.tag = 1 |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
235 #self.init() |
66
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
236 |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
237 def init(self): |
66
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
238 # Flush out any pending data |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
239 self.initiateClear() |
66
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
240 # Perform dummy write/read otherwise the next read times out |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
241 try: |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
242 self.ask('*STB?', timeout = 0.001) |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
243 except usb.USBError: |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
244 pass |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
245 # Clear status register |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
246 for i in range(10): |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
247 self.write('*CLS') |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
248 if int(self.ask('*STB?')) & STATUS_EVE_QUEUE == 0: |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
249 break |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
250 else: |
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
251 raise BaseException('Unable to clear status register') |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
252 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
253 def __str__(self): |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
254 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
|
255 if self.serial != "": |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
256 rtn += " S/N: " + self.serial |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
257 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
258 return rtn |
66
bf411c7f5e78
Perform a dummy write/read after initiateClear and check the event/error queue bit.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
65
diff
changeset
|
259 |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
260 def gettag(self): |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
261 tag = self.tag |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
262 self.tag = (self.tag + 1) % 255 |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
263 if self.tag == 0: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
264 self.tag += 1 |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
265 return tag |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
266 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
267 def write(self, data): |
12
5ff9130cc953
This code isn't scope specific.
Daniel O'Connor <darius@dons.net.au>
parents:
11
diff
changeset
|
268 """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
|
269 |
56 | 270 orddata = list(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
|
271 # 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
|
272 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
|
273 orddata += [ord('\n')] |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
274 datalen = len(orddata) |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
275 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
276 # Build the packet |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
277 tag = self.gettag() |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
278 pkt = [ DEV_DEP_MSG_OUT, tag, ~tag & 0xff, 0x00, |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
279 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
|
280 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
|
281 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
282 # Add the data |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
283 pkt = pkt + orddata |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
284 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
285 # Align to 4 bytes |
58 | 286 alignlen = ((len(pkt) // 4) + 1) * 4 |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
287 pkt = pkt + [0] * (alignlen - len(pkt)) |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
288 |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
289 # Split it up into maxPacket sized chunks and send.. |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
290 # XXX; this is not correct, need a header for each one |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
291 while len(pkt) > 0: |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
292 chunk = pkt[0:self.maxPacket] |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
293 pkt = pkt[self.maxPacket:] |
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
294 |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
295 #print("Sending %d 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
|
296 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
|
297 if wrote != len(chunk): |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
298 raise BaseException("Short write, got %d, expected %d" % (wrote, len(chunk))) |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
299 |
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
|
300 def read(self, timeout = None): |
5
51d1fc44a753
Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
301 """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
|
302 |
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
|
303 if timeout == None: |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
304 timeout = 1 |
59
dd27521002a5
Change default timeout to 500msec
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
58
diff
changeset
|
305 |
5
51d1fc44a753
Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
306 # Mangle into milliseconds |
51d1fc44a753
Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
307 _timeout = int(timeout * 1000.0) |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
308 |
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
|
309 # 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
|
310 # 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
|
311 # 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
|
312 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
|
313 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
|
314 |
e2089824735a
Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
315 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
|
316 # Ask the device to send us something |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
317 tag = self.gettag() |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
318 pkt = [ REQUEST_DEV_DEP_MSG_IN, tag, ~tag & 0xff, 0x00, |
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
|
319 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
|
320 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
|
321 |
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
|
322 # Send it |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
323 #print("Sending " + str(pkt)) |
5
51d1fc44a753
Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
324 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
|
325 if wrote != len(pkt): |
56 | 326 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
|
327 |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
328 #print("Reading..") |
5
51d1fc44a753
Add variable timeout for reads.
Daniel O'Connor <darius@dons.net.au>
parents:
4
diff
changeset
|
329 read = self.handle.bulkRead(self.bulkinep, datalen, _timeout) |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
330 #print("Read %s bytes: %s" % (len(read), str(read))) |
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
|
331 |
e2089824735a
Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
332 if read[0] != DEV_DEP_MSG_IN: |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
333 raise BaseException("Unexpected Msg ID, got %s expected %d" % (read[0], DEV_DEP_MSG_IN)) |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
334 if read[1] != tag: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
335 raise BaseException("Unexpected tag, got %d expected %d" % (read[1], tag)) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
336 if read[2] != ~tag & 0xff: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
337 raise BaseException("Unexpected tag inverse, got %d expected %d" % (read[1], ~tag & 0xff)) |
0
a43a47dfc902
First stab at code that actually works!
Daniel O'Connor <darius@dons.net.au>
parents:
diff
changeset
|
338 |
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
|
339 actualdata = read[4] | read[5] << 8 | read[6] << 16 | read[7] << 24 |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
340 #print("Computed datalen is %d" % (actualdata)) |
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
|
341 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
|
342 if read[8] & 0x01: |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
343 #print("Breaking out due to EOM") |
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
|
344 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
|
345 |
e2089824735a
Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
346 # Stringify result for easier consumption |
56 | 347 result = reduce(lambda x, y: x+y, list(map(chr, 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
|
348 # 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
|
349 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
|
350 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
|
351 |
e2089824735a
Make the read support work properly & check what the device gives us.
Daniel O'Connor <darius@dons.net.au>
parents:
0
diff
changeset
|
352 return result |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
353 |
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
354 def ask(self, s, timeout = None): |
67
98b9258c75b6
Add chkcmd helper to execute command check STB to see if it failed.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
66
diff
changeset
|
355 '''Wrapper to send a command and wait for a reply''' |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
356 self.write(s) |
60
4558e5ccd775
Honour timeout passed into ask()
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
59
diff
changeset
|
357 return self.read(timeout = timeout) |
55
ad5942d22f78
Use BaseException rather than strings.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
23
diff
changeset
|
358 |
67
98b9258c75b6
Add chkcmd helper to execute command check STB to see if it failed.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
66
diff
changeset
|
359 def chkcmd(self, cmd): |
98b9258c75b6
Add chkcmd helper to execute command check STB to see if it failed.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
66
diff
changeset
|
360 '''Wrapper to send a command and check for an error''' |
98b9258c75b6
Add chkcmd helper to execute command check STB to see if it failed.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
66
diff
changeset
|
361 self.write(cmd) |
98b9258c75b6
Add chkcmd helper to execute command check STB to see if it failed.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
66
diff
changeset
|
362 if int(self.ask('*STB?')) & STATUS_EVE_QUEUE != 0: |
98b9258c75b6
Add chkcmd helper to execute command check STB to see if it failed.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
66
diff
changeset
|
363 self.write('*CLS') |
98b9258c75b6
Add chkcmd helper to execute command check STB to see if it failed.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
66
diff
changeset
|
364 raise BaseException('Command failed') |
98b9258c75b6
Add chkcmd helper to execute command check STB to see if it failed.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
66
diff
changeset
|
365 |
11
f588f5bc834a
Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents:
10
diff
changeset
|
366 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
|
367 """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
|
368 |
f588f5bc834a
Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents:
10
diff
changeset
|
369 # 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
|
370 # 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
|
371 try: |
f588f5bc834a
Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents:
10
diff
changeset
|
372 self.handle.getString(self.dev.iManufacturer, 100) |
56 | 373 except USBError as e: |
11
f588f5bc834a
Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents:
10
diff
changeset
|
374 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
|
375 |
f588f5bc834a
Add a method to determine if the device is still connected.
Daniel O'Connor <darius@dons.net.au>
parents:
10
diff
changeset
|
376 return True |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
377 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
378 def getCapabilities(self): |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
379 '''Returns interface, device and USB488 capability bytes (see IF_CAP_*, DEV_CAP_*, USB488_IFCAP_* and USB488_DEVCAP_*)''' |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
380 res = self.handle.controlMsg(usb.ENDPOINT_IN | usb.TYPE_CLASS | usb.RECIP_INTERFACE, GET_CAPABILITIES, 0x18) |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
381 return res[4], res[5], res[14], res[15] |
65
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
382 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
383 def indicatorPulse(self): |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
384 '''Send an indicator pulse request''' |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
385 res = self.handle.controlMsg(usb.ENDPOINT_IN | usb.TYPE_CLASS | usb.RECIP_INTERFACE, INDICATOR_PULSE, 0x01) |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
386 |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
387 def initiateClear(self): |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
388 '''Send request to clear all transfers and wait until the device reports it is done and clear stalls''' |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
389 res = self.handle.controlMsg(usb.ENDPOINT_IN | usb.TYPE_CLASS | usb.RECIP_INTERFACE, INITIATE_CLEAR, 0x01) |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
390 if res[0] == STATUS_SUCCESS: |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
391 while True: |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
392 res = self.handle.controlMsg(usb.ENDPOINT_IN | usb.TYPE_CLASS | usb.RECIP_INTERFACE, CHECK_CLEAR_STATUS, 0x02) |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
393 if res[0] != STATUS_PENDING: |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
394 break |
29bcef559283
Add initiateClear and a few others and use it to clear buffers on setup.
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
60
diff
changeset
|
395 time.sleep(0.1) |
69
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
396 else: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
397 raise BaseException('INITIATE_CLEAR returned 0x%02x' % (res[0])) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
398 self.handle.clearHalt(self.bulkinep) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
399 self.handle.clearHalt(self.bulkoutep) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
400 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
401 def renControl(self): |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
402 '''Send enable remote control message''' |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
403 res = self.handle.controlMsg(usb.ENDPOINT_IN | usb.TYPE_CLASS | usb.RECIP_INTERFACE, REN_CONTROL, 1, 0xff) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
404 return res[0] |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
405 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
406 def getStatus(self): |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
407 '''Returns IEEE 488 status byte''' |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
408 tag = self.gettag() |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
409 res = self.handle.controlMsg(usb.ENDPOINT_IN | usb.TYPE_CLASS | usb.RECIP_INTERFACE, READ_STATUS_BYTE, 3, tag) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
410 if res[1] != tag: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
411 raise BaseException('Tag mismatch, got 0x%02x, expected 0x%02x' % (res[1], tag)) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
412 if res[0] != STATUS_SUCCESS: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
413 raise BaseException('Unit returned invalid USBTMC status: %d' % (res[0],)) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
414 return res[2] |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
415 |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
416 def abortIO(self, tag, isout): |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
417 if isout: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
418 req = INITIATE_ABORT_BULK_OUT |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
419 chkreq = CHECK_ABORT_BULK_OUT_STATUS |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
420 ep = self.bulkoutep |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
421 name = 'out' |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
422 else: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
423 req = INITIATE_ABORT_BULK_IN |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
424 chkreq = CHECK_ABORT_BULK_IN_STATUS |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
425 ep = self.bulkinep |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
426 name = 'in' |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
427 res = self.handle.controlMsg(usb.ENDPOINT_IN | usb.TYPE_CLASS | usb.RECIP_ENDPOINT, |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
428 req, 2, value = tag, index = ep) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
429 print('Initiate abort returned ' + str(res)) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
430 while True: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
431 res = self.handle.controlMsg(usb.ENDPOINT_IN | usb.TYPE_CLASS | usb.RECIP_ENDPOINT, |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
432 chkreq, 8, value = 0x00, index = ep) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
433 print('Check abort returned ' + str(res)) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
434 if res[0] == STATUS_PENDING: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
435 print('Status pending for %s abort' % (name,)) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
436 time.sleep(1) |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
437 elif res[0] == STATUS_SUCCESS or res[0] == STATUS_TRANSFER_NOT_IN_PROGRESS: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
438 break |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
439 else: |
7386f2888508
Make function more configurable
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
67
diff
changeset
|
440 raise BaseException('Invalid status reply to check abort %s 0x%02x' % (name, res[0])) |