diff --git a/tc/obsw_tc_service23_sdcard.py b/tc/obsw_tc_service23_sdcard.py index 488175637411a944d5a3ab6f39ebc04699f525b1..4d0bfa24a4b1cfdcdb95e798d6f07a3a4472978a 100644 --- a/tc/obsw_tc_service23_sdcard.py +++ b/tc/obsw_tc_service23_sdcard.py @@ -128,15 +128,18 @@ 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:] # Generate the rest of the packets to write to large file if self.max_file_data_size > 0: self.__generate_append_to_file_packets_automatically( - rest_of_data, self.max_file_data_size, ssc) + data=rest_of_data, target_repository=self.target_repository, + 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( - rest_of_data, self.max_size_of_app_data, ssc) + data=rest_of_data, target_repository=self.target_repository, + target_filename=self.target_filename, size_of_data_blocks=self.max_size_of_app_data, + init_ssc=ssc) ssc += 1 last_command = generate_finish_append_to_file_srv23_131_packet( filename=self.target_filename, repository_path=self.target_repository, @@ -147,7 +150,8 @@ class FileTransferHelper: self.number_of_delete_packets + 1 def __generate_append_to_file_packets_automatically( - self, data: bytearray, size_of_data_blocks: int, init_ssc: int): + self, data: bytearray, target_repository: str, target_filename: str, + size_of_data_blocks: int, init_ssc: int): """ This function generates PUS packets which is used to write data in a file. A new file will be created if not already existing. If the file already exists, this might @@ -159,11 +163,11 @@ class FileTransferHelper: @param data: Data which will be split up. @param init_ssc: First SSC, which will be incremented for each packet. """ - header = self.object_id - header += bytearray(self.target_repository, 'utf-8') + header = bytearray(self.object_id) + header += target_repository.encode('utf-8') # Add string terminator of repository path header.append(0) - header += bytearray(self.target_filename, 'utf-8') + header += target_filename.encode('utf-8') # Add string terminator of filename header.append(0) self.__split_large_file(header, size_of_data_blocks, data, init_ssc) @@ -305,10 +309,10 @@ def generate_create_file_srv23_1_packet( LOGGER.error("generate_create_file_srv23_1_packet: Initial data too large!") return None data_to_pack = bytearray(object_id) - data_to_pack += bytearray(repository_path, 'utf-8') + data_to_pack += repository_path.encode('utf-8') # Add string terminator to repository_path data_to_pack.append(0) - data_to_pack += bytearray(filename, 'utf-8') + data_to_pack += filename.encode('utf-8') # Add string terminator to filename data_to_pack.append(0) @@ -328,10 +332,10 @@ def generate_rm_file_srv23_2_packet(filename: str, repository_path: str, :return The TC[23,2] PUS packet """ data_to_pack = bytearray(object_id) - data_to_pack += bytearray(repository_path, 'utf-8') + data_to_pack += repository_path.encode('utf-8') # Add string terminator to repository_path data_to_pack.append(0) - data_to_pack += bytearray(filename, 'utf-8') + data_to_pack += filename.encode('utf-8') # Add string terminator to filename data_to_pack.append(0) return PusTelecommand(service=23, subservice=2, ssc=ssc, app_data=data_to_pack) @@ -348,10 +352,10 @@ def generate_mkdir_srv23_9_packet(directory_name: str, ssc: int, repository_path :return """ data_to_pack = bytearray(object_id) - data_to_pack += bytearray(repository_path, 'utf-8') + data_to_pack += repository_path.encode('utf-8') # Add string terminator to repository path data_to_pack.append(0) - data_to_pack += bytearray(directory_name, 'utf-8') + data_to_pack += directory_name.encode('utf-8') # Add string terminator to directory name data_to_pack.append(0) return PusTelecommand(service=23, subservice=9, ssc=ssc, app_data=data_to_pack) @@ -368,10 +372,10 @@ def generate_rmdir_srv23_10_packet(directory_name: str, repository_path: str, ss @return The application data field of the (23,10) PUS packet """ data_to_pack = bytearray(object_id) - data_to_pack += bytearray(repository_path, 'utf-8') + data_to_pack += repository_path.encode('utf-8') # Add string terminator of repository path data_to_pack.append(0) - data_to_pack += bytearray(directory_name, 'utf-8') + data_to_pack += directory_name.encode('utf-8') # Add string terminator of directory name data_to_pack.append(0) return PusTelecommand(service=23, subservice=10, ssc=ssc, app_data=data_to_pack) @@ -382,10 +386,10 @@ def generate_append_to_file_srv23_130_packet( ssc: int, file_data: bytearray = bytearray([]), object_id: bytearray = g.SD_CARD_HANDLER_ID) -> PusTelecommand: data_to_pack = bytearray(object_id) - data_to_pack += bytearray(repository_path, 'utf-8') + data_to_pack += repository_path.encode('utf-8') # Add string terminator of repository path data_to_pack.append(0) - data_to_pack += bytearray(filename, 'utf-8') + data_to_pack += filename.encode('utf-8') # Add string terminator of filename data_to_pack.append(0) data_to_pack += file_data @@ -393,19 +397,22 @@ def generate_append_to_file_srv23_130_packet( data_to_pack.append(packet_sequence_number & 0xff) return PusTelecommand(service=23, subservice=130, ssc=ssc, app_data=data_to_pack) + def generate_finish_append_to_file_srv23_131_packet( - filename:str, repository_path: str, lock_file: bool, ssc:int , + filename: str, repository_path: str, lock_file: bool, ssc: int, object_id: bytearray = g.SD_CARD_HANDLER_ID): data_to_pack = bytearray(object_id) - data_to_pack += bytearray(repository_path, 'utf-8') + data_to_pack += repository_path.encode('utf-8') # Add string terminator of repository path data_to_pack.append(0) - data_to_pack += bytearray(filename, 'utf-8') + data_to_pack += filename.encode('utf-8') # 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) + def generate_read_file_srv23_140_packet( repository_path: str, filename: str, ssc: int, object_id: bytearray = g.SD_CARD_HANDLER_ID) -> PusTelecommand: @@ -419,15 +426,27 @@ def generate_read_file_srv23_140_packet( @return: The application data field of the (23,129) PUS packet """ data_to_pack = bytearray(object_id) - data_to_pack += bytearray(repository_path, 'utf-8') + data_to_pack += repository_path.encode('utf-8') # Add string terminator of repository paht data_to_pack.append(0) - data_to_pack += bytearray(filename, 'utf-8') + data_to_pack += filename.encode('utf-8') # Add string terminator of filename data_to_pack.append(0) return PusTelecommand(service=23, subservice=140, ssc=ssc, app_data=data_to_pack) +def generate_lock_file_packet(ssc: int, repository_path: str, filename: str, + object_id: bytearray = g.SD_CARD_HANDLER_ID): + data_to_pack = bytearray(object_id) + data_to_pack += repository_path.encode('utf-8') + # Add string terminator of repository paht + data_to_pack.append(0) + data_to_pack += filename.encode('utf-8') + # Add string terminator of filename + data_to_pack.append(0) + return PusTelecommand(service=23, subservice=5, ssc=ssc, app_data=data_to_pack) + + def pack_service23_commands_into(tc_queue: Deque, op_code: int) -> Deque: # sd_handler_id = g.SD_CARD_HANDLER_ID if op_code == 0: @@ -488,12 +507,63 @@ def pack_service23_commands_into(tc_queue: Deque, op_code: int) -> Deque: command = generate_format_sd_card_packet(ssc=2300) tc_queue.appendleft(command.pack_command_tuple()) elif op_code == "C0A": + tc_queue.append(("print", "Generating generic folder structure on AT91")) generate_generic_folder_structure(tc_queue, init_ssc=0, iobc=False) elif op_code == "C0I": + tc_queue.append(("print", "Generating generic folder structure on iOBC")) generate_generic_folder_structure(tc_queue, init_ssc=0, iobc=True) + elif op_code == "5" or op_code == 5: + + LOGGER.info("Press h in the following input requests to send a command to display the" + "folder sturcture instead") + (repo_path, filename) = prompt_for_repo_filename() + if repo_path == "" and filename == "h": + tc_queue.append(("print", "Printing active file system")) + tc_queue.appendleft(generate_print_sd_card_packet(ssc=0)) + elif repo_path == "" and filename == "c": + return tc_queue + else: + tc_queue.append(("print", "Locking file")) + command = generate_lock_file_packet(0, repository_path=repo_path, filename=filename) + tc_queue.appendleft(command.pack_command_tuple()) + elif op_code == "6" or op_code == 6: + + LOGGER.info("Press h in the following input requests to send a command to display the" + "folder sturcture instead") + (repo_path, filename) = prompt_for_repo_filename() + if repo_path == "" and filename == "h": + tc_queue.append(("print", "Printing active file system")) + tc_queue.appendleft(generate_print_sd_card_packet(ssc=0).pack_command_tuple()) + elif repo_path == "" and filename == "c": + return tc_queue + else: + tc_queue.append(("print", "Unlocking file")) + command = generate_lock_file_packet(0, repository_path=repo_path, filename=filename) + tc_queue.appendleft(command.pack_command_tuple()) return tc_queue def calculate_allowed_file_data_size(max_app_data_size: int, filename: str, repository: str): # Subtract two because of '\0' terminators return max_app_data_size - len(filename) - len(repository) - 2 + + +def prompt_for_repo_filename(): + input_confirmation = False + repo_path = "" + filename = "" + while not input_confirmation: + repo_path = input("Please type in repository path [c to cancel]: ") + if repo_path == "h": + return "", "h" + filename = input("Please type in filename path [c to cancel]: ") + print("Selection for repostiory path: " + str(repo_path)) + print("Selection for filename: " + str(filename)) + if repo_path == "c" or filename == "c": + return "", "c" + if repo_path == "h" or filename == "h": + return "", "h" + input_confirmation = input("Confirm selection [y/n]: ") + if input_confirmation in ['y', "yes", 1]: + input_confirmation = True + return repo_path, filename diff --git a/utility/obsw_binary_uploader.py b/utility/obsw_binary_uploader.py index 757f82b415437ad30b98b556bde059cc5e7754b1..55ea1efc0e613861603f383ee9ed79a5bd322299 100644 --- a/utility/obsw_binary_uploader.py +++ b/utility/obsw_binary_uploader.py @@ -19,7 +19,7 @@ import config.obsw_config as g from tmtc_core.utility.obsw_tmtc_printer import TmTcPrinter, DisplayMode from tmtc_core.utility.obsw_logger import get_logger from tmtc_core.sendreceive.obsw_tm_listener import TmListener -from tmtc_core.tm.obsw_pus_tm_factory import PusTelemetryFactory +from tmtc_core.tm.obsw_pus_tm_factory import PusTelemetryFactory, PusTmQueueT LOGGER = get_logger() @@ -140,11 +140,11 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte " packets generated with " + \ str(file_transfer_helper.number_of_append_packets) + " append packets." LOGGER.info(print_string) - interval = 0.5 + interval = 0.6 last_sent = time.time() total_time = interval * total_num_packets idx = 1 - reception_deque = deque() + reception_deque: PusTmQueueT = deque() while tc_queue: next_send = last_sent + interval (tc_packet, tc_info) = tc_queue.pop() @@ -174,8 +174,8 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte reception_deque.extend(tm_listener.retrieve_tm_packet_queue()) for tm_list in reception_deque: for tm_packet in tm_list: - tm_packet = PusTelemetryFactory.create(tm_packet) - tmtc_printer.print_telemetry(tm_packet) + if tm_packet.get_service() == 23 and tm_packet.get_subservice() == 132: + tmtc_printer.print_telemetry(tm_packet) tm_listener.clear_tm_packet_queue() LOGGER.info("Transitioning back to listener mode..") @@ -202,4 +202,4 @@ def print_progress_bar(iteration, total, prefix='', suffix='', decimals=1, lengt print(f'\r{prefix} |{bar}| {percent}% {suffix}', end=print_end) # Print New Line on Complete if iteration == total: - print() \ No newline at end of file + print()