From c52ce5a304a8b059dfc1adc870b5d626961befe3 Mon Sep 17 00:00:00 2001
From: "Robin.Mueller" <robin.mueller.m@gmail.com>
Date: Mon, 12 Oct 2020 00:53:42 +0200
Subject: [PATCH] improved srv23 tc file

---
 tc/obsw_tc_service23_sdcard.py | 264 +++++++++++++++++----------------
 tm/obsw_tm_service_23.py       |   7 +-
 2 files changed, 138 insertions(+), 133 deletions(-)

diff --git a/tc/obsw_tc_service23_sdcard.py b/tc/obsw_tc_service23_sdcard.py
index 1bd3a8b..7fdfc97 100644
--- a/tc/obsw_tc_service23_sdcard.py
+++ b/tc/obsw_tc_service23_sdcard.py
@@ -318,14 +318,8 @@ def generate_create_file_srv23_1_packet(
             max_size_of_app_data, filename, repository_path):
         LOGGER.error("generate_create_file_srv23_1_packet: Initial data too large!")
         return None
-    data_to_pack = bytearray(object_id)
-    data_to_pack += repository_path.encode('utf-8')
-    # Add string terminator to repository_path
-    data_to_pack.append(0)
-    data_to_pack += filename.encode('utf-8')
-    # Add string terminator to filename
-    data_to_pack.append(0)
-
+    data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path,
+                                                    second_path=filename)
     data_to_pack += initial_data
     return PusTelecommand(service=23, subservice=1, ssc=ssc, app_data=data_to_pack)
 
@@ -339,18 +333,28 @@ def generate_rm_file_srv23_2_packet(filename: str, repository_path: str,
     @param repository_path: The path where the directory shall be created
     @param ssc: source sequence count
     @param object_id: The object ID of the memory handler which manages the file system
-    :return The TC[23,2] PUS packet
+    @return The telecommand.
     """
-    data_to_pack = bytearray(object_id)
-    data_to_pack += repository_path.encode('utf-8')
-    # Add string terminator to repository_path
-    data_to_pack.append(0)
-    data_to_pack += filename.encode('utf-8')
-    # Add string terminator to filename
-    data_to_pack.append(0)
+    data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path,
+                                                    second_path=filename)
     return PusTelecommand(service=23, subservice=2, ssc=ssc, app_data=data_to_pack)
 
 
+def generate_report_file_attr_srv23_4_packet(
+        filename: str, repository_path: str, ssc: int,
+        object_id=g.SD_CARD_HANDLER_ID) -> PusTelecommand:
+    """
+    @param filename: The name of the file to delete
+    @param repository_path: The path where the directory shall be created
+    @param ssc: source sequence count
+    @param object_id: The object ID of the memory handler which manages the file system
+    @return The telecommand.
+    """
+    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)
+
+
 def generate_mkdir_srv23_9_packet(directory_name: str, ssc: int, repository_path: str = "/",
                                   object_id: bytearray = g.SD_CARD_HANDLER_ID) -> PusTelecommand:
     """
@@ -359,15 +363,10 @@ def generate_mkdir_srv23_9_packet(directory_name: str, ssc: int, repository_path
     @param repository_path: The name of the directory to create
     @param ssc: source sequence count
     @param object_id: The object ID of the memory handler which manages the file system
-    :return
+    @return The telecommand.
     """
-    data_to_pack = bytearray(object_id)
-    data_to_pack += repository_path.encode('utf-8')
-    # Add string terminator to repository path
-    data_to_pack.append(0)
-    data_to_pack += directory_name.encode('utf-8')
-    # Add string terminator to directory name
-    data_to_pack.append(0)
+    data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path,
+                                                    second_path=directory_name)
     return PusTelecommand(service=23, subservice=9, ssc=ssc, app_data=data_to_pack)
 
 
@@ -379,15 +378,10 @@ def generate_rmdir_srv23_10_packet(directory_name: str, repository_path: str, ss
     @param repository_path: Path to directory dirname
     @param ssc: source sequence count
     @param object_id: object ID of the memory handler (e.g. SD Card Handler)
-    @return The application data field of the (23,10) PUS packet
+    @return The telecommand.
     """
-    data_to_pack = bytearray(object_id)
-    data_to_pack += repository_path.encode('utf-8')
-    # Add string terminator of repository path
-    data_to_pack.append(0)
-    data_to_pack += directory_name.encode('utf-8')
-    # Add string terminator of directory name
-    data_to_pack.append(0)
+    data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path,
+                                                    second_path=directory_name)
     return PusTelecommand(service=23, subservice=10, ssc=ssc, app_data=data_to_pack)
 
 
@@ -395,13 +389,8 @@ 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:
-    data_to_pack = bytearray(object_id)
-    data_to_pack += repository_path.encode('utf-8')
-    # Add string terminator of repository path
-    data_to_pack.append(0)
-    data_to_pack += filename.encode('utf-8')
-    # Add string terminator of filename
-    data_to_pack.append(0)
+    data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path,
+                                                    second_path=filename)
     data_to_pack += file_data
     data_to_pack.append(packet_sequence_number >> 8)
     data_to_pack.append(packet_sequence_number & 0xff)
@@ -411,13 +400,8 @@ def generate_append_to_file_srv23_130_packet(
 def generate_finish_append_to_file_srv23_131_packet(
         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')
-    # Add string terminator of repository path
-    data_to_pack.append(0)
-    data_to_pack += filename.encode('utf-8')
-    # Add string terminator of filename
-    data_to_pack.append(0)
+    data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path,
+                                                    second_path=filename)
     data_to_pack.append(lock_file)
     return PusTelecommand(service=23, subservice=131, ssc=ssc, app_data=data_to_pack)
 
@@ -434,115 +418,56 @@ def generate_read_file_srv23_140_packet(
     @param object_id: object ID of the memory handler (e.g. SD Card Handler)
     @return: The application data field of the (23,129) PUS packet
     """
-    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)
+    data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path,
+                                                    second_path=filename)
     return PusTelecommand(service=23, subservice=140, ssc=ssc, app_data=data_to_pack)
 
 
-def generate_lock_file_packet(ssc: int, lock: bool, repository_path: str, filename: str,
+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 = 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)
+    data_to_pack = pack_generic_file_command_header(object_id=object_id, first_path=repository_path,
+                                                    second_path=filename)
     if lock:
         return PusTelecommand(service=23, subservice=5, ssc=ssc, app_data=data_to_pack)
     else:
         return PusTelecommand(service=23, subservice=6, ssc=ssc, app_data=data_to_pack)
 
 
-def pack_service23_commands_into(tc_queue: Deque, op_code: int) -> Deque:
+def pack_service23_commands_into(tc_queue: TcQueueT, op_code: int) -> Deque:
     # sd_handler_id = g.SD_CARD_HANDLER_ID
     if op_code == 0:
-        tc_queue.appendleft(("print", "Testing Service 23"))
-
-        tc_queue.append(("print", "Create directory 'test'"))
-        command = generate_mkdir_srv23_9_packet(directory_name="test", repository_path="/", ssc=2300)
-        tc_queue.appendleft(command.pack_command_tuple())
-        tc_queue.append(("print", "Create subdirectory 'subdir' in 'test'"))
-        command = generate_mkdir_srv23_9_packet(repository_path="test", ssc=2301,
-                                                directory_name="subdir")
-        tc_queue.appendleft(command.pack_command_tuple())
-
-        tc_queue.appendleft(("print", "Create test.bin"))
-        command = generate_create_file_srv23_1_packet(
-             filename="test.bin", repository_path="test/subdir", ssc=2302,
-             initial_data=bytearray([0x01, 0x00, 0x01, 0x00]),
-             max_size_of_app_data=1024)
-        tc_queue.appendleft(command.pack_command_tuple())
-
-        tc_queue.appendleft(("print", "Printing file structure."))
-        command = generate_print_sd_card_packet(ssc=2300)
-        tc_queue.appendleft(command.pack_command_tuple())
-
-        tc_queue.appendleft(("print", "Clearing SD card"))
-        command = generate_clear_sd_card_packet(ssc=2301)
-        tc_queue.appendleft(command.pack_command_tuple())
-
-        tc_queue.appendleft(("print", "Printing file structure"))
-        command = generate_print_sd_card_packet(ssc=2302)
-        tc_queue.appendleft(command.pack_command_tuple())
-
-        # tc_queue.appendleft(("print", "Read data of test.bin"))
-        # command = generate_read_file_srv23_129_packet("test/subdir", "test.bin", ssc=2303)
-        # tc_queue.appendleft(command.pack_command_tuple())
-        tc_queue.appendleft(("print", "Delete 'test.bin'"))
-        command = generate_rm_file_srv23_2_packet(
-            filename="test.bin", repository_path="test/subdir", ssc=2304)
-        tc_queue.appendleft(command.pack_command_tuple())
-        tc_queue.appendleft(("print", "Delete 'subdir' directory"))
-        command = generate_rmdir_srv23_10_packet(directory_name="subdir", repository_path="test",
-                                                 ssc=2305)
-        tc_queue.appendleft(command.pack_command_tuple())
-        tc_queue.appendleft(("print", "Delete 'test' directory"))
-        command = generate_rmdir_srv23_10_packet(directory_name="test", repository_path="/",
-                                                 ssc=2306)
-        tc_queue.appendleft(command.pack_command_tuple())
-    elif op_code == "A2":
-        tc_queue.append(("print", "Printing active file system"))
-        command = generate_print_sd_card_packet(ssc=2300)
-        tc_queue.appendleft(command.pack_command_tuple())
-    elif op_code == "A20":
-        tc_queue.append(("print", "Clearing active file system"))
-        command = generate_clear_sd_card_packet(ssc=2300)
-        tc_queue.appendleft(command.pack_command_tuple())
-    elif op_code == "A21":
-        tc_queue.append(("print", "Formatting active file system"))
-        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)
+        generate_generic_service_23_test(tc_queue)
+    elif op_code == "4" or op_code == 4:
+        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_lock_file_srv23_5_6_packet(0, repository_path=repo_path,
+                                                          filename=filename, lock=True)
+            tc_queue.appendleft(command.pack_command_tuple())
     elif op_code == "5" or op_code == 5:
-
         LOGGER.info("Press h in the following input requests")
-        LOGGER.info("to send a command to display the folder sturcture instead")
+        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", "Printing active file system"))
-            tc_queue.appendleft(generate_print_sd_card_packet(ssc=0))
+            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_lock_file_packet(0, repository_path=repo_path, filename=filename,
-                                                lock=True)
+            command = generate_lock_file_srv23_5_6_packet(0, repository_path=repo_path,
+                                                          filename=filename, lock=True)
             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")
+                    "folder structure instead")
         (repo_path, filename) = prompt_for_repo_filename()
         if repo_path == "" and filename == "h":
             tc_queue.append(("print", "Printing active file system"))
@@ -554,9 +479,75 @@ def pack_service23_commands_into(tc_queue: Deque, op_code: int) -> Deque:
             command = generate_lock_file_packet(0, repository_path=repo_path, filename=filename,
                                                 lock=False)
             tc_queue.appendleft(command.pack_command_tuple())
+    elif op_code == "A2":
+        tc_queue.append(("print", "Printing active file system"))
+        command = generate_print_sd_card_packet(ssc=2300)
+        tc_queue.appendleft(command.pack_command_tuple())
+    elif op_code == "A20":
+        tc_queue.append(("print", "Clearing active file system"))
+        command = generate_clear_sd_card_packet(ssc=2300)
+        tc_queue.appendleft(command.pack_command_tuple())
+    elif op_code == "A21":
+        tc_queue.append(("print", "Formatting active file system"))
+        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)
+
     return tc_queue
 
 
+def generate_generic_service_23_test(tc_queue: TcQueueT):
+    tc_queue.appendleft(("print", "Testing Service 23"))
+
+    tc_queue.append(("print", "Create directory 'test'"))
+    command = generate_mkdir_srv23_9_packet(directory_name="test", repository_path="/", ssc=2300)
+    tc_queue.appendleft(command.pack_command_tuple())
+    tc_queue.append(("print", "Create subdirectory 'subdir' in 'test'"))
+    command = generate_mkdir_srv23_9_packet(repository_path="test", ssc=2301,
+                                            directory_name="subdir")
+    tc_queue.appendleft(command.pack_command_tuple())
+
+    tc_queue.appendleft(("print", "Create test.bin"))
+    command = generate_create_file_srv23_1_packet(
+        filename="test.bin", repository_path="test/subdir", ssc=2302,
+        initial_data=bytearray([0x01, 0x00, 0x01, 0x00]),
+        max_size_of_app_data=1024)
+    tc_queue.appendleft(command.pack_command_tuple())
+
+    tc_queue.appendleft(("print", "Printing file structure."))
+    command = generate_print_sd_card_packet(ssc=2300)
+    tc_queue.appendleft(command.pack_command_tuple())
+
+    tc_queue.appendleft(("print", "Clearing SD card"))
+    command = generate_clear_sd_card_packet(ssc=2301)
+    tc_queue.appendleft(command.pack_command_tuple())
+
+    tc_queue.appendleft(("print", "Printing file structure"))
+    command = generate_print_sd_card_packet(ssc=2302)
+    tc_queue.appendleft(command.pack_command_tuple())
+
+    # tc_queue.appendleft(("print", "Read data of test.bin"))
+    # command = generate_read_file_srv23_129_packet("test/subdir", "test.bin", ssc=2303)
+    # tc_queue.appendleft(command.pack_command_tuple())
+    tc_queue.appendleft(("print", "Delete 'test.bin'"))
+    command = generate_rm_file_srv23_2_packet(
+        filename="test.bin", repository_path="test/subdir", ssc=2304)
+    tc_queue.appendleft(command.pack_command_tuple())
+    tc_queue.appendleft(("print", "Delete 'subdir' directory"))
+    command = generate_rmdir_srv23_10_packet(directory_name="subdir", repository_path="test",
+                                             ssc=2305)
+    tc_queue.appendleft(command.pack_command_tuple())
+    tc_queue.appendleft(("print", "Delete 'test' directory"))
+    command = generate_rmdir_srv23_10_packet(directory_name="test", repository_path="/",
+                                             ssc=2306)
+    tc_queue.appendleft(command.pack_command_tuple())
+
+
 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
@@ -581,3 +572,14 @@ def prompt_for_repo_filename():
         if input_confirmation in ['y', "yes", 1]:
             input_confirmation = True
     return repo_path, filename
+
+
+def pack_generic_file_command_header(object_id: bytearray, first_path: str, second_path: str):
+    data_to_pack = bytearray(object_id)
+    data_to_pack += first_path.encode('utf-8')
+    # Add string terminator of repository paht
+    data_to_pack.append(0)
+    data_to_pack += second_path.encode('utf-8')
+    # Add string terminator of filename
+    data_to_pack.append(0)
+    return data_to_pack
diff --git a/tm/obsw_tm_service_23.py b/tm/obsw_tm_service_23.py
index 65cf912..fcc00a6 100644
--- a/tm/obsw_tm_service_23.py
+++ b/tm/obsw_tm_service_23.py
@@ -10,8 +10,10 @@ class Service23TM(PusTelemetry):
         self.repo_path = ""
         self.filename = ""
         self.data_start_idx = 0
-        if self.get_subservice() == 132:
-            # self.unpack_repo_and_filename()
+        if self.get_subservice() == 4:
+            self.unpack_repo_and_filename()
+        elif self.get_subservice() == 132:
+            self.unpack_repo_and_filename()
             pass
 
     def unpack_repo_and_filename(self):
@@ -30,5 +32,6 @@ class Service23TM(PusTelemetry):
                     self.filename = filename_bytes.decode('utf-8')
                     print(self.filename)
                     self.data_start_idx = idx + 1
+                    break
 
 
-- 
GitLab