Compare commits
94 Commits
Author | SHA1 | Date | |
---|---|---|---|
b50c75c13c | |||
36799ef51d
|
|||
772ef5b323
|
|||
2f8bed4581
|
|||
72def77d40
|
|||
bc1a1774a6 | |||
4b08f5dd5b
|
|||
b0562ea9c7
|
|||
f76cd94535
|
|||
8a1e5b7b99
|
|||
0e208629b0
|
|||
403657110b
|
|||
23f21b40eb | |||
a6b3ccb4cc
|
|||
d7b494a950
|
|||
73bc043538
|
|||
02e7e809de
|
|||
d6f6aff139 | |||
d39a49bd4c | |||
f42318bc57 | |||
fd3a799019 | |||
1664e6adb5 | |||
8042f3607d
|
|||
59278447fd | |||
b58977fd65 | |||
beae6b3f05 | |||
12c60ac310 | |||
1acbb8bb43 | |||
051e9e6ffb | |||
6d88746ec3 | |||
5571a6852e | |||
1ddb93410e | |||
b0b186ac1f | |||
f95331742b | |||
c91ad9e08b | |||
fcabaa5b09 | |||
bf9ab7edf7 | |||
4b054b7628 | |||
9001a28545
|
|||
6b2fbc6917 | |||
ab770a0057 | |||
0cbf28f25c
|
|||
cbcc06ede7 | |||
a55aa4a667
|
|||
d2324dace9
|
|||
1e4e524f95
|
|||
39d6ec73c2 | |||
74cfa2949a
|
|||
ffdb4451f6
|
|||
15716c988b | |||
f5ec50b674 | |||
02b70ee203 | |||
95b6954175 | |||
a82cbff5a8
|
|||
87b766dfb8
|
|||
09b7a01ff6 | |||
fd6b76bfdd
|
|||
40c086086b
|
|||
83e8fe0587 | |||
6cffae4397
|
|||
d73ef3a314
|
|||
0b8bd61e80 | |||
380a02ee94
|
|||
c6e2e2de49 | |||
6479aeda63 | |||
26cf112121 | |||
62bd535622
|
|||
eea7683581 | |||
df6aa80169
|
|||
2fd1a46e66
|
|||
2153aa2842
|
|||
1f2f2aac13
|
|||
9be81f1725 | |||
601adfc9c2 | |||
ac84ac2c3e | |||
7ed18bd570 | |||
e27ad147d4
|
|||
ba47757b50
|
|||
7e9c626ec8
|
|||
8d6dd97d85
|
|||
2fae5613ce
|
|||
fdb14cbdc5
|
|||
0cef3fa924
|
|||
37a35c4446
|
|||
15d25b4c5b
|
|||
069f84d220 | |||
627a16d51a | |||
fcfae1f67f | |||
01ebd356ba | |||
5785bbd0cc
|
|||
d3e6101447
|
|||
6d5bde40db
|
|||
c48f04eed5
|
|||
deb0275bb5
|
54
CHANGELOG.md
54
CHANGELOG.md
@ -10,6 +10,60 @@ list yields a list of all related PRs for each release.
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
# [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
|
# [v5.1.0] 2023-06-28
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
__version__ = "5.1.0"
|
__version__ = "5.4.3"
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
SW_NAME = "eive-tmtc"
|
SW_NAME = "eive-tmtc"
|
||||||
VERSION_MAJOR = 5
|
VERSION_MAJOR = 5
|
||||||
VERSION_MINOR = 1
|
VERSION_MINOR = 4
|
||||||
VERSION_REVISION = 0
|
VERSION_REVISION = 3
|
||||||
|
|
||||||
EIVE_TMTC_ROOT = Path(__file__).parent
|
EIVE_TMTC_ROOT = Path(__file__).parent
|
||||||
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
|
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
|
||||||
|
@ -65,7 +65,8 @@ 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 = "tcs"
|
TCS_SS = "tcs_subsystem"
|
||||||
|
TCS_CTRL = "tcs_ctrl"
|
||||||
TCS_ASS = "tcs_ass"
|
TCS_ASS = "tcs_ass"
|
||||||
TIME = "time"
|
TIME = "time"
|
||||||
PROCEDURE = "proc"
|
PROCEDURE = "proc"
|
||||||
|
@ -94,6 +94,7 @@ 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
|
||||||
@ -133,6 +134,7 @@ 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
|
||||||
@ -160,6 +162,7 @@ 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
|
||||||
@ -254,6 +257,7 @@ 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
|
||||||
@ -272,6 +276,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
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
|
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
|
||||||
@ -280,6 +285,9 @@ 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
|
||||||
|
|
@ -6,6 +6,7 @@ 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
|
||||||
@ -99,8 +100,10 @@ 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.value:
|
if service == CustomServiceList.TCS_SS.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),
|
||||||
|
@ -765,7 +765,6 @@ 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,6 +7,7 @@ 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
|
||||||
|
|
||||||
@ -126,6 +127,21 @@ 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)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
"""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.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
|
||||||
@ -45,14 +44,10 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
FORWARD_SENSOR_TEMPS = False
|
FORWARD_SENSOR_TEMPS = False
|
||||||
# TODO: Transform this into a CLI argument
|
|
||||||
HK_OUTPUT_LEVEL = 1
|
|
||||||
|
|
||||||
|
|
||||||
def handle_hk_packet(
|
def handle_hk_packet(
|
||||||
raw_tm: bytes,
|
raw_tm: bytes, obj_id_dict: ObjectIdDictT, printer: FsfwTmTcPrinter, hk_level: int
|
||||||
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)
|
||||||
@ -60,22 +55,18 @@ 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_OUTPUT_LEVEL == 1:
|
if hk_level == 1:
|
||||||
pass
|
pass
|
||||||
elif HK_OUTPUT_LEVEL > 1:
|
elif hk_level > 1:
|
||||||
handle_regular_hk_print(
|
handle_regular_hk_print(
|
||||||
printer=printer,
|
printer=printer,
|
||||||
object_id=named_obj_id,
|
object_id=named_obj_id,
|
||||||
@ -110,7 +101,9 @@ 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(pw=pw, hk_data=hk_data)
|
return handle_gps_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:
|
@ -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_handling import handle_hk_packet
|
from .hk_handler 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,6 +29,7 @@ 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!")
|
||||||
@ -48,7 +49,9 @@ 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(printer=printer, raw_tm=packet, obj_id_dict=obj_id_dict)
|
handle_hk_packet(
|
||||||
|
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:
|
||||||
|
@ -12,7 +12,6 @@ _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))
|
||||||
@ -46,7 +45,6 @@ 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()
|
||||||
@ -65,7 +63,6 @@ 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",
|
||||||
|
@ -59,12 +59,44 @@ 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:
|
||||||
@ -79,6 +111,7 @@ 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"]
|
||||||
@ -112,6 +145,9 @@ 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:
|
||||||
@ -126,6 +162,7 @@ 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"
|
||||||
@ -159,6 +196,9 @@ 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
|
||||||
@ -190,6 +230,7 @@ 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)
|
||||||
@ -223,6 +264,9 @@ 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
|
||||||
)
|
)
|
||||||
@ -275,6 +319,22 @@ 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)
|
||||||
@ -484,6 +544,26 @@ 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}")
|
||||||
|
|
||||||
@ -699,6 +779,8 @@ 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):
|
||||||
@ -930,11 +1012,13 @@ 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) < 2 * inc_len_scalar + 2 * inc_len_vec:
|
if len(hk_data) < 2 * inc_len_scalar + 2 * inc_len_vec + inc_len_source:
|
||||||
pw.dlog("Received HK set too small")
|
pw.dlog("Received HK set too small")
|
||||||
return
|
return
|
||||||
current_idx = 0
|
current_idx = 0
|
||||||
@ -973,12 +1057,20 @@ 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=5)
|
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=6)
|
||||||
|
|
||||||
|
|
||||||
def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
||||||
@ -1026,17 +1118,6 @@ 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"
|
||||||
@ -1082,8 +1163,8 @@ def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
current_idx += inc_len_vec
|
current_idx += inc_len_vec
|
||||||
if safe_strat.get(strat) is not None:
|
if CTRL_STRAT_DICT.get(strat) is not None:
|
||||||
pw.dlog(f"{'Safe Ctrl Strategy'.ljust(25)}: {safe_strat[strat]}")
|
pw.dlog(f"{'Safe Ctrl Strategy'.ljust(25)}: {CTRL_STRAT_DICT[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}")
|
||||||
@ -1132,6 +1213,41 @@ 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
|
||||||
|
@ -20,37 +20,51 @@ 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_OS_HK = ["hk"]
|
REQ_CORE_HK = ["core_hk_request"]
|
||||||
ENABLE_HK = ["enable_hk"]
|
ENABLE_CORE_HK = ["core_hk_enable"]
|
||||||
DISABLE_HK = ["disable_hk"]
|
DISABLE_CORE_HK = ["core_hk_disable"]
|
||||||
|
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_OS_HK = "Request One-Shot HK"
|
REQ_CORE_HK = "Request Core HK"
|
||||||
ENABLE_HK = "Enable HK"
|
ENABLE_CORE_HK = "Enable Core HK"
|
||||||
DISABLE_HK = "Disable HK"
|
DISABLE_CORE_HK = "Disable Core 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):
|
||||||
HK = 0
|
CORE_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",
|
||||||
@ -58,27 +72,64 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str):
|
def pack_gps_command( # noqa: C901
|
||||||
sid = make_sid(object_id=object_id, set_id=SetId.HK)
|
object_id: bytes, q: DefaultPusQueueHelper, op_code: str
|
||||||
|
): # 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_HK:
|
if op_code in OpCode.ENABLE_CORE_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_HK}")
|
q.add_log_cmd(f"GPS: {Info.ENABLE_CORE_HK}")
|
||||||
cmds = create_enable_periodic_hk_command_with_interval(
|
cmds = create_enable_periodic_hk_command_with_interval(
|
||||||
diag=False, sid=sid, interval_seconds=interval
|
diag=False,
|
||||||
|
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_HK:
|
if op_code in OpCode.DISABLE_CORE_HK:
|
||||||
q.add_log_cmd(f"gps: {Info.DISABLE_HK}")
|
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
|
||||||
q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=sid))
|
q.add_pus_tc(
|
||||||
if op_code in OpCode.REQ_OS_HK:
|
create_disable_periodic_hk_command(
|
||||||
q.add_log_cmd(f"GPS: {Info.REQ_OS_HK}")
|
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_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(
|
||||||
|
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(
|
||||||
|
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))
|
||||||
@ -87,8 +138,27 @@ def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str):
|
|||||||
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(pw: PrintWrapper, hk_data: bytes):
|
def handle_gps_data(
|
||||||
pw.dlog(f"Received GPS data, HK data length {len(hk_data)}")
|
pw: PrintWrapper,
|
||||||
|
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)
|
||||||
@ -126,3 +196,65 @@ def handle_gps_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]
|
||||||
|
)
|
||||||
|
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)]
|
||||||
|
@ -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)]
|
||||||
|
@ -290,7 +290,6 @@ 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(
|
||||||
|
@ -65,7 +65,6 @@ 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
|
||||||
@ -90,6 +89,7 @@ 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,6 +104,7 @@ 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:
|
||||||
@ -113,6 +114,7 @@ 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):
|
||||||
@ -438,14 +440,9 @@ 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 == "38":
|
if op_code == OpCodes.SET_TIME_FROM_SYS_TIME:
|
||||||
q.add_log_cmd("Star tracker: Set time")
|
q.add_log_cmd(Info.SET_TIME_FROM_SYS_TIME)
|
||||||
unix_time = 1640783543
|
data = obyt + struct.pack("!I", StarTrackerActionId.SET_TIME_FROM_SYS_TIME)
|
||||||
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")
|
||||||
@ -485,34 +482,6 @@ 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
|
||||||
@ -724,7 +693,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 / 10e6)), tz=datetime.timezone.utc
|
int(round(unix_time / 1e6)), 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}")
|
||||||
@ -887,4 +856,5 @@ 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)
|
||||||
|
@ -24,6 +24,19 @@ 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
|
||||||
@ -89,14 +102,14 @@ class OpCode:
|
|||||||
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"
|
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:
|
||||||
@ -188,21 +201,25 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
|||||||
info="Reset all reboot counters",
|
info="Reset all reboot counters",
|
||||||
)
|
)
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=OpCode.RESET_REBOOT_COUNTER_00,
|
keys=OpCode.RWD_RESET_REBOOT_COUNTER_00,
|
||||||
info="Reset reboot counter 0 0",
|
info="Reset reboot counter 0 0",
|
||||||
)
|
)
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=OpCode.RESET_REBOOT_COUNTER_01,
|
keys=OpCode.RWD_RESET_REBOOT_COUNTER_01,
|
||||||
info="Reset reboot counter 0 1",
|
info="Reset reboot counter 0 1",
|
||||||
)
|
)
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=OpCode.RESET_REBOOT_COUNTER_10,
|
keys=OpCode.RWD_RESET_REBOOT_COUNTER_10,
|
||||||
info="Reset reboot counter 1 0",
|
info="Reset reboot counter 1 0",
|
||||||
)
|
)
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=OpCode.RESET_REBOOT_COUNTER_11,
|
keys=OpCode.RWD_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)
|
||||||
@ -336,14 +353,25 @@ def pack_core_commands( # noqa C901
|
|||||||
action_id=ActionId.RESET_REBOOT_COUNTER,
|
action_id=ActionId.RESET_REBOOT_COUNTER,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.RESET_REBOOT_COUNTER_00:
|
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_00:
|
||||||
reset_specific_boot_counter(q, 0, 0)
|
reset_specific_boot_counter(q, 0, 0)
|
||||||
elif op_code == OpCode.RESET_REBOOT_COUNTER_01:
|
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_01:
|
||||||
reset_specific_boot_counter(q, 0, 1)
|
reset_specific_boot_counter(q, 0, 1)
|
||||||
elif op_code == OpCode.RESET_REBOOT_COUNTER_10:
|
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_10:
|
||||||
reset_specific_boot_counter(q, 1, 0)
|
reset_specific_boot_counter(q, 1, 0)
|
||||||
elif op_code == OpCode.RESET_REBOOT_COUNTER_11:
|
elif op_code == OpCode.RWD_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))
|
||||||
|
@ -14,6 +14,13 @@ 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 = {
|
||||||
@ -27,20 +34,27 @@ 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: ("iMTQ MGT", IMTQ_HANDLER_ID),
|
4: ("STR Assembly", STR_ASSEMBLY),
|
||||||
5: ("GYR 0 ADIS", GYRO_0_ADIS_HANDLER_ID),
|
5: ("iMTQ MGT", IMTQ_HANDLER_ID),
|
||||||
6: ("GYR 1 L3G", GYRO_1_L3G_HANDLER_ID),
|
6: ("GYR 0 ADIS", GYRO_0_ADIS_HANDLER_ID),
|
||||||
7: ("MGM 0 LIS3", MGM_0_LIS3_HANDLER_ID),
|
7: ("GYR 1 L3G", GYRO_1_L3G_HANDLER_ID),
|
||||||
8: ("MGM 1 RM3100", MGM_1_RM3100_HANDLER_ID),
|
8: ("MGM 0 LIS3", MGM_0_LIS3_HANDLER_ID),
|
||||||
9: ("GPS 0 Health Device", GPS_0_HEALTH_DEV),
|
9: ("MGM 1 RM3100", MGM_1_RM3100_HANDLER_ID),
|
||||||
10: ("SUS 0", SUS_0_N_LOC_XFYFZM_PT_XF),
|
10: ("GPS 0 Health Device", GPS_0_HEALTH_DEV),
|
||||||
11: ("SUS 6", SUS_6_R_LOC_XFYBZM_PT_XF),
|
11: ("SUS 0", SUS_0_N_LOC_XFYFZM_PT_XF),
|
||||||
12: ("RW 1", RW1_ID),
|
12: ("SUS 6", SUS_6_R_LOC_XFYBZM_PT_XF),
|
||||||
13: ("RW 2", RW2_ID),
|
13: ("RW 1", RW1_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),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -172,7 +172,6 @@ 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)
|
||||||
@ -723,10 +722,42 @@ 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:
|
||||||
pass
|
fmt_str = "!IIIQIIIIIBBBB"
|
||||||
|
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)
|
||||||
|
@ -17,17 +17,17 @@ USE_SCEX_CONF_FILE = True
|
|||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
PING = ["0", "ping"]
|
PING = "ping"
|
||||||
ION_CMD = ["1", "ion"]
|
ION_CMD = "ion"
|
||||||
TEMP_CMD = ["2", "temp"]
|
TEMP_CMD = "temp"
|
||||||
EXP_STATUS_CMD = ["3", "expstatus"]
|
EXP_STATUS_CMD = "expstatus"
|
||||||
|
|
||||||
ONE_CELLS_CMD = ["4", "onecell"]
|
ONE_CELLS_CMD = "onecell"
|
||||||
ALL_CELLS_CMD = ["5", "allcells"]
|
ALL_CELLS_CMD = "allcells"
|
||||||
FRAM = ["6", "fram"]
|
FRAM = "fram"
|
||||||
|
|
||||||
SWITCH_ON = ["7", "on"]
|
SWITCH_ON = "on"
|
||||||
SWITCH_OFF = ["8", "off"]
|
SWITCH_OFF = "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 in OpCode.SWITCH_ON:
|
if op_code == 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 in OpCode.SWITCH_OFF:
|
if op_code == 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 in OpCode.PING:
|
if op_code == 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 in OpCode.ION_CMD:
|
if op_code == 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 in OpCode.TEMP_CMD:
|
if op_code == 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 in OpCode.EXP_STATUS_CMD:
|
if op_code == 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 in OpCode.ONE_CELLS_CMD:
|
if op_code == 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])
|
||||||
|
|
||||||
@ -165,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 in OpCode.ALL_CELLS_CMD:
|
if op_code == 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])
|
||||||
|
|
||||||
@ -197,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 in OpCode.FRAM:
|
if op_code == 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:
|
class ModeId(enum.IntEnum):
|
||||||
OFF = 0
|
OFF = 0
|
||||||
SUPV_ONLY = 10
|
SUPV_ONLY = 10
|
||||||
MPSOC_STREAM = 11
|
MPSOC_STREAM = 11
|
||||||
|
@ -85,6 +85,40 @@ 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
|
||||||
@ -383,41 +417,17 @@ 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 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
return SubmodeForNormalMode.SSR_ON
|
||||||
if on_tgt == NormalSubmodesMask.DRO_ON:
|
if on_tgt == NormalSubmodesMask.DRO_ON:
|
||||||
return 1 << NormalSubmodesMask.DRO_ON | (
|
return SubmodeForNormalMode.DRO_ON
|
||||||
1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
|
||||||
)
|
|
||||||
if on_tgt == NormalSubmodesMask.X8_ON:
|
if on_tgt == NormalSubmodesMask.X8_ON:
|
||||||
return (
|
return SubmodeForNormalMode.X8_ON
|
||||||
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 (
|
return SubmodeForNormalMode.TX_ON
|
||||||
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 (
|
return SubmodeForNormalMode.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)
|
|
||||||
)
|
|
||||||
if on_tgt == NormalSubmodesMask.HPA_ON:
|
if on_tgt == NormalSubmodesMask.HPA_ON:
|
||||||
return (
|
return SubmodeForNormalMode.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)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
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):
|
||||||
|
92
eive_tmtc/tmtc/tcs/ctrl.py
Normal file
92
eive_tmtc/tmtc/tcs/ctrl.py
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
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_enable_periodic_hk_command_with_interval,
|
||||||
|
create_request_one_hk_command,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
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(
|
||||||
|
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,3 +6,22 @@ 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,6 +7,7 @@ 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
|
||||||
@ -20,18 +21,6 @@ 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,6 +1,5 @@
|
|||||||
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_CONTROLLER, TCS_SUBSYSTEM_ID
|
from eive_tmtc.config.object_ids import 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 (
|
||||||
@ -10,74 +9,28 @@ 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_enable_periodic_hk_command_with_interval,
|
|
||||||
create_request_one_diag_command,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class OpCodeSys:
|
class OpCode:
|
||||||
OFF = ["off"]
|
OFF = "off"
|
||||||
NML = ["nml"]
|
NML = "nml"
|
||||||
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"
|
|
||||||
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)"
|
||||||
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"
|
|
||||||
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 in OpCodeSys.REQUEST_PRIMARY_TEMP_SET:
|
if op_code == OpCode.OFF:
|
||||||
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 in OpCodeSys.NML:
|
if op_code == OpCode.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 == OpCodeSys.ENABLE_TEMP_SET:
|
if op_code == OpCode.ANNOUNCE_MODES:
|
||||||
interval_seconds = float(input("Please specify interval in seconds: "))
|
|
||||||
cmds = create_enable_periodic_hk_command_with_interval(
|
|
||||||
False, make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS), interval_seconds
|
|
||||||
)
|
|
||||||
for cmd in cmds:
|
|
||||||
q.add_pus_tc(cmd)
|
|
||||||
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)
|
||||||
@ -86,20 +39,11 @@ 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=OpCodeSys.OFF, info=InfoSys.OFF)
|
oce.add(keys=OpCode.OFF, info=InfoSys.OFF)
|
||||||
oce.add(keys=OpCodeSys.NML, info=InfoSys.NML)
|
oce.add(keys=OpCode.NML, info=InfoSys.NML)
|
||||||
oce.add(
|
oce.add(keys=OpCode.ANNOUNCE_MODES, info=InfoSys.ANNOUNCE_MODES)
|
||||||
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)
|
|
||||||
oce.add(keys=OpCodeSys.ENABLE_TEMP_SET, info=InfoSys.ENABLE_TEMP_SET)
|
|
||||||
defs.add_service(
|
defs.add_service(
|
||||||
name=CustomServiceList.TCS,
|
name=CustomServiceList.TCS_SS,
|
||||||
info="TCS",
|
info="TCS subsystem",
|
||||||
op_code_entry=oce,
|
op_code_entry=oce,
|
||||||
)
|
)
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
|
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
|
||||||
@ -11,7 +15,46 @@ from .heater import HEATER_LOCATION
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def handle_thermal_controller_hk_data(
|
class ThermalComponent(enum.IntEnum):
|
||||||
|
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..
|
||||||
@ -119,5 +162,50 @@ def handle_thermal_controller_hk_data(
|
|||||||
)
|
)
|
||||||
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}")
|
||||||
|
@ -29,9 +29,9 @@ classifiers = [
|
|||||||
"Topic :: Scientific/Engineering"
|
"Topic :: Scientific/Engineering"
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tmtccmd ~= 5.0.0rc0",
|
"tmtccmd ~= 5.0",
|
||||||
"python-dateutil ~= 2.8",
|
"python-dateutil ~= 2.8",
|
||||||
# tmtccmd @ git+https://github.com/robamu-org/tmtccmd@<gitRev>#egg=tmtccmd
|
# "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@1b110d321ef85#egg=tmtccmd"
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
|
25
tmtcc.py
25
tmtcc.py
@ -166,16 +166,20 @@ 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(packet, self.verif_wrapper, self.printer, self.raw_logger)
|
pus_factory_hook(
|
||||||
|
packet, self.verif_wrapper, self.printer, self.raw_logger, self.hk_level
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class UnknownApidHandler(GenericApidHandlerBase):
|
class UnknownApidHandler(GenericApidHandlerBase):
|
||||||
@ -335,13 +339,18 @@ class TcHandler(TcHandlerBase):
|
|||||||
_LOGGER.info("Finished CFDP queue")
|
_LOGGER.info("Finished CFDP queue")
|
||||||
|
|
||||||
|
|
||||||
def setup_params() -> SetupWrapper:
|
def setup_params() -> (SetupWrapper, int):
|
||||||
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()
|
||||||
parser_wrapper.add_def_proc_and_cfdp_as_subparsers()
|
tmtc_parser, cfdp_parser = 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
|
||||||
)
|
)
|
||||||
@ -352,13 +361,14 @@ def setup_params() -> SetupWrapper:
|
|||||||
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
|
return setup_wrapper, hk_level
|
||||||
|
|
||||||
|
|
||||||
def setup_cfdp_handler() -> CfdpInCcsdsWrapper:
|
def setup_cfdp_handler() -> CfdpInCcsdsWrapper:
|
||||||
@ -400,12 +410,13 @@ 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)
|
pus_handler = PusHandler(verification_wrapper, printer, raw_logger, hk_level)
|
||||||
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)
|
||||||
@ -444,7 +455,7 @@ def main(): # noqa C901: Complexity okay here.
|
|||||||
# 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 = setup_params()
|
setup_wrapper, hk_level = 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)
|
||||||
@ -457,7 +468,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
|
pus_verificator, printer, raw_logger, setup_wrapper.params.use_gui, hk_level
|
||||||
)
|
)
|
||||||
|
|
||||||
tmtccmd.setup(setup_wrapper)
|
tmtccmd.setup(setup_wrapper)
|
||||||
|
Reference in New Issue
Block a user