Compare commits
68 Commits
Author | SHA1 | Date | |
---|---|---|---|
970c8998f0 | |||
8a87d83653 | |||
cf55b3630c | |||
656e75052b | |||
e91bf01daf | |||
eae0120643 | |||
fc3cf480dc | |||
acca981260 | |||
822eaa4c89 | |||
252d140b8e | |||
4a990e704b
|
|||
522f273c99
|
|||
1724a90a26
|
|||
7b21070363
|
|||
d390168829 | |||
a969481698
|
|||
8bdba71dc3 | |||
e3800ac0c9 | |||
8804a4e8e9
|
|||
1548278ad6 | |||
148a52a69a | |||
ac140aeb2c | |||
a5a30d37eb
|
|||
d9194207a4
|
|||
14d14f12c0 | |||
17dd9de51e | |||
238bbd5843 | |||
de02d81e1d | |||
e45072c38d | |||
fe96f115d5 | |||
e9e43f03d2 | |||
aab093cc0a
|
|||
c6c4b9a995 | |||
6182369e4f | |||
620360c8e8 | |||
49dde29847 | |||
d23c0c20fc | |||
ef1da1e882
|
|||
6ec0ce20fa
|
|||
5f379bf2bb | |||
7c1e7226e0 | |||
b8e1c7afe9 | |||
280c72439e | |||
14c42a91ff | |||
dd3e4c649b | |||
3b16717ce2 | |||
f1a0334d3d | |||
0c1bfc6fd3
|
|||
04bbe057e7
|
|||
e05a54b076
|
|||
ef0adef04a
|
|||
377e98b5c2
|
|||
87e5abe8eb
|
|||
f090c3af66 | |||
13fd9a7d84 | |||
bbcc0f9de7 | |||
a0aa6525e4
|
|||
1ab8710040 | |||
f480d86fbd
|
|||
4d921e01af | |||
b505524e0b | |||
e0e9a310b9
|
|||
0e9ebefc87
|
|||
e85d1a1966 | |||
4ff50b6559 | |||
60fba8b6d9 | |||
1707f24612 | |||
5fbd19bb6c |
93
CHANGELOG.md
93
CHANGELOG.md
@ -10,93 +10,6 @@ list yields a list of all related PRs for each release.
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
# [v5.5.1] 2023-09-12
|
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- Some API usage fixes related to `tmtccmd` update.
|
|
||||||
|
|
||||||
# [v5.5.0] 2023-09-12
|
|
||||||
|
|
||||||
- Version is not specfied dynamically anymore and can be updated in `pyproject.toml`
|
|
||||||
- New events and returnvalues
|
|
||||||
- Bump `tmtccmd` to v6.0.0rc0
|
|
||||||
|
|
||||||
# [v5.4.3] 2023-08-15
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- PLOC SUPV HK parsing.
|
|
||||||
|
|
||||||
# [v5.4.2] 2023-08-15
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- New NONE entry for PL PCDU submode enum.
|
|
||||||
|
|
||||||
# [v5.4.1] 2023-08-15
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- New event TLE_TOO_OLD
|
|
||||||
|
|
||||||
## Changed
|
|
||||||
|
|
||||||
- PL Subsystem mode ID is int enum now.
|
|
||||||
|
|
||||||
# [v5.4.0] 2023-08-15
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- New enumeration for PL PCDU commanding.
|
|
||||||
- Some new events
|
|
||||||
|
|
||||||
# [v5.3.1] 2023-07-26
|
|
||||||
|
|
||||||
## Changed
|
|
||||||
|
|
||||||
- Adaptions for ACS CTRL strategy enum to make it compatible to software. Also make it re-usable
|
|
||||||
by putting it in global scope.
|
|
||||||
|
|
||||||
# [v5.3.0] 2023-07-26
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- Dataset handling for new ACS fused rot rate dataset.
|
|
||||||
|
|
||||||
# [v5.2.0] 2023-07-13
|
|
||||||
|
|
||||||
- `tmtccmd` v5.0.0
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- New TCS controller events
|
|
||||||
|
|
||||||
## Changed
|
|
||||||
|
|
||||||
- HK level can be specified as CLI argument now.
|
|
||||||
|
|
||||||
# [v5.1.0] 2023-06-28
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- Internal error reporter dataset handling.
|
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- `APP_LOGGER` is the root logger now.
|
|
||||||
|
|
||||||
## Changed
|
|
||||||
|
|
||||||
- HK is only displayed in brief format per default now. This will soon be adaptable by CLI
|
|
||||||
argument.
|
|
||||||
|
|
||||||
# [v5.0.0] 2023-06-22
|
|
||||||
|
|
||||||
## Changed
|
|
||||||
|
|
||||||
- Force flag for copy helper.
|
|
||||||
|
|
||||||
# [v4.1.0] 2023-06-14
|
# [v4.1.0] 2023-06-14
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
@ -118,12 +31,6 @@ list yields a list of all related PRs for each release.
|
|||||||
- Fix for PLOC power switching.
|
- Fix for PLOC power switching.
|
||||||
- Bump `tmtccmd` to v5.0.0rc0 for important bugfix in CFDP header.
|
- Bump `tmtccmd` to v5.0.0rc0 for important bugfix in CFDP header.
|
||||||
|
|
||||||
# [v3.1.2] 2023-06-19
|
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- Pin `tmtccmd` to v4.1.3 to enforce correct `spacepackets` version on install
|
|
||||||
|
|
||||||
# [v3.1.1] 2023-04-17
|
# [v3.1.1] 2023-04-17
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
@ -1,7 +1,14 @@
|
|||||||
|
__version__ = "4.1.0"
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
SW_NAME = "eive-tmtc"
|
||||||
|
VERSION_MAJOR = 4
|
||||||
|
VERSION_MINOR = 1
|
||||||
|
VERSION_REVISION = 0
|
||||||
|
|
||||||
EIVE_TMTC_ROOT = Path(__file__).parent
|
EIVE_TMTC_ROOT = Path(__file__).parent
|
||||||
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
|
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
|
||||||
|
|
||||||
APP_LOGGER = logging.getLogger()
|
APP_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -65,13 +65,12 @@ class CustomServiceList(str, enum.Enum):
|
|||||||
PL_SS = "pl_subsystem"
|
PL_SS = "pl_subsystem"
|
||||||
ACS_BRD_ASS = "acs_brd_ass"
|
ACS_BRD_ASS = "acs_brd_ass"
|
||||||
SUS_BRD_ASS = "sus_brd_ass"
|
SUS_BRD_ASS = "sus_brd_ass"
|
||||||
TCS_SS = "tcs_subsystem"
|
TCS = "tcs"
|
||||||
TCS_CTRL = "tcs_ctrl"
|
|
||||||
TCS_ASS = "tcs_ass"
|
TCS_ASS = "tcs_ass"
|
||||||
TIME = "time"
|
TIME = "time"
|
||||||
PROCEDURE = "proc"
|
PROCEDURE = "proc"
|
||||||
RTD = "rtd"
|
RTD = "rtd"
|
||||||
TMP1075 = "tmp1075"
|
TMP1075 = "tcs_tmp"
|
||||||
TVTTESTPROCEDURE = "tvtestproc"
|
TVTTESTPROCEDURE = "tvtestproc"
|
||||||
SCEX = "scex"
|
SCEX = "scex"
|
||||||
TM_STORE = "tm_store"
|
TM_STORE = "tm_store"
|
||||||
|
@ -94,7 +94,6 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
11205;0x2bc5;MEKF_AUTOMATIC_RESET;INFO;MEKF performed an automatic reset after detection of nonfinite values.;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
|
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
|
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
|
||||||
11208;0x2bc8;TLE_TOO_OLD;INFO;The TLE for the SGP4 Propagator has become too old.;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
|
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
|
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
|
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/power/defs.h
|
||||||
@ -134,7 +133,6 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
11802;0x2e1a;RESET_OCCURED;LOW;No description;mission/acs/rwHelpers.h
|
11802;0x2e1a;RESET_OCCURED;LOW;No description;mission/acs/rwHelpers.h
|
||||||
11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;mission/acs/str/StarTrackerHandler.h
|
11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;mission/acs/str/StarTrackerHandler.h
|
||||||
11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;mission/acs/str/StarTrackerHandler.h
|
11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;mission/acs/str/StarTrackerHandler.h
|
||||||
11903;0x2e7f;COM_ERROR_REPLY_RECEIVED;LOW;Received COM error. P1: Communication Error ID (datasheet p32);mission/acs/str/StarTrackerHandler.h
|
|
||||||
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/PlocSupervisorHandler.h
|
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/PlocSupervisorHandler.h
|
||||||
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/PlocSupervisorHandler.h
|
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/PlocSupervisorHandler.h
|
||||||
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/PlocSupervisorHandler.h
|
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/PlocSupervisorHandler.h
|
||||||
@ -162,7 +160,6 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
12412;0x307c;PDEC_RESET_FAILED;HIGH;Failed to pull PDEC reset to low;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
|
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
|
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
|
||||||
12415;0x307f;PDEC_CONFIG_CORRUPTED;HIGH;The PDEC configuration area has been corrupted P1: The first configuration word P2: The second configuration word;linux/ipcore/pdec.h
|
|
||||||
12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/acs/StrComHandler.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
|
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
|
12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/acs/StrComHandler.h
|
||||||
@ -257,7 +254,6 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h
|
13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h
|
||||||
13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h
|
13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h
|
||||||
13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h
|
13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h
|
||||||
13803;0x35eb;FS_UNUSABLE;LOW;No description;mission/payload/scexHelpers.h
|
|
||||||
13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
||||||
13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
||||||
13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
||||||
@ -275,8 +271,6 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
14010;0x36ba;TRYING_I2C_RECOVERY;HIGH;I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C devices.;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
|
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
|
14012;0x36bc;PDEC_REBOOT;HIGH;PDEC recovery through reset was not possible, performing full reboot.;mission/sysDefs.h
|
||||||
14013;0x36bd;FIRMWARE_INFO;INFO;Version information of the firmware (not OBSW). 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.;mission/sysDefs.h
|
|
||||||
14014;0x36be;ACTIVE_SD_INFO;INFO;Active SD card info. SD States: 0: OFF, 1: ON, 2: MOUNTED. P1: Active SD Card Index, 0 if none is active P2: First two bytes: SD state of SD card 0, last two bytes SD state of SD card 1;mission/sysDefs.h
|
|
||||||
14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.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
|
14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||||
14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
||||||
@ -285,9 +279,6 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
14106;0x371a;PCDU_SYSTEM_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
|
14107;0x371b;HEATER_NOT_OFF_FOR_OFF_MODE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||||
14108;0x371c;MGT_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
14108;0x371c;MGT_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
||||||
14109;0x371d;TCS_SWITCHING_HEATER_ON;INFO;P1: Module index. P2: Heater index;mission/controller/tcsDefs.h
|
|
||||||
14110;0x371e;TCS_SWITCHING_HEATER_OFF;INFO;P1: Module index. P2: Heater index;mission/controller/tcsDefs.h
|
|
||||||
14111;0x371f;TCS_HEATER_MAX_BURN_TIME_REACHED;MEDIUM;P1: Heater index. P2: Maximum burn time for heater.;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
|
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
|
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
|
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
|
||||||
@ -303,5 +294,3 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
14312;0x37e8;DUMP_MISC_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
14312;0x37e8;DUMP_MISC_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||||
14313;0x37e9;DUMP_HK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
14313;0x37e9;DUMP_HK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||||
14314;0x37ea;DUMP_CFDP_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
14314;0x37ea;DUMP_CFDP_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||||
14500;0x38a4;TEMPERATURE_ALL_ONES_START;MEDIUM;Detected invalid values, starting invalid message counting;mission/acs/SusHandler.h
|
|
||||||
14501;0x38a5;TEMPERATURE_ALL_ONES_RECOVERY;INFO;Detected valid values again, resetting invalid message counter. P1: Invalid message counter.;mission/acs/SusHandler.h
|
|
||||||
|
|
@ -18,7 +18,6 @@ __OBJECT_ID_DICT = None
|
|||||||
|
|
||||||
# Core Object IDs
|
# Core Object IDs
|
||||||
SOLAR_ARRAY_DEPLOYMENT_ID = bytes([0x44, 0x41, 0x00, 0xA2])
|
SOLAR_ARRAY_DEPLOYMENT_ID = bytes([0x44, 0x41, 0x00, 0xA2])
|
||||||
INTERNAL_ERROR_REPORTER_ID = bytes([0x53, 0x04, 0x00, 0x00])
|
|
||||||
|
|
||||||
# Power Object IDs
|
# Power Object IDs
|
||||||
PCDU_HANDLER_ID = bytes([0x44, 0x20, 0x00, 0xA1])
|
PCDU_HANDLER_ID = bytes([0x44, 0x20, 0x00, 0xA1])
|
||||||
@ -35,7 +34,6 @@ HEATER_CONTROLLER_ID = bytes([0x44, 0x41, 0x00, 0xA4])
|
|||||||
TMP1075_HANDLER_TCS_BRD_0_ID = bytes([0x44, 0x42, 0x00, 0x04])
|
TMP1075_HANDLER_TCS_BRD_0_ID = bytes([0x44, 0x42, 0x00, 0x04])
|
||||||
TMP1075_HANDLER_TCS_BRD_1_ID = bytes([0x44, 0x42, 0x00, 0x05])
|
TMP1075_HANDLER_TCS_BRD_1_ID = bytes([0x44, 0x42, 0x00, 0x05])
|
||||||
TMP1075_HANDLER_PLPCDU_0_ID = bytes([0x44, 0x42, 0x00, 0x06])
|
TMP1075_HANDLER_PLPCDU_0_ID = bytes([0x44, 0x42, 0x00, 0x06])
|
||||||
TMP1075_HANDLER_PLPCDU_1_ID = bytes([0x44, 0x42, 0x00, 0x07])
|
|
||||||
TMP1075_HANDLER_IF_BRD_ID = bytes([0x44, 0x42, 0x00, 0x08])
|
TMP1075_HANDLER_IF_BRD_ID = bytes([0x44, 0x42, 0x00, 0x08])
|
||||||
|
|
||||||
# Communication Object IDs
|
# Communication Object IDs
|
||||||
|
@ -60,4 +60,3 @@
|
|||||||
142;COM_SUBSYSTEM
|
142;COM_SUBSYSTEM
|
||||||
143;PERSISTENT_TM_STORE
|
143;PERSISTENT_TM_STORE
|
||||||
144;SYRLINKS_COM
|
144;SYRLINKS_COM
|
||||||
145;SUS_HANDLER
|
|
||||||
|
|
@ -6,7 +6,6 @@ from typing import cast
|
|||||||
from eive_tmtc.tmtc.acs.gyros import handle_gyr_cmd
|
from eive_tmtc.tmtc.acs.gyros import handle_gyr_cmd
|
||||||
from eive_tmtc.tmtc.acs.mgms import handle_mgm_cmd
|
from eive_tmtc.tmtc.acs.mgms import handle_mgm_cmd
|
||||||
from eive_tmtc.tmtc.power.power import pack_power_commands
|
from eive_tmtc.tmtc.power.power import pack_power_commands
|
||||||
from eive_tmtc.tmtc.tcs.ctrl import pack_tcs_ctrl_commands
|
|
||||||
from eive_tmtc.tmtc.tcs.rtd import pack_rtd_commands
|
from eive_tmtc.tmtc.tcs.rtd import pack_rtd_commands
|
||||||
from eive_tmtc.tmtc.payload.scex import pack_scex_cmds
|
from eive_tmtc.tmtc.payload.scex import pack_scex_cmds
|
||||||
from eive_tmtc.tmtc.tcs.subsystem import pack_tcs_sys_commands
|
from eive_tmtc.tmtc.tcs.subsystem import pack_tcs_sys_commands
|
||||||
@ -100,16 +99,13 @@ def handle_default_procedure( # noqa C901: Complexity okay here.
|
|||||||
if service == CustomServiceList.ACU.value:
|
if service == CustomServiceList.ACU.value:
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(ACU_HANDLER_ID))
|
object_id = cast(ObjectIdU32, obj_id_man.get(ACU_HANDLER_ID))
|
||||||
return pack_acu_commands(object_id=object_id, q=queue_helper, op_code=op_code)
|
return pack_acu_commands(object_id=object_id, q=queue_helper, op_code=op_code)
|
||||||
if service == CustomServiceList.TCS_SS.value:
|
if service == CustomServiceList.TCS.value:
|
||||||
return pack_tcs_sys_commands(q=queue_helper, op_code=op_code)
|
return pack_tcs_sys_commands(q=queue_helper, op_code=op_code)
|
||||||
if service == CustomServiceList.TCS_CTRL.value:
|
|
||||||
return pack_tcs_ctrl_commands(q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.TMP1075.value:
|
if service == CustomServiceList.TMP1075.value:
|
||||||
menu_dict = {
|
menu_dict = {
|
||||||
"0": ("TMP1075 TCS Board 0", TMP1075_HANDLER_TCS_BRD_0_ID),
|
"0": ("TMP1075 TCS Board 0", TMP1075_HANDLER_TCS_BRD_0_ID),
|
||||||
"1": ("TMP1075 TCS Board 1", TMP1075_HANDLER_TCS_BRD_1_ID),
|
"1": ("TMP1075 TCS Board 1", TMP1075_HANDLER_TCS_BRD_1_ID),
|
||||||
"2": ("TMP1075 PL PCDU 0", TMP1075_HANDLER_PLPCDU_0_ID),
|
"2": ("TMP1075 PL PCDU 0", TMP1075_HANDLER_PLPCDU_0_ID),
|
||||||
"3": ("TMP1075 PL PCDU 1", oids.TMP1075_HANDLER_PLPCDU_1_ID),
|
|
||||||
"4": ("TMP1075 IF Board", TMP1075_HANDLER_IF_BRD_ID),
|
"4": ("TMP1075 IF Board", TMP1075_HANDLER_IF_BRD_ID),
|
||||||
}
|
}
|
||||||
input_helper = InputHelper(menu_dict)
|
input_helper = InputHelper(menu_dict)
|
||||||
|
@ -765,6 +765,7 @@ def gen_disable_listen_to_hk_for_x_seconds(
|
|||||||
def activate_mgts_alternately(
|
def activate_mgts_alternately(
|
||||||
q: DefaultPusQueueHelper,
|
q: DefaultPusQueueHelper,
|
||||||
):
|
):
|
||||||
|
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_dipole_command(
|
pack_dipole_command(
|
||||||
object_id=oids.IMTQ_HANDLER_ID,
|
object_id=oids.IMTQ_HANDLER_ID,
|
||||||
|
@ -7,7 +7,6 @@ from eive_tmtc.config.object_ids import get_object_ids
|
|||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from eive_tmtc.pus_tm.verification_handler import generic_retval_printout
|
from eive_tmtc.pus_tm.verification_handler import generic_retval_printout
|
||||||
from eive_tmtc.tmtc.acs.subsystem import AcsMode
|
from eive_tmtc.tmtc.acs.subsystem import AcsMode
|
||||||
from eive_tmtc.tmtc.core import SdState, SdCardSelect
|
|
||||||
from tmtccmd.tc.pus_200_fsfw_mode import Mode
|
from tmtccmd.tc.pus_200_fsfw_mode import Mode
|
||||||
from tmtccmd.tc.pus_201_fsfw_health import FsfwHealth
|
from tmtccmd.tc.pus_201_fsfw_health import FsfwHealth
|
||||||
|
|
||||||
@ -37,13 +36,12 @@ def handle_event_packet( # noqa C901: Complexity okay here
|
|||||||
else:
|
else:
|
||||||
obj_name = obj_id_obj.name
|
obj_name = obj_id_obj.name
|
||||||
generic_event_string = (
|
generic_event_string = (
|
||||||
f"Object {obj_name} generated Event {info.name} (ID: {event_def.event_id:#04x})"
|
f"Object {obj_name} generated Event {info.name} (ID: {event_def.event_id:#04x}) "
|
||||||
f" at {tm.time_provider.as_date_time()}"
|
f"at {tm.time_provider.as_date_time()}"
|
||||||
)
|
)
|
||||||
_LOGGER.info(generic_event_string)
|
_LOGGER.info(generic_event_string)
|
||||||
pw.file_logger.info(
|
pw.file_logger.info(
|
||||||
f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}:"
|
f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: {generic_event_string}"
|
||||||
f" {generic_event_string}"
|
|
||||||
)
|
)
|
||||||
specific_handler = False
|
specific_handler = False
|
||||||
if info.name == "MODE_TRANSITION_FAILED":
|
if info.name == "MODE_TRANSITION_FAILED":
|
||||||
@ -55,8 +53,8 @@ def handle_event_packet( # noqa C901: Complexity okay here
|
|||||||
if info.name == "SUPV_UPDATE_PROGRESS" or info.name == "WRITE_MEMORY_FAILED":
|
if info.name == "SUPV_UPDATE_PROGRESS" or info.name == "WRITE_MEMORY_FAILED":
|
||||||
additional_event_info = f"Additional info: {info.info}"
|
additional_event_info = f"Additional info: {info.info}"
|
||||||
context = (
|
context = (
|
||||||
f"Progress Percent: {event_def.param1 >> 24 & 0xff} | Sequence Count:"
|
f"Progress Percent: {event_def.param1 >> 24 & 0xff} | "
|
||||||
f" {event_def.param1 & 0xffff} | Bytes Written: {event_def.param2}"
|
f"Sequence Count: {event_def.param1 & 0xffff} | Bytes Written: {event_def.param2}"
|
||||||
)
|
)
|
||||||
pw.dlog(additional_event_info)
|
pw.dlog(additional_event_info)
|
||||||
pw.dlog(context)
|
pw.dlog(context)
|
||||||
@ -97,7 +95,7 @@ def handle_event_packet( # noqa C901: Complexity okay here
|
|||||||
if info.name == "REBOOT_COUNTER":
|
if info.name == "REBOOT_COUNTER":
|
||||||
boot_count = (event_def.param1 << 32) | event_def.param2
|
boot_count = (event_def.param1 << 32) | event_def.param2
|
||||||
pw.dlog(f"Total boot count: {boot_count}")
|
pw.dlog(f"Total boot count: {boot_count}")
|
||||||
if info.name == "VERSION_INFO" or info.name == "FIRMWARE_INFO":
|
if info.name == "VERSION_INFO":
|
||||||
specific_handler = True
|
specific_handler = True
|
||||||
ver_major = (event_def.param1 >> 24) & 0xFF
|
ver_major = (event_def.param1 >> 24) & 0xFF
|
||||||
ver_minor = (event_def.param1 >> 16) & 0xFF
|
ver_minor = (event_def.param1 >> 16) & 0xFF
|
||||||
@ -107,11 +105,8 @@ def handle_event_packet( # noqa C901: Complexity okay here
|
|||||||
if has_git_sha:
|
if has_git_sha:
|
||||||
p2_as_bytes = event_def.param2.to_bytes(4, sys.byteorder)
|
p2_as_bytes = event_def.param2.to_bytes(4, sys.byteorder)
|
||||||
git_sha = p2_as_bytes.decode("ascii")
|
git_sha = p2_as_bytes.decode("ascii")
|
||||||
if info.name == "VERSION_INFO":
|
version_string = f"v{ver_major}.{ver_minor}.{ver_rev}"
|
||||||
name = "OBSW version: "
|
pw.dlog(f"Version {version_string}")
|
||||||
else:
|
|
||||||
name = "Firmware version: "
|
|
||||||
pw.dlog(f"{name} v{ver_major}.{ver_minor}.{ver_rev}")
|
|
||||||
if has_git_sha:
|
if has_git_sha:
|
||||||
pw.dlog(f"Git SHA first four letters: {git_sha}")
|
pw.dlog(f"Git SHA first four letters: {git_sha}")
|
||||||
if info.name == "CLOCK_SET":
|
if info.name == "CLOCK_SET":
|
||||||
@ -128,21 +123,6 @@ def handle_event_packet( # noqa C901: Complexity okay here
|
|||||||
time = event_def.param1 + event_def.param2 / 1000.0
|
time = event_def.param1 + event_def.param2 / 1000.0
|
||||||
time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc)
|
time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc)
|
||||||
pw.dlog(f"Current time: {time_dt}")
|
pw.dlog(f"Current time: {time_dt}")
|
||||||
if info.name == "ACTIVE_SD_INFO":
|
|
||||||
sd_0_state = (event_def.param2 >> 16) & 0xFFFF
|
|
||||||
sd_1_state = event_def.param2 & 0xFFFF
|
|
||||||
active_sd = event_def.param1
|
|
||||||
try:
|
|
||||||
active_sd = SdCardSelect(event_def.param1)
|
|
||||||
sd_0_state = SdState((event_def.param2 >> 16) & 0xFFFF)
|
|
||||||
sd_1_state = SdState(event_def.param2 & 0xFFFF)
|
|
||||||
except IndexError:
|
|
||||||
_LOGGER.error(f"Received invalid event fields for event {event_def}")
|
|
||||||
finally:
|
|
||||||
pw.dlog(
|
|
||||||
f"Active SD card {active_sd!r} | SD 0 State {sd_0_state!r} | SD 1 "
|
|
||||||
f"State {sd_1_state!r}"
|
|
||||||
)
|
|
||||||
if info.name == "HEALTH_INFO":
|
if info.name == "HEALTH_INFO":
|
||||||
specific_handler = True
|
specific_handler = True
|
||||||
health = FsfwHealth(event_def.param1)
|
health = FsfwHealth(event_def.param1)
|
||||||
|
@ -18,7 +18,7 @@ from .defs import PrintWrapper
|
|||||||
|
|
||||||
from .event_handler import handle_event_packet
|
from .event_handler import handle_event_packet
|
||||||
from .verification_handler import handle_service_1_fsfw_packet, generic_retval_printout
|
from .verification_handler import handle_service_1_fsfw_packet, generic_retval_printout
|
||||||
from .hk_handler import handle_hk_packet
|
from .hk_handling import handle_hk_packet
|
||||||
from .action_reply_handler import handle_action_reply
|
from .action_reply_handler import handle_action_reply
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -29,14 +29,12 @@ def pus_factory_hook( # noqa C901 : Complexity okay here
|
|||||||
verif_wrapper: VerificationWrapper,
|
verif_wrapper: VerificationWrapper,
|
||||||
printer: FsfwTmTcPrinter,
|
printer: FsfwTmTcPrinter,
|
||||||
raw_logger: RawTmtcTimedLogWrapper,
|
raw_logger: RawTmtcTimedLogWrapper,
|
||||||
hk_level: int,
|
|
||||||
):
|
):
|
||||||
if len(packet) < 8:
|
if len(packet) < 8:
|
||||||
_LOGGER.warning("Detected packet shorter than 8 bytes!")
|
_LOGGER.warning("Detected packet shorter than 8 bytes!")
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
tm_packet = PusTelemetry.unpack(packet, CdsShortTimestamp.empty())
|
tm_packet = PusTelemetry.unpack(packet, CdsShortTimestamp.empty())
|
||||||
# _LOGGER.info(f"Sequence count: {tm_packet.seq_count}")
|
|
||||||
except ValueError as value_error:
|
except ValueError as value_error:
|
||||||
_LOGGER.warning(f"{value_error}")
|
_LOGGER.warning(f"{value_error}")
|
||||||
_LOGGER.warning("Could not generate PUS TM object from raw data")
|
_LOGGER.warning("Could not generate PUS TM object from raw data")
|
||||||
@ -49,9 +47,7 @@ def pus_factory_hook( # noqa C901 : Complexity okay here
|
|||||||
if service == 1:
|
if service == 1:
|
||||||
handle_service_1_fsfw_packet(wrapper=verif_wrapper, raw_tm=packet)
|
handle_service_1_fsfw_packet(wrapper=verif_wrapper, raw_tm=packet)
|
||||||
elif service == 3:
|
elif service == 3:
|
||||||
handle_hk_packet(
|
handle_hk_packet(printer=printer, raw_tm=packet, obj_id_dict=obj_id_dict)
|
||||||
printer=printer, raw_tm=packet, obj_id_dict=obj_id_dict, hk_level=hk_level
|
|
||||||
)
|
|
||||||
elif service == 5:
|
elif service == 5:
|
||||||
handle_event_packet(raw_tm=packet, pw=pw)
|
handle_event_packet(raw_tm=packet, pw=pw)
|
||||||
elif service == 8:
|
elif service == 8:
|
||||||
@ -87,8 +83,7 @@ def pus_factory_hook( # noqa C901 : Complexity okay here
|
|||||||
# TODO: Could improve display further by actually displaying a matrix as a
|
# TODO: Could improve display further by actually displaying a matrix as a
|
||||||
# matrix using row and column information
|
# matrix using row and column information
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
"Received vector or matrix data:"
|
f"Received vector or matrix data: {param.param_raw.hex(sep=',')}"
|
||||||
f" {param.param_raw.hex(sep=',')}"
|
|
||||||
)
|
)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
pw.dlog(f"received {e} when trying to parse parameters")
|
pw.dlog(f"received {e} when trying to parse parameters")
|
@ -1,8 +1,8 @@
|
|||||||
"""HK Handling for EIVE OBSW"""
|
"""HK Handling for EIVE OBSW"""
|
||||||
import logging
|
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.acs.acs_ctrl import handle_acs_ctrl_hk_data
|
||||||
from eive_tmtc.tmtc.internal_err_reporter import handle_ier_hk_data
|
|
||||||
from eive_tmtc.tmtc.payload.ploc_mpsoc import handle_ploc_mpsoc_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.tcs.rtd import RTD_NAMES, handle_rtd_hk
|
||||||
from eive_tmtc.tmtc.acs.star_tracker import handle_str_hk_data
|
from eive_tmtc.tmtc.acs.star_tracker import handle_str_hk_data
|
||||||
@ -13,7 +13,6 @@ from eive_tmtc.tmtc.payload.ploc_supervisor import handle_supv_hk_data
|
|||||||
from eive_tmtc.tmtc.acs.reaction_wheels import handle_rw_hk_data
|
from eive_tmtc.tmtc.acs.reaction_wheels import handle_rw_hk_data
|
||||||
from eive_tmtc.tmtc.com.syrlinks_handler import handle_syrlinks_hk_data
|
from eive_tmtc.tmtc.com.syrlinks_handler import handle_syrlinks_hk_data
|
||||||
from eive_tmtc.tmtc.tcs import handle_thermal_controller_hk_data
|
from eive_tmtc.tmtc.tcs import handle_thermal_controller_hk_data
|
||||||
from eive_tmtc.tmtc.tcs.tmp1075 import handle_tmp_1075_hk_data
|
|
||||||
from spacepackets.ecss import PusTelemetry
|
from spacepackets.ecss import PusTelemetry
|
||||||
from tmtccmd.tm.pus_3_fsfw_hk import (
|
from tmtccmd.tm.pus_3_fsfw_hk import (
|
||||||
Service3Base,
|
Service3Base,
|
||||||
@ -47,7 +46,9 @@ FORWARD_SENSOR_TEMPS = False
|
|||||||
|
|
||||||
|
|
||||||
def handle_hk_packet(
|
def handle_hk_packet(
|
||||||
raw_tm: bytes, obj_id_dict: ObjectIdDictT, printer: FsfwTmTcPrinter, hk_level: int
|
raw_tm: bytes,
|
||||||
|
obj_id_dict: ObjectIdDictT,
|
||||||
|
printer: FsfwTmTcPrinter,
|
||||||
):
|
):
|
||||||
tm_packet = Service3FsfwTm.unpack(raw_telemetry=raw_tm, custom_hk_handling=False)
|
tm_packet = Service3FsfwTm.unpack(raw_telemetry=raw_tm, custom_hk_handling=False)
|
||||||
named_obj_id = obj_id_dict.get(tm_packet.object_id.as_bytes)
|
named_obj_id = obj_id_dict.get(tm_packet.object_id.as_bytes)
|
||||||
@ -55,25 +56,26 @@ def handle_hk_packet(
|
|||||||
named_obj_id = tm_packet.object_id
|
named_obj_id = tm_packet.object_id
|
||||||
if tm_packet.subservice == 25 or tm_packet.subservice == 26:
|
if tm_packet.subservice == 25 or tm_packet.subservice == 26:
|
||||||
hk_data = tm_packet.tm_data[8:]
|
hk_data = tm_packet.tm_data[8:]
|
||||||
|
if FORWARD_SENSOR_TEMPS:
|
||||||
|
# TODO: Maybe use singleton?
|
||||||
|
# TCP_SEVER_SENSOR_TEMPERATURES.report_raw_hk_data(
|
||||||
|
# object_id=named_obj_id, set_id=tm_packet.set_id, hk_data=hk_data
|
||||||
|
# )
|
||||||
|
pass
|
||||||
printer.generic_hk_tm_print(
|
printer.generic_hk_tm_print(
|
||||||
content_type=HkContentType.HK,
|
content_type=HkContentType.HK,
|
||||||
object_id=named_obj_id,
|
object_id=named_obj_id,
|
||||||
set_id=tm_packet.set_id,
|
set_id=tm_packet.set_id,
|
||||||
hk_data=hk_data,
|
hk_data=hk_data,
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if hk_level == 1:
|
handle_regular_hk_print(
|
||||||
pass
|
printer=printer,
|
||||||
elif hk_level > 1:
|
object_id=named_obj_id,
|
||||||
handle_regular_hk_print(
|
hk_packet=tm_packet,
|
||||||
printer=printer,
|
tm=tm_packet.pus_tm,
|
||||||
object_id=named_obj_id,
|
hk_data=hk_data,
|
||||||
hk_packet=tm_packet,
|
)
|
||||||
tm=tm_packet.pus_tm,
|
|
||||||
hk_data=hk_data,
|
|
||||||
)
|
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
f"{e} error when parsing HK data coming from {named_obj_id}"
|
f"{e} error when parsing HK data coming from {named_obj_id}"
|
||||||
@ -101,9 +103,7 @@ def handle_regular_hk_print( # noqa C901: Complexity okay here
|
|||||||
elif objb == obj_ids.IMTQ_HANDLER_ID:
|
elif objb == obj_ids.IMTQ_HANDLER_ID:
|
||||||
return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id)
|
||||||
elif objb == obj_ids.GPS_CONTROLLER:
|
elif objb == obj_ids.GPS_CONTROLLER:
|
||||||
return handle_gps_data(
|
return handle_gps_data(pw=pw, hk_data=hk_data)
|
||||||
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
|
|
||||||
)
|
|
||||||
elif objb == obj_ids.PCDU_HANDLER_ID:
|
elif objb == obj_ids.PCDU_HANDLER_ID:
|
||||||
return handle_pcdu_hk(pw=pw, set_id=set_id, hk_data=hk_data)
|
return handle_pcdu_hk(pw=pw, set_id=set_id, hk_data=hk_data)
|
||||||
elif objb == obj_ids.BPX_HANDLER_ID:
|
elif objb == obj_ids.BPX_HANDLER_ID:
|
||||||
@ -118,8 +118,6 @@ def handle_regular_hk_print( # noqa C901: Complexity okay here
|
|||||||
return handle_ploc_mpsoc_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_ploc_mpsoc_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
||||||
elif objb == obj_ids.ACU_HANDLER_ID:
|
elif objb == obj_ids.ACU_HANDLER_ID:
|
||||||
return handle_acu_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_acu_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
||||||
elif objb == obj_ids.INTERNAL_ERROR_REPORTER_ID:
|
|
||||||
return handle_ier_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
|
||||||
elif objb == obj_ids.RAD_SENSOR_ID:
|
elif objb == obj_ids.RAD_SENSOR_ID:
|
||||||
return handle_rad_sensor_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_rad_sensor_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
||||||
elif objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
|
elif objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
|
||||||
@ -173,14 +171,6 @@ def handle_regular_hk_print( # noqa C901: Complexity okay here
|
|||||||
return handle_str_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
return handle_str_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
||||||
elif objb == obj_ids.PLOC_SUPV_ID:
|
elif objb == obj_ids.PLOC_SUPV_ID:
|
||||||
return handle_supv_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
return handle_supv_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
||||||
elif objb in [
|
|
||||||
obj_ids.TMP1075_HANDLER_TCS_BRD_0_ID,
|
|
||||||
obj_ids.TMP1075_HANDLER_TCS_BRD_1_ID,
|
|
||||||
obj_ids.TMP1075_HANDLER_IF_BRD_ID,
|
|
||||||
obj_ids.TMP1075_HANDLER_PLPCDU_0_ID,
|
|
||||||
obj_ids.TMP1075_HANDLER_PLPCDU_1_ID,
|
|
||||||
]:
|
|
||||||
return handle_tmp_1075_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
|
||||||
elif objb == obj_ids.ACS_CONTROLLER:
|
elif objb == obj_ids.ACS_CONTROLLER:
|
||||||
return handle_acs_ctrl_hk_data(
|
return handle_acs_ctrl_hk_data(
|
||||||
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
|
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
|
||||||
@ -188,5 +178,5 @@ def handle_regular_hk_print( # noqa C901: Complexity okay here
|
|||||||
else:
|
else:
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
f"Service 3 TM: Parsing for object {object_id} and set ID {set_id} "
|
f"Service 3 TM: Parsing for object {object_id} and set ID {set_id} "
|
||||||
"has not been implemented."
|
f"has not been implemented."
|
||||||
)
|
)
|
@ -12,6 +12,7 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
class TmTcpServer:
|
class TmTcpServer:
|
||||||
def __init__(self, ip_address: str, port: int):
|
def __init__(self, ip_address: str, port: int):
|
||||||
|
|
||||||
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
|
||||||
self.server_socket.bind((ip_address, port))
|
self.server_socket.bind((ip_address, port))
|
||||||
@ -45,6 +46,7 @@ class TmTcpServer:
|
|||||||
self.client_connection.setblocking(False)
|
self.client_connection.setblocking(False)
|
||||||
print("Client connected")
|
print("Client connected")
|
||||||
except IOError:
|
except IOError:
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
data_json_bytes = json.dumps(dictionary).encode()
|
data_json_bytes = json.dumps(dictionary).encode()
|
||||||
@ -63,6 +65,7 @@ class TmTcpServer:
|
|||||||
self.client_connection = None
|
self.client_connection = None
|
||||||
|
|
||||||
def report_raw_hk_data(self, object_id: ObjectIdU32, set_id: int, hk_data: bytes):
|
def report_raw_hk_data(self, object_id: ObjectIdU32, set_id: int, hk_data: bytes):
|
||||||
|
|
||||||
data_dict = {
|
data_dict = {
|
||||||
"type": "TM",
|
"type": "TM",
|
||||||
"tmType": "Raw HK",
|
"tmType": "Raw HK",
|
||||||
|
@ -48,7 +48,7 @@ def generic_retval_printout(
|
|||||||
if retval_info is None:
|
if retval_info is None:
|
||||||
raw_err = retval
|
raw_err = retval
|
||||||
return [
|
return [
|
||||||
"No returnvalue information found for error code with "
|
f"No returnvalue information found for error code with "
|
||||||
f"subsystem ID {(raw_err >> 8) & 0xff} and unique ID {raw_err & 0xff}"
|
f"subsystem ID {(raw_err >> 8) & 0xff} and unique ID {raw_err & 0xff}"
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
@ -58,9 +58,9 @@ def generic_retval_printout(
|
|||||||
)
|
)
|
||||||
string_list = [retval_string]
|
string_list = [retval_string]
|
||||||
if p1:
|
if p1:
|
||||||
error_param_1_str = f"Error Parameter 1: hex {p1:#010x} dec {p1} "
|
error_param_1_str = f"Error Parameter 1: hex {p1:#010x} " f"dec {p1} "
|
||||||
string_list.append(error_param_1_str)
|
string_list.append(error_param_1_str)
|
||||||
if p2:
|
if p2:
|
||||||
error_param_2_str = f"Error Parameter 2: hex {p2:#010x} dec {p2}"
|
error_param_2_str = f"Error Parameter 2: hex {p2:#010x} " f"dec {p2}"
|
||||||
string_list.append(error_param_2_str)
|
string_list.append(error_param_2_str)
|
||||||
return string_list
|
return string_list
|
||||||
|
@ -5,4 +5,3 @@ from .time import add_time_cmds
|
|||||||
from .health import add_health_cmd_defs
|
from .health import add_health_cmd_defs
|
||||||
from .system import add_system_cmd_defs
|
from .system import add_system_cmd_defs
|
||||||
from .tm_store import add_persistent_tm_store_cmd_defs
|
from .tm_store import add_persistent_tm_store_cmd_defs
|
||||||
from .tcs import add_tmp_sens_cmds
|
|
||||||
|
@ -59,44 +59,12 @@ class SetId(enum.IntEnum):
|
|||||||
MEKF_DATA = 7
|
MEKF_DATA = 7
|
||||||
CTRL_VAL_DATA = 8
|
CTRL_VAL_DATA = 8
|
||||||
ACTUATOR_CMD_DATA = 9
|
ACTUATOR_CMD_DATA = 9
|
||||||
FUSED_ROT_RATE_DATA = 10
|
|
||||||
|
|
||||||
|
|
||||||
class ActionId(enum.IntEnum):
|
class ActionId(enum.IntEnum):
|
||||||
SOLAR_ARRAY_DEPLOYMENT_SUCCESSFUL = 0
|
SOLAR_ARRAY_DEPLOYMENT_SUCCESSFUL = 0
|
||||||
RESET_MEKF = 1
|
RESET_MEKF = 1
|
||||||
RESTORE_MEKF_NONFINITE_RECOVERY = 2
|
RESTORE_MEKF_NONFINITE_RECOVERY = 2
|
||||||
UPDATE_TLE = 3
|
|
||||||
|
|
||||||
|
|
||||||
CTRL_STRAT_DICT = {
|
|
||||||
0: "OFF",
|
|
||||||
1: "NO_MAG_FIELD_FOR_CONTROL",
|
|
||||||
2: "NO_SENSORS_FOR_CONTROL",
|
|
||||||
# OBSW <= v6.1.0
|
|
||||||
10: "LEGACY_SAFE_MEKF",
|
|
||||||
11: "LEGACY_WITHOUT_MEKF",
|
|
||||||
12: "LEGACY_ECLIPSE_DAMPING",
|
|
||||||
13: "LEGACY_ECLIPSE_IDELING",
|
|
||||||
# Added in OBSW v6.2.0
|
|
||||||
14: "SAFE_MEKF",
|
|
||||||
15: "SAFE_GYR",
|
|
||||||
16: "SAFE_SUSMGM",
|
|
||||||
17: "SAFE_ECLIPSE_DAMPING_GYR",
|
|
||||||
18: "SAFE_ECLIPSE_DAMPING_SUSMGM",
|
|
||||||
19: "SAFE_ECLIPSE_IDELING",
|
|
||||||
20: "DETUMBLE_FULL",
|
|
||||||
21: "DETUMBLE_DETERIORATED",
|
|
||||||
30: "PTG_MEKF",
|
|
||||||
31: "PTG_RAW",
|
|
||||||
}
|
|
||||||
|
|
||||||
GPS_COURCE_DICT = {
|
|
||||||
0: "NONE",
|
|
||||||
1: "GPS",
|
|
||||||
2: "GPS_EXTRAPOLATED",
|
|
||||||
3: "SGP4",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class OpCodes:
|
class OpCodes:
|
||||||
@ -111,7 +79,6 @@ class OpCodes:
|
|||||||
SAFE_PTG = ["confirm_deployment"]
|
SAFE_PTG = ["confirm_deployment"]
|
||||||
RESET_MEKF = ["reset_mekf"]
|
RESET_MEKF = ["reset_mekf"]
|
||||||
RESTORE_MEKF_NONFINITE_RECOVERY = ["restore_mekf_nonfinite_recovery"]
|
RESTORE_MEKF_NONFINITE_RECOVERY = ["restore_mekf_nonfinite_recovery"]
|
||||||
UPDATE_TLE = ["update_tle"]
|
|
||||||
SET_PARAMETER_SCALAR = ["set_scalar_param"]
|
SET_PARAMETER_SCALAR = ["set_scalar_param"]
|
||||||
SET_PARAMETER_VECTOR = ["set_vector_param"]
|
SET_PARAMETER_VECTOR = ["set_vector_param"]
|
||||||
SET_PARAMETER_MATRIX = ["set_matrix_param"]
|
SET_PARAMETER_MATRIX = ["set_matrix_param"]
|
||||||
@ -145,9 +112,6 @@ class OpCodes:
|
|||||||
REQUEST_ACT_CMD_HK = ["act_cmd_hk"]
|
REQUEST_ACT_CMD_HK = ["act_cmd_hk"]
|
||||||
ENABLE_ACT_CMD_HK = ["act_cmd_enable_hk"]
|
ENABLE_ACT_CMD_HK = ["act_cmd_enable_hk"]
|
||||||
DISABLE_ACT_CMD_HK = ["act_cmd_disable_hk"]
|
DISABLE_ACT_CMD_HK = ["act_cmd_disable_hk"]
|
||||||
REQUEST_FUSED_ROT_RATE_HK = ["f_rot_rate_hk"]
|
|
||||||
ENABLE_FUSED_ROT_RATE_HK = ["f_rot_rate_enable_hk"]
|
|
||||||
DISABLE_FUSED_ROT_RATE_HK = ["f_rot_rate_disable_hk"]
|
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -162,7 +126,6 @@ class Info:
|
|||||||
SAFE_PTG = "Confirm deployment of both solar arrays"
|
SAFE_PTG = "Confirm deployment of both solar arrays"
|
||||||
RESET_MEKF = "Reset the MEKF"
|
RESET_MEKF = "Reset the MEKF"
|
||||||
RESTORE_MEKF_NONFINITE_RECOVERY = "Restore MEKF non-finite recovery"
|
RESTORE_MEKF_NONFINITE_RECOVERY = "Restore MEKF non-finite recovery"
|
||||||
UPDATE_TLE = "Update TLE"
|
|
||||||
SET_PARAMETER_SCALAR = "Set Scalar Parameter"
|
SET_PARAMETER_SCALAR = "Set Scalar Parameter"
|
||||||
SET_PARAMETER_VECTOR = "Set Vector Parameter"
|
SET_PARAMETER_VECTOR = "Set Vector Parameter"
|
||||||
SET_PARAMETER_MATRIX = "Set Matrix Parameter"
|
SET_PARAMETER_MATRIX = "Set Matrix Parameter"
|
||||||
@ -196,9 +159,6 @@ class Info:
|
|||||||
REQUEST_ACT_CMD_HK = "Request Actuator Commands HK"
|
REQUEST_ACT_CMD_HK = "Request Actuator Commands HK"
|
||||||
ENABLE_ACT_CMD_HK = "Enable Actuator Commands HK data generation"
|
ENABLE_ACT_CMD_HK = "Enable Actuator Commands HK data generation"
|
||||||
DISABLE_ACT_CMD_HK = "Disable Actuator Commands HK data generation"
|
DISABLE_ACT_CMD_HK = "Disable Actuator Commands HK data generation"
|
||||||
REQUEST_FUSED_ROT_RATE_HK = "Request Fused Rotational Rates HK"
|
|
||||||
ENABLE_FUSED_ROT_RATE_HK = "Enable Fused Rotational Rates HK data generation"
|
|
||||||
DISABLE_FUSED_ROT_RATE_HK = "Disable Fused Rotational Rates HK data generation"
|
|
||||||
|
|
||||||
|
|
||||||
PERFORM_MGM_CALIBRATION = False
|
PERFORM_MGM_CALIBRATION = False
|
||||||
@ -230,7 +190,6 @@ def acs_cmd_defs(defs: TmtcDefinitionWrapper):
|
|||||||
keys=OpCodes.RESTORE_MEKF_NONFINITE_RECOVERY,
|
keys=OpCodes.RESTORE_MEKF_NONFINITE_RECOVERY,
|
||||||
info=Info.RESTORE_MEKF_NONFINITE_RECOVERY,
|
info=Info.RESTORE_MEKF_NONFINITE_RECOVERY,
|
||||||
)
|
)
|
||||||
oce.add(keys=OpCodes.UPDATE_TLE, info=Info.UPDATE_TLE)
|
|
||||||
oce.add(keys=OpCodes.SET_PARAMETER_SCALAR, info=Info.SET_PARAMETER_SCALAR)
|
oce.add(keys=OpCodes.SET_PARAMETER_SCALAR, info=Info.SET_PARAMETER_SCALAR)
|
||||||
oce.add(keys=OpCodes.SET_PARAMETER_VECTOR, info=Info.SET_PARAMETER_VECTOR)
|
oce.add(keys=OpCodes.SET_PARAMETER_VECTOR, info=Info.SET_PARAMETER_VECTOR)
|
||||||
oce.add(keys=OpCodes.SET_PARAMETER_MATRIX, info=Info.SET_PARAMETER_MATRIX)
|
oce.add(keys=OpCodes.SET_PARAMETER_MATRIX, info=Info.SET_PARAMETER_MATRIX)
|
||||||
@ -264,9 +223,6 @@ def acs_cmd_defs(defs: TmtcDefinitionWrapper):
|
|||||||
oce.add(keys=OpCodes.REQUEST_ACT_CMD_HK, info=Info.REQUEST_ACT_CMD_HK)
|
oce.add(keys=OpCodes.REQUEST_ACT_CMD_HK, info=Info.REQUEST_ACT_CMD_HK)
|
||||||
oce.add(keys=OpCodes.ENABLE_ACT_CMD_HK, info=Info.ENABLE_ACT_CMD_HK)
|
oce.add(keys=OpCodes.ENABLE_ACT_CMD_HK, info=Info.ENABLE_ACT_CMD_HK)
|
||||||
oce.add(keys=OpCodes.DISABLE_ACT_CMD_HK, info=Info.DISABLE_ACT_CMD_HK)
|
oce.add(keys=OpCodes.DISABLE_ACT_CMD_HK, info=Info.DISABLE_ACT_CMD_HK)
|
||||||
oce.add(keys=OpCodes.REQUEST_FUSED_ROT_RATE_HK, info=Info.REQUEST_FUSED_ROT_RATE_HK)
|
|
||||||
oce.add(keys=OpCodes.ENABLE_FUSED_ROT_RATE_HK, info=Info.ENABLE_FUSED_ROT_RATE_HK)
|
|
||||||
oce.add(keys=OpCodes.DISABLE_FUSED_ROT_RATE_HK, info=Info.DISABLE_FUSED_ROT_RATE_HK)
|
|
||||||
defs.add_service(
|
defs.add_service(
|
||||||
name=CustomServiceList.ACS_CTRL.value, info="ACS Controller", op_code_entry=oce
|
name=CustomServiceList.ACS_CTRL.value, info="ACS Controller", op_code_entry=oce
|
||||||
)
|
)
|
||||||
@ -319,22 +275,6 @@ def pack_acs_ctrl_command(p: ServiceProviderParams): # noqa C901
|
|||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(ACS_CONTROLLER, ActionId.RESTORE_MEKF_NONFINITE_RECOVERY)
|
create_action_cmd(ACS_CONTROLLER, ActionId.RESTORE_MEKF_NONFINITE_RECOVERY)
|
||||||
)
|
)
|
||||||
elif op_code in OpCodes.UPDATE_TLE:
|
|
||||||
q.add_log_cmd(f"{Info.UPDATE_TLE}")
|
|
||||||
while True:
|
|
||||||
line1 = input("Please input the first line of the TLE: ")
|
|
||||||
if len(line1) == 69:
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
print("The line does not have the required length of 69 characters")
|
|
||||||
while True:
|
|
||||||
line2 = input("Please input the second line of the TLE: ")
|
|
||||||
if len(line2) == 69:
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
print("The line does not have the required length of 69 characters")
|
|
||||||
tle = line1.encode() + line2.encode()
|
|
||||||
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.UPDATE_TLE, tle))
|
|
||||||
elif op_code in OpCodes.SET_PARAMETER_SCALAR:
|
elif op_code in OpCodes.SET_PARAMETER_SCALAR:
|
||||||
q.add_log_cmd(f"{Info.SET_PARAMETER_SCALAR}")
|
q.add_log_cmd(f"{Info.SET_PARAMETER_SCALAR}")
|
||||||
set_acs_ctrl_param_scalar(q)
|
set_acs_ctrl_param_scalar(q)
|
||||||
@ -544,26 +484,6 @@ def pack_acs_ctrl_command(p: ServiceProviderParams): # noqa C901
|
|||||||
False, make_sid(ACS_CONTROLLER, SetId.ACTUATOR_CMD_DATA)
|
False, make_sid(ACS_CONTROLLER, SetId.ACTUATOR_CMD_DATA)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCodes.REQUEST_FUSED_ROT_RATE_HK:
|
|
||||||
q.add_log_cmd(Info.REQUEST_FUSED_ROT_RATE_HK)
|
|
||||||
q.add_pus_tc(
|
|
||||||
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.FUSED_ROT_RATE_DATA))
|
|
||||||
)
|
|
||||||
elif op_code in OpCodes.ENABLE_FUSED_ROT_RATE_HK:
|
|
||||||
interval = float(input("Please specify interval in floating point seconds: "))
|
|
||||||
q.add_log_cmd(Info.ENABLE_FUSED_ROT_RATE_HK)
|
|
||||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
|
||||||
False, make_sid(ACS_CONTROLLER, SetId.FUSED_ROT_RATE_DATA), interval
|
|
||||||
)
|
|
||||||
q.add_pus_tc(cmd_tuple[0])
|
|
||||||
q.add_pus_tc(cmd_tuple[1])
|
|
||||||
elif op_code in OpCodes.DISABLE_FUSED_ROT_RATE_HK:
|
|
||||||
q.add_log_cmd(Info.DISABLE_FUSED_ROT_RATE_HK)
|
|
||||||
q.add_pus_tc(
|
|
||||||
disable_periodic_hk_command(
|
|
||||||
False, make_sid(ACS_CONTROLLER, SetId.FUSED_ROT_RATE_DATA)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
logging.getLogger(__name__).info(f"Unknown op code {op_code}")
|
logging.getLogger(__name__).info(f"Unknown op code {op_code}")
|
||||||
|
|
||||||
@ -571,8 +491,8 @@ def pack_acs_ctrl_command(p: ServiceProviderParams): # noqa C901
|
|||||||
def set_acs_ctrl_param_scalar(q: DefaultPusQueueHelper):
|
def set_acs_ctrl_param_scalar(q: DefaultPusQueueHelper):
|
||||||
pt = int(
|
pt = int(
|
||||||
input(
|
input(
|
||||||
'Specify parameter type to set {0: "uint8", 1: "uint16", 2: "int32", 3:'
|
'Specify parameter type to set {0: "uint8", 1: "uint16", 2: "int32", 3: "float", '
|
||||||
' "float", 4: "double"}: '
|
'4: "double"}: '
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
sid = int(input("Specify parameter struct ID to set: "))
|
sid = int(input("Specify parameter struct ID to set: "))
|
||||||
@ -779,8 +699,6 @@ def handle_acs_ctrl_hk_data(
|
|||||||
handle_ctrl_val_data(pw, hk_data)
|
handle_ctrl_val_data(pw, hk_data)
|
||||||
case SetId.ACTUATOR_CMD_DATA:
|
case SetId.ACTUATOR_CMD_DATA:
|
||||||
handle_act_cmd_data(pw, hk_data)
|
handle_act_cmd_data(pw, hk_data)
|
||||||
case SetId.FUSED_ROT_RATE_DATA:
|
|
||||||
handle_fused_rot_rate_data(pw, hk_data)
|
|
||||||
|
|
||||||
|
|
||||||
def handle_acs_ctrl_sus_raw_data(pw: PrintWrapper, hk_data: bytes):
|
def handle_acs_ctrl_sus_raw_data(pw: PrintWrapper, hk_data: bytes):
|
||||||
@ -808,8 +726,8 @@ def handle_acs_ctrl_sus_raw_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
def handle_acs_ctrl_sus_processed_data(pw: PrintWrapper, hk_data: bytes):
|
def handle_acs_ctrl_sus_processed_data(pw: PrintWrapper, hk_data: bytes):
|
||||||
if len(hk_data) < 3 * 4 * 12 + 3 * 8 * 3:
|
if len(hk_data) < 3 * 4 * 12 + 3 * 8 * 3:
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"SUS Processed dataset with size {len(hk_data)} does not have expected"
|
f"SUS Processed dataset with size {len(hk_data)} does not have expected size"
|
||||||
f" size of {3 * 4 * 12 + 3 * 8 * 3} bytes"
|
f" of {3 * 4 * 12 + 3 * 8 * 3} bytes"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
current_idx = 0
|
current_idx = 0
|
||||||
@ -846,8 +764,7 @@ def handle_raw_mgm_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
|
|
||||||
if len(hk_data) < 61:
|
if len(hk_data) < 61:
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"ACS CTRL HK: MGM HK data with length {len(hk_data)} shorter than expected"
|
f"ACS CTRL HK: MGM HK data with length {len(hk_data)} shorter than expected 61 bytes"
|
||||||
" 61 bytes"
|
|
||||||
)
|
)
|
||||||
pw.dlog(f"Raw Data: {hk_data.hex(sep=',')}")
|
pw.dlog(f"Raw Data: {hk_data.hex(sep=',')}")
|
||||||
return
|
return
|
||||||
@ -1013,13 +930,11 @@ def handle_gyr_data_processed(pw: PrintWrapper, hk_data: bytes):
|
|||||||
|
|
||||||
def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes):
|
def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes):
|
||||||
pw.dlog("Received GPS Processed Set")
|
pw.dlog("Received GPS Processed Set")
|
||||||
fmt_source = "!B"
|
|
||||||
fmt_scalar = "!d"
|
fmt_scalar = "!d"
|
||||||
fmt_vec = "!ddd"
|
fmt_vec = "!ddd"
|
||||||
inc_len_source = struct.calcsize(fmt_source)
|
|
||||||
inc_len_scalar = struct.calcsize(fmt_scalar)
|
inc_len_scalar = struct.calcsize(fmt_scalar)
|
||||||
inc_len_vec = struct.calcsize(fmt_vec)
|
inc_len_vec = struct.calcsize(fmt_vec)
|
||||||
if len(hk_data) < 3 * inc_len_scalar + 2 * inc_len_vec + inc_len_source:
|
if len(hk_data) < 2 * inc_len_scalar + 2 * inc_len_vec:
|
||||||
pw.dlog("Received HK set too small")
|
pw.dlog("Received HK set too small")
|
||||||
return
|
return
|
||||||
current_idx = 0
|
current_idx = 0
|
||||||
@ -1058,20 +973,12 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes):
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
current_idx += inc_len_vec
|
current_idx += inc_len_vec
|
||||||
source = struct.unpack(
|
|
||||||
fmt_source, hk_data[current_idx : current_idx + inc_len_source]
|
|
||||||
)[0]
|
|
||||||
current_idx += inc_len_source
|
|
||||||
if GPS_COURCE_DICT.get(source) is not None:
|
|
||||||
pw.dlog(f"GPS Source: {GPS_COURCE_DICT[source]}")
|
|
||||||
else:
|
|
||||||
pw.dlog(f"'GPS Source (key unknown)': {source}")
|
|
||||||
pw.dlog(f"GPS Latitude: {lat} [deg]")
|
pw.dlog(f"GPS Latitude: {lat} [deg]")
|
||||||
pw.dlog(f"GPS Longitude: {long} [deg]")
|
pw.dlog(f"GPS Longitude: {long} [deg]")
|
||||||
pw.dlog(f"GPS Altitude: {alt} [m]")
|
pw.dlog(f"GPS Altitude: {alt} [m]")
|
||||||
pw.dlog(f"GPS Position: {pos} [m]")
|
pw.dlog(f"GPS Position: {pos} [m]")
|
||||||
pw.dlog(f"GPS Velocity: {velo} [m/s]")
|
pw.dlog(f"GPS Velocity: {velo} [m/s]")
|
||||||
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=6)
|
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=5)
|
||||||
|
|
||||||
|
|
||||||
def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
||||||
@ -1119,6 +1026,17 @@ def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
|
|
||||||
|
|
||||||
def handle_ctrl_val_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")
|
pw.dlog("Received CTRL Values Set")
|
||||||
fmt_strat = "!B"
|
fmt_strat = "!B"
|
||||||
fmt_quat = "!dddd"
|
fmt_quat = "!dddd"
|
||||||
@ -1164,8 +1082,8 @@ def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
current_idx += inc_len_vec
|
current_idx += inc_len_vec
|
||||||
if CTRL_STRAT_DICT.get(strat) is not None:
|
if safe_strat.get(strat) is not None:
|
||||||
pw.dlog(f"{'Safe Ctrl Strategy'.ljust(25)}: {CTRL_STRAT_DICT[strat]}")
|
pw.dlog(f"{'Safe Ctrl Strategy'.ljust(25)}: {safe_strat[strat]}")
|
||||||
else:
|
else:
|
||||||
pw.dlog(f"{'Safe Ctrl Strategy (key unknown)'.ljust(25)}: {strat}")
|
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 Target Quaternion: {tgt_quat}")
|
||||||
@ -1214,41 +1132,6 @@ def handle_act_cmd_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=3)
|
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=3)
|
||||||
|
|
||||||
|
|
||||||
def handle_fused_rot_rate_data(pw: PrintWrapper, hk_data: bytes):
|
|
||||||
pw.dlog("Received Fused Rotation Rates Data Set")
|
|
||||||
fmt_vec3_double = "!ddd"
|
|
||||||
inc_len_vec3_double = struct.calcsize(fmt_vec3_double)
|
|
||||||
if len(hk_data) < 3 * inc_len_vec3_double:
|
|
||||||
pw.dlog("Received HK set too small")
|
|
||||||
return
|
|
||||||
current_idx = 0
|
|
||||||
rot_rate_orthogonal = [
|
|
||||||
f"{val*180/math.pi:8.3f}"
|
|
||||||
for val in struct.unpack(
|
|
||||||
fmt_vec3_double, hk_data[current_idx : current_idx + inc_len_vec3_double]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
current_idx += inc_len_vec3_double
|
|
||||||
rot_rate_parallel = [
|
|
||||||
f"{val*180/math.pi:8.3f}"
|
|
||||||
for val in struct.unpack(
|
|
||||||
fmt_vec3_double, hk_data[current_idx : current_idx + inc_len_vec3_double]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
current_idx += inc_len_vec3_double
|
|
||||||
rot_rate_total = [
|
|
||||||
f"{val*180/math.pi:8.3f}"
|
|
||||||
for val in struct.unpack(
|
|
||||||
fmt_vec3_double, hk_data[current_idx : current_idx + inc_len_vec3_double]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
current_idx += inc_len_vec3_double
|
|
||||||
pw.dlog(f"Fused Rotational Rate Orthogonal: {rot_rate_orthogonal} [deg/s]")
|
|
||||||
pw.dlog(f"Fused Rotational Rate Parallel: {rot_rate_parallel} [deg/s]")
|
|
||||||
pw.dlog(f"Fused Rotational Rate Total: {rot_rate_total} [deg/s]")
|
|
||||||
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=3)
|
|
||||||
|
|
||||||
|
|
||||||
def perform_mgm_calibration( # noqa C901: Complexity okay
|
def perform_mgm_calibration( # noqa C901: Complexity okay
|
||||||
pw: PrintWrapper, mgm_tuple: Tuple
|
pw: PrintWrapper, mgm_tuple: Tuple
|
||||||
): # noqa C901: Complexity okay
|
): # noqa C901: Complexity okay
|
||||||
@ -1277,8 +1160,8 @@ def perform_mgm_calibration( # noqa C901: Complexity okay
|
|||||||
reply = CALIBR_SOCKET.recv(1024)
|
reply = CALIBR_SOCKET.recv(1024)
|
||||||
if len(reply) != 2:
|
if len(reply) != 2:
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
"MGM calibration: Reply received command magnetometer_field has"
|
f"MGM calibration: Reply received command magnetometer_field has invalid "
|
||||||
f" invalid length {len(reply)}"
|
f"length {len(reply)}"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
@ -12,59 +12,45 @@ from tmtccmd.tc import DefaultPusQueueHelper
|
|||||||
from tmtccmd.tc.pus_3_fsfw_hk import (
|
from tmtccmd.tc.pus_3_fsfw_hk import (
|
||||||
make_sid,
|
make_sid,
|
||||||
create_request_one_hk_command,
|
create_request_one_hk_command,
|
||||||
create_enable_periodic_hk_command_with_interval_with_diag,
|
create_enable_periodic_hk_command_with_interval,
|
||||||
create_disable_periodic_hk_command_with_diag,
|
create_disable_periodic_hk_command,
|
||||||
)
|
)
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class GpsInfo:
|
|
||||||
MAX_SATELLITES = 30
|
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
OFF = "off"
|
OFF = "off"
|
||||||
ON = "on"
|
ON = "on"
|
||||||
REQ_CORE_HK = ["core_hk_request"]
|
REQ_OS_HK = ["hk"]
|
||||||
ENABLE_CORE_HK = ["core_hk_enable"]
|
ENABLE_HK = ["enable_hk"]
|
||||||
DISABLE_CORE_HK = ["core_hk_disable"]
|
DISABLE_HK = ["disable_hk"]
|
||||||
REQ_SKYVIEW_HK = ["skyview_hk_request"]
|
|
||||||
ENABLE_SKYVIEW_HK = ["skyview_hk_enable"]
|
|
||||||
DISABLE_SKYVIEW_HK = ["skyview_hk_disable"]
|
|
||||||
RESET_GNSS = ["reset"]
|
RESET_GNSS = ["reset"]
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
OFF = "Off"
|
OFF = "Off"
|
||||||
ON = "On"
|
ON = "On"
|
||||||
REQ_CORE_HK = "Request Core HK"
|
REQ_OS_HK = "Request One-Shot HK"
|
||||||
ENABLE_CORE_HK = "Enable Core HK"
|
ENABLE_HK = "Enable HK"
|
||||||
DISABLE_CORE_HK = "Disable Core HK"
|
DISABLE_HK = "Disable HK"
|
||||||
REQ_SKYVIEW_HK = "Request Skyview HK"
|
|
||||||
ENABLE_SKYVIEW_HK = "Enable Skyview HK"
|
|
||||||
DISABLE_SKYVIEW_HK = "Disable Skyview HK"
|
|
||||||
RESET_GNSS = "Reset GNSS using reset pin"
|
RESET_GNSS = "Reset GNSS using reset pin"
|
||||||
|
|
||||||
|
|
||||||
class SetId(enum.IntEnum):
|
class SetId(enum.IntEnum):
|
||||||
CORE_HK = 0
|
HK = 0
|
||||||
SKYVIEW_HK = 1
|
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
|
oce.add(keys=OpCode.RESET_GNSS, info=Info.RESET_GNSS)
|
||||||
|
oce.add(keys=OpCode.REQ_OS_HK, info=Info.REQ_OS_HK)
|
||||||
|
oce.add(keys=OpCode.ENABLE_HK, info=Info.ENABLE_HK)
|
||||||
|
oce.add(keys=OpCode.DISABLE_HK, info=Info.DISABLE_HK)
|
||||||
oce.add(keys=OpCode.OFF, info=Info.OFF)
|
oce.add(keys=OpCode.OFF, info=Info.OFF)
|
||||||
oce.add(keys=OpCode.ON, info=Info.ON)
|
oce.add(keys=OpCode.ON, info=Info.ON)
|
||||||
oce.add(keys=OpCode.RESET_GNSS, info=Info.RESET_GNSS)
|
|
||||||
oce.add(keys=OpCode.REQ_CORE_HK, info=Info.REQ_CORE_HK)
|
|
||||||
oce.add(keys=OpCode.ENABLE_CORE_HK, info=Info.ENABLE_CORE_HK)
|
|
||||||
oce.add(keys=OpCode.DISABLE_CORE_HK, info=Info.DISABLE_CORE_HK)
|
|
||||||
oce.add(keys=OpCode.REQ_SKYVIEW_HK, info=Info.REQ_SKYVIEW_HK)
|
|
||||||
oce.add(keys=OpCode.ENABLE_SKYVIEW_HK, info=Info.ENABLE_SKYVIEW_HK)
|
|
||||||
oce.add(keys=OpCode.DISABLE_SKYVIEW_HK, info=Info.DISABLE_SKYVIEW_HK)
|
|
||||||
defs.add_service(
|
defs.add_service(
|
||||||
name=CustomServiceList.GPS_CTRL.value,
|
name=CustomServiceList.GPS_CTRL.value,
|
||||||
info="GPS/GNSS Controller",
|
info="GPS/GNSS Controller",
|
||||||
@ -72,64 +58,27 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def pack_gps_command( # noqa: C901
|
def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str):
|
||||||
object_id: bytes, q: DefaultPusQueueHelper, op_code: str
|
sid = make_sid(object_id=object_id, set_id=SetId.HK)
|
||||||
): # noqa: C901:
|
|
||||||
if op_code in OpCode.RESET_GNSS:
|
if op_code in OpCode.RESET_GNSS:
|
||||||
# TODO: This needs to be re-implemented
|
# TODO: This needs to be re-implemented
|
||||||
_LOGGER.warning("Reset pin handling needs to be re-implemented")
|
_LOGGER.warning("Reset pin handling needs to be re-implemented")
|
||||||
if op_code in OpCode.ENABLE_CORE_HK:
|
if op_code in OpCode.ENABLE_HK:
|
||||||
interval = float(input("Please specify interval in floating point seconds: "))
|
interval = float(input("Please specify interval in floating point seconds: "))
|
||||||
if interval <= 0:
|
if interval <= 0:
|
||||||
raise ValueError("invalid interval")
|
raise ValueError("invalid interval")
|
||||||
q.add_log_cmd(f"GPS: {Info.ENABLE_CORE_HK}")
|
q.add_log_cmd(f"GPS: {Info.ENABLE_HK}")
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval(
|
||||||
diag=False,
|
diag=False, sid=sid, interval_seconds=interval
|
||||||
sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK),
|
|
||||||
interval_seconds=interval,
|
|
||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCode.DISABLE_CORE_HK:
|
if op_code in OpCode.DISABLE_HK:
|
||||||
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
|
q.add_log_cmd(f"gps: {Info.DISABLE_HK}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=sid))
|
||||||
create_disable_periodic_hk_command_with_diag(
|
if op_code in OpCode.REQ_OS_HK:
|
||||||
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK)
|
q.add_log_cmd(f"GPS: {Info.REQ_OS_HK}")
|
||||||
)
|
q.add_pus_tc(create_request_one_hk_command(sid=sid))
|
||||||
)
|
|
||||||
if op_code in OpCode.REQ_CORE_HK:
|
|
||||||
q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}")
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_request_one_hk_command(
|
|
||||||
sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if op_code in OpCode.ENABLE_SKYVIEW_HK:
|
|
||||||
interval = float(input("Please specify interval in floating point seconds: "))
|
|
||||||
if interval <= 0:
|
|
||||||
raise ValueError("invalid interval")
|
|
||||||
q.add_log_cmd(f"GPS: {Info.ENABLE_SKYVIEW_HK}")
|
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
|
||||||
diag=False,
|
|
||||||
sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK),
|
|
||||||
interval_seconds=interval,
|
|
||||||
)
|
|
||||||
for cmd in cmds:
|
|
||||||
q.add_pus_tc(cmd)
|
|
||||||
if op_code in OpCode.DISABLE_SKYVIEW_HK:
|
|
||||||
q.add_log_cmd(f"gps: {Info.DISABLE_SKYVIEW_HK}")
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_disable_periodic_hk_command_with_diag(
|
|
||||||
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if op_code in OpCode.REQ_SKYVIEW_HK:
|
|
||||||
q.add_log_cmd(f"GPS: {Info.REQ_SKYVIEW_HK}")
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_request_one_hk_command(
|
|
||||||
sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if op_code in OpCode.ON:
|
if op_code in OpCode.ON:
|
||||||
q.add_log_cmd(f"GPS: {Info.ON}")
|
q.add_log_cmd(f"GPS: {Info.ON}")
|
||||||
q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0))
|
q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0))
|
||||||
@ -138,27 +87,8 @@ def pack_gps_command( # noqa: C901
|
|||||||
q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0))
|
q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0))
|
||||||
|
|
||||||
|
|
||||||
def handle_gps_data(
|
def handle_gps_data(pw: PrintWrapper, hk_data: bytes):
|
||||||
pw: PrintWrapper,
|
pw.dlog(f"Received GPS data, HK data length {len(hk_data)}")
|
||||||
set_id: int,
|
|
||||||
hk_data: bytes,
|
|
||||||
packet_time: datetime.datetime,
|
|
||||||
):
|
|
||||||
pw.ilog(_LOGGER, f"Received GPS CTRL HK with packet time {packet_time}")
|
|
||||||
match set_id:
|
|
||||||
case SetId.CORE_HK:
|
|
||||||
handle_core_data(pw, hk_data)
|
|
||||||
case SetId.SKYVIEW_HK:
|
|
||||||
handle_skyview_data(pw, hk_data)
|
|
||||||
|
|
||||||
|
|
||||||
def handle_core_data(pw: PrintWrapper, hk_data: bytes):
|
|
||||||
if len(hk_data) < 4 * 8 + 4 + 2 + 8:
|
|
||||||
pw.dlog(
|
|
||||||
f"GPS Core dataset with size {len(hk_data)} does not have expected size"
|
|
||||||
f" of {4*8+4+2+8} bytes"
|
|
||||||
)
|
|
||||||
return
|
|
||||||
current_idx = 0
|
current_idx = 0
|
||||||
fmt_str = "!ddddBBBHBBBBBI"
|
fmt_str = "!ddddBBBHBBBBBI"
|
||||||
inc_len = struct.calcsize(fmt_str)
|
inc_len = struct.calcsize(fmt_str)
|
||||||
@ -196,65 +126,3 @@ def handle_core_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
FsfwTmTcPrinter.get_validity_buffer(
|
FsfwTmTcPrinter.get_validity_buffer(
|
||||||
validity_buffer=hk_data[current_idx:], num_vars=14
|
validity_buffer=hk_data[current_idx:], num_vars=14
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def handle_skyview_data(pw: PrintWrapper, hk_data: bytes):
|
|
||||||
data_length = 8 + GpsInfo.MAX_SATELLITES * (8 + 3 * 2 + 1)
|
|
||||||
if len(hk_data) < data_length:
|
|
||||||
pw.dlog(
|
|
||||||
f"GPS Skyview dataset with size {len(hk_data)} does not have expected size"
|
|
||||||
f" of {data_length} bytes"
|
|
||||||
)
|
|
||||||
return
|
|
||||||
current_idx = 0
|
|
||||||
fmt_str_unix = "!d"
|
|
||||||
fmt_str_int16 = "!" + "h" * GpsInfo.MAX_SATELLITES
|
|
||||||
fmt_str_double = "!" + "d" * GpsInfo.MAX_SATELLITES
|
|
||||||
fmt_str_uint8 = "!" + "B" * GpsInfo.MAX_SATELLITES
|
|
||||||
inc_len_unix = struct.calcsize(fmt_str_unix)
|
|
||||||
inc_len_int16 = struct.calcsize(fmt_str_int16)
|
|
||||||
inc_len_double = struct.calcsize(fmt_str_double)
|
|
||||||
inc_len_uint8 = struct.calcsize(fmt_str_uint8)
|
|
||||||
unix = struct.unpack(
|
|
||||||
fmt_str_unix, hk_data[current_idx : current_idx + inc_len_unix]
|
|
||||||
)[0]
|
|
||||||
current_idx += inc_len_unix
|
|
||||||
prn_id = struct.unpack(
|
|
||||||
fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16]
|
|
||||||
)
|
|
||||||
current_idx += inc_len_int16
|
|
||||||
azimuth = struct.unpack(
|
|
||||||
fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16]
|
|
||||||
)
|
|
||||||
current_idx += inc_len_int16
|
|
||||||
elevation = struct.unpack(
|
|
||||||
fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16]
|
|
||||||
)
|
|
||||||
current_idx += inc_len_int16
|
|
||||||
signal_to_noise = struct.unpack(
|
|
||||||
fmt_str_double, hk_data[current_idx : current_idx + inc_len_double]
|
|
||||||
)
|
|
||||||
current_idx += inc_len_double
|
|
||||||
used = struct.unpack(
|
|
||||||
fmt_str_uint8, hk_data[current_idx : current_idx + inc_len_uint8]
|
|
||||||
)
|
|
||||||
current_idx += inc_len_uint8
|
|
||||||
pw.dlog(f"Skyview Time: {unix} unix-sec")
|
|
||||||
pw.dlog(
|
|
||||||
"{:<8} {:<8} {:<8} {:<8} {:<8}".format(
|
|
||||||
"PRN_ID", "AZ [°]", "EL [°]", "S2N [dBW]", "USED"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
for idx in range(GpsInfo.MAX_SATELLITES):
|
|
||||||
pw.dlog(
|
|
||||||
"{:<8} {:<8} {:<8} {:<8} {:<8}".format(
|
|
||||||
prn_id[idx],
|
|
||||||
azimuth[idx],
|
|
||||||
elevation[idx],
|
|
||||||
signal_to_noise[idx],
|
|
||||||
used[idx],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
FsfwTmTcPrinter.get_validity_buffer(
|
|
||||||
validity_buffer=hk_data[current_idx:], num_vars=6
|
|
||||||
)
|
|
||||||
|
@ -61,7 +61,7 @@ GYR_SEL_DICT = {
|
|||||||
|
|
||||||
def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
|
def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
|
||||||
print("Please select the Gyro Device")
|
print("Please select the Gyro Device")
|
||||||
for k, v in GYR_SEL_DICT.items():
|
for (k, v) in GYR_SEL_DICT.items():
|
||||||
print(f"{k}: {v[0]}")
|
print(f"{k}: {v[0]}")
|
||||||
sel_idx = int(input("Select gyro device by index: "))
|
sel_idx = int(input("Select gyro device by index: "))
|
||||||
gyr_info = GYR_SEL_DICT[GyrSel(sel_idx)]
|
gyr_info = GYR_SEL_DICT[GyrSel(sel_idx)]
|
||||||
|
@ -24,8 +24,8 @@ from tmtccmd.tc.pus_3_fsfw_hk import (
|
|||||||
generate_one_diag_command,
|
generate_one_diag_command,
|
||||||
generate_one_hk_command,
|
generate_one_hk_command,
|
||||||
create_request_one_diag_command,
|
create_request_one_diag_command,
|
||||||
create_enable_periodic_hk_command_with_interval_with_diag,
|
create_disable_periodic_hk_command,
|
||||||
create_disable_periodic_hk_command_with_diag,
|
create_enable_periodic_hk_command_with_interval,
|
||||||
)
|
)
|
||||||
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
|
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
|
||||||
from tmtccmd.util import ObjectIdU32
|
from tmtccmd.util import ObjectIdU32
|
||||||
@ -227,13 +227,12 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
duration = int(
|
duration = int(
|
||||||
input(
|
input(
|
||||||
f"Specify torque duration [range [0, {pow(2, 16) - 1}, "
|
f"Specify torque duration [range [0, {pow(2, 16) - 1}, "
|
||||||
"0 for continuous generation until update]: "
|
f"0 for continuous generation until update]: "
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
dur_str = "infinite" if duration == 0 else str(duration)
|
dur_str = "infinite" if duration == 0 else str(duration)
|
||||||
q.add_log_cmd(
|
q.add_log_cmd(
|
||||||
f"IMTQ: Commanding dipole X={x_dipole}, Y={y_dipole}, Z={y_dipole},"
|
f"IMTQ: Commanding dipole X={x_dipole}, Y={y_dipole}, Z={y_dipole}, duration={dur_str}"
|
||||||
f" duration={dur_str}"
|
|
||||||
)
|
)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_dipole_command(
|
pack_dipole_command(
|
||||||
@ -249,7 +248,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
if op_code == OpCode.ENABLE_ENG_HK_NO_TORQUE:
|
if op_code == OpCode.ENABLE_ENG_HK_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Enable ENG HK")
|
q.add_log_cmd("IMTQ: Enable ENG HK")
|
||||||
interval = float(input("Please enter collection interval in seconds: "))
|
interval = float(input("Please enter collection interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval(
|
||||||
diag=True,
|
diag=True,
|
||||||
sid=make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE),
|
sid=make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE),
|
||||||
interval_seconds=interval,
|
interval_seconds=interval,
|
||||||
@ -259,7 +258,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
if op_code == OpCode.DISABLE_ENG_HK_NO_TORQUE:
|
if op_code == OpCode.DISABLE_ENG_HK_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Disable ENG HK (No Torque)")
|
q.add_log_cmd("IMTQ: Disable ENG HK (No Torque)")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command(
|
||||||
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE)
|
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -276,7 +275,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
if op_code == OpCode.ENABLE_ENG_HK_WITH_TORQUE:
|
if op_code == OpCode.ENABLE_ENG_HK_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Enable ENG HK with torque")
|
q.add_log_cmd("IMTQ: Enable ENG HK with torque")
|
||||||
interval = float(input("Please enter collection interval in seconds: "))
|
interval = float(input("Please enter collection interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval(
|
||||||
diag=True,
|
diag=True,
|
||||||
sid=make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE),
|
sid=make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE),
|
||||||
interval_seconds=interval,
|
interval_seconds=interval,
|
||||||
@ -286,7 +285,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
if op_code == OpCode.DISABLE_ENG_HK_WITH_TORQUE:
|
if op_code == OpCode.DISABLE_ENG_HK_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Disable ENG HK with Torque")
|
q.add_log_cmd("IMTQ: Disable ENG HK with Torque")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command(
|
||||||
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE)
|
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -321,14 +320,14 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
if op_code == OpCode.DISABLE_MGM_RAW_NO_TORQUE:
|
if op_code == OpCode.DISABLE_MGM_RAW_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
|
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command(
|
||||||
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE)
|
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.ENABLE_MGM_RAW_NO_TORQUE:
|
if op_code == OpCode.ENABLE_MGM_RAW_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
|
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
|
||||||
interval = float(input("Please enter collection interval in seconds: "))
|
interval = float(input("Please enter collection interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval(
|
||||||
diag=True,
|
diag=True,
|
||||||
sid=make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE),
|
sid=make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE),
|
||||||
interval_seconds=interval,
|
interval_seconds=interval,
|
||||||
@ -347,7 +346,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
if op_code == OpCode.ENABLE_MGM_RAW_WITH_TORQUE:
|
if op_code == OpCode.ENABLE_MGM_RAW_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
|
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
|
||||||
interval = float(input("Please enter collection interval in seconds: "))
|
interval = float(input("Please enter collection interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval(
|
||||||
diag=True,
|
diag=True,
|
||||||
sid=make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_WITH_TORQUE),
|
sid=make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_WITH_TORQUE),
|
||||||
interval_seconds=interval,
|
interval_seconds=interval,
|
||||||
@ -357,7 +356,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
if op_code == OpCode.DISABLE_MGM_RAW_WITH_TORQUE:
|
if op_code == OpCode.DISABLE_MGM_RAW_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
|
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command(
|
||||||
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_WITH_TORQUE)
|
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_WITH_TORQUE)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -389,8 +388,7 @@ def pack_dipole_command(
|
|||||||
duration = int(round(duration))
|
duration = int(round(duration))
|
||||||
if duration < 0 or duration > pow(2, 16) - 1:
|
if duration < 0 or duration > pow(2, 16) - 1:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Duration in ms of {duration} smaller than 0 or larger than allowed"
|
f"Duration in ms of {duration} smaller than 0 or larger than allowed {pow(2, 16) - 1}"
|
||||||
f" {pow(2, 16) - 1}"
|
|
||||||
)
|
)
|
||||||
command += struct.pack("!h", x_dipole)
|
command += struct.pack("!h", x_dipole)
|
||||||
command += struct.pack("!h", y_dipole)
|
command += struct.pack("!h", y_dipole)
|
||||||
@ -402,8 +400,7 @@ def pack_dipole_command(
|
|||||||
|
|
||||||
def raise_dipole_error(dipole_str: str, value: int):
|
def raise_dipole_error(dipole_str: str, value: int):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"{dipole_str} {value} negative or larger than maximum allowed 2000 *"
|
f"{dipole_str} {value} negative or larger than maximum allowed 2000 * 10^-4*Am^2"
|
||||||
" 10^-4*Am^2"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ MGM_SEL_DICT = {
|
|||||||
|
|
||||||
def handle_mgm_cmd(q: DefaultPusQueueHelper, op_code: str):
|
def handle_mgm_cmd(q: DefaultPusQueueHelper, op_code: str):
|
||||||
print("Please select the MGM Device")
|
print("Please select the MGM Device")
|
||||||
for k, v in MGM_SEL_DICT.items():
|
for (k, v) in MGM_SEL_DICT.items():
|
||||||
print(f"{k}: {v[0]}")
|
print(f"{k}: {v[0]}")
|
||||||
sel_idx = int(input("Select MGM device by index: "))
|
sel_idx = int(input("Select MGM device by index: "))
|
||||||
mgm_info = MGM_SEL_DICT[MgmSel(sel_idx)]
|
mgm_info = MGM_SEL_DICT[MgmSel(sel_idx)]
|
||||||
|
@ -261,12 +261,14 @@ def pack_set_speed_command(
|
|||||||
if speed > 0:
|
if speed > 0:
|
||||||
if speed < 1000 or speed > 65000:
|
if speed < 1000 or speed > 65000:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Invalid RW speed specified. Allowed range is [1000, 65000] 0.1 * RPM"
|
"Invalid RW speed specified. "
|
||||||
|
"Allowed range is [1000, 65000] 0.1 * RPM"
|
||||||
)
|
)
|
||||||
elif speed < 0:
|
elif speed < 0:
|
||||||
if speed < -65000 or speed > -1000:
|
if speed < -65000 or speed > -1000:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Invalid RW speed specified. Allowed range is [-65000, -1000] 0.1 * RPM"
|
"Invalid RW speed specified. "
|
||||||
|
"Allowed range is [-65000, -1000] 0.1 * RPM"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# Speed is 0
|
# Speed is 0
|
||||||
@ -288,6 +290,7 @@ def pack_set_speed_command(
|
|||||||
def handle_rw_hk_data(
|
def handle_rw_hk_data(
|
||||||
pw: PrintWrapper, object_id: ObjectIdU32, set_id: int, hk_data: bytes
|
pw: PrintWrapper, object_id: ObjectIdU32, set_id: int, hk_data: bytes
|
||||||
):
|
):
|
||||||
|
|
||||||
current_idx = 0
|
current_idx = 0
|
||||||
if set_id == RwSetId.STATUS_SET_ID:
|
if set_id == RwSetId.STATUS_SET_ID:
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
@ -302,16 +305,15 @@ def handle_rw_hk_data(
|
|||||||
speed_rpm = speed / 10.0
|
speed_rpm = speed / 10.0
|
||||||
ref_speed_rpm = ref_speed / 10.0
|
ref_speed_rpm = ref_speed / 10.0
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"Temperature {temp} C | Speed {speed_rpm} rpm | Reference Speed"
|
f"Temperature {temp} C | Speed {speed_rpm} rpm | Reference Speed {ref_speed_rpm} rpm"
|
||||||
f" {ref_speed_rpm} rpm"
|
|
||||||
)
|
)
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"State {state}. 0: Error, 1: Idle, 2: Coasting, 3: Running, speed stable, "
|
f"State {state}. 0: Error, 1: Idle, 2: Coasting, 3: Running, speed stable, "
|
||||||
"4: Running, speed changing"
|
f"4: Running, speed changing"
|
||||||
)
|
)
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"Current Limit Control mode {clc_mode}. 0: Low Current Mode (0.3 A), "
|
f"Current Limit Control mode {clc_mode}. 0: Low Current Mode (0.3 A), "
|
||||||
"1: High Current Mode (0.6 A)"
|
f"1: High Current Mode (0.6 A)"
|
||||||
)
|
)
|
||||||
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 5))
|
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 5))
|
||||||
if set_id == RwSetId.LAST_RESET:
|
if set_id == RwSetId.LAST_RESET:
|
||||||
@ -360,24 +362,22 @@ def handle_rw_hk_data(
|
|||||||
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
||||||
|
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"MCU Temperature {mcu_temp} | Pressure Sensore Temperature"
|
f"MCU Temperature {mcu_temp} | Pressure Sensore Temperature {pressure_sens_temp} C"
|
||||||
f" {pressure_sens_temp} C"
|
|
||||||
)
|
)
|
||||||
pw.dlog(f"Last Reset Status {last_reset_status}")
|
pw.dlog(f"Last Reset Status {last_reset_status}")
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"Current Limit Control mode {clc_mode}. 0: Low Current Mode (0.3 A), "
|
f"Current Limit Control mode {clc_mode}. 0: Low Current Mode (0.3 A), "
|
||||||
"1: High Current Mode (0.6 A)"
|
f"1: High Current Mode (0.6 A)"
|
||||||
)
|
)
|
||||||
pw.dlog(f"Speed {current_speed} rpm | Reference Speed {ref_speed} rpm")
|
pw.dlog(f"Speed {current_speed} rpm | Reference Speed {ref_speed} rpm")
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"State {state}. 0: Error, 1: Idle, 2: Coasting, 3: Running, speed stable, "
|
f"State {state}. 0: Error, 1: Idle, 2: Coasting, 3: Running, speed stable, "
|
||||||
"4: Running, speed changing"
|
f"4: Running, speed changing"
|
||||||
)
|
)
|
||||||
pw.dlog("Number Of Invalid Packets:")
|
pw.dlog("Number Of Invalid Packets:")
|
||||||
pw.dlog("CRC | Length | CMD")
|
pw.dlog("CRC | Length | CMD")
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"{num_invalid_crc_packets} | {num_invalid_len_packets} |"
|
f"{num_invalid_crc_packets} | {num_invalid_len_packets} | {num_invalid_cmd_packets}"
|
||||||
f" {num_invalid_cmd_packets}"
|
|
||||||
)
|
)
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"Num Of CMD Executed Requests {num_of_cmd_executed_requests} | "
|
f"Num Of CMD Executed Requests {num_of_cmd_executed_requests} | "
|
||||||
@ -389,16 +389,15 @@ def handle_rw_hk_data(
|
|||||||
"RegOverrunErrs | TotalErrs"
|
"RegOverrunErrs | TotalErrs"
|
||||||
)
|
)
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"{uart_num_of_bytes_written} | {uart_num_of_bytes_read} |"
|
f"{uart_num_of_bytes_written} | {uart_num_of_bytes_read} | {uart_num_parity_errors} | "
|
||||||
f" {uart_num_parity_errors} | {uart_num_noise_errors} |"
|
f"{uart_num_noise_errors} | {uart_num_frame_errors} | {uart_num_reg_overrun_errors} | "
|
||||||
f" {uart_num_frame_errors} | {uart_num_reg_overrun_errors} |"
|
f"{uart_total_num_errors}"
|
||||||
f" {uart_total_num_errors}"
|
|
||||||
)
|
)
|
||||||
pw.dlog("SPI COM Info:")
|
pw.dlog("SPI COM Info:")
|
||||||
pw.dlog("NumBytesWritten | NumBytesRead | RegOverrunErrs | TotalErrs")
|
pw.dlog("NumBytesWritten | NumBytesRead | RegOverrunErrs | TotalErrs")
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"{spi_num_bytes_written} | {spi_num_bytes_read} |"
|
f"{spi_num_bytes_written} | {spi_num_bytes_read} | {spi_num_reg_overrun_errors} | "
|
||||||
f" {spi_num_reg_overrun_errors} | {spi_total_num_errors}"
|
f"{spi_total_num_errors}"
|
||||||
)
|
)
|
||||||
if current_idx > 0:
|
if current_idx > 0:
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
|
@ -65,6 +65,7 @@ class StarTrackerActionId(enum.IntEnum):
|
|||||||
CHANGE_DOWNLOAD_IMAGE = 57
|
CHANGE_DOWNLOAD_IMAGE = 57
|
||||||
SET_JSON_FILE_NAME = 58
|
SET_JSON_FILE_NAME = 58
|
||||||
SET_FLASH_READ_FILENAME = 59
|
SET_FLASH_READ_FILENAME = 59
|
||||||
|
SET_TIME = 60
|
||||||
DOWNLOAD_DBIMAGE = 61
|
DOWNLOAD_DBIMAGE = 61
|
||||||
DOWNLOAD_BLOBPIXEL = 62
|
DOWNLOAD_BLOBPIXEL = 62
|
||||||
DOWNLOAD_FPGA_IMAGE = 63
|
DOWNLOAD_FPGA_IMAGE = 63
|
||||||
@ -89,7 +90,6 @@ class StarTrackerActionId(enum.IntEnum):
|
|||||||
LOG_SUBSCRIPTION = 82
|
LOG_SUBSCRIPTION = 82
|
||||||
DEBUG_CAMERA = 83
|
DEBUG_CAMERA = 83
|
||||||
FIRMWARE_UPDATE = 84
|
FIRMWARE_UPDATE = 84
|
||||||
SET_TIME_FROM_SYS_TIME = 87
|
|
||||||
|
|
||||||
|
|
||||||
class OpCodes:
|
class OpCodes:
|
||||||
@ -104,7 +104,6 @@ class OpCodes:
|
|||||||
UPLOAD_IMAGE = "upload_image"
|
UPLOAD_IMAGE = "upload_image"
|
||||||
SET_IMG_PROCESSOR_MODE = "set_img_proc_mode"
|
SET_IMG_PROCESSOR_MODE = "set_img_proc_mode"
|
||||||
FW_UPDATE = "fw_update"
|
FW_UPDATE = "fw_update"
|
||||||
SET_TIME_FROM_SYS_TIME = "set_time"
|
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -114,7 +113,6 @@ class Info:
|
|||||||
TAKE_IMAGE = "Take Image"
|
TAKE_IMAGE = "Take Image"
|
||||||
SET_IMG_PROCESSOR_MODE = "Set Image Processor Mode"
|
SET_IMG_PROCESSOR_MODE = "Set Image Processor Mode"
|
||||||
FW_UPDATE = "Firmware Update"
|
FW_UPDATE = "Firmware Update"
|
||||||
SET_TIME_FROM_SYS_TIME = "Set time from system time"
|
|
||||||
|
|
||||||
|
|
||||||
class SetId(enum.IntEnum):
|
class SetId(enum.IntEnum):
|
||||||
@ -440,9 +438,14 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
q.add_log_cmd("Star tracker: Get checksum")
|
q.add_log_cmd("Star tracker: Get checksum")
|
||||||
data = pack_checksum_command(obyt)
|
data = pack_checksum_command(obyt)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == OpCodes.SET_TIME_FROM_SYS_TIME:
|
if op_code == "38":
|
||||||
q.add_log_cmd(Info.SET_TIME_FROM_SYS_TIME)
|
q.add_log_cmd("Star tracker: Set time")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.SET_TIME_FROM_SYS_TIME)
|
unix_time = 1640783543
|
||||||
|
data = (
|
||||||
|
obyt
|
||||||
|
+ struct.pack("!I", StarTrackerActionId.SET_TIME)
|
||||||
|
+ struct.pack("!Q", unix_time)
|
||||||
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == "39":
|
if op_code == "39":
|
||||||
q.add_log_cmd("Star tracker: Download Centroid")
|
q.add_log_cmd("Star tracker: Download Centroid")
|
||||||
@ -482,6 +485,34 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ struct.pack("!B", type)
|
+ struct.pack("!B", type)
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
|
if op_code == "44":
|
||||||
|
q.add_log_cmd("Star tracker: Download FPGA Image")
|
||||||
|
position = int(input("Start position: "))
|
||||||
|
length = int(input("Size to download: "))
|
||||||
|
data = (
|
||||||
|
obyt
|
||||||
|
+ struct.pack("!I", StarTrackerActionId.DOWNLOAD_FPGA_IMAGE)
|
||||||
|
+ struct.pack("!I", position)
|
||||||
|
+ struct.pack("!I", length)
|
||||||
|
+ bytearray(FileDefs.downloadFpgaImagePath, "utf-8")
|
||||||
|
)
|
||||||
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
|
if op_code == "45":
|
||||||
|
q.add_log_cmd("Star tracker: Change donwload FPGA image file name")
|
||||||
|
data = (
|
||||||
|
obyt
|
||||||
|
+ struct.pack("!I", StarTrackerActionId.CHANGE_FPGA_DOWNLOAD_FILE)
|
||||||
|
+ bytearray(FileDefs.downloadFpgaImageName, "utf-8")
|
||||||
|
)
|
||||||
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
|
if op_code == "46":
|
||||||
|
q.add_log_cmd("Star tracker: Upload FPGA image")
|
||||||
|
data = (
|
||||||
|
obyt
|
||||||
|
+ struct.pack("!I", StarTrackerActionId.UPLOAD_FPGA_IMAGE)
|
||||||
|
+ bytearray(FileDefs.uploadFpgaImageName, "utf-8")
|
||||||
|
)
|
||||||
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == "47":
|
if op_code == "47":
|
||||||
q.add_log_cmd("Star tracker: FPGA action")
|
q.add_log_cmd("Star tracker: FPGA action")
|
||||||
id = 3
|
id = 3
|
||||||
@ -693,7 +724,7 @@ def unpack_time_hk(hk_data: bytes, current_idx: int, pw: PrintWrapper) -> int:
|
|||||||
ticks_time_fmt, hk_data[current_idx : current_idx + fmt_len]
|
ticks_time_fmt, hk_data[current_idx : current_idx + fmt_len]
|
||||||
)
|
)
|
||||||
unix_as_dt = datetime.datetime.fromtimestamp(
|
unix_as_dt = datetime.datetime.fromtimestamp(
|
||||||
int(round(unix_time / 1e6)), tz=datetime.timezone.utc
|
int(round(unix_time / 10e6)), tz=datetime.timezone.utc
|
||||||
)
|
)
|
||||||
pw.dlog(f"Ticks: {ticks} | UNIX time: {unix_time}")
|
pw.dlog(f"Ticks: {ticks} | UNIX time: {unix_time}")
|
||||||
pw.dlog(f"UNIX as datetime: {unix_as_dt}")
|
pw.dlog(f"UNIX as datetime: {unix_as_dt}")
|
||||||
@ -856,5 +887,4 @@ def add_str_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
oce.add(OpCodes.FW_UPDATE, Info.FW_UPDATE)
|
oce.add(OpCodes.FW_UPDATE, Info.FW_UPDATE)
|
||||||
oce.add("70", "Star Tracker: Disable timestamp generation")
|
oce.add("70", "Star Tracker: Disable timestamp generation")
|
||||||
oce.add("71", "Star Tracker: Enable timestamp generation")
|
oce.add("71", "Star Tracker: Enable timestamp generation")
|
||||||
oce.add(OpCodes.SET_TIME_FROM_SYS_TIME, Info.SET_TIME_FROM_SYS_TIME)
|
|
||||||
defs.add_service(CustomServiceList.STAR_TRACKER.value, "Star Tracker", oce)
|
defs.add_service(CustomServiceList.STAR_TRACKER.value, "Star Tracker", oce)
|
||||||
|
@ -83,7 +83,7 @@ def pack_pdec_handler_test(
|
|||||||
0,
|
0,
|
||||||
ParameterId.POSITIVE_WINDOW,
|
ParameterId.POSITIVE_WINDOW,
|
||||||
pw,
|
pw,
|
||||||
)
|
).pack()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NEGATIVE_WINDOW:
|
if op_code == OpCode.NEGATIVE_WINDOW:
|
||||||
@ -96,7 +96,7 @@ def pack_pdec_handler_test(
|
|||||||
0,
|
0,
|
||||||
ParameterId.NEGATIVE_WINDOW,
|
ParameterId.NEGATIVE_WINDOW,
|
||||||
nw,
|
nw,
|
||||||
)
|
).pack()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.RESET_NO_INIT:
|
if op_code == OpCode.RESET_NO_INIT:
|
||||||
|
@ -3,7 +3,6 @@ import enum
|
|||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.config.object_ids import COM_SUBSYSTEM_ID
|
from eive_tmtc.config.object_ids import COM_SUBSYSTEM_ID
|
||||||
from eive_tmtc.tmtc.com.syrlinks_handler import Datarate
|
from eive_tmtc.tmtc.com.syrlinks_handler import Datarate
|
||||||
from tmtccmd.pus.s20_fsfw_param_defs import create_scalar_u8_parameter
|
|
||||||
|
|
||||||
from .defs import Mode as ComMode
|
from .defs import Mode as ComMode
|
||||||
|
|
||||||
@ -22,6 +21,7 @@ from tmtccmd.tc.pus_200_fsfw_mode import (
|
|||||||
)
|
)
|
||||||
from tmtccmd.tc.pus_20_fsfw_param import (
|
from tmtccmd.tc.pus_20_fsfw_param import (
|
||||||
create_load_param_cmd,
|
create_load_param_cmd,
|
||||||
|
pack_scalar_u8_parameter_app_data,
|
||||||
)
|
)
|
||||||
|
|
||||||
from tmtccmd.pus.s20_fsfw_param import create_scalar_u32_parameter
|
from tmtccmd.pus.s20_fsfw_param import create_scalar_u32_parameter
|
||||||
@ -87,7 +87,7 @@ def build_com_subsystem_cmd(p: ServiceProviderParams): # noqa C901
|
|||||||
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_LOW}")
|
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_LOW}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_load_param_cmd(
|
create_load_param_cmd(
|
||||||
create_scalar_u8_parameter(
|
pack_scalar_u8_parameter_app_data(
|
||||||
COM_SUBSYSTEM_ID,
|
COM_SUBSYSTEM_ID,
|
||||||
0,
|
0,
|
||||||
ParameterId.DATARATE,
|
ParameterId.DATARATE,
|
||||||
@ -99,7 +99,7 @@ def build_com_subsystem_cmd(p: ServiceProviderParams): # noqa C901
|
|||||||
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_HIGH}")
|
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_HIGH}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_load_param_cmd(
|
create_load_param_cmd(
|
||||||
create_scalar_u8_parameter(
|
pack_scalar_u8_parameter_app_data(
|
||||||
COM_SUBSYSTEM_ID,
|
COM_SUBSYSTEM_ID,
|
||||||
0,
|
0,
|
||||||
ParameterId.DATARATE,
|
ParameterId.DATARATE,
|
||||||
@ -122,7 +122,7 @@ def build_com_subsystem_cmd(p: ServiceProviderParams): # noqa C901
|
|||||||
0,
|
0,
|
||||||
ParameterId.TRANSMITTER_TIMEOUT,
|
ParameterId.TRANSMITTER_TIMEOUT,
|
||||||
timeout,
|
timeout,
|
||||||
)
|
).pack()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif o == OpCode.READ_MODE:
|
elif o == OpCode.READ_MODE:
|
||||||
|
@ -21,9 +21,9 @@ from tmtccmd.tc import DefaultPusQueueHelper
|
|||||||
from tmtccmd.tc.pus_3_fsfw_hk import (
|
from tmtccmd.tc.pus_3_fsfw_hk import (
|
||||||
make_sid,
|
make_sid,
|
||||||
create_request_one_diag_command,
|
create_request_one_diag_command,
|
||||||
|
create_enable_periodic_hk_command_with_interval,
|
||||||
|
create_disable_periodic_hk_command,
|
||||||
create_request_one_hk_command,
|
create_request_one_hk_command,
|
||||||
create_enable_periodic_hk_command_with_interval_with_diag,
|
|
||||||
create_disable_periodic_hk_command_with_diag,
|
|
||||||
)
|
)
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.tc.pus_200_fsfw_mode import Mode, create_mode_command
|
from tmtccmd.tc.pus_200_fsfw_mode import Mode, create_mode_command
|
||||||
@ -182,28 +182,24 @@ def pack_syrlinks_command( # noqa C901: Complexity okay here.
|
|||||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_RX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_RX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
||||||
interval = float(input("HK interval in floating point seconds"))
|
interval = float(input("HK interval in floating point seconds"))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval(True, sid, interval)
|
||||||
True, sid, interval
|
|
||||||
)
|
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCode.DISABLE_HK_RX_REGS:
|
if op_code in OpCode.DISABLE_HK_RX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_RX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_RX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
||||||
q.add_pus_tc(create_disable_periodic_hk_command_with_diag(True, sid))
|
q.add_pus_tc(create_disable_periodic_hk_command(True, sid))
|
||||||
if op_code in OpCode.ENABLE_HK_TX_REGS:
|
if op_code in OpCode.ENABLE_HK_TX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_TX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_TX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
||||||
interval = float(input("HK interval in floating point seconds"))
|
interval = float(input("HK interval in floating point seconds"))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval(True, sid, interval)
|
||||||
True, sid, interval
|
|
||||||
)
|
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCode.DISABLE_HK_TX_REGS:
|
if op_code in OpCode.DISABLE_HK_TX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_TX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_TX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
||||||
q.add_pus_tc(create_disable_periodic_hk_command_with_diag(True, sid))
|
q.add_pus_tc(create_disable_periodic_hk_command(True, sid))
|
||||||
if op_code in OpCode.HK_TX_REGS:
|
if op_code in OpCode.HK_TX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.HK_TX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.HK_TX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
||||||
|
@ -24,19 +24,6 @@ from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SdState(enum.IntEnum):
|
|
||||||
OFF = 0
|
|
||||||
ON = 1
|
|
||||||
MOUNTED = 2
|
|
||||||
|
|
||||||
|
|
||||||
class SdCardSelect(enum.IntEnum):
|
|
||||||
SD_0 = 0
|
|
||||||
SD_1 = 1
|
|
||||||
BOTH = 2
|
|
||||||
NONE = 3
|
|
||||||
|
|
||||||
|
|
||||||
class ActionId(enum.IntEnum):
|
class ActionId(enum.IntEnum):
|
||||||
ANNOUNCE_VERSION = 1
|
ANNOUNCE_VERSION = 1
|
||||||
ANNOUNCE_CURRENT_IMAGE = 2
|
ANNOUNCE_CURRENT_IMAGE = 2
|
||||||
@ -45,7 +32,6 @@ class ActionId(enum.IntEnum):
|
|||||||
RESET_REBOOT_COUNTER = 6
|
RESET_REBOOT_COUNTER = 6
|
||||||
SWITCH_IMG_LOCK = 7
|
SWITCH_IMG_LOCK = 7
|
||||||
SET_MAX_REBOOT_CNT = 8
|
SET_MAX_REBOOT_CNT = 8
|
||||||
READ_REBOOT_MECHANISM_INFO = 9
|
|
||||||
UPDATE_OBSW_FROM_SD_0 = 10
|
UPDATE_OBSW_FROM_SD_0 = 10
|
||||||
UPDATE_OBSW_FROM_SD_1 = 11
|
UPDATE_OBSW_FROM_SD_1 = 11
|
||||||
UPDATE_OBSW_FROM_TMP = 12
|
UPDATE_OBSW_FROM_TMP = 12
|
||||||
@ -101,15 +87,14 @@ class OpCode:
|
|||||||
SWITCH_TO_SD_0 = ["switch_to_sd_0"]
|
SWITCH_TO_SD_0 = ["switch_to_sd_0"]
|
||||||
SWITCH_TO_SD_1 = ["switch_to_sd_1"]
|
SWITCH_TO_SD_1 = ["switch_to_sd_1"]
|
||||||
SWITCH_TO_BOTH_SD_CARDS = ["switch_to_both_sd_cards"]
|
SWITCH_TO_BOTH_SD_CARDS = ["switch_to_both_sd_cards"]
|
||||||
READ_REBOOT_MECHANISM_INFO = "rbh_info"
|
ENABLE_REBOOT_FILE_HANDLING = ["rbh_off"]
|
||||||
ENABLE_REBOOT_FILE_HANDLING = "rwd_on"
|
DISABLE_REBOOT_FILE_HANDLING = ["rbh_on"]
|
||||||
DISABLE_REBOOT_FILE_HANDLING = "rwd_off"
|
RESET_ALL_REBOOT_COUNTERS = ["rbh_reset_a"]
|
||||||
RESET_ALL_REBOOT_COUNTERS = "rwd_reset_a"
|
RESET_REBOOT_COUNTER_00 = ["rbh_reset_00"]
|
||||||
RWD_RESET_REBOOT_COUNTER_00 = "rwd_reset_00"
|
RESET_REBOOT_COUNTER_01 = ["rbh_reset_01"]
|
||||||
RWD_RESET_REBOOT_COUNTER_01 = "rwd_reset_01"
|
RESET_REBOOT_COUNTER_10 = ["rbh_reset_10"]
|
||||||
RWD_RESET_REBOOT_COUNTER_10 = "rwd_reset_10"
|
RESET_REBOOT_COUNTER_11 = ["rbh_reset_11"]
|
||||||
RWD_RESET_REBOOT_COUNTER_11 = "rwd_reset_11"
|
SET_MAX_REBOOT_CNT = ["rbh_max_cnt"]
|
||||||
RWD_SET_MAX_REBOOT_CNT = "rwd_max_cnt"
|
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -125,7 +110,6 @@ class Info:
|
|||||||
OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0"
|
OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0"
|
||||||
OBSW_UPDATE_FROM_SD_1 = "Update OBSW from SD Card 1"
|
OBSW_UPDATE_FROM_SD_1 = "Update OBSW from SD Card 1"
|
||||||
OBSW_UPDATE_FROM_TMP = "Update OBSW from tmp folder"
|
OBSW_UPDATE_FROM_TMP = "Update OBSW from tmp folder"
|
||||||
READ_REBOOT_MECHANISM_INFO = "Read reboot mechansm information"
|
|
||||||
SWITCH_TO_SD_0 = "Switch to SD card 0"
|
SWITCH_TO_SD_0 = "Switch to SD card 0"
|
||||||
SWITCH_TO_SD_1 = "Switch to SD card 1"
|
SWITCH_TO_SD_1 = "Switch to SD card 1"
|
||||||
SWITCH_TO_BOTH_SD_CARDS = "Switch to both SD cards with specified active card"
|
SWITCH_TO_BOTH_SD_CARDS = "Switch to both SD cards with specified active card"
|
||||||
@ -170,9 +154,6 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
|||||||
oce.add(keys=OpCode.XSC_REBOOT_1_0, info="Reboot 1 0")
|
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.XSC_REBOOT_1_1, info="Reboot 1 1")
|
||||||
oce.add(keys=OpCode.SET_PREF_SD, info=Info.SET_PREF_SD)
|
oce.add(keys=OpCode.SET_PREF_SD, info=Info.SET_PREF_SD)
|
||||||
oce.add(
|
|
||||||
keys=OpCode.READ_REBOOT_MECHANISM_INFO, info=Info.READ_REBOOT_MECHANISM_INFO
|
|
||||||
)
|
|
||||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
|
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_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.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
|
||||||
@ -201,25 +182,21 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
|||||||
info="Reset all reboot counters",
|
info="Reset all reboot counters",
|
||||||
)
|
)
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=OpCode.RWD_RESET_REBOOT_COUNTER_00,
|
keys=OpCode.RESET_REBOOT_COUNTER_00,
|
||||||
info="Reset reboot counter 0 0",
|
info="Reset reboot counter 0 0",
|
||||||
)
|
)
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=OpCode.RWD_RESET_REBOOT_COUNTER_01,
|
keys=OpCode.RESET_REBOOT_COUNTER_01,
|
||||||
info="Reset reboot counter 0 1",
|
info="Reset reboot counter 0 1",
|
||||||
)
|
)
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=OpCode.RWD_RESET_REBOOT_COUNTER_10,
|
keys=OpCode.RESET_REBOOT_COUNTER_10,
|
||||||
info="Reset reboot counter 1 0",
|
info="Reset reboot counter 1 0",
|
||||||
)
|
)
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=OpCode.RWD_RESET_REBOOT_COUNTER_11,
|
keys=OpCode.RESET_REBOOT_COUNTER_11,
|
||||||
info="Reset reboot counter 1 1",
|
info="Reset reboot counter 1 1",
|
||||||
)
|
)
|
||||||
oce.add(
|
|
||||||
keys=OpCode.RWD_SET_MAX_REBOOT_CNT,
|
|
||||||
info="Reset max reboot count for reboot watchdog",
|
|
||||||
)
|
|
||||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0)
|
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.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
|
||||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
|
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
|
||||||
@ -317,15 +294,7 @@ def pack_core_commands( # noqa C901
|
|||||||
chip=Chip.CHIP_1,
|
chip=Chip.CHIP_1,
|
||||||
copy=Copy.COPY_1_GOLD,
|
copy=Copy.COPY_1_GOLD,
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.READ_REBOOT_MECHANISM_INFO:
|
elif op_code in OpCode.DISABLE_REBOOT_FILE_HANDLING:
|
||||||
q.add_log_cmd(Info.READ_REBOOT_MECHANISM_INFO)
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_action_cmd(
|
|
||||||
object_id=CORE_CONTROLLER_ID,
|
|
||||||
action_id=ActionId.READ_REBOOT_MECHANISM_INFO,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
elif op_code == OpCode.DISABLE_REBOOT_FILE_HANDLING:
|
|
||||||
q.add_log_cmd("Disabling reboot file handling")
|
q.add_log_cmd("Disabling reboot file handling")
|
||||||
user_data = bytearray([0])
|
user_data = bytearray([0])
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -335,7 +304,7 @@ def pack_core_commands( # noqa C901
|
|||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.ENABLE_REBOOT_FILE_HANDLING:
|
elif op_code in OpCode.ENABLE_REBOOT_FILE_HANDLING:
|
||||||
q.add_log_cmd("Enabling reboot file handling")
|
q.add_log_cmd("Enabling reboot file handling")
|
||||||
user_data = bytearray([1])
|
user_data = bytearray([1])
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -345,7 +314,7 @@ def pack_core_commands( # noqa C901
|
|||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.RESET_ALL_REBOOT_COUNTERS:
|
elif op_code in OpCode.RESET_ALL_REBOOT_COUNTERS:
|
||||||
q.add_log_cmd("Resetting all reboot counters")
|
q.add_log_cmd("Resetting all reboot counters")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
@ -353,25 +322,14 @@ def pack_core_commands( # noqa C901
|
|||||||
action_id=ActionId.RESET_REBOOT_COUNTER,
|
action_id=ActionId.RESET_REBOOT_COUNTER,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_00:
|
elif op_code in OpCode.RESET_REBOOT_COUNTER_00:
|
||||||
reset_specific_boot_counter(q, 0, 0)
|
reset_specific_boot_counter(q, 0, 0)
|
||||||
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_01:
|
elif op_code in OpCode.RESET_REBOOT_COUNTER_01:
|
||||||
reset_specific_boot_counter(q, 0, 1)
|
reset_specific_boot_counter(q, 0, 1)
|
||||||
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_10:
|
elif op_code in OpCode.RESET_REBOOT_COUNTER_10:
|
||||||
reset_specific_boot_counter(q, 1, 0)
|
reset_specific_boot_counter(q, 1, 0)
|
||||||
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_11:
|
elif op_code in OpCode.RESET_REBOOT_COUNTER_11:
|
||||||
reset_specific_boot_counter(q, 1, 1)
|
reset_specific_boot_counter(q, 1, 1)
|
||||||
elif op_code == OpCode.RWD_SET_MAX_REBOOT_CNT:
|
|
||||||
max_count = int(input("Set new maximum reboot threshold [1, 50]: "))
|
|
||||||
if max_count < 1 or max_count > 50:
|
|
||||||
raise ValueError("Invalid value, must be in range 1 to 50")
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_action_cmd(
|
|
||||||
CORE_CONTROLLER_ID,
|
|
||||||
ActionId.SET_MAX_REBOOT_CNT,
|
|
||||||
user_data=bytes([max_count]),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
elif 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_log_cmd(Info.OBSW_UPDATE_FROM_SD_0)
|
||||||
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_SD_0))
|
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_SD_0))
|
||||||
@ -427,17 +385,14 @@ def pack_core_commands( # noqa C901
|
|||||||
domain_id=0,
|
domain_id=0,
|
||||||
unique_id=ParamId.PREF_SD,
|
unique_id=ParamId.PREF_SD,
|
||||||
parameter=pref_sd,
|
parameter=pref_sd,
|
||||||
)
|
).pack()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.CP_HELPER:
|
elif op_code == OpCode.CP_HELPER:
|
||||||
cp_recursive = int(input("Copy recursively (0/1) ?: "))
|
cp_recursive = int(input("Copy recursively (0/1) ?: "))
|
||||||
if cp_recursive not in [0, 1]:
|
if cp_recursive not in [0, 1]:
|
||||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||||
cp_force = int(input("Copy with force option(0/1) ?: "))
|
user_data = bytearray([cp_recursive])
|
||||||
if cp_force not in [0, 1]:
|
|
||||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
|
||||||
user_data = bytearray([cp_recursive, cp_force])
|
|
||||||
user_data.extend(packet_source_dest_path("Copy"))
|
user_data.extend(packet_source_dest_path("Copy"))
|
||||||
q.add_log_cmd(Info.CP_HELPER)
|
q.add_log_cmd(Info.CP_HELPER)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -648,85 +603,43 @@ def handle_core_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
|
|||||||
def handle_core_ctrl_action_replies(
|
def handle_core_ctrl_action_replies(
|
||||||
action_id: int, pw: PrintWrapper, custom_data: bytes
|
action_id: int, pw: PrintWrapper, custom_data: bytes
|
||||||
):
|
):
|
||||||
if action_id == ActionId.READ_REBOOT_MECHANISM_INFO:
|
if action_id == ActionId.LIST_DIR_DUMP_DIRECTLY:
|
||||||
handle_reboot_mechanism_info_reply(pw, custom_data)
|
if len(custom_data) < 4:
|
||||||
elif action_id == ActionId.LIST_DIR_DUMP_DIRECTLY:
|
_LOGGER.warning("Data unexpectedly small")
|
||||||
handle_list_dir_dump_reply(pw, custom_data)
|
return
|
||||||
|
seq_idx = struct.unpack("!I", custom_data[0:4])[0]
|
||||||
|
total_chunks = struct.unpack("!I", custom_data[4:8])[0]
|
||||||
def handle_reboot_mechanism_info_reply(pw: PrintWrapper, custom_data: bytes):
|
compressed = custom_data[8]
|
||||||
pw.dlog("Received reboot mechansm information")
|
ls_cmd = custom_data[9:].split(b"\x00")[0].decode()
|
||||||
fmt_str = "!BIIIIIBBBBBBBB"
|
# Include length of NULL termination
|
||||||
inc_len = struct.calcsize(fmt_str)
|
file_data_offset = 9 + len(ls_cmd) + 1
|
||||||
if len(custom_data) < inc_len:
|
|
||||||
raise ValueError(f"Received custom data shorter than expected {inc_len}")
|
|
||||||
(
|
|
||||||
enabled,
|
|
||||||
max_count,
|
|
||||||
img00_count,
|
|
||||||
img01_count,
|
|
||||||
img10_count,
|
|
||||||
img11_count,
|
|
||||||
img00_lock,
|
|
||||||
img01_lock,
|
|
||||||
img10_lock,
|
|
||||||
img11_lock,
|
|
||||||
last_chip,
|
|
||||||
last_copy,
|
|
||||||
next_chip,
|
|
||||||
next_copy,
|
|
||||||
) = struct.unpack(fmt_str, custom_data[:inc_len])
|
|
||||||
pw.dlog(f"Enabled: {enabled}")
|
|
||||||
pw.dlog(f"Max Count: {max_count}")
|
|
||||||
pw.dlog(f"Count 00: {img00_count}")
|
|
||||||
pw.dlog(f"Count 01: {img01_count}")
|
|
||||||
pw.dlog(f"Count 10: {img10_count}")
|
|
||||||
pw.dlog(f"Count 11: {img11_count}")
|
|
||||||
pw.dlog(f"Lock 00: {img00_lock}")
|
|
||||||
pw.dlog(f"Lock 01: {img01_lock}")
|
|
||||||
pw.dlog(f"Lock 10: {img10_lock}")
|
|
||||||
pw.dlog(f"Lock 11: {img11_lock}")
|
|
||||||
pw.dlog(f"Last Chip: {last_chip}")
|
|
||||||
pw.dlog(f"Last Copy: {last_copy}")
|
|
||||||
pw.dlog(f"Next Chip: {next_chip}")
|
|
||||||
pw.dlog(f"Next Copy: {next_copy}")
|
|
||||||
|
|
||||||
|
|
||||||
def handle_list_dir_dump_reply(pw: PrintWrapper, custom_data: bytes):
|
|
||||||
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(
|
pw.dlog(
|
||||||
f"Compression option: {compressed}. Dumping file into dir_listing.txt.gz"
|
f"Received directory listing dump for ls command {ls_cmd}. "
|
||||||
|
f"Chunk {seq_idx + 1}/{total_chunks}"
|
||||||
)
|
)
|
||||||
with open(path, "ab") as listing_file:
|
|
||||||
listing_file.write(custom_data[file_data_offset:])
|
def remove_if_exists_and_new(seq_idx_: int, path_: Path):
|
||||||
else:
|
if seq_idx_ == 0 and path_.exists():
|
||||||
path = Path("dir_listing.txt")
|
os.remove(path_)
|
||||||
remove_if_exists_and_new(seq_idx, path)
|
|
||||||
pw.dlog(f"Compression option: {compressed}. Dumping file into dir_listing.txt")
|
if compressed:
|
||||||
with open(path, "a") as listing_file:
|
path = Path("dir_listing.txt.gz")
|
||||||
listing_file_str = custom_data[file_data_offset:].decode()
|
remove_if_exists_and_new(seq_idx, path)
|
||||||
listing_file.write(listing_file_str)
|
pw.dlog(
|
||||||
if seq_idx + 1 == total_chunks:
|
f"Compression option: {compressed}. Dumping file into dir_listing.txt.gz"
|
||||||
pw.dlog("Full directory listing: ")
|
)
|
||||||
with open("dir_listing.txt", "r") as listing_file:
|
with open(path, "ab") as listing_file:
|
||||||
print(listing_file.read())
|
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())
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
import enum
|
|
||||||
import struct
|
|
||||||
|
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
|
||||||
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
|
||||||
|
|
||||||
|
|
||||||
class SetId(enum.IntEnum):
|
|
||||||
ERROR_ID = 0
|
|
||||||
|
|
||||||
|
|
||||||
def handle_ier_hk_data(pw: PrintWrapper, hk_data: bytes, set_id: int):
|
|
||||||
pw.dlog(f"Received internal error reporter HK data with set ID {set_id}")
|
|
||||||
if set_id == SetId.ERROR_ID:
|
|
||||||
fmt_str = "!III"
|
|
||||||
inc_len = struct.calcsize(fmt_str)
|
|
||||||
(tm_errors, queue_errors, store_hits) = struct.unpack(
|
|
||||||
fmt_str, hk_data[:inc_len]
|
|
||||||
)
|
|
||||||
pw.dlog(f"TM Errors: {tm_errors}")
|
|
||||||
pw.dlog(f"Queue Errors: {queue_errors}")
|
|
||||||
pw.dlog(f"Store Errors: {store_hits}")
|
|
||||||
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[inc_len:], 3))
|
|
@ -14,13 +14,6 @@ from eive_tmtc.config.object_ids import (
|
|||||||
RW1_ID,
|
RW1_ID,
|
||||||
RW2_ID,
|
RW2_ID,
|
||||||
RTD_0_PLOC_HSPD,
|
RTD_0_PLOC_HSPD,
|
||||||
TMP1075_HANDLER_TCS_BRD_1_ID,
|
|
||||||
TMP1075_HANDLER_TCS_BRD_0_ID,
|
|
||||||
TMP1075_HANDLER_PLPCDU_0_ID,
|
|
||||||
TMP1075_HANDLER_PLPCDU_1_ID,
|
|
||||||
TMP1075_HANDLER_IF_BRD_ID,
|
|
||||||
STR_ASSEMBLY,
|
|
||||||
STAR_TRACKER_ID,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
SUBSYSTEM_DICT = {
|
SUBSYSTEM_DICT = {
|
||||||
@ -34,27 +27,20 @@ ACS_OBJ_DICT = {
|
|||||||
1: ("SUS Assembly", SUS_BOARD_ASS_ID),
|
1: ("SUS Assembly", SUS_BOARD_ASS_ID),
|
||||||
2: ("ACS Board Assembly", ACS_BOARD_ASS_ID),
|
2: ("ACS Board Assembly", ACS_BOARD_ASS_ID),
|
||||||
3: ("RW Assembly", RW_ASSEMBLY),
|
3: ("RW Assembly", RW_ASSEMBLY),
|
||||||
4: ("STR Assembly", STR_ASSEMBLY),
|
4: ("iMTQ MGT", IMTQ_HANDLER_ID),
|
||||||
5: ("iMTQ MGT", IMTQ_HANDLER_ID),
|
5: ("GYR 0 ADIS", GYRO_0_ADIS_HANDLER_ID),
|
||||||
6: ("GYR 0 ADIS", GYRO_0_ADIS_HANDLER_ID),
|
6: ("GYR 1 L3G", GYRO_1_L3G_HANDLER_ID),
|
||||||
7: ("GYR 1 L3G", GYRO_1_L3G_HANDLER_ID),
|
7: ("MGM 0 LIS3", MGM_0_LIS3_HANDLER_ID),
|
||||||
8: ("MGM 0 LIS3", MGM_0_LIS3_HANDLER_ID),
|
8: ("MGM 1 RM3100", MGM_1_RM3100_HANDLER_ID),
|
||||||
9: ("MGM 1 RM3100", MGM_1_RM3100_HANDLER_ID),
|
9: ("GPS 0 Health Device", GPS_0_HEALTH_DEV),
|
||||||
10: ("GPS 0 Health Device", GPS_0_HEALTH_DEV),
|
10: ("SUS 0", SUS_0_N_LOC_XFYFZM_PT_XF),
|
||||||
11: ("SUS 0", SUS_0_N_LOC_XFYFZM_PT_XF),
|
11: ("SUS 6", SUS_6_R_LOC_XFYBZM_PT_XF),
|
||||||
12: ("SUS 6", SUS_6_R_LOC_XFYBZM_PT_XF),
|
12: ("RW 1", RW1_ID),
|
||||||
13: ("RW 1", RW1_ID),
|
13: ("RW 2", RW2_ID),
|
||||||
14: ("RW 2", RW2_ID),
|
|
||||||
15: ("STR", STAR_TRACKER_ID),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TCS_OBJ_DICT = {
|
TCS_OBJ_DICT = {
|
||||||
0: ("RTD 0", RTD_0_PLOC_HSPD),
|
0: ("RTD 0", RTD_0_PLOC_HSPD),
|
||||||
1: ("TMP1075 PL PCDU 0", TMP1075_HANDLER_PLPCDU_0_ID),
|
|
||||||
2: ("TMP1075 PL PCDU 1", TMP1075_HANDLER_PLPCDU_1_ID),
|
|
||||||
3: ("TMP1075 TCS 0", TMP1075_HANDLER_TCS_BRD_0_ID),
|
|
||||||
4: ("TMP1075 TCS 1", TMP1075_HANDLER_TCS_BRD_1_ID),
|
|
||||||
5: ("TMP1075 IF BOARD", TMP1075_HANDLER_IF_BRD_ID),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -570,12 +570,12 @@ def handle_ploc_mpsoc_hk_data(pw: PrintWrapper, hk_data: bytes, set_id: int):
|
|||||||
pw.dlog(f"CAM SoC Temperature: {cam_soc_temp}")
|
pw.dlog(f"CAM SoC Temperature: {cam_soc_temp}")
|
||||||
pw.dlog(f"System Monitor Temperature: {sysmon_temp}")
|
pw.dlog(f"System Monitor Temperature: {sysmon_temp}")
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"SYSMON VCC INT {sysmon_vcc_int:.3f} | SYSMON VCC AUX"
|
f"SYSMON VCC INT {sysmon_vcc_int:.3f} | SYSMON VCC AUX {sysmon_vcc_aux:.3f} | "
|
||||||
f" {sysmon_vcc_aux:.3f} | SYSMON VCC BRAM {sysmon_vcc_bram:.3f}"
|
f"SYSMON VCC BRAM {sysmon_vcc_bram:.3f}"
|
||||||
)
|
)
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"SYSMON VCC PAUX {sysmon_vcc_paux:.3f} | SYSMON VCC PINT"
|
f"SYSMON VCC PAUX {sysmon_vcc_paux:.3f} | SYSMON VCC PINT {sysmon_vcc_pint:.3f} | "
|
||||||
f" {sysmon_vcc_pint:.3f} | SYSMON VCC PDRO {sysmon_vcc_pdro:.3f}"
|
f"SYSMON VCC PDRO {sysmon_vcc_pdro:.3f}"
|
||||||
)
|
)
|
||||||
|
|
||||||
fmt_str = "!fffffffffffff"
|
fmt_str = "!fffffffffffff"
|
||||||
@ -602,9 +602,8 @@ def handle_ploc_mpsoc_hk_data(pw: PrintWrapper, hk_data: bytes, set_id: int):
|
|||||||
f"SYSMON MBA 1V8 {sysmon_mb_1v8:.3f}"
|
f"SYSMON MBA 1V8 {sysmon_mb_1v8:.3f}"
|
||||||
)
|
)
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"SYSMON VCC 12V {sysmon_vcc_12v:.3f} | SYSMON VCC 5V {sysmon_vcc_5v:.3f} |"
|
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"
|
f"SYSMON VCC 3V3 {sysmon_vcc_3v3:.3f} | SYSMON VCC 3V3VA {sysmon_vcc_3v3va}"
|
||||||
f" {sysmon_vcc_3v3va}"
|
|
||||||
)
|
)
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"SYSMON VCC 2V5DDR {sysmon_vcc_2v5ddr:.3f} | "
|
f"SYSMON VCC 2V5DDR {sysmon_vcc_2v5ddr:.3f} | "
|
||||||
|
@ -172,6 +172,7 @@ class Info(str, enum.Enum):
|
|||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_ploc_supv_cmds(defs: TmtcDefinitionWrapper):
|
def add_ploc_supv_cmds(defs: TmtcDefinitionWrapper):
|
||||||
|
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
oce.add(OpCodes.OFF, Info.OFF)
|
oce.add(OpCodes.OFF, Info.OFF)
|
||||||
oce.add(OpCodes.ON, Info.ON)
|
oce.add(OpCodes.ON, Info.ON)
|
||||||
@ -471,8 +472,8 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
|
|||||||
custom_data.extend(struct.pack("!B", memory_id))
|
custom_data.extend(struct.pack("!B", memory_id))
|
||||||
custom_data.extend(struct.pack("!I", start_address))
|
custom_data.extend(struct.pack("!I", start_address))
|
||||||
q.add_log_cmd(
|
q.add_log_cmd(
|
||||||
f"{prefix}: {Info.MEM_CHECK} for file {update_file} at memory ID"
|
f"{prefix}: {Info.MEM_CHECK} for file {update_file} at memory ID {memory_id} at start "
|
||||||
f" {memory_id} at start address {start_address}"
|
f"address {start_address}"
|
||||||
)
|
)
|
||||||
command = create_action_cmd(
|
command = create_action_cmd(
|
||||||
object_id.as_bytes, SupvActionId.MEM_CHECK, custom_data
|
object_id.as_bytes, SupvActionId.MEM_CHECK, custom_data
|
||||||
@ -722,42 +723,10 @@ def get_event_buffer_path() -> str:
|
|||||||
return file
|
return file
|
||||||
|
|
||||||
|
|
||||||
class SocState(enum.IntEnum):
|
|
||||||
OFF = 0
|
|
||||||
BOOTING = 1
|
|
||||||
OPERATIONAL = 2
|
|
||||||
SHUTDOWN = 3
|
|
||||||
|
|
||||||
|
|
||||||
def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
||||||
current_idx = 0
|
current_idx = 0
|
||||||
if set_id == SetIds.HK_REPORT:
|
if set_id == SetIds.HK_REPORT:
|
||||||
fmt_str = "!IIIQIIIIIBBBB"
|
pass
|
||||||
inc_len = struct.calcsize(fmt_str)
|
|
||||||
(
|
|
||||||
temp_ps,
|
|
||||||
temp_pl,
|
|
||||||
temp_sup,
|
|
||||||
uptime,
|
|
||||||
cpu_load,
|
|
||||||
avail_heap,
|
|
||||||
num_tcs,
|
|
||||||
num_tms,
|
|
||||||
soc_state,
|
|
||||||
nvm_0_1_state,
|
|
||||||
nvm_3_state,
|
|
||||||
mission_io_state,
|
|
||||||
fmc_state,
|
|
||||||
) = struct.unpack(fmt_str, hk_data[:inc_len])
|
|
||||||
pw.dlog(f"Temp PS {temp_ps} C | Temp PL {temp_pl} C | Temp SUP {temp_sup} C")
|
|
||||||
pw.dlog(f"Uptime {uptime} | CPU Load {cpu_load} | Avail Heap {avail_heap}")
|
|
||||||
pw.dlog(f"Number TCs {num_tcs} | Number TMs {num_tms}")
|
|
||||||
pw.dlog(f"SOC state {SocState(soc_state)}")
|
|
||||||
pw.dlog(f"NVM 01 State {nvm_0_1_state}")
|
|
||||||
pw.dlog(f"NVM 3 State {nvm_3_state}")
|
|
||||||
pw.dlog(f"Mission IO state {mission_io_state}")
|
|
||||||
pw.dlog(f"FMC state {fmc_state}")
|
|
||||||
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[inc_len:], 13))
|
|
||||||
elif set_id == SetIds.BOOT_STATUS_REPORT:
|
elif set_id == SetIds.BOOT_STATUS_REPORT:
|
||||||
fmt_str = "!BBIIBBBBBB"
|
fmt_str = "!BBIIBBBBBB"
|
||||||
inc_len = struct.calcsize(fmt_str)
|
inc_len = struct.calcsize(fmt_str)
|
||||||
@ -775,8 +744,7 @@ def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
|||||||
) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len])
|
) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len])
|
||||||
current_idx += inc_len
|
current_idx += inc_len
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
"SoC state (0:off, 1:booting, 2:update, 3:operating, 4:shutdown, 5:reset):"
|
f"SoC state (0:off, 1:booting, 2:update, 3:operating, 4:shutdown, 5:reset): {soc_state}"
|
||||||
f" {soc_state}"
|
|
||||||
)
|
)
|
||||||
pw.dlog(f"Power Cycles {power_cycles}")
|
pw.dlog(f"Power Cycles {power_cycles}")
|
||||||
pw.dlog(f"Boot after {boot_after_ms} ms | Boot timeout {boot_timeout_ms} ms")
|
pw.dlog(f"Boot after {boot_after_ms} ms | Boot timeout {boot_timeout_ms} ms")
|
||||||
|
@ -17,17 +17,17 @@ USE_SCEX_CONF_FILE = True
|
|||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
PING = "ping"
|
PING = ["0", "ping"]
|
||||||
ION_CMD = "ion"
|
ION_CMD = ["1", "ion"]
|
||||||
TEMP_CMD = "temp"
|
TEMP_CMD = ["2", "temp"]
|
||||||
EXP_STATUS_CMD = "expstatus"
|
EXP_STATUS_CMD = ["3", "expstatus"]
|
||||||
|
|
||||||
ONE_CELLS_CMD = "onecell"
|
ONE_CELLS_CMD = ["4", "onecell"]
|
||||||
ALL_CELLS_CMD = "allcells"
|
ALL_CELLS_CMD = ["5", "allcells"]
|
||||||
FRAM = "fram"
|
FRAM = ["6", "fram"]
|
||||||
|
|
||||||
SWITCH_ON = "on"
|
SWITCH_ON = ["7", "on"]
|
||||||
SWITCH_OFF = "off"
|
SWITCH_OFF = ["8", "off"]
|
||||||
|
|
||||||
|
|
||||||
class ActionId(enum.IntEnum):
|
class ActionId(enum.IntEnum):
|
||||||
@ -78,7 +78,7 @@ def add_scex_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
||||||
op_code = p.op_code
|
op_code = p.op_code
|
||||||
q = p.queue_helper
|
q = p.queue_helper
|
||||||
if op_code == OpCode.SWITCH_ON:
|
if op_code in OpCode.SWITCH_ON:
|
||||||
q.add_log_cmd(Info.SWITCH_ON)
|
q.add_log_cmd(Info.SWITCH_ON)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -87,7 +87,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.ON, 0),
|
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.ON, 0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.SWITCH_OFF:
|
if op_code in OpCode.SWITCH_OFF:
|
||||||
q.add_log_cmd(Info.SWITCH_OFF)
|
q.add_log_cmd(Info.SWITCH_OFF)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -96,20 +96,20 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.OFF, 0),
|
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.OFF, 0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.PING:
|
if op_code in OpCode.PING:
|
||||||
q.add_log_cmd(Info.PING)
|
q.add_log_cmd(Info.PING)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.PING, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.PING, app_data))
|
||||||
if op_code == OpCode.ION_CMD:
|
if op_code in OpCode.ION_CMD:
|
||||||
q.add_log_cmd(Info.ION_CMD)
|
q.add_log_cmd(Info.ION_CMD)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.ION_CMD, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.ION_CMD, app_data))
|
||||||
if op_code == OpCode.TEMP_CMD:
|
if op_code in OpCode.TEMP_CMD:
|
||||||
q.add_log_cmd(Info.TEMP_CMD)
|
q.add_log_cmd(Info.TEMP_CMD)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.TEMP_CMD, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.TEMP_CMD, app_data))
|
||||||
|
|
||||||
if op_code == OpCode.EXP_STATUS_CMD:
|
if op_code in OpCode.EXP_STATUS_CMD:
|
||||||
q.add_log_cmd(Info.EXP_STATUS_CMD)
|
q.add_log_cmd(Info.EXP_STATUS_CMD)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -117,7 +117,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
)
|
)
|
||||||
|
|
||||||
# one cell
|
# one cell
|
||||||
if op_code == OpCode.ONE_CELLS_CMD:
|
if op_code in OpCode.ONE_CELLS_CMD:
|
||||||
q.add_log_cmd(Info.ONE_CELLS_CMD)
|
q.add_log_cmd(Info.ONE_CELLS_CMD)
|
||||||
app_data = bytearray([0])
|
app_data = bytearray([0])
|
||||||
|
|
||||||
@ -131,7 +131,8 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
cell_select = int(cell_select)
|
cell_select = int(cell_select)
|
||||||
if cell_select < 1 or cell_select > 10:
|
if cell_select < 1 or cell_select > 10:
|
||||||
print(
|
print(
|
||||||
f"Invalid cell number {cell_select}, Please enter a valid number: "
|
f"Invalid cell number {cell_select}, "
|
||||||
|
f"Please enter a valid number: "
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
cn = cell_select - 1
|
cn = cell_select - 1
|
||||||
@ -164,7 +165,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
create_action_cmd(SCEX_HANDLER_ID, ActionId.ONE_CELLS_CMD, app_data)
|
create_action_cmd(SCEX_HANDLER_ID, ActionId.ONE_CELLS_CMD, app_data)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.ALL_CELLS_CMD:
|
if op_code in OpCode.ALL_CELLS_CMD:
|
||||||
q.add_log_cmd(Info.ALL_CELLS_CMD)
|
q.add_log_cmd(Info.ALL_CELLS_CMD)
|
||||||
app_data = bytearray([0])
|
app_data = bytearray([0])
|
||||||
|
|
||||||
@ -196,7 +197,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
create_action_cmd(SCEX_HANDLER_ID, ActionId.ALL_CELLS_CMD, app_data)
|
create_action_cmd(SCEX_HANDLER_ID, ActionId.ALL_CELLS_CMD, app_data)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.FRAM:
|
if op_code in OpCode.FRAM:
|
||||||
q.add_log_cmd(Info.FRAM)
|
q.add_log_cmd(Info.FRAM)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.FRAM, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.FRAM, app_data))
|
||||||
|
@ -12,7 +12,7 @@ from tmtccmd.tc.decorator import ServiceProviderParams
|
|||||||
from tmtccmd.tc.pus_200_fsfw_mode import Subservice as ModeSubservice
|
from tmtccmd.tc.pus_200_fsfw_mode import Subservice as ModeSubservice
|
||||||
|
|
||||||
|
|
||||||
class ModeId(enum.IntEnum):
|
class ModeId:
|
||||||
OFF = 0
|
OFF = 0
|
||||||
SUPV_ONLY = 10
|
SUPV_ONLY = 10
|
||||||
MPSOC_STREAM = 11
|
MPSOC_STREAM = 11
|
||||||
|
@ -41,17 +41,15 @@ class BpxHeaterModeSelect(enum.IntEnum):
|
|||||||
|
|
||||||
|
|
||||||
class BpxOpCode:
|
class BpxOpCode:
|
||||||
HK = "hk"
|
HK = ["0", "hk"]
|
||||||
OFF = "off"
|
OFF = ["off"]
|
||||||
ON = "on"
|
ON = ["on"]
|
||||||
RST_CFG = "reset_cfg"
|
RST_CFG = "reset_cfg"
|
||||||
SET_CFG = "set_cfg"
|
SET_CFG = "set_cfg"
|
||||||
MAN_HEATER_ON = "man_heater_on"
|
RST_BOOT_CNT = ["1", "rst_boot_cnt"]
|
||||||
MAN_HEATER_OFF = "man_heater_off"
|
REQUEST_CFG = ["2", "cfg"]
|
||||||
RST_BOOT_CNT = "rst_boot_cnt"
|
REQUEST_CFG_HK = ["3", "cfg_hk"]
|
||||||
REQUEST_CFG = "cfg"
|
REBOOT = ["4", "reboot"]
|
||||||
REQUEST_CFG_HK = "cfg_hk"
|
|
||||||
REBOOT = "reboot"
|
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
@ -61,10 +59,8 @@ def add_bpx_cmd_definitions(defs: TmtcDefinitionWrapper):
|
|||||||
oce.add(keys=BpxOpCode.OFF, info="Off command")
|
oce.add(keys=BpxOpCode.OFF, info="Off command")
|
||||||
oce.add(keys=BpxOpCode.HK, info="Request BPX HK")
|
oce.add(keys=BpxOpCode.HK, info="Request BPX HK")
|
||||||
oce.add(keys=BpxOpCode.RST_BOOT_CNT, info="Reset Boot Count")
|
oce.add(keys=BpxOpCode.RST_BOOT_CNT, info="Reset Boot Count")
|
||||||
oce.add(keys=BpxOpCode.RST_CFG, info="Reset Config to stored default settings")
|
oce.add(keys=BpxOpCode.RST_CFG, info="Reset Config")
|
||||||
oce.add(keys=BpxOpCode.SET_CFG, info="Set BPX configuration")
|
oce.add(keys=BpxOpCode.SET_CFG, info="Set BPX configuration")
|
||||||
oce.add(keys=BpxOpCode.MAN_HEATER_ON, info="Manual heater on")
|
|
||||||
oce.add(keys=BpxOpCode.MAN_HEATER_OFF, info="Manual heater off")
|
|
||||||
oce.add(keys=BpxOpCode.REQUEST_CFG, info="Request Configuration Struct (Step 1)")
|
oce.add(keys=BpxOpCode.REQUEST_CFG, info="Request Configuration Struct (Step 1)")
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=BpxOpCode.REQUEST_CFG_HK, info="Request Configuration Struct HK (Step 2)"
|
keys=BpxOpCode.REQUEST_CFG_HK, info="Request Configuration Struct HK (Step 2)"
|
||||||
@ -78,14 +74,14 @@ def add_bpx_cmd_definitions(defs: TmtcDefinitionWrapper):
|
|||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.BPX_BATTERY.value)
|
@service_provider(CustomServiceList.BPX_BATTERY.value)
|
||||||
def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is okay here.
|
def pack_bpx_commands(p: ServiceProviderParams):
|
||||||
op_code = p.op_code
|
op_code = p.op_code
|
||||||
q = p.queue_helper
|
q = p.queue_helper
|
||||||
if op_code == BpxOpCode.HK:
|
if op_code in BpxOpCode.HK:
|
||||||
q.add_log_cmd("Requesting BPX battery HK set")
|
q.add_log_cmd("Requesting BPX battery HK set")
|
||||||
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_HK_SET)
|
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_HK_SET)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
||||||
if op_code == BpxOpCode.OFF:
|
if op_code in BpxOpCode.OFF:
|
||||||
q.add_log_cmd("Off mode")
|
q.add_log_cmd("Off mode")
|
||||||
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.OFF, 0)
|
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.OFF, 0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -95,7 +91,7 @@ def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is oka
|
|||||||
app_data=mode_cmd,
|
app_data=mode_cmd,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.ON:
|
if op_code in BpxOpCode.ON:
|
||||||
q.add_log_cmd("On mode")
|
q.add_log_cmd("On mode")
|
||||||
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.ON, 0)
|
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.ON, 0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -105,7 +101,7 @@ def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is oka
|
|||||||
app_data=mode_cmd,
|
app_data=mode_cmd,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.RST_BOOT_CNT:
|
if op_code in BpxOpCode.RST_BOOT_CNT:
|
||||||
q.add_log_cmd("Resetting reboot counters")
|
q.add_log_cmd("Resetting reboot counters")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
@ -137,39 +133,20 @@ def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is oka
|
|||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.REQUEST_CFG:
|
if op_code in BpxOpCode.REQUEST_CFG:
|
||||||
q.add_log_cmd("Requesting configuration struct")
|
q.add_log_cmd("Requesting configuration struct")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.GET_CFG)
|
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.GET_CFG)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.REQUEST_CFG_HK:
|
if op_code in BpxOpCode.REQUEST_CFG_HK:
|
||||||
q.add_log_cmd("Requesting configuration struct HK")
|
q.add_log_cmd("Requesting configuration struct HK")
|
||||||
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_CFG_SET)
|
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_CFG_SET)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
||||||
if op_code == BpxOpCode.REBOOT:
|
if op_code in BpxOpCode.REBOOT:
|
||||||
q.add_log_cmd("Rebooting BPX battery")
|
q.add_log_cmd("Rebooting BPX battery")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.REBOOT)
|
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.REBOOT)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.MAN_HEATER_ON:
|
|
||||||
q.add_log_cmd("BPX manual heater on with seconds burntime")
|
|
||||||
burn_time = int(input("BPX heater burn time in seconds [1-65535]: "))
|
|
||||||
if burn_time < 1 or burn_time > 65535:
|
|
||||||
raise ValueError("Invalid burntime, smaller than 0 or larger than 65535")
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_action_cmd(
|
|
||||||
object_id=BPX_HANDLER_ID,
|
|
||||||
action_id=BpxActionId.MAN_HEATER_ON,
|
|
||||||
user_data=struct.pack("!H", burn_time),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if op_code == BpxOpCode.MAN_HEATER_OFF:
|
|
||||||
q.add_log_cmd("BPX manual heater off")
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_action_cmd(
|
|
||||||
object_id=BPX_HANDLER_ID, action_id=BpxActionId.MAN_HEATER_OFF
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
HEADER_LIST = [
|
HEADER_LIST = [
|
||||||
|
@ -200,8 +200,7 @@ def pack_common_gomspace_cmds( # noqa C901: Complexity is okay here.
|
|||||||
if op_code in GomspaceOpCode.SAVE_TABLE_DEFAULT:
|
if op_code in GomspaceOpCode.SAVE_TABLE_DEFAULT:
|
||||||
source_table = int(
|
source_table = int(
|
||||||
input(
|
input(
|
||||||
"Source table [0: Board Config, 1: Module Config, 2: Calibration"
|
"Source table [0: Board Config, 1: Module Config, 2: Calibration Parameter]: "
|
||||||
" Parameter]: "
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if source_table not in [0, 1, 2]:
|
if source_table not in [0, 1, 2]:
|
||||||
@ -216,8 +215,8 @@ def pack_common_gomspace_cmds( # noqa C901: Complexity is okay here.
|
|||||||
if op_code in GomspaceOpCode.LOAD_TABLE:
|
if op_code in GomspaceOpCode.LOAD_TABLE:
|
||||||
target_table = int(
|
target_table = int(
|
||||||
input(
|
input(
|
||||||
"Target table ID [0: Board Config, 1: Module Config, 2: Calibration"
|
"Target table ID [0: Board Config, 1: Module Config, 2: Calibration Parameter, "
|
||||||
" Parameter, 4: HK TM]: "
|
"4: HK TM]: "
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if target_table not in [0, 1, 2, 4]:
|
if target_table not in [0, 1, 2, 4]:
|
||||||
@ -225,8 +224,8 @@ def pack_common_gomspace_cmds( # noqa C901: Complexity is okay here.
|
|||||||
if target_table != 4:
|
if target_table != 4:
|
||||||
source_table = int(
|
source_table = int(
|
||||||
input(
|
input(
|
||||||
"Source table (file or default) [0: Board Config, 1: Module Config,"
|
"Source table (file or default) [0: Board Config, 1: Module Config, "
|
||||||
" 2: Calibration Parameter, value + 4 for default table]: "
|
"2: Calibration Parameter, value + 4 for default table]: "
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if source_table not in [0, 1, 2, 4, 5, 6]:
|
if source_table not in [0, 1, 2, 4, 5, 6]:
|
||||||
|
@ -85,40 +85,6 @@ class NormalSubmodesMask(enum.IntEnum):
|
|||||||
HPA_ON = 5
|
HPA_ON = 5
|
||||||
|
|
||||||
|
|
||||||
class SubmodeForNormalMode(enum.IntEnum):
|
|
||||||
NONE = 0
|
|
||||||
SSR_ON = 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
|
||||||
DRO_ON = 1 << NormalSubmodesMask.DRO_ON | (
|
|
||||||
1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
|
||||||
)
|
|
||||||
X8_ON = (
|
|
||||||
1 << NormalSubmodesMask.DRO_ON
|
|
||||||
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
|
||||||
| (1 << NormalSubmodesMask.X8_ON)
|
|
||||||
)
|
|
||||||
TX_ON = (
|
|
||||||
1 << NormalSubmodesMask.DRO_ON
|
|
||||||
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
|
||||||
| (1 << NormalSubmodesMask.X8_ON)
|
|
||||||
| (1 << NormalSubmodesMask.TX_ON)
|
|
||||||
)
|
|
||||||
MPA_ON = (
|
|
||||||
1 << NormalSubmodesMask.DRO_ON
|
|
||||||
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
|
||||||
| (1 << NormalSubmodesMask.X8_ON)
|
|
||||||
| (1 << NormalSubmodesMask.TX_ON)
|
|
||||||
| (1 << NormalSubmodesMask.MPA_ON)
|
|
||||||
)
|
|
||||||
HPA_ON = (
|
|
||||||
1 << NormalSubmodesMask.DRO_ON
|
|
||||||
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
|
||||||
| (1 << NormalSubmodesMask.X8_ON)
|
|
||||||
| (1 << NormalSubmodesMask.TX_ON)
|
|
||||||
| (1 << NormalSubmodesMask.MPA_ON)
|
|
||||||
| (1 << NormalSubmodesMask.HPA_ON)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ParamIds(enum.IntEnum):
|
class ParamIds(enum.IntEnum):
|
||||||
NEG_V_LOWER_BOUND = 0
|
NEG_V_LOWER_BOUND = 0
|
||||||
NEG_V_UPPER_BOUND = 1
|
NEG_V_UPPER_BOUND = 1
|
||||||
@ -284,7 +250,7 @@ def hpa_on_procedure(q: DefaultPusQueueHelper):
|
|||||||
if delay_dro_to_x8 is None:
|
if delay_dro_to_x8 is None:
|
||||||
delay_dro_to_x8 = 900
|
delay_dro_to_x8 = 900
|
||||||
q.add_log_cmd(
|
q.add_log_cmd(
|
||||||
"Starting procedure to switch on PL PCDU HPA with DRO to X8 "
|
f"Starting procedure to switch on PL PCDU HPA with DRO to X8 "
|
||||||
f"delay of {delay_dro_to_x8} seconds"
|
f"delay of {delay_dro_to_x8} seconds"
|
||||||
)
|
)
|
||||||
pl_pcdu_on = PusTelecommand(
|
pl_pcdu_on = PusTelecommand(
|
||||||
@ -417,17 +383,41 @@ def request_wait_time() -> Optional[float]:
|
|||||||
|
|
||||||
def submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int:
|
def submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int:
|
||||||
if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON:
|
if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON:
|
||||||
return SubmodeForNormalMode.SSR_ON
|
return 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
||||||
if on_tgt == NormalSubmodesMask.DRO_ON:
|
if on_tgt == NormalSubmodesMask.DRO_ON:
|
||||||
return SubmodeForNormalMode.DRO_ON
|
return 1 << NormalSubmodesMask.DRO_ON | (
|
||||||
|
1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
||||||
|
)
|
||||||
if on_tgt == NormalSubmodesMask.X8_ON:
|
if on_tgt == NormalSubmodesMask.X8_ON:
|
||||||
return SubmodeForNormalMode.X8_ON
|
return (
|
||||||
|
1 << NormalSubmodesMask.DRO_ON
|
||||||
|
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
||||||
|
| (1 << NormalSubmodesMask.X8_ON)
|
||||||
|
)
|
||||||
if on_tgt == NormalSubmodesMask.TX_ON:
|
if on_tgt == NormalSubmodesMask.TX_ON:
|
||||||
return SubmodeForNormalMode.TX_ON
|
return (
|
||||||
|
1 << NormalSubmodesMask.DRO_ON
|
||||||
|
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
||||||
|
| (1 << NormalSubmodesMask.X8_ON)
|
||||||
|
| (1 << NormalSubmodesMask.TX_ON)
|
||||||
|
)
|
||||||
if on_tgt == NormalSubmodesMask.MPA_ON:
|
if on_tgt == NormalSubmodesMask.MPA_ON:
|
||||||
return SubmodeForNormalMode.MPA_ON
|
return (
|
||||||
|
1 << NormalSubmodesMask.DRO_ON
|
||||||
|
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
||||||
|
| (1 << NormalSubmodesMask.X8_ON)
|
||||||
|
| (1 << NormalSubmodesMask.TX_ON)
|
||||||
|
| (1 << NormalSubmodesMask.MPA_ON)
|
||||||
|
)
|
||||||
if on_tgt == NormalSubmodesMask.HPA_ON:
|
if on_tgt == NormalSubmodesMask.HPA_ON:
|
||||||
return SubmodeForNormalMode.HPA_ON
|
return (
|
||||||
|
1 << NormalSubmodesMask.DRO_ON
|
||||||
|
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
||||||
|
| (1 << NormalSubmodesMask.X8_ON)
|
||||||
|
| (1 << NormalSubmodesMask.TX_ON)
|
||||||
|
| (1 << NormalSubmodesMask.MPA_ON)
|
||||||
|
| (1 << NormalSubmodesMask.HPA_ON)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def pack_wait_time_cmd(q: DefaultPusQueueHelper, param_id: int, print_str: str):
|
def pack_wait_time_cmd(q: DefaultPusQueueHelper, param_id: int, print_str: str):
|
||||||
|
@ -75,8 +75,8 @@ class WdtInfo:
|
|||||||
self.pw.dlog(wdt_info)
|
self.pw.dlog(wdt_info)
|
||||||
for idx in range(len(self.wdt_reboots_list)):
|
for idx in range(len(self.wdt_reboots_list)):
|
||||||
self.pw.dlog(
|
self.pw.dlog(
|
||||||
f"{WDT_LIST[idx].ljust(5)} | {self.wdt_reboots_list[idx]:010} |"
|
f"{WDT_LIST[idx].ljust(5)} | "
|
||||||
f" {self.time_pings_left_list[idx]:010}",
|
f"{self.wdt_reboots_list[idx]:010} | {self.time_pings_left_list[idx]:010}",
|
||||||
)
|
)
|
||||||
|
|
||||||
def parse(self, wdt_data: bytes, current_idx: int) -> int:
|
def parse(self, wdt_data: bytes, current_idx: int) -> int:
|
||||||
@ -327,9 +327,8 @@ def handle_p60_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
|
|||||||
)
|
)
|
||||||
pw.dlog(misc_info)
|
pw.dlog(misc_info)
|
||||||
batt_info = (
|
batt_info = (
|
||||||
f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} |"
|
f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | "
|
||||||
f" Charge Current {batt_charge_current} | Discharge Current"
|
f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}"
|
||||||
f" {batt_discharge_current}"
|
|
||||||
)
|
)
|
||||||
pw.dlog(batt_info)
|
pw.dlog(batt_info)
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
@ -420,12 +419,12 @@ def handle_acu_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
|
|||||||
)
|
)
|
||||||
pw.dlog(f"Boot Cause {boot_cause} | Reset Cause {reset_cause}")
|
pw.dlog(f"Boot Cause {boot_cause} | Reset Cause {reset_cause}")
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
f"Ground WDT: Reboot Count {wdt_cnt_gnd} | Time Left"
|
f"Ground WDT: Reboot Count {wdt_cnt_gnd} | Time Left {wdt_gnd_time_left} sec"
|
||||||
f" {wdt_gnd_time_left} sec"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
"ACU Dev Types: 0:FRAM|1:ADC|2:ADC|3:DAC|4:DAC|5:DAC|6:TempSens|7:Reserved"
|
"ACU Dev Types: 0:FRAM|1:ADC|2:ADC|3:DAC|4:DAC|"
|
||||||
|
"5:DAC|6:TempSens|7:Reserved"
|
||||||
)
|
)
|
||||||
dev_parser.print(pw=pw)
|
dev_parser.print(pw=pw)
|
||||||
FsfwTmTcPrinter.get_validity_buffer(
|
FsfwTmTcPrinter.get_validity_buffer(
|
||||||
@ -475,8 +474,7 @@ def pdu_config_table_handler(
|
|||||||
pw.dlog("[tcs, syrlinks, str, mgt, sus-n, scex, ploc, acs-a, unused]")
|
pw.dlog("[tcs, syrlinks, str, mgt, sus-n, scex, ploc, acs-a, unused]")
|
||||||
elif obj_id.as_bytes == PDU_2_HANDLER_ID:
|
elif obj_id.as_bytes == PDU_2_HANDLER_ID:
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
"[obc, pl-pcdu-bat-nom, rw, heaters, sus-r, sa-depl, pl-pcdu-bat-red,"
|
"[obc, pl-pcdu-bat-nom, rw, heaters, sus-r, sa-depl, pl-pcdu-bat-red, acs-b, pl-cam]"
|
||||||
" acs-b, pl-cam]"
|
|
||||||
)
|
)
|
||||||
out_on_cnt = unpack_array_in_data(custom_data, 0x52, 2, 9, "H")
|
out_on_cnt = unpack_array_in_data(custom_data, 0x52, 2, 9, "H")
|
||||||
out_off_cnt = unpack_array_in_data(custom_data, 0x64, 2, 9, "H")
|
out_off_cnt = unpack_array_in_data(custom_data, 0x64, 2, 9, "H")
|
||||||
|
@ -1,2 +1 @@
|
|||||||
from .tm import * # noqa
|
from .tm import * # noqa
|
||||||
from .tmp1075 import add_tmp_sens_cmds
|
|
||||||
|
@ -1,92 +0,0 @@
|
|||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import TCS_CONTROLLER
|
|
||||||
from eive_tmtc.tmtc.tcs import CtrlSetId
|
|
||||||
from eive_tmtc.tmtc.tcs.brd_assy import pack_tcs_ass_cmds
|
|
||||||
from tmtccmd.config.tmtc import (
|
|
||||||
tmtc_definitions_provider,
|
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
|
||||||
from tmtccmd.tc import DefaultPusQueueHelper
|
|
||||||
from tmtccmd.tc.pus_3_fsfw_hk import (
|
|
||||||
make_sid,
|
|
||||||
generate_one_hk_command,
|
|
||||||
create_request_one_diag_command,
|
|
||||||
create_request_one_hk_command,
|
|
||||||
create_enable_periodic_hk_command_with_interval_with_diag,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
|
||||||
REQUEST_PRIMARY_TEMP_SET = "temp"
|
|
||||||
ENABLE_TEMP_SET = "enable_temp_set"
|
|
||||||
REQUEST_DEVICE_TEMP_SET = "temp_devs"
|
|
||||||
REQUEST_DEVICE_SUS_SET = "temp_sus"
|
|
||||||
REQUEST_HEATER_INFO = "heater_info"
|
|
||||||
REQUEST_TCS_CTRL_INFO = "tcs_ctrl_info"
|
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
|
||||||
ENABLE_TEMP_SET = "Enable Primary Temperature Set"
|
|
||||||
REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
|
|
||||||
REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
|
|
||||||
REQUEST_DEVICE_SUS_SET = "Request HK set of the SUS temperatures"
|
|
||||||
REQUEST_HEATER_INFO = "Request heater information"
|
|
||||||
REQUEST_TCS_CTRL_INFO = "Request TCS controller information"
|
|
||||||
|
|
||||||
|
|
||||||
def pack_tcs_ctrl_commands(q: DefaultPusQueueHelper, op_code: str):
|
|
||||||
if op_code == OpCode.REQUEST_PRIMARY_TEMP_SET:
|
|
||||||
sensor_set_sid = make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS)
|
|
||||||
q.add_log_cmd(Info.REQUEST_PRIMARY_TEMP_SET)
|
|
||||||
q.add_pus_tc(generate_one_hk_command(sensor_set_sid))
|
|
||||||
if op_code == OpCode.REQUEST_DEVICE_TEMP_SET:
|
|
||||||
q.add_log_cmd(Info.REQUEST_DEVICE_TEMP_SET)
|
|
||||||
q.add_pus_tc(
|
|
||||||
generate_one_hk_command(make_sid(TCS_CONTROLLER, CtrlSetId.DEVICE_SENSORS))
|
|
||||||
)
|
|
||||||
if op_code == OpCode.REQUEST_DEVICE_SUS_SET:
|
|
||||||
q.add_log_cmd(Info.REQUEST_DEVICE_SUS_SET)
|
|
||||||
q.add_pus_tc(
|
|
||||||
generate_one_hk_command(
|
|
||||||
make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if op_code == OpCode.REQUEST_HEATER_INFO:
|
|
||||||
q.add_log_cmd(Info.REQUEST_HEATER_INFO)
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_request_one_diag_command(
|
|
||||||
make_sid(TCS_CONTROLLER, CtrlSetId.HEATER_INFO)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if op_code == OpCode.REQUEST_TCS_CTRL_INFO:
|
|
||||||
q.add_log_cmd(Info.REQUEST_TCS_CTRL_INFO)
|
|
||||||
q.add_pus_tc(
|
|
||||||
create_request_one_hk_command(
|
|
||||||
make_sid(TCS_CONTROLLER, CtrlSetId.TCS_CTRL_INFO)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if op_code == OpCode.ENABLE_TEMP_SET:
|
|
||||||
interval_seconds = float(input("Please specify interval in seconds: "))
|
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
|
||||||
False, make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS), interval_seconds
|
|
||||||
)
|
|
||||||
for cmd in cmds:
|
|
||||||
q.add_pus_tc(cmd)
|
|
||||||
pack_tcs_ass_cmds(q, op_code)
|
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
|
||||||
def add_tcs_ctrl_cmds(defs: TmtcDefinitionWrapper):
|
|
||||||
oce = OpCodeEntry()
|
|
||||||
oce.add(keys=OpCode.ENABLE_TEMP_SET, info=Info.ENABLE_TEMP_SET)
|
|
||||||
oce.add(keys=OpCode.REQUEST_PRIMARY_TEMP_SET, info=Info.REQUEST_PRIMARY_TEMP_SET)
|
|
||||||
oce.add(keys=OpCode.REQUEST_DEVICE_TEMP_SET, info=Info.REQUEST_DEVICE_TEMP_SET)
|
|
||||||
oce.add(keys=OpCode.REQUEST_DEVICE_SUS_SET, info=Info.REQUEST_DEVICE_SUS_SET)
|
|
||||||
oce.add(keys=OpCode.REQUEST_HEATER_INFO, info=Info.REQUEST_HEATER_INFO)
|
|
||||||
oce.add(keys=OpCode.REQUEST_TCS_CTRL_INFO, info=Info.REQUEST_TCS_CTRL_INFO)
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.TCS_CTRL,
|
|
||||||
info="TCS controller",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
|
@ -6,22 +6,3 @@ class CtrlSetId(enum.IntEnum):
|
|||||||
DEVICE_SENSORS = 1
|
DEVICE_SENSORS = 1
|
||||||
SUS_TEMP_SENSORS = 2
|
SUS_TEMP_SENSORS = 2
|
||||||
HEATER_INFO = 4
|
HEATER_INFO = 4
|
||||||
TCS_CTRL_INFO = 5
|
|
||||||
|
|
||||||
|
|
||||||
class TcsSubmode(enum.IntEnum):
|
|
||||||
DEFAULT = 0
|
|
||||||
NO_HEATER_CTRL = 1
|
|
||||||
|
|
||||||
|
|
||||||
class Heater(enum.IntEnum):
|
|
||||||
HEATER_0_PLOC_PROC_BRD = 0
|
|
||||||
HEATER_1_PCDU_BRD = 1
|
|
||||||
HEATER_2_ACS_BRD = 2
|
|
||||||
HEATER_3_OBC_BRD = 3
|
|
||||||
HEATER_4_CAMERA = 4
|
|
||||||
HEATER_5_STR = 5
|
|
||||||
HEATER_6_DRO = 6
|
|
||||||
HEATER_7_SYRLINKS = 7
|
|
||||||
NUMBER_OF_SWITCHES = 8
|
|
||||||
NONE = 0xFF
|
|
||||||
|
@ -7,7 +7,6 @@ import enum
|
|||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.config.object_ids import get_object_ids
|
from eive_tmtc.config.object_ids import get_object_ids
|
||||||
from eive_tmtc.tmtc.tcs.defs import Heater
|
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||||
from tmtccmd.tc import DefaultPusQueueHelper
|
from tmtccmd.tc import DefaultPusQueueHelper
|
||||||
@ -21,6 +20,18 @@ from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
|
|||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
|
|
||||||
|
|
||||||
|
class Heater(enum.IntEnum):
|
||||||
|
HEATER_0_PLOC_PROC_BRD = 0
|
||||||
|
HEATER_1_PCDU_BRD = 1
|
||||||
|
HEATER_2_ACS_BRD = 2
|
||||||
|
HEATER_3_OBC_BRD = 3
|
||||||
|
HEATER_4_CAMERA = 4
|
||||||
|
HEATER_5_STR = 5
|
||||||
|
HEATER_6_DRO = 6
|
||||||
|
HEATER_7_SYRLINKS = 7
|
||||||
|
NUMBER_OF_SWITCHES = 8
|
||||||
|
|
||||||
|
|
||||||
HEATER_LOCATION = [
|
HEATER_LOCATION = [
|
||||||
"PLOC Processing Board",
|
"PLOC Processing Board",
|
||||||
"PCDU PDU",
|
"PCDU PDU",
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
from .defs import CtrlSetId
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.config.object_ids import TCS_SUBSYSTEM_ID
|
from eive_tmtc.config.object_ids import TCS_CONTROLLER, TCS_SUBSYSTEM_ID
|
||||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||||
from eive_tmtc.tmtc.tcs.brd_assy import pack_tcs_ass_cmds
|
from eive_tmtc.tmtc.tcs.brd_assy import pack_tcs_ass_cmds
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
@ -9,28 +10,64 @@ from tmtccmd.config.tmtc import (
|
|||||||
)
|
)
|
||||||
from tmtccmd.tc import DefaultPusQueueHelper
|
from tmtccmd.tc import DefaultPusQueueHelper
|
||||||
from tmtccmd.tc.pus_200_fsfw_mode import Mode, create_announce_mode_recursive_command
|
from tmtccmd.tc.pus_200_fsfw_mode import Mode, create_announce_mode_recursive_command
|
||||||
|
from tmtccmd.tc.pus_3_fsfw_hk import (
|
||||||
|
make_sid,
|
||||||
|
generate_one_hk_command,
|
||||||
|
create_request_one_diag_command,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCodeSys:
|
||||||
OFF = "off"
|
OFF = ["off"]
|
||||||
NML = "nml"
|
NML = ["nml"]
|
||||||
|
REQUEST_PRIMARY_TEMP_SET = ["temp"]
|
||||||
|
REQUEST_DEVICE_TEMP_SET = ["temp_devs"]
|
||||||
|
REQUEST_DEVICE_SUS_SET = ["temp_sus"]
|
||||||
|
REQUEST_HEATER_INFO = "heater_info"
|
||||||
ANNOUNCE_MODES = "announce_modes"
|
ANNOUNCE_MODES = "announce_modes"
|
||||||
|
|
||||||
|
|
||||||
class InfoSys:
|
class InfoSys:
|
||||||
OFF = "Switch TCS subsystem OFF"
|
OFF = "Switch TCS subsystem OFF"
|
||||||
NML = "Switch TCS subsystem NORMAL (nominal)"
|
NML = "Switch TCS subsystem NORMAL (nominal)"
|
||||||
|
REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
|
||||||
|
REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
|
||||||
|
REQUEST_DEVICE_SUS_SET = "Request HK set of the SUS temperatures"
|
||||||
|
REQUEST_HEATER_INFO = "Request heater information"
|
||||||
ANNOUNCE_MODES = "Announce Modes recursively"
|
ANNOUNCE_MODES = "Announce Modes recursively"
|
||||||
|
|
||||||
|
|
||||||
def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
|
def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||||
if op_code == OpCode.OFF:
|
if op_code in OpCodeSys.REQUEST_PRIMARY_TEMP_SET:
|
||||||
|
sensor_set_sid = make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS)
|
||||||
|
q.add_log_cmd(InfoSys.REQUEST_PRIMARY_TEMP_SET)
|
||||||
|
q.add_pus_tc(generate_one_hk_command(sensor_set_sid))
|
||||||
|
if op_code in OpCodeSys.REQUEST_DEVICE_TEMP_SET:
|
||||||
|
q.add_log_cmd(InfoSys.REQUEST_DEVICE_TEMP_SET)
|
||||||
|
q.add_pus_tc(
|
||||||
|
generate_one_hk_command(make_sid(TCS_CONTROLLER, CtrlSetId.DEVICE_SENSORS))
|
||||||
|
)
|
||||||
|
if op_code in OpCodeSys.REQUEST_DEVICE_SUS_SET:
|
||||||
|
q.add_log_cmd(InfoSys.REQUEST_DEVICE_SUS_SET)
|
||||||
|
q.add_pus_tc(
|
||||||
|
generate_one_hk_command(
|
||||||
|
make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if op_code == OpCodeSys.REQUEST_HEATER_INFO:
|
||||||
|
q.add_log_cmd(InfoSys.REQUEST_HEATER_INFO)
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_request_one_diag_command(
|
||||||
|
make_sid(TCS_CONTROLLER, CtrlSetId.HEATER_INFO)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if op_code in OpCodeSys.OFF:
|
||||||
q.add_log_cmd(InfoSys.OFF)
|
q.add_log_cmd(InfoSys.OFF)
|
||||||
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.OFF, 0, q, InfoSys.OFF)
|
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.OFF, 0, q, InfoSys.OFF)
|
||||||
if op_code == OpCode.NML:
|
if op_code in OpCodeSys.NML:
|
||||||
q.add_log_cmd(InfoSys.NML)
|
q.add_log_cmd(InfoSys.NML)
|
||||||
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.NORMAL, 0, q, InfoSys.OFF)
|
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.NORMAL, 0, q, InfoSys.OFF)
|
||||||
if op_code == OpCode.ANNOUNCE_MODES:
|
if op_code == OpCodeSys.ANNOUNCE_MODES:
|
||||||
q.add_log_cmd(InfoSys.ANNOUNCE_MODES)
|
q.add_log_cmd(InfoSys.ANNOUNCE_MODES)
|
||||||
q.add_pus_tc(create_announce_mode_recursive_command(TCS_SUBSYSTEM_ID))
|
q.add_pus_tc(create_announce_mode_recursive_command(TCS_SUBSYSTEM_ID))
|
||||||
pack_tcs_ass_cmds(q, op_code)
|
pack_tcs_ass_cmds(q, op_code)
|
||||||
@ -39,11 +76,19 @@ def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_tcs_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
def add_tcs_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
oce.add(keys=OpCode.OFF, info=InfoSys.OFF)
|
oce.add(keys=OpCodeSys.OFF, info=InfoSys.OFF)
|
||||||
oce.add(keys=OpCode.NML, info=InfoSys.NML)
|
oce.add(keys=OpCodeSys.NML, info=InfoSys.NML)
|
||||||
oce.add(keys=OpCode.ANNOUNCE_MODES, info=InfoSys.ANNOUNCE_MODES)
|
oce.add(
|
||||||
|
keys=OpCodeSys.REQUEST_PRIMARY_TEMP_SET, info=InfoSys.REQUEST_PRIMARY_TEMP_SET
|
||||||
|
)
|
||||||
|
oce.add(
|
||||||
|
keys=OpCodeSys.REQUEST_DEVICE_TEMP_SET, info=InfoSys.REQUEST_DEVICE_TEMP_SET
|
||||||
|
)
|
||||||
|
oce.add(keys=OpCodeSys.REQUEST_DEVICE_SUS_SET, info=InfoSys.REQUEST_DEVICE_SUS_SET)
|
||||||
|
oce.add(keys=OpCodeSys.REQUEST_HEATER_INFO, info=InfoSys.REQUEST_HEATER_INFO)
|
||||||
|
oce.add(keys=OpCodeSys.ANNOUNCE_MODES, info=InfoSys.ANNOUNCE_MODES)
|
||||||
defs.add_service(
|
defs.add_service(
|
||||||
name=CustomServiceList.TCS_SS,
|
name=CustomServiceList.TCS,
|
||||||
info="TCS subsystem",
|
info="TCS Board",
|
||||||
op_code_entry=oce,
|
op_code_entry=oce,
|
||||||
)
|
)
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
import dataclasses
|
|
||||||
import datetime
|
|
||||||
import enum
|
|
||||||
import logging
|
import logging
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from eive_tmtc.tmtc.tcs.defs import Heater
|
|
||||||
from tmtccmd.fsfw import validity_buffer_list
|
from tmtccmd.fsfw import validity_buffer_list
|
||||||
from tmtccmd.util import ObjectIdU32
|
from tmtccmd.util import ObjectIdU32
|
||||||
from .defs import CtrlSetId
|
from .defs import CtrlSetId
|
||||||
@ -15,46 +11,7 @@ from .heater import HEATER_LOCATION
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ThermalComponent(enum.IntEnum):
|
def handle_thermal_controller_hk_data(
|
||||||
NONE = 0
|
|
||||||
ACS_BOARD = 1
|
|
||||||
MGT = 2
|
|
||||||
RW = 3
|
|
||||||
STR = 4
|
|
||||||
IF_BOARD = 5
|
|
||||||
TCS_BOARD = 6
|
|
||||||
OBC = 7
|
|
||||||
LEGACY_OBCIF_BOARD = 8
|
|
||||||
SBAND_TRANSCEIVER = 9
|
|
||||||
PCDUP60_BOARD = 10
|
|
||||||
PCDUACU = 11
|
|
||||||
PCDUPDU = 12
|
|
||||||
PLPCDU_BOARD = 13
|
|
||||||
PLOCMISSION_BOARD = 14
|
|
||||||
PLOCPROCESSING_BOARD = 15
|
|
||||||
DAC = 16
|
|
||||||
CAMERA = 17
|
|
||||||
DRO = 18
|
|
||||||
X8 = 19
|
|
||||||
HPA = 20
|
|
||||||
TX = 21
|
|
||||||
MPA = 22
|
|
||||||
SCEX_BOARD = 23
|
|
||||||
NUM_ENTRIES = 24
|
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
|
||||||
class TcsCtrlComponentInfo:
|
|
||||||
component: ThermalComponent
|
|
||||||
# Heater on or off?
|
|
||||||
state: bool
|
|
||||||
used_sensor_idx: int
|
|
||||||
used_heater: Heater
|
|
||||||
start_time: datetime.datetime
|
|
||||||
end_time: datetime.datetime
|
|
||||||
|
|
||||||
|
|
||||||
def handle_thermal_controller_hk_data( # noqa C901: complexity is okay.
|
|
||||||
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
|
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
|
||||||
):
|
):
|
||||||
# need a better solutuon for this is this is used again..
|
# need a better solutuon for this is this is used again..
|
||||||
@ -162,50 +119,5 @@ def handle_thermal_controller_hk_data( # noqa C901: complexity is okay.
|
|||||||
)
|
)
|
||||||
current_draw = struct.unpack("!H", hk_data[8:10])[0]
|
current_draw = struct.unpack("!H", hk_data[8:10])[0]
|
||||||
print(f"Heater Power Channel Current Draw: {current_draw} mA")
|
print(f"Heater Power Channel Current Draw: {current_draw} mA")
|
||||||
elif set_id == CtrlSetId.TCS_CTRL_INFO:
|
|
||||||
pw.dlog("Received TCS CTRL information set")
|
|
||||||
current_idx = 0
|
|
||||||
heater_states = hk_data[0 : ThermalComponent.NUM_ENTRIES]
|
|
||||||
current_idx += ThermalComponent.NUM_ENTRIES
|
|
||||||
used_sensor_idx = hk_data[
|
|
||||||
current_idx : current_idx + ThermalComponent.NUM_ENTRIES
|
|
||||||
]
|
|
||||||
current_idx += ThermalComponent.NUM_ENTRIES
|
|
||||||
used_heater_idx = hk_data[
|
|
||||||
current_idx : current_idx + ThermalComponent.NUM_ENTRIES
|
|
||||||
]
|
|
||||||
current_idx += ThermalComponent.NUM_ENTRIES
|
|
||||||
start_and_end_time_fmt_str = "!IIIIIIIIIIIIIIIIIIIIIIII"
|
|
||||||
data_len = struct.calcsize(start_and_end_time_fmt_str)
|
|
||||||
start_times = struct.unpack(
|
|
||||||
start_and_end_time_fmt_str, hk_data[current_idx : current_idx + data_len]
|
|
||||||
)
|
|
||||||
current_idx += data_len
|
|
||||||
end_times = struct.unpack(
|
|
||||||
start_and_end_time_fmt_str, hk_data[current_idx : current_idx + data_len]
|
|
||||||
)
|
|
||||||
current_idx += data_len
|
|
||||||
component_list = []
|
|
||||||
for i in range(ThermalComponent.NUM_ENTRIES):
|
|
||||||
info = TcsCtrlComponentInfo(
|
|
||||||
component=ThermalComponent(i),
|
|
||||||
state=bool(heater_states[i]),
|
|
||||||
used_sensor_idx=used_sensor_idx[i],
|
|
||||||
used_heater=Heater(used_heater_idx[i]),
|
|
||||||
start_time=datetime.datetime.fromtimestamp(
|
|
||||||
start_times[i], datetime.timezone.utc
|
|
||||||
),
|
|
||||||
end_time=datetime.datetime.fromtimestamp(
|
|
||||||
end_times[i], datetime.timezone.utc
|
|
||||||
),
|
|
||||||
)
|
|
||||||
component_str = f"{info.component!r}".ljust(46)
|
|
||||||
state_str = "ON" if info.state else "OFF"
|
|
||||||
pw.dlog(
|
|
||||||
f"{component_str}: {state_str.ljust(4)} | Sensor Index "
|
|
||||||
f"{info.used_sensor_idx} | {info.used_heater!r} | Start "
|
|
||||||
f"{info.start_time} | End {info.end_time}"
|
|
||||||
)
|
|
||||||
component_list.append(info)
|
|
||||||
else:
|
else:
|
||||||
_LOGGER.warning(f"Unimplemented set ID {set_id}")
|
_LOGGER.warning(f"Unimplemented set ID {set_id}")
|
||||||
|
@ -6,17 +6,14 @@
|
|||||||
@date 06.01.2021
|
@date 06.01.2021
|
||||||
"""
|
"""
|
||||||
import enum
|
import enum
|
||||||
import struct
|
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
tmtc_definitions_provider,
|
||||||
TmtcDefinitionWrapper,
|
TmtcDefinitionWrapper,
|
||||||
OpCodeEntry,
|
OpCodeEntry,
|
||||||
)
|
)
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
|
||||||
from tmtccmd.tc import DefaultPusQueueHelper
|
from tmtccmd.tc import DefaultPusQueueHelper
|
||||||
from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_data
|
from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_data
|
||||||
from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_hk_command, make_sid
|
from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_hk_command, make_sid
|
||||||
@ -79,10 +76,3 @@ def add_tmp_sens_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
oce.add(OpCode.NML, Info.NML)
|
oce.add(OpCode.NML, Info.NML)
|
||||||
oce.add(OpCode.HK, Info.HK)
|
oce.add(OpCode.HK, Info.HK)
|
||||||
defs.add_service(CustomServiceList.TMP1075.value, "TMP1075 Temperature Sensor", oce)
|
defs.add_service(CustomServiceList.TMP1075.value, "TMP1075 Temperature Sensor", oce)
|
||||||
|
|
||||||
|
|
||||||
def handle_tmp_1075_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
|
||||||
if set_id == SetId.TEMPERATURE:
|
|
||||||
temp = struct.unpack("!f", hk_data[0:4])[0]
|
|
||||||
pw.dlog(f"TMP1075 Temperature: {temp}")
|
|
||||||
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[4:], 1))
|
|
||||||
|
@ -148,8 +148,8 @@ def time_prompt_offset_from_now() -> datetime.datetime:
|
|||||||
seconds_offset = math.floor(
|
seconds_offset = math.floor(
|
||||||
float(
|
float(
|
||||||
input(
|
input(
|
||||||
"Please enter the time as a offset from now in seconds. Negative offset"
|
"Please enter the time as a offset from now in seconds. Negative offset is "
|
||||||
" is allowed: "
|
"allowed: "
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
BIN
filetest/eive-sw-update.tar.xz
Normal file
BIN
filetest/eive-sw-update.tar.xz
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
4
lint.py
4
lint.py
@ -32,8 +32,8 @@ def main():
|
|||||||
if not os.path.exists("setup.cfg"):
|
if not os.path.exists("setup.cfg"):
|
||||||
additional_flags_second_step += " --max-line-length=100"
|
additional_flags_second_step += " --max-line-length=100"
|
||||||
flake8_second_step_cmd = (
|
flake8_second_step_cmd = (
|
||||||
f"{python_exe} flake8 . {additional_flags_both_steps} "
|
f"{python_exe} flake8 . {additional_flags_both_steps} {additional_flags_second_step}"
|
||||||
f" {additional_flags_second_step} {exclude_dirs_flag}"
|
f" {exclude_dirs_flag}"
|
||||||
)
|
)
|
||||||
os.system(flake8_second_step_cmd)
|
os.system(flake8_second_step_cmd)
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
name = "eive-tmtc"
|
name = "eive-tmtc"
|
||||||
description = "TMTC Commander EIVE"
|
description = "TMTC Commander EIVE"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
version = "5.5.1"
|
dynamic = ["version"]
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
license = {text = "Apache-2.0"}
|
license = {text = "Apache-2.0"}
|
||||||
authors = [
|
authors = [
|
||||||
@ -29,8 +29,9 @@ classifiers = [
|
|||||||
"Topic :: Scientific/Engineering"
|
"Topic :: Scientific/Engineering"
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tmtccmd == 6.0.0rc0",
|
"tmtccmd ~= 5.0.0rc0",
|
||||||
"python-dateutil ~= 2.8",
|
"python-dateutil ~= 2.8",
|
||||||
|
# tmtccmd @ git+https://github.com/robamu-org/tmtccmd@<gitRev>#egg=tmtccmd
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
@ -39,6 +40,9 @@ dependencies = [
|
|||||||
[tool.setuptools]
|
[tool.setuptools]
|
||||||
include-package-data = true
|
include-package-data = true
|
||||||
|
|
||||||
|
[tool.setuptools.dynamic]
|
||||||
|
version = {attr = "eive_tmtc.__version__"}
|
||||||
|
|
||||||
# Auto-Discovery is problematic for some reason, so use custom-discovery
|
# Auto-Discovery is problematic for some reason, so use custom-discovery
|
||||||
[tool.setuptools.packages]
|
[tool.setuptools.packages]
|
||||||
find = {}
|
find = {}
|
||||||
|
@ -3,7 +3,7 @@ Checklist for new releases
|
|||||||
|
|
||||||
# Pre-Release
|
# Pre-Release
|
||||||
|
|
||||||
1. Bump version inside the `pyproject.toml` file.
|
1. Bump version inside the `eive_tmtc/__init__.py` file.
|
||||||
2. Update `CHANGELOG.md`: Convert `unreleased` section into version section
|
2. Update `CHANGELOG.md`: Convert `unreleased` section into version section
|
||||||
with date and new `unreleased`section.
|
with date and new `unreleased`section.
|
||||||
3. Run auto-formatter with `black .`
|
3. Run auto-formatter with `black .`
|
||||||
|
70
tmtcc.py
70
tmtcc.py
@ -2,11 +2,10 @@
|
|||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
import traceback
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import cast
|
from typing import cast
|
||||||
|
|
||||||
from spacepackets.ecss import PusVerificator
|
|
||||||
from spacepackets.version import get_version as get_sp_version
|
|
||||||
from spacepackets.ccsds import SPACE_PACKET_HEADER_SIZE
|
from spacepackets.ccsds import SPACE_PACKET_HEADER_SIZE
|
||||||
from spacepackets.cfdp import (
|
from spacepackets.cfdp import (
|
||||||
ConditionCode,
|
ConditionCode,
|
||||||
@ -17,8 +16,6 @@ from spacepackets.cfdp import (
|
|||||||
PduFactory,
|
PduFactory,
|
||||||
PduType,
|
PduType,
|
||||||
)
|
)
|
||||||
|
|
||||||
import tmtccmd
|
|
||||||
from tmtccmd.logging import add_colorlog_console_logger
|
from tmtccmd.logging import add_colorlog_console_logger
|
||||||
from tmtccmd.cfdp import CfdpUserBase, TransactionId
|
from tmtccmd.cfdp import CfdpUserBase, TransactionId
|
||||||
from tmtccmd.cfdp.defs import CfdpRequestType
|
from tmtccmd.cfdp.defs import CfdpRequestType
|
||||||
@ -35,6 +32,28 @@ from tmtccmd.cfdp.user import (
|
|||||||
FileSegmentRecvdParams,
|
FileSegmentRecvdParams,
|
||||||
)
|
)
|
||||||
from tmtccmd.tc.handler import SendCbParams
|
from tmtccmd.tc.handler import SendCbParams
|
||||||
|
|
||||||
|
try:
|
||||||
|
import spacepackets
|
||||||
|
except ImportError as error:
|
||||||
|
print(error)
|
||||||
|
print("Python spacepackets module could not be imported")
|
||||||
|
print(
|
||||||
|
'Install with "cd spacepackets && python3 -m pip intall -e ." for interative installation'
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import tmtccmd
|
||||||
|
except ImportError:
|
||||||
|
run_tmtc_commander = None
|
||||||
|
initialize_tmtc_commander = None
|
||||||
|
tb = traceback.format_exc()
|
||||||
|
print(tb)
|
||||||
|
print("Python tmtccmd submodule could not be imported")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
from spacepackets.ecss import PusVerificator
|
||||||
from tmtccmd import TcHandlerBase, BackendBase
|
from tmtccmd import TcHandlerBase, BackendBase
|
||||||
from tmtccmd.util import FileSeqCountProvider, PusFileSeqCountProvider
|
from tmtccmd.util import FileSeqCountProvider, PusFileSeqCountProvider
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
@ -67,7 +86,7 @@ from tmtccmd.config.args import (
|
|||||||
ProcedureParamsWrapper,
|
ProcedureParamsWrapper,
|
||||||
)
|
)
|
||||||
from eive_tmtc import APP_LOGGER
|
from eive_tmtc import APP_LOGGER
|
||||||
from importlib.metadata import version
|
from eive_tmtc import __version__
|
||||||
from eive_tmtc.config.definitions import (
|
from eive_tmtc.config.definitions import (
|
||||||
PUS_APID,
|
PUS_APID,
|
||||||
CFDP_APID,
|
CFDP_APID,
|
||||||
@ -75,7 +94,7 @@ from eive_tmtc.config.definitions import (
|
|||||||
CFDP_REMOTE_ENTITY_ID,
|
CFDP_REMOTE_ENTITY_ID,
|
||||||
)
|
)
|
||||||
from eive_tmtc.config.hook import EiveHookObject
|
from eive_tmtc.config.hook import EiveHookObject
|
||||||
from eive_tmtc.pus_tm.pus_demux import pus_factory_hook
|
from eive_tmtc.pus_tm.factory_hook import pus_factory_hook
|
||||||
from eive_tmtc.pus_tc.procedure_packer import handle_default_procedure
|
from eive_tmtc.pus_tc.procedure_packer import handle_default_procedure
|
||||||
|
|
||||||
_LOGGER = APP_LOGGER
|
_LOGGER = APP_LOGGER
|
||||||
@ -147,20 +166,16 @@ class PusHandler(SpecificApidHandlerBase):
|
|||||||
wrapper: VerificationWrapper,
|
wrapper: VerificationWrapper,
|
||||||
printer: FsfwTmTcPrinter,
|
printer: FsfwTmTcPrinter,
|
||||||
raw_logger: RawTmtcTimedLogWrapper,
|
raw_logger: RawTmtcTimedLogWrapper,
|
||||||
hk_level: int,
|
|
||||||
):
|
):
|
||||||
super().__init__(PUS_APID, None)
|
super().__init__(PUS_APID, None)
|
||||||
self.printer = printer
|
self.printer = printer
|
||||||
self.verif_wrapper = wrapper
|
self.verif_wrapper = wrapper
|
||||||
self.raw_logger = raw_logger
|
self.raw_logger = raw_logger
|
||||||
self.hk_level = hk_level
|
|
||||||
|
|
||||||
def handle_tm(self, packet: bytes, _user_args: any):
|
def handle_tm(self, packet: bytes, _user_args: any):
|
||||||
# with open("tc.bin", "wb") as of:
|
# with open("tc.bin", "wb") as of:
|
||||||
# of.write(packet)
|
# of.write(packet)
|
||||||
pus_factory_hook(
|
pus_factory_hook(packet, self.verif_wrapper, self.printer, self.raw_logger)
|
||||||
packet, self.verif_wrapper, self.printer, self.raw_logger, self.hk_level
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class UnknownApidHandler(GenericApidHandlerBase):
|
class UnknownApidHandler(GenericApidHandlerBase):
|
||||||
@ -192,8 +207,7 @@ class CfdpInCcsdsWrapper(SpecificApidHandlerBase):
|
|||||||
_LOGGER.info("Received Finished PDU TM")
|
_LOGGER.info("Received Finished PDU TM")
|
||||||
else:
|
else:
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"Received File Directive PDU with type"
|
f"Received File Directive PDU with type {pdu_base.directive_type!r} TM"
|
||||||
f" {pdu_base.directive_type!r} TM"
|
|
||||||
)
|
)
|
||||||
self.handler.pass_pdu_packet(pdu_base)
|
self.handler.pass_pdu_packet(pdu_base)
|
||||||
|
|
||||||
@ -293,7 +307,7 @@ class TcHandler(TcHandlerBase):
|
|||||||
if pdu.pdu_directive_type == DirectiveType.METADATA_PDU:
|
if pdu.pdu_directive_type == DirectiveType.METADATA_PDU:
|
||||||
metadata = pdu.to_metadata_pdu()
|
metadata = pdu.to_metadata_pdu()
|
||||||
self.queue_helper.add_log_cmd(
|
self.queue_helper.add_log_cmd(
|
||||||
"CFDP Source: Sending Metadata PDU for file with size "
|
f"CFDP Source: Sending Metadata PDU for file with size "
|
||||||
f"{metadata.file_size}"
|
f"{metadata.file_size}"
|
||||||
)
|
)
|
||||||
elif pdu.pdu_directive_type == DirectiveType.EOF_PDU:
|
elif pdu.pdu_directive_type == DirectiveType.EOF_PDU:
|
||||||
@ -303,7 +317,7 @@ class TcHandler(TcHandlerBase):
|
|||||||
else:
|
else:
|
||||||
fd_pdu = pdu.to_file_data_pdu()
|
fd_pdu = pdu.to_file_data_pdu()
|
||||||
self.queue_helper.add_log_cmd(
|
self.queue_helper.add_log_cmd(
|
||||||
"CFDP Source: Sending File Data PDU for segment at offset "
|
f"CFDP Source: Sending File Data PDU for segment at offset "
|
||||||
f"{fd_pdu.offset} with length {len(fd_pdu.file_data)}"
|
f"{fd_pdu.offset} with length {len(fd_pdu.file_data)}"
|
||||||
)
|
)
|
||||||
self.queue_helper.add_ccsds_tc(sp)
|
self.queue_helper.add_ccsds_tc(sp)
|
||||||
@ -315,25 +329,19 @@ class TcHandler(TcHandlerBase):
|
|||||||
if info.proc_type == TcQueueEntryType.PUS_TC:
|
if info.proc_type == TcQueueEntryType.PUS_TC:
|
||||||
def_proc = info.to_def_procedure()
|
def_proc = info.to_def_procedure()
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
f"Finished queue for service {def_proc.service} and op code"
|
f"Finished queue for service {def_proc.service} and op code {def_proc.op_code}"
|
||||||
f" {def_proc.op_code}"
|
|
||||||
)
|
)
|
||||||
elif info.proc_type == TcProcedureType.CFDP:
|
elif info.proc_type == TcProcedureType.CFDP:
|
||||||
_LOGGER.info("Finished CFDP queue")
|
_LOGGER.info("Finished CFDP queue")
|
||||||
|
|
||||||
|
|
||||||
def setup_params() -> (SetupWrapper, int):
|
def setup_params() -> SetupWrapper:
|
||||||
hook_obj = EiveHookObject(default_json_path())
|
hook_obj = EiveHookObject(default_json_path())
|
||||||
params = SetupParams()
|
params = SetupParams()
|
||||||
parser_wrapper = PreArgsParsingWrapper()
|
parser_wrapper = PreArgsParsingWrapper()
|
||||||
parser_wrapper.create_default_parent_parser()
|
parser_wrapper.create_default_parent_parser()
|
||||||
parser_wrapper.create_default_parser()
|
parser_wrapper.create_default_parser()
|
||||||
tmtc_parser, cfdp_parser = parser_wrapper.add_def_proc_and_cfdp_as_subparsers()
|
parser_wrapper.add_def_proc_and_cfdp_as_subparsers()
|
||||||
tmtc_parser.add_argument(
|
|
||||||
"--hk",
|
|
||||||
help="HK output level",
|
|
||||||
default=2,
|
|
||||||
)
|
|
||||||
post_arg_parsing_wrapper = parser_wrapper.parse(
|
post_arg_parsing_wrapper = parser_wrapper.parse(
|
||||||
setup_params=params, hook_obj=hook_obj
|
setup_params=params, hook_obj=hook_obj
|
||||||
)
|
)
|
||||||
@ -344,14 +352,13 @@ def setup_params() -> (SetupWrapper, int):
|
|||||||
post_arg_parsing_wrapper.set_params_with_prompts(proc_param_wrapper)
|
post_arg_parsing_wrapper.set_params_with_prompts(proc_param_wrapper)
|
||||||
else:
|
else:
|
||||||
post_arg_parsing_wrapper.set_params_without_prompts(proc_param_wrapper)
|
post_arg_parsing_wrapper.set_params_without_prompts(proc_param_wrapper)
|
||||||
hk_level = int(post_arg_parsing_wrapper.args_raw.hk)
|
|
||||||
params.apid = PUS_APID
|
params.apid = PUS_APID
|
||||||
if params.com_if is None:
|
if params.com_if is None:
|
||||||
raise ValueError("could not determine a COM interface.")
|
raise ValueError("could not determine a COM interface.")
|
||||||
setup_wrapper = SetupWrapper(
|
setup_wrapper = SetupWrapper(
|
||||||
hook_obj=hook_obj, setup_params=params, proc_param_wrapper=proc_param_wrapper
|
hook_obj=hook_obj, setup_params=params, proc_param_wrapper=proc_param_wrapper
|
||||||
)
|
)
|
||||||
return setup_wrapper, hk_level
|
return setup_wrapper
|
||||||
|
|
||||||
|
|
||||||
def setup_cfdp_handler() -> CfdpInCcsdsWrapper:
|
def setup_cfdp_handler() -> CfdpInCcsdsWrapper:
|
||||||
@ -393,13 +400,12 @@ def setup_tmtc_handlers(
|
|||||||
printer: FsfwTmTcPrinter,
|
printer: FsfwTmTcPrinter,
|
||||||
raw_logger: RawTmtcTimedLogWrapper,
|
raw_logger: RawTmtcTimedLogWrapper,
|
||||||
gui: bool,
|
gui: bool,
|
||||||
hk_level: int,
|
|
||||||
) -> (CcsdsTmHandler, TcHandler):
|
) -> (CcsdsTmHandler, TcHandler):
|
||||||
cfdp_in_ccsds_wrapper = setup_cfdp_handler()
|
cfdp_in_ccsds_wrapper = setup_cfdp_handler()
|
||||||
verification_wrapper = VerificationWrapper(
|
verification_wrapper = VerificationWrapper(
|
||||||
verificator, _LOGGER, printer.file_logger
|
verificator, _LOGGER, printer.file_logger
|
||||||
)
|
)
|
||||||
pus_handler = PusHandler(verification_wrapper, printer, raw_logger, hk_level)
|
pus_handler = PusHandler(verification_wrapper, printer, raw_logger)
|
||||||
ccsds_handler = CustomCcsdsTmHandler(generic_handler=UnknownApidHandler(None))
|
ccsds_handler = CustomCcsdsTmHandler(generic_handler=UnknownApidHandler(None))
|
||||||
ccsds_handler.add_apid_handler(pus_handler)
|
ccsds_handler.add_apid_handler(pus_handler)
|
||||||
ccsds_handler.add_apid_handler(cfdp_in_ccsds_wrapper)
|
ccsds_handler.add_apid_handler(cfdp_in_ccsds_wrapper)
|
||||||
@ -432,13 +438,13 @@ def setup_backend(
|
|||||||
|
|
||||||
|
|
||||||
def main(): # noqa C901: Complexity okay here.
|
def main(): # noqa C901: Complexity okay here.
|
||||||
print(f"-- eive tmtc v{version('eive-tmtc')} --")
|
print(f"-- eive tmtc v{__version__} --")
|
||||||
print(f"-- spacepackets v{get_sp_version()} --")
|
print(f"-- spacepackets v{spacepackets.__version__} --")
|
||||||
add_colorlog_console_logger(_LOGGER)
|
add_colorlog_console_logger(_LOGGER)
|
||||||
# TODO: -V CLI argument to enable this?
|
# TODO: -V CLI argument to enable this?
|
||||||
_LOGGER.setLevel(_LOG_LEVEL)
|
_LOGGER.setLevel(_LOG_LEVEL)
|
||||||
try:
|
try:
|
||||||
setup_wrapper, hk_level = setup_params()
|
setup_wrapper = setup_params()
|
||||||
except KeyboardInterrupt as e:
|
except KeyboardInterrupt as e:
|
||||||
_LOGGER.info(f"{e}. Exiting")
|
_LOGGER.info(f"{e}. Exiting")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
@ -451,7 +457,7 @@ def main(): # noqa C901: Complexity okay here.
|
|||||||
)
|
)
|
||||||
pus_verificator = PusVerificator()
|
pus_verificator = PusVerificator()
|
||||||
ccsds_handler, tc_handler = setup_tmtc_handlers(
|
ccsds_handler, tc_handler = setup_tmtc_handlers(
|
||||||
pus_verificator, printer, raw_logger, setup_wrapper.params.use_gui, hk_level
|
pus_verificator, printer, raw_logger, setup_wrapper.params.use_gui
|
||||||
)
|
)
|
||||||
|
|
||||||
tmtccmd.setup(setup_wrapper)
|
tmtccmd.setup(setup_wrapper)
|
||||||
|
Reference in New Issue
Block a user