From b8052826e58eabd5c95b89f02e34c4db3d336ac7 Mon Sep 17 00:00:00 2001
From: "Robin.Mueller" <robin.mueller.m@gmail.com>
Date: Mon, 30 Dec 2019 20:21:22 +0100
Subject: [PATCH] tmtc refactoring, service 3 tm and tc handling continued

---
 comIF/OBSW_Ethernet_ComIF.py |  2 +-
 tc/OBSW_TcPacker.py          | 27 +---------
 tc/OBSW_TcService3.py        | 34 +++++++++++++
 tm/OBSW_PusTm.py             | 34 +++++++++++++
 tm/OBSW_TmPacket.py          | 96 ++++++------------------------------
 tm/OBSW_TmService3.py        | 64 ++++++++++++++++++++++++
 utility/OBSW_TmTcPrinter.py  |  2 +-
 7 files changed, 151 insertions(+), 108 deletions(-)
 create mode 100644 tc/OBSW_TcService3.py
 create mode 100644 tm/OBSW_PusTm.py
 create mode 100644 tm/OBSW_TmService3.py

diff --git a/comIF/OBSW_Ethernet_ComIF.py b/comIF/OBSW_Ethernet_ComIF.py
index b921e96..1534702 100644
--- a/comIF/OBSW_Ethernet_ComIF.py
+++ b/comIF/OBSW_Ethernet_ComIF.py
@@ -29,8 +29,8 @@ class EthernetComIF(CommunicationInterface):
 
     def performListenerMode(self):
         pollTimeout = 10
+        print("Listening for packages ...")
         while True:
-            print("Listening for packages ...")
             self.pollInterface(pollTimeout)
 
     def dataAvailable(self, timeout):
diff --git a/tc/OBSW_TcPacker.py b/tc/OBSW_TcPacker.py
index dc99d8d..34ca200 100644
--- a/tc/OBSW_TcPacker.py
+++ b/tc/OBSW_TcPacker.py
@@ -15,6 +15,7 @@ import os
 
 from tc.OBSW_TcPacket import *
 from tc.OBSW_TcService2 import packService2TestInto
+from tc.OBSW_TcService3 import packService3TestInto
 from tc.OBSW_TcService8 import packService8TestInto
 from tc.OBSW_TcService200 import packModeData, packService200TestInto
 
@@ -54,32 +55,6 @@ def serviceTestSelect(service, serviceQueue):
         exit()
 
 
-def packService3TestInto(tcQueue):
-    tcQueue.put(("print", "Testing Service 3"))
-    # adding custom defintion to hk using test pool variables
-    # adding custom definition to diagnostics using test pool variables
-    # enable custom hk definition
-    # enable custom diag definition
-    # disable custom hk definition
-    # disable custom diag definition
-    # report custom hk definition
-    # report custom diag definition
-    # generate one custom hk definition
-    # generate one custom diag definition
-    # modify custom hk definition interval
-    # modify custom diag definition interval
-    # report custom hk definition
-    # report custom diag definition
-    # append parameter to custom hk definiton
-    # append parameter to custom diag definition
-    # report custom hk definition
-    # report custom diag definition
-    # delete custom hk definition
-    # delete custom diag definition
-    # do some basic testing on predefined structs too
-    # e.g. add one variable, change interval, report them....
-
-
 def packService5TestInto(tcQueue):
     tcQueue.put(("print", "Testing Service 5"))
     # disable events
diff --git a/tc/OBSW_TcService3.py b/tc/OBSW_TcService3.py
new file mode 100644
index 0000000..d55d7f9
--- /dev/null
+++ b/tc/OBSW_TcService3.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+"""
+Program: OBSW_UnitTest.py
+Date: 01.11.2019
+Description: PUS Custom Service 8: Device Access, Native low-level commanding
+
+@author: R. Mueller
+"""
+
+
+def packService3TestInto(tcQueue):
+    tcQueue.put(("print", "Testing Service 3"))
+    # adding custom defintion to hk using test pool variables
+    # adding custom definition to diagnostics using test pool variables
+    # enable custom hk definition
+    # enable custom diag definition
+    # disable custom hk definition
+    # disable custom diag definition
+    # report custom hk definition
+    # report custom diag definition
+    # generate one custom hk definition
+    # generate one custom diag definition
+    # modify custom hk definition interval
+    # modify custom diag definition interval
+    # report custom hk definition
+    # report custom diag definition
+    # append parameter to custom hk definiton
+    # append parameter to custom diag definition
+    # report custom hk definition
+    # report custom diag definition
+    # delete custom hk definition
+    # delete custom diag definition
+    # do some basic testing on predefined structs too
+    # e.g. add one variable, change interval, report them....
diff --git a/tm/OBSW_PusTm.py b/tm/OBSW_PusTm.py
new file mode 100644
index 0000000..703fe8e
--- /dev/null
+++ b/tm/OBSW_PusTm.py
@@ -0,0 +1,34 @@
+from tm.OBSW_PusPacket import OBSWPusPacket
+
+
+class PUSTelemetry(OBSWPusPacket):
+    def __init__(self, byteArray):
+        super().__init__(byteArray)
+        self.byteArrayData = self.data
+        self.printInfo = ""
+
+    def unpackTelemetry(self):
+        pass
+
+    def printPacketInfo(self, printInfo):
+        self.printInfo = printInfo
+
+    def appendPacketInfo(self, printInfo):
+        self.printInfo = self.printInfo + printInfo
+
+    def printTelemetryHeader(self, array):
+        super().printPusPacketHeader(array)
+
+    def printTelemetryColumnHeaders(self, array):
+        super().printPusPacketHeaderColumnHeaders(array)
+
+    def packTmInformation(self):
+        tmInformation = {
+            "service": self.getService(),
+            "subservice": self.getSubservice(),
+            "ssc": self.getSSC(),
+            "data": self.byteArrayData,
+            "crc": self.crc,
+            "valid": self.PUSHeader.valid
+        }
+        return tmInformation
diff --git a/tm/OBSW_TmPacket.py b/tm/OBSW_TmPacket.py
index 1c82cb0..98333c4 100644
--- a/tm/OBSW_TmPacket.py
+++ b/tm/OBSW_TmPacket.py
@@ -6,7 +6,8 @@ Description: Deserialize TM byte array into PUS TM Class
 Author: R.Mueller, S. Gaisser
 """
 
-from tm.OBSW_PusPacket import OBSWPusPacket
+from tm.OBSW_PusTm import PUSTelemetry
+from tm.OBSW_TmService3 import Service3TM
 import struct
 # TM Packets use the generic space packet structure provided by OBSWPusPacket to generate individual
 # telemetry packets for all services
@@ -34,32 +35,6 @@ def PUSTelemetryFactory(rawPacket):
         print("The service " + str(servicetype) + " is not implemented in Telemetry Factory")
         return PUSTelemetry(rawPacket)
 
-    
-class PUSTelemetry(OBSWPusPacket):
-    def __init__(self, byteArray):
-        super().__init__(byteArray)
-        self.byteArrayData = self.data
-        
-    def unpackTelemetry(self):
-        pass
-   
-    def printTelemetryHeader(self, array):
-        super().printPusPacketHeader(array)
-
-    def printTelemetryColumnHeaders(self, array):
-        super().printPusPacketHeaderColumnHeaders(array)
-
-    def packTmInformation(self):
-        tmInformation = {
-            "service": self.getService(),
-            "subservice": self.getSubservice(),
-            "ssc": self.getSSC(),
-            "data": self.byteArrayData,
-            "crc": self.crc,
-            "valid": self.PUSHeader.valid
-        }
-        return tmInformation
-
 
 class Service1TM(PUSTelemetry):
     def __init__(self, byteArray):
@@ -69,16 +44,20 @@ class Service1TM(PUSTelemetry):
         # Failure Reports with error code
         self.tcPacketId = self.byteArrayData[0] << 8 | self.byteArrayData[1]
         self.tcSSC = ((self.byteArrayData[2] & 0x3F) << 8) | self.byteArrayData[3]
+        self.printPacketInfo("Success Verification")
         if self.dataFieldHeader.subtype % 2 == 0:
+            self.printPacketInfo("Failure Verficiation")
             self.tcErrorCode = True
             if self.dataFieldHeader.subtype == 6:
                 self.isStep = True
+                self.appendPacketInfo(" : Step Failure")
                 self.stepNumber = struct.unpack('>B', self.byteArrayData[4:5])[0]
                 self.ErrCode = struct.unpack('>H', self.byteArrayData[5:7])[0]
             else:
                 self.ErrCode = struct.unpack('>H', self.byteArrayData[4:6])[0]
         elif self.dataFieldHeader.subtype == 5:
             self.isStep = True
+            self.appendPacketInfo(" : Step Success")
             self.stepNumber = struct.unpack('>B', self.byteArrayData[4:5])[0]
                 
     def printTelemetryHeader(self, array):
@@ -130,62 +109,18 @@ class Service2TM(PUSTelemetry):
         return
 
 
-class Service3TM(PUSTelemetry):
-    def __init__(self, byteArray):
-        super().__init__(byteArray)
-        self.sid = struct.unpack('>I', self.byteArrayData[0:4])[0]
-        self.hkHeader = []
-        self.hkContent = []
-        if self.getSubservice() == 25:
-            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 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)
-
-    def printTelemetryHeader(self, array):
-        super().printTelemetryHeader(array)
-        array.append(hex(self.sid))
-        array.append(int(self.paramLength))
-        return
-
-    def printTelemetryColumnHeaders(self, array):
-        super().printTelemetryColumnHeaders(array)
-        array.append("SID")
-        array.append("Number of Parameters")
-        return
-
-
 class Service5TM(PUSTelemetry):
     def __init__(self, byteArray):
         super().__init__(byteArray)
+        self.printPacketInfo("Event")
+        if self.getSubservice() == 1:
+            self.appendPacketInfo(" Info")
+        elif self.getSubservice() == 2:
+            self.appendPacketInfo(" Error Low Severity")
+        elif self.getSubservice() == 3:
+            self.appendPacketInfo(" Error Med Severity")
+        elif self.getSubservice() == 4:
+            self.appendPacketInfo(" Error High Severity")
         self.eventId = struct.unpack('>H', self.byteArrayData[0:2])[0]
         self.objectId = struct.unpack('>I', self.byteArrayData[2:6])[0]
         self.param1 = struct.unpack('>I', self.byteArrayData[6:10])[0]
@@ -246,6 +181,7 @@ class Service9TM(PUSTelemetry):
 class Service17TM(PUSTelemetry):
     def __init__(self, byteArray):
         super().__init__(byteArray)
+        self.printPacketInfo("Test Reply")
 
     def printTelemetryHeader(self, array):
         super().printTelemetryHeader(array)
diff --git a/tm/OBSW_TmService3.py b/tm/OBSW_TmService3.py
new file mode 100644
index 0000000..a697e3c
--- /dev/null
+++ b/tm/OBSW_TmService3.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+"""
+Program: OBSW_TmPacket.py
+Date: 30.12.2019
+Description: Deserialize Housekeeping TM
+Author: R.Mueller
+"""
+
+from tm.OBSW_PusTm import PUSTelemetry
+import struct
+
+
+class Service3TM(PUSTelemetry):
+    def __init__(self, byteArray):
+        super().__init__(byteArray)
+        self.sid = struct.unpack('>I', self.byteArrayData[0:4])[0]
+        self.hkHeader = []
+        self.hkContent = []
+        self.printPacketInfo("Housekeeping Packet")
+        if self.getSubservice() == 25:
+            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 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)
+
+    def printTelemetryHeader(self, array):
+        super().printTelemetryHeader(array)
+        array.append(hex(self.sid))
+        array.append(int(self.paramLength))
+        return
+
+    def printTelemetryColumnHeaders(self, array):
+        super().printTelemetryColumnHeaders(array)
+        array.append("SID")
+        array.append("Number of Parameters")
+        return
diff --git a/utility/OBSW_TmTcPrinter.py b/utility/OBSW_TmTcPrinter.py
index 45ec59f..0157ea6 100644
--- a/utility/OBSW_TmTcPrinter.py
+++ b/utility/OBSW_TmTcPrinter.py
@@ -42,7 +42,7 @@ class TmtcPrinter:
         self.addPrintBufferToFileBuffer()
 
     def handleLongPrint(self, packet):
-        self.printBuffer = "Received Telemetry:"
+        self.printBuffer = "Received Telemetry: " + packet.printInfo
         print(self.printBuffer)
         self.addPrintBufferToFileBuffer()
         self.handleColumnHeaderPrint(packet)
-- 
GitLab