From 4be52014567eeb3925c802ff93c6afec6bf9d4fa Mon Sep 17 00:00:00 2001
From: "Robin.Mueller" <robin.mueller.m@gmail.com>
Date: Mon, 12 Oct 2020 01:31:25 +0200
Subject: [PATCH] tm srv23 handling

---
 tc/obsw_tc_service23_sdcard.py | 15 +++++----
 tm/obsw_tm_service_23.py       | 56 +++++++++++++++++++++++++++++-----
 2 files changed, 56 insertions(+), 15 deletions(-)

diff --git a/tc/obsw_tc_service23_sdcard.py b/tc/obsw_tc_service23_sdcard.py
index b4e1310..ccd07d8 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 fcc00a6..b4668c3 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")
 
-- 
GitLab