Index: scripts/update_package_script/update_package.py =================================================================== diff -u -r4e199a369c055fdad3866cebe7ef78b81035b4ba -ra8de2deaeffb523ed9d706a40726cc92c2a0edd2 --- scripts/update_package_script/update_package.py (.../update_package.py) (revision 4e199a369c055fdad3866cebe7ef78b81035b4ba) +++ scripts/update_package_script/update_package.py (.../update_package.py) (revision a8de2deaeffb523ed9d706a40726cc92c2a0edd2) @@ -1,12 +1,10 @@ import os -import can import re -from sphinx.util.osutil import getcwd +from scripts.base.base import Base, SWUpdateTargets +from scripts.update_package_script.utilities import Utilities, SWUpdateCommands -from scripts.base.base import Base - class SoftwareUpdateScript(Base): _DECODED_BYTES_KEY_NAME = 'decoded_bytes' @@ -15,7 +13,10 @@ _TOTAL_BYTES_TX_KEY_NAME = 'total_bytes_tx' _RESIDUAL_BYTES_KEY_NAME = 'residual_bytes' - _DECODE_LIST_MAX_SIZE_BYTES = 2048 + _XML_REPORT_FILE_TYPE_KEY_NAME = 'filetype' + _XML_REPORT_BIN_SIZE_KEY_NAME = 'size' + + _DECODE_LIST_MAX_SIZE_BYTES = 4096 _SHIFT_BITS_BY_8 = 8 _DECODE_COPRIME_1 = 19 _DECODE_COPRIME_2 = 23 @@ -24,16 +25,14 @@ _XML_REPORT_END_TAG = "" _XML_REPORT_HEADER_SIZE = 2 - _NUM_OF_BYTES_PER_CAN_FRAME = 8 - _CAN_INTERFACE = "can0" - def __init__(self): super().__init__() self._signature_start_in_bytes = bytes(self.SIGNATURE_START, 'utf-8') self._signature_end_in_bytes = bytes(self.SIGNATURE_END, 'utf-8') self._decode_data_status = dict() self._xml_report_values = dict() + self._utilities = Utilities() def _reset_variables(self): @@ -52,10 +51,10 @@ self._xml_report_values['name'] = '' self._xml_report_values['version'] = '' - self._xml_report_values['filetype'] = '' + self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] = '' self._xml_report_values['security'] = '' self._xml_report_values['version'] = '' - self._xml_report_values['size'] = '' + self._xml_report_values[self._XML_REPORT_BIN_SIZE_KEY_NAME] = 0 self._xml_report_values['raw'] = '' def _verify_signature(self, signature: bytes): @@ -97,7 +96,6 @@ self._decode_data_status['is_first_line'] = True for d in range(start_index, len(line_bytes)): - if self._decode_data_status['end_tag_found'] is False: decoded_value_bytes = (line_bytes[d] - self._decode_data_status[ 'decode_found_index']) % self._DECODE_VALUE @@ -108,12 +106,15 @@ converted_xml = self._decode_data_status['converted_xml'] self._decode_data_status['end_tag_found'] = True - self._xml_report_values['filetype'] = re.search('(.*)', converted_xml).group(1) - self._xml_report_values['size'] = re.search('(.*)', converted_xml).group(1) + self._xml_report_values[self._XML_REPORT_FILE_TYPE_KEY_NAME] = \ + re.search('(.*)', converted_xml).group(1) + binary_size_int = re.search('(.*)', converted_xml).group(1) + self._xml_report_values[self._XML_REPORT_BIN_SIZE_KEY_NAME] = int(binary_size_int) + print(self._xml_report_values['filetype'], self._xml_report_values['size'], - len(converted_xml), converted_xml, self._decode_data_status['decode_found_index'], 'H') + len(converted_xml), converted_xml, self._decode_data_status['decode_found_index'], 'H') # TODO remove else: - self._decode_data_status[self._DECODED_BYTES_KEY_NAME].append(hex(line_bytes[d])) + self._decode_data_status[self._DECODED_BYTES_KEY_NAME].append(line_bytes[d]) self._decode_data_status[self._CUR_DATA_INDEX_KEY_NAME] += 1 def _process_read_line(self, line: bytes): @@ -131,7 +132,6 @@ self._decode_data_status[self._RESIDUAL_BYTES_KEY_NAME] = xml_report_start if self._decode_data_status['decode_values_found'] is True: - print(xml_report_start, len(xml_report_start), 'K') self._decode_line(xml_report_start) else: # TODO fill up @@ -140,9 +140,36 @@ self._get_decode_variables(line) if self._decode_data_status['decode_values_found'] is False else None self._decode_line(line) - def _send_update_data_to_bootloader(self): - pass + 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 + 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 + + 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) + + 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) + + 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]) + def update_software_packages(self, packages_dir: str, stack_to_update: str = None): # 1. Verify signature # 2. Verify key @@ -160,11 +187,16 @@ self._reset_variables() for line in f: self._process_read_line(line) - self._send_update_data_to_bootloader() + self._handle_processed_data() + + self._handle_processed_data() f.close() + # TODO for testing remove print(self._decode_data_status[self._CUR_DATA_INDEX_KEY_NAME], self._decode_data_status[self._DECODED_BYTES_KEY_NAME][0], + self._decode_data_status[self._DECODED_BYTES_KEY_NAME][-4], 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]) + self._decode_data_status[self._DECODED_BYTES_KEY_NAME][-1], + len(self._decode_data_status[self._DECODED_BYTES_KEY_NAME])) # TODO remove