diff --git a/OBSW_Config.py b/OBSW_Config.py index fa099860a4dfc2e053cb8f7c2e748a0afcc7a656..6c5c4ddb240d6be637b68b3c49f9e3bd05947230 100644 --- a/OBSW_Config.py +++ b/OBSW_Config.py @@ -19,6 +19,9 @@ displayMode = "long" comIF = 0 +# COM Port for serial communication +comPort = 'COM0' +serialTimeout = 0.003 # Time related tmTimeout = 10 tcSendTimeoutFactor = 2.0 diff --git a/OBSW_UdpClient.py b/OBSW_UdpClient.py index 67fe5a60f62fe8b2a64aa1f635de4f1cc4859a89..16e1230f13752464aa66ff853bab6338292b2731 100644 --- a/OBSW_UdpClient.py +++ b/OBSW_UdpClient.py @@ -96,9 +96,11 @@ def main(): communicationInterface = EthernetComIF(tmtcPrinter, g.tmTimeout, g.tcSendTimeoutFactor, g.sockSend, g.sockReceive, g.sendAddress) else: - comPort = 'COM9' + comPort = g.comPort baudRate = 115200 - communicationInterface = SerialComIF(tmtcPrinter, comPort, baudRate, 0.007) + g.serialTimeout = 0.05 + communicationInterface = SerialComIF(tmtcPrinter, comPort, baudRate, g.serialTimeout) + connectToBoard() if g.modeId == "ListenerMode": @@ -126,6 +128,8 @@ def main(): SenderAndReceiver.sendQueueTcAndReceiveTmSequentially() elif g.modeId == "OBSWUnitTest": + if g.comIF == 1: + communicationInterface.serial.close() # Set up test suite and run it with runner # Verbosity specifies detail level suite = unittest.TestLoader().loadTestsFromModule(OBSW_UnitTest) @@ -138,9 +142,11 @@ def main(): # Prepare command for single command testing def commandPreparation(): - # Single Command Testing - command = PUSTelecommand(service=17, subservice=1, SSC=21) - command.packCommandTuple() + # Direct command which triggers an additional step reply and one completion reply + objectId = bytearray([0x44, 0x00, 0xAF, 0xFE]) + actionId = bytearray([0xBA, 0xDE, 0xAF, 0xFE]) + directCommand = objectId + actionId + command = PUSTelecommand(service=8, subservice=128, SSC=840, data=directCommand) return command.packCommandTuple() @@ -156,17 +162,23 @@ def parseInputArguments(): argParser.add_argument('--clientIP', help='Client(Computer) IP. Default:\'\'', default='') argParser.add_argument('--boardIP', help='Board IP. Default: 169.254.1.38', default='169.254.1.38') argParser.add_argument('-s', '--service', help='Service to test. Default: 17', default=17) - argParser.add_argument('-t', '--tmTimeout', type=float, help='TM Timeout. Default: 10)', default=10.0) + argParser.add_argument('-t', '--tmTimeout', type=float, help='TM Timeout. Default: 6, 3(Serial)', default=6.0) argParser.add_argument('-p', '--printFile', help='Supply -p to print output to file. Default: False', action='store_true') - argParser.add_argument('-o', '--tcTimeoutFactor', type=float, help='TC Timeout Factor. Default: 2.0', default=2.0) + argParser.add_argument('-o', '--tcTimeoutFactor', type=float, help='TC Timeout Factor. Default: 3.5', default=3.5) argParser.add_argument('-r', '--rawDataPrint', help='Supply -r to print all raw data directly', action='store_true') argParser.add_argument('-d', '--shortDisplayMode', help='Supply -d to print short output', action='store_true') argParser.add_argument('-k', '--hk', help='Supply -k or --hk to print HK data', action='store_true') + argParser.add_argument('--COM', help='COM Port for serial communication', default='COM0') + if len(sys.argv) == 1: print("No Input Arguments specified, setting default values.") argParser.print_help() args = argParser.parse_args() + if args.comIF == 1 and not args.COM: + print("No COM port provided, using COM0 !") + if args.comIF == 1 and args.tmTimeout == 6.0: + args.tmTimeout = 3 print(args) return args @@ -200,6 +212,7 @@ def setGlobals(args): g.sockReceive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) g.sockSend = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) g.modeId = modeId + g.comPort = args.COM g.printHkData = args.hk g.tmTimeout = args.tmTimeout g.printRawTmData = args.rawDataPrint @@ -209,8 +222,11 @@ def setGlobals(args): def setUpSocket(): - g.sockReceive.bind(g.recAddress) - g.sockReceive.setblocking(False) + try: + g.sockReceive.bind(g.recAddress) + g.sockReceive.setblocking(False) + except OSError: + print("Error setting up sockets.") class GracefulKiller: diff --git a/comIF/OBSW_ComInterface.py b/comIF/OBSW_ComInterface.py index 161e579b65ddeb322fc602a30d510545f8174d02..cc519f99e4a79a2d80f42e0ea44a9bd1c2de425e 100644 --- a/comIF/OBSW_ComInterface.py +++ b/comIF/OBSW_ComInterface.py @@ -22,7 +22,8 @@ class CommunicationInterface: # Receive telemetry and process it @abstractmethod def receiveTelemetry(self, parameters=0): - pass + packetList = [] + return packetList # Poll the interface for data @abstractmethod diff --git a/comIF/OBSW_Ethernet_ComIF.py b/comIF/OBSW_Ethernet_ComIF.py index a65c2416378a9f38e06b79de7e47db4af1fb8609..dacb009b0ffd86449a1367ae6ad86bfe1701af4d 100644 --- a/comIF/OBSW_Ethernet_ComIF.py +++ b/comIF/OBSW_Ethernet_ComIF.py @@ -52,7 +52,8 @@ class EthernetComIF(CommunicationInterface): data = self.recvSocket.recvfrom(1024)[0] packet = PUSTelemetryFactory(data) self.tmtcPrinter.printTelemetry(packet) - return packet + packetList = [packet] + return packetList def receiveTelemetryAndStoreIntoQueue(self, tmQueue): packet = self.receiveTelemetry() diff --git a/comIF/OBSW_Serial_ComIF.py b/comIF/OBSW_Serial_ComIF.py index b862bac56c1107fabeec33da9e01d326c791771c..f612dd3e679df91c02e219bf8a138d5a2e7ee5a2 100644 --- a/comIF/OBSW_Serial_ComIF.py +++ b/comIF/OBSW_Serial_ComIF.py @@ -9,10 +9,10 @@ from tm.OBSW_TmPacket import PUSTelemetryFactory class SerialComIF(CommunicationInterface): def __init__(self, tmtcPrinter, comPort, baudRate, serialTimeout): super().__init__(tmtcPrinter) - self.comPort = comPort - self.baudRate = baudRate self.tmtcPrinter = tmtcPrinter - self.serial = serial.Serial(port=comPort, baudrate=self.baudRate, timeout=serialTimeout) + self.serial = serial.Serial(port=comPort, baudrate=baudRate, timeout=serialTimeout) + self.data = bytearray() + self.numberOfPackets = 0 # self.serial.open() def sendTelecommand(self, tcPacket, tcPacketInfo=""): @@ -20,15 +20,18 @@ class SerialComIF(CommunicationInterface): self.serial.write(tcPacket) def receiveTelemetry(self, parameters=0): - packet = self.pollInterface() - return packet + packetList = self.pollInterface() + return packetList def pollInterface(self, parameter=0): if self.dataAvailable(): - data = self.pollPusPacket() - packet = PUSTelemetryFactory(data) - self.tmtcPrinter.printTelemetry(packet) - return packet + pusDataList, numberOfPackets = self.pollPusPackets() + packetList = [] + for counter in range(0, numberOfPackets): + packet = PUSTelemetryFactory(pusDataList[counter]) + self.tmtcPrinter.printTelemetry(packet) + packetList.append(packet) + return packetList def dataAvailable(self, timeout=0): if self.serial.in_waiting > 0: @@ -42,13 +45,43 @@ class SerialComIF(CommunicationInterface): elapsed_time = time.time() - start_time return False - def pollPusPacket(self): - pusData = self.serial.read(1024) - dataFieldSize = (pusData[4] << 8 | pusData[5]) + 1 - readSize = len(pusData) - if readSize < 6 + dataFieldSize: - print("Serial Com IF: Size missmatch when polling PUS packet") - return pusData + def pollPusPackets(self): + pusDataList = [] + self.data = self.serial.read(1024) + packetSize = (self.data[4] << 8 | self.data[5]) + 7 + readSize = len(self.data) + self.numberOfPackets = 1 + if readSize < packetSize: + print("Serial Com IF: Size missmatch when polling PUS packet. Packet Size: " + + str(packetSize) + ". Read Size: " + str(readSize) + ". Check timeout too") + if readSize > packetSize: + self.handleMultiplePackets(packetSize, readSize, pusDataList) + else: + pusDataList.append(self.data) + return pusDataList, self.numberOfPackets + + def handleMultiplePackets(self, packetSize, readSize, pusDataList): + endOfBuffer = readSize - 1 + endIndex = packetSize + startIndex = 0 + pusData = self.data[startIndex:endIndex] + pusDataList.append(pusData) + while endIndex < endOfBuffer: + endIndex = self.parseNextPackets(endIndex, pusDataList) + + def parseNextPackets(self, endIndex, pusDataList): + startIndex = endIndex + endIndex = endIndex + 5 + nextPacketSize = (self.data[endIndex - 1] << 8 | self.data[endIndex]) + 7 + if nextPacketSize > 1024: + print("PUS Polling: Very Large packet detected, large packet reading not implemented yet !") + print("Detected Size: " + str(nextPacketSize)) + return pusDataList, self.numberOfPackets + endIndex = startIndex + nextPacketSize + pusData = self.data[startIndex:endIndex] + pusDataList.append(pusData) + self.numberOfPackets = self.numberOfPackets + 1 + return endIndex def performListenerMode(self): print("Listening for packages ...") @@ -63,3 +96,4 @@ class SerialComIF(CommunicationInterface): packet = self.pollInterface() tmInfo = packet.packTmInformation() tmTupleQueue.put(packet, tmInfo) + diff --git a/config/PyCharm/ConfigurationFolder/deployment.xml b/config/PyCharm/ConfigurationFolder/deployment.xml new file mode 100644 index 0000000000000000000000000000000000000000..488b56d87f04f697dc8ccfa8aec511bf79d8f0b6 --- /dev/null +++ b/config/PyCharm/ConfigurationFolder/deployment.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="PublishConfigData"> + <serverData> + <paths name="pi@RemoteHome"> + <serverdata> + <mappings> + <mapping local="$PROJECT_DIR$" web="/" /> + </mappings> + </serverdata> + </paths> + </serverData> + </component> +</project> \ No newline at end of file diff --git a/config/PyCharm/ConfigurationFolder/inspectionProfiles/profiles_settings.xml b/config/PyCharm/ConfigurationFolder/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..105ce2da2d6447d11dfe32bfb846c3d5b199fc99 --- /dev/null +++ b/config/PyCharm/ConfigurationFolder/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ +<component name="InspectionProjectProfileManager"> + <settings> + <option name="USE_PROJECT_PROFILE" value="false" /> + <version value="1.0" /> + </settings> +</component> \ No newline at end of file diff --git a/config/PyCharm/ConfigurationFolder/misc.xml b/config/PyCharm/ConfigurationFolder/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..cbb5b0ed23b7571babcce600dc23206491c1208d --- /dev/null +++ b/config/PyCharm/ConfigurationFolder/misc.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JavaScriptSettings"> + <option name="languageLevel" value="ES6" /> + </component> + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" /> +</project> \ No newline at end of file diff --git a/config/PyCharm/ConfigurationFolder/modules.xml b/config/PyCharm/ConfigurationFolder/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..a9b2d2996a9a11d85efb5f816c21b63b73e8a4c3 --- /dev/null +++ b/config/PyCharm/ConfigurationFolder/modules.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/../generators/.idea/generators.iml" filepath="$PROJECT_DIR$/../generators/.idea/generators.iml" /> + <module fileurl="file://$PROJECT_DIR$/.idea/tmtc.iml" filepath="$PROJECT_DIR$/.idea/tmtc.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/config/PyCharm/ConfigurationFolder/tmtc.iml b/config/PyCharm/ConfigurationFolder/tmtc.iml new file mode 100644 index 0000000000000000000000000000000000000000..9f2c7c63c17ca9d5b9596f4bbac042b168718340 --- /dev/null +++ b/config/PyCharm/ConfigurationFolder/tmtc.iml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="PYTHON_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="jdk" jdkName="Python 3.7" jdkType="Python SDK" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="module" module-name="generators" /> + </component> +</module> \ No newline at end of file diff --git a/config/PyCharm/ConfigurationFolder/vcs.xml b/config/PyCharm/ConfigurationFolder/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..f245aa7c119fc442012bebe744c985afdc6f6c16 --- /dev/null +++ b/config/PyCharm/ConfigurationFolder/vcs.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$/.." vcs="Git" /> + <mapping directory="$PROJECT_DIR$" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/config/PyCharm/ConfigurationFolder/workspace.xml b/config/PyCharm/ConfigurationFolder/workspace.xml new file mode 100644 index 0000000000000000000000000000000000000000..85ecf317a2376de0128206204223a55ba084c96d --- /dev/null +++ b/config/PyCharm/ConfigurationFolder/workspace.xml @@ -0,0 +1,849 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ChangeListManager"> + <list default="true" id="8ef8d1f2-b212-4065-aebd-557195d815d1" name="Default Changelist" comment="" /> + <option name="SHOW_DIALOG" value="false" /> + <option name="HIGHLIGHT_CONFLICTS" value="true" /> + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> + <option name="LAST_RESOLUTION" value="IGNORE" /> + </component> + <component name="DatabaseView"> + <option name="SHOW_INTERMEDIATE" value="true" /> + <option name="GROUP_DATA_SOURCES" value="true" /> + <option name="GROUP_SCHEMA" value="true" /> + <option name="GROUP_CONTENTS" value="false" /> + <option name="SORT_POSITIONED" value="false" /> + <option name="SHOW_EMPTY_GROUPS" value="false" /> + <option name="AUTO_SCROLL_FROM_SOURCE" value="false" /> + <option name="HIDDEN_KINDS"> + <set /> + </option> + <expand /> + <select /> + </component> + <component name="FileTemplateManagerImpl"> + <option name="RECENT_TEMPLATES"> + <list> + <option value="Python Script" /> + </list> + </option> + </component> + <component name="Git.Settings"> + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> + </component> + <component name="ProjectId" id="1Uz826fKz2JAz5iGPEF71bZiSTe" /> + <component name="ProjectLevelVcsManager" settingsEditedManually="true" /> + <component name="ProjectViewState"> + <option name="hideEmptyMiddlePackages" value="true" /> + <option name="showExcludedFiles" value="true" /> + <option name="showLibraryContents" value="true" /> + </component> + <component name="PropertiesComponent"> + <property name="RunOnceActivity.ShowReadmeOnStart" value="true" /> + <property name="WebServerToolWindowFactoryState" value="true" /> + <property name="last_opened_file_path" value="$PROJECT_DIR$/../generators/packetContent" /> + <property name="node.js.detected.package.eslint" value="true" /> + <property name="node.js.detected.package.tslint" value="true" /> + <property name="node.js.path.for.package.eslint" value="project" /> + <property name="node.js.path.for.package.tslint" value="project" /> + <property name="node.js.selected.package.eslint" value="(autodetect)" /> + <property name="node.js.selected.package.tslint" value="(autodetect)" /> + <property name="run.code.analysis.last.selected.profile" value="aDefault" /> + <property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" /> + </component> + <component name="PyConsoleOptionsProvider"> + <option name="myPythonConsoleState"> + <console-settings module-name="tmtc" is-module-sdk="true"> + <option name="myUseModuleSdk" value="true" /> + <option name="myModuleName" value="tmtc" /> + </console-settings> + </option> + </component> + <component name="RecentsManager"> + <key name="CopyFile.RECENT_KEYS"> + <recent name="C:\Users\Robin\NoSyncDokumente\sourceobsw\generators\packetContent" /> + </key> + </component> + <component name="RunManager" selected="Python.OBSW_UdpClient Service 3 Serial "> + <configuration name="MIB_Objects" type="PythonConfigurationType" factoryName="Python" temporary="true"> + <module name="generators" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/../generators/objects" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../generators/objects/MIB_Objects.py" /> + <option name="PARAMETERS" value="" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="MIB_PacketContentParser" type="PythonConfigurationType" factoryName="Python"> + <module name="generators" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/../generators/packetContent" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../generators/packetContent/MIB_PacketContentParser.py" /> + <option name="PARAMETERS" value="" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="MIB_Returnvalues" type="PythonConfigurationType" factoryName="Python"> + <module name="generators" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/../generators/returnvalues" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../generators/returnvalues/MIB_Returnvalues.py" /> + <option name="PARAMETERS" value="" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="MIB_SubserviceParser" type="PythonConfigurationType" factoryName="Python"> + <module name="generators" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/../generators/subservice" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../generators/subservice/MIB_SubserviceParser.py" /> + <option name="PARAMETERS" value="" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient GPS0" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s GPS0" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient GPS1" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s GPS1 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Help" type="PythonConfigurationType" factoryName="Python"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-h" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Listener Mode" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 1 --hk" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Listener Mode Serial" type="PythonConfigurationType" factoryName="Python" folderName="Serial"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 1 -c 1 --COM COM9" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 17 Test Serial" type="PythonConfigurationType" factoryName="Python" folderName="Serial"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 17 -c 1 -p --COM COM9" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 17 Test" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 17 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 2 Serial" type="PythonConfigurationType" factoryName="Python" folderName="Serial"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 2 -p -c 1 --COM COM9" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 2 Test" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 2 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 200 UDP" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 200 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 3 Serial " type="PythonConfigurationType" factoryName="Python" folderName="Serial"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 3 -p -c 1 --COM COM9" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 3" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 3 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 5 Serial" type="PythonConfigurationType" factoryName="Python" folderName="Serial"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 5 -c 1 -p --COM COM9" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 8 Serial" type="PythonConfigurationType" factoryName="Python" folderName="Serial"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 8 -p -c 1 --COM COM9" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service 8" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s 8 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Service Dummy" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 3 -s Dummy -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Single Command Serial" type="PythonConfigurationType" factoryName="Python" folderName="Serial"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 2 -c 1 --COM COM9" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Single Command" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 2 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Software Testmode" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 4 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Unit Test Serial" type="PythonConfigurationType" factoryName="Python" folderName="Serial"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 5 -p -c 1 --COM COM9" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="OBSW_UdpClient Unit Test" type="PythonConfigurationType" factoryName="Python" folderName="UDP"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> + <option name="IS_MODULE_SDK" value="true" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/OBSW_UdpClient.py" /> + <option name="PARAMETERS" value="-m 5 -p" /> + <option name="SHOW_COMMAND_LINE" value="false" /> + <option name="EMULATE_TERMINAL" value="true" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <configuration name="Test Script" type="PythonConfigurationType" factoryName="Python"> + <module name="tmtc" /> + <option name="INTERPRETER_OPTIONS" value="" /> + <option name="PARENT_ENVS" value="true" /> + <envs> + <env name="PYTHONUNBUFFERED" value="1" /> + </envs> + <option name="SDK_HOME" value="C:\Users\Robin\AppData\Local\Programs\Python\Python37-32\python.exe" /> + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/../../devtools/3_Python_Scripts" /> + <option name="IS_MODULE_SDK" value="false" /> + <option name="ADD_CONTENT_ROOTS" value="true" /> + <option name="ADD_SOURCE_ROOTS" value="true" /> + <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../../devtools/3_Python_Scripts/test.py" /> + <option name="PARAMETERS" value="" /> + <option name="SHOW_COMMAND_LINE" value="true" /> + <option name="EMULATE_TERMINAL" value="false" /> + <option name="MODULE_MODE" value="false" /> + <option name="REDIRECT_INPUT" value="false" /> + <option name="INPUT_FILE" value="" /> + <method v="2" /> + </configuration> + <list> + <item itemvalue="Python.OBSW_UdpClient Listener Mode Serial" /> + <item itemvalue="Python.OBSW_UdpClient Single Command Serial" /> + <item itemvalue="Python.OBSW_UdpClient Service 2 Serial" /> + <item itemvalue="Python.OBSW_UdpClient Service 3 Serial " /> + <item itemvalue="Python.OBSW_UdpClient Service 5 Serial" /> + <item itemvalue="Python.OBSW_UdpClient Service 8 Serial" /> + <item itemvalue="Python.OBSW_UdpClient Service 17 Test Serial" /> + <item itemvalue="Python.OBSW_UdpClient Unit Test Serial" /> + <item itemvalue="Python.OBSW_UdpClient Listener Mode" /> + <item itemvalue="Python.OBSW_UdpClient Single Command" /> + <item itemvalue="Python.OBSW_UdpClient Software Testmode" /> + <item itemvalue="Python.OBSW_UdpClient Service 2 Test" /> + <item itemvalue="Python.OBSW_UdpClient Service 3" /> + <item itemvalue="Python.OBSW_UdpClient Service 8" /> + <item itemvalue="Python.OBSW_UdpClient Service 17 Test" /> + <item itemvalue="Python.OBSW_UdpClient Service 200 UDP" /> + <item itemvalue="Python.OBSW_UdpClient Unit Test" /> + <item itemvalue="Python.OBSW_UdpClient Service Dummy" /> + <item itemvalue="Python.OBSW_UdpClient GPS0" /> + <item itemvalue="Python.OBSW_UdpClient GPS1" /> + <item itemvalue="Python.OBSW_UdpClient Help" /> + <item itemvalue="Python.Test Script" /> + <item itemvalue="Python.MIB_SubserviceParser" /> + <item itemvalue="Python.MIB_PacketContentParser" /> + <item itemvalue="Python.MIB_Returnvalues" /> + <item itemvalue="Python.MIB_Objects" /> + </list> + <recent_temporary> + <list> + <item itemvalue="Python.MIB_Objects" /> + </list> + </recent_temporary> + </component> + <component name="ServiceViewManager"> + <option name="viewStates"> + <list> + <serviceView> + <treeState> + <expand /> + <select /> + </treeState> + </serviceView> + </list> + </option> + </component> + <component name="SvnConfiguration"> + <configuration /> + </component> + <component name="TaskManager"> + <task active="true" id="Default" summary="Default task"> + <changelist id="8ef8d1f2-b212-4065-aebd-557195d815d1" name="Default Changelist" comment="" /> + <created>1576348060792</created> + <option name="number" value="Default" /> + <option name="presentableId" value="Default" /> + <updated>1576348060792</updated> + <workItem from="1576348064389" duration="448000" /> + <workItem from="1576348741038" duration="3028000" /> + <workItem from="1576351784982" duration="20958000" /> + <workItem from="1576373060704" duration="520000" /> + <workItem from="1576410057252" duration="2405000" /> + <workItem from="1576413260407" duration="14520000" /> + <workItem from="1576448644997" duration="2502000" /> + <workItem from="1576862311281" duration="5467000" /> + <workItem from="1577661279544" duration="3410000" /> + <workItem from="1577707201911" duration="13828000" /> + <workItem from="1577893983805" duration="9508000" /> + <workItem from="1577995542127" duration="2426000" /> + <workItem from="1578005492298" duration="7313000" /> + <workItem from="1578012874737" duration="98000" /> + <workItem from="1578086483697" duration="10449000" /> + <workItem from="1578103521198" duration="1944000" /> + <workItem from="1578136011728" duration="7443000" /> + <workItem from="1578151471752" duration="6115000" /> + <workItem from="1578157599966" duration="94000" /> + <workItem from="1578157933959" duration="279000" /> + <workItem from="1578158564857" duration="9096000" /> + </task> + <servers /> + </component> + <component name="TypeScriptGeneratedFilesManager"> + <option name="version" value="1" /> + </component> + <component name="WindowStateProjectService"> + <state x="639" y="224" width="1089" height="712" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1578171089849"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="639" y="224" width="1089" height="712" key="#com.intellij.execution.impl.EditConfigurationsDialog/0.0.2048.1112@0.0.2048.1112" timestamp="1578171089849" /> + <state x="830" y="272" key="#com.intellij.ide.util.MemberChooser" timestamp="1576433060697"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="830" y="272" key="#com.intellij.ide.util.MemberChooser/0.0.2048.1112@0.0.2048.1112" timestamp="1576433060697" /> + <state x="755" y="303" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog" timestamp="1576360386464"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="755" y="303" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/0.0.2048.1112@0.0.2048.1112" timestamp="1576360386464" /> + <state x="772" y="412" key="ANALYSIS_DLG_com.intellij.analysis.BaseAnalysisAction$1" timestamp="1576438473084"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="772" y="412" key="ANALYSIS_DLG_com.intellij.analysis.BaseAnalysisAction$1/0.0.2048.1112@0.0.2048.1112" timestamp="1576438473084" /> + <state x="759" y="317" key="EnvironmentVariablesDialog" timestamp="1576351737993"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="759" y="317" key="EnvironmentVariablesDialog/0.0.2048.1112@0.0.2048.1112" timestamp="1576351737993" /> + <state width="982" height="373" key="GridCell.Tab.-1.bottom" timestamp="1578155861011"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="982" height="373" key="GridCell.Tab.-1.bottom/0.0.2048.1112@0.0.2048.1112" timestamp="1578155861011" /> + <state width="982" height="373" key="GridCell.Tab.-1.center" timestamp="1578155861011"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="982" height="373" key="GridCell.Tab.-1.center/0.0.2048.1112@0.0.2048.1112" timestamp="1578155861011" /> + <state width="982" height="373" key="GridCell.Tab.-1.left" timestamp="1578155861010"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="982" height="373" key="GridCell.Tab.-1.left/0.0.2048.1112@0.0.2048.1112" timestamp="1578155861010" /> + <state width="982" height="373" key="GridCell.Tab.-1.right" timestamp="1578155861011"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="982" height="373" key="GridCell.Tab.-1.right/0.0.2048.1112@0.0.2048.1112" timestamp="1578155861011" /> + <state width="2005" height="322" key="GridCell.Tab.0.bottom" timestamp="1578170887086"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="2005" height="322" key="GridCell.Tab.0.bottom/0.0.2048.1112@0.0.2048.1112" timestamp="1578170887086" /> + <state width="2005" height="322" key="GridCell.Tab.0.center" timestamp="1578170887086"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="2005" height="322" key="GridCell.Tab.0.center/0.0.2048.1112@0.0.2048.1112" timestamp="1578170887086" /> + <state width="2005" height="322" key="GridCell.Tab.0.left" timestamp="1578170887086"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="2005" height="322" key="GridCell.Tab.0.left/0.0.2048.1112@0.0.2048.1112" timestamp="1578170887086" /> + <state width="2005" height="322" key="GridCell.Tab.0.right" timestamp="1578170887086"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="2005" height="322" key="GridCell.Tab.0.right/0.0.2048.1112@0.0.2048.1112" timestamp="1578170887086" /> + <state width="982" height="373" key="GridCell.Tab.1.bottom" timestamp="1578155850300"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="982" height="373" key="GridCell.Tab.1.bottom/0.0.2048.1112@0.0.2048.1112" timestamp="1578155850300" /> + <state width="982" height="373" key="GridCell.Tab.1.center" timestamp="1578155850300"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="982" height="373" key="GridCell.Tab.1.center/0.0.2048.1112@0.0.2048.1112" timestamp="1578155850300" /> + <state width="982" height="373" key="GridCell.Tab.1.left" timestamp="1578155850300"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="982" height="373" key="GridCell.Tab.1.left/0.0.2048.1112@0.0.2048.1112" timestamp="1578155850300" /> + <state width="982" height="373" key="GridCell.Tab.1.right" timestamp="1578155850300"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="982" height="373" key="GridCell.Tab.1.right/0.0.2048.1112@0.0.2048.1112" timestamp="1578155850300" /> + <state x="533" y="198" key="SettingsEditor" timestamp="1576352964275"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="533" y="198" key="SettingsEditor/0.0.2048.1112@0.0.2048.1112" timestamp="1576352964275" /> + <state width="1031" height="563" key="XDebugger.FullValuePopup" timestamp="1576360670785"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state width="1031" height="563" key="XDebugger.FullValuePopup/0.0.2048.1112@0.0.2048.1112" timestamp="1576360670785" /> + <state x="1233" y="380" key="com.intellij.ide.util.TipDialog" timestamp="1578158564939"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="1233" y="380" key="com.intellij.ide.util.TipDialog/0.0.2048.1112@0.0.2048.1112" timestamp="1578158564939" /> + <state x="658" y="171" key="com.intellij.openapi.editor.actions.MultiplePasteAction$ClipboardContentChooser" timestamp="1576371500886"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="658" y="171" key="com.intellij.openapi.editor.actions.MultiplePasteAction$ClipboardContentChooser/0.0.2048.1112@0.0.2048.1112" timestamp="1576371500886" /> + <state x="38" y="209" width="966" height="526" key="find.popup" timestamp="1578159539803"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="38" y="209" width="966" height="526" key="find.popup/0.0.2048.1112@0.0.2048.1112" timestamp="1578159539803" /> + <state x="766" y="199" key="refactoring.ChangeSignatureDialog" timestamp="1576427922732"> + <screen x="0" y="0" width="2048" height="1112" /> + </state> + <state x="766" y="199" key="refactoring.ChangeSignatureDialog/0.0.2048.1112@0.0.2048.1112" timestamp="1576427922732" /> + </component> + <component name="com.intellij.coverage.CoverageDataManagerImpl"> + <SUITE FILE_PATH="coverage/tmtc$test.coverage" NAME="test Coverage Results" MODIFIED="1576354080526" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/../../devtools/3_Python_Scripts" /> + <SUITE FILE_PATH="coverage/tmtc$MIB_SubserviceParser.coverage" NAME="MIB_SubserviceParser Coverage Results" MODIFIED="1578152963327" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/../generators/subservice" /> + <SUITE FILE_PATH="coverage/tmtc$MIB_PacketContentParser.coverage" NAME="MIB_PacketContentParser Coverage Results" MODIFIED="1578170127716" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/../generators/packetContent" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Listener__Mode.coverage" NAME="OBSW_UdpClient Listener Mode Coverage Results" MODIFIED="1577917929072" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_2_Serial.coverage" NAME="OBSW_UdpClient Service 2 Serial Coverage Results" MODIFIED="1578012753889" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_GPS0.coverage" NAME="OBSW_UdpClient GPS0 Coverage Results" MODIFIED="1576874689815" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_17_Test_Serial.coverage" NAME="OBSW_UdpClient Service 17 Test Serial Coverage Results" MODIFIED="1578169926606" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_Dummy.coverage" NAME="OBSW_UdpClient Service Dummy Coverage Results" MODIFIED="1576366340167" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Single_Command_UART.coverage" NAME="OBSW_UdpClient Single Command UART Coverage Results" MODIFIED="1577919360178" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$MIB_Objects.coverage" NAME="MIB_Objects Coverage Results" MODIFIED="1578167103168" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/../generators/objects" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_17.coverage" NAME="OBSW_UdpClient Service 17 Test Coverage Results" MODIFIED="1577735566580" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_2_Test.coverage" NAME="OBSW_UdpClient Service 2 Test Coverage Results" MODIFIED="1577919480522" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Listener_Mode_Serial.coverage" NAME="OBSW_UdpClient Listener Mode Serial Coverage Results" MODIFIED="1578102764154" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_200_UDP.coverage" NAME="OBSW_UdpClient Service 200 UDP Coverage Results" MODIFIED="1578104915786" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$MIB_Returnvalues.coverage" NAME="MIB_Returnvalues Coverage Results" MODIFIED="1578152122867" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/../generators/returnvalues" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Unit_Test.coverage" NAME="OBSW_UdpClient Unit Test Coverage Results" MODIFIED="1578104161260" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_3_Serial_.coverage" NAME="OBSW_UdpClient Service 3 Serial Coverage Results" MODIFIED="1578170887081" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Software_Testmode.coverage" NAME="OBSW_UdpClient Software Testmode Coverage Results" MODIFIED="1578104232427" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_8.coverage" NAME="OBSW_UdpClient Service 8 Coverage Results" MODIFIED="1578158566744" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Single_Command.coverage" NAME="OBSW_UdpClient Single Command Coverage Results" MODIFIED="1576438482437" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient.coverage" NAME="OBSW_UdpClient Service 17 Coverage Results" MODIFIED="1576348509093" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_5_Serial.coverage" NAME="OBSW_UdpClient Service 5 Serial Coverage Results" MODIFIED="1578012316105" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Unit_Test_Serial.coverage" NAME="OBSW_UdpClient Unit Test Serial Coverage Results" MODIFIED="1578169947051" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_8_Serial.coverage" NAME="OBSW_UdpClient Service 8 Serial Coverage Results" MODIFIED="1578170848389" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_3.coverage" NAME="OBSW_UdpClient Service 3 Coverage Results" MODIFIED="1577735616646" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Help.coverage" NAME="OBSW_UdpClient Help Coverage Results" MODIFIED="1577996094909" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_rGPS.coverage" NAME="OBSW_UdpClient GPS1 Coverage Results" MODIFIED="1576874652996" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Listener_Mode_UART.coverage" NAME="OBSW_UdpClient Listener Mode UART Coverage Results" MODIFIED="1577918075998" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Service_17_Test.coverage" NAME="OBSW_UdpClient Service 17 Test Coverage Results" MODIFIED="1578104689098" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + <SUITE FILE_PATH="coverage/tmtc$OBSW_UdpClient_Single_Command_Serial.coverage" NAME="OBSW_UdpClient Single Command Serial Coverage Results" MODIFIED="1578161512290" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> + </component> +</project> \ No newline at end of file diff --git a/config/PyCharmConfig_README.md b/config/PyCharmConfig_README.md new file mode 100644 index 0000000000000000000000000000000000000000..5132743f04b44da46cb9ad3b1fc313bdc629ee13 --- /dev/null +++ b/config/PyCharmConfig_README.md @@ -0,0 +1,2 @@ +Rename ConfigurationFolder inside PyCharm to .idea and move it to the root directory of the TMTC script(tmtc/). +It contains the settings for PyCharm (Pre-defined command line parameters) \ No newline at end of file diff --git a/sendreceive/OBSW_CommandSenderReceiver.py b/sendreceive/OBSW_CommandSenderReceiver.py index 8352a3b771dc0dba598b8c566cffeff00d21d6b4..1e3352df52cba0afd9326a7cc32e269c72910372 100644 --- a/sendreceive/OBSW_CommandSenderReceiver.py +++ b/sendreceive/OBSW_CommandSenderReceiver.py @@ -37,6 +37,9 @@ class CommandSenderReceiver: self.doPrintToFile = doPrintToFile self.queueEntryIsTelecommand = True + self.lastTc = [] + self.lastTcInfo = [] + # checks for replies. if no reply is received, send telecommand again def checkForFirstReply(self): success = self.checkForOneTelemetrySequence() @@ -46,6 +49,7 @@ class CommandSenderReceiver: if len(self.pusPacket) == 0: print("Command Sender Receiver: No command has been sent yet") else: + print("Command Sender Receiver: Sending command again") self.comInterface.sendTelecommand(self.pusPacket, self.pusPacketInfo) # Check for special queue entries. @@ -64,6 +68,7 @@ class CommandSenderReceiver: self.tmtcPrinter.printToFile(exportName, True) else: self.queueEntryIsTelecommand = True + self.lastTc, self.lastTcInfo = (self.pusPacket, self.pusPacketInfo) def checkForTimeout(self): if self.timeoutCounter == 5: @@ -72,11 +77,11 @@ class CommandSenderReceiver: if self.start_time != 0: self.elapsed_time = time.time() - self.start_time if self.elapsed_time > self.tmTimeout * self.tcSendTimeoutFactor: - print("Command Sender Receiver: Timeout, sending Telecommand again") - self.comInterface.sendTelecommand(self.pusPacket, self.pusPacketInfo) + print("Command Sender Receiver: Timeout, sending TC again !") + self.comInterface.sendTelecommand(self.lastTc, self.lastTcInfo) self.timeoutCounter = self.timeoutCounter + 1 self.start_time = time.time() - time.sleep(3) + time.sleep(1) # check for one sequence of replies for a telecommand (e.g. TM[1,1] , TM[1,7] ...) # returns True on success diff --git a/sendreceive/OBSW_MultipleCommandsSenderReceiver.py b/sendreceive/OBSW_MultipleCommandsSenderReceiver.py index 7e4f38299ccca385675e73cfb38cb6d718d68967..c94f44a2c0743efe31258c6b63cee9cb12cfb3a1 100644 --- a/sendreceive/OBSW_MultipleCommandsSenderReceiver.py +++ b/sendreceive/OBSW_MultipleCommandsSenderReceiver.py @@ -53,6 +53,8 @@ class MultipleCommandSenderReceiver(SequentialCommandSenderReceiver): def sendAllQueue(self): while not self.tcQueue.empty(): + if g.comIF == 1: + time.sleep(0.01) # pause could be smaller, but causes overrun error on flashed board self.sendAndPrintTc() def sendAndPrintTc(self): @@ -74,8 +76,8 @@ class MultipleCommandSenderReceiver(SequentialCommandSenderReceiver): super().checkForMultipleReplies() def handleReplyListening(self): - self.tmReady = select.select([g.sockReceive], [], [], 2.0) - if self.tmReady[0]: + tmReady = self.comInterface.dataAvailable(2.0) + if tmReady: self.receiveTelemetryAndStoreInformation() if self.tcQueue.empty(): print("TC queue empty. Listening for a few more seconds ... ") @@ -84,16 +86,17 @@ class MultipleCommandSenderReceiver(SequentialCommandSenderReceiver): self.allRepliesReceived = True def receiveTelemetryAndStoreInformation(self): - packet = self.comInterface.receiveTelemetry() - tmInfo = packet.packTmInformation() - self.tmInfoQueue.put(tmInfo) + packetList = self.comInterface.receiveTelemetry() + for counter in range(0, len(packetList)): + tmInfo = packetList[counter].packTmInformation() + self.tmInfoQueue.put(tmInfo) def handleLastRepliesListening(self, start_time): elapsed_time_seconds = 0 while elapsed_time_seconds < self.tmTimeout: elapsed_time_seconds = time.time() - start_time - self.tmReady = select.select([g.sockReceive], [], [], 2.0) - if self.tmReady[0]: + tmReady = self.comInterface.dataAvailable(2.0) + if tmReady: self.receiveTelemetryAndStoreInformation() diff --git a/sendreceive/OBSW_SequentialSenderReceiver.py b/sendreceive/OBSW_SequentialSenderReceiver.py index d160c41081cd6de61d6a61a4228f92f8b1aedd08..fb96c0c68c114c80128645eb703ba50a6f88d171 100644 --- a/sendreceive/OBSW_SequentialSenderReceiver.py +++ b/sendreceive/OBSW_SequentialSenderReceiver.py @@ -29,7 +29,7 @@ class SequentialCommandSenderReceiver(CommandSenderReceiver): def sendQueueTcAndReceiveTmSequentially(self): receiverThread = threading.Thread(target=self.checkForMultipleReplies) receiverThread.start() - time.sleep(1) + time.sleep(0.5) self.sendAndReceiveFirstPacket() # this flag is set in the separate thread ! try: @@ -42,7 +42,8 @@ class SequentialCommandSenderReceiver(CommandSenderReceiver): while not self.tcQueue.empty(): self.performNextTcSend() if self.tcQueue.empty(): - print("TC queue empty") + print("TC Sender: TC queue empty") + self.start_time = time.time() self.checkForTimeout() if self.doPrintToFile: print("Exporting output to log file") @@ -78,6 +79,7 @@ class SequentialCommandSenderReceiver(CommandSenderReceiver): elif self.tcQueue.empty(): # Special case: Last queue entry is not a Telecommand self.allRepliesReceived = True + print("Receiver: All replies received") else: self.replyReceived = True self.performNextTcSend() @@ -93,7 +95,7 @@ class SequentialCommandSenderReceiver(CommandSenderReceiver): def handleReplyListening(self): if self.firstReplyReceived: - tmReady = self.comInterface.dataAvailable(2.0) + tmReady = self.comInterface.dataAvailable(1.0) if tmReady: self.handleTelemetrySequence() else: @@ -106,6 +108,7 @@ class SequentialCommandSenderReceiver(CommandSenderReceiver): # set this flag so the other thread can send the next telecommand self.replyReceived = True if self.tcQueue.empty(): + print("Receiver: All replies received") self.allRepliesReceived = True def handleFirstReplyListening(self): diff --git a/tc/OBSW_TcService200.py b/tc/OBSW_TcService200.py index 995fcd3a198e063839ccf24d94bb0c575a52ecc3..ba4a2dc9b23daeed3c453909a76d7996a6f315c1 100644 --- a/tc/OBSW_TcService200.py +++ b/tc/OBSW_TcService200.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -Program: OBSW_UnitTest.py +Program: OBSW_TcService200.py Date: 01.11.2019 Description: PUS Custom Service 200: Mode Commanding @@ -16,21 +16,26 @@ import struct def packService200TestInto(tcQueue): + tcQueue.put(("print", "Testing Service 200")) # Object ID: Dummy Device objectId = bytearray([0x44, 0x00, 0xAF, 0xFE]) # Set On Mode + tcQueue.put(("print", "\r\nTesting Service 200: Set Mode On")) modeData = packModeData(objectId, 1, 0) command = PUSTelecommand(service=200, subservice=1, SSC=2000, data=modeData) tcQueue.put(command.packCommandTuple()) # Set Normal mode + tcQueue.put(("print", "\r\nTesting Service 200: Set Mode Normal")) modeData = packModeData(objectId, 2, 0) command = PUSTelecommand(service=200, subservice=1, SSC=2010, data=modeData) tcQueue.put(command.packCommandTuple()) # Set Raw Mode + tcQueue.put(("print", "\r\nTesting Service 200: Set Mode Raw")) modeData = packModeData(objectId, 3, 0) command = PUSTelecommand(service=200, subservice=1, SSC=2020, data=modeData) tcQueue.put(command.packCommandTuple()) # Set Off Mode + tcQueue.put(("print", "\r\nTesting Service 200: Set Mode Off")) modeData = packModeData(objectId, 0, 0) command = PUSTelecommand(service=200, subservice=1, SSC=2030, data=modeData) tcQueue.put(command.packCommandTuple()) diff --git a/tc/OBSW_TcService3.py b/tc/OBSW_TcService3.py index 1e96a21f5239dc05e100f1d28f206afba21307b8..41e940bb6a6d075bdf066d1a84c0c2036298e69d 100644 --- a/tc/OBSW_TcService3.py +++ b/tc/OBSW_TcService3.py @@ -13,8 +13,9 @@ from tc.OBSW_TcPacket import PUSTelecommand def packService3TestInto(tcQueue): tcQueue.put(("print", "Testing Service 3")) # adding custom defintion to hk using test pool variables - tcQueue.put(("print", "\r\nTesting Service 3: Adding custom definition")) - sid = bytearray([0x00, 0x00, 0x42, 0x00]) + tcQueue.put(("print", "\r\nTesting Service 3: Adding custom HK definition")) + sid1 = bytearray([0x00, 0x00, 0x43, 0x00]) + sid2 = bytearray([0x00, 0x00, 0x44, 0x00]) collectionInterval = struct.pack('>f', 3) numberOfParameters = struct.pack('B', 5) p1 = bytearray([0x01, 0x01, 0x01, 0x01]) @@ -22,11 +23,13 @@ def packService3TestInto(tcQueue): p3 = bytearray([0x03, 0x03, 0x03, 0x03]) p4 = bytearray([0x04, 0x04, 0x04, 0x04]) p5 = bytearray([0x05, 0x05, 0x05, 0x05]) - hkDefinition = sid + collectionInterval + numberOfParameters + p1 + p2 + p3 + p4 + p5 - command = PUSTelecommand(service=3, subservice=1, SSC=3010, data=hkDefinition) + hkDefinition1 = sid1 + collectionInterval + numberOfParameters + p1 + p2 + p3 + p4 + p5 + hkDefinition2 = sid2 + collectionInterval + numberOfParameters + p1 + p2 + p3 + p4 + p5 + command = PUSTelecommand(service=3, subservice=1, SSC=3010, data=hkDefinition1) tcQueue.put(command.packCommandTuple()) + tcQueue.put(("print", "\r\nTesting Service 3: Adding custom diganostics definition")) # adding custom definition to diagnostics using test pool variables - command = PUSTelecommand(service=3, subservice=2, SSC=3010, data=hkDefinition) + command = PUSTelecommand(service=3, subservice=2, SSC=3020, data=hkDefinition2) tcQueue.put(command.packCommandTuple()) # enable custom hk definition # enable custom diag definition @@ -46,6 +49,13 @@ def packService3TestInto(tcQueue): # report custom diag definition # delete custom hk definition # delete custom diag definition + tcQueue.put(("print", "\r\nTesting Service 3: Deleting custom HK definition")) + command = PUSTelecommand(service=3, subservice=3, SSC=3080, data=sid1) + tcQueue.put(command.packCommandTuple()) + # delete custom diag definition + tcQueue.put(("print", "\r\nTesting Service 3: Deleting custom diagnostics definition")) + command = PUSTelecommand(service=3, subservice=4, SSC=3090, data=sid2) + tcQueue.put(command.packCommandTuple()) # do some basic testing on predefined structs too # e.g. add one variable, change interval, report them.... tcQueue.put(("export", "log/tmtc_log_service3.txt")) diff --git a/tc/OBSW_TcService8.py b/tc/OBSW_TcService8.py index 6768e4cda2b2b26166019536773d8105be9836fc..e8ba84ae853a25adc0782a8b84c47c3c8adeb03c 100644 --- a/tc/OBSW_TcService8.py +++ b/tc/OBSW_TcService8.py @@ -17,16 +17,21 @@ def packService8TestInto(tcQueue, calledExternally=False): if calledExternally is False: tcQueue.put(("print", "Testing Service 8")) objectId = bytearray([0x44, 0x00, 0xAF, 0xFE]) + # set mode on + tcQueue.put(("print", "\r\nTesting Service 8: Set Normal Mode")) + modeData = packModeData(objectId, 1, 0) + command = PUSTelecommand(service=200, subservice=1, SSC=800, data=modeData) + tcQueue.put(command.packCommandTuple()) # set mode normal tcQueue.put(("print", "\r\nTesting Service 8: Set Normal Mode")) modeData = packModeData(objectId, 2, 0) - command = PUSTelecommand(service=200, subservice=1, SSC=3, data=modeData) + command = PUSTelecommand(service=200, subservice=1, SSC=810, data=modeData) tcQueue.put(command.packCommandTuple()) # Direct command which triggers completion reply tcQueue.put(("print", "\r\nTesting Service 8: Trigger Completion Reply")) actionId = struct.pack(">I", 666) directCommand = objectId + actionId - command = PUSTelecommand(service=8, subservice=128, SSC=810, data=directCommand) + command = PUSTelecommand(service=8, subservice=128, SSC=820, data=directCommand) tcQueue.put(command.packCommandTuple()) # Direct command which triggers data reply tcQueue.put(("print", "\r\nTesting Service 8: Trigger Data Reply")) @@ -34,14 +39,15 @@ def packService8TestInto(tcQueue, calledExternally=False): commandParam1 = bytearray([0xBA, 0xB0]) commandParam2 = bytearray([0x00, 0x00, 0x00, 0x52, 0x4F, 0x42, 0x49, 0x4E]) directCommand = objectId + actionId + commandParam1 + commandParam2 - command = PUSTelecommand(service=8, subservice=128, SSC=820, data=directCommand) + command = PUSTelecommand(service=8, subservice=128, SSC=830, data=directCommand) tcQueue.put(command.packCommandTuple()) # Direct command which triggers an additional step reply and one completion reply tcQueue.put(("print", "\r\nTesting Service 8: Trigger Step and Completion Reply")) actionId = bytearray([0xBA, 0xDE, 0xAF, 0xFE]) directCommand = objectId + actionId - command = PUSTelecommand(service=8, subservice=128, SSC=830, data=directCommand) + command = PUSTelecommand(service=8, subservice=128, SSC=840, data=directCommand) tcQueue.put(command.packCommandTuple()) + tcQueue.put(("wait", 2)) tcQueue.put(("print", "\r")) if calledExternally is False: tcQueue.put(("export", "log/tmtc_log_service8.txt")) diff --git a/test/OBSW_UnitTest.py b/test/OBSW_UnitTest.py index 68f7fb51b719ea27d7a7490209c2889f697e7f52..582e12835ecf3def94afc7579750aef72334731c 100644 --- a/test/OBSW_UnitTest.py +++ b/test/OBSW_UnitTest.py @@ -22,13 +22,17 @@ to be specified in the analyseTcInfo method of the child test. @author: R. Mueller """ +import time import unittest import queue + + from tc.OBSW_TcPacker import packService17TestInto, packService5TestInto, packDummyDeviceTestInto from sendreceive.OBSW_MultipleCommandsSenderReceiver import MultipleCommandSenderReceiver from OBSW_UdpClient import connectToBoard from utility.OBSW_TmTcPrinter import TmtcPrinter from comIF.OBSW_Ethernet_ComIF import EthernetComIF +from comIF.OBSW_Serial_ComIF import SerialComIF import OBSW_Config as g @@ -53,9 +57,13 @@ class TestService(unittest.TestCase): cls.tcTimeoutFactor = 3.0 cls.printFile = True cls.tmtcPrinter = TmtcPrinter(cls.displayMode, cls.printFile, True) - cls.communicationInterface = EthernetComIF(cls.tmtcPrinter, cls.tmTimeout, cls.tcTimeoutFactor, g.sockSend, - g.sockReceive, g.sendAddress) - connectToBoard() + if g.comIF == 0: + cls.communicationInterface = EthernetComIF(cls.tmtcPrinter, g.tmTimeout, g.tcSendTimeoutFactor, + g.sockSend, g.sockReceive, g.sendAddress) + else: + baudRate = 115200 + cls.communicationInterface = SerialComIF(cls.tmtcPrinter, g.comPort, baudRate, g.serialTimeout) + # connectToBoard() def performTestingAndGenerateAssertionDict(self): UnitTester = MultipleCommandSenderReceiver(self.communicationInterface, self.tmtcPrinter, self.testQueue, @@ -158,6 +166,8 @@ class TestService(unittest.TestCase): cls.eventCounter = 0 cls.tcVerifyCounter = 0 cls.testQueue.queue.clear() + if g.comIF == 1: + cls.communicationInterface.serial.close() def analyseTmInfo(self, tmInfoQueue, assertionDict): pass @@ -170,7 +180,7 @@ class TestService5(TestService): super().setUpClass() print("Testing Service 5") cls.waitIntervals = [1, 2, 3] - cls.waitTime = [1.2, 1.5, 1.2] + cls.waitTime = [1.2, 1.5, 1.5] packService5TestInto(cls.testQueue) def test_Service5(self): diff --git a/tm/OBSW_TmPacket.py b/tm/OBSW_TmPacket.py index 98333c41dd631372256b80ea72567d9133ec431f..2806196c85fb8fd588e6d7ca0d2febb5b306a6f5 100644 --- a/tm/OBSW_TmPacket.py +++ b/tm/OBSW_TmPacket.py @@ -7,6 +7,7 @@ Author: R.Mueller, S. Gaisser """ from tm.OBSW_PusTm import PUSTelemetry +from tm.OBSW_TmService1 import Service1TM from tm.OBSW_TmService3 import Service3TM import struct # TM Packets use the generic space packet structure provided by OBSWPusPacket to generate individual @@ -35,66 +36,6 @@ def PUSTelemetryFactory(rawPacket): print("The service " + str(servicetype) + " is not implemented in Telemetry Factory") return PUSTelemetry(rawPacket) - -class Service1TM(PUSTelemetry): - def __init__(self, byteArray): - super().__init__(byteArray) - self.tcErrorCode = False - self.isStep = False - # 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): - super().printTelemetryHeader(array) - array.append(str(hex(self.tcPacketId))) - array.append(str(self.tcSSC)) - if self.tcErrorCode: - if self.isStep: - array.append(str(self.stepNumber)) - array.append(str(hex(self.ErrCode))) - elif self.isStep: - array.append(str(self.stepNumber)) - - def printTelemetryColumnHeaders(self, array): - super().printTelemetryColumnHeaders(array) - array.append("TC Packet ID") - array.append("TC SSC") - if self.tcErrorCode: - if self.isStep: - array.append("Step Number") - array.append("Err. Code") - elif self.isStep: - array.append("Step Number") - - def packTmInformation(self): - tmInformation = super().packTmInformation() - addInformation = { - "tcPacketId": self.tcPacketId, - "tcSSC": self.tcSSC, - } - tmInformation.update(addInformation) - if self.tcErrorCode: - tmInformation.update({"errCode": self.ErrCode}) - if self.isStep: - tmInformation.update({"stepNumber": self.ErrCode}) - return tmInformation - class Service2TM(PUSTelemetry): def __init__(self, byteArray): @@ -197,12 +138,18 @@ class Service200TM(PUSTelemetry): super().__init__(byteArray) self.isCantReachModeReply = False self.isModeReply = False + self.printPacketInfo("Mode Reply") self.objectId = struct.unpack('>I', self.byteArrayData[0:4])[0] if self.dataFieldHeader.subtype == 7: + self.appendPacketInfo(": Can't reach mode") self.isCantReachModeReply = True self.returnValue = self.byteArrayData[4] << 8 | self.byteArrayData[5] elif self.dataFieldHeader.subtype == 6 or self.dataFieldHeader.subtype == 8: self.isModeReply = True + if self.dataFieldHeader.subtype == 8: + self.appendPacketInfo(": Wrong Mode") + elif self.dataFieldHeader.subtype == 6: + self.appendPacketInfo(": Mode reached") self.mode = struct.unpack('>I', self.byteArrayData[4:8])[0] self.submode = self.byteArrayData[8] diff --git a/tm/OBSW_TmService1.py b/tm/OBSW_TmService1.py new file mode 100644 index 0000000000000000000000000000000000000000..bee2f6ff0e114a722ae84605517c661ac2d3b6f5 --- /dev/null +++ b/tm/OBSW_TmService1.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +""" +Program: OBSW_TmService1.py +Date: 30.12.2019 +Description: Deserialize Pus Verification TM +Author: R. Mueller +""" + +from tm.OBSW_PusTm import PUSTelemetry +import struct + + +class Service1TM(PUSTelemetry): + def __init__(self, byteArray): + super().__init__(byteArray) + self.tcErrorCode = False + self.isStep = False + # 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] + self.errorParam1 = struct.unpack('>I', self.byteArrayData[7:11])[0] + self.errorParam2 = struct.unpack('>I', self.byteArrayData[11:15])[0] + else: + self.ErrCode = struct.unpack('>H', self.byteArrayData[4:6])[0] + self.errorParam1 = struct.unpack('>I', self.byteArrayData[6:10])[0] + self.errorParam2 = struct.unpack('>I', self.byteArrayData[10:14])[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): + super().printTelemetryHeader(array) + array.append(str(hex(self.tcPacketId))) + array.append(str(self.tcSSC)) + if self.tcErrorCode: + if self.isStep: + array.append(str(self.stepNumber)) + array.append(str(hex(self.ErrCode))) + array.append(str(hex(self.errorParam1))) + array.append(str(hex(self.errorParam2))) + elif self.isStep: + array.append(str(self.stepNumber)) + + def printTelemetryColumnHeaders(self, array): + super().printTelemetryColumnHeaders(array) + array.append("TC Packet ID") + array.append("TC SSC") + if self.tcErrorCode: + if self.isStep: + array.append("Step Number") + array.append("Return Value") + array.append("Error Param 1") + array.append("Error Param 2") + elif self.isStep: + array.append("Step Number") + + def packTmInformation(self): + tmInformation = super().packTmInformation() + addInformation = { + "tcPacketId": self.tcPacketId, + "tcSSC": self.tcSSC, + } + tmInformation.update(addInformation) + if self.tcErrorCode: + tmInformation.update({"errCode": self.ErrCode}) + if self.isStep: + tmInformation.update({"stepNumber": self.ErrCode}) + return tmInformation \ No newline at end of file diff --git a/tm/OBSW_TmService3.py b/tm/OBSW_TmService3.py index a697e3c17be9723d76d648b8b5bce9ab4f87dffb..03a861e308a5ef57a7f4786c27c3590ac4fa912b 100644 --- a/tm/OBSW_TmService3.py +++ b/tm/OBSW_TmService3.py @@ -1,9 +1,16 @@ # -*- coding: utf-8 -*- """ +<<<<<<< HEAD Program: OBSW_TmPacket.py Date: 30.12.2019 Description: Deserialize Housekeeping TM Author: R.Mueller +======= +Program: OBSW_TmService3.py +Date: 30.12.2019 +Description: Deserialize Housekeeping TM +Author: R. Mueller +>>>>>>> mueller_branch """ from tm.OBSW_PusTm import PUSTelemetry diff --git a/utility/OBSW_TmTcPrinter.py b/utility/OBSW_TmTcPrinter.py index 0157ea6bb5874bb2f0d80ff275b39dd38a0f41ae..f79183238d1e4425bd7e15df89c8919c0003082e 100644 --- a/utility/OBSW_TmTcPrinter.py +++ b/utility/OBSW_TmTcPrinter.py @@ -109,11 +109,18 @@ class TmtcPrinter: self.addPrintBufferToFileBuffer() def handleLongTcPrint(self, pusPacketInfo): - self.printBuffer = "Telecommand TC[" + str(pusPacketInfo["service"]) + "," + str(pusPacketInfo["subservice"]) \ - + "] with SSC " + str(pusPacketInfo["ssc"]) + " sent with data " \ - + self.returnDataString(pusPacketInfo["data"]) - print(self.printBuffer) - self.addPrintBufferToFileBuffer() + try: + self.printBuffer = "Telecommand TC[" + str(pusPacketInfo["service"]) + "," + str(pusPacketInfo["subservice"]) \ + + "] with SSC " + str(pusPacketInfo["ssc"]) + " sent with data " \ + + self.returnDataString(pusPacketInfo["data"]) + print(self.printBuffer) + self.addPrintBufferToFileBuffer() + except TypeError: + print("TMTC Printer: Type Error !") + + def printData(self, byteArray): + string = self.returnDataString(byteArray) + print(string) @staticmethod def returnDataString(byteArray):