Compare commits
45 Commits
v2.22.1
...
0c1bfc6fd3
Author | SHA1 | Date | |
---|---|---|---|
0c1bfc6fd3
|
|||
04bbe057e7
|
|||
e05a54b076
|
|||
ef0adef04a
|
|||
377e98b5c2
|
|||
87e5abe8eb
|
|||
13fd9a7d84 | |||
bbcc0f9de7 | |||
a0aa6525e4
|
|||
1ab8710040 | |||
f480d86fbd
|
|||
4d921e01af | |||
b505524e0b | |||
e0e9a310b9
|
|||
0e9ebefc87
|
|||
e85d1a1966 | |||
4ff50b6559 | |||
60fba8b6d9 | |||
1707f24612 | |||
5fbd19bb6c | |||
4083a3090f | |||
0c6a9677e1 | |||
7eaf6557eb | |||
3bb0a08e95 | |||
d623e83be8 | |||
5a49c4a6ce | |||
bb463aa05c | |||
77e90328a1 | |||
37bb164cc4 | |||
bebde054f4 | |||
d00e4247f6 | |||
a07f21329a | |||
4157b05288 | |||
e9b8d2658d | |||
07ff920e99 | |||
1f06ea4590 | |||
63c584e061 | |||
183cd85907 | |||
f57342602d | |||
f8da9cff7c | |||
005e15b21b | |||
8993ccdf66 | |||
c9c0b3e6ff | |||
33fd280e51 | |||
a5178e2bb0 |
29
CHANGELOG.md
29
CHANGELOG.md
@ -10,6 +10,35 @@ list yields a list of all related PRs for each release.
|
||||
|
||||
# [unreleased]
|
||||
|
||||
## Added
|
||||
|
||||
- Event handling for reboot counter events.
|
||||
- Start adding new MPSoC commands, improve MPSoC commanding module a bit.
|
||||
- Handling for PLOC MPSoC flash content report.
|
||||
|
||||
# [v3.1.1] 2023-04-17
|
||||
|
||||
## Added
|
||||
|
||||
- Update generated event file.
|
||||
|
||||
# [v3.1.0] 2023-04-16
|
||||
|
||||
## Added
|
||||
|
||||
- New core controller file system helper commands.
|
||||
|
||||
# [v3.0.0] 2023-04-14
|
||||
|
||||
## Fixed
|
||||
|
||||
- Bugfix for STR solution set format.
|
||||
- Update for STR commands.
|
||||
|
||||
## Added
|
||||
|
||||
- Added core commands to execute `systemctl` commands and to execute arbitrary Linux commands.
|
||||
|
||||
# [v2.22.1] 2023-04-12
|
||||
|
||||
## Added
|
||||
|
@ -1,11 +1,11 @@
|
||||
__version__ = "2.22.1"
|
||||
__version__ = "3.1.1"
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
SW_NAME = "eive-tmtc"
|
||||
VERSION_MAJOR = 2
|
||||
VERSION_MINOR = 22
|
||||
VERSION_MAJOR = 3
|
||||
VERSION_MINOR = 1
|
||||
VERSION_REVISION = 1
|
||||
|
||||
EIVE_TMTC_ROOT = Path(__file__).parent
|
||||
|
@ -86,13 +86,14 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
10802;0x2a32;SERIALIZATION_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||
10803;0x2a33;FILESTORE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||
10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acs/defs.h
|
||||
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acs/defs.h
|
||||
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acs/defs.h
|
||||
11203;0x2bc3;MEKF_INVALID_INFO;INFO;No description;mission/acs/defs.h
|
||||
11204;0x2bc4;MEKF_RECOVERY;INFO;No description;mission/acs/defs.h
|
||||
11205;0x2bc5;MEKF_INVALID_MODE_VIOLATION;HIGH;No description;mission/acs/defs.h
|
||||
11206;0x2bc6;SAFE_MODE_CONTROLLER_FAILURE;HIGH;No description;mission/acs/defs.h
|
||||
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acs/defs.h
|
||||
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;The system has recovered from a safe rate rotation violation.;mission/acs/defs.h
|
||||
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained.;mission/acs/defs.h
|
||||
11203;0x2bc3;MEKF_INVALID_INFO;INFO;MEKF was not able to compute a solution. P1: MEKF state on exit;mission/acs/defs.h
|
||||
11204;0x2bc4;MEKF_RECOVERY;INFO;MEKF is able to compute a solution again.;mission/acs/defs.h
|
||||
11205;0x2bc5;MEKF_AUTOMATIC_RESET;INFO;MEKF performed an automatic reset after detection of nonfinite values.;mission/acs/defs.h
|
||||
11206;0x2bc6;MEKF_INVALID_MODE_VIOLATION;HIGH;MEKF was not able to compute a solution during any pointing ACS mode for a prolonged time.;mission/acs/defs.h
|
||||
11207;0x2bc7;SAFE_MODE_CONTROLLER_FAILURE;HIGH;The ACS safe mode controller was not able to compute a solution and has failed. P1: Missing information about magnetic field, P2: Missing information about rotational rate;mission/acs/defs.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/power/defs.h
|
||||
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/power/defs.h
|
||||
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/power/defs.h
|
||||
@ -145,17 +146,20 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
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/payload/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/payload/PlocMemoryDumper.h
|
||||
12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/payload/PlocMemoryDumper.h
|
||||
12401;0x3071;INVALID_TC_FRAME;HIGH;No description;linux/ipcore/PdecHandler.h
|
||||
12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/ipcore/PdecHandler.h
|
||||
12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/ipcore/PdecHandler.h
|
||||
12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/ipcore/PdecHandler.h
|
||||
12405;0x3075;LOST_CARRIER_LOCK_PDEC;INFO;Lost carrier lock;linux/ipcore/PdecHandler.h
|
||||
12406;0x3076;LOST_BIT_LOCK_PDEC;INFO;Lost bit lock;linux/ipcore/PdecHandler.h
|
||||
12407;0x3077;TOO_MANY_IRQS;MEDIUM;Too many IRQs over the time window of one second. P1: Allowed TCs;linux/ipcore/PdecHandler.h
|
||||
12408;0x3078;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h
|
||||
12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;HIGH;No description;linux/ipcore/PdecHandler.h
|
||||
12410;0x307a;PDEC_RESET_FAILED;HIGH;Failed to pull PDEC reset to low;linux/ipcore/PdecHandler.h
|
||||
12411;0x307b;OPEN_IRQ_FILE_FAILED;HIGH;Failed to open the IRQ uio file;linux/ipcore/PdecHandler.h
|
||||
12401;0x3071;INVALID_TC_FRAME;HIGH;No description;linux/ipcore/pdec.h
|
||||
12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/ipcore/pdec.h
|
||||
12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/ipcore/pdec.h
|
||||
12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/ipcore/pdec.h
|
||||
12405;0x3075;LOST_CARRIER_LOCK_PDEC;INFO;Lost carrier lock;linux/ipcore/pdec.h
|
||||
12406;0x3076;LOST_BIT_LOCK_PDEC;INFO;Lost bit lock;linux/ipcore/pdec.h
|
||||
12407;0x3077;TOO_MANY_IRQS;MEDIUM;Too many IRQs over the time window of one second. P1: Allowed TCs;linux/ipcore/pdec.h
|
||||
12408;0x3078;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/pdec.h
|
||||
12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;HIGH;No description;linux/ipcore/pdec.h
|
||||
12410;0x307a;PDEC_TRYING_RESET_WITH_INIT;LOW;Trying a PDEC reset with complete re-initialization;linux/ipcore/pdec.h
|
||||
12411;0x307b;PDEC_TRYING_RESET_NO_INIT;LOW;Trying a PDEC reset without re-initialization.;linux/ipcore/pdec.h
|
||||
12412;0x307c;PDEC_RESET_FAILED;HIGH;Failed to pull PDEC reset to low;linux/ipcore/pdec.h
|
||||
12413;0x307d;OPEN_IRQ_FILE_FAILED;HIGH;Failed to open the IRQ uio file;linux/ipcore/pdec.h
|
||||
12414;0x307e;PDEC_INIT_FAILED;HIGH;PDEC initialization failed. This might also be due to the persistent confiuration never becoming available, for example due to SD card issues.;linux/ipcore/pdec.h
|
||||
12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/acs/StrComHandler.h
|
||||
12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/acs/StrComHandler.h
|
||||
12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/acs/StrComHandler.h
|
||||
@ -208,7 +212,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/acs/SusAssembly.h
|
||||
12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/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/acs/SusAssembly.h
|
||||
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/objects/TcsBoardAssembly.h
|
||||
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/tcs/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/acs/archive/GPSDefinitions.h
|
||||
13101;0x332d;CANT_GET_FIX;LOW;Could not get fix in maximum allowed time. P1: Maximum allowed time to get a fix after the GPS was switched on.;mission/acs/archive/GPSDefinitions.h
|
||||
13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h
|
||||
@ -260,8 +264,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;mission/sysDefs.h
|
||||
14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;mission/sysDefs.h
|
||||
14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;mission/sysDefs.h
|
||||
14010;0x36ba;TRYING_I2C_RECOVERY;MEDIUM;I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C devices.;mission/sysDefs.h
|
||||
14011;0x36bb;I2C_REBOOT;MEDIUM;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h
|
||||
14010;0x36ba;TRYING_I2C_RECOVERY;HIGH;I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C devices.;mission/sysDefs.h
|
||||
14011;0x36bb;I2C_REBOOT;HIGH;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h
|
||||
14012;0x36bc;PDEC_REBOOT;HIGH;PDEC recovery through reset was not possible, performing full reboot.;mission/sysDefs.h
|
||||
14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||
14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||
14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
||||
@ -269,6 +274,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
14105;0x3719;CAMERA_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
||||
14106;0x371a;PCDU_SYSTEM_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
||||
14107;0x371b;HEATER_NOT_OFF_FOR_OFF_MODE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||
14108;0x371c;MGT_OVERHEATING;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||
14201;0x3779;TX_TIMER_EXPIRED;INFO;The transmit timer to protect the Syrlinks expired P1: The current timer value;mission/system/com/ComSubsystem.h
|
||||
14202;0x377a;BIT_LOCK_TX_ON;INFO;Transmitter will be turned on due to detection of bitlock;mission/system/com/ComSubsystem.h
|
||||
14300;0x37dc;POSSIBLE_FILE_CORRUPTION;LOW;P1: Result code of TM packet parser. P2: Timestamp of possibly corrupt file as a unix timestamp.;mission/persistentTmStoreDefs.h
|
||||
|
|
@ -517,21 +517,21 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
||||
0x5d05;GOMS_UnknownReplyId;No description;5;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h
|
||||
0x5ea0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;160;PLOC_MEMORY_DUMPER;linux/payload/PlocMemoryDumper.h
|
||||
0x5ea1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;161;PLOC_MEMORY_DUMPER;linux/payload/PlocMemoryDumper.h
|
||||
0x5fa0;PDEC_AbandonedCltuRetval;No description;160;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa1;PDEC_FrameDirtyRetval;No description;161;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa2;PDEC_FrameIllegalMultipleReasons;No description;162;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa3;PDEC_AdDiscardedLockoutRetval;No description;163;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa4;PDEC_AdDiscardedWaitRetval;No description;164;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa5;PDEC_AdDiscardedNsVs;No description;165;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa6;PDEC_NoReportRetval;No description;166;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa7;PDEC_ErrorVersionNumberRetval;No description;167;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa8;PDEC_IllegalCombinationRetval;No description;168;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa9;PDEC_InvalidScIdRetval;No description;169;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5faa;PDEC_InvalidVcIdMsbRetval;No description;170;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fab;PDEC_InvalidVcIdLsbRetval;No description;171;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fac;PDEC_NsNotZeroRetval;No description;172;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fae;PDEC_InvalidBcCc;No description;174;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fb0;PDEC_CommandNotImplemented;Received action message with unknown action id;176;PDEC_HANDLER;linux/ipcore/PdecHandler.h
|
||||
0x5fa0;PDEC_AbandonedCltuRetval;No description;160;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa1;PDEC_FrameDirtyRetval;No description;161;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa2;PDEC_FrameIllegalMultipleReasons;No description;162;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa3;PDEC_AdDiscardedLockoutRetval;No description;163;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa4;PDEC_AdDiscardedWaitRetval;No description;164;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa5;PDEC_AdDiscardedNsVs;No description;165;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa6;PDEC_NoReportRetval;No description;166;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa7;PDEC_ErrorVersionNumberRetval;No description;167;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa8;PDEC_IllegalCombinationRetval;No description;168;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fa9;PDEC_InvalidScIdRetval;No description;169;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5faa;PDEC_InvalidVcIdMsbRetval;No description;170;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fab;PDEC_InvalidVcIdLsbRetval;No description;171;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fac;PDEC_NsNotZeroRetval;No description;172;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fae;PDEC_InvalidBcCc;No description;174;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x5fb0;PDEC_CommandNotImplemented;Received action message with unknown action id;176;PDEC_HANDLER;linux/ipcore/pdec.h
|
||||
0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/com/CcsdsIpCoreHandler.h
|
||||
0x61a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;160;RATE_SETTER;linux/ipcore/PtmeConfig.h
|
||||
0x61a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);161;RATE_SETTER;linux/ipcore/PtmeConfig.h
|
||||
@ -583,7 +583,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
||||
0x68b5;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);181;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||
0x68c0;SPVRTVIF_BufTooSmall;No description;192;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||
0x68c1;SPVRTVIF_NoReplyTimeout;No description;193;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||
0x6900;ACSCTRL_FileDeletionFailed;No description;0;ACS_CTRL;mission/controller/AcsController.h
|
||||
0x6900;ACSCTRL_FileDeletionFailed;File deletion failed and at least one file is still existent.;0;ACS_CTRL;mission/controller/AcsController.h
|
||||
0x6a02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||
0x6a03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||
0x6a04;ACSMEKF_MekfNoModelVectors;No description;4;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||
@ -592,21 +592,18 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
||||
0x6a07;ACSMEKF_MekfNotFinite;No description;7;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||
0x6a08;ACSMEKF_MekfInitialized;No description;8;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||
0x6a09;ACSMEKF_MekfRunning;No description;9;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||
0x6b01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h
|
||||
0x6c01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h
|
||||
0x6d01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h
|
||||
0x6e00;SDMA_OpOngoing;No description;0;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e01;SDMA_AlreadyOn;No description;1;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e02;SDMA_AlreadyMounted;No description;2;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e03;SDMA_AlreadyOff;No description;3;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e0a;SDMA_StatusFileNexists;No description;10;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e0b;SDMA_StatusFileFormatInvalid;No description;11;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e0c;SDMA_MountError;No description;12;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e0d;SDMA_UnmountError;No description;13;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e0e;SDMA_SystemCallError;No description;14;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6e0f;SDMA_PopenCallError;No description;15;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6f00;LPH_SdNotReady;No description;0;LOCAL_PARAM_HANDLER;bsp_q7s/memory/LocalParameterHandler.h
|
||||
0x7000;PTM_DumpDone;No description;0;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h
|
||||
0x7001;PTM_BusyDumping;No description;1;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h
|
||||
0x7100;TMS_IsBusy;No description;0;TM_SINK;mission/tmtc/DirectTmSinkIF.h
|
||||
0x7300;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
|
||||
0x6b00;SDMA_OpOngoing;No description;0;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b01;SDMA_AlreadyOn;No description;1;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b02;SDMA_AlreadyMounted;No description;2;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b03;SDMA_AlreadyOff;No description;3;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b0a;SDMA_StatusFileNexists;No description;10;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b0b;SDMA_StatusFileFormatInvalid;No description;11;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b0c;SDMA_MountError;No description;12;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b0d;SDMA_UnmountError;No description;13;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b0e;SDMA_SystemCallError;No description;14;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6b0f;SDMA_PopenCallError;No description;15;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
|
||||
0x6c00;LPH_SdNotReady;No description;0;LOCAL_PARAM_HANDLER;bsp_q7s/memory/LocalParameterHandler.h
|
||||
0x6d00;PTM_DumpDone;No description;0;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h
|
||||
0x6d01;PTM_BusyDumping;No description;1;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h
|
||||
0x6e00;TMS_IsBusy;No description;0;TM_SINK;mission/tmtc/DirectTmSinkIF.h
|
||||
0x7000;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
|
||||
|
|
@ -2,7 +2,8 @@ import struct
|
||||
from eive_tmtc.config.object_ids import *
|
||||
from eive_tmtc.tmtc.acs.imtq import ImtqActionId
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from eive_tmtc.tmtc.payload.ploc_mpsoc import PlocReplyIds
|
||||
from eive_tmtc.tmtc.core import handle_core_ctrl_action_replies
|
||||
from eive_tmtc.tmtc.payload.ploc_mpsoc import handle_mpsoc_data_reply
|
||||
from eive_tmtc.tmtc.payload.ploc_supervisor import SupvActionId
|
||||
from eive_tmtc.tmtc.acs.star_tracker import StarTrackerActionId
|
||||
from eive_tmtc.tmtc.power.tm import handle_get_param_data_reply
|
||||
@ -22,7 +23,6 @@ def handle_action_reply(
|
||||
tm_packet = Service8FsfwTm.unpack(
|
||||
raw_telemetry=raw_tm, time_reader=CdsShortTimestamp.empty()
|
||||
)
|
||||
printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
|
||||
object_id = obj_id_dict.get(tm_packet.source_object_id_as_bytes)
|
||||
pw = PrintWrapper(printer)
|
||||
custom_data = tm_packet.custom_data
|
||||
@ -34,9 +34,11 @@ def handle_action_reply(
|
||||
if object_id.as_bytes == IMTQ_HANDLER_ID:
|
||||
return handle_imtq_replies(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes == PLOC_MPSOC_ID:
|
||||
return handle_ploc_replies(action_id, printer, custom_data)
|
||||
return handle_mpsoc_data_reply(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes == PLOC_SUPV_ID:
|
||||
return handle_supervisor_replies(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes == CORE_CONTROLLER_ID:
|
||||
return handle_core_ctrl_action_replies(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes == STAR_TRACKER_ID:
|
||||
return handle_startracker_replies(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes in [
|
||||
@ -68,36 +70,6 @@ def handle_imtq_replies(
|
||||
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_RPT:
|
||||
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)
|
||||
elif action_id == PlocReplyIds.TM_CAM_CMD_RPT:
|
||||
header_list = ["Camera reply string", "ACK"]
|
||||
content_list = [
|
||||
custom_data[: len(custom_data) - 1].decode("utf-8"),
|
||||
hex(custom_data[-1]),
|
||||
]
|
||||
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
|
||||
):
|
||||
|
@ -80,6 +80,18 @@ def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
|
||||
pw.dlog(
|
||||
f"Mode Number {event_def.param1}, Mode Name {mode_name}, Submode: {event_def.param2}"
|
||||
)
|
||||
if info.name == "INDIVIDUAL_BOOT_COUNTS":
|
||||
boot_count_00 = (event_def.param1 >> 16) & 0xFFFF
|
||||
boot_count_01 = event_def.param1 & 0xFFFF
|
||||
boot_count_10 = (event_def.param2 >> 16) & 0xFFFF
|
||||
boot_count_11 = event_def.param2 & 0xFFFF
|
||||
pw.dlog(f"Boot count 0 0: {boot_count_00}")
|
||||
pw.dlog(f"Boot count 0 1: {boot_count_01}")
|
||||
pw.dlog(f"Boot count 1 0: {boot_count_10}")
|
||||
pw.dlog(f"Boot count 1 1: {boot_count_11}")
|
||||
if info.name == "REBOOT_COUNTER":
|
||||
boot_count = (event_def.param1 << 32) | event_def.param2
|
||||
pw.dlog(f"Total boot count: {boot_count}")
|
||||
if info.name == "VERSION_INFO":
|
||||
specific_handler = True
|
||||
ver_major = (event_def.param1 >> 24) & 0xFF
|
||||
|
@ -4,6 +4,7 @@ import logging
|
||||
|
||||
# from pus_tm.tcp_server_objects import TCP_SEVER_SENSOR_TEMPERATURES
|
||||
from eive_tmtc.tmtc.acs.acs_ctrl import handle_acs_ctrl_hk_data
|
||||
from eive_tmtc.tmtc.payload.ploc_mpsoc import handle_ploc_mpsoc_hk_data
|
||||
from eive_tmtc.tmtc.tcs.rtd import RTD_NAMES, handle_rtd_hk
|
||||
from eive_tmtc.tmtc.acs.star_tracker import handle_str_hk_data
|
||||
from eive_tmtc.tmtc.power.plpcdu import handle_plpcdu_hk
|
||||
@ -117,6 +118,10 @@ def handle_regular_hk_print(
|
||||
return handle_pdu_data(
|
||||
printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data
|
||||
)
|
||||
elif objb == obj_ids.PLOC_MPSOC_ID:
|
||||
return handle_ploc_mpsoc_hk_data(
|
||||
printer=printer, hk_data=hk_data, set_id=set_id
|
||||
)
|
||||
elif objb == obj_ids.ACU_HANDLER_ID:
|
||||
return handle_acu_hk_data(printer=printer, hk_data=hk_data, set_id=set_id)
|
||||
elif objb == obj_ids.RAD_SENSOR_ID:
|
||||
|
@ -979,7 +979,7 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes):
|
||||
pw.dlog(f"GPS Altitude: {alt} [m]")
|
||||
pw.dlog(f"GPS Position: {pos} [m]")
|
||||
pw.dlog(f"GPS Velocity: {velo} [m/s]")
|
||||
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=4)
|
||||
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=5)
|
||||
|
||||
|
||||
def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
||||
@ -1027,17 +1027,34 @@ def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
||||
|
||||
|
||||
def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
||||
safe_strat = {
|
||||
0: "OFF",
|
||||
1: "NO_MAG_FIELD_FOR_CONTROL",
|
||||
2: "NO_SENSORS_FOR_CONTROL",
|
||||
10: "ACTIVE_MEKF",
|
||||
11: "WITHOUT_MEKF",
|
||||
12: "ECLIPSE_DAMPING",
|
||||
13: "ECLIPSE_IDELING",
|
||||
20: "DETUMBLE_FULL",
|
||||
21: "DETUMBLE_DETERIORATED",
|
||||
}
|
||||
pw.dlog("Received CTRL Values Set")
|
||||
fmt_strat = "!B"
|
||||
fmt_quat = "!dddd"
|
||||
fmt_scalar = "!d"
|
||||
fmt_vec = "!ddd"
|
||||
inc_len_strat = struct.calcsize(fmt_strat)
|
||||
inc_len_quat = struct.calcsize(fmt_quat)
|
||||
inc_len_scalar = struct.calcsize(fmt_scalar)
|
||||
inc_len_vec = struct.calcsize(fmt_vec)
|
||||
if len(hk_data) < 2 * inc_len_quat + inc_len_scalar + inc_len_vec:
|
||||
if len(hk_data) < inc_len_strat + 2 * inc_len_quat + inc_len_scalar + inc_len_vec:
|
||||
pw.dlog("Received HK set too small")
|
||||
return
|
||||
current_idx = 0
|
||||
strat = struct.unpack(
|
||||
fmt_strat, hk_data[current_idx : current_idx + inc_len_strat]
|
||||
)[0]
|
||||
current_idx += inc_len_strat
|
||||
tgt_quat = [
|
||||
f"{val:8.3f}"
|
||||
for val in struct.unpack(
|
||||
@ -1066,11 +1083,15 @@ def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
||||
)
|
||||
]
|
||||
current_idx += inc_len_vec
|
||||
if safe_strat.get(strat) is not None:
|
||||
pw.dlog(f"{'Safe Ctrl Strategy'.ljust(25)}: {safe_strat[strat]}")
|
||||
else:
|
||||
pw.dlog(f"{'Safe Ctrl Strategy (key unknown)'.ljust(25)}: {strat}")
|
||||
pw.dlog(f"Control Values Target Quaternion: {tgt_quat}")
|
||||
pw.dlog(f"Control Values Error Quaternion: {err_quat}")
|
||||
pw.dlog(f"Control Values Error Angle: {err_ang} [deg]")
|
||||
pw.dlog(f"Control Values Target Rotational Rate: {tgt_rot} [deg/s]")
|
||||
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=4)
|
||||
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=5)
|
||||
|
||||
|
||||
def handle_act_cmd_data(pw: PrintWrapper, hk_data: bytes):
|
||||
|
@ -103,6 +103,7 @@ class OpCodes:
|
||||
TAKE_IMAGE = "take_image"
|
||||
UPLOAD_IMAGE = "upload_image"
|
||||
SET_IMG_PROCESSOR_MODE = "set_img_proc_mode"
|
||||
FW_UPDATE = "fw_update"
|
||||
|
||||
|
||||
class Info:
|
||||
@ -111,6 +112,7 @@ class Info:
|
||||
UPLOAD_IMAGE = "Upload Image"
|
||||
TAKE_IMAGE = "Take Image"
|
||||
SET_IMG_PROCESSOR_MODE = "Set Image Processor Mode"
|
||||
FW_UPDATE = "Firmware Update"
|
||||
|
||||
|
||||
class SetId(enum.IntEnum):
|
||||
@ -141,6 +143,7 @@ class FileDefs:
|
||||
firmware2_1 = "/home/pi/arcsec/firmware/sagitta-2-1.bin"
|
||||
firmware22_1 = "/home/pi/arcsec/firmware/sagitta-22-1.bin"
|
||||
firmware_origin = "/home/pi/arcsec/firmware/sagitta-origin.bin"
|
||||
FW_SLOT_Q7S = "/mnt/sd0/startracker/updates/sagitta-update.bin"
|
||||
|
||||
|
||||
json_dict = {
|
||||
@ -158,13 +161,15 @@ json_dict = {
|
||||
),
|
||||
}
|
||||
|
||||
firmware_dict = {
|
||||
FW_DICT = {
|
||||
"0": ("Firmware Update Q7S", FileDefs.FW_SLOT_Q7S),
|
||||
"1": ("Firmware Major = 2, Minor = 1", FileDefs.firmware2_1),
|
||||
"2": ("Firmware Major = 22, Minor = 1", FileDefs.firmware22_1),
|
||||
"3": ("Firmware Origin", FileDefs.firmware_origin),
|
||||
}
|
||||
|
||||
upload_image_dict = {
|
||||
UPLOAD_IMAGE_DICT = {
|
||||
"0": ("custom path", "Custom Path"),
|
||||
"1": ("q7s gemma", "/mnt/sd0/startracker/gemma.bin"),
|
||||
"2": ("egse gemma", "/home/pi/arcsec/star-images/gemma.bin"),
|
||||
"3": ("q7s polaris", "/mnt/sd0/startracker/polaris.bin"),
|
||||
@ -630,13 +635,13 @@ def pack_star_tracker_commands(
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "69":
|
||||
q.add_log_cmd("Star tracker: Firmware update")
|
||||
if op_code == OpCodes.FW_UPDATE:
|
||||
q.add_log_cmd(Info.FW_UPDATE)
|
||||
firmware = get_firmware()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionId.FIRMWARE_UPDATE)
|
||||
+ bytearray(firmware, "utf-8")
|
||||
+ firmware.encode()
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
|
||||
@ -681,17 +686,24 @@ def get_config_file() -> str:
|
||||
|
||||
def get_firmware() -> str:
|
||||
_LOGGER.info("Specify firmware file")
|
||||
input_helper = InputHelper(firmware_dict)
|
||||
bin_select = int(input("Use hardcoded paths (0) or specify path manually (1) ?: "))
|
||||
if bin_select == 0:
|
||||
input_helper = InputHelper(FW_DICT)
|
||||
key = input_helper.get_key()
|
||||
firmware = firmware_dict[key][1]
|
||||
firmware = FW_DICT[key][1]
|
||||
else:
|
||||
firmware = input("Specify absolute path of the firmware update file: ")
|
||||
return firmware
|
||||
|
||||
|
||||
def get_upload_image() -> str:
|
||||
_LOGGER.info("Specify image to upload")
|
||||
input_helper = InputHelper(upload_image_dict)
|
||||
input_helper = InputHelper(UPLOAD_IMAGE_DICT)
|
||||
key = input_helper.get_key()
|
||||
image = upload_image_dict[key][1]
|
||||
if UPLOAD_IMAGE_DICT[key][0] == "custom path":
|
||||
image = input("Please specify custom absolute path: ")
|
||||
else:
|
||||
image = UPLOAD_IMAGE_DICT[key][1]
|
||||
return image
|
||||
|
||||
|
||||
@ -797,8 +809,11 @@ def handle_solution_set(hk_data: bytes, pw: PrintWrapper):
|
||||
)
|
||||
pw.dlog(f"Number of close stars in LISA solution: {lisa_number_close_stars}")
|
||||
current_idx += fmt_len
|
||||
is_trusworthy = hk_data[current_idx]
|
||||
pw.dlog(f"Trustworthy solution: {is_trusworthy}")
|
||||
str_mode = hk_data[current_idx]
|
||||
pw.dlog(f"STR mode: {str_mode}")
|
||||
current_idx += 1
|
||||
is_trustworthy = hk_data[current_idx]
|
||||
pw.dlog(f"Trustworthy solution: {is_trustworthy}")
|
||||
current_idx += 1
|
||||
stable_count = struct.unpack("!I", hk_data[current_idx : current_idx + 4])[0]
|
||||
pw.dlog(f"Stable count: {stable_count}")
|
||||
@ -870,7 +885,7 @@ def add_str_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce.add("66", "Star Tracker: Set log level parameters")
|
||||
oce.add("67", "Star Tracker: Set log subscription parameters")
|
||||
oce.add("68", "Star Tracker: Set debug camera parameters")
|
||||
oce.add("69", "Star Tracker: Firmware update")
|
||||
oce.add(OpCodes.FW_UPDATE, Info.FW_UPDATE)
|
||||
oce.add("70", "Star Tracker: Disable timestamp generation")
|
||||
oce.add("71", "Star Tracker: Enable timestamp generation")
|
||||
defs.add_service(CustomServiceList.STAR_TRACKER.value, "Star Tracker", oce)
|
||||
|
@ -5,11 +5,13 @@
|
||||
@author J. Meier
|
||||
@date 22.11.2021
|
||||
"""
|
||||
import enum
|
||||
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
|
||||
from tmtccmd.tc.pus_20_fsfw_param import create_load_param_cmd
|
||||
|
||||
from tmtccmd.tc.pus_8_fsfw_funccmd import create_action_cmd
|
||||
from tmtccmd.pus.s20_fsfw_param_defs import create_scalar_u8_parameter
|
||||
|
||||
from tmtccmd.config.tmtc import (
|
||||
@ -28,16 +30,23 @@ class CommandId:
|
||||
PRINT_PDEC_MON = bytearray([0x0, 0x0, 0x0, 0x1])
|
||||
|
||||
|
||||
class ParameterId:
|
||||
class ParameterId(enum.IntEnum):
|
||||
POSITIVE_WINDOW = 0
|
||||
NEGATIVE_WINDOW = 1
|
||||
|
||||
|
||||
class ActionId(enum.IntEnum):
|
||||
RESET_NO_INIT = 2
|
||||
RESET_WITH_INIT = 3
|
||||
|
||||
|
||||
class OpCode:
|
||||
PRINT_CLCW = "print_clcw"
|
||||
PRINT_MON_REG = "print_mon_reg"
|
||||
POSITIVE_WINDOW = "positive_window"
|
||||
NEGATIVE_WINDOW = "negative_window"
|
||||
RESET_WITH_INIT = "reset_with_init"
|
||||
RESET_NO_INIT = "reset_no_init"
|
||||
|
||||
|
||||
class Info:
|
||||
@ -47,6 +56,8 @@ class Info:
|
||||
)
|
||||
POSITIVE_WINDOW = "Change positive window parameter for AD frames"
|
||||
NEGATIVE_WINDOW = "Change negative window parameter for AD frames"
|
||||
RESET_WITH_INIT = "Reset with full initialization"
|
||||
RESET_NO_INIT = "Reset with mandatory initialization"
|
||||
|
||||
|
||||
def pack_pdec_handler_test(
|
||||
@ -88,6 +99,16 @@ def pack_pdec_handler_test(
|
||||
).pack()
|
||||
)
|
||||
)
|
||||
if op_code == OpCode.RESET_NO_INIT:
|
||||
q.add_log_cmd(f"{prefix}: {Info.RESET_NO_INIT}")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(object_id=object_id, action_id=ActionId.RESET_NO_INIT)
|
||||
)
|
||||
if op_code == OpCode.RESET_WITH_INIT:
|
||||
q.add_log_cmd(f"{prefix}: {Info.RESET_WITH_INIT}")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(object_id=object_id, action_id=ActionId.RESET_WITH_INIT)
|
||||
)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
@ -97,4 +118,6 @@ def add_pdec_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce.add(OpCode.PRINT_MON_REG, Info.PRINT_MON_REG)
|
||||
oce.add(OpCode.POSITIVE_WINDOW, Info.POSITIVE_WINDOW)
|
||||
oce.add(OpCode.NEGATIVE_WINDOW, Info.NEGATIVE_WINDOW)
|
||||
oce.add(OpCode.RESET_WITH_INIT, Info.RESET_WITH_INIT)
|
||||
oce.add(OpCode.RESET_NO_INIT, Info.RESET_NO_INIT)
|
||||
defs.add_service(CustomServiceList.PDEC_HANDLER.value, "PDEC Handler", oce)
|
||||
|
@ -1,6 +1,8 @@
|
||||
import enum
|
||||
import logging
|
||||
import os
|
||||
import struct
|
||||
from pathlib import Path
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
|
||||
@ -11,6 +13,10 @@ from tmtccmd.config import TmtcDefinitionWrapper
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command
|
||||
from tmtccmd.tc.pus_20_fsfw_param import (
|
||||
create_scalar_u8_parameter,
|
||||
create_load_param_cmd,
|
||||
)
|
||||
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
|
||||
from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
@ -19,7 +25,6 @@ _LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ActionId(enum.IntEnum):
|
||||
LIST_DIR_INTO_FILE = 0
|
||||
ANNOUNCE_VERSION = 1
|
||||
ANNOUNCE_CURRENT_IMAGE = 2
|
||||
ANNOUNCE_BOOT_COUNTS = 3
|
||||
@ -35,6 +40,19 @@ class ActionId(enum.IntEnum):
|
||||
SWITCH_TO_BOTH_SD_CARDS = 18
|
||||
XSC_REBOOT = 32
|
||||
FULL_REBOOT = 34
|
||||
EXECUTE_SHELL_CMD_BLOCKING = 40
|
||||
EXECUTE_SHELL_CMD_NON_BLOCKING = 41
|
||||
SYSTEMCTL_CMD_EXECUTOR = 42
|
||||
LIST_DIR_INTO_FILE = 50
|
||||
LIST_DIR_DUMP_DIRECTLY = 51
|
||||
CP_HELPER = 52
|
||||
MV_HELPER = 53
|
||||
RM_HELPER = 54
|
||||
MKDIR_HELPER = 55
|
||||
|
||||
|
||||
class ParamId(enum.IntEnum):
|
||||
PREF_SD = 0
|
||||
|
||||
|
||||
class SetId(enum.IntEnum):
|
||||
@ -45,6 +63,16 @@ class OpCode:
|
||||
ANNOUNCE_VERSION = "announce_version"
|
||||
ANNOUNCE_CURRENT_IMAGE = "announce_current_image"
|
||||
ANNOUNCE_BOOT_COUNTS = "announce_boot_counts"
|
||||
EXECUTE_SHELL_CMD_BLOCKING = "exec_cmd_blocking"
|
||||
EXECUTE_SHELL_CMD_NON_BLOCKING = "exec_cmd_non_blocking"
|
||||
SYSTEMCTL_CMD_EXECUTOR = "systemctl_cmd"
|
||||
LIST_DIR_INTO_FILE = "list_dir_into_file"
|
||||
LIST_DIR_DUMP_DIRECTLY = "list_dir_dump_directly"
|
||||
CP_HELPER = "cp_helper"
|
||||
MV_HELPER = "mv_helper"
|
||||
RM_HELPER = "rm_helper"
|
||||
MKDIR_HELPER = "mkdir_helper"
|
||||
SET_PREF_SD = "set_pref_sd"
|
||||
REBOOT_XSC = ["reboot_xsc"]
|
||||
XSC_REBOOT_SELF = ["reboot_self"]
|
||||
XSC_REBOOT_0_0 = ["reboot_00"]
|
||||
@ -73,6 +101,10 @@ class Info:
|
||||
ANNOUNCE_VERSION = "Announce version"
|
||||
ANNOUNCE_CURRENT_IMAGE = "Announce current image"
|
||||
ANNOUNCE_BOOT_COUNTS = "Announce boot counts"
|
||||
SYSTEMCTL_CMD_EXECUTOR = "Perform systemctl command"
|
||||
EXECUTE_SHELL_CMD_BLOCKING = "Execute shell command blocking"
|
||||
EXECUTE_SHELL_CMD_NON_BLOCKING = "Execute shell command non-blocking"
|
||||
SET_PREF_SD = "Set preferred SD card"
|
||||
REBOOT_XSC = "XSC reboot with prompt"
|
||||
REBOOT_FULL = "Full regular reboot"
|
||||
OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0"
|
||||
@ -81,6 +113,12 @@ class Info:
|
||||
SWITCH_TO_SD_0 = "Switch to SD card 0"
|
||||
SWITCH_TO_SD_1 = "Switch to SD card 1"
|
||||
SWITCH_TO_BOTH_SD_CARDS = "Switch to both SD cards with specified active card"
|
||||
LIST_DIR_INTO_FILE = "List directory, dump output into file"
|
||||
LIST_DIR_DUMP_DIRECTLY = "List directory, dump content directly"
|
||||
CP_HELPER = "Filesystem Copy Helper"
|
||||
MV_HELPER = "Filesystem Move Helper"
|
||||
RM_HELPER = "Filesystem Removal Helper"
|
||||
MKDIR_HELPER = "Filesystem Directory Creation Helper"
|
||||
|
||||
|
||||
class Chip(enum.IntEnum):
|
||||
@ -95,6 +133,12 @@ class Copy(enum.IntEnum):
|
||||
NONE = 2
|
||||
|
||||
|
||||
class SystemctlCmd(enum.IntEnum):
|
||||
START = 0
|
||||
STOP = 1
|
||||
RESTART = 2
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
@ -109,9 +153,18 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
||||
oce.add(keys=OpCode.XSC_REBOOT_0_1, info="Reboot 0 1")
|
||||
oce.add(keys=OpCode.XSC_REBOOT_1_0, info="Reboot 1 0")
|
||||
oce.add(keys=OpCode.XSC_REBOOT_1_1, info="Reboot 1 1")
|
||||
oce.add(keys=OpCode.SET_PREF_SD, info=Info.SET_PREF_SD)
|
||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
|
||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0)
|
||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
|
||||
oce.add(keys=OpCode.SYSTEMCTL_CMD_EXECUTOR, info=Info.SYSTEMCTL_CMD_EXECUTOR)
|
||||
oce.add(
|
||||
keys=OpCode.EXECUTE_SHELL_CMD_BLOCKING, info=Info.EXECUTE_SHELL_CMD_BLOCKING
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCode.EXECUTE_SHELL_CMD_NON_BLOCKING,
|
||||
info=Info.EXECUTE_SHELL_CMD_NON_BLOCKING,
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCode.GET_HK,
|
||||
info="Request housekeeping set",
|
||||
@ -150,6 +203,12 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
||||
oce.add(keys=OpCode.SWITCH_TO_SD_0, info=Info.SWITCH_TO_SD_0)
|
||||
oce.add(keys=OpCode.SWITCH_TO_SD_1, info=Info.SWITCH_TO_SD_1)
|
||||
oce.add(keys=OpCode.SWITCH_TO_BOTH_SD_CARDS, info=Info.SWITCH_TO_BOTH_SD_CARDS)
|
||||
oce.add(keys=OpCode.LIST_DIR_INTO_FILE, info=Info.LIST_DIR_INTO_FILE)
|
||||
oce.add(keys=OpCode.LIST_DIR_DUMP_DIRECTLY, info=Info.LIST_DIR_DUMP_DIRECTLY)
|
||||
oce.add(keys=OpCode.MV_HELPER, info=Info.MV_HELPER)
|
||||
oce.add(keys=OpCode.CP_HELPER, info=Info.CP_HELPER)
|
||||
oce.add(keys=OpCode.RM_HELPER, info=Info.RM_HELPER)
|
||||
oce.add(keys=OpCode.MKDIR_HELPER, info=Info.MKDIR_HELPER)
|
||||
defs.add_service(CustomServiceList.CORE.value, "Core Controller", oce)
|
||||
|
||||
|
||||
@ -184,6 +243,41 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
)
|
||||
elif op_code in OpCode.XSC_REBOOT_SELF:
|
||||
add_xsc_reboot_cmd(q=q, reboot_self=True)
|
||||
elif op_code == OpCode.SYSTEMCTL_CMD_EXECUTOR:
|
||||
print("systemctl command types: ")
|
||||
for entry in SystemctlCmd:
|
||||
print(f"{entry}: {entry.name}")
|
||||
systemctl_cmd = SystemctlCmd(
|
||||
int(input("Specify systemctl command type by key: "))
|
||||
)
|
||||
unit_name = input("Specify unit name: ")
|
||||
cmd_data = bytearray([systemctl_cmd])
|
||||
cmd_data.extend(unit_name.encode())
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionId.SYSTEMCTL_CMD_EXECUTOR,
|
||||
user_data=cmd_data,
|
||||
)
|
||||
)
|
||||
elif op_code == OpCode.EXECUTE_SHELL_CMD_BLOCKING:
|
||||
custom_cmd = input("Please specify command to execute: ")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionId.EXECUTE_SHELL_CMD_BLOCKING,
|
||||
user_data=custom_cmd.encode(),
|
||||
)
|
||||
)
|
||||
elif op_code == OpCode.EXECUTE_SHELL_CMD_NON_BLOCKING:
|
||||
custom_cmd = input("Please specify command to execute: ")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionId.EXECUTE_SHELL_CMD_NON_BLOCKING,
|
||||
user_data=custom_cmd.encode(),
|
||||
)
|
||||
)
|
||||
elif op_code in OpCode.XSC_REBOOT_0_0:
|
||||
add_xsc_reboot_cmd(
|
||||
q=q, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM
|
||||
@ -283,12 +377,114 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
q.add_log_cmd("Requesting housekeeping set")
|
||||
sid = make_sid(object_id=CORE_CONTROLLER_ID, set_id=SetId.HK)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
elif op_code in OpCode.SET_PREF_SD:
|
||||
q.add_log_cmd("Set preferred SD card")
|
||||
pref_sd = int(
|
||||
input("Specify which SD card to set as the preferred one (0/1): ")
|
||||
)
|
||||
if pref_sd not in [0, 1]:
|
||||
raise ValueError("Only 0 or 1 allowed for preferred SD card")
|
||||
q.add_pus_tc(
|
||||
create_load_param_cmd(
|
||||
create_scalar_u8_parameter(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
domain_id=0,
|
||||
unique_id=ParamId.PREF_SD,
|
||||
parameter=pref_sd,
|
||||
).pack()
|
||||
)
|
||||
)
|
||||
elif op_code == OpCode.CP_HELPER:
|
||||
cp_recursive = int(input("Copy recursively (0/1) ?: "))
|
||||
if cp_recursive not in [0, 1]:
|
||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||
user_data = bytearray([cp_recursive])
|
||||
user_data.extend(packet_source_dest_path("Copy"))
|
||||
q.add_log_cmd(Info.CP_HELPER)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.CP_HELPER, user_data)
|
||||
)
|
||||
elif op_code == OpCode.MV_HELPER:
|
||||
user_data = packet_source_dest_path("Move")
|
||||
q.add_log_cmd(Info.MV_HELPER)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.MV_HELPER, user_data)
|
||||
)
|
||||
elif op_code == OpCode.RM_HELPER:
|
||||
rm_recursive = int(input("Remove with recursive (-r) option (0/1) ?: "))
|
||||
if rm_recursive not in [0, 1]:
|
||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||
rm_force = int(input("Remove with force (-f) option (0/1) ?: "))
|
||||
if rm_force not in [0, 1]:
|
||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||
user_data = bytearray([rm_recursive, rm_force])
|
||||
removed_file_or_dir = input("Specify absolute path to be removed: ")
|
||||
user_data.extend(removed_file_or_dir.encode())
|
||||
user_data.append(0)
|
||||
q.add_log_cmd(Info.RM_HELPER)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.RM_HELPER, user_data)
|
||||
)
|
||||
elif op_code == OpCode.LIST_DIR_INTO_FILE:
|
||||
q.add_log_cmd(Info.LIST_DIR_INTO_FILE)
|
||||
user_data = list_directory_base_user_data()
|
||||
dest_file_path = input("Destination file path: ")
|
||||
user_data.extend(dest_file_path.encode())
|
||||
user_data.append(0)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
CORE_CONTROLLER_ID, ActionId.LIST_DIR_INTO_FILE, user_data
|
||||
)
|
||||
)
|
||||
elif op_code == OpCode.LIST_DIR_DUMP_DIRECTLY:
|
||||
q.add_log_cmd(Info.LIST_DIR_DUMP_DIRECTLY)
|
||||
user_data = list_directory_base_user_data()
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
CORE_CONTROLLER_ID, ActionId.LIST_DIR_DUMP_DIRECTLY, user_data
|
||||
)
|
||||
)
|
||||
elif op_code == OpCode.MKDIR_HELPER:
|
||||
q.add_log_cmd(Info.MKDIR_HELPER)
|
||||
user_data = input("Specify absolute path of newly created directory: ")
|
||||
user_data = bytearray(user_data.encode())
|
||||
user_data.append(0)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.MKDIR_HELPER, user_data)
|
||||
)
|
||||
else:
|
||||
_LOGGER.warning(
|
||||
f"Unknown operation code {op_code} for core controller commands"
|
||||
)
|
||||
|
||||
|
||||
def list_directory_base_user_data() -> bytearray:
|
||||
all_opt = int(input("Use all (-a) option (0/1) ?: "))
|
||||
if all_opt not in [0, 1]:
|
||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||
recursive_opt = int(input("Use recursive (-R) option (0/1) ?: "))
|
||||
if recursive_opt not in [0, 1]:
|
||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||
compression_opt = int(input("Compress target file (0/1) ?: "))
|
||||
if compression_opt not in [0, 1]:
|
||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||
listing_path = input("Specify listing path (absolute path): ")
|
||||
user_data = bytearray([all_opt, recursive_opt, compression_opt])
|
||||
user_data.extend(listing_path.encode())
|
||||
user_data.append(0)
|
||||
return user_data
|
||||
|
||||
|
||||
def packet_source_dest_path(context: str) -> bytes:
|
||||
source = input(f"Specify {context} source file: ")
|
||||
dest = input(f"Specify {context} destination file: ")
|
||||
raw_src_dest = bytearray(source.encode())
|
||||
raw_src_dest.append(0)
|
||||
raw_src_dest.extend(dest.encode())
|
||||
raw_src_dest.append(0)
|
||||
return raw_src_dest
|
||||
|
||||
|
||||
def reset_specific_boot_counter(q: DefaultPusQueueHelper, chip: int, copy: int):
|
||||
q.add_log_cmd(f"Resetting boot counter {chip} {copy}")
|
||||
q.add_pus_tc(
|
||||
@ -397,3 +593,49 @@ def handle_core_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
|
||||
)
|
||||
pw.dlog(printout)
|
||||
printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=3)
|
||||
|
||||
|
||||
def handle_core_ctrl_action_replies(
|
||||
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytes
|
||||
):
|
||||
pw = PrintWrapper(printer)
|
||||
if action_id == ActionId.LIST_DIR_DUMP_DIRECTLY:
|
||||
if len(custom_data) < 4:
|
||||
_LOGGER.warning("Data unexpectedly small")
|
||||
return
|
||||
seq_idx = struct.unpack("!I", custom_data[0:4])[0]
|
||||
total_chunks = struct.unpack("!I", custom_data[4:8])[0]
|
||||
compressed = custom_data[8]
|
||||
ls_cmd = custom_data[9:].split(b"\x00")[0].decode()
|
||||
# Include length of NULL termination
|
||||
file_data_offset = 9 + len(ls_cmd) + 1
|
||||
pw.dlog(
|
||||
f"Received directory listing dump for ls command {ls_cmd}. "
|
||||
f"Chunk {seq_idx + 1}/{total_chunks}"
|
||||
)
|
||||
|
||||
def remove_if_exists_and_new(seq_idx_: int, path_: Path):
|
||||
if seq_idx_ == 0 and path_.exists():
|
||||
os.remove(path_)
|
||||
|
||||
if compressed:
|
||||
path = Path("dir_listing.txt.gz")
|
||||
remove_if_exists_and_new(seq_idx, path)
|
||||
pw.dlog(
|
||||
f"Compression option: {compressed}. Dumping file into dir_listing.txt.gz"
|
||||
)
|
||||
with open(path, "ab") as listing_file:
|
||||
listing_file.write(custom_data[file_data_offset:])
|
||||
else:
|
||||
path = Path("dir_listing.txt")
|
||||
remove_if_exists_and_new(seq_idx, path)
|
||||
pw.dlog(
|
||||
f"Compression option: {compressed}. Dumping file into dir_listing.txt"
|
||||
)
|
||||
with open(path, "a") as listing_file:
|
||||
listing_file_str = custom_data[file_data_offset:].decode()
|
||||
listing_file.write(listing_file_str)
|
||||
if seq_idx + 1 == total_chunks:
|
||||
pw.dlog("Full directory listing: ")
|
||||
with open("dir_listing.txt", "r") as listing_file:
|
||||
print(listing_file.read())
|
||||
|
@ -6,12 +6,14 @@
|
||||
@author J. Meier
|
||||
@date 06.03.2021
|
||||
"""
|
||||
import dataclasses
|
||||
import logging
|
||||
import struct
|
||||
import enum
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.config.object_ids import get_object_ids, PLOC_MPSOC_ID
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.config.tmtc import (
|
||||
tmtc_definitions_provider,
|
||||
OpCodeEntry,
|
||||
@ -22,38 +24,44 @@ from tmtccmd.tc import service_provider
|
||||
from tmtccmd.tc.decorator import ServiceProviderParams
|
||||
from eive_tmtc.utility.input_helper import InputHelper
|
||||
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
|
||||
|
||||
from tmtccmd.tc.pus_8_fsfw_funccmd import create_action_cmd
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
MANUAL_INPUT = "1"
|
||||
|
||||
flash_write_file_dict = {
|
||||
MANUAL_INPUT: ["manual input", ""],
|
||||
"2": ["/mnt/sd0/ploc/mpsoc/flash_write.bin", "/mnt/sd0/ploc/mpsoc/flash_write.bin"],
|
||||
FLASH_WRITE_FILE_DICT = {
|
||||
MANUAL_INPUT: ("manual input", ""),
|
||||
"2": ("/mnt/sd0/ploc/mpsoc/flash_write.bin", "/mnt/sd0/ploc/mpsoc/flash_write.bin"),
|
||||
}
|
||||
|
||||
mpsoc_file_dict = {
|
||||
MANUAL_INPUT: ["manual input", ""],
|
||||
"2": ["0:/flash", "0:/flash"],
|
||||
MPSOC_FILE_DICT = {
|
||||
MANUAL_INPUT: ("manual input", ""),
|
||||
"2": ("0:/flash", "0:/flash"),
|
||||
}
|
||||
|
||||
SEQ_FILE_NAMES = ["0:/EM16/231", "0:/EQ04/E-75", "0:/EQ01/E130"]
|
||||
SEQ_FILE_DICT = {
|
||||
MANUAL_INPUT: ["manual input", ""],
|
||||
"2": [f"16QRM On Carrier 200 MBd ({SEQ_FILE_NAMES[0]})", f"{SEQ_FILE_NAMES[0]}"],
|
||||
"3": [f"QPSK On Carrier 780 MBd ({SEQ_FILE_NAMES[1]})", f"{SEQ_FILE_NAMES[1]}"],
|
||||
"4": [f"Maximum Bandwidth QPSK ({SEQ_FILE_NAMES[2]})", f"{SEQ_FILE_NAMES[2]}"],
|
||||
MANUAL_INPUT: ("manual input", ""),
|
||||
"2": (f"16QRM On Carrier 200 MBd ({SEQ_FILE_NAMES[0]})", f"{SEQ_FILE_NAMES[0]}"),
|
||||
"3": (f"QPSK On Carrier 780 MBd ({SEQ_FILE_NAMES[1]})", f"{SEQ_FILE_NAMES[1]}"),
|
||||
"4": (f"Maximum Bandwidth QPSK ({SEQ_FILE_NAMES[2]})", f"{SEQ_FILE_NAMES[2]}"),
|
||||
}
|
||||
|
||||
|
||||
CARRIAGE_RETURN = 0xD
|
||||
|
||||
|
||||
class CommandId(enum.IntEnum):
|
||||
class SetId(enum.IntEnum):
|
||||
HK_ID = 0
|
||||
|
||||
|
||||
class ActionId(enum.IntEnum):
|
||||
TC_MEM_WRITE = 1
|
||||
TC_MEM_READ = 2
|
||||
FLASH_WRITE = 9
|
||||
TM_MEM_READ_RPT = 6
|
||||
TC_FLASH_WRITE_FULL_FILE = 9
|
||||
TC_FLASH_DELETE = 10
|
||||
TC_REPLAY_START = 11
|
||||
TC_REPLAY_STOP = 12
|
||||
@ -64,28 +72,40 @@ class CommandId(enum.IntEnum):
|
||||
TC_MODE_REPLAY = 16
|
||||
TC_CAM_CMD_SEND = 17
|
||||
TC_MODE_IDLE = 18
|
||||
TM_CAM_CMD_RPT = 19
|
||||
SET_UART_TX_TRISTATE = 20
|
||||
RELEASE_UART_TX = 21
|
||||
TC_CAM_TAKE_PIC = 22
|
||||
TC_SIMPLEX_SEND_FILE = 23
|
||||
TC_DOWNLINK_DATA_MODULATE = 24
|
||||
TC_MODE_SNAPSHOT = 25
|
||||
TC_FLASH_DIR_GET_CONTENT = 28
|
||||
TM_FLASH_DIRECTORY_CONTENT = 29
|
||||
TC_FLASH_READ_FULL_FILE = 30
|
||||
|
||||
|
||||
class OpCode:
|
||||
ON = ["on"]
|
||||
OFF = ["off"]
|
||||
NORMAL = ["normal"]
|
||||
VERIFY_BOOT = ["verify_boot"]
|
||||
MODE_REPLAY = ["mode_replay"]
|
||||
MODE_IDLE = ["mode_idle"]
|
||||
REPLAY_WRITE_SEQ = ["replay_write"]
|
||||
DOWNLINK_PWR_ON = ["downlink_pwr_on"]
|
||||
REPLAY_START = ["replay_start"]
|
||||
CAM_TAKE_PIC = ["cam_take_pic"]
|
||||
SIMPLEX_SEND_FILE = ["simplex_send_file"]
|
||||
DOWNLINK_DATA_MODULATE = ["downlink_data_modulate"]
|
||||
MODE_SNAPSHOT = ["mode_snapshot"]
|
||||
ON = "on"
|
||||
OFF = "off"
|
||||
NORMAL = "normal"
|
||||
VERIFY_BOOT = "verify_boot"
|
||||
MODE_REPLAY = "mode_replay"
|
||||
MODE_IDLE = "mode_idle"
|
||||
REPLAY_WRITE_SEQ = "replay_write"
|
||||
DOWNLINK_PWR_ON = "downlink_pwr_on"
|
||||
MEM_WRITE = "memory_write"
|
||||
MEM_READ = "memory_read"
|
||||
DOWNLINK_PWR_OFF = "downlink_pwr_off"
|
||||
FLASH_WRITE_FILE = "flash_write_file"
|
||||
FLASH_READ_FILE = "flash_read_file"
|
||||
FLASH_DELETE_FILE = "flash_delete_file"
|
||||
FLASH_GET_DIR_CONTENT = "flash_get_dir_content"
|
||||
REPLAY_STOP = "replay_stop"
|
||||
REPLAY_START = "replay_start"
|
||||
CAM_TAKE_PIC = "cam_take_pic"
|
||||
SIMPLEX_SEND_FILE = "simplex_send_file"
|
||||
DOWNLINK_DATA_MODULATE = "downlink_data_modulate"
|
||||
MODE_SNAPSHOT = "mode_snapshot"
|
||||
|
||||
|
||||
class Info:
|
||||
@ -94,12 +114,18 @@ class Info:
|
||||
NORMAL = "Normal"
|
||||
VERIFY_BOOT = "Verify boot by reading 0xdeadbeef from DEADBEEF address"
|
||||
MODE_REPLAY = "Switch to REPLAY mode"
|
||||
REPLAY_STOP = "Stop Replay"
|
||||
MODE_IDLE = "Switch to IDLE mode"
|
||||
REPLAY_WRITE_SEQ = "Replay write sequence"
|
||||
DOWNLINK_PWR_ON = "Downlink Power On"
|
||||
DOWNLINK_PWR_OFF = "Downlink Power Off"
|
||||
REPLAY_START = "Replay Start"
|
||||
CAM_TAKE_PIC = "Cam Take Picture"
|
||||
SIMPLEX_SEND_FILE = "Simplex Send File"
|
||||
FLASH_READ_FILE = "Copy file from MPSoC to OBC"
|
||||
FLASH_WRITE_FILE = "Copy file from OBC to MPSoC"
|
||||
FLASH_DELETE_FILE = "Delete file on MPSoC"
|
||||
FLASH_GET_DIR_CONTENT = "Get flash directory content on MPSoC"
|
||||
DOWNLINK_DATA_MODULATE = "Downlink data modulate"
|
||||
MODE_SNAPSHOT = "Mode Snapshot"
|
||||
|
||||
@ -108,28 +134,25 @@ class MemAddresses(enum.IntEnum):
|
||||
DEADBEEF = 0x40000004
|
||||
|
||||
|
||||
class PlocReplyIds(enum.IntEnum):
|
||||
TM_MEM_READ_RPT = 6
|
||||
TM_CAM_CMD_RPT = 19
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_ploc_mpsoc_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(OpCode.OFF, Info.OFF)
|
||||
oce.add(OpCode.ON, Info.ON)
|
||||
oce.add(OpCode.NORMAL, Info.NORMAL)
|
||||
oce.add("3", "Ploc MPSoC: Memory write")
|
||||
oce.add("4", "Ploc MPSoC: Memory read")
|
||||
oce.add("5", "Ploc MPSoC: Flash write")
|
||||
oce.add("6", "Ploc MPSoC: Flash delete")
|
||||
oce.add(OpCode.MEM_WRITE, "Ploc MPSoC: Memory write")
|
||||
oce.add(OpCode.MEM_READ, "Ploc MPSoC: Memory read")
|
||||
oce.add(OpCode.FLASH_WRITE_FILE, Info.FLASH_WRITE_FILE)
|
||||
oce.add(OpCode.FLASH_READ_FILE, Info.FLASH_READ_FILE)
|
||||
oce.add(OpCode.FLASH_DELETE_FILE, Info.FLASH_DELETE_FILE)
|
||||
oce.add(OpCode.FLASH_GET_DIR_CONTENT, Info.FLASH_GET_DIR_CONTENT)
|
||||
oce.add(OpCode.REPLAY_START, Info.REPLAY_START)
|
||||
oce.add("8", "Ploc MPSoC: Replay stop")
|
||||
oce.add(OpCode.REPLAY_STOP, Info.REPLAY_STOP)
|
||||
oce.add(OpCode.DOWNLINK_PWR_ON, Info.DOWNLINK_PWR_ON)
|
||||
oce.add("10", "Ploc MPSoC: Downlink pwr off")
|
||||
oce.add(OpCode.DOWNLINK_PWR_OFF, Info.DOWNLINK_PWR_OFF)
|
||||
oce.add(OpCode.REPLAY_WRITE_SEQ, Info.REPLAY_WRITE_SEQ)
|
||||
oce.add("12", "Ploc MPSoC: OBSW reset sequence count")
|
||||
oce.add(OpCode.VERIFY_BOOT, "Ploc MPSoC: Read DEADBEEF address")
|
||||
oce.add(OpCode.VERIFY_BOOT, Info.VERIFY_BOOT)
|
||||
oce.add(OpCode.MODE_REPLAY, Info.MODE_REPLAY)
|
||||
oce.add(OpCode.MODE_IDLE, Info.MODE_IDLE)
|
||||
oce.add("16", "Ploc MPSoC: Tc cam command send")
|
||||
@ -152,19 +175,19 @@ def pack_ploc_mpsoc_commands(p: ServiceProviderParams):
|
||||
f"Generate command for PLOC MPSoC with object id: {object_id.as_hex_string}"
|
||||
)
|
||||
obyt = object_id.as_bytes
|
||||
if op_code in OpCode.OFF:
|
||||
if op_code == OpCode.OFF:
|
||||
q.add_log_cmd(f"{prefix}: {Info.OFF}")
|
||||
command = pack_mode_data(obyt, Mode.OFF, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||
if op_code in OpCode.ON:
|
||||
if op_code == OpCode.ON:
|
||||
q.add_log_cmd(f"{prefix}: {Info.ON}")
|
||||
data = pack_mode_data(obyt, Mode.ON, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code in OpCode.NORMAL:
|
||||
if op_code == OpCode.NORMAL:
|
||||
q.add_log_cmd(f"{prefix}: {Info.NORMAL}")
|
||||
data = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == "3":
|
||||
if op_code == OpCode.MEM_WRITE:
|
||||
q.add_log_cmd("PLOC MPSoC: TC mem write test")
|
||||
memory_address = int(
|
||||
input("PLOC MPSoC: Tc Mem Write: Type memory address: 0x"), 16
|
||||
@ -180,11 +203,15 @@ def pack_ploc_mpsoc_commands(p: ServiceProviderParams):
|
||||
q.add_log_cmd("PLOC MPSoC: TC mem read test")
|
||||
data = prepare_mem_read_command(object_id=object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "5":
|
||||
q.add_log_cmd("PLOC MPSoC: Flash write")
|
||||
if op_code == OpCode.FLASH_WRITE_FILE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.FLASH_WRITE_FILE}")
|
||||
data = prepare_flash_write_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "6":
|
||||
if op_code == OpCode.FLASH_READ_FILE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.FLASH_READ_FILE}")
|
||||
data = prepare_flash_read_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == OpCode.FLASH_DELETE_FILE:
|
||||
q.add_log_cmd("PLOC MPSoC: Flash delete")
|
||||
data = prepare_flash_delete_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
@ -192,76 +219,88 @@ def pack_ploc_mpsoc_commands(p: ServiceProviderParams):
|
||||
q.add_log_cmd(f"{prefix}: {Info.REPLAY_START}")
|
||||
data = prepare_replay_start_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "8":
|
||||
if op_code == OpCode.REPLAY_STOP:
|
||||
q.add_log_cmd("PLOC MPSoC: Replay stop")
|
||||
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_REPLAY_STOP)
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_REPLAY_STOP)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.DOWNLINK_PWR_ON:
|
||||
if op_code == OpCode.DOWNLINK_PWR_ON:
|
||||
q.add_log_cmd(f"{prefix}: {OpCode.DOWNLINK_PWR_ON}")
|
||||
data = prepare_downlink_pwr_on_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "10":
|
||||
if op_code == OpCode.DOWNLINK_PWR_OFF:
|
||||
q.add_log_cmd("PLOC MPSoC: Downlink pwr off")
|
||||
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_DOWNLINK_PWR_OFF)
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_DOWNLINK_PWR_OFF)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.REPLAY_WRITE_SEQ:
|
||||
if op_code == OpCode.FLASH_GET_DIR_CONTENT:
|
||||
q.add_log_cmd(f"{prefix}: {Info.FLASH_GET_DIR_CONTENT}")
|
||||
dir_name = input("Please specify MPSoC directory name to get information for: ")
|
||||
dir_name = bytearray(dir_name.encode("utf-8"))
|
||||
dir_name.append(0)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=object_id.as_bytes,
|
||||
action_id=ActionId.TC_FLASH_DIR_GET_CONTENT,
|
||||
user_data=dir_name,
|
||||
)
|
||||
)
|
||||
if op_code == OpCode.REPLAY_WRITE_SEQ:
|
||||
q.add_log_cmd(f"{prefix}: {Info.REPLAY_WRITE_SEQ}")
|
||||
data = prepare_replay_write_sequence_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "12":
|
||||
q.add_log_cmd("PLOC MPSoC: Reset OBSW sequence count")
|
||||
data = object_id.as_bytes + struct.pack("!I", CommandId.OBSW_RESET_SEQ_COUNT)
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.OBSW_RESET_SEQ_COUNT)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.VERIFY_BOOT:
|
||||
if op_code == OpCode.VERIFY_BOOT:
|
||||
num_words = 1
|
||||
q.add_log_cmd(f"{prefix} {Info.VERIFY_BOOT}")
|
||||
data = (
|
||||
object_id.as_bytes
|
||||
+ struct.pack("!I", CommandId.TC_MEM_READ)
|
||||
+ struct.pack("!I", ActionId.TC_MEM_READ)
|
||||
+ struct.pack("!I", MemAddresses.DEADBEEF)
|
||||
+ struct.pack("!H", num_words)
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.MODE_REPLAY:
|
||||
if op_code == OpCode.MODE_REPLAY:
|
||||
q.add_log_cmd("PLOC MPSoC: Tc mode replay")
|
||||
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_MODE_REPLAY)
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_REPLAY)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.MODE_IDLE:
|
||||
if op_code == OpCode.MODE_IDLE:
|
||||
q.add_log_cmd("PLOC MPSoC: Tc mode idle")
|
||||
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_MODE_IDLE)
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_IDLE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "16":
|
||||
q.add_log_cmd("PLOC MPSoC: Tc cam command send")
|
||||
cam_cmd = input("Specify cam command string: ")
|
||||
data = (
|
||||
object_id.as_bytes
|
||||
+ struct.pack("!I", CommandId.TC_CAM_CMD_SEND)
|
||||
+ struct.pack("!I", ActionId.TC_CAM_CMD_SEND)
|
||||
+ bytearray(cam_cmd, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "17":
|
||||
q.add_log_cmd("PLOC MPSoC: Set UART TX tristate")
|
||||
data = object_id.as_bytes + struct.pack("!I", CommandId.SET_UART_TX_TRISTATE)
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.SET_UART_TX_TRISTATE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "18":
|
||||
q.add_log_cmd("PLOC MPSoC: Release UART TX")
|
||||
data = object_id.as_bytes + struct.pack("!I", CommandId.RELEASE_UART_TX)
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.RELEASE_UART_TX)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.CAM_TAKE_PIC:
|
||||
if op_code == OpCode.CAM_TAKE_PIC:
|
||||
q.add_log_cmd("PLOC MPSoC: Cam take picture")
|
||||
data = prepare_cam_take_pic_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.SIMPLEX_SEND_FILE:
|
||||
if op_code == OpCode.SIMPLEX_SEND_FILE:
|
||||
q.add_log_cmd("PLOC MPSoC: Simplex send file")
|
||||
data = prepare_simplex_send_file_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.DOWNLINK_DATA_MODULATE:
|
||||
if op_code == OpCode.DOWNLINK_DATA_MODULATE:
|
||||
q.add_log_cmd("PLOC MPSoC: Downlink data modulate")
|
||||
data = prepare_downlink_data_modulate_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code in OpCode.MODE_SNAPSHOT:
|
||||
if op_code == OpCode.MODE_SNAPSHOT:
|
||||
q.add_log_cmd("PLOC MPSoC: Mode snapshot")
|
||||
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_MODE_SNAPSHOT)
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_SNAPSHOT)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
|
||||
|
||||
@ -278,7 +317,7 @@ def generate_write_mem_command(
|
||||
"""
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_MEM_WRITE)
|
||||
+ struct.pack("!I", ActionId.TC_MEM_WRITE)
|
||||
+ struct.pack("!I", memory_address)
|
||||
+ struct.pack("!H", mem_len)
|
||||
+ struct.pack("!I", memory_data)
|
||||
@ -291,31 +330,40 @@ def prepare_mem_read_command(object_id: bytes) -> bytearray:
|
||||
num_words = int(input("PLOC MPSoC specify number of words (32-bit) to read: "))
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_MEM_READ)
|
||||
+ struct.pack("!I", ActionId.TC_MEM_READ)
|
||||
+ struct.pack("!I", memory_address)
|
||||
+ struct.pack("!H", num_words)
|
||||
)
|
||||
return bytearray(command)
|
||||
|
||||
|
||||
def prepare_flash_write_cmd(object_id: bytes) -> bytearray:
|
||||
def prepare_flash_base_cmd(action_id: int, object_id: bytes) -> bytearray:
|
||||
obc_file = get_obc_file()
|
||||
mpsoc_file = get_mpsoc_file()
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.FLASH_WRITE)
|
||||
+ bytearray(obc_file, "utf-8")
|
||||
+ bytearray(mpsoc_file, "utf-8")
|
||||
)
|
||||
return bytearray(command)
|
||||
command = bytearray(object_id)
|
||||
command.extend(struct.pack("!I", action_id))
|
||||
command.extend(obc_file.encode("utf-8"))
|
||||
command.append(0)
|
||||
command.extend(mpsoc_file.encode("utf-8"))
|
||||
command.append(0)
|
||||
return command
|
||||
|
||||
|
||||
def prepare_flash_write_cmd(object_id: bytes) -> bytearray:
|
||||
return prepare_flash_base_cmd(ActionId.TC_FLASH_WRITE_FULL_FILE, object_id)
|
||||
|
||||
|
||||
def prepare_flash_read_cmd(object_id: bytes) -> bytearray:
|
||||
cmd = prepare_flash_base_cmd(ActionId.TC_FLASH_READ_FULL_FILE, object_id)
|
||||
file_size = get_mpsoc_file_size()
|
||||
cmd.extend(struct.pack("!I", file_size))
|
||||
return cmd
|
||||
|
||||
|
||||
def prepare_flash_delete_cmd(object_id: bytes) -> bytearray:
|
||||
file = get_mpsoc_file()
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_FLASH_DELETE)
|
||||
+ bytearray(file, "utf-8")
|
||||
object_id + struct.pack("!I", ActionId.TC_FLASH_DELETE) + file.encode("utf-8")
|
||||
)
|
||||
return bytearray(command)
|
||||
|
||||
@ -324,7 +372,7 @@ def prepare_replay_start_cmd(object_id: bytes) -> bytearray:
|
||||
replay = int(input("Specify replay mode (0 - once, 1 - repeated): "))
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_REPLAY_START)
|
||||
+ struct.pack("!I", ActionId.TC_REPLAY_START)
|
||||
+ struct.pack("!B", replay)
|
||||
)
|
||||
return bytearray(command)
|
||||
@ -335,7 +383,7 @@ def prepare_downlink_pwr_on_cmd(object_id: bytes) -> bytearray:
|
||||
lane_rate = int(input("Specify lane rate (0 - 9): "))
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_DOWNLINK_PWR_ON)
|
||||
+ struct.pack("!I", ActionId.TC_DOWNLINK_PWR_ON)
|
||||
+ struct.pack("!B", mode)
|
||||
+ struct.pack("!B", lane_rate)
|
||||
)
|
||||
@ -347,7 +395,7 @@ def prepare_replay_write_sequence_cmd(object_id: bytes) -> bytearray:
|
||||
file = get_sequence_file()
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_REPLAY_WRITE_SEQUENCE)
|
||||
+ struct.pack("!I", ActionId.TC_REPLAY_WRITE_SEQUENCE)
|
||||
+ struct.pack("!B", use_decoding)
|
||||
+ bytearray(file, "utf-8")
|
||||
# + bytes([0])
|
||||
@ -377,7 +425,7 @@ def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
||||
bypass_compressor = int(input("Specify bypassCompressor: "))
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_CAM_TAKE_PIC)
|
||||
+ struct.pack("!I", ActionId.TC_CAM_TAKE_PIC)
|
||||
+ bytearray(filename, "utf-8")
|
||||
+ bytes([0])
|
||||
+ struct.pack("!B", encoder_setting_y)
|
||||
@ -395,7 +443,7 @@ def prepare_simplex_send_file_cmd(object_id: bytes) -> bytearray:
|
||||
filename = input("Specify filename: ")
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_SIMPLEX_SEND_FILE)
|
||||
+ struct.pack("!I", ActionId.TC_SIMPLEX_SEND_FILE)
|
||||
+ bytearray(filename, "utf-8")
|
||||
+ bytes([0])
|
||||
)
|
||||
@ -409,7 +457,7 @@ def prepare_downlink_data_modulate_cmd(object_id: bytes) -> bytearray:
|
||||
dest_mem_addr = int(input("Specify destMemAddr: "))
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", CommandId.TC_DOWNLINK_DATA_MODULATE)
|
||||
+ struct.pack("!I", ActionId.TC_DOWNLINK_DATA_MODULATE)
|
||||
+ struct.pack("!B", format)
|
||||
+ struct.pack("!I", src_mem_addr)
|
||||
+ struct.pack("!H", src_mem_len)
|
||||
@ -420,26 +468,33 @@ def prepare_downlink_data_modulate_cmd(object_id: bytes) -> bytearray:
|
||||
|
||||
def get_obc_file() -> str:
|
||||
_LOGGER.info("Specify OBC file ")
|
||||
input_helper = InputHelper(flash_write_file_dict)
|
||||
input_helper = InputHelper(FLASH_WRITE_FILE_DICT)
|
||||
key = input_helper.get_key()
|
||||
if key == MANUAL_INPUT:
|
||||
file = input("Ploc MPSoC: Specify absolute name of flash file: ")
|
||||
else:
|
||||
file = flash_write_file_dict[key][1]
|
||||
file = FLASH_WRITE_FILE_DICT[key][1]
|
||||
return file
|
||||
|
||||
|
||||
def get_mpsoc_file() -> str:
|
||||
_LOGGER.info("Specify MPSoC file")
|
||||
input_helper = InputHelper(mpsoc_file_dict)
|
||||
input_helper = InputHelper(MPSOC_FILE_DICT)
|
||||
key = input_helper.get_key()
|
||||
if key == MANUAL_INPUT:
|
||||
file = input("Ploc MPSoC: Specify absolute name file: ")
|
||||
else:
|
||||
file = mpsoc_file_dict[key][1]
|
||||
file = MPSOC_FILE_DICT[key][1]
|
||||
return file
|
||||
|
||||
|
||||
def get_mpsoc_file_size() -> int:
|
||||
file_size = int(input("Specify MPSoC file size"))
|
||||
if file_size <= 0:
|
||||
raise ValueError("Invalid file size")
|
||||
return file_size
|
||||
|
||||
|
||||
def get_sequence_file() -> str:
|
||||
_LOGGER.info("Specify sequence file")
|
||||
input_helper = InputHelper(SEQ_FILE_DICT)
|
||||
@ -449,3 +504,192 @@ def get_sequence_file() -> str:
|
||||
else:
|
||||
file = SEQ_FILE_DICT[key][1]
|
||||
return file
|
||||
|
||||
|
||||
def handle_ploc_mpsoc_hk_data(printer: FsfwTmTcPrinter, hk_data: bytes, set_id: int):
|
||||
pw = PrintWrapper(printer)
|
||||
if set_id == SetId.HK_ID:
|
||||
fmt_str = "!IBBBBBBB"
|
||||
current_idx = 0
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(
|
||||
status,
|
||||
mode,
|
||||
downlink_pwr_on,
|
||||
downlink_reply_active,
|
||||
downlink_jesd_sync_status,
|
||||
downlink_dac_status,
|
||||
cam_status,
|
||||
cam_sdi_status,
|
||||
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
||||
current_idx += inc_len
|
||||
pw.ilog(_LOGGER, "Received MPSoC HK")
|
||||
pw.dlog(f"Status: {status}")
|
||||
pw.dlog(f"Mode: {mode}")
|
||||
pw.dlog(f"Downlink Power On: {downlink_pwr_on}")
|
||||
pw.dlog(f"Downlink Reply Active: {downlink_reply_active}")
|
||||
pw.dlog(f"Downlink JESD Sync Status: {downlink_jesd_sync_status}")
|
||||
pw.dlog(f"Downlink DAC Status: {downlink_dac_status}")
|
||||
pw.dlog(f"CAM Status: {cam_status}")
|
||||
pw.dlog(f"CAM SDI Status: {cam_sdi_status}")
|
||||
|
||||
fmt_str = "!fffffffff"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(
|
||||
cam_fpga_temp,
|
||||
cam_soc_temp,
|
||||
sysmon_temp,
|
||||
sysmon_vcc_int,
|
||||
sysmon_vcc_aux,
|
||||
sysmon_vcc_bram,
|
||||
sysmon_vcc_paux,
|
||||
sysmon_vcc_pint,
|
||||
sysmon_vcc_pdro,
|
||||
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
||||
current_idx += inc_len
|
||||
|
||||
pw.dlog(f"CAM FPGA Temperature: {cam_fpga_temp}")
|
||||
pw.dlog(f"CAM SoC Temperature: {cam_soc_temp}")
|
||||
pw.dlog(f"System Monitor Temperature: {sysmon_temp}")
|
||||
pw.dlog(
|
||||
f"SYSMON VCC INT {sysmon_vcc_int:.3f} | SYSMON VCC AUX {sysmon_vcc_aux:.3f} | "
|
||||
f"SYSMON VCC BRAM {sysmon_vcc_bram:.3f}"
|
||||
)
|
||||
pw.dlog(
|
||||
f"SYSMON VCC PAUX {sysmon_vcc_paux:.3f} | SYSMON VCC PINT {sysmon_vcc_pint:.3f} | "
|
||||
f"SYSMON VCC PDRO {sysmon_vcc_pdro:.3f}"
|
||||
)
|
||||
|
||||
fmt_str = "!fffffffffffff"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(
|
||||
sysmon_mb_12v,
|
||||
sysmon_mb_3v3,
|
||||
sysmon_mb_1v8,
|
||||
sysmon_vcc_12v,
|
||||
sysmon_vcc_5v,
|
||||
sysmon_vcc_3v3,
|
||||
sysmon_vcc_3v3va,
|
||||
sysmon_vcc_2v5ddr,
|
||||
sysmon_vcc_1v2ddr,
|
||||
sysmon_vcc_0v9,
|
||||
sysmon_vcc_0v6vtt,
|
||||
sysmon_safe_cotr_cur,
|
||||
sysmon_nvm4_xo_cur,
|
||||
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
||||
current_idx += inc_len
|
||||
|
||||
pw.dlog(
|
||||
f"SYSMON MB 12V {sysmon_mb_12v:.3f} | SYSMON MB 3V3 {sysmon_mb_3v3:.3f} | "
|
||||
f"SYSMON MBA 1V8 {sysmon_mb_1v8:.3f}"
|
||||
)
|
||||
pw.dlog(
|
||||
f"SYSMON VCC 12V {sysmon_vcc_12v:.3f} | SYSMON VCC 5V {sysmon_vcc_5v:.3f} | "
|
||||
f"SYSMON VCC 3V3 {sysmon_vcc_3v3:.3f} | SYSMON VCC 3V3VA {sysmon_vcc_3v3va}"
|
||||
)
|
||||
pw.dlog(
|
||||
f"SYSMON VCC 2V5DDR {sysmon_vcc_2v5ddr:.3f} | "
|
||||
f"SYSMON VCC 1V2DDR {sysmon_vcc_1v2ddr:.3f} | "
|
||||
f"SYSMON VCC 0V9 {sysmon_vcc_0v9:.3f} | "
|
||||
f"SYSMON VCC 0V6VTT {sysmon_vcc_0v6vtt}"
|
||||
)
|
||||
pw.dlog(
|
||||
f"SYSMON SAFE COTS CURR: {sysmon_safe_cotr_cur} | "
|
||||
f"SYSMON NVM4XO CURR {sysmon_nvm4_xo_cur}"
|
||||
)
|
||||
fmt_str = "!HHBB"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(
|
||||
sem_uncorrectable_errs,
|
||||
sem_correctable_errs,
|
||||
sem_status,
|
||||
reboot_mpsoc_required,
|
||||
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
||||
|
||||
pw.dlog(f"SEM IP Uncorrectable Errors: {sem_uncorrectable_errs}")
|
||||
pw.dlog(f"SEM IP Correctable Errors: {sem_correctable_errs}")
|
||||
pw.dlog(f"SEM IP Status: {sem_status}")
|
||||
pw.dlog(f"Reboot MPSoC required: {reboot_mpsoc_required}")
|
||||
else:
|
||||
_LOGGER.warning(f"Unknown set ID {set_id} for MPSoC HK")
|
||||
pass
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class DirElement:
|
||||
name: str
|
||||
attr: int
|
||||
size: int
|
||||
|
||||
|
||||
def handle_mpsoc_data_reply(
|
||||
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
|
||||
):
|
||||
pw = PrintWrapper(printer)
|
||||
if action_id == ActionId.TM_MEM_READ_RPT:
|
||||
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)
|
||||
elif action_id == ActionId.TM_CAM_CMD_RPT:
|
||||
header_list = ["Camera reply string", "ACK"]
|
||||
content_list = [
|
||||
custom_data[: len(custom_data) - 1].decode("utf-8"),
|
||||
hex(custom_data[-1]),
|
||||
]
|
||||
print(header_list)
|
||||
print(content_list)
|
||||
printer.file_logger.info(header_list)
|
||||
printer.file_logger.info(content_list)
|
||||
elif action_id == ActionId.TM_FLASH_DIRECTORY_CONTENT:
|
||||
if len(custom_data) < 16:
|
||||
_LOGGER.warning(
|
||||
"PLOC MPSoC flash directory data shorter than minimum 16 bytes"
|
||||
)
|
||||
current_idx = 0
|
||||
dir_name_short = custom_data[current_idx : current_idx + 12].decode("utf-8")
|
||||
current_idx += 12
|
||||
num_elements = struct.unpack("!I", custom_data[current_idx : current_idx + 4])[
|
||||
0
|
||||
]
|
||||
current_idx += 4
|
||||
elem_names = []
|
||||
elem_attrs = []
|
||||
elem_sizes = []
|
||||
expected_size = 16 + num_elements * 17
|
||||
if len(custom_data) < expected_size:
|
||||
_LOGGER.warning(
|
||||
f"PLOC MPSoC flash directory data shorter than expected {expected_size}"
|
||||
)
|
||||
pw.dlog(
|
||||
f"Received PLOC MPSoC flash directory content for path {dir_name_short} "
|
||||
f"with {num_elements} elements"
|
||||
)
|
||||
# It is as weird as it looks..
|
||||
for _ in range(num_elements):
|
||||
end_of_str = custom_data[current_idx : current_idx + 12].index(b"\x00")
|
||||
elem_name = custom_data[current_idx : current_idx + end_of_str].decode(
|
||||
"utf-8"
|
||||
)
|
||||
current_idx += 12
|
||||
elem_names.append(elem_name)
|
||||
for _ in range(num_elements):
|
||||
elem_attrs.append(custom_data[current_idx])
|
||||
current_idx += 1
|
||||
for _ in range(num_elements):
|
||||
elem_sizes.append(
|
||||
struct.unpack("!I", custom_data[current_idx : current_idx + 4])[0]
|
||||
)
|
||||
current_idx += 4
|
||||
for i in range(num_elements):
|
||||
pw.dlog(f"{DirElement(elem_names[i], elem_attrs[i], elem_sizes[i])}")
|
||||
|
@ -22,6 +22,10 @@ class SystemMode:
|
||||
BOOT = 5
|
||||
SAFE = AcsMode.SAFE
|
||||
IDLE = AcsMode.IDLE
|
||||
PTG_NADIR = AcsMode.PTG_NADIR
|
||||
PTG_TARGET = AcsMode.PTG_TARGET
|
||||
PTG_TARGET_GS = AcsMode.PTG_TARGET_GS
|
||||
PTG_INERTIAL = AcsMode.PTG_INERTIAL
|
||||
|
||||
|
||||
class ActionId(enum.IntEnum):
|
||||
@ -32,6 +36,10 @@ class OpCode:
|
||||
BOOT_MODE = "boot"
|
||||
SAFE_MODE = "safe"
|
||||
IDLE_MODE = "idle"
|
||||
NADIR_MODE = "nadir"
|
||||
TARGET_MODE = "ptg_target"
|
||||
TARGET_GS_MODE = "ptg_target_gs"
|
||||
INERTIAL_MODE = "ptg_inertial"
|
||||
ANNOUNCE_MODES = "announce_modes"
|
||||
REBOOT_I2C = "reboot_i2c"
|
||||
|
||||
@ -40,6 +48,10 @@ class Info:
|
||||
BOOT_MODE = "Command System into Boot Mode"
|
||||
SAFE_MODE = "Command System into Safe Mode"
|
||||
IDLE_MODE = "Command System into Idle Pointing Mode"
|
||||
NADIR_MODE = "Command System into Nadir Pointing Mode"
|
||||
TARGET_MODE = "Command System into Target Pointing Mode"
|
||||
TARGET_GS_MODE = "Command System into Target Groundstation Pointing Mode"
|
||||
INERTIAL_MODE = "Command System into Inertial Pointing Mode"
|
||||
ANNOUNCE_MODES = "Announce mode recursively"
|
||||
REBOOT_I2C = "Reboot I2C bus"
|
||||
|
||||
@ -55,6 +67,18 @@ def build_system_cmds(p: ServiceProviderParams):
|
||||
elif o == OpCode.IDLE_MODE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.IDLE_MODE}")
|
||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.IDLE, 0))
|
||||
elif o == OpCode.NADIR_MODE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.NADIR_MODE}")
|
||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_NADIR, 0))
|
||||
elif o == OpCode.TARGET_MODE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.TARGET_MODE}")
|
||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_TARGET, 0))
|
||||
elif o == OpCode.TARGET_GS_MODE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.TARGET_GS_MODE}")
|
||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_TARGET_GS, 0))
|
||||
elif o == OpCode.INERTIAL_MODE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.INERTIAL_MODE}")
|
||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_INERTIAL, 0))
|
||||
elif o == OpCode.ANNOUNCE_MODES:
|
||||
q.add_log_cmd(f"{prefix}: {Info.ANNOUNCE_MODES}")
|
||||
q.add_pus_tc(create_announce_mode_recursive_command(EIVE_SYSTEM_ID))
|
||||
@ -72,6 +96,10 @@ def add_system_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||
oce.add(keys=OpCode.BOOT_MODE, info=Info.BOOT_MODE)
|
||||
oce.add(keys=OpCode.SAFE_MODE, info=Info.SAFE_MODE)
|
||||
oce.add(keys=OpCode.IDLE_MODE, info=Info.IDLE_MODE)
|
||||
oce.add(keys=OpCode.NADIR_MODE, info=Info.NADIR_MODE)
|
||||
oce.add(keys=OpCode.TARGET_MODE, info=Info.TARGET_MODE)
|
||||
oce.add(keys=OpCode.TARGET_GS_MODE, info=Info.TARGET_GS_MODE)
|
||||
oce.add(keys=OpCode.INERTIAL_MODE, info=Info.INERTIAL_MODE)
|
||||
oce.add(keys=OpCode.ANNOUNCE_MODES, info=Info.ANNOUNCE_MODES)
|
||||
oce.add(keys=OpCode.REBOOT_I2C, info=Info.REBOOT_I2C)
|
||||
defs.add_service(
|
||||
|
Reference in New Issue
Block a user