@@ -70,6 +70,36 @@ def write(self, data: bytes) -> int:
70
70
"""
71
71
...
72
72
73
+ def exchange (self , cmd : bytes , data : bytes = b"" ) -> bytes :
74
+ """Send command and input data to device, and return output data.
75
+
76
+ Parameters
77
+ ----------
78
+ cmd : int
79
+ Command code.
80
+ data : bytes, default b''
81
+ Input data for command, if any.
82
+
83
+ Returns
84
+ -------
85
+ bytes
86
+ Output data from command, if any.
87
+ """
88
+ (cmd_int ,) = CP .ShortInt .unpack (cmd )
89
+ header = CP .Header .pack (cmd_int , len (data ))
90
+ self .write (header + data )
91
+ status , response_size = CP .Header .unpack (self .read (CP .Header .size ))
92
+
93
+ if status :
94
+ raise Exception (status )
95
+
96
+ response = self .read (response_size )
97
+
98
+ if len (response ) < response_size :
99
+ raise TimeoutError
100
+
101
+ return response
102
+
73
103
def get_byte (self ) -> int :
74
104
"""Read a single one-byte of integer value.
75
105
@@ -164,10 +194,7 @@ def get_version(self) -> str:
164
194
str
165
195
Version string.
166
196
"""
167
- self .send_byte (CP .COMMON )
168
- self .send_byte (CP .GET_VERSION )
169
- version_length = 9
170
- version = self .read (version_length )
197
+ version = self .exchange (CP .COMMON + CP .GET_VERSION )
171
198
172
199
try :
173
200
if b"PSLab" not in version :
@@ -177,23 +204,16 @@ def get_version(self) -> str:
177
204
msg = "device not found"
178
205
raise ConnectionError (msg ) from exc
179
206
180
- return version .decode ("utf-8" )
207
+ return version .rstrip ( b" \x00 " ). decode ("utf-8" )
181
208
182
209
def get_firmware_version (self ) -> FirmwareVersion :
183
210
"""Get firmware version.
184
211
185
212
Returns
186
213
-------
187
- tuple[int, int, int]
214
+ FirmwareVersion
188
215
major, minor, patch.
189
216
190
217
"""
191
- self .send_byte (CP .COMMON )
192
- self .send_byte (CP .GET_FW_VERSION )
193
-
194
- # Firmware version query was added in firmware version 3.0.0.
195
- major = self .get_byte ()
196
- minor = self .get_byte ()
197
- patch = self .get_byte ()
198
-
218
+ major , minor , patch = self .exchange (CP .COMMON + CP .GET_FW_VERSION )
199
219
return FirmwareVersion (major , minor , patch )
0 commit comments