@@ -70,6 +70,36 @@ def write(self, data: bytes) -> int:
7070 """
7171 ...
7272
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+
73103 def get_byte (self ) -> int :
74104 """Read a single one-byte of integer value.
75105
@@ -164,10 +194,7 @@ def get_version(self) -> str:
164194 str
165195 Version string.
166196 """
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 )
171198
172199 try :
173200 if b"PSLab" not in version :
@@ -177,23 +204,16 @@ def get_version(self) -> str:
177204 msg = "device not found"
178205 raise ConnectionError (msg ) from exc
179206
180- return version .decode ("utf-8" )
207+ return version .rstrip ( b" \x00 " ). decode ("utf-8" )
181208
182209 def get_firmware_version (self ) -> FirmwareVersion :
183210 """Get firmware version.
184211
185212 Returns
186213 -------
187- tuple[int, int, int]
214+ FirmwareVersion
188215 major, minor, patch.
189216
190217 """
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 )
199219 return FirmwareVersion (major , minor , patch )
0 commit comments