From b711c981ac155952a242811d4018a318758ffe33 Mon Sep 17 00:00:00 2001
From: "Robin.Mueller" <robin.mueller.m@gmail.com>
Date: Sat, 18 Jan 2020 18:04:55 +0100
Subject: [PATCH] Definitions report tested

---
 tc/OBSW_TcService3.py       |  17 ++++--
 tm/OBSW_TmService3.py       | 102 ++++++++++++++++++++----------------
 utility/OBSW_TmTcPrinter.py |  27 +++++++---
 3 files changed, 88 insertions(+), 58 deletions(-)

diff --git a/tc/OBSW_TcService3.py b/tc/OBSW_TcService3.py
index b6144bb..861c116 100644
--- a/tc/OBSW_TcService3.py
+++ b/tc/OBSW_TcService3.py
@@ -71,10 +71,19 @@ def packService3TestInto(tcQueue):
     command = PUSTelecommand(service=3, subservice=6, SSC=3080, data=sidGps)
     tcQueue.put(command.packCommandTuple())
 
-    # report custom hk definition
-    # report custom diag definition
-    # report gps0 definition
-
+    # report custom hk definition, 10 hk, 12 diagnostics
+    # report custom HK definition
+    tcQueue.put(("print", "\r\nTesting Service 3: Reporting pre-defined HK definition"))
+    command = PUSTelecommand(service=3, subservice=9, SSC=3000, data=sid1)
+    tcQueue.put(command.packCommandTuple())
+    # report custom Diag definition
+    tcQueue.put(("print", "\r\nTesting Service 3: Reporting diag definition"))
+    command = PUSTelecommand(service=3, subservice=11, SSC=3000, data=sid2)
+    tcQueue.put(command.packCommandTuple())
+    # report gps definition
+    tcQueue.put(("print", "\r\nTesting Service 3: Reporting diag definition"))
+    command = PUSTelecommand(service=3, subservice=9, SSC=3000, data=sidGps)
+    tcQueue.put(command.packCommandTuple())
     # generate one custom hk definition
     # generate one custom diag definition
     # generate one gps 0 definition
diff --git a/tm/OBSW_TmService3.py b/tm/OBSW_TmService3.py
index 762a496..9a14653 100644
--- a/tm/OBSW_TmService3.py
+++ b/tm/OBSW_TmService3.py
@@ -16,55 +16,14 @@ class Service3TM(PUSTelemetry):
         self.sid = struct.unpack('>I', self.byteArrayData[0:4])[0]
         self.hkHeader = []
         self.hkContent = []
+        self.hkDefinitionHeader = []
+        self.hkDefinition = []
         self.printPacketInfo("Housekeeping Packet")
         self.paramLength = 0
+        if self.getSubservice() == 10 or self.getSubservice() == 12:
+            self.handleFillingDefinitionArrays()
         if self.getSubservice() == 25 or self.getSubservice() == 26:
-            self.paramLength = len(self.byteArrayData) - 4
-        # TODO: This can be automated by using the MIB parser pool names and pool datatypes
-        if self.sid == 0x1f00 or self.sid == 0x2f00:
-            self.hkHeader = ["Fix Mode", "SV in Fix", "GNSS Week", "Time of Week", "Latitude", "Longitude",
-                             "Mean Sea Altitude", "Position X", "Position Y", "Position Z",
-                             "Velocity X", "Velocity Y", "Velocity Z"]
-            self.fixMode = self.byteArrayData[4]
-            self.svInFix = self.byteArrayData[5]
-            self.gnssWeek = struct.unpack('>H', self.byteArrayData[5:7])[0]
-            self.timeOfWeek = struct.unpack('>I', self.byteArrayData[7:11])[0]
-            self.latitude = struct.unpack('>I', self.byteArrayData[11:15])[0]
-            self.longitude = struct.unpack('>I', self.byteArrayData[15:19])[0]
-            self.msa = struct.unpack('>I', self.byteArrayData[19:23])[0]
-            self.positionX = struct.unpack('>d', self.byteArrayData[23:31])[0]
-            self.positionY = struct.unpack('>d', self.byteArrayData[31:39])[0]
-            self.positionZ = struct.unpack('>d', self.byteArrayData[39:47])[0]
-            self.vx = struct.unpack('>d', self.byteArrayData[47:55])[0]
-            self.vy = struct.unpack('>d', self.byteArrayData[55:63])[0]
-            self.vz = struct.unpack('>d', self.byteArrayData[63:71])[0]
-            self.hkContent.append(self.fixMode)
-            self.hkContent.append(self.svInFix)
-            self.hkContent.append(self.gnssWeek)
-            self.hkContent.append(self.timeOfWeek)
-            self.hkContent.append(self.latitude)
-            self.hkContent.append(self.longitude)
-            self.hkContent.append(self.msa)
-            self.hkContent.append(self.positionX)
-            self.hkContent.append(self.positionY)
-            self.hkContent.append(self.positionZ)
-            self.hkContent.append(self.vx)
-            self.hkContent.append(self.vy)
-            self.hkContent.append(self.vz)
-        elif self.sid == 0x4300 or self.sid == 0x4400:
-            self.hkHeader = ["Bool", "UINT8", "UINT16", "UINT32", "FLOAT1", "FLOAT2"]
-            self.testBool = self.byteArrayData[4]
-            self.hkContent.append(self.testBool)
-            self.testUint8 = self.byteArrayData[5]
-            self.hkContent.append(self.testUint8)
-            self.testUint16 = (self.byteArrayData[6] << 8) | self.byteArrayData[7]
-            self.hkContent.append(self.testUint16)
-            self.testUint32 = struct.unpack('>I', self.byteArrayData[8:12])[0]
-            self.hkContent.append(self.testUint32)
-            self.floatVector1 = struct.unpack('>f', self.byteArrayData[12:16])[0]
-            self.hkContent.append(self.floatVector1)
-            self.floatVector2 = struct.unpack('>f', self.byteArrayData[16:20])[0]
-            self.hkContent.append(self.floatVector2)
+            self.handleFillingHkArrays()
 
     def printTelemetryHeader(self, array):
         super().printTelemetryHeader(array)
@@ -77,3 +36,54 @@ class Service3TM(PUSTelemetry):
         array.append("SID")
         array.append("HK Data Size")
         return
+
+    def handleFillingDefinitionArrays(self):
+        self.hkHeader = ["SID", "Report Status", "Collection Interval", "Number Of IDs"]
+        reportingEnabled = self.byteArrayData[4]
+        collectionInterval = struct.unpack('>f', self.byteArrayData[5:9])[0]
+        numberOfParams = self.byteArrayData[9]
+        parameters = []
+        index2 = 1
+        for index in range(10, (numberOfParams * 4) + 10, 4):
+            parameter = struct.unpack('>I', self.byteArrayData[index:index + 4])[0]
+            self.hkHeader.append("Pool ID " + str(index2))
+            parameters.append(str(hex(parameter)))
+            index2 = index2 + 1
+        if reportingEnabled == 1:
+            statusString = "On"
+        else:
+            statusString = "Off"
+        self.hkContent = [hex(self.sid), statusString, collectionInterval, numberOfParams]
+        self.hkContent.extend(parameters)
+
+    def handleFillingHkArrays(self):
+        self.paramLength = len(self.byteArrayData) - 4
+        # TODO: This can be automated by using the MIB parser pool names and pool datatypes
+        if self.sid == 0x1f00 or self.sid == 0x2f00:
+            self.hkHeader = ["Fix Mode", "SV in Fix", "GNSS Week", "Time of Week", "Latitude", "Longitude",
+                             "Mean Sea Altitude", "Position X", "Position Y", "Position Z",
+                             "Velocity X", "Velocity Y", "Velocity Z"]
+            fixMode = self.byteArrayData[4]
+            svInFix = self.byteArrayData[5]
+            gnssWeek = struct.unpack('>H', self.byteArrayData[5:7])[0]
+            timeOfWeek = struct.unpack('>I', self.byteArrayData[7:11])[0]
+            latitude = struct.unpack('>I', self.byteArrayData[11:15])[0]
+            longitude = struct.unpack('>I', self.byteArrayData[15:19])[0]
+            msa = struct.unpack('>I', self.byteArrayData[19:23])[0]
+            positionX = struct.unpack('>d', self.byteArrayData[23:31])[0]
+            positionY = struct.unpack('>d', self.byteArrayData[31:39])[0]
+            positionZ = struct.unpack('>d', self.byteArrayData[39:47])[0]
+            vx = struct.unpack('>d', self.byteArrayData[47:55])[0]
+            vy = struct.unpack('>d', self.byteArrayData[55:63])[0]
+            vz = struct.unpack('>d', self.byteArrayData[63:71])[0]
+            self.hkContent = [fixMode, svInFix, gnssWeek, timeOfWeek, latitude, longitude, msa, positionX, positionY,
+                              positionZ, vx, vy, vz]
+        elif self.sid == 0x4300 or self.sid == 0x4400:
+            self.hkHeader = ["Bool", "UINT8", "UINT16", "UINT32", "FLOAT1", "FLOAT2"]
+            testBool = self.byteArrayData[4]
+            testUint8 = self.byteArrayData[5]
+            testUint16 = (self.byteArrayData[6] << 8) | self.byteArrayData[7]
+            testUint32 = struct.unpack('>I', self.byteArrayData[8:12])[0]
+            floatVector1 = struct.unpack('>f', self.byteArrayData[12:16])[0]
+            floatVector2 = struct.unpack('>f', self.byteArrayData[16:20])[0]
+            self.hkContent = [testBool, testUint8, testUint16, testUint32, floatVector1, floatVector2]
diff --git a/utility/OBSW_TmTcPrinter.py b/utility/OBSW_TmTcPrinter.py
index c795d4a..3d3f308 100644
--- a/utility/OBSW_TmTcPrinter.py
+++ b/utility/OBSW_TmTcPrinter.py
@@ -30,6 +30,8 @@ class TmtcPrinter:
         self.handleDataReplyPacket(packet)
         if packet.getService() == 3 and (packet.getSubservice() == 25 or packet.getSubservice() == 26):
             self.handleHkPrint(packet)
+        if packet.getService() == 3 and (packet.getSubservice() == 10 or packet.getSubservice() == 12):
+            self.handleHkDefinitionPrint(packet)
         if g.printRawTmData:
             self.printBuffer = "TM Data:" + "\n" + self.returnDataString(packet.data)
             print(self.printBuffer)
@@ -66,15 +68,24 @@ class TmtcPrinter:
         if g.printHkData:
             self.printBuffer = "HK Data from SID "
             self.printBuffer = self.printBuffer + str(hex(packet.sid)) + " :"
-            print(self.printBuffer)
-            self.addPrintBufferToFileBuffer()
-            self.printBuffer = str(packet.hkHeader)
-            print(self.printBuffer)
-            self.addPrintBufferToFileBuffer()
-            self.printBuffer = str(packet.hkContent)
-            print(self.printBuffer)
-            self.addPrintBufferToFileBuffer()
+            self.printHk(packet)
 
+    def handleHkDefinitionPrint(self, packet):
+        if g.printHkData:
+            self.printBuffer = "HK Definition from SID "
+            self.printBuffer = self.printBuffer + str(hex(packet.sid)) + " :"
+            self.printHk(packet)
+            
+    def printHk(self, packet):
+        print(self.printBuffer)
+        self.addPrintBufferToFileBuffer()
+        self.printBuffer = str(packet.hkHeader)
+        print(self.printBuffer)
+        self.addPrintBufferToFileBuffer()
+        self.printBuffer = str(packet.hkContent)
+        print(self.printBuffer)
+        self.addPrintBufferToFileBuffer()
+        
     def handleWiretappingPacket(self, packet):
         if packet.getService() == 2 and (packet.getSubservice() == 131 or packet.getSubservice() == 130):
             self.printBuffer = "Wiretapping Packet or Raw Reply from TM [" + \
-- 
GitLab