Compare commits
53 Commits
Author | SHA1 | Date | |
---|---|---|---|
a40c881b9f | |||
432a642422 | |||
abfe923b05 | |||
65ada579d3 | |||
fce0c4400b | |||
f4e9091484 | |||
e334521e6d | |||
cd0fd4d5a7 | |||
4686550eb9 | |||
26cd265e19 | |||
a4984c34c2 | |||
948ad4ef7f | |||
e32a6ded66 | |||
0add5c6ac5 | |||
9f905524b6 | |||
d5685adb48 | |||
4acae93206 | |||
05429d2048 | |||
a249d71840 | |||
a5cc03d8a0 | |||
fd692c901d | |||
b0f51072b2 | |||
be5cf32dc8 | |||
cbbb335254 | |||
42434cbe7e | |||
bf158bee2d | |||
80539cf897 | |||
ffd2eb11f8 | |||
ed5cb87cad | |||
4386b18049 | |||
a3e03350fa | |||
d758a1f11a | |||
af17e30676 | |||
5652305ee1 | |||
a3f5c92654 | |||
2e21087c6d | |||
e74e751142 | |||
d43badaddf | |||
26b292f05a | |||
6f397289ca | |||
3d4ef7003c | |||
bf31810f25 | |||
9462a6e245 | |||
208d328683 | |||
90ea903c0a | |||
2aa1ecd3a7 | |||
f18a7f49cf | |||
7f872c92c4 | |||
82352bc5fa | |||
a5bfee076a | |||
0c17203825 | |||
beb8e61e2c | |||
e9d10dae1b |
50
CHANGELOG.md
50
CHANGELOG.md
@ -10,6 +10,56 @@ list yields a list of all related PRs for each release.
|
||||
|
||||
# [unreleased]
|
||||
|
||||
# [v2.18.1] 2023-03-11
|
||||
|
||||
## Fixed
|
||||
|
||||
- Missing heater location fix.
|
||||
|
||||
## Added
|
||||
|
||||
- Request to announce reboot counts in core controller commands
|
||||
|
||||
# [v2.18.0] 2023-03-11
|
||||
|
||||
## Added
|
||||
|
||||
- Added GPS Altitude for GPS Processed Data Dataset
|
||||
|
||||
## Changed
|
||||
|
||||
- Updated CSVs.
|
||||
- ACS mode changes: The ACS CTRL submodes are now modes. DETUBMLE is now submode of SAFE mode.
|
||||
|
||||
# [v2.17.3] 2023-03-09
|
||||
|
||||
## Fixed
|
||||
|
||||
- Fixed the heater object ID names completely. Also,
|
||||
the HPA heater is now the Syrlinks heater.
|
||||
|
||||
# [v2.17.2] 2023-03-07
|
||||
|
||||
- Updated CSVs
|
||||
- New events for core controller
|
||||
|
||||
# [v2.17.1] 2023-03-07
|
||||
|
||||
## Added
|
||||
|
||||
- `MGT_ASSEMBLY` object ID
|
||||
|
||||
# [v2.17.0] 2023-03-07
|
||||
|
||||
## Added
|
||||
|
||||
- Health set and health announce commands
|
||||
- Camera Switcher, Syrlinks Assembly, IMTQ assembly and Star Tracker assembly object IDs added
|
||||
|
||||
## Changed
|
||||
|
||||
- Breaking typo fix in TMP1075 `SetId`
|
||||
|
||||
# [v2.16.4] 2023-03-04
|
||||
|
||||
## Added
|
||||
|
@ -1,12 +1,12 @@
|
||||
__version__ = "2.16.4"
|
||||
__version__ = "2.18.1"
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
SW_NAME = "eive-tmtc"
|
||||
VERSION_MAJOR = 2
|
||||
VERSION_MINOR = 16
|
||||
VERSION_REVISION = 4
|
||||
VERSION_MINOR = 18
|
||||
VERSION_REVISION = 1
|
||||
|
||||
EIVE_TMTC_ROOT = Path(__file__).parent
|
||||
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
|
||||
|
@ -250,12 +250,14 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
13904;0x3650;WRITE_CONFIGFILE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
||||
13905;0x3651;READ_CONFIGFILE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
||||
14000;0x36b0;ALLOC_FAILURE;MEDIUM;No description;bsp_q7s/core/CoreController.h
|
||||
14001;0x36b1;REBOOT_SW;MEDIUM; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
|
||||
14001;0x36b1;REBOOT_SW;LOW; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
|
||||
14002;0x36b2;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
|
||||
14003;0x36b3;REBOOT_HW;MEDIUM;No description;bsp_q7s/core/CoreController.h
|
||||
14004;0x36b4;NO_SD_CARD_ACTIVE;HIGH;No SD card was active. Core controller will attempt to re-initialize a SD card.;bsp_q7s/core/CoreController.h
|
||||
14005;0x36b5;VERSION_INFO;INFO;P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;bsp_q7s/core/CoreController.h
|
||||
14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
|
||||
14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;bsp_q7s/core/CoreController.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.;bsp_q7s/core/CoreController.h
|
||||
14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/ThermalController.h
|
||||
14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/ThermalController.h
|
||||
14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
|
||||
@ -265,4 +267,12 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
14106;0x371a;PLPCDU_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
|
||||
14201;0x3779;TX_TIMER_EXPIRED;INFO;The transmit timer to protect the Syrlinks expired P1: The current timer value;mission/system/objects/ComSubsystem.h
|
||||
14202;0x377a;BIT_LOCK_TX_ON;INFO;Transmitter will be turned on due to detection of bitlock;mission/system/objects/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/tmtc/PersistentTmStore.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
|
||||
14301;0x37dd;FILE_TOO_LARGE;LOW;File in store too large. P1: Detected file size P2: Allowed file size;mission/persistentTmStoreDefs.h
|
||||
14302;0x37de;BUSY_DUMPING_EVENT;INFO;No description;mission/persistentTmStoreDefs.h
|
||||
14303;0x37df;DUMP_WAS_CANCELLED;LOW;Dump was cancelled. P1: Object ID of store.;mission/persistentTmStoreDefs.h
|
||||
14305;0x37e1;DUMP_OK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14306;0x37e2;DUMP_NOK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14307;0x37e3;DUMP_MISC_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14308;0x37e4;DUMP_HK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14309;0x37e5;DUMP_CFDP_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
|
|
@ -71,14 +71,14 @@ PLOC_MPSOC_ID = bytes([0x44, 0x33, 0x00, 0x15])
|
||||
PL_PCDU_ID = bytes([0x44, 0x30, 0x00, 0x00])
|
||||
|
||||
# Other
|
||||
HEATER_0_OBC_BRD = bytes([0x60, 0x00, 0x00, 0x00])
|
||||
HEATER_1_PLOC_PROC_BRD = bytes([0x60, 0x00, 0x00, 0x01])
|
||||
HEATER_0_PLOC_PROC_BRD = bytes([0x60, 0x00, 0x00, 0x00])
|
||||
HEATER_1_PCDU_BRD = bytes([0x60, 0x00, 0x00, 0x01])
|
||||
HEATER_2_ACS_BRD = bytes([0x60, 0x00, 0x00, 0x02])
|
||||
HEATER_3_PCDU_BRD = bytes([0x60, 0x00, 0x00, 0x03])
|
||||
HEATER_3_OBC_BRD = bytes([0x60, 0x00, 0x00, 0x03])
|
||||
HEATER_4_CAMERA = bytes([0x60, 0x00, 0x00, 0x04])
|
||||
HEATER_5_STR = bytes([0x60, 0x00, 0x00, 0x05])
|
||||
HEATER_6_DRO = bytes([0x60, 0x00, 0x00, 0x06])
|
||||
HEATER_7_HPA = bytes([0x60, 0x00, 0x00, 0x07])
|
||||
HEATER_7_SYRLINKS = bytes([0x60, 0x00, 0x00, 0x07])
|
||||
|
||||
# RTDs
|
||||
RTD_0_PLOC_HSPD = bytes([0x44, 0x42, 0x00, 0x16])
|
||||
@ -132,10 +132,21 @@ PL_SUBSYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x02])
|
||||
TCS_SUBSYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x03])
|
||||
COM_SUBSYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x04])
|
||||
|
||||
# Legacy names, kept for backwards compatibility
|
||||
ACS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x01])
|
||||
SUS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x02])
|
||||
TCS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x03])
|
||||
SUS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x02])
|
||||
IMTQ_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x08])
|
||||
|
||||
ACS_BOARD_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x01])
|
||||
SUS_BOARD_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x02])
|
||||
TCS_BOARD_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x03])
|
||||
RW_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x04])
|
||||
CAM_SWITCHER = bytes([0x73, 0x00, 0x00, 0x06])
|
||||
SYRLINKS_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x07])
|
||||
# To be removed soon..
|
||||
MGT_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x08])
|
||||
STR_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x09])
|
||||
|
||||
# Controllers
|
||||
TCS_CONTROLLER = bytes([0x43, 0x40, 0x00, 0x01])
|
||||
|
@ -45,6 +45,10 @@
|
||||
0x44330003;PLOC_MPSOC_HELPER
|
||||
0x44330004;AXI_PTME_CONFIG
|
||||
0x44330005;PTME_CONFIG
|
||||
0x44330006;PTME_VC0_LIVE_TM
|
||||
0x44330007;PTME_VC1_LOG_TM
|
||||
0x44330008;PTME_VC2_HK_TM
|
||||
0x44330009;PTME_VC3_CFDP_TM
|
||||
0x44330015;PLOC_MPSOC_HANDLER
|
||||
0x44330016;PLOC_SUPERVISOR_HANDLER
|
||||
0x44330017;PLOC_SUPERVISOR_HELPER
|
||||
@ -135,13 +139,15 @@
|
||||
0x60000004;HEATER_4_CAMERA
|
||||
0x60000005;HEATER_5_STR
|
||||
0x60000006;HEATER_6_DRO
|
||||
0x60000007;HEATER_7_HPA
|
||||
0x60000007;HEATER_7_SYRLINKS
|
||||
0x73000001;ACS_BOARD_ASS
|
||||
0x73000002;SUS_BOARD_ASS
|
||||
0x73000003;TCS_BOARD_ASS
|
||||
0x73000004;RW_ASSY
|
||||
0x73000006;CAM_SWITCHER
|
||||
0x73000007;SYRLINKS_ASSY
|
||||
0x73000008;IMTQ_ASSY
|
||||
0x73000009;STR_ASSY
|
||||
0x73000100;TM_FUNNEL
|
||||
0x73000101;PUS_TM_FUNNEL
|
||||
0x73000102;CFDP_TM_FUNNEL
|
||||
@ -157,6 +163,11 @@
|
||||
0x73020003;NOT_OK_TM_STORE
|
||||
0x73020004;HK_TM_STORE
|
||||
0x73030000;CFDP_TM_STORE
|
||||
0x73040000;LIVE_TM_TASK
|
||||
0x73040001;LOG_STORE_AND_TM_TASK
|
||||
0x73040002;HK_STORE_AND_TM_TASK
|
||||
0x73040003;CFDP_STORE_AND_TM_TASK
|
||||
0x73040004;DOWNLINK_RAM_STORE
|
||||
0x73500000;CCSDS_IP_CORE_BRIDGE
|
||||
0x90000003;THERMAL_TEMP_INSERTER
|
||||
0xFFFFFFFF;NO_OBJECT
|
||||
|
|
@ -1,7 +1,10 @@
|
||||
Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
||||
0x0000;OK;System-wide code for ok.;0;HasReturnvaluesIF;fsfw/returnvalues/returnvalue.h
|
||||
0x0001;Failed;Unspecified system-wide code for failed.;1;HasReturnvaluesIF;fsfw/returnvalues/returnvalue.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
|
||||
0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/tmtc/CcsdsIpCoreHandler.h
|
||||
0x7100;TMS_IsBusy;No description;0;TM_SINK;mission/tmtc/DirectTmSinkIF.h
|
||||
0x5100;IMTQ_InvalidCommandCode;No description;0;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h
|
||||
0x5101;IMTQ_MgmMeasurementLowLevelError;No description;1;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h
|
||||
0x5102;IMTQ_ActuateCmdLowLevelError;No description;2;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h
|
||||
@ -64,7 +67,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
||||
0x6a07;ACSMEKF_MekfInitialized;No description;7;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||
0x6a08;ACSMEKF_MekfRunning;No description;8;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||
0x6900;ACSCTRL_FileDeletionFailed;No description;0;ACS_CTRL;mission/controller/AcsController.h
|
||||
0x63a0;NVMB_KeyNotExists;Specified key does not exist in json file;160;NVM_PARAM_BASE;mission/memory/NVMParameterBase.h
|
||||
0x63a0;NVMB_KeyNotExists;Specified key does not exist in json file;160;NVM_PARAM_BASE;mission/memory/NvmParameterBase.h
|
||||
0x2c01;CCS_BcIsSetVrCommand;No description;1;CCSDS_HANDLER_IF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h
|
||||
0x2c02;CCS_BcIsUnlockCommand;No description;2;CCSDS_HANDLER_IF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h
|
||||
0x2cb0;CCS_BcIllegalCommand;No description;176;CCSDS_HANDLER_IF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h
|
||||
@ -492,7 +495,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
||||
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
|
||||
0x7100;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
|
||||
0x7300;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
|
||||
0x57a0;PLSPVhLP_FileClosedAccidentally;File accidentally close;160;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h
|
||||
0x57a1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;161;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h
|
||||
0x57a2;PLSPVhLP_PathNotExists;Received command with invalid pathname;162;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h
|
||||
|
|
@ -166,6 +166,8 @@ def handle_regular_hk_print(
|
||||
return handle_thermal_controller_hk_data(
|
||||
object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data
|
||||
)
|
||||
elif objb == obj_ids.STAR_TRACKER_ID:
|
||||
return handle_str_hk_data(set_id=set_id, hk_data=hk_data, printer=printer)
|
||||
elif objb == obj_ids.PLOC_SUPV_ID:
|
||||
return handle_supv_hk_data(set_id=set_id, hk_data=hk_data, printer=printer)
|
||||
elif objb == obj_ids.ACS_CONTROLLER:
|
||||
|
@ -2,12 +2,14 @@ import enum
|
||||
import logging
|
||||
import socket
|
||||
import struct
|
||||
import math
|
||||
from socket import AF_INET
|
||||
from typing import Tuple
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.config.object_ids import ACS_CONTROLLER
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode
|
||||
from tmtccmd.config.tmtc import (
|
||||
tmtc_definitions_provider,
|
||||
TmtcDefinitionWrapper,
|
||||
@ -55,17 +57,6 @@ class SetId(enum.IntEnum):
|
||||
ACTUATOR_CMD_DATA = 9
|
||||
|
||||
|
||||
class Submode(enum.IntEnum):
|
||||
OFF = 0
|
||||
SAFE = 10
|
||||
DETUMBLE = 11
|
||||
IDLE = 12
|
||||
PTG_NADIR = 13
|
||||
PTG_TARGET = 14
|
||||
PTG_TARGET_GS = 15
|
||||
PTG_INERTIAL = 16
|
||||
|
||||
|
||||
class ActionId(enum.IntEnum):
|
||||
SOLAR_ARRAY_DEPLOYMENT_SUCCESSFUL = 0
|
||||
RESET_MEKF = 1
|
||||
@ -73,55 +64,55 @@ class ActionId(enum.IntEnum):
|
||||
|
||||
class OpCodes:
|
||||
OFF = ["off"]
|
||||
SAFE = ["normal_safe"]
|
||||
DTBL = ["normal_detumble"]
|
||||
IDLE = ["normal_idle"]
|
||||
NADIR = ["normal_nadir"]
|
||||
TARGET = ["normal_target"]
|
||||
GS = ["normal_gs"]
|
||||
INERTIAL = ["normal_inertial"]
|
||||
SAFE = ["safe"]
|
||||
DTBL = ["safe_detumble"]
|
||||
IDLE = ["ptg_idle"]
|
||||
NADIR = ["ptg_nadir"]
|
||||
TARGET = ["ptg_target"]
|
||||
GS = ["ptg_target_gs"]
|
||||
INERTIAL = ["ptg_inertial"]
|
||||
SAFE_PTG = ["confirm_deployment"]
|
||||
RESET_MEKF = ["reset_mekf"]
|
||||
SET_PARAMETER_SCALAR = ["set_scalar_param"]
|
||||
SET_PARAMETER_VECTOR = ["set_vector_param"]
|
||||
SET_PARAMETER_MATRIX = ["set_matrix_param"]
|
||||
REQUEST_RAW_MGM_HK = ["0", "mgm_raw_hk"]
|
||||
ENABLE_RAW_MGM_HK = ["1", "mgm_raw_enable_hk"]
|
||||
DISABLE_RAW_MGM_HK = ["2", "mgm_raw_disable_hk"]
|
||||
REQUEST_PROC_MGM_HK = ["3", "mgm_proc_hk"]
|
||||
ENABLE_PROC_MGM_HK = ["4", "mgm_proc_enable_hk"]
|
||||
DISABLE_PROC_MGM_HK = ["5", "mgm_proc_disable_hk"]
|
||||
REQUEST_RAW_SUS_HK = ["6", "sus_raw_hk"]
|
||||
ENABLE_RAW_SUS_HK = ["7", "sus_raw_enable_hk"]
|
||||
DISABLE_RAW_SUS_HK = ["8", "sus_raw_disable_hk"]
|
||||
REQUEST_PROC_SUS_HK = ["9", "sus_proc_hk"]
|
||||
ENABLE_PROC_SUS_HK = ["10", "sus_proc_enable_hk"]
|
||||
DISABLE_PROC_SUS_HK = ["11", "sus_proc_disable_hk"]
|
||||
REQUEST_RAW_GYR_HK = ["12", "gyr_raw_hk"]
|
||||
ENABLE_RAW_GYR_HK = ["13", "gyr_raw_enable_hk"]
|
||||
DISABLE_RAW_GYR_HK = ["14", "gyr_raw_disable_hk"]
|
||||
REQUEST_PROC_GYR_HK = ["15", "gyr_proc_hk"]
|
||||
ENABLE_PROC_GYR_HK = ["16", "gyr_proc_enable_hk"]
|
||||
DISABLE_PROC_GYR_HK = ["17", "gyr_proc_disable_hk"]
|
||||
REQUEST_PROC_GPS_HK = ["18", "gps_proc_hk"]
|
||||
ENABLE_PROC_GPS_HK = ["19", "gps_proc_enable_hk"]
|
||||
DISABLE_PROC_GPS_HK = ["20", "gps_proc_disable_hk"]
|
||||
REQUEST_MEKF_HK = ["21", "mekf_hk"]
|
||||
ENABLE_MEKF_HK = ["22", "mekf_enable_hk"]
|
||||
DISABLE_MEKF_HK = ["23", "mekf_disable_hk"]
|
||||
REQUEST_CTRL_VAL_HK = ["24", "ctrl_val_hk"]
|
||||
ENABLE_CTRL_VAL_HK = ["25", "ctrl_val_enable_hk"]
|
||||
DISABLE_CTRL_VAL_HK = ["26", "ctrl_val_disable_hk"]
|
||||
REQUEST_ACT_CMD_HK = ["27", "act_cmd_hk"]
|
||||
ENABLE_ACT_CMD_HK = ["28", "act_cmd_enable_hk"]
|
||||
DISABLE_ACT_CMD_HK = ["29", "act_cmd_disable_hk"]
|
||||
REQUEST_RAW_MGM_HK = ["mgm_raw_hk"]
|
||||
ENABLE_RAW_MGM_HK = ["mgm_raw_enable_hk"]
|
||||
DISABLE_RAW_MGM_HK = ["mgm_raw_disable_hk"]
|
||||
REQUEST_PROC_MGM_HK = ["mgm_proc_hk"]
|
||||
ENABLE_PROC_MGM_HK = ["mgm_proc_enable_hk"]
|
||||
DISABLE_PROC_MGM_HK = ["mgm_proc_disable_hk"]
|
||||
REQUEST_RAW_SUS_HK = ["sus_raw_hk"]
|
||||
ENABLE_RAW_SUS_HK = ["sus_raw_enable_hk"]
|
||||
DISABLE_RAW_SUS_HK = ["sus_raw_disable_hk"]
|
||||
REQUEST_PROC_SUS_HK = ["sus_proc_hk"]
|
||||
ENABLE_PROC_SUS_HK = ["sus_proc_enable_hk"]
|
||||
DISABLE_PROC_SUS_HK = ["sus_proc_disable_hk"]
|
||||
REQUEST_RAW_GYR_HK = ["gyr_raw_hk"]
|
||||
ENABLE_RAW_GYR_HK = ["gyr_raw_enable_hk"]
|
||||
DISABLE_RAW_GYR_HK = ["gyr_raw_disable_hk"]
|
||||
REQUEST_PROC_GYR_HK = ["gyr_proc_hk"]
|
||||
ENABLE_PROC_GYR_HK = ["gyr_proc_enable_hk"]
|
||||
DISABLE_PROC_GYR_HK = ["gyr_proc_disable_hk"]
|
||||
REQUEST_PROC_GPS_HK = ["gps_proc_hk"]
|
||||
ENABLE_PROC_GPS_HK = ["gps_proc_enable_hk"]
|
||||
DISABLE_PROC_GPS_HK = ["gps_proc_disable_hk"]
|
||||
REQUEST_MEKF_HK = ["mekf_hk"]
|
||||
ENABLE_MEKF_HK = ["mekf_enable_hk"]
|
||||
DISABLE_MEKF_HK = ["mekf_disable_hk"]
|
||||
REQUEST_CTRL_VAL_HK = ["ctrl_val_hk"]
|
||||
ENABLE_CTRL_VAL_HK = ["ctrl_val_enable_hk"]
|
||||
DISABLE_CTRL_VAL_HK = ["ctrl_val_disable_hk"]
|
||||
REQUEST_ACT_CMD_HK = ["act_cmd_hk"]
|
||||
ENABLE_ACT_CMD_HK = ["act_cmd_enable_hk"]
|
||||
DISABLE_ACT_CMD_HK = ["act_cmd_disable_hk"]
|
||||
|
||||
|
||||
class Info:
|
||||
OFF = "Switch ACS CTRL off"
|
||||
SAFE = "Switch ACS CTRL normal - safe"
|
||||
DTBL = "Switch ACS CTRL normal - detumble"
|
||||
IDLE = "Switch ACS CTRL normal - idle"
|
||||
SAFE = "Switch ACS CTRL - safe"
|
||||
DTBL = "Switch ACS CTRL - safe with detumble submode"
|
||||
IDLE = "Switch ACS CTRL - pointing idle"
|
||||
NADIR = "Switch ACS CTRL normal - pointing nadir"
|
||||
TARGET = "Switch ACS CTRL normal - pointing target"
|
||||
GS = "Switch ACS CTRL normal - pointing target groundstation"
|
||||
@ -235,29 +226,29 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, Mode.OFF, 0))
|
||||
elif op_code in OpCodes.SAFE:
|
||||
q.add_log_cmd(f"{Info.SAFE}")
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, Mode.NORMAL, Submode.SAFE))
|
||||
q.add_pus_tc(
|
||||
pack_mode_command(ACS_CONTROLLER, AcsMode.SAFE, SafeSubmode.DEFAULT)
|
||||
)
|
||||
elif op_code in OpCodes.DTBL:
|
||||
q.add_log_cmd(f"{Info.DTBL}")
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, Mode.NORMAL, Submode.DETUMBLE))
|
||||
q.add_pus_tc(
|
||||
pack_mode_command(ACS_CONTROLLER, AcsMode.SAFE, SafeSubmode.DETUMBLE)
|
||||
)
|
||||
elif op_code in OpCodes.IDLE:
|
||||
q.add_log_cmd(f"{Info.IDLE}")
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, Mode.NORMAL, Submode.IDLE))
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.IDLE, 0))
|
||||
elif op_code in OpCodes.NADIR:
|
||||
q.add_log_cmd(f"{Info.NADIR}")
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, Mode.NORMAL, Submode.PTG_NADIR))
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_NADIR, 0))
|
||||
elif op_code in OpCodes.TARGET:
|
||||
q.add_log_cmd(f"{Info.TARGET}")
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, Mode.NORMAL, Submode.PTG_TARGET))
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_TARGET, 0))
|
||||
elif op_code in OpCodes.GS:
|
||||
q.add_log_cmd(f"{Info.GS}")
|
||||
q.add_pus_tc(
|
||||
pack_mode_command(ACS_CONTROLLER, Mode.NORMAL, Submode.PTG_TARGET_GS)
|
||||
)
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_TARGET_GS, 0))
|
||||
elif op_code in OpCodes.INERTIAL:
|
||||
q.add_log_cmd(f"{Info.INERTIAL}")
|
||||
q.add_pus_tc(
|
||||
pack_mode_command(ACS_CONTROLLER, Mode.NORMAL, Submode.PTG_INERTIAL)
|
||||
)
|
||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_INERTIAL, 0))
|
||||
elif op_code in OpCodes.SAFE_PTG:
|
||||
q.add_log_cmd(f"{Info.SAFE_PTG}")
|
||||
q.add_pus_tc(
|
||||
@ -283,9 +274,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.MGM_RAW_SET))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_RAW_MGM_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_RAW_MGM_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
False, make_sid(ACS_CONTROLLER, SetId.MGM_RAW_SET), 2.0
|
||||
False, make_sid(ACS_CONTROLLER, SetId.MGM_RAW_SET), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -302,9 +294,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.MGM_PROC_SET))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_PROC_MGM_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_PROC_MGM_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
False, make_sid(ACS_CONTROLLER, SetId.MGM_PROC_SET), 2.0
|
||||
False, make_sid(ACS_CONTROLLER, SetId.MGM_PROC_SET), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -321,9 +314,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.SUS_RAW_SET))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_RAW_SUS_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_RAW_SUS_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
False, make_sid(ACS_CONTROLLER, SetId.SUS_RAW_SET), 2.0
|
||||
False, make_sid(ACS_CONTROLLER, SetId.SUS_RAW_SET), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -340,9 +334,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.SUS_PROC_SET))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_PROC_SUS_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_PROC_SUS_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
False, make_sid(ACS_CONTROLLER, SetId.SUS_PROC_SET), 2.0
|
||||
False, make_sid(ACS_CONTROLLER, SetId.SUS_PROC_SET), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -359,9 +354,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
create_request_one_diag_command(make_sid(ACS_CONTROLLER, SetId.GYR_RAW_SET))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_RAW_GYR_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_RAW_GYR_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
True, make_sid(ACS_CONTROLLER, SetId.GYR_RAW_SET), 2.0
|
||||
True, make_sid(ACS_CONTROLLER, SetId.GYR_RAW_SET), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -380,9 +376,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
)
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_PROC_GYR_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_PROC_GYR_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
True, make_sid(ACS_CONTROLLER, SetId.GYR_PROC_SET), 2.0
|
||||
True, make_sid(ACS_CONTROLLER, SetId.GYR_PROC_SET), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -399,9 +396,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.GPS_PROC_SET))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_PROC_GPS_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_PROC_GPS_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
False, make_sid(ACS_CONTROLLER, SetId.GPS_PROC_SET), 2.0
|
||||
False, make_sid(ACS_CONTROLLER, SetId.GPS_PROC_SET), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -418,9 +416,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
create_request_one_diag_command(make_sid(ACS_CONTROLLER, SetId.MEKF_DATA))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_MEKF_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_MEKF_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
True, make_sid(ACS_CONTROLLER, SetId.MEKF_DATA), 2.0
|
||||
True, make_sid(ACS_CONTROLLER, SetId.MEKF_DATA), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -435,9 +434,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.CTRL_VAL_DATA))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_CTRL_VAL_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_CTRL_VAL_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
False, make_sid(ACS_CONTROLLER, SetId.CTRL_VAL_DATA), 2.0
|
||||
False, make_sid(ACS_CONTROLLER, SetId.CTRL_VAL_DATA), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -454,9 +454,10 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
||||
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.ACTUATOR_CMD_DATA))
|
||||
)
|
||||
elif op_code in OpCodes.ENABLE_ACT_CMD_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
q.add_log_cmd(Info.ENABLE_ACT_CMD_HK)
|
||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||
False, make_sid(ACS_CONTROLLER, SetId.ACTUATOR_CMD_DATA), 2.0
|
||||
False, make_sid(ACS_CONTROLLER, SetId.ACTUATOR_CMD_DATA), interval
|
||||
)
|
||||
q.add_pus_tc(cmd_tuple[0])
|
||||
q.add_pus_tc(cmd_tuple[1])
|
||||
@ -890,7 +891,7 @@ def handle_gyr_data_processed(pw: PrintWrapper, hk_data: bytes):
|
||||
current_idx = 0
|
||||
for i in range(4):
|
||||
gyr_vec = [
|
||||
f"{val:8.3f}"
|
||||
f"{val*180/math.pi:8.3f}"
|
||||
for val in struct.unpack(
|
||||
fmt_str, hk_data[current_idx : current_idx + inc_len]
|
||||
)
|
||||
@ -898,7 +899,7 @@ def handle_gyr_data_processed(pw: PrintWrapper, hk_data: bytes):
|
||||
pw.dlog(f"{GYR_NAMES[i]}: {gyr_vec}")
|
||||
current_idx += inc_len
|
||||
gyr_vec_tot = [
|
||||
f"{val:8.3f}"
|
||||
f"{val*180/math.pi:8.3f}"
|
||||
for val in struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
||||
]
|
||||
pw.dlog(f"GYR Vec Total: {gyr_vec_tot}")
|
||||
@ -917,19 +918,26 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes):
|
||||
return
|
||||
current_idx = 0
|
||||
lat = [
|
||||
f"{val:8.3f}"
|
||||
f"{val*180/math.pi:8.3f}"
|
||||
for val in struct.unpack(
|
||||
fmt_scalar, hk_data[current_idx : current_idx + inc_len_scalar]
|
||||
)
|
||||
]
|
||||
current_idx += inc_len_scalar
|
||||
long = [
|
||||
f"{val:8.3f}"
|
||||
f"{val*180/math.pi:8.3f}"
|
||||
for val in struct.unpack(
|
||||
fmt_scalar, hk_data[current_idx : current_idx + inc_len_scalar]
|
||||
)
|
||||
]
|
||||
current_idx += inc_len_scalar
|
||||
alt = [
|
||||
f"{val:8.3f}"
|
||||
for val in struct.unpack(
|
||||
fmt_scalar, hk_data[current_idx: current_idx + inc_len_scalar]
|
||||
)
|
||||
]
|
||||
current_idx += inc_len_scalar
|
||||
pos = [
|
||||
f"{val:8.3f}"
|
||||
for val in struct.unpack(
|
||||
@ -944,8 +952,9 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes):
|
||||
)
|
||||
]
|
||||
current_idx += inc_len_vec
|
||||
pw.dlog(f"GPS Latitude: {lat} [rad]")
|
||||
pw.dlog(f"GPS Longitude: {long} [rad]")
|
||||
pw.dlog(f"GPS Latitude: {lat} [deg]")
|
||||
pw.dlog(f"GPS Longitude: {long} [deg]")
|
||||
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)
|
||||
@ -976,7 +985,7 @@ def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
||||
current_idx = 0
|
||||
quat = struct.unpack(fmt_quat, hk_data[current_idx : current_idx + inc_len_quat])
|
||||
current_idx += inc_len_quat
|
||||
rate = struct.unpack(fmt_vec, hk_data[current_idx : current_idx + inc_len_vec])
|
||||
rate = struct.unpack(fmt_vec, hk_data[current_idx : current_idx + inc_len_vec])*180/math.pi
|
||||
current_idx += inc_len_vec
|
||||
status = struct.unpack(fmt_sts, hk_data[current_idx : current_idx + inc_len_sts])[0]
|
||||
current_idx += inc_len_sts
|
||||
@ -1013,14 +1022,14 @@ def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
||||
]
|
||||
current_idx += inc_len_quat
|
||||
err_ang = [
|
||||
f"{val:8.3f}"
|
||||
f"{val*180/math.pi:8.3f}"
|
||||
for val in struct.unpack(
|
||||
fmt_scalar, hk_data[current_idx : current_idx + inc_len_scalar]
|
||||
)
|
||||
]
|
||||
current_idx += inc_len_scalar
|
||||
tgt_rot = [
|
||||
f"{val:8.3f}"
|
||||
f"{val*180/math.pi:8.3f}"
|
||||
for val in struct.unpack(
|
||||
fmt_vec, hk_data[current_idx : current_idx + inc_len_vec]
|
||||
)
|
||||
@ -1028,8 +1037,8 @@ def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
||||
current_idx += inc_len_vec
|
||||
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} [rad]")
|
||||
pw.dlog(f"Control Values Target Rotational Rate: {tgt_rot} [rad/s]")
|
||||
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)
|
||||
|
||||
|
||||
|
16
eive_tmtc/tmtc/acs/defs.py
Normal file
16
eive_tmtc/tmtc/acs/defs.py
Normal file
@ -0,0 +1,16 @@
|
||||
import enum
|
||||
|
||||
|
||||
class AcsMode(enum.IntEnum):
|
||||
OFF = 0
|
||||
SAFE = 10
|
||||
IDLE = 11
|
||||
PTG_NADIR = 12
|
||||
PTG_TARGET = 13
|
||||
PTG_TARGET_GS = 14
|
||||
PTG_INERTIAL = 15
|
||||
|
||||
|
||||
class SafeSubmode(enum.IntEnum):
|
||||
DEFAULT = 0
|
||||
DETUMBLE = 1
|
@ -439,6 +439,8 @@ def handle_imtq_hk(printer: FsfwTmTcPrinter, hk_data: bytes, set_id: int):
|
||||
return handle_raw_mtm_measurement(printer, hk_data, False)
|
||||
elif set_id == ImtqSetId.RAW_MTM_WITH_TORQUE:
|
||||
return handle_raw_mtm_measurement(printer, hk_data, True)
|
||||
elif set_id == ImtqSetId.DIPOLES:
|
||||
return handle_dipole_set(printer, hk_data)
|
||||
elif set_id == ImtqSetId.STATUS_SET:
|
||||
return handle_status_set(printer, hk_data)
|
||||
else:
|
||||
@ -455,6 +457,21 @@ def unpack_status_set(hk_data: bytes) -> List:
|
||||
return [status_mode, status_error, status_conf, status_uptime]
|
||||
|
||||
|
||||
def handle_dipole_set(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
pw = PrintWrapper(printer)
|
||||
pw.dlog("Received iMTQ dipole set")
|
||||
fmt_str = "!hhhH"
|
||||
fmt_len = struct.calcsize(fmt_str)
|
||||
(dipole_x, dipole_y, dipole_z, current_torque_duration) = struct.unpack(
|
||||
fmt_str, hk_data[0:8]
|
||||
)
|
||||
pw.dlog(f"Dipole X: {dipole_x}")
|
||||
pw.dlog(f"Dipole Y: {dipole_y}")
|
||||
pw.dlog(f"Dipole Z: {dipole_z}")
|
||||
pw.dlog(f"Current torque duration: {current_torque_duration}")
|
||||
pw.printer.print_validity_buffer(hk_data[fmt_len:], 2)
|
||||
|
||||
|
||||
def unpack_eng_hk(hk_data: bytes) -> List:
|
||||
digital_voltage = struct.unpack("!H", hk_data[0:2])[0]
|
||||
analog_voltage = struct.unpack("!H", hk_data[2:4])[0]
|
||||
|
@ -5,20 +5,21 @@
|
||||
@author J. Meier
|
||||
@date 14.08.2021
|
||||
"""
|
||||
import datetime
|
||||
import enum
|
||||
import logging
|
||||
import struct
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from eive_tmtc.utility.input_helper import InputHelper
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
|
||||
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
from eive_tmtc.utility.input_helper import InputHelper
|
||||
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@ -677,6 +678,89 @@ def get_upload_image() -> str:
|
||||
return image
|
||||
|
||||
|
||||
def handle_str_hk_data(set_id: int, hk_data: bytes, printer: FsfwTmTcPrinter):
|
||||
pw = PrintWrapper(printer)
|
||||
pw.dlog(f"Received STR HK set with set ID {set_id}")
|
||||
if set_id == SetId.SOLUTION:
|
||||
handle_solution_set(hk_data, pw)
|
||||
else:
|
||||
_LOGGER.warning(f"HK parsing for Star Tracker set ID {set_id} unimplemented")
|
||||
|
||||
|
||||
def handle_solution_set(hk_data: bytes, pw: PrintWrapper):
|
||||
pw.dlog("Received solution set")
|
||||
ticks_time_fmt = "!IQ"
|
||||
current_idx = 0
|
||||
fmt_len = struct.calcsize(ticks_time_fmt)
|
||||
(ticks, unix_time) = struct.unpack(
|
||||
ticks_time_fmt, hk_data[current_idx : current_idx + fmt_len]
|
||||
)
|
||||
unix_as_dt = datetime.datetime.fromtimestamp(unix_time, tz=datetime.timezone.utc)
|
||||
pw.dlog(f"Ticks: {ticks} | UNIX time: {unix_time}")
|
||||
pw.dlog(f"UNIX as datetime: {unix_as_dt}")
|
||||
current_idx += fmt_len
|
||||
calib_quaternions_fmt = "!ffff"
|
||||
fmt_len = struct.calcsize(calib_quaternions_fmt)
|
||||
(calib_q_w, calib_q_x, calib_q_y, calib_q_z) = struct.unpack(
|
||||
calib_quaternions_fmt, hk_data[current_idx : current_idx + fmt_len]
|
||||
)
|
||||
pw.dlog("Calibrated Quaternions")
|
||||
pw.dlog(f"Quaternion w: {calib_q_w}")
|
||||
pw.dlog(f"Quaternion x: {calib_q_x}")
|
||||
pw.dlog(f"Quaternion y: {calib_q_y}")
|
||||
pw.dlog(f"Quaternion z: {calib_q_z}")
|
||||
current_idx += fmt_len
|
||||
track_fmt = "!fffff"
|
||||
fmt_len = struct.calcsize(track_fmt)
|
||||
(track_confidence, track_q_w, track_q_x, track_q_y, track_q_z) = struct.unpack(
|
||||
track_fmt, hk_data[current_idx : current_idx + fmt_len]
|
||||
)
|
||||
pw.dlog(f"Track Confidence: {track_confidence}")
|
||||
pw.dlog(f"Track QW: {track_q_w}")
|
||||
pw.dlog(f"Track QX: {track_q_x}")
|
||||
pw.dlog(f"Track QY: {track_q_y}")
|
||||
pw.dlog(f"Track QZ: {track_q_z}")
|
||||
current_idx += fmt_len
|
||||
track_removed = hk_data[current_idx]
|
||||
pw.dlog(f"Number of stars removed from tracking solution: {track_removed}")
|
||||
current_idx += 1
|
||||
stars_centroided = hk_data[current_idx]
|
||||
pw.dlog(f"Centroided stars: {stars_centroided}")
|
||||
current_idx += 1
|
||||
stars_matched_database = hk_data[current_idx]
|
||||
pw.dlog(f"Stars matched: {stars_matched_database}")
|
||||
current_idx += 1
|
||||
# Result of LISA: Lost in space algorithm
|
||||
lisa_fmt = "!fffffB"
|
||||
fmt_len = struct.calcsize(track_fmt)
|
||||
(
|
||||
lisa_q_w,
|
||||
lisa_q_x,
|
||||
lisa_q_y,
|
||||
lisa_q_z,
|
||||
lisa_percentage_close_stars,
|
||||
lisa_number_close_stars,
|
||||
) = struct.unpack(lisa_fmt, hk_data[current_idx : current_idx + fmt_len])
|
||||
pw.dlog(f"LISA QW: {lisa_q_w}")
|
||||
pw.dlog(f"LISA QX: {lisa_q_x}")
|
||||
pw.dlog(f"LISA QY: {lisa_q_y}")
|
||||
pw.dlog(f"LISA QZ: {lisa_q_z}")
|
||||
pw.dlog(
|
||||
f"Percentage of close stars in LISA solution: {lisa_percentage_close_stars}"
|
||||
)
|
||||
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}")
|
||||
current_idx += 1
|
||||
stable_count = struct.unpack("!I", hk_data[current_idx : current_idx + 4])
|
||||
pw.dlog(f"Stable count: {stable_count}")
|
||||
current_idx += 4
|
||||
solution_strategy = hk_data[current_idx]
|
||||
pw.dlog(f"Solution strategy: {solution_strategy}")
|
||||
pw.printer.print_validity_buffer(hk_data[current_idx:], 23)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_str_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
|
@ -1,6 +1,7 @@
|
||||
import enum
|
||||
from typing import Tuple, Dict
|
||||
|
||||
from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||
from eive_tmtc.config.object_ids import ACS_SUBSYSTEM_ID
|
||||
@ -27,17 +28,6 @@ class OpCode(str, enum.Enum):
|
||||
REPORT_ALL_MODES = "all_modes"
|
||||
|
||||
|
||||
class AcsMode(enum.IntEnum):
|
||||
OFF = 0
|
||||
SAFE = 10
|
||||
DETUMBLE = 11
|
||||
IDLE = 12
|
||||
PTG_TARGET_NADIR = 13
|
||||
PTG_TARGET = 14
|
||||
PTG_TARGET_GS = 15
|
||||
PTG_TARGET_INERTIAL = 16
|
||||
|
||||
|
||||
class Info(str, enum.Enum):
|
||||
OFF = "Off Command"
|
||||
SAFE = "Safe Mode Command"
|
||||
@ -50,15 +40,15 @@ class Info(str, enum.Enum):
|
||||
REPORT_ALL_MODES = "Report All Modes Recursively"
|
||||
|
||||
|
||||
HANDLER_LIST: Dict[str, Tuple[int, str]] = {
|
||||
OpCode.OFF: (AcsMode.OFF, Info.OFF),
|
||||
OpCode.SAFE: (AcsMode.SAFE, Info.SAFE),
|
||||
OpCode.DETUMBLE: (AcsMode.DETUMBLE, Info.DETUMBLE),
|
||||
OpCode.IDLE: (AcsMode.IDLE, Info.IDLE),
|
||||
OpCode.PTG_TARGET: (AcsMode.PTG_TARGET, Info.PTG_TARGET),
|
||||
OpCode.PTG_TARGET_GS: (AcsMode.PTG_TARGET_GS, Info.PTG_TARGET_GS),
|
||||
OpCode.PTG_TARGET_NADIR: (AcsMode.PTG_TARGET_NADIR, Info.PTG_TARGET_NADIR),
|
||||
OpCode.PTG_TARGET_INERTIAL: (AcsMode.PTG_TARGET_INERTIAL, Info.PTG_TARGET_INERTIAL),
|
||||
HANDLER_LIST: Dict[str, Tuple[int, int, str]] = {
|
||||
OpCode.OFF: (AcsMode.OFF, 0, Info.OFF),
|
||||
OpCode.SAFE: (AcsMode.SAFE, SafeSubmode.DEFAULT, Info.SAFE),
|
||||
OpCode.DETUMBLE: (AcsMode.SAFE, SafeSubmode.DETUMBLE, Info.DETUMBLE),
|
||||
OpCode.IDLE: (AcsMode.IDLE, 0, Info.IDLE),
|
||||
OpCode.PTG_TARGET: (AcsMode.PTG_TARGET, 0, Info.PTG_TARGET),
|
||||
OpCode.PTG_TARGET_GS: (AcsMode.PTG_TARGET_GS, 0, Info.PTG_TARGET_GS),
|
||||
OpCode.PTG_TARGET_NADIR: (AcsMode.PTG_NADIR, 0, Info.PTG_TARGET_NADIR),
|
||||
OpCode.PTG_TARGET_INERTIAL: (AcsMode.PTG_INERTIAL, 0, Info.PTG_TARGET_INERTIAL),
|
||||
}
|
||||
|
||||
|
||||
@ -81,9 +71,9 @@ def build_acs_subsystem_cmd(p: ServiceProviderParams):
|
||||
return
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_SUBSYSTEM_ID,
|
||||
info=f"{info_prefix}: {mode_info_tup[1]}",
|
||||
submode=0,
|
||||
info=f"{info_prefix}: {mode_info_tup[2]}",
|
||||
mode=mode_info_tup[0],
|
||||
submode=mode_info_tup[1],
|
||||
q=q,
|
||||
)
|
||||
|
||||
@ -91,7 +81,7 @@ def build_acs_subsystem_cmd(p: ServiceProviderParams):
|
||||
@tmtc_definitions_provider
|
||||
def add_acs_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
for op_code, (_, info) in HANDLER_LIST.items():
|
||||
for op_code, (_, _, info) in HANDLER_LIST.items():
|
||||
oce.add(op_code, info)
|
||||
oce.add(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES)
|
||||
defs.add_service(CustomServiceList.ACS_SS, "ACS Subsystem", oce)
|
||||
|
@ -22,6 +22,7 @@ class ActionId(enum.IntEnum):
|
||||
LIST_DIR_INTO_FILE = 0
|
||||
ANNOUNCE_VERSION = 1
|
||||
ANNOUNCE_CURRENT_IMAGE = 2
|
||||
ANNOUNCE_BOOT_COUNTS = 3
|
||||
SWITCH_REBOOT_FILE_HANDLING = 5
|
||||
RESET_REBOOT_COUNTER = 6
|
||||
SWITCH_IMG_LOCK = 7
|
||||
@ -43,33 +44,35 @@ class SetId(enum.IntEnum):
|
||||
class OpCode:
|
||||
ANNOUNCE_VERSION = "announce_version"
|
||||
ANNOUNCE_CURRENT_IMAGE = "announce_current_image"
|
||||
REBOOT_XSC = ["0", "reboot_xsc"]
|
||||
XSC_REBOOT_SELF = ["1", "reboot_self"]
|
||||
XSC_REBOOT_0_0 = ["2", "reboot_00"]
|
||||
XSC_REBOOT_0_1 = ["3", "reboot_01"]
|
||||
XSC_REBOOT_1_0 = ["4", "reboot_10"]
|
||||
XSC_REBOOT_1_1 = ["5", "reboot_11"]
|
||||
REBOOT_FULL = ["6", "reboot_regular"]
|
||||
GET_HK = ["7", "get_hk"]
|
||||
ANNOUNCE_BOOT_COUNTS = "announce_boot_counts"
|
||||
REBOOT_XSC = ["reboot_xsc"]
|
||||
XSC_REBOOT_SELF = ["reboot_self"]
|
||||
XSC_REBOOT_0_0 = ["reboot_00"]
|
||||
XSC_REBOOT_0_1 = ["reboot_01"]
|
||||
XSC_REBOOT_1_0 = ["reboot_10"]
|
||||
XSC_REBOOT_1_1 = ["reboot_11"]
|
||||
REBOOT_FULL = ["reboot_regular"]
|
||||
GET_HK = ["get_hk"]
|
||||
OBSW_UPDATE_FROM_SD_0 = ["obsw_update_sd0"]
|
||||
OBSW_UPDATE_FROM_SD_1 = ["obsw_update_sd1"]
|
||||
OBSW_UPDATE_FROM_TMP = ["obsw_update_tmp"]
|
||||
SWITCH_TO_SD_0 = ["switch_to_sd_0"]
|
||||
SWITCH_TO_SD_1 = ["switch_to_sd_1"]
|
||||
SWITCH_TO_BOTH_SD_CARDS = ["switch_to_both_sd_cards"]
|
||||
ENABLE_REBOOT_FILE_HANDLING = ["32", "rbh_off"]
|
||||
DISABLE_REBOOT_FILE_HANDLING = ["33", "rbh_on"]
|
||||
RESET_ALL_REBOOT_COUNTERS = ["34", "rbh_reset_a"]
|
||||
RESET_REBOOT_COUNTER_00 = ["35", "rbh_reset_00"]
|
||||
RESET_REBOOT_COUNTER_01 = ["36", "rbh_reset_01"]
|
||||
RESET_REBOOT_COUNTER_10 = ["37", "rbh_reset_10"]
|
||||
RESET_REBOOT_COUNTER_11 = ["38", "rbh_reset_11"]
|
||||
SET_MAX_REBOOT_CNT = ["39", "rbh_max_cnt"]
|
||||
ENABLE_REBOOT_FILE_HANDLING = ["rbh_off"]
|
||||
DISABLE_REBOOT_FILE_HANDLING = ["rbh_on"]
|
||||
RESET_ALL_REBOOT_COUNTERS = ["rbh_reset_a"]
|
||||
RESET_REBOOT_COUNTER_00 = ["rbh_reset_00"]
|
||||
RESET_REBOOT_COUNTER_01 = ["rbh_reset_01"]
|
||||
RESET_REBOOT_COUNTER_10 = ["rbh_reset_10"]
|
||||
RESET_REBOOT_COUNTER_11 = ["rbh_reset_11"]
|
||||
SET_MAX_REBOOT_CNT = ["rbh_max_cnt"]
|
||||
|
||||
|
||||
class Info:
|
||||
ANNOUNCE_VERSION = "Announce version"
|
||||
ANNOUNCE_CURRENT_IMAGE = "Announce current image"
|
||||
ANNOUNCE_BOOT_COUNTS = "Announce boot counts"
|
||||
REBOOT_XSC = "XSC reboot with prompt"
|
||||
REBOOT_FULL = "Full regular reboot"
|
||||
OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0"
|
||||
@ -97,6 +100,7 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(keys=OpCode.ANNOUNCE_VERSION, info=Info.ANNOUNCE_VERSION)
|
||||
oce.add(keys=OpCode.ANNOUNCE_CURRENT_IMAGE, info=Info.ANNOUNCE_CURRENT_IMAGE)
|
||||
oce.add(keys=OpCode.ANNOUNCE_BOOT_COUNTS, info=Info.ANNOUNCE_BOOT_COUNTS)
|
||||
oce.add(keys=OpCode.REBOOT_XSC, info=Info.REBOOT_XSC)
|
||||
oce.add(keys=OpCode.REBOOT_XSC, info=Info.REBOOT_XSC)
|
||||
oce.add(keys=OpCode.REBOOT_FULL, info=Info.REBOOT_FULL)
|
||||
@ -153,12 +157,17 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
if op_code == OpCode.ANNOUNCE_VERSION:
|
||||
q.add_log_cmd(f"{Info.ANNOUNCE_VERSION}")
|
||||
q.add_pus_tc(create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_VERSION))
|
||||
if op_code == OpCode.ANNOUNCE_CURRENT_IMAGE:
|
||||
elif op_code == OpCode.ANNOUNCE_CURRENT_IMAGE:
|
||||
q.add_log_cmd(f"{Info.ANNOUNCE_CURRENT_IMAGE}")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_CURRENT_IMAGE)
|
||||
)
|
||||
if op_code in OpCode.REBOOT_XSC:
|
||||
elif op_code == OpCode.ANNOUNCE_BOOT_COUNTS:
|
||||
q.add_log_cmd(f"{Info.ANNOUNCE_BOOT_COUNTS}")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_BOOT_COUNTS)
|
||||
)
|
||||
elif op_code in OpCode.REBOOT_XSC:
|
||||
reboot_self, chip_select, copy_select = determine_reboot_params()
|
||||
add_xsc_reboot_cmd(
|
||||
q=q,
|
||||
@ -166,38 +175,38 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
chip=chip_select,
|
||||
copy=copy_select,
|
||||
)
|
||||
if op_code in OpCode.REBOOT_FULL:
|
||||
elif op_code in OpCode.REBOOT_FULL:
|
||||
q.add_log_cmd(f"Core Command: {Info.REBOOT_FULL}")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID, action_id=ActionId.FULL_REBOOT
|
||||
)
|
||||
)
|
||||
if op_code in OpCode.XSC_REBOOT_SELF:
|
||||
elif op_code in OpCode.XSC_REBOOT_SELF:
|
||||
add_xsc_reboot_cmd(q=q, reboot_self=True)
|
||||
if op_code in OpCode.XSC_REBOOT_0_0:
|
||||
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
|
||||
)
|
||||
if op_code in OpCode.XSC_REBOOT_0_1:
|
||||
elif op_code in OpCode.XSC_REBOOT_0_1:
|
||||
add_xsc_reboot_cmd(
|
||||
q=q,
|
||||
reboot_self=False,
|
||||
chip=Chip.CHIP_0,
|
||||
copy=Copy.COPY_1_GOLD,
|
||||
)
|
||||
if op_code in OpCode.XSC_REBOOT_1_0:
|
||||
elif op_code in OpCode.XSC_REBOOT_1_0:
|
||||
add_xsc_reboot_cmd(
|
||||
q=q, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_0_NOM
|
||||
)
|
||||
if op_code in OpCode.XSC_REBOOT_1_1:
|
||||
elif op_code in OpCode.XSC_REBOOT_1_1:
|
||||
add_xsc_reboot_cmd(
|
||||
q=q,
|
||||
reboot_self=False,
|
||||
chip=Chip.CHIP_1,
|
||||
copy=Copy.COPY_1_GOLD,
|
||||
)
|
||||
if op_code in OpCode.DISABLE_REBOOT_FILE_HANDLING:
|
||||
elif op_code in OpCode.DISABLE_REBOOT_FILE_HANDLING:
|
||||
q.add_log_cmd("Disabling reboot file handling")
|
||||
user_data = bytearray([0])
|
||||
q.add_pus_tc(
|
||||
@ -207,7 +216,7 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
user_data=user_data,
|
||||
)
|
||||
)
|
||||
if op_code in OpCode.ENABLE_REBOOT_FILE_HANDLING:
|
||||
elif op_code in OpCode.ENABLE_REBOOT_FILE_HANDLING:
|
||||
q.add_log_cmd("Enabling reboot file handling")
|
||||
user_data = bytearray([1])
|
||||
q.add_pus_tc(
|
||||
@ -217,7 +226,7 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
user_data=user_data,
|
||||
)
|
||||
)
|
||||
if op_code in OpCode.RESET_ALL_REBOOT_COUNTERS:
|
||||
elif op_code in OpCode.RESET_ALL_REBOOT_COUNTERS:
|
||||
q.add_log_cmd("Resetting all reboot counters")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
@ -225,38 +234,38 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
action_id=ActionId.RESET_REBOOT_COUNTER,
|
||||
)
|
||||
)
|
||||
if op_code in OpCode.RESET_REBOOT_COUNTER_00:
|
||||
elif op_code in OpCode.RESET_REBOOT_COUNTER_00:
|
||||
reset_specific_boot_counter(q, 0, 0)
|
||||
if op_code in OpCode.RESET_REBOOT_COUNTER_01:
|
||||
elif op_code in OpCode.RESET_REBOOT_COUNTER_01:
|
||||
reset_specific_boot_counter(q, 0, 1)
|
||||
if op_code in OpCode.RESET_REBOOT_COUNTER_10:
|
||||
elif op_code in OpCode.RESET_REBOOT_COUNTER_10:
|
||||
reset_specific_boot_counter(q, 1, 0)
|
||||
if op_code in OpCode.RESET_REBOOT_COUNTER_11:
|
||||
elif op_code in OpCode.RESET_REBOOT_COUNTER_11:
|
||||
reset_specific_boot_counter(q, 1, 1)
|
||||
if op_code in OpCode.OBSW_UPDATE_FROM_SD_0:
|
||||
elif op_code in OpCode.OBSW_UPDATE_FROM_SD_0:
|
||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_0)
|
||||
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_SD_0))
|
||||
if op_code in OpCode.OBSW_UPDATE_FROM_SD_1:
|
||||
elif op_code in OpCode.OBSW_UPDATE_FROM_SD_1:
|
||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_1)
|
||||
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_SD_1))
|
||||
if op_code in OpCode.OBSW_UPDATE_FROM_TMP:
|
||||
elif op_code in OpCode.OBSW_UPDATE_FROM_TMP:
|
||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_TMP)
|
||||
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_TMP))
|
||||
if op_code in OpCode.SWITCH_TO_SD_0:
|
||||
elif op_code in OpCode.SWITCH_TO_SD_0:
|
||||
q.add_log_cmd(Info.SWITCH_TO_SD_0)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID, action_id=ActionId.SWITCH_TO_SD_0
|
||||
)
|
||||
)
|
||||
if op_code in OpCode.SWITCH_TO_SD_1:
|
||||
elif op_code in OpCode.SWITCH_TO_SD_1:
|
||||
q.add_log_cmd(Info.SWITCH_TO_SD_1)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID, action_id=ActionId.SWITCH_TO_SD_1
|
||||
)
|
||||
)
|
||||
if op_code in OpCode.SWITCH_TO_BOTH_SD_CARDS:
|
||||
elif op_code in OpCode.SWITCH_TO_BOTH_SD_CARDS:
|
||||
while True:
|
||||
active_sd_card = int(input("Please specify active SD cqrd [0/1]: "))
|
||||
if active_sd_card not in [0, 1]:
|
||||
@ -270,10 +279,12 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
user_data=bytes([active_sd_card]),
|
||||
)
|
||||
)
|
||||
if op_code in OpCode.GET_HK:
|
||||
elif op_code in OpCode.GET_HK:
|
||||
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))
|
||||
else:
|
||||
_LOGGER.warning(f"Unknown operation code {op_code} for core controller commands")
|
||||
|
||||
|
||||
def reset_specific_boot_counter(q: DefaultPusQueueHelper, chip: int, copy: int):
|
||||
|
@ -1,4 +1,7 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.tmtc.obj_prompt import prompt_object
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from tmtccmd.config.tmtc import (
|
||||
tmtc_definitions_provider,
|
||||
@ -6,33 +9,58 @@ from tmtccmd.config.tmtc import (
|
||||
OpCodeEntry,
|
||||
)
|
||||
from tmtccmd.tc import service_provider
|
||||
from tmtccmd.pus.s201_fsfw_health import Subservice
|
||||
from tmtccmd.pus.s201_fsfw_health import Subservice, FsfwHealth
|
||||
from tmtccmd.tc.decorator import ServiceProviderParams
|
||||
|
||||
|
||||
class OpCode:
|
||||
SET_HEALTH = "set_health"
|
||||
ANNOUNCE_HEALTH_ALL = "read_health_all"
|
||||
ANNOUNCE_HEALTH = "read_health"
|
||||
|
||||
|
||||
class Info:
|
||||
SET_HEALTH = "Set health of specific object"
|
||||
ANNOUNCE_HEALTH_ALL = "Read all health states"
|
||||
ANNOUNCE_HEALTH = "Read health state of one object"
|
||||
|
||||
|
||||
def prompt_health() -> FsfwHealth:
|
||||
for item in FsfwHealth:
|
||||
print(f"{item}: {item.name}")
|
||||
health_idx = int(input("Please enter health by index: "))
|
||||
return FsfwHealth(health_idx)
|
||||
|
||||
|
||||
@service_provider(CustomServiceList.HEALTH)
|
||||
def pack_test_command(p: ServiceProviderParams):
|
||||
o = p.op_code
|
||||
q = p.queue_helper
|
||||
if o == OpCode.ANNOUNCE_HEALTH:
|
||||
raise NotImplementedError()
|
||||
if o == OpCode.SET_HEALTH:
|
||||
app_data = bytearray(prompt_object())
|
||||
health = prompt_health()
|
||||
app_data.append(health)
|
||||
q.add_log_cmd(Info.SET_HEALTH)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=201, subservice=Subservice.TC_SET_HEALTH, app_data=app_data
|
||||
)
|
||||
)
|
||||
elif o == OpCode.ANNOUNCE_HEALTH:
|
||||
app_data = bytearray(prompt_object())
|
||||
q.add_log_cmd(Info.ANNOUNCE_HEALTH)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=201, subservice=Subservice.TC_ANNOUNCE_HEALTH, app_data=app_data
|
||||
)
|
||||
)
|
||||
elif o == OpCode.ANNOUNCE_HEALTH_ALL:
|
||||
q.add_log_cmd(Info.ANNOUNCE_HEALTH_ALL)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(service=201, subservice=Subservice.TC_ANNOUNCE_HEALTH_ALL)
|
||||
)
|
||||
return
|
||||
raise ValueError(f"unknown op code {o} for service {CustomServiceList.HEALTH}")
|
||||
else:
|
||||
raise ValueError(f"unknown op code {o} for service {CustomServiceList.HEALTH}")
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
@ -40,4 +68,5 @@ def add_health_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(OpCode.ANNOUNCE_HEALTH_ALL, Info.ANNOUNCE_HEALTH_ALL)
|
||||
oce.add(OpCode.ANNOUNCE_HEALTH, Info.ANNOUNCE_HEALTH)
|
||||
oce.add(OpCode.SET_HEALTH, Info.SET_HEALTH)
|
||||
defs.add_service(CustomServiceList.HEALTH, info="Health Service", op_code_entry=oce)
|
||||
|
43
eive_tmtc/tmtc/obj_prompt.py
Normal file
43
eive_tmtc/tmtc/obj_prompt.py
Normal file
@ -0,0 +1,43 @@
|
||||
from eive_tmtc.config.object_ids import (
|
||||
ACS_SUBSYSTEM_ID,
|
||||
ACS_CONTROLLER,
|
||||
IMTQ_HANDLER_ID,
|
||||
GYRO_0_ADIS_HANDLER_ID,
|
||||
GYRO_1_L3G_HANDLER_ID,
|
||||
ACS_BOARD_ASS_ID,
|
||||
RW_ASSEMBLY,
|
||||
SUS_BOARD_ASS_ID,
|
||||
)
|
||||
|
||||
SUBSYSTEM_DICT = {
|
||||
0: "acs",
|
||||
1: "tcs",
|
||||
2: "com",
|
||||
}
|
||||
|
||||
ACS_OBJ_DICT = {
|
||||
0: ("Subsystem", ACS_SUBSYSTEM_ID),
|
||||
1: ("SUS Assembly", SUS_BOARD_ASS_ID),
|
||||
2: ("ACS Board Assembly", ACS_BOARD_ASS_ID),
|
||||
3: ("RW Assembly", RW_ASSEMBLY),
|
||||
4: ("iMTQ MGT", IMTQ_HANDLER_ID),
|
||||
5: ("GYR 0 ADIS", GYRO_0_ADIS_HANDLER_ID),
|
||||
6: ("GYR 1 L3G", GYRO_1_L3G_HANDLER_ID),
|
||||
}
|
||||
|
||||
|
||||
def prompt_object() -> bytes:
|
||||
for k, v in SUBSYSTEM_DICT.items():
|
||||
print(f"{k}: {v}")
|
||||
subsystem_key = int(input("Please specify target subsystem by key: "))
|
||||
subsystem = SUBSYSTEM_DICT[subsystem_key]
|
||||
if subsystem is None:
|
||||
raise ValueError("invalid key")
|
||||
if subsystem == "acs":
|
||||
for k, v in ACS_OBJ_DICT.items():
|
||||
print(f"{k}: {v[0]}")
|
||||
obj_key = int(input("Please specify target object by key: "))
|
||||
acs_obj = ACS_OBJ_DICT[obj_key]
|
||||
if acs_obj is None:
|
||||
raise ValueError("invalid key")
|
||||
return acs_obj[1]
|
@ -21,26 +21,26 @@ from spacepackets.ecss.tc import PusTelecommand
|
||||
|
||||
|
||||
class Heater(enum.IntEnum):
|
||||
HEATER_0_OBC_BRD = 0
|
||||
HEATER_1_PLOC_PROC_BRD = 1
|
||||
HEATER_0_PLOC_PROC_BRD = 0
|
||||
HEATER_1_PCDU_BRD = 1
|
||||
HEATER_2_ACS_BRD = 2
|
||||
HEATER_3_PCDU_PDU = 3
|
||||
HEATER_3_OBC_BRD = 3
|
||||
HEATER_4_CAMERA = 4
|
||||
HEATER_5_STR = 5
|
||||
HEATER_6_DRO = 6
|
||||
HEATER_7_HPA = 7
|
||||
HEATER_7_SYRLINKS = 7
|
||||
NUMBER_OF_SWITCHES = 8
|
||||
|
||||
|
||||
HEATER_LOCATION = [
|
||||
"OBC Board",
|
||||
"PLOC Processing Board",
|
||||
"ACS Board",
|
||||
"PCDU PDU",
|
||||
"ACS Board",
|
||||
"OBC Board",
|
||||
"Camera",
|
||||
"Startracker",
|
||||
"DRO",
|
||||
"HPA",
|
||||
"Syrlinks",
|
||||
]
|
||||
|
||||
|
||||
@ -135,25 +135,25 @@ def pack_heater_cmds(object_id: bytearray, op_code: str, q: DefaultPusQueueHelpe
|
||||
|
||||
def heater_idx_to_obj(heater: int) -> ObjectIdU32:
|
||||
from eive_tmtc.config.object_ids import (
|
||||
HEATER_0_OBC_BRD,
|
||||
HEATER_1_PLOC_PROC_BRD,
|
||||
HEATER_0_PLOC_PROC_BRD,
|
||||
HEATER_1_PCDU_BRD,
|
||||
HEATER_2_ACS_BRD,
|
||||
HEATER_3_PCDU_BRD,
|
||||
HEATER_3_OBC_BRD,
|
||||
HEATER_4_CAMERA,
|
||||
HEATER_5_STR,
|
||||
HEATER_6_DRO,
|
||||
HEATER_7_HPA,
|
||||
HEATER_7_SYRLINKS,
|
||||
)
|
||||
|
||||
obj_id_array = [
|
||||
HEATER_0_OBC_BRD,
|
||||
HEATER_1_PLOC_PROC_BRD,
|
||||
HEATER_0_PLOC_PROC_BRD,
|
||||
HEATER_1_PCDU_BRD,
|
||||
HEATER_2_ACS_BRD,
|
||||
HEATER_3_PCDU_BRD,
|
||||
HEATER_3_OBC_BRD,
|
||||
HEATER_4_CAMERA,
|
||||
HEATER_5_STR,
|
||||
HEATER_6_DRO,
|
||||
HEATER_7_HPA,
|
||||
HEATER_7_SYRLINKS,
|
||||
]
|
||||
obj_dict = get_object_ids()
|
||||
obj_id_obj = obj_dict.get(obj_id_array[heater])
|
||||
@ -171,7 +171,7 @@ def prompt_heater() -> int:
|
||||
print("HEATER 4 | CAMERA")
|
||||
print("HEATER 5 | STR")
|
||||
print("HEATER 6 | DRO")
|
||||
print("HEATER 7 | HPA")
|
||||
print("HEATER 7 | Syrlinks")
|
||||
heater_number = input("Type number of heater to switch [0-7]: ")
|
||||
if not heater_number.isdigit():
|
||||
print("Heater number not a digit")
|
||||
|
@ -40,7 +40,7 @@ class Tmp1075ActionId(enum.IntEnum):
|
||||
|
||||
|
||||
class SetId:
|
||||
TMEPERATURE = 1
|
||||
TEMPERATURE = 1
|
||||
|
||||
|
||||
def pack_tmp1075_test_into(
|
||||
@ -64,7 +64,7 @@ def pack_tmp1075_test_into(
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||
if op_code == OpCode.HK:
|
||||
q.add_log_cmd("TMP1075: Request One-Shot HK")
|
||||
q.add_pus_tc(create_request_one_hk_command(make_sid(obyt, SetId.TMEPERATURE)))
|
||||
q.add_pus_tc(create_request_one_hk_command(make_sid(obyt, SetId.TEMPERATURE)))
|
||||
return q
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user