From 6ddbfa9561b74f9e6aabde4c0b02a5aa29dcf9cf Mon Sep 17 00:00:00 2001 From: Faisal Shah Date: Wed, 25 Jan 2023 22:55:03 -0600 Subject: [PATCH 1/3] Handle extended arbitration id properly socketcand uses the length of the arbitration id field to indicate whether a frame is using extended id or not. 3 characters for standard, 8 for extended. Prior to this fix, the arbitration id would be truncated to the lower 11 bits, or at times even garbage. --- can/interfaces/socketcand/socketcand.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/can/interfaces/socketcand/socketcand.py b/can/interfaces/socketcand/socketcand.py index 28f0c700f..41266ca74 100644 --- a/can/interfaces/socketcand/socketcand.py +++ b/can/interfaces/socketcand/socketcand.py @@ -27,11 +27,16 @@ def convert_ascii_message_to_can_message(ascii_msg: str) -> can.Message: frame_string = ascii_msg[8:-2] parts = frame_string.split(" ", 3) can_id, timestamp = int(parts[0], 16), float(parts[1]) + is_ext = len(parts[0]) != 3 data = bytearray.fromhex(parts[2]) can_dlc = len(data) can_message = can.Message( - timestamp=timestamp, arbitration_id=can_id, data=data, dlc=can_dlc + timestamp=timestamp, + arbitration_id=can_id, + data=data, + dlc=can_dlc, + is_extended_id=is_ext, ) return can_message @@ -40,11 +45,15 @@ def convert_can_message_to_ascii_message(can_message: can.Message) -> str: # Note: socketcan bus adds extended flag, remote_frame_flag & error_flag to id # not sure if that is necessary here can_id = can_message.arbitration_id + if can_message.is_extended_id: + can_id_string = f"{(can_id&0x1FFFFFFF):08X}" + else: + can_id_string = f"{(can_id&0x7FF):03X}" # Note: seems like we cannot add CANFD_BRS (bitrate_switch) and CANFD_ESI (error_state_indicator) flags data = can_message.data length = can_message.dlc bytes_string = " ".join(f"{x:x}" for x in data[0:length]) - return f"< send {can_id:X} {length:X} {bytes_string} >" + return f"< send {can_id_string} {length:X} {bytes_string} >" def connect_to_server(s, host, port): From 93beec2015eab81e83bace2bbcdced5d22cd2b52 Mon Sep 17 00:00:00 2001 From: Faisal Shah Date: Fri, 27 Jan 2023 15:55:33 -0600 Subject: [PATCH 2/3] Add is_rx attribute --- can/interfaces/socketcand/socketcand.py | 1 + 1 file changed, 1 insertion(+) diff --git a/can/interfaces/socketcand/socketcand.py b/can/interfaces/socketcand/socketcand.py index 41266ca74..8100c6195 100644 --- a/can/interfaces/socketcand/socketcand.py +++ b/can/interfaces/socketcand/socketcand.py @@ -37,6 +37,7 @@ def convert_ascii_message_to_can_message(ascii_msg: str) -> can.Message: data=data, dlc=can_dlc, is_extended_id=is_ext, + is_rx=True, ) return can_message From f43ac66b93c5b004a7daa1b608bc4066e82dba0a Mon Sep 17 00:00:00 2001 From: Faisal Shah Date: Fri, 27 Jan 2023 15:56:09 -0600 Subject: [PATCH 3/3] Populate channel{_info} and Message attributes --- can/interfaces/socketcand/socketcand.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/can/interfaces/socketcand/socketcand.py b/can/interfaces/socketcand/socketcand.py index 8100c6195..32b9a0edf 100644 --- a/can/interfaces/socketcand/socketcand.py +++ b/can/interfaces/socketcand/socketcand.py @@ -80,6 +80,8 @@ def __init__(self, channel, host, port, can_filters=None, **kwargs): self.__socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__message_buffer = deque() self.__receive_buffer = "" # i know string is not the most efficient here + self.channel = channel + self.channel_info = f"socketcand on {channel}@{host}:{port}" connect_to_server(self.__socket, self.__host, self.__port) self._expect_msg("< hi >") @@ -149,6 +151,7 @@ def _recv_internal(self, timeout): if parsed_can_message is None: log.warning(f"Invalid Frame: {single_message}") else: + parsed_can_message.channel = self.channel self.__message_buffer.append(parsed_can_message) buffer_view = buffer_view[end + 1 :]