From 890c5a6f10278f21db381a2d2b76ea98d2635bce Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" <robin.mueller.m@gmail.com> Date: Wed, 7 Oct 2020 21:54:07 +0200 Subject: [PATCH] added srv23 handling --- tc/obsw_tc_service23_sdcard.py | 33 ++++++++++++++++++++++++++------- tm/obsw_pus_tm_factory_hook.py | 3 +++ tm/obsw_tm_service_23.py | 33 +++++++++++++++++++++++++++++++++ utility/obsw_binary_uploader.py | 9 ++++++++- 4 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 tm/obsw_tm_service_23.py diff --git a/tc/obsw_tc_service23_sdcard.py b/tc/obsw_tc_service23_sdcard.py index e1d468a..4881756 100644 --- a/tc/obsw_tc_service23_sdcard.py +++ b/tc/obsw_tc_service23_sdcard.py @@ -137,8 +137,14 @@ class FileTransferHelper: else: self.__generate_append_to_file_packets_automatically( rest_of_data, self.max_size_of_app_data, ssc) - self.number_of_packets = self.number_of_append_packets + self.number_of_create_packets +\ - self.number_of_delete_packets + 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) + 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 def __generate_append_to_file_packets_automatically( self, data: bytearray, size_of_data_blocks: int, init_ssc: int): @@ -187,6 +193,7 @@ class FileTransferHelper: # Remove everything except the header header = header[:len(header) - size_of_data_blocks - 2] packet_sequence_number = packet_sequence_number + 1 + # 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 @@ -370,7 +377,7 @@ def generate_rmdir_srv23_10_packet(directory_name: str, repository_path: str, ss return PusTelecommand(service=23, subservice=10, ssc=ssc, app_data=data_to_pack) -def generate_append_to_file_srv23_128_packet( +def generate_append_to_file_srv23_130_packet( filename: str, repository_path: str, packet_sequence_number: int, ssc: int, file_data: bytearray = bytearray([]), object_id: bytearray = g.SD_CARD_HANDLER_ID) -> PusTelecommand: @@ -384,15 +391,27 @@ def generate_append_to_file_srv23_128_packet( data_to_pack += file_data data_to_pack.append(packet_sequence_number >> 8) data_to_pack.append(packet_sequence_number & 0xff) - return PusTelecommand(service=23, subservice=128, ssc=ssc, app_data=data_to_pack) + 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 , + object_id: bytearray = g.SD_CARD_HANDLER_ID): + data_to_pack = bytearray(object_id) + data_to_pack += bytearray(repository_path, 'utf-8') + # Add string terminator of repository path + data_to_pack.append(0) + data_to_pack += bytearray(filename, 'utf-8') + # Add string terminator of filename + data_to_pack.append(0) + data_to_pack.append(lock_file) + return PusTelecommand(service=23, subservice=131, ssc=ssc, app_data=data_to_pack) -def generate_read_file_srv23_129_packet( +def generate_read_file_srv23_140_packet( repository_path: str, filename: str, ssc: int, object_id: bytearray = g.SD_CARD_HANDLER_ID) -> PusTelecommand: """ This function generates the application data field for a PUS packet with service - 23 and subservie 129. Subservice 129 is a custom service to request the data of a file. + 23 and subservie 140. Subservice 140 is a custom service to request the data of a file. @param repository_path: The path of the target file @param filename: Name of file from which the content shall be read @param ssc: source sequence count @@ -406,7 +425,7 @@ def generate_read_file_srv23_129_packet( data_to_pack += bytearray(filename, 'utf-8') # Add string terminator of filename data_to_pack.append(0) - return PusTelecommand(service=23, subservice=129, ssc=ssc, app_data=data_to_pack) + return PusTelecommand(service=23, subservice=140, ssc=ssc, app_data=data_to_pack) def pack_service23_commands_into(tc_queue: Deque, op_code: int) -> Deque: diff --git a/tm/obsw_pus_tm_factory_hook.py b/tm/obsw_pus_tm_factory_hook.py index 94899de..29ec55a 100644 --- a/tm/obsw_pus_tm_factory_hook.py +++ b/tm/obsw_pus_tm_factory_hook.py @@ -3,6 +3,7 @@ from tmtc_core.utility.obsw_logger import get_logger from tm.obsw_tm_service_1 import Service1TM from tm.obsw_tm_service_3 import Service3TM from tm.obsw_tm_service_5 import Service5TM +from tm.obsw_tm_service_23 import Service23TM import struct LOGGER = get_logger() @@ -24,6 +25,8 @@ def tm_factory_hook(raw_tm_packet: bytearray) -> PusTelemetry: return Service17TM(raw_tm_packet) if service_type == 20: return Service20TM(raw_tm_packet) + if service_type == 23: + return Service23TM(raw_tm_packet) if service_type == 200: return Service200TM(raw_tm_packet) LOGGER.info("The service " + str(service_type) + " is not implemented in Telemetry Factory") diff --git a/tm/obsw_tm_service_23.py b/tm/obsw_tm_service_23.py new file mode 100644 index 0000000..8d162aa --- /dev/null +++ b/tm/obsw_tm_service_23.py @@ -0,0 +1,33 @@ +from tmtc_core.tm.obsw_pus_tm_base import PusTelemetry + + +class Service23TM(PusTelemetry): + MAX_REPOSITORY_LENGTH = 64 + MAX_FILENAME_LENGTH = 12 + + def __init__(self, byte_array): + super().__init__(byte_array) + self.repo_path = "" + self.filename = "" + self.data_start_idx = 0 + if self.get_subservice() == 132: + self.unpack_repo_and_filename() + + def unpack_repo_and_filename(self): + repo_path_found = False + path_idx_start = 0 + for idx in range(self.MAX_FILENAME_LENGTH + self.MAX_REPOSITORY_LENGTH): + if self._tm_data[idx] == "\0": + repo_bytes = self._tm_data[0:idx-1] + self.repo_path = repo_bytes.decode('utf-8') + print(self.repo_path) + path_idx_start = idx + 1 + repo_path_found = True + if repo_path_found: + if self._tm_data[idx] == "\0": + filename_bytes = self._tm_data[path_idx_start:idx-1] + self.filename = filename_bytes.decode('utf-8') + print(self.filename) + self.data_start_idx = idx + 1 + + diff --git a/utility/obsw_binary_uploader.py b/utility/obsw_binary_uploader.py index 7f162df..757f82b 100644 --- a/utility/obsw_binary_uploader.py +++ b/utility/obsw_binary_uploader.py @@ -19,6 +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 LOGGER = get_logger() @@ -167,8 +168,14 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte print_string = "BinaryUploader: All binary packets were sent!" LOGGER.info(print_string) print_string = str(reception_deque.__len__()) + " replies received." + LOGGER.info(print_string) - time.sleep(1.5) + time.sleep(15) + 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) tm_listener.clear_tm_packet_queue() LOGGER.info("Transitioning back to listener mode..") -- GitLab