Index: scripts/update_package_script/utilities.py =================================================================== diff -u -r988824ec54f3d9d4ff92d60d2be09fe8ad09ee29 -r239e4187b87deffb844cf29a350a980252cba042 --- scripts/update_package_script/utilities.py (.../utilities.py) (revision 988824ec54f3d9d4ff92d60d2be09fe8ad09ee29) +++ scripts/update_package_script/utilities.py (.../utilities.py) (revision 239e4187b87deffb844cf29a350a980252cba042) @@ -3,9 +3,19 @@ import time import can import struct +from time import sleep from enum import Enum, unique from can.interfaces.socketcan.socketcan import SocketcanBus +class CANMessageListener(can.Listener): + + def __init__(self): + self.raw_can_messages = list() + + def on_message_received(self, msg: can.Message): + self.raw_can_messages.append(msg) + + class SWUpdateEnum(Enum): @classmethod def has_value(cls, value): @@ -35,7 +45,7 @@ NUM_OF_STACKS = 2 @unique -class UpdateStacksTargets(SWUpdateEnum): +class UpdateStacksDestinations(SWUpdateEnum): TARGET_FIRMWARE = 0 TARGET_FPGA = 1 NUM_OF_TARGETS = 2 @@ -87,6 +97,7 @@ _NUM_OF_BYTES_PER_CAN_FRAME = 8 _CAN_INTERFACE = 'can0' _SEND_CMD_MAIL_BOX = 0x601 + _BROADCAST_UPDATE_MAIL_BOX = 0x606 _CAN_MSG_WAIT_FOR_RESP_S = 3.0 _RESP_MSG_ACK = 1 _RESP_MSG_NACK = 0 @@ -112,12 +123,15 @@ self._total_msg_count = 0 self._stack = 0 - self._msg_ack_nack_status[self.SEND_MSG_ACK_STATUS_KEY_NAME] = CanCommStatus.CAN_COMM_NOT_STARTED.value - self._msg_ack_nack_status[self.UPDATE_MSG_ACK_STATUS_KEY_NAME] = CanCommStatus.CAN_COMM_NOT_STARTED.value + self._msg_ack_nack_status[self.SEND_MSG_ACK_STATUS_KEY_NAME] = [CanCommStatus.CAN_COMM_NOT_STARTED.value, 0] + self._msg_ack_nack_status[self.UPDATE_MSG_ACK_STATUS_KEY_NAME] = [CanCommStatus.CAN_COMM_NOT_STARTED.value, 0] self.file_handle = open(os.path.join(os.getcwd(), 'ack_log.log'), 'w') self._prepare_update_mail_boxes(self._update_mail_boxes) + self._can_listener = CANMessageListener() + self._notifier = can.Notifier(self._can_bus, [self._can_listener]) + def get_msg_ack_nack_status(self, msg_type: str): """ Publicly accessible method to get the ack or nack status of a message @@ -126,7 +140,7 @@ @return The status of the provided message type (e.g. ready, failed, ...) """ - return self._msg_ack_nack_status[msg_type] + return self._msg_ack_nack_status[msg_type][0] def clear_msg_ack_nack_status(self, msg_type: str): """ @@ -136,7 +150,7 @@ @return none """ - self._msg_ack_nack_status[msg_type] = CanCommStatus.CAN_COMM_NOT_STARTED.value + self._msg_ack_nack_status[msg_type][0] = CanCommStatus.CAN_COMM_NOT_STARTED.value def send_command_msg(self, cmd: int, stack: int, destination: int): """ @@ -155,6 +169,7 @@ # 4 bytes as message CRC self._stack = stack message_id_count = self._get_current_message_count() + self._msg_ack_nack_status[self.SEND_MSG_ACK_STATUS_KEY_NAME][1] = message_id_count can_msg_bytes = self._convert_data_to_bytes(' self._CAN_MSG_WAIT_FOR_RESP_S: + can_comm_status = CanCommStatus.CAN_COMM_TIME_OUT.value + break + if len(self._can_listener.raw_can_messages) == 0: continue + message = self._can_listener.raw_can_messages.pop(0) + # print("Popped message", message) can_comm_status = CanCommStatus.CAN_COMM_IN_PROGRESS.value - if message is None: continue # If received the message from the corresponding response message and the message ID count is the same as was sent # then check the CRC of the received message. If passed, check whether the message as acked or not and update the status resp_mail_box = self._update_mail_boxes[UpdateStacks(self._stack).name][self._STACK_RCV_RESP_MAIL_BOX] msg_id_back = self._convert_bytes_to_data(' self._CAN_MSG_WAIT_FOR_RESP_S: - # can_comm_status = CanCommStatus.CAN_COMM_TIME_OUT.value - # break - self._msg_ack_nack_status[msg_type] = can_comm_status + self._msg_ack_nack_status[msg_type][0] = can_comm_status if msg_type == self.SEND_MSG_ACK_STATUS_KEY_NAME: # If the message that was acked, was the command, enable the update message that it is ready to be used - self._msg_ack_nack_status[self.UPDATE_MSG_ACK_STATUS_KEY_NAME] = CanCommStatus.CAN_COMM_READY.value \ + self._msg_ack_nack_status[self.UPDATE_MSG_ACK_STATUS_KEY_NAME][0] = CanCommStatus.CAN_COMM_READY.value \ if can_comm_status == CanCommStatus.CAN_COMM_READY.value else CanCommStatus.CAN_COMM_NOT_STARTED.value self.file_handle.write("Msg ID: {}, Msg Type: {}, Comm Status: {}\r".format(self._msg_id_count, msg_type, CanCommStatus(can_comm_status).name))