Skip to content

Commit bb1706b

Browse files
authored
Specific Exceptions: Adapting seeedstudio interface (#1090)
* Adjust exceptions in seeedstudio interface * Format code with black * Logging level change
1 parent dd5886c commit bb1706b

File tree

1 file changed

+81
-41
lines changed

1 file changed

+81
-41
lines changed

can/interfaces/seeedstudio/seeedstudio.py

Lines changed: 81 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import struct
1111
import io
1212
from time import time
13+
14+
import can
1315
from can import BusABC, Message
1416

1517
logger = logging.getLogger("seeedbus")
@@ -84,19 +86,32 @@ def __init__(
8486
:param bitrate
8587
CAN bus bit rate, selected from available list.
8688
89+
:raises can.CanInitializationError: If the given parameters are invalid.
90+
:raises can.CanInterfaceNotImplementedError: If the serial module is not installed.
8791
"""
92+
93+
if serial is None:
94+
raise can.CanInterfaceNotImplementedError(
95+
"the serial module is not installed"
96+
)
97+
8898
self.bit_rate = bitrate
8999
self.frame_type = frame_type
90100
self.op_mode = operation_mode
91101
self.filter_id = bytearray([0x00, 0x00, 0x00, 0x00])
92102
self.mask_id = bytearray([0x00, 0x00, 0x00, 0x00])
93103
if not channel:
94-
raise ValueError("Must specify a serial port.")
104+
raise can.CanInitializationError("Must specify a serial port.")
95105

96106
self.channel_info = "Serial interface: " + channel
97-
self.ser = serial.Serial(
98-
channel, baudrate=baudrate, timeout=timeout, rtscts=False
99-
)
107+
try:
108+
self.ser = serial.Serial(
109+
channel, baudrate=baudrate, timeout=timeout, rtscts=False
110+
)
111+
except ValueError as error:
112+
raise can.CanInitializationError(
113+
"could not create the serial device"
114+
) from error
100115

101116
super(SeeedBus, self).__init__(channel=channel, *args, **kwargs)
102117
self.init_frame()
@@ -133,7 +148,10 @@ def init_frame(self, timeout=None):
133148
byte_msg.append(crc)
134149

135150
logger.debug("init_frm:\t%s", byte_msg.hex())
136-
self.ser.write(byte_msg)
151+
try:
152+
self.ser.write(byte_msg)
153+
except Exception as error:
154+
raise can.CanInitializationError("could send init frame") from error
137155

138156
def flush_buffer(self):
139157
self.ser.flushInput()
@@ -160,7 +178,7 @@ def status_frame(self, timeout=None):
160178
byte_msg.append(crc)
161179

162180
logger.debug("status_frm:\t%s", byte_msg.hex())
163-
self.ser.write(byte_msg)
181+
self._write(byte_msg)
164182

165183
def send(self, msg, timeout=None):
166184
"""
@@ -197,7 +215,15 @@ def send(self, msg, timeout=None):
197215
byte_msg.append(0x55)
198216

199217
logger.debug("sending:\t%s", byte_msg.hex())
200-
self.ser.write(byte_msg)
218+
self._write(byte_msg)
219+
220+
def _write(self, byte_msg: bytearray) -> None:
221+
try:
222+
self.ser.write(byte_msg)
223+
except serial.PortNotOpenError as error:
224+
raise can.CanOperationError("writing to closed port") from error
225+
except serial.SerialTimeoutException as error:
226+
raise can.CanTimeoutError() from error
201227

202228
def _recv_internal(self, timeout):
203229
"""
@@ -220,50 +246,64 @@ def _recv_internal(self, timeout):
220246
# or raise a SerialException
221247
rx_byte_1 = self.ser.read()
222248

249+
except serial.PortNotOpenError as error:
250+
raise can.CanOperationError("reading from closed port") from error
223251
except serial.SerialException:
224252
return None, False
225253

226254
if rx_byte_1 and ord(rx_byte_1) == 0xAA:
227-
rx_byte_2 = ord(self.ser.read())
228-
time_stamp = time()
229-
if rx_byte_2 == 0x55:
230-
status = bytearray([0xAA, 0x55])
231-
status += bytearray(self.ser.read(18))
232-
logger.debug("status resp:\t%s", status.hex())
233-
234-
else:
235-
length = int(rx_byte_2 & 0x0F)
236-
is_extended = bool(rx_byte_2 & 0x20)
237-
is_remote = bool(rx_byte_2 & 0x10)
238-
if is_extended:
239-
s_3_4_5_6 = bytearray(self.ser.read(4))
240-
arb_id = (struct.unpack("<I", s_3_4_5_6))[0]
255+
try:
256+
rx_byte_2 = ord(self.ser.read())
241257

242-
else:
243-
s_3_4 = bytearray(self.ser.read(2))
244-
arb_id = (struct.unpack("<H", s_3_4))[0]
245-
246-
data = bytearray(self.ser.read(length))
247-
end_packet = ord(self.ser.read())
248-
if end_packet == 0x55:
249-
msg = Message(
250-
timestamp=time_stamp,
251-
arbitration_id=arb_id,
252-
is_extended_id=is_extended,
253-
is_remote_frame=is_remote,
254-
dlc=length,
255-
data=data,
256-
)
257-
logger.debug("recv message: %s", str(msg))
258-
return msg, False
258+
time_stamp = time()
259+
if rx_byte_2 == 0x55:
260+
status = bytearray([0xAA, 0x55])
261+
status += bytearray(self.ser.read(18))
262+
logger.debug("status resp:\t%s", status.hex())
259263

260264
else:
261-
return None, False
265+
length = int(rx_byte_2 & 0x0F)
266+
is_extended = bool(rx_byte_2 & 0x20)
267+
is_remote = bool(rx_byte_2 & 0x10)
268+
if is_extended:
269+
s_3_4_5_6 = bytearray(self.ser.read(4))
270+
arb_id = (struct.unpack("<I", s_3_4_5_6))[0]
271+
272+
else:
273+
s_3_4 = bytearray(self.ser.read(2))
274+
arb_id = (struct.unpack("<H", s_3_4))[0]
275+
276+
data = bytearray(self.ser.read(length))
277+
end_packet = ord(self.ser.read())
278+
if end_packet == 0x55:
279+
msg = Message(
280+
timestamp=time_stamp,
281+
arbitration_id=arb_id,
282+
is_extended_id=is_extended,
283+
is_remote_frame=is_remote,
284+
dlc=length,
285+
data=data,
286+
)
287+
logger.debug("recv message: %s", str(msg))
288+
return msg, False
289+
290+
else:
291+
return None, False
292+
293+
except serial.PortNotOpenError as error:
294+
raise can.CanOperationError("reading from closed port") from error
295+
except serial.SerialException as error:
296+
raise can.CanOperationError(
297+
"failed to read message information"
298+
) from error
262299

263300
return None, None
264301

265302
def fileno(self):
266303
try:
267304
return self.ser.fileno()
268-
except io.UnsupportedOperation:
269-
raise NotImplementedError("fileno is not implemented using current CAN bus")
305+
except io.UnsupportedOperation as excption:
306+
logger.warning(
307+
"fileno is not implemented using current CAN bus: %s", str(excption)
308+
)
309+
return -1

0 commit comments

Comments
 (0)