diff --git a/tc/obsw_tc_service23_sdcard.py b/tc/obsw_tc_service23_sdcard.py index b4e13104bfb2b11b4c5955f50d21ce72691c0dba..ccd07d808c1b253838c2d5e3e4b9322b88c0fdbf 100644 --- a/tc/obsw_tc_service23_sdcard.py +++ b/tc/obsw_tc_service23_sdcard.py @@ -340,7 +340,7 @@ def generate_rm_file_srv23_2_packet(filename: str, repository_path: str, return PusTelecommand(service=23, subservice=2, ssc=ssc, app_data=data_to_pack) -def generate_report_file_attr_srv23_4_packet( +def generate_report_file_attr_srv23_3_packet( filename: str, repository_path: str, ssc: int, object_id=g.SD_CARD_HANDLER_ID) -> PusTelecommand: """ @@ -352,7 +352,7 @@ def generate_report_file_attr_srv23_4_packet( """ data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path, second_path=filename) - return PusTelecommand(service=23, subservice=4, ssc=ssc, app_data=data_to_pack) + return PusTelecommand(service=23, subservice=3, ssc=ssc, app_data=data_to_pack) def generate_mkdir_srv23_9_packet(directory_name: str, ssc: int, repository_path: str = "/", @@ -423,8 +423,8 @@ def generate_read_file_srv23_140_packet( return PusTelecommand(service=23, subservice=140, ssc=ssc, app_data=data_to_pack) -def generate_lock_file_srv23_5_6_packet(ssc: int, lock: bool, repository_path: str, filename: str, - object_id: bytearray = g.SD_CARD_HANDLER_ID): +def generate_lock_file_srv23_5_6_packet(ssc: int, lock: bool, repository_path: str, + filename: str, object_id: bytearray = g.SD_CARD_HANDLER_ID): data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path, second_path=filename) if lock: @@ -437,18 +437,17 @@ def pack_service23_commands_into(tc_queue: TcQueueT, op_code: int) -> Deque: # sd_handler_id = g.SD_CARD_HANDLER_ID if op_code == 0: generate_generic_service_23_test(tc_queue) - elif op_code == "4" or op_code == 4: + elif op_code == "3" or op_code == 3: LOGGER.info("Press h in the following input requests") LOGGER.info("to send a command to display the folder structure instead") (repo_path, filename) = prompt_for_repo_filename() if repo_path == "" and filename == "h": - tc_queue.append(("print", "Requesting file attributes")) 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", "Locking file")) - command = generate_report_file_attr_srv23_4_packet( + tc_queue.append(("print", "Requesting file attributes")) + command = generate_report_file_attr_srv23_3_packet( ssc=0, filename=filename, repository_path=repo_path) tc_queue.appendleft(command.pack_command_tuple()) elif op_code == "5" or op_code == 5: diff --git a/tm/obsw_tm_service_23.py b/tm/obsw_tm_service_23.py index fcc00a6653057e632aba870e38c37faec561bdf4..b4668c332ff5c583f286129cbed23a6e5a5dafd3 100644 --- a/tm/obsw_tm_service_23.py +++ b/tm/obsw_tm_service_23.py @@ -1,4 +1,9 @@ +import struct + from tmtc_core.tm.obsw_pus_tm_base import PusTelemetry +from tmtc_core.utility.obsw_logger import get_logger + +LOGGER = get_logger() class Service23TM(PusTelemetry): @@ -7,11 +12,18 @@ class Service23TM(PusTelemetry): def __init__(self, byte_array): super().__init__(byte_array) + if len(self.get_tm_data()) < 4: + LOGGER.error("Service23TM: Invalid packet format!") + return + self.object_id = struct.unpack('!I', self._tm_data[0:4])[0] self.repo_path = "" self.filename = "" + self.file_size = 0 + self.lock_status = False self.data_start_idx = 0 if self.get_subservice() == 4: self.unpack_repo_and_filename() + self.unpack_file_attributes() elif self.get_subservice() == 132: self.unpack_repo_and_filename() pass @@ -19,19 +31,49 @@ class Service23TM(PusTelemetry): 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] + max_len_to_scan = len(self.get_tm_data()) - 4 + for idx in range(4, max_len_to_scan): + if not repo_path_found and self._tm_data[idx] == 0: + repo_bytes = self._tm_data[4:idx] self.repo_path = repo_bytes.decode('utf-8') - print(self.repo_path) path_idx_start = idx + 1 + 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] + if self._tm_data[idx] == 0: + filename_bytes = self._tm_data[path_idx_start:idx] self.filename = filename_bytes.decode('utf-8') - print(self.filename) self.data_start_idx = idx + 1 break + def unpack_file_attributes(self): + # Size of file length (4) + lock status (1), adapt if more field are added! + print(len(self.get_tm_data()) - self.data_start_idx) + if len(self.get_tm_data()) - self.data_start_idx != 5: + LOGGER.error("Service23TM: Invalid lenght of file attributes data") + return + self.file_size = struct.unpack('!I', self.get_tm_data()[ + self.data_start_idx: self.data_start_idx + 4])[0] + self.lock_status = self.get_tm_data()[self.data_start_idx + 4] + + def append_telemetry_content(self, content_list: list): + super().append_telemetry_content(content_list) + content_list.append(hex(self.object_id)) + content_list.append(self.repo_path) + content_list.append(self.filename) + if self.get_subservice() == 4: + content_list.append(self.file_size) + if self.lock_status == 0: + content_list.append("No") + else: + content_list.append("Yes") + + def append_telemetry_column_headers(self, header_list: list): + super().append_telemetry_column_headers(header_list) + header_list.append("Object ID") + header_list.append("Repo Path") + header_list.append("File Name") + if self.get_subservice() == 4: + header_list.append("File Size") + header_list.append("Locked")