diff --git a/.run/TV Test.run.xml b/.run/TV Test.run.xml
new file mode 100644
index 0000000..4f51449
--- /dev/null
+++ b/.run/TV Test.run.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/tmtcloop.run.xml b/.run/tmtcloop.run.xml
new file mode 100644
index 0000000..ee5f5f7
--- /dev/null
+++ b/.run/tmtcloop.run.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5a00ec9..2ebbb55 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,26 @@ list yields a list of all related PRs for each release.
# [unreleased]
+# [v1.12.0]
+
+- Update GPS HK Parsing
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/86
+- PL PCDU HK Parsing
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/87
+- Add full regular reboot command
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/85
+- Add Rad Sensor HK parsing
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/81
+- Add procedures, parser functions and general application functionalities
+ for the thermal-vacuum test. This includes daemon functionality to poll
+ all Telemetry even when there is no operator present
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/76
+ https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/74
+ https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/79
+ https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/73
+- Add ACU HK parsing
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/80
+
# [v1.11.0]
- Add `setup.cfg` and `setup.py` file, allowing package installation
diff --git a/README.md b/README.md
index 1a32765..6b72ac8 100644
--- a/README.md
+++ b/README.md
@@ -49,7 +49,7 @@ Run GUI mode
1. Create virtual environment
```sh
- py -m venv .
+ py -m venv venv
```
2. Activate virtual environment
diff --git a/config/definitions.py b/config/definitions.py
index c98e7da..c12a6d2 100644
--- a/config/definitions.py
+++ b/config/definitions.py
@@ -34,8 +34,7 @@ class CustomServiceList(enum.Enum):
REACTION_WHEEL_4 = "rw-4"
RW_ASSEMBLY = "rw-ass"
RAD_SENSOR = "rad_sensor"
- GPS_0 = "gps0"
- GPS_1 = "gps1"
+ GPS_CTRL = "gnss-ctrl"
PLOC_MEMORY_DUMPER = "ploc_memory_dumper"
CORE = "core"
STAR_TRACKER = "star_tracker"
@@ -47,3 +46,7 @@ class CustomServiceList(enum.Enum):
SUS_ASS = "sus-ass"
TCS_ASS = "tcs-ass"
TIME = "time"
+ PROCEDURE = "proc"
+ RTD = "rtd"
+ TVTTESTPROCEDURE = "tvtestproc"
+ CONTROLLERS = "controllers"
diff --git a/config/events.csv b/config/events.csv
index c16f83f..37a14d7 100644
--- a/config/events.csv
+++ b/config/events.csv
@@ -1,204 +1,207 @@
-2200;0x0898;STORE_SEND_WRITE_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2201;0x0899;STORE_WRITE_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2202;0x089a;STORE_SEND_READ_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2203;0x089b;STORE_READ_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2204;0x089c;UNEXPECTED_MSG;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2205;0x089d;STORING_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2206;0x089e;TM_DUMP_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2207;0x089f;STORE_INIT_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2208;0x08a0;STORE_INIT_EMPTY;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2209;0x08a1;STORE_CONTENT_CORRUPTED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2210;0x08a2;STORE_INITIALIZE;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2211;0x08a3;INIT_DONE;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2212;0x08a4;DUMP_FINISHED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2213;0x08a5;DELETION_FINISHED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2214;0x08a6;DELETION_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2215;0x08a7;AUTO_CATALOGS_SENDING_FAILED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
-2600;0x0a28;GET_DATA_FAILED;LOW;;fsfw/src/fsfw/storagemanager/StorageManagerIF.h
-2601;0x0a29;STORE_DATA_FAILED;LOW;;fsfw/src/fsfw/storagemanager/StorageManagerIF.h
-2800;0x0af0;DEVICE_BUILDING_COMMAND_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2801;0x0af1;DEVICE_SENDING_COMMAND_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2802;0x0af2;DEVICE_REQUESTING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2803;0x0af3;DEVICE_READING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2804;0x0af4;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2805;0x0af5;DEVICE_MISSED_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2806;0x0af6;DEVICE_UNKNOWN_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2807;0x0af7;DEVICE_UNREQUESTED_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2808;0x0af8;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2809;0x0af9;MONITORING_LIMIT_EXCEEDED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2810;0x0afa;MONITORING_AMBIGUOUS;HIGH;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-2811;0x0afb;DEVICE_WANTS_HARD_REBOOT;HIGH;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
-4201;0x1069;FUSE_CURRENT_HIGH;LOW;;fsfw/src/fsfw/power/Fuse.h
-4202;0x106a;FUSE_WENT_OFF;LOW;;fsfw/src/fsfw/power/Fuse.h
-4204;0x106c;POWER_ABOVE_HIGH_LIMIT;LOW;;fsfw/src/fsfw/power/Fuse.h
-4205;0x106d;POWER_BELOW_LOW_LIMIT;LOW;;fsfw/src/fsfw/power/Fuse.h
-4300;0x10cc;SWITCH_WENT_OFF;LOW;;fsfw/src/fsfw/power/PowerSwitchIF.h
-5000;0x1388;HEATER_ON;INFO;;fsfw/src/fsfw/thermal/Heater.h
-5001;0x1389;HEATER_OFF;INFO;;fsfw/src/fsfw/thermal/Heater.h
-5002;0x138a;HEATER_TIMEOUT;LOW;;fsfw/src/fsfw/thermal/Heater.h
-5003;0x138b;HEATER_STAYED_ON;LOW;;fsfw/src/fsfw/thermal/Heater.h
-5004;0x138c;HEATER_STAYED_OFF;LOW;;fsfw/src/fsfw/thermal/Heater.h
-5200;0x1450;TEMP_SENSOR_HIGH;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
-5201;0x1451;TEMP_SENSOR_LOW;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
-5202;0x1452;TEMP_SENSOR_GRADIENT;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
-5901;0x170d;COMPONENT_TEMP_LOW;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
-5902;0x170e;COMPONENT_TEMP_HIGH;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
-5903;0x170f;COMPONENT_TEMP_OOL_LOW;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
-5904;0x1710;COMPONENT_TEMP_OOL_HIGH;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
-5905;0x1711;TEMP_NOT_IN_OP_RANGE;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
-7101;0x1bbd;FDIR_CHANGED_STATE;INFO;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
-7102;0x1bbe;FDIR_STARTS_RECOVERY;MEDIUM;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
-7103;0x1bbf;FDIR_TURNS_OFF_DEVICE;MEDIUM;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
-7201;0x1c21;MONITOR_CHANGED_STATE;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
-7202;0x1c22;VALUE_BELOW_LOW_LIMIT;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
-7203;0x1c23;VALUE_ABOVE_HIGH_LIMIT;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
-7204;0x1c24;VALUE_OUT_OF_RANGE;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
-7400;0x1ce8;CHANGING_MODE;INFO;;fsfw/src/fsfw/modes/HasModesIF.h
-7401;0x1ce9;MODE_INFO;INFO;;fsfw/src/fsfw/modes/HasModesIF.h
-7402;0x1cea;FALLBACK_FAILED;HIGH;;fsfw/src/fsfw/modes/HasModesIF.h
-7403;0x1ceb;MODE_TRANSITION_FAILED;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
-7404;0x1cec;CANT_KEEP_MODE;HIGH;;fsfw/src/fsfw/modes/HasModesIF.h
-7405;0x1ced;OBJECT_IN_INVALID_MODE;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
-7406;0x1cee;FORCING_MODE;MEDIUM;;fsfw/src/fsfw/modes/HasModesIF.h
-7407;0x1cef;MODE_CMD_REJECTED;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
-7506;0x1d52;HEALTH_INFO;INFO;;fsfw/src/fsfw/health/HasHealthIF.h
-7507;0x1d53;CHILD_CHANGED_HEALTH;INFO;;fsfw/src/fsfw/health/HasHealthIF.h
-7508;0x1d54;CHILD_PROBLEMS;LOW;;fsfw/src/fsfw/health/HasHealthIF.h
-7509;0x1d55;OVERWRITING_HEALTH;LOW;;fsfw/src/fsfw/health/HasHealthIF.h
-7510;0x1d56;TRYING_RECOVERY;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
-7511;0x1d57;RECOVERY_STEP;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
-7512;0x1d58;RECOVERY_DONE;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
-7900;0x1edc;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-7901;0x1edd;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
-8900;0x22c4;CLOCK_SET;INFO;;fsfw/src/fsfw/pus/Service9TimeManagement.h
-8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw/src/fsfw/pus/Service9TimeManagement.h
-9700;0x25e4;TEST;INFO;;fsfw/src/fsfw/pus/Service17Test.h
-10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
-11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
-11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
-11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
-11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
-11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission/devices/HeaterHandler.h
-11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;;mission/devices/HeaterHandler.h
-11402;0x2c8a;HEATER_WENT_ON;INFO;;mission/devices/HeaterHandler.h
-11403;0x2c8b;HEATER_WENT_OFF;INFO;;mission/devices/HeaterHandler.h
-11404;0x2c8c;SWITCH_ALREADY_ON;LOW;;mission/devices/HeaterHandler.h
-11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;;mission/devices/HeaterHandler.h
-11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;;mission/devices/HeaterHandler.h
-11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;;mission/devices/HeaterHandler.h
-11500;0x2cec;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
-11501;0x2ced;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
-11502;0x2cee;DEPLOYMENT_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
-11503;0x2cef;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
-11504;0x2cf0;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
-11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/devices/ploc/PlocMPSoCHandler.h
-11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h
-11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h
-11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/devices/ploc/PlocMPSoCHandler.h
-11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHandler.h
-11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/devices/ploc/PlocMPSoCHandler.h
-11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
-11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/IMTQHandler.h
-11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/RwDefinitions.h
-11802;0x2e1a;RESET_OCCURED;LOW;;mission/devices/devicedefinitions/RwDefinitions.h
-11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
-11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
-12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h
-12002;0x2ee2;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/devices/ploc/PlocSupervisorHandler.h
-12003;0x2ee3;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/devices/ploc/PlocSupervisorHandler.h
-12004;0x2ee4;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/devices/ploc/PlocSupervisorHandler.h
-12005;0x2ee5;SUPV_MPSOC_SHUWDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/devices/ploc/PlocSupervisorHandler.h
-12100;0x2f44;SANITIZATION_FAILED;LOW;;bsp_q7s/memory/SdCardManager.h
-12101;0x2f45;MOUNTED_SD_CARD;INFO;;bsp_q7s/memory/SdCardManager.h
-12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/devices/ploc/PlocMemoryDumper.h
-12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/devices/ploc/PlocMemoryDumper.h
-12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/devices/ploc/PlocMemoryDumper.h
-12401;0x3071;INVALID_TC_FRAME;HIGH;;linux/obc/PdecHandler.h
-12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/obc/PdecHandler.h
-12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/obc/PdecHandler.h
-12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/obc/PdecHandler.h
-12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h
-12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h
-12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h
-12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/devices/startracker/StrHelper.h
-12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/devices/startracker/StrHelper.h
-12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/devices/startracker/StrHelper.h
-12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/devices/startracker/StrHelper.h
-12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/devices/startracker/StrHelper.h
-12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/devices/startracker/StrHelper.h
-12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
-12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
-12511;0x30df;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux/devices/startracker/StrHelper.h
-12512;0x30e0;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/devices/startracker/StrHelper.h
-12513;0x30e1;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/devices/startracker/StrHelper.h
-12514;0x30e2;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/devices/startracker/StrHelper.h
-12515;0x30e3;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux/devices/startracker/StrHelper.h
-12516;0x30e4;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux/devices/startracker/StrHelper.h
-12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/devices/ploc/PlocMPSoCHelper.h
-12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/devices/ploc/PlocMPSoCHelper.h
-12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;;linux/devices/ploc/PlocMPSoCHelper.h
-12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
-12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
-12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
-12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
-12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
-12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
-12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
-12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
-12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHelper.h
-12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/devices/PayloadPcduHandler.h
-12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
-12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission/system/AcsBoardAssembly.h
-12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/AcsBoardAssembly.h
-12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/AcsBoardAssembly.h
-12803;0x3203;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/AcsBoardAssembly.h
-12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission/system/SusAssembly.h
-12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/SusAssembly.h
-12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/SusAssembly.h
-12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/SusAssembly.h
-13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;;mission/system/TcsBoardAssembly.h
-13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/devices/devicedefinitions/GPSDefinitions.h
-13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/devices/P60DockHandler.h
-13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/devices/P60DockHandler.h
-13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/devices/P60DockHandler.h
-13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux/devices/ploc/PlocSupvHelper.h
-13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux/devices/ploc/PlocSupvHelper.h
-13602;0x3522;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux/devices/ploc/PlocSupvHelper.h
-13603;0x3523;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux/devices/ploc/PlocSupvHelper.h
-13604;0x3524;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux/devices/ploc/PlocSupvHelper.h
-13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux/devices/ploc/PlocSupvHelper.h
-13606;0x3526;SUPV_SENDING_COMMAND_FAILED;LOW;;linux/devices/ploc/PlocSupvHelper.h
-13607;0x3527;SUPV_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h
-13608;0x3528;SUPV_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h
-13609;0x3529;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocSupvHelper.h
-13610;0x352a;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h
-13611;0x352b;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h
-13612;0x352c;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux/devices/ploc/PlocSupvHelper.h
-13613;0x352d;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h
-13614;0x352e;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h
-13615;0x352f;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux/devices/ploc/PlocSupvHelper.h
-13616;0x3530;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux/devices/ploc/PlocSupvHelper.h
-13617;0x3531;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet with number P1 P1: Packet number for which the memory write command fails;linux/devices/ploc/PlocSupvHelper.h
-13700;0x3584;ALLOC_FAILURE;MEDIUM;;bsp_q7s/core/CoreController.h
-13701;0x3585;REBOOT_SW;MEDIUM; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
-13702;0x3586;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s/core/CoreController.h
-13703;0x3587;REBOOT_HW;MEDIUM;;bsp_q7s/core/CoreController.h
+2200;0x0898;STORE_SEND_WRITE_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2201;0x0899;STORE_WRITE_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2202;0x089a;STORE_SEND_READ_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2203;0x089b;STORE_READ_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2204;0x089c;UNEXPECTED_MSG;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2205;0x089d;STORING_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2206;0x089e;TM_DUMP_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2207;0x089f;STORE_INIT_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2208;0x08a0;STORE_INIT_EMPTY;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2209;0x08a1;STORE_CONTENT_CORRUPTED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2210;0x08a2;STORE_INITIALIZE;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2211;0x08a3;INIT_DONE;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2212;0x08a4;DUMP_FINISHED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2213;0x08a5;DELETION_FINISHED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2214;0x08a6;DELETION_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2215;0x08a7;AUTO_CATALOGS_SENDING_FAILED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
+2600;0x0a28;GET_DATA_FAILED;LOW;;fsfw\src\fsfw\storagemanager\StorageManagerIF.h
+2601;0x0a29;STORE_DATA_FAILED;LOW;;fsfw\src\fsfw\storagemanager\StorageManagerIF.h
+2800;0x0af0;DEVICE_BUILDING_COMMAND_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2801;0x0af1;DEVICE_SENDING_COMMAND_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2802;0x0af2;DEVICE_REQUESTING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2803;0x0af3;DEVICE_READING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2804;0x0af4;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2805;0x0af5;DEVICE_MISSED_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2806;0x0af6;DEVICE_UNKNOWN_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2807;0x0af7;DEVICE_UNREQUESTED_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2808;0x0af8;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2809;0x0af9;MONITORING_LIMIT_EXCEEDED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2810;0x0afa;MONITORING_AMBIGUOUS;HIGH;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+2811;0x0afb;DEVICE_WANTS_HARD_REBOOT;HIGH;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
+4201;0x1069;FUSE_CURRENT_HIGH;LOW;;fsfw\src\fsfw\power\Fuse.h
+4202;0x106a;FUSE_WENT_OFF;LOW;;fsfw\src\fsfw\power\Fuse.h
+4204;0x106c;POWER_ABOVE_HIGH_LIMIT;LOW;;fsfw\src\fsfw\power\Fuse.h
+4205;0x106d;POWER_BELOW_LOW_LIMIT;LOW;;fsfw\src\fsfw\power\Fuse.h
+4300;0x10cc;SWITCH_WENT_OFF;LOW;;fsfw\src\fsfw\power\PowerSwitchIF.h
+5000;0x1388;HEATER_ON;INFO;;fsfw\src\fsfw\thermal\Heater.h
+5001;0x1389;HEATER_OFF;INFO;;fsfw\src\fsfw\thermal\Heater.h
+5002;0x138a;HEATER_TIMEOUT;LOW;;fsfw\src\fsfw\thermal\Heater.h
+5003;0x138b;HEATER_STAYED_ON;LOW;;fsfw\src\fsfw\thermal\Heater.h
+5004;0x138c;HEATER_STAYED_OFF;LOW;;fsfw\src\fsfw\thermal\Heater.h
+5200;0x1450;TEMP_SENSOR_HIGH;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h
+5201;0x1451;TEMP_SENSOR_LOW;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h
+5202;0x1452;TEMP_SENSOR_GRADIENT;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h
+5901;0x170d;COMPONENT_TEMP_LOW;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
+5902;0x170e;COMPONENT_TEMP_HIGH;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
+5903;0x170f;COMPONENT_TEMP_OOL_LOW;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
+5904;0x1710;COMPONENT_TEMP_OOL_HIGH;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
+5905;0x1711;TEMP_NOT_IN_OP_RANGE;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
+7101;0x1bbd;FDIR_CHANGED_STATE;INFO;;fsfw\src\fsfw\fdir\FailureIsolationBase.h
+7102;0x1bbe;FDIR_STARTS_RECOVERY;MEDIUM;;fsfw\src\fsfw\fdir\FailureIsolationBase.h
+7103;0x1bbf;FDIR_TURNS_OFF_DEVICE;MEDIUM;;fsfw\src\fsfw\fdir\FailureIsolationBase.h
+7201;0x1c21;MONITOR_CHANGED_STATE;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h
+7202;0x1c22;VALUE_BELOW_LOW_LIMIT;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h
+7203;0x1c23;VALUE_ABOVE_HIGH_LIMIT;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h
+7204;0x1c24;VALUE_OUT_OF_RANGE;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h
+7400;0x1ce8;CHANGING_MODE;INFO;;fsfw\src\fsfw\modes\HasModesIF.h
+7401;0x1ce9;MODE_INFO;INFO;;fsfw\src\fsfw\modes\HasModesIF.h
+7402;0x1cea;FALLBACK_FAILED;HIGH;;fsfw\src\fsfw\modes\HasModesIF.h
+7403;0x1ceb;MODE_TRANSITION_FAILED;LOW;;fsfw\src\fsfw\modes\HasModesIF.h
+7404;0x1cec;CANT_KEEP_MODE;HIGH;;fsfw\src\fsfw\modes\HasModesIF.h
+7405;0x1ced;OBJECT_IN_INVALID_MODE;LOW;;fsfw\src\fsfw\modes\HasModesIF.h
+7406;0x1cee;FORCING_MODE;MEDIUM;;fsfw\src\fsfw\modes\HasModesIF.h
+7407;0x1cef;MODE_CMD_REJECTED;LOW;;fsfw\src\fsfw\modes\HasModesIF.h
+7506;0x1d52;HEALTH_INFO;INFO;;fsfw\src\fsfw\health\HasHealthIF.h
+7507;0x1d53;CHILD_CHANGED_HEALTH;INFO;;fsfw\src\fsfw\health\HasHealthIF.h
+7508;0x1d54;CHILD_PROBLEMS;LOW;;fsfw\src\fsfw\health\HasHealthIF.h
+7509;0x1d55;OVERWRITING_HEALTH;LOW;;fsfw\src\fsfw\health\HasHealthIF.h
+7510;0x1d56;TRYING_RECOVERY;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h
+7511;0x1d57;RECOVERY_STEP;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h
+7512;0x1d58;RECOVERY_DONE;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h
+7900;0x1edc;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
+7901;0x1edd;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
+7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
+7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
+7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
+8900;0x22c4;CLOCK_SET;INFO;;fsfw\src\fsfw\pus\Service9TimeManagement.h
+8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw\src\fsfw\pus\Service9TimeManagement.h
+9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw\src\fsfw\pus\Service11TelecommandScheduling.h
+9700;0x25e4;TEST;INFO;;fsfw\src\fsfw\pus\Service17Test.h
+10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw\hal\src\fsfw_hal\devicehandlers\MgmLIS3MDLHandler.h
+11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission\devices\devicedefinitions\powerDefinitions.h
+11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission\devices\devicedefinitions\powerDefinitions.h
+11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;;mission\devices\devicedefinitions\powerDefinitions.h
+11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;;mission\devices\devicedefinitions\powerDefinitions.h
+11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission\devices\HeaterHandler.h
+11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;;mission\devices\HeaterHandler.h
+11402;0x2c8a;HEATER_WENT_ON;INFO;;mission\devices\HeaterHandler.h
+11403;0x2c8b;HEATER_WENT_OFF;INFO;;mission\devices\HeaterHandler.h
+11404;0x2c8c;SWITCH_ALREADY_ON;LOW;;mission\devices\HeaterHandler.h
+11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;;mission\devices\HeaterHandler.h
+11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;;mission\devices\HeaterHandler.h
+11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;;mission\devices\HeaterHandler.h
+11500;0x2cec;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h
+11501;0x2ced;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h
+11502;0x2cee;DEPLOYMENT_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
+11503;0x2cef;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
+11504;0x2cf0;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
+11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux\devices\ploc\PlocMPSoCHandler.h
+11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux\devices\ploc\PlocMPSoCHandler.h
+11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux\devices\ploc\PlocMPSoCHandler.h
+11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux\devices\ploc\PlocMPSoCHandler.h
+11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux\devices\ploc\PlocMPSoCHandler.h
+11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux\devices\ploc\PlocMPSoCHandler.h
+11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
+11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
+11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
+11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
+11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
+11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
+11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
+11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission\devices\IMTQHandler.h
+11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission\devices\devicedefinitions\RwDefinitions.h
+11802;0x2e1a;RESET_OCCURED;LOW;;mission\devices\devicedefinitions\RwDefinitions.h
+11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux\devices\startracker\StarTrackerHandler.h
+11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux\devices\startracker\StarTrackerHandler.h
+12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux\devices\ploc\PlocSupervisorHandler.h
+12002;0x2ee2;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux\devices\ploc\PlocSupervisorHandler.h
+12003;0x2ee3;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux\devices\ploc\PlocSupervisorHandler.h
+12004;0x2ee4;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux\devices\ploc\PlocSupervisorHandler.h
+12005;0x2ee5;SUPV_MPSOC_SHUWDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux\devices\ploc\PlocSupervisorHandler.h
+12100;0x2f44;SANITIZATION_FAILED;LOW;;bsp_q7s\memory\SdCardManager.h
+12101;0x2f45;MOUNTED_SD_CARD;INFO;;bsp_q7s\memory\SdCardManager.h
+12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux\devices\ploc\PlocMemoryDumper.h
+12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux\devices\ploc\PlocMemoryDumper.h
+12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux\devices\ploc\PlocMemoryDumper.h
+12401;0x3071;INVALID_TC_FRAME;HIGH;;linux\obc\PdecHandler.h
+12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux\obc\PdecHandler.h
+12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux\obc\PdecHandler.h
+12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux\obc\PdecHandler.h
+12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux\devices\startracker\StrHelper.h
+12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux\devices\startracker\StrHelper.h
+12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux\devices\startracker\StrHelper.h
+12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux\devices\startracker\StrHelper.h
+12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux\devices\startracker\StrHelper.h
+12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux\devices\startracker\StrHelper.h
+12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux\devices\startracker\StrHelper.h
+12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux\devices\startracker\StrHelper.h
+12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux\devices\startracker\StrHelper.h
+12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux\devices\startracker\StrHelper.h
+12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux\devices\startracker\StrHelper.h
+12511;0x30df;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux\devices\startracker\StrHelper.h
+12512;0x30e0;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux\devices\startracker\StrHelper.h
+12513;0x30e1;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux\devices\startracker\StrHelper.h
+12514;0x30e2;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux\devices\startracker\StrHelper.h
+12515;0x30e3;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux\devices\startracker\StrHelper.h
+12516;0x30e4;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux\devices\startracker\StrHelper.h
+12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux\devices\ploc\PlocMPSoCHelper.h
+12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux\devices\ploc\PlocMPSoCHelper.h
+12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;;linux\devices\ploc\PlocMPSoCHelper.h
+12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
+12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
+12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
+12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
+12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h
+12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h
+12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h
+12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h
+12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux\devices\ploc\PlocMPSoCHelper.h
+12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission\devices\PayloadPcduHandler.h
+12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
+12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission\system\AcsBoardAssembly.h
+12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission\system\AcsBoardAssembly.h
+12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission\system\AcsBoardAssembly.h
+12803;0x3203;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission\system\AcsBoardAssembly.h
+12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission\system\SusAssembly.h
+12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission\system\SusAssembly.h
+12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission\system\SusAssembly.h
+12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission\system\SusAssembly.h
+13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;;mission\system\TcsBoardAssembly.h
+13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission\devices\devicedefinitions\GPSDefinitions.h
+13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission\devices\P60DockHandler.h
+13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission\devices\P60DockHandler.h
+13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission\devices\P60DockHandler.h
+13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux\devices\ploc\PlocSupvHelper.h
+13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux\devices\ploc\PlocSupvHelper.h
+13602;0x3522;SUPV_CONTINUE_UPDATE_FAILED;LOW;Continue update command failed;linux\devices\ploc\PlocSupvHelper.h
+13603;0x3523;SUPV_CONTINUE_UPDATE_SUCCESSFUL;LOW;Continue update command successful;linux\devices\ploc\PlocSupvHelper.h
+13604;0x3524;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux\devices\ploc\PlocSupvHelper.h
+13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux\devices\ploc\PlocSupvHelper.h
+13606;0x3526;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux\devices\ploc\PlocSupvHelper.h
+13607;0x3527;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux\devices\ploc\PlocSupvHelper.h
+13608;0x3528;SUPV_SENDING_COMMAND_FAILED;LOW;;linux\devices\ploc\PlocSupvHelper.h
+13609;0x3529;SUPV_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h
+13610;0x352a;SUPV_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h
+13611;0x352b;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux\devices\ploc\PlocSupvHelper.h
+13612;0x352c;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h
+13613;0x352d;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h
+13614;0x352e;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux\devices\ploc\PlocSupvHelper.h
+13615;0x352f;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h
+13616;0x3530;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h
+13617;0x3531;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux\devices\ploc\PlocSupvHelper.h
+13618;0x3532;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux\devices\ploc\PlocSupvHelper.h
+13619;0x3533;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet with number P1 P1: Packet number for which the memory write command fails;linux\devices\ploc\PlocSupvHelper.h
+13700;0x3584;ALLOC_FAILURE;MEDIUM;;bsp_q7s\core\CoreController.h
+13701;0x3585;REBOOT_SW;MEDIUM; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s\core\CoreController.h
+13702;0x3586;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s\core\CoreController.h
+13703;0x3587;REBOOT_HW;MEDIUM;;bsp_q7s\core\CoreController.h
diff --git a/config/object_ids.py b/config/object_ids.py
index 7242c20..826da95 100644
--- a/config/object_ids.py
+++ b/config/object_ids.py
@@ -27,6 +27,7 @@ ACU_HANDLER_ID = bytes([0x44, 0x25, 0x00, 0x03])
BPX_HANDLER_ID = bytes([0x44, 0x26, 0x00, 0x00])
# Thermal Object IDs
+THERMAL_CONTROLLER_ID = bytes([0x43, 0x40, 0x00, 0x01])
HEATER_ID = bytes([0x44, 0x41, 0x00, 0xA4])
TMP_1075_1_HANDLER_ID = bytes([0x44, 0x42, 0x00, 0x04])
TMP_1075_2_HANDLER_ID = bytes([0x44, 0x42, 0x00, 0x05])
@@ -35,16 +36,15 @@ TMP_1075_2_HANDLER_ID = bytes([0x44, 0x42, 0x00, 0x05])
SYRLINKS_HANDLER_ID = bytes([0x44, 0x53, 0x00, 0xA3])
# ACS Object IDs
-MGM_0_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x06])
-MGM_1_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x07])
-MGM_2_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x08])
-MGM_3_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x09])
-GYRO_0_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x10])
-GYRO_1_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x11])
-GYRO_2_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x12])
-GYRO_3_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x13])
-GPS_HANDLER_0_ID = bytes([0x44, 0x13, 0x00, 0x45])
-GPS_HANDLER_1_ID = bytes([0x44, 0x13, 0x01, 0x46])
+MGM_0_LIS3_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x06])
+MGM_1_RM3100_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x07])
+MGM_2_LIS3_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x08])
+MGM_3_RM3100_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x09])
+GYRO_0_ADIS_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x10])
+GYRO_1_L3G_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x11])
+GYRO_2_ADIS_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x12])
+GYRO_3_L3G_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x13])
+GPS_CONTROLLER = bytes([0x44, 0x13, 0x00, 0x45])
RW1_ID = bytes([0x44, 0x12, 0x00, 0x47])
RW2_ID = bytes([0x44, 0x12, 0x01, 0x48])
RW3_ID = bytes([0x44, 0x12, 0x02, 0x49])
@@ -76,6 +76,51 @@ HEATER_5_STR = bytes([0x60, 0x00, 0x00, 0x05])
HEATER_6_DRO = bytes([0x60, 0x00, 0x00, 0x06])
HEATER_7_HPA = bytes([0x60, 0x00, 0x00, 0x07])
+# RTDs
+RTD_0_PLOC_HSPD = bytes([0x44, 0x42, 0x00, 0x16])
+RTD_1_PLOC_MISSIONBRD = bytes([0x44, 0x42, 0x00, 0x17])
+RTD_2_4K_CAM = bytes([0x44, 0x42, 0x00, 0x18])
+RTD_3_DAC_HSPD = bytes([0x44, 0x42, 0x00, 0x19])
+RTD_4_STR = bytes([0x44, 0x42, 0x00, 0x20])
+RTD_5_RW1_MX_MY = bytes([0x44, 0x42, 0x00, 0x21])
+RTD_6_DRO = bytes([0x44, 0x42, 0x00, 0x22])
+RTD_7_SCEX = bytes([0x44, 0x42, 0x00, 0x23])
+RTD_8_X8 = bytes([0x44, 0x42, 0x00, 0x24])
+RTD_9_HPA = bytes([0x44, 0x42, 0x00, 0x25])
+RTD_10_PL_TX = bytes([0x44, 0x42, 0x00, 0x26])
+RTD_11_MPA = bytes([0x44, 0x42, 0x00, 0x27])
+RTD_12_ACU = bytes([0x44, 0x42, 0x00, 0x28])
+RTD_13_PLPCDU_HSPD = bytes([0x44, 0x42, 0x00, 0x29])
+RTD_14_TCS_BRD = bytes([0x44, 0x42, 0x00, 0x30])
+RTD_15_IMTQ = bytes([0x44, 0x42, 0x00, 0x31])
+
+# SUS
+"""
+Name convention for SUS devices
+SUS___LOC_XYZ_PT_
+LOC: Location
+PT: Pointing
+N/R: Nominal/Redundant
+F/M/B: Forward/Middle/Backwards
+"""
+SUS_0_N_LOC_XFYFZM_PT_XF = bytes([0x44, 0x12, 0x00, 0x32])
+SUS_6_R_LOC_XFYBZM_PT_XF = bytes([0x44, 0x12, 0x00, 0x38])
+
+SUS_1_N_LOC_XBYFZM_PT_XB = bytes([0x44, 0x12, 0x00, 0x33])
+SUS_7_R_LOC_XBYBZM_PT_XB = bytes([0x44, 0x12, 0x00, 0x39])
+
+SUS_2_N_LOC_XFYBZB_PT_YB = bytes([0x44, 0x12, 0x00, 0x34])
+SUS_8_R_LOC_XBYBZB_PT_YB = bytes([0x44, 0x12, 0x00, 0x40])
+
+SUS_3_N_LOC_XFYBZF_PT_YF = bytes([0x44, 0x12, 0x00, 0x35])
+SUS_9_R_LOC_XBYBZB_PT_YF = bytes([0x44, 0x12, 0x00, 0x41])
+
+SUS_4_N_LOC_XMYFZF_PT_ZF = bytes([0x44, 0x12, 0x00, 0x36])
+SUS_10_R_LOC_XMYBZF_PT_ZF = bytes([0x44, 0x12, 0x00, 0x42])
+
+SUS_5_N_LOC_XFYMZB_PT_ZB = bytes([0x44, 0x12, 0x00, 0x37])
+SUS_11_R_LOC_XBYMZB_PT_ZB = bytes([0x44, 0x12, 0x00, 0x43])
+
# System and Assembly Objects
ACS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x01])
SUS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x02])
diff --git a/config/objects.csv b/config/objects.csv
index 432a50b..f0d29ee 100644
--- a/config/objects.csv
+++ b/config/objects.csv
@@ -37,6 +37,7 @@
0x44260000;BPX_BATT_HANDLER
0x44300000;PLPCDU_HANDLER
0x443200A5;RAD_SENSOR
+0x44330000;PLOC_UPDATER
0x44330001;PLOC_MEMORY_DUMPER
0x44330002;STR_HELPER
0x44330003;PLOC_MPSOC_HELPER
@@ -70,6 +71,7 @@
0x49010005;GPIO_IF
0x49020004;SPI_MAIN_COM_IF
0x49020005;SPI_RW_COM_IF
+0x49020006;SPI_RTD_COM_IF
0x49030003;UART_COM_IF
0x49040002;I2C_COM_IF
0x49050001;CSP_COM_IF
@@ -90,6 +92,7 @@
0x53000005;PUS_SERVICE_5_EVENT_REPORTING
0x53000008;PUS_SERVICE_8_FUNCTION_MGMT
0x53000009;PUS_SERVICE_9_TIME_MGMT
+0x53000011;PUS_SERVICE_11_TC_SCHEDULER
0x53000017;PUS_SERVICE_17_TEST
0x53000020;PUS_SERVICE_20_PARAMETERS
0x53000200;PUS_SERVICE_200_MODE_MGMT
diff --git a/config/returnvalues.csv b/config/returnvalues.csv
index b25649f..ab5c75b 100644
--- a/config/returnvalues.csv
+++ b/config/returnvalues.csv
@@ -1,558 +1,562 @@
0x0;OK;System-wide code for ok.;RETURN_OK;HasReturnvaluesIF.h;HasReturnvaluesIF
0x1;Failed;Unspecified system-wide code for failed.;RETURN_FAILED;HasReturnvaluesIF.h;HasReturnvaluesIF
-0x63a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;0xA0;mission/tmtc/CCSDSHandler.h;CCSDS_HANDLER
-0x69a0;SADPL_CommandNotSupported;;0xA0;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x69a1;SADPL_DeploymentAlreadyExecuting;;0xA1;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x69a2;SADPL_MainSwitchTimeoutFailure;;0xA2;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x69a3;SADPL_SwitchingDeplSa1Failed;;0xA3;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x69a4;SADPL_SwitchingDeplSa2Failed;;0xA4;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
-0x5ba0;SUSS_ErrorUnlockMutex;;0xA0;mission/devices/SusHandler.h;SUS_HANDLER
-0x5ba1;SUSS_ErrorLockMutex;;0xA1;mission/devices/SusHandler.h;SUS_HANDLER
-0x55b0;RWHA_SpiWriteFailure;;0xB0;mission/devices/RwHandler.h;RW_HANDLER
-0x55b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;0xB1;mission/devices/RwHandler.h;RW_HANDLER
-0x55b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;0xB2;mission/devices/RwHandler.h;RW_HANDLER
-0x55b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;0xB3;mission/devices/RwHandler.h;RW_HANDLER
-0x55b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;0xB4;mission/devices/RwHandler.h;RW_HANDLER
-0x55b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;0xB5;mission/devices/RwHandler.h;RW_HANDLER
-0x55b6;RWHA_NoStartMarker;Expected a start marker as first byte;0xB6;mission/devices/RwHandler.h;RW_HANDLER
-0x55a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000; 1000] or [1000; 65000];0xA0;mission/devices/RwHandler.h;RW_HANDLER
-0x55a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;0xA1;mission/devices/RwHandler.h;RW_HANDLER
-0x55a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;0xA2;mission/devices/RwHandler.h;RW_HANDLER
-0x55a3;RWHA_ExecutionFailed;Command execution failed;0xA3;mission/devices/RwHandler.h;RW_HANDLER
-0x55a4;RWHA_CrcError;Reaction wheel reply has invalid crc;0xA4;mission/devices/RwHandler.h;RW_HANDLER
-0x54a0;IMTQ_InvalidCommandCode;;0xA0;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a1;IMTQ_ParameterMissing;;0xA1;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a2;IMTQ_ParameterInvalid;;0xA2;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a3;IMTQ_CcUnavailable;;0xA3;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a4;IMTQ_InternalProcessingError;;0xA4;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a5;IMTQ_RejectedWithoutReason;;0xA5;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a6;IMTQ_CmdErrUnknown;;0xA6;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x54a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;0xA7;mission/devices/IMTQHandler.h;IMTQ_HANDLER
-0x52a1;HEATER_CommandNotSupported;;0xA1;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x52a2;HEATER_InitFailed;;0xA2;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x52a3;HEATER_InvalidSwitchNr;;0xA3;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x52a4;HEATER_MainSwitchSetTimeout;;0xA4;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x52a5;HEATER_CommandAlreadyWaiting;;0xA5;mission/devices/HeaterHandler.h;HEATER_HANDLER
-0x6000;GOMS_PacketTooLong;;0;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x6001;GOMS_InvalidTableId;;1;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x6002;GOMS_InvalidAddress;;2;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x6003;GOMS_InvalidParamSize;;3;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x6004;GOMS_InvalidPayloadSize;;4;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x6005;GOMS_UnknownReplyId;;5;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
-0x53a0;SYRLINKS_CrcFailure;;0xA0;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a1;SYRLINKS_UartFraminOrParityErrorAck;;0xA1;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a2;SYRLINKS_BadCharacterAck;;0xA2;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a3;SYRLINKS_BadParameterValueAck;;0xA3;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a4;SYRLINKS_BadEndOfFrameAck;;0xA4;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a5;SYRLINKS_UnknownCommandIdAck;;0xA5;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a6;SYRLINKS_BadCrcAck;;0xA6;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a7;SYRLINKS_ReplyWrongSize;;0xA7;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x53a8;SYRLINKS_MissingStartFrameCharacter;;0xA8;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER
-0x66a0;NVMB_KeyNotExists;Specified key does not exist in json file;0xA0;mission/memory/NVMParameterBase.h;NVM_PARAM_BASE
-0x4300; HSPI_OpeningFileFailed;;0;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI
-0x4301; HSPI_FullDuplexTransferFailed;;1;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI
-0x4302; HSPI_HalfDuplexTransferFailed;;2;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI
-0x4401; HURT_UartReadFailure;;1;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART
-0x4402; HURT_UartReadSizeMissmatch;;2;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART
-0x4403; HURT_UartRxBufferTooSmall;;3;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART
-0x4601; HGIO_UnknownGpioId;;1;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4602; HGIO_DriveGpioFailure;;2;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4603; HGIO_GpioTypeFailure;;3;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4604; HGIO_GpioInvalidInstance;;4;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4605; HGIO_GpioDuplicateDetected;;5;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4606; HGIO_GpioInitFailed;;6;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4607; HGIO_GpioGetValueFailed;;7;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO
-0x4200; UXOS_ExecutionFinished;Execution of the current command has finished;0;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4201; UXOS_CommandPending;Command is pending. This will also be returned if the user tries to load another command but a command is still pending;1;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4202; UXOS_BytesRead;Some bytes have been read from the executing process;2;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4203; UXOS_CommandError;Command execution failed;3;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4204; UXOS_NoCommandLoadedOrPending;;4;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x4206; UXOS_PcloseCallError;;6;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL
-0x3b00; LPIF_PoolEntryNotFound;;0x00;fsfw/src/fsfw/datapoollocal/localPoolDefinitions.h;LOCAL_POOL_OWNER_IF
-0x3b01; LPIF_PoolEntryTypeConflict;;0x01;fsfw/src/fsfw/datapoollocal/localPoolDefinitions.h;LOCAL_POOL_OWNER_IF
-0x3d00; HKM_QueueOrDestinationInvalid;;0;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d01; HKM_WrongHkPacketType;;1;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d02; HKM_ReportingStatusUnchanged;;2;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d03; HKM_PeriodicHelperInvalid;;3;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d04; HKM_PoolobjectNotFound;;4;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3d05; HKM_DatasetNotFound;;5;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
-0x3501; CFDP_InvalidTlvType;;1;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3502; CFDP_InvalidDirectiveFields;;2;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3503; CFDP_InvalidPduDatafieldLen;;3;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3504; CFDP_InvalidAckDirectiveFields;;4;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3505; CFDP_MetadataCantParseOptions;;5;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3506; CFDP_FinishedCantParseFsResponses;;6;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3508; CFDP_FilestoreRequiresSecondFile;;8;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3509; CFDP_FilestoreResponseCantParseFsMessage;;9;fsfw/src/fsfw/cfdp/definitions.h;CFDP
-0x3101; CF_ObjectHasNoFunctions;;1;fsfw/src/fsfw/action/CommandsActionsIF.h;COMMANDS_ACTIONS_IF
-0x3102; CF_AlreadyCommanding;;2;fsfw/src/fsfw/action/CommandsActionsIF.h;COMMANDS_ACTIONS_IF
-0x3201; HF_IsBusy;;1;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF
-0x3202; HF_InvalidParameters;;2;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF
-0x3203; HF_ExecutionFinished;;3;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF
-0x3204; HF_InvalidActionId;;4;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF
-0x2d01; HPA_InvalidIdentifierId;;0x01;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF
-0x2d02; HPA_InvalidDomainId;;0x02;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF
-0x2d03; HPA_InvalidValue;;0x03;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF
-0x2d05; HPA_ReadOnly;;0x05;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF
-0x2c01; PAW_UnknownDatatype;;0x01;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c02; PAW_DatatypeMissmatch;;0x02;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c03; PAW_Readonly;;0x03;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c04; PAW_TooBig;;0x04;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c05; PAW_SourceNotSet;;0x05;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c06; PAW_OutOfBounds;;0x06;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c07; PAW_NotSet;;0x07;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x2c08; PAW_ColumnOrRowsZero;;0x08;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER
-0x1701; HHI_ObjectNotHealthy;;1;fsfw/src/fsfw/health/HasHealthIF.h;HAS_HEALTH_IF
-0x1702; HHI_InvalidHealthState;;2;fsfw/src/fsfw/health/HasHealthIF.h;HAS_HEALTH_IF
-0x2701; SM_DataTooLarge;;1;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2702; SM_DataStorageFull;;2;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2703; SM_IllegalStorageId;;3;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2704; SM_DataDoesNotExist;;4;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2705; SM_IllegalAddress;;5;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2706; SM_PoolTooLarge;;6;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF
-0x2301; MT_TooDetailedRequest;;1;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x2302; MT_TooGeneralRequest;;2;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x2303; MT_NoMatch;;3;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x2304; MT_Full;;4;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x2305; MT_NewNodeCreated;;5;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS
-0x3e01; DLEE_StreamTooShort;;0x01;fsfw/src/fsfw/globalfunctions/DleEncoder.h;DLE_ENCODER
-0x3e02; DLEE_DecodingError;;0x02;fsfw/src/fsfw/globalfunctions/DleEncoder.h;DLE_ENCODER
-0x2e01; ASC_TooLongForTargetType;;1;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER
-0x2e02; ASC_InvalidCharacters;;2;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER
-0x2e03; ASC_BufferTooSmall;;0x3;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER
-0x1c01; TCD_PacketLost;;1;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION
-0x1c02; TCD_DestinationNotFound;;2;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION
-0x1c03; TCD_ServiceIdAlreadyExists;;3;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION
-0x1b00; TCC_IllegalApid;;0;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b01; TCC_IncompletePacket;;1;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b02; TCC_IncorrectChecksum;;2;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b03; TCC_IllegalPacketType;;3;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b04; TCC_IllegalPacketSubtype;;4;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b05; TCC_IncorrectPrimaryHeader;;5;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x1b06; TCC_IncorrectSecondaryHeader;;6;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK
-0x3901; MQI_Empty;;1;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF
-0x3902; MQI_Full;No space left for more messages;2;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF
-0x3903; MQI_NoReplyPartner;Returned if a reply method was called without partner;3;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF
-0x3904; MQI_DestinationInvalid;Returned if the target destination is invalid.;4;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF
-0xf01; CM_UnknownCommand;;1;fsfw/src/fsfw/ipc/CommandMessageIF.h;COMMAND_MESSAGE
-0x3801; MUX_NotEnoughResources;;1;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3802; MUX_InsufficientMemory;;2;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3803; MUX_NoPrivilege;;3;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3804; MUX_WrongAttributeSetting;;4;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3805; MUX_MutexAlreadyLocked;;5;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3806; MUX_MutexNotFound;;6;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3807; MUX_MutexMaxLocks;;7;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3808; MUX_CurrThreadAlreadyOwnsMutex;;8;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x3809; MUX_CurrThreadDoesNotOwnMutex;;9;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x380a; MUX_MutexTimeout;;10;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x380b; MUX_MutexInvalidId;;11;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x380c; MUX_MutexDestroyedWhileWaiting;;12;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF
-0x2801; TC_InvalidTargetState;;1;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF
-0x28f1; TC_AboveOperationalLimit;;0xF1;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF
-0x28f2; TC_BelowOperationalLimit;;0xF2;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF
-0x801; DPS_InvalidParameterDefinition;;1;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x802; DPS_SetWasAlreadyRead;;2;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x803; DPS_CommitingWithoutReading;;3;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x804; DPS_DataSetUninitialised;;4;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x805; DPS_DataSetFull;;5;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x806; DPS_PoolVarNull;;6;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS
-0x3ca0; PVA_InvalidReadWriteMode;;0xA0;fsfw/src/fsfw/datapool/PoolVariableIF.h;POOL_VARIABLE_IF
-0x3ca1; PVA_InvalidPoolEntry;;0xA1;fsfw/src/fsfw/datapool/PoolVariableIF.h;POOL_VARIABLE_IF
-0xc02; MS_InvalidEntry;;0x02;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF
-0xc03; MS_TooManyElements;;0x03;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF
-0xc04; MS_CantStoreEmpty;;0x04;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF
-0xd01; SS_SequenceAlreadyExists;;0x01;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd02; SS_TableAlreadyExists;;0x02;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd03; SS_TableDoesNotExist;;0x03;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd04; SS_TableOrSequenceLengthInvalid;;0x04;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd05; SS_SequenceDoesNotExist;;0x05;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd06; SS_TableContainsInvalidObjectId;;0x06;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd07; SS_FallbackSequenceDoesNotExist;;0x07;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd08; SS_NoTargetTable;;0x08;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd09; SS_SequenceOrTableTooLong;;0x09;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd0b; SS_IsFallbackSequence;;0x0B;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd0c; SS_AccessDenied;;0x0C;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xd0e; SS_TableInUse;;0x0E;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xda1; SS_TargetTableNotReached;;0xA1;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xda2; SS_TableCheckFailed;;0xA2;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM
-0xb01; SB_ChildNotFound;;0x01;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb02; SB_ChildInfoUpdated;;0x02;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb03; SB_ChildDoesntHaveModes;;0x03;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb04; SB_CouldNotInsertChild;;0x04;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb05; SB_TableContainsInvalidObjectId;;0x05;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE
-0xb00; SB_ConnBroken;;0;fsfw/src/fsfw/osal/common/TcpTmTcServer.h;SUBSYSTEM_BASE
-0x2901; IEC_NoConfigurationTable;;0x01;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2902; IEC_NoCpuTable;;0x02;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2903; IEC_InvalidWorkspaceAddress;;0x03;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2904; IEC_TooLittleWorkspace;;0x04;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2905; IEC_WorkspaceAllocation;;0x05;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2906; IEC_InterruptStackTooSmall;;0x06;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2907; IEC_ThreadExitted;;0x07;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2908; IEC_InconsistentMpInformation;;0x08;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2909; IEC_InvalidNode;;0x09;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290a; IEC_NoMpci;;0x0a;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290b; IEC_BadPacket;;0x0b;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290c; IEC_OutOfPackets;;0x0c;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290d; IEC_OutOfGlobalObjects;;0x0d;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290e; IEC_OutOfProxies;;0x0e;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x290f; IEC_InvalidGlobalId;;0x0f;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2910; IEC_BadStackHook;;0x10;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2911; IEC_BadAttributes;;0x11;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2912; IEC_ImplementationKeyCreateInconsistency;;0x12;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2913; IEC_ImplementationBlockingOperationCancel;;0x13;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2914; IEC_MutexObtainFromBadState;;0x14;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x2915; IEC_UnlimitedAndMaximumIs0;;0x15;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES
-0x1401; SE_BufferTooShort;;1;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF
-0x1402; SE_StreamTooShort;;2;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF
-0x1403; SE_TooManyElements;;3;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF
-0x4a00; SPPA_NoPacketFound;;0x00;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h;SPACE_PACKET_PARSER
-0x4a01; SPPA_SplitPacket;;0x01;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h;SPACE_PACKET_PARSER
-0x1d01; PUS_ActivityStarted;;1;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1d02; PUS_InvalidSubservice;;2;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1d03; PUS_IllegalApplicationData;;3;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1d04; PUS_SendTmFailed;;4;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1d05; PUS_Timeout;;5;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
-0x1f01; CSB_ExecutionComplete;;1;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f02; CSB_NoStepMessage;;2;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f03; CSB_ObjectBusy;;3;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f04; CSB_Busy;;4;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f05; CSB_InvalidTc;;5;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f06; CSB_InvalidObject;;6;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x1f07; CSB_InvalidReply;;7;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE
-0x2500; FDI_YourFault;;0;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
-0x2501; FDI_MyFault;;1;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
-0x2502; FDI_ConfirmLater;;2;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
-0x4e1; RMP_CommandNoDescriptorsAvailable;;0xE1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e2; RMP_CommandBufferFull;;0xE2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e3; RMP_CommandChannelOutOfRange;;0xE3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e6; RMP_CommandChannelDeactivated;;0xE6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e7; RMP_CommandPortOutOfRange;;0xE7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e8; RMP_CommandPortInUse;;0xE8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4e9; RMP_CommandNoChannel;;0xE9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4ea; RMP_NoHwCrc;;0xEA;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d0; RMP_ReplyNoReply;;0xD0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d1; RMP_ReplyNotSent;;0xD1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d2; RMP_ReplyNotYetSent;;0xD2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d3; RMP_ReplyMissmatch;;0xD3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4d4; RMP_ReplyTimeout;;0xD4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4c0; RMP_ReplyInterfaceBusy;;0xC0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4c1; RMP_ReplyTransmissionError;;0xC1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4c2; RMP_ReplyInvalidData;;0xC2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4c3; RMP_ReplyNotSupported;;0xC3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f0; RMP_LinkDown;;0xF0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f1; RMP_SpwCredit;;0xF1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f2; RMP_SpwEscape;;0xF2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f3; RMP_SpwDisconnect;;0xF3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f4; RMP_SpwParity;;0xF4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f5; RMP_SpwWriteSync;;0xF5;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f6; RMP_SpwInvalidAddress;;0xF6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f7; RMP_SpwEarlyEop;;0xF7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f8; RMP_SpwDma;;0xF8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x4f9; RMP_SpwLinkError;;0xF9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x400; RMP_ReplyOk;;0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x401; RMP_ReplyGeneralErrorCode;;1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x402; RMP_ReplyUnusedPacketTypeOrCommandCode;;2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x403; RMP_ReplyInvalidKey;;3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x404; RMP_ReplyInvalidDataCrc;;4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x405; RMP_ReplyEarlyEop;;5;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x406; RMP_ReplyTooMuchData;;6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x407; RMP_ReplyEep;;7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x408; RMP_ReplyReserved;;8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x409; RMP_ReplyVerifyBufferOverrun;;9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x40a; RMP_ReplyCommandNotImplementedOrNotAuthorised;;10;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x40b; RMP_ReplyRmwDataLengthError;;11;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x40c; RMP_ReplyInvalidTargetLogicalAddress;;12;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL
-0x2b01; CCS_BcIsSetVrCommand;;0x01;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2b02; CCS_BcIsUnlockCommand;;0x02;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bb0; CCS_BcIllegalCommand;;0xB0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bb1; CCS_BoardReadingNotFinished;;0xB1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf0; CCS_NsPositiveW;;0xF0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf1; CCS_NsNegativeW;;0xF1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf2; CCS_NsLockout;;0xF2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf3; CCS_FarmInLockout;;0xF3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bf4; CCS_FarmInWait;;0xF4;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be0; CCS_WrongSymbol;;0xE0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be1; CCS_DoubleStart;;0xE1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be2; CCS_StartSymbolMissed;;0xE2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be3; CCS_EndWithoutStart;;0xE3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be4; CCS_TooLarge;;0xE4;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be5; CCS_TooShort;;0xE5;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be6; CCS_WrongTfVersion;;0xE6;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be7; CCS_WrongSpacecraftId;;0xE7;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be8; CCS_NoValidFrameType;;0xE8;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2be9; CCS_CrcFailed;;0xE9;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bea; CCS_VcNotFound;;0xEA;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2beb; CCS_ForwardingFailed;;0xEB;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bec; CCS_ContentTooLarge;;0xEC;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bed; CCS_ResidualData;;0xED;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bee; CCS_DataCorrupted;;0xEE;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bef; CCS_IllegalSegmentationFlag;;0xEF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bd0; CCS_IllegalFlagCombination;;0xD0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bd1; CCS_ShorterThanHeader;;0xD1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bd2; CCS_TooShortBlockedPacket;;0xD2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x2bd3; CCS_TooShortMapExtraction;;0xD3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
-0x37a1; SGP4_InvalidEccentricity;;0xA1;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a2; SGP4_InvalidMeanMotion;;0xA2;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a3; SGP4_InvalidPerturbationElements;;0xA3;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a4; SGP4_InvalidSemiLatusRectum;;0xA4;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a5; SGP4_InvalidEpochElements;;0xA5;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37a6; SGP4_SatelliteHasDecayed;;0xA6;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37b1; SGP4_TleTooOld;;0xB1;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x37b2; SGP4_TleNotInitialized;;0xB2;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
-0x13e0; MH_UnknownCmd;;0xE0;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER
-0x13e1; MH_InvalidAddress;;0xE1;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER
-0x13e2; MH_InvalidSize;;0xE2;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER
-0x13e3; MH_StateMismatch;;0xE3;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER
-0x4100; FILS_GenericFileError;;0;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4101; FILS_IsBusy;;1;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4102; FILS_InvalidParameters;;2;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4105; FILS_FileDoesNotExist;;5;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4106; FILS_FileAlreadyExists;;6;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4107; FILS_FileLocked;;7;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x410a; FILS_DirectoryDoesNotExist;;10;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x410b; FILS_DirectoryAlreadyExists;;11;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x410c; FILS_DirectoryNotEmpty;;12;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x410f; FILS_SequencePacketMissingWrite;;15;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x4110; FILS_SequencePacketMissingRead;;16;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM
-0x601; PP_DoItMyself;;1;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x602; PP_PointsToVariable;;2;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x603; PP_PointsToMemory;;3;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x604; PP_ActivityCompleted;;4;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x605; PP_PointsToVectorUint8;;5;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x606; PP_PointsToVectorUint16;;6;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x607; PP_PointsToVectorUint32;;7;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x608; PP_PointsToVectorFloat;;8;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6a0; PP_DumpNotSupported;;0xA0;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e0; PP_InvalidSize;;0xE0;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e1; PP_InvalidAddress;;0xE1;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e2; PP_InvalidContent;;0xE2;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e3; PP_UnalignedAccess;;0xE3;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x6e4; PP_WriteProtected;;0xE4;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF
-0x201; OM_InsertionFailed;;1;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF
-0x202; OM_NotFound;;2;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF
-0x203; OM_ChildInitFailed;;3;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF
-0x204; OM_InternalErrReporterUninit;;4;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF
-0x501; PS_SwitchOn;;1;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x500; PS_SwitchOff;;0;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x502; PS_SwitchTimeout;;2;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x503; PS_FuseOn;;3;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x504; PS_FuseOff;;4;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF
-0x2f01; POS_InPowerTransition;;1;fsfw/src/fsfw/power/PowerSwitcher.h;POWER_SWITCHER
-0x2f02; POS_SwitchStateMismatch;;2;fsfw/src/fsfw/power/PowerSwitcher.h;POWER_SWITCHER
-0x1000; TIM_UnsupportedTimeFormat;;0;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1001; TIM_NotEnoughInformationForTargetFormat;;1;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1002; TIM_LengthMismatch;;2;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1003; TIM_InvalidTimeFormat;;3;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1004; TIM_InvalidDayOfYear;;4;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x1005; TIM_TimeDoesNotFitFormat;;5;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
-0x3601; TSI_BadTimestamp;;1;fsfw/src/fsfw/timemanager/TimeStamperIF.h;TIME_STAMPER_IF
-0x2101; TMF_Busy;;1;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2102; TMF_LastPacketFound;;2;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2103; TMF_StopFetch;;3;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2104; TMF_Timeout;;4;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2105; TMF_TmChannelFull;;5;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2106; TMF_NotStored;;6;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2107; TMF_AllDeleted;;7;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2108; TMF_InvalidData;;8;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2109; TMF_NotReady;;9;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
-0x2001; TMB_Busy;;1;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2002; TMB_Full;;2;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2003; TMB_Empty;;3;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2004; TMB_NullRequested;;4;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2005; TMB_TooLarge;;5;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2006; TMB_NotReady;;6;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2007; TMB_DumpError;;7;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2008; TMB_CrcError;;8;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x2009; TMB_Timeout;;9;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200a; TMB_IdlePacketFound;;10;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200b; TMB_TelecommandFound;;11;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200c; TMB_NoPusATm;;12;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200d; TMB_TooSmall;;13;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200e; TMB_BlockNotFound;;14;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0x200f; TMB_InvalidRequest;;15;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF
-0xe01; HM_InvalidMode;;0x01;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF
-0xe02; HM_TransNotAllowed;;0x02;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF
-0xe03; HM_InTransition;;0x03;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF
-0xe04; HM_InvalidSubmode;;0x04;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF
-0x1501; FM_KeyAlreadyExists;;0x01;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP
-0x1502; FM_MapFull;;0x02;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP
-0x1503; FM_KeyDoesNotExist;;0x03;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP
-0x1101; AL_Full;;0x01;fsfw/src/fsfw/container/ArrayList.h;ARRAY_LIST
-0x1601; FMM_MapFull;;0x01;fsfw/src/fsfw/container/FixedOrderedMultimap.h;FIXED_MULTIMAP
-0x1602; FMM_KeyDoesNotExist;;0x02;fsfw/src/fsfw/container/FixedOrderedMultimap.h;FIXED_MULTIMAP
-0x1801; FF_Full;;1;fsfw/src/fsfw/container/FIFOBase.h;FIFO_CLASS
-0x1802; FF_Empty;;2;fsfw/src/fsfw/container/FIFOBase.h;FIFO_CLASS
-0x3a0; DHB_InvalidChannel;;0xA0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3b0; DHB_AperiodicReply;;0xB0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3b1; DHB_IgnoreReplyData;;0xB1;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3b2; DHB_IgnoreFullPacket;;0xB2;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3c0; DHB_NothingToSend;;0xC0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3c2; DHB_CommandMapError;;0xC2;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3d0; DHB_NoSwitch;;0xD0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3e0; DHB_ChildTimeout;;0xE0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x3e1; DHB_SwitchFailed;;0xE1;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE
-0x1201; AB_NeedSecondStep;;0x01;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x1202; AB_NeedToReconfigure;;0x02;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x1203; AB_ModeFallback;;0x03;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x1204; AB_ChildNotCommandable;;0x04;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x1205; AB_NeedToChangeHealth;;0x05;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x12a1; AB_NotEnoughChildrenInCorrectState;;0xa1;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE
-0x26a0; DHI_NoCommandData;;0xA0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a1; DHI_CommandNotSupported;;0xA1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a2; DHI_CommandAlreadySent;;0xA2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a3; DHI_CommandWasNotSent;;0xA3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a4; DHI_CantSwitchAddress;;0xA4;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a5; DHI_WrongModeForCommand;;0xA5;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a6; DHI_Timeout;;0xA6;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a7; DHI_Busy;;0xA7;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a8; DHI_NoReplyExpected;;0xA8;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26a9; DHI_NonOpTemperature;;0xA9;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26aa; DHI_CommandNotImplemented;;0xAA;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26b0; DHI_ChecksumError;;0xB0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26b1; DHI_LengthMissmatch;;0xB1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26b2; DHI_InvalidData;;0xB2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26b3; DHI_ProtocolError;;0xB3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26c0; DHI_DeviceDidNotExecute;;0xC0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26c1; DHI_DeviceReportedError;;0xC1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26c2; DHI_UnknownDeviceReply;;0xC2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26c3; DHI_DeviceReplyInvalid;;0xC3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26d0; DHI_InvalidCommandParameter;;0xD0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x26d1; DHI_InvalidNumberOrLengthOfParameters;;0xD1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF
-0x3301; DC_NoReplyReceived;;0x01;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3302; DC_ProtocolError;;0x02;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3303; DC_Nullpointer;;0x03;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3304; DC_InvalidCookieType;;0x04;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3305; DC_NotActive;;0x05;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x3306; DC_TooMuchData;;0x06;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
-0x2401; EV_ListenerNotFound;;1;fsfw/src/fsfw/events/EventManagerIF.h;EVENT_MANAGER_IF
-0x1a01; TRC_NotEnoughSensors;;1;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x1a02; TRC_LowestValueOol;;2;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x1a03; TRC_HighestValueOol;;3;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x1a04; TRC_BothValuesOol;;4;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x1a05; TRC_DuplexOol;;5;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
-0x3001; LIM_Unchecked;;1;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3002; LIM_Invalid;;2;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3003; LIM_Unselected;;3;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3004; LIM_BelowLowLimit;;4;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3005; LIM_AboveHighLimit;;5;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3006; LIM_UnexpectedValue;;6;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3007; LIM_OutOfRange;;7;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30a0; LIM_FirstSample;;0xA0;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30e0; LIM_InvalidSize;;0xE0;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30e1; LIM_WrongType;;0xE1;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30e2; LIM_WrongPid;;0xE2;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30e3; LIM_WrongLimitId;;0xE3;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x30ee; LIM_MonitorNotFound;;0xEE;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF
-0x3a01; SPH_SemaphoreTimeout;;1;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF
-0x3a02; SPH_SemaphoreNotOwned;;2;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF
-0x3a03; SPH_SemaphoreInvalid;;3;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF
-0x7200; SDMA_OpOngoing;;0;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x7201; SDMA_AlreadyOn;;1;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x7202; SDMA_AlreadyMounted;;2;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x7203; SDMA_AlreadyOff;;3;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x720a; SDMA_StatusFileNexists;;10;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x720b; SDMA_StatusFileFormatInvalid;;11;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x720c; SDMA_MountError;;12;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x720d; SDMA_UnmountError;;13;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x720e; SDMA_SystemCallError;;14;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x720f; SDMA_PopenCallError;;15;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER
-0x7300; SCBU_KeyNotFound;;0;bsp_q7s/memory/scratchApi.h;SCRATCH_BUFFER
-0x67a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;0xA0;bsp_q7s/memory/FilesystemHelper.h;FILE_SYSTEM_HELPER
-0x67a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;bsp_q7s/memory/FilesystemHelper.h;FILE_SYSTEM_HELPER
-0x6aa0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;0xA0;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;0xA1;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;0xA2;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;0xA3;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa4;MPSOCRTVIF_InvalidLength;Received command with invalid length;0xA4;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;0xA5;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;0xA6;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);0xA7;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;0xA8;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6aa9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;0xA9;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
-0x6ba0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;0xA0;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba1;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;0xA1;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba2;SPVRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;0xA2;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba3;SPVRTVIF_InvalidApid;Received space packet with invalid APID from PLOC supervisor;0xA3;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba4;SPVRTVIF_GetTimeFailure;Failed to read current system time;0xA4;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba5;SPVRTVIF_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;0xA5;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba6;SPVRTVIF_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;0xA6;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba7;SPVRTVIF_InvalidLatchupId;Received latchup config command with invalid latchup ID;0xA7;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba8;SPVRTVIF_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;0xA8;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6ba9;SPVRTVIF_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;0xA9;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6baa;SPVRTVIF_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;0xAA;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6bab;SPVRTVIF_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);0xAB;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6bac;SPVRTVIF_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;0xAC;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6bad;SPVRTVIF_PathDoesNotExist;Path to PLOC directory on SD card does not exist;0xAD;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6bae;SPVRTVIF_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;0xAE;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6baf;SPVRTVIF_InvalidLength;Received action command has invalid length;0xAF;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6bb0;SPVRTVIF_FilenameTooLong;Filename too long;0xB0;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6bb1;SPVRTVIF_UpdateStatusReportInvalidLength;Received update status report with invalid packet length field;0xB1;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6bb2;SPVRTVIF_UpdateCrcFailure;Update status report does not contain expected CRC. There might be a bit flip in the update memory region.;0xB2;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x6bb3;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);0xB3;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
-0x57e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);0xE0;linux/devices/devicedefinitions/PlocMPSoCDefinitions.h;DWLPWRON_CMD
-0x57e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);0xE1;linux/devices/devicedefinitions/PlocMPSoCDefinitions.h;DWLPWRON_CMD
-0x61a0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;0xA0;linux/devices/ploc/PlocMemoryDumper.h;PLOC_MEMORY_DUMPER
-0x61a1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;0xA1;linux/devices/ploc/PlocMemoryDumper.h;PLOC_MEMORY_DUMPER
-0x68a0; PLMPHLP_FileClosedAccidentally;File accidentally close;0xA0;linux/devices/ploc/PlocMPSoCHelper.h;PLOC_MPSOC_HELPER
-0x5aa0;PLSPVhLP_FileClosedAccidentally;File accidentally close;0xA0;linux/devices/ploc/PlocSupvHelper.h;PLOC_SUPV_HELPER
-0x5aa1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;0xA1;linux/devices/ploc/PlocSupvHelper.h;PLOC_SUPV_HELPER
-0x5aa2;PLSPVhLP_PathNotExists;Received command with invalid pathname;0xA2;linux/devices/ploc/PlocSupvHelper.h;PLOC_SUPV_HELPER
-0x5aa3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;0xA3;linux/devices/ploc/PlocSupvHelper.h;PLOC_SUPV_HELPER
-0x6501;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
-0x6502;JSONBASE_SetNotExists;Requested set does not exist in json file;2;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
-0x6503;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
-0x56a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;0xA0;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a1;STRH_PingFailed;Ping command failed;0xA1;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a2;STRH_VersionReqFailed;Status in version reply signals error;0xA2;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a3;STRH_InterfaceReqFailed;Status in interface reply signals error;0xA3;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a4;STRH_PowerReqFailed;Status in power reply signals error;0xA4;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;0xA5;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a6;STRH_ActionFailed;Status of reply to action command signals error;0xA6;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;0xA7;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a8;STRH_FilenameTooLong;Name of file received with command is too long;0xA8;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56a9;STRH_InvalidProgram;Received version reply with invalid program ID;0xA9;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56aa;STRH_ReplyError;Status field reply signals error;0xAA;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);0xAB;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);0xAC;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56ad;STRH_RegionMismatch;Region mismatch between send and received data;0xAD;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56ae;STRH_AddressMismatch;Address mismatch between send and received data;0xAE;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56af;STRH_LengthMismatch;Length field mismatch between send and received data;0xAF;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b0;STRH_FileNotExists;Specified file does not exist;0xB0;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b1;STRH_InvalidType;Download blob pixel command has invalid type field;0xB1;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b2;STRH_InvalidId;Received FPGA action command with invalid ID;0xB2;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b3;STRH_ReplyTooShort;Received reply is too short;0xB3;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b4;STRH_CrcFailure;Received reply with invalid CRC;0xB4;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;0xB5;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;0xB6;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b7;STRH_StartrackerRunningFirmware;Star tracker is in firmware mode but must be in bootloader mode to execute this command;0xB7;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x56b8;STRH_StartrackerRunningBootloader;Star tracker is in bootloader mode but must be in firmware mode to execute this command;0xB8;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER
-0x5fa0;STRHLP_SdNotMounted;SD card specified in path string not mounted;0xA0;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5fa1;STRHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5fa2;STRHLP_PathNotExists;Specified path does not exist;0xA2;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5fa3;STRHLP_FileCreationFailed;Failed to create download image or read flash file;0xA3;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5fa4;STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;0xA4;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5fa5;STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;0xA5;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5fa6;STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;0xA6;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5fa7;STRHLP_StatusError;Status field in reply signals error;0xA7;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5fa8;STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);0xA8;linux/devices/startracker/StrHelper.h;STR_HELPER
-0x5ca0;IPCI_PapbBusy;;0xA0;linux/obc/PapbVcInterface.h;CCSDS_IP_CORE_BRIDGE
-0x5da0;PTME_UnknownVcId;;0xA0;linux/obc/Ptme.h;PTME
-0x64a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;0xA0;linux/obc/PtmeConfig.h;RATE_SETTER
-0x64a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);0xA1;linux/obc/PtmeConfig.h;RATE_SETTER
-0x64a2;RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;0xA2;linux/obc/PtmeConfig.h;RATE_SETTER
-0x64a3;RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;0xA3;linux/obc/PtmeConfig.h;RATE_SETTER
-0x62a0;PDEC_AbandonedCltu;;0xA0;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a1;PDEC_FrameDirty;;0xA1;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a2;PDEC_FrameIllegalMultipleReasons;;0xA2;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a3;PDEC_AdDiscardedLockout;;0xA3;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a4;PDEC_AdDiscardedWait;;0xA4;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a5;PDEC_AdDiscardedNsVs;;0xA5;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62b0;PDEC_CommandNotImplemented;Received action message with unknown action id;0xB0;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a6;PDEC_NoReport;;0xA6;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a7;PDEC_ErrorVersionNumber;;0xA7;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a8;PDEC_IllegalCombination;;0xA8;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62a9;PDEC_InvalidScId;;0xA9;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62aa;PDEC_InvalidVcIdMsb;;0xAA;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62ab;PDEC_InvalidVcIdLsb;;0xAB;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62ac;PDEC_NsNotZero;;0xAC;linux/obc/PdecHandler.h;PDEC_HANDLER
-0x62ae;PDEC_InvalidBcCc;;0xAE;linux/obc/PdecHandler.h;PDEC_HANDLER
+0x6100; GOMS_PacketTooLong;;0;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x6101; GOMS_InvalidTableId;;1;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x6102; GOMS_InvalidAddress;;2;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x6103; GOMS_InvalidParamSize;;3;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x6104; GOMS_InvalidPayloadSize;;4;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x6105; GOMS_UnknownReplyId;;5;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER
+0x53a1; HEATER_CommandNotSupported;;0xA1;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x53a2; HEATER_InitFailed;;0xA2;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x53a3; HEATER_InvalidSwitchNr;;0xA3;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x53a4; HEATER_MainSwitchSetTimeout;;0xA4;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x53a5; HEATER_CommandAlreadyWaiting;;0xA5;mission\devices\HeaterHandler.h;HEATER_HANDLER
+0x55a0; IMTQ_InvalidCommandCode;;0xA0;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x55a1; IMTQ_ParameterMissing;;0xA1;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x55a2; IMTQ_ParameterInvalid;;0xA2;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x55a3; IMTQ_CcUnavailable;;0xA3;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x55a4; IMTQ_InternalProcessingError;;0xA4;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x55a5; IMTQ_RejectedWithoutReason;;0xA5;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x55a6; IMTQ_CmdErrUnknown;;0xA6;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x55a7; IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;0xA7;mission\devices\IMTQHandler.h;IMTQ_HANDLER
+0x56b0; RWHA_SpiWriteFailure;;0xB0;mission\devices\RwHandler.h;RW_HANDLER
+0x56b1; RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;0xB1;mission\devices\RwHandler.h;RW_HANDLER
+0x56b2; RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;0xB2;mission\devices\RwHandler.h;RW_HANDLER
+0x56b3; RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;0xB3;mission\devices\RwHandler.h;RW_HANDLER
+0x56b4; RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;0xB4;mission\devices\RwHandler.h;RW_HANDLER
+0x56b5; RWHA_NoReply;Reaction wheel only responds with empty frames.;0xB5;mission\devices\RwHandler.h;RW_HANDLER
+0x56b6; RWHA_NoStartMarker;Expected a start marker as first byte;0xB6;mission\devices\RwHandler.h;RW_HANDLER
+0x56a0; RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000; 1000] or [1000; 65000];0xA0;mission\devices\RwHandler.h;RW_HANDLER
+0x56a1; RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;0xA1;mission\devices\RwHandler.h;RW_HANDLER
+0x56a2; RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;0xA2;mission\devices\RwHandler.h;RW_HANDLER
+0x56a3; RWHA_ExecutionFailed;Command execution failed;0xA3;mission\devices\RwHandler.h;RW_HANDLER
+0x56a4; RWHA_CrcError;Reaction wheel reply has invalid crc;0xA4;mission\devices\RwHandler.h;RW_HANDLER
+0x6aa0; SADPL_CommandNotSupported;;0xA0;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x6aa1; SADPL_DeploymentAlreadyExecuting;;0xA1;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x6aa2; SADPL_MainSwitchTimeoutFailure;;0xA2;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x6aa3; SADPL_SwitchingDeplSa1Failed;;0xA3;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x6aa4; SADPL_SwitchingDeplSa2Failed;;0xA4;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER
+0x5ca0; SUSS_ErrorUnlockMutex;;0xA0;mission\devices\SusHandler.h;SUS_HANDLER
+0x5ca1; SUSS_ErrorLockMutex;;0xA1;mission\devices\SusHandler.h;SUS_HANDLER
+0x54a0; SYRLINKS_CrcFailure;;0xA0;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x54a1; SYRLINKS_UartFraminOrParityErrorAck;;0xA1;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x54a2; SYRLINKS_BadCharacterAck;;0xA2;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x54a3; SYRLINKS_BadParameterValueAck;;0xA3;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x54a4; SYRLINKS_BadEndOfFrameAck;;0xA4;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x54a5; SYRLINKS_UnknownCommandIdAck;;0xA5;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x54a6; SYRLINKS_BadCrcAck;;0xA6;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x54a7; SYRLINKS_ReplyWrongSize;;0xA7;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x54a8; SYRLINKS_MissingStartFrameCharacter;;0xA8;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER
+0x67a0; NVMB_KeyNotExists;Specified key does not exist in json file;0xA0;mission\memory\NVMParameterBase.h;NVM_PARAM_BASE
+0x64a0; CCSDS_CommandNotImplemented;Received action message with unknown action id;0xA0;mission\tmtc\CCSDSHandler.h;CCSDS_HANDLER
+0x4701; HGIO_UnknownGpioId;;1;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4702; HGIO_DriveGpioFailure;;2;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4703; HGIO_GpioTypeFailure;;3;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4704; HGIO_GpioInvalidInstance;;4;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4705; HGIO_GpioDuplicateDetected;;5;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4706; HGIO_GpioInitFailed;;6;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4707; HGIO_GpioGetValueFailed;;7;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO
+0x4400; HSPI_HalTimeoutRetval;;0;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI
+0x4401; HSPI_HalBusyRetval;;1;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI
+0x4402; HSPI_HalErrorRetval;;2;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI
+0x4501; HURT_UartReadFailure;;1;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART
+0x4502; HURT_UartReadSizeMissmatch;;2;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART
+0x4503; HURT_UartRxBufferTooSmall;;3;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART
+0x4300; UXOS_ExecutionFinished;Execution of the current command has finished;0;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4301; UXOS_CommandPending;Command is pending. This will also be returned if the user tries to load another command but a command is still pending;1;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4302; UXOS_BytesRead;Some bytes have been read from the executing process;2;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4303; UXOS_CommandError;Command execution failed;3;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4304; UXOS_NoCommandLoadedOrPending;;4;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x4306; UXOS_PcloseCallError;;6;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL
+0x3101; CF_ObjectHasNoFunctions;;1;fsfw\src\fsfw\action\CommandsActionsIF.h;COMMANDS_ACTIONS_IF
+0x3102; CF_AlreadyCommanding;;2;fsfw\src\fsfw\action\CommandsActionsIF.h;COMMANDS_ACTIONS_IF
+0x3201; HF_IsBusy;;1;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF
+0x3202; HF_InvalidParameters;;2;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF
+0x3203; HF_ExecutionFinished;;3;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF
+0x3204; HF_InvalidActionId;;4;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF
+0x3501; CFDP_InvalidTlvType;;1;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3502; CFDP_InvalidDirectiveFields;;2;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3503; CFDP_InvalidPduDatafieldLen;;3;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3504; CFDP_InvalidAckDirectiveFields;;4;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3505; CFDP_MetadataCantParseOptions;;5;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3506; CFDP_FinishedCantParseFsResponses;;6;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3508; CFDP_FilestoreRequiresSecondFile;;8;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x3509; CFDP_FilestoreResponseCantParseFsMessage;;9;fsfw\src\fsfw\cfdp\definitions.h;CFDP
+0x1101; AL_Full;;0x01;fsfw\src\fsfw\container\ArrayList.h;ARRAY_LIST
+0x1801; FF_Full;;1;fsfw\src\fsfw\container\FIFOBase.h;FIFO_CLASS
+0x1802; FF_Empty;;2;fsfw\src\fsfw\container\FIFOBase.h;FIFO_CLASS
+0x1501; FM_KeyAlreadyExists;;0x01;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP
+0x1502; FM_MapFull;;0x02;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP
+0x1503; FM_KeyDoesNotExist;;0x03;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP
+0x1601; FMM_MapFull;;0x01;fsfw\src\fsfw\container\FixedOrderedMultimap.h;FIXED_MULTIMAP
+0x1602; FMM_KeyDoesNotExist;;0x02;fsfw\src\fsfw\container\FixedOrderedMultimap.h;FIXED_MULTIMAP
+0x37a1; SGP4_InvalidEccentricity;;0xA1;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a2; SGP4_InvalidMeanMotion;;0xA2;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a3; SGP4_InvalidPerturbationElements;;0xA3;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a4; SGP4_InvalidSemiLatusRectum;;0xA4;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a5; SGP4_InvalidEpochElements;;0xA5;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37a6; SGP4_SatelliteHasDecayed;;0xA6;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37b1; SGP4_TleTooOld;;0xB1;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x37b2; SGP4_TleNotInitialized;;0xB2;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS
+0x2b01; CCS_BcIsSetVrCommand;;0x01;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2b02; CCS_BcIsUnlockCommand;;0x02;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bb0; CCS_BcIllegalCommand;;0xB0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bb1; CCS_BoardReadingNotFinished;;0xB1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf0; CCS_NsPositiveW;;0xF0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf1; CCS_NsNegativeW;;0xF1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf2; CCS_NsLockout;;0xF2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf3; CCS_FarmInLockout;;0xF3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bf4; CCS_FarmInWait;;0xF4;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be0; CCS_WrongSymbol;;0xE0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be1; CCS_DoubleStart;;0xE1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be2; CCS_StartSymbolMissed;;0xE2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be3; CCS_EndWithoutStart;;0xE3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be4; CCS_TooLarge;;0xE4;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be5; CCS_TooShort;;0xE5;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be6; CCS_WrongTfVersion;;0xE6;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be7; CCS_WrongSpacecraftId;;0xE7;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be8; CCS_NoValidFrameType;;0xE8;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2be9; CCS_CrcFailed;;0xE9;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bea; CCS_VcNotFound;;0xEA;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2beb; CCS_ForwardingFailed;;0xEB;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bec; CCS_ContentTooLarge;;0xEC;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bed; CCS_ResidualData;;0xED;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bee; CCS_DataCorrupted;;0xEE;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bef; CCS_IllegalSegmentationFlag;;0xEF;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bd0; CCS_IllegalFlagCombination;;0xD0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bd1; CCS_ShorterThanHeader;;0xD1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bd2; CCS_TooShortBlockedPacket;;0xD2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x2bd3; CCS_TooShortMapExtraction;;0xD3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF
+0x801; DPS_InvalidParameterDefinition;;1;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x802; DPS_SetWasAlreadyRead;;2;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x803; DPS_CommitingWithoutReading;;3;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x804; DPS_DataSetUninitialised;;4;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x805; DPS_DataSetFull;;5;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x806; DPS_PoolVarNull;;6;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS
+0x3ca0; PVA_InvalidReadWriteMode;;0xA0;fsfw\src\fsfw\datapool\PoolVariableIF.h;POOL_VARIABLE_IF
+0x3ca1; PVA_InvalidPoolEntry;;0xA1;fsfw\src\fsfw\datapool\PoolVariableIF.h;POOL_VARIABLE_IF
+0x3d00; HKM_QueueOrDestinationInvalid;;0;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d01; HKM_WrongHkPacketType;;1;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d02; HKM_ReportingStatusUnchanged;;2;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d03; HKM_PeriodicHelperInvalid;;3;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d04; HKM_PoolobjectNotFound;;4;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3d05; HKM_DatasetNotFound;;5;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER
+0x3b00; LPIF_PoolEntryNotFound;;0x00;fsfw\src\fsfw\datapoollocal\localPoolDefinitions.h;LOCAL_POOL_OWNER_IF
+0x3b01; LPIF_PoolEntryTypeConflict;;0x01;fsfw\src\fsfw\datapoollocal\localPoolDefinitions.h;LOCAL_POOL_OWNER_IF
+0x1201; AB_NeedSecondStep;;0x01;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x1202; AB_NeedToReconfigure;;0x02;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x1203; AB_ModeFallback;;0x03;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x1204; AB_ChildNotCommandable;;0x04;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x1205; AB_NeedToChangeHealth;;0x05;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x12a1; AB_NotEnoughChildrenInCorrectState;;0xa1;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE
+0x3301; DC_NoReplyReceived;;0x01;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3302; DC_ProtocolError;;0x02;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3303; DC_Nullpointer;;0x03;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3304; DC_InvalidCookieType;;0x04;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3305; DC_NotActive;;0x05;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3306; DC_TooMuchData;;0x06;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF
+0x3a0; DHB_InvalidChannel;;0xA0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3b0; DHB_AperiodicReply;;0xB0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3b1; DHB_IgnoreReplyData;;0xB1;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3b2; DHB_IgnoreFullPacket;;0xB2;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3c0; DHB_NothingToSend;;0xC0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3c2; DHB_CommandMapError;;0xC2;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3d0; DHB_NoSwitch;;0xD0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3e0; DHB_ChildTimeout;;0xE0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x3e1; DHB_SwitchFailed;;0xE1;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE
+0x26a0; DHI_NoCommandData;;0xA0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a1; DHI_CommandNotSupported;;0xA1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a2; DHI_CommandAlreadySent;;0xA2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a3; DHI_CommandWasNotSent;;0xA3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a4; DHI_CantSwitchAddress;;0xA4;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a5; DHI_WrongModeForCommand;;0xA5;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a6; DHI_Timeout;;0xA6;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a7; DHI_Busy;;0xA7;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a8; DHI_NoReplyExpected;;0xA8;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26a9; DHI_NonOpTemperature;;0xA9;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26aa; DHI_CommandNotImplemented;;0xAA;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26b0; DHI_ChecksumError;;0xB0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26b1; DHI_LengthMissmatch;;0xB1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26b2; DHI_InvalidData;;0xB2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26b3; DHI_ProtocolError;;0xB3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26c0; DHI_DeviceDidNotExecute;;0xC0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26c1; DHI_DeviceReportedError;;0xC1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26c2; DHI_UnknownDeviceReply;;0xC2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26c3; DHI_DeviceReplyInvalid;;0xC3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26d0; DHI_InvalidCommandParameter;;0xD0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x26d1; DHI_InvalidNumberOrLengthOfParameters;;0xD1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF
+0x2401; EV_ListenerNotFound;;1;fsfw\src\fsfw\events\EventManagerIF.h;EVENT_MANAGER_IF
+0x2500; FDI_YourFault;;0;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
+0x2501; FDI_MyFault;;1;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
+0x2502; FDI_ConfirmLater;;2;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF
+0x2301; MT_TooDetailedRequest;;1;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2302; MT_TooGeneralRequest;;2;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2303; MT_NoMatch;;3;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2304; MT_Full;;4;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2305; MT_NewNodeCreated;;5;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS
+0x2e01; ASC_TooLongForTargetType;;1;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER
+0x2e02; ASC_InvalidCharacters;;2;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER
+0x2e03; ASC_BufferTooSmall;;0x3;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER
+0x3e01; DLEE_StreamTooShort;;0x01;fsfw\src\fsfw\globalfunctions\DleEncoder.h;DLE_ENCODER
+0x3e02; DLEE_DecodingError;;0x02;fsfw\src\fsfw\globalfunctions\DleEncoder.h;DLE_ENCODER
+0x1701; HHI_ObjectNotHealthy;;1;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF
+0x1702; HHI_InvalidHealthState;;2;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF
+0x1703; HHI_IsExternallyControlled;;3;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF
+0xf01; CM_UnknownCommand;;1;fsfw\src\fsfw\ipc\CommandMessageIF.h;COMMAND_MESSAGE
+0x3901; MQI_Empty;;1;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF
+0x3902; MQI_Full;No space left for more messages;2;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF
+0x3903; MQI_NoReplyPartner;Returned if a reply method was called without partner;3;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF
+0x3904; MQI_DestinationInvalid;Returned if the target destination is invalid.;4;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF
+0x3801; MUX_NotEnoughResources;;1;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3802; MUX_InsufficientMemory;;2;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3803; MUX_NoPrivilege;;3;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3804; MUX_WrongAttributeSetting;;4;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3805; MUX_MutexAlreadyLocked;;5;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3806; MUX_MutexNotFound;;6;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3807; MUX_MutexMaxLocks;;7;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3808; MUX_CurrThreadAlreadyOwnsMutex;;8;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x3809; MUX_CurrThreadDoesNotOwnMutex;;9;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x380a; MUX_MutexTimeout;;10;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x380b; MUX_MutexInvalidId;;11;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x380c; MUX_MutexDestroyedWhileWaiting;;12;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF
+0x4200; FILS_GenericFileError;;0;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4201; FILS_IsBusy;;1;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4202; FILS_InvalidParameters;;2;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4205; FILS_FileDoesNotExist;;5;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4206; FILS_FileAlreadyExists;;6;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4207; FILS_FileLocked;;7;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x420a; FILS_DirectoryDoesNotExist;;10;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x420b; FILS_DirectoryAlreadyExists;;11;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x420c; FILS_DirectoryNotEmpty;;12;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x420f; FILS_SequencePacketMissingWrite;;15;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x4210; FILS_SequencePacketMissingRead;;16;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM
+0x601; PP_DoItMyself;;1;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x602; PP_PointsToVariable;;2;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x603; PP_PointsToMemory;;3;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x604; PP_ActivityCompleted;;4;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x605; PP_PointsToVectorUint8;;5;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x606; PP_PointsToVectorUint16;;6;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x607; PP_PointsToVectorUint32;;7;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x608; PP_PointsToVectorFloat;;8;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6a0; PP_DumpNotSupported;;0xA0;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e0; PP_InvalidSize;;0xE0;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e1; PP_InvalidAddress;;0xE1;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e2; PP_InvalidContent;;0xE2;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e3; PP_UnalignedAccess;;0xE3;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x6e4; PP_WriteProtected;;0xE4;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF
+0x13e0; MH_UnknownCmd;;0xE0;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER
+0x13e1; MH_InvalidAddress;;0xE1;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER
+0x13e2; MH_InvalidSize;;0xE2;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER
+0x13e3; MH_StateMismatch;;0xE3;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER
+0xe01; HM_InvalidMode;;0x01;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF
+0xe02; HM_TransNotAllowed;;0x02;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF
+0xe03; HM_InTransition;;0x03;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF
+0xe04; HM_InvalidSubmode;;0x04;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF
+0x3001; LIM_Unchecked;;1;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3002; LIM_Invalid;;2;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3003; LIM_Unselected;;3;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3004; LIM_BelowLowLimit;;4;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3005; LIM_AboveHighLimit;;5;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3006; LIM_UnexpectedValue;;6;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x3007; LIM_OutOfRange;;7;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30a0; LIM_FirstSample;;0xA0;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30e0; LIM_InvalidSize;;0xE0;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30e1; LIM_WrongType;;0xE1;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30e2; LIM_WrongPid;;0xE2;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30e3; LIM_WrongLimitId;;0xE3;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x30ee; LIM_MonitorNotFound;;0xEE;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF
+0x1a01; TRC_NotEnoughSensors;;1;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x1a02; TRC_LowestValueOol;;2;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x1a03; TRC_HighestValueOol;;3;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x1a04; TRC_BothValuesOol;;4;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x1a05; TRC_DuplexOol;;5;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK
+0x201; OM_InsertionFailed;;1;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF
+0x202; OM_NotFound;;2;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF
+0x203; OM_ChildInitFailed;;3;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF
+0x204; OM_InternalErrReporterUninit;;4;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF
+0x200; OM_ConnBroken;;0;fsfw\src\fsfw\osal\common\TcpTmTcServer.h;OBJECT_MANAGER_IF
+0x2901; IEC_NoConfigurationTable;;0x01;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2902; IEC_NoCpuTable;;0x02;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2903; IEC_InvalidWorkspaceAddress;;0x03;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2904; IEC_TooLittleWorkspace;;0x04;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2905; IEC_WorkspaceAllocation;;0x05;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2906; IEC_InterruptStackTooSmall;;0x06;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2907; IEC_ThreadExitted;;0x07;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2908; IEC_InconsistentMpInformation;;0x08;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2909; IEC_InvalidNode;;0x09;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290a; IEC_NoMpci;;0x0a;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290b; IEC_BadPacket;;0x0b;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290c; IEC_OutOfPackets;;0x0c;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290d; IEC_OutOfGlobalObjects;;0x0d;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290e; IEC_OutOfProxies;;0x0e;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x290f; IEC_InvalidGlobalId;;0x0f;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2910; IEC_BadStackHook;;0x10;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2911; IEC_BadAttributes;;0x11;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2912; IEC_ImplementationKeyCreateInconsistency;;0x12;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2913; IEC_ImplementationBlockingOperationCancel;;0x13;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2914; IEC_MutexObtainFromBadState;;0x14;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2915; IEC_UnlimitedAndMaximumIs0;;0x15;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES
+0x2d01; HPA_InvalidIdentifierId;;0x01;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF
+0x2d02; HPA_InvalidDomainId;;0x02;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF
+0x2d03; HPA_InvalidValue;;0x03;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF
+0x2d05; HPA_ReadOnly;;0x05;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF
+0x2c01; PAW_UnknownDatatype;;0x01;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c02; PAW_DatatypeMissmatch;;0x02;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c03; PAW_Readonly;;0x03;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c04; PAW_TooBig;;0x04;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c05; PAW_SourceNotSet;;0x05;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c06; PAW_OutOfBounds;;0x06;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c07; PAW_NotSet;;0x07;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2c08; PAW_ColumnOrRowsZero;;0x08;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER
+0x2f01; POS_InPowerTransition;;1;fsfw\src\fsfw\power\PowerSwitcher.h;POWER_SWITCHER
+0x2f02; POS_SwitchStateMismatch;;2;fsfw\src\fsfw\power\PowerSwitcher.h;POWER_SWITCHER
+0x501; PS_SwitchOn;;1;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x500; PS_SwitchOff;;0;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x502; PS_SwitchTimeout;;2;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x503; PS_FuseOn;;3;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x504; PS_FuseOff;;4;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF
+0x4101; PUS11_InvalidTypeTimeWindow;;1;fsfw\src\fsfw\pus\Service11TelecommandScheduling.h;PUS_SERVICE_11
+0x4102; PUS11_TimeshiftingNotPossible;;2;fsfw\src\fsfw\pus\Service11TelecommandScheduling.h;PUS_SERVICE_11
+0x4103; PUS11_InvalidRelativeTime;;3;fsfw\src\fsfw\pus\Service11TelecommandScheduling.h;PUS_SERVICE_11
+0x4e1; RMP_CommandNoDescriptorsAvailable;;0xE1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e2; RMP_CommandBufferFull;;0xE2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e3; RMP_CommandChannelOutOfRange;;0xE3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e6; RMP_CommandChannelDeactivated;;0xE6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e7; RMP_CommandPortOutOfRange;;0xE7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e8; RMP_CommandPortInUse;;0xE8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4e9; RMP_CommandNoChannel;;0xE9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4ea; RMP_NoHwCrc;;0xEA;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d0; RMP_ReplyNoReply;;0xD0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d1; RMP_ReplyNotSent;;0xD1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d2; RMP_ReplyNotYetSent;;0xD2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d3; RMP_ReplyMissmatch;;0xD3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4d4; RMP_ReplyTimeout;;0xD4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4c0; RMP_ReplyInterfaceBusy;;0xC0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4c1; RMP_ReplyTransmissionError;;0xC1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4c2; RMP_ReplyInvalidData;;0xC2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4c3; RMP_ReplyNotSupported;;0xC3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f0; RMP_LinkDown;;0xF0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f1; RMP_SpwCredit;;0xF1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f2; RMP_SpwEscape;;0xF2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f3; RMP_SpwDisconnect;;0xF3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f4; RMP_SpwParity;;0xF4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f5; RMP_SpwWriteSync;;0xF5;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f6; RMP_SpwInvalidAddress;;0xF6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f7; RMP_SpwEarlyEop;;0xF7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f8; RMP_SpwDma;;0xF8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x4f9; RMP_SpwLinkError;;0xF9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x400; RMP_ReplyOk;;0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x401; RMP_ReplyGeneralErrorCode;;1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x402; RMP_ReplyUnusedPacketTypeOrCommandCode;;2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x403; RMP_ReplyInvalidKey;;3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x404; RMP_ReplyInvalidDataCrc;;4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x405; RMP_ReplyEarlyEop;;5;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x406; RMP_ReplyTooMuchData;;6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x407; RMP_ReplyEep;;7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x408; RMP_ReplyReserved;;8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x409; RMP_ReplyVerifyBufferOverrun;;9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x40a; RMP_ReplyCommandNotImplementedOrNotAuthorised;;10;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x40b; RMP_ReplyRmwDataLengthError;;11;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x40c; RMP_ReplyInvalidTargetLogicalAddress;;12;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL
+0x1401; SE_BufferTooShort;;1;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF
+0x1402; SE_StreamTooShort;;2;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF
+0x1403; SE_TooManyElements;;3;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF
+0x2701; SM_DataTooLarge;;1;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2702; SM_DataStorageFull;;2;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2703; SM_IllegalStorageId;;3;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2704; SM_DataDoesNotExist;;4;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2705; SM_IllegalAddress;;5;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0x2706; SM_PoolTooLarge;;6;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF
+0xc02; MS_InvalidEntry;;0x02;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF
+0xc03; MS_TooManyElements;;0x03;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF
+0xc04; MS_CantStoreEmpty;;0x04;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF
+0xd01; SS_SequenceAlreadyExists;;0x01;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd02; SS_TableAlreadyExists;;0x02;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd03; SS_TableDoesNotExist;;0x03;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd04; SS_TableOrSequenceLengthInvalid;;0x04;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd05; SS_SequenceDoesNotExist;;0x05;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd06; SS_TableContainsInvalidObjectId;;0x06;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd07; SS_FallbackSequenceDoesNotExist;;0x07;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd08; SS_NoTargetTable;;0x08;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd09; SS_SequenceOrTableTooLong;;0x09;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd0b; SS_IsFallbackSequence;;0x0B;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd0c; SS_AccessDenied;;0x0C;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xd0e; SS_TableInUse;;0x0E;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xda1; SS_TargetTableNotReached;;0xA1;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xda2; SS_TableCheckFailed;;0xA2;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM
+0xb01; SB_ChildNotFound;;0x01;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0xb02; SB_ChildInfoUpdated;;0x02;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0xb03; SB_ChildDoesntHaveModes;;0x03;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0xb04; SB_CouldNotInsertChild;;0x04;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0xb05; SB_TableContainsInvalidObjectId;;0x05;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE
+0x3a01; SPH_SemaphoreTimeout;;1;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF
+0x3a02; SPH_SemaphoreNotOwned;;2;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF
+0x3a03; SPH_SemaphoreInvalid;;3;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF
+0x1c01; TCD_PacketLost;;1;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION
+0x1c02; TCD_DestinationNotFound;;2;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION
+0x1c03; TCD_ServiceIdAlreadyExists;;3;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION
+0x1b00; TCC_IllegalApid;;0;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b01; TCC_IncompletePacket;;1;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b02; TCC_IncorrectChecksum;;2;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b03; TCC_IllegalPacketType;;3;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b04; TCC_IllegalPacketSubtype;;4;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b05; TCC_IncorrectPrimaryHeader;;5;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x1b06; TCC_IncorrectSecondaryHeader;;6;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK
+0x2801; TC_InvalidTargetState;;1;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF
+0x28f1; TC_AboveOperationalLimit;;0xF1;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF
+0x28f2; TC_BelowOperationalLimit;;0xF2;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF
+0x1000; TIM_UnsupportedTimeFormat;;0;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1001; TIM_NotEnoughInformationForTargetFormat;;1;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1002; TIM_LengthMismatch;;2;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1003; TIM_InvalidTimeFormat;;3;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1004; TIM_InvalidDayOfYear;;4;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x1005; TIM_TimeDoesNotFitFormat;;5;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS
+0x3601; TSI_BadTimestamp;;1;fsfw\src\fsfw\timemanager\TimeStamperIF.h;TIME_STAMPER_IF
+0x2001; TMB_Busy;;1;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2002; TMB_Full;;2;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2003; TMB_Empty;;3;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2004; TMB_NullRequested;;4;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2005; TMB_TooLarge;;5;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2006; TMB_NotReady;;6;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2007; TMB_DumpError;;7;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2008; TMB_CrcError;;8;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2009; TMB_Timeout;;9;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200a; TMB_IdlePacketFound;;10;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200b; TMB_TelecommandFound;;11;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200c; TMB_NoPusATm;;12;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200d; TMB_TooSmall;;13;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200e; TMB_BlockNotFound;;14;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x200f; TMB_InvalidRequest;;15;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF
+0x2101; TMF_Busy;;1;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2102; TMF_LastPacketFound;;2;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2103; TMF_StopFetch;;3;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2104; TMF_Timeout;;4;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2105; TMF_TmChannelFull;;5;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2106; TMF_NotStored;;6;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2107; TMF_AllDeleted;;7;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2108; TMF_InvalidData;;8;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x2109; TMF_NotReady;;9;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF
+0x1d01; PUS_ActivityStarted;;1;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1d02; PUS_InvalidSubservice;;2;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1d03; PUS_IllegalApplicationData;;3;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1d04; PUS_SendTmFailed;;4;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1d05; PUS_Timeout;;5;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF
+0x1f01; CSB_ExecutionComplete;;1;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f02; CSB_NoStepMessage;;2;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f03; CSB_ObjectBusy;;3;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f04; CSB_Busy;;4;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f05; CSB_InvalidTc;;5;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f06; CSB_InvalidObject;;6;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x1f07; CSB_InvalidReply;;7;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE
+0x4b00; SPPA_NoPacketFound;;0x00;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER
+0x4b01; SPPA_SplitPacket;;0x01;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER
+0x68a0; FSHLP_SdNotMounted;SD card specified with path string not mounted;0xA0;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER
+0x68a1; FSHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER
+0x7400; SCBU_KeyNotFound;;0;bsp_q7s\memory\scratchApi.h;SCRATCH_BUFFER
+0x7300; SDMA_OpOngoing;;0;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x7301; SDMA_AlreadyOn;;1;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x7302; SDMA_AlreadyMounted;;2;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x7303; SDMA_AlreadyOff;;3;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x730a; SDMA_StatusFileNexists;;10;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x730b; SDMA_StatusFileFormatInvalid;;11;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x730c; SDMA_MountError;;12;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x730d; SDMA_UnmountError;;13;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x730e; SDMA_SystemCallError;;14;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x730f; SDMA_PopenCallError;;15;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER
+0x6ba0; MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;0xA0;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba1; MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;0xA1;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba2; MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;0xA2;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba3; MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;0xA3;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba4; MPSOCRTVIF_InvalidLength;Received command with invalid length;0xA4;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba5; MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;0xA5;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba6; MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;0xA6;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba7; MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);0xA7;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba8; MPSOCRTVIF_InvalidParameter;Command has invalid parameter;0xA8;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x6ba9; MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;0xA9;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF
+0x58e0; DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);0xE0;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD
+0x58e1; DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);0xE1;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD
+0x6ca0; SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;0xA0;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca1; SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;0xA1;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca2; SPVRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;0xA2;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca3; SPVRTVIF_InvalidApid;Received space packet with invalid APID from PLOC supervisor;0xA3;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca4; SPVRTVIF_GetTimeFailure;Failed to read current system time;0xA4;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca5; SPVRTVIF_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;0xA5;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca6; SPVRTVIF_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;0xA6;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca7; SPVRTVIF_InvalidLatchupId;Received latchup config command with invalid latchup ID;0xA7;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca8; SPVRTVIF_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;0xA8;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6ca9; SPVRTVIF_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;0xA9;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6caa; SPVRTVIF_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;0xAA;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6cab; SPVRTVIF_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);0xAB;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6cac; SPVRTVIF_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;0xAC;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6cad; SPVRTVIF_PathDoesNotExist;Path to PLOC directory on SD card does not exist;0xAD;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6cae; SPVRTVIF_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;0xAE;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6caf; SPVRTVIF_InvalidLength;Received action command has invalid length;0xAF;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6cb0; SPVRTVIF_FilenameTooLong;Filename too long;0xB0;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6cb1; SPVRTVIF_UpdateStatusReportInvalidLength;Received update status report with invalid packet length field;0xB1;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6cb2; SPVRTVIF_UpdateCrcFailure;Update status report does not contain expected CRC. There might be a bit flip in the update memory region.;0xB2;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x6cb3; SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);0xB3;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF
+0x62a0; PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;0xA0;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER
+0x62a1; PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;0xA1;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER
+0x69a0; PLMPHLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocMPSoCHelper.h;PLOC_MPSOC_HELPER
+0x5ba0; PLSPVhLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER
+0x5ba1; PLSPVhLP_ProcessTerminated;Process has been terminated by command;0xA1;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER
+0x5ba2; PLSPVhLP_PathNotExists;Received command with invalid pathname;0xA2;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER
+0x5ba3; PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;0xA3;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER
+0x57a0; STRH_TemperatureReqFailed;Status in temperature reply signals error;0xA0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57a1; STRH_PingFailed;Ping command failed;0xA1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57a2; STRH_VersionReqFailed;Status in version reply signals error;0xA2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x6601; JSONBASE_JsonFileNotExists;Specified json file does not exist;1;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
+0x6602; JSONBASE_SetNotExists;Requested set does not exist in json file;2;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
+0x6603; JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE
+0x57a3; STRH_InterfaceReqFailed;Status in interface reply signals error;0xA3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57a4; STRH_PowerReqFailed;Status in power reply signals error;0xA4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57a5; STRH_SetParamFailed;Status of reply to parameter set command signals error;0xA5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57a6; STRH_ActionFailed;Status of reply to action command signals error;0xA6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57a7; STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;0xA7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57a8; STRH_FilenameTooLong;Name of file received with command is too long;0xA8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57a9; STRH_InvalidProgram;Received version reply with invalid program ID;0xA9;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57aa; STRH_ReplyError;Status field reply signals error;0xAA;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57ab; STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);0xAB;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57ac; STRH_InvalidLength;Received command with invalid length (too few or too many parameters);0xAC;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57ad; STRH_RegionMismatch;Region mismatch between send and received data;0xAD;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57ae; STRH_AddressMismatch;Address mismatch between send and received data;0xAE;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57af; STRH_LengthMismatch;Length field mismatch between send and received data;0xAF;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b0; STRH_FileNotExists;Specified file does not exist;0xB0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b1; STRH_InvalidType;Download blob pixel command has invalid type field;0xB1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b2; STRH_InvalidId;Received FPGA action command with invalid ID;0xB2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b3; STRH_ReplyTooShort;Received reply is too short;0xB3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b4; STRH_CrcFailure;Received reply with invalid CRC;0xB4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b5; STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;0xB5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b6; STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;0xB6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b7; STRH_StartrackerRunningFirmware;Star tracker is in firmware mode but must be in bootloader mode to execute this command;0xB7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x57b8; STRH_StartrackerRunningBootloader;Star tracker is in bootloader mode but must be in firmware mode to execute this command;0xB8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER
+0x60a0; STRHLP_SdNotMounted;SD card specified in path string not mounted;0xA0;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x60a1; STRHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x60a2; STRHLP_PathNotExists;Specified path does not exist;0xA2;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x60a3; STRHLP_FileCreationFailed;Failed to create download image or read flash file;0xA3;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x60a4; STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;0xA4;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x60a5; STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;0xA5;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x60a6; STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;0xA6;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x60a7; STRHLP_StatusError;Status field in reply signals error;0xA7;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x60a8; STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);0xA8;linux\devices\startracker\StrHelper.h;STR_HELPER
+0x5da0; IPCI_PapbBusy;;0xA0;linux\obc\PapbVcInterface.h;CCSDS_IP_CORE_BRIDGE
+0x63a0; PDEC_AbandonedCltu;;0xA0;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a1; PDEC_FrameDirty;;0xA1;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a2; PDEC_FrameIllegalMultipleReasons;;0xA2;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a3; PDEC_AdDiscardedLockout;;0xA3;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a4; PDEC_AdDiscardedWait;;0xA4;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a5; PDEC_AdDiscardedNsVs;;0xA5;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63b0; PDEC_CommandNotImplemented;Received action message with unknown action id;0xB0;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a6; PDEC_NoReport;;0xA6;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a7; PDEC_ErrorVersionNumber;;0xA7;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a8; PDEC_IllegalCombination;;0xA8;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63a9; PDEC_InvalidScId;;0xA9;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63aa; PDEC_InvalidVcIdMsb;;0xAA;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63ab; PDEC_InvalidVcIdLsb;;0xAB;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63ac; PDEC_NsNotZero;;0xAC;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x63ae; PDEC_InvalidBcCc;;0xAE;linux\obc\PdecHandler.h;PDEC_HANDLER
+0x5ea0; PTME_UnknownVcId;;0xA0;linux\obc\Ptme.h;PTME
+0x65a0; RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;0xA0;linux\obc\PtmeConfig.h;RATE_SETTER
+0x65a1; RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);0xA1;linux\obc\PtmeConfig.h;RATE_SETTER
+0x65a2; RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;0xA2;linux\obc\PtmeConfig.h;RATE_SETTER
+0x65a3; RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;0xA3;linux\obc\PtmeConfig.h;RATE_SETTER
diff --git a/gomspace/gomspace_common.py b/gomspace/gomspace_common.py
index aff5d20..4e6ad5a 100644
--- a/gomspace/gomspace_common.py
+++ b/gomspace/gomspace_common.py
@@ -7,9 +7,11 @@
@date 17.12.2020
"""
import enum
+import struct
from tmtccmd.tc.pus_8_funccmd import generate_action_command
from tmtccmd.tc.definitions import PusTelecommand
+from tmtccmd.utility import ObjectId
class GomspaceDeviceActionIds(enum.IntEnum):
@@ -29,11 +31,15 @@ class GomspaceOpCodes:
REQUEST_AUX_HK_ONCE = ["hk-aux", "129"]
PRINT_SWITCH_V_I = ["print-switch-vi", "130"]
PRINT_LATCHUPS = ["print-latchups", "131"]
+ GET_PARAM = ["get-param", "132"]
+ SET_PARAM = ["set-param", "133"]
class Info:
REQUEST_CORE_HK_ONCE = "Requesting Core HK once"
REQUEST_AUX_HK_ONCE = "Requesting Aux HK once"
+ GET_PARAMETER = "Get parameter"
+ SET_PARAMETER = "Set parameter"
class SetIds:
@@ -43,7 +49,8 @@ class SetIds:
PDU_2_AUX = 4
P60_CORE = 5
P60_AUX = 6
- ACU = 7
+ ACU_CORE = 7
+ ACU_AUX = 8
class TableIds:
@@ -67,7 +74,7 @@ class Channel:
def pack_get_param_command(
- object_id: bytearray, table_id: int, memory_address: bytearray, parameter_size: int
+ object_id: bytes, table_id: int, memory_address: bytearray, parameter_size: int
) -> PusTelecommand:
"""Function to generate a command to retrieve parameters like the temperature from a gomspace device.
@param object_id: The object id of the gomspace device handler.
@@ -76,10 +83,9 @@ def pack_get_param_command(
@param parameter_size: Size of the value to read. E.g. temperature is uint16_t and thus parameter_size is 2
@return: The command as bytearray.
"""
- app_data = bytearray()
- app_data.append(table_id)
- app_data.extend(memory_address)
- app_data.append(parameter_size)
+ app_data = struct.pack('!B', table_id)
+ app_data += struct.pack('!H', memory_address)
+ app_data += struct.pack('!B', parameter_size)
return generate_action_command(
object_id=object_id,
action_id=GomspaceDeviceActionIds.PARAM_GET,
@@ -88,7 +94,7 @@ def pack_get_param_command(
def pack_set_param_command(
- object_id: bytearray,
+ object_id: bytes,
memory_address: bytearray,
parameter_size: int,
parameter: int,
@@ -110,10 +116,7 @@ def pack_set_param_command(
if parameter_size == 1:
app_data.append(parameter)
elif parameter_size == 2:
- byte_one = 0xFF00 & parameter >> 8
- byte_two = 0xFF & parameter
- app_data.append(byte_one)
- app_data.append(byte_two)
+ app_data += struct.pack('!H', parameter)
elif parameter_size == 4:
byte_one = 0xFF000000 & parameter >> 24
byte_two = 0xFF0000 & parameter >> 16
@@ -128,7 +131,7 @@ def pack_set_param_command(
)
-def pack_ping_command(object_id: bytearray, data: bytearray) -> PusTelecommand:
+def pack_ping_command(object_id: ObjectId, data: bytearray) -> PusTelecommand:
""" " Function to generate the command to ping a gomspace device
@param object_id Object Id of the gomspace device handler.
@param data Bytearray containing the bytes to send to the gomspace device. For now the on board software
@@ -137,33 +140,35 @@ def pack_ping_command(object_id: bytearray, data: bytearray) -> PusTelecommand:
data are simply copied by the device and then sent back.
"""
return generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.PING, app_data=data
+ object_id=object_id.as_bytes,
+ action_id=GomspaceDeviceActionIds.PING,
+ app_data=data,
)
-def pack_gnd_wdt_reset_command(object_id: bytearray) -> PusTelecommand:
+def pack_gnd_wdt_reset_command(object_id: ObjectId) -> PusTelecommand:
""" " Function to generate the command to reset the watchdog of a gomspace device.
@param object_id Object Id of the gomspace device handler.
"""
return generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.WDT_RESET
+ object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.WDT_RESET
)
-def pack_reboot_command(object_id: bytearray) -> PusTelecommand:
+def pack_reboot_command(object_id: ObjectId) -> PusTelecommand:
"""Function to generate the command which triggers a reboot of a gomspace device
@param object_id The object id of the gomspace device handler.
"""
return generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.REBOOT
+ object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.REBOOT
)
-def pack_request_full_hk_table_command(object_id: bytearray) -> PusTelecommand:
+def pack_request_full_hk_table_command(object_id: ObjectId) -> PusTelecommand:
"""Function to generate the command to request the full housekeeping table from a gomspace
device.
@param object_id The object id of the gomspace device handler.
"""
return generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.REQUEST_HK_TABLE
+ object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.REQUEST_HK_TABLE
)
diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py
index dc21110..061884f 100644
--- a/pus_tc/cmd_definitions.py
+++ b/pus_tc/cmd_definitions.py
@@ -1,4 +1,4 @@
-from pus_tc.devs.gps import GpsOpCodes
+from pus_tc.system.proc import add_proc_cmds
from tmtccmd.config import (
add_op_code_entry,
add_service_op_code_entry,
@@ -6,19 +6,28 @@ from tmtccmd.config import (
ServiceOpCodeDictT,
OpCodeDictKeys,
)
-from config.definitions import CustomServiceList
+from tmtccmd.config.globals import get_default_service_op_code_dict
+
+from pus_tc.devs.gps import add_gps_cmds
+from pus_tc.devs.pcdu import add_pcdu_cmds
+from pus_tc.devs.plpcdu import add_pl_pcdu_cmds
+from pus_tc.devs.rad_sensor import add_rad_sens_cmds
+from pus_tc.system.core import add_core_controller_definitions
from pus_tc.devs.heater import add_heater_cmds
+from pus_tc.devs.rtd import specify_rtd_cmds
from pus_tc.devs.reaction_wheels import add_rw_cmds
from pus_tc.devs.bpx_batt import BpxOpCodes
+from config.definitions import CustomServiceList
+
def get_eive_service_op_code_dict() -> ServiceOpCodeDictT:
- from tmtccmd.config.globals import get_default_service_op_code_dict
service_op_code_dict = get_default_service_op_code_dict()
add_bpx_cmd_definitions(cmd_dict=service_op_code_dict)
add_core_controller_definitions(cmd_dict=service_op_code_dict)
add_pl_pcdu_cmds(cmd_dict=service_op_code_dict)
add_pcdu_cmds(cmd_dict=service_op_code_dict)
+ specify_rtd_cmds(cmd_dict=service_op_code_dict)
add_imtq_cmds(cmd_dict=service_op_code_dict)
add_rad_sens_cmds(cmd_dict=service_op_code_dict)
add_rw_cmds(cmd_dict=service_op_code_dict)
@@ -33,6 +42,7 @@ def get_eive_service_op_code_dict() -> ServiceOpCodeDictT:
add_pdec_cmds(cmd_dict=service_op_code_dict)
add_heater_cmds(cmd_dict=service_op_code_dict)
add_tmp_sens_cmds(cmd_dict=service_op_code_dict)
+ add_proc_cmds(cmd_dict=service_op_code_dict)
return service_op_code_dict
@@ -83,15 +93,6 @@ def add_ccsds_cmds(cmd_dict: ServiceOpCodeDictT):
cmd_dict[CustomServiceList.CCSDS_HANDLER.value] = service_ccsds_handler_tuple
-def add_gps_cmds(cmd_dict: ServiceOpCodeDictT):
- op_code_dict = {
- GpsOpCodes.RESET_GNSS.value: ("Reset GPS", {OpCodeDictKeys.TIMEOUT: 2.0})
- }
- service_tuple = ("GPS 0", op_code_dict)
- cmd_dict[CustomServiceList.GPS_0.value] = service_tuple
- cmd_dict[CustomServiceList.GPS_1.value] = service_tuple
-
-
def add_str_cmds(cmd_dict: ServiceOpCodeDictT):
op_code_dict_srv_star_tracker = {
"0": (
@@ -316,147 +317,6 @@ def add_bpx_cmd_definitions(cmd_dict: ServiceOpCodeDictT):
)
-def add_core_controller_definitions(cmd_dict: ServiceOpCodeDictT):
- from pus_tc.system.core import OpCodes
-
- od = dict()
- add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT, info="Reboot with Prompt")
- add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_SELF, info="Reboot Self")
- add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_0_0, info="Reboot 0 0")
- add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_0_1, info="Reboot 0 1")
- add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_1_0, info="Reboot 1 0")
- add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_1_1, info="Reboot 1 1")
- add_op_code_entry(
- op_code_dict=od,
- keys=OpCodes.ENABLE_REBOOT_FILE_HANDLING,
- info="Enable reboot file handling",
- )
- add_op_code_entry(
- op_code_dict=od,
- keys=OpCodes.DISABLE_REBOOT_FILE_HANDLING,
- info="Disable reboot file handling",
- )
- add_op_code_entry(
- op_code_dict=od,
- keys=OpCodes.RESET_ALL_REBOOT_COUNTERS,
- info="Reset all reboot counters",
- )
- add_op_code_entry(
- op_code_dict=od,
- keys=OpCodes.RESET_REBOOT_COUNTER_00,
- info="Reset reboot counter 0 0",
- )
- add_op_code_entry(
- op_code_dict=od,
- keys=OpCodes.RESET_REBOOT_COUNTER_01,
- info="Reset reboot counter 0 1",
- )
- add_op_code_entry(
- op_code_dict=od,
- keys=OpCodes.RESET_REBOOT_COUNTER_10,
- info="Reset reboot counter 1 0",
- )
- add_op_code_entry(
- op_code_dict=od,
- keys=OpCodes.RESET_REBOOT_COUNTER_11,
- info="Reset reboot counter 1 1",
- )
- add_op_code_entry(
- op_code_dict=od,
- keys=OpCodes.GET_HK,
- info="Request housekeeping set",
- )
- add_service_op_code_entry(
- srv_op_code_dict=cmd_dict,
- name=CustomServiceList.CORE.value,
- info="Reboot Self",
- op_code_entry=od,
- )
-
-
-def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
- from pus_tc.devs.plpcdu import OpCodes, Info
-
- op_code_dict = dict()
- add_op_code_entry(
- op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.NORMAL_SSR,
- info=Info.NORMAL_SSR,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.NORMAL_DRO,
- info=Info.NORMAL_DRO,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.NORMAL_X8,
- info=Info.NORMAL_X8,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.NORMAL_TX,
- info=Info.NORMAL_TX,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.NORMAL_MPA,
- info=Info.NORMAL_MPA,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.NORMAL_HPA,
- info=Info.NORMAL_HPA,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.UPDATE_DRO_TO_X8_WAIT,
- info="Update DRO to X8 wait time",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.INJECT_SSR_TO_DRO_FAILURE,
- info="Inject failure SSR to DRO transition",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.INJECT_DRO_TO_X8_FAILURE,
- info="Inject failure in DRO to X8 transition",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.INJECT_X8_TO_TX_FAILURE,
- info="Inject failure in X8 to TX transition",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.INJECT_TX_TO_MPA_FAILURE,
- info="Inject failure in TX to MPA transition",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.INJECT_MPA_TO_HPA_FAILURE,
- info="Inject failure in MPA to HPA transition",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=OpCodes.INJECT_ALL_ON_FAILURE,
- info="Inject failure in all on mode",
- )
- add_service_op_code_entry(
- srv_op_code_dict=cmd_dict,
- name=CustomServiceList.PL_PCDU.value,
- info="PL PCDU",
- op_code_entry=op_code_dict,
- )
-
-
def add_time_cmds(cmd_dict: ServiceOpCodeDictT):
from pus_tc.system.time import OpCodes, Info
@@ -474,319 +334,30 @@ def add_time_cmds(cmd_dict: ServiceOpCodeDictT):
)
-def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
- from pus_tc.devs.p60dock import P60OpCodes, GomspaceOpCodes, Info
- from pus_tc.devs.pdu1 import Pdu1OpCodes
- from pus_tc.devs.pdu2 import Pdu2OpCodes
- from gomspace.gomspace_common import Info as GsInfo
-
- op_code_dict = dict()
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=P60OpCodes.STACK_3V3_ON,
- info=Info.STACK_3V3_ON,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=P60OpCodes.STACK_3V3_OFF,
- info=Info.STACK_3V3_OFF,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=P60OpCodes.STACK_5V_ON,
- info=Info.STACK_5V_ON,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=P60OpCodes.STACK_5V_OFF,
- info=Info.STACK_5V_OFF,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
- info=GsInfo.REQUEST_CORE_HK_ONCE,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE,
- info=GsInfo.REQUEST_AUX_HK_ONCE,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_SWITCH_V_I,
- info="P60 Dock: Print Switches, Voltages, Currents",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_LATCHUPS,
- info="P60 Dock: Print Latchups",
- )
- add_op_code_entry(op_code_dict=op_code_dict, keys=P60OpCodes.TEST, info="P60 Tests")
- add_service_op_code_entry(
- srv_op_code_dict=cmd_dict,
- name=CustomServiceList.P60DOCK.value,
- info="P60 Device",
- op_code_entry=op_code_dict,
- )
-
- op_code_dict = dict()
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.TCS_BOARD_ON.value,
- info="PDU1: Turn TCS board on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.TCS_BOARD_OFF.value,
- info="PDU1: Turn TCS board off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.STAR_TRACKER_ON.value,
- info="PDU1: Turn star tracker on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.STAR_TRACKER_OFF.value,
- info="PDU1: Turn star tracker off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.SUS_NOMINAL_ON.value,
- info="PDU1: Turn SUS nominal on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.SUS_NOMINAL_OFF.value,
- info="PDU1: Turn SUS nominal off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.ACS_A_SIDE_ON.value,
- info="PDU1: Turn ACS A side on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.ACS_A_SIDE_OFF.value,
- info="PDU1: Turn ACS A side off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.SYRLINKS_ON.value,
- info="PDU1: Turn Syrlinks on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.SYRLINKS_OFF.value,
- info="PDU1: Turn Syrlinks off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.MGT_ON.value,
- info="PDU1: Turn MGT on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.MGT_OFF.value,
- info="PDU1: Turn MGT off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.PLOC_ON.value,
- info="PDU1: Turn PLOC on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.PLOC_OFF.value,
- info="PDU1: Turn PLOC off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.SCEX_ON.value,
- info="PDU1: Turn Solar Cell Experiment on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu1OpCodes.SCEX_OFF.value,
- info="PDU1: Turn Solar Cell Experiment off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
- info=GsInfo.REQUEST_CORE_HK_ONCE,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE,
- info=GsInfo.REQUEST_AUX_HK_ONCE,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_SWITCH_V_I,
- info="PDU1: Print Switches, Voltages, Currents",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_LATCHUPS,
- info="PDU1: Print Latchups",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict, keys=Pdu1OpCodes.TESTS.value, info="PDU1 Tests"
- )
- add_service_op_code_entry(
- srv_op_code_dict=cmd_dict,
- name=CustomServiceList.PDU1.value,
- info="PDU1 Device",
- op_code_entry=op_code_dict,
- )
-
- op_code_dict = dict()
- add_op_code_entry(op_code_dict=op_code_dict, keys="0", info="PDU2 Tests")
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.ACS_SIDE_B_ON.value,
- info="PDU2: Turn ACS Side B on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.ACS_SIDE_B_OFF.value,
- info="PDU2: Turn ACS Side B off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.SUS_REDUNDANT_ON.value,
- info="PDU2: Turn SUS redundant on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.SUS_REDUNDANT_OFF.value,
- info="PDU2: Turn SUS redundant off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.RW_ON.value,
- info="PDU2: Turn reaction wheels on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.RW_OFF.value,
- info="PDU2: Turn reaction wheels off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.PL_PCDU_VBAT_NOM_ON.value,
- info="PDU2: PL PCDU Switch Channel Nominal (1) on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.PL_PCDU_VBAT_NOM_OFF.value,
- info="PDU2: PL PCDU Switch Channel Nominal (1) off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.PL_PCDU_VBAT_RED_ON.value,
- info="PDU2: PL PCDU Switch Channel Redundant (1) on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.PL_PCDU_VBAT_RED_OFF.value,
- info="PDU2: PL PCDU Switch Channel Redundant (1) off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.TCS_HEATER_IN_ON.value,
- info="PDU2: Switch TCS Heater Input on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.TCS_HEATER_IN_OFF.value,
- info="PDU2: Switch TCS Heater Input off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.SOLAR_ARRAY_DEPL_ON.value,
- info="PDU2: Switch Solar Array Deployment On",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.SOLAR_ARRAY_DEPL_OFF.value,
- info="PDU2: Switch Solar Array Deployment Off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.PL_CAMERA_ON.value,
- info="PDU2: Turn payload camera on",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=Pdu2OpCodes.PL_CAMERA_OFF.value,
- info="PDU2: Turn payload camera off",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
- info=GsInfo.REQUEST_CORE_HK_ONCE,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE,
- info=GsInfo.REQUEST_AUX_HK_ONCE,
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_SWITCH_V_I,
- info="PDU2: Print Switches, Voltages, Currents",
- options={OpCodeDictKeys.TIMEOUT: 2.0},
- )
- add_op_code_entry(
- op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_LATCHUPS,
- info="PDU2: Print Latchups",
- )
- add_service_op_code_entry(
- srv_op_code_dict=cmd_dict,
- name="pdu2",
- info="PDU2 Device",
- op_code_entry=op_code_dict,
- )
- op_code_dict = {
- "0": ("ACU: Tests", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "51": ("ACU: Print channel statistics", {OpCodeDictKeys.TIMEOUT: 2.0}),
- }
- service_tuple = ("ACU Devices", op_code_dict)
- cmd_dict[CustomServiceList.ACU.value] = service_tuple
-
-
def add_imtq_cmds(cmd_dict: ServiceOpCodeDictT):
op_code_dict_srv_imtq = {
- "0": ("IMTQ Tests All", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "1": ("IMTQ perform pos X self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "2": ("IMTQ perform neg X self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "3": ("IMTQ perform pos Y self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "4": ("IMTQ perform neg Y self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "5": ("IMTQ perform pos Z self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "6": ("IMTQ perform neg Z self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "7": ("IMTQ command dipole", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "8": ("IMTQ get commanded dipole", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "0": ("Mode off", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "1": ("Mode on", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "2": ("Mode normal", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "3": ("IMTQ perform pos X self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "4": ("IMTQ perform neg X self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "5": ("IMTQ perform pos Y self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "6": ("IMTQ perform neg Y self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "7": ("IMTQ perform pos Z self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "8": ("IMTQ perform neg Z self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "9": ("IMTQ command dipole", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "10": ("IMTQ get commanded dipole", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "11": ("IMTQ get engineering hk set", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "12": (
+ "IMTQ get calibrated MTM measurement one shot",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
+ "13": ("IMTQ get raw MTM measurement one shot", {OpCodeDictKeys.TIMEOUT: 2.0}),
}
service_imtq_tuple = ("IMTQ Device", op_code_dict_srv_imtq)
cmd_dict[CustomServiceList.IMTQ.value] = service_imtq_tuple
-def add_rad_sens_cmds(cmd_dict: ServiceOpCodeDictT):
- op_code_dict_srv_rad_sensor = {
- "0": ("Radiation Sensor: Set mode on", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "1": ("Radiation Sensor: Set mode normal", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "2": ("Radiation Sensor: Set mode off", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "3": ("Radiation Sensor: Start conversions", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "4": ("Radiation Sensor: Read conversions", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "5": ("Radiation Sensor: Enable debug output", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "6": ("Radiation Sensor: Disable debug putput", {OpCodeDictKeys.TIMEOUT: 2.0}),
- }
- service_rad_sensor_tuple = ("Radiation Sensor", op_code_dict_srv_rad_sensor)
- cmd_dict[CustomServiceList.RAD_SENSOR.value] = service_rad_sensor_tuple
-
-
def add_ploc_mpsoc_cmds(cmd_dict: ServiceOpCodeDictT):
op_code_dict_srv_ploc_mpsoc = {
"0": ("Ploc MPSoC: Set mode off", {OpCodeDictKeys.TIMEOUT: 2.0}),
@@ -806,7 +377,7 @@ def add_ploc_mpsoc_cmds(cmd_dict: ServiceOpCodeDictT):
"14": ("Ploc MPSoC: Mode replay", {OpCodeDictKeys.TIMEOUT: 2.0}),
"15": ("Ploc MPSoC: Mode idle", {OpCodeDictKeys.TIMEOUT: 2.0}),
"16": ("Ploc MPSoC: Tc cam command send", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "17": ("Ploc MPSoC: Set UART TX tristate" , {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "17": ("Ploc MPSoC: Set UART TX tristate", {OpCodeDictKeys.TIMEOUT: 2.0}),
"18": ("Ploc MPSoC: Relesase UART TX", {OpCodeDictKeys.TIMEOUT: 2.0}),
}
service_ploc_mpsoc_tuple = ("Ploc MPSoC", op_code_dict_srv_ploc_mpsoc)
@@ -902,43 +473,9 @@ def add_ploc_supv_cmds(cmd_dict: ServiceOpCodeDictT):
"55": ("PLOC Supervisor: Request ADC Report", {OpCodeDictKeys.TIMEOUT: 2.0}),
"56": ("PLOC Supervisor: Reset PL", {OpCodeDictKeys.TIMEOUT: 2.0}),
"57": ("PLOC Supervisor: Enable NVMs", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "58": ("PLOC Supervisor: Continue update", {OpCodeDictKeys.TIMEOUT: 2.0}),
}
service_ploc_supv_tuple = ("PLOC Supervisor", op_code_dict_srv_ploc_supv)
-
- op_code_dict_srv_ploc_updater = {
- "0": (
- "Ploc Updater: Update uboot on partition A",
- {OpCodeDictKeys.TIMEOUT: 2.0},
- ),
- "1": (
- "Ploc Updater: Update bitstream on partition A",
- {OpCodeDictKeys.TIMEOUT: 2.0},
- ),
- "2": (
- "Ploc Updater: Update linux on partition A",
- {OpCodeDictKeys.TIMEOUT: 2.0},
- ),
- "3": (
- "Ploc Updater: Update application on partition A",
- {OpCodeDictKeys.TIMEOUT: 2.0},
- ),
- "4": (
- "Ploc Updater: Update uboot on partition B",
- {OpCodeDictKeys.TIMEOUT: 2.0},
- ),
- "5": (
- "Ploc Updater: Update bitstream on partition B",
- {OpCodeDictKeys.TIMEOUT: 2.0},
- ),
- "6": (
- "Ploc Updater: Update linux on partition B",
- {OpCodeDictKeys.TIMEOUT: 2.0},
- ),
- "7": (
- "Ploc Updater: Update application on partition B",
- {OpCodeDictKeys.TIMEOUT: 2.0},
- ),
- }
cmd_dict[CustomServiceList.PLOC_SUPV.value] = service_ploc_supv_tuple
cmd_dict[
CustomServiceList.PLOC_MEMORY_DUMPER.value
@@ -948,6 +485,7 @@ def add_ploc_supv_cmds(cmd_dict: ServiceOpCodeDictT):
def add_system_cmds(cmd_dict: ServiceOpCodeDictT):
from pus_tc.system.acs import AcsOpCodes, SusOpCodes
import pus_tc.system.tcs as tcs
+ import pus_tc.system.controllers as controllers
default_opts = generate_op_code_options(
enter_listener_mode=False, custom_timeout=8.0
@@ -1053,3 +591,23 @@ def add_system_cmds(cmd_dict: ServiceOpCodeDictT):
info="TCS Board Assembly",
op_code_entry=op_code_dict,
)
+
+ op_code_dict = dict()
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=controllers.OpCodes.THERMAL_CONTROLLER,
+ info=controllers.Info.THERMAL_CONTROLLER,
+ options=default_opts,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=controllers.OpCodes.CORE_CONTROLLER,
+ info=controllers.Info.CORE_CONTROLLER,
+ options=default_opts,
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name=CustomServiceList.CONTROLLERS.value,
+ info="Controllers",
+ op_code_entry=op_code_dict,
+ )
diff --git a/pus_tc/devs/acu.py b/pus_tc/devs/acu.py
index f08494d..a7df0f7 100644
--- a/pus_tc/devs/acu.py
+++ b/pus_tc/devs/acu.py
@@ -1,15 +1,136 @@
# -*- coding: utf-8 -*-
-"""
-@file tmtcc_tc_acu.py
-@brief ACU tests
-@author J. Meier
+"""ACU commands
+@author J. Meier, R. Mueller
@date 21.12.2020
"""
import struct
+
+from config.definitions import CustomServiceList
+from tmtccmd.config import add_op_code_entry, add_service_op_code_entry
from tmtccmd.tc.packer import TcQueueT
-from tmtccmd.config.definitions import QueueCommands
-from gomspace.gomspace_common import *
+from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT
+from tmtccmd.tc.pus_3_fsfw_hk import (
+ make_sid,
+ generate_one_diag_command,
+ generate_one_hk_command,
+)
+import gomspace.gomspace_common as gs
+from gomspace.gomspace_common import GomspaceOpCodes
+from gomspace.gomspace_common import Info as GsInfo
+from config.object_ids import ACU_HANDLER_ID
from pus_tc.devs.p60dock import P60DockConfigTable
+from tmtccmd.tc.pus_8_funccmd import generate_action_command
+from tmtccmd.utility import ObjectId
+
+
+class ACUConfigTable:
+ mppt_mode = gs.TableEntry(bytearray([0x00, 0x00]), gs.TableEntry.uint8_size)
+ mppt_d_mode = gs.TableEntry(bytearray([0x00, 0x01]), gs.TableEntry.uint8_size)
+ vboost = gs.TableEntry(bytearray([0x00, 0x02]), gs.TableEntry.uint16_size)
+ vbat_max_hi = gs.TableEntry(bytearray([0x00, 0x10]), gs.TableEntry.uint16_size)
+ vbat_max_lo = gs.TableEntry(bytearray([0x00, 0x12]), gs.TableEntry.uint16_size)
+ ov_mode = gs.TableEntry(bytearray([0x00, 0x1A]), gs.TableEntry.uint8_size)
+
+
+class ACUHkTable:
+ temperature1 = gs.TableEntry(bytearray([0x00, 0x1C]), gs.TableEntry.uint16_size)
+ temperature2 = gs.TableEntry(bytearray([0x00, 0x1D]), gs.TableEntry.uint16_size)
+ temperature3 = gs.TableEntry(bytearray([0x00, 0x1E]), gs.TableEntry.uint16_size)
+ # Ground WDT value (remaining seconds until reboot)
+ wdt_gnd_left = gs.TableEntry(bytearray([0x00, 0x74]), gs.TableEntry.uint32_size)
+
+
+class OpCodes:
+ TEST = ["0", "test"]
+
+
+class Info:
+ TEST = "ACU Test"
+
+
+def add_acu_cmds(cmd_dict: ServiceOpCodeDictT):
+ op_code_dict = dict()
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
+ info=GsInfo.REQUEST_CORE_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE,
+ info=GsInfo.REQUEST_AUX_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE,
+ info=GsInfo.REQUEST_AUX_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.GET_PARAM,
+ info=GsInfo.GET_PARAMETER,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.SET_PARAM,
+ info=GsInfo.SET_PARAMETER,
+ )
+ add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.TEST, info=Info.TEST)
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ op_code_entry=op_code_dict,
+ name=CustomServiceList.ACU.value,
+ info="ACU Device",
+ )
+
+
+def pack_acu_commands(
+ object_id: ObjectId, tc_queue: TcQueueT, op_code: str
+) -> TcQueueT:
+ tc_queue.appendleft((QueueCommands.PRINT, "Handling ACU command"))
+ if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I:
+ tc_queue.appendleft((QueueCommands.PRINT, "ACU: Print channel stats"))
+ command = generate_action_command(
+ object_id=object_id.as_bytes,
+ action_id=gs.GomspaceDeviceActionIds.PRINT_SWITCH_V_I,
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE:
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, f"PDU1: {GsInfo.REQUEST_CORE_HK_ONCE}")
+ )
+ hk_sid = make_sid(object_id=object_id.as_bytes, set_id=gs.SetIds.ACU_CORE)
+ command = generate_one_diag_command(sid=hk_sid, ssc=0)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code in GomspaceOpCodes.REQUEST_AUX_HK_ONCE:
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, f"PDU1: {GsInfo.REQUEST_AUX_HK_ONCE}")
+ )
+ hk_sid = make_sid(object_id=object_id.as_bytes, set_id=gs.SetIds.ACU_AUX)
+ command = generate_one_hk_command(sid=hk_sid, ssc=0)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code in GomspaceOpCodes.GET_PARAM:
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, f"PDU1: {GsInfo.GET_PARAMETER}")
+ )
+ table_id = int(input("Specify table ID: "))
+ memory_address = int(input("Specify memory address: 0x"), 16)
+ parameter_size = int(input("Specify parameter size: "))
+ command = gs.pack_get_param_command(object_id.as_bytes, table_id, memory_address, parameter_size)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code in GomspaceOpCodes.SET_PARAM:
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, f"PDU1: {GsInfo.SET_PARAMETER}")
+ )
+ memory_address = int(input("Specify memory address: 0x"), 16)
+ memory_address = struct.pack('!H', memory_address)
+ parameter_size = int(input("Specify parameter size: "))
+ parameter = int(input("Specify parameter: "))
+ command = gs.pack_set_param_command(object_id.as_bytes, memory_address, parameter_size, parameter)
+ tc_queue.appendleft(command.pack_command_tuple())
+ pack_test_cmds(object_id=object_id, tc_queue=tc_queue)
+
+ return tc_queue
class ACUTestProcedure:
@@ -26,59 +147,28 @@ class ACUTestProcedure:
ping = False
read_temperature1 = False
read_temperature2 = False
- read_temperature3 = True
- read_mppt_mode = True
- read_vboost = True
- read_vbat_max_hi = True
- read_vbat_max_lo = True
- read_ov_mode = True
+ read_temperature3 = False
+ read_mppt_mode = False
+ read_vboost = False
+ read_vbat_max_hi = False
+ read_vbat_max_lo = False
+ read_ov_mode = False
+ off = False
-class ACUConfigTable:
- mppt_mode = TableEntry(bytearray([0x00, 0x00]), TableEntry.uint8_size)
- mppt_d_mode = TableEntry(bytearray([0x00, 0x01]), TableEntry.uint8_size)
- vboost = TableEntry(bytearray([0x00, 0x02]), TableEntry.uint16_size)
- vbat_max_hi = TableEntry(bytearray([0x00, 0x10]), TableEntry.uint16_size)
- vbat_max_lo = TableEntry(bytearray([0x00, 0x12]), TableEntry.uint16_size)
- ov_mode = TableEntry(bytearray([0x00, 0x1A]), TableEntry.uint8_size)
-
-
-class ACUHkTable:
- temperature1 = TableEntry(bytearray([0x00, 0x1C]), TableEntry.uint16_size)
- temperature2 = TableEntry(bytearray([0x00, 0x1D]), TableEntry.uint16_size)
- temperature3 = TableEntry(bytearray([0x00, 0x1E]), TableEntry.uint16_size)
- # Ground WDT value (remaining seconds until reboot)
- wdt_gnd_left = TableEntry(bytearray([0x00, 0x74]), TableEntry.uint32_size)
-
-
-class CommandId:
- PRINT_CHANNEL_STATS = 51
-
-
-def pack_acu_test_into(
- object_id: bytearray, tc_queue: TcQueueT, op_code: str
-) -> TcQueueT:
- tc_queue.appendleft((QueueCommands.PRINT, "Testing ACU"))
-
- if op_code == "51":
- tc_queue.appendleft((QueueCommands.PRINT, "ACU: Print channel stats"))
- command = object_id + struct.pack("!I", CommandId.PRINT_CHANNEL_STATS)
- command = PusTelecommand(service=8, subservice=128, ssc=30, app_data=command)
- tc_queue.appendleft(command.pack_command_tuple())
- return
-
+def pack_test_cmds(object_id: ObjectId, tc_queue: TcQueueT):
if ACUTestProcedure.all or ACUTestProcedure.reboot:
tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reboot"))
- command = pack_reboot_command(object_id)
+ command = gs.pack_reboot_command(object_id)
# command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
if ACUTestProcedure.all or ACUTestProcedure.read_gnd_wdt:
tc_queue.appendleft(
(QueueCommands.PRINT, "ACU: Reading ground watchdog timer value")
)
- command = pack_get_param_command(
- object_id,
- TableIds.hk,
+ command = gs.pack_get_param_command(
+ object_id.as_bytes,
+ gs.TableIds.hk,
ACUHkTable.wdt_gnd_left.parameter_address,
ACUHkTable.wdt_gnd_left.parameter_size,
)
@@ -86,20 +176,20 @@ def pack_acu_test_into(
tc_queue.appendleft(command.pack_command_tuple())
if ACUTestProcedure.all or ACUTestProcedure.gnd_wdt_reset:
tc_queue.appendleft((QueueCommands.PRINT, "ACU: Testing ground watchdog reset"))
- command = pack_gnd_wdt_reset_command(object_id)
+ command = gs.pack_gnd_wdt_reset_command(object_id)
# command = PusTelecommand(service=8, subservice=128, ssc=21, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
if ACUTestProcedure.all or ACUTestProcedure.ping:
tc_queue.appendleft((QueueCommands.PRINT, "ACU: Ping Test"))
ping_data = bytearray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- command = pack_ping_command(object_id, ping_data)
+ command = gs.pack_ping_command(object_id, ping_data)
# command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
if ACUTestProcedure.all or ACUTestProcedure.read_temperature3:
tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading temperature 3"))
- command = pack_get_param_command(
- object_id,
- TableIds.hk,
+ command = gs.pack_get_param_command(
+ object_id.as_bytes,
+ gs.TableIds.hk,
ACUHkTable.temperature3.parameter_address,
ACUHkTable.temperature3.parameter_size,
)
@@ -107,9 +197,9 @@ def pack_acu_test_into(
tc_queue.appendleft(command.pack_command_tuple())
if ACUTestProcedure.all or ACUTestProcedure.read_vboost:
tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading vboost value"))
- command = pack_get_param_command(
- object_id,
- TableIds.config,
+ command = gs.pack_get_param_command(
+ object_id.as_bytes,
+ gs.TableIds.config,
ACUConfigTable.vboost.parameter_address,
ACUConfigTable.vboost.parameter_size,
)
@@ -117,9 +207,9 @@ def pack_acu_test_into(
tc_queue.appendleft(command.pack_command_tuple())
if ACUTestProcedure.all or ACUTestProcedure.read_vbat_max_hi:
tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading vbat_max_hi"))
- command = pack_get_param_command(
- object_id,
- TableIds.config,
+ command = gs.pack_get_param_command(
+ object_id.as_bytes,
+ gs.TableIds.config,
ACUConfigTable.vbat_max_hi.parameter_address,
ACUConfigTable.vbat_max_hi.parameter_size,
)
@@ -127,9 +217,9 @@ def pack_acu_test_into(
tc_queue.appendleft(command.pack_command_tuple())
if ACUTestProcedure.all or ACUTestProcedure.read_vbat_max_lo:
tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading vbat_max_lo"))
- command = pack_get_param_command(
- object_id,
- TableIds.config,
+ command = gs.pack_get_param_command(
+ object_id.as_bytes,
+ gs.TableIds.config,
ACUConfigTable.vbat_max_lo.parameter_address,
ACUConfigTable.vbat_max_lo.parameter_size,
)
@@ -137,23 +227,20 @@ def pack_acu_test_into(
tc_queue.appendleft(command.pack_command_tuple())
if ACUTestProcedure.all or ACUTestProcedure.read_ov_mode:
tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading ov_mode"))
- command = pack_get_param_command(
- object_id,
- TableIds.config,
+ command = gs.pack_get_param_command(
+ object_id.as_bytes,
+ gs.TableIds.config,
ACUConfigTable.ov_mode.parameter_address,
ACUConfigTable.ov_mode.parameter_size,
)
# command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
-
- tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Turning off ACU"))
- command = pack_set_param_command(
- p60dock_object_id,
- P60DockConfigTable.out_en_0.parameter_address,
- P60DockConfigTable.out_en_0.parameter_size,
- Channel.off,
- )
- # command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
- tc_queue.appendleft(command.pack_command_tuple())
-
- return tc_queue
+ if ACUTestProcedure.all or ACUTestProcedure.off:
+ tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Turning off ACU"))
+ command = gs.pack_set_param_command(
+ ACU_HANDLER_ID,
+ P60DockConfigTable.out_en_0.parameter_address,
+ P60DockConfigTable.out_en_0.parameter_size,
+ gs.Channel.off,
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
diff --git a/pus_tc/devs/gps.py b/pus_tc/devs/gps.py
index d0f3f21..c7577fc 100644
--- a/pus_tc/devs/gps.py
+++ b/pus_tc/devs/gps.py
@@ -1,22 +1,54 @@
import enum
-from tmtccmd.config.definitions import QueueCommands
+from config.definitions import CustomServiceList
+from tmtccmd.config import add_op_code_entry, add_service_op_code_entry
+from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command
+from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT
+from tmtccmd.logging import get_console_logger
from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.tc.pus_8_funccmd import generate_action_command
-from config.object_ids import GPS_HANDLER_1_ID, GPS_HANDLER_0_ID
+LOGGER = get_console_logger()
-class GpsOpCodes(enum.Enum):
- RESET_GNSS = "5"
+class OpCodes:
+ REQ_OS_HK = ["0", "hk-os"]
+ RESET_GNSS = ["5", "reset"]
+
+
+class Info:
+ REQ_OS_HK = "Request One-Shot HK"
+ RESET_GNSS = "Reset GNSS using reset pin"
+
+
+class SetIds:
+ HK = 0
+
+
+def add_gps_cmds(cmd_dict: ServiceOpCodeDictT):
+ op_code_dict = dict()
+ add_op_code_entry(
+ op_code_dict=op_code_dict, keys=OpCodes.RESET_GNSS, info=Info.RESET_GNSS
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict, keys=OpCodes.REQ_OS_HK, info=Info.REQ_OS_HK
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ op_code_entry=op_code_dict,
+ name=CustomServiceList.GPS_CTRL.value,
+ info="GPS/GNSS Controller",
+ )
def pack_gps_command(object_id: bytes, tc_queue: TcQueueT, op_code: str):
- if op_code == GpsOpCodes.RESET_GNSS.value:
- if object_id == GPS_HANDLER_0_ID:
- tc_queue.appendleft((QueueCommands.PRINT, "Resetting GPS device 0"))
- elif object_id == GPS_HANDLER_1_ID:
- tc_queue.appendleft((QueueCommands.PRINT, "Resetting GPS device 1"))
- cmd = generate_action_command(object_id=object_id, action_id=int(op_code))
+ if op_code in OpCodes.RESET_GNSS:
+ # TODO: This needs to be re-implemented
+ LOGGER.warning("Reset pin handling needs to be re-implemented")
+ if op_code in OpCodes.REQ_OS_HK:
+ tc_queue.appendleft((QueueCommands.PRINT, f"GMSS: {Info.REQ_OS_HK}"))
+ cmd = generate_one_hk_command(
+ sid=make_sid(object_id=object_id, set_id=SetIds.HK), ssc=0
+ )
tc_queue.appendleft(cmd.pack_command_tuple())
diff --git a/pus_tc/devs/gyros.py b/pus_tc/devs/gyros.py
new file mode 100644
index 0000000..6cdc775
--- /dev/null
+++ b/pus_tc/devs/gyros.py
@@ -0,0 +1,10 @@
+import enum
+
+
+class AdisGyroSetIds(enum.IntEnum):
+ CORE_HK = 0
+ CFG_HK = 1
+
+
+class L3gGyroSetIds(enum.IntEnum):
+ CORE_HK = 0
diff --git a/pus_tc/devs/imtq.py b/pus_tc/devs/imtq.py
index 7c1f136..ea31b5d 100644
--- a/pus_tc/devs/imtq.py
+++ b/pus_tc/devs/imtq.py
@@ -5,11 +5,18 @@
@author J. Meier
@date 25.03.2021
"""
+import struct
+
from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.packer import TcQueueT
from spacepackets.ecss.tc import PusTelecommand
-from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command
+from tmtccmd.tc.pus_3_fsfw_hk import (
+ make_sid,
+ generate_one_diag_command,
+ generate_one_hk_command,
+)
+from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes
class ImtqSetIds:
@@ -48,7 +55,22 @@ def pack_imtq_test_into(
)
)
- if op_code == "0" or op_code == "1":
+ if op_code == "0":
+ tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Set mode off"))
+ command = pack_mode_data(object_id, Modes.OFF, 0)
+ command = PusTelecommand(service=200, subservice=1, ssc=9, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "1":
+ tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Set mode on"))
+ command = pack_mode_data(object_id, Modes.ON, 0)
+ command = PusTelecommand(service=200, subservice=1, ssc=10, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "2":
+ tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Mode Normal"))
+ command = pack_mode_data(object_id, Modes.NORMAL, 0)
+ command = PusTelecommand(service=200, subservice=1, ssc=11, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "3":
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform positive x self test"))
command = object_id + ImtqActionIds.perform_positive_x_test
command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command)
@@ -74,7 +96,7 @@ def pack_imtq_test_into(
command = generate_one_hk_command(sid, 24)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "0" or op_code == "2":
+ if op_code == "4":
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform negative x self test"))
command = object_id + ImtqActionIds.perform_negative_x_test
command = PusTelecommand(service=8, subservice=128, ssc=25, app_data=command)
@@ -100,7 +122,7 @@ def pack_imtq_test_into(
command = generate_one_hk_command(sid, 27)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "0" or op_code == "3":
+ if op_code == "5":
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform positive y self test"))
command = object_id + ImtqActionIds.perform_positive_y_test
command = PusTelecommand(service=8, subservice=128, ssc=28, app_data=command)
@@ -126,7 +148,7 @@ def pack_imtq_test_into(
command = generate_one_hk_command(sid, 30)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "0" or op_code == "4":
+ if op_code == "6":
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform negative y self test"))
command = object_id + ImtqActionIds.perform_negative_y_test
command = PusTelecommand(service=8, subservice=128, ssc=31, app_data=command)
@@ -152,7 +174,7 @@ def pack_imtq_test_into(
command = generate_one_hk_command(sid, 33)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "0" or op_code == "5":
+ if op_code == "7":
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform positive z self test"))
command = object_id + ImtqActionIds.perform_positive_z_test
command = PusTelecommand(service=8, subservice=128, ssc=34, app_data=command)
@@ -178,7 +200,7 @@ def pack_imtq_test_into(
command = generate_one_hk_command(sid, 36)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "0" or op_code == "6":
+ if op_code == "8":
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform negative z self test"))
command = object_id + ImtqActionIds.perform_negative_z_test
command = PusTelecommand(service=8, subservice=128, ssc=35, app_data=command)
@@ -204,28 +226,48 @@ def pack_imtq_test_into(
command = generate_one_hk_command(sid, 37)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "0" or op_code == "7":
+ if op_code == "9":
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Commanding dipole"))
x_dipole = 0
y_dipole = 0
z_dipole = 0
duration = 0 # ms
command = pack_dipole_command(object_id, x_dipole, y_dipole, z_dipole, duration)
- command = PusTelecommand(service=8, subservice=128, ssc=20, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "0" or op_code == "8":
+ if op_code == "10":
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Get commanded dipole"))
command = object_id + ImtqActionIds.get_commanded_dipole
command = PusTelecommand(service=8, subservice=128, ssc=21, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "11":
+ tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Get engineering hk set"))
+ command = generate_one_diag_command(
+ sid=make_sid(object_id=object_id, set_id=ImtqSetIds.ENG_HK_SET), ssc=0
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+
+ if op_code == "12":
+ tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Get calibrated MTM hk set"))
+ command = generate_one_diag_command(
+ sid=make_sid(object_id=object_id, set_id=ImtqSetIds.CAL_MTM_SET), ssc=0
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+
+ if op_code == "13":
+ tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Get raw MTM hk set"))
+ command = generate_one_diag_command(
+ sid=make_sid(object_id=object_id, set_id=ImtqSetIds.RAW_MTM_SET), ssc=0
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+
return tc_queue
def pack_dipole_command(
object_id: bytearray, x_dipole: int, y_dipole: int, z_dipole: int, duration: int
-) -> bytearray:
+) -> PusTelecommand:
"""This function packs the command causing the ISIS IMTQ to generate a dipole.
@param object_id The object id of the IMTQ handler.
@param x_dipole The dipole of the x coil in 10^-4*Am^2 (max. 2000)
@@ -236,10 +278,10 @@ def pack_dipole_command(
command is sent.
"""
action_id = ImtqActionIds.start_actuation_dipole
- command = bytearray()
command = object_id + action_id
- command.extend(x_dipole.to_bytes(length=2, byteorder="big"))
- command.extend(y_dipole.to_bytes(length=2, byteorder="big"))
- command.extend(z_dipole.to_bytes(length=2, byteorder="big"))
- command.extend(duration.to_bytes(length=2, byteorder="big"))
+ command += struct.pack('!h', x_dipole)
+ command += struct.pack('!h', y_dipole)
+ command += struct.pack('!h', z_dipole)
+ command += struct.pack('!h', duration)
+ command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command)
return command
diff --git a/pus_tc/devs/mgms.py b/pus_tc/devs/mgms.py
new file mode 100644
index 0000000..9bd6199
--- /dev/null
+++ b/pus_tc/devs/mgms.py
@@ -0,0 +1,9 @@
+import enum
+
+
+class MgmLis3SetIds(enum.IntEnum):
+ CORE_HK = 0
+
+
+class MgmRm3100SetIds(enum.IntEnum):
+ CORE_HK = 0
diff --git a/pus_tc/devs/p60dock.py b/pus_tc/devs/p60dock.py
index 03bbd5b..c0f395a 100644
--- a/pus_tc/devs/p60dock.py
+++ b/pus_tc/devs/p60dock.py
@@ -16,9 +16,6 @@ from gomspace.gomspace_common import *
from config.object_ids import P60_DOCK_HANDLER
-HK_SET_ID = 0x3
-
-
class P60OpCodes:
STACK_3V3_ON = ["stack-3v3-on", "1"]
STACK_3V3_OFF = ["stack-3v3-off", "2"]
@@ -90,11 +87,12 @@ class P60DockHkTable:
wdt_gnd_left = TableEntry(bytearray([0x00, 0xA8]), TableEntry.uint32_size)
-def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
+def pack_p60dock_cmds(object_id: ObjectId, tc_queue: TcQueueT, op_code: str):
+ objb = object_id.as_bytes
if op_code in P60OpCodes.STACK_3V3_ON:
tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_3V3_ON))
command = pack_set_param_command(
- object_id,
+ objb,
P60DockConfigTable.out_en_9.parameter_address,
P60DockConfigTable.out_en_9.parameter_size,
Channel.on,
@@ -103,7 +101,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code in P60OpCodes.STACK_3V3_OFF:
tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_3V3_OFF))
command = pack_set_param_command(
- object_id,
+ objb,
P60DockConfigTable.out_en_9.parameter_address,
P60DockConfigTable.out_en_9.parameter_size,
Channel.off,
@@ -112,7 +110,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code in P60OpCodes.STACK_5V_ON:
tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_5V_ON))
command = pack_set_param_command(
- object_id,
+ objb,
P60DockConfigTable.out_en_10.parameter_address,
P60DockConfigTable.out_en_10.parameter_size,
Channel.on,
@@ -121,7 +119,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code in P60OpCodes.STACK_5V_OFF:
tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_5V_OFF))
command = pack_set_param_command(
- object_id,
+ objb,
P60DockConfigTable.out_en_10.parameter_address,
P60DockConfigTable.out_en_10.parameter_size,
Channel.off,
@@ -146,13 +144,13 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "P60 Dock: Print Switches, Voltages, Currents")
)
command = generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
+ object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
)
tc_queue.appendleft(command.pack_command_tuple())
if op_code in GomspaceOpCodes.PRINT_LATCHUPS:
tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Print Latchups"))
command = generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS
+ object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS
)
tc_queue.appendleft(command.pack_command_tuple())
if P60DockTestProcedure.all or P60DockTestProcedure.reboot:
@@ -165,7 +163,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "P60 Dock: Reading ground watchdog timer value")
)
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.hk,
P60DockHkTable.wdt_gnd_left.parameter_address,
P60DockHkTable.wdt_gnd_left.parameter_size,
@@ -191,7 +189,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
parameter = 0 # set channel off
command = pack_set_param_command(
- object_id,
+ objb,
P60DockConfigTable.out_en_3.parameter_address,
P60DockConfigTable.out_en_3.parameter_size,
parameter,
@@ -203,7 +201,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "P60 Dock: Testing temperature reading")
)
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.hk,
P60DockHkTable.temperature1.parameter_address,
P60DockHkTable.temperature1.parameter_size,
@@ -215,7 +213,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "P60 Dock: Testing Output Channel 3 state (PDU2)")
)
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.config,
P60DockConfigTable.out_en_3.parameter_address,
P60DockConfigTable.out_en_3.parameter_size,
@@ -230,7 +228,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
)
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.config,
P60DockConfigTable.cur_lu_lim_0.parameter_address,
P60DockConfigTable.cur_lu_lim_0.parameter_size,
@@ -243,7 +241,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
parameter = 1 # set channel on
command = pack_set_param_command(
- object_id,
+ objb,
P60DockConfigTable.out_en_3.parameter_address,
P60DockConfigTable.out_en_3.parameter_size,
parameter,
@@ -256,7 +254,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
table_id_invalid = 5
command = pack_get_param_command(
- object_id,
+ objb,
table_id_invalid,
P60DockHkTable.temperature1.parameter_address,
P60DockHkTable.temperature1.parameter_size,
@@ -272,7 +270,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
invalid_address = bytearray([0x01, 0xF4])
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.hk,
invalid_address,
P60DockHkTable.temperature1.parameter_size,
@@ -289,7 +287,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
parameter_size = 2
parameter = 1
command = pack_set_param_command(
- object_id, invalid_address, parameter_size, parameter
+ objb, invalid_address, parameter_size, parameter
)
# command = PusTelecommand(service=8, subservice=128, ssc=30, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
@@ -302,7 +300,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
invalid_size = 5
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.hk,
P60DockHkTable.temperature1.parameter_address,
invalid_size,
@@ -317,7 +315,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
parameter = 1
command = pack_set_param_command(
- object_id,
+ objb,
P60DockConfigTable.out_en_3.parameter_address,
invalid_size,
parameter,
diff --git a/pus_tc/devs/pcdu.py b/pus_tc/devs/pcdu.py
new file mode 100644
index 0000000..02432c8
--- /dev/null
+++ b/pus_tc/devs/pcdu.py
@@ -0,0 +1,300 @@
+from config.definitions import CustomServiceList
+from tmtccmd.config import (
+ ServiceOpCodeDictT,
+ add_op_code_entry,
+ add_service_op_code_entry,
+ OpCodeDictKeys,
+)
+
+from pus_tc.devs.p60dock import P60OpCodes, GomspaceOpCodes, Info
+from pus_tc.devs.pdu1 import Pdu1OpCodes
+from pus_tc.devs.pdu2 import Pdu2OpCodes
+from pus_tc.devs.acu import add_acu_cmds
+from gomspace.gomspace_common import Info as GsInfo
+
+
+def add_p60_cmds(cmd_dict: ServiceOpCodeDictT):
+ op_code_dict = dict()
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=P60OpCodes.STACK_3V3_ON,
+ info=Info.STACK_3V3_ON,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=P60OpCodes.STACK_3V3_OFF,
+ info=Info.STACK_3V3_OFF,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=P60OpCodes.STACK_5V_ON,
+ info=Info.STACK_5V_ON,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=P60OpCodes.STACK_5V_OFF,
+ info=Info.STACK_5V_OFF,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
+ info=GsInfo.REQUEST_CORE_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE,
+ info=GsInfo.REQUEST_AUX_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.PRINT_SWITCH_V_I,
+ info="P60 Dock: Print Switches, Voltages, Currents",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.PRINT_LATCHUPS,
+ info="P60 Dock: Print Latchups",
+ )
+ add_op_code_entry(op_code_dict=op_code_dict, keys=P60OpCodes.TEST, info="P60 Tests")
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name=CustomServiceList.P60DOCK.value,
+ info="P60 Device",
+ op_code_entry=op_code_dict,
+ )
+
+
+def add_pdu1_cmds(cmd_dict: ServiceOpCodeDictT):
+ op_code_dict = dict()
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.TCS_BOARD_OFF.value,
+ info="PDU1: Turn TCS board off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.STAR_TRACKER_ON.value,
+ info="PDU1: Turn star tracker on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.STAR_TRACKER_OFF.value,
+ info="PDU1: Turn star tracker off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.SUS_NOMINAL_ON.value,
+ info="PDU1: Turn SUS nominal on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.SUS_NOMINAL_OFF.value,
+ info="PDU1: Turn SUS nominal off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.ACS_A_SIDE_ON.value,
+ info="PDU1: Turn ACS A side on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.ACS_A_SIDE_OFF.value,
+ info="PDU1: Turn ACS A side off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.SYRLINKS_ON.value,
+ info="PDU1: Turn Syrlinks on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.SYRLINKS_OFF.value,
+ info="PDU1: Turn Syrlinks off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.MGT_ON.value,
+ info="PDU1: Turn MGT on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.MGT_OFF.value,
+ info="PDU1: Turn MGT off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.PLOC_ON.value,
+ info="PDU1: Turn PLOC on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.PLOC_OFF.value,
+ info="PDU1: Turn PLOC off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.SCEX_ON.value,
+ info="PDU1: Turn Solar Cell Experiment on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.SCEX_OFF.value,
+ info="PDU1: Turn Solar Cell Experiment off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
+ info=GsInfo.REQUEST_CORE_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE,
+ info=GsInfo.REQUEST_AUX_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.PRINT_SWITCH_V_I,
+ info="PDU1: Print Switches, Voltages, Currents",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu1OpCodes.TCS_BOARD_ON.value,
+ info="PDU1: Turn TCS board on",
+ )
+
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.PRINT_LATCHUPS,
+ info="PDU1: Print Latchups",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict, keys=Pdu1OpCodes.TESTS.value, info="PDU1 Tests"
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict, keys=GomspaceOpCodes.SET_PARAM, info="Set parameter"
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name=CustomServiceList.PDU1.value,
+ info="PDU1 Device",
+ op_code_entry=op_code_dict,
+ )
+
+
+def add_pdu2_cmds(cmd_dict: ServiceOpCodeDictT):
+ op_code_dict = dict()
+ add_op_code_entry(op_code_dict=op_code_dict, keys="0", info="PDU2 Tests")
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.ACS_SIDE_B_ON.value,
+ info="PDU2: Turn ACS Side B on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.ACS_SIDE_B_OFF.value,
+ info="PDU2: Turn ACS Side B off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.SUS_REDUNDANT_ON.value,
+ info="PDU2: Turn SUS redundant on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.SUS_REDUNDANT_OFF.value,
+ info="PDU2: Turn SUS redundant off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.RW_ON.value,
+ info="PDU2: Turn reaction wheels on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.RW_OFF.value,
+ info="PDU2: Turn reaction wheels off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.PL_PCDU_VBAT_NOM_ON.value,
+ info="PDU2: PL PCDU Switch Channel Nominal (1) on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.PL_PCDU_VBAT_NOM_OFF.value,
+ info="PDU2: PL PCDU Switch Channel Nominal (1) off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.PL_PCDU_VBAT_RED_ON.value,
+ info="PDU2: PL PCDU Switch Channel Redundant (1) on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.PL_PCDU_VBAT_RED_OFF.value,
+ info="PDU2: PL PCDU Switch Channel Redundant (1) off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.TCS_HEATER_IN_ON.value,
+ info="PDU2: Switch TCS Heater Input on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.TCS_HEATER_IN_OFF.value,
+ info="PDU2: Switch TCS Heater Input off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.SOLAR_ARRAY_DEPL_ON.value,
+ info="PDU2: Switch Solar Array Deployment On",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.SOLAR_ARRAY_DEPL_OFF.value,
+ info="PDU2: Switch Solar Array Deployment Off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.PL_CAMERA_ON.value,
+ info="PDU2: Turn payload camera on",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=Pdu2OpCodes.PL_CAMERA_OFF.value,
+ info="PDU2: Turn payload camera off",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
+ info=GsInfo.REQUEST_CORE_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE,
+ info=GsInfo.REQUEST_AUX_HK_ONCE,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.PRINT_SWITCH_V_I,
+ info="PDU2: Print Switches, Voltages, Currents",
+ options={OpCodeDictKeys.TIMEOUT: 2.0},
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=GomspaceOpCodes.PRINT_LATCHUPS,
+ info="PDU2: Print Latchups",
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name="pdu2",
+ info="PDU2 Device",
+ op_code_entry=op_code_dict,
+ )
+
+
+def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
+ add_p60_cmds(cmd_dict)
+ add_pdu1_cmds(cmd_dict)
+ add_pdu2_cmds(cmd_dict)
+ add_acu_cmds(cmd_dict)
diff --git a/pus_tc/devs/pdu1.py b/pus_tc/devs/pdu1.py
index 08ddbd9..4654e47 100644
--- a/pus_tc/devs/pdu1.py
+++ b/pus_tc/devs/pdu1.py
@@ -1,8 +1,9 @@
# -*- coding: utf-8 -*-
-"""PDU2 is mounted on the X2 slot of the P60 dock
+"""PDU1 is mounted on the X2 slot of the P60 dock
@author J. Meier
@date 17.12.2020
"""
+import gomspace.gomspace_common as gs
from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.packer import TcQueueT
from tmtccmd.tc.pus_3_fsfw_hk import (
@@ -54,13 +55,13 @@ class PDU1TestProcedure:
turn_channel_3_off = False
-def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
+def pack_pdu1_commands(object_id: ObjectId, tc_queue: TcQueueT, op_code: str):
tc_queue.appendleft((QueueCommands.PRINT, "Commanding PDU1"))
-
+ objb = object_id.as_bytes
if op_code == Pdu1OpCodes.TCS_BOARD_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn TCS board on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_0.parameter_address,
PDUConfigTable.out_en_0.parameter_size,
Channel.on,
@@ -69,7 +70,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.TCS_BOARD_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn TCS board off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_0.parameter_address,
PDUConfigTable.out_en_0.parameter_size,
Channel.off,
@@ -78,7 +79,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.STAR_TRACKER_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn star tracker on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
Channel.on,
@@ -87,7 +88,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.STAR_TRACKER_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn star tracker off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
Channel.off,
@@ -96,7 +97,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.SUS_NOMINAL_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn SUS nominal on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_4.parameter_address,
PDUConfigTable.out_en_4.parameter_size,
Channel.on,
@@ -105,7 +106,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.SUS_NOMINAL_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn SUS nominal off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_4.parameter_address,
PDUConfigTable.out_en_4.parameter_size,
Channel.off,
@@ -114,7 +115,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.ACS_A_SIDE_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn ACS Side A on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_7.parameter_address,
PDUConfigTable.out_en_7.parameter_size,
Channel.on,
@@ -123,7 +124,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.ACS_A_SIDE_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn ACS Side A off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_7.parameter_address,
PDUConfigTable.out_en_7.parameter_size,
Channel.off,
@@ -132,7 +133,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.SUS_NOMINAL_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn SUS nominal off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_4.parameter_address,
PDUConfigTable.out_en_4.parameter_size,
Channel.off,
@@ -143,7 +144,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU1: Turn Solar Cell Experiment on")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_5.parameter_address,
PDUConfigTable.out_en_5.parameter_size,
Channel.on,
@@ -154,7 +155,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU1: Turn Solar Cell Experiment off")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_5.parameter_address,
PDUConfigTable.out_en_5.parameter_size,
Channel.off,
@@ -163,7 +164,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.SYRLINKS_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn Syrlinks on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_1.parameter_address,
PDUConfigTable.out_en_1.parameter_size,
Channel.on,
@@ -172,7 +173,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.SYRLINKS_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn Syrlinks off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_1.parameter_address,
PDUConfigTable.out_en_1.parameter_size,
Channel.off,
@@ -181,7 +182,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.MGT_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn MGT on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_3.parameter_address,
PDUConfigTable.out_en_3.parameter_size,
Channel.on,
@@ -190,7 +191,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.MGT_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn MGT off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_3.parameter_address,
PDUConfigTable.out_en_3.parameter_size,
Channel.off,
@@ -199,7 +200,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.PLOC_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn PLOC on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_6.parameter_address,
PDUConfigTable.out_en_6.parameter_size,
Channel.on,
@@ -208,7 +209,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu1OpCodes.PLOC_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn PLOC off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_6.parameter_address,
PDUConfigTable.out_en_6.parameter_size,
Channel.off,
@@ -229,13 +230,13 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU1: Print Switches, Voltages, Currents")
)
command = generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
+ object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
)
tc_queue.appendleft(command.pack_command_tuple())
if op_code in GomspaceOpCodes.PRINT_LATCHUPS:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Print Latchups"))
command = generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS
+ object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS
)
tc_queue.appendleft(command.pack_command_tuple())
if PDU1TestProcedure.all or PDU1TestProcedure.ping:
@@ -246,7 +247,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if PDU1TestProcedure.all or PDU1TestProcedure.read_temperature:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Testing temperature reading"))
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.hk,
PDUHkTable.temperature.parameter_address,
PDUHkTable.temperature.parameter_size,
@@ -257,7 +258,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU1: Turn channel 2 on (Star Tracker)")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
Channel.on,
@@ -268,7 +269,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU1: Turn channel 2 off (Star Tracker)")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
Channel.off,
@@ -277,7 +278,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if PDU1TestProcedure.all or PDU1TestProcedure.turn_channel_3_on:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn channel 3 on (MTQ)"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_3.parameter_address,
PDUConfigTable.out_en_3.parameter_size,
Channel.on,
@@ -286,9 +287,19 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if PDU1TestProcedure.all or PDU1TestProcedure.turn_channel_3_off:
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn channel 3 off (MTQ)"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_3.parameter_address,
PDUConfigTable.out_en_3.parameter_size,
Channel.off,
)
tc_queue.appendleft(command.pack_command_tuple())
+ if op_code in GomspaceOpCodes.SET_PARAM:
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, f"PDU1: {Info.SET_PARAMETER}")
+ )
+ memory_address = int(input("Specify memory address: 0x"), 16)
+ memory_address = struct.pack('!H', memory_address)
+ parameter_size = int(input("Specify parameter size: "))
+ parameter = int(input("Specify parameter: "))
+ command = gs.pack_set_param_command(object_id.as_bytes, memory_address, parameter_size, parameter)
+ tc_queue.appendleft(command.pack_command_tuple())
diff --git a/pus_tc/devs/pdu2.py b/pus_tc/devs/pdu2.py
index 12c1636..df4c883 100644
--- a/pus_tc/devs/pdu2.py
+++ b/pus_tc/devs/pdu2.py
@@ -66,13 +66,13 @@ class PDU2TestProcedure:
request_hk_table = False
-def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
+def pack_pdu2_commands(object_id: ObjectId, tc_queue: TcQueueT, op_code: str):
tc_queue.appendleft((QueueCommands.PRINT, "Testing PDU2"))
-
+ objb = object_id.as_bytes
if op_code == Pdu2OpCodes.ACS_SIDE_B_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn ACS Side B on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_7.parameter_address,
PDUConfigTable.out_en_7.parameter_size,
Channel.on,
@@ -82,7 +82,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.ACS_SIDE_B_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn ACS Side B off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_7.parameter_address,
PDUConfigTable.out_en_7.parameter_size,
Channel.off,
@@ -92,7 +92,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.Q7S_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "Turning off Q7S OBC"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_0.parameter_address,
PDUConfigTable.out_en_0.parameter_size,
Channel.off,
@@ -101,7 +101,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.SUS_REDUNDANT_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn SUS redundant on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_4.parameter_address,
PDUConfigTable.out_en_4.parameter_size,
Channel.on,
@@ -110,7 +110,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.SUS_REDUNDANT_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn SUS redundant off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_4.parameter_address,
PDUConfigTable.out_en_4.parameter_size,
Channel.off,
@@ -119,7 +119,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.RW_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn reaction wheels on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
Channel.on,
@@ -128,7 +128,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.RW_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn reaction wheels off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
Channel.off,
@@ -139,7 +139,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Turn PDU2 PL PCDU Channel 1 on")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_1.parameter_address,
PDUConfigTable.out_en_1.parameter_size,
Channel.on,
@@ -150,7 +150,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Turn PDU2 PL PCDU Channel 1 off")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_1.parameter_address,
PDUConfigTable.out_en_1.parameter_size,
Channel.off,
@@ -161,7 +161,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Turn PDU2 PL PCDU Channel 6 on")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_6.parameter_address,
PDUConfigTable.out_en_6.parameter_size,
Channel.off,
@@ -172,7 +172,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Turn PDU2 PL PCDU Channel 6 off")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_6.parameter_address,
PDUConfigTable.out_en_6.parameter_size,
Channel.off,
@@ -181,7 +181,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.TCS_HEATER_IN_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn TCS Heater Input on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_3.parameter_address,
PDUConfigTable.out_en_3.parameter_size,
Channel.on,
@@ -190,7 +190,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.TCS_HEATER_IN_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn TCS Heater Input off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_3.parameter_address,
PDUConfigTable.out_en_3.parameter_size,
Channel.off,
@@ -201,7 +201,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Turn Solar Array Deployment On")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_5.parameter_address,
PDUConfigTable.out_en_5.parameter_size,
Channel.on,
@@ -212,7 +212,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Turn Solar Array Deployment Off")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_5.parameter_address,
PDUConfigTable.out_en_5.parameter_size,
Channel.off,
@@ -221,7 +221,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.PL_CAMERA_ON.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn payload camera on"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_8.parameter_address,
PDUConfigTable.out_en_8.parameter_size,
Channel.on,
@@ -230,7 +230,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if op_code == Pdu2OpCodes.PL_CAMERA_OFF.value:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn payload camera off"))
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_8.parameter_address,
PDUConfigTable.out_en_8.parameter_size,
Channel.off,
@@ -251,13 +251,13 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Print Switches, Currents, Voltahes")
)
command = generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
+ object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
)
tc_queue.appendleft(command.pack_command_tuple())
if op_code in GomspaceOpCodes.PRINT_LATCHUPS:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Print Latchups"))
command = generate_action_command(
- object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS
+ object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS
)
tc_queue.appendleft(command.pack_command_tuple())
if PDU2TestProcedure.all or PDU2TestProcedure.reboot:
@@ -269,7 +269,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Reading ground watchdog timer value")
)
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.hk,
PDUHkTable.wdt_gnd_left.parameter_address,
PDUHkTable.wdt_gnd_left.parameter_size,
@@ -294,7 +294,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
Channel.on,
@@ -303,7 +303,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
if PDU2TestProcedure.all or PDU2TestProcedure.read_temperature:
tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Testing temperature reading"))
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.hk,
PDUHkTable.temperature.parameter_address,
PDUHkTable.temperature.parameter_size,
@@ -314,7 +314,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Reading output channel 2 state (TCS Heater)")
)
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.config,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
@@ -328,7 +328,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
)
command = pack_get_param_command(
- object_id,
+ objb,
TableIds.config,
PDUConfigTable.cur_lu_lim_0.parameter_address,
PDUConfigTable.cur_lu_lim_0.parameter_size,
@@ -339,7 +339,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
(QueueCommands.PRINT, "PDU2: Testing setting output channel 2 off")
)
command = pack_set_param_command(
- object_id,
+ objb,
PDUConfigTable.out_en_2.parameter_address,
PDUConfigTable.out_en_2.parameter_size,
Channel.off,
diff --git a/pus_tc/devs/ploc_supervisor.py b/pus_tc/devs/ploc_supervisor.py
index d9b9104..45810d3 100644
--- a/pus_tc/devs/ploc_supervisor.py
+++ b/pus_tc/devs/ploc_supervisor.py
@@ -98,6 +98,7 @@ class SupvActionIds:
REQUEST_ADC_REPORT = 57
RESET_PL = 58
ENABLE_NVMS = 59
+ CONTINUE_UPDATE = 60
class SupvHkIds:
@@ -125,7 +126,7 @@ def pack_ploc_supv_commands(
command = PusTelecommand(service=200, subservice=1, ssc=10, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
if op_code == "2":
- tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Mode Normal"))
+ tc_queue.appendleft((QueueCommands.PRINT, "PLOC Supervisor: Mode Normal"))
command = pack_mode_data(object_id, Modes.NORMAL, 0)
command = PusTelecommand(service=200, subservice=1, ssc=11, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
@@ -277,18 +278,14 @@ def pack_ploc_supv_commands(
tc_queue.appendleft(
(QueueCommands.PRINT, "PLOC Supervisor: Restart supervisor")
)
- command = object_id + struct.pack(
- "!I", SupvActionIds.RESTART_SUPERVISOR
- )
+ command = object_id + struct.pack("!I", SupvActionIds.RESTART_SUPERVISOR)
command = PusTelecommand(service=8, subservice=128, ssc=52, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
elif op_code == "38":
tc_queue.appendleft(
(QueueCommands.PRINT, "PLOC Supervisor: Factory reset clear all")
)
- command = object_id + struct.pack(
- "!I", SupvActionIds.FACTORY_RESET_CLEAR_ALL
- )
+ command = object_id + struct.pack("!I", SupvActionIds.FACTORY_RESET_CLEAR_ALL)
command = PusTelecommand(service=8, subservice=128, ssc=53, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
elif op_code == "39":
@@ -393,10 +390,19 @@ def pack_ploc_supv_commands(
tc_queue.appendleft((QueueCommands.PRINT, "PLOC Supervisor: Enable NVMs"))
nvm01 = int(input("Enable (1) or disable(0) NVM 0 and 1: "))
nvm3 = int(input("Enable (1) or disable(0) NVM 3: "))
- command = object_id + struct.pack('!I', SupvActionIds.ENABLE_NVMS) + struct.pack('B', nvm01) + \
- struct.pack('B', nvm3)
+ command = (
+ object_id
+ + struct.pack("!I", SupvActionIds.ENABLE_NVMS)
+ + struct.pack("B", nvm01)
+ + struct.pack("B", nvm3)
+ )
command = PusTelecommand(service=8, subservice=128, ssc=72, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
+ elif op_code == "58":
+ tc_queue.appendleft((QueueCommands.PRINT, "PLOC Supervisor: Continue update"))
+ command = object_id + struct.pack("!I", SupvActionIds.CONTINUE_UPDATE)
+ command = PusTelecommand(service=8, subservice=128, ssc=73, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
return tc_queue
diff --git a/pus_tc/devs/plpcdu.py b/pus_tc/devs/plpcdu.py
index 28775d0..1009794 100644
--- a/pus_tc/devs/plpcdu.py
+++ b/pus_tc/devs/plpcdu.py
@@ -1,8 +1,25 @@
import enum
+import struct
+import time
from typing import Optional
-from tmtccmd.config import QueueCommands
+from config.definitions import CustomServiceList
+from tmtccmd.config import (
+ QueueCommands,
+ ServiceOpCodeDictT,
+ add_op_code_entry,
+ add_service_op_code_entry,
+)
from tmtccmd.tc.definitions import TcQueueT
+from tmtccmd.tc.pus_3_fsfw_hk import (
+ generate_one_hk_command,
+ make_sid,
+ generate_one_diag_command,
+)
+from tmtccmd.tc.pus_11_tc_sched import (
+ generate_enable_tc_sched_cmd,
+ generate_time_tagged_cmd,
+)
from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes, Subservices
from tmtccmd.tc.pus_20_params import (
pack_scalar_double_param_app_data,
@@ -17,14 +34,17 @@ LOGGER = get_console_logger()
class OpCodes:
- SWITCH_ON = ["0", "on"]
- SWITCH_OFF = ["1", "off"]
- NORMAL_SSR = ["2", "nml-ssr"]
- NORMAL_DRO = ["3", "nml-dro"]
- NORMAL_X8 = ["4", "nml-x8"]
- NORMAL_TX = ["5", "nml-tx"]
- NORMAL_MPA = ["6", "nml-mpa"]
- NORMAL_HPA = ["7", "nml-hpa"]
+ SWITCH_HPA_ON_PROC = ["0", "proc-hpa"]
+ SWITCH_ON = ["2", "on"]
+ SWITCH_OFF = ["3", "off"]
+ NORMAL_SSR = ["4", "nml-ssr"]
+ NORMAL_DRO = ["5", "nml-dro"]
+ NORMAL_X8 = ["6", "nml-x8"]
+ NORMAL_TX = ["7", "nml-tx"]
+ NORMAL_MPA = ["8", "nml-mpa"]
+ NORMAL_HPA = ["9", "nml-hpa"]
+
+ REQ_OS_HK = ["8", "hk-os"]
INJECT_SSR_TO_DRO_FAILURE = ["10", "inject-ssr-dro-fault"]
INJECT_DRO_TO_X8_FAILURE = ["11", "inject-dro-x8-fault"]
@@ -33,12 +53,6 @@ class OpCodes:
INJECT_MPA_TO_HPA_FAILURE = ["14", "inject-mpa-hpa-fault"]
INJECT_ALL_ON_FAILURE = ["15", "inject-all-on-fault"]
- # The following commands might become deprecated in the future
- UPDATE_DRO_TO_X8_WAIT = ["128", "dro-to-x8-wait"]
- UPDATE_X8_TO_TX_WAIT_TIME = ["129", "x8-to-tx-wait"]
- UPDATE_TX_TO_MPA_WAIT_TIME = ["130", "tx-to-mpa-wait"]
- UPDATE_MPA_TO_HPA_WAIT_TIME = ["131", "mpa-to-hpa-wait"]
-
class Info:
NORMAL = "PL PCDU ADC modules normal"
@@ -50,6 +64,11 @@ class Info:
NORMAL_TX = f"{NORMAL}, TX on"
NORMAL_MPA = f"{NORMAL}, MPA on"
NORMAL_HPA = f"{NORMAL}, HPA on"
+ REQ_OS_HK = "Request One Shot HK"
+
+
+class SetIds(enum.IntEnum):
+ ADC = 0
class NormalSubmodesMask(enum.IntEnum):
@@ -99,6 +118,85 @@ class ParamIds(enum.IntEnum):
INJECT_ALL_ON_FAILURE = 35
+def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
+ op_code_dict = dict()
+ add_op_code_entry(
+ op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.NORMAL_SSR,
+ info=Info.NORMAL_SSR,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.NORMAL_DRO,
+ info=Info.NORMAL_DRO,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.NORMAL_X8,
+ info=Info.NORMAL_X8,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.NORMAL_TX,
+ info=Info.NORMAL_TX,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.NORMAL_MPA,
+ info=Info.NORMAL_MPA,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.NORMAL_HPA,
+ info=Info.NORMAL_HPA,
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict, keys=OpCodes.REQ_OS_HK, info=Info.REQ_OS_HK
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.INJECT_SSR_TO_DRO_FAILURE,
+ info="Inject failure SSR to DRO transition",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.INJECT_DRO_TO_X8_FAILURE,
+ info="Inject failure in DRO to X8 transition",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.INJECT_X8_TO_TX_FAILURE,
+ info="Inject failure in X8 to TX transition",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.INJECT_TX_TO_MPA_FAILURE,
+ info="Inject failure in TX to MPA transition",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.INJECT_MPA_TO_HPA_FAILURE,
+ info="Inject failure in MPA to HPA transition",
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict,
+ keys=OpCodes.INJECT_ALL_ON_FAILURE,
+ info="Inject failure in all on mode",
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name=CustomServiceList.PL_PCDU.value,
+ info="PL PCDU",
+ op_code_entry=op_code_dict,
+ )
+
+
def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str):
if op_code in OpCodes.SWITCH_ON:
pack_pl_pcdu_mode_cmd(
@@ -113,68 +211,53 @@ def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str):
tc_queue=tc_queue,
info=Info.NORMAL_SSR,
mode=Modes.NORMAL,
- submode=(1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON),
+ submode=submode_mask_to_submode(
+ NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
+ ),
)
if op_code in OpCodes.NORMAL_DRO:
pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
info=Info.NORMAL_DRO,
mode=Modes.NORMAL,
- submode=(
- 1 << NormalSubmodesMask.DRO_ON
- | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
- ),
+ submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON),
)
if op_code in OpCodes.NORMAL_X8:
pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
info=Info.NORMAL_X8,
mode=Modes.NORMAL,
- submode=(
- 1 << NormalSubmodesMask.DRO_ON
- | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
- | (1 << NormalSubmodesMask.X8_ON)
- ),
+ submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON),
)
if op_code in OpCodes.NORMAL_TX:
pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
info=Info.NORMAL_TX,
mode=Modes.NORMAL,
- submode=(
- 1 << NormalSubmodesMask.DRO_ON
- | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
- | (1 << NormalSubmodesMask.X8_ON)
- | (1 << NormalSubmodesMask.TX_ON)
- ),
+ submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON),
)
if op_code in OpCodes.NORMAL_MPA:
pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
info=Info.NORMAL_MPA,
mode=Modes.NORMAL,
- submode=(
- 1 << NormalSubmodesMask.DRO_ON
- | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
- | (1 << NormalSubmodesMask.X8_ON)
- | (1 << NormalSubmodesMask.TX_ON)
- | (1 << NormalSubmodesMask.MPA_ON)
- ),
+ submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON),
)
if op_code in OpCodes.NORMAL_HPA:
pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
info=Info.NORMAL_HPA,
mode=Modes.NORMAL,
- submode=(
- 1 << NormalSubmodesMask.DRO_ON
- | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
- | (1 << NormalSubmodesMask.X8_ON)
- | (1 << NormalSubmodesMask.TX_ON)
- | (1 << NormalSubmodesMask.MPA_ON)
- | (1 << NormalSubmodesMask.HPA_ON)
- ),
+ submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON),
)
+ if op_code in OpCodes.REQ_OS_HK:
+ tc_queue.appendleft((QueueCommands.PRINT, f"PL PCDU: {Info.REQ_OS_HK}"))
+ cmd = generate_one_diag_command(
+ sid=make_sid(object_id=PL_PCDU_ID, set_id=SetIds.ADC), ssc=0
+ )
+ tc_queue.appendleft(cmd.pack_command_tuple())
+ if op_code in OpCodes.SWITCH_HPA_ON_PROC:
+ hpa_on_procedure(tc_queue)
if op_code in OpCodes.INJECT_ALL_ON_FAILURE:
pack_failure_injection_cmd(
tc_queue=tc_queue,
@@ -183,6 +266,129 @@ def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str):
)
+def hpa_on_procedure(tc_queue: TcQueueT):
+ delay_dro_to_x8 = request_wait_time()
+ if delay_dro_to_x8 is None:
+ delay_dro_to_x8 = 900
+ tc_queue.appendleft(
+ (
+ QueueCommands.PRINT,
+ f"Starting procedure to switch on PL PCDU HPA with DRO to X8 delay of {delay_dro_to_x8} seconds",
+ )
+ )
+ pl_pcdu_on = PusTelecommand(
+ service=200,
+ subservice=Subservices.TC_MODE_COMMAND,
+ app_data=pack_mode_data(object_id=PL_PCDU_ID, mode=Modes.ON, submode=0),
+ )
+ ssr_on = PusTelecommand(
+ service=200,
+ subservice=Subservices.TC_MODE_COMMAND,
+ app_data=pack_mode_data(
+ object_id=PL_PCDU_ID,
+ mode=Modes.NORMAL,
+ submode=submode_mask_to_submode(
+ NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
+ ),
+ ),
+ )
+ dro_on = PusTelecommand(
+ service=200,
+ subservice=Subservices.TC_MODE_COMMAND,
+ app_data=pack_mode_data(
+ object_id=PL_PCDU_ID,
+ mode=Modes.NORMAL,
+ submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON),
+ ),
+ )
+ x8_on = PusTelecommand(
+ service=200,
+ subservice=Subservices.TC_MODE_COMMAND,
+ app_data=pack_mode_data(
+ object_id=PL_PCDU_ID,
+ mode=Modes.NORMAL,
+ submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON),
+ ),
+ )
+ tx_on = PusTelecommand(
+ service=200,
+ subservice=Subservices.TC_MODE_COMMAND,
+ app_data=pack_mode_data(
+ object_id=PL_PCDU_ID,
+ mode=Modes.NORMAL,
+ submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON),
+ ),
+ )
+ mpa_on = PusTelecommand(
+ service=200,
+ subservice=Subservices.TC_MODE_COMMAND,
+ app_data=pack_mode_data(
+ object_id=PL_PCDU_ID,
+ mode=Modes.NORMAL,
+ submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON),
+ ),
+ )
+ hpa_on = PusTelecommand(
+ service=200,
+ subservice=Subservices.TC_MODE_COMMAND,
+ app_data=pack_mode_data(
+ object_id=PL_PCDU_ID,
+ mode=Modes.NORMAL,
+ submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON),
+ ),
+ )
+ current_time = time.time()
+
+ enb_sched = generate_enable_tc_sched_cmd(ssc=0)
+
+ sched_time = current_time + 10
+ tc_queue.appendleft(enb_sched.pack_command_tuple())
+ tagged_on_cmd = generate_time_tagged_cmd(
+ release_time=struct.pack("!I", sched_time),
+ tc_to_insert=pl_pcdu_on,
+ ssc=1,
+ )
+ tc_queue.appendleft(tagged_on_cmd.pack_command_tuple())
+
+ sched_time += 5
+ tagged_ssr_cmd = generate_time_tagged_cmd(
+ release_time=struct.pack("!I", sched_time),
+ tc_to_insert=ssr_on,
+ ssc=2,
+ )
+ tc_queue.appendleft(tagged_ssr_cmd.pack_command_tuple())
+
+ sched_time += 5
+ tagged_dro_cmd = generate_time_tagged_cmd(
+ release_time=struct.pack("!I", sched_time), tc_to_insert=dro_on, ssc=3
+ )
+ tc_queue.appendleft(tagged_dro_cmd.pack_command_tuple())
+
+ sched_time += delay_dro_to_x8
+ tagged_x8_cmd = generate_time_tagged_cmd(
+ release_time=struct.pack("!I", sched_time), tc_to_insert=x8_on, ssc=4
+ )
+ tc_queue.appendleft(tagged_x8_cmd.pack_command_tuple())
+
+ sched_time += 5
+ tagged_tx_cmd = generate_time_tagged_cmd(
+ release_time=struct.pack("!I", sched_time), tc_to_insert=tx_on, ssc=5
+ )
+ tc_queue.appendleft(tagged_tx_cmd.pack_command_tuple())
+
+ sched_time += 5
+ tagged_mpa_cmd = generate_time_tagged_cmd(
+ release_time=struct.pack("!I", sched_time), tc_to_insert=mpa_on, ssc=6
+ )
+ tc_queue.appendleft(tagged_mpa_cmd.pack_command_tuple())
+
+ sched_time += 5
+ tagged_hpa_cmd = generate_time_tagged_cmd(
+ release_time=struct.pack("!I", sched_time), tc_to_insert=hpa_on, ssc=7
+ )
+ tc_queue.appendleft(tagged_hpa_cmd.pack_command_tuple())
+
+
def request_wait_time() -> Optional[float]:
while True:
wait_time = input("Please enter DRO to X8 wait time in seconds, x to cancel: ")
@@ -199,6 +405,45 @@ def request_wait_time() -> Optional[float]:
return wait_time
+def submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int:
+ if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON:
+ return 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
+ if on_tgt == NormalSubmodesMask.DRO_ON:
+ return 1 << NormalSubmodesMask.DRO_ON | (
+ 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
+ )
+ if on_tgt == NormalSubmodesMask.X8_ON:
+ return (
+ 1 << NormalSubmodesMask.DRO_ON
+ | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
+ | (1 << NormalSubmodesMask.X8_ON)
+ )
+ if on_tgt == NormalSubmodesMask.TX_ON:
+ return (
+ 1 << NormalSubmodesMask.DRO_ON
+ | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
+ | (1 << NormalSubmodesMask.X8_ON)
+ | (1 << NormalSubmodesMask.TX_ON)
+ )
+ if on_tgt == NormalSubmodesMask.MPA_ON:
+ return (
+ 1 << NormalSubmodesMask.DRO_ON
+ | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
+ | (1 << NormalSubmodesMask.X8_ON)
+ | (1 << NormalSubmodesMask.TX_ON)
+ | (1 << NormalSubmodesMask.MPA_ON)
+ )
+ if on_tgt == NormalSubmodesMask.HPA_ON:
+ return (
+ 1 << NormalSubmodesMask.DRO_ON
+ | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
+ | (1 << NormalSubmodesMask.X8_ON)
+ | (1 << NormalSubmodesMask.TX_ON)
+ | (1 << NormalSubmodesMask.MPA_ON)
+ | (1 << NormalSubmodesMask.HPA_ON)
+ )
+
+
def pack_wait_time_cmd(tc_queue: TcQueueT, param_id: int, print_str: str):
wait_time = request_wait_time()
tc_queue.appendleft(
diff --git a/pus_tc/devs/rad_sensor.py b/pus_tc/devs/rad_sensor.py
index 8fe63b4..7d66597 100644
--- a/pus_tc/devs/rad_sensor.py
+++ b/pus_tc/devs/rad_sensor.py
@@ -7,11 +7,37 @@
"""
import struct
-from tmtccmd.config.definitions import QueueCommands
+from config.definitions import CustomServiceList
+from tmtccmd.config import add_op_code_entry, add_service_op_code_entry
+from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT, OpCodeDictKeys
from tmtccmd.tc.packer import TcQueueT
from spacepackets.ecss.tc import PusTelecommand
from pus_tc.service_200_mode import pack_mode_data, Modes
+from tmtccmd.tc.pus_3_fsfw_hk import generate_one_hk_command, make_sid
+from tmtccmd.utility import ObjectId
+
+
+class SetIds:
+ HK = 3
+
+
+class OpCodes:
+ ON = ["0", "on"]
+ NORMAL = ["1", "normal"]
+ OFF = ["2", "off"]
+ REQ_HK_ONCE = ["3", "hk-os"]
+ DEBUG_ON = ["10", "dbg-on"]
+ DEBUG_OFF = ["11", "dbg-off"]
+
+
+class Info:
+ ON = "Switch Rad Sensor on"
+ NORMAL = "Switch Rad Sensor normal"
+ OFF = "Switch Rad sensor off"
+ REQ_OS_HK = "Request one-shot HK"
+ DEBUG_ON = "Switch debug output on"
+ DEBUG_OFF = "Switch debug output off"
class CommandIds:
@@ -21,52 +47,64 @@ class CommandIds:
DISABLE_DEBUG_OUTPUT = 5
-def pack_rad_sensor_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
- tc_queue.appendleft(
- (
- QueueCommands.PRINT,
- "Testing radiation sensor handler with object id: 0x" + object_id.hex(),
- )
+def add_rad_sens_cmds(cmd_dict: ServiceOpCodeDictT):
+
+ op_code_dict = dict()
+ add_op_code_entry(op_code_dict=op_code_dict, info=Info.ON, keys=OpCodes.ON)
+ add_op_code_entry(op_code_dict=op_code_dict, info=Info.OFF, keys=OpCodes.OFF)
+ add_op_code_entry(op_code_dict=op_code_dict, info=Info.NORMAL, keys=OpCodes.NORMAL)
+ add_op_code_entry(
+ op_code_dict=op_code_dict, info=Info.REQ_OS_HK, keys=OpCodes.REQ_HK_ONCE
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict, info=Info.DEBUG_ON, keys=OpCodes.DEBUG_ON
+ )
+ add_op_code_entry(
+ op_code_dict=op_code_dict, info=Info.DEBUG_OFF, keys=OpCodes.DEBUG_OFF
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name=CustomServiceList.RAD_SENSOR.value,
+ info="Radiation Sensor",
+ op_code_entry=op_code_dict,
)
- if op_code == "0":
- tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Switch to mode on"))
- mode_data = pack_mode_data(object_id, Modes.ON, 0)
- command = PusTelecommand(service=200, subservice=1, ssc=41, app_data=mode_data)
- tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "1":
- tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Switch to mode normal"))
- mode_data = pack_mode_data(object_id, Modes.NORMAL, 0)
- command = PusTelecommand(service=200, subservice=1, ssc=42, app_data=mode_data)
- tc_queue.appendleft(command.pack_command_tuple())
+def pack_rad_sensor_test_into(object_id: ObjectId, tc_queue: TcQueueT, op_code: str):
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, f"Commanding Radiation sensor handler {object_id}")
+ )
- if op_code == "2":
- tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Switch to mode off"))
- mode_data = pack_mode_data(object_id, Modes.OFF, 0)
- command = PusTelecommand(service=200, subservice=1, ssc=42, app_data=mode_data)
+ if op_code in OpCodes.ON:
+ rad_sensor_mode_cmd(object_id, Modes.ON, Info.ON, tc_queue)
+ if op_code in OpCodes.NORMAL:
+ rad_sensor_mode_cmd(object_id, Modes.NORMAL, Info.NORMAL, tc_queue)
+ if op_code in OpCodes.OFF:
+ rad_sensor_mode_cmd(object_id, Modes.OFF, Info.OFF, tc_queue)
+ if op_code in OpCodes.REQ_HK_ONCE:
+ tc_queue.appendleft((QueueCommands.PRINT, f"Rad sensor: {Info.REQ_OS_HK}"))
+ cmd = generate_one_hk_command(
+ sid=make_sid(object_id.as_bytes, set_id=SetIds.HK), ssc=0
+ )
+ tc_queue.appendleft(cmd.pack_command_tuple())
+ if op_code in OpCodes.DEBUG_ON:
+ tc_queue.appendleft((QueueCommands.PRINT, f"Rad sensor: {Info.DEBUG_ON}"))
+ command = object_id.as_bytes + struct.pack("!I", CommandIds.ENABLE_DEBUG_OUTPUT)
+ command = PusTelecommand(service=8, subservice=128, ssc=45, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
-
- if op_code == "3":
- tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Start conversions"))
- command = object_id + struct.pack("!I", CommandIds.START_CONVERSIONS)
- command = PusTelecommand(service=8, subservice=128, ssc=43, app_data=command)
- tc_queue.appendleft(command.pack_command_tuple())
-
- if op_code == "4":
- tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Read conversions"))
- command = object_id + struct.pack("!I", CommandIds.READ_CONVERSIONS)
- command = PusTelecommand(service=8, subservice=128, ssc=44, app_data=command)
- tc_queue.appendleft(command.pack_command_tuple())
-
- if op_code == "5":
- tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Enable debug output"))
- command = object_id + struct.pack("!I", CommandIds.ENABLE_DEBUG_OUTPUT)
+ if op_code in OpCodes.DEBUG_OFF:
+ tc_queue.appendleft((QueueCommands.PRINT, f"Rad sensor: {Info.DEBUG_OFF}"))
+ command = object_id.as_bytes + struct.pack(
+ "!I", CommandIds.DISABLE_DEBUG_OUTPUT
+ )
command = PusTelecommand(service=8, subservice=128, ssc=45, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "6":
- tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Disable debug output"))
- command = object_id + struct.pack("!I", CommandIds.DISABLE_DEBUG_OUTPUT)
- command = PusTelecommand(service=8, subservice=128, ssc=45, app_data=command)
- tc_queue.appendleft(command.pack_command_tuple())
+
+def rad_sensor_mode_cmd(
+ object_id: ObjectId, mode: Modes, info: str, tc_queue: TcQueueT
+):
+ tc_queue.appendleft((QueueCommands.PRINT, f"Rad sensor: {info}"))
+ mode_data = pack_mode_data(object_id.as_bytes, mode, 0)
+ command = PusTelecommand(service=200, subservice=1, ssc=41, app_data=mode_data)
+ tc_queue.appendleft(command.pack_command_tuple())
diff --git a/pus_tc/devs/reaction_wheels.py b/pus_tc/devs/reaction_wheels.py
index a74e27c..60edc36 100644
--- a/pus_tc/devs/reaction_wheels.py
+++ b/pus_tc/devs/reaction_wheels.py
@@ -136,8 +136,7 @@ def pack_single_rw_test_into(
speed = int(input("Specify speed [0.1 RPM]: "))
ramp_time = int(input("Specify ramp time [ms]: "))
tc_queue.appendleft((QueueCommands.PRINT, f"RW {rw_idx}: {InfoDevs.SPEED}"))
- command = pack_set_speed_command(object_id, speed, ramp_time)
- command = PusTelecommand(service=8, subservice=128, ssc=40, app_data=command)
+ command = pack_set_speed_command(object_id, speed, ramp_time, 40)
tc_queue.appendleft(command.pack_command_tuple())
if op_code in OpCodesDevs.ON:
@@ -196,17 +195,41 @@ def pack_rw_ass_cmds(tc_queue: TcQueueT, object_id: bytes, op_code: str):
tc_queue.appendleft(cmd.pack_command_tuple())
-def pack_set_speed_command(object_id: bytes, speed: int, ramp_time: int) -> bytearray:
+def pack_set_speed_command(
+ object_id: bytes, speed: int, ramp_time_ms: int, ssc: int
+) -> PusTelecommand:
"""With this function a command is packed to set the speed of a reaction wheel
:param object_id: The object id of the reaction wheel handler.
:param speed: Valid speeds are [-65000, -1000] and [1000, 65000]. Values are
specified in 0.1 * RPM
- :param ramp_time: The time after which the reaction wheel will reached the commanded speed.
+ :param ramp_time_ms: The time after which the reaction wheel will reach the commanded speed.
Valid times are 10 - 10000 ms
+ :param ssc: Source sequence count
"""
+ if speed > 0:
+ if speed < 1000 or speed > 65000:
+ raise ValueError(
+ "Invalid RW speed specified. "
+ "Allowed range is [1000, 65000] 0.1 * RPM"
+ )
+ elif speed < 0:
+ if speed < -65000 or speed > -1000:
+ raise ValueError(
+ "Invalid RW speed specified. "
+ "Allowed range is [-65000, -1000] 0.1 * RPM"
+ )
+ else:
+ # Speed is 0
+ pass
+
+ if ramp_time_ms < 0 or (
+ ramp_time_ms > 0 and (ramp_time_ms > 10000 or ramp_time_ms < 10)
+ ):
+ raise ValueError("Invalid Ramp Speed time. Allowed range is [10-10000] ms")
command_id = RwCommandIds.SET_SPEED
command = bytearray()
command += object_id + command_id
command = command + struct.pack("!i", speed)
- command = command + ramp_time.to_bytes(length=2, byteorder="big")
+ command = command + ramp_time_ms.to_bytes(length=2, byteorder="big")
+ command = PusTelecommand(service=8, subservice=128, ssc=ssc, app_data=command)
return command
diff --git a/pus_tc/devs/rtd.py b/pus_tc/devs/rtd.py
new file mode 100644
index 0000000..8e3c614
--- /dev/null
+++ b/pus_tc/devs/rtd.py
@@ -0,0 +1,111 @@
+from typing import Optional
+
+from config.definitions import CustomServiceList
+from spacepackets.ecss import PusTelecommand
+from tmtccmd.config import (
+ ServiceOpCodeDictT,
+ add_op_code_entry,
+ add_service_op_code_entry,
+)
+from tmtccmd.tc.definitions import TcQueueT
+from tmtccmd.utility import ObjectId
+from tmtccmd.tc.pus_200_fsfw_modes import Modes, pack_mode_data, Subservices
+import config.object_ids as oids
+from config.object_ids import get_object_ids
+
+RTD_IDS = [
+ oids.RTD_0_PLOC_HSPD,
+ oids.RTD_1_PLOC_MISSIONBRD,
+ oids.RTD_2_4K_CAM,
+ oids.RTD_3_DAC_HSPD,
+ oids.RTD_4_STR,
+ oids.RTD_5_RW1_MX_MY,
+ oids.RTD_6_DRO,
+ oids.RTD_7_SCEX,
+ oids.RTD_8_X8,
+ oids.RTD_9_HPA,
+ oids.RTD_10_PL_TX,
+ oids.RTD_11_MPA,
+ oids.RTD_12_ACU,
+ oids.RTD_13_PLPCDU_HSPD,
+ oids.RTD_14_TCS_BRD,
+ oids.RTD_15_IMTQ,
+]
+
+
+class OpCodes:
+ ON = ["0", "on"]
+ OFF = ["1", "off"]
+ NORMAL = ["2", "normal"]
+ CONFIG_CMD = ["3", "Write config"]
+
+
+class Info:
+ ON = "Switch handler on"
+ OFF = "Switch handler off"
+ NORMAL = "Switch handler normal"
+ WIRTE_CONFIG = "Write config"
+
+
+def specify_rtd_cmds(cmd_dict: ServiceOpCodeDictT):
+ op_code_dict = dict()
+ add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.ON, info=Info.ON)
+ add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.NORMAL, info=Info.NORMAL)
+ add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.OFF, info=Info.OFF)
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ op_code_entry=op_code_dict,
+ name=CustomServiceList.RTD.value,
+ info="RTD commands",
+ )
+
+
+def pack_rtd_commands(op_code: str, object_id: Optional[ObjectId], tc_queue: TcQueueT):
+ if object_id is not None and object_id not in RTD_IDS:
+ print("Specified object ID not a valid RTD ID")
+ object_id = None
+ if object_id is None:
+ tgt_rtd_idx = prompt_rtd_idx()
+ object_id_dict = get_object_ids()
+ object_id = object_id_dict.get(RTD_IDS[tgt_rtd_idx])
+ if op_code in OpCodes.ON:
+ app_data = pack_mode_data(
+ object_id=object_id.as_bytes, mode=Modes.ON, submode=0
+ )
+ cmd = PusTelecommand(
+ service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data
+ )
+ tc_queue.appendleft(cmd.pack_command_tuple())
+ if op_code in OpCodes.NORMAL:
+ app_data = pack_mode_data(
+ object_id=object_id.as_bytes, mode=Modes.NORMAL, submode=0
+ )
+ cmd = PusTelecommand(
+ service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data
+ )
+ tc_queue.appendleft(cmd.pack_command_tuple())
+ if op_code in OpCodes.OFF:
+ app_data = pack_mode_data(
+ object_id=object_id.as_bytes, mode=Modes.OFF, submode=0
+ )
+ cmd = PusTelecommand(
+ service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data
+ )
+ tc_queue.appendleft(cmd.pack_command_tuple())
+ if op_code in OpCodes.CONFIG_CMD:
+ command = object_id + CommandIds.PRINT_CLCW
+ command = PusTelecommand(service=8, subservice=128, ssc=30, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+
+
+def prompt_rtd_idx():
+ while True:
+ rtd_idx = input("Please specify RTD index [0-15]: ")
+ if not rtd_idx.isdigit():
+ print("Invalid input")
+ continue
+ rtd_idx = int(rtd_idx)
+ if rtd_idx < 0 or rtd_idx > 15:
+ print("Invalid device index")
+ continue
+ return rtd_idx
diff --git a/pus_tc/devs/star_tracker.py b/pus_tc/devs/star_tracker.py
index 73bbc37..d8c9a94 100644
--- a/pus_tc/devs/star_tracker.py
+++ b/pus_tc/devs/star_tracker.py
@@ -85,6 +85,10 @@ class StarTrackerActionIds:
FIRMWARE_UPDATE = 84
+class SetIds:
+ TEMPERATURE = 25
+
+
class FileDefs:
download_path = "/mnt/sd0/startracker"
json_file = "/mnt/sd0/startracker/full.json"
diff --git a/pus_tc/devs/sus.py b/pus_tc/devs/sus.py
new file mode 100644
index 0000000..be99fc1
--- /dev/null
+++ b/pus_tc/devs/sus.py
@@ -0,0 +1,2 @@
+class SetIds:
+ HK = 3
diff --git a/pus_tc/prompt_parameters.py b/pus_tc/prompt_parameters.py
new file mode 100644
index 0000000..feca256
--- /dev/null
+++ b/pus_tc/prompt_parameters.py
@@ -0,0 +1,124 @@
+from PyQt5.QtWidgets import (
+ QDialog,
+ QDialogButtonBox,
+ QVBoxLayout,
+ QLabel,
+ QGroupBox,
+ QGridLayout,
+ QLineEdit,
+)
+
+from PyQt5 import QtCore
+
+
+from tmtccmd.core.globals_manager import get_global
+from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList
+
+
+class Parameter:
+ def __init__(self, name: str, defaultValue: str, widget: QLineEdit):
+ self.name = name
+ self.defaultValue = defaultValue
+ self.widget = widget
+ self.value = self.defaultValue
+ self.widget.setPlaceholderText(self.defaultValue)
+
+ def reset(self):
+ self.value = self.defaultValue
+ self.widget.setPlaceholderText(self.defaultValue)
+ self.widget.setText("")
+
+
+class ParameterDialog(QDialog):
+ def __init__(self):
+ super().__init__()
+
+ self.setWindowTitle("Enter Parameters")
+
+ Buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Reset
+
+ self.buttonBox = QDialogButtonBox(Buttons)
+ self.buttonBox.accepted.connect(self.accept)
+ self.buttonBox.rejected.connect(self.reject)
+ self.buttonBox.button(QDialogButtonBox.Reset).clicked.connect(self._reset)
+
+ self.data = 1
+
+ self.rootLayout = QVBoxLayout()
+ self.group = QGroupBox("Parameters")
+ self.rootLayout.addWidget(self.group)
+ self.rootLayout.addWidget(self.buttonBox)
+ self.setLayout(self.rootLayout)
+
+ self.groupLayout = QGridLayout()
+ self.group.setLayout(self.groupLayout)
+
+ self.parameters = {}
+
+ def addParameter(self, name: str, defaultValue: str):
+ row = self.groupLayout.rowCount() + 1
+ description = QLabel(name)
+ self.groupLayout.addWidget(description, row, 0)
+ valueWidget = QLineEdit()
+ self.groupLayout.addWidget(valueWidget, row, 1)
+
+ parameter = Parameter(name, defaultValue, valueWidget)
+
+ self.parameters[name] = parameter
+
+ def _reset(self):
+ for value in self.parameters.values():
+ value.reset()
+
+ def getParameters(self):
+ output = {}
+ for key, parameter in self.parameters.items():
+ if parameter.widget != None:
+ if parameter.widget.text() != "":
+ parameter.value = parameter.widget.text()
+ output[key] = parameter.value
+ return output
+
+ @QtCore.pyqtSlot()
+ def reject(self):
+ print("reject")
+ self._reset()
+ super().reject()
+
+
+"""Prompt the user to specify additional Parameters
+
+ :param parameterList: array of dictionaries with name and defaultValue attributes
+ :return: dict with all names as key and user supplied input as value string
+ """
+
+
+def prompt_parameters(parameterList):
+ gui = get_global(CoreGlobalIds.GUI)
+ mode = get_global(CoreGlobalIds.MODE)
+
+ # gui only works in cont mode right now
+ if gui and mode == CoreModeList.CONTINUOUS_MODE:
+ return _gui_prompt(parameterList)
+ else:
+ return _cli_prompt(parameterList)
+
+
+def _gui_prompt(parameterList):
+ dialog = ParameterDialog()
+ for parameter in parameterList:
+ dialog.addParameter(parameter["name"], parameter["defaultValue"])
+ dialog.exec_()
+ return dialog.getParameters()
+
+
+def _cli_prompt(parameterList):
+ result = {}
+ for parameter in parameterList:
+ userInput = input(
+ "Specify {} [{}]: ".format(parameter["name"], parameter["defaultValue"])
+ )
+ if userInput == "":
+ userInput = parameter["defaultValue"]
+ result[parameter["name"]] = userInput
+ return result
diff --git a/pus_tc/system/acs.py b/pus_tc/system/acs.py
index ea97734..76b3dcc 100644
--- a/pus_tc/system/acs.py
+++ b/pus_tc/system/acs.py
@@ -3,7 +3,7 @@ from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.tc.pus_200_fsfw_modes import Modes
from config.object_ids import ACS_BOARD_ASS_ID, SUS_BOARD_ASS_ID
-from .common import command_assembly
+from .common import command_mode
class AcsOpCodes:
@@ -31,7 +31,7 @@ class DualSideSubmodes(enum.IntEnum):
def pack_acs_command(tc_queue: TcQueueT, op_code: str):
if op_code in AcsOpCodes.ACS_ASS_A_SIDE:
- command_assembly(
+ command_mode(
object_id=ACS_BOARD_ASS_ID,
mode=Modes.NORMAL,
submode=DualSideSubmodes.A_SIDE,
@@ -39,7 +39,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str):
info="Switching to ACS board assembly A side",
)
if op_code in AcsOpCodes.ACS_ASS_B_SIDE:
- command_assembly(
+ command_mode(
object_id=ACS_BOARD_ASS_ID,
mode=Modes.NORMAL,
submode=DualSideSubmodes.B_SIDE,
@@ -47,7 +47,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str):
info="Switching to ACS board assembly B side",
)
if op_code in AcsOpCodes.ACS_ASS_DUAL_MODE:
- command_assembly(
+ command_mode(
object_id=ACS_BOARD_ASS_ID,
mode=Modes.NORMAL,
submode=DualSideSubmodes.DUAL_SIDE,
@@ -55,7 +55,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str):
info="Switching to ACS board assembly dual mode",
)
if op_code in AcsOpCodes.ACS_ASS_A_ON:
- command_assembly(
+ command_mode(
object_id=ACS_BOARD_ASS_ID,
mode=Modes.ON,
submode=DualSideSubmodes.A_SIDE,
@@ -63,7 +63,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str):
info="Switching ACS board assembly A side on",
)
if op_code in AcsOpCodes.ACS_ASS_B_ON:
- command_assembly(
+ command_mode(
object_id=ACS_BOARD_ASS_ID,
mode=Modes.ON,
submode=DualSideSubmodes.B_SIDE,
@@ -71,7 +71,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str):
info="Switching ACS board assembly B side on",
)
if op_code in AcsOpCodes.ACS_ASS_DUAL_ON:
- command_assembly(
+ command_mode(
object_id=ACS_BOARD_ASS_ID,
mode=Modes.ON,
submode=DualSideSubmodes.B_SIDE,
@@ -79,7 +79,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str):
info="Switching ACS board assembly dual side on",
)
if op_code in AcsOpCodes.ACS_ASS_OFF:
- command_assembly(
+ command_mode(
object_id=ACS_BOARD_ASS_ID,
mode=Modes.OFF,
submode=0,
@@ -90,7 +90,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str):
def pack_sus_cmds(tc_queue: TcQueueT, op_code: str):
if op_code in SusOpCodes.SUS_ASS_NOM_SIDE:
- command_assembly(
+ command_mode(
object_id=SUS_BOARD_ASS_ID,
mode=Modes.NORMAL,
submode=DualSideSubmodes.A_SIDE,
@@ -98,7 +98,7 @@ def pack_sus_cmds(tc_queue: TcQueueT, op_code: str):
info="Switching to SUS board to nominal side",
)
if op_code in SusOpCodes.SUS_ASS_RED_SIDE:
- command_assembly(
+ command_mode(
object_id=SUS_BOARD_ASS_ID,
mode=Modes.NORMAL,
submode=DualSideSubmodes.B_SIDE,
@@ -106,7 +106,7 @@ def pack_sus_cmds(tc_queue: TcQueueT, op_code: str):
info="Switching to SUS board to redundant side",
)
if op_code in SusOpCodes.SUS_ASS_OFF:
- command_assembly(
+ command_mode(
object_id=SUS_BOARD_ASS_ID,
mode=Modes.OFF,
submode=0,
@@ -114,7 +114,7 @@ def pack_sus_cmds(tc_queue: TcQueueT, op_code: str):
info="Switching SUS board off",
)
if op_code in SusOpCodes.SUS_ASS_DUAL_MODE:
- command_assembly(
+ command_mode(
object_id=SUS_BOARD_ASS_ID,
mode=Modes.NORMAL,
submode=DualSideSubmodes.DUAL_SIDE,
diff --git a/pus_tc/system/common.py b/pus_tc/system/common.py
index 55ae7b3..f6fc397 100644
--- a/pus_tc/system/common.py
+++ b/pus_tc/system/common.py
@@ -1,10 +1,16 @@
+from typing import Union
+
from tmtccmd.tc.definitions import TcQueueT, QueueCommands
from spacepackets.ecss.tc import PusTelecommand
from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes, Subservices
-def command_assembly(
- object_id: bytes, mode: Modes, submode: int, tc_queue: TcQueueT, info: str
+def command_mode(
+ object_id: bytes,
+ mode: Union[int, Modes],
+ submode: int,
+ tc_queue: TcQueueT,
+ info: str,
):
tc_queue.appendleft((QueueCommands.PRINT, info))
mode_data = pack_mode_data(
diff --git a/pus_tc/system/controllers.py b/pus_tc/system/controllers.py
new file mode 100644
index 0000000..2f072cd
--- /dev/null
+++ b/pus_tc/system/controllers.py
@@ -0,0 +1,82 @@
+from tmtccmd.tc.definitions import TcQueueT
+from tmtccmd.config import QueueCommands
+from tmtccmd.tc.pus_200_fsfw_modes import Modes
+from tmtccmd.utility import ObjectId
+
+from .common import command_mode
+import config.object_ids as obj_ids
+
+from pus_tc.prompt_parameters import prompt_parameters
+
+
+class OpCodes:
+ THERMAL_CONTROLLER = [obj_ids.THERMAL_CONTROLLER_ID.hex(), "ctrl-th"]
+ CORE_CONTROLLER = [obj_ids.CORE_CONTROLLER_ID.hex(), "ctrl-core"]
+
+
+class Info:
+ THERMAL_CONTROLLER = "Thermal controller"
+ CORE_CONTROLLER = "ACS controller"
+
+
+def pack_cmd_ctrl_to_prompted_mode(tc_queue: TcQueueT, object_id: ObjectId):
+ parameters = prompt_parameters(
+ [
+ {"name": "Mode", "defaultValue": "2"},
+ {"name": "Submode", "defaultValue": "0"},
+ ]
+ )
+ mode = int(parameters["Mode"])
+ if mode < 0 or mode > 2:
+ print("Invalid Mode, defaulting to OFF")
+ mode = 0
+ submode = int(parameters["Submode"])
+ command_mode(
+ object_id=object_id.as_bytes,
+ mode=mode,
+ submode=submode,
+ tc_queue=tc_queue,
+ info=f"Commanding {object_id} to {mode}, {submode}",
+ )
+
+
+def pack_cmd_ctrl_to_off(tc_queue: TcQueueT, object_id: ObjectId):
+ command_mode(
+ object_id=object_id.as_bytes,
+ mode=Modes.OFF,
+ submode=0,
+ tc_queue=tc_queue,
+ info=f"Commanding {object_id} OFF",
+ )
+
+
+def pack_cmd_ctrl_to_on(tc_queue: TcQueueT, object_id: ObjectId):
+ command_mode(
+ object_id=object_id.as_bytes,
+ mode=Modes.ON,
+ submode=0,
+ tc_queue=tc_queue,
+ info=f"Commanding {object_id} ON",
+ )
+
+
+def pack_cmd_ctrl_to_nml(tc_queue: TcQueueT, object_id: ObjectId):
+ command_mode(
+ object_id=object_id.as_bytes,
+ mode=Modes.NORMAL,
+ submode=0,
+ tc_queue=tc_queue,
+ info=f"Commanding {object_id} NORMAL",
+ )
+
+
+def get_object_from_op_code(op_code: str):
+ try:
+ return bytes.fromhex(op_code)
+ except:
+ pass
+
+ if op_code in OpCodes.THERMAL_CONTROLLER:
+ return obj_ids.THERMAL_CONTROLLER_ID
+ if op_code in OpCodes.CORE_CONTROLLER:
+ return obj_ids.CORE_CONTROLLER_ID
diff --git a/pus_tc/system/core.py b/pus_tc/system/core.py
index a4e5c6e..f44ad87 100644
--- a/pus_tc/system/core.py
+++ b/pus_tc/system/core.py
@@ -1,6 +1,8 @@
import enum
-from tmtccmd.config.definitions import QueueCommands
+from config.definitions import CustomServiceList
+from tmtccmd.config import add_op_code_entry, add_service_op_code_entry
+from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT
from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.tc.pus_8_funccmd import generate_action_command
from tmtccmd.logging import get_console_logger
@@ -19,7 +21,8 @@ class ActionIds(enum.IntEnum):
RESET_REBOOT_COUNTER_10 = 9
RESET_REBOOT_COUNTER_11 = 10
SET_MAX_REBOOT_CNT = 11
- REBOOT = 32
+ XSC_REBOOT = 32
+ FULL_REBOOT = 34
class SetIds(enum.IntEnum):
@@ -27,21 +30,27 @@ class SetIds(enum.IntEnum):
class OpCodes:
- REBOOT = ["0", "reboot"]
- REBOOT_SELF = ["1", "reboot_self"]
- REBOOT_0_0 = ["2", "reboot_0_0"]
- REBOOT_0_1 = ["3", "reboot_0_1"]
- REBOOT_1_0 = ["4", "reboot_1_0"]
- REBOOT_1_1 = ["5", "reboot_1_1"]
- ENABLE_REBOOT_FILE_HANDLING = ["6", "rbh-off"]
- DISABLE_REBOOT_FILE_HANDLING = ["7", "rbh-on"]
- RESET_ALL_REBOOT_COUNTERS = ["8", "rbh-reset-a"]
- RESET_REBOOT_COUNTER_00 = ["9", "rbh-reset-00"]
- RESET_REBOOT_COUNTER_01 = ["10", "rbh-reset-01"]
- RESET_REBOOT_COUNTER_10 = ["11", "rbh-reset-10"]
- RESET_REBOOT_COUNTER_11 = ["12", "rbh-reset-11"]
- SET_MAX_REBOOT_CNT = ["13", "rbh-max-cnt"]
- GET_HK = ["14", "get-hk"]
+ REBOOT_XSC = ["0", "reboot-xsc"]
+ XSC_REBOOT_SELF = ["1", "reboot-self"]
+ XSC_REBOOT_0_0 = ["2", "reboot-00"]
+ XSC_REBOOT_0_1 = ["3", "reboot-01"]
+ XSC_REBOOT_1_0 = ["4", "reboot-10"]
+ XSC_REBOOT_1_1 = ["5", "reboot-11"]
+ REBOOT_FULL = ["6", "reboot-regular"]
+ GET_HK = ["7", "get-hk"]
+ ENABLE_REBOOT_FILE_HANDLING = ["32", "rbh-off"]
+ DISABLE_REBOOT_FILE_HANDLING = ["33", "rbh-on"]
+ RESET_ALL_REBOOT_COUNTERS = ["34", "rbh-reset-a"]
+ RESET_REBOOT_COUNTER_00 = ["35", "rbh-reset-00"]
+ RESET_REBOOT_COUNTER_01 = ["36", "rbh-reset-01"]
+ RESET_REBOOT_COUNTER_10 = ["37", "rbh-reset-10"]
+ RESET_REBOOT_COUNTER_11 = ["38", "rbh-reset-11"]
+ SET_MAX_REBOOT_CNT = ["39", "rbh-max-cnt"]
+
+
+class Info:
+ REBOOT_XSC = "XSC reboot with prompt"
+ REBOOT_FULL = "Full regular reboot"
class Chip(enum.IntEnum):
@@ -56,8 +65,65 @@ class Copy(enum.IntEnum):
NONE = 2
+def add_core_controller_definitions(cmd_dict: ServiceOpCodeDictT):
+ od = dict()
+ add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_XSC, info=Info.REBOOT_XSC)
+ add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_FULL, info=Info.REBOOT_FULL)
+ add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_SELF, info="Reboot Self")
+ add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_0_0, info="Reboot 0 0")
+ add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_0_1, info="Reboot 0 1")
+ add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_1_0, info="Reboot 1 0")
+ add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_1_1, info="Reboot 1 1")
+ add_op_code_entry(
+ op_code_dict=od,
+ keys=OpCodes.GET_HK,
+ info="Request housekeeping set",
+ )
+ add_op_code_entry(
+ op_code_dict=od,
+ keys=OpCodes.ENABLE_REBOOT_FILE_HANDLING,
+ info="Enable reboot file handling",
+ )
+ add_op_code_entry(
+ op_code_dict=od,
+ keys=OpCodes.DISABLE_REBOOT_FILE_HANDLING,
+ info="Disable reboot file handling",
+ )
+ add_op_code_entry(
+ op_code_dict=od,
+ keys=OpCodes.RESET_ALL_REBOOT_COUNTERS,
+ info="Reset all reboot counters",
+ )
+ add_op_code_entry(
+ op_code_dict=od,
+ keys=OpCodes.RESET_REBOOT_COUNTER_00,
+ info="Reset reboot counter 0 0",
+ )
+ add_op_code_entry(
+ op_code_dict=od,
+ keys=OpCodes.RESET_REBOOT_COUNTER_01,
+ info="Reset reboot counter 0 1",
+ )
+ add_op_code_entry(
+ op_code_dict=od,
+ keys=OpCodes.RESET_REBOOT_COUNTER_10,
+ info="Reset reboot counter 1 0",
+ )
+ add_op_code_entry(
+ op_code_dict=od,
+ keys=OpCodes.RESET_REBOOT_COUNTER_11,
+ info="Reset reboot counter 1 1",
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name=CustomServiceList.CORE.value,
+ info="Core Controller",
+ op_code_entry=od,
+ )
+
+
def pack_core_commands(tc_queue: TcQueueT, op_code: str):
- if op_code in OpCodes.REBOOT:
+ if op_code in OpCodes.REBOOT_XSC:
reboot_self, chip_select, copy_select = determine_reboot_params()
perform_reboot_cmd(
tc_queue=tc_queue,
@@ -65,31 +131,37 @@ def pack_core_commands(tc_queue: TcQueueT, op_code: str):
chip=chip_select,
copy=copy_select,
)
- elif op_code in OpCodes.REBOOT_SELF:
+ if op_code in OpCodes.REBOOT_FULL:
+ tc_queue.appendleft((QueueCommands.PRINT, f"Core Command: {Info.REBOOT_FULL}"))
+ cmd = generate_action_command(
+ object_id=CORE_CONTROLLER_ID, action_id=ActionIds.FULL_REBOOT
+ )
+ tc_queue.appendleft(cmd.pack_command_tuple())
+ if op_code in OpCodes.XSC_REBOOT_SELF:
perform_reboot_cmd(tc_queue=tc_queue, reboot_self=True)
- elif op_code in OpCodes.REBOOT_0_0:
+ if op_code in OpCodes.XSC_REBOOT_0_0:
perform_reboot_cmd(
tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM
)
- elif op_code in OpCodes.REBOOT_0_1:
+ if op_code in OpCodes.XSC_REBOOT_0_1:
perform_reboot_cmd(
tc_queue=tc_queue,
reboot_self=False,
chip=Chip.CHIP_0,
copy=Copy.COPY_1_GOLD,
)
- elif op_code in OpCodes.REBOOT_1_0:
+ if op_code in OpCodes.XSC_REBOOT_1_0:
perform_reboot_cmd(
tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_0_NOM
)
- elif op_code in OpCodes.REBOOT_1_1:
+ if op_code in OpCodes.XSC_REBOOT_1_1:
perform_reboot_cmd(
tc_queue=tc_queue,
reboot_self=False,
chip=Chip.CHIP_1,
copy=Copy.COPY_1_GOLD,
)
- elif op_code in OpCodes.DISABLE_REBOOT_FILE_HANDLING:
+ if op_code in OpCodes.DISABLE_REBOOT_FILE_HANDLING:
tc_queue.appendleft((QueueCommands.PRINT, "Disabling reboot file handling"))
app_data = bytearray([0])
generate_action_command(
@@ -97,7 +169,7 @@ def pack_core_commands(tc_queue: TcQueueT, op_code: str):
action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING,
app_data=app_data,
)
- elif op_code in OpCodes.ENABLE_REBOOT_FILE_HANDLING:
+ if op_code in OpCodes.ENABLE_REBOOT_FILE_HANDLING:
tc_queue.appendleft((QueueCommands.PRINT, "Enabling reboot file handling"))
app_data = bytearray([1])
generate_action_command(
@@ -105,32 +177,32 @@ def pack_core_commands(tc_queue: TcQueueT, op_code: str):
action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING,
app_data=app_data,
)
- elif op_code in OpCodes.RESET_ALL_REBOOT_COUNTERS:
+ if op_code in OpCodes.RESET_ALL_REBOOT_COUNTERS:
tc_queue.appendleft((QueueCommands.PRINT, "Resetting all reboot counters"))
generate_action_command(
object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_ALL_REBOOT_COUNTERS
)
- elif op_code in OpCodes.RESET_REBOOT_COUNTER_00:
+ if op_code in OpCodes.RESET_REBOOT_COUNTER_00:
tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 0 0"))
generate_action_command(
object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_00
)
- elif op_code in OpCodes.RESET_REBOOT_COUNTER_01:
+ if op_code in OpCodes.RESET_REBOOT_COUNTER_01:
tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 0 1"))
generate_action_command(
object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_01
)
- elif op_code in OpCodes.RESET_REBOOT_COUNTER_10:
+ if op_code in OpCodes.RESET_REBOOT_COUNTER_10:
tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 1 0"))
generate_action_command(
object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_10
)
- elif op_code in OpCodes.RESET_REBOOT_COUNTER_11:
+ if op_code in OpCodes.RESET_REBOOT_COUNTER_11:
tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 1 1"))
generate_action_command(
object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_11
)
- elif op_code in OpCodes.GET_HK:
+ if op_code in OpCodes.GET_HK:
tc_queue.appendleft((QueueCommands.PRINT, "Requesting housekeeping set"))
sid = make_sid(object_id=CORE_CONTROLLER_ID, set_id=SetIds.HK)
command = generate_one_hk_command(sid, 201)
@@ -192,7 +264,7 @@ def perform_reboot_cmd(
)
action_cmd = generate_action_command(
object_id=CORE_CONTROLLER_ID,
- action_id=ActionIds.REBOOT,
+ action_id=ActionIds.XSC_REBOOT,
app_data=tc_data,
ssc=0,
)
diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py
new file mode 100644
index 0000000..261f745
--- /dev/null
+++ b/pus_tc/system/proc.py
@@ -0,0 +1,901 @@
+from __future__ import annotations
+
+import struct
+import time
+from typing import List
+
+from config.definitions import CustomServiceList
+from config.object_ids import get_object_ids
+from pus_tc.system.tcs import pack_tcs_sys_commands
+from tmtccmd.config import (
+ QueueCommands,
+ ServiceOpCodeDictT,
+ add_op_code_entry,
+ add_service_op_code_entry,
+)
+from tmtccmd.tc.definitions import TcQueueT
+from tmtccmd.tc.pus_11_tc_sched import (
+ generate_time_tagged_cmd,
+ generate_enable_tc_sched_cmd,
+ generate_reset_tc_sched_cmd,
+)
+from tmtccmd.tc.pus_3_fsfw_hk import *
+
+import config.object_ids as oids
+from pus_tc.system.tcs import OpCodes as TcsOpCodes
+from pus_tc.devs.bpx_batt import BpxSetIds
+from pus_tc.system.core import SetIds as CoreSetIds
+from gomspace.gomspace_common import SetIds as GsSetIds
+from pus_tc.devs.rad_sensor import SetIds as RadSetIds
+from pus_tc.devs.mgms import MgmLis3SetIds as MgmLis3SetIds_0_2
+from pus_tc.devs.mgms import MgmRm3100SetIds as MgmRm3100SetIds_1_3
+from pus_tc.devs.gyros import AdisGyroSetIds as AdisGyroSetIds_0_2
+from pus_tc.devs.gyros import L3gGyroSetIds as L3gGyroSetIds_1_3
+from pus_tc.devs.gps import SetIds as GpsSetIds
+from pus_tc.devs.imtq import ImtqSetIds
+from pus_tc.devs.sus import SetIds
+from pus_tc.devs.star_tracker import SetIds as StrSetIds
+from pus_tc.devs.reaction_wheels import RwSetIds
+from pus_tc.system.controllers import pack_cmd_ctrl_to_off, pack_cmd_ctrl_to_nml
+from pus_tc.system.acs import pack_acs_command, pack_sus_cmds
+from pus_tc.devs.imtq import pack_imtq_test_into, pack_dipole_command
+from pus_tc.devs.star_tracker import pack_star_tracker_commands
+from pus_tc.devs.reaction_wheels import pack_rw_ass_cmds, pack_set_speed_command
+
+
+class OpCodes:
+ TV_SETUP_TCS_FT_ON = ["s", "tcs-ft-on"]
+ RESET_SCHED = ["reset-sched", "rs"]
+ HEATER = ["heater"]
+ BAT_FT = ["bat-ft"]
+ CORE_FT = ["core-ft"]
+ PCDU_FT = ["pcdu-ft"]
+ RAD_SEN_FT = ["rad-sen-ft"]
+ ACS_FT = ["acs-ft"]
+ MGT_FT = ["mgt-ft"]
+ MGT_FT_DP = ["mgt-ft-dp"]
+ SUS_FT = ["sus-ft"]
+ STR_FT = ["str-ft"]
+ RW_FT_ONE_RW = ["rw-ft-one-rw"]
+ RW_FT_TWO_RWS = ["rw-ft-two-rws"]
+ TV_TEARDOWN_TCS_FT_OFF = ["t", "tcs-ft-off"]
+
+
+class KeyAndInfo:
+ TV_SETUP_TCS_FT_ON = ["TCS Act.", "TCS functional test activation"]
+ RESET_SCHED = ["Reset Sched", "Reset/Clear TC schedule"]
+ HEATER = ["Heater", "heater procedure"]
+ BAT_FT = ["BPX Battery", "battery functional test"]
+ CORE_FT = ["OBC", "OBC functional test"]
+ PCDU_FT = ["PCDU", "PCDU functional test"]
+ RAD_SEN_FT = ["Radiation Sensor", "Radiation Sensor functional test"]
+ ACS_FT = ["ACS", "ACS functional test"]
+ MGT_FT = ["MGT", "MGT functional test"]
+ MGT_FT_DP = ["MGT dipole", "MGT functional test with dipole"]
+ SUS_FT = ["SUS", "SUS functional test"]
+ STR_FT = ["STR", "STR functional test"]
+ RW_FT_ONE_RW = ["RW ONE RW", "RW functional test with one RW"]
+ RW_FT_TWO_RWS = ["RW TWO RWS", "RW functional test with two RWs"]
+ TV_TEARDOWN_TCS_FT_OFF = ["TCS Deact.", "TCS functional test deactivation"]
+
+
+KAI = KeyAndInfo
+
+PROC_INFO_DICT = {
+ KAI.TV_SETUP_TCS_FT_ON[0]: [OpCodes.TV_SETUP_TCS_FT_ON, KAI.TV_SETUP_TCS_FT_ON[1], 120.0, 10.0],
+ KAI.TV_TEARDOWN_TCS_FT_OFF[0]: [
+ OpCodes.TV_TEARDOWN_TCS_FT_OFF,
+ KAI.TV_TEARDOWN_TCS_FT_OFF[1],
+ 120.0,
+ 10.0,
+ ],
+ KAI.BAT_FT[0]: [OpCodes.BAT_FT, KAI.BAT_FT[1], 120.0, 10.0],
+ KAI.CORE_FT[0]: [OpCodes.CORE_FT, KAI.CORE_FT[1], 120.0, 10.0],
+ KAI.PCDU_FT[0]: [OpCodes.PCDU_FT, KAI.PCDU_FT[1], 120.0, 10.0],
+ KAI.RAD_SEN_FT[0]: [OpCodes.RAD_SEN_FT, KAI.RAD_SEN_FT[1], 120.0, 10.0],
+ KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0],
+ KAI.MGT_FT[0]: [OpCodes.MGT_FT, KAI.MGT_FT[1], 120.0, 10.0],
+ # collection_time for KAI.MGT_FT_DP maybe be reduced as a full 120
+ # seconds is not needed after MGTs are tested
+ KAI.MGT_FT_DP[0]: [OpCodes.MGT_FT_DP, KAI.MGT_FT_DP[1], 10.0, 10.0],
+ KAI.SUS_FT[0]: [OpCodes.SUS_FT, KAI.SUS_FT[1], 120.0, 10.0],
+ KAI.STR_FT[0]: [OpCodes.STR_FT, KAI.STR_FT[1], 120.0, 10.0],
+ # collection_time for KAI.RW_FT_ONE_RW maybe be reduced as a full 120
+ # seconds is not needed after RWs are tested
+ KAI.RW_FT_ONE_RW[0]: [OpCodes.RW_FT_ONE_RW, KAI.RW_FT_ONE_RW[1], 10.0, 1.0],
+ # collection_time for KAI.RW_FT_ONE_RW maybe be reduced as a full 120
+ # seconds is not needed after RWs are tested
+ KAI.RW_FT_TWO_RWS[0]: [OpCodes.RW_FT_TWO_RWS, KAI.RW_FT_TWO_RWS[1], 10.0, 1.0],
+}
+
+
+class GenericHkListeningCfg:
+ def __init__(self, mgt: bool = False, one_rw: bool = False, two_rws: bool = False):
+ self.use_tc_sched = False
+ self.mgt = mgt
+ self.one_rw = one_rw
+ self.two_rws = two_rws
+
+ @classmethod
+ def default(cls) -> GenericHkListeningCfg:
+ return GenericHkListeningCfg(False, False, False)
+
+
+def generic_print(tc_queue: TcQueueT, info: dict):
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, f"Executing {info[1]} Procedure (OpCodes: {info[0]})")
+ )
+
+
+def add_proc_cmds(cmd_dict: ServiceOpCodeDictT):
+ op_code_dict = dict()
+ for proc_entry in PROC_INFO_DICT.values():
+ add_op_code_entry(
+ op_code_dict=op_code_dict, keys=proc_entry[0], info=proc_entry[1]
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name=CustomServiceList.PROCEDURE.value,
+ info="TV Test Procedures",
+ op_code_entry=op_code_dict,
+ )
+
+
+def pack_generic_hk_listening_cmds(
+ tc_queue: TcQueueT,
+ proc_key: str,
+ sid_list: list[bytearray],
+ diag_list: list[bool],
+ cfg: GenericHkListeningCfg,
+):
+ info = PROC_INFO_DICT[proc_key]
+ collection_time = info[2]
+ generic_print(tc_queue=tc_queue, info=info)
+
+ for i in range(len(sid_list)):
+ enable_listen_to_hk_for_x_seconds(
+ diag=diag_list[i],
+ tc_queue=tc_queue,
+ device=proc_key,
+ sid=sid_list[i],
+ interval_seconds=info[3],
+ )
+ if not cfg.use_tc_sched:
+ tc_queue.appendleft((QueueCommands.WAIT, 2.0))
+
+ if cfg.mgt:
+ activate_mgts_alternately(
+ tc_queue=tc_queue,
+ )
+
+ elif cfg.one_rw:
+ activate_all_rws_in_sequence(
+ tc_queue=tc_queue, test_speed=20000, test_ramp_time=10000, init_ssc=0
+ )
+ elif cfg.two_rws:
+ activate_all_rws_two_consecutively(tc_queue=tc_queue, init_ssc=0)
+ else:
+ pass
+
+ if not cfg.use_tc_sched:
+ tc_queue.appendleft((QueueCommands.WAIT, collection_time))
+ disable_cmd_list = []
+ for i in range(len(sid_list)):
+ disable_cmd_list.append(
+ gen_disable_listen_to_hk_for_x_seconds(
+ diag=diag_list[i],
+ tc_queue=tc_queue,
+ device=proc_key,
+ sid=sid_list[i],
+ )
+ )
+ if cfg.one_rw or cfg.two_rws:
+ activate_all_rws_in_sequence(
+ tc_queue=tc_queue, test_speed=0, test_ramp_time=5000, init_ssc=0
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 60))
+ current_time = time.time()
+ current_time += collection_time
+ if not cfg.use_tc_sched:
+ for cmd in disable_cmd_list:
+ tc_queue.appendleft(cmd.pack_command_tuple())
+ else:
+ for cmd in disable_cmd_list:
+ tc_queue.appendleft(
+ generate_time_tagged_cmd(
+ release_time=struct.pack("!I", int(current_time)),
+ tc_to_insert=cmd,
+ ssc=0,
+ )
+ )
+
+ if not cfg.use_tc_sched:
+ tc_queue.appendleft((QueueCommands.WAIT, 60))
+ sid_list.clear()
+ diag_list.clear()
+
+
+def pack_proc_commands(tc_queue: TcQueueT, op_code: str):
+ sid_list = []
+ obj_id_dict = get_object_ids()
+ if op_code in OpCodes.RESET_SCHED:
+ tc_queue.appendleft((QueueCommands.PRINT, "Resetting/Clearing TC schedule"))
+ tc_queue.appendleft(generate_reset_tc_sched_cmd().pack_command_tuple())
+ if op_code in OpCodes.BAT_FT:
+ key = KAI.BAT_FT[0]
+ sid_list.append(make_sid(oids.BPX_HANDLER_ID, BpxSetIds.GET_HK_SET))
+ diag_list = [False]
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ if op_code in OpCodes.CORE_FT:
+ key = KAI.CORE_FT[0]
+ sid_list.append(make_sid(oids.CORE_CONTROLLER_ID, CoreSetIds.HK))
+ diag_list = [False]
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ if op_code in OpCodes.PCDU_FT:
+ key = KAI.PCDU_FT[0]
+ pcdu_pairs = [
+ (oids.P60_DOCK_HANDLER, GsSetIds.P60_CORE),
+ (oids.PDU_1_HANDLER_ID, GsSetIds.PDU_1_CORE),
+ (oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_CORE),
+ (oids.ACU_HANDLER_ID, GsSetIds.ACU_CORE),
+ (oids.P60_DOCK_HANDLER, GsSetIds.P60_AUX),
+ (oids.PDU_1_HANDLER_ID, GsSetIds.PDU_1_AUX),
+ (oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_AUX),
+ (oids.ACU_HANDLER_ID, GsSetIds.ACU_AUX),
+ ]
+
+ diag_list = [
+ False,
+ True,
+ True,
+ True,
+ False,
+ False,
+ False,
+ False,
+ ]
+
+ for pcdu_dev in pcdu_pairs:
+ oid = pcdu_dev[0]
+ set_id = pcdu_dev[1]
+ sid_list.append(make_sid(oid, set_id))
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ if op_code in OpCodes.RAD_SEN_FT:
+ key = KAI.RAD_SEN_FT[0]
+ sid_list.append(make_sid(oids.RAD_SENSOR_ID, RadSetIds.HK))
+ diag_list = [False]
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ if op_code in OpCodes.TV_SETUP_TCS_FT_ON:
+ # Enable scheduling
+ tc_queue.appendleft(generate_enable_tc_sched_cmd(ssc=22).pack_command_tuple())
+ # check whether tcs_assembly also has to be commanded to NORMAL Mode
+ pack_tcs_sys_commands(
+ tc_queue=tc_queue, op_code=TcsOpCodes.TCS_BOARD_ASS_NORMAL[0]
+ )
+ pack_cmd_ctrl_to_nml(
+ tc_queue=tc_queue, object_id=obj_id_dict.get(oids.THERMAL_CONTROLLER_ID)
+ )
+
+ if op_code in OpCodes.TV_TEARDOWN_TCS_FT_OFF:
+ # TCS board should always be on anyway, do not command it off here
+ pack_cmd_ctrl_to_off(
+ tc_queue=tc_queue, object_id=obj_id_dict.get(oids.THERMAL_CONTROLLER_ID)
+ )
+
+ if op_code in OpCodes.ACS_FT:
+ key = KAI.ACS_FT[0]
+ a_side_pairs = [
+ (oids.MGM_0_LIS3_HANDLER_ID, MgmLis3SetIds_0_2.CORE_HK),
+ (oids.MGM_1_RM3100_HANDLER_ID, MgmRm3100SetIds_1_3.CORE_HK),
+ (oids.GYRO_0_ADIS_HANDLER_ID, AdisGyroSetIds_0_2.CORE_HK),
+ (oids.GYRO_1_L3G_HANDLER_ID, L3gGyroSetIds_1_3.CORE_HK),
+ (oids.GPS_CONTROLLER, GpsSetIds.HK),
+ ]
+ b_side_pairs = [
+ (oids.MGM_2_LIS3_HANDLER_ID, MgmLis3SetIds_0_2.CORE_HK),
+ (oids.MGM_3_RM3100_HANDLER_ID, MgmRm3100SetIds_1_3.CORE_HK),
+ (oids.GYRO_2_ADIS_HANDLER_ID, AdisGyroSetIds_0_2.CORE_HK),
+ (oids.GYRO_3_L3G_HANDLER_ID, L3gGyroSetIds_1_3.CORE_HK),
+ (oids.GPS_CONTROLLER, GpsSetIds.HK),
+ ]
+ d_side_pairs = a_side_pairs + b_side_pairs
+ diag_list = [
+ False,
+ False,
+ True,
+ False,
+ False
+ ]
+ pack_acs_command(tc_queue=tc_queue, op_code="acs-a")
+
+ for a_side_dev in a_side_pairs:
+ oid = a_side_dev[0]
+ set_id = a_side_dev[1]
+ sid_list.append(make_sid(oid, set_id))
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ pack_acs_command(tc_queue=tc_queue, op_code="acs-off")
+ tc_queue.appendleft((QueueCommands.WAIT, 5.0))
+ pack_acs_command(tc_queue=tc_queue, op_code="acs-b")
+
+ sid_list.clear()
+ diag_list = [
+ False,
+ False,
+ True,
+ False,
+ False
+ ]
+
+ for b_side_dev in b_side_pairs:
+ oid = b_side_dev[0]
+ set_id = b_side_dev[1]
+ sid_list.append(make_sid(oid, set_id))
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ pack_acs_command(tc_queue=tc_queue, op_code="acs-off")
+ tc_queue.appendleft((QueueCommands.WAIT, 5.0))
+ pack_acs_command(tc_queue=tc_queue, op_code="acs-d")
+
+ sid_list.clear()
+
+ for d_side_dev in d_side_pairs:
+ oid = d_side_dev[0]
+ set_id = d_side_dev[1]
+ sid_list.append(make_sid(oid, set_id))
+ diag_list = [
+ False,
+ False,
+ True,
+ False,
+ False,
+ False,
+ False,
+ True,
+ False,
+ False,
+ ]
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ pack_acs_command(tc_queue=tc_queue, op_code="acs-off")
+
+ if op_code in OpCodes.MGT_FT:
+ key = KAI.MGT_FT[0]
+ imtq_pairs = [
+ (oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET),
+ (oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET),
+ (oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET),
+ ]
+ diag_list = [
+ True,
+ True,
+ True,
+ ]
+
+ # Command MGT to mode on
+ pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="1")
+ tc_queue.appendleft((QueueCommands.WAIT, 5))
+ # Command MGT to normal mode
+ pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="2")
+
+ for imtq_dev in imtq_pairs:
+ oid = imtq_dev[0]
+ set_id = imtq_dev[1]
+ sid_list.append(make_sid(oid, set_id))
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag_list=diag_list, cfg=GenericHkListeningCfg.default()
+ )
+
+ pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="0")
+
+ if op_code in OpCodes.MGT_FT_DP:
+ key = KAI.MGT_FT_DP[0]
+ a_side_pairs = [
+ (oids.MGM_0_LIS3_HANDLER_ID, MgmLis3SetIds_0_2.CORE_HK),
+ (oids.MGM_1_RM3100_HANDLER_ID, MgmRm3100SetIds_1_3.CORE_HK),
+ (oids.GYRO_0_ADIS_HANDLER_ID, AdisGyroSetIds_0_2.CORE_HK),
+ (oids.GYRO_1_L3G_HANDLER_ID, L3gGyroSetIds_1_3.CORE_HK),
+ (oids.GPS_CONTROLLER, GpsSetIds.HK),
+ ]
+ b_side_pairs = [
+ (oids.MGM_2_LIS3_HANDLER_ID, MgmLis3SetIds_0_2.CORE_HK),
+ (oids.MGM_3_RM3100_HANDLER_ID, MgmRm3100SetIds_1_3.CORE_HK),
+ (oids.GYRO_2_ADIS_HANDLER_ID, AdisGyroSetIds_0_2.CORE_HK),
+ (oids.GYRO_3_L3G_HANDLER_ID, L3gGyroSetIds_1_3.CORE_HK),
+ (oids.GPS_CONTROLLER, GpsSetIds.HK),
+ ]
+ imtq_pairs = [
+ (oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET),
+ (oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET),
+ (oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET),
+ ]
+ d_side_and_imtq_pairs = a_side_pairs + b_side_pairs + imtq_pairs
+ diag_list = [
+ False,
+ False,
+ True,
+ False,
+ False,
+ False,
+ False,
+ True,
+ False,
+ False,
+ True,
+ True,
+ True,
+ ]
+ pack_acs_command(tc_queue=tc_queue, op_code="acs-d")
+ # Command MGT to mode on
+ pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="1")
+ tc_queue.appendleft((QueueCommands.WAIT, 20))
+ # Command MGT to normal mode
+ pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="2")
+
+ for d_side_and_imtq_dev in d_side_and_imtq_pairs:
+ oid = d_side_and_imtq_dev[0]
+ set_id = d_side_and_imtq_dev[1]
+ sid_list.append(make_sid(oid, set_id))
+
+ cfg = GenericHkListeningCfg.default()
+ cfg.mgt = True
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=cfg,
+ )
+
+ pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="0")
+ pack_acs_command(tc_queue=tc_queue, op_code="acs-off")
+
+ if op_code in OpCodes.SUS_FT:
+ key = KAI.SUS_FT[0]
+
+ pack_sus_cmds(tc_queue=tc_queue, op_code="sus-nom")
+
+ sus_n_ids = [
+ oids.SUS_0_N_LOC_XFYFZM_PT_XF,
+ oids.SUS_1_N_LOC_XBYFZM_PT_XB,
+ oids.SUS_2_N_LOC_XFYBZB_PT_YB,
+ oids.SUS_3_N_LOC_XFYBZF_PT_YF,
+ oids.SUS_4_N_LOC_XMYFZF_PT_ZF,
+ oids.SUS_5_N_LOC_XFYMZB_PT_ZB,
+ ]
+ sus_r_ids = [
+ oids.SUS_6_R_LOC_XFYBZM_PT_XF,
+ oids.SUS_7_R_LOC_XBYBZM_PT_XB,
+ oids.SUS_8_R_LOC_XBYBZB_PT_YB,
+ oids.SUS_9_R_LOC_XBYBZB_PT_YF,
+ oids.SUS_10_R_LOC_XMYBZF_PT_ZF,
+ oids.SUS_11_R_LOC_XBYMZB_PT_ZB,
+ ]
+ diag_list = [
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ ]
+
+ # SUSs
+ for nom_sus in sus_n_ids:
+ sid_list.append(make_sid(nom_sus, SetIds.HK))
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ pack_acs_command(tc_queue=tc_queue, op_code="sus-off")
+ tc_queue.appendleft((QueueCommands.WAIT, 5.0))
+ pack_sus_cmds(tc_queue=tc_queue, op_code="sus-red")
+
+ diag_list = [
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ ]
+
+ # SUSs
+ for red_sus in sus_r_ids:
+ sid_list.append(make_sid(red_sus, SetIds.HK))
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ pack_acs_command(tc_queue=tc_queue, op_code="sus-off")
+ tc_queue.appendleft((QueueCommands.WAIT, 5.0))
+ pack_sus_cmds(tc_queue=tc_queue, op_code="sus-d")
+
+ # SUSs
+ for nom_sus in sus_n_ids:
+ sid_list.append(make_sid(nom_sus, SetIds.HK))
+ for red_sus in sus_r_ids:
+ sid_list.append(make_sid(red_sus, SetIds.HK))
+ diag_list = [
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ True,
+ ]
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ pack_acs_command(tc_queue=tc_queue, op_code="sus-off")
+
+ if op_code in OpCodes.STR_FT:
+ key = KAI.STR_FT[0]
+
+ pack_star_tracker_commands(
+ object_id=oids.STAR_TRACKER_ID, tc_queue=tc_queue, op_code="2"
+ )
+
+ # STR
+ sid_list.append(make_sid(oids.STAR_TRACKER_ID, StrSetIds.TEMPERATURE))
+ diag_list = [False]
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg.default(),
+ )
+
+ pack_star_tracker_commands(
+ object_id=oids.STAR_TRACKER_ID, tc_queue=tc_queue, op_code="3"
+ )
+
+ if op_code in OpCodes.RW_FT_ONE_RW:
+ key = KAI.RW_FT_ONE_RW[0]
+ rw_pairs = [
+ (oids.RW1_ID, RwSetIds.STATUS_SET_ID),
+ (oids.RW1_ID, RwSetIds.LAST_RESET),
+ (oids.RW1_ID, RwSetIds.TM_SET),
+ (oids.RW2_ID, RwSetIds.STATUS_SET_ID),
+ (oids.RW2_ID, RwSetIds.LAST_RESET),
+ (oids.RW2_ID, RwSetIds.TM_SET),
+ (oids.RW3_ID, RwSetIds.STATUS_SET_ID),
+ (oids.RW3_ID, RwSetIds.LAST_RESET),
+ (oids.RW3_ID, RwSetIds.TM_SET),
+ (oids.RW4_ID, RwSetIds.STATUS_SET_ID),
+ (oids.RW4_ID, RwSetIds.LAST_RESET),
+ (oids.RW4_ID, RwSetIds.TM_SET),
+ ]
+ diag_list = [
+ True,
+ False,
+ False,
+ True,
+ False,
+ False,
+ True,
+ False,
+ False,
+ True,
+ False,
+ False,
+ ]
+ # RW NORMAL
+ pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, tc_queue=tc_queue, op_code="nml")
+
+ # RW HK für alle RWs nur einzeln
+ for rw_dev in rw_pairs:
+ oid = rw_dev[0]
+ set_id = rw_dev[1]
+ sid_list.append(make_sid(oid, set_id))
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg(mgt=False, one_rw=True, two_rws=False),
+ )
+ # RW OFF
+ pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, tc_queue=tc_queue, op_code="off")
+
+ # ass command with 2 rws to speed
+ if op_code in OpCodes.RW_FT_TWO_RWS:
+ key = KAI.RW_FT_TWO_RWS[0]
+ rw_pairs = [
+ (oids.RW1_ID, RwSetIds.STATUS_SET_ID),
+ (oids.RW1_ID, RwSetIds.TEMPERATURE_SET_ID),
+ (oids.RW1_ID, RwSetIds.LAST_RESET),
+ (oids.RW1_ID, RwSetIds.TM_SET),
+ (oids.RW2_ID, RwSetIds.STATUS_SET_ID),
+ (oids.RW2_ID, RwSetIds.TEMPERATURE_SET_ID),
+ (oids.RW2_ID, RwSetIds.LAST_RESET),
+ (oids.RW2_ID, RwSetIds.TM_SET),
+ (oids.RW3_ID, RwSetIds.STATUS_SET_ID),
+ (oids.RW3_ID, RwSetIds.TEMPERATURE_SET_ID),
+ (oids.RW3_ID, RwSetIds.LAST_RESET),
+ (oids.RW3_ID, RwSetIds.TM_SET),
+ (oids.RW4_ID, RwSetIds.STATUS_SET_ID),
+ (oids.RW4_ID, RwSetIds.TEMPERATURE_SET_ID),
+ (oids.RW4_ID, RwSetIds.LAST_RESET),
+ (oids.RW4_ID, RwSetIds.TM_SET),
+ ]
+ diag_list = [
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ False,
+ ]
+ # RW NORMAL
+ pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, tc_queue=tc_queue, op_code="nml")
+
+ # RW
+ for rw_dev in rw_pairs:
+ oid = rw_dev[0]
+ set_id = rw_dev[1]
+ sid_list.append(make_sid(oid, set_id))
+ pack_generic_hk_listening_cmds(
+ tc_queue=tc_queue,
+ proc_key=key,
+ sid_list=sid_list,
+ diag_list=diag_list,
+ cfg=GenericHkListeningCfg(mgt=False, one_rw=False, two_rws=True),
+ )
+ # RW OFF
+ pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, tc_queue=tc_queue, op_code="off")
+
+
+def enable_listen_to_hk_for_x_seconds(
+ tc_queue: TcQueueT,
+ diag: bool,
+ device: str,
+ sid: bytes,
+ interval_seconds: float,
+):
+ tc_queue.appendleft((QueueCommands.PRINT, f"Enabling periodic HK for {device}"))
+ cmd_tuple = enable_periodic_hk_command_with_interval(
+ diag=diag, sid=sid, interval_seconds=interval_seconds, ssc=0
+ )
+ for cmd in cmd_tuple:
+ tc_queue.appendleft(cmd.pack_command_tuple())
+
+
+def gen_disable_listen_to_hk_for_x_seconds(
+ tc_queue: TcQueueT,
+ diag: bool,
+ device: str,
+ sid: bytes,
+) -> PusTelecommand:
+ tc_queue.appendleft((QueueCommands.PRINT, f"Disabling periodic HK for {device}"))
+ return disable_periodic_hk_command(diag=diag, sid=sid, ssc=0)
+
+
+def activate_mgts_alternately(
+ tc_queue: TcQueueT,
+):
+
+ command = pack_dipole_command(
+ object_id=oids.IMTQ_HANDLER_ID,
+ x_dipole=2000,
+ y_dipole=0,
+ z_dipole=0,
+ duration=30000,
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ tc_queue.appendleft((QueueCommands.WAIT, 40.0))
+
+ command = pack_dipole_command(
+ object_id=oids.IMTQ_HANDLER_ID,
+ x_dipole=-2000,
+ y_dipole=0,
+ z_dipole=0,
+ duration=30000,
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ tc_queue.appendleft((QueueCommands.WAIT, 40.0))
+
+ command = pack_dipole_command(
+ object_id=oids.IMTQ_HANDLER_ID,
+ x_dipole=0,
+ y_dipole=2000,
+ z_dipole=0,
+ duration=30000,
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ tc_queue.appendleft((QueueCommands.WAIT, 40.0))
+
+ command = pack_dipole_command(
+ object_id=oids.IMTQ_HANDLER_ID,
+ x_dipole=0,
+ y_dipole=-2000,
+ z_dipole=0,
+ duration=30000,
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ tc_queue.appendleft((QueueCommands.WAIT, 40.0))
+
+ command = pack_dipole_command(
+ object_id=oids.IMTQ_HANDLER_ID,
+ x_dipole=0,
+ y_dipole=0,
+ z_dipole=2000,
+ duration=30000,
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ tc_queue.appendleft((QueueCommands.WAIT, 40.0))
+
+ command = pack_dipole_command(
+ object_id=oids.IMTQ_HANDLER_ID,
+ x_dipole=0,
+ y_dipole=0,
+ z_dipole=-2000,
+ duration=30000,
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ tc_queue.appendleft((QueueCommands.WAIT, 40.0))
+
+
+def rw_speed_cmd_single(
+ tc_queue: TcQueueT, oid: bytes, init_ssc: int, speed: int, ramp_time: int
+) -> int:
+ command = pack_set_speed_command(
+ object_id=oid, speed=speed, ramp_time_ms=ramp_time, ssc=init_ssc
+ )
+ init_ssc += 1
+ tc_queue.appendleft(command.pack_command_tuple())
+ tc_queue.appendleft((QueueCommands.WAIT, 70.0))
+ command = pack_set_speed_command(
+ object_id=oid, speed=0, ramp_time_ms=ramp_time, ssc=init_ssc
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ return init_ssc + 1
+
+
+def rw_speed_up_cmd_consec(
+ tc_queue: TcQueueT, obids: List[bytes], init_ssc: int, speed: int, ramp_time: int
+) -> int:
+ for oid in obids:
+ command = pack_set_speed_command(
+ object_id=oid, speed=speed, ramp_time_ms=ramp_time, ssc=init_ssc
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ init_ssc += 1
+ return init_ssc
+
+
+def rw_speed_down_cmd_consec(
+ tc_queue: TcQueueT, obids: List[bytes], init_ssc: int, ramp_time: int
+) -> int:
+ for oid in obids:
+ command = pack_set_speed_command(
+ object_id=oid, speed=0, ramp_time_ms=ramp_time, ssc=init_ssc
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
+ init_ssc += 1
+ return init_ssc
+
+
+def activate_all_rws_in_sequence(
+ tc_queue: TcQueueT, init_ssc: int, test_speed: int, test_ramp_time: int
+) -> int:
+ new_ssc = init_ssc
+ # RW1 speed cmd
+ tc_queue.appendleft((QueueCommands.WAIT, 58))
+ new_ssc = rw_speed_cmd_single(
+ tc_queue, oids.RW1_ID, new_ssc, test_speed, test_ramp_time
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 30))
+ new_ssc = rw_speed_cmd_single(
+ tc_queue, oids.RW2_ID, new_ssc, test_speed, test_ramp_time
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 30))
+ new_ssc = rw_speed_cmd_single(
+ tc_queue, oids.RW3_ID, new_ssc, test_speed, test_ramp_time
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 30))
+ new_ssc = rw_speed_cmd_single(
+ tc_queue, oids.RW4_ID, new_ssc, test_speed, test_ramp_time
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 30))
+ return new_ssc
+
+
+def activate_all_rws_two_consecutively(tc_queue: TcQueueT, init_ssc: int) -> int:
+ new_ssc = init_ssc
+ # RW1+3 speed cmd
+ tc_queue.appendleft((QueueCommands.WAIT, 5.0))
+ new_ssc = rw_speed_up_cmd_consec(
+ tc_queue, [oids.RW1_ID, oids.RW3_ID], new_ssc, -20000, 10000
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 70.0))
+ new_ssc = rw_speed_down_cmd_consec(
+ tc_queue, [oids.RW1_ID, oids.RW3_ID], new_ssc, 10000
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 15.0))
+ # RW2+4 speed cmd
+ new_ssc = rw_speed_up_cmd_consec(
+ tc_queue, [oids.RW2_ID, oids.RW4_ID], new_ssc, -20000, 10000
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 70.0))
+ new_ssc = rw_speed_down_cmd_consec(
+ tc_queue, [oids.RW2_ID, oids.RW4_ID], new_ssc, 10000
+ )
+ tc_queue.appendleft((QueueCommands.WAIT, 15.0))
+ return new_ssc
diff --git a/pus_tc/system/tcs.py b/pus_tc/system/tcs.py
index 5b98ddc..47ab31d 100644
--- a/pus_tc/system/tcs.py
+++ b/pus_tc/system/tcs.py
@@ -1,7 +1,7 @@
from tmtccmd.tc.definitions import TcQueueT, QueueCommands
from tmtccmd.tc.pus_200_fsfw_modes import Modes
-from .common import command_assembly
+from .common import command_mode
from config.object_ids import TCS_BOARD_ASS_ID
@@ -17,7 +17,7 @@ class Info:
def pack_tcs_sys_commands(tc_queue: TcQueueT, op_code: str):
if op_code in OpCodes.TCS_BOARD_ASS_NORMAL:
- command_assembly(
+ command_mode(
object_id=TCS_BOARD_ASS_ID,
mode=Modes.NORMAL,
submode=0,
@@ -25,7 +25,7 @@ def pack_tcs_sys_commands(tc_queue: TcQueueT, op_code: str):
info=Info.TCS_BOARD_ASS_NORMAL,
)
if op_code in OpCodes.TCS_BOARD_ASS_OFF:
- command_assembly(
+ command_mode(
object_id=TCS_BOARD_ASS_ID,
mode=Modes.OFF,
submode=0,
diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py
index bcf9f2b..be637d4 100644
--- a/pus_tc/tc_packer_hook.py
+++ b/pus_tc/tc_packer_hook.py
@@ -5,6 +5,7 @@ import os
from collections import deque
from typing import Union
+from pus_tc.devs.rtd import pack_rtd_commands
from spacepackets.ecss import PusTelecommand
from tmtccmd.com_if.com_interface_base import CommunicationInterface
from tmtccmd.config.definitions import CoreServiceList, QueueCommands
@@ -20,7 +21,7 @@ from pus_tc.devs.p60dock import pack_p60dock_cmds
from pus_tc.devs.pdu2 import pack_pdu2_commands
from pus_tc.devs.pdu1 import pack_pdu1_commands
from pus_tc.devs.bpx_batt import pack_bpx_commands
-from pus_tc.devs.acu import pack_acu_test_into
+from pus_tc.devs.acu import pack_acu_commands
from pus_tc.devs.solar_array_deployment import pack_solar_array_deployment_test_into
from pus_tc.devs.imtq import pack_imtq_test_into
from pus_tc.devs.tmp1075 import pack_tmp1075_test_into
@@ -40,8 +41,11 @@ from pus_tc.system.acs import pack_acs_command, pack_sus_cmds
from pus_tc.devs.plpcdu import pack_pl_pcdu_commands
from pus_tc.devs.str_img_helper import pack_str_img_helper_command
from pus_tc.system.tcs import pack_tcs_sys_commands
+from pus_tc.system.proc import pack_proc_commands
+from pus_tc.system.controllers import pack_cmd_ctrl_to_prompted_mode
from config.definitions import CustomServiceList
from config.object_ids import (
+ get_object_ids,
P60_DOCK_HANDLER,
PDU_1_HANDLER_ID,
PDU_2_HANDLER_ID,
@@ -59,16 +63,16 @@ from config.object_ids import (
PLOC_SUPV_ID,
STAR_TRACKER_ID,
PLOC_MEMORY_DUMPER_ID,
- GPS_HANDLER_0_ID,
- GPS_HANDLER_1_ID,
+ GPS_CONTROLLER,
CCSDS_HANDLER_ID,
PDEC_HANDLER_ID,
STR_IMG_HELPER_ID,
SYRLINKS_HANDLER_ID,
SOLAR_ARRAY_DEPLOYMENT_ID,
RW_ASSEMBLY,
+ get_object_ids,
)
-
+import config.object_ids as oids
LOGGER = get_console_logger()
@@ -96,6 +100,7 @@ def pre_tc_send_cb(
def pack_service_queue_user(
service: Union[str, int], op_code: str, service_queue: TcQueueT
):
+ obj_id_man = get_object_ids()
if service == CoreServiceList.SERVICE_5.value:
return pack_generic_service5_test_into(tc_queue=service_queue)
if service == CoreServiceList.SERVICE_17.value:
@@ -105,23 +110,27 @@ def pack_service_queue_user(
if service == CoreServiceList.SERVICE_200.value:
return pack_service200_test_into(tc_queue=service_queue)
if service == CustomServiceList.P60DOCK.value:
- object_id = P60_DOCK_HANDLER
+ object_id = obj_id_man.get(P60_DOCK_HANDLER)
return pack_p60dock_cmds(
object_id=object_id, tc_queue=service_queue, op_code=op_code
)
+ if service == CustomServiceList.RTD.value:
+ return pack_rtd_commands(
+ object_id=None, tc_queue=service_queue, op_code=op_code
+ )
if service == CustomServiceList.PDU1.value:
- object_id = PDU_1_HANDLER_ID
+ object_id = obj_id_man.get(PDU_1_HANDLER_ID)
return pack_pdu1_commands(
object_id=object_id, tc_queue=service_queue, op_code=op_code
)
if service == CustomServiceList.PDU2.value:
- object_id = PDU_2_HANDLER_ID
+ object_id = obj_id_man.get(PDU_2_HANDLER_ID)
return pack_pdu2_commands(
object_id=object_id, tc_queue=service_queue, op_code=op_code
)
if service == CustomServiceList.ACU.value:
- object_id = ACU_HANDLER_ID
- return pack_acu_test_into(
+ object_id = obj_id_man.get(ACU_HANDLER_ID)
+ return pack_acu_commands(
object_id=object_id, tc_queue=service_queue, op_code=op_code
)
if service == CustomServiceList.BPX_BATTERY.value:
@@ -168,7 +177,7 @@ def pack_service_queue_user(
object_id=RW4_ID, rw_idx=4, tc_queue=service_queue, op_code=op_code
)
if service == CustomServiceList.RAD_SENSOR.value:
- object_id = RAD_SENSOR_ID
+ object_id = obj_id_man.get(RAD_SENSOR_ID)
return pack_rad_sensor_test_into(
object_id=object_id, tc_queue=service_queue, op_code=op_code
)
@@ -196,13 +205,9 @@ def pack_service_queue_user(
)
if service == CustomServiceList.ACS.value:
return pack_acs_command(tc_queue=service_queue, op_code=op_code)
- if service == CustomServiceList.GPS_0.value:
+ if service == CustomServiceList.GPS_CTRL.value:
return pack_gps_command(
- object_id=GPS_HANDLER_0_ID, tc_queue=service_queue, op_code=op_code
- )
- if service == CustomServiceList.GPS_1.value:
- return pack_gps_command(
- object_id=GPS_HANDLER_1_ID, tc_queue=service_queue, op_code=op_code
+ object_id=oids.GPS_CONTROLLER, tc_queue=service_queue, op_code=op_code
)
if service == CustomServiceList.CCSDS_HANDLER.value:
return pack_ccsds_handler_test(
@@ -220,6 +225,8 @@ def pack_service_queue_user(
return pack_solar_array_deployment_test_into(
object_id=SOLAR_ARRAY_DEPLOYMENT_ID, tc_queue=service_queue
)
+ if service == CustomServiceList.PROCEDURE.value:
+ return pack_proc_commands(tc_queue=service_queue, op_code=op_code)
if service == CustomServiceList.SUS_ASS.value:
return pack_sus_cmds(tc_queue=service_queue, op_code=op_code)
if service == CustomServiceList.PL_PCDU.value:
@@ -234,7 +241,9 @@ def pack_service_queue_user(
return pack_rw_ass_cmds(
tc_queue=service_queue, object_id=RW_ASSEMBLY, op_code=op_code
)
- LOGGER.warning("Invalid Service !")
+ if service == CustomServiceList.CONTROLLERS.value:
+ return pack_controller_commands(tc_queue=service_queue, op_code=op_code)
+ LOGGER.warning(f"Invalid Service {service}")
def create_total_tc_queue_user() -> TcQueueT:
diff --git a/pus_tm/action_reply_handler.py b/pus_tm/action_reply_handler.py
index cd35815..eaf44b1 100644
--- a/pus_tm/action_reply_handler.py
+++ b/pus_tm/action_reply_handler.py
@@ -4,6 +4,7 @@ from pus_tc.devs.imtq import ImtqActionIds
from pus_tc.devs.ploc_mpsoc import PlocReplyIds
from pus_tc.devs.ploc_supervisor import SupvActionIds
from pus_tc.devs.star_tracker import StarTrackerActionIds
+from gomspace.gomspace_common import GomspaceDeviceActionIds
from tmtccmd.logging import get_console_logger
from tmtccmd.config.definitions import DataReplyUnpacked
from tmtccmd.tm import Service8FsfwTm
@@ -36,6 +37,8 @@ def handle_action_reply(
return handle_supervisor_replies(action_id, printer, custom_data)
elif object_id.as_bytes == STAR_TRACKER_ID:
return handle_startracker_replies(action_id, printer, custom_data)
+ elif object_id.as_bytes == ACU_HANDLER_ID:
+ return handle_acu_replies(action_id, printer, custom_data)
def handle_imtq_replies(
@@ -122,3 +125,27 @@ def handle_startracker_replies(
print(content_list)
printer.file_logger.info(header_list)
printer.file_logger.info(content_list)
+
+
+def handle_acu_replies(
+ action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
+):
+ if action_id == GomspaceDeviceActionIds.PARAM_GET:
+ header_list = [
+ "Gomspace action ID"
+ "Table ID",
+ "Memory Address",
+ "Payload length"
+ "Payload"
+ ]
+ fmt_str = "!BBHH"
+ (action, table_id, address, payload_length) = struct.unpack(fmt_str, custom_data[:6])
+ content_list = [
+ action,
+ table_id,
+ "0x" + hex(address),
+ payload_length,
+ "0x" + custom_data[6:].hex(),
+ ]
+ print(header_list)
+ print(content_list)
diff --git a/pus_tm/devs/bpx_bat.py b/pus_tm/devs/bpx_bat.py
new file mode 100644
index 0000000..eb27286
--- /dev/null
+++ b/pus_tm/devs/bpx_bat.py
@@ -0,0 +1,66 @@
+import struct
+
+from pus_tc.devs.bpx_batt import BpxSetIds
+from pus_tm.defs import PrintWrapper
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+
+def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
+ pw = PrintWrapper(printer)
+ if set_id == BpxSetIds.GET_HK_SET:
+ fmt_str = "!HHHHhhhhIB"
+ inc_len = struct.calcsize(fmt_str)
+ (
+ charge_current,
+ discharge_current,
+ heater_current,
+ batt_voltage,
+ batt_temp_1,
+ batt_temp_2,
+ batt_temp_3,
+ batt_temp_4,
+ reboot_cntr,
+ boot_cause,
+ ) = struct.unpack(fmt_str, hk_data[0:inc_len])
+ header_list = [
+ "Charge Current",
+ "Discharge Current",
+ "Heater Current",
+ "Battery Voltage",
+ "Batt Temp 1",
+ "Batt Temp 2",
+ "Batt Temp 3",
+ "Batt Temp 4",
+ "Reboot Counter",
+ "Boot Cause",
+ ]
+ content_list = [
+ charge_current,
+ discharge_current,
+ heater_current,
+ batt_voltage,
+ batt_temp_1,
+ batt_temp_2,
+ batt_temp_3,
+ batt_temp_4,
+ reboot_cntr,
+ boot_cause,
+ ]
+ validity_buffer = hk_data[inc_len:]
+ pw.dlog(str(header_list))
+ pw.dlog(str(content_list))
+ printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10)
+ elif set_id == BpxSetIds.GET_CFG_SET:
+ battheat_mode = hk_data[0]
+ battheat_low = struct.unpack("!b", hk_data[1:2])[0]
+ battheat_high = struct.unpack("!b", hk_data[2:3])[0]
+ header_list = [
+ "Battery Heater Mode",
+ "Battery Heater Low Limit",
+ "Battery Heater High Limit",
+ ]
+ content_list = [battheat_mode, battheat_low, battheat_high]
+ validity_buffer = hk_data[3:]
+ pw.dlog(str(header_list))
+ pw.dlog(str(content_list))
+ printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10)
diff --git a/pus_tm/devs/gps.py b/pus_tm/devs/gps.py
new file mode 100644
index 0000000..070a7d6
--- /dev/null
+++ b/pus_tm/devs/gps.py
@@ -0,0 +1,39 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+
+def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes):
+ pw = PrintWrapper(printer)
+ pw.dlog(f"Received GPS data, HK data length {len(hk_data)}")
+ current_idx = 0
+ fmt_str = "!ddddBBBHBBBBBI"
+ inc_len = struct.calcsize(fmt_str)
+ (
+ lat,
+ long,
+ alt,
+ speed,
+ fix,
+ sats_in_use,
+ sats_in_view,
+ year,
+ month,
+ day,
+ hours,
+ minutes,
+ seconds,
+ unix_seconds,
+ ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
+ current_idx += inc_len
+ date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}"
+ pw.dlog(f"Lat: {lat} deg")
+ pw.dlog(f"Long: {long} deg")
+ pw.dlog(f"Altitude: {alt} m | Speed: {speed} m/s")
+ pw.dlog(
+ f"Fix Type: {fix} | Sats in View {sats_in_view} | Sats in Use {sats_in_use}"
+ )
+ pw.dlog(f"GNSS Date: {date_string}")
+ pw.dlog(f"Unix seconds {unix_seconds}")
+ printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=14)
diff --git a/pus_tm/devs/gyros.py b/pus_tm/devs/gyros.py
new file mode 100644
index 0000000..8fe6c79
--- /dev/null
+++ b/pus_tm/devs/gyros.py
@@ -0,0 +1,75 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from tmtccmd.utility import ObjectId
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+from pus_tc.devs.gyros import L3gGyroSetIds, AdisGyroSetIds
+import config.object_ids as obj_ids
+
+
+def handle_gyros_hk_data(
+ object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
+):
+ if object_id.as_bytes in [
+ obj_ids.GYRO_0_ADIS_HANDLER_ID,
+ obj_ids.GYRO_2_ADIS_HANDLER_ID,
+ ]:
+ handle_adis_gyro_hk(
+ object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data
+ )
+ elif object_id.as_bytes in [
+ obj_ids.GYRO_1_L3G_HANDLER_ID,
+ obj_ids.GYRO_3_L3G_HANDLER_ID,
+ ]:
+ handle_l3g_gyro_hk(
+ object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data
+ )
+
+
+def handle_adis_gyro_hk(
+ object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
+):
+ if set_id == AdisGyroSetIds.CORE_HK:
+ pw = PrintWrapper(printer)
+ fmt_str = "!ddddddf"
+ inc_len = struct.calcsize(fmt_str)
+ (angVelocX, angVelocY, angVelocZ, accelX, accelY, accelZ, temp) = struct.unpack(
+ fmt_str, hk_data[0 : 0 + inc_len]
+ )
+ pw.dlog(f"Received ADIS1650X Gyro HK data from object {object_id}")
+ pw.dlog(
+ f"Angular Velocities (degrees per second): X {angVelocX} | "
+ f"Y {angVelocY} | Z {angVelocZ}"
+ )
+ pw.dlog(f"Acceleration (m/s^2): X {accelX} | Y {accelY} | Z {accelZ}")
+ pw.dlog(f"Temperature {temp} C")
+ if set_id == AdisGyroSetIds.CFG_HK:
+ pw = PrintWrapper(printer)
+ fmt_str = "!HBHH"
+ inc_len = struct.calcsize(fmt_str)
+ (diag_stat_reg, filter_setting, msc_ctrl_reg, dec_rate_reg) = struct.unpack(
+ fmt_str, hk_data[0 : 0 + inc_len]
+ )
+ pw.dlog(f"Diagnostic Status Register {diag_stat_reg:#018b}")
+ pw.dlog(f"Filter Settings {filter_setting:#010b}")
+ pw.dlog(f"Miscellaneous Control Register {msc_ctrl_reg:#018b}")
+ pw.dlog(f"Decimation Rate {dec_rate_reg:#06x}")
+
+
+def handle_l3g_gyro_hk(
+ object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
+):
+ if set_id == L3gGyroSetIds.CORE_HK:
+ pw = PrintWrapper(printer)
+ fmt_str = "!ffff"
+ inc_len = struct.calcsize(fmt_str)
+ (angVelocX, angVelocY, angVelocZ, temp) = struct.unpack(
+ fmt_str, hk_data[0 : 0 + inc_len]
+ )
+ pw.dlog(f"Received L3GD20H Gyro HK data from object {object_id}")
+ pw.dlog(
+ f"Angular Velocities (degrees per second): X {angVelocX} | "
+ f"Y {angVelocY} | Z {angVelocZ}"
+ )
+ pw.dlog(f"Temperature {temp} °C")
diff --git a/pus_tm/devs/imtq_mgt.py b/pus_tm/devs/imtq_mgt.py
new file mode 100644
index 0000000..6a3aae4
--- /dev/null
+++ b/pus_tm/devs/imtq_mgt.py
@@ -0,0 +1,228 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+
+def handle_eng_set(printer: FsfwTmTcPrinter, hk_data: bytes):
+ pw = PrintWrapper(printer)
+ header_list = [
+ "Digital Voltage [mV]",
+ "Analog Voltage [mV]",
+ "Digital Current [mA]",
+ "Analog Current [mA]",
+ "Coil Current X [mA]",
+ "Coil Current Y [mA]",
+ "Coil Current Z [mA]",
+ "Coil X Temperature [°C]",
+ "Coil Y Temperature [°C]",
+ "Coil Z Temperature [°C]",
+ "Coil Z Temperature [°C]",
+ "MCU Temperature [°C]",
+ ]
+ digital_voltage = struct.unpack("!H", hk_data[0:2])[0]
+ analog_voltage = struct.unpack("!H", hk_data[2:4])[0]
+ digital_current = struct.unpack("!f", hk_data[4:8])[0]
+ analog_current = struct.unpack("!f", hk_data[8:12])[0]
+ coil_x_current = struct.unpack("!f", hk_data[12:16])[0]
+ coil_y_current = struct.unpack("!f", hk_data[16:20])[0]
+ coil_z_current = struct.unpack("!f", hk_data[20:24])[0]
+ coil_x_temperature = struct.unpack("!H", hk_data[24:26])[0]
+ coil_y_temperature = struct.unpack("!H", hk_data[26:28])[0]
+ coil_z_temperature = struct.unpack("!H", hk_data[30:32])[0]
+ mcu_temperature = struct.unpack("!H", hk_data[32:34])[0]
+
+ validity_buffer = hk_data[42:]
+ content_list = [
+ digital_voltage,
+ analog_voltage,
+ digital_current,
+ analog_current,
+ coil_x_current,
+ coil_y_current,
+ coil_z_current,
+ coil_x_temperature,
+ coil_y_temperature,
+ coil_z_temperature,
+ mcu_temperature,
+ ]
+ num_of_vars = len(header_list)
+ pw.dlog(str(header_list))
+ pw.dlog(str(content_list))
+ printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
+
+
+def handle_calibrated_mtm_measurement(printer: FsfwTmTcPrinter, hk_data: bytes):
+ pw = PrintWrapper(printer)
+ header_list = [
+ "Calibrated MTM X [nT]",
+ "Calibrated MTM Y [nT]",
+ "Calibrated MTM Z [nT]",
+ "Coild actuation status",
+ ]
+ mtm_x = struct.unpack("!I", hk_data[0:4])[0]
+ mtm_y = struct.unpack("!I", hk_data[4:8])[0]
+ mtm_z = struct.unpack("!I", hk_data[8:12])[0]
+ coil_actuation_status = hk_data[12]
+ validity_buffer = hk_data[12:]
+ content_list = [mtm_x, mtm_y, mtm_z, coil_actuation_status]
+ num_of_vars = len(header_list)
+ pw.dlog(str(header_list))
+ pw.dlog(str(content_list))
+ printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
+
+
+def handle_raw_mtm_measurement(printer: FsfwTmTcPrinter, hk_data: bytes):
+ pw = PrintWrapper(printer)
+ header_list = [
+ "Raw MTM X [nT]",
+ "Raw MTM Y [nT]",
+ "Raw MTM Z [nT]",
+ "Coild actuation status",
+ ]
+ mtm_x = struct.unpack("!f", hk_data[0:4])[0]
+ mtm_y = struct.unpack("!f", hk_data[4:8])[0]
+ mtm_z = struct.unpack("!f", hk_data[8:12])[0]
+ coil_actuation_status = hk_data[12]
+ validity_buffer = hk_data[12:]
+ content_list = [mtm_x, mtm_y, mtm_z, coil_actuation_status]
+ num_of_vars = len(header_list)
+ pw.dlog(str(header_list))
+ pw.dlog(str(content_list))
+ printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
+
+
+def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes):
+ pw = PrintWrapper(printer)
+ header_list = [
+ "Init Err",
+ "Init Raw Mag X [nT]",
+ "Init Raw Mag Y [nT]",
+ "Init Raw Mag Z [nT]",
+ "Init Cal Mag X [nT]",
+ "Init Cal Mag Y [nT]",
+ "Init Cal Mag Z [nT]",
+ "Init Coil X Current [mA]",
+ "Init Coil Y Current [mA]",
+ "Init Coil Z Current [mA]",
+ "Init Coil X Temperature [°C]",
+ "Init Coil Y Temperature [°C]",
+ "Init Coil Z Temperature [°C]",
+ "Err",
+ "Raw Mag X [nT]",
+ "Raw Mag Y [nT]",
+ "Raw Mag Z [nT]",
+ "Cal Mag X [nT]",
+ "Cal Mag Y [nT]",
+ "Cal Mag Z [nT]",
+ "Coil X Current [mA]",
+ "Coil Y Current [mA]",
+ "Coil Z Current [mA]",
+ "Coil X Temperature [°C]",
+ "Coil Y Temperature [°C]",
+ "Coil Z Temperature [°C]",
+ "Fina Err",
+ "Fina Raw Mag X [nT]",
+ "Fina Raw Mag Y [nT]",
+ "Fina Raw Mag Z [nT]",
+ "Fina Cal Mag X [nT]",
+ "Fina Cal Mag Y [nT]",
+ "Fina Cal Mag Z [nT]",
+ "Fina Coil X Current [mA]",
+ "Fina Coil Y Current [mA]",
+ "Fina Coil Z Current [mA]",
+ "Fina Coil X Temperature [°C]",
+ "Fina Coil Y Temperature [°C]",
+ "Fina Coil Z Temperature [°C]",
+ ]
+ # INIT step (no coil actuation)
+ init_err = hk_data[0]
+ init_raw_mag_x = struct.unpack("!f", hk_data[1:5])[0]
+ init_raw_mag_y = struct.unpack("!f", hk_data[5:9])[0]
+ init_raw_mag_z = struct.unpack("!f", hk_data[9:13])[0]
+ init_cal_mag_x = struct.unpack("!f", hk_data[13:17])[0]
+ init_cal_mag_y = struct.unpack("!f", hk_data[17:21])[0]
+ init_cal_mag_z = struct.unpack("!f", hk_data[21:25])[0]
+ init_coil_x_current = struct.unpack("!f", hk_data[25:29])[0]
+ init_coil_y_current = struct.unpack("!f", hk_data[29:33])[0]
+ init_coil_z_current = struct.unpack("!f", hk_data[33:37])[0]
+ init_coil_x_temperature = struct.unpack("!H", hk_data[37:39])[0]
+ init_coil_y_temperature = struct.unpack("!H", hk_data[39:41])[0]
+ init_coil_z_temperature = struct.unpack("!H", hk_data[41:43])[0]
+
+ # Actuation step
+ err = hk_data[43]
+ raw_mag_x = struct.unpack("!f", hk_data[44:48])[0]
+ raw_mag_y = struct.unpack("!f", hk_data[48:52])[0]
+ raw_mag_z = struct.unpack("!f", hk_data[52:56])[0]
+ cal_mag_x = struct.unpack("!f", hk_data[56:60])[0]
+ cal_mag_y = struct.unpack("!f", hk_data[60:64])[0]
+ cal_mag_z = struct.unpack("!f", hk_data[64:68])[0]
+ coil_x_current = struct.unpack("!f", hk_data[68:72])[0]
+ coil_y_current = struct.unpack("!f", hk_data[72:76])[0]
+ coil_z_current = struct.unpack("!f", hk_data[76:80])[0]
+ coil_x_temperature = struct.unpack("!H", hk_data[80:82])[0]
+ coil_y_temperature = struct.unpack("!H", hk_data[82:84])[0]
+ coil_z_temperature = struct.unpack("!H", hk_data[84:86])[0]
+
+ # FINA step (no coil actuation)
+ fina_err = hk_data[86]
+ fina_raw_mag_x = struct.unpack("!f", hk_data[87:91])[0]
+ fina_raw_mag_y = struct.unpack("!f", hk_data[91:95])[0]
+ fina_raw_mag_z = struct.unpack("!f", hk_data[95:99])[0]
+ fina_cal_mag_x = struct.unpack("!f", hk_data[99:103])[0]
+ fina_cal_mag_y = struct.unpack("!f", hk_data[103:107])[0]
+ fina_cal_mag_z = struct.unpack("!f", hk_data[107:111])[0]
+ fina_coil_x_current = struct.unpack("!f", hk_data[111:115])[0]
+ fina_coil_y_current = struct.unpack("!f", hk_data[115:119])[0]
+ fina_coil_z_current = struct.unpack("!f", hk_data[119:123])[0]
+ fina_coil_x_temperature = struct.unpack("!H", hk_data[123:125])[0]
+ fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0]
+ fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0]
+
+ validity_buffer = hk_data[129:]
+ content_list = [
+ init_err,
+ init_raw_mag_x,
+ init_raw_mag_y,
+ init_raw_mag_z,
+ init_cal_mag_x,
+ init_cal_mag_y,
+ init_cal_mag_z,
+ init_coil_x_current,
+ init_coil_y_current,
+ init_coil_z_current,
+ init_coil_x_temperature,
+ init_coil_y_temperature,
+ init_coil_z_temperature,
+ err,
+ raw_mag_x,
+ init_raw_mag_y,
+ raw_mag_z,
+ cal_mag_x,
+ cal_mag_y,
+ cal_mag_z,
+ coil_x_current,
+ coil_y_current,
+ coil_z_current,
+ coil_x_temperature,
+ coil_y_temperature,
+ coil_z_temperature,
+ fina_err,
+ fina_raw_mag_x,
+ fina_raw_mag_y,
+ fina_raw_mag_z,
+ fina_cal_mag_x,
+ fina_cal_mag_y,
+ fina_cal_mag_z,
+ fina_coil_x_current,
+ fina_coil_y_current,
+ fina_coil_z_current,
+ fina_coil_x_temperature,
+ fina_coil_y_temperature,
+ fina_coil_z_temperature,
+ ]
+ num_of_vars = len(header_list)
+ pw.dlog(str(header_list))
+ pw.dlog(str(content_list))
+ printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
diff --git a/pus_tm/devs/mgms.py b/pus_tm/devs/mgms.py
new file mode 100644
index 0000000..1683c29
--- /dev/null
+++ b/pus_tm/devs/mgms.py
@@ -0,0 +1,48 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from pus_tc.devs.mgms import MgmRm3100SetIds, MgmLis3SetIds
+from tmtccmd.utility import ObjectId
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+import config.object_ids as obj_ids
+
+
+def handle_mgm_hk_data(
+ object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
+):
+ if object_id.as_bytes in [obj_ids.MGM_0_LIS3_HANDLER_ID, obj_ids.MGM_2_LIS3_HANDLER_ID]:
+ handle_mgm_lis3_hk_data(object_id, printer, set_id, hk_data)
+ elif object_id.as_bytes in [obj_ids.MGM_1_RM3100_HANDLER_ID, obj_ids.MGM_3_RM3100_HANDLER_ID]:
+ handle_mgm_rm3100_hk_data(object_id, printer, set_id, hk_data)
+ pass
+
+
+def handle_mgm_lis3_hk_data(
+ object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
+):
+ if set_id == MgmLis3SetIds.CORE_HK:
+ pw = PrintWrapper(printer)
+ fmt_str = "!ffff"
+ inc_len = struct.calcsize(fmt_str)
+ (field_x, field_y, field_z, temp) = struct.unpack(
+ fmt_str, hk_data[0: 0 + inc_len]
+ )
+ pw.dlog(f"Received MGM LIS3 from object {object_id}")
+ pw.dlog(
+ f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}"
+ )
+ pw.dlog(f"Temperature {temp} C")
+
+
+def handle_mgm_rm3100_hk_data(
+ object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
+):
+ if set_id == MgmRm3100SetIds.CORE_HK:
+ pw = PrintWrapper(printer)
+ fmt_str = f"!fff"
+ inc_len = struct.calcsize(fmt_str)
+ (field_x, field_y, field_z) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len])
+ pw.dlog(f"Received MGM LIS3 from object {object_id}")
+ pw.dlog(
+ f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}"
+ )
diff --git a/pus_tm/devs/pcdu.py b/pus_tm/devs/pcdu.py
new file mode 100644
index 0000000..01cfc49
--- /dev/null
+++ b/pus_tm/devs/pcdu.py
@@ -0,0 +1,425 @@
+import struct
+from typing import List, Tuple
+
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+from pus_tm.defs import PrintWrapper
+from gomspace.gomspace_common import SetIds
+
+P60_INDEX_LIST = [
+ "ACU VCC",
+ "PDU1 VCC",
+ "X3 IDLE VCC",
+ "PDU2 VCC",
+ "ACU VBAT",
+ "PDU1 VBAT",
+ "X3 IDLE VBAT",
+ "PDU2 VBAT",
+ "STACK VBAT",
+ "STACK 3V3",
+ "STACK 5V",
+ "GS3V3",
+ "GS5V",
+]
+
+WDT_LIST = ["GND", "I2C", "CAN", "CSP0", "CSP1"]
+
+PDU1_CHANNELS_NAMES = [
+ "TCS Board",
+ "Syrlinks",
+ "Startracker",
+ "MGT",
+ "SUS Nominal",
+ "SCEX",
+ "PLOC",
+ "ACS A Side",
+ "Unused Channel 8",
+]
+
+PDU2_CHANNELS_NAMES = [
+ "Q7S",
+ "Payload PCDU CH1",
+ "RW",
+ "TCS Heater In",
+ "SUS Redundant",
+ "Deployment Mechanism",
+ "Payload PCDU CH6",
+ "ACS B Side",
+ "Payload Camera",
+]
+
+PDU_CHANNEL_NAMES = [PDU1_CHANNELS_NAMES, PDU2_CHANNELS_NAMES]
+
+
+class WdtInfo:
+ def __init__(self, pw: PrintWrapper):
+ self.wdt_reboots_list = []
+ self.time_pings_left_list = []
+ self.pw = pw
+
+ def print(self):
+ wdt_info = "WDT Type | Reboots | Time or Pings left (CSP only)"
+ self.pw.dlog(wdt_info)
+ for idx in range(len(self.wdt_reboots_list)):
+ self.pw.dlog(
+ f"{WDT_LIST[idx].ljust(5)} | "
+ f"{self.wdt_reboots_list[idx]:010} | {self.time_pings_left_list[idx]:010}",
+ )
+
+ def parse(self, wdt_data: bytes, current_idx: int) -> int:
+ priv_idx = 0
+ self.wdt_reboots_list = []
+ self.time_pings_left_list = []
+ for idx in range(5):
+ self.wdt_reboots_list.append(
+ struct.unpack("!I", wdt_data[priv_idx : priv_idx + 4])[0]
+ )
+ priv_idx += 4
+ current_idx += 4
+ for idx in range(3):
+ self.time_pings_left_list.append(
+ struct.unpack("!I", wdt_data[priv_idx : priv_idx + 4])[0]
+ )
+ priv_idx += 4
+ current_idx += 4
+ for idx in range(2):
+ self.time_pings_left_list.append(wdt_data[priv_idx])
+ current_idx += 1
+ priv_idx += 1
+ return current_idx
+
+
+class DevicesInfoParser:
+ def __init__(self):
+ self.dev_types = None
+ self.dev_statuses = None
+
+ def parse(self, hk_data: bytes, current_idx: int) -> int:
+ self.dev_types = []
+ self.dev_statuses = []
+ for idx in range(8):
+ self.dev_types.append(hk_data[current_idx])
+ current_idx += 1
+ for idx in range(8):
+ self.dev_statuses.append(hk_data[current_idx])
+ current_idx += 1
+ return current_idx
+
+ def print(self, pw: PrintWrapper):
+ pw.dlog(f"Device Type | Device State (0:None | 1:OK | 3:ERROR | 4:NOT FOUND)")
+ for i in range(len(self.dev_types)):
+ pw.dlog(
+ f"{self.map_idx_to_type(self.dev_types[i])} | {self.dev_statuses[i]}"
+ )
+
+ @staticmethod
+ def map_idx_to_type(devtype: int) -> str:
+ if devtype == 0:
+ return "Reserved"
+ if devtype == 1:
+ return "ADC"
+ if devtype == 2:
+ return "ADC"
+ if devtype == 3:
+ return "DAC"
+ if devtype == 4:
+ return "Temperature Sensor"
+ if devtype == 5:
+ return "Temperature Sensor (Bat Pack)"
+ if devtype == 6:
+ return "RTC"
+ if devtype == 7:
+ return "FRAM"
+ return "Unknown Type"
+
+
+def handle_pdu_data(
+ printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes
+):
+ pw = PrintWrapper(printer=printer)
+ current_idx = 0
+ priv_idx = pdu_idx - 1
+ if set_id == SetIds.PDU_1_AUX or set_id == SetIds.PDU_2_AUX:
+ fmt_str = "!hhBBBIIH"
+ inc_len = struct.calcsize(fmt_str)
+ (
+ vcc,
+ vbat,
+ conv_enb_0,
+ conv_enb_1,
+ conv_enb_2,
+ boot_cause,
+ uptime,
+ reset_cause,
+ ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
+ pw.dlog(f"VCC {vcc} mV | VBAT {vbat} mV")
+ pw.dlog(f"Converter Enables [{conv_enb_0},{conv_enb_1},{conv_enb_2}]")
+ pw.dlog(
+ f"Boot Cause {boot_cause} | Uptime {uptime} | Reset Cause {reset_cause}",
+ )
+ current_idx += inc_len
+ latchup_list = []
+ pw.dlog("Latchups")
+ for idx in range(len(PDU1_CHANNELS_NAMES)):
+ latchup_list.append(
+ struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
+ )
+ content_line = (
+ f"{PDU_CHANNEL_NAMES[priv_idx][idx].ljust(24)} | {latchup_list[idx]}"
+ )
+ pw.dlog(content_line)
+ current_idx += 2
+ dev_parser = DevicesInfoParser()
+ current_idx = dev_parser.parse(hk_data=hk_data, current_idx=current_idx)
+ wdt = WdtInfo(pw=pw)
+ current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx)
+ wdt.print()
+ pw.dlog(f"PDU Device Types: 0:FRAM|1:ADC|2:ADC|3:TempSens|4,5,6,7:Reserved")
+ dev_parser.print(pw=pw)
+ if set_id == SetIds.PDU_1_CORE or set_id == SetIds.PDU_2_CORE:
+ pw.dlog(f"Received PDU HK from PDU {pdu_idx}")
+ current_list = []
+ for idx in range(len(PDU1_CHANNELS_NAMES)):
+ current_list.append(
+ struct.unpack("!h", hk_data[current_idx: current_idx + 2])[0]
+ )
+ current_idx += 2
+ voltage_list = []
+ for idx in range(len(PDU1_CHANNELS_NAMES)):
+ voltage_list.append(
+ struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0]
+ )
+ current_idx += 2
+ output_enb_list = []
+ for idx in range(len(PDU1_CHANNELS_NAMES)):
+ output_enb_list.append(hk_data[current_idx])
+ current_idx += 1
+ header_str = f"{'Name'.ljust(24)} | OutEnb | U [mV] | I [mA]"
+ pw.dlog(header_str)
+ for idx in range(len(PDU1_CHANNELS_NAMES)):
+ out_enb = f"{output_enb_list[idx]}".ljust(6)
+ content_line = (
+ f"{PDU_CHANNEL_NAMES[priv_idx][idx].ljust(24)} | {out_enb} | "
+ f"{voltage_list[idx]:05} | {current_list[idx]:04}"
+ )
+ pw.dlog(content_line)
+ fmt_str = "!IBf"
+ inc_len = struct.calcsize(fmt_str)
+ (boot_count, batt_mode, temperature) = struct.unpack(
+ fmt_str, hk_data[current_idx: current_idx + inc_len]
+ )
+ info = (
+ f"Boot Count {boot_count} | Battery Mode {batt_mode} | "
+ f"Temperature {temperature}"
+ )
+ pw.dlog(info)
+
+
+def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
+ pw = PrintWrapper(printer=printer)
+ if set_id == SetIds.P60_CORE:
+ pw.dlog("Received P60 Core HK. Voltages in mV, currents in mA")
+ current_idx = 0
+ current_list = []
+ for idx in range(13):
+ current_list.append(
+ struct.unpack("!h", hk_data[current_idx : current_idx + 2])[0]
+ )
+ current_idx += 2
+ voltage_list = []
+ for idx in range(13):
+ voltage_list.append(
+ struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
+ )
+ current_idx += 2
+ out_enb_list = []
+ for idx in range(13):
+ out_enb_list.append(hk_data[current_idx])
+ current_idx += 1
+ header_str = f"{'Name'.ljust(24)} | OutEnb | U [mV] | I [mA]"
+ pw.dlog(header_str)
+ for idx in range(13):
+ out_enb = f"{out_enb_list[idx]}".ljust(6)
+ content_line = (
+ f"{P60_INDEX_LIST[idx].ljust(24)} | {out_enb} | "
+ f"{voltage_list[idx]:05} | {current_list[idx]:04}"
+ )
+ pw.dlog(content_line)
+ fmt_str = "!IBhHhh"
+ inc_len = struct.calcsize(fmt_str)
+ (
+ boot_count,
+ batt_mode,
+ batt_current,
+ batt_voltage,
+ temp_0,
+ temp_1,
+ ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
+ current_idx += inc_len
+ batt_info = (
+ f"Batt: Mode {batt_mode} | Boot Count {boot_count} | "
+ f"Charge current {batt_current} | Voltage {batt_voltage}"
+ )
+ temps = f"In C: Temp 0 {temp_0 / 10.0} | Temp 1 {temp_1 / 10.0} | "
+ pw.dlog(temps)
+ pw.dlog(batt_info)
+ printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9)
+ if set_id == SetIds.P60_AUX:
+ pw.dlog("Received P60 AUX HK. Voltages in mV, currents in mA")
+ current_idx = 0
+ latchup_list = []
+ pw.dlog("P60 Dock Latchups")
+ for idx in range(0, 13):
+ latchup_list.append(
+ struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
+ )
+ content_line = f"{P60_INDEX_LIST[idx].ljust(24)} | {latchup_list[idx]}"
+ pw.dlog(content_line)
+ current_idx += 2
+ fmt_str = "!IIHBBHHhhB"
+ inc_len = struct.calcsize(fmt_str)
+ (
+ boot_cause,
+ uptime,
+ reset_cause,
+ heater_on,
+ conv_5v_on,
+ dock_vbat,
+ dock_vcc_c,
+ batt_temp_0,
+ batt_temp_1,
+ dearm_status,
+ ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
+ current_idx += inc_len
+ wdt = WdtInfo(pw=pw)
+ current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx)
+ fmt_str = "!hhbb"
+ inc_len = struct.calcsize(fmt_str)
+ (
+ batt_charge_current,
+ batt_discharge_current,
+ ant6_depl,
+ ar6_depl,
+ ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
+ current_idx += inc_len
+ dev_parser = DevicesInfoParser()
+ current_idx = dev_parser.parse(hk_data=hk_data, current_idx=current_idx)
+ util_info = (
+ f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}"
+ )
+ util_info_2 = (
+ f"Conv 5V on {conv_5v_on} | Heater On {heater_on} | "
+ f"Dock VBAT {dock_vbat} | DOCK VCC Current {dock_vcc_c}"
+ )
+ pw.dlog(util_info)
+ pw.dlog(util_info_2)
+ wdt.print()
+ misc_info = (
+ f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}"
+ )
+ pw.dlog(misc_info)
+ batt_info = (
+ f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | "
+ f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}"
+ )
+ pw.dlog(batt_info)
+ pw.dlog(
+ "P60 Dock Dev Types: 0:FRAM|1:ADC|2:ADC|3:ADC|4:TempSens|5:RTC|"
+ "6:TempSens(BatPack)|7:TempSens(BatPack)"
+ )
+ dev_parser.print(pw=pw)
+ printer.print_validity_buffer(
+ validity_buffer=hk_data[current_idx:], num_vars=27
+ )
+
+
+def gen_six_entry_u16_list(hk_data: bytes, current_idx: int) -> Tuple[int, List[int]]:
+ u16_list = []
+ for idx in range(6):
+ u16_list.append(struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0])
+ current_idx += 2
+ return current_idx, u16_list
+
+
+def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
+ pw = PrintWrapper(printer=printer)
+ if set_id == SetIds.ACU_CORE:
+ mppt_mode = hk_data[0]
+ current_idx = 1
+ current_idx, currents = gen_six_entry_u16_list(
+ hk_data=hk_data, current_idx=current_idx
+ )
+ current_idx, voltages = gen_six_entry_u16_list(
+ hk_data=hk_data, current_idx=current_idx
+ )
+ vcc = struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
+ current_idx += 2
+ vbat = struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
+ current_idx += 2
+ current_idx, vboosts = gen_six_entry_u16_list(
+ hk_data=hk_data, current_idx=current_idx
+ )
+ current_idx, powers = gen_six_entry_u16_list(
+ hk_data=hk_data, current_idx=current_idx
+ )
+ fmt_str = "!HHHIIHH"
+ inc_len = struct.calcsize(fmt_str)
+ (tmp0, tmp1, tmp2, bootcnt, uptime, mppt_time, mppt_period) = struct.unpack(
+ fmt_str, hk_data[current_idx : current_idx + inc_len]
+ )
+ current_idx += inc_len
+ pw.dlog("Received ACU Core HK. Voltages in mV, currents in mA")
+ pw.dlog(f"VCC {vcc} mV | VBAT {vbat} mV | MPPT Mode {mppt_mode}")
+ header_str = (
+ f"Channel | Input U [mV] | Input I [mA] | U Boost [mV] | Power [mW]"
+ )
+ pw.dlog(header_str)
+ for i in range(6):
+ pw.dlog(
+ f"{i} | {str(voltages[i]).ljust(4)} | {str(currents[i]).ljust(4)} | "
+ f"{str(vboosts[i]).ljust(4)} | {str(powers[i]).ljust(2)}"
+ )
+ pw.dlog(
+ f"Temperatures in C: Ch0 {tmp0/10.0} | Ch1 {tmp1/10.0} | Ch2 {tmp2/10.0}"
+ )
+ pw.dlog(
+ f"Boot Count {bootcnt} | Uptime {uptime} sec | "
+ f"MPPT Time {mppt_time} msec | MPPT Period {mppt_period} msec"
+ )
+ printer.print_validity_buffer(
+ validity_buffer=hk_data[current_idx:], num_vars=12
+ )
+ if set_id == SetIds.ACU_AUX:
+ current_idx = 0
+ fmt_str = "!BBB"
+ inc_len = struct.calcsize(fmt_str)
+ enb_tuple = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
+ (dac_enb0, dac_enb1, dac_enb2) = enb_tuple
+ dac_enb_str = ["on" if entry == 1 else "off" for entry in enb_tuple]
+ current_idx += inc_len
+ current_idx, dac_channels_raw = gen_six_entry_u16_list(
+ hk_data=hk_data, current_idx=current_idx
+ )
+ fmt_str = "!IHII"
+ inc_len = struct.calcsize(fmt_str)
+ (boot_cause, reset_cause, wdt_cnt_gnd, wdt_gnd_time_left) = struct.unpack(
+ fmt_str, hk_data[current_idx : current_idx + inc_len]
+ )
+ current_idx += inc_len
+ dev_parser = DevicesInfoParser()
+ current_idx = dev_parser.parse(hk_data=hk_data, current_idx=current_idx)
+ pw.dlog("Received ACU Aux HK. Voltages in mV, currents in mA")
+
+ pw.dlog(
+ f"DAC Enable States: DAC 0 {dac_enb_str[0]} | DAC 1 {dac_enb_str[1]} | DAC 2 {dac_enb_str[2]}"
+ )
+ pw.dlog(f"Boot Cause {boot_cause} | Reset Cause {reset_cause}")
+ pw.dlog(
+ f"Ground WDT: Reboot Count {wdt_cnt_gnd} | Time Left {wdt_gnd_time_left} sec"
+ )
+
+ pw.dlog(
+ f"ACU Dev Types: 0:FRAM|1:ADC|2:ADC|3:DAC|4:DAC|"
+ f"5:DAC|6:TempSens|7:Reserved"
+ )
+ dev_parser.print(pw=pw)
+ printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=8)
diff --git a/pus_tm/devs/plpcdu.py b/pus_tm/devs/plpcdu.py
new file mode 100644
index 0000000..33eb3ca
--- /dev/null
+++ b/pus_tm/devs/plpcdu.py
@@ -0,0 +1,52 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+from pus_tc.devs.plpcdu import SetIds
+
+
+ADC_CHANNELS_NAMED = [
+ "U BAT DIV 6",
+ "U NEG V FB",
+ "I HPA",
+ "U HPA DIV 6",
+ "I MPA",
+ "U MPA DIV 6",
+ "I TX",
+ "U TX DIV 6",
+ "I X8",
+ "U X8 DIV 6",
+ "I DRO",
+ "U DRO DIV 6",
+]
+
+
+def handle_plpcdu_hk(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
+ if set_id == SetIds.ADC:
+ pw = PrintWrapper(printer)
+ current_idx = 0
+ pw.dlog("Received PL PCDU ADC HK data")
+ channels = []
+ ch_print = "Channels Raw (hex): ["
+ for i in range(12):
+ channels.append(
+ struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
+ )
+ if i < 11:
+ ch_print += f"{channels[i]:06x},"
+ else:
+ ch_print += f"{channels[i]:06x}]"
+ current_idx += 2
+ processed_vals = []
+ for i in range(12):
+ processed_vals.append(
+ struct.unpack("!f", hk_data[current_idx : current_idx + 4])[0]
+ )
+ current_idx += 4
+ temp = struct.unpack("!f", hk_data[current_idx : current_idx + 4])[0]
+ current_idx += 4
+ pw.dlog(f"Temperature: {temp} C")
+ pw.dlog(ch_print)
+ for i in range(12):
+ pw.dlog(f"{ADC_CHANNELS_NAMED[i].ljust(24)} | {processed_vals[i]}")
+ printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=3)
diff --git a/pus_tm/devs/rad_sensor.py b/pus_tm/devs/rad_sensor.py
new file mode 100644
index 0000000..de0e65d
--- /dev/null
+++ b/pus_tm/devs/rad_sensor.py
@@ -0,0 +1,24 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+from pus_tc.devs.rad_sensor import SetIds
+
+
+def handle_rad_sensor_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
+ if set_id == SetIds.HK:
+ pw = PrintWrapper(printer)
+ current_idx = 0
+ pw.dlog("Received Radiation Sensor HK data")
+ fmt_str = "!fHHHHHH"
+ inc_len = struct.calcsize(fmt_str)
+ (temp, ain0, ain1, ain4, ain5, ain6, ain7) = struct.unpack(
+ fmt_str, hk_data[current_idx : current_idx + inc_len]
+ )
+ ain_dict = {0: ain0, 1: ain1, 4: ain4, 5: ain5, 6: ain6, 7: ain7}
+ pw.dlog(f"Temperature: {temp} C")
+ pw.dlog(f"AIN Channel | Raw Value (hex) | Raw Value (dec)")
+ for idx, val in ain_dict.items():
+ pw.dlog(f"{idx} | {val:#06x} | {str(val).ljust(5)}")
+ current_idx += inc_len
+ printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=7)
diff --git a/pus_tm/devs/sus.py b/pus_tm/devs/sus.py
new file mode 100644
index 0000000..0067998
--- /dev/null
+++ b/pus_tm/devs/sus.py
@@ -0,0 +1,26 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from pus_tc.devs.sus import SetIds
+from tmtccmd.utility import ObjectId
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+
+def handle_sus_hk(
+ object_id: ObjectId, hk_data: bytes, printer: FsfwTmTcPrinter, set_id: int
+):
+ pw = PrintWrapper(printer)
+ pw.dlog(f"Received SUS HK data from {object_id}")
+ if set_id == SetIds.HK:
+ current_idx = 0
+ temperature = struct.unpack("!f", hk_data[current_idx : current_idx + 4])[0]
+ current_idx += 4
+ channels = []
+ for _ in range(6):
+ channels.append(struct.unpack("!H", hk_data[current_idx : current_idx + 2]))
+ current_idx += 2
+ pw.dlog(f"Temperature: {temperature} C")
+ pw.dlog(f"AIN Channel | Raw Value (hex) | Raw Value (dec)")
+ for idx, val in enumerate(channels):
+ pw.dlog(f"{idx} | {val[0]:#06x} |" + str(val[0]).ljust(5))
+ printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=7)
diff --git a/pus_tm/devs/syrlinks.py b/pus_tm/devs/syrlinks.py
new file mode 100644
index 0000000..3c82f7a
--- /dev/null
+++ b/pus_tm/devs/syrlinks.py
@@ -0,0 +1,67 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from pus_tc.devs.syrlinks_hk_handler import SetIds
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+
+def handle_syrlinks_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
+ if set_id == SetIds.RX_REGISTERS_DATASET:
+ return handle_syrlinks_rx_registers_dataset(printer, hk_data)
+ elif set_id == SetIds.TX_REGISTERS_DATASET:
+ return handle_syrlinks_tx_registers_dataset(printer, hk_data)
+ else:
+ pw = PrintWrapper(printer)
+ pw.dlog(f"Service 3 TM: Syrlinks handler reply with unknown set ID {set_id}")
+
+
+def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: bytes):
+ pw = PrintWrapper(printer)
+ header_list = [
+ "RX Status",
+ "RX Sensitivity",
+ "RX Frequency Shift",
+ "RX IQ Power",
+ "RX AGC Value",
+ "RX Demod Eb",
+ "RX Demod N0",
+ "RX Datarate",
+ ]
+ rx_status = hk_data[0]
+ rx_sensitivity = struct.unpack("!I", hk_data[1:5])
+ rx_frequency_shift = struct.unpack("!I", hk_data[5:9])
+ rx_iq_power = struct.unpack("!H", hk_data[9:11])
+ rx_agc_value = struct.unpack("!H", hk_data[11:13])
+ rx_demod_eb = struct.unpack("!I", hk_data[13:17])
+ rx_demod_n0 = struct.unpack("!I", hk_data[17:21])
+ rx_data_rate = hk_data[21]
+ content_list = [
+ rx_status,
+ rx_sensitivity,
+ rx_frequency_shift,
+ rx_iq_power,
+ rx_agc_value,
+ rx_demod_eb,
+ rx_demod_n0,
+ rx_data_rate,
+ ]
+ validity_buffer = hk_data[22:]
+ pw.dlog(str(header_list))
+ pw.dlog(str(content_list))
+ printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8)
+
+
+def handle_syrlinks_tx_registers_dataset(
+ printer: FsfwTmTcPrinter,
+ hk_data: bytes,
+):
+ pw = PrintWrapper(printer)
+ header_list = ["TX Status", "TX Waveform", "TX AGC value"]
+ tx_status = hk_data[0]
+ tx_waveform = hk_data[1]
+ tx_agc_value = struct.unpack("!H", hk_data[2:4])
+ content_list = [tx_status, tx_waveform, tx_agc_value]
+ validity_buffer = hk_data[4:]
+ pw.dlog(str(header_list))
+ pw.dlog(str(content_list))
+ printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3)
diff --git a/pus_tm/factory_hook.py b/pus_tm/factory_hook.py
index d1829ca..8bd8fe1 100644
--- a/pus_tm/factory_hook.py
+++ b/pus_tm/factory_hook.py
@@ -41,7 +41,9 @@ def pus_factory_hook(raw_tm_packet: bytes):
subservice_type = raw_tm_packet[8]
file_logger = FSFW_PRINTER.file_logger
obj_id_dict = get_object_ids()
+ dedicated_handler = True
try:
+ tm_packet = None
if service_type == 1:
handle_service_1_packet(printer=FSFW_PRINTER, raw_tm=raw_tm_packet)
elif service_type == 3:
@@ -58,23 +60,25 @@ def pus_factory_hook(raw_tm_packet: bytes):
)
elif service_type == 17:
tm_packet = Service17TMExtended.unpack(raw_telemetry=raw_tm_packet)
- FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
+ dedicated_handler = False
elif service_type == 20:
tm_packet = Service20FsfwTm.unpack(raw_telemetry=raw_tm_packet)
- FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
+ dedicated_handler = False
elif service_type == 200:
tm_packet = Service200FsfwTm.unpack(raw_telemetry=raw_tm_packet)
- FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
+ dedicated_handler = False
else:
LOGGER.info(
f"The service {service_type} is not implemented in Telemetry Factory"
)
tm_packet = PusTelemetry.unpack(raw_telemetry=raw_tm_packet)
tm_packet.print_source_data(PrintFormats.HEX)
+ dedicated_handler = True
+ if not dedicated_handler and tm_packet is not None:
+ FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
log_raw_pus_tm(
packet=raw_tm_packet, srv_subservice=(service_type, subservice_type)
)
except ValueError:
- # TODO: Log faulty packet
LOGGER.warning("Invalid packet format detected")
log_raw_unknown_packet(packet=raw_tm_packet, packet_type=PacketTypes.TM)
diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py
index 399ec5c..2aefb26 100644
--- a/pus_tm/hk_handling.py
+++ b/pus_tm/hk_handling.py
@@ -1,24 +1,36 @@
"""HK Handling for EIVE OBSW"""
-import struct
-import os
-import datetime
-from tmtccmd.config.definitions import HkReplyUnpacked
+from pus_tm.devs.plpcdu import handle_plpcdu_hk
+from pus_tm.devs.rad_sensor import handle_rad_sensor_data
+from pus_tm.devs.sus import handle_sus_hk
+from pus_tm.system.tcs import handle_thermal_controller_hk_data
from tmtccmd.tm.pus_3_fsfw_hk import (
Service3Base,
HkContentType,
Service3FsfwTm,
)
-from tmtccmd.logging import get_console_logger
-from pus_tc.devs.bpx_batt import BpxSetIds
-from pus_tc.devs.syrlinks_hk_handler import SetIds
-from pus_tc.devs.p60dock import SetIds
-from pus_tc.devs.imtq import ImtqSetIds
from tmtccmd.utility.obj_id import ObjectId, ObjectIdDictT
+from tmtccmd.logging import get_console_logger
+
+from pus_tm.devs.bpx_bat import handle_bpx_hk_data
+from pus_tm.devs.gps import handle_gps_data
+from pus_tm.devs.gyros import handle_gyros_hk_data
+from pus_tm.devs.imtq_mgt import (
+ handle_self_test_data,
+ handle_eng_set,
+ handle_calibrated_mtm_measurement,
+ handle_raw_mtm_measurement,
+)
+from pus_tm.devs.pcdu import handle_pdu_data, handle_p60_hk_data, handle_acu_hk_data
+from pus_tm.devs.syrlinks import handle_syrlinks_hk_data
+from pus_tc.devs.imtq import ImtqSetIds
+from pus_tm.devs.reaction_wheels import handle_rw_hk_data
+from pus_tm.defs import FsfwTmTcPrinter
+from pus_tm.system.core import handle_core_hk_data
+from pus_tm.devs.mgms import handle_mgm_hk_data
+from pus_tm.tcp_server_objects import tcp_server_sensor_temperatures
import config.object_ids as obj_ids
-from pus_tm.devs.reaction_wheels import handle_rw_hk_data
-from pus_tm.defs import FsfwTmTcPrinter, log_to_both
LOGGER = get_console_logger()
@@ -34,18 +46,26 @@ def handle_hk_packet(
named_obj_id = tm_packet.object_id
if tm_packet.subservice == 25 or tm_packet.subservice == 26:
hk_data = tm_packet.tm_data[8:]
+ tcp_server_sensor_temperatures.report_raw_hk_data(
+ object_id=named_obj_id, set_id=tm_packet.set_id, hk_data=hk_data
+ )
printer.generic_hk_tm_print(
content_type=HkContentType.HK,
object_id=named_obj_id,
set_id=tm_packet.set_id,
hk_data=hk_data,
)
- handle_regular_hk_print(
- printer=printer,
- object_id=named_obj_id,
- hk_packet=tm_packet,
- hk_data=hk_data,
- )
+ try:
+ handle_regular_hk_print(
+ printer=printer,
+ object_id=named_obj_id,
+ hk_packet=tm_packet,
+ hk_data=hk_data,
+ )
+ except ValueError as e:
+ LOGGER.exception(
+ f"{e} error when parsing HK data coming from {named_obj_id}"
+ )
if tm_packet.subservice == 10 or tm_packet.subservice == 12:
LOGGER.warning("HK definitions printout not implemented yet")
@@ -61,649 +81,88 @@ def handle_regular_hk_print(
"""This function is called when a Service 3 Housekeeping packet is received."""
if object_id in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
handle_rw_hk_data(printer, object_id, set_id, hk_data)
- if objb == obj_ids.SYRLINKS_HANDLER_ID:
- if set_id == SetIds.RX_REGISTERS_DATASET:
- return handle_syrlinks_rx_registers_dataset(printer, hk_data)
- elif set_id == SetIds.TX_REGISTERS_DATASET:
- return handle_syrlinks_tx_registers_dataset(printer, hk_data)
- else:
- LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id")
- if objb == obj_ids.IMTQ_HANDLER_ID:
+ elif objb == obj_ids.SYRLINKS_HANDLER_ID:
+ handle_syrlinks_hk_data(printer=printer, hk_data=hk_data, set_id=set_id)
+ elif objb == obj_ids.IMTQ_HANDLER_ID:
if (set_id >= ImtqSetIds.POSITIVE_X_TEST) and (
set_id <= ImtqSetIds.NEGATIVE_Z_TEST
):
return handle_self_test_data(printer, hk_data)
+ elif set_id == ImtqSetIds.ENG_HK_SET:
+ return handle_eng_set(printer, hk_data)
+ elif set_id == ImtqSetIds.CAL_MTM_SET:
+ return handle_calibrated_mtm_measurement(printer, hk_data)
+ elif set_id == ImtqSetIds.RAW_MTM_SET:
+ return handle_raw_mtm_measurement(printer, hk_data)
else:
- LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id")
- if objb == obj_ids.GPS_HANDLER_0_ID or object_id == obj_ids.GPS_HANDLER_1_ID:
- handle_gps_data(printer=printer, hk_data=hk_data)
- if objb == obj_ids.BPX_HANDLER_ID:
+ LOGGER.info("Service 3 TM: IMTQ handler reply with unknown set id")
+ elif objb == obj_ids.GPS_CONTROLLER:
+ return handle_gps_data(printer=printer, hk_data=hk_data)
+ elif objb == obj_ids.BPX_HANDLER_ID:
handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer)
- if objb == obj_ids.CORE_CONTROLLER_ID:
- return handle_core_hk_data(printer=printer, hk_data=hk_data)
- if objb == obj_ids.PDU_1_HANDLER_ID:
+ elif objb == obj_ids.CORE_CONTROLLER_ID:
+ return handle_core_hk_data(printer=printer, hk_data=hk_data, set_id=set_id)
+ elif objb == obj_ids.PDU_1_HANDLER_ID:
return handle_pdu_data(
printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data
)
- if objb == obj_ids.PDU_2_HANDLER_ID:
+ elif objb == obj_ids.PDU_2_HANDLER_ID:
return handle_pdu_data(
printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data
)
- if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
+ elif objb == obj_ids.ACU_HANDLER_ID:
+ return handle_acu_hk_data(printer=printer, hk_data=hk_data, set_id=set_id)
+ elif objb == obj_ids.RAD_SENSOR_ID:
+ return handle_rad_sensor_data(printer=printer, hk_data=hk_data, set_id=set_id)
+ elif objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
return handle_rw_hk_data(
printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data
)
- if objb == obj_ids.P60_DOCK_HANDLER:
+ if objb in [
+ obj_ids.SUS_0_N_LOC_XFYFZM_PT_XF,
+ obj_ids.SUS_1_N_LOC_XBYFZM_PT_XB,
+ obj_ids.SUS_2_N_LOC_XFYBZB_PT_YB,
+ obj_ids.SUS_3_N_LOC_XFYBZF_PT_YF,
+ obj_ids.SUS_4_N_LOC_XMYFZF_PT_ZF,
+ obj_ids.SUS_5_N_LOC_XFYMZB_PT_ZB,
+ obj_ids.SUS_6_R_LOC_XFYBZM_PT_XF,
+ obj_ids.SUS_7_R_LOC_XBYBZM_PT_XB,
+ obj_ids.SUS_8_R_LOC_XBYBZB_PT_YB,
+ obj_ids.SUS_9_R_LOC_XBYBZB_PT_YF,
+ obj_ids.SUS_10_R_LOC_XMYBZF_PT_ZF,
+ obj_ids.SUS_11_R_LOC_XBYMZB_PT_ZB,
+ ]:
+ handle_sus_hk(
+ object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
+ )
+ elif objb == obj_ids.P60_DOCK_HANDLER:
handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data)
- if objb == obj_ids.PL_PCDU_ID:
- log_to_both(printer, "Received PL PCDU HK data")
+ elif objb in [
+ obj_ids.GYRO_0_ADIS_HANDLER_ID,
+ obj_ids.GYRO_1_L3G_HANDLER_ID,
+ obj_ids.GYRO_2_ADIS_HANDLER_ID,
+ obj_ids.GYRO_3_L3G_HANDLER_ID,
+ ]:
+ handle_gyros_hk_data(
+ object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
+ )
+ elif objb in [
+ obj_ids.MGM_0_LIS3_HANDLER_ID,
+ obj_ids.MGM_1_RM3100_HANDLER_ID,
+ obj_ids.MGM_2_LIS3_HANDLER_ID,
+ obj_ids.MGM_3_RM3100_HANDLER_ID,
+ ]:
+ handle_mgm_hk_data(
+ object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
+ )
+ elif objb == obj_ids.PL_PCDU_ID:
+ handle_plpcdu_hk(set_id=set_id, hk_data=hk_data, printer=printer)
+ elif objb == obj_ids.THERMAL_CONTROLLER_ID:
+ handle_thermal_controller_hk_data(
+ object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data
+ )
else:
- LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.")
- return HkReplyUnpacked()
-
-
-def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: bytes):
- reply = HkReplyUnpacked()
- header_list = [
- "RX Status",
- "RX Sensitivity",
- "RX Frequency Shift",
- "RX IQ Power",
- "RX AGC Value",
- "RX Demod Eb",
- "RX Demod N0",
- "RX Datarate",
- ]
- rx_status = hk_data[0]
- rx_sensitivity = struct.unpack("!I", hk_data[1:5])
- rx_frequency_shift = struct.unpack("!I", hk_data[5:9])
- rx_iq_power = struct.unpack("!H", hk_data[9:11])
- rx_agc_value = struct.unpack("!H", hk_data[11:13])
- rx_demod_eb = struct.unpack("!I", hk_data[13:17])
- rx_demod_n0 = struct.unpack("!I", hk_data[17:21])
- rx_data_rate = hk_data[21]
- content_list = [
- rx_status,
- rx_sensitivity,
- rx_frequency_shift,
- rx_iq_power,
- rx_agc_value,
- rx_demod_eb,
- rx_demod_n0,
- rx_data_rate,
- ]
- validity_buffer = hk_data[22:]
- log_to_both(printer, str(header_list))
- log_to_both(printer, str(content_list))
- printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8)
-
-
-def handle_syrlinks_tx_registers_dataset(
- printer: FsfwTmTcPrinter,
- hk_data: bytes,
-):
- reply = HkReplyUnpacked()
- header_list = ["TX Status", "TX Waveform", "TX AGC value"]
- tx_status = hk_data[0]
- tx_waveform = hk_data[1]
- tx_agc_value = struct.unpack("!H", hk_data[2:4])
- content_list = [tx_status, tx_waveform, tx_agc_value]
- validity_buffer = hk_data[4:]
- log_to_both(printer, str(header_list))
- log_to_both(printer, str(content_list))
- printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3)
-
-
-def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes):
- header_list = [
- "Init Err",
- "Init Raw Mag X [nT]",
- "Init Raw Mag Y [nT]",
- "Init Raw Mag Z [nT]",
- "Init Cal Mag X [nT]",
- "Init Cal Mag Y [nT]",
- "Init Cal Mag Z [nT]",
- "Init Coil X Current [mA]",
- "Init Coil Y Current [mA]",
- "Init Coil Z Current [mA]",
- "Init Coil X Temperature [°C]",
- "Init Coil Y Temperature [°C]",
- "Init Coil Z Temperature [°C]",
- "Err",
- "Raw Mag X [nT]",
- "Raw Mag Y [nT]",
- "Raw Mag Z [nT]",
- "Cal Mag X [nT]",
- "Cal Mag Y [nT]",
- "Cal Mag Z [nT]",
- "Coil X Current [mA]",
- "Coil Y Current [mA]",
- "Coil Z Current [mA]",
- "Coil X Temperature [°C]",
- "Coil Y Temperature [°C]",
- "Coil Z Temperature [°C]",
- "Fina Err",
- "Fina Raw Mag X [nT]",
- "Fina Raw Mag Y [nT]",
- "Fina Raw Mag Z [nT]",
- "Fina Cal Mag X [nT]",
- "Fina Cal Mag Y [nT]",
- "Fina Cal Mag Z [nT]",
- "Fina Coil X Current [mA]",
- "Fina Coil Y Current [mA]",
- "Fina Coil Z Current [mA]",
- "Fina Coil X Temperature [°C]",
- "Fina Coil Y Temperature [°C]",
- "Fina Coil Z Temperature [°C]",
- ]
- # INIT step (no coil actuation)
- init_err = hk_data[0]
- init_raw_mag_x = struct.unpack("!f", hk_data[1:5])[0]
- init_raw_mag_y = struct.unpack("!f", hk_data[5:9])[0]
- init_raw_mag_z = struct.unpack("!f", hk_data[9:13])[0]
- init_cal_mag_x = struct.unpack("!f", hk_data[13:17])[0]
- init_cal_mag_y = struct.unpack("!f", hk_data[17:21])[0]
- init_cal_mag_z = struct.unpack("!f", hk_data[21:25])[0]
- init_coil_x_current = struct.unpack("!f", hk_data[25:29])[0]
- init_coil_y_current = struct.unpack("!f", hk_data[29:33])[0]
- init_coil_z_current = struct.unpack("!f", hk_data[33:37])[0]
- init_coil_x_temperature = struct.unpack("!H", hk_data[37:39])[0]
- init_coil_y_temperature = struct.unpack("!H", hk_data[39:41])[0]
- init_coil_z_temperature = struct.unpack("!H", hk_data[41:43])[0]
-
- # Actuation step
- err = hk_data[43]
- raw_mag_x = struct.unpack("!f", hk_data[44:48])[0]
- raw_mag_y = struct.unpack("!f", hk_data[48:52])[0]
- raw_mag_z = struct.unpack("!f", hk_data[52:56])[0]
- cal_mag_x = struct.unpack("!f", hk_data[56:60])[0]
- cal_mag_y = struct.unpack("!f", hk_data[60:64])[0]
- cal_mag_z = struct.unpack("!f", hk_data[64:68])[0]
- coil_x_current = struct.unpack("!f", hk_data[68:72])[0]
- coil_y_current = struct.unpack("!f", hk_data[72:76])[0]
- coil_z_current = struct.unpack("!f", hk_data[76:80])[0]
- coil_x_temperature = struct.unpack("!H", hk_data[80:82])[0]
- coil_y_temperature = struct.unpack("!H", hk_data[82:84])[0]
- coil_z_temperature = struct.unpack("!H", hk_data[84:86])[0]
-
- # FINA step (no coil actuation)
- fina_err = hk_data[86]
- fina_raw_mag_x = struct.unpack("!f", hk_data[87:91])[0]
- fina_raw_mag_y = struct.unpack("!f", hk_data[91:95])[0]
- fina_raw_mag_z = struct.unpack("!f", hk_data[95:99])[0]
- fina_cal_mag_x = struct.unpack("!f", hk_data[99:103])[0]
- fina_cal_mag_y = struct.unpack("!f", hk_data[103:107])[0]
- fina_cal_mag_z = struct.unpack("!f", hk_data[107:111])[0]
- fina_coil_x_current = struct.unpack("!f", hk_data[111:115])[0]
- fina_coil_y_current = struct.unpack("!f", hk_data[115:119])[0]
- fina_coil_z_current = struct.unpack("!f", hk_data[119:123])[0]
- fina_coil_x_temperature = struct.unpack("!H", hk_data[123:125])[0]
- fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0]
- fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0]
-
- validity_buffer = hk_data[129:]
- content_list = [
- init_err,
- init_raw_mag_x,
- init_raw_mag_y,
- init_raw_mag_z,
- init_cal_mag_x,
- init_cal_mag_y,
- init_cal_mag_z,
- init_coil_x_current,
- init_coil_y_current,
- init_coil_z_current,
- init_coil_x_temperature,
- init_coil_y_temperature,
- init_coil_z_temperature,
- err,
- raw_mag_x,
- init_raw_mag_y,
- raw_mag_z,
- cal_mag_x,
- cal_mag_y,
- cal_mag_z,
- coil_x_current,
- coil_y_current,
- coil_z_current,
- coil_x_temperature,
- coil_y_temperature,
- coil_z_temperature,
- fina_err,
- fina_raw_mag_x,
- fina_raw_mag_y,
- fina_raw_mag_z,
- fina_cal_mag_x,
- fina_cal_mag_y,
- fina_cal_mag_z,
- fina_coil_x_current,
- fina_coil_y_current,
- fina_coil_z_current,
- fina_coil_x_temperature,
- fina_coil_y_temperature,
- fina_coil_z_temperature,
- ]
- num_of_vars = len(header_list)
- log_to_both(printer, str(header_list))
- log_to_both(printer, str(content_list))
- printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
-
-
-def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes):
- LOGGER.info(f"Received GPS data, HK data length {len(hk_data)}")
- reply = HkReplyUnpacked()
- var_index = 0
- header_list = [
- "Latitude",
- "Longitude",
- "Altitude",
- "Fix Mode",
- "Sats in Use",
- "Date",
- "Unix Seconds",
- ]
- latitude = struct.unpack("!d", hk_data[0:8])[0]
- longitude = struct.unpack("!d", hk_data[8:16])[0]
- altitude = struct.unpack("!d", hk_data[16:24])[0]
- fix_mode = hk_data[24]
- sat_in_use = hk_data[25]
- year = struct.unpack("!H", hk_data[26:28])[0]
- month = hk_data[28]
- day = hk_data[29]
- hours = hk_data[30]
- minutes = hk_data[31]
- seconds = hk_data[32]
- date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}"
- unix_seconds = struct.unpack("!I", hk_data[33:37])[0]
- content_list = [
- latitude,
- longitude,
- altitude,
- fix_mode,
- sat_in_use,
- date_string,
- unix_seconds,
- ]
- var_index += 13
- reply.num_of_vars = var_index
- if not os.path.isfile("gps_log.txt"):
- with open("gps_log.txt", "w") as gps_file:
- gps_file.write(
- "Time, Latitude [deg], Longitude [deg], Altitude [m], Fix Mode, Sats in Use, "
- "Date, Unix Seconds\n"
- )
- with open("gps_log.txt", "a") as gps_file:
- gps_file.write(
- f"{datetime.datetime.now()}, {latitude}, {longitude}, {altitude}, "
- f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n"
- )
- validity_buffer = hk_data[37:39]
- log_to_both(printer, str(header_list))
- log_to_both(printer, str(content_list))
- printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10)
-
-
-def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
- if set_id == BpxSetIds.GET_HK_SET:
- fmt_str = "!HHHHhhhhIB"
- inc_len = struct.calcsize(fmt_str)
- (
- charge_current,
- discharge_current,
- heater_current,
- batt_voltage,
- batt_temp_1,
- batt_temp_2,
- batt_temp_3,
- batt_temp_4,
- reboot_cntr,
- boot_cause,
- ) = struct.unpack(fmt_str, hk_data[0:inc_len])
- header_list = [
- "Charge Current",
- "Discharge Current",
- "Heater Current",
- "Battery Voltage",
- "Batt Temp 1",
- "Batt Temp 2",
- "Batt Temp 3",
- "Batt Temp 4",
- "Reboot Counter",
- "Boot Cause",
- ]
- content_list = [
- charge_current,
- discharge_current,
- heater_current,
- batt_voltage,
- batt_temp_1,
- batt_temp_2,
- batt_temp_3,
- batt_temp_4,
- reboot_cntr,
- boot_cause,
- ]
- validity_buffer = hk_data[inc_len:]
- log_to_both(printer, str(header_list))
- log_to_both(printer, str(content_list))
- printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10)
- elif set_id == BpxSetIds.GET_CFG_SET:
- battheat_mode = hk_data[0]
- battheat_low = struct.unpack("!b", hk_data[1:2])[0]
- battheat_high = struct.unpack("!b", hk_data[2:3])[0]
- header_list = [
- "Battery Heater Mode",
- "Battery Heater Low Limit",
- "Battery Heater High Limit",
- ]
- content_list = [battheat_mode, battheat_low, battheat_high]
- validity_buffer = hk_data[3:]
- log_to_both(printer, str(header_list))
- log_to_both(printer, str(content_list))
- printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10)
-
-
-def handle_core_hk_data(printer: FsfwTmTcPrinter, hk_data: bytes):
-
- fmt_str = "!fffH"
- inc_len = struct.calcsize(fmt_str)
- (temperature, ps_voltage, pl_voltage, tx_agc_value) = struct.unpack(
- fmt_str, hk_data[0 : 0 + inc_len]
- )
- printout = (
- f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | "
- f"PL Voltage [mV] {pl_voltage} | TX AGC {tx_agc_value}"
- )
- log_to_both(printer, printout)
- printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=4)
-
-
-P60_INDEX_LIST = [
- "ACU VCC",
- "PDU1 VCC",
- "X3 IDLE VCC",
- "PDU2 VCC",
- "ACU VBAT",
- "PDU1 VBAT",
- "X3 IDLE VBAT",
- "PDU2 VBAT",
- "STACK VBAT",
- "STACK 3V3",
- "STACK 5V",
- "GS3V3",
- "GS5V",
-]
-
-WDT_LIST = ["GND", "I2C", "CAN", "CSP0", "CSP1"]
-
-PDU1_CHANNELS_NAMES = [
- "TCS Board",
- "Syrlinks",
- "Startracker",
- "MGT",
- "SUS Nominal",
- "SCEX",
- "PLOC",
- "ACS A Side",
- "Unused Channel 8",
-]
-
-PDU2_CHANNELS_NAMES = [
- "Q7S",
- "Payload PCDU CH1",
- "RW",
- "TCS Heater In",
- "SUS Redundant",
- "Deployment Mechanism",
- "Payload PCDU CH6",
- "ACS B Side",
- "Payload Camera",
-]
-
-PDU_CHANNEL_NAMES = [PDU1_CHANNELS_NAMES, PDU2_CHANNELS_NAMES]
-
-
-class WdtInfo:
- def __init__(self):
- self.wdt_reboots_list = []
- self.time_pings_left_list = []
-
- def print(self, printer: FsfwTmTcPrinter):
- wdt_info = "WDT Type | Reboots | Time or Pings left (CSP only)"
- log_to_both(printer, wdt_info)
- for idx in range(len(self.wdt_reboots_list)):
- log_to_both(
- printer,
- f"{WDT_LIST[idx].ljust(5)} | "
- f"{self.wdt_reboots_list[idx]:010} | {self.time_pings_left_list[idx]:010}",
- )
-
- def parse(self, wdt_data: bytes, current_idx: int) -> int:
- priv_idx = 0
- self.wdt_reboots_list = []
- self.time_pings_left_list = []
- for idx in range(5):
- self.wdt_reboots_list.append(
- struct.unpack("!I", wdt_data[priv_idx : priv_idx + 4])[0]
- )
- priv_idx += 4
- current_idx += 4
- for idx in range(3):
- self.time_pings_left_list.append(
- struct.unpack("!I", wdt_data[priv_idx : priv_idx + 4])[0]
- )
- priv_idx += 4
- current_idx += 4
- for idx in range(2):
- self.time_pings_left_list.append(wdt_data[priv_idx])
- current_idx += 1
- priv_idx += 1
- return current_idx
-
-
-def handle_pdu_data(
- printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes
-):
- current_idx = 0
- priv_idx = pdu_idx - 1
- if set_id == SetIds.PDU_1_AUX or set_id == SetIds.PDU_2_AUX:
- fmt_str = "!hhBBBIIH"
- inc_len = struct.calcsize(fmt_str)
- (
- vcc,
- vbat,
- conv_enb_0,
- conv_enb_1,
- conv_enb_2,
- boot_cause,
- uptime,
- reset_cause,
- ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
- log_to_both(printer, f"VCC {vcc} mV | VBAT {vbat} mV")
- log_to_both(
- printer, f"Converter Enables [{conv_enb_0},{conv_enb_1},{conv_enb_2}]"
- )
- log_to_both(
- printer,
- f"Boot Cause {boot_cause} | Uptime {uptime} | Reset Cause {reset_cause}",
- )
- current_idx += inc_len
- latchup_list = []
- log_to_both(printer, "Latchups")
- for idx in range(len(PDU1_CHANNELS_NAMES)):
- latchup_list.append(
- struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
- )
- content_line = (
- f"{PDU_CHANNEL_NAMES[priv_idx][idx].ljust(24)} | {latchup_list[idx]}"
- )
- log_to_both(printer, content_line)
- current_idx += 2
- device_types = []
- for idx in range(len(PDU1_CHANNELS_NAMES)):
- device_types.append(hk_data[current_idx])
- current_idx += 1
- device_statuses = []
- for idx in range(len(PDU1_CHANNELS_NAMES)):
- device_statuses.append(hk_data[current_idx])
- current_idx += 1
- wdt = WdtInfo()
- current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx)
- wdt.print(printer=printer)
- if set_id == SetIds.PDU_1_CORE or set_id == SetIds.PDU_2_CORE:
- log_to_both(printer, f"Received PDU HK from PDU {pdu_idx}")
- current_list = []
- for idx in range(len(PDU1_CHANNELS_NAMES)):
- current_list.append(
- struct.unpack("!h", hk_data[current_idx : current_idx + 2])[0]
- )
- current_idx += 2
- voltage_list = []
- for idx in range(len(PDU1_CHANNELS_NAMES)):
- voltage_list.append(
- struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
- )
- current_idx += 2
- output_enb_list = []
- for idx in range(len(PDU1_CHANNELS_NAMES)):
- output_enb_list.append(hk_data[current_idx])
- current_idx += 1
- header_str = f"{'Name'.ljust(24)} | OutEnb | U [mV] | I [mA]"
- print(header_str)
- printer.file_logger.info(header_str)
- for idx in range(len(PDU1_CHANNELS_NAMES)):
- out_enb = f"{output_enb_list[idx]}".ljust(6)
- content_line = (
- f"{PDU_CHANNEL_NAMES[priv_idx][idx].ljust(24)} | {out_enb} | "
- f"{voltage_list[idx]:05} | {current_list[idx]:04}"
- )
- log_to_both(printer, content_line)
- fmt_str = "!IBh"
- inc_len = struct.calcsize(fmt_str)
- (boot_count, batt_mode, temperature) = struct.unpack(
- fmt_str, hk_data[current_idx : current_idx + inc_len]
- )
- info = (
- f"Boot Count {boot_count} | Battery Mode {batt_mode} | "
- f"Temperature {temperature / 10.0}"
- )
- log_to_both(printer, info)
-
-
-def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
- if set_id == SetIds.P60_CORE:
- log_to_both(printer, "Received P60 Core HK. Voltages in mV, currents in mA")
- current_idx = 0
- current_list = []
- for idx in range(13):
- current_list.append(
- struct.unpack("!h", hk_data[current_idx : current_idx + 2])[0]
- )
- current_idx += 2
- voltage_list = []
- for idx in range(13):
- voltage_list.append(
- struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
- )
- current_idx += 2
- out_enb_list = []
- for idx in range(13):
- out_enb_list.append(hk_data[current_idx])
- current_idx += 1
- header_str = f"{'Name'.ljust(24)} | OutEnb | U [mV] | I [mA]"
- print(header_str)
- printer.file_logger.info(header_str)
- for idx in range(13):
- out_enb = f"{out_enb_list[idx]}".ljust(6)
- content_line = (
- f"{P60_INDEX_LIST[idx].ljust(24)} | {out_enb} | "
- f"{voltage_list[idx]:05} | {current_list[idx]:04}"
- )
- log_to_both(printer, content_line)
- fmt_str = "!IBhHhh"
- inc_len = struct.calcsize(fmt_str)
- (
- boot_count,
- batt_mode,
- batt_current,
- batt_voltage,
- temp_0,
- temp_1,
- ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
- current_idx += inc_len
- batt_info = (
- f"Batt: Mode {batt_mode} | Boot Count {boot_count} | "
- f"Charge current {batt_current} | Voltage {batt_voltage}"
- )
- temps = f"In C: Temp 0 {temp_0 / 10.0} | Temp 1 {temp_1 / 10.0} | "
- log_to_both(printer, temps)
- log_to_both(printer, batt_info)
- printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9)
- if set_id == SetIds.P60_AUX:
- log_to_both(printer, "Received P60 AUX HK. Voltages in mV, currents in mA")
- current_idx = 0
- latchup_list = []
- log_to_both(printer, "P60 Dock Latchups")
- for idx in range(0, 13):
- latchup_list.append(
- struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
- )
- content_line = f"{P60_INDEX_LIST[idx].ljust(24)} | {latchup_list[idx]}"
- log_to_both(printer, content_line)
- current_idx += 2
- fmt_str = "!IIHBBHHhhB"
- inc_len = struct.calcsize(fmt_str)
- (
- boot_cause,
- uptime,
- reset_cause,
- heater_on,
- conv_5v_on,
- dock_vbat,
- dock_vcc_c,
- batt_temp_0,
- batt_temp_1,
- dearm_status,
- ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
- current_idx += inc_len
- wdt = WdtInfo()
- current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx)
- fmt_str = "!hhbb"
- inc_len = struct.calcsize(fmt_str)
- (
- batt_charge_current,
- batt_discharge_current,
- ant6_depl,
- ar6_depl,
- ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
- current_idx += inc_len
- device_types = []
- device_statuses = []
- for idx in range(8):
- device_types.append(hk_data[current_idx])
- current_idx += 1
- for idx in range(8):
- device_statuses.append(hk_data[current_idx])
- current_idx += 1
- util_info = (
- f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}"
- )
- util_info_2 = (
- f"Conv 5V on {conv_5v_on} | Heater On {heater_on} | "
- f"Dock VBAT {dock_vbat} | DOCK VCC Current {dock_vcc_c}"
- )
- log_to_both(printer, util_info)
- log_to_both(printer, util_info_2)
- wdt.print(printer)
- misc_info = (
- f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}"
- )
- log_to_both(printer, misc_info)
- batt_info = (
- f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | "
- f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}"
- )
- log_to_both(printer, batt_info)
- printer.print_validity_buffer(
- validity_buffer=hk_data[current_idx:], num_vars=27
+ LOGGER.info(
+ f"Service 3 TM: Parsing for object {object_id} and set ID {set_id} "
+ f"has not been implemented."
)
diff --git a/pus_tm/system/__init__.py b/pus_tm/system/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/pus_tm/system/core.py b/pus_tm/system/core.py
new file mode 100644
index 0000000..883d044
--- /dev/null
+++ b/pus_tm/system/core.py
@@ -0,0 +1,21 @@
+import struct
+
+from pus_tm.defs import PrintWrapper
+from pus_tc.system.core import SetIds
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+
+def handle_core_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
+ if set_id == SetIds.HK:
+ pw = PrintWrapper(printer)
+ fmt_str = "!fff"
+ inc_len = struct.calcsize(fmt_str)
+ (temperature, ps_voltage, pl_voltage) = struct.unpack(
+ fmt_str, hk_data[0 : 0 + inc_len]
+ )
+ printout = (
+ f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | "
+ f"PL Voltage [mV] {pl_voltage}"
+ )
+ pw.dlog(printout)
+ printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=3)
diff --git a/pus_tm/system/tcs.py b/pus_tm/system/tcs.py
new file mode 100644
index 0000000..45b6623
--- /dev/null
+++ b/pus_tm/system/tcs.py
@@ -0,0 +1,94 @@
+import enum
+import struct
+
+from pus_tm.defs import PrintWrapper
+from pus_tm.tcp_server_objects import *
+from tmtccmd.utility import ObjectId
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+
+class SetIds(enum.IntEnum):
+ SENSOR_TEMPERATURE_SET = 0
+ DEVICE_TEMPERATURE_SET = 1
+ SUS_TEMPERATURE_SET = 2
+
+
+def handle_thermal_controller_hk_data(
+ object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
+):
+ if set_id == SetIds.SENSOR_TEMPERATURE_SET:
+ pw = PrintWrapper(printer)
+ pw.dlog("Received sensor temperature data")
+
+ # get all the floats
+ tm_data = struct.unpack("!ffffffffffffffffff", hk_data[:18 * 4])
+ parsed_data = {"SENSOR_PLOC_HEATSPREADER": tm_data[0], "SENSOR_PLOC_MISSIONBOARD": tm_data[1],
+ "SENSOR_4K_CAMERA": tm_data[2], "SENSOR_DAC_HEATSPREADER": tm_data[3],
+ "SENSOR_STARTRACKER": tm_data[4], "SENSOR_RW1": tm_data[5], "SENSOR_DRO": tm_data[6],
+ "SENSOR_SCEX": tm_data[7], "SENSOR_X8": tm_data[8], "SENSOR_HPA": tm_data[9],
+ "SENSOR_TX_MODUL": tm_data[10], "SENSOR_MPA": tm_data[11], "SENSOR_ACU": tm_data[12],
+ "SENSOR_PLPCDU_HEATSPREADER": tm_data[13], "SENSOR_TCS_BOARD": tm_data[14],
+ "SENSOR_MAGNETTORQUER": tm_data[15], "TMP1075 1": tm_data[16], "TMP1075 2": tm_data[17]}
+
+ # print(parsed_data)
+ tcp_server_sensor_temperatures.report_parsed_hk_data(object_id, set_id, parsed_data)
+ elif set_id == SetIds.DEVICE_TEMPERATURE_SET:
+ pw = PrintWrapper(printer)
+ pw.dlog("Received device temperature data")
+ fmt_str = "!fhhhhiiiifffhffffffffffffff"
+ tm_data = struct.unpack(fmt_str, hk_data[:98])
+ parsed_data = {
+ "Q7S_TEMPERATURE": tm_data[0],
+ "BATTERY_TEMPERATURE_1": tm_data[1],
+ "BATTERY_TEMPERATURE_2": tm_data[2],
+ "BATTERY_TEMPERATURE_3": tm_data[3],
+ "BATTERY_TEMPERATURE_4": tm_data[4],
+ "RW_1_TEMPERATURE": tm_data[5],
+ "RW_2_TEMPERATURE": tm_data[6],
+ "RW_3_TEMPERATURE": tm_data[7],
+ "RW_4_TEMPERATURE": tm_data[8],
+ "STARTRACKER_TEMPERATURE": tm_data[9],
+ "SYRLINKS_POWER_AMPLIFIER_TEMPERATURE": tm_data[10],
+ "SYRLINKS_BASEBAND_BOARD_TEMPERATURE": tm_data[11],
+ "MGT_TEMPERATURE": tm_data[12],
+ "ACU_TEMPERATURE_1": tm_data[13],
+ "ACU_TEMPERATURE_2": tm_data[14],
+ "ACU_TEMPERATURE_3": tm_data[15],
+ "PDU1_TEMPERATURE": tm_data[16],
+ "PDU2_TEMPERATURE": tm_data[17],
+ "P60DOCK_TEMPERATURE_1": tm_data[18],
+ "P60DOCK_TEMPERATURE_2": tm_data[19],
+ "GYRO_0_TEMPERATURE": tm_data[20],
+ "GYRO_1_TEMPERATURE": tm_data[21],
+ "GYRO_2_TEMPERATURE": tm_data[22],
+ "GYRO_3_TEMPERATURE": tm_data[23],
+ "MGM_0_TEMPERATURE": tm_data[24],
+ "MGM_1_TEMPERATURE": tm_data[25],
+ "ADC_PL_PCDU_TEMPERATURE": tm_data[26],
+ }
+ # print(parsed_data)
+ tcp_server_device_temperatures.report_parsed_hk_data(object_id, set_id, parsed_data)
+ elif set_id == SetIds.SUS_TEMPERATURE_SET:
+ pass
+ # pw = PrintWrapper(printer)
+ # pw.dlog("Received SUS temperature data")
+ # fmt_str = "!ffffffffffffffffff"
+ # tm_data = struct.unpack(fmt_str, hk_data[:4 * 18])
+ # parsed_data = {
+ # "SUS_0": tm_data[0],
+ # "SUS_1": tm_data[1],
+ # "SUS_2": tm_data[2],
+ # "SUS_3": tm_data[3],
+ # "SUS_4": tm_data[4],
+ # "SUS_5": tm_data[5],
+ # "SUS_6": tm_data[6],
+ # "SUS_7": tm_data[7],
+ # "SUS_8": tm_data[8],
+ # "SUS_9": tm_data[9],
+ # "SUS_10": tm_data[10],
+ # "SUS_11": tm_data[11],
+ # }
+ # print(parsed_data)
+ # TODO: Forward data to space simulator
+
+
diff --git a/pus_tm/tcp_server_objects.py b/pus_tm/tcp_server_objects.py
new file mode 100644
index 0000000..72a0d93
--- /dev/null
+++ b/pus_tm/tcp_server_objects.py
@@ -0,0 +1,4 @@
+from pus_tm.tm_tcp_server import TmTcpServer
+
+tcp_server_sensor_temperatures = TmTcpServer("localhost", 7305)
+tcp_server_device_temperatures = TmTcpServer("localhost", 7306)
diff --git a/pus_tm/tm_tcp_server.py b/pus_tm/tm_tcp_server.py
new file mode 100644
index 0000000..76eabba
--- /dev/null
+++ b/pus_tm/tm_tcp_server.py
@@ -0,0 +1,89 @@
+import socket
+from typing import Optional
+import json
+import base64
+
+from tmtccmd.logging import get_console_logger
+from tmtccmd.utility.obj_id import ObjectId
+from dle_encoder import DleEncoder
+
+LOGGER = get_console_logger()
+
+
+class TmTcpServer:
+
+ def __init__(self, ip_address: str, port: int):
+
+ self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ self.server_socket.bind((ip_address, port))
+
+ # for now, only accept one connection
+ self.server_socket.listen(0)
+
+ self.server_socket.setblocking(False)
+
+ self.client_connection: Optional[socket.socket] = None
+
+ self.dle_encoder = DleEncoder()
+
+ def __del__(self):
+ try:
+ self.close()
+ except:
+ LOGGER.warning("Could not close sockets!")
+
+ def close(self):
+ self.server_socket.close()
+ if self.client_connection is not None:
+ self.client_connection.close()
+
+ def _send_dictionary_over_socket(self, dictionary):
+ # keep listeners current
+ if self.client_connection is None:
+ # no running connection, see if a client wants to connect
+ try:
+ (self.client_connection, _) = self.server_socket.accept()
+ self.client_connection.setblocking(False)
+ print("Client connected")
+ except:
+ # no client waiting
+ return
+
+ data_json_bytes = json.dumps(dictionary).encode()
+
+ # dle encode the bytes
+ # adding a newline because someone might want to look at it in a console
+ data_json_bytes = self.dle_encoder.encode(data_json_bytes + b"\n")
+
+ try:
+ sent_length = self.client_connection.send(data_json_bytes)
+ except:
+ self.client_connection = None
+ return
+ if sent_length == 0:
+ self.client_connection.close()
+ self.client_connection = None
+
+ def report_raw_hk_data(self, object_id: ObjectId, set_id: int, hk_data: bytes):
+
+ data_dict = {
+ "type": "TM",
+ "tmType": "Raw HK",
+ "objectId": object_id.as_string,
+ "setId": set_id,
+ "rawData": base64.b64encode(hk_data).decode(),
+ }
+
+ self._send_dictionary_over_socket(data_dict)
+
+ def report_parsed_hk_data(self, object_id: ObjectId, set_id: int, data_dictionary):
+ data_dict = {
+ "type": "TM",
+ "tmType": "Parsed HK",
+ "objectId": object_id.as_string,
+ "setId": set_id,
+ "content": data_dictionary,
+ }
+
+ self._send_dictionary_over_socket(data_dict)
diff --git a/pus_tm/verification_handler.py b/pus_tm/verification_handler.py
index 6182f9d..08c0099 100644
--- a/pus_tm/verification_handler.py
+++ b/pus_tm/verification_handler.py
@@ -1,5 +1,3 @@
-import logging
-from datetime import datetime
from typing import cast
from tmtccmd.tm.pus_1_verification import Service1TMExtended
diff --git a/requirements.txt b/requirements.txt
index f444d16..68c11ef 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1 +1 @@
-tmtccmd >= 2.2.1
+tmtccmd >= 2.2.2
diff --git a/setup.cfg b/setup.cfg
index c4fd97e..10d173c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -27,7 +27,7 @@ classifiers =
[options]
install_requires =
- tmtccmd >= 2.2.1
+ tmtccmd >= 2.2.2
packages = find:
python_requires = >=3.8
diff --git a/tmtcc.py b/tmtcc.py
index 0dc37b3..9f96990 100644
--- a/tmtcc.py
+++ b/tmtcc.py
@@ -2,6 +2,8 @@ import argparse
import sys
import traceback
from typing import Optional
+from tmtccmd.config.definitions import CoreModeList
+from tmtccmd.config.globals import update_global, CoreGlobalIds
try:
import spacepackets
@@ -45,7 +47,9 @@ def tmtcc_pre_args() -> EiveHookObject:
return EiveHookObject(json_cfg_path=default_json_path())
-def tmtcc_post_args(hook_obj: EiveHookObject, use_gui: bool, args: Optional[argparse.Namespace]):
+def tmtcc_post_args(
+ hook_obj: EiveHookObject, use_gui: bool, args: Optional[argparse.Namespace]
+):
setup_args = SetupArgs(
hook_obj=hook_obj, use_gui=use_gui, apid=PUS_APID, cli_args=args
)
@@ -55,6 +59,8 @@ def tmtcc_post_args(hook_obj: EiveHookObject, use_gui: bool, args: Optional[argp
ccsds_handler.add_tm_handler(apid=PUS_APID, handler=apid_handler)
tmtccmd.setup(setup_args=setup_args)
tmtccmd.add_ccsds_handler(ccsds_handler)
+ if use_gui:
+ update_global(CoreGlobalIds.MODE, CoreModeList.LISTENER_MODE)
tmtc_backend = tmtccmd.create_default_tmtc_backend(
setup_args=setup_args,
tm_handler=ccsds_handler,
diff --git a/tmtccli.py b/tmtccli.py
index 3541bd4..29f3615 100755
--- a/tmtccli.py
+++ b/tmtccli.py
@@ -1,7 +1,12 @@
#!/usr/bin/env python3
"""TMTC commander for EIVE"""
-from tmtcc import tmtcc_post_args, tmtcc_pre_args, create_default_args_parser, \
- add_default_tmtccmd_args, parse_default_input_arguments
+from tmtcc import (
+ tmtcc_post_args,
+ tmtcc_pre_args,
+ create_default_args_parser,
+ add_default_tmtccmd_args,
+ parse_default_input_arguments,
+)
def main():
diff --git a/tmtcgui.py b/tmtcgui.py
index 6c8a1fd..df4f460 100755
--- a/tmtcgui.py
+++ b/tmtcgui.py
@@ -1,6 +1,9 @@
#!/usr/bin/env python3
"""TMTC commander for EIVE"""
-from tmtcc import tmtcc_post_args, tmtcc_pre_args
+from tmtcc import (
+ tmtcc_post_args,
+ tmtcc_pre_args
+)
def main():
diff --git a/tmtcloop.py b/tmtcloop.py
index d2cfb5b..0a7fdc8 100755
--- a/tmtcloop.py
+++ b/tmtcloop.py
@@ -11,6 +11,7 @@ try:
create_default_args_parser,
add_default_tmtccmd_args,
parse_default_input_arguments,
+ handle_unspecified_args,
)
from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidHandler
from tmtccmd.logging import get_console_logger
@@ -58,27 +59,28 @@ def main():
)
tmtc_file_logger = create_tmtc_logger()
tmtc_backend.usr_send_wrapper = (pre_tc_send_cb, tmtc_file_logger)
-
+
tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE)
- get_console_logger().info("Disabling console logger for continuous operation")
- get_console_logger().disabled = True
+ # get_console_logger().info("Disabling console logger for continuous operation")
+ # get_console_logger().setLevel("ERROR")
tmtccmd.init_and_start_daemons(tmtc_backend=tmtc_backend)
- tmtccmd.performOperation(tmtc_backend=tmtc_backend)
+ tmtc_backend.perform_operation()
# remove cmdline args so that we can reuse code
sys.argv = sys.argv[:1]
-
+
while True:
- args = parse_default_input_arguments(arg_parser, hook_obj)
- setup_args = SetupArgs(
- hook_obj=hook_obj, use_gui=False, apid=PUS_APID, cli_args=args
- )
- tmtccmd.setup(setup_args=setup_args)
+ args.service = None
+ args.op_code = None
+ handle_unspecified_args(args, hook_obj.get_service_op_code_dictionary())
+
+ tmtc_backend.set_service(args.service)
+ tmtc_backend.set_opcode(args.op_code)
tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE)
-
- tmtccmd.performOperation(tmtc_backend=tmtc_backend)
+
+ tmtc_backend.perform_operation()
if __name__ == "__main__":