comparison rsib.py @ 71:00800345fbae default tip

Python3ise RSIB code
author Daniel O'Connor <doconnor@gsoft.com.au>
date Thu, 24 Aug 2023 16:52:10 +0930
parents 91b476ebc0f2
children
comparison
equal deleted inserted replaced
70:6ffa6fcf278e 71:00800345fbae
75 MSG_HELLO = 0x40 # We send this on connect 75 MSG_HELLO = 0x40 # We send this on connect
76 MSG_CMDREP = 0x80 # Reply from the instrument to us 76 MSG_CMDREP = 0x80 # Reply from the instrument to us
77 MSG_CMD = 0x90 # Command to the instrument 77 MSG_CMD = 0x90 # Command to the instrument
78 MSG_SRQ = 0x91 # Query SRQ 78 MSG_SRQ = 0x91 # Query SRQ
79 79
80 import exceptions
81 import socket 80 import socket
82 81
83 class RSIBDevice(object): 82 class RSIBDevice(object):
84 hello = '\x00\x00\x00\x40' 83 hello = '\x00\x00\x00\x40'
85 docmd = '\x00\x00\x00\x05\x90\x00\x01' 84 docmd = '\x00\x00\x00\x05\x90\x00\x01'
91 self.port = port 90 self.port = port
92 91
93 s1 = socket.socket() 92 s1 = socket.socket()
94 s1.settimeout(5) 93 s1.settimeout(5)
95 s1.connect((self.host, self.port)) 94 s1.connect((self.host, self.port))
96 s1.send('\x00\x00\x00\x40') 95 s1.send(b'\x00\x00\x00\x40')
97 rx = '' 96 rx = b''
98 while len(rx) < 8: 97 while len(rx) < 8:
99 rx = rx + s1.recv(8) 98 rx = rx + s1.recv(8)
100 if rx == '': 99 if rx == b'':
101 raise exceptions.IOError("EOF from device") 100 raise IOError("EOF from device")
102 101
103 s2 = socket.socket() 102 s2 = socket.socket()
104 s2.settimeout(5) 103 s2.settimeout(5)
105 s2.connect((self.host, self.port)) 104 s2.connect((self.host, self.port))
106 s2.send(rx[4:]) 105 s2.send(rx[4:])
112 def write(self, cmd, timeout = 0.5): 111 def write(self, cmd, timeout = 0.5):
113 """Send data (string) to the instrument""" 112 """Send data (string) to the instrument"""
114 self.s1.settimeout(timeout) 113 self.s1.settimeout(timeout)
115 114
116 if len(cmd) > 0x99: 115 if len(cmd) > 0x99:
117 raise exceptions.ValueError("Command too long") 116 raise ValueError("Command too long")
118 117
119 # Pre-increment for easy comparison in read 118 # Pre-increment for easy comparison in read
120 self.tag = (self.tag + 1) & 0xff 119 self.tag = (self.tag + 1) & 0xff
121 msg = '\x00\x00\x00' + chr(len(cmd)) + '\x90\x00' + chr(self.tag) + cmd 120 msg = b'\x00\x00\x00' + bytes([len(cmd)]) + b'\x90\x00' + bytes([self.tag]) + cmd.encode('ascii')
122 self.s1.send(msg) 121 self.s1.send(msg)
123 122
124 def read(self, timeout = 0.5): 123 def read(self, timeout = 0.5):
125 """Read data from the device, waits for up to timeout seconds for each TCP read""" 124 """Read data from the device, waits for up to timeout seconds for each TCP read"""
126 125
127 self.s1.settimeout(timeout) 126 self.s1.settimeout(timeout)
128 127
129 # Fetch the header 128 # Fetch the header
130 rx = '' 129 rx = b''
131 while len(rx) < 7: 130 while len(rx) < 7:
132 rx = self.s1.recv(7) 131 rx = self.s1.recv(7)
133 if rx == '': 132 if rx == b'':
134 raise exceptions.IOError("EOF from device") 133 raise IOError("EOF from device")
135 134
136 if self.tag != ord(rx[6]): 135 if self.tag != rx[6]:
137 raise exceptions.IOError("Reply out of order, got 0x%02x expected 0x%02x" % (ord(rx[6]), self.tag)) 136 raise IOError("Reply out of order, got 0x%02x expected 0x%02x" % (ord(rx[6]), self.tag))
138 137
139 rxlen = ord(rx[0]) << 24 | ord(rx[1]) << 16 | ord(rx[2]) << 8 | ord(rx[3]) 138 rxlen = rx[0] << 24 | rx[1] << 16 | rx[2] << 8 | rx[3]
140 #print "Msg ID 0x%02x" % (ord(rx[4])) 139 #print "Msg ID 0x%02x" % (rx[4])
141 if False and ord(rx[4]) != MSG_CMDREP: 140 if False and rx[4] != MSG_CMDREP:
142 raise exceptions.IOError("Unexpected Msg ID 0x%02x" % (ord(rx[4]))) 141 raise IOError("Unexpected Msg ID 0x%02x" % (rx[4]))
143 142
144 if ord(rx[5]) != 0: 143 if rx[5] != 0:
145 print("Mystery byte %d != 0" % (ord(rx[5]))) 144 print("Mystery byte %d != 0" % (rx[5]))
146 # Fetch the actual reply now we know the length 145 # Fetch the actual reply now we know the length
147 reply = '' 146 reply = b''
148 while len(reply) < rxlen: 147 while len(reply) < rxlen:
149 rx = self.s1.recv(rxlen) 148 rx = self.s1.recv(rxlen)
150 if rx == '': 149 if rx == b'':
151 raise exceptions.IOError("EOF from device") 150 raise IOError("EOF from device")
152 reply += rx 151 reply += rx
153 152
154 return(reply) 153 return(reply)
155 154
156 def queryrsb(self): 155 def queryrsb(self):
157 msg = '\x00\x00\x00\x00\xd1\x18\x00' 156 msg = b'\x00\x00\x00\x00\xd1\x18\x00'
158 self.s2.send(msg) 157 self.s2.send(msg)
159 158
160 reply = '' 159 reply = b''
161 while len(reply) < 7: 160 while len(reply) < 7:
162 rx = self.s2.recv(7) 161 rx = self.s2.recv(7)
163 if rx == '': 162 if rx == b'':
164 raise exceptions.IOError("EOF from device") 163 raise IOError("EOF from device")
165 reply += rx 164 reply += rx
166 165
167 # '\x00\x00\x00\x00\x80\x04\x01' => STB = 4 166 # '\x00\x00\x00\x00\x80\x04\x01' => STB = 4
168 if rx[4] != '\x80': 167 if rx[4] != b'\x80':
169 raise exceptions.IOError("Incorrect Msg ID in response to STB query") 168 raise IOError("Incorrect Msg ID in response to STB query")
170 169
171 return ord(rx[5]) 170 return rx[5]
172 171
173 def waitsrq(self): 172 def waitsrq(self):
174 msg = '\x00\x00\x00\x00\xb1\x00\x00' 173 msg = b'\x00\x00\x00\x00\xb1\x00\x00'
175 174
176 def testsrq(self): 175 def testsrq(self):
177 msg = '\x00\x00\x00\x00\x91\x00\x00' 176 msg = b'\x00\x00\x00\x00\x91\x00\x00'
178 self.s2.send(msg) 177 self.s2.send(msg)
179 reply = '' 178 reply = b''
180 while len(reply) < 7: 179 while len(reply) < 7:
181 rx = self.s2.recv(7) 180 rx = self.s2.recv(7)
182 if rx == '': 181 if rx == b'':
183 raise exceptions.IOError("EOF from device") 182 raise IOError("EOF from device")
184 reply += rx 183 reply += rx
185 184
186 # 00 00 00 00 80 14 08 - SRQ = 0 185 # 00 00 00 00 80 14 08 - SRQ = 0
187 # 00 00 00 00 a0 64 07 - SRQ = 1 186 # 00 00 00 00 a0 64 07 - SRQ = 1
188 if rx == '\x00\x00\x00\x00\x80\x14\x08': 187 if rx == b'\x00\x00\x00\x00\x80\x14\x08':
189 return False 188 return False
190 elif rx == '\x00\x00\x00\x00\xa0\x64\x07': 189 elif rx == b'\x00\x00\x00\x00\xa0\x64\x07':
191 return True 190 return True
192 else: 191 else:
193 raise exceptions.IOError("Unknown SRQ byte sequence - " + str(list(map(ord, rx)))) 192 raise IOError("Unknown SRQ byte sequence - " + str(rx))