diff --git a/.idea/runConfigurations/PDU1_Commanding.xml b/.idea/runConfigurations/PDU1_Commanding.xml
index 45f209a..28f9c0d 100644
--- a/.idea/runConfigurations/PDU1_Commanding.xml
+++ b/.idea/runConfigurations/PDU1_Commanding.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/.idea/runConfigurations/PLOC_MPSoC.xml b/.idea/runConfigurations/PLOC_MPSoC.xml
index e01a340..e58826d 100644
--- a/.idea/runConfigurations/PLOC_MPSoC.xml
+++ b/.idea/runConfigurations/PLOC_MPSoC.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/.idea/runConfigurations/Syrlinks.xml b/.idea/runConfigurations/Syrlinks.xml
index 3e1f604..d5a3454 100644
--- a/.idea/runConfigurations/Syrlinks.xml
+++ b/.idea/runConfigurations/Syrlinks.xml
@@ -6,14 +6,14 @@
-
+
-
+
-
-
+
+
diff --git a/.idea/runConfigurations/Unittests_in_tmtccmd.xml b/.idea/runConfigurations/Unittests_in_tmtccmd.xml
index f6549f0..5cdbb08 100644
--- a/.idea/runConfigurations/Unittests_in_tmtccmd.xml
+++ b/.idea/runConfigurations/Unittests_in_tmtccmd.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/.idea/runConfigurations/ccsds_handler.xml b/.idea/runConfigurations/ccsds_handler.xml
index 7c6d714..5e506bb 100644
--- a/.idea/runConfigurations/ccsds_handler.xml
+++ b/.idea/runConfigurations/ccsds_handler.xml
@@ -6,16 +6,16 @@
-
+
-
+
-
+
diff --git a/.idea/runConfigurations/pdec_handler.xml b/.idea/runConfigurations/pdec_handler.xml
index 5a2f222..cedb49e 100644
--- a/.idea/runConfigurations/pdec_handler.xml
+++ b/.idea/runConfigurations/pdec_handler.xml
@@ -6,9 +6,9 @@
-
+
-
+
diff --git a/.idea/runConfigurations/tmtccli_example.xml b/.idea/runConfigurations/tmtccli_example.xml
new file mode 100644
index 0000000..4760217
--- /dev/null
+++ b/.idea/runConfigurations/tmtccli_example.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/tmtcgui_example.xml b/.idea/runConfigurations/tmtcgui_example.xml
new file mode 100644
index 0000000..7234a88
--- /dev/null
+++ b/.idea/runConfigurations/tmtcgui_example.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config/custom_mode_op.py b/config/custom_mode_op.py
index 159e350..64b9033 100644
--- a/config/custom_mode_op.py
+++ b/config/custom_mode_op.py
@@ -6,7 +6,7 @@
import enum
from tmtccmd.core.backend import TmTcHandler
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
LOGGER = get_console_logger()
diff --git a/config/definitions.py b/config/definitions.py
index 476e8e4..80a7ddb 100644
--- a/config/definitions.py
+++ b/config/definitions.py
@@ -45,3 +45,4 @@ class CustomServiceList(enum.Enum):
ACS_ASS = "acs-ass"
SUS_ASS = "sus-ass"
TCS_ASS = "tcs-ass"
+ TIME = "time"
diff --git a/config/events.csv b/config/events.csv
index 21760c4..5e97bab 100644
--- a/config/events.csv
+++ b/config/events.csv
@@ -77,104 +77,118 @@
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
-10800;0x2a30;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
-10801;0x2a31;SWITCH_HAS_CHANGED;INFO;Indicated that a swithc state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission\devices\devicedefinitions\powerDefinitions.h
-10802;0x2a32;SWITCHING_Q7S_DENIED;MEDIUM;;mission\devices\devicedefinitions\powerDefinitions.h
-10900;0x2a94;GPIO_PULL_HIGH_FAILED;LOW;;mission\devices\HeaterHandler.h
-10901;0x2a95;GPIO_PULL_LOW_FAILED;LOW;;mission\devices\HeaterHandler.h
-10902;0x2a96;SWITCH_ALREADY_ON;LOW;;mission\devices\HeaterHandler.h
-10903;0x2a97;SWITCH_ALREADY_OFF;LOW;;mission\devices\HeaterHandler.h
-10904;0x2a98;MAIN_SWITCH_TIMEOUT;LOW;;mission\devices\HeaterHandler.h
-11000;0x2af8;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h
-11001;0x2af9;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h
-11002;0x2afa;DEPLOYMENT_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
-11003;0x2afb;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
-11004;0x2afc;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
-11101;0x2b5d;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux\devices\ploc\PlocMPSoCHandler.h
-11102;0x2b5e;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
-11103;0x2b5f;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
-11104;0x2b60;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux\devices\ploc\PlocMPSoCHandler.h
-11105;0x2b61;MPSOC_HANDLER_SEQ_CNT_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
-11106;0x2b62;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
-11201;0x2bc1;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
-11202;0x2bc2;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
-11203;0x2bc3;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
-11204;0x2bc4;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
-11205;0x2bc5;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
-11206;0x2bc6;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
-11207;0x2bc7;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
-11208;0x2bc8;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission\devices\IMTQHandler.h
-11301;0x2c25;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission\devices\RwHandler.h
-11401;0x2c89;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux\devices\startracker\StarTrackerHandler.h
-11402;0x2c8a;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux\devices\startracker\StarTrackerHandler.h
-11501;0x2ced;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux\devices\ploc\PlocSupervisorHandler.h
-11502;0x2cee;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux\devices\ploc\PlocSupervisorHandler.h
-11503;0x2cef;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;linux\devices\ploc\PlocSupervisorHandler.h
-11504;0x2cf0;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux\devices\ploc\PlocSupervisorHandler.h
-11505;0x2cf1;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux\devices\ploc\PlocSupervisorHandler.h
-11600;0x2d50;SANITIZATION_FAILED;LOW;;bsp_q7s\memory\SdCardManager.h
-11601;0x2d51;MOUNTED_SD_CARD;INFO;;bsp_q7s\memory\SdCardManager.h
-11800;0x2e18;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
-11801;0x2e19;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
-11802;0x2e1a;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux\devices\ploc\PlocMemoryDumper.h
-11901;0x2e7d;INVALID_TC_FRAME;HIGH;;linux\obc\PdecHandler.h
-11902;0x2e7e;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux\obc\PdecHandler.h
-11903;0x2e7f;CARRIER_LOCK;INFO;Carrier lock detected;linux\obc\PdecHandler.h
-11904;0x2e80;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux\obc\PdecHandler.h
-12000;0x2ee0;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux\devices\startracker\StrHelper.h
-12001;0x2ee1;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux\devices\startracker\StrHelper.h
-12002;0x2ee2;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux\devices\startracker\StrHelper.h
-12003;0x2ee3;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux\devices\startracker\StrHelper.h
-12004;0x2ee4;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux\devices\startracker\StrHelper.h
-12005;0x2ee5;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux\devices\startracker\StrHelper.h
-12006;0x2ee6;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux\devices\startracker\StrHelper.h
-12007;0x2ee7;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux\devices\startracker\StrHelper.h
-12008;0x2ee8;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux\devices\startracker\StrHelper.h
-12009;0x2ee9;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
-12010;0x2eea;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
-12011;0x2eeb;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
-12012;0x2eec;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
-12013;0x2eed;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
-12014;0x2eee;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux\devices\startracker\StrHelper.h
-12015;0x2eef;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux\devices\startracker\StrHelper.h
-12016;0x2ef0;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux\devices\startracker\StrHelper.h
-12100;0x2f44;SUPV_UPDATE_FAILED;LOW;update failed;linux\devices\ploc\PlocSupvHelper.h
-12101;0x2f45;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux\devices\ploc\PlocSupvHelper.h
-12102;0x2f46;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux\devices\ploc\PlocSupvHelper.h
-12103;0x2f47;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux\devices\ploc\PlocSupvHelper.h
-12104;0x2f48;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux\devices\ploc\PlocSupvHelper.h
-12105;0x2f49;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
-12106;0x2f4a;SUPV_SENDING_COMMAND_FAILED;LOW;;linux\devices\ploc\PlocSupvHelper.h
-12107;0x2f4b;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
-12108;0x2f4c;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
-12109;0x2f4d;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
-12110;0x2f4e;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
-12111;0x2f4f;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h
-12112;0x2f50;SUPV_EXE_FAILURE_REPORT;LOW;Supervisor received execution failure report P1: Internal state of supervisor;linux\devices\ploc\PlocSupvHelper.h
-12113;0x2f51;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
-12114;0x2f52;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
-12200;0x2fa8;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission\devices\PayloadPcduHandler.h
-12201;0x2fa9;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12202;0x2faa;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12203;0x2fab;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12204;0x2fac;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12205;0x2fad;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12206;0x2fae;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12207;0x2faf;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12208;0x2fb0;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12209;0x2fb1;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12210;0x2fb2;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12211;0x2fb3;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h
-12300;0x300c;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission\system\AcsBoardAssembly.h
-12301;0x300d;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission\system\AcsBoardAssembly.h
-12302;0x300e;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission\system\AcsBoardAssembly.h
-12303;0x300f;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
-12400;0x3070;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission\system\SusAssembly.h
-12401;0x3071;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission\system\SusAssembly.h
-12402;0x3072;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission\system\SusAssembly.h
-12403;0x3073;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
-12500;0x30d4;CHILDREN_LOST_MODE;MEDIUM;;mission\system\TcsBoardAssembly.h
-13600;0x3520;ALLOC_FAILURE;MEDIUM;;bsp_q7s\core\CoreController.h
-13601;0x3521;REBOOT_SW;MEDIUM; Software reboot occured. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s\core\CoreController.h
-13602;0x3522;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
-13603;0x3523;REBOOT_HW;MEDIUM;;bsp_q7s\core\CoreController.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 swithc 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
+11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission\devices\HeaterHandler.h
+11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;;mission\devices\HeaterHandler.h
+11402;0x2c8a;SWITCH_ALREADY_ON;LOW;;mission\devices\HeaterHandler.h
+11403;0x2c8b;SWITCH_ALREADY_OFF;LOW;;mission\devices\HeaterHandler.h
+11404;0x2c8c;MAIN_SWITCH_TIMEOUT;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_SEQ_CNT_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\RwHandler.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;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_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;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;Supervisor received execution failure report P1: Internal state of supervisor;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
diff --git a/config/globals_config.py b/config/globals_config.py
index 947558b..bb2640b 100644
--- a/config/globals_config.py
+++ b/config/globals_config.py
@@ -12,11 +12,8 @@ import argparse
from config.definitions import CustomServiceList, PUS_APID
from config.custom_mode_op import CustomModeList
from tmtccmd.config.definitions import CoreComInterfaces
-from tmtccmd.config.globals import (
- set_default_globals_pre_args_parsing,
- set_default_globals_post_args_parsing,
-)
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.config.globals import set_default_globals_pre_args_parsing
+from tmtccmd.logging import get_console_logger
LOGGER = get_console_logger()
@@ -34,12 +31,3 @@ def set_globals_pre_args_parsing(gui: bool = False):
tm_apid=PUS_APID,
com_if_id=CoreComInterfaces.TCPIP_UDP.value,
)
-
-
-def add_globals_post_args_parsing(args: argparse.Namespace, json_cfg_path: str):
- set_default_globals_post_args_parsing(
- args=args,
- custom_services_list=[CustomServiceList],
- custom_modes_list=[CustomModeList],
- json_cfg_path=json_cfg_path,
- )
diff --git a/config/hook_implementations.py b/config/hook_implementations.py
index 40dcf84..9f50c1f 100644
--- a/config/hook_implementations.py
+++ b/config/hook_implementations.py
@@ -1,19 +1,14 @@
-import argparse
-from typing import Union, Dict
+from typing import Union
from tmtccmd.config.definitions import (
ServiceOpCodeDictT,
- HkReplyUnpacked,
- DataReplyUnpacked,
)
-from tmtccmd.tm.service_3_base import Service3Base
from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.utility.retval import RetvalDictT
from tmtccmd.pus.obj_id import ObjectIdDictT
from tmtccmd.com_if.com_interface_base import CommunicationInterface
from tmtccmd.core.backend import TmTcHandler
from tmtccmd.config.hook import TmTcHookBase
-from tmtccmd.utility.tmtc_printer import TmTcPrinter
from tmtccmd.config.globals import OpCodeDictKeys
from config.definitions import CustomServiceList
@@ -21,43 +16,24 @@ from config.retvals import get_retval_dict
class EiveHookObject(TmTcHookBase):
+ def __init__(self, json_cfg_path: str):
+ super().__init__(json_cfg_path=json_cfg_path)
+
def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT:
from tmtccmd.config.globals import get_default_service_op_code_dict
service_op_code_dict = get_default_service_op_code_dict()
-
get_eive_service_op_code_dict(service_op_code_dict=service_op_code_dict)
-
return service_op_code_dict
- def get_json_config_file_path(self) -> str:
- """The user can specify a path and filename for the JSON configuration file by overriding
- this function.
- :return:
- """
- return "config/tmtc_config.json"
-
- def add_globals_pre_args_parsing(self, gui: bool = False):
- from config.globals_config import set_globals_pre_args_parsing
-
- set_globals_pre_args_parsing(gui=gui)
-
- def add_globals_post_args_parsing(self, args: argparse.Namespace):
- from config.globals_config import add_globals_post_args_parsing
-
- add_globals_post_args_parsing(
- args=args, json_cfg_path=self.get_json_config_file_path()
- )
-
def assign_communication_interface(
- self, com_if_key: str, tmtc_printer: TmTcPrinter
+ self, com_if_key: str
) -> Union[CommunicationInterface, None]:
from tmtccmd.config.com_if import create_communication_interface_default
return create_communication_interface_default(
com_if_key=com_if_key,
- tmtc_printer=tmtc_printer,
- json_cfg_path=self.get_json_config_file_path(),
+ json_cfg_path=self.json_cfg_path,
space_packet_ids=(0x0865,),
)
@@ -78,39 +54,6 @@ class EiveHookObject(TmTcHookBase):
return get_object_ids()
- @staticmethod
- def handle_service_8_telemetry(
- object_id: bytes, action_id: int, custom_data: bytearray
- ) -> DataReplyUnpacked:
- from pus_tm.service_8_hook import user_analyze_service_8_data
-
- return user_analyze_service_8_data(
- object_id=object_id, action_id=action_id, custom_data=custom_data
- )
-
- @staticmethod
- def handle_service_3_housekeeping(
- object_id: bytes, set_id: int, hk_data: bytearray, service3_packet: Service3Base
- ) -> HkReplyUnpacked:
- from pus_tm.hk_handling import handle_user_hk_packet
-
- return handle_user_hk_packet(
- object_id=object_id,
- set_id=set_id,
- hk_data=hk_data,
- service3_packet=service3_packet,
- )
-
- @staticmethod
- def handle_service_5_event(
- object_id: bytes, event_id: int, param_1: int, param_2: int
- ) -> str:
- from pus_tm.event_handler import handle_event_packet
-
- return handle_event_packet(
- object_id=object_id, event_id=event_id, param_1=param_1, param_2=param_2
- )
-
def get_retval_dict(self) -> RetvalDictT:
return get_retval_dict()
@@ -127,6 +70,7 @@ def get_eive_service_op_code_dict(service_op_code_dict: ServiceOpCodeDictT):
add_ploc_mpsoc_cmds,
add_ploc_supv_cmds,
add_system_cmds,
+ add_time_cmds,
)
from pus_tc.devs.gps import GpsOpCodes
@@ -140,6 +84,7 @@ def get_eive_service_op_code_dict(service_op_code_dict: ServiceOpCodeDictT):
add_ploc_mpsoc_cmds(cmd_dict=service_op_code_dict)
add_ploc_supv_cmds(cmd_dict=service_op_code_dict)
add_system_cmds(cmd_dict=service_op_code_dict)
+ add_time_cmds(cmd_dict=service_op_code_dict)
op_code_dict = {
GpsOpCodes.RESET_GNSS.value: ("Reset GPS", {OpCodeDictKeys.TIMEOUT: 2.0})
@@ -177,7 +122,7 @@ def get_eive_service_op_code_dict(service_op_code_dict: ServiceOpCodeDictT):
"2": ("Star Tracker: Mode Normal", {OpCodeDictKeys.TIMEOUT: 2.0}),
"3": ("Star Tracker: Mode Off", {OpCodeDictKeys.TIMEOUT: 2.0}),
"4": ("Star Tracker: Mode Raw", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "5": ("Star Tracker: Ping", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "5": ("Star Tracker: Ping", {OpCodeDictKeys.TIMEOUT: 5.0}),
"6": (
"Star Tracker: Switch to bootloader program",
{OpCodeDictKeys.TIMEOUT: 2.0},
@@ -334,19 +279,54 @@ def get_eive_service_op_code_dict(service_op_code_dict: ServiceOpCodeDictT):
service_pdec_handler_tuple = ("PDEC Handler", op_code_dict_srv_pdec_handler)
op_code_dict_srv_syrlinks_handler = {
- "0": ("Syrlinks Handler: Set TX standby", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "1": ("Syrlinks Handler: Set TX modulation", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "2": ("Syrlinks Handler: Set TX carrier wave", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "5": ("Syrlinks Handler: Read TX status", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "6": ("Syrlinks Handler: Read TX waveform", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "7": (
+ "0": ("Syrlinks Handler: Set mode off", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "1": ("Syrlinks Handler: Set mode on", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "2": ("Syrlinks Handler: Set mode normal", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "3": ("Syrlinks Handler: Set TX standby", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "4": ("Syrlinks Handler: Set TX modulation", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "5": ("Syrlinks Handler: Set TX carrier wave", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "6": ("Syrlinks Handler: Read TX status", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "7": ("Syrlinks Handler: Read TX waveform", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "8": (
"Syrlinks Handler: Read TX AGC value high byte ",
{OpCodeDictKeys.TIMEOUT: 2.0},
),
- "8": (
+ "9": (
"Syrlinks Handler: Read TX AGC value low byte ",
{OpCodeDictKeys.TIMEOUT: 2.0},
),
+ "12": (
+ "Syrlinks Handler: Write LCL config",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
+ "13": (
+ "Syrlinks Handler: Read RX status registers",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
+ "14": (
+ "Syrlinks Handler: Read LCL config register",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
+ "15": (
+ "Syrlinks Handler: Set waveform OQPSK",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
+ "16": (
+ "Syrlinks Handler: Set waveform BPSK",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
+ "17": (
+ "Syrlinks Handler: Set second config",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
+ "18": (
+ "Syrlinks Handler: Enable debug output",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
+ "19": (
+ "Syrlinks Handler: Disable debug output",
+ {OpCodeDictKeys.TIMEOUT: 2.0},
+ ),
}
service_syrlinks_handler_tuple = (
"Syrlinks Handler",
diff --git a/config/object_ids.py b/config/object_ids.py
index 08ecc6c..a70adb6 100644
--- a/config/object_ids.py
+++ b/config/object_ids.py
@@ -5,8 +5,9 @@
"""
import os.path
from tmtccmd.pus.obj_id import ObjectIdDictT
-from tmtccmd.utility.fsfw import parse_fsfw_objects_csv
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.fsfw import parse_fsfw_objects_csv
+from tmtccmd.logging import get_console_logger
+
LOGGER = get_console_logger()
DEFAULT_OBJECTS_CSV_PATH = "config/objects.csv"
diff --git a/config/retvals.py b/config/retvals.py
index ab1a78d..d6f7be9 100644
--- a/config/retvals.py
+++ b/config/retvals.py
@@ -1,6 +1,6 @@
import os
-from tmtccmd.utility.fsfw import parse_fsfw_returnvalues_csv, RetvalDictT
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.fsfw import parse_fsfw_returnvalues_csv, RetvalDictT
+from tmtccmd.logging import get_console_logger
DEFAULT_RETVAL_CSV_NAME = "config/returnvalues.csv"
__RETVAL_DICT = None
diff --git a/config/version.py b/config/version.py
index eb51c97..56db5af 100644
--- a/config/version.py
+++ b/config/version.py
@@ -1,6 +1,6 @@
SW_NAME = "eive"
VERSION_MAJOR = 1
-VERSION_MINOR = 8
+VERSION_MINOR = 9
VERSION_SUBMINOR = 0
-__version__ = "1.8.0"
+__version__ = "1.9.0"
diff --git a/gomspace/gomspace_common.py b/gomspace/gomspace_common.py
index 4130665..c8741c1 100644
--- a/gomspace/gomspace_common.py
+++ b/gomspace/gomspace_common.py
@@ -23,18 +23,27 @@ class GomspaceDeviceActionIds(enum.IntEnum):
PRINT_LATCHUPS = 33
-class GomspaceOpCodes(enum.Enum):
+class GomspaceOpCodes:
# Request HK
- REQUEST_HK_ONCE = "128"
- PRINT_SWITCH_V_I = "129"
- PRINT_LATCHUPS = "130"
+ REQUEST_CORE_HK_ONCE = ["hk-core", "128"]
+ REQUEST_AUX_HK_ONCE = ["hk-aux", "129"]
+ PRINT_SWITCH_V_I = ["print-switch-vi", "130"]
+ PRINT_LATCHUPS = ["print-latchups", "131"]
+
+
+class Info:
+ REQUEST_CORE_HK_ONCE = "Requesting Core HK once"
+ REQUEST_AUX_HK_ONCE = "Requesting Aux HK once"
class SetIds:
- PDU_1 = 0x01
- PDU_2 = 0x02
- P60_DOCK = 0x03
- ACU = 0x04
+ PDU_1_CORE = 1
+ PDU_1_AUX = 2
+ PDU_2_CORE = 3
+ PDU_2_AUX = 4
+ P60_CORE = 5
+ P60_AUX = 6
+ ACU = 7
class TableIds:
diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py
index 202601f..0f5bb92 100644
--- a/pus_tc/cmd_definitions.py
+++ b/pus_tc/cmd_definitions.py
@@ -97,25 +97,44 @@ def add_core_controller_definitions(cmd_dict: ServiceOpCodeDictT):
def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
- from pus_tc.devs.plpcdu import OpCodes
+ 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="Switch PL PCDU on"
+ 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_ADC_NORMAL,
- info="Switch PL PCDU ADC normal, submode ADC ON",
- )
- add_op_code_entry(
- op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info="Switch PL PCDU off"
+ keys=OpCodes.NORMAL_SSR,
+ info=Info.NORMAL_SSR,
)
add_op_code_entry(
op_code_dict=op_code_dict,
- keys=OpCodes.SWITCH_ALL_NORMAL,
- info="Switch all PL PCDU modules normal, submode ALL ON",
- options=generate_op_code_options(enter_listener_mode=True),
+ 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,
@@ -160,48 +179,71 @@ def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
)
-def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
- from pus_tc.devs.p60dock import P60OpCodes, GomspaceOpCodes
- from pus_tc.devs.pdu1 import Pdu1OpCodes
- from pus_tc.devs.pdu2 import Pdu2OpCodes
+def add_time_cmds(cmd_dict: ServiceOpCodeDictT):
+ from pus_tc.system.time import OpCodes, Info
op_code_dict = dict()
- add_op_code_entry(op_code_dict=op_code_dict, keys="0", info="P60 Tests")
add_op_code_entry(
op_code_dict=op_code_dict,
- keys=P60OpCodes.STACK_3V3_ON.value,
- info="P60 Dock: Turn stack 3V3 on",
+ keys=OpCodes.SET_CURRENT_TIME,
+ info=Info.SET_CURRENT_TIME,
+ )
+ add_service_op_code_entry(
+ srv_op_code_dict=cmd_dict,
+ name=CustomServiceList.TIME.value,
+ info="Time Service",
+ op_code_entry=op_code_dict,
+ )
+
+
+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.value,
- info="P60 Dock: Turn stack 3V3 off",
+ 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.value,
- info="P60 Dock: Turn stack 5V on",
+ 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.value,
- info="P60 Dock: Turn stack 5V off",
+ keys=P60OpCodes.STACK_5V_OFF,
+ info=Info.STACK_5V_OFF,
)
add_op_code_entry(
op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_HK_ONCE.value,
- info="P60 Dock: Request HK once",
+ keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
+ info=GsInfo.REQUEST_CORE_HK_ONCE,
)
add_op_code_entry(
op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_SWITCH_V_I.value,
+ 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.value,
+ 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,
@@ -292,17 +334,22 @@ def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
)
add_op_code_entry(
op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_HK_ONCE.value,
- info="PDU1: Request HK once",
+ keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
+ info=GsInfo.REQUEST_CORE_HK_ONCE,
)
add_op_code_entry(
op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_SWITCH_V_I.value,
+ 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.value,
+ keys=GomspaceOpCodes.PRINT_LATCHUPS,
info="PDU1: Print Latchups",
)
add_op_code_entry(
@@ -399,18 +446,23 @@ def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT):
)
add_op_code_entry(
op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.REQUEST_HK_ONCE.value,
- info="PDU2: Request HK once",
+ keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE,
+ info=GsInfo.REQUEST_CORE_HK_ONCE,
)
add_op_code_entry(
op_code_dict=op_code_dict,
- keys=GomspaceOpCodes.PRINT_SWITCH_V_I.value,
+ 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.value,
+ keys=GomspaceOpCodes.PRINT_LATCHUPS,
info="PDU2: Print Latchups",
)
add_service_op_code_entry(
@@ -461,6 +513,10 @@ def add_rad_sens_cmds(cmd_dict: ServiceOpCodeDictT):
"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
@@ -468,18 +524,21 @@ def add_rad_sens_cmds(cmd_dict: ServiceOpCodeDictT):
def add_ploc_mpsoc_cmds(cmd_dict: ServiceOpCodeDictT):
op_code_dict_srv_ploc_mpsoc = {
- "0": ("Ploc MPSoC: Memory write", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "1": ("Ploc MPSoC: Memory read", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "2": ("Ploc MPSoC: Flash write", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "3": ("Ploc MPSoC: Flash delete", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "4": ("Ploc MPSoC: Replay start", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "5": ("Ploc MPSoC: Replay stop", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "6": ("Ploc MPSoC: Downlink pwr on", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "7": ("Ploc MPSoC: Downlink pwr off", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "8": ("Ploc MPSoC: Replay write sequence", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "9": ("Ploc MPSoC: OBSW reset sequence count", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "10": ("Ploc MPSoC: Read DEADBEEF address", {OpCodeDictKeys.TIMEOUT: 2.0}),
- "11": ("Ploc MPSoC: Mode replay", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "0": ("Ploc MPSoC: Set mode off", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "1": ("Ploc MPSoC: Set mode on", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "2": ("Ploc MPSoC: Set mode normal", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "3": ("Ploc MPSoC: Memory write", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "4": ("Ploc MPSoC: Memory read", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "5": ("Ploc MPSoC: Flash write", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "6": ("Ploc MPSoC: Flash delete", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "7": ("Ploc MPSoC: Replay start", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "8": ("Ploc MPSoC: Replay stop", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "9": ("Ploc MPSoC: Downlink pwr on", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "10": ("Ploc MPSoC: Downlink pwr off", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "11": ("Ploc MPSoC: Replay write sequence", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "12": ("Ploc MPSoC: OBSW reset sequence count", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "13": ("Ploc MPSoC: Read DEADBEEF address", {OpCodeDictKeys.TIMEOUT: 2.0}),
+ "14": ("Ploc MPSoC: Mode replay", {OpCodeDictKeys.TIMEOUT: 2.0}),
}
service_ploc_mpsoc_tuple = ("Ploc MPSoC", op_code_dict_srv_ploc_mpsoc)
cmd_dict[CustomServiceList.PLOC_MPSOC.value] = service_ploc_mpsoc_tuple
diff --git a/pus_tc/devs/p60dock.py b/pus_tc/devs/p60dock.py
index e9d08ee..dbdc59a 100644
--- a/pus_tc/devs/p60dock.py
+++ b/pus_tc/devs/p60dock.py
@@ -7,17 +7,32 @@
"""
from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.packer import TcQueueT
-from tmtccmd.tc.service_3_housekeeping import generate_one_hk_command, make_sid
+from tmtccmd.tc.service_3_housekeeping import (
+ generate_one_hk_command,
+ make_sid,
+ generate_one_diag_command,
+)
from gomspace.gomspace_common import *
from config.object_ids import P60_DOCK_HANDLER
-class P60OpCodes(enum.Enum):
- TEST = "0"
- STACK_3V3_ON = "1"
- STACK_3V3_OFF = "2"
- STACK_5V_ON = "3"
- STACK_5V_OFF = "4"
+HK_SET_ID = 0x3
+
+
+class P60OpCodes:
+ STACK_3V3_ON = ["stack-3v3-on", "1"]
+ STACK_3V3_OFF = ["stack-3v3-off", "2"]
+ STACK_5V_ON = ["stack-5v-on", "3"]
+ STACK_5V_OFF = ["stack-5v-off", "4"]
+ TEST = ["test", "0"]
+
+
+class Info:
+ PREFIX = "P60 Dock"
+ STACK_3V3_ON = f"{PREFIX}: Turn Stack 3V3 on"
+ STACK_3V3_OFF = f"{PREFIX}: Turn Stack 3V3 off"
+ STACK_5V_ON = f"{PREFIX}: Turn Stack 5V on"
+ STACK_5V_OFF = f"{PREFIX}: Turn Stack 5V off"
class P60DockTestProcedure:
@@ -75,9 +90,9 @@ class P60DockHkTable:
wdt_gnd_left = TableEntry(bytearray([0x00, 0xA8]), TableEntry.uint32_size)
-def pack_p60dock_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
- if op_code == P60OpCodes.STACK_3V3_ON.value:
- tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Turning stack 3V3 on"))
+def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
+ if op_code in P60OpCodes.STACK_3V3_ON:
+ tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_3V3_ON))
command = pack_set_param_command(
object_id,
P60DockConfigTable.out_en_9.parameter_address,
@@ -85,8 +100,8 @@ def pack_p60dock_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: st
Channel.on,
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == P60OpCodes.STACK_3V3_OFF.value:
- tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Turning stack 3V3 off"))
+ if op_code in P60OpCodes.STACK_3V3_OFF:
+ tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_3V3_OFF))
command = pack_set_param_command(
object_id,
P60DockConfigTable.out_en_9.parameter_address,
@@ -94,8 +109,8 @@ def pack_p60dock_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: st
Channel.off,
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == P60OpCodes.STACK_5V_ON.value:
- tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Turning stack 5V on"))
+ if op_code in P60OpCodes.STACK_5V_ON:
+ tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_5V_ON))
command = pack_set_param_command(
object_id,
P60DockConfigTable.out_en_10.parameter_address,
@@ -103,8 +118,8 @@ def pack_p60dock_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: st
Channel.on,
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == P60OpCodes.STACK_5V_OFF.value:
- tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Turning stack 5V off"))
+ if op_code in P60OpCodes.STACK_5V_OFF:
+ tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_5V_OFF))
command = pack_set_param_command(
object_id,
P60DockConfigTable.out_en_10.parameter_address,
@@ -112,12 +127,21 @@ def pack_p60dock_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: st
Channel.off,
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.REQUEST_HK_ONCE.value:
- tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Requesting HK Table Once"))
- hk_sid = make_sid(object_id=P60_DOCK_HANDLER, set_id=SetIds.P60_DOCK)
+ if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE:
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, "P60 Dock: Requesting HK Core HK Once")
+ )
+ hk_sid = make_sid(object_id=P60_DOCK_HANDLER, set_id=SetIds.P60_CORE)
command = generate_one_hk_command(sid=hk_sid, ssc=0)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.PRINT_SWITCH_V_I.value:
+ if op_code in GomspaceOpCodes.REQUEST_AUX_HK_ONCE:
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, "P60 Dock: Requesting HK Aux HK Once")
+ )
+ hk_sid = make_sid(object_id=P60_DOCK_HANDLER, set_id=SetIds.P60_AUX)
+ command = generate_one_hk_command(sid=hk_sid, ssc=0)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I:
tc_queue.appendleft(
(QueueCommands.PRINT, "P60 Dock: Print Switches, Voltages, Currents")
)
@@ -125,7 +149,7 @@ def pack_p60dock_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: st
object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.PRINT_LATCHUPS.value:
+ 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
diff --git a/pus_tc/devs/pdu1.py b/pus_tc/devs/pdu1.py
index eaaa3c1..2028639 100644
--- a/pus_tc/devs/pdu1.py
+++ b/pus_tc/devs/pdu1.py
@@ -5,7 +5,11 @@
"""
from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.packer import TcQueueT
-from tmtccmd.tc.service_3_housekeeping import generate_one_hk_command, make_sid
+from tmtccmd.tc.service_3_housekeeping import (
+ generate_one_hk_command,
+ make_sid,
+ generate_one_diag_command,
+)
from gomspace.gomspace_common import *
from gomspace.gomspace_pdu_definitions import *
from config.object_ids import PDU_1_HANDLER_ID
@@ -210,12 +214,17 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
Channel.off,
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.REQUEST_HK_ONCE.value:
- tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Requesting HK Table Once"))
- hk_sid = make_sid(object_id=PDU_1_HANDLER_ID, set_id=SetIds.PDU_1)
+ if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE:
+ tc_queue.appendleft((QueueCommands.PRINT, f"PDU1: {Info.REQUEST_CORE_HK_ONCE}"))
+ hk_sid = make_sid(object_id=PDU_1_HANDLER_ID, set_id=SetIds.PDU_1_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: {Info.REQUEST_AUX_HK_ONCE}"))
+ hk_sid = make_sid(object_id=PDU_1_HANDLER_ID, set_id=SetIds.PDU_1_AUX)
command = generate_one_hk_command(sid=hk_sid, ssc=0)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.PRINT_SWITCH_V_I.value:
+ if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I:
tc_queue.appendleft(
(QueueCommands.PRINT, "PDU1: Print Switches, Voltages, Currents")
)
@@ -223,7 +232,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.PRINT_LATCHUPS.value:
+ 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
diff --git a/pus_tc/devs/pdu2.py b/pus_tc/devs/pdu2.py
index db800fa..c4e3623 100644
--- a/pus_tc/devs/pdu2.py
+++ b/pus_tc/devs/pdu2.py
@@ -8,7 +8,11 @@
"""
from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.packer import TcQueueT
-from tmtccmd.tc.service_3_housekeeping import generate_one_hk_command, make_sid
+from tmtccmd.tc.service_3_housekeeping import (
+ generate_one_hk_command,
+ generate_one_diag_command,
+ make_sid,
+)
from gomspace.gomspace_common import *
from gomspace.gomspace_pdu_definitions import *
from config.object_ids import PDU_2_HANDLER_ID
@@ -215,9 +219,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
tc_queue.appendleft(command.pack_command_tuple())
if op_code == Pdu2OpCodes.PL_CAMERA_ON.value:
- tc_queue.appendleft(
- (QueueCommands.PRINT, "PDU2: Turn payload camera on")
- )
+ tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn payload camera on"))
command = pack_set_param_command(
object_id,
PDUConfigTable.out_en_8.parameter_address,
@@ -226,9 +228,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
)
tc_queue.appendleft(command.pack_command_tuple())
if op_code == Pdu2OpCodes.PL_CAMERA_OFF.value:
- tc_queue.appendleft(
- (QueueCommands.PRINT, "PDU2: Turn payload camera off")
- )
+ tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn payload camera off"))
command = pack_set_param_command(
object_id,
PDUConfigTable.out_en_8.parameter_address,
@@ -236,12 +236,17 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
Channel.off,
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.REQUEST_HK_ONCE.value:
- tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Requesting HK Table Once"))
- hk_sid = make_sid(object_id=PDU_2_HANDLER_ID, set_id=SetIds.PDU_2)
+ if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE:
+ tc_queue.appendleft((QueueCommands.PRINT, f"PDU2: {Info.REQUEST_CORE_HK_ONCE}"))
+ hk_sid = make_sid(object_id=PDU_2_HANDLER_ID, set_id=SetIds.PDU_2_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"PDU2: {Info.REQUEST_AUX_HK_ONCE}"))
+ hk_sid = make_sid(object_id=PDU_2_HANDLER_ID, set_id=SetIds.PDU_2_AUX)
command = generate_one_hk_command(sid=hk_sid, ssc=0)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.PRINT_SWITCH_V_I.value:
+ if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I:
tc_queue.appendleft(
(QueueCommands.PRINT, "PDU2: Print Switches, Currents, Voltahes")
)
@@ -249,7 +254,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I
)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == GomspaceOpCodes.PRINT_LATCHUPS.value:
+ 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
diff --git a/pus_tc/devs/ploc_mpsoc.py b/pus_tc/devs/ploc_mpsoc.py
index cf52a03..4806e15 100644
--- a/pus_tc/devs/ploc_mpsoc.py
+++ b/pus_tc/devs/ploc_mpsoc.py
@@ -10,10 +10,11 @@ import struct
import enum
from tmtccmd.config.definitions import QueueCommands
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
from tmtccmd.tc.packer import TcQueueT
from spacepackets.ecss.tc import PusTelecommand
from utility.input_helper import InputHelper
+from tmtccmd.tc.service_200_mode import pack_mode_data, Modes
LOGGER = get_console_logger()
@@ -59,7 +60,7 @@ class PlocReplyIds:
def pack_ploc_mpsoc_commands(
- object_id: bytearray, tc_queue: TcQueueT, op_code: str
+ object_id: bytearray, tc_queue: TcQueueT, op_code: str
) -> TcQueueT:
tc_queue.appendleft(
(
@@ -69,8 +70,25 @@ def pack_ploc_mpsoc_commands(
)
if op_code == "0":
+ tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: 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, "PLOC MPSoC: 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, "PLOC MPSoC: 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, "PLOC MPSoC: TC mem write test"))
- memory_address = int(input("PLOC MPSoC: Tc Mem Write: Type memory address: 0x"), 16)
+ memory_address = int(
+ input("PLOC MPSoC: Tc Mem Write: Type memory address: 0x"), 16
+ )
memory_data = int(input("PLOC MPSoC: Tc Mem Write: Type memory data: 0x"), 16)
# TODO: implement variable length mem write command
mem_len = 1 # 1 32-bit word
@@ -79,61 +97,67 @@ def pack_ploc_mpsoc_commands(
)
command = PusTelecommand(service=8, subservice=128, ssc=20, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "1":
+ elif op_code == "4":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: TC mem read test"))
command = prepare_mem_read_command(object_id)
command = PusTelecommand(service=8, subservice=128, ssc=21, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "2":
+ elif op_code == "5":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Flash write"))
command = prepare_flash_write_cmd(object_id)
command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "3":
+ elif op_code == "6":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Flash delete"))
command = prepare_flash_delete_cmd(object_id)
command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "4":
+ elif op_code == "7":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Replay start"))
command = prepare_replay_start_cmd(object_id)
command = PusTelecommand(service=8, subservice=128, ssc=24, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "5":
+ elif op_code == "8":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Replay stop"))
- command = object_id + struct.pack('!I', CommandIds.TC_REPLAY_STOP)
+ command = object_id + struct.pack("!I", CommandIds.TC_REPLAY_STOP)
command = PusTelecommand(service=8, subservice=128, ssc=25, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "6":
+ elif op_code == "9":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Downlink pwr on"))
command = prepare_downlink_pwr_on_cmd(object_id)
command = PusTelecommand(service=8, subservice=128, ssc=26, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "7":
+ elif op_code == "10":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Downlink pwr off"))
- command = object_id + struct.pack('!I', CommandIds.TC_DOWNLINK_PWR_OFF)
+ command = object_id + struct.pack("!I", CommandIds.TC_DOWNLINK_PWR_OFF)
command = PusTelecommand(service=8, subservice=128, ssc=26, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "8":
+ elif op_code == "11":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Replay write sequence"))
command = prepare_replay_write_sequence_cmd(object_id)
command = PusTelecommand(service=8, subservice=128, ssc=27, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "9":
- tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Reset OBSW sequence count"))
- command = object_id + struct.pack('!I', CommandIds.OBSW_RESET_SEQ_COUNT)
+ elif op_code == "12":
+ tc_queue.appendleft(
+ (QueueCommands.PRINT, "PLOC MPSoC: Reset OBSW sequence count")
+ )
+ command = object_id + struct.pack("!I", CommandIds.OBSW_RESET_SEQ_COUNT)
command = PusTelecommand(service=8, subservice=128, ssc=28, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "10":
+ elif op_code == "13":
num_words = 1
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Read DEADBEEF address"))
- command = object_id + struct.pack('!I', CommandIds.TC_MEM_READ) + struct.pack("!I", MemAddresses.DEADBEEF) + \
- struct.pack('!H', num_words)
+ command = (
+ object_id
+ + struct.pack("!I", CommandIds.TC_MEM_READ)
+ + struct.pack("!I", MemAddresses.DEADBEEF)
+ + struct.pack("!H", num_words)
+ )
command = PusTelecommand(service=8, subservice=128, ssc=29, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- elif op_code == "11":
+ elif op_code == "14":
tc_queue.appendleft((QueueCommands.PRINT, "PLOC MPSoC: Tc mode replay"))
- command = object_id + struct.pack('!I', CommandIds.TC_MODE_REPLAY)
+ command = object_id + struct.pack("!I", CommandIds.TC_MODE_REPLAY)
command = PusTelecommand(service=8, subservice=128, ssc=30, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
@@ -141,7 +165,7 @@ def pack_ploc_mpsoc_commands(
def generate_write_mem_command(
- object_id: bytearray, memory_address: int, memory_data: int, mem_len: int
+ object_id: bytearray, memory_address: int, memory_data: int, mem_len: int
) -> bytearray:
"""This function generates the command to write to a memory address within the PLOC
@param object_id The object id of the PlocHandler
@@ -149,11 +173,11 @@ def generate_write_mem_command(
@param memory_data The data to write to the memory address specified by the bytearray memory_address.
"""
command = (
- object_id
- + struct.pack('!I', CommandIds.TC_MEM_WRITE)
- + struct.pack('!I', memory_address)
- + struct.pack('!H', mem_len)
- + struct.pack("!I", memory_data)
+ object_id
+ + struct.pack("!I", CommandIds.TC_MEM_WRITE)
+ + struct.pack("!I", memory_address)
+ + struct.pack("!H", mem_len)
+ + struct.pack("!I", memory_data)
)
return command
@@ -162,8 +186,10 @@ def prepare_mem_read_command(object_id: bytearray) -> bytearray:
memory_address = int(input("PLOC MPSoC Tc Mem Read: Type memory address: 0x"), 16)
num_words = int(input("PLOC MPSoC specify number of words (32-bit) to read: "))
command = (
- object_id + struct.pack('!I', CommandIds.TC_MEM_READ) + struct.pack("!I", memory_address) + struct.pack(
- '!H', num_words)
+ object_id
+ + struct.pack("!I", CommandIds.TC_MEM_READ)
+ + struct.pack("!I", memory_address)
+ + struct.pack("!H", num_words)
)
return command
@@ -171,28 +197,44 @@ def prepare_mem_read_command(object_id: bytearray) -> bytearray:
def prepare_flash_write_cmd(object_id: bytearray) -> bytearray:
obcFile = get_obc_file()
mpsocFile = get_mpsoc_file()
- command = object_id + struct.pack('!I', CommandIds.FLASH_WRITE) + bytearray(obcFile, 'utf-8') + bytearray(mpsocFile,
- 'utf-8')
+ command = (
+ object_id
+ + struct.pack("!I", CommandIds.FLASH_WRITE)
+ + bytearray(obcFile, "utf-8")
+ + bytearray(mpsocFile, "utf-8")
+ )
return command
def prepare_flash_delete_cmd(object_id: bytearray) -> bytearray:
file = get_mpsoc_file()
- command = object_id + struct.pack('!I', CommandIds.TC_FLASH_DELETE) + bytearray(file, 'utf-8')
+ command = (
+ object_id
+ + struct.pack("!I", CommandIds.TC_FLASH_DELETE)
+ + bytearray(file, "utf-8")
+ )
return command
def prepare_replay_start_cmd(object_id: bytearray) -> bytearray:
replay = int(input("Specify replay mode (0 - once, 1 - repeated): "))
- command = object_id + struct.pack('!I', CommandIds.TC_REPLAY_START) + struct.pack('!B', replay)
+ command = (
+ object_id
+ + struct.pack("!I", CommandIds.TC_REPLAY_START)
+ + struct.pack("!B", replay)
+ )
return command
def prepare_downlink_pwr_on_cmd(object_id: bytearray) -> bytearray:
mode = int(input("Specify JESD mode (0 - 5): "))
lane_rate = int(input("Specify lane rate (0 - 9): "))
- command = object_id + struct.pack('!I', CommandIds.TC_DOWNLINK_PWR_ON) + struct.pack('!B', mode) \
- + struct.pack('!B', lane_rate)
+ command = (
+ object_id
+ + struct.pack("!I", CommandIds.TC_DOWNLINK_PWR_ON)
+ + struct.pack("!B", mode)
+ + struct.pack("!B", lane_rate)
+ )
return command
@@ -200,8 +242,12 @@ def prepare_replay_write_sequence_cmd(object_id: bytearray) -> bytearray:
null_terminator = 0
use_decoding = int(input("Use decoding (set to 1): "))
file = get_sequence_file()
- command = object_id + struct.pack('!I', CommandIds.TC_REPLAY_WRITE_SEQUENCE) + struct.pack('!B', use_decoding) + \
- bytearray(file, 'utf-8')
+ command = (
+ object_id
+ + struct.pack("!I", CommandIds.TC_REPLAY_WRITE_SEQUENCE)
+ + struct.pack("!B", use_decoding)
+ + bytearray(file, "utf-8")
+ )
return command
diff --git a/pus_tc/devs/ploc_supervisor.py b/pus_tc/devs/ploc_supervisor.py
index aa7a5e2..348c92d 100644
--- a/pus_tc/devs/ploc_supervisor.py
+++ b/pus_tc/devs/ploc_supervisor.py
@@ -11,7 +11,7 @@ import struct
from spacepackets.ecss.tc import PusTelecommand
from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.packer import TcQueueT
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
from tmtccmd.tc.service_200_mode import pack_mode_data, Modes
from utility.input_helper import InputHelper
@@ -112,16 +112,12 @@ def pack_ploc_supv_commands(
)
)
if op_code == "0":
- tc_queue.appendleft(
- (QueueCommands.PRINT, "PLOC Supervisor: Set mode off")
- )
+ tc_queue.appendleft((QueueCommands.PRINT, "PLOC Supervisor: 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, "PLOC Supervisor: Set mode on")
- )
+ tc_queue.appendleft((QueueCommands.PRINT, "PLOC Supervisor: 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())
diff --git a/pus_tc/devs/plpcdu.py b/pus_tc/devs/plpcdu.py
index 9473db8..dd6f027 100644
--- a/pus_tc/devs/plpcdu.py
+++ b/pus_tc/devs/plpcdu.py
@@ -9,7 +9,7 @@ from tmtccmd.tc.service_20_parameter import (
pack_fsfw_load_param_cmd,
pack_boolean_parameter_app_data,
)
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
from spacepackets.ecss.tc import PusTelecommand
from config.object_ids import PL_PCDU_ID
@@ -18,13 +18,13 @@ LOGGER = get_console_logger()
class OpCodes:
SWITCH_ON = ["0", "on"]
- SWITCH_ADC_NORMAL = ["1", "adc-normal"]
- SWITCH_ALL_NORMAL = ["2", "all-normal"]
- SWITCH_OFF = ["3", "off"]
- UPDATE_DRO_TO_X8_WAIT = ["6", "dro-to-x8-wait"]
- UPDATE_X8_TO_TX_WAIT_TIME = ["7", "x8-to-tx-wait"]
- UPDATE_TX_TO_MPA_WAIT_TIME = ["8", "tx-to-mpa-wait"]
- UPDATE_MPA_TO_HPA_WAIT_TIME = ["9", "mpa-to-hpa-wait"]
+ 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"]
INJECT_SSR_TO_DRO_FAILURE = ["10", "inject-ssr-dro-fault"]
INJECT_DRO_TO_X8_FAILURE = ["11", "inject-dro-x8-fault"]
@@ -33,10 +33,32 @@ 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 Submodes(enum.IntEnum):
- ADC_ON = 0
- ALL_ON = 1
+
+class Info:
+ NORMAL = "PL PCDU ADC modules normal"
+ SWITCH_ON = "Switching PL PCDU on"
+ SWITCH_OFF = "Switching PL PCDU off"
+ NORMAL_SSR = f"{NORMAL}, SSR on"
+ NORMAL_DRO = f"{NORMAL},DRO on"
+ NORMAL_X8 = f"{NORMAL}, X8 on"
+ NORMAL_TX = f"{NORMAL}, TX on"
+ NORMAL_MPA = f"{NORMAL}, MPA on"
+ NORMAL_HPA = f"{NORMAL}, HPA on"
+
+
+class NormalSubmodesMask(enum.IntEnum):
+ SOLID_STATE_RELAYS_ADC_ON = 0
+ DRO_ON = 1
+ X8_ON = 2
+ TX_ON = 3
+ MPA_ON = 4
+ HPA_ON = 5
class ParamIds(enum.IntEnum):
@@ -79,67 +101,79 @@ class ParamIds(enum.IntEnum):
def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str):
if op_code in OpCodes.SWITCH_ON:
- tc_queue.appendleft((QueueCommands.PRINT, "Switching PL PCDU on"))
- mode_data = pack_mode_data(object_id=PL_PCDU_ID, mode=Modes.ON, submode=0)
- mode_cmd = PusTelecommand(
- service=200, subservice=Subservices.COMMAND_MODE_COMMAND, app_data=mode_data
+ pack_pl_pcdu_mode_cmd(
+ tc_queue=tc_queue, info=Info.SWITCH_ON, mode=Modes.ON, submode=0
)
- tc_queue.appendleft(mode_cmd.pack_command_tuple())
if op_code in OpCodes.SWITCH_OFF:
- tc_queue.appendleft((QueueCommands.PRINT, "Switching PL PCDU off"))
- mode_data = pack_mode_data(object_id=PL_PCDU_ID, mode=Modes.OFF, submode=0)
- mode_cmd = PusTelecommand(
- service=200, subservice=Subservices.COMMAND_MODE_COMMAND, app_data=mode_data
+ pack_pl_pcdu_mode_cmd(
+ tc_queue=tc_queue, info=Info.SWITCH_OFF, mode=Modes.OFF, submode=0
)
- tc_queue.appendleft(mode_cmd.pack_command_tuple())
- if op_code in OpCodes.SWITCH_ADC_NORMAL:
- tc_queue.appendleft(
- (QueueCommands.PRINT, "Switching PL PCDU ADC module normal, submode ADC ON")
- )
- mode_data = pack_mode_data(
- object_id=PL_PCDU_ID, mode=Modes.NORMAL, submode=Submodes.ADC_ON
- )
- mode_cmd = PusTelecommand(
- service=200, subservice=Subservices.COMMAND_MODE_COMMAND, app_data=mode_data
- )
- tc_queue.appendleft(mode_cmd.pack_command_tuple())
- if op_code in OpCodes.SWITCH_ALL_NORMAL:
- tc_queue.appendleft(
- (
- QueueCommands.PRINT,
- "Switching all PL PCDU modules normal, submode ALL ON",
- )
- )
- mode_data = pack_mode_data(
- object_id=PL_PCDU_ID, mode=Modes.NORMAL, submode=Submodes.ALL_ON
- )
- mode_cmd = PusTelecommand(
- service=200, subservice=Subservices.COMMAND_MODE_COMMAND, app_data=mode_data
- )
- tc_queue.appendleft(mode_cmd.pack_command_tuple())
- if op_code in OpCodes.UPDATE_DRO_TO_X8_WAIT:
- pack_wait_time_cmd(
+ if op_code in OpCodes.NORMAL_SSR:
+ pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
- param_id=ParamIds.DRO_TO_X8_WAIT_TIME,
- print_str="DRO to X8",
+ info=Info.NORMAL_SSR,
+ mode=Modes.NORMAL,
+ submode=(1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON),
)
- if op_code in OpCodes.UPDATE_X8_TO_TX_WAIT_TIME:
- pack_wait_time_cmd(
+ if op_code in OpCodes.NORMAL_DRO:
+ pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
- param_id=ParamIds.X8_TO_TX_WAIT_TIME,
- print_str="X8 to TX",
+ info=Info.NORMAL_DRO,
+ mode=Modes.NORMAL,
+ submode=(
+ 1 << NormalSubmodesMask.DRO_ON
+ | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
+ ),
)
- if op_code in OpCodes.UPDATE_TX_TO_MPA_WAIT_TIME:
- pack_wait_time_cmd(
+ if op_code in OpCodes.NORMAL_X8:
+ pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
- param_id=ParamIds.TX_TO_MPA_WAIT_TIME,
- print_str="TX to MPA",
+ info=Info.NORMAL_X8,
+ mode=Modes.NORMAL,
+ submode=(
+ 1 << NormalSubmodesMask.DRO_ON
+ | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
+ | (1 << NormalSubmodesMask.X8_ON)
+ ),
)
- if op_code in OpCodes.UPDATE_MPA_TO_HPA_WAIT_TIME:
- pack_wait_time_cmd(
+ if op_code in OpCodes.NORMAL_TX:
+ pack_pl_pcdu_mode_cmd(
tc_queue=tc_queue,
- param_id=ParamIds.MPA_TO_HPA_WAIT_TIME,
- print_str="MPA to HPA",
+ 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)
+ ),
+ )
+ 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)
+ ),
+ )
+ 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)
+ ),
)
if op_code in OpCodes.INJECT_ALL_ON_FAILURE:
pack_failure_injection_cmd(
@@ -189,3 +223,17 @@ def pack_failure_injection_cmd(tc_queue: TcQueueT, param_id: int, print_str: str
)
cmd = pack_fsfw_load_param_cmd(ssc=0, app_data=param_data)
tc_queue.appendleft(cmd.pack_command_tuple())
+
+
+def pack_pl_pcdu_mode_cmd(tc_queue: TcQueueT, info: str, mode: Modes, submode: int):
+ tc_queue.appendleft(
+ (
+ QueueCommands.PRINT,
+ info,
+ )
+ )
+ mode_data = pack_mode_data(object_id=PL_PCDU_ID, mode=mode, submode=submode)
+ mode_cmd = PusTelecommand(
+ service=200, subservice=Subservices.COMMAND_MODE_COMMAND, app_data=mode_data
+ )
+ tc_queue.appendleft(mode_cmd.pack_command_tuple())
diff --git a/pus_tc/devs/rad_sensor.py b/pus_tc/devs/rad_sensor.py
index 2dbee43..cd66930 100644
--- a/pus_tc/devs/rad_sensor.py
+++ b/pus_tc/devs/rad_sensor.py
@@ -5,6 +5,8 @@
@author J. Meier
@date 01.07.2021
"""
+import struct
+
from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.packer import TcQueueT
@@ -12,6 +14,13 @@ from spacepackets.ecss.tc import PusTelecommand
from pus_tc.service_200_mode import pack_mode_data
+class CommandIds:
+ START_CONVERSIONS = 2
+ READ_CONVERSIONS = 3
+ ENABLE_DEBUG_OUTPUT = 4
+ DISABLE_DEBUG_OUTPUT = 5
+
+
def pack_rad_sensor_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
tc_queue.appendleft(
(
@@ -37,3 +46,27 @@ def pack_rad_sensor_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code:
mode_data = pack_mode_data(object_id, 0, 0)
command = PusTelecommand(service=200, subservice=1, ssc=42, app_data=mode_data)
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)
+ 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())
diff --git a/pus_tc/devs/star_tracker.py b/pus_tc/devs/star_tracker.py
index 6afccbe..f8df76d 100644
--- a/pus_tc/devs/star_tracker.py
+++ b/pus_tc/devs/star_tracker.py
@@ -12,7 +12,7 @@ from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.packer import TcQueueT
from spacepackets.ecss.tc import PusTelecommand
from tmtccmd.tc.service_200_mode import pack_mode_data, Modes
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
from utility.input_helper import InputHelper
@@ -146,9 +146,7 @@ class Submode:
FIRMWARE = 2
-def pack_star_tracker_commands(
- object_id: bytearray, tc_queue: TcQueueT, op_code: str
-) -> TcQueueT:
+def pack_star_tracker_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str):
tc_queue.appendleft(
(
QueueCommands.PRINT,
diff --git a/pus_tc/devs/syrlinks_hk_handler.py b/pus_tc/devs/syrlinks_hk_handler.py
index 93a3b9d..382177b 100644
--- a/pus_tc/devs/syrlinks_hk_handler.py
+++ b/pus_tc/devs/syrlinks_hk_handler.py
@@ -10,6 +10,8 @@ from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.tc.service_3_housekeeping import make_sid, generate_one_hk_command
from spacepackets.ecss.tc import PusTelecommand
+from tmtccmd.tc.service_200_mode import pack_mode_data, Modes
+import struct
class SetIds:
@@ -18,13 +20,21 @@ class SetIds:
class CommandIds:
- SET_TX_MODE_STANDBY = bytearray([0x0, 0x0, 0x0, 0x3])
- SET_TX_MODE_MODULATION = bytearray([0x0, 0x0, 0x0, 0x4])
- SET_TX_MODE_CW = bytearray([0x0, 0x0, 0x0, 0x5])
- READ_TX_STATUS = bytearray([0x0, 0x0, 0x0, 0x7])
- READ_TX_WAVEFORM = bytearray([0x0, 0x0, 0x0, 0x8])
- READ_TX_AGC_VALUE_HIGH_BYTE = bytearray([0x0, 0x0, 0x0, 0x9])
- READ_TX_AGC_VALUE_LOW_BYTE = bytearray([0x0, 0x0, 0x0, 0x9])
+ READ_RX_STATUS_REGISTERS = 2
+ SET_TX_MODE_STANDBY = 3
+ SET_TX_MODE_MODULATION = 4
+ SET_TX_MODE_CW = 5
+ READ_TX_STATUS = 7
+ READ_TX_WAVEFORM = 8
+ READ_TX_AGC_VALUE_HIGH_BYTE = 9
+ READ_TX_AGC_VALUE_LOW_BYTE = 10
+ WRITE_LCL_CONFIG = 11
+ READ_LCL_CONFIG_REGISTER = 12
+ SET_WAVEFORM_OQPSK = 17
+ SET_WAVEFORM_BPSK = 18
+ SET_SECOND_CONFIG = 19
+ ENABLE_DEBUG = 20
+ DISABLE_DEBUG = 21
def pack_syrlinks_command(
@@ -33,56 +43,111 @@ def pack_syrlinks_command(
tc_queue.appendleft(
(
QueueCommands.PRINT,
- "Testing PLOC memory dumper with object id: 0x" + object_id.hex(),
+ "Testing Syrlinks with object id: 0x" + object_id.hex(),
)
)
if op_code == "0":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: 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, "Syrlinks: 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, "Syrlinks: 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, "syrlinks: Set TX mode standby"))
command = object_id + CommandIds.SET_TX_MODE_STANDBY
command = PusTelecommand(service=8, subservice=128, ssc=10, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "1":
+ if op_code == "4":
tc_queue.appendleft((QueueCommands.PRINT, "syrlinks: Set TX mode modulation"))
command = object_id + CommandIds.SET_TX_MODE_MODULATION
command = PusTelecommand(service=8, subservice=128, ssc=11, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "2":
+ if op_code == "5":
tc_queue.appendleft((QueueCommands.PRINT, "syrlinks: Set TX mode CW"))
command = object_id + CommandIds.SET_TX_MODE_CW
command = PusTelecommand(service=8, subservice=128, ssc=12, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "3":
+ if op_code == "6":
tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Get RX Registers"))
sid = make_sid(object_id, SetIds.RX_REGISTERS_DATASET)
command = generate_one_hk_command(sid, 200)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "4":
+ if op_code == "7":
tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Get TX Registers"))
sid = make_sid(object_id, SetIds.TX_REGISTERS_DATASET)
command = generate_one_hk_command(sid, 201)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "5":
+ if op_code == "8":
tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Read TX status"))
command = object_id + CommandIds.READ_TX_STATUS
command = PusTelecommand(service=8, subservice=128, ssc=13, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "6":
+ if op_code == "9":
tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Read TX waveform"))
command = object_id + CommandIds.READ_TX_WAVEFORM
command = PusTelecommand(service=8, subservice=128, ssc=14, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "7":
+ if op_code == "10":
tc_queue.appendleft(
(QueueCommands.PRINT, "Syrlinks: Read TX AGC value high byte")
)
command = object_id + CommandIds.READ_TX_AGC_VALUE_HIGH_BYTE
command = PusTelecommand(service=8, subservice=128, ssc=15, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
- if op_code == "8":
+ if op_code == "11":
tc_queue.appendleft(
(QueueCommands.PRINT, "Syrlinks: Read TX AGC value low byte")
)
command = object_id + CommandIds.READ_TX_AGC_VALUE_LOW_BYTE
command = PusTelecommand(service=8, subservice=128, ssc=16, app_data=command)
tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "12":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Write LCL config"))
+ command = object_id + struct.pack("!I", CommandIds.WRITE_LCL_CONFIG)
+ command = PusTelecommand(service=8, subservice=128, ssc=17, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "13":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Read RX status registers"))
+ command = object_id + struct.pack("!I", CommandIds.READ_RX_STATUS_REGISTERS)
+ command = PusTelecommand(service=8, subservice=128, ssc=18, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "14":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Read LCL config register"))
+ command = object_id + struct.pack("!I", CommandIds.READ_LCL_CONFIG_REGISTER)
+ command = PusTelecommand(service=8, subservice=128, ssc=19, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "15":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Set waveform OQPSK"))
+ command = object_id + struct.pack("!I", CommandIds.SET_WAVEFORM_OQPSK)
+ command = PusTelecommand(service=8, subservice=128, ssc=20, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "16":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Set waveform BPSK"))
+ command = object_id + struct.pack("!I", CommandIds.SET_WAVEFORM_BPSK)
+ command = PusTelecommand(service=8, subservice=128, ssc=21, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "17":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Set second config"))
+ command = object_id + struct.pack("!I", CommandIds.SET_SECOND_CONFIG)
+ command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "18":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Enable debug printout"))
+ command = object_id + struct.pack("!I", CommandIds.ENABLE_DEBUG)
+ command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
+ if op_code == "19":
+ tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Disable debug printout"))
+ command = object_id + struct.pack("!I", CommandIds.DISABLE_DEBUG)
+ command = PusTelecommand(service=8, subservice=128, ssc=24, app_data=command)
+ tc_queue.appendleft(command.pack_command_tuple())
diff --git a/pus_tc/system/core.py b/pus_tc/system/core.py
index 61103f9..132ab8a 100644
--- a/pus_tc/system/core.py
+++ b/pus_tc/system/core.py
@@ -3,7 +3,7 @@ import enum
from tmtccmd.config.definitions import QueueCommands
from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.tc.service_8_functional_cmd import generate_action_command
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
from tmtccmd.tc.service_3_housekeeping import make_sid, generate_one_hk_command
from config.object_ids import CORE_CONTROLLER_ID
diff --git a/pus_tc/system/time.py b/pus_tc/system/time.py
new file mode 100644
index 0000000..c66bc17
--- /dev/null
+++ b/pus_tc/system/time.py
@@ -0,0 +1,28 @@
+from datetime import datetime
+
+from spacepackets.ecss import PusTelecommand
+from tmtccmd.config import QueueCommands
+from tmtccmd.tc.definitions import TcQueueT
+
+from tmtccmd.logging import get_console_logger
+
+LOGGER = get_console_logger()
+
+
+class OpCodes:
+ SET_CURRENT_TIME = ["0", "set-curr-time"]
+
+
+class Info:
+ SET_CURRENT_TIME = "Setting current time in ASCII format"
+
+
+def pack_set_current_time_ascii_command(tc_queue: TcQueueT, ssc: int):
+ time_test_current_time = datetime.utcnow().isoformat() + "Z" + "\0"
+ current_time_ascii = time_test_current_time.encode("ascii")
+ LOGGER.info(f"Current time in ASCII format: {current_time_ascii}")
+ tc_queue.appendleft((QueueCommands.PRINT, Info.SET_CURRENT_TIME))
+ command = PusTelecommand(
+ service=9, subservice=128, ssc=ssc, app_data=current_time_ascii
+ )
+ tc_queue.appendleft(command.pack_command_tuple())
diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py
index bda998f..420a768 100644
--- a/pus_tc/tc_packer_hook.py
+++ b/pus_tc/tc_packer_hook.py
@@ -1,17 +1,22 @@
"""Hook function which packs telecommands based on service and operation code string
"""
+import logging
import os
from collections import deque
from typing import Union
+from spacepackets.ecss import PusTelecommand
+from tmtccmd.com_if.com_interface_base import CommunicationInterface
from tmtccmd.config.definitions import CoreServiceList
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
+from tmtccmd.logging.pus import log_raw_pus_tc
from tmtccmd.tc.definitions import TcQueueT
from tmtccmd.tc.service_5_event import pack_generic_service5_test_into
from tmtccmd.pus.service_17_test import pack_service_17_ping_command
+from tmtccmd.logging import get_current_time_string
from pus_tc.service_200_mode import pack_service200_test_into
-from pus_tc.devs.p60dock import pack_p60dock_test_into
+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
@@ -31,6 +36,7 @@ from pus_tc.system.core import pack_core_commands
from pus_tc.devs.star_tracker import pack_star_tracker_commands
from pus_tc.devs.syrlinks_hk_handler import pack_syrlinks_command
from pus_tc.devs.gps import pack_gps_command
+from pus_tc.system.time import pack_set_current_time_ascii_command
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
@@ -68,6 +74,21 @@ from config.object_ids import (
LOGGER = get_console_logger()
+def pre_tc_send_cb(
+ packet: bytes,
+ com_if: CommunicationInterface,
+ pus_info: Union[PusTelecommand, any],
+ file_logger: logging.Logger,
+):
+ log_raw_pus_tc(
+ packet=packet, srv_subservice=(pus_info.service, pus_info.subservice)
+ )
+ tc_info_string = f"Sent {pus_info}"
+ LOGGER.info(tc_info_string)
+ file_logger.info(f"{get_current_time_string(True)}: {tc_info_string}")
+ com_if.send(data=packet)
+
+
def pack_service_queue_user(
service: Union[str, int], op_code: str, service_queue: TcQueueT
):
@@ -81,7 +102,7 @@ def pack_service_queue_user(
return pack_service200_test_into(tc_queue=service_queue)
if service == CustomServiceList.P60DOCK.value:
object_id = P60_DOCK_HANDLER
- return pack_p60dock_test_into(
+ return pack_p60dock_cmds(
object_id=object_id, tc_queue=service_queue, op_code=op_code
)
if service == CustomServiceList.PDU1.value:
@@ -210,6 +231,8 @@ def pack_service_queue_user(
return pack_acs_command(tc_queue=service_queue, op_code=op_code)
if service == CustomServiceList.TCS_ASS.value:
return pack_tcs_sys_commands(tc_queue=service_queue, op_code=op_code)
+ if service == CustomServiceList.TIME.value:
+ return pack_set_current_time_ascii_command(tc_queue=service_queue, ssc=0)
LOGGER.warning("Invalid Service !")
diff --git a/pus_tm/action_reply_handler.py b/pus_tm/action_reply_handler.py
new file mode 100644
index 0000000..cee50e1
--- /dev/null
+++ b/pus_tm/action_reply_handler.py
@@ -0,0 +1,107 @@
+import struct
+from config.object_ids import *
+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 tmtccmd.logging import get_console_logger
+from tmtccmd.config.definitions import DataReplyUnpacked
+from tmtccmd.tm import Service8FsfwTm
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+
+LOGGER = get_console_logger()
+
+
+def handle_action_reply(
+ raw_tm: bytes, printer: FsfwTmTcPrinter, obj_id_dict: ObjectIdDictT
+):
+ """Core Action reply handler
+ :return:
+ """
+ tm_packet = Service8FsfwTm.unpack(raw_telemetry=raw_tm)
+ printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
+ object_id = obj_id_dict.get(tm_packet.source_object_id)
+ custom_data = tm_packet.custom_data
+ action_id = tm_packet.action_id
+ generic_print_str = printer.generic_action_packet_tm_print(
+ packet=tm_packet, obj_id=object_id
+ )
+ print(generic_print_str)
+ printer.file_logger.info(generic_print_str)
+ if object_id == IMTQ_HANDLER_ID:
+ return handle_imtq_replies(action_id, printer, custom_data)
+ elif object_id == PLOC_MPSOC_ID:
+ return handle_ploc_replies(action_id, printer, custom_data)
+ elif object_id == PLOC_SUPV_ID:
+ return handle_supervisor_replies(action_id, printer, custom_data)
+ elif object_id == STAR_TRACKER_ID:
+ return handle_startracker_replies(action_id, printer, custom_data)
+
+
+def handle_imtq_replies(
+ action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
+):
+ if action_id == struct.unpack("!I", ImtqActionIds.get_commanded_dipole)[0]:
+ header_list = [
+ "Commanded X-Dipole",
+ "Commanded Y-Dipole",
+ "Commanded Z-Dipole",
+ ]
+ [x_dipole, y_dipole, z_dipole] = struct.unpack("!HHH", custom_data[0:6])
+ content_list = [x_dipole, y_dipole, z_dipole]
+ print(header_list)
+ print(content_list)
+ printer.file_logger.info(header_list)
+ printer.file_logger.info(content_list)
+
+
+def handle_ploc_replies(
+ action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
+):
+ if action_id == PlocReplyIds.tm_mem_read_report:
+ header_list = [
+ "PLOC Memory Address",
+ "PLOC Mem Len",
+ "PLOC Read Memory Data",
+ ]
+ content_list = [
+ "0x" + custom_data[:4].hex(),
+ struct.unpack("!H", custom_data[4:6])[0],
+ "0x" + custom_data[6:10].hex(),
+ ]
+ print(header_list)
+ print(content_list)
+ printer.file_logger.info(header_list)
+ printer.file_logger.info(content_list)
+
+
+def handle_supervisor_replies(
+ action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
+):
+ reply = DataReplyUnpacked()
+ if action_id == SupvActionIds.DUMP_MRAM:
+ header_list = ["MRAM Dump"]
+ content_list = [custom_data[: len(custom_data)]]
+ print(header_list)
+ print(content_list)
+ printer.file_logger.info(header_list)
+ printer.file_logger.info(content_list)
+
+
+def handle_startracker_replies(
+ action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
+):
+ if action_id == StarTrackerActionIds.CHECKSUM:
+ if len(custom_data) != 5:
+ LOGGER.warning(
+ "Star tracker reply has invalid length {0}".format(len(custom_data))
+ )
+ return
+ header_list = ["Checksum", "Checksum valid"]
+ print(custom_data[4])
+ checksum_valid_flag = custom_data[4] >> 8
+ content_list = ["0x" + custom_data[:4].hex(), checksum_valid_flag]
+ print(header_list)
+ print(content_list)
+ printer.file_logger.info(header_list)
+ printer.file_logger.info(content_list)
diff --git a/pus_tm/event_handler.py b/pus_tm/event_handler.py
index 8d64db5..9d0426d 100644
--- a/pus_tm/event_handler.py
+++ b/pus_tm/event_handler.py
@@ -1,8 +1,13 @@
+import logging
import os.path
-
+from datetime import datetime
from config.object_ids import get_object_ids
-from tmtccmd.utility.logger import get_console_logger
-from tmtccmd.utility.fsfw import parse_fsfw_events_csv, EventDictT, EventInfo
+
+from tmtccmd.tm import Service5Tm
+from tmtccmd.logging import get_console_logger
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+from tmtccmd.fsfw import parse_fsfw_events_csv, EventDictT, EventInfo
+
LOGGER = get_console_logger()
DEFAULT_EVENTS_CSV_PATH = "config/events.csv"
@@ -21,25 +26,36 @@ def get_event_dict() -> EventDictT:
def handle_event_packet(
- object_id: bytes, event_id: int, param_1: int, param_2: int
+ raw_tm: bytes, printer: FsfwTmTcPrinter, file_logger: logging.Logger
) -> str:
+ tm = Service5Tm.unpack(raw_telemetry=raw_tm)
+ printer.handle_long_tm_print(packet_if=tm, info_if=tm)
additional_event_info = ""
event_dict = get_event_dict()
- info = event_dict.get(event_id)
+ info = event_dict.get(tm.event_id)
if info is None:
- LOGGER.warning(f"Event ID {event_id} has no information")
+ LOGGER.warning(f"Event ID {tm.event_id} has no information")
info = EventInfo()
info.name = "Unknown event"
obj_ids = get_object_ids()
- obj_id_obj = obj_ids.get(bytes(object_id))
+ obj_id_obj = obj_ids.get(tm.reporter_id.as_bytes)
if obj_id_obj is None:
- LOGGER.warning(f"Object ID 0x{object_id.hex()} has no name")
- obj_name = object_id.hex()
+ LOGGER.warning(f"Object ID 0x{tm.reporter_id.as_string} has no name")
+ obj_name = tm.reporter_id.as_string
else:
obj_name = obj_id_obj.name
- generic_event_string = f"Object {obj_name} generated Event {event_id} | {info.name}"
+ generic_event_string = (
+ f"Object {obj_name} generated Event {tm.event_id} | {info.name}"
+ )
if info.info != "":
additional_event_info = (
- f" | Additional info: {info.info} | P1: {param_1} | P2: {param_2}"
+ f"Additional info: {info.info} | P1: {tm.param_1} | P2: {tm.param_2}"
)
- return generic_event_string + additional_event_info
+ file_logger.info(
+ f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: {generic_event_string}"
+ )
+ LOGGER.info(generic_event_string)
+ if additional_event_info != "":
+ file_logger.info(additional_event_info)
+ print(additional_event_info)
+ return generic_event_string + " | " + additional_event_info
diff --git a/pus_tm/factory_hook.py b/pus_tm/factory_hook.py
index 4532bd1..b5a318a 100644
--- a/pus_tm/factory_hook.py
+++ b/pus_tm/factory_hook.py
@@ -1,64 +1,80 @@
+"""Core EIVE TM handler module
"""
-@brief This file transfers control of TM parsing to the user
-@details Template configuration file. Copy this folder to the TMTC commander root and adapt
- it to your needs.
-"""
-from tmtccmd.tm.service_8_fsfw_functional_cmd import Service8FsfwTm
from spacepackets.ecss.tm import PusTelemetry
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
+from tmtccmd.logging.pus import (
+ log_raw_pus_tm,
+ log_raw_unknown_packet,
+ PacketTypes,
+ create_tmtc_logger,
+)
-from tmtccmd.pus.service_1_verification import Service1TMExtended
from tmtccmd.pus.service_17_test import Service17TMExtended
-from tmtccmd.tm.service_3_fsfw_housekeeping import Service3FsfwTm
from tmtccmd.tm.service_20_fsfw_parameters import Service20FsfwTm
-from tmtccmd.tm.service_5_event import Service5Tm
from tmtccmd.tm.service_200_fsfw_mode import Service200FsfwTm
-from tmtccmd.utility.tmtc_printer import TmTcPrinter, PrintFormats
+from tmtccmd.utility.tmtc_printer import PrintFormats, FsfwTmTcPrinter
from config.definitions import PUS_APID
+from config.object_ids import get_object_ids
+
+from .event_handler import handle_event_packet
+from .verification_handler import handle_service_1_packet
+from .hk_handling import handle_hk_packet
+from .action_reply_handler import handle_action_reply
LOGGER = get_console_logger()
-def ccsds_tm_handler(
- apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter
-) -> None:
+FSFW_PRINTER = FsfwTmTcPrinter(file_logger=create_tmtc_logger())
+
+
+def ccsds_tm_handler(apid: int, raw_tm_packet: bytes, _user_args: any) -> None:
if apid == PUS_APID:
- pus_factory_hook(raw_tm_packet=raw_tm_packet, tmtc_printer=tmtc_printer)
+ pus_factory_hook(raw_tm_packet=raw_tm_packet)
-def pus_factory_hook(raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter):
+def pus_factory_hook(raw_tm_packet: bytes):
if len(raw_tm_packet) < 8:
LOGGER.warning("Detected packet shorter than 8 bytes!")
return
service_type = raw_tm_packet[7]
- tm_packet = None
+ subservice_type = raw_tm_packet[8]
+ file_logger = FSFW_PRINTER.file_logger
+ obj_id_dict = get_object_ids()
try:
if service_type == 1:
- tm_packet = Service1TMExtended.unpack(raw_telemetry=raw_tm_packet)
- if service_type == 3:
- tm_packet = Service3FsfwTm.unpack(
- raw_telemetry=raw_tm_packet, custom_hk_handling=False
+ handle_service_1_packet(printer=FSFW_PRINTER, raw_tm=raw_tm_packet)
+ elif service_type == 3:
+ handle_hk_packet(
+ printer=FSFW_PRINTER, raw_tm=raw_tm_packet, obj_id_dict=obj_id_dict
)
- if service_type == 5:
- tm_packet = Service5Tm.unpack(raw_telemetry=raw_tm_packet)
- if service_type == 8:
- tm_packet = Service8FsfwTm.unpack(raw_telemetry=raw_tm_packet)
- if service_type == 17:
+ elif service_type == 5:
+ handle_event_packet(
+ raw_tm=raw_tm_packet, printer=FSFW_PRINTER, file_logger=file_logger
+ )
+ elif service_type == 8:
+ handle_action_reply(
+ raw_tm=raw_tm_packet, printer=FSFW_PRINTER, obj_id_dict=obj_id_dict
+ )
+ elif service_type == 17:
tm_packet = Service17TMExtended.unpack(raw_telemetry=raw_tm_packet)
- if service_type == 20:
+ FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
+ elif service_type == 20:
tm_packet = Service20FsfwTm.unpack(raw_telemetry=raw_tm_packet)
- if service_type == 200:
+ FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
+ elif service_type == 200:
tm_packet = Service200FsfwTm.unpack(raw_telemetry=raw_tm_packet)
- if tm_packet is None:
+ FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
+ 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)
- tmtc_printer.print_telemetry(
- packet_if=tm_packet, info_if=tm_packet, print_raw_tm=False
+ 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 6e23ac0..0902f36 100644
--- a/pus_tm/hk_handling.py
+++ b/pus_tm/hk_handling.py
@@ -3,58 +3,101 @@ import struct
import os
import datetime
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.config.definitions import HkReplyUnpacked
-from tmtccmd.tm.service_3_fsfw_housekeeping import Service3Base
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.tm.service_3_fsfw_housekeeping 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 config.object_ids import (
- SYRLINKS_HANDLER_ID,
- IMTQ_HANDLER_ID,
- GPS_HANDLER_0_ID,
- GPS_HANDLER_1_ID,
- BPX_HANDLER_ID,
- CORE_CONTROLLER_ID,
-)
+from tmtccmd.pus.obj_id import ObjectId, ObjectIdDictT
+import config.object_ids as obj_ids
+
LOGGER = get_console_logger()
-def handle_user_hk_packet(
- object_id: bytes, set_id: int, hk_data: bytearray, service3_packet: Service3Base
-) -> HkReplyUnpacked:
+def handle_hk_packet(
+ raw_tm: bytes,
+ obj_id_dict: ObjectIdDictT,
+ printer: FsfwTmTcPrinter,
+):
+ tm_packet = Service3FsfwTm.unpack(raw_telemetry=raw_tm, custom_hk_handling=False)
+ named_obj_id = obj_id_dict.get(tm_packet.object_id.as_bytes)
+ if named_obj_id is None:
+ named_obj_id = tm_packet.object_id
+ if tm_packet.subservice == 25 or tm_packet.subservice == 26:
+ hk_data = tm_packet.tm_data[8:]
+ 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,
+ )
+ if tm_packet.subservice == 10 or tm_packet.subservice == 12:
+ LOGGER.warning("HK definitions printout not implemented yet")
+
+
+def handle_regular_hk_print(
+ printer: FsfwTmTcPrinter,
+ object_id: ObjectId,
+ hk_packet: Service3Base,
+ hk_data: bytes,
+):
+ object_id = object_id.as_bytes
+ set_id = hk_packet.set_id
"""This function is called when a Service 3 Housekeeping packet is received."""
- if object_id == SYRLINKS_HANDLER_ID:
+ if object_id == obj_ids.SYRLINKS_HANDLER_ID:
if set_id == SetIds.RX_REGISTERS_DATASET:
- return handle_syrlinks_rx_registers_dataset(hk_data)
+ return handle_syrlinks_rx_registers_dataset(printer, hk_data)
elif set_id == SetIds.TX_REGISTERS_DATASET:
- return handle_syrlinks_tx_registers_dataset(hk_data)
+ return handle_syrlinks_tx_registers_dataset(printer, hk_data)
else:
- LOGGER.info("Serive 3 TM: Syrlinks handler reply with unknown set id")
- elif object_id == IMTQ_HANDLER_ID:
+ LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id")
+ elif object_id == obj_ids.IMTQ_HANDLER_ID:
if (set_id >= ImtqSetIds.POSITIVE_X_TEST) and (
set_id <= ImtqSetIds.NEGATIVE_Z_TEST
):
- return handle_self_test_data(hk_data)
+ return handle_self_test_data(printer, hk_data)
else:
- LOGGER.info("Serive 3 TM: Syrlinks handler reply with unknown set id")
- elif object_id == GPS_HANDLER_0_ID or object_id == GPS_HANDLER_1_ID:
- return handle_gps_data(hk_data=hk_data)
- elif object_id == BPX_HANDLER_ID:
- return handle_bpx_hk_data(hk_data=hk_data, set_id=set_id)
- elif object_id == CORE_CONTROLLER_ID:
- return handle_core_hk_data(hk_data=hk_data, set_id=set_id)
+ LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id")
+ elif object_id == obj_ids.GPS_HANDLER_0_ID or object_id == obj_ids.GPS_HANDLER_1_ID:
+ handle_gps_data(printer=printer, hk_data=hk_data)
+ elif object_id == obj_ids.BPX_HANDLER_ID:
+ handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer)
+ elif object_id == obj_ids.CORE_CONTROLLER_ID:
+ return handle_core_hk_data(printer=printer, hk_data=hk_data)
+ elif object_id == obj_ids.PDU_1_HANDLER_ID:
+ return handle_pdu_data(
+ printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data
+ )
+ elif object_id == obj_ids.PDU_2_HANDLER_ID:
+ return handle_pdu_data(
+ printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data
+ )
+ elif object_id == obj_ids.P60_DOCK_HANDLER:
+ handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data)
+ elif object_id == obj_ids.PL_PCDU_ID:
+ log_to_both(printer, "Received PL PCDU HK data")
else:
LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.")
return HkReplyUnpacked()
-def handle_syrlinks_rx_registers_dataset(
- hk_data: bytearray,
-) -> HkReplyUnpacked:
+def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: bytes):
reply = HkReplyUnpacked()
- reply.header_list = [
+ header_list = [
"RX Status",
"RX Sensitivity",
"RX Frequency Shift",
@@ -72,7 +115,7 @@ def handle_syrlinks_rx_registers_dataset(
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]
- reply.content_list = [
+ content_list = [
rx_status,
rx_sensitivity,
rx_frequency_shift,
@@ -82,28 +125,30 @@ def handle_syrlinks_rx_registers_dataset(
rx_demod_n0,
rx_data_rate,
]
- reply.validity_buffer = hk_data[22:]
- reply.num_of_vars = 8
- return reply
+ 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(
- hk_data: bytearray,
-) -> HkReplyUnpacked:
+ printer: FsfwTmTcPrinter,
+ hk_data: bytes,
+):
reply = HkReplyUnpacked()
- reply.header_list = ["TX Status", "TX Waveform", "TX AGC value"]
+ 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])
- reply.content_list = [tx_status, tx_waveform, tx_agc_value]
- reply.validity_buffer = hk_data[4:]
- reply.num_of_vars = 3
- return reply
+ 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(hk_data: bytearray) -> HkReplyUnpacked:
- reply = HkReplyUnpacked()
- reply.hk_header = [
+def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes):
+ header_list = [
"Init Err",
"Init Raw Mag X [nT]",
"Init Raw Mag Y [nT]",
@@ -189,8 +234,8 @@ def handle_self_test_data(hk_data: bytearray) -> HkReplyUnpacked:
fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0]
fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0]
- reply.validity_buffer = hk_data[129:]
- reply.content_list = [
+ validity_buffer = hk_data[129:]
+ content_list = [
init_err,
init_raw_mag_x,
init_raw_mag_y,
@@ -231,17 +276,17 @@ def handle_self_test_data(hk_data: bytearray) -> HkReplyUnpacked:
fina_coil_y_temperature,
fina_coil_z_temperature,
]
- reply.num_of_vars = len(reply.hk_header)
- return reply
+ 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(hk_data: bytearray) -> HkReplyUnpacked:
+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_array = []
- content_array = []
- reply.header_list = [
+ header_list = [
"Latitude",
"Longitude",
"Altitude",
@@ -263,7 +308,7 @@ def handle_gps_data(hk_data: bytearray) -> HkReplyUnpacked:
seconds = hk_data[32]
date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}"
unix_seconds = struct.unpack("!I", hk_data[33:37])[0]
- content_array = [
+ content_list = [
latitude,
longitude,
altitude,
@@ -285,27 +330,29 @@ def handle_gps_data(hk_data: bytearray) -> HkReplyUnpacked:
f"{datetime.datetime.now()}, {latitude}, {longitude}, {altitude}, "
f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n"
)
- reply.header_list = header_array
- reply.content_list = content_array
- reply.validity_buffer = hk_data[37:39]
- return reply
+ 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(hk_data: bytes, set_id: int) -> HkReplyUnpacked:
- LOGGER.info(f"Received BPX data, HK data length {len(hk_data)}")
- reply = HkReplyUnpacked()
+def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
if set_id == BpxSetIds.GET_HK_SET:
- charge_current = struct.unpack("!H", hk_data[0:2])[0]
- discharge_current = struct.unpack("!H", hk_data[2:4])[0]
- heater_current = struct.unpack("!H", hk_data[4:6])[0]
- batt_voltage = struct.unpack("!H", hk_data[6:8])[0]
- batt_temp_1 = struct.unpack("!h", hk_data[8:10])[0]
- batt_temp_2 = struct.unpack("!h", hk_data[10:12])[0]
- batt_temp_3 = struct.unpack("!h", hk_data[12:14])[0]
- batt_temp_4 = struct.unpack("!h", hk_data[14:16])[0]
- reboot_cntr = struct.unpack("!I", hk_data[16:20])[0]
- boot_cause = hk_data[20]
- reply.header_list = [
+ 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",
@@ -317,7 +364,7 @@ def handle_bpx_hk_data(hk_data: bytes, set_id: int) -> HkReplyUnpacked:
"Reboot Counter",
"Boot Cause",
]
- reply.content_list = [
+ content_list = [
charge_current,
discharge_current,
heater_current,
@@ -329,29 +376,332 @@ def handle_bpx_hk_data(hk_data: bytes, set_id: int) -> HkReplyUnpacked:
reboot_cntr,
boot_cause,
]
- reply.validity_buffer = hk_data[21:]
+ 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]
- reply.header_list = [
+ header_list = [
"Battery Heater Mode",
"Battery Heater Low Limit",
"Battery Heater High Limit",
]
- reply.content_list = [battheat_mode, battheat_low, battheat_high]
- reply.validity_buffer = hk_data[3:]
- return reply
+ 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(hk_data: bytes, set_id: int) -> HkReplyUnpacked:
- reply = HkReplyUnpacked()
- reply.header_list = ["Chip Temperature [°C]", "PS Voltage [mV]", "PL Voltage [mV]"]
- temperature = struct.unpack("!f", hk_data[0:4])
- ps_voltage = struct.unpack("!f", hk_data[4:8])
- pl_voltage = struct.unpack("!f", hk_data[8:12])
- tx_agc_value = struct.unpack("!H", hk_data[2:4])
- reply.content_list = [temperature, ps_voltage, pl_voltage]
- reply.validity_buffer = hk_data[12:]
- reply.num_of_vars = 3
- return reply
+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
+ )
+
+
+def log_to_both(printer: FsfwTmTcPrinter, string: str):
+ print(string)
+ printer.file_logger.info(string)
diff --git a/pus_tm/service_8_hook.py b/pus_tm/service_8_hook.py
deleted file mode 100644
index 60d1d97..0000000
--- a/pus_tm/service_8_hook.py
+++ /dev/null
@@ -1,104 +0,0 @@
-import struct
-from config.object_ids import *
-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 tmtccmd.utility.logger import get_console_logger
-from tmtccmd.config.definitions import DataReplyUnpacked
-
-LOGGER = get_console_logger()
-
-
-def user_analyze_service_8_data(
- object_id: bytes, action_id: int, custom_data: bytearray
-) -> DataReplyUnpacked:
- """
- This function is called by the TMTC core if a Service 8 data reply (subservice 130)
- is received. The user can return a tuple of two lists, where the first list
- is a list of header strings to print and the second list is a list of values to print.
- The TMTC core will take care of printing both lists and logging them.
-
- @param object_id:
- @param action_id:
- @param custom_data:
- @return:
- """
- if object_id == PDU_2_HANDLER_ID:
- reply = DataReplyUnpacked()
- reply.header_list = ["PDU2 Service 8 Reply"]
- data_string = str()
- for index in range(len(custom_data)):
- data_string += str(hex(custom_data[index])) + " , "
- data_string = data_string.rstrip()
- data_string = data_string.rstrip(",")
- data_string = data_string.rstrip()
- reply.content_list = [data_string]
- return reply
- elif object_id == IMTQ_HANDLER_ID:
- return handle_imtq_replies(action_id, custom_data)
- elif object_id == PLOC_MPSOC_ID:
- return handle_ploc_replies(action_id, custom_data)
- elif object_id == PLOC_SUPV_ID:
- return handle_supervisor_replies(action_id, custom_data)
- elif object_id == STAR_TRACKER_ID:
- return handle_startracker_replies(action_id, custom_data)
- return DataReplyUnpacked()
-
-
-def handle_imtq_replies(action_id: int, custom_data: bytearray) -> DataReplyUnpacked:
- reply = DataReplyUnpacked()
- if action_id == struct.unpack("!I", ImtqActionIds.get_commanded_dipole)[0]:
- reply.header_list = [
- "Commanded X-Dipole",
- "Commanded Y-Dipole",
- "Commanded Z-Dipole",
- ]
- x_dipole = struct.unpack("!H", custom_data[:2])
- y_dipole = struct.unpack("!H", custom_data[2:4])
- z_dipole = struct.unpack("!H", custom_data[4:6])
- reply.content_list = [x_dipole[0], y_dipole[0], z_dipole[0]]
- return reply
-
-
-def handle_ploc_replies(action_id: int, custom_data: bytearray) -> DataReplyUnpacked:
- reply = DataReplyUnpacked()
- if action_id == PlocReplyIds.tm_mem_read_report:
- reply.header_list = [
- "PLOC Memory Address",
- "PLOC Mem Len",
- "PLOC Read Memory Data",
- ]
- reply.content_list = [
- "0x" + custom_data[:4].hex(),
- struct.unpack("!H", custom_data[4:6])[0],
- "0x" + custom_data[6:10].hex(),
- ]
- return reply
-
-
-def handle_supervisor_replies(
- action_id: int, custom_data: bytearray
-) -> DataReplyUnpacked:
- reply = DataReplyUnpacked()
- if action_id == SupvActionIds.DUMP_MRAM:
- reply.header_list = ["MRAM Dump"]
- reply.content_list = [custom_data[: len(custom_data)]]
- return reply
-
-
-def handle_startracker_replies(
- action_id: int, custom_data: bytearray
-) -> DataReplyUnpacked:
- reply = DataReplyUnpacked()
- if action_id == StarTrackerActionIds.CHECKSUM:
- if len(custom_data) != 5:
- LOGGER.warning(
- "Star tracker reply has invalid length {0}".format(len(custom_data))
- )
- return reply
- reply.header_list = ["Checksum", "Checksum valid"]
- print(custom_data[4])
- checksum_valid_flag = custom_data[4] >> 8
- reply.content_list = ["0x" + custom_data[:4].hex(), checksum_valid_flag]
- return reply
diff --git a/pus_tm/verification_handler.py b/pus_tm/verification_handler.py
new file mode 100644
index 0000000..2047f1d
--- /dev/null
+++ b/pus_tm/verification_handler.py
@@ -0,0 +1,30 @@
+import logging
+from datetime import datetime
+from typing import cast
+
+from tmtccmd.pus.service_1_verification import Service1TMExtended
+from tmtccmd.logging import get_console_logger
+from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter
+from config.retvals import get_retval_dict
+
+LOGGER = get_console_logger()
+
+
+def handle_service_1_packet(printer: FsfwTmTcPrinter, raw_tm: bytes):
+ tm_packet = Service1TMExtended.unpack(raw_telemetry=raw_tm)
+ printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
+ srv1_packet = cast(Service1TMExtended, tm_packet)
+ retval_dict = get_retval_dict()
+ if srv1_packet.has_tc_error_code:
+ retval_info = retval_dict.get(srv1_packet.error_code)
+ if retval_info is None:
+ LOGGER.info(
+ f"No returnvalue information found for error code {srv1_packet.error_code}"
+ )
+ else:
+ retval_string = (
+ f"Error Code information for code {srv1_packet.error_code}| "
+ f"Name: {retval_info.name} | Info: {retval_info.info}"
+ )
+ LOGGER.info(retval_string)
+ printer.file_logger.info(retval_string)
diff --git a/requirements.txt b/requirements.txt
index 9a6f784..7b75c9d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1 +1 @@
-tmtccmd>=1.13.0
+tmtccmd>=2.0.1
diff --git a/spacepackets b/spacepackets
index 19e8a58..522b021 160000
--- a/spacepackets
+++ b/spacepackets
@@ -1 +1 @@
-Subproject commit 19e8a588fa0723a5991f80bb2fd52dfc64f0ac64
+Subproject commit 522b021ba5690f97a4b74ae8b110762a32eb9b19
diff --git a/tmtccli.py b/tmtccli.py
index 9561eb9..0ae3990 100755
--- a/tmtccli.py
+++ b/tmtccli.py
@@ -30,13 +30,16 @@ import sys
import traceback
try:
- from tmtccmd.runner import (
- initialize_tmtc_commander,
- run_tmtc_commander,
- add_ccsds_handler,
+ import tmtccmd.runner as tmtccmd
+ from tmtccmd.config import default_json_path, SetupArgs
+ from tmtccmd.config.args import (
+ create_default_args_parser,
+ add_default_tmtccmd_args,
+ parse_default_input_arguments,
)
- from tmtccmd.ccsds.handler import CcsdsTmHandler
- from tmtccmd.utility.logger import TMTC_LOGGER_NAME
+ from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidHandler
+ from tmtccmd.logging import init_console_logger
+ from tmtccmd.logging.pus import create_tmtc_logger
except ImportError as error:
run_tmtc_commander = None
initialize_tmtc_commander = None
@@ -47,7 +50,6 @@ except ImportError as error:
try:
import spacepackets
- from spacepackets.log import set_custom_console_logger_name
except ImportError as error:
print(error)
print("Python spacepackets module could not be imported")
@@ -59,23 +61,33 @@ except ImportError as error:
from config.hook_implementations import EiveHookObject
from config.version import __version__
from config.definitions import PUS_APID
+from pus_tc.tc_packer_hook import pre_tc_send_cb
from pus_tm.factory_hook import ccsds_tm_handler
def main():
- from pus_tm.event_handler import handle_event_packet
-
- hook_obj = EiveHookObject()
print(f"-- eive tmtc version {__version__} --")
print(f"-- spacepackets version {spacepackets.__version__} --")
- set_custom_console_logger_name(logger_name=TMTC_LOGGER_NAME)
- initialize_tmtc_commander(hook_object=hook_obj)
- ccsds_handler = CcsdsTmHandler()
- ccsds_handler.add_tm_handler(
- apid=PUS_APID, pus_tm_handler=ccsds_tm_handler, max_queue_len=50
+ tmtccmd.init_printout(False)
+ tmtc_file_logger = create_tmtc_logger()
+ hook_obj = EiveHookObject(json_cfg_path=default_json_path())
+ arg_parser = create_default_args_parser()
+ add_default_tmtccmd_args(arg_parser)
+ 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
)
- add_ccsds_handler(ccsds_handler)
- run_tmtc_commander(False)
+ apid_handler = ApidHandler(cb=ccsds_tm_handler, queue_len=50, user_args=None)
+ ccsds_handler = CcsdsTmHandler()
+ ccsds_handler.add_tm_handler(apid=PUS_APID, handler=apid_handler)
+ tmtccmd.setup(setup_args=setup_args)
+ tmtccmd.add_ccsds_handler(ccsds_handler)
+ tmtc_backend = tmtccmd.create_default_tmtc_backend(
+ setup_args=setup_args,
+ tm_handler=ccsds_handler,
+ )
+ tmtc_backend.usr_send_wrapper = (pre_tc_send_cb, tmtc_file_logger)
+ tmtccmd.run(tmtc_backend=tmtc_backend)
if __name__ == "__main__":
diff --git a/tmtccmd b/tmtccmd
index 86cf0bf..48b6b83 160000
--- a/tmtccmd
+++ b/tmtccmd
@@ -1 +1 @@
-Subproject commit 86cf0bf9530f0d31784ff96b025f8b778d1732b1
+Subproject commit 48b6b8396eb3ea5ec4527ccb96f5909a29cd95f6
diff --git a/tmtcgui.py b/tmtcgui.py
index c5a7978..16759bc 100755
--- a/tmtcgui.py
+++ b/tmtcgui.py
@@ -35,8 +35,8 @@ from pus_tm.factory_hook import ccsds_tm_handler
try:
from tmtccmd.runner import (
- initialize_tmtc_commander,
- run_tmtc_commander,
+ init_tmtccmd,
+ run_tmtccmd,
add_ccsds_handler,
)
from tmtccmd.ccsds.handler import CcsdsTmHandler
@@ -56,13 +56,13 @@ def main():
hook_obj = EiveHookObject()
print(f"-- eive tmtc version {__version__}")
print(f"-- spacepackets version {spacepackets.__version__} --")
- initialize_tmtc_commander(hook_object=hook_obj)
+ init_tmtccmd(hook_object=hook_obj)
ccsds_handler = CcsdsTmHandler()
ccsds_handler.add_tm_handler(
apid=PUS_APID, pus_tm_handler=ccsds_tm_handler, max_queue_len=50
)
add_ccsds_handler(ccsds_handler)
- run_tmtc_commander(use_gui=True)
+ run_tmtccmd(use_gui=True)
if __name__ == "__main__":
diff --git a/utility/input_helper.py b/utility/input_helper.py
index 96c10e3..5c00856 100644
--- a/utility/input_helper.py
+++ b/utility/input_helper.py
@@ -6,7 +6,7 @@
@date 13.02.2021
"""
-from tmtccmd.utility.logger import get_console_logger
+from tmtccmd.logging import get_console_logger
LOGGER = get_console_logger()