diff --git a/j1939/Dm14Query.py b/j1939/Dm14Query.py index e8ad385..949fe82 100644 --- a/j1939/Dm14Query.py +++ b/j1939/Dm14Query.py @@ -50,8 +50,8 @@ def _wait_for_data(self) -> None: """ assert self.state is QueryState.WAIT_FOR_SEED if self.command is Command.WRITE: - self._send_dm16() self.state = QueryState.WAIT_FOR_OPER_COMPLETE + self._send_dm16() else: self.state = QueryState.WAIT_FOR_DM16 self._ca.unsubscribe(self._parse_dm15) @@ -75,9 +75,9 @@ def _send_dm14(self, key_or_user_level: int) -> None: self._pgn = j1939.ParameterGroupNumber.PGN.DM14 pointer = self.address.to_bytes(length=4, byteorder="little") data = [] - data.append(self.object_count) + data.append(self.object_count & 0xFF) data.append( - (self.direct << 4) + (self.command.value << 1) + 1 + ((self.object_count >> 3) & 0xE0) + (self.direct << 4) + (self.command.value << 1) + 1 ) # (SAE reserved = 1) for octet in pointer: data.append(octet) @@ -95,8 +95,7 @@ def _send_dm16(self) -> None: data = [] byte_count = len(self.bytes) data.append(0xFF if byte_count > 7 else byte_count) - for i in range(byte_count): - data.append(self.bytes[i]) + data.extend(self.bytes) self._ca.send_pgn( 0, (self._pgn >> 8) & 0xFF, self._dest_address & 0xFF, 6, data ) @@ -114,7 +113,6 @@ def _parse_dm15( """ if pgn != j1939.ParameterGroupNumber.PGN.DM15 or sa != self._dest_address: return - seed = (data[7] << 8) + data[6] status = (data[1] >> 1) & 7 if ( status is Dm15Status.BUSY.value @@ -137,14 +135,15 @@ def _parse_dm15( ) ) else: - length = data[0] + seed = (data[7] << 8) + data[6] + length = data[0] + ((data[1] & 0xE0) << 3) if seed == 0xFFFF and length == self.object_count: self._wait_for_data() else: if self.state is QueryState.WAIT_FOR_OPER_COMPLETE: assert status is Command.OPERATION_COMPLETED.value - self._send_operation_complete() self.state = QueryState.IDLE + self._send_operation_complete() self.data_queue.put(self.mem_data) else: assert self.state is QueryState.WAIT_FOR_SEED @@ -171,8 +170,10 @@ def _parse_dm16( """ if pgn != j1939.ParameterGroupNumber.PGN.DM16 or sa != self._dest_address: return - length = min(data[0], len(data) - 1) - # assert object_count == self.object_count + if data[0] == 0xFF: + length = len(data) - 1 + else: + length = min(data[0], 7) self.mem_data = data[1 : length + 1] self._ca.unsubscribe(self._parse_dm16) self._ca.subscribe(self._parse_dm15) @@ -194,10 +195,10 @@ def _bytes_to_values(self, raw_bytes: bytearray) -> list: :param bytearray raw_bytes: bytes received from device """ values = [] - for i in range(len(raw_bytes) // self.object_byte_size): + for i in range(0, len(raw_bytes), self.object_byte_size): values.append( int.from_bytes( - raw_bytes[i : self.object_byte_size], + raw_bytes[i : i + self.object_byte_size], byteorder="little", signed=self.signed, ) @@ -227,6 +228,7 @@ def read( :param int max_timeout: max timeout for transaction """ assert object_count > 0 + assert object_count <= 1784 self._dest_address = dest_address self.direct = direct self.address = address @@ -235,9 +237,9 @@ def read( self.signed = signed self.return_raw_bytes = return_raw_bytes self.command = Command.READ + self.state = QueryState.WAIT_FOR_SEED self._ca.subscribe(self._parse_dm15) self._send_dm14(7) - self.state = QueryState.WAIT_FOR_SEED # wait for operation completed DM15 message raw_bytes = None try: @@ -281,9 +283,10 @@ def write( self.command = Command.WRITE self.bytes = self._values_to_bytes(values) self.object_count = len(values) + assert self.object_count <= 1784 + self.state = QueryState.WAIT_FOR_SEED self._ca.subscribe(self._parse_dm15) self._send_dm14(7) - self.state = QueryState.WAIT_FOR_SEED # wait for operation completed DM15 message try: self.data_queue.get(block=True, timeout=max_timeout) diff --git a/j1939/Dm14Server.py b/j1939/Dm14Server.py index c039a1b..04d35c4 100644 --- a/j1939/Dm14Server.py +++ b/j1939/Dm14Server.py @@ -62,7 +62,7 @@ def _wait_for_data(self) -> None: ): self._ca.unsubscribe(self._parse_dm16) self._send_dm16() - if (len(self.data)) <= 8: + if (len(self.data)) <= 7: self.proceed = True self.state = ResponseState.SEND_OPERATION_COMPLETE self._ca.subscribe(self.parse_dm14) @@ -77,6 +77,8 @@ def _wait_for_data(self) -> None: self.error, self.edcp, ) + else: + self.state = ResponseState.WAIT_FOR_DM16 elif ( self.command is j1939.Command.WRITE.value and self.state == ResponseState.SEND_PROCEED @@ -100,6 +102,7 @@ def parse_dm14( """ if pgn != j1939.ParameterGroupNumber.PGN.DM14: return + if ( (self.sa is not None and sa != self.sa) or ( @@ -109,10 +112,10 @@ def parse_dm14( ): self._send_dm15( self.length, - data[1] >> 4, + (data[1] >> 4) & 0x1, j1939.Dm15Status.OPERATION_FAILED.value, j1939.ResponseState.SEND_ERROR, - data[0], + data[0] + ((data[1] & 0xE0) << 3), sa, j1939.ParameterGroupNumber.PGN.DM15, self.error if self.error != 0x00 else 0x2, @@ -122,7 +125,7 @@ def parse_dm14( return self.length = len(data) - self.direct = data[1] >> 4 + self.direct = (data[1] >> 4) & 0x1 match self.state: case ResponseState.IDLE: @@ -130,10 +133,9 @@ def parse_dm14( self.sa = sa self.status = j1939.Dm15Status.PROCEED.value self.address = data[2 : (self.length - 2)] - self.direct = data[1] >> 4 self.command = ((data[1] - 1) & 0x0F) >> 1 self.pointer_type = (data[1] >> 4) & 0x1 - self.object_count = data[0] + self.object_count = data[0] + ((data[1] & 0xE0) << 3) self.access_level = (data[self.length - 1] << 8) + data[self.length - 2] self.data = data if self._key_from_seed is not None: @@ -154,15 +156,15 @@ def parse_dm14( self.length = len(data) self.address = data[2 : (self.length - 2)] self.command = ((data[1] - 1) & 0x0F) >> 1 - self.object_count = data[0] + self.object_count = data[0] + ((data[1] & 0xE0) << 3) self.key = (data[self.length - 1] << 8) + data[self.length - 2] self.data = data self.state = ResponseState.SEND_PROCEED case ResponseState.WAIT_OPERATION_COMPLETE: - self.state = ResponseState.IDLE - self.sa = None self._ca.unsubscribe(self.parse_dm14) + self.sa = None + self.state = ResponseState.IDLE case _: raise ValueError("Invalid state") @@ -203,7 +205,8 @@ def _send_dm15( data[length - 1] = self.seed >> 8 case ResponseState.SEND_PROCEED: - data[0] = object_count + data[0] = object_count & 0xFF + data[1] += (object_count & 0x300) >> 3 case ResponseState.SEND_OPERATION_COMPLETE: self.command = j1939.Command.OPERATION_COMPLETED.value @@ -231,12 +234,11 @@ def _send_dm16(self) -> None: self._pgn = j1939.ParameterGroupNumber.PGN.DM16 data = [] byte_count = len(self.data) - data.append(0xFF if byte_count > 7 else byte_count) - for i in range((byte_count)): - data.append(self.data[i]) + data.append(0xFF if byte_count > 7 else byte_count) + data.extend(self.data) data.extend([0xFF] * (self.length - byte_count - 1)) - if byte_count > 8: + if byte_count > 7: self._ca.subscribe(self._parse_dm16) self._ca.send_pgn(0, (self._pgn >> 8) & 0xFF, self.sa & 0xFF, 7, data) @@ -255,7 +257,10 @@ def _parse_dm16( if pgn != j1939.ParameterGroupNumber.PGN.DM16 or sa != self.sa: return - length = min(data[0], len(data) - 1) + if data[0] == 0xFF: + length = len(data) - 1 + else: + length = min(data[0], 7) self.data_queue.put(data[1 : length + 1]) self._ca.unsubscribe(self._parse_dm16) self._ca.subscribe(self.parse_dm14) diff --git a/test/test_memory_access.py b/test/test_memory_access.py index 31d9c7b..79c6b43 100644 --- a/test/test_memory_access.py +++ b/test/test_memory_access.py @@ -6,7 +6,7 @@ # fmt: off read_with_seed_key = [ - (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000007 + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0x5A, 0xA5], 0.0), # DM15 seed response (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0xA5, 0x5A], 0.0), # DM14 key response (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x01, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response @@ -16,10 +16,10 @@ ] read_with_seed_key_busy = [ - (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000007 + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0x5A, 0xA5], 0.0), # DM15 seed response (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0xA5, 0x5A], 0.0), # DM14 key response - (Feeder.MsgType.CANRX, 0x18D9F9D4, [0x01, 0x13, 0x03, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 read address 0x91000007 + (Feeder.MsgType.CANRX, 0x18D9F9D4, [0x01, 0x13, 0x03, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 read address 0x91000003 (Feeder.MsgType.CANTX, 0x18D8D4F9, [0x00, 0x1B, 0x02, 0x00, 0x00, 0x07, 0xFF, 0xFF], 0.0), # DM15 Busy Response (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x01, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response (Feeder.MsgType.CANRX, 0x1CD7F9D4, [0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM16 data transfer @@ -28,13 +28,76 @@ ] read_no_seed_key = [ - (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000007 + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x01, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response (Feeder.MsgType.CANRX, 0x1CD7F9D4, [0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM16 data transfer (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x19, 0x03, 0x00, 0x00, 0x92, 0xFF, 0xFF], 0.0), # DM14 operation completed ] +read_no_seed_key_8_bytes = [ + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x08, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 + (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x08, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response + # DM16 data transfer using Transport Protocol, start + (Feeder.MsgType.CANRX, 0x18ECF9D4, [0x10, 0x09, 0x00, 0x02, 0x02, 0x00, 0xD7, 0x00], 0.0), # TP.CM_RTS, size=9, packets=2, maxPackets=2, PGN=D700 + (Feeder.MsgType.CANTX, 0x1CECD4F9, [0x11, 0x02, 0x01, 0xFF, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_CTS, packets=2, nextPacketNum=1, PGN=D700 + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x01] + [0xFF] + [0xAB] * 6 , 0.0), # TP.DT, 1, DM16 part 1, FF + data 1-6 + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x02] + [0xAB] * 2 + [0xFF] * 5 , 0.0), # TP.DT, 2, DM16 part 2, data 7-8 + (Feeder.MsgType.CANTX, 0x1CECD4F9, [0x13, 0x09, 0x00, 0x02, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_EndOfMsgACK, size=9, packets=2, PGN=D700 + # DM16 data transfer using Transport Protocol, end + (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x19, 0x03, 0x00, 0x00, 0x92, 0xFF, 0xFF], 0.0), # DM14 operation completed +] + +read_no_seed_key_256_bytes = [ + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x00, 0x33, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 + (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response + # DM16 data transfer using Transport Protocol, start + (Feeder.MsgType.CANRX, 0x18ECF9D4, [0x10, 0x01, 0x01, 0x25, 0x25, 0x00, 0xD7, 0x00], 0.0), # TP.CM_RTS, size=257, packets=37, maxPackets=37, PGN=D700 + (Feeder.MsgType.CANTX, 0x1CECD4F9, [0x11, 0x25, 0x01, 0xFF, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_CTS, packets=37, nextPacketNum=1, PGN=D700 + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x01] + [0xFF] + [0xAB] * 6 , 0.0), # TP.DT, 1, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x02] + [0xAB] * 7 , 0.0), # TP.DT, 2, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x03] + [0xAB] * 7 , 0.0), # TP.DT, 3, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x04] + [0xAB] * 7 , 0.0), # TP.DT, 4, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x05] + [0xAB] * 7 , 0.0), # TP.DT, 5, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x06] + [0xAB] * 7 , 0.0), # TP.DT, 6, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x07] + [0xAB] * 7 , 0.0), # TP.DT, 7, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x08] + [0xAB] * 7 , 0.0), # TP.DT, 8, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x09] + [0xAB] * 7 , 0.0), # TP.DT, 9, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x0A] + [0xAB] * 7 , 0.0), # TP.DT, 10, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x0B] + [0xAB] * 7 , 0.0), # TP.DT, 11, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x0C] + [0xAB] * 7 , 0.0), # TP.DT, 12, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x0D] + [0xAB] * 7 , 0.0), # TP.DT, 13, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x0E] + [0xAB] * 7 , 0.0), # TP.DT, 14, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x0F] + [0xAB] * 7 , 0.0), # TP.DT, 15, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x10] + [0xAB] * 7 , 0.0), # TP.DT, 16, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x11] + [0xAB] * 7 , 0.0), # TP.DT, 17, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x12] + [0xAB] * 7 , 0.0), # TP.DT, 18, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x13] + [0xAB] * 7 , 0.0), # TP.DT, 19, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x14] + [0xAB] * 7 , 0.0), # TP.DT, 20, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x15] + [0xAB] * 7 , 0.0), # TP.DT, 21, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x16] + [0xAB] * 7 , 0.0), # TP.DT, 22, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x17] + [0xAB] * 7 , 0.0), # TP.DT, 23, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x18] + [0xAB] * 7 , 0.0), # TP.DT, 24, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x19] + [0xAB] * 7 , 0.0), # TP.DT, 25, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x1A] + [0xAB] * 7 , 0.0), # TP.DT, 26, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x1B] + [0xAB] * 7 , 0.0), # TP.DT, 27, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x1C] + [0xAB] * 7 , 0.0), # TP.DT, 28, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x1D] + [0xAB] * 7 , 0.0), # TP.DT, 29, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x1E] + [0xAB] * 7 , 0.0), # TP.DT, 30, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x1F] + [0xAB] * 7 , 0.0), # TP.DT, 31, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x20] + [0xAB] * 7 , 0.0), # TP.DT, 32, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x21] + [0xAB] * 7 , 0.0), # TP.DT, 33, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x22] + [0xAB] * 7 , 0.0), # TP.DT, 34, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x23] + [0xAB] * 7 , 0.0), # TP.DT, 35, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x24] + [0xAB] * 7 , 0.0), # TP.DT, 36, DM16 data + (Feeder.MsgType.CANRX, 0x18EBF9D4, [0x25] + [0xAB] * 5 + [0xFF] * 2 , 0.0), # TP.DT, 37, DM16 data + (Feeder.MsgType.CANTX, 0x1CECD4F9, [0x13, 0x01, 0x01, 0x25, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_EndOfMsgACK, size=257, packets=37, PGN=D700 + # DM16 data transfer using Transport Protocol, end + (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x19, 0x03, 0x00, 0x00, 0x92, 0xFF, 0xFF], 0.0), # DM14 operation completed +] + write_with_seed_key = [ (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x15, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 write address 0x91000007 (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0x5A, 0xA5], 0.0), # DM15 seed response @@ -53,6 +116,69 @@ (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x19, 0x07, 0x00, 0x00, 0x91, 0xFF, 0xFF], 0.0), # DM14 operation completed ] +write_no_seed_key_8_bytes_data = [ + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x08, 0x15, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 write address 0x91000007 + (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x08, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response + # DM16 data transfer using Transport Protocol, start + (Feeder.MsgType.CANTX, 0x18ECD4F9, [0x10, 0x09, 0x00, 0x02, 0x02, 0x00, 0xD7, 0x00], 0.0), # TP.CM_RTS, size=9, packets=2, maxPackets=255, PGN=D700 + (Feeder.MsgType.CANRX, 0x18ECF9D4, [0x11, 0x02, 0x01, 0xFF, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_CTS, packets=2, nextPacketNum=1, PGN=D700 + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x01] + [0xFF] + [0xAB] * 6 , 0.0), # TP.DT, 1, DM16 part 1, FF + data 1-6 + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x02] + [0xAB] * 2 + [0xFF] * 5 , 0.0), # TP.DT, 2, DM16 part 2, data 7-8 + (Feeder.MsgType.CANRX, 0x18ECF9D4, [0x13, 0x09, 0x00, 0x02, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_EndOfMsgACK, size=9, packets=2, PGN=D700 + # DM16 data transfer using Transport Protocol, end + (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x19, 0x07, 0x00, 0x00, 0x91, 0xFF, 0xFF], 0.0), # DM14 operation completed +] + +write_no_seed_key_256_bytes_data = [ + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x00, 0x35, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 write address 0x91000007 + (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response + # DM16 data transfer using Transport Protocol, start + (Feeder.MsgType.CANTX, 0x18ECD4F9, [0x10, 0x01, 0x01, 0x25, 0x25, 0x00, 0xD7, 0x00], 0.0), # TP.CM_RTS, size=257, packets=37, maxPackets=37, PGN=D700 + (Feeder.MsgType.CANRX, 0x18ECF9D4, [0x11, 0x25, 0x01, 0xFF, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_CTS, packets=37, nextPacketNum=1, PGN=D700 + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x01] + [0xFF] + [0xAB] * 6 , 0.0), # TP.DT, 1, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x02] + [0xAB] * 7 , 0.0), # TP.DT, 2, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x03] + [0xAB] * 7 , 0.0), # TP.DT, 3, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x04] + [0xAB] * 7 , 0.0), # TP.DT, 4, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x05] + [0xAB] * 7 , 0.0), # TP.DT, 5, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x06] + [0xAB] * 7 , 0.0), # TP.DT, 6, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x07] + [0xAB] * 7 , 0.0), # TP.DT, 7, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x08] + [0xAB] * 7 , 0.0), # TP.DT, 8, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x09] + [0xAB] * 7 , 0.0), # TP.DT, 9, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x0A] + [0xAB] * 7 , 0.0), # TP.DT, 10, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x0B] + [0xAB] * 7 , 0.0), # TP.DT, 11, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x0C] + [0xAB] * 7 , 0.0), # TP.DT, 12, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x0D] + [0xAB] * 7 , 0.0), # TP.DT, 13, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x0E] + [0xAB] * 7 , 0.0), # TP.DT, 14, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x0F] + [0xAB] * 7 , 0.0), # TP.DT, 15, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x10] + [0xAB] * 7 , 0.0), # TP.DT, 16, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x11] + [0xAB] * 7 , 0.0), # TP.DT, 17, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x12] + [0xAB] * 7 , 0.0), # TP.DT, 18, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x13] + [0xAB] * 7 , 0.0), # TP.DT, 19, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x14] + [0xAB] * 7 , 0.0), # TP.DT, 20, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x15] + [0xAB] * 7 , 0.0), # TP.DT, 21, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x16] + [0xAB] * 7 , 0.0), # TP.DT, 22, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x17] + [0xAB] * 7 , 0.0), # TP.DT, 23, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x18] + [0xAB] * 7 , 0.0), # TP.DT, 24, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x19] + [0xAB] * 7 , 0.0), # TP.DT, 25, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x1A] + [0xAB] * 7 , 0.0), # TP.DT, 26, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x1B] + [0xAB] * 7 , 0.0), # TP.DT, 27, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x1C] + [0xAB] * 7 , 0.0), # TP.DT, 28, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x1D] + [0xAB] * 7 , 0.0), # TP.DT, 29, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x1E] + [0xAB] * 7 , 0.0), # TP.DT, 30, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x1F] + [0xAB] * 7 , 0.0), # TP.DT, 31, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x20] + [0xAB] * 7 , 0.0), # TP.DT, 32, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x21] + [0xAB] * 7 , 0.0), # TP.DT, 33, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x22] + [0xAB] * 7 , 0.0), # TP.DT, 34, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x23] + [0xAB] * 7 , 0.0), # TP.DT, 35, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x24] + [0xAB] * 7 , 0.0), # TP.DT, 36, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBD4F9, [0x25] + [0xAB] * 5 + [0xFF] * 2 , 0.0), # TP.DT, 37, DM16 data + (Feeder.MsgType.CANRX, 0x18ECF9D4, [0x13, 0x01, 0x01, 0x25, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_EndOfMsgACK, size=257, packets=37, PGN=D700 + # DM16 data transfer using Transport Protocol, end + (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x19, 0x07, 0x00, 0x00, 0x91, 0xFF, 0xFF], 0.0), # DM14 operation completed +] + request_read_with_seed = [ (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Initialization message used to start listening for DM14 messages (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x91000007 @@ -73,11 +199,76 @@ (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x19, 0x03, 0x00, 0x00, 0x92, 0xFF, 0xFF], 0.0), # DM14 operation completed ] +request_read_no_seed_8_bytes = [ + (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x08, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Initialization message used to start listening for DM14 messages + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x08, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 + (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x08, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response + # DM16 data transfer using Transport Protocol, start + (Feeder.MsgType.CANTX, 0x1CECF9D4, [0x10, 0x09, 0x00, 0x02, 0x02, 0x00, 0xD7, 0x00], 0.0), # TP.CM_RTS, size=9, packets=2, maxPackets=2, PGN=D700 + (Feeder.MsgType.CANRX, 0x18ECD4F9, [0x11, 0x02, 0x01, 0xFF, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_CTS, packets=2, nextPacketNum=1, PGN=D700 + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x01] + [0xFF] + [0xAB] * 6 , 0.0), # TP.DT, 1, DM16 part 1, FF + data 1-6 + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x02] + [0xAB] * 2 + [0xFF] * 5 , 0.0), # TP.DT, 2, DM16 part 2, data 7-8 + (Feeder.MsgType.CANRX, 0x18ECD4F9, [0x13, 0x09, 0x00, 0x02, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_EndOfMsgACK, size=9, packets=2, PGN=D700 + # DM16 data transfer using Transport Protocol, end + (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x19, 0x03, 0x00, 0x00, 0x92, 0xFF, 0xFF], 0.0), # DM14 operation completed +] + +request_read_no_seed_256_bytes = [ + (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x00, 0x33, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Initialization message used to start listening for DM14 messages + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x00, 0x33, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 + (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response + # DM16 data transfer using Transport Protocol, start + (Feeder.MsgType.CANTX, 0x1CECF9D4, [0x10, 0x01, 0x01, 0x25, 0x25, 0x00, 0xD7, 0x00], 0.0), # TP.CM_RTS, size=257, packets=37, maxPackets=37, PGN=D700 + (Feeder.MsgType.CANRX, 0x18ECD4F9, [0x11, 0x25, 0x01, 0xFF, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_CTS, packets=37, nextPacketNum=1, PGN=D700 + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x01] + [0xFF] + [0xAB] * 6 , 0.0), # TP.DT, 1, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x02] + [0xAB] * 7 , 0.0), # TP.DT, 2, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x03] + [0xAB] * 7 , 0.0), # TP.DT, 3, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x04] + [0xAB] * 7 , 0.0), # TP.DT, 4, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x05] + [0xAB] * 7 , 0.0), # TP.DT, 5, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x06] + [0xAB] * 7 , 0.0), # TP.DT, 6, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x07] + [0xAB] * 7 , 0.0), # TP.DT, 7, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x08] + [0xAB] * 7 , 0.0), # TP.DT, 8, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x09] + [0xAB] * 7 , 0.0), # TP.DT, 9, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x0A] + [0xAB] * 7 , 0.0), # TP.DT, 10, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x0B] + [0xAB] * 7 , 0.0), # TP.DT, 11, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x0C] + [0xAB] * 7 , 0.0), # TP.DT, 12, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x0D] + [0xAB] * 7 , 0.0), # TP.DT, 13, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x0E] + [0xAB] * 7 , 0.0), # TP.DT, 14, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x0F] + [0xAB] * 7 , 0.0), # TP.DT, 15, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x10] + [0xAB] * 7 , 0.0), # TP.DT, 16, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x11] + [0xAB] * 7 , 0.0), # TP.DT, 17, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x12] + [0xAB] * 7 , 0.0), # TP.DT, 18, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x13] + [0xAB] * 7 , 0.0), # TP.DT, 19, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x14] + [0xAB] * 7 , 0.0), # TP.DT, 20, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x15] + [0xAB] * 7 , 0.0), # TP.DT, 21, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x16] + [0xAB] * 7 , 0.0), # TP.DT, 22, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x17] + [0xAB] * 7 , 0.0), # TP.DT, 23, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x18] + [0xAB] * 7 , 0.0), # TP.DT, 24, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x19] + [0xAB] * 7 , 0.0), # TP.DT, 25, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x1A] + [0xAB] * 7 , 0.0), # TP.DT, 26, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x1B] + [0xAB] * 7 , 0.0), # TP.DT, 27, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x1C] + [0xAB] * 7 , 0.0), # TP.DT, 28, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x1D] + [0xAB] * 7 , 0.0), # TP.DT, 29, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x1E] + [0xAB] * 7 , 0.0), # TP.DT, 30, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x1F] + [0xAB] * 7 , 0.0), # TP.DT, 31, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x20] + [0xAB] * 7 , 0.0), # TP.DT, 32, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x21] + [0xAB] * 7 , 0.0), # TP.DT, 33, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x22] + [0xAB] * 7 , 0.0), # TP.DT, 34, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x23] + [0xAB] * 7 , 0.0), # TP.DT, 35, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x24] + [0xAB] * 7 , 0.0), # TP.DT, 36, DM16 data + (Feeder.MsgType.CANTX, 0x1CEBF9D4, [0x25] + [0xAB] * 5 + [0xFF] * 2 , 0.0), # TP.DT, 37, DM16 data + (Feeder.MsgType.CANRX, 0x18ECD4F9, [0x13, 0x01, 0x01, 0x25, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_EndOfMsgACK, size=257, packets=37, PGN=D700 + # DM16 data transfer using Transport Protocol, end + (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x19, 0x03, 0x00, 0x00, 0x92, 0xFF, 0xFF], 0.0), # DM14 operation completed +] + request_read_with_seed_busy = [ (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Initialization message used to start listening for DM14 messages - (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x91000007 + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0x5A, 0xA5], 0.0), # DM15 seed response - (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 read address 0x91000007 + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 read address 0x91000003 (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x1B, 0x02, 0x00, 0x00, 0x07, 0xFF, 0xFF], 0.0), # DM15 Busy Response (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0xA5, 0x5A], 0.0), # DM14 key response (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x01, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response @@ -88,9 +279,9 @@ receive_diff_sa_busy = [ (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Initialization message used to start listening for DM14 messages - (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x91000007 + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0x5A, 0xA5], 0.0), # DM15 seed response - (Feeder.MsgType.CANRX, 0x18D9D4FA, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x91000007 + (Feeder.MsgType.CANRX, 0x18D9D4FA, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 (Feeder.MsgType.CANTX, 0x18D8FAD4, [0x00, 0x1B, 0x02, 0x00, 0x00, 0x07, 0xFF, 0xFF], 0.0), # DM15 Busy Response (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0xA5, 0x5A], 0.0), # DM14 key response (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x01, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response @@ -100,7 +291,7 @@ ] request_write_with_seed = [ - (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), + (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Random message to start listening for DM14 (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x15, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 write address 0x91000007 (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0x5A, 0xA5], 0.0), # DM15 seed response (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x15, 0x07, 0x00, 0x00, 0x91, 0xA5, 0x5A], 0.0), # DM14 key response @@ -119,6 +310,71 @@ (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x19, 0x07, 0x00, 0x00, 0x91, 0xFF, 0xFF], 0.0), # DM14 operation completed ] +request_write_no_seed_8_bytes = [ + (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x08, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Random message to start listening for DM14 + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x08, 0x15, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 write address 0x91000007 + (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x08, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response + # DM16 data transfer using Transport Protocol, start + (Feeder.MsgType.CANRX, 0x18ECD4F9, [0x10, 0x09, 0x00, 0x02, 0x02, 0x00, 0xD7, 0x00], 0.0), # TP.CM_RTS, size=9, packets=2, maxPackets=2, PGN=D700 + (Feeder.MsgType.CANTX, 0x1CECF9D4, [0x11, 0x02, 0x01, 0xFF, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_CTS, packets=2, nextPacketNum=1, PGN=D700 + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x01] + [0xFF] + [0xAB] * 6 , 0.0), # TP.DT, 1, DM16 part 1, FF + data 1-6 + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x02] + [0xAB] * 2 + [0xFF] * 5 , 0.0), # TP.DT, 2, DM16 part 2, data 7-8 + (Feeder.MsgType.CANTX, 0x1CECF9D4, [0x13, 0x09, 0x00, 0x02, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_EndOfMsgACK, size=9, packets=2, PGN=D700 + # DM16 data transfer using Transport Protocol, end + (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x19, 0x07, 0x00, 0x00, 0x91, 0xFF, 0xFF], 0.0), # DM14 operation completed +] + +request_write_no_seed_256_bytes = [ + (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x00, 0x33, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Random message to start listening for DM14 + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x00, 0x35, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 write address 0x91000007 + (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 proceed response + # DM16 data transfer using Transport Protocol, start + (Feeder.MsgType.CANRX, 0x18ECD4F9, [0x10, 0x01, 0x01, 0x25, 0x25, 0x00, 0xD7, 0x00], 0.0), # TP.CM_RTS, size=257, packets=37, maxPackets=37, PGN=D700 + (Feeder.MsgType.CANTX, 0x1CECF9D4, [0x11, 0x25, 0x01, 0xFF, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_CTS, packets=37, nextPacketNum=1, PGN=D700 + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x01] + [0xFF] + [0xAB] * 6 , 0.0), # TP.DT, 1, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x02] + [0xAB] * 7 , 0.0), # TP.DT, 2, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x03] + [0xAB] * 7 , 0.0), # TP.DT, 3, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x04] + [0xAB] * 7 , 0.0), # TP.DT, 4, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x05] + [0xAB] * 7 , 0.0), # TP.DT, 5, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x06] + [0xAB] * 7 , 0.0), # TP.DT, 6, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x07] + [0xAB] * 7 , 0.0), # TP.DT, 7, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x08] + [0xAB] * 7 , 0.0), # TP.DT, 8, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x09] + [0xAB] * 7 , 0.0), # TP.DT, 9, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x0A] + [0xAB] * 7 , 0.0), # TP.DT, 10, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x0B] + [0xAB] * 7 , 0.0), # TP.DT, 11, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x0C] + [0xAB] * 7 , 0.0), # TP.DT, 12, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x0D] + [0xAB] * 7 , 0.0), # TP.DT, 13, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x0E] + [0xAB] * 7 , 0.0), # TP.DT, 14, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x0F] + [0xAB] * 7 , 0.0), # TP.DT, 15, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x10] + [0xAB] * 7 , 0.0), # TP.DT, 16, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x11] + [0xAB] * 7 , 0.0), # TP.DT, 17, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x12] + [0xAB] * 7 , 0.0), # TP.DT, 18, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x13] + [0xAB] * 7 , 0.0), # TP.DT, 19, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x14] + [0xAB] * 7 , 0.0), # TP.DT, 20, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x15] + [0xAB] * 7 , 0.0), # TP.DT, 21, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x16] + [0xAB] * 7 , 0.0), # TP.DT, 22, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x17] + [0xAB] * 7 , 0.0), # TP.DT, 23, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x18] + [0xAB] * 7 , 0.0), # TP.DT, 24, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x19] + [0xAB] * 7 , 0.0), # TP.DT, 25, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x1A] + [0xAB] * 7 , 0.0), # TP.DT, 26, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x1B] + [0xAB] * 7 , 0.0), # TP.DT, 27, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x1C] + [0xAB] * 7 , 0.0), # TP.DT, 28, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x1D] + [0xAB] * 7 , 0.0), # TP.DT, 29, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x1E] + [0xAB] * 7 , 0.0), # TP.DT, 30, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x1F] + [0xAB] * 7 , 0.0), # TP.DT, 31, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x20] + [0xAB] * 7 , 0.0), # TP.DT, 32, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x21] + [0xAB] * 7 , 0.0), # TP.DT, 33, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x22] + [0xAB] * 7 , 0.0), # TP.DT, 34, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x23] + [0xAB] * 7 , 0.0), # TP.DT, 35, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x24] + [0xAB] * 7 , 0.0), # TP.DT, 36, DM16 data + (Feeder.MsgType.CANRX, 0x18EBD4F9, [0x25] + [0xAB] * 5 + [0xFF] * 2 , 0.0), # TP.DT, 37, DM16 data + (Feeder.MsgType.CANTX, 0x1CECF9D4, [0x13, 0x01, 0x01, 0x25, 0xFF, 0x00, 0xD7, 0x00], 0.0), # TP.CM_EndOfMsgACK, size=257, packets=37, PGN=D700 + # DM16 data transfer using Transport Protocol, end + (Feeder.MsgType.CANTX, 0x18D8F9D4, [0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], 0.0), # DM15 operation completed + (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x19, 0x07, 0x00, 0x00, 0x91, 0xFF, 0xFF], 0.0), # DM14 operation completed +] + request_write_no_seed_timeout = [ (Feeder.MsgType.CANTX, 0x18D9F9D4, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # Random message to start listening for DM14 (Feeder.MsgType.CANRX, 0x18D9D4F9, [0x01, 0x15, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00], 0.0), # DM14 write address 0x91000007 @@ -126,14 +382,14 @@ ] read_with_seed_error = [ - (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000007 + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0x5A, 0xA5], 0.0), # DM15 seed response (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0xA5, 0x5A], 0.0), # DM14 key response (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x1B, 0x01, 0x00, 0x00, 0x07, 0xFF, 0xFF], 0.0), # DM15 error response ] read_no_seed_error = [ - (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000007 + (Feeder.MsgType.CANTX, 0x18D9D4F9, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], 0.0), # DM14 read address 0x92000003 (Feeder.MsgType.CANRX, 0x18D8F9D4, [0x00, 0x1B, 0x01, 0x00, 0x00, 0x07, 0xFF, 0xFF], 0.0), # DM15 error response ] @@ -235,6 +491,39 @@ def test_dm14_read(feeder, expected_messages): feeder.process_messages() +@pytest.mark.parametrize( + argnames=["expected_messages"], + argvalues=[[read_no_seed_key_8_bytes], [read_no_seed_key_256_bytes]], + ids=["Without seed key 8 bytes", "Without seed key 256 bytes"], +) +def test_dm14_read_large_data(feeder, expected_messages): + """ + Tests the DM14 read query function with large data packet in range (8-255 bytes) and in range (256-1784 bytes) + :param feeder: can message feeder + :param expected_messages: list of expected messages + """ + if expected_messages == read_no_seed_key_8_bytes: + num_of_bytes = 8 + elif expected_messages == read_no_seed_key_256_bytes: + num_of_bytes = 256 + else: + assert False + + feeder.can_messages = expected_messages + feeder.pdus_from_messages() + + ca = feeder.accept_all_messages( + device_address_preferred=0xF9, bypass_address_claim=True + ) + + dm14 = j1939.MemoryAccess(ca) + + values = dm14.read(0xD4, 1, 0x92000003, num_of_bytes) + assert values == [0xAB] * num_of_bytes + + feeder.process_messages() + + @pytest.mark.parametrize( argnames=["expected_messages"], argvalues=[[write_with_seed_key], [write_no_seed_key]], @@ -261,6 +550,38 @@ def test_dm14_write(feeder, expected_messages): feeder.process_messages() +@pytest.mark.parametrize( + argnames=["expected_messages"], + argvalues=[[write_no_seed_key_8_bytes_data], [write_no_seed_key_256_bytes_data]], + ids=["Without seed key 8 bytes", "Without seed key 256 bytes"], +) +def test_dm14_write_large_data(feeder, expected_messages): + """ + Tests the DM14 write query function with large data packet in range (8-255 bytes) and in range (256-1784 bytes) + :param feeder: can message feeder + :param expected_messages: list of expected messages + """ + if expected_messages == write_no_seed_key_8_bytes_data: + num_of_bytes = 8 + elif expected_messages == write_no_seed_key_256_bytes_data: + num_of_bytes = 256 + else: + assert False + + feeder.can_messages = expected_messages + feeder.pdus_from_messages() + + ca = feeder.accept_all_messages( + device_address_preferred=0xF9, bypass_address_claim=True + ) + + dm14 = j1939.Dm14Query(ca) + values = [0xAB]*num_of_bytes + dm14.write(0xD4, 1, 0x91000007, values, object_byte_size=1) + + feeder.process_messages() + + def test_dm14_read_busy( feeder, ): @@ -300,6 +621,15 @@ def test_dm14_request_read(feeder, expected_messages): ca = feeder.accept_all_messages( device_address_preferred=0xD4, bypass_address_claim=True ) + + dm14 = j1939.MemoryAccess(ca) + dm14.set_seed_generator(generate_seed) + dm14.set_proceed(proceed) + dm14.set_notify(global_flag) + + if expected_messages == request_read_with_seed: + dm14.set_seed_key_algorithm(key_from_seed) + ca.send_pgn( 0, (j1939.ParameterGroupNumber.PGN.DM14 >> 8) & 0xFF, @@ -307,20 +637,59 @@ def test_dm14_request_read(feeder, expected_messages): 6, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], ) + global flag + while flag is False: + pass + + reset_flag() + dm14.respond(True, [0x01], 0xFFFF, 0xFF) + + feeder.process_messages() + + +@pytest.mark.parametrize( + argnames=["expected_messages"], + argvalues=[[request_read_no_seed_8_bytes], [request_read_no_seed_256_bytes]], + ids=["Without seed key 8 bytes", "Without seed key 256 bytes"], +) +def test_dm14_request_read_large_data(feeder, expected_messages): + """ + Tests the DM14 response to read query function with large data packet in range (8-255 bytes) and in range (256-1784 bytes) + :param feeder: can message feeder + :param expected_messages: list of expected messages + """ + if expected_messages == request_read_no_seed_8_bytes: + num_data_bytes = 8 + elif expected_messages == request_read_no_seed_256_bytes: + num_data_bytes = 256 + else: + assert False + + feeder.can_messages = expected_messages + feeder.pdus_from_messages() + ca = feeder.accept_all_messages( + device_address_preferred=0xD4, bypass_address_claim=True + ) dm14 = j1939.MemoryAccess(ca) - dm14.set_seed_generator(generate_seed) dm14.set_proceed(proceed) dm14.set_notify(global_flag) - if expected_messages == request_read_with_seed: - dm14.set_seed_key_algorithm(key_from_seed) + ca.send_pgn( + 0, + (j1939.ParameterGroupNumber.PGN.DM14 >> 8) & 0xFF, + 0xF9 & 0xFF, + 6, + [num_data_bytes & 0xFF, ((num_data_bytes & 0x300) >> 3) + 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], + ) + global flag while flag is False: pass + reset_flag() - dm14.respond(True, [0x01], 0xFFFF, 0xFF) + dm14.respond(True, [0xAB] * num_data_bytes, 0xFFFF, 0xFF, 20) feeder.process_messages() @@ -335,6 +704,13 @@ def test_dm14_request_read_busy(feeder): ca = feeder.accept_all_messages( device_address_preferred=0xD4, bypass_address_claim=True ) + + dm14 = j1939.MemoryAccess(ca) + dm14.set_seed_generator(generate_seed) + dm14.set_notify(global_flag) + dm14.set_proceed(proceed) + dm14.set_seed_key_algorithm(key_from_seed) + ca.send_pgn( 0, (j1939.ParameterGroupNumber.PGN.DM14 >> 8) & 0xFF, @@ -342,15 +718,8 @@ def test_dm14_request_read_busy(feeder): 6, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], ) - global flag - - dm14 = j1939.MemoryAccess(ca) - dm14.set_seed_generator(generate_seed) - - dm14.set_notify(global_flag) - dm14.set_proceed(proceed) - dm14.set_seed_key_algorithm(key_from_seed) + global flag while flag is False: pass @@ -370,6 +739,13 @@ def test_dm14_busy_diff_addr(feeder): ca = feeder.accept_all_messages( device_address_preferred=0xD4, bypass_address_claim=True ) + + dm14 = j1939.MemoryAccess(ca) + dm14.set_seed_generator(generate_seed) + dm14.set_notify(global_flag) + dm14.set_proceed(proceed) + dm14.set_seed_key_algorithm(key_from_seed) + ca.send_pgn( 0, (j1939.ParameterGroupNumber.PGN.DM14 >> 8) & 0xFF, @@ -377,15 +753,8 @@ def test_dm14_busy_diff_addr(feeder): 6, [0x01, 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], ) - global flag - - dm14 = j1939.MemoryAccess(ca) - dm14.set_seed_generator(generate_seed) - - dm14.set_notify(global_flag) - dm14.set_proceed(proceed) - dm14.set_seed_key_algorithm(key_from_seed) + global flag while flag is False: pass @@ -411,6 +780,14 @@ def test_dm14_request_write(feeder, expected_messages): ca = feeder.accept_all_messages( device_address_preferred=0xD4, bypass_address_claim=True ) + + dm14 = j1939.MemoryAccess(ca) + dm14.set_seed_generator(generate_seed) + dm14.set_proceed(proceed) + dm14.set_notify(global_flag) + if expected_messages == request_write_with_seed: + dm14.set_seed_key_algorithm(key_from_seed) + ca.send_pgn( 0, (j1939.ParameterGroupNumber.PGN.DM14 >> 8) & 0xFF, @@ -420,20 +797,62 @@ def test_dm14_request_write(feeder, expected_messages): ) global flag + while flag is False: + pass + + reset_flag() + test = dm14.respond(True, [], 0xFFFF, 0xFF) + value = 0x11223344 + assert value == int.from_bytes(test, byteorder="little", signed=False) + + feeder.process_messages() + + +@pytest.mark.parametrize( + argnames=["expected_messages"], + # argvalues=[[request_write_no_seed_8_bytes], [request_write_no_seed_256_bytes]], + # ids=["Without seed key 8 bytes", "Without seed key 256 bytes"], + argvalues=[[request_write_no_seed_256_bytes]], + ids=["Without seed key 256 bytes"], +) +def test_dm14_request_write_large_data(feeder, expected_messages): + """ + Tests the DM14 response to write query function with large data packet in range (8-255 bytes) and in range (256-1784 bytes) + :param feeder: can message feeder + :param expected_messages: list of expected messages + """ + if expected_messages == request_write_no_seed_8_bytes: + num_data_bytes = 8 + elif expected_messages == request_write_no_seed_256_bytes: + num_data_bytes = 256 + else: + assert False + feeder.can_messages = expected_messages + feeder.pdus_from_messages() + ca = feeder.accept_all_messages( + device_address_preferred=0xD4, bypass_address_claim=True + ) dm14 = j1939.MemoryAccess(ca) - dm14.set_seed_generator(generate_seed) dm14.set_proceed(proceed) dm14.set_notify(global_flag) - if expected_messages == request_write_with_seed: - dm14.set_seed_key_algorithm(key_from_seed) - values = 0x11223344 + ca.send_pgn( + 0, + (j1939.ParameterGroupNumber.PGN.DM14 >> 8) & 0xFF, + 0xF9 & 0xFF, + 6, + [num_data_bytes & 0xFF, ((num_data_bytes & 0x300) >> 3) + 0x13, 0x03, 0x00, 0x00, 0x92, 0x07, 0x00], + ) + + global flag while flag is False: pass + reset_flag() test = dm14.respond(True, [], 0xFFFF, 0xFF) - assert values == int.from_bytes(test, byteorder="little", signed=False) + values = [0xAB] * num_data_bytes + assert values == test feeder.process_messages() @@ -449,6 +868,12 @@ def test_dm14_request_write_timeout(feeder): ca = feeder.accept_all_messages( device_address_preferred=0xD4, bypass_address_claim=True ) + + dm14 = j1939.MemoryAccess(ca) + dm14.set_seed_generator(generate_seed) + dm14.set_proceed(proceed) + dm14.set_notify(global_flag) + ca.send_pgn( 0, (j1939.ParameterGroupNumber.PGN.DM14 >> 8) & 0xFF, @@ -458,17 +883,12 @@ def test_dm14_request_write_timeout(feeder): ) global flag - - dm14 = j1939.MemoryAccess(ca) - dm14.set_seed_generator(generate_seed) - dm14.set_proceed(proceed) - dm14.set_notify(global_flag) - - values = 0x11223344 while flag is False: pass + reset_flag() test = dm14.respond(True, [], 0xFFFF, 0xFF) + assert test == [] feeder.process_messages() @@ -623,7 +1043,7 @@ def test_dm14_write_timeout(feeder): values = [0x11223344] dm14.write(0xD4, 1, 0x91000007, values, object_byte_size=4) - assert str(excinfo.value) is "No response from server" + assert str(excinfo.value) == "No response from server" feeder.process_messages() diff --git a/test_helpers/feeder.py b/test_helpers/feeder.py index 6ce6be9..c1b8543 100644 --- a/test_helpers/feeder.py +++ b/test_helpers/feeder.py @@ -30,7 +30,7 @@ class Feeder: Simulated/mocked CAN message feeder for tests. Tests can use this class to specify expected rx and tx messages via Feeder.can_messages. Overrides j1939.ElectronicControlUnit.send_message, checking that tx message data matches - expected data, and then injecting the expected rx nessage into the ECU + expected data, and then injecting the expected rx message into the ECU """ class MsgType(object): @@ -45,7 +45,7 @@ def __init__(self): self.message_thread = threading.Thread(target=self._async_can_feeder) self.message_thread.start() # redirect the send_message from the can bus to our simulation - self.ecu = j1939.ElectronicControlUnit(send_message=self._send_message) + self.ecu = j1939.ElectronicControlUnit(max_cmdt_packets=255, send_message=self._send_message) def _async_can_feeder(self): """Asynchronous feeder"""