Index: scripts/update_package_script/update_package.py =================================================================== diff -u -ra8de2deaeffb523ed9d706a40726cc92c2a0edd2 -r13a167417e54fb156c1fd9ac581a961f1c3d57bb --- scripts/update_package_script/update_package.py (.../update_package.py) (revision a8de2deaeffb523ed9d706a40726cc92c2a0edd2) +++ scripts/update_package_script/update_package.py (.../update_package.py) (revision 13a167417e54fb156c1fd9ac581a961f1c3d57bb) @@ -2,7 +2,7 @@ import re from scripts.base.base import Base, SWUpdateTargets -from scripts.update_package_script.utilities import Utilities, SWUpdateCommands +from scripts.update_package_script.utilities import Utilities, SWUpdateCommands, CanCommStatus class SoftwareUpdateScript(Base): @@ -12,6 +12,8 @@ _CUR_INSERT_DATA_INDEX_KEY_NAME = 'cur_insert_index' _TOTAL_BYTES_TX_KEY_NAME = 'total_bytes_tx' _RESIDUAL_BYTES_KEY_NAME = 'residual_bytes' + _BINARY_SEND_COMPLETE_KEY_NAME = 'is_binary_done' + _SIG_MSG_SEND_COMPLETE_KEY_NAME = 'is_sig_msg_done' _XML_REPORT_FILE_TYPE_KEY_NAME = 'filetype' _XML_REPORT_BIN_SIZE_KEY_NAME = 'size' @@ -48,6 +50,8 @@ self._decode_data_status[self._CUR_DATA_INDEX_KEY_NAME] = 0 self._decode_data_status[self._CUR_INSERT_DATA_INDEX_KEY_NAME] = 0 self._decode_data_status[self._TOTAL_BYTES_TX_KEY_NAME] = 0 + self._decode_data_status[self._BINARY_SEND_COMPLETE_KEY_NAME] = False + self._decode_data_status[self._SIG_MSG_SEND_COMPLETE_KEY_NAME] = False self._xml_report_values['name'] = '' self._xml_report_values['version'] = '' @@ -57,6 +61,9 @@ self._xml_report_values[self._XML_REPORT_BIN_SIZE_KEY_NAME] = 0 self._xml_report_values['raw'] = '' + self._utilities.clear_msg_ack_nack_status(self._utilities.SEND_MSG_ACK_STATUS_KEY_NAME) + self._utilities.clear_msg_ack_nack_status(self._utilities.UPDATE_MSG_ACK_STATUS_KEY_NAME) + def _verify_signature(self, signature: bytes): # TODO fill up pass @@ -142,34 +149,72 @@ def _handle_processed_data(self): - if self._utilities.get_msg_ack_nack_status(self._utilities.SEND_MSG_ACK_STATUS_KEY_NAME) == 0: # TODO these values should change to real return values + send_ack_status = self._utilities.get_msg_ack_nack_status(self._utilities.SEND_MSG_ACK_STATUS_KEY_NAME) + update_ack_status = self._utilities.get_msg_ack_nack_status(self._utilities.UPDATE_MSG_ACK_STATUS_KEY_NAME) + #print(send_ack_status, update_ack_status) + + # TODO change the target right now they do not match because they are written for Leahi + # TODO for instance, it should be self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] as the second parameter + target = 'TARGET_TD' # self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] + target = SWUpdateTargets[target].value + #print(self._decode_data_status[self._DECODED_BYTES_KEY_NAME]) + if send_ack_status == CanCommStatus.CAN_COMM_NOT_STARTED.value: if self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] != '': - # TODO change the target right now they do not match because they are written for Leahi - # TODO for instance, it should be self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] as the second parameter - target = 'TARGET_TD' #self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] - target = SWUpdateTargets[target].value self._utilities.send_command_msg(SWUpdateCommands.SW_UPDATE_START.value, target) # TODO change the target right now they do not match because they are written for Leahi - elif self._utilities.get_msg_ack_nack_status(self._utilities.SEND_MSG_ACK_STATUS_KEY_NAME) == -1: # TODO this should be changed to 1 but the ack is not received now yet - data_2_write = list() - current_index = self._decode_data_status[self._CUR_DATA_INDEX_KEY_NAME] - target = 'TARGET_TD' # self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] - target = SWUpdateTargets[target].value + # CanCommStatus.CAN_COMM_SUCCESSFUL.value: # TODO this should be changed to successful but the ack is not received now yet + elif send_ack_status == 2 and self._decode_data_status[self._BINARY_SEND_COMPLETE_KEY_NAME] is False: + if update_ack_status == CanCommStatus.CAN_COMM_NOT_STARTED.value or \ + update_ack_status == 2: #CanCommStatus.CAN_COMM_SUCCESSFUL.value): + current_write_index = self._decode_data_status[self._TOTAL_BYTES_TX_KEY_NAME] + current_insert_index = self._decode_data_status[self._CUR_DATA_INDEX_KEY_NAME] + binary_size = self._xml_report_values[self._XML_REPORT_BIN_SIZE_KEY_NAME] + var = '' + if current_write_index == binary_size: + self._decode_data_status[self._BINARY_SEND_COMPLETE_KEY_NAME] = True - if current_index % self.SW_UPDATE_FLASH_BUFFER_SIZE == 0: - data_2_write = self._decode_data_status[self._DECODED_BYTES_KEY_NAME] \ - [current_index - self.SW_UPDATE_FLASH_BUFFER_SIZE: current_index] - self._utilities.send_software_update_msg(target, data_2_write) + if current_insert_index - current_write_index >= self.SW_UPDATE_FLASH_BUFFER_SIZE: + data_2_write = self._decode_data_status[self._DECODED_BYTES_KEY_NAME] \ + [current_write_index: current_write_index + self.SW_UPDATE_FLASH_BUFFER_SIZE] + self._decode_data_status[self._TOTAL_BYTES_TX_KEY_NAME] += self.SW_UPDATE_FLASH_BUFFER_SIZE + self._utilities.send_software_update_msg(target, data_2_write) + var = 'A' + elif current_insert_index == binary_size and \ + self._decode_data_status[self._BINARY_SEND_COMPLETE_KEY_NAME] is False: + remaining_bytes = current_insert_index - current_write_index + data_2_write = self._decode_data_status[self._DECODED_BYTES_KEY_NAME] \ + [current_write_index: current_insert_index] + data_2_write += [0] * (self.SW_UPDATE_FLASH_BUFFER_SIZE - remaining_bytes) + self._decode_data_status[self._TOTAL_BYTES_TX_KEY_NAME] += remaining_bytes + self._utilities.send_software_update_msg(target, data_2_write) + var = 'B' + print(current_write_index, self._decode_data_status[self._CUR_DATA_INDEX_KEY_NAME], current_insert_index - current_write_index, var) + elif update_ack_status == 2 and self._decode_data_status[self._BINARY_SEND_COMPLETE_KEY_NAME] is True: #CanCommStatus.CAN_COMM_SUCCESSFUL.value: # TODO this should be changed to successful but the ack is not received now yet + # TODO do we need the electronic signature from xml? + data_2_write = [0] * self.SW_UPDATE_FLASH_BUFFER_SIZE + self._utilities.send_software_update_msg(target, data_2_write, signature_msg=True) - elif current_index == self._xml_report_values[self._XML_REPORT_BIN_SIZE_KEY_NAME]: - binary_size = self._xml_report_values[self._XML_REPORT_BIN_SIZE_KEY_NAME] - data_2_write = self._decode_data_status[self._DECODED_BYTES_KEY_NAME][current_index - binary_size:] - data_2_write += [0] * (self.SW_UPDATE_FLASH_BUFFER_SIZE - binary_size) + if self._utilities.get_msg_ack_nack_status(self._utilities.UPDATE_MSG_ACK_STATUS_KEY_NAME) == 2: #TODO change to successful + self._decode_data_status[self._SIG_MSG_SEND_COMPLETE_KEY_NAME] = True - self._utilities.send_software_update_msg(target, data_2_write) + #print(data_2_write, len(data_2_write), self._decode_data_status[self._DECODED_BYTES_KEY_NAME]) - #print(data_2_write, len(data_2_write), self._decode_data_status[self._DECODED_BYTES_KEY_NAME]) + def _process_remaining_data(self): + while True: + self._handle_processed_data() + + if self._decode_data_status[self._SIG_MSG_SEND_COMPLETE_KEY_NAME] is True: + break + + # TODO change the target right now they do not match because they are written for Leahi + # TODO for instance, it should be self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] as the second parameter + target = 'TARGET_TD' # self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] + target = SWUpdateTargets[target].value + self._utilities.send_command_msg(SWUpdateCommands.SW_UPDATE_VERIFY.value, target) + # TODO change the target right now they do not match because they are written for Leahi + + def update_software_packages(self, packages_dir: str, stack_to_update: str = None): # 1. Verify signature # 2. Verify key @@ -189,7 +234,8 @@ self._process_read_line(line) self._handle_processed_data() - self._handle_processed_data() + self._process_remaining_data() + f.close() # TODO for testing remove @@ -199,4 +245,5 @@ self._decode_data_status[self._DECODED_BYTES_KEY_NAME][-3], self._decode_data_status[self._DECODED_BYTES_KEY_NAME][-2], self._decode_data_status[self._DECODED_BYTES_KEY_NAME][-1], - len(self._decode_data_status[self._DECODED_BYTES_KEY_NAME])) # TODO remove + len(self._decode_data_status[self._DECODED_BYTES_KEY_NAME])) + # TODO remove