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