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