diff --git a/tc/obsw_tc_service23_sdcard.py b/tc/obsw_tc_service23_sdcard.py index bcc70f174313bf47f68eef5739b2f6227a7015e3..1bd3a8b792de2b57e6a9885cb7f4f4474ea34c03 100644 --- a/tc/obsw_tc_service23_sdcard.py +++ b/tc/obsw_tc_service23_sdcard.py @@ -50,22 +50,26 @@ class FileTransferHelper: @param target_filename: Filename on target @param object_id: """ - self.transfer_mode = self.TransferMode.NORMAL + self.__transfer_mode = self.TransferMode.NORMAL self.max_size_of_app_data = max_size_of_app_data - self.max_file_data_size = 0 + self.__max_file_data_size = 0 self.allowed_file_data_size = calculate_allowed_file_data_size( max_size_of_app_data, target_filename, target_repository) self.target_filename = target_filename self.target_repository = target_repository - self.renamed_name = self.target_filename + "old" + self.__renamed_name = self.target_filename + "old" self.object_id = object_id self.tc_queue = tc_queue - self.file_data = bytearray() - self.number_of_packets = 0 - self.number_of_append_packets = 0 - self.number_of_create_packets = 1 - self.number_of_delete_packets = 0 - self.local_filename = "" + + self.__number_of_packets = 0 + self.__number_of_append_packets = 0 + self.__number_of_create_packets = 1 + self.__number_of_delete_packets = 0 + self.__number_of_finish_packets = 1 + + self.__lock_file = True + self.__local_filename = "" + self.__file_data = bytearray() # This will generate a telecommand to delete the old file, if it exists self.delete_old_file = False # This will generater a telecommand to rename the old file, if it exists @@ -73,17 +77,23 @@ class FileTransferHelper: def set_data_from_file(self, local_filename: str): with open(local_filename, 'rb') as file: - self.file_data = file.read() + self.__file_data = file.read() def set_data_raw(self, tc_data: bytearray): - self.file_data = tc_data + self.__file_data = tc_data def set_to_delete_old_file(self): - self.transfer_mode = self.TransferMode.DELETE_OLD + self.__transfer_mode = self.TransferMode.DELETE_OLD def set_to_rename_old_file(self, renamed_name: str): - self.transfer_mode = self.TransferMode.RENAME_OLD - self.renamed_name = renamed_name + self.__transfer_mode = self.TransferMode.RENAME_OLD + self.__renamed_name = renamed_name + + def set_to_lock_file(self, lock_file: bool): + self.__lock_file = lock_file + + def get_number_of_packets_generated(self): + return self.__number_of_packets def set_max_file_data_size(self, max_file_data_size: int): """ @@ -92,32 +102,32 @@ class FileTransferHelper: @param max_file_data_size: @return: """ - self.max_file_data_size = max_file_data_size + self.__max_file_data_size = max_file_data_size def file_size(self): - return len(self.file_data) + return len(self.__file_data) def generate_packets(self, ssc: int): - if self.transfer_mode == self.TransferMode.DELETE_OLD: + if self.__transfer_mode == self.TransferMode.DELETE_OLD: command = generate_rm_file_srv23_2_packet(self.target_filename, self.target_repository, ssc, self.object_id) - self.number_of_delete_packets = 1 + self.__number_of_delete_packets = 1 ssc += 1 self.tc_queue.appendleft(command.pack_command_tuple()) - elif self.transfer_mode == self.TransferMode.RENAME_OLD: + elif self.__transfer_mode == self.TransferMode.RENAME_OLD: # not implemented yet pass - if len(self.file_data) > self.allowed_file_data_size: + if len(self.__file_data) > self.allowed_file_data_size: # Large file, create file with init_data - if self.max_file_data_size > 0: - init_data = self.file_data[0:self.max_file_data_size] + if self.__max_file_data_size > 0: + init_data = self.__file_data[0:self.__max_file_data_size] else: - init_data = self.file_data[0:self.allowed_file_data_size] + init_data = self.__file_data[0:self.allowed_file_data_size] else: # Small file, one packet for file creation sufficient command = generate_create_file_srv23_1_packet( self.target_filename, self.target_repository, ssc, self.max_size_of_app_data, - self.file_data) + self.__file_data) ssc += 1 self.tc_queue.appendleft(command.pack_command_tuple()) return @@ -128,12 +138,12 @@ class FileTransferHelper: init_data) ssc += 1 self.tc_queue.appendleft(command.pack_command_tuple()) - rest_of_data = self.file_data[self.allowed_file_data_size:] + rest_of_data = self.__file_data[self.allowed_file_data_size:] # Generate the rest of the packets to write to large file - if self.max_file_data_size > 0: + if self.__max_file_data_size > 0: self.__generate_append_to_file_packets_automatically( data=rest_of_data, target_repository=self.target_repository, - target_filename=self.target_filename, size_of_data_blocks=self.max_file_data_size, + target_filename=self.target_filename, size_of_data_blocks=self.__max_file_data_size, init_ssc=ssc) else: self.__generate_append_to_file_packets_automatically( @@ -143,11 +153,11 @@ class FileTransferHelper: ssc += 1 last_command = generate_finish_append_to_file_srv23_131_packet( filename=self.target_filename, repository_path=self.target_repository, - ssc=ssc, lock_file=True) + ssc=ssc, lock_file=self.__lock_file) self.tc_queue.appendleft(last_command.pack_command_tuple()) - self.number_of_packets = \ - self.number_of_append_packets + self.number_of_create_packets +\ - self.number_of_delete_packets + 1 + self.__number_of_packets = \ + self.__number_of_append_packets + self.__number_of_create_packets + \ + self.__number_of_delete_packets + 1 def __generate_append_to_file_packets_automatically( self, data: bytearray, target_repository: str, target_filename: str, @@ -200,7 +210,7 @@ class FileTransferHelper: # Last packet will be subservice 131 to finish the append operation header.append(packet_sequence_number >> 8) header.append(0xFF & packet_sequence_number) - self.number_of_append_packets += number_of_packets + self.__number_of_append_packets += number_of_packets header += data[number_of_packets * size_of_data_blocks:len(data)] commands = PusTelecommand(service=23, subservice=130, ssc=init_ssc + packet_sequence_number, app_data=header) @@ -399,7 +409,7 @@ def generate_append_to_file_srv23_130_packet( def generate_finish_append_to_file_srv23_131_packet( - filename: str, repository_path: str, lock_file: bool, ssc: int, + filename: str, repository_path: str, ssc: int, lock_file: bool = False, object_id: bytearray = g.SD_CARD_HANDLER_ID): data_to_pack = bytearray(object_id) data_to_pack += repository_path.encode('utf-8') @@ -409,7 +419,6 @@ def generate_finish_append_to_file_srv23_131_packet( # Add string terminator of filename data_to_pack.append(0) data_to_pack.append(lock_file) - print(len(data_to_pack)) return PusTelecommand(service=23, subservice=131, ssc=ssc, app_data=data_to_pack) diff --git a/utility/obsw_binary_uploader.py b/utility/obsw_binary_uploader.py index 996f29512ee3621f8559c60dac3fd66d6202807c..f70fa1832b5e99964ea55d82e5470fe8ba5e9883 100644 --- a/utility/obsw_binary_uploader.py +++ b/utility/obsw_binary_uploader.py @@ -86,6 +86,12 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte else: bootloader_prompt = False + prompt_lock = input("Lock file with last packet? [y/n]: ") + if prompt_lock in ['n', "no", 0]: + prompt_lock = False + else: + prompt_lock = True + if bootloader_prompt: file_name = "bl.bin" else: @@ -117,7 +123,6 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte else: LOGGER.info("Specified path invalid..") - print("Generating folder structure..") tc_queue = deque() # Delete existing binary file first, otherwise data might be appended to otherwise @@ -132,13 +137,21 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte file_transfer_helper.set_data_from_file(file_path) file_transfer_helper.set_to_delete_old_file() file_transfer_helper.generate_packets(init_ssc) + if prompt_lock: + file_transfer_helper.set_to_lock_file(True) + else: + file_transfer_helper.set_to_lock_file(False) + tm_listener.set_listener_mode(TmListener.ListenerModes.MANUAL) print_string = "BinaryUploader: Detected file size: " + str(file_transfer_helper.file_size()) LOGGER.info(print_string) - total_num_packets = file_transfer_helper.number_of_packets + total_num_packets = file_transfer_helper.get_number_of_packets_generated() print_string = "BinaryUploader: " + str(total_num_packets) + \ - " packets generated with " + \ - str(file_transfer_helper.number_of_append_packets) + " append packets." + " packets generated." + if prompt_lock: + print_string += " File will be locked." + else: + print_string += " File will not be locked." LOGGER.info(print_string) interval = 0.6 last_sent = time.time()