12
12
import platform
13
13
import struct
14
14
import time
15
- from functools import partial
15
+ from functools import partial , update_wrapper
16
16
from typing import List , Union
17
17
18
18
import serial
@@ -53,22 +53,27 @@ def __init__(
53
53
self ._logging = False
54
54
self .interface = serial .Serial ()
55
55
self .send_byte = partial (self ._send , size = 1 )
56
+ update_wrapper (self .send_byte , self ._send )
56
57
self .send_int = partial (self ._send , size = 2 )
58
+ update_wrapper (self .send_int , self ._send )
57
59
self .get_byte = partial (self ._receive , size = 1 )
60
+ update_wrapper (self .get_byte , self ._receive )
58
61
self .get_int = partial (self ._receive , size = 2 )
62
+ update_wrapper (self .get_int , self ._receive )
59
63
self .get_long = partial (self ._receive , size = 4 )
64
+ update_wrapper (self .get_long , self ._receive )
60
65
self .connect (port = port , baudrate = baudrate , timeout = timeout )
61
66
62
67
# Backwards compatibility
63
68
self .fd = self .interface
64
69
self .occupiedPorts = set ()
65
70
self .connected = self .interface .is_open
66
- self .__sendByte__ = partial ( self ._send , size = 1 )
67
- self .__sendInt__ = partial ( self ._send , size = 2 )
71
+ self .__sendByte__ = self .send_byte
72
+ self .__sendInt__ = self .send_int
68
73
self .__get_ack__ = self .get_ack
69
- self .__getByte__ = partial ( self ._receive , size = 1 )
70
- self .__getInt__ = partial ( self ._receive , size = 2 )
71
- self .__getLong__ = partial ( self ._receive , size = 4 )
74
+ self .__getByte__ = self .get_byte
75
+ self .__getInt__ = self .get_int
76
+ self .__getLong__ = self .get_long
72
77
self .waitForData = self .wait_for_data
73
78
self .sendBurst = self .send_burst
74
79
self .portname = self .interface .name
@@ -239,24 +244,17 @@ def _get_integer_type(size: int) -> struct.Struct:
239
244
else :
240
245
raise ValueError ("size must be 1, 2, or 4." )
241
246
242
- def _send (self , value : Union [bytes , int ], size : int = None ):
247
+ def _send (self , value : Union [bytes , int ], size : int ):
243
248
"""Send a value to the PSLab.
244
249
245
- Optionally handles conversion from int to bytes.
246
-
247
250
Parameters
248
251
----------
249
- value : bytes, int
252
+ value : int
250
253
Value to send to PSLab. Must fit in four bytes.
251
- size : int, optional
252
- Number of bytes to send. If not specified, the number of bytes sent
253
- depends on the size of :value:.
254
254
"""
255
255
if isinstance (value , bytes ):
256
256
packet = value
257
257
else :
258
- # True + True == 2, see PEP 285.
259
- size = 2 ** ((value > 0xFF ) + (value > 0xFFFF )) if size is None else size
260
258
packer = self ._get_integer_type (size )
261
259
packet = packer .pack (value )
262
260
@@ -266,28 +264,18 @@ def _send(self, value: Union[bytes, int], size: int = None):
266
264
self .write (packet )
267
265
268
266
def _receive (self , size : int ) -> int :
269
- """Read and unpack the specified number of bytes from the serial port.
270
-
271
- Parameters
272
- ----------
273
- size : int
274
- Number of bytes to read from the serial port.
267
+ """Read and unpack data from the serial port.
275
268
276
269
Returns
277
270
-------
278
271
int
279
- Unpacked bytes , or -1 if too few bytes were read.
272
+ Unpacked data , or -1 if too few bytes were read.
280
273
"""
281
274
received = self .read (size )
282
275
283
276
if len (received ) == size :
284
- if size in (1 , 2 , 4 ):
285
- unpacker = self ._get_integer_type (size )
286
- retval = unpacker .unpack (received )[0 ]
287
- else :
288
- retval = int .from_bytes (
289
- bytes = received , byteorder = "little" , signed = False
290
- )
277
+ unpacker = self ._get_integer_type (size )
278
+ retval = unpacker .unpack (received )[0 ]
291
279
else :
292
280
logger .error (f"Requested { size } bytes, got { len (received )} ." )
293
281
retval = - 1 # raise an exception instead?
0 commit comments