PLOC SUPV TM handling #293
5
.gitignore
vendored
5
.gitignore
vendored
@ -6,6 +6,7 @@ log
|
|||||||
/gps_log.txt
|
/gps_log.txt
|
||||||
/config/*.json
|
/config/*.json
|
||||||
|
|
||||||
|
/.tmtc-history.txt
|
||||||
/scex_conf.json
|
/scex_conf.json
|
||||||
/tmtc_conf.json
|
/tmtc_conf.json
|
||||||
/seqcnt*.txt
|
/seqcnt*.txt
|
||||||
@ -27,3 +28,7 @@ log
|
|||||||
/.installed.cfg
|
/.installed.cfg
|
||||||
/*.egg
|
/*.egg
|
||||||
/MANIFEST
|
/MANIFEST
|
||||||
|
|
||||||
|
# Telemetry database.
|
||||||
|
/tm.db
|
||||||
|
|
||||||
|
56
CHANGELOG.md
56
CHANGELOG.md
@ -10,6 +10,62 @@ list yields a list of all related PRs for each release.
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
# [v6.2.0] 2024-04-10
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added version set for STR.
|
||||||
|
- Command for relative timeshift.
|
||||||
|
- Health commands for payload components.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- EPS power commands working again.
|
||||||
|
- GNSS commands working again.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Fixed PLOC commanding
|
||||||
|
|
||||||
|
# [v6.1.1] 2024-03-06
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added Core Ctrl cmd to update leap seconds.
|
||||||
|
|
||||||
|
# [v6.1.0] 2024-02-29
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added commands to unlock and use STR secondary firmware slot.
|
||||||
|
- STR BlobStats TM handling
|
||||||
|
- New ACS CTRL commands.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- RW commanding
|
||||||
|
|
||||||
|
# [v6.0.0] 2024-02-08
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Bumped `tmccmd` to `v8.0.0rc1` to introduce new command tree handling.
|
||||||
|
- Added new PLOC SUPV commands to test sets, cleaned up PLOC SUPV commanding.
|
||||||
|
|
||||||
|
# [v5.13.0] 2024-01-30
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- First variant of TM handling with a DB which might serve as a foundation for better TM
|
||||||
|
handling with an ORM in the future.
|
||||||
|
- Added new parameter commands for PLOC MPSoC to skip SUPV commanding.
|
||||||
|
|
||||||
|
# [v5.12.1] 2023-12-13
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- A few new commands to test the TC scheduler.
|
||||||
|
|
||||||
# [v5.12.0] 2023-12-06
|
# [v5.12.0] 2023-12-06
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
@ -1,20 +1,28 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from spacepackets.cfdp import ConditionCode
|
from spacepackets.cfdp import ConditionCode, TransactionId
|
||||||
from tmtccmd.cfdp.mib import DefaultFaultHandlerBase
|
from cfdppy.mib import DefaultFaultHandlerBase
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class EiveCfdpFaultHandler(DefaultFaultHandlerBase):
|
class EiveCfdpFaultHandler(DefaultFaultHandlerBase):
|
||||||
def notice_of_suspension_cb(self, cond: ConditionCode):
|
def notice_of_suspension_cb(
|
||||||
|
self, transaction_id: TransactionId, cond: ConditionCode, progress: int
|
||||||
|
):
|
||||||
_LOGGER.info(f"Received notice of suspension: {cond!r}")
|
_LOGGER.info(f"Received notice of suspension: {cond!r}")
|
||||||
|
|
||||||
def notice_of_cancellation_cb(self, cond: ConditionCode):
|
def notice_of_cancellation_cb(
|
||||||
|
self, transaction_id: TransactionId, cond: ConditionCode, progress: int
|
||||||
|
):
|
||||||
_LOGGER.info(f"Received notice of cancellation: {cond!r}")
|
_LOGGER.info(f"Received notice of cancellation: {cond!r}")
|
||||||
|
|
||||||
def abandoned_cb(self, cond: ConditionCode):
|
def abandoned_cb(
|
||||||
|
self, transaction_id: TransactionId, cond: ConditionCode, progress: int
|
||||||
|
):
|
||||||
_LOGGER.info(f"Abandoned transaction: {cond!r}")
|
_LOGGER.info(f"Abandoned transaction: {cond!r}")
|
||||||
|
|
||||||
def ignore_cb(self, cond: ConditionCode):
|
def ignore_cb(
|
||||||
|
self, transaction_id: TransactionId, cond: ConditionCode, progress: int
|
||||||
|
):
|
||||||
_LOGGER.info(f"Ignored transaction: {cond!r}")
|
_LOGGER.info(f"Ignored transaction: {cond!r}")
|
||||||
|
@ -5,22 +5,22 @@ import deprecation
|
|||||||
from spacepackets import PacketType, SpacePacket, SpacePacketHeader
|
from spacepackets import PacketType, SpacePacket, SpacePacketHeader
|
||||||
from spacepackets.cfdp import GenericPduPacket, PduFactory
|
from spacepackets.cfdp import GenericPduPacket, PduFactory
|
||||||
from spacepackets.cfdp.pdu import PduHolder
|
from spacepackets.cfdp.pdu import PduHolder
|
||||||
from tmtccmd.cfdp import (
|
from cfdppy import (
|
||||||
CfdpUserBase,
|
CfdpUserBase,
|
||||||
LocalEntityCfg,
|
LocalEntityCfg,
|
||||||
RemoteEntityCfgTable,
|
RemoteEntityCfgTable,
|
||||||
)
|
)
|
||||||
from tmtccmd.cfdp.defs import CfdpState
|
from cfdppy.defs import CfdpState
|
||||||
from tmtccmd.cfdp.handler import (
|
from cfdppy.handler import (
|
||||||
DestHandler,
|
DestHandler,
|
||||||
DestStateWrapper,
|
DestStateWrapper,
|
||||||
SourceHandler,
|
SourceHandler,
|
||||||
SourceStateWrapper,
|
SourceStateWrapper,
|
||||||
)
|
)
|
||||||
from tmtccmd.cfdp.handler.common import PacketDestination, get_packet_destination
|
from cfdppy.handler.common import PacketDestination, get_packet_destination
|
||||||
from tmtccmd.cfdp.mib import CheckTimerProvider
|
from cfdppy.mib import CheckTimerProvider
|
||||||
from tmtccmd.cfdp.request import PutRequest
|
from cfdppy.request import PutRequest
|
||||||
from tmtccmd.util import ProvidesSeqCount
|
from spacepackets.seqcount import ProvidesSeqCount
|
||||||
from tmtccmd.version import get_version
|
from tmtccmd.version import get_version
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ from typing import Any
|
|||||||
from eive_tmtc.config.definitions import CFDP_APID
|
from eive_tmtc.config.definitions import CFDP_APID
|
||||||
from spacepackets.ccsds import SPACE_PACKET_HEADER_SIZE
|
from spacepackets.ccsds import SPACE_PACKET_HEADER_SIZE
|
||||||
from spacepackets.cfdp import PduFactory, PduType
|
from spacepackets.cfdp import PduFactory, PduType
|
||||||
from tmtccmd.cfdp.handler import CfdpInCcsdsHandler
|
from eive_tmtc.cfdp.handler import CfdpInCcsdsHandler
|
||||||
from tmtccmd.tmtc import SpecificApidHandlerBase
|
from tmtccmd.tmtc import SpecificApidHandlerBase
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -3,12 +3,13 @@ import logging
|
|||||||
|
|
||||||
from spacepackets.cfdp import ConditionCode
|
from spacepackets.cfdp import ConditionCode
|
||||||
from spacepackets.util import UnsignedByteField
|
from spacepackets.util import UnsignedByteField
|
||||||
from tmtccmd.cfdp import CfdpUserBase, TransactionId
|
from cfdppy import CfdpUserBase, TransactionId
|
||||||
from tmtccmd.cfdp.mib import CheckTimerProvider, Countdown, EntityType
|
from cfdppy.mib import CheckTimerProvider, Countdown, EntityType
|
||||||
from tmtccmd.cfdp.user import (
|
from cfdppy.user import (
|
||||||
TransactionFinishedParams,
|
TransactionFinishedParams,
|
||||||
MetadataRecvParams,
|
MetadataRecvParams,
|
||||||
FileSegmentRecvdParams,
|
FileSegmentRecvdParams,
|
||||||
|
TransactionParams,
|
||||||
)
|
)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -25,17 +26,22 @@ class EiveCheckTimerProvider(CheckTimerProvider):
|
|||||||
|
|
||||||
|
|
||||||
class EiveCfdpUser(CfdpUserBase):
|
class EiveCfdpUser(CfdpUserBase):
|
||||||
def transaction_indication(self, transaction_id: TransactionId):
|
def transaction_indication(
|
||||||
_LOGGER.info(f"CFDP User: Start of File {transaction_id}")
|
self,
|
||||||
|
transaction_indication_params: TransactionParams,
|
||||||
|
):
|
||||||
|
_LOGGER.info(
|
||||||
|
f"CFDP User: Start of File {transaction_indication_params.transaction_id}"
|
||||||
|
)
|
||||||
|
|
||||||
def eof_sent_indication(self, transaction_id: TransactionId):
|
def eof_sent_indication(self, transaction_id: TransactionId):
|
||||||
_LOGGER.info(f"CFDP User: EOF sent for {transaction_id}")
|
_LOGGER.info(f"CFDP User: EOF sent for {transaction_id}")
|
||||||
|
|
||||||
def transaction_finished_indication(self, params: TransactionFinishedParams):
|
def transaction_finished_indication(self, params: TransactionFinishedParams):
|
||||||
_LOGGER.info(f"CFDP User: {params.transaction_id} finished")
|
_LOGGER.info(f"CFDP User: {params.transaction_id} finished")
|
||||||
_LOGGER.info(f"Delivery Code: {params.delivery_code!r}")
|
_LOGGER.info(f"Delivery Code: {params.finished_params.delivery_code!r}")
|
||||||
_LOGGER.info(f"Condition code: {params.condition_code!r}")
|
_LOGGER.info(f"Condition code: {params.finished_params.condition_code!r}")
|
||||||
_LOGGER.info(f"File delivery status: {params.delivery_code!r}")
|
_LOGGER.info(f"File delivery status: {params.finished_params.delivery_code!r}")
|
||||||
|
|
||||||
def metadata_recv_indication(self, params: MetadataRecvParams):
|
def metadata_recv_indication(self, params: MetadataRecvParams):
|
||||||
pass
|
pass
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
from .definitions import * # noqa
|
@ -3,6 +3,7 @@
|
|||||||
@details Template configuration file. Copy this folder to the TMTC commander root and adapt
|
@details Template configuration file. Copy this folder to the TMTC commander root and adapt
|
||||||
it to your needs.
|
it to your needs.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import enum
|
import enum
|
||||||
|
|
||||||
from tmtccmd import CcsdsTmtcBackend
|
from tmtccmd import CcsdsTmtcBackend
|
||||||
|
@ -11,6 +11,10 @@ from spacepackets.ccsds import PacketId
|
|||||||
from spacepackets.util import UnsignedByteField
|
from spacepackets.util import UnsignedByteField
|
||||||
|
|
||||||
|
|
||||||
|
TM_DB_PATH = "tm.db"
|
||||||
|
# Separate DB or not? Not sure..
|
||||||
|
# RAW_TM_PATH = "raw_tm.db"
|
||||||
|
|
||||||
PUS_APID = 0x65
|
PUS_APID = 0x65
|
||||||
CFDP_APID = 0x66
|
CFDP_APID = 0x66
|
||||||
PUS_PACKET_ID = PacketId(PacketType.TM, True, PUS_APID)
|
PUS_PACKET_ID = PacketId(PacketType.TM, True, PUS_APID)
|
||||||
|
@ -75,9 +75,12 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
||||||
7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
||||||
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
||||||
8900;0x22c4;CLOCK_SET;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
8900;0x22c4;CLOCK_SET;INFO;Clock has been set. P1: old timeval seconds. P2: new timeval seconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||||
8901;0x22c5;CLOCK_DUMP;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
8901;0x22c5;CLOCK_DUMP_LEGACY;INFO;Clock dump event. P1: timeval seconds P2: timeval milliseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||||
8902;0x22c6;CLOCK_SET_FAILURE;LOW;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
8902;0x22c6;CLOCK_SET_FAILURE;LOW;Clock could not be set. P1: Returncode.;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||||
|
8903;0x22c7;CLOCK_DUMP;INFO;Clock dump event. P1: timeval seconds P2: timeval microseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||||
|
8904;0x22c8;CLOCK_DUMP_BEFORE_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||||
|
8905;0x22c9;CLOCK_DUMP_AFTER_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||||
9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
||||||
9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h
|
9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h
|
||||||
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
|
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
|
||||||
@ -88,7 +91,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h
|
10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||||
10805;0x2a35;HANDLING_CFDP_REQUEST_FAILED;LOW;CFDP request handling failed. P2: Returncode.;fsfw/src/fsfw/cfdp/handler/defs.h
|
10805;0x2a35;HANDLING_CFDP_REQUEST_FAILED;LOW;CFDP request handling failed. P2: Returncode.;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||||
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acs/defs.h
|
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acs/defs.h
|
||||||
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;The system has recovered from a safe rate rotation violation.;mission/acs/defs.h
|
11201;0x2bc1;RATE_RECOVERY;MEDIUM;The system has recovered from a rate rotation violation.;mission/acs/defs.h
|
||||||
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained.;mission/acs/defs.h
|
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained.;mission/acs/defs.h
|
||||||
11203;0x2bc3;MEKF_INVALID_INFO;INFO;MEKF was not able to compute a solution. P1: MEKF state on exit;mission/acs/defs.h
|
11203;0x2bc3;MEKF_INVALID_INFO;INFO;MEKF was not able to compute a solution. P1: MEKF state on exit;mission/acs/defs.h
|
||||||
11204;0x2bc4;MEKF_RECOVERY;INFO;MEKF is able to compute a solution again.;mission/acs/defs.h
|
11204;0x2bc4;MEKF_RECOVERY;INFO;MEKF is able to compute a solution again.;mission/acs/defs.h
|
||||||
@ -97,6 +100,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
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
|
11208;0x2bc8;TLE_TOO_OLD;INFO;The TLE for the SGP4 Propagator has become too old.;mission/acs/defs.h
|
||||||
11209;0x2bc9;TLE_FILE_READ_FAILED;LOW;The TLE could not be read from the filesystem.;mission/acs/defs.h
|
11209;0x2bc9;TLE_FILE_READ_FAILED;LOW;The TLE could not be read from the filesystem.;mission/acs/defs.h
|
||||||
|
11210;0x2bca;PTG_RATE_VIOLATION;MEDIUM;The limits for the rotation in pointing mode were violated.;mission/acs/defs.h
|
||||||
|
11211;0x2bcb;DETUMBLE_TRANSITION_FAILED;HIGH;The detumble transition has failed. //! P1: Last detumble state before failure.;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
|
||||||
@ -231,8 +236,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/SusAssembly.h
|
12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/SusAssembly.h
|
||||||
12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/acs/SusAssembly.h
|
12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/acs/SusAssembly.h
|
||||||
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/tcs/TcsBoardAssembly.h
|
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/tcs/TcsBoardAssembly.h
|
||||||
13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/acs/archive/GPSDefinitions.h
|
13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: New fix. P2: Missed fix changes 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;linux/acs/GPSDefinitions.h
|
||||||
13101;0x332d;CANT_GET_FIX;LOW;Could not get fix in maximum allowed time. P1: Maximum allowed time to get a fix after the GPS was switched on.;mission/acs/archive/GPSDefinitions.h
|
13101;0x332d;CANT_GET_FIX;MEDIUM;Could not get fix in maximum allowed time. Trying to reset both GNSS devices. P1: Maximum allowed time to get a fix after the GPS was switched on.;linux/acs/GPSDefinitions.h
|
||||||
|
13102;0x332e;RESET_FAIL;HIGH;Failed to reset an GNNS Device. P1: Board-Side.;linux/acs/GPSDefinitions.h
|
||||||
13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h
|
13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h
|
||||||
13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/power/P60DockHandler.h
|
13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/power/P60DockHandler.h
|
||||||
13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/power/P60DockHandler.h
|
13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/power/P60DockHandler.h
|
||||||
|
|
@ -1,33 +1,147 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import SPACE_PACKET_IDS
|
from prompt_toolkit.history import FileHistory
|
||||||
from tmtccmd import HookBase, CcsdsTmtcBackend
|
from tmtccmd import CcsdsTmtcBackend, HookBase
|
||||||
from tmtccmd.com import ComInterface
|
from tmtccmd.com import ComInterface
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper
|
from tmtccmd.config import CmdTreeNode
|
||||||
|
from tmtccmd.config.hook import History
|
||||||
from eive_tmtc.config.retvals import get_retval_dict
|
|
||||||
from eive_tmtc.pus_tc.cmd_definitions import get_eive_service_op_code_dict
|
|
||||||
from tmtccmd.util import ObjectIdDictT, RetvalDictT
|
from tmtccmd.util import ObjectIdDictT, RetvalDictT
|
||||||
|
|
||||||
|
from eive_tmtc.config.definitions import SPACE_PACKET_IDS
|
||||||
|
from eive_tmtc.config.retvals import get_retval_dict
|
||||||
|
from eive_tmtc.tmtc.acs.acs_board import create_acs_board_node
|
||||||
|
from eive_tmtc.tmtc.acs.acs_ctrl import create_acs_ctrl_node
|
||||||
|
from eive_tmtc.tmtc.acs.gps import create_gnss_node
|
||||||
|
from eive_tmtc.tmtc.acs.gyros import create_gyros_node
|
||||||
|
from eive_tmtc.tmtc.acs.imtq import create_mgt_node
|
||||||
|
from eive_tmtc.tmtc.acs.mgms import create_mgms_node
|
||||||
|
from eive_tmtc.tmtc.acs.reaction_wheels import (
|
||||||
|
create_reaction_wheel_assembly_node,
|
||||||
|
create_reaction_wheels_nodes,
|
||||||
|
)
|
||||||
|
from eive_tmtc.tmtc.acs.star_tracker import create_str_node
|
||||||
|
from eive_tmtc.tmtc.acs.subsystem import create_acs_subsystem_node
|
||||||
|
from eive_tmtc.tmtc.com.ccsds_handler import create_ccsds_node
|
||||||
|
from eive_tmtc.tmtc.com.subsystem import create_com_subsystem_node
|
||||||
|
from eive_tmtc.tmtc.com.syrlinks_handler import create_syrlinks_node
|
||||||
|
from eive_tmtc.tmtc.core import create_core_node
|
||||||
|
from eive_tmtc.tmtc.health import create_global_health_node
|
||||||
|
from eive_tmtc.tmtc.payload.ploc_mpsoc import create_ploc_mpsoc_node
|
||||||
|
from eive_tmtc.tmtc.payload.ploc_supervisor import create_ploc_supv_node
|
||||||
|
from eive_tmtc.tmtc.payload.plpcdu import create_pl_pcdu_node
|
||||||
|
from eive_tmtc.tmtc.payload.scex import create_scex_node
|
||||||
|
from eive_tmtc.tmtc.payload.subsystem import create_payload_subsystem_node
|
||||||
|
from eive_tmtc.tmtc.power.acu import create_acu_node
|
||||||
|
from eive_tmtc.tmtc.power.bpx_batt import create_bpx_batt_node
|
||||||
|
from eive_tmtc.tmtc.power.p60dock import create_p60_dock_node
|
||||||
|
from eive_tmtc.tmtc.power.pdu1 import create_pdu1_node
|
||||||
|
from eive_tmtc.tmtc.power.pdu2 import create_pdu2_node
|
||||||
|
from eive_tmtc.tmtc.power.power import create_power_node
|
||||||
|
from eive_tmtc.tmtc.power.pwr_ctrl import create_pwr_ctrl_node
|
||||||
|
from eive_tmtc.tmtc.power.subsystem import create_eps_subsystem_node
|
||||||
|
from eive_tmtc.tmtc.system import create_system_node
|
||||||
|
from eive_tmtc.tmtc.tcs.ctrl import create_tcs_ctrl_node
|
||||||
|
from eive_tmtc.tmtc.tcs.heater import create_heater_node
|
||||||
|
from eive_tmtc.tmtc.tcs.rtd import create_rtd_node
|
||||||
|
from eive_tmtc.tmtc.tcs.tmp1075 import create_tmp_sens_node
|
||||||
|
from eive_tmtc.tmtc.test import create_test_node
|
||||||
|
from eive_tmtc.tmtc.time import create_time_node
|
||||||
|
from eive_tmtc.tmtc.tm_store import create_persistent_tm_store_node
|
||||||
|
from eive_tmtc.tmtc.wdt import create_wdt_node
|
||||||
|
|
||||||
|
|
||||||
class EiveHookObject(HookBase):
|
class EiveHookObject(HookBase):
|
||||||
def __init__(self, json_cfg_path: str):
|
def __init__(self, json_cfg_path: str):
|
||||||
super().__init__(json_cfg_path=json_cfg_path)
|
super().__init__(json_cfg_path=json_cfg_path)
|
||||||
|
|
||||||
def get_tmtc_definitions(self) -> TmtcDefinitionWrapper:
|
def get_command_definitions(self) -> CmdTreeNode:
|
||||||
return get_eive_service_op_code_dict()
|
root_node = CmdTreeNode.root_node()
|
||||||
|
acs_node = create_acs_subsystem_node()
|
||||||
def assign_communication_interface(self, com_if_key: str) -> Optional[ComInterface]:
|
acs_brd_assy_node = create_acs_board_node()
|
||||||
from tmtccmd.config.com import (
|
acs_brd_assy_node.add_child(create_mgms_node())
|
||||||
create_com_interface_default,
|
acs_brd_assy_node.add_child(create_gyros_node())
|
||||||
create_com_interface_cfg_default,
|
acs_ctrl = create_acs_ctrl_node()
|
||||||
|
rw_list = create_reaction_wheels_nodes()
|
||||||
|
rws = CmdTreeNode("rws", "Reaction Wheel Devices")
|
||||||
|
for rw in rw_list:
|
||||||
|
rws.add_child(rw)
|
||||||
|
rws.add_child(create_reaction_wheel_assembly_node())
|
||||||
|
star_tracker = create_str_node()
|
||||||
|
star_tracker_img_helper = CmdTreeNode(
|
||||||
|
"str_img_helper", "Star Tracker Image Helper"
|
||||||
)
|
)
|
||||||
|
star_tracker.add_child(star_tracker_img_helper)
|
||||||
|
gnss_devs = create_gnss_node()
|
||||||
|
|
||||||
|
acs_node.add_child(acs_brd_assy_node)
|
||||||
|
acs_node.add_child(acs_ctrl)
|
||||||
|
acs_node.add_child(rws)
|
||||||
|
acs_node.add_child(create_mgt_node())
|
||||||
|
acs_node.add_child(star_tracker)
|
||||||
|
acs_node.add_child(gnss_devs)
|
||||||
|
|
||||||
|
tcs_node = CmdTreeNode("tcs", "TCS Subsystem")
|
||||||
|
tmp_1075_node = create_tmp_sens_node()
|
||||||
|
rtds_node = create_rtd_node()
|
||||||
|
heaters_node = create_heater_node()
|
||||||
|
tcs_ctrl = create_tcs_ctrl_node()
|
||||||
|
tcs_node.add_child(rtds_node)
|
||||||
|
tcs_node.add_child(tmp_1075_node)
|
||||||
|
tcs_node.add_child(tcs_ctrl)
|
||||||
|
tcs_node.add_child(heaters_node)
|
||||||
|
tcs_brd_assy = CmdTreeNode("tcs_brd_assy", "TCS Board Assembly")
|
||||||
|
tcs_node.add_child(tcs_brd_assy)
|
||||||
|
|
||||||
|
com_node = create_com_subsystem_node()
|
||||||
|
com_node.add_child(create_syrlinks_node())
|
||||||
|
com_node.add_child(create_ccsds_node())
|
||||||
|
|
||||||
|
eps_node = create_eps_subsystem_node()
|
||||||
|
eps_node.add_child(create_pwr_ctrl_node())
|
||||||
|
eps_node.add_child(create_power_node())
|
||||||
|
eps_node.add_child(create_acu_node())
|
||||||
|
eps_node.add_child(create_pdu1_node())
|
||||||
|
eps_node.add_child(create_pdu2_node())
|
||||||
|
eps_node.add_child(create_p60_dock_node())
|
||||||
|
eps_node.add_child(create_bpx_batt_node())
|
||||||
|
|
||||||
|
payload_node = create_payload_subsystem_node()
|
||||||
|
payload_node.add_child(create_pl_pcdu_node())
|
||||||
|
payload_node.add_child(create_scex_node())
|
||||||
|
payload_node.add_child(create_ploc_mpsoc_node())
|
||||||
|
payload_node.add_child(create_ploc_supv_node())
|
||||||
|
|
||||||
|
obdh_node = CmdTreeNode("obdh", "OBDH Subsystem")
|
||||||
|
obdh_node.add_child(create_wdt_node())
|
||||||
|
obdh_node.add_child(create_core_node())
|
||||||
|
obdh_node.add_child(create_time_node())
|
||||||
|
obdh_node.add_child(create_persistent_tm_store_node())
|
||||||
|
|
||||||
|
root_node.add_child(create_test_node())
|
||||||
|
root_node.add_child(create_system_node())
|
||||||
|
root_node.add_child(create_global_health_node())
|
||||||
|
root_node.add_child(acs_node)
|
||||||
|
root_node.add_child(tcs_node)
|
||||||
|
root_node.add_child(com_node)
|
||||||
|
root_node.add_child(eps_node)
|
||||||
|
root_node.add_child(payload_node)
|
||||||
|
root_node.add_child(obdh_node)
|
||||||
|
return root_node
|
||||||
|
|
||||||
|
def get_communication_interface(self, com_if_key: str) -> Optional[ComInterface]:
|
||||||
|
from tmtccmd.config.com import (
|
||||||
|
create_com_interface_cfg_default,
|
||||||
|
create_com_interface_default,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert self.cfg_path is not None
|
||||||
|
|
||||||
cfg = create_com_interface_cfg_default(
|
cfg = create_com_interface_cfg_default(
|
||||||
com_if_key=com_if_key,
|
com_if_key=com_if_key,
|
||||||
json_cfg_path=self.cfg_path,
|
json_cfg_path=self.cfg_path,
|
||||||
space_packet_ids=SPACE_PACKET_IDS,
|
space_packet_ids=SPACE_PACKET_IDS,
|
||||||
)
|
)
|
||||||
|
assert cfg is not None
|
||||||
return create_com_interface_default(cfg)
|
return create_com_interface_default(cfg)
|
||||||
|
|
||||||
def perform_mode_operation(self, tmtc_backend: CcsdsTmtcBackend, mode: int):
|
def perform_mode_operation(self, tmtc_backend: CcsdsTmtcBackend, mode: int):
|
||||||
@ -42,3 +156,6 @@ class EiveHookObject(HookBase):
|
|||||||
|
|
||||||
def get_retval_dict(self) -> RetvalDictT:
|
def get_retval_dict(self) -> RetvalDictT:
|
||||||
return get_retval_dict()
|
return get_retval_dict()
|
||||||
|
|
||||||
|
def get_cmd_history(self) -> Optional[History]:
|
||||||
|
return FileHistory(".tmtc-history.txt")
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
@details Template configuration file. Copy this folder to the TMTC commander root and adapt
|
@details Template configuration file. Copy this folder to the TMTC commander root and adapt
|
||||||
it to your needs.
|
it to your needs.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import os.path
|
import os.path
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
@ -387,6 +387,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
|||||||
0x4304;PUS11_InvalidRelativeTime;No description;4;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
0x4304;PUS11_InvalidRelativeTime;No description;4;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
||||||
0x4305;PUS11_ContainedTcTooSmall;No description;5;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
0x4305;PUS11_ContainedTcTooSmall;No description;5;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
||||||
0x4306;PUS11_ContainedTcCrcMissmatch;No description;6;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
0x4306;PUS11_ContainedTcCrcMissmatch;No description;6;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
||||||
|
0x4307;PUS11_MapIsFull;No description;7;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
||||||
0x4400;FILS_GenericFileError;No description;0;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
|
0x4400;FILS_GenericFileError;No description;0;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
|
||||||
0x4401;FILS_GenericDirError;No description;1;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
|
0x4401;FILS_GenericDirError;No description;1;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
|
||||||
0x4402;FILS_FilesystemInactive;No description;2;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
|
0x4402;FILS_FilesystemInactive;No description;2;FILE_SYSTEM;fsfw/src/fsfw/filesystem/HasFileSystemIF.h
|
||||||
@ -453,6 +454,12 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
|||||||
0x5208;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/acs/imtqHelpers.h
|
0x5208;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/acs/imtqHelpers.h
|
||||||
0x5209;IMTQ_StartupCfgError;No description;9;IMTQ_HANDLER;mission/acs/imtqHelpers.h
|
0x5209;IMTQ_StartupCfgError;No description;9;IMTQ_HANDLER;mission/acs/imtqHelpers.h
|
||||||
0x520a;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;10;IMTQ_HANDLER;mission/acs/imtqHelpers.h
|
0x520a;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;10;IMTQ_HANDLER;mission/acs/imtqHelpers.h
|
||||||
|
0x53a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;RW_HANDLER;mission/acs/RwHandler.h
|
||||||
|
0x53a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;161;RW_HANDLER;mission/acs/RwHandler.h
|
||||||
|
0x53a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;RW_HANDLER;mission/acs/RwHandler.h
|
||||||
|
0x53a3;RWHA_ExecutionFailed;Command execution failed;163;RW_HANDLER;mission/acs/RwHandler.h
|
||||||
|
0x53a4;RWHA_CrcError;Reaction wheel reply has invalid crc;164;RW_HANDLER;mission/acs/RwHandler.h
|
||||||
|
0x53a5;RWHA_ValueNotRead;No description;165;RW_HANDLER;mission/acs/RwHandler.h
|
||||||
0x53b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/acs/rwHelpers.h
|
0x53b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/acs/rwHelpers.h
|
||||||
0x53b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/acs/rwHelpers.h
|
0x53b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/acs/rwHelpers.h
|
||||||
0x53b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/acs/rwHelpers.h
|
0x53b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/acs/rwHelpers.h
|
||||||
@ -498,12 +505,8 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
|||||||
0x58a1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;161;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
|
0x58a1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;161;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
|
||||||
0x58a2;PLSPVhLP_PathNotExists;Received command with invalid pathname;162;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
|
0x58a2;PLSPVhLP_PathNotExists;Received command with invalid pathname;162;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
|
||||||
0x58a3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;163;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
|
0x58a3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;163;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
|
||||||
0x59a0;SUSS_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;SUS_HANDLER;mission/acs/RwHandler.h
|
0x59a0;SUSS_ErrorUnlockMutex;No description;160;SUS_HANDLER;mission/acs/archive/LegacySusHandler.h
|
||||||
0x59a1;SUSS_InvalidRampTime;Action Message with invalid ramp time was received.;161;SUS_HANDLER;mission/acs/RwHandler.h
|
0x59a1;SUSS_ErrorLockMutex;No description;161;SUS_HANDLER;mission/acs/archive/LegacySusHandler.h
|
||||||
0x59a2;SUSS_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;SUS_HANDLER;mission/acs/RwHandler.h
|
|
||||||
0x59a3;SUSS_ExecutionFailed;Command execution failed;163;SUS_HANDLER;mission/acs/RwHandler.h
|
|
||||||
0x59a4;SUSS_CrcError;Reaction wheel reply has invalid crc;164;SUS_HANDLER;mission/acs/RwHandler.h
|
|
||||||
0x59a5;SUSS_ValueNotRead;No description;165;SUS_HANDLER;mission/acs/RwHandler.h
|
|
||||||
0x5aa0;IPCI_PapbBusy;No description;160;CCSDS_IP_CORE_BRIDGE;linux/ipcore/PapbVcInterface.h
|
0x5aa0;IPCI_PapbBusy;No description;160;CCSDS_IP_CORE_BRIDGE;linux/ipcore/PapbVcInterface.h
|
||||||
0x5ba0;PTME_UnknownVcId;No description;160;PTME;linux/ipcore/Ptme.h
|
0x5ba0;PTME_UnknownVcId;No description;160;PTME;linux/ipcore/Ptme.h
|
||||||
0x5d01;STRHLP_SdNotMounted;SD card specified in path string not mounted;1;STR_HELPER;linux/acs/StrComHandler.h
|
0x5d01;STRHLP_SdNotMounted;SD card specified in path string not mounted;1;STR_HELPER;linux/acs/StrComHandler.h
|
||||||
@ -592,9 +595,11 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
|||||||
0x69b5;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);181;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
0x69b5;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);181;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||||
0x69c0;SPVRTVIF_BufTooSmall;No description;192;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
0x69c0;SPVRTVIF_BufTooSmall;No description;192;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||||
0x69c1;SPVRTVIF_NoReplyTimeout;No description;193;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
0x69c1;SPVRTVIF_NoReplyTimeout;No description;193;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||||
0x6a00;ACSCTRL_FileDeletionFailed;File deletion failed and at least one file is still existent.;0;ACS_CTRL;mission/controller/AcsController.h
|
0x6aa0;ACSCTRL_FileDeletionFailed;File deletion failed and at least one file is still existent.;160;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
|
||||||
0x6a01;ACSCTRL_WriteFileFailed;Writing the TLE to the file has failed.;1;ACS_CTRL;mission/controller/AcsController.h
|
0x6aa1;ACSCTRL_WriteFileFailed;Writing the TLE to the file has failed.;161;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
|
||||||
0x6a02;ACSCTRL_ReadFileFailed;Reading the TLE to the file has failed.;2;ACS_CTRL;mission/controller/AcsController.h
|
0x6aa2;ACSCTRL_ReadFileFailed;Reading the TLE to the file has failed.;162;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
|
||||||
|
0x6aa3;ACSCTRL_SingleRwUnavailable;A single RW has failed.;163;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
|
||||||
|
0x6aa4;ACSCTRL_MultipleRwUnavailable;Multiple RWs have failed.;164;ACS_CTRL;mission/controller/controllerdefinitions/AcsCtrlDefinitions.h
|
||||||
0x6b02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6b02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
0x6b03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6b03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
0x6b04;ACSMEKF_MekfNoModelVectors;No description;4;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6b04;ACSMEKF_MekfNoModelVectors;No description;4;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
|
@ -1,21 +0,0 @@
|
|||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry, CoreServiceList
|
|
||||||
from tmtccmd.config.tmtc import (
|
|
||||||
call_all_definitions_providers,
|
|
||||||
)
|
|
||||||
from tmtccmd.config.globals import get_default_tmtc_defs
|
|
||||||
|
|
||||||
|
|
||||||
def get_eive_service_op_code_dict() -> TmtcDefinitionWrapper:
|
|
||||||
"""Call all registered TMTC definition providers. They were registered using
|
|
||||||
the :py:func:`tmtc_definitions_provider` decorator.
|
|
||||||
"""
|
|
||||||
def_wrapper = get_default_tmtc_defs()
|
|
||||||
srv_5 = OpCodeEntry()
|
|
||||||
srv_5.add("0", "Event Test")
|
|
||||||
def_wrapper.add_service(
|
|
||||||
name=CoreServiceList.SERVICE_5.value,
|
|
||||||
info="PUS Service 5 Event",
|
|
||||||
op_code_entry=srv_5,
|
|
||||||
)
|
|
||||||
call_all_definitions_providers(def_wrapper)
|
|
||||||
return def_wrapper
|
|
309
eive_tmtc/pus_tc/cmd_demux.py
Normal file
309
eive_tmtc/pus_tc/cmd_demux.py
Normal file
@ -0,0 +1,309 @@
|
|||||||
|
"""Hook function which packs telecommands based on service and operation code string
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from typing import List, cast
|
||||||
|
|
||||||
|
from tmtccmd import DefaultProcedureInfo
|
||||||
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
from tmtccmd.util import ObjectIdU32
|
||||||
|
|
||||||
|
import eive_tmtc.config.object_ids as oids
|
||||||
|
from eive_tmtc.config.object_ids import (
|
||||||
|
ACU_HANDLER_ID,
|
||||||
|
CCSDS_HANDLER_ID,
|
||||||
|
HEATER_CONTROLLER_ID,
|
||||||
|
IMTQ_HANDLER_ID,
|
||||||
|
P60_DOCK_HANDLER,
|
||||||
|
PDEC_HANDLER_ID,
|
||||||
|
PDU_1_HANDLER_ID,
|
||||||
|
PDU_2_HANDLER_ID,
|
||||||
|
RAD_SENSOR_ID,
|
||||||
|
RW1_ID,
|
||||||
|
RW2_ID,
|
||||||
|
RW3_ID,
|
||||||
|
RW4_ID,
|
||||||
|
RW_ASSEMBLY,
|
||||||
|
STAR_TRACKER_ID,
|
||||||
|
STR_IMG_HELPER_ID,
|
||||||
|
SYRLINKS_HANDLER_ID,
|
||||||
|
TMP1075_HANDLER_IF_BRD_ID,
|
||||||
|
TMP1075_HANDLER_PLPCDU_0_ID,
|
||||||
|
TMP1075_HANDLER_TCS_BRD_0_ID,
|
||||||
|
TMP1075_HANDLER_TCS_BRD_1_ID,
|
||||||
|
get_object_ids,
|
||||||
|
)
|
||||||
|
from eive_tmtc.tmtc.acs.acs_board import pack_acs_board_command
|
||||||
|
from eive_tmtc.tmtc.acs.acs_ctrl import pack_acs_ctrl_command
|
||||||
|
from eive_tmtc.tmtc.acs.gps import pack_gps_command
|
||||||
|
from eive_tmtc.tmtc.acs.gyros import handle_gyr_cmd
|
||||||
|
from eive_tmtc.tmtc.acs.imtq import create_imtq_command
|
||||||
|
from eive_tmtc.tmtc.acs.mgms import handle_mgm_cmd
|
||||||
|
from eive_tmtc.tmtc.acs.reaction_wheels import (
|
||||||
|
create_single_rw_cmd,
|
||||||
|
pack_rw_ass_cmds,
|
||||||
|
)
|
||||||
|
from eive_tmtc.tmtc.acs.star_tracker import pack_star_tracker_commands
|
||||||
|
from eive_tmtc.tmtc.acs.str_img_helper import pack_str_img_helper_command
|
||||||
|
from eive_tmtc.tmtc.acs.subsystem import build_acs_subsystem_cmd
|
||||||
|
from eive_tmtc.tmtc.com.ccsds_handler import pack_ccsds_handler_command
|
||||||
|
from eive_tmtc.tmtc.com.pdec_handler import pack_pdec_handler_commands
|
||||||
|
from eive_tmtc.tmtc.com.subsystem import build_com_subsystem_procedure
|
||||||
|
from eive_tmtc.tmtc.com.syrlinks_handler import pack_syrlinks_command
|
||||||
|
from eive_tmtc.tmtc.core import pack_core_commands
|
||||||
|
from eive_tmtc.tmtc.health import build_health_cmds
|
||||||
|
from eive_tmtc.tmtc.payload.subsystem import create_payload_subsystem_cmd
|
||||||
|
from eive_tmtc.tmtc.payload.ploc_mpsoc import pack_ploc_mpsoc_commands
|
||||||
|
from eive_tmtc.tmtc.payload.ploc_supervisor import pack_ploc_supv_commands
|
||||||
|
from eive_tmtc.tmtc.payload.plpcdu import pack_pl_pcdu_commands
|
||||||
|
from eive_tmtc.tmtc.payload.rad_sensor import create_rad_sensor_cmd
|
||||||
|
from eive_tmtc.tmtc.payload.scex import pack_scex_cmds
|
||||||
|
from eive_tmtc.tmtc.power.acu import pack_acu_commands
|
||||||
|
from eive_tmtc.tmtc.power.p60dock import pack_p60dock_cmds
|
||||||
|
from eive_tmtc.tmtc.power.pdu1 import pack_pdu1_commands
|
||||||
|
from eive_tmtc.tmtc.power.pdu2 import pack_pdu2_commands
|
||||||
|
from eive_tmtc.tmtc.power.power import pack_power_commands
|
||||||
|
from eive_tmtc.tmtc.power.pwr_ctrl import pack_power_ctrl_command
|
||||||
|
from eive_tmtc.tmtc.system import build_system_cmds
|
||||||
|
from eive_tmtc.tmtc.tcs.ctrl import pack_tcs_ctrl_commands
|
||||||
|
from eive_tmtc.tmtc.tcs.heater import pack_heater_cmds
|
||||||
|
from eive_tmtc.tmtc.tcs.rtd import pack_rtd_commands
|
||||||
|
from eive_tmtc.tmtc.tcs.subsystem import pack_tcs_sys_commands
|
||||||
|
from eive_tmtc.tmtc.tcs.tmp1075 import pack_tmp1075_test_into
|
||||||
|
from eive_tmtc.tmtc.test import build_test_commands
|
||||||
|
from eive_tmtc.tmtc.time import pack_time_management_cmd
|
||||||
|
from eive_tmtc.tmtc.tm_store import pack_tm_store_commands
|
||||||
|
from eive_tmtc.tmtc.wdt import pack_wdt_commands
|
||||||
|
from eive_tmtc.utility.input_helper import InputHelper
|
||||||
|
|
||||||
|
|
||||||
|
def handle_pus_procedure(
|
||||||
|
info: DefaultProcedureInfo,
|
||||||
|
queue_helper: DefaultPusQueueHelper,
|
||||||
|
):
|
||||||
|
cmd_path = info.cmd_path
|
||||||
|
assert cmd_path is not None
|
||||||
|
cmd_path_list = cmd_path.split("/")
|
||||||
|
if cmd_path_list[0] == "":
|
||||||
|
cmd_path_list = cmd_path_list[1:]
|
||||||
|
if len(cmd_path_list) == 0:
|
||||||
|
raise ValueError(
|
||||||
|
"command path list empty. Full command path {cmd_path} might have invalid format"
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "system":
|
||||||
|
assert len(cmd_path_list) >= 1
|
||||||
|
return build_system_cmds(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "health":
|
||||||
|
assert len(cmd_path_list) >= 1
|
||||||
|
return build_health_cmds(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "eps":
|
||||||
|
return handle_eps_procedure(queue_helper, cmd_path_list[1:])
|
||||||
|
if cmd_path_list[0] == "tcs":
|
||||||
|
return handle_tcs_procedure(queue_helper, cmd_path_list[1:])
|
||||||
|
if cmd_path_list[0] == "acs":
|
||||||
|
return handle_acs_procedure(queue_helper, cmd_path_list[1:])
|
||||||
|
if cmd_path_list[0] == "payload":
|
||||||
|
return handle_payload_procedure(queue_helper, cmd_path_list[1:])
|
||||||
|
if cmd_path_list[0] == "obdh":
|
||||||
|
return handle_obdh_procedure(queue_helper, cmd_path_list[1:])
|
||||||
|
if cmd_path_list[0] == "test":
|
||||||
|
assert len(cmd_path_list) >= 1
|
||||||
|
return build_test_commands(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "com":
|
||||||
|
return handle_com_procedure(queue_helper, cmd_path_list[1:])
|
||||||
|
logging.getLogger(__name__).warning(
|
||||||
|
f"invalid or unimplemented command path {cmd_path}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_eps_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
|
||||||
|
obj_id_man = get_object_ids()
|
||||||
|
assert len(cmd_path_list) >= 1
|
||||||
|
if cmd_path_list[0] == "power":
|
||||||
|
return pack_power_commands(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "pwr_ctrl":
|
||||||
|
return pack_power_ctrl_command(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "p60_dock":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(P60_DOCK_HANDLER))
|
||||||
|
return pack_p60dock_cmds(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "pdu1":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(PDU_1_HANDLER_ID))
|
||||||
|
return pack_pdu1_commands(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "pdu2":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(PDU_2_HANDLER_ID))
|
||||||
|
return pack_pdu2_commands(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "acu":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(ACU_HANDLER_ID))
|
||||||
|
return pack_acu_commands(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_tcs_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
|
||||||
|
obj_id_man = get_object_ids()
|
||||||
|
if len(cmd_path_list) == 1:
|
||||||
|
return pack_tcs_sys_commands(q=queue_helper, cmd_str=cmd_path_list[0])
|
||||||
|
assert len(cmd_path_list) >= 2
|
||||||
|
if cmd_path_list[0] == "tcs_brd_assy":
|
||||||
|
return pack_tcs_sys_commands(q=queue_helper, cmd_str=cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "rtd_devs":
|
||||||
|
assert len(cmd_path_list) >= 2
|
||||||
|
return pack_rtd_commands(
|
||||||
|
object_id=None, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "tcs_ctrl":
|
||||||
|
assert len(cmd_path_list) >= 2
|
||||||
|
return pack_tcs_ctrl_commands(q=queue_helper, cmd_str=cmd_path_list[2])
|
||||||
|
if cmd_path_list[0] == "tmp1075_devs":
|
||||||
|
menu_dict = {
|
||||||
|
"0": ("TMP1075 TCS Board 0", TMP1075_HANDLER_TCS_BRD_0_ID),
|
||||||
|
"1": ("TMP1075 TCS Board 1", TMP1075_HANDLER_TCS_BRD_1_ID),
|
||||||
|
"2": ("TMP1075 PL PCDU 0", TMP1075_HANDLER_PLPCDU_0_ID),
|
||||||
|
"3": ("TMP1075 PL PCDU 1", oids.TMP1075_HANDLER_PLPCDU_1_ID),
|
||||||
|
"4": ("TMP1075 IF Board", TMP1075_HANDLER_IF_BRD_ID),
|
||||||
|
}
|
||||||
|
input_helper = InputHelper(menu_dict)
|
||||||
|
tmp_select = input_helper.get_key()
|
||||||
|
assert len(cmd_path_list) >= 2
|
||||||
|
object_id = obj_id_man.get(menu_dict[tmp_select][1])
|
||||||
|
assert object_id is not None
|
||||||
|
return pack_tmp1075_test_into(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "heaters":
|
||||||
|
object_id = HEATER_CONTROLLER_ID
|
||||||
|
return pack_heater_cmds(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_acs_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
|
||||||
|
obj_id_man = get_object_ids()
|
||||||
|
if len(cmd_path_list) == 1:
|
||||||
|
return build_acs_subsystem_cmd(queue_helper, cmd_path_list[0])
|
||||||
|
assert len(cmd_path_list) >= 2
|
||||||
|
if cmd_path_list[0] == "mgt":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(IMTQ_HANDLER_ID))
|
||||||
|
return create_imtq_command(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "str":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(STAR_TRACKER_ID))
|
||||||
|
return pack_star_tracker_commands(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
|
||||||
|
if cmd_path_list[0] == "rws":
|
||||||
|
assert len(cmd_path_list) >= 2
|
||||||
|
if cmd_path_list[1] == "rw_assy":
|
||||||
|
assert len(cmd_path_list) >= 3
|
||||||
|
return pack_rw_ass_cmds(
|
||||||
|
q=queue_helper, object_id=RW_ASSEMBLY, cmd_str=cmd_path_list[2]
|
||||||
|
)
|
||||||
|
if cmd_path_list[1] == "rw_1":
|
||||||
|
assert len(cmd_path_list) >= 3
|
||||||
|
return create_single_rw_cmd(
|
||||||
|
object_id=RW1_ID, rw_idx=1, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||||
|
)
|
||||||
|
if cmd_path_list[1] == "rw_2":
|
||||||
|
assert len(cmd_path_list) >= 3
|
||||||
|
return create_single_rw_cmd(
|
||||||
|
object_id=RW2_ID, rw_idx=2, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||||
|
)
|
||||||
|
if cmd_path_list[1] == "rw_3":
|
||||||
|
assert len(cmd_path_list) >= 3
|
||||||
|
return create_single_rw_cmd(
|
||||||
|
object_id=RW3_ID, rw_idx=3, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||||
|
)
|
||||||
|
if cmd_path_list[1] == "rw_4":
|
||||||
|
assert len(cmd_path_list) >= 3
|
||||||
|
return create_single_rw_cmd(
|
||||||
|
object_id=RW4_ID, rw_idx=4, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||||
|
)
|
||||||
|
|
||||||
|
if cmd_path_list[0] == "gnss_devs":
|
||||||
|
return pack_gps_command(
|
||||||
|
object_id=oids.GPS_CONTROLLER, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "acs_brd_assy":
|
||||||
|
if len(cmd_path_list) == 2:
|
||||||
|
return pack_acs_board_command(q=queue_helper, cmd_str=cmd_path_list[1])
|
||||||
|
else:
|
||||||
|
if cmd_path_list[1] == "mgm_devs":
|
||||||
|
return handle_mgm_cmd(q=queue_helper, cmd_str=cmd_path_list[2])
|
||||||
|
if cmd_path_list[1] == "gyro_devs":
|
||||||
|
assert len(cmd_path_list) >= 3
|
||||||
|
return handle_gyr_cmd(q=queue_helper, cmd_str=cmd_path_list[2])
|
||||||
|
if cmd_path_list[0] == "str_img_helper":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(STR_IMG_HELPER_ID))
|
||||||
|
return pack_str_img_helper_command(
|
||||||
|
object_id=object_id, q=queue_helper, op_code=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "acs_ctrl":
|
||||||
|
return pack_acs_ctrl_command(queue_helper, cmd_path_list[1])
|
||||||
|
|
||||||
|
|
||||||
|
def handle_payload_procedure(
|
||||||
|
queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]
|
||||||
|
):
|
||||||
|
obj_id_man = get_object_ids()
|
||||||
|
if cmd_path_list[0] == "subsystem":
|
||||||
|
return create_payload_subsystem_cmd(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "ploc_mpsoc":
|
||||||
|
return pack_ploc_mpsoc_commands(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "ploc_supv":
|
||||||
|
return pack_ploc_supv_commands(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "rad_sensor":
|
||||||
|
assert len(cmd_path_list) >= 3
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(RAD_SENSOR_ID))
|
||||||
|
return create_rad_sensor_cmd(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "pl_pcdu":
|
||||||
|
return pack_pl_pcdu_commands(q=queue_helper, cmd_str=cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "scex":
|
||||||
|
return pack_scex_cmds(
|
||||||
|
cmd_str=cmd_path_list[1],
|
||||||
|
q=queue_helper,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_obdh_procedure(
|
||||||
|
queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]
|
||||||
|
):
|
||||||
|
assert len(cmd_path_list) >= 2
|
||||||
|
if cmd_path_list[0] == "core":
|
||||||
|
return pack_core_commands(q=queue_helper, cmd_str=cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "xiphos_wdt":
|
||||||
|
return pack_wdt_commands(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "time":
|
||||||
|
return pack_time_management_cmd(queue_helper, cmd_path_list[1])
|
||||||
|
if cmd_path_list[0] == "tm_store":
|
||||||
|
return pack_tm_store_commands(queue_helper, cmd_path_list[1])
|
||||||
|
|
||||||
|
|
||||||
|
def handle_com_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
|
||||||
|
obj_id_man = get_object_ids()
|
||||||
|
if len(cmd_path_list) == 1:
|
||||||
|
return build_com_subsystem_procedure(queue_helper, cmd_path_list[0])
|
||||||
|
assert len(cmd_path_list) >= 2
|
||||||
|
if cmd_path_list[0] == "ccsds":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(CCSDS_HANDLER_ID))
|
||||||
|
return pack_ccsds_handler_command(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "pdec":
|
||||||
|
return pack_pdec_handler_commands(
|
||||||
|
object_id=PDEC_HANDLER_ID, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||||
|
)
|
||||||
|
if cmd_path_list[0] == "syrlinks":
|
||||||
|
object_id = cast(ObjectIdU32, obj_id_man.get(SYRLINKS_HANDLER_ID))
|
||||||
|
return pack_syrlinks_command(
|
||||||
|
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||||
|
)
|
@ -1,220 +0,0 @@
|
|||||||
"""Hook function which packs telecommands based on service and operation code string
|
|
||||||
"""
|
|
||||||
import logging
|
|
||||||
from typing import cast
|
|
||||||
|
|
||||||
from eive_tmtc.tmtc.acs.gyros import handle_gyr_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.tcs.ctrl import pack_tcs_ctrl_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.tcs.subsystem import pack_tcs_sys_commands
|
|
||||||
from tmtccmd import DefaultProcedureInfo, TcHandlerBase
|
|
||||||
from tmtccmd.config import CoreServiceList
|
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
|
||||||
from tmtccmd.tmtc.decorator import (
|
|
||||||
route_to_registered_service_handlers,
|
|
||||||
ServiceProviderParams,
|
|
||||||
)
|
|
||||||
|
|
||||||
from eive_tmtc.tmtc.misc.s200_test import pack_service_200_test_into
|
|
||||||
from eive_tmtc.tmtc.power.p60dock import pack_p60dock_cmds
|
|
||||||
from eive_tmtc.tmtc.power.pdu2 import pack_pdu2_commands
|
|
||||||
from eive_tmtc.tmtc.power.pdu1 import pack_pdu1_commands
|
|
||||||
from eive_tmtc.tmtc.power.acu import pack_acu_commands
|
|
||||||
from eive_tmtc.tmtc.acs.imtq import pack_imtq_test_into
|
|
||||||
from eive_tmtc.tmtc.tcs.heater import pack_heater_cmds
|
|
||||||
from eive_tmtc.tmtc.acs.reaction_wheels import (
|
|
||||||
pack_single_rw_test_into,
|
|
||||||
pack_rw_ass_cmds,
|
|
||||||
)
|
|
||||||
from eive_tmtc.tmtc.payload.ploc_memory_dumper import pack_ploc_memory_dumper_cmd
|
|
||||||
from eive_tmtc.tmtc.com.ccsds_handler import pack_ccsds_handler_command
|
|
||||||
from eive_tmtc.tmtc.core import pack_core_commands
|
|
||||||
from eive_tmtc.tmtc.acs.star_tracker import pack_star_tracker_commands
|
|
||||||
from eive_tmtc.tmtc.com.syrlinks_handler import pack_syrlinks_command
|
|
||||||
from eive_tmtc.tmtc.com.pdec_handler import pack_pdec_handler_test
|
|
||||||
from eive_tmtc.tmtc.wdt import pack_wdt_commands
|
|
||||||
from eive_tmtc.tmtc.acs.acs_board import pack_acs_command
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import (
|
|
||||||
P60_DOCK_HANDLER,
|
|
||||||
PDU_1_HANDLER_ID,
|
|
||||||
PDU_2_HANDLER_ID,
|
|
||||||
ACU_HANDLER_ID,
|
|
||||||
TMP1075_HANDLER_TCS_BRD_0_ID,
|
|
||||||
TMP1075_HANDLER_TCS_BRD_1_ID,
|
|
||||||
TMP1075_HANDLER_PLPCDU_0_ID,
|
|
||||||
TMP1075_HANDLER_IF_BRD_ID,
|
|
||||||
HEATER_CONTROLLER_ID,
|
|
||||||
IMTQ_HANDLER_ID,
|
|
||||||
RW1_ID,
|
|
||||||
RW2_ID,
|
|
||||||
RW3_ID,
|
|
||||||
RW4_ID,
|
|
||||||
RAD_SENSOR_ID,
|
|
||||||
STAR_TRACKER_ID,
|
|
||||||
PLOC_MEMORY_DUMPER_ID,
|
|
||||||
CCSDS_HANDLER_ID,
|
|
||||||
PDEC_HANDLER_ID,
|
|
||||||
STR_IMG_HELPER_ID,
|
|
||||||
SYRLINKS_HANDLER_ID,
|
|
||||||
RW_ASSEMBLY,
|
|
||||||
get_object_ids,
|
|
||||||
)
|
|
||||||
|
|
||||||
from eive_tmtc.tmtc.tcs.tmp1075 import pack_tmp1075_test_into
|
|
||||||
from eive_tmtc.tmtc.acs.gps import pack_gps_command
|
|
||||||
from eive_tmtc.tmtc.payload.rad_sensor import pack_rad_sensor_test_into
|
|
||||||
from eive_tmtc.tmtc.payload.plpcdu import pack_pl_pcdu_commands
|
|
||||||
from eive_tmtc.tmtc.acs.str_img_helper import pack_str_img_helper_command
|
|
||||||
from eive_tmtc.pus_tc.system.proc import pack_proc_commands
|
|
||||||
|
|
||||||
import eive_tmtc.config.object_ids as oids
|
|
||||||
from tmtccmd.util import ObjectIdU32
|
|
||||||
|
|
||||||
from eive_tmtc.utility.input_helper import InputHelper
|
|
||||||
|
|
||||||
|
|
||||||
def handle_default_procedure( # noqa C901: Complexity okay here.
|
|
||||||
tc_base: TcHandlerBase,
|
|
||||||
info: DefaultProcedureInfo,
|
|
||||||
queue_helper: DefaultPusQueueHelper,
|
|
||||||
):
|
|
||||||
service = info.service
|
|
||||||
op_code = info.op_code
|
|
||||||
obj_id_man = get_object_ids()
|
|
||||||
if service == CoreServiceList.SERVICE_200.value:
|
|
||||||
return pack_service_200_test_into(q=queue_helper)
|
|
||||||
if service == CustomServiceList.P60DOCK.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(P60_DOCK_HANDLER))
|
|
||||||
return pack_p60dock_cmds(object_id=object_id, q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.RTD.value:
|
|
||||||
return pack_rtd_commands(object_id=None, q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.PDU1.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(PDU_1_HANDLER_ID))
|
|
||||||
return pack_pdu1_commands(object_id=object_id, q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.PDU2.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(PDU_2_HANDLER_ID))
|
|
||||||
return pack_pdu2_commands(object_id=object_id, q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.ACU.value:
|
|
||||||
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)
|
|
||||||
if service == CustomServiceList.TCS_SS.value:
|
|
||||||
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:
|
|
||||||
menu_dict = {
|
|
||||||
"0": ("TMP1075 TCS Board 0", TMP1075_HANDLER_TCS_BRD_0_ID),
|
|
||||||
"1": ("TMP1075 TCS Board 1", TMP1075_HANDLER_TCS_BRD_1_ID),
|
|
||||||
"2": ("TMP1075 PL PCDU 0", TMP1075_HANDLER_PLPCDU_0_ID),
|
|
||||||
"3": ("TMP1075 PL PCDU 1", oids.TMP1075_HANDLER_PLPCDU_1_ID),
|
|
||||||
"4": ("TMP1075 IF Board", TMP1075_HANDLER_IF_BRD_ID),
|
|
||||||
}
|
|
||||||
input_helper = InputHelper(menu_dict)
|
|
||||||
tmp_select = input_helper.get_key()
|
|
||||||
object_id = obj_id_man.get(menu_dict[tmp_select][1])
|
|
||||||
return pack_tmp1075_test_into(
|
|
||||||
object_id=object_id, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.HEATER.value:
|
|
||||||
object_id = HEATER_CONTROLLER_ID
|
|
||||||
return pack_heater_cmds(object_id=object_id, q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.IMTQ.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(IMTQ_HANDLER_ID))
|
|
||||||
return pack_imtq_test_into(object_id=object_id, q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.REACTION_WHEEL_1.value:
|
|
||||||
return pack_single_rw_test_into(
|
|
||||||
object_id=RW1_ID, rw_idx=1, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.REACTION_WHEEL_2.value:
|
|
||||||
return pack_single_rw_test_into(
|
|
||||||
object_id=RW2_ID, rw_idx=2, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.REACTION_WHEEL_3.value:
|
|
||||||
return pack_single_rw_test_into(
|
|
||||||
object_id=RW3_ID, rw_idx=3, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.REACTION_WHEEL_4.value:
|
|
||||||
return pack_single_rw_test_into(
|
|
||||||
object_id=RW4_ID, rw_idx=4, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.MGMS.value:
|
|
||||||
return handle_mgm_cmd(q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.RAD_SENSOR.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(RAD_SENSOR_ID))
|
|
||||||
return pack_rad_sensor_test_into(
|
|
||||||
object_id=object_id, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.STAR_TRACKER.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(STAR_TRACKER_ID))
|
|
||||||
return pack_star_tracker_commands(
|
|
||||||
object_id=object_id, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.STR_IMG_HELPER.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(STR_IMG_HELPER_ID))
|
|
||||||
return pack_str_img_helper_command(
|
|
||||||
object_id=object_id, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.CORE.value:
|
|
||||||
return pack_core_commands(q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.PLOC_MEMORY_DUMPER.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(PLOC_MEMORY_DUMPER_ID))
|
|
||||||
return pack_ploc_memory_dumper_cmd(
|
|
||||||
object_id=object_id, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.POWER.value:
|
|
||||||
return pack_power_commands(queue_helper, op_code)
|
|
||||||
if service == CustomServiceList.ACS.value:
|
|
||||||
return pack_acs_command(q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.GPS_CTRL.value:
|
|
||||||
return pack_gps_command(
|
|
||||||
object_id=oids.GPS_CONTROLLER, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.CCSDS_HANDLER.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(CCSDS_HANDLER_ID))
|
|
||||||
return pack_ccsds_handler_command(
|
|
||||||
object_id=object_id, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.PDEC_HANDLER.value:
|
|
||||||
return pack_pdec_handler_test(
|
|
||||||
object_id=PDEC_HANDLER_ID, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.SYRLINKS.value:
|
|
||||||
object_id = cast(ObjectIdU32, obj_id_man.get(SYRLINKS_HANDLER_ID))
|
|
||||||
return pack_syrlinks_command(
|
|
||||||
object_id=object_id, q=queue_helper, op_code=op_code
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.GYRO.value:
|
|
||||||
return handle_gyr_cmd(q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.PROCEDURE.value:
|
|
||||||
return pack_proc_commands(q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.PL_PCDU.value:
|
|
||||||
return pack_pl_pcdu_commands(q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.TCS_ASS.value:
|
|
||||||
return pack_tcs_sys_commands(q=queue_helper, op_code=op_code)
|
|
||||||
if service == CustomServiceList.RW_ASSEMBLY.value:
|
|
||||||
return pack_rw_ass_cmds(q=queue_helper, object_id=RW_ASSEMBLY, op_code=op_code)
|
|
||||||
if service == CustomServiceList.SCEX.value:
|
|
||||||
return pack_scex_cmds(
|
|
||||||
ServiceProviderParams(
|
|
||||||
handler_base=tc_base,
|
|
||||||
op_code=op_code,
|
|
||||||
info=info,
|
|
||||||
queue_helper=queue_helper,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if service == CustomServiceList.XIPHOS_WDT.value:
|
|
||||||
return pack_wdt_commands(queue_helper, op_code)
|
|
||||||
if not route_to_registered_service_handlers(
|
|
||||||
service,
|
|
||||||
ServiceProviderParams(
|
|
||||||
handler_base=tc_base,
|
|
||||||
op_code=op_code,
|
|
||||||
info=info,
|
|
||||||
queue_helper=queue_helper,
|
|
||||||
),
|
|
||||||
):
|
|
||||||
logging.getLogger(__name__).warning(f"Invalid Service {service}")
|
|
@ -34,9 +34,9 @@ from eive_tmtc.pus_tc.system.controllers import (
|
|||||||
pack_cmd_ctrl_to_off,
|
pack_cmd_ctrl_to_off,
|
||||||
pack_cmd_ctrl_to_nml,
|
pack_cmd_ctrl_to_nml,
|
||||||
)
|
)
|
||||||
from eive_tmtc.tmtc.acs.acs_board import pack_acs_command
|
from eive_tmtc.tmtc.acs.acs_board import pack_acs_board_command
|
||||||
from eive_tmtc.tmtc.acs.sus_board import pack_sus_cmds
|
from eive_tmtc.tmtc.acs.sus_board import pack_sus_cmds
|
||||||
from eive_tmtc.tmtc.acs.imtq import pack_imtq_test_into, pack_dipole_command
|
from eive_tmtc.tmtc.acs.imtq import create_imtq_command, pack_dipole_command
|
||||||
from eive_tmtc.tmtc.acs.star_tracker import pack_star_tracker_commands
|
from eive_tmtc.tmtc.acs.star_tracker import pack_star_tracker_commands
|
||||||
from eive_tmtc.tmtc.acs.reaction_wheels import pack_rw_ass_cmds, pack_set_speed_command
|
from eive_tmtc.tmtc.acs.reaction_wheels import pack_rw_ass_cmds, pack_set_speed_command
|
||||||
|
|
||||||
@ -312,7 +312,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
# Enable scheduling
|
# Enable scheduling
|
||||||
q.add_pus_tc(create_enable_tc_sched_cmd())
|
q.add_pus_tc(create_enable_tc_sched_cmd())
|
||||||
# check whether tcs_assembly also has to be commanded to NORMAL Mode
|
# check whether tcs_assembly also has to be commanded to NORMAL Mode
|
||||||
pack_tcs_sys_commands(q=q, op_code=TcsOpCodes.TCS_BOARD_ASS_NORMAL[0])
|
pack_tcs_sys_commands(q=q, cmd_str=TcsOpCodes.TCS_BOARD_ASS_NORMAL[0])
|
||||||
pack_cmd_ctrl_to_nml(q=q, object_id=obj_id_dict.get(oids.THERMAL_CONTROLLER_ID))
|
pack_cmd_ctrl_to_nml(q=q, object_id=obj_id_dict.get(oids.THERMAL_CONTROLLER_ID))
|
||||||
|
|
||||||
if op_code in OpCode.TV_TEARDOWN_TCS_FT_OFF:
|
if op_code in OpCode.TV_TEARDOWN_TCS_FT_OFF:
|
||||||
@ -337,7 +337,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
]
|
]
|
||||||
d_side_pairs = a_side_pairs + b_side_pairs
|
d_side_pairs = a_side_pairs + b_side_pairs
|
||||||
diag_list = [False, False, True, False, False]
|
diag_list = [False, False, True, False, False]
|
||||||
pack_acs_command(q=q, op_code="acs-a")
|
pack_acs_board_command(q=q, cmd_str="acs-a")
|
||||||
|
|
||||||
for a_side_dev in a_side_pairs:
|
for a_side_dev in a_side_pairs:
|
||||||
oid = a_side_dev[0]
|
oid = a_side_dev[0]
|
||||||
@ -351,9 +351,9 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg.default(),
|
cfg=GenericHkListeningCfg.default(),
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_acs_command(q=q, op_code="acs-off")
|
pack_acs_board_command(q=q, cmd_str="acs-off")
|
||||||
q.add_wait_seconds(5.0)
|
q.add_wait_seconds(5.0)
|
||||||
pack_acs_command(q=q, op_code="acs-b")
|
pack_acs_board_command(q=q, cmd_str="acs-b")
|
||||||
|
|
||||||
sid_list.clear()
|
sid_list.clear()
|
||||||
diag_list = [False, False, True, False, False]
|
diag_list = [False, False, True, False, False]
|
||||||
@ -370,9 +370,9 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg.default(),
|
cfg=GenericHkListeningCfg.default(),
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_acs_command(q=q, op_code="acs-off")
|
pack_acs_board_command(q=q, cmd_str="acs-off")
|
||||||
q.add_wait_seconds(5.0)
|
q.add_wait_seconds(5.0)
|
||||||
pack_acs_command(q=q, op_code="acs-d")
|
pack_acs_board_command(q=q, cmd_str="acs-d")
|
||||||
|
|
||||||
sid_list.clear()
|
sid_list.clear()
|
||||||
|
|
||||||
@ -400,7 +400,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg.default(),
|
cfg=GenericHkListeningCfg.default(),
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_acs_command(q=q, op_code="acs-off")
|
pack_acs_board_command(q=q, cmd_str="acs-off")
|
||||||
|
|
||||||
if op_code in OpCode.MGT_FT:
|
if op_code in OpCode.MGT_FT:
|
||||||
key = KAI.MGT_FT[0]
|
key = KAI.MGT_FT[0]
|
||||||
@ -416,10 +416,10 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
]
|
]
|
||||||
|
|
||||||
# Command MGT to mode on
|
# Command MGT to mode on
|
||||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="1")
|
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="1")
|
||||||
q.add_wait_seconds(5.0)
|
q.add_wait_seconds(5.0)
|
||||||
# Command MGT to normal mode
|
# Command MGT to normal mode
|
||||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="2")
|
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="2")
|
||||||
|
|
||||||
for imtq_dev in imtq_pairs:
|
for imtq_dev in imtq_pairs:
|
||||||
oid = imtq_dev[0]
|
oid = imtq_dev[0]
|
||||||
@ -433,7 +433,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg.default(),
|
cfg=GenericHkListeningCfg.default(),
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="0")
|
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="0")
|
||||||
|
|
||||||
if op_code in OpCode.MGT_FT_DP:
|
if op_code in OpCode.MGT_FT_DP:
|
||||||
key = KAI.MGT_FT_DP[0]
|
key = KAI.MGT_FT_DP[0]
|
||||||
@ -472,12 +472,12 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
True,
|
True,
|
||||||
True,
|
True,
|
||||||
]
|
]
|
||||||
pack_acs_command(q=q, op_code="acs-d")
|
pack_acs_board_command(q=q, cmd_str="acs-d")
|
||||||
# Command MGT to mode on
|
# Command MGT to mode on
|
||||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="1")
|
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="1")
|
||||||
q.add_wait_seconds(20.0)
|
q.add_wait_seconds(20.0)
|
||||||
# Command MGT to normal mode
|
# Command MGT to normal mode
|
||||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="2")
|
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="2")
|
||||||
|
|
||||||
for d_side_and_imtq_dev in d_side_and_imtq_pairs:
|
for d_side_and_imtq_dev in d_side_and_imtq_pairs:
|
||||||
oid = d_side_and_imtq_dev[0]
|
oid = d_side_and_imtq_dev[0]
|
||||||
@ -494,8 +494,8 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=cfg,
|
cfg=cfg,
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="0")
|
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="0")
|
||||||
pack_acs_command(q=q, op_code="acs-off")
|
pack_acs_board_command(q=q, cmd_str="acs-off")
|
||||||
|
|
||||||
if op_code in OpCode.SUS_FT:
|
if op_code in OpCode.SUS_FT:
|
||||||
key = KAI.SUS_FT[0]
|
key = KAI.SUS_FT[0]
|
||||||
@ -538,7 +538,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg.default(),
|
cfg=GenericHkListeningCfg.default(),
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_acs_command(q=q, op_code="sus-off")
|
pack_acs_board_command(q=q, cmd_str="sus-off")
|
||||||
q.add_wait_seconds(5.0)
|
q.add_wait_seconds(5.0)
|
||||||
pack_sus_cmds(q=q, op_code="sus-red")
|
pack_sus_cmds(q=q, op_code="sus-red")
|
||||||
|
|
||||||
@ -562,7 +562,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg.default(),
|
cfg=GenericHkListeningCfg.default(),
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_acs_command(q=q, op_code="sus-off")
|
pack_acs_board_command(q=q, cmd_str="sus-off")
|
||||||
q.add_wait_seconds(5.0)
|
q.add_wait_seconds(5.0)
|
||||||
pack_sus_cmds(q=q, op_code="sus-d")
|
pack_sus_cmds(q=q, op_code="sus-d")
|
||||||
|
|
||||||
@ -593,7 +593,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg.default(),
|
cfg=GenericHkListeningCfg.default(),
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_acs_command(q=q, op_code="sus-off")
|
pack_acs_board_command(q=q, cmd_str="sus-off")
|
||||||
|
|
||||||
if op_code in OpCode.SYRLINKS_FT:
|
if op_code in OpCode.SYRLINKS_FT:
|
||||||
key = KAI.SYRLINKS_FT[0]
|
key = KAI.SYRLINKS_FT[0]
|
||||||
@ -612,7 +612,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
if op_code in OpCode.STR_FT:
|
if op_code in OpCode.STR_FT:
|
||||||
key = KAI.STR_FT[0]
|
key = KAI.STR_FT[0]
|
||||||
|
|
||||||
pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, q=q, op_code="2")
|
pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, q=q, cmd_str="2")
|
||||||
|
|
||||||
# STR
|
# STR
|
||||||
sid_list.append(make_sid(oids.STAR_TRACKER_ID, StrSetIds.TEMPERATURE))
|
sid_list.append(make_sid(oids.STAR_TRACKER_ID, StrSetIds.TEMPERATURE))
|
||||||
@ -625,7 +625,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg.default(),
|
cfg=GenericHkListeningCfg.default(),
|
||||||
)
|
)
|
||||||
|
|
||||||
pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, q=q, op_code="3")
|
pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, q=q, cmd_str="3")
|
||||||
|
|
||||||
if op_code in OpCode.RW_FT_ONE_RW:
|
if op_code in OpCode.RW_FT_ONE_RW:
|
||||||
key = KAI.RW_FT_ONE_RW[0]
|
key = KAI.RW_FT_ONE_RW[0]
|
||||||
@ -658,7 +658,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
False,
|
False,
|
||||||
]
|
]
|
||||||
# RW NORMAL
|
# RW NORMAL
|
||||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, op_code="nml")
|
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, cmd_str="nml")
|
||||||
|
|
||||||
# RW HK für alle RWs nur einzeln
|
# RW HK für alle RWs nur einzeln
|
||||||
for rw_dev in rw_pairs:
|
for rw_dev in rw_pairs:
|
||||||
@ -673,7 +673,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg(mgt=False, one_rw=True, two_rws=False),
|
cfg=GenericHkListeningCfg(mgt=False, one_rw=True, two_rws=False),
|
||||||
)
|
)
|
||||||
# RW OFF
|
# RW OFF
|
||||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, op_code="off")
|
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, cmd_str="off")
|
||||||
|
|
||||||
# ass command with 2 rws to speed
|
# ass command with 2 rws to speed
|
||||||
if op_code in OpCode.RW_FT_TWO_RWS:
|
if op_code in OpCode.RW_FT_TWO_RWS:
|
||||||
@ -715,7 +715,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
False,
|
False,
|
||||||
]
|
]
|
||||||
# RW NORMAL
|
# RW NORMAL
|
||||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, op_code="nml")
|
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, cmd_str="nml")
|
||||||
|
|
||||||
# RW
|
# RW
|
||||||
for rw_dev in rw_pairs:
|
for rw_dev in rw_pairs:
|
||||||
@ -730,7 +730,7 @@ def pack_proc_commands( # noqa C901: Complexity is okay here.
|
|||||||
cfg=GenericHkListeningCfg(mgt=False, one_rw=False, two_rws=True),
|
cfg=GenericHkListeningCfg(mgt=False, one_rw=False, two_rws=True),
|
||||||
)
|
)
|
||||||
# RW OFF
|
# RW OFF
|
||||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, op_code="off")
|
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, cmd_str="off")
|
||||||
|
|
||||||
|
|
||||||
def enable_listen_to_hk_for_x_seconds(
|
def enable_listen_to_hk_for_x_seconds(
|
||||||
|
@ -6,10 +6,10 @@ from eive_tmtc.config.definitions import (
|
|||||||
PUS_APID,
|
PUS_APID,
|
||||||
CFDP_LOCAL_ENTITY_ID,
|
CFDP_LOCAL_ENTITY_ID,
|
||||||
)
|
)
|
||||||
from eive_tmtc.pus_tc.procedure_packer import handle_default_procedure
|
from eive_tmtc.pus_tc.cmd_demux import handle_pus_procedure
|
||||||
|
from eive_tmtc.cfdp.handler import CfdpInCcsdsHandler
|
||||||
from tmtccmd import TcHandlerBase, ProcedureWrapper
|
from tmtccmd import TcHandlerBase, ProcedureWrapper
|
||||||
from tmtccmd.cfdp.defs import CfdpRequestType
|
from cfdppy.defs import CfdpRequestType
|
||||||
from tmtccmd.cfdp.handler import CfdpInCcsdsHandler
|
|
||||||
from tmtccmd.logging import get_current_time_string
|
from tmtccmd.logging import get_current_time_string
|
||||||
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
|
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
|
||||||
from tmtccmd.tmtc import (
|
from tmtccmd.tmtc import (
|
||||||
@ -22,7 +22,7 @@ from tmtccmd.tmtc import (
|
|||||||
)
|
)
|
||||||
from tmtccmd.config.cfdp import generic_cfdp_params_to_put_request
|
from tmtccmd.config.cfdp import generic_cfdp_params_to_put_request
|
||||||
from spacepackets.ecss import PusVerificator
|
from spacepackets.ecss import PusVerificator
|
||||||
from tmtccmd.util import FileSeqCountProvider
|
from spacepackets.seqcount import FileSeqCountProvider
|
||||||
from spacepackets.cfdp import PduHolder, DirectiveType
|
from spacepackets.cfdp import PduHolder, DirectiveType
|
||||||
|
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ class TcHandler(TcHandlerBase):
|
|||||||
def feed_cb(self, info: ProcedureWrapper, wrapper: FeedWrapper):
|
def feed_cb(self, info: ProcedureWrapper, wrapper: FeedWrapper):
|
||||||
self.queue_helper.queue_wrapper = wrapper.queue_wrapper
|
self.queue_helper.queue_wrapper = wrapper.queue_wrapper
|
||||||
if info.proc_type == TcProcedureType.DEFAULT:
|
if info.proc_type == TcProcedureType.DEFAULT:
|
||||||
handle_default_procedure(self, info.to_def_procedure(), self.queue_helper)
|
handle_pus_procedure(info.to_def_procedure(), self.queue_helper)
|
||||||
elif info.proc_type == TcProcedureType.CFDP:
|
elif info.proc_type == TcProcedureType.CFDP:
|
||||||
self.handle_cfdp_procedure(info)
|
self.handle_cfdp_procedure(info)
|
||||||
|
|
||||||
@ -124,40 +124,38 @@ class TcHandler(TcHandlerBase):
|
|||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
f"CFDP: Starting file put request with parameters:\n{put_req}"
|
f"CFDP: Starting file put request with parameters:\n{put_req}"
|
||||||
)
|
)
|
||||||
|
assert put_req is not None
|
||||||
self.cfdp_in_ccsds_handler.cfdp_handler.put_request(put_req)
|
self.cfdp_in_ccsds_handler.cfdp_handler.put_request(put_req)
|
||||||
self.cfdp_handler_started = True
|
self.cfdp_handler_started = True
|
||||||
|
|
||||||
for source_pair, dest_pair in self.cfdp_in_ccsds_handler:
|
for source_pair, _ in self.cfdp_in_ccsds_handler:
|
||||||
pdu, sp = source_pair
|
if source_pair is not None:
|
||||||
pdu = cast(PduHolder, pdu)
|
pdu, sp = source_pair
|
||||||
if pdu.is_file_directive:
|
pdu = cast(PduHolder, pdu)
|
||||||
if pdu.pdu_directive_type == DirectiveType.METADATA_PDU:
|
if pdu.is_file_directive:
|
||||||
metadata = pdu.to_metadata_pdu()
|
if pdu.pdu_directive_type == DirectiveType.METADATA_PDU:
|
||||||
|
metadata = pdu.to_metadata_pdu()
|
||||||
|
self.queue_helper.add_log_cmd(
|
||||||
|
"CFDP Source: Sending Metadata PDU for file with size "
|
||||||
|
f"{metadata.file_size}"
|
||||||
|
)
|
||||||
|
elif pdu.pdu_directive_type == DirectiveType.EOF_PDU:
|
||||||
|
self.queue_helper.add_log_cmd(
|
||||||
|
"CFDP Source: Sending EOF PDU"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
fd_pdu = pdu.to_file_data_pdu()
|
||||||
self.queue_helper.add_log_cmd(
|
self.queue_helper.add_log_cmd(
|
||||||
"CFDP Source: Sending Metadata PDU for file with size "
|
"CFDP Source: Sending File Data PDU for segment at offset "
|
||||||
f"{metadata.file_size}"
|
f"{fd_pdu.offset} with length {len(fd_pdu.file_data)}"
|
||||||
)
|
)
|
||||||
elif pdu.pdu_directive_type == DirectiveType.EOF_PDU:
|
self.queue_helper.add_ccsds_tc(sp)
|
||||||
self.queue_helper.add_log_cmd(
|
|
||||||
"CFDP Source: Sending EOF PDU"
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
fd_pdu = pdu.to_file_data_pdu()
|
|
||||||
self.queue_helper.add_log_cmd(
|
|
||||||
"CFDP Source: Sending File Data PDU for segment at offset "
|
|
||||||
f"{fd_pdu.offset} with length {len(fd_pdu.file_data)}"
|
|
||||||
)
|
|
||||||
self.queue_helper.add_ccsds_tc(sp)
|
|
||||||
self.cfdp_in_ccsds_handler.confirm_source_packet_sent()
|
|
||||||
self.cfdp_in_ccsds_handler.source_handler.state_machine()
|
self.cfdp_in_ccsds_handler.source_handler.state_machine()
|
||||||
|
|
||||||
def queue_finished_cb(self, info: ProcedureWrapper):
|
def queue_finished_cb(self, info: ProcedureWrapper):
|
||||||
if info is not None:
|
if info is not None:
|
||||||
if info.proc_type == TcQueueEntryType.PUS_TC:
|
if info.proc_type == TcQueueEntryType.PUS_TC:
|
||||||
def_proc = info.to_def_procedure()
|
def_proc = info.to_def_procedure()
|
||||||
_LOGGER.info(
|
_LOGGER.info(f"Finished queue for command {def_proc.cmd_path}")
|
||||||
f"Finished queue for service {def_proc.service} and op code"
|
|
||||||
f" {def_proc.op_code}"
|
|
||||||
)
|
|
||||||
elif info.proc_type == TcProcedureType.CFDP:
|
elif info.proc_type == TcProcedureType.CFDP:
|
||||||
_LOGGER.info("Finished CFDP queue")
|
_LOGGER.info("Finished CFDP queue")
|
||||||
|
@ -122,12 +122,18 @@ def handle_event_packet( # noqa C901: Complexity okay here
|
|||||||
new_time_dt = datetime.datetime.fromtimestamp(new_time, datetime.timezone.utc)
|
new_time_dt = datetime.datetime.fromtimestamp(new_time, datetime.timezone.utc)
|
||||||
pw.dlog(f"Old time (UTC): {old_time_dt}")
|
pw.dlog(f"Old time (UTC): {old_time_dt}")
|
||||||
pw.dlog(f"New time (UTC): {new_time_dt}")
|
pw.dlog(f"New time (UTC): {new_time_dt}")
|
||||||
if info.name == "CLOCK_DUMP":
|
if info.name == "CLOCK_DUMP_LEGACY":
|
||||||
specific_handler = True
|
specific_handler = True
|
||||||
# param 1 is timeval seconds, param 2 is timeval subsecond milliseconds
|
# param 1 is timeval seconds, param 2 is timeval subsecond milliseconds
|
||||||
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 == "CLOCK_DUMP":
|
||||||
|
specific_handler = True
|
||||||
|
# param 1 is timeval seconds, param 2 is timeval subsecond microseconds
|
||||||
|
time = event_def.param1 + event_def.param2 / 1000000.0
|
||||||
|
time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc)
|
||||||
|
pw.dlog(f"Current time: {time_dt}")
|
||||||
if info.name == "ACTIVE_SD_INFO":
|
if info.name == "ACTIVE_SD_INFO":
|
||||||
sd_0_state = (event_def.param2 >> 16) & 0xFFFF
|
sd_0_state = (event_def.param2 >> 16) & 0xFFFF
|
||||||
sd_1_state = event_def.param2 & 0xFFFF
|
sd_1_state = event_def.param2 & 0xFFFF
|
||||||
|
21
eive_tmtc/pus_tm/hk.py
Normal file
21
eive_tmtc/pus_tm/hk.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import uuid
|
||||||
|
import dataclasses
|
||||||
|
import datetime
|
||||||
|
import sqlite3
|
||||||
|
from tmtccmd.pus.tm.s3_fsfw_hk import Service3FsfwTm
|
||||||
|
|
||||||
|
|
||||||
|
@dataclasses.dataclass
|
||||||
|
class HkTmInfo:
|
||||||
|
packet_uuid: uuid.UUID
|
||||||
|
hk_packet: Service3FsfwTm
|
||||||
|
db_con: sqlite3.Connection
|
||||||
|
hk_data: bytes
|
||||||
|
|
||||||
|
@property
|
||||||
|
def packet_datetime(self) -> datetime.datetime:
|
||||||
|
return self.hk_packet.pus_tm.time_provider.as_datetime()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def set_id(self) -> int:
|
||||||
|
return self.hk_packet.set_id
|
@ -1,7 +1,12 @@
|
|||||||
"""HK Handling for EIVE OBSW"""
|
"""HK Handling for EIVE OBSW"""
|
||||||
|
|
||||||
import dataclasses
|
import dataclasses
|
||||||
import logging
|
import logging
|
||||||
from typing import List
|
import base64 # noqa
|
||||||
|
import sqlite3
|
||||||
|
from typing import List, cast
|
||||||
|
from uuid import UUID
|
||||||
|
from eive_tmtc.pus_tm.hk import HkTmInfo
|
||||||
|
|
||||||
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
|
||||||
@ -17,12 +22,10 @@ from eive_tmtc.tmtc.power.pwr_ctrl import handle_pwr_ctrl_hk_data
|
|||||||
from eive_tmtc.tmtc.com.syrlinks_handler import handle_syrlinks_hk_data
|
from eive_tmtc.tmtc.com.syrlinks_handler import handle_syrlinks_hk_data
|
||||||
from eive_tmtc.tmtc.tcs import handle_thermal_controller_hk_data
|
from eive_tmtc.tmtc.tcs import handle_thermal_controller_hk_data
|
||||||
from eive_tmtc.tmtc.tcs.tmp1075 import handle_tmp_1075_hk_data
|
from eive_tmtc.tmtc.tcs.tmp1075 import handle_tmp_1075_hk_data
|
||||||
from spacepackets.ecss import PusTelemetry
|
|
||||||
from tmtccmd.pus.tm.s3_fsfw_hk import (
|
from tmtccmd.pus.tm.s3_fsfw_hk import (
|
||||||
Service3Base,
|
|
||||||
HkContentType,
|
|
||||||
Service3FsfwTm,
|
Service3FsfwTm,
|
||||||
)
|
)
|
||||||
|
from tmtccmd.pus.tm.s3_hk_base import HkContentType
|
||||||
from tmtccmd.util.obj_id import ObjectIdU32, ObjectIdDictT
|
from tmtccmd.util.obj_id import ObjectIdU32, ObjectIdDictT
|
||||||
|
|
||||||
from eive_tmtc.tmtc.power.bpx_batt import handle_bpx_hk_data
|
from eive_tmtc.tmtc.power.bpx_batt import handle_bpx_hk_data
|
||||||
@ -51,31 +54,34 @@ FORWARD_SENSOR_TEMPS = False
|
|||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
class HkFilter:
|
class HkFilter:
|
||||||
object_ids: List[ObjectIdU32]
|
object_ids: List[bytes]
|
||||||
set_ids: List[int]
|
set_ids: List[int]
|
||||||
|
|
||||||
|
|
||||||
def handle_hk_packet(
|
def handle_hk_packet(
|
||||||
raw_tm: bytes,
|
raw_tm: bytes,
|
||||||
|
packet_uuid: UUID,
|
||||||
obj_id_dict: ObjectIdDictT,
|
obj_id_dict: ObjectIdDictT,
|
||||||
printer: FsfwTmTcPrinter,
|
printer: FsfwTmTcPrinter,
|
||||||
hk_filter: HkFilter,
|
hk_filter: HkFilter,
|
||||||
hk_level: int,
|
hk_level: int,
|
||||||
|
db_con: sqlite3.Connection,
|
||||||
):
|
):
|
||||||
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 = cast(ObjectIdU32, obj_id_dict.get(tm_packet.object_id.as_bytes))
|
||||||
if named_obj_id is None:
|
if named_obj_id is None:
|
||||||
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 named_obj_id.as_bytes in hk_filter.object_ids:
|
||||||
if named_obj_id in hk_filter.object_ids:
|
# print(f"PUS TM Base64: {base64.b64encode(raw_tm)}")
|
||||||
handle_regular_hk_print(
|
handle_regular_hk_print(
|
||||||
printer=printer,
|
printer=printer,
|
||||||
|
packet_uuid=packet_uuid,
|
||||||
object_id=named_obj_id,
|
object_id=named_obj_id,
|
||||||
hk_packet=tm_packet,
|
hk_packet=tm_packet,
|
||||||
tm=tm_packet.pus_tm,
|
|
||||||
hk_data=hk_data,
|
hk_data=hk_data,
|
||||||
|
db=db_con,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
@ -86,10 +92,11 @@ def handle_hk_packet(
|
|||||||
if hk_level >= 1:
|
if hk_level >= 1:
|
||||||
handle_regular_hk_print(
|
handle_regular_hk_print(
|
||||||
printer=printer,
|
printer=printer,
|
||||||
|
packet_uuid=packet_uuid,
|
||||||
object_id=named_obj_id,
|
object_id=named_obj_id,
|
||||||
hk_packet=tm_packet,
|
hk_packet=tm_packet,
|
||||||
tm=tm_packet.pus_tm,
|
|
||||||
hk_data=hk_data,
|
hk_data=hk_data,
|
||||||
|
db=db_con,
|
||||||
)
|
)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
@ -100,26 +107,37 @@ def handle_hk_packet(
|
|||||||
|
|
||||||
|
|
||||||
def handle_regular_hk_print( # noqa C901: Complexity okay here
|
def handle_regular_hk_print( # noqa C901: Complexity okay here
|
||||||
printer: FsfwTmTcPrinter,
|
hk_packet: Service3FsfwTm,
|
||||||
object_id: ObjectIdU32,
|
packet_uuid: UUID,
|
||||||
hk_packet: Service3Base,
|
|
||||||
tm: PusTelemetry,
|
|
||||||
hk_data: bytes,
|
hk_data: bytes,
|
||||||
|
db: sqlite3.Connection,
|
||||||
|
object_id: ObjectIdU32,
|
||||||
|
printer: FsfwTmTcPrinter,
|
||||||
):
|
):
|
||||||
objb = object_id.as_bytes
|
objb = object_id.as_bytes
|
||||||
set_id = hk_packet.set_id
|
set_id = hk_packet.set_id
|
||||||
packet_dt = tm.time_provider.as_date_time()
|
hk_info = HkTmInfo(
|
||||||
|
packet_uuid=packet_uuid, hk_packet=hk_packet, db_con=db, hk_data=hk_data
|
||||||
|
)
|
||||||
|
assert hk_packet.pus_tm.time_provider is not None
|
||||||
|
packet_dt = hk_packet.pus_tm.time_provider.as_date_time()
|
||||||
pw = PrintWrapper(printer.file_logger)
|
pw = PrintWrapper(printer.file_logger)
|
||||||
"""This function is called when a Service 3 Housekeeping packet is received."""
|
"""This function is called when a Service 3 Housekeeping packet is received."""
|
||||||
if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
|
if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
|
||||||
return handle_rw_hk_data(pw, object_id, set_id, hk_data)
|
return handle_rw_hk_data(pw, object_id, set_id, hk_data)
|
||||||
elif objb == obj_ids.SYRLINKS_HANDLER_ID:
|
elif objb == obj_ids.SYRLINKS_HANDLER_ID:
|
||||||
return handle_syrlinks_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_syrlinks_hk_data(
|
||||||
|
hk_info=hk_info,
|
||||||
|
pw=pw,
|
||||||
|
)
|
||||||
elif objb == obj_ids.IMTQ_HANDLER_ID:
|
elif objb == obj_ids.IMTQ_HANDLER_ID:
|
||||||
return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id)
|
||||||
elif objb == obj_ids.GPS_CONTROLLER:
|
elif objb == obj_ids.GPS_CONTROLLER:
|
||||||
return handle_gps_data(
|
return handle_gps_data(
|
||||||
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
|
pw=pw,
|
||||||
|
set_id=set_id,
|
||||||
|
hk_data=hk_data,
|
||||||
|
packet_time=packet_dt,
|
||||||
)
|
)
|
||||||
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)
|
||||||
@ -128,9 +146,21 @@ def handle_regular_hk_print( # noqa C901: Complexity okay here
|
|||||||
elif objb == obj_ids.CORE_CONTROLLER_ID:
|
elif objb == obj_ids.CORE_CONTROLLER_ID:
|
||||||
return handle_core_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_core_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
||||||
elif objb == obj_ids.PDU_1_HANDLER_ID:
|
elif objb == obj_ids.PDU_1_HANDLER_ID:
|
||||||
return handle_pdu_data(pw=pw, pdu_idx=1, set_id=set_id, hk_data=hk_data)
|
return handle_pdu_data(
|
||||||
|
hk_info=hk_info,
|
||||||
|
pw=pw,
|
||||||
|
pdu_idx=1,
|
||||||
|
set_id=set_id,
|
||||||
|
hk_data=hk_data,
|
||||||
|
)
|
||||||
elif objb == obj_ids.PDU_2_HANDLER_ID:
|
elif objb == obj_ids.PDU_2_HANDLER_ID:
|
||||||
return handle_pdu_data(pw=pw, pdu_idx=2, set_id=set_id, hk_data=hk_data)
|
return handle_pdu_data(
|
||||||
|
hk_info=hk_info,
|
||||||
|
pw=pw,
|
||||||
|
pdu_idx=2,
|
||||||
|
set_id=set_id,
|
||||||
|
hk_data=hk_data,
|
||||||
|
)
|
||||||
elif objb == obj_ids.PLOC_MPSOC_ID:
|
elif objb == obj_ids.PLOC_MPSOC_ID:
|
||||||
return handle_ploc_mpsoc_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_ploc_mpsoc_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
||||||
elif objb == obj_ids.ACU_HANDLER_ID:
|
elif objb == obj_ids.ACU_HANDLER_ID:
|
||||||
|
@ -1,126 +0,0 @@
|
|||||||
"""Core EIVE TM handler module
|
|
||||||
"""
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from spacepackets.ccsds.time import CdsShortTimestamp
|
|
||||||
from spacepackets.ecss import PusTelemetry
|
|
||||||
from spacepackets.ecss.pus_17_test import Service17Tm
|
|
||||||
from spacepackets.util import PrintFormats
|
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
|
||||||
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
|
|
||||||
from tmtccmd.pus import VerificationWrapper
|
|
||||||
from tmtccmd.pus.s20_fsfw_param import Service20FsfwTm, Service20ParamDumpWrapper
|
|
||||||
from tmtccmd.pus.s20_fsfw_param_defs import CustomSubservice as ParamSubservice
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Service200FsfwTm
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservice
|
|
||||||
|
|
||||||
from eive_tmtc.config.object_ids import get_object_ids
|
|
||||||
|
|
||||||
from .action_reply_handler import handle_action_reply
|
|
||||||
from .defs import PrintWrapper
|
|
||||||
from .event_handler import handle_event_packet
|
|
||||||
from .hk_handler import HkFilter, handle_hk_packet
|
|
||||||
from .verification_handler import generic_retval_printout, handle_service_1_fsfw_packet
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
def pus_factory_hook( # noqa C901 : Complexity okay here
|
|
||||||
packet: bytes,
|
|
||||||
verif_wrapper: VerificationWrapper,
|
|
||||||
printer: FsfwTmTcPrinter,
|
|
||||||
raw_logger: RawTmtcTimedLogWrapper,
|
|
||||||
hk_level: int,
|
|
||||||
hk_filter: HkFilter,
|
|
||||||
):
|
|
||||||
if len(packet) < 8:
|
|
||||||
_LOGGER.warning("Detected packet shorter than 8 bytes!")
|
|
||||||
return
|
|
||||||
try:
|
|
||||||
tm_packet = PusTelemetry.unpack(packet, CdsShortTimestamp.empty())
|
|
||||||
# _LOGGER.info(f"Sequence count: {tm_packet.seq_count}")
|
|
||||||
except ValueError as value_error:
|
|
||||||
_LOGGER.warning(f"{value_error}")
|
|
||||||
_LOGGER.warning("Could not generate PUS TM object from raw data")
|
|
||||||
_LOGGER.warning(f"Raw Packet: [{packet.hex(sep=',')}], REPR: {packet!r}")
|
|
||||||
return
|
|
||||||
service = tm_packet.service
|
|
||||||
obj_id_dict = get_object_ids()
|
|
||||||
pw = PrintWrapper(printer.file_logger)
|
|
||||||
dedicated_handler = True
|
|
||||||
if service == 1:
|
|
||||||
handle_service_1_fsfw_packet(wrapper=verif_wrapper, raw_tm=packet)
|
|
||||||
elif service == 3:
|
|
||||||
handle_hk_packet(
|
|
||||||
printer=printer,
|
|
||||||
raw_tm=packet,
|
|
||||||
obj_id_dict=obj_id_dict,
|
|
||||||
hk_level=hk_level,
|
|
||||||
hk_filter=hk_filter,
|
|
||||||
)
|
|
||||||
elif service == 5:
|
|
||||||
handle_event_packet(raw_tm=packet, pw=pw)
|
|
||||||
elif service == 8:
|
|
||||||
handle_action_reply(raw_tm=packet, printer=printer, obj_id_dict=obj_id_dict)
|
|
||||||
elif service == 17:
|
|
||||||
tm_packet = Service17Tm.unpack(
|
|
||||||
data=packet, time_reader=CdsShortTimestamp.empty()
|
|
||||||
)
|
|
||||||
if tm_packet.subservice == 2:
|
|
||||||
verif_wrapper.dlog("Received Ping Reply TM[17,2]")
|
|
||||||
dedicated_handler = True
|
|
||||||
elif service == 20:
|
|
||||||
param_packet = Service20FsfwTm.unpack(
|
|
||||||
raw_telemetry=packet, time_reader=CdsShortTimestamp.empty()
|
|
||||||
)
|
|
||||||
if tm_packet.subservice == ParamSubservice.TM_DUMP_REPLY:
|
|
||||||
param_wrapper = Service20ParamDumpWrapper(param_tm=param_packet)
|
|
||||||
try:
|
|
||||||
param = param_wrapper.get_param()
|
|
||||||
obj = obj_id_dict.get(param_wrapper.param_tm.object_id)
|
|
||||||
pw.dlog(f"Received parameter dump TM from {obj}")
|
|
||||||
pw.dlog(f"Parameter: {param}")
|
|
||||||
if param.rows == 1 and param.columns == 1:
|
|
||||||
try:
|
|
||||||
scalar_param = param.parse_scalar_param()
|
|
||||||
if isinstance(scalar_param, int):
|
|
||||||
pw.dlog(f"Scalar integer parameter: {scalar_param}")
|
|
||||||
elif isinstance(scalar_param, float):
|
|
||||||
pw.dlog(f"Scalar floating point parameter: {scalar_param}")
|
|
||||||
except ValueError as e:
|
|
||||||
pw.dlog(f"received {e} trying to parse scalar parameter")
|
|
||||||
else:
|
|
||||||
# TODO: Could improve display further by actually displaying a matrix as a
|
|
||||||
# matrix using row and column information
|
|
||||||
pw.dlog(
|
|
||||||
"Received vector or matrix data:"
|
|
||||||
f" {param.param_raw.hex(sep=',')}"
|
|
||||||
)
|
|
||||||
except ValueError as e:
|
|
||||||
pw.dlog(f"received {e} when trying to parse parameters")
|
|
||||||
except NotImplementedError as e:
|
|
||||||
pw.dlog(f"received {e} when trying to parse parameters")
|
|
||||||
else:
|
|
||||||
pw.dlog(f"unknown subservice {tm_packet.subservice} for parameter service")
|
|
||||||
elif service == 200:
|
|
||||||
tm_packet = Service200FsfwTm.unpack(
|
|
||||||
raw_telemetry=packet, time_reader=CdsShortTimestamp.empty()
|
|
||||||
)
|
|
||||||
if tm_packet.subservice == ModeSubservice.TM_CANT_REACH_MODE:
|
|
||||||
obj_id = tm_packet.object_id
|
|
||||||
obj_id_obj = obj_id_dict.get(obj_id)
|
|
||||||
retval = tm_packet.return_value
|
|
||||||
string_list = generic_retval_printout(retval)
|
|
||||||
pw.dlog(f"Received Mode Reply from {obj_id_obj}: Can't reach mode.")
|
|
||||||
for string in string_list:
|
|
||||||
pw.dlog(f"Reason: {string}")
|
|
||||||
dedicated_handler = True
|
|
||||||
else:
|
|
||||||
dedicated_handler = False
|
|
||||||
else:
|
|
||||||
_LOGGER.info(f"The service {service} is not implemented in Telemetry Factory")
|
|
||||||
tm_packet.print_source_data(PrintFormats.HEX)
|
|
||||||
dedicated_handler = True
|
|
||||||
if not dedicated_handler and tm_packet is not None:
|
|
||||||
printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
|
|
||||||
raw_logger.log_tm(tm_packet)
|
|
211
eive_tmtc/pus_tm/pus_handler.py
Normal file
211
eive_tmtc/pus_tm/pus_handler.py
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
"""Core EIVE TM handler module
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import sqlite3
|
||||||
|
import uuid
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from spacepackets.ccsds.time import CdsShortTimestamp
|
||||||
|
from spacepackets.ecss import PusTelemetry
|
||||||
|
from spacepackets.ecss.pus_17_test import Service17Tm
|
||||||
|
from spacepackets.util import PrintFormats
|
||||||
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
|
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
|
||||||
|
from tmtccmd.pus import VerificationWrapper
|
||||||
|
from tmtccmd.pus.s20_fsfw_param import Service20FsfwTm, Service20ParamDumpWrapper
|
||||||
|
from tmtccmd.pus.s20_fsfw_param_defs import CustomSubservice as ParamSubservice
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import Service200FsfwTm
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservice
|
||||||
|
from tmtccmd.tmtc import GenericApidHandlerBase, SpecificApidHandlerBase
|
||||||
|
from eive_tmtc.config.definitions import TM_DB_PATH, PUS_APID
|
||||||
|
|
||||||
|
from eive_tmtc.config.object_ids import get_object_ids
|
||||||
|
|
||||||
|
from .action_reply_handler import handle_action_reply
|
||||||
|
from .defs import PrintWrapper
|
||||||
|
from .event_handler import handle_event_packet
|
||||||
|
from .hk_handler import HkFilter, handle_hk_packet
|
||||||
|
from .verification_handler import generic_retval_printout, handle_service_1_fsfw_packet
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class PusHandler(SpecificApidHandlerBase):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
wrapper: VerificationWrapper,
|
||||||
|
printer: FsfwTmTcPrinter,
|
||||||
|
raw_logger: RawTmtcTimedLogWrapper,
|
||||||
|
hk_level: int,
|
||||||
|
):
|
||||||
|
super().__init__(PUS_APID, None)
|
||||||
|
self.printer = printer
|
||||||
|
self.verif_wrapper = wrapper
|
||||||
|
self.raw_logger = raw_logger
|
||||||
|
self.hk_level = hk_level
|
||||||
|
self.these_objs_hk_only = []
|
||||||
|
self.hk_filter = HkFilter(object_ids=self.these_objs_hk_only, set_ids=[])
|
||||||
|
self.obj_id_dict = get_object_ids()
|
||||||
|
self.pw = PrintWrapper(printer.file_logger)
|
||||||
|
|
||||||
|
def handle_tm(self, packet: bytes, _user_args: Any):
|
||||||
|
self.pus_handler(
|
||||||
|
packet,
|
||||||
|
)
|
||||||
|
|
||||||
|
def pus_handler( # noqa C901 : Complexity okay here
|
||||||
|
self,
|
||||||
|
packet: bytes,
|
||||||
|
):
|
||||||
|
packet_uuid = uuid.uuid4()
|
||||||
|
if len(packet) < 8:
|
||||||
|
_LOGGER.warning("Detected packet shorter than 8 bytes!")
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
tm_packet = PusTelemetry.unpack(packet, CdsShortTimestamp.empty())
|
||||||
|
# _LOGGER.info(f"Sequence count: {tm_packet.seq_count}")
|
||||||
|
except ValueError as value_error:
|
||||||
|
_LOGGER.warning(f"{value_error}")
|
||||||
|
_LOGGER.warning("Could not generate PUS TM object from raw data")
|
||||||
|
_LOGGER.warning(f"Raw Packet: [{packet.hex(sep=',')}], REPR: {packet!r}")
|
||||||
|
return
|
||||||
|
db_con = sqlite3.connect(TM_DB_PATH)
|
||||||
|
self._store_packet_in_db(db_con, packet, tm_packet, packet_uuid)
|
||||||
|
service = tm_packet.service
|
||||||
|
dedicated_handler = True
|
||||||
|
if service == 1:
|
||||||
|
handle_service_1_fsfw_packet(wrapper=self.verif_wrapper, raw_tm=packet)
|
||||||
|
elif service == 3:
|
||||||
|
handle_hk_packet(
|
||||||
|
db_con=db_con,
|
||||||
|
packet_uuid=packet_uuid,
|
||||||
|
printer=self.printer,
|
||||||
|
raw_tm=packet,
|
||||||
|
obj_id_dict=self.obj_id_dict,
|
||||||
|
hk_level=self.hk_level,
|
||||||
|
hk_filter=self.hk_filter,
|
||||||
|
)
|
||||||
|
elif service == 5:
|
||||||
|
handle_event_packet(raw_tm=packet, pw=self.pw)
|
||||||
|
elif service == 8:
|
||||||
|
handle_action_reply(
|
||||||
|
raw_tm=packet, printer=self.printer, obj_id_dict=self.obj_id_dict
|
||||||
|
)
|
||||||
|
elif service == 17:
|
||||||
|
pus17_tm = Service17Tm.unpack(
|
||||||
|
data=packet, time_reader=CdsShortTimestamp.empty()
|
||||||
|
)
|
||||||
|
if pus17_tm.subservice == 2:
|
||||||
|
self.verif_wrapper.dlog("Received Ping Reply TM[17,2]")
|
||||||
|
dedicated_handler = True
|
||||||
|
elif service == 20:
|
||||||
|
self._handle_param_packet(packet, tm_packet)
|
||||||
|
elif service == 200:
|
||||||
|
dedicated_handler = self._handle_mode_packet(packet, tm_packet)
|
||||||
|
else:
|
||||||
|
_LOGGER.info(
|
||||||
|
f"The service {service} is not implemented in Telemetry Factory"
|
||||||
|
)
|
||||||
|
tm_packet.print_source_data(PrintFormats.HEX)
|
||||||
|
dedicated_handler = True
|
||||||
|
if not dedicated_handler and tm_packet is not None:
|
||||||
|
_LOGGER.info(
|
||||||
|
f"TM [{service},{tm_packet.subservice}] does not have a dedicated handler"
|
||||||
|
)
|
||||||
|
self.raw_logger.log_tm(tm_packet)
|
||||||
|
|
||||||
|
def _store_packet_in_db(
|
||||||
|
self,
|
||||||
|
db_con: sqlite3.Connection,
|
||||||
|
packet: bytes,
|
||||||
|
tm_packet: PusTelemetry,
|
||||||
|
packet_uuid: uuid.UUID,
|
||||||
|
):
|
||||||
|
cursor = db_con.cursor()
|
||||||
|
assert tm_packet.time_provider is not None
|
||||||
|
cursor.execute(
|
||||||
|
"""
|
||||||
|
CREATE TABLE IF NOT EXISTS pus_tm(
|
||||||
|
packet_uuid TEXT PRIMARY KEY,
|
||||||
|
generation_time TEXT,
|
||||||
|
service NUM,
|
||||||
|
subservice NUM,
|
||||||
|
data_len NUM,
|
||||||
|
raw_data BLOB
|
||||||
|
)"""
|
||||||
|
)
|
||||||
|
cursor.execute(
|
||||||
|
"INSERT INTO pus_tm VALUES(?, ?, ?, ?, ?, ?)",
|
||||||
|
(
|
||||||
|
str(packet_uuid),
|
||||||
|
tm_packet.time_provider.as_datetime(),
|
||||||
|
tm_packet.service,
|
||||||
|
tm_packet.subservice,
|
||||||
|
len(packet),
|
||||||
|
packet,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
db_con.commit()
|
||||||
|
|
||||||
|
def _handle_param_packet(self, raw_data: bytes, tm_packet: PusTelemetry):
|
||||||
|
param_packet = Service20FsfwTm.unpack(
|
||||||
|
raw_telemetry=raw_data, time_reader=CdsShortTimestamp.empty()
|
||||||
|
)
|
||||||
|
if tm_packet.subservice == ParamSubservice.TM_DUMP_REPLY:
|
||||||
|
param_wrapper = Service20ParamDumpWrapper(param_tm=param_packet)
|
||||||
|
try:
|
||||||
|
param = param_wrapper.get_param()
|
||||||
|
obj = self.obj_id_dict.get(param_wrapper.param_tm.object_id)
|
||||||
|
self.pw.dlog(f"Received parameter dump TM from {obj}")
|
||||||
|
self.pw.dlog(f"Parameter: {param}")
|
||||||
|
if param.rows == 1 and param.columns == 1:
|
||||||
|
try:
|
||||||
|
scalar_param = param.parse_scalar_param()
|
||||||
|
if isinstance(scalar_param, int):
|
||||||
|
self.pw.dlog(f"Scalar integer parameter: {scalar_param}")
|
||||||
|
elif isinstance(scalar_param, float):
|
||||||
|
self.pw.dlog(
|
||||||
|
f"Scalar floating point parameter: {scalar_param}"
|
||||||
|
)
|
||||||
|
except ValueError as e:
|
||||||
|
self.pw.dlog(f"received {e} trying to parse scalar parameter")
|
||||||
|
else:
|
||||||
|
# TODO: Could improve display further by actually displaying a matrix as a
|
||||||
|
# matrix using row and column information
|
||||||
|
self.pw.dlog(
|
||||||
|
"Received vector or matrix data:"
|
||||||
|
f" {param.param_raw.hex(sep=',')}"
|
||||||
|
)
|
||||||
|
except ValueError as e:
|
||||||
|
self.pw.dlog(f"received {e} when trying to parse parameters")
|
||||||
|
except NotImplementedError as e:
|
||||||
|
self.pw.dlog(f"received {e} when trying to parse parameters")
|
||||||
|
else:
|
||||||
|
self.pw.dlog(
|
||||||
|
f"unknown subservice {tm_packet.subservice} for parameter service"
|
||||||
|
)
|
||||||
|
|
||||||
|
def _handle_mode_packet(self, raw_data: bytes, _: PusTelemetry) -> bool:
|
||||||
|
tm_packet = Service200FsfwTm.unpack(
|
||||||
|
raw_telemetry=raw_data, time_reader=CdsShortTimestamp.empty()
|
||||||
|
)
|
||||||
|
if tm_packet.subservice == ModeSubservice.TM_CANT_REACH_MODE:
|
||||||
|
obj_id = tm_packet.object_id
|
||||||
|
obj_id_obj = self.obj_id_dict.get(obj_id)
|
||||||
|
retval = tm_packet.return_value
|
||||||
|
string_list = generic_retval_printout(retval)
|
||||||
|
self.pw.dlog(f"Received Mode Reply from {obj_id_obj}: Can't reach mode.")
|
||||||
|
for string in string_list:
|
||||||
|
self.pw.dlog(f"Reason: {string}")
|
||||||
|
return True
|
||||||
|
if tm_packet.subservice == ModeSubservice.TM_WRONG_MODE_REPLY:
|
||||||
|
self.pw.dlog(f"Received Mode TM wrong mode reply, mode: {tm_packet.mode}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class UnknownApidHandler(GenericApidHandlerBase):
|
||||||
|
def handle_tm(self, apid: int, packet: bytes, _user_args: Any):
|
||||||
|
_LOGGER.warning(
|
||||||
|
f"Packet with unknown APID {apid} detected: {packet.hex(sep=',')}"
|
||||||
|
)
|
@ -1,8 +1,3 @@
|
|||||||
from .payload.subsystem import add_payload_subsystem_cmds
|
|
||||||
from .solar_array_deployment import add_sa_depl_cmds
|
|
||||||
from .test import add_test_defs
|
|
||||||
from .time import add_time_cmds
|
|
||||||
from .health import add_health_cmd_defs
|
|
||||||
from .system import add_system_cmd_defs
|
from .system import add_system_cmd_defs
|
||||||
from .tm_store import add_persistent_tm_store_cmd_defs
|
from .tm_store import add_persistent_tm_store_cmd_defs
|
||||||
from .tcs import add_tmp_sens_cmds
|
from .tcs import add_tmp_sens_cmds
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
import enum
|
import enum
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
CmdTreeNode,
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
OpCodeEntry,
|
||||||
|
TmtcDefinitionWrapper,
|
||||||
|
tmtc_definitions_provider,
|
||||||
)
|
)
|
||||||
from tmtccmd.tmtc import service_provider, DefaultPusQueueHelper
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Mode
|
from tmtccmd.pus.s200_fsfw_mode import Mode
|
||||||
from eive_tmtc.config.object_ids import ACS_BOARD_ASS_ID
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
|
||||||
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
|
from eive_tmtc.config.object_ids import ACS_BOARD_ASS_ID
|
||||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||||
|
|
||||||
|
|
||||||
@ -30,8 +30,8 @@ class DualSideSubmode(enum.IntEnum):
|
|||||||
DUAL_SIDE = 2
|
DUAL_SIDE = 2
|
||||||
|
|
||||||
|
|
||||||
def pack_acs_command(q: DefaultPusQueueHelper, op_code: str):
|
def pack_acs_board_command(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
if op_code in AcsOpCodes.ACS_ASS_A_SIDE:
|
if cmd_str in AcsOpCodes.ACS_ASS_A_SIDE:
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
object_id=ACS_BOARD_ASS_ID,
|
object_id=ACS_BOARD_ASS_ID,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
@ -39,7 +39,7 @@ def pack_acs_command(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
q=q,
|
q=q,
|
||||||
info="Switching to ACS board assembly A side",
|
info="Switching to ACS board assembly A side",
|
||||||
)
|
)
|
||||||
if op_code in AcsOpCodes.ACS_ASS_B_SIDE:
|
if cmd_str in AcsOpCodes.ACS_ASS_B_SIDE:
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
object_id=ACS_BOARD_ASS_ID,
|
object_id=ACS_BOARD_ASS_ID,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
@ -47,7 +47,7 @@ def pack_acs_command(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
q=q,
|
q=q,
|
||||||
info="Switching to ACS board assembly B side",
|
info="Switching to ACS board assembly B side",
|
||||||
)
|
)
|
||||||
if op_code in AcsOpCodes.ACS_ASS_DUAL_MODE:
|
if cmd_str in AcsOpCodes.ACS_ASS_DUAL_MODE:
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
object_id=ACS_BOARD_ASS_ID,
|
object_id=ACS_BOARD_ASS_ID,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
@ -55,7 +55,7 @@ def pack_acs_command(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
q=q,
|
q=q,
|
||||||
info="Switching to ACS board assembly dual mode",
|
info="Switching to ACS board assembly dual mode",
|
||||||
)
|
)
|
||||||
if op_code in AcsOpCodes.ACS_ASS_A_ON:
|
if cmd_str in AcsOpCodes.ACS_ASS_A_ON:
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
object_id=ACS_BOARD_ASS_ID,
|
object_id=ACS_BOARD_ASS_ID,
|
||||||
mode=Mode.ON,
|
mode=Mode.ON,
|
||||||
@ -63,7 +63,7 @@ def pack_acs_command(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
q=q,
|
q=q,
|
||||||
info="Switching ACS board assembly A side on",
|
info="Switching ACS board assembly A side on",
|
||||||
)
|
)
|
||||||
if op_code in AcsOpCodes.ACS_ASS_B_ON:
|
if cmd_str in AcsOpCodes.ACS_ASS_B_ON:
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
object_id=ACS_BOARD_ASS_ID,
|
object_id=ACS_BOARD_ASS_ID,
|
||||||
mode=Mode.ON,
|
mode=Mode.ON,
|
||||||
@ -71,7 +71,7 @@ def pack_acs_command(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
q=q,
|
q=q,
|
||||||
info="Switching ACS board assembly B side on",
|
info="Switching ACS board assembly B side on",
|
||||||
)
|
)
|
||||||
if op_code in AcsOpCodes.ACS_ASS_DUAL_ON:
|
if cmd_str in AcsOpCodes.ACS_ASS_DUAL_ON:
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
object_id=ACS_BOARD_ASS_ID,
|
object_id=ACS_BOARD_ASS_ID,
|
||||||
mode=Mode.ON,
|
mode=Mode.ON,
|
||||||
@ -79,7 +79,7 @@ def pack_acs_command(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
q=q,
|
q=q,
|
||||||
info="Switching ACS board assembly dual side on",
|
info="Switching ACS board assembly dual side on",
|
||||||
)
|
)
|
||||||
if op_code in AcsOpCodes.ACS_ASS_OFF:
|
if cmd_str in AcsOpCodes.ACS_ASS_OFF:
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
object_id=ACS_BOARD_ASS_ID,
|
object_id=ACS_BOARD_ASS_ID,
|
||||||
mode=Mode.OFF,
|
mode=Mode.OFF,
|
||||||
@ -89,11 +89,51 @@ def pack_acs_command(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.ACS_BRD_ASS)
|
def create_acs_board_node() -> CmdTreeNode:
|
||||||
def pack_acs_command_provider(p: ServiceProviderParams):
|
node = CmdTreeNode("acs_brd", "ACS Board", hide_children_which_are_leaves=True)
|
||||||
op_code = p.op_code
|
node.add_child(
|
||||||
q = p.queue_helper
|
CmdTreeNode(
|
||||||
pack_acs_command(q, op_code)
|
AcsOpCodes.ACS_ASS_A_SIDE[1],
|
||||||
|
"Switch to ACS board A side",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
AcsOpCodes.ACS_ASS_B_SIDE[1],
|
||||||
|
"Switch to ACS board B side",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
AcsOpCodes.ACS_ASS_DUAL_MODE[1],
|
||||||
|
"Switch to ACS board dual mode",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
AcsOpCodes.ACS_ASS_A_ON[1],
|
||||||
|
"Switch ACS board A side on",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
AcsOpCodes.ACS_ASS_B_ON[1],
|
||||||
|
"Switch ACS board B side on",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
AcsOpCodes.ACS_ASS_DUAL_ON[1],
|
||||||
|
"Switch ACS board dual mode on",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
AcsOpCodes.ACS_ASS_OFF[1],
|
||||||
|
"Switch off ACS board",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
|
@ -7,11 +7,7 @@ import struct
|
|||||||
from socket import AF_INET
|
from socket import AF_INET
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import CmdTreeNode
|
||||||
OpCodeEntry,
|
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
tmtc_definitions_provider,
|
|
||||||
)
|
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd
|
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd
|
||||||
@ -34,11 +30,8 @@ from tmtccmd.pus.tc.s3_fsfw_hk import (
|
|||||||
enable_periodic_hk_command_with_interval,
|
enable_periodic_hk_command_with_interval,
|
||||||
make_sid,
|
make_sid,
|
||||||
)
|
)
|
||||||
from tmtccmd.tmtc import service_provider
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from tmtccmd.tmtc.queue import DefaultPusQueueHelper
|
from tmtccmd.tmtc.queue import DefaultPusQueueHelper
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import ACS_CONTROLLER
|
from eive_tmtc.config.object_ids import ACS_CONTROLLER
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode
|
from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode
|
||||||
@ -73,6 +66,7 @@ class ActionId(enum.IntEnum):
|
|||||||
RESTORE_MEKF_NONFINITE_RECOVERY = 2
|
RESTORE_MEKF_NONFINITE_RECOVERY = 2
|
||||||
UPDATE_TLE = 3
|
UPDATE_TLE = 3
|
||||||
READ_TLE = 4
|
READ_TLE = 4
|
||||||
|
UPDATE_MEKF_STANDARD_DEVIATIONS = 5
|
||||||
|
|
||||||
|
|
||||||
CTRL_STRAT_DICT = {
|
CTRL_STRAT_DICT = {
|
||||||
@ -127,6 +121,7 @@ class OpCodes:
|
|||||||
RESTORE_MEKF_NONFINITE_RECOVERY = "restore_mekf_nonfinite_recovery"
|
RESTORE_MEKF_NONFINITE_RECOVERY = "restore_mekf_nonfinite_recovery"
|
||||||
UPDATE_TLE = "update_tle"
|
UPDATE_TLE = "update_tle"
|
||||||
READ_TLE = "read_tle"
|
READ_TLE = "read_tle"
|
||||||
|
UPDATE_MEKF_STANDARD_DEVIATIONS = "update_mekf_standard_deviations"
|
||||||
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"
|
||||||
@ -149,6 +144,10 @@ class Info:
|
|||||||
RESTORE_MEKF_NONFINITE_RECOVERY = "Restore MEKF non-finite recovery"
|
RESTORE_MEKF_NONFINITE_RECOVERY = "Restore MEKF non-finite recovery"
|
||||||
UPDATE_TLE = "Update TLE"
|
UPDATE_TLE = "Update TLE"
|
||||||
READ_TLE = "Read the currently stored TLE"
|
READ_TLE = "Read the currently stored TLE"
|
||||||
|
UPDATE_MEKF_STANDARD_DEVIATIONS = (
|
||||||
|
"Update the Standard Deviations within the MEKF to the current ACS Parameter "
|
||||||
|
"Values"
|
||||||
|
)
|
||||||
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"
|
||||||
@ -169,84 +168,66 @@ if PERFORM_MGM_CALIBRATION:
|
|||||||
CALIBR_SOCKET.connect(CALIBRATION_ADDR)
|
CALIBR_SOCKET.connect(CALIBRATION_ADDR)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_acs_ctrl_node() -> CmdTreeNode:
|
||||||
def acs_cmd_defs(defs: TmtcDefinitionWrapper):
|
# Zip the two classes together into a dictionary
|
||||||
oce = OpCodeEntry()
|
op_code_strs = [
|
||||||
oce.add(keys=OpCodes.OFF, info=Info.OFF)
|
getattr(OpCodes, key) for key in dir(OpCodes) if not key.startswith("__")
|
||||||
oce.add(keys=OpCodes.SAFE, info=Info.SAFE)
|
]
|
||||||
oce.add(keys=OpCodes.DTBL, info=Info.DTBL)
|
info_strs = [getattr(Info, key) for key in dir(OpCodes) if not key.startswith("__")]
|
||||||
oce.add(keys=OpCodes.IDLE, info=Info.IDLE)
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
oce.add(keys=OpCodes.NADIR, info=Info.NADIR)
|
acs_ctrl = CmdTreeNode(
|
||||||
oce.add(keys=OpCodes.TARGET, info=Info.TARGET)
|
"acs_ctrl", "ACS Controller", hide_children_which_are_leaves=True
|
||||||
oce.add(keys=OpCodes.GS, info=Info.GS)
|
|
||||||
oce.add(keys=OpCodes.INERTIAL, info=Info.INERTIAL)
|
|
||||||
oce.add(keys=OpCodes.SAFE_PTG, info=Info.SAFE_PTG)
|
|
||||||
oce.add(keys=OpCodes.RESET_MEKF, info=Info.RESET_MEKF)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCodes.RESTORE_MEKF_NONFINITE_RECOVERY,
|
|
||||||
info=Info.RESTORE_MEKF_NONFINITE_RECOVERY,
|
|
||||||
)
|
|
||||||
oce.add(keys=OpCodes.UPDATE_TLE, info=Info.UPDATE_TLE)
|
|
||||||
oce.add(keys=OpCodes.READ_TLE, info=Info.READ_TLE)
|
|
||||||
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_MATRIX, info=Info.SET_PARAMETER_MATRIX)
|
|
||||||
oce.add(keys=OpCodes.ONE_SHOOT_HK, info=Info.ONE_SHOOT_HK)
|
|
||||||
oce.add(keys=OpCodes.ENABLE_HK, info=Info.ENABLE_HK)
|
|
||||||
oce.add(keys=OpCodes.DISABLE_HK, info=Info.DISABLE_HK)
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.ACS_CTRL.value, info="ACS Controller", op_code_entry=oce
|
|
||||||
)
|
)
|
||||||
|
for op_code, info in combined_dict.items():
|
||||||
|
acs_ctrl.add_child(CmdTreeNode(op_code, info))
|
||||||
|
return acs_ctrl
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.ACS_CTRL.value)
|
def pack_acs_ctrl_command(q: DefaultPusQueueHelper, cmd_str: str): # noqa C901
|
||||||
def pack_acs_ctrl_command(p: ServiceProviderParams): # noqa C901
|
if cmd_str in OpCodes.OFF:
|
||||||
op_code = p.op_code
|
|
||||||
q = p.queue_helper
|
|
||||||
if op_code == OpCodes.OFF:
|
|
||||||
q.add_log_cmd(f"{Info.OFF}")
|
q.add_log_cmd(f"{Info.OFF}")
|
||||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, Mode.OFF, 0))
|
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, Mode.OFF, 0))
|
||||||
elif op_code == OpCodes.SAFE:
|
elif cmd_str in OpCodes.SAFE:
|
||||||
q.add_log_cmd(f"{Info.SAFE}")
|
q.add_log_cmd(f"{Info.SAFE}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_mode_command(ACS_CONTROLLER, AcsMode.SAFE, SafeSubmode.DEFAULT)
|
pack_mode_command(ACS_CONTROLLER, AcsMode.SAFE, SafeSubmode.DEFAULT)
|
||||||
)
|
)
|
||||||
elif op_code == OpCodes.DTBL:
|
elif cmd_str in OpCodes.DTBL:
|
||||||
q.add_log_cmd(f"{Info.DTBL}")
|
q.add_log_cmd(f"{Info.DTBL}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_mode_command(ACS_CONTROLLER, AcsMode.SAFE, SafeSubmode.DETUMBLE)
|
pack_mode_command(ACS_CONTROLLER, AcsMode.SAFE, SafeSubmode.DETUMBLE)
|
||||||
)
|
)
|
||||||
elif op_code == OpCodes.IDLE:
|
elif cmd_str in OpCodes.IDLE:
|
||||||
q.add_log_cmd(f"{Info.IDLE}")
|
q.add_log_cmd(f"{Info.IDLE}")
|
||||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.IDLE, 0))
|
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.IDLE, 0))
|
||||||
elif op_code == OpCodes.NADIR:
|
elif cmd_str in OpCodes.NADIR:
|
||||||
q.add_log_cmd(f"{Info.NADIR}")
|
q.add_log_cmd(f"{Info.NADIR}")
|
||||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_NADIR, 0))
|
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_NADIR, 0))
|
||||||
elif op_code == OpCodes.TARGET:
|
elif cmd_str in OpCodes.TARGET:
|
||||||
q.add_log_cmd(f"{Info.TARGET}")
|
q.add_log_cmd(f"{Info.TARGET}")
|
||||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_TARGET, 0))
|
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_TARGET, 0))
|
||||||
elif op_code == OpCodes.GS:
|
elif cmd_str in OpCodes.GS:
|
||||||
q.add_log_cmd(f"{Info.GS}")
|
q.add_log_cmd(f"{Info.GS}")
|
||||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_TARGET_GS, 0))
|
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_TARGET_GS, 0))
|
||||||
elif op_code == OpCodes.INERTIAL:
|
elif cmd_str in OpCodes.INERTIAL:
|
||||||
q.add_log_cmd(f"{Info.INERTIAL}")
|
q.add_log_cmd(f"{Info.INERTIAL}")
|
||||||
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_INERTIAL, 0))
|
q.add_pus_tc(pack_mode_command(ACS_CONTROLLER, AcsMode.PTG_INERTIAL, 0))
|
||||||
elif op_code == OpCodes.SAFE_PTG:
|
elif cmd_str in OpCodes.SAFE_PTG:
|
||||||
q.add_log_cmd(f"{Info.SAFE_PTG}")
|
q.add_log_cmd(f"{Info.SAFE_PTG}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
ACS_CONTROLLER, ActionId.SOLAR_ARRAY_DEPLOYMENT_SUCCESSFUL
|
ACS_CONTROLLER, ActionId.SOLAR_ARRAY_DEPLOYMENT_SUCCESSFUL
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCodes.RESET_MEKF:
|
elif cmd_str in OpCodes.RESET_MEKF:
|
||||||
q.add_log_cmd(f"{Info.RESET_MEKF}")
|
q.add_log_cmd(f"{Info.RESET_MEKF}")
|
||||||
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.RESET_MEKF))
|
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.RESET_MEKF))
|
||||||
elif op_code == OpCodes.RESTORE_MEKF_NONFINITE_RECOVERY:
|
elif cmd_str in OpCodes.RESTORE_MEKF_NONFINITE_RECOVERY:
|
||||||
q.add_log_cmd(f"{Info.RESTORE_MEKF_NONFINITE_RECOVERY}")
|
q.add_log_cmd(f"{Info.RESTORE_MEKF_NONFINITE_RECOVERY}")
|
||||||
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 == OpCodes.UPDATE_TLE:
|
elif cmd_str in OpCodes.UPDATE_TLE:
|
||||||
q.add_log_cmd(f"{Info.UPDATE_TLE}")
|
q.add_log_cmd(f"{Info.UPDATE_TLE}")
|
||||||
while True:
|
while True:
|
||||||
line1 = input("Please input the first line of the TLE: ")
|
line1 = input("Please input the first line of the TLE: ")
|
||||||
@ -262,29 +243,34 @@ def pack_acs_ctrl_command(p: ServiceProviderParams): # noqa C901
|
|||||||
print("The line does not have the required length of 69 characters")
|
print("The line does not have the required length of 69 characters")
|
||||||
tle = line1.encode() + line2.encode()
|
tle = line1.encode() + line2.encode()
|
||||||
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.UPDATE_TLE, tle))
|
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.UPDATE_TLE, tle))
|
||||||
elif op_code == OpCodes.READ_TLE:
|
elif cmd_str == OpCodes.READ_TLE:
|
||||||
q.add_log_cmd(f"{Info.READ_TLE}")
|
q.add_log_cmd(f"{Info.READ_TLE}")
|
||||||
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.READ_TLE))
|
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.READ_TLE))
|
||||||
elif op_code == OpCodes.SET_PARAMETER_SCALAR:
|
elif cmd_str == OpCodes.UPDATE_MEKF_STANDARD_DEVIATIONS:
|
||||||
|
q.add_log_cmd(f"{Info.UPDATE_MEKF_STANDARD_DEVIATIONS}")
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_action_cmd(ACS_CONTROLLER, ActionId.UPDATE_MEKF_STANDARD_DEVIATIONS)
|
||||||
|
)
|
||||||
|
elif cmd_str == 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)
|
||||||
elif op_code == OpCodes.SET_PARAMETER_VECTOR:
|
elif cmd_str == OpCodes.SET_PARAMETER_VECTOR:
|
||||||
q.add_log_cmd(f"{Info.SET_PARAMETER_VECTOR}")
|
q.add_log_cmd(f"{Info.SET_PARAMETER_VECTOR}")
|
||||||
set_acs_ctrl_param_vector(q)
|
set_acs_ctrl_param_vector(q)
|
||||||
elif op_code == OpCodes.SET_PARAMETER_MATRIX:
|
elif cmd_str == OpCodes.SET_PARAMETER_MATRIX:
|
||||||
q.add_log_cmd(f"{Info.SET_PARAMETER_MATRIX}")
|
q.add_log_cmd(f"{Info.SET_PARAMETER_MATRIX}")
|
||||||
set_acs_ctrl_param_matrix(q)
|
set_acs_ctrl_param_matrix(q)
|
||||||
elif op_code == OpCodes.ONE_SHOOT_HK:
|
elif cmd_str == OpCodes.ONE_SHOOT_HK:
|
||||||
q.add_log_cmd(Info.ONE_SHOOT_HK)
|
q.add_log_cmd(Info.ONE_SHOOT_HK)
|
||||||
request_dataset(q, DataSetRequest.ONESHOT)
|
request_dataset(q, DataSetRequest.ONESHOT)
|
||||||
elif op_code == OpCodes.ENABLE_HK:
|
elif cmd_str == OpCodes.ENABLE_HK:
|
||||||
q.add_log_cmd(Info.ENABLE_HK)
|
q.add_log_cmd(Info.ENABLE_HK)
|
||||||
request_dataset(q, DataSetRequest.ENABLE)
|
request_dataset(q, DataSetRequest.ENABLE)
|
||||||
elif op_code == OpCodes.DISABLE_HK:
|
elif cmd_str == OpCodes.DISABLE_HK:
|
||||||
q.add_log_cmd(Info.DISABLE_HK)
|
q.add_log_cmd(Info.DISABLE_HK)
|
||||||
request_dataset(q, DataSetRequest.DISABLE)
|
request_dataset(q, DataSetRequest.DISABLE)
|
||||||
else:
|
else:
|
||||||
logging.getLogger(__name__).info(f"Unknown op code {op_code}")
|
logging.getLogger(__name__).info(f"Unknown op code {cmd_str}")
|
||||||
|
|
||||||
|
|
||||||
def request_dataset(q: DefaultPusQueueHelper, req_type: DataSetRequest):
|
def request_dataset(q: DefaultPusQueueHelper, req_type: DataSetRequest):
|
||||||
@ -428,7 +414,7 @@ def set_acs_ctrl_param_vector(q: DefaultPusQueueHelper):
|
|||||||
domain_id=sid,
|
domain_id=sid,
|
||||||
unique_id=pid,
|
unique_id=pid,
|
||||||
parameters=param,
|
parameters=param,
|
||||||
).pack()
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@ -621,7 +607,7 @@ def handle_raw_mgm_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
pw.dlog(f"Raw Data: {hk_data.hex(sep=',')}")
|
pw.dlog(f"Raw Data: {hk_data.hex(sep=',')}")
|
||||||
return
|
return
|
||||||
|
|
||||||
def unpack_float_tuple(idx: int) -> (tuple, int):
|
def unpack_float_tuple(idx: int) -> Tuple[tuple, int]:
|
||||||
f_tuple = struct.unpack(
|
f_tuple = struct.unpack(
|
||||||
float_tuple_fmt_str,
|
float_tuple_fmt_str,
|
||||||
hk_data[idx : idx + struct.calcsize(float_tuple_fmt_str)],
|
hk_data[idx : idx + struct.calcsize(float_tuple_fmt_str)],
|
||||||
@ -1124,6 +1110,9 @@ 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
|
||||||
global CALIBR_SOCKET, CALIBRATION_ADDR
|
global CALIBR_SOCKET, CALIBRATION_ADDR
|
||||||
|
if not PERFORM_MGM_CALIBRATION:
|
||||||
|
return
|
||||||
|
assert CALIBR_SOCKET is not None
|
||||||
try:
|
try:
|
||||||
declare_api_cmd = "declare_api_version 2"
|
declare_api_cmd = "declare_api_version 2"
|
||||||
CALIBR_SOCKET.sendall(f"{declare_api_cmd}\n".encode())
|
CALIBR_SOCKET.sendall(f"{declare_api_cmd}\n".encode())
|
||||||
|
@ -3,10 +3,8 @@ import enum
|
|||||||
import logging
|
import logging
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
from tmtccmd.config import CmdTreeNode
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import create_mode_command, Mode
|
from tmtccmd.pus.s200_fsfw_mode import create_mode_command, Mode
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||||
@ -15,6 +13,7 @@ from tmtccmd.pus.tc.s3_fsfw_hk import (
|
|||||||
create_enable_periodic_hk_command_with_interval_with_diag,
|
create_enable_periodic_hk_command_with_interval_with_diag,
|
||||||
create_disable_periodic_hk_command_with_diag,
|
create_disable_periodic_hk_command_with_diag,
|
||||||
)
|
)
|
||||||
|
from tmtccmd.pus.tc.s8_fsfw_action import create_action_cmd
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -24,16 +23,21 @@ class GpsInfo:
|
|||||||
MAX_SATELLITES = 30
|
MAX_SATELLITES = 30
|
||||||
|
|
||||||
|
|
||||||
|
class GnssChip(enum.IntEnum):
|
||||||
|
A_SIDE = 0
|
||||||
|
B_SIDE = 1
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
OFF = "off"
|
OFF = "off"
|
||||||
ON = "on"
|
ON = "on"
|
||||||
REQ_CORE_HK = ["core_hk_request"]
|
REQ_CORE_HK = "core_hk_request"
|
||||||
ENABLE_CORE_HK = ["core_hk_enable"]
|
ENABLE_CORE_HK = "core_hk_enable"
|
||||||
DISABLE_CORE_HK = ["core_hk_disable"]
|
DISABLE_CORE_HK = "core_hk_disable"
|
||||||
REQ_SKYVIEW_HK = ["skyview_hk_request"]
|
REQ_SKYVIEW_HK = "skyview_hk_request"
|
||||||
ENABLE_SKYVIEW_HK = ["skyview_hk_enable"]
|
ENABLE_SKYVIEW_HK = "skyview_hk_enable"
|
||||||
DISABLE_SKYVIEW_HK = ["skyview_hk_disable"]
|
DISABLE_SKYVIEW_HK = "skyview_hk_disable"
|
||||||
RESET_GNSS = ["reset"]
|
RESET_GNSS = "reset"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -53,32 +57,33 @@ class SetId(enum.IntEnum):
|
|||||||
SKYVIEW_HK = 1
|
SKYVIEW_HK = 1
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_gnss_node() -> CmdTreeNode:
|
||||||
def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
op_code_strs = [
|
||||||
oce = OpCodeEntry()
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
oce.add(keys=OpCode.OFF, info=Info.OFF)
|
]
|
||||||
oce.add(keys=OpCode.ON, info=Info.ON)
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
oce.add(keys=OpCode.RESET_GNSS, info=Info.RESET_GNSS)
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
oce.add(keys=OpCode.REQ_CORE_HK, info=Info.REQ_CORE_HK)
|
node = CmdTreeNode("gnss_devs", "GNSS Controller", hide_children_for_print=True)
|
||||||
oce.add(keys=OpCode.ENABLE_CORE_HK, info=Info.ENABLE_CORE_HK)
|
for op_code, info in combined_dict.items():
|
||||||
oce.add(keys=OpCode.DISABLE_CORE_HK, info=Info.DISABLE_CORE_HK)
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
oce.add(keys=OpCode.REQ_SKYVIEW_HK, info=Info.REQ_SKYVIEW_HK)
|
return node
|
||||||
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(
|
|
||||||
name=CustomServiceList.GPS_CTRL.value,
|
|
||||||
info="GPS/GNSS Controller",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def pack_gps_command( # noqa: C901
|
def pack_gps_command( # noqa: C901
|
||||||
object_id: bytes, q: DefaultPusQueueHelper, op_code: str
|
object_id: bytes, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
): # noqa: C901:
|
): # noqa: C901:
|
||||||
if op_code in OpCode.RESET_GNSS:
|
if cmd_str == OpCode.RESET_GNSS:
|
||||||
# TODO: This needs to be re-implemented
|
for val in GnssChip:
|
||||||
|
print("{:<2}: {:<20}".format(val, val.name))
|
||||||
|
chip: str = ""
|
||||||
|
while chip not in ["0", "1"]:
|
||||||
|
chip = input("Please specify which chip to reset: ")
|
||||||
|
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_action_cmd(object_id=object_id, action_id=5, user_data=chip.encode())
|
||||||
|
)
|
||||||
_LOGGER.warning("Reset pin handling needs to be re-implemented")
|
_LOGGER.warning("Reset pin handling needs to be re-implemented")
|
||||||
if op_code in OpCode.ENABLE_CORE_HK:
|
if cmd_str == 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")
|
||||||
@ -90,21 +95,21 @@ def pack_gps_command( # noqa: C901
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCode.DISABLE_CORE_HK:
|
if cmd_str == OpCode.DISABLE_CORE_HK:
|
||||||
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
|
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command_with_diag(
|
||||||
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK)
|
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.REQ_CORE_HK:
|
if cmd_str == OpCode.REQ_CORE_HK:
|
||||||
q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}")
|
q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_hk_command(
|
create_request_one_hk_command(
|
||||||
sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK)
|
sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.ENABLE_SKYVIEW_HK:
|
if cmd_str == OpCode.ENABLE_SKYVIEW_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")
|
||||||
@ -116,24 +121,24 @@ def pack_gps_command( # noqa: C901
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCode.DISABLE_SKYVIEW_HK:
|
if cmd_str == OpCode.DISABLE_SKYVIEW_HK:
|
||||||
q.add_log_cmd(f"gps: {Info.DISABLE_SKYVIEW_HK}")
|
q.add_log_cmd(f"gps: {Info.DISABLE_SKYVIEW_HK}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command_with_diag(
|
||||||
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK)
|
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.REQ_SKYVIEW_HK:
|
if cmd_str == OpCode.REQ_SKYVIEW_HK:
|
||||||
q.add_log_cmd(f"GPS: {Info.REQ_SKYVIEW_HK}")
|
q.add_log_cmd(f"GPS: {Info.REQ_SKYVIEW_HK}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_hk_command(
|
create_request_one_hk_command(
|
||||||
sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK)
|
sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.ON:
|
if cmd_str == 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))
|
||||||
if op_code in OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd(f"GPS: {Info.OFF}")
|
q.add_log_cmd(f"GPS: {Info.OFF}")
|
||||||
q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0))
|
q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0))
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ import logging
|
|||||||
import struct
|
import struct
|
||||||
|
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
|
from tmtccmd.config import CmdTreeNode
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.pus.s201_fsfw_health import pack_set_health_cmd_data, FsfwHealth
|
from tmtccmd.pus.s201_fsfw_health import pack_set_health_cmd_data, FsfwHealth
|
||||||
from tmtccmd.pus.s201_fsfw_health import Subservice
|
from tmtccmd.pus.s201_fsfw_health import Subservice
|
||||||
@ -59,7 +60,7 @@ GYR_SEL_DICT = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
|
def handle_gyr_cmd(q: DefaultPusQueueHelper, cmd_str: 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]}")
|
||||||
@ -72,23 +73,23 @@ def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
core_hk_id = AdisGyroSetId.CORE_HK
|
core_hk_id = AdisGyroSetId.CORE_HK
|
||||||
else:
|
else:
|
||||||
core_hk_id = L3gGyroSetId.CORE_HK
|
core_hk_id = L3gGyroSetId.CORE_HK
|
||||||
if op_code == OpCode.NML:
|
if cmd_str == OpCode.NML:
|
||||||
q.add_log_cmd(f"Gyro {gyr_info[0]} NORMAL mode")
|
q.add_log_cmd(f"Gyro {gyr_info[0]} NORMAL mode")
|
||||||
q.add_pus_tc(create_mode_command(gyr_obj_id, Mode.NORMAL, 0))
|
q.add_pus_tc(create_mode_command(gyr_obj_id, Mode.NORMAL, 0))
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd(f"Gyro {gyr_info[0]} OFF mode")
|
q.add_log_cmd(f"Gyro {gyr_info[0]} OFF mode")
|
||||||
q.add_pus_tc(create_mode_command(gyr_obj_id, Mode.OFF, 0))
|
q.add_pus_tc(create_mode_command(gyr_obj_id, Mode.OFF, 0))
|
||||||
elif op_code == OpCode.CORE_HK:
|
elif cmd_str == OpCode.CORE_HK:
|
||||||
q.add_log_cmd(f"Gyro {gyr_info[0]} Core HK")
|
q.add_log_cmd(f"Gyro {gyr_info[0]} Core HK")
|
||||||
q.add_pus_tc(create_request_one_hk_command(make_sid(gyr_obj_id, core_hk_id)))
|
q.add_pus_tc(create_request_one_hk_command(make_sid(gyr_obj_id, core_hk_id)))
|
||||||
elif op_code == OpCode.CFG_HK:
|
elif cmd_str == OpCode.CFG_HK:
|
||||||
if not is_adis:
|
if not is_adis:
|
||||||
raise ValueError("No config HK for L3 device")
|
raise ValueError("No config HK for L3 device")
|
||||||
q.add_log_cmd(f"Gyro {gyr_info[0]} CFG HK")
|
q.add_log_cmd(f"Gyro {gyr_info[0]} CFG HK")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_hk_command(make_sid(gyr_obj_id, AdisGyroSetId.CFG_HK))
|
create_request_one_hk_command(make_sid(gyr_obj_id, AdisGyroSetId.CFG_HK))
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.SET_FAULTY:
|
elif cmd_str == OpCode.SET_FAULTY:
|
||||||
q.add_log_cmd(f"Gyro {gyr_info[0]} set faulty")
|
q.add_log_cmd(f"Gyro {gyr_info[0]} set faulty")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -101,7 +102,7 @@ def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
logging.getLogger(__name__).warning(
|
logging.getLogger(__name__).warning(
|
||||||
f"invalid op code {op_code} for gyro command"
|
f"invalid op code {cmd_str} for gyro command"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -177,6 +178,16 @@ def handle_l3g_gyro_hk(
|
|||||||
pw.dlog(f"Temperature {temp} °C")
|
pw.dlog(f"Temperature {temp} °C")
|
||||||
|
|
||||||
|
|
||||||
|
def create_gyros_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode("gyros", "Gyroscope devices")
|
||||||
|
node.add_child(CmdTreeNode(OpCode.CORE_HK, "Request Core HK"))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.CFG_HK, "Request CFG HK"))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.NML, "Normal Mode"))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.OFF, "Off Mode"))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.SET_FAULTY, "Set Faulty"))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_gyr_cmd_defs(defs: TmtcDefinitionWrapper):
|
def add_gyr_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
|
@ -10,6 +10,8 @@ import logging
|
|||||||
import struct
|
import struct
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
|
from tmtccmd.config import CmdTreeNode
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
@ -91,6 +93,74 @@ class ImtqActionId:
|
|||||||
read_self_test_results = bytearray([0x0, 0x0, 0x0, 0x0D])
|
read_self_test_results = bytearray([0x0, 0x0, 0x0, 0x0D])
|
||||||
|
|
||||||
|
|
||||||
|
CTN = CmdTreeNode
|
||||||
|
|
||||||
|
|
||||||
|
def create_mgt_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode(
|
||||||
|
"mgt", "iMTQ MGT device node", hide_children_which_are_leaves=True
|
||||||
|
)
|
||||||
|
node.add_child(CmdTreeNode(OpCode.OFF, "Mode OFF"))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.ON, "Mode ON"))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.NORMAL, "Mode Normal"))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.OFF, "Mode OFF"))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(OpCode.REQUEST_ENG_HK_NO_TORQUE, "Request Engineering HK One Shot")
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
OpCode.REQUEST_ENG_HK_WITH_TORQUE,
|
||||||
|
"Request Engineering HK One Shot during Torque",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(OpCode.ENABLE_ENG_HK_NO_TORQUE, "Enable ENG HK not torque")
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(OpCode.ENABLE_ENG_HK_WITH_TORQUE, "Enable ENG HK with torque")
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(OpCode.DISABLE_ENG_HK_NO_TORQUE, "Disable ENG HK not torque")
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(OpCode.DISABLE_ENG_HK_WITH_TORQUE, "Disable ENG HK with torque")
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
OpCode.REQUEST_MGM_RAW_NO_TORQUE,
|
||||||
|
"Request MGM Raw Without Torque HK One Shot",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(OpCode.ENABLE_MGM_RAW_NO_TORQUE, "Enable MGM Raw Without Torque HK")
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
OpCode.DISABLE_MGM_RAW_NO_TORQUE, "Disable MGM Raw Without Torque HK"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
OpCode.REQUEST_MGM_RAW_WITH_TORQUE,
|
||||||
|
"Request MGM Raw With Torque HK One Shot",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(OpCode.ENABLE_MGM_RAW_WITH_TORQUE, "Enable MGM Raw With Torque HK")
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CTN(OpCode.DISABLE_MGM_RAW_WITH_TORQUE, "Disable MGM Raw With Torque HK")
|
||||||
|
)
|
||||||
|
node.add_child(CTN(OpCode.POS_X_SELF_TEST, "IMTQ perform pos X self test"))
|
||||||
|
node.add_child(CTN(OpCode.NEG_X_SELF_TEST, "IMTQ perform neg X self test"))
|
||||||
|
node.add_child(CTN(OpCode.POS_Y_SELF_TEST, "IMTQ perform pos Y self test"))
|
||||||
|
node.add_child(CTN(OpCode.NEG_Y_SELF_TEST, "IMTQ perform neg Y self test"))
|
||||||
|
node.add_child(CTN(OpCode.POS_Z_SELF_TEST, "IMTQ perform pos Z self test"))
|
||||||
|
node.add_child(CTN(OpCode.NEG_Z_SELF_TEST, "IMTQ perform neg Z self test"))
|
||||||
|
node.add_child(CTN(OpCode.SET_DIPOLE, "IMTQ command dipole"))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_imtq_cmds(defs: TmtcDefinitionWrapper):
|
def add_imtq_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
@ -128,26 +198,26 @@ def add_imtq_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
defs.add_service(CustomServiceList.IMTQ.value, "IMQT Device", oce)
|
defs.add_service(CustomServiceList.IMTQ.value, "IMQT Device", oce)
|
||||||
|
|
||||||
|
|
||||||
def pack_imtq_test_into( # noqa C901
|
def create_imtq_command( # noqa C901
|
||||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
):
|
):
|
||||||
q.add_log_cmd(
|
q.add_log_cmd(
|
||||||
f"Testing ISIS IMTQ handler with object id: {object_id.as_hex_string}"
|
f"Testing ISIS IMTQ handler with object id: {object_id.as_hex_string}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd("IMTQ: Set mode off")
|
q.add_log_cmd("IMTQ: Set mode off")
|
||||||
command = pack_mode_data(object_id.as_bytes, Mode.OFF, 0)
|
command = pack_mode_data(object_id.as_bytes, Mode.OFF, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||||
if op_code == OpCode.ON:
|
if cmd_str == OpCode.ON:
|
||||||
q.add_log_cmd("IMTQ: Set mode on")
|
q.add_log_cmd("IMTQ: Set mode on")
|
||||||
command = pack_mode_data(object_id.as_bytes, Mode.ON, 0)
|
command = pack_mode_data(object_id.as_bytes, Mode.ON, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||||
if op_code == OpCode.NORMAL:
|
if cmd_str == OpCode.NORMAL:
|
||||||
q.add_log_cmd("IMTQ: Mode Normal")
|
q.add_log_cmd("IMTQ: Mode Normal")
|
||||||
command = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
|
command = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||||
if op_code == OpCode.POS_X_SELF_TEST:
|
if cmd_str == OpCode.POS_X_SELF_TEST:
|
||||||
q.add_log_cmd("IMTQ: Perform positive x self test")
|
q.add_log_cmd("IMTQ: Perform positive x self test")
|
||||||
command = object_id.as_bytes + ImtqActionId.perform_positive_x_test
|
command = object_id.as_bytes + ImtqActionId.perform_positive_x_test
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
@ -160,7 +230,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_X_TEST)
|
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_X_TEST)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid))
|
q.add_pus_tc(generate_one_hk_command(sid))
|
||||||
|
|
||||||
if op_code == OpCode.NEG_X_SELF_TEST:
|
if cmd_str == OpCode.NEG_X_SELF_TEST:
|
||||||
q.add_log_cmd("IMTQ: Perform negative x self test")
|
q.add_log_cmd("IMTQ: Perform negative x self test")
|
||||||
command = object_id.as_bytes + ImtqActionId.perform_negative_x_test
|
command = object_id.as_bytes + ImtqActionId.perform_negative_x_test
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
@ -171,7 +241,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_X_TEST)
|
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_X_TEST)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid))
|
q.add_pus_tc(generate_one_hk_command(sid))
|
||||||
|
|
||||||
if op_code == OpCode.POS_Y_SELF_TEST:
|
if cmd_str == OpCode.POS_Y_SELF_TEST:
|
||||||
q.add_log_cmd("IMTQ: Perform positive y self test")
|
q.add_log_cmd("IMTQ: Perform positive y self test")
|
||||||
command = object_id.as_bytes + ImtqActionId.perform_positive_y_test
|
command = object_id.as_bytes + ImtqActionId.perform_positive_y_test
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
@ -183,7 +253,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_Y_TEST)
|
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_Y_TEST)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid))
|
q.add_pus_tc(generate_one_hk_command(sid))
|
||||||
|
|
||||||
if op_code == OpCode.NEG_Y_SELF_TEST:
|
if cmd_str == OpCode.NEG_Y_SELF_TEST:
|
||||||
q.add_log_cmd("IMTQ: Perform negative y self test")
|
q.add_log_cmd("IMTQ: Perform negative y self test")
|
||||||
command = object_id.as_bytes + ImtqActionId.perform_negative_y_test
|
command = object_id.as_bytes + ImtqActionId.perform_negative_y_test
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
@ -196,7 +266,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_Y_TEST)
|
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_Y_TEST)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid))
|
q.add_pus_tc(generate_one_hk_command(sid))
|
||||||
|
|
||||||
if op_code == OpCode.POS_Z_SELF_TEST:
|
if cmd_str == OpCode.POS_Z_SELF_TEST:
|
||||||
q.add_log_cmd("IMTQ: Perform positive z self test")
|
q.add_log_cmd("IMTQ: Perform positive z self test")
|
||||||
command = object_id.as_bytes + ImtqActionId.perform_positive_z_test
|
command = object_id.as_bytes + ImtqActionId.perform_positive_z_test
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
@ -209,7 +279,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_Y_TEST)
|
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_Y_TEST)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid))
|
q.add_pus_tc(generate_one_hk_command(sid))
|
||||||
|
|
||||||
if op_code == OpCode.NEG_Z_SELF_TEST:
|
if cmd_str == OpCode.NEG_Z_SELF_TEST:
|
||||||
q.add_log_cmd("IMTQ: Perform negative z self test")
|
q.add_log_cmd("IMTQ: Perform negative z self test")
|
||||||
command = object_id.as_bytes + ImtqActionId.perform_negative_z_test
|
command = object_id.as_bytes + ImtqActionId.perform_negative_z_test
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
@ -220,7 +290,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_Z_TEST)
|
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_Z_TEST)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid))
|
q.add_pus_tc(generate_one_hk_command(sid))
|
||||||
|
|
||||||
if op_code in OpCode.SET_DIPOLE:
|
if cmd_str in OpCode.SET_DIPOLE:
|
||||||
x_dipole = int(input("Specify X dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
x_dipole = int(input("Specify X dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
||||||
y_dipole = int(input("Specify Y dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
y_dipole = int(input("Specify Y dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
||||||
z_dipole = int(input("Specify Z dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
z_dipole = int(input("Specify Z dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
||||||
@ -241,12 +311,12 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == "10": # doesnt seem to work anymore
|
if cmd_str == "10": # doesnt seem to work anymore
|
||||||
q.add_log_cmd("IMTQ: Get commanded dipole")
|
q.add_log_cmd("IMTQ: Get commanded dipole")
|
||||||
command = object_id.as_bytes + ImtqActionId.get_commanded_dipole
|
command = object_id.as_bytes + ImtqActionId.get_commanded_dipole
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
|
|
||||||
if op_code == OpCode.ENABLE_ENG_HK_NO_TORQUE:
|
if cmd_str == OpCode.ENABLE_ENG_HK_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Enable ENG HK")
|
q.add_log_cmd("IMTQ: Enable ENG HK")
|
||||||
interval = float(input("Please enter collection interval in seconds: "))
|
interval = float(input("Please enter collection interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
||||||
@ -256,14 +326,14 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code == OpCode.DISABLE_ENG_HK_NO_TORQUE:
|
if cmd_str == OpCode.DISABLE_ENG_HK_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Disable ENG HK (No Torque)")
|
q.add_log_cmd("IMTQ: Disable ENG HK (No Torque)")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command_with_diag(
|
||||||
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE)
|
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.REQUEST_ENG_HK_WITH_TORQUE:
|
if cmd_str == OpCode.REQUEST_ENG_HK_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Get engineering hk set with torque")
|
q.add_log_cmd("IMTQ: Get engineering hk set with torque")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_diag_command(
|
create_request_one_diag_command(
|
||||||
@ -273,7 +343,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.ENABLE_ENG_HK_WITH_TORQUE:
|
if cmd_str == OpCode.ENABLE_ENG_HK_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Enable ENG HK with torque")
|
q.add_log_cmd("IMTQ: Enable ENG HK with torque")
|
||||||
interval = float(input("Please enter collection interval in seconds: "))
|
interval = float(input("Please enter collection interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
||||||
@ -283,14 +353,14 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code == OpCode.DISABLE_ENG_HK_WITH_TORQUE:
|
if cmd_str == OpCode.DISABLE_ENG_HK_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Disable ENG HK with Torque")
|
q.add_log_cmd("IMTQ: Disable ENG HK with Torque")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command_with_diag(
|
||||||
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE)
|
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.REQUEST_ENG_HK_NO_TORQUE:
|
if cmd_str == OpCode.REQUEST_ENG_HK_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Get engineering hk set (no torque)")
|
q.add_log_cmd("IMTQ: Get engineering hk set (no torque)")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_diag_command(
|
generate_one_diag_command(
|
||||||
@ -300,7 +370,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == "12":
|
if cmd_str == "12":
|
||||||
q.add_log_cmd("IMTQ: Get calibrated MTM hk set")
|
q.add_log_cmd("IMTQ: Get calibrated MTM hk set")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_diag_command(
|
create_request_one_diag_command(
|
||||||
@ -308,7 +378,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.REQUEST_MGM_RAW_NO_TORQUE:
|
if cmd_str == OpCode.REQUEST_MGM_RAW_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Get raw MTM hk set")
|
q.add_log_cmd("IMTQ: Get raw MTM hk set")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_diag_command(
|
create_request_one_diag_command(
|
||||||
@ -318,14 +388,14 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.DISABLE_MGM_RAW_NO_TORQUE:
|
if cmd_str == OpCode.DISABLE_MGM_RAW_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
|
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command_with_diag(
|
||||||
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE)
|
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.ENABLE_MGM_RAW_NO_TORQUE:
|
if cmd_str == OpCode.ENABLE_MGM_RAW_NO_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
|
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
|
||||||
interval = float(input("Please enter collection interval in seconds: "))
|
interval = float(input("Please enter collection interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
||||||
@ -335,7 +405,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code == OpCode.REQUEST_MGM_RAW_WITH_TORQUE:
|
if cmd_str == OpCode.REQUEST_MGM_RAW_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Get raw MTM hk set")
|
q.add_log_cmd("IMTQ: Get raw MTM hk set")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_diag_command(
|
create_request_one_diag_command(
|
||||||
@ -344,7 +414,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.ENABLE_MGM_RAW_WITH_TORQUE:
|
if cmd_str == OpCode.ENABLE_MGM_RAW_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
|
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
|
||||||
interval = float(input("Please enter collection interval in seconds: "))
|
interval = float(input("Please enter collection interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
||||||
@ -354,7 +424,7 @@ def pack_imtq_test_into( # noqa C901
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code == OpCode.DISABLE_MGM_RAW_WITH_TORQUE:
|
if cmd_str == OpCode.DISABLE_MGM_RAW_WITH_TORQUE:
|
||||||
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
|
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_disable_periodic_hk_command_with_diag(
|
create_disable_periodic_hk_command_with_diag(
|
||||||
|
@ -2,7 +2,7 @@ import enum
|
|||||||
import struct
|
import struct
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from tmtccmd.config import OpCodeEntry
|
from tmtccmd.config import CmdTreeNode, OpCodeEntry
|
||||||
|
|
||||||
import eive_tmtc.config.object_ids as obj_ids
|
import eive_tmtc.config.object_ids as obj_ids
|
||||||
from eive_tmtc.config.object_ids import (
|
from eive_tmtc.config.object_ids import (
|
||||||
@ -47,17 +47,17 @@ MGM_SEL_DICT = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def handle_mgm_cmd(q: DefaultPusQueueHelper, op_code: str):
|
def handle_mgm_cmd(q: DefaultPusQueueHelper, cmd_str: 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)]
|
||||||
mgm_obj_id = mgm_info[1]
|
mgm_obj_id = mgm_info[1]
|
||||||
if op_code == OpCode.NORMAL:
|
if cmd_str == OpCode.NORMAL:
|
||||||
q.add_log_cmd(f"Gyro {mgm_info[0]} NORMAL mode")
|
q.add_log_cmd(f"Gyro {mgm_info[0]} NORMAL mode")
|
||||||
q.add_pus_tc(create_mode_command(mgm_obj_id, Mode.NORMAL, 0))
|
q.add_pus_tc(create_mode_command(mgm_obj_id, Mode.NORMAL, 0))
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd(f"Gyro {mgm_info[0]} OFF mode")
|
q.add_log_cmd(f"Gyro {mgm_info[0]} OFF mode")
|
||||||
q.add_pus_tc(create_mode_command(mgm_obj_id, Mode.OFF, 0))
|
q.add_pus_tc(create_mode_command(mgm_obj_id, Mode.OFF, 0))
|
||||||
|
|
||||||
@ -107,6 +107,13 @@ def handle_mgm_rm3100_hk_data(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_mgms_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode("mgms", "Magnetometer devices")
|
||||||
|
node.add_child(CmdTreeNode(OpCode.NORMAL, "Normal Mode"))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.OFF, "Off Mode"))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_mgm_cmd_defs(defs: TmtcDefinitionWrapper):
|
def add_mgm_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
|
@ -6,12 +6,11 @@
|
|||||||
"""
|
"""
|
||||||
import enum
|
import enum
|
||||||
import struct
|
import struct
|
||||||
from typing import List
|
from typing import List, Tuple
|
||||||
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from eive_tmtc.config.object_ids import RW1_ID, RW2_ID, RW3_ID, RW4_ID
|
from eive_tmtc.config.object_ids import RW1_ID, RW2_ID, RW3_ID, RW4_ID
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
from tmtccmd.config import CmdTreeNode
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||||
generate_one_hk_command,
|
generate_one_hk_command,
|
||||||
@ -23,7 +22,6 @@ from tmtccmd.pus.tc.s3_fsfw_hk import (
|
|||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode, Subservice
|
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode, Subservice
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from tmtccmd.util import ObjectIdU32
|
from tmtccmd.util import ObjectIdU32
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
|
|
||||||
@ -53,11 +51,11 @@ class InfoDev:
|
|||||||
|
|
||||||
|
|
||||||
class OpCodesAss:
|
class OpCodesAss:
|
||||||
ON = ["0", "on"]
|
ON = "on"
|
||||||
NML = ["1", "nml"]
|
NML = "nml"
|
||||||
OFF = ["2", "off"]
|
OFF = "off"
|
||||||
ALL_SPEED_UP = ["3", "speed_up"]
|
ALL_SPEED_UP = "speed_up"
|
||||||
ALL_SPEED_OFF = ["4", "speed_off"]
|
ALL_SPEED_OFF = "speed_off"
|
||||||
|
|
||||||
|
|
||||||
class ActionId:
|
class ActionId:
|
||||||
@ -99,55 +97,45 @@ class RampTime:
|
|||||||
MS_1000 = 1000
|
MS_1000 = 1000
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_reaction_wheels_nodes() -> List[CmdTreeNode]:
|
||||||
def add_rw_cmds(defs: TmtcDefinitionWrapper):
|
nodes = []
|
||||||
oce = OpCodeEntry()
|
for i in range(4):
|
||||||
oce.add(info=InfoDev.SPEED, keys=OpCodesDev.SPEED)
|
next_node = CmdTreeNode(
|
||||||
oce.add(info=InfoDev.ON, keys=OpCodesDev.ON)
|
f"rw_{i}", f"Reaction Wheel {i}", hide_children_which_are_leaves=True
|
||||||
oce.add(info=InfoDev.OFF, keys=OpCodesDev.OFF)
|
)
|
||||||
oce.add(info=InfoDev.NML, keys=OpCodesDev.NML)
|
next_node.add_child(CmdTreeNode(InfoDev.SPEED, OpCodesDev.SPEED))
|
||||||
oce.add(info=InfoDev.REQ_TM, keys=OpCodesDev.REQ_TM)
|
next_node.add_child(CmdTreeNode(InfoDev.ON, OpCodesDev.ON))
|
||||||
oce.add(info=InfoDev.GET_STATUS, keys=OpCodesDev.GET_STATUS)
|
next_node.add_child(CmdTreeNode(InfoDev.OFF, OpCodesDev.OFF))
|
||||||
oce.add(info=InfoDev.GET_TM, keys=OpCodesDev.GET_TM)
|
next_node.add_child(CmdTreeNode(InfoDev.NML, OpCodesDev.NML))
|
||||||
oce.add(info=InfoDev.ENABLE_STATUS_HK, keys=OpCodesDev.ENABLE_STATUS_HK)
|
next_node.add_child(CmdTreeNode(InfoDev.REQ_TM, OpCodesDev.REQ_TM))
|
||||||
oce.add(info=InfoDev.DISABLE_STATUS_HK, keys=OpCodesDev.DISABLE_STATUS_HK)
|
next_node.add_child(CmdTreeNode(InfoDev.GET_STATUS, OpCodesDev.GET_STATUS))
|
||||||
defs.add_service(
|
next_node.add_child(CmdTreeNode(InfoDev.GET_TM, OpCodesDev.GET_TM))
|
||||||
name=CustomServiceList.REACTION_WHEEL_1.value,
|
next_node.add_child(
|
||||||
info="Reaction Wheel 1",
|
CmdTreeNode(InfoDev.ENABLE_STATUS_HK, OpCodesDev.ENABLE_STATUS_HK)
|
||||||
op_code_entry=oce,
|
)
|
||||||
)
|
next_node.add_child(
|
||||||
defs.add_service(
|
CmdTreeNode(InfoDev.DISABLE_STATUS_HK, OpCodesDev.DISABLE_STATUS_HK)
|
||||||
name=CustomServiceList.REACTION_WHEEL_2.value,
|
)
|
||||||
info="Reaction Wheel 2",
|
nodes.append(next_node)
|
||||||
op_code_entry=oce,
|
return nodes
|
||||||
)
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.REACTION_WHEEL_3.value,
|
|
||||||
info="Reaction Wheel 3",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.REACTION_WHEEL_4.value,
|
|
||||||
info="Reaction Wheel 4",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
|
||||||
oce = OpCodeEntry()
|
|
||||||
oce.add(info=InfoAss.ON, keys=OpCodesAss.ON)
|
|
||||||
oce.add(info=InfoAss.NML, keys=OpCodesAss.NML)
|
|
||||||
oce.add(info=InfoAss.OFF, keys=OpCodesAss.OFF)
|
|
||||||
oce.add(info=InfoAss.ALL_SPEED_UP, keys=OpCodesAss.ALL_SPEED_UP)
|
|
||||||
oce.add(info=InfoAss.ALL_SPEED_OFF, keys=OpCodesAss.ALL_SPEED_OFF)
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.RW_ASSEMBLY.value,
|
|
||||||
info="Reaction Wheel Assembly",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def pack_single_rw_test_into( # noqa C901: Complexity is okay here.
|
def create_reaction_wheel_assembly_node() -> CmdTreeNode:
|
||||||
object_id: bytes, rw_idx: int, q: DefaultPusQueueHelper, op_code: str
|
node = CmdTreeNode(
|
||||||
|
"rw_assy", "Reaction Wheels Assembly", hide_children_which_are_leaves=True
|
||||||
|
)
|
||||||
|
node.add_child(CmdTreeNode(OpCodesAss.ON, InfoAss.ON))
|
||||||
|
node.add_child(CmdTreeNode(OpCodesAss.NML, InfoAss.NML))
|
||||||
|
node.add_child(CmdTreeNode(OpCodesAss.OFF, InfoAss.OFF))
|
||||||
|
node.add_child(CmdTreeNode(OpCodesAss.ALL_SPEED_UP, InfoAss.ALL_SPEED_UP))
|
||||||
|
node.add_child(CmdTreeNode(OpCodesAss.ALL_SPEED_OFF, InfoAss.ALL_SPEED_OFF))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
|
def create_single_rw_cmd( # noqa C901: Complexity is okay here.
|
||||||
|
object_id: bytes, rw_idx: int, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
):
|
):
|
||||||
if op_code == OpCodesDev.SPEED:
|
if cmd_str == OpCodesDev.SPEED:
|
||||||
speed, ramp_time = prompt_speed_ramp_time()
|
speed, ramp_time = prompt_speed_ramp_time()
|
||||||
q.add_log_cmd(
|
q.add_log_cmd(
|
||||||
f"RW {rw_idx}: {InfoDev.SPEED} with target "
|
f"RW {rw_idx}: {InfoDev.SPEED} with target "
|
||||||
@ -155,41 +143,41 @@ def pack_single_rw_test_into( # noqa C901: Complexity is okay here.
|
|||||||
)
|
)
|
||||||
q.add_pus_tc(pack_set_speed_command(object_id, speed, ramp_time))
|
q.add_pus_tc(pack_set_speed_command(object_id, speed, ramp_time))
|
||||||
|
|
||||||
if op_code == OpCodesDev.ON:
|
if cmd_str == OpCodesDev.ON:
|
||||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.ON}")
|
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.ON}")
|
||||||
mode_data = pack_mode_data(object_id, Mode.ON, 0)
|
mode_data = pack_mode_data(object_id, Mode.ON, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||||
|
|
||||||
if op_code == OpCodesDev.NML:
|
if cmd_str == OpCodesDev.NML:
|
||||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.NML}")
|
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.NML}")
|
||||||
mode_data = pack_mode_data(object_id, Mode.NORMAL, 0)
|
mode_data = pack_mode_data(object_id, Mode.NORMAL, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||||
|
|
||||||
if op_code == OpCodesDev.OFF:
|
if cmd_str == OpCodesDev.OFF:
|
||||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.OFF}")
|
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.OFF}")
|
||||||
mode_data = pack_mode_data(object_id, Mode.OFF, 0)
|
mode_data = pack_mode_data(object_id, Mode.OFF, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||||
|
|
||||||
if op_code == OpCodesDev.GET_TM:
|
if cmd_str == OpCodesDev.GET_TM:
|
||||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.GET_TM}")
|
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.GET_TM}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_hk_command(
|
generate_one_hk_command(
|
||||||
sid=make_sid(object_id=object_id, set_id=RwSetId.TM_SET)
|
sid=make_sid(object_id=object_id, set_id=RwSetId.TM_SET)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCodesDev.REQ_TM:
|
if cmd_str == OpCodesDev.REQ_TM:
|
||||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.REQ_TM}")
|
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.REQ_TM}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(object_id=object_id, action_id=ActionId.REQUEST_TM)
|
create_action_cmd(object_id=object_id, action_id=ActionId.REQUEST_TM)
|
||||||
)
|
)
|
||||||
if op_code in OpCodesDev.GET_STATUS:
|
if cmd_str == OpCodesDev.GET_STATUS:
|
||||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.GET_STATUS}")
|
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.GET_STATUS}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_diag_command(
|
generate_one_diag_command(
|
||||||
sid=make_sid(object_id=object_id, set_id=RwSetId.STATUS_SET_ID)
|
sid=make_sid(object_id=object_id, set_id=RwSetId.STATUS_SET_ID)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCodesDev.ENABLE_STATUS_HK:
|
if cmd_str == OpCodesDev.ENABLE_STATUS_HK:
|
||||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.ENABLE_STATUS_HK}")
|
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.ENABLE_STATUS_HK}")
|
||||||
interval = float(input("Please enter HK interval in floating point seconds: "))
|
interval = float(input("Please enter HK interval in floating point seconds: "))
|
||||||
cmds = enable_periodic_hk_command_with_interval(
|
cmds = enable_periodic_hk_command_with_interval(
|
||||||
@ -197,7 +185,7 @@ def pack_single_rw_test_into( # noqa C901: Complexity is okay here.
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCodesDev.DISABLE_STATUS_HK:
|
if cmd_str == OpCodesDev.DISABLE_STATUS_HK:
|
||||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.DISABLE_STATUS_HK}")
|
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.DISABLE_STATUS_HK}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
disable_periodic_hk_command(
|
disable_periodic_hk_command(
|
||||||
@ -206,38 +194,38 @@ def pack_single_rw_test_into( # noqa C901: Complexity is okay here.
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def pack_rw_ass_cmds(q: DefaultPusQueueHelper, object_id: bytes, op_code: str):
|
def pack_rw_ass_cmds(q: DefaultPusQueueHelper, object_id: bytes, cmd_str: str):
|
||||||
if op_code in OpCodesAss.OFF:
|
if cmd_str in OpCodesAss.OFF:
|
||||||
data = pack_mode_data(object_id=object_id, mode=Mode.OFF, submode=0)
|
data = pack_mode_data(object_id=object_id, mode=Mode.OFF, submode=0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCodesAss.ON:
|
if cmd_str in OpCodesAss.ON:
|
||||||
data = pack_mode_data(object_id=object_id, mode=Mode.ON, submode=0)
|
data = pack_mode_data(object_id=object_id, mode=Mode.ON, submode=0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCodesAss.NML:
|
if cmd_str in OpCodesAss.NML:
|
||||||
data = pack_mode_data(object_id=object_id, mode=Mode.NORMAL, submode=0)
|
data = pack_mode_data(object_id=object_id, mode=Mode.NORMAL, submode=0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCodesAss.ALL_SPEED_UP:
|
if cmd_str in OpCodesAss.ALL_SPEED_UP:
|
||||||
speed, ramp_time = prompt_speed_ramp_time()
|
speed, ramp_time = prompt_speed_ramp_time()
|
||||||
rw_speed_up_cmd_consec(q, [RW1_ID, RW2_ID, RW3_ID, RW4_ID], speed, ramp_time)
|
rw_speed_up_cmd_consec(q, [RW1_ID, RW2_ID, RW3_ID, RW4_ID], speed, ramp_time)
|
||||||
if op_code in OpCodesAss.ALL_SPEED_OFF:
|
if cmd_str in OpCodesAss.ALL_SPEED_OFF:
|
||||||
rw_speed_down_cmd_consec(
|
rw_speed_down_cmd_consec(
|
||||||
q, [RW1_ID, RW2_ID, RW3_ID, RW4_ID], prompt_ramp_time()
|
q, [RW1_ID, RW2_ID, RW3_ID, RW4_ID], prompt_ramp_time()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def prompt_speed_ramp_time() -> (int, int):
|
def prompt_speed_ramp_time() -> Tuple[int, int]:
|
||||||
speed = int(
|
speed = int(
|
||||||
input("Specify speed [0.1 RPM, 0 or range [-65000, -1000] and [1000, 65000]: ")
|
input("Specify speed [0.1 RPM, 0 or range [-65000, -1000] and [1000, 65000]: ")
|
||||||
)
|
)
|
||||||
|
@ -9,13 +9,12 @@ import datetime
|
|||||||
import enum
|
import enum
|
||||||
import logging
|
import logging
|
||||||
import struct
|
import struct
|
||||||
|
from typing import List, Tuple
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from eive_tmtc.utility.input_helper import InputHelper
|
from eive_tmtc.utility.input_helper import InputHelper
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
from tmtccmd.config import CmdTreeNode
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||||
create_request_one_diag_command,
|
create_request_one_diag_command,
|
||||||
create_request_one_hk_command,
|
create_request_one_hk_command,
|
||||||
@ -23,6 +22,7 @@ from tmtccmd.pus.tc.s3_fsfw_hk import (
|
|||||||
disable_periodic_hk_command,
|
disable_periodic_hk_command,
|
||||||
make_sid,
|
make_sid,
|
||||||
)
|
)
|
||||||
|
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd, create_scalar_u8_parameter
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode
|
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode
|
||||||
@ -33,6 +33,16 @@ from eive_tmtc.config.object_ids import STR_ASSEMBLY, STAR_TRACKER_ID
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class FirmwareTarget(enum.IntEnum):
|
||||||
|
MAIN = 1
|
||||||
|
BACKUP = 10
|
||||||
|
|
||||||
|
|
||||||
|
class ParamId(enum.IntEnum):
|
||||||
|
FIRMWARE_TARGET = 1
|
||||||
|
FIRMWARE_TARGET_PERSISTENT = 2
|
||||||
|
|
||||||
|
|
||||||
class StarTrackerActionId(enum.IntEnum):
|
class StarTrackerActionId(enum.IntEnum):
|
||||||
PING = 0
|
PING = 0
|
||||||
BOOT = 1
|
BOOT = 1
|
||||||
@ -95,7 +105,10 @@ class StarTrackerActionId(enum.IntEnum):
|
|||||||
LOGLEVEL = 81
|
LOGLEVEL = 81
|
||||||
LOG_SUBSCRIPTION = 82
|
LOG_SUBSCRIPTION = 82
|
||||||
DEBUG_CAMERA = 83
|
DEBUG_CAMERA = 83
|
||||||
|
# Legacy variable.
|
||||||
FIRMWARE_UPDATE = 84
|
FIRMWARE_UPDATE = 84
|
||||||
|
FIRMWARE_UPDATE_MAIN = 84
|
||||||
|
FIRMWARE_UPDATE_BACKUP = 101
|
||||||
SET_TIME_FROM_SYS_TIME = 87
|
SET_TIME_FROM_SYS_TIME = 87
|
||||||
ADD_SECONDARY_TM_TO_NORMAL_MODE = 95
|
ADD_SECONDARY_TM_TO_NORMAL_MODE = 95
|
||||||
RESET_SECONDARY_TM_SET = 96
|
RESET_SECONDARY_TM_SET = 96
|
||||||
@ -119,12 +132,23 @@ class OpCode:
|
|||||||
UPLOAD_IMAGE = "upload_image"
|
UPLOAD_IMAGE = "upload_image"
|
||||||
DOWNLOAD_IMAGE = "download_image"
|
DOWNLOAD_IMAGE = "download_image"
|
||||||
SET_IMG_PROCESSOR_MODE = "set_img_proc_mode"
|
SET_IMG_PROCESSOR_MODE = "set_img_proc_mode"
|
||||||
FW_UPDATE = "fw_update"
|
FW_UPDATE_MAIN = "fw_update_main"
|
||||||
SET_TIME_FROM_SYS_TIME = "set_time"
|
SET_TIME_FROM_SYS_TIME = "set_time"
|
||||||
RELOAD_JSON_CFG_FILE = "reload_json_cfg"
|
RELOAD_JSON_CFG_FILE = "reload_json_cfg"
|
||||||
|
FW_UPDATE_BACKUP = "fw_update_backup"
|
||||||
|
SELECT_TARGET_FIRMWARE_MAIN = "fw_main"
|
||||||
|
SELECT_TARGET_FIRMWARE_BACKUP = "fw_backup"
|
||||||
|
SELECT_TARGET_FIRMWARE_MAIN_PERSISTENT = "fw_main_persistent"
|
||||||
|
SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT = "fw_backup_persistent"
|
||||||
|
REQUEST_VERSION = "request_version"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
|
ON_BOOTLOADER = "Switch to Mode On, Submode Bootloder"
|
||||||
|
ON_FIRMWARE = "Switch to Mode On, Submode Firmware"
|
||||||
|
NORMAL = "Switch to Mode Normal"
|
||||||
|
OFF = "Switch to Mode Off"
|
||||||
|
PING = "Send Ping"
|
||||||
ONE_SHOOT_HK = "One shoot HK Set"
|
ONE_SHOOT_HK = "One shoot HK Set"
|
||||||
ENABLE_HK = "Enable Periodic HK"
|
ENABLE_HK = "Enable Periodic HK"
|
||||||
DISABLE_HK = "Disable Periodic HK"
|
DISABLE_HK = "Disable Periodic HK"
|
||||||
@ -135,9 +159,17 @@ class Info:
|
|||||||
DOWNLOAD_IMAGE = "Download Optical Image"
|
DOWNLOAD_IMAGE = "Download Optical Image"
|
||||||
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_MAIN = "Update Main Firmware Slot"
|
||||||
|
FW_UPDATE_BACKUP = "Update Backup Firmware Slot"
|
||||||
SET_TIME_FROM_SYS_TIME = "Set time from system time"
|
SET_TIME_FROM_SYS_TIME = "Set time from system time"
|
||||||
RELOAD_JSON_CFG_FILE = "Reload JSON configuration file. Reboot still required."
|
RELOAD_JSON_CFG_FILE = "Reload JSON configuration file. Reboot still required."
|
||||||
|
SELECT_TARGET_FIRMWARE_MAIN = "Select main firmware slot"
|
||||||
|
SELECT_TARGET_FIRMWARE_BACKUP = "Select backup firmware slot"
|
||||||
|
SELECT_TARGET_FIRMWARE_MAIN_PERSISTENT = "Select main firmware slot persistently"
|
||||||
|
SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT = (
|
||||||
|
"Select backup firmware slot persistently"
|
||||||
|
)
|
||||||
|
REQUEST_VERSION = "Request the active Firmware Version"
|
||||||
|
|
||||||
|
|
||||||
class SetId(enum.IntEnum):
|
class SetId(enum.IntEnum):
|
||||||
@ -159,6 +191,7 @@ class SetId(enum.IntEnum):
|
|||||||
BLOBS = 92
|
BLOBS = 92
|
||||||
CENTROID = 93
|
CENTROID = 93
|
||||||
CENTROIDS = 94
|
CENTROIDS = 94
|
||||||
|
BLOB_STATS = 102
|
||||||
|
|
||||||
|
|
||||||
class DataSetRequest(enum.IntEnum):
|
class DataSetRequest(enum.IntEnum):
|
||||||
@ -241,68 +274,64 @@ def prompt_object_id_mode_cmd() -> bytes:
|
|||||||
|
|
||||||
|
|
||||||
def pack_star_tracker_commands( # noqa C901
|
def pack_star_tracker_commands( # noqa C901
|
||||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
):
|
):
|
||||||
q.add_log_cmd(
|
q.add_log_cmd(
|
||||||
f"Generate command for star tracker with object id: {object_id.as_hex_string}"
|
f"Generate command for star tracker with object id: {object_id.as_hex_string}"
|
||||||
)
|
)
|
||||||
obyt = object_id.as_bytes
|
obyt = object_id.as_bytes
|
||||||
if op_code == OpCode.ON_BOOTLOADER:
|
if cmd_str == OpCode.ON_BOOTLOADER:
|
||||||
q.add_log_cmd("Star tracker: Mode On, Submode Bootloader")
|
q.add_log_cmd("Star tracker: Mode On, Submode Bootloader")
|
||||||
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.ON, Submode.BOOTLOADER)
|
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.ON, Submode.BOOTLOADER)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||||
if op_code == OpCode.ON_FIRMWARE:
|
if cmd_str == OpCode.ON_FIRMWARE:
|
||||||
q.add_log_cmd("Star tracker: Mode On, Submode Firmware")
|
q.add_log_cmd("Star tracker: Mode On, Submode Firmware")
|
||||||
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.ON, Submode.FIRMWARE)
|
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.ON, Submode.FIRMWARE)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||||
if op_code == OpCode.NORMAL:
|
if cmd_str == OpCode.NORMAL:
|
||||||
q.add_log_cmd("Star tracker: Mode Normal")
|
q.add_log_cmd("Star tracker: Mode Normal")
|
||||||
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.NORMAL, 0)
|
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.NORMAL, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd("Star tracker: Mode Off")
|
q.add_log_cmd("Star tracker: Mode Off")
|
||||||
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.OFF, 0)
|
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.OFF, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||||
if op_code == OpCode.ONE_SHOOT_HK:
|
if cmd_str == OpCode.ONE_SHOOT_HK:
|
||||||
q.add_log_cmd(Info.ONE_SHOOT_HK)
|
q.add_log_cmd(Info.ONE_SHOOT_HK)
|
||||||
request_dataset(q, DataSetRequest.ONESHOT)
|
request_dataset(q, DataSetRequest.ONESHOT)
|
||||||
if op_code == OpCode.ENABLE_HK:
|
if cmd_str == OpCode.ENABLE_HK:
|
||||||
q.add_log_cmd(Info.ENABLE_HK)
|
q.add_log_cmd(Info.ENABLE_HK)
|
||||||
request_dataset(q, DataSetRequest.ENABLE)
|
request_dataset(q, DataSetRequest.ENABLE)
|
||||||
if op_code == OpCode.DISABLE_HK:
|
if cmd_str == OpCode.DISABLE_HK:
|
||||||
q.add_log_cmd(Info.DISABLE_HK)
|
q.add_log_cmd(Info.DISABLE_HK)
|
||||||
request_dataset(q, DataSetRequest.DISABLE)
|
request_dataset(q, DataSetRequest.DISABLE)
|
||||||
if op_code == "4":
|
if cmd_str == "4":
|
||||||
q.add_log_cmd("Star tracker: Mode Raw")
|
q.add_log_cmd("Star tracker: Mode Raw")
|
||||||
data = pack_mode_data(obyt, Mode.RAW, 0)
|
data = pack_mode_data(obyt, Mode.RAW, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||||
if op_code == OpCode.PING:
|
if cmd_str == OpCode.PING:
|
||||||
q.add_log_cmd("Star tracker: Ping")
|
q.add_log_cmd("Star tracker: Ping")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.PING)
|
data = obyt + struct.pack("!I", StarTrackerActionId.PING)
|
||||||
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 == "6":
|
if cmd_str == "6":
|
||||||
q.add_log_cmd("Star tracker: Switch to bootloader program")
|
q.add_log_cmd("Star tracker: Switch to bootloader program")
|
||||||
data = obyt + struct.pack(
|
data = obyt + struct.pack(
|
||||||
"!I", StarTrackerActionId.SWITCH_TO_BOOTLOADER_PROGRAM
|
"!I", StarTrackerActionId.SWITCH_TO_BOOTLOADER_PROGRAM
|
||||||
)
|
)
|
||||||
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 == "7":
|
if cmd_str == "7":
|
||||||
q.add_log_cmd("Star tracker: Temperature request")
|
q.add_log_cmd("Star tracker: Temperature request")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TEMPERATURE)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TEMPERATURE)
|
||||||
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 == "8":
|
if cmd_str == "9":
|
||||||
q.add_log_cmd("Star tracker: Request version")
|
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_VERSION)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
|
||||||
if op_code == "9":
|
|
||||||
q.add_log_cmd("Star tracker: Request interface")
|
q.add_log_cmd("Star tracker: Request interface")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_INTERFACE)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_INTERFACE)
|
||||||
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 == "10":
|
if cmd_str == "10":
|
||||||
q.add_log_cmd("Star tracker: Request power")
|
q.add_log_cmd("Star tracker: Request power")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_POWER)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_POWER)
|
||||||
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 == "11":
|
if cmd_str == "11":
|
||||||
q.add_log_cmd("Star tracker: Set subscription parameters")
|
q.add_log_cmd("Star tracker: Set subscription parameters")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -311,15 +340,15 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "12":
|
if cmd_str == "12":
|
||||||
q.add_log_cmd("Star tracker: Boot")
|
q.add_log_cmd("Star tracker: Boot")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.BOOT)
|
data = obyt + struct.pack("!I", StarTrackerActionId.BOOT)
|
||||||
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 == "13":
|
if cmd_str == "13":
|
||||||
q.add_log_cmd("Star tracker: Request time")
|
q.add_log_cmd("Star tracker: Request time")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TIME)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_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 == OpCode.UPLOAD_IMAGE:
|
if cmd_str == OpCode.UPLOAD_IMAGE:
|
||||||
q.add_log_cmd("Star tracker: Upload image")
|
q.add_log_cmd("Star tracker: Upload image")
|
||||||
image = get_upload_image()
|
image = get_upload_image()
|
||||||
data = (
|
data = (
|
||||||
@ -328,7 +357,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(image, "utf-8")
|
+ bytearray(image, "utf-8")
|
||||||
)
|
)
|
||||||
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 == OpCode.DOWNLOAD_IMAGE:
|
if cmd_str == OpCode.DOWNLOAD_IMAGE:
|
||||||
q.add_log_cmd(f"STR: {Info.DOWNLOAD_IMAGE}")
|
q.add_log_cmd(f"STR: {Info.DOWNLOAD_IMAGE}")
|
||||||
path = input("Specify storage location (default - /mnt/sd0/startracker): ")
|
path = input("Specify storage location (default - /mnt/sd0/startracker): ")
|
||||||
if not path:
|
if not path:
|
||||||
@ -339,7 +368,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(path, "utf-8")
|
+ bytearray(path, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "17":
|
if cmd_str == "17":
|
||||||
q.add_log_cmd("Star tracker: Set limits")
|
q.add_log_cmd("Star tracker: Set limits")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -348,7 +377,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "18":
|
if cmd_str == "18":
|
||||||
q.add_log_cmd("Star tracker: Set tracking parameters")
|
q.add_log_cmd("Star tracker: Set tracking parameters")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -357,7 +386,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "19":
|
if cmd_str == "19":
|
||||||
q.add_log_cmd("Star tracker: Mounting")
|
q.add_log_cmd("Star tracker: Mounting")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -366,7 +395,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "20":
|
if cmd_str == "20":
|
||||||
q.add_log_cmd("Star tracker: Camera")
|
q.add_log_cmd("Star tracker: Camera")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -375,7 +404,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "22":
|
if cmd_str == "22":
|
||||||
q.add_log_cmd("Star tracker: Centroiding")
|
q.add_log_cmd("Star tracker: Centroiding")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -384,7 +413,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "23":
|
if cmd_str == "23":
|
||||||
q.add_log_cmd("Star tracker: LISA")
|
q.add_log_cmd("Star tracker: LISA")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -393,7 +422,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "24":
|
if cmd_str == "24":
|
||||||
q.add_log_cmd("Star tracker: Matching")
|
q.add_log_cmd("Star tracker: Matching")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -402,7 +431,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "25":
|
if cmd_str == "25":
|
||||||
q.add_log_cmd("Star tracker: Validation")
|
q.add_log_cmd("Star tracker: Validation")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -411,7 +440,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "26":
|
if cmd_str == "26":
|
||||||
q.add_log_cmd("Star tracker: Algo")
|
q.add_log_cmd("Star tracker: Algo")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -420,7 +449,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == OpCode.TAKE_IMAGE:
|
if cmd_str == OpCode.TAKE_IMAGE:
|
||||||
q.add_log_cmd("Star tracker: Take image")
|
q.add_log_cmd("Star tracker: Take image")
|
||||||
actionid = int(
|
actionid = int(
|
||||||
input("Specify parameter ID (4: take image, 7: get histogram): ")
|
input("Specify parameter ID (4: take image, 7: get histogram): ")
|
||||||
@ -431,11 +460,11 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ struct.pack("!B", actionid)
|
+ struct.pack("!B", actionid)
|
||||||
)
|
)
|
||||||
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 == "28":
|
if cmd_str == "28":
|
||||||
q.add_log_cmd("Star tracker: Stop str helper")
|
q.add_log_cmd("Star tracker: Stop str helper")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.STOP_STR_HELPER)
|
data = obyt + struct.pack("!I", StarTrackerActionId.STOP_STR_HELPER)
|
||||||
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 == "30":
|
if cmd_str == "30":
|
||||||
q.add_log_cmd("Star tracker: Set name of download image")
|
q.add_log_cmd("Star tracker: Set name of download image")
|
||||||
filename = input("Specify download image name: ")
|
filename = input("Specify download image name: ")
|
||||||
data = (
|
data = (
|
||||||
@ -444,15 +473,15 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(filename, "utf-8")
|
+ bytearray(filename, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "31":
|
if cmd_str == "31":
|
||||||
q.add_log_cmd("Star tracker: Request histogram")
|
q.add_log_cmd("Star tracker: Request histogram")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_HISTOGRAM)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_HISTOGRAM)
|
||||||
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 == "32":
|
if cmd_str == "32":
|
||||||
q.add_log_cmd("Star tracker: Request contrast")
|
q.add_log_cmd("Star tracker: Request contrast")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CONTRAST)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CONTRAST)
|
||||||
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 == "33":
|
if cmd_str == "33":
|
||||||
q.add_log_cmd("Star tracker: Set json filename")
|
q.add_log_cmd("Star tracker: Set json filename")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -461,11 +490,11 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "35":
|
if cmd_str == "35":
|
||||||
q.add_log_cmd("Star tracker: Flash read")
|
q.add_log_cmd("Star tracker: Flash read")
|
||||||
data = pack_read_command(obyt)
|
data = pack_read_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 == "36":
|
if cmd_str == "36":
|
||||||
q.add_log_cmd("Star tracker: Set flash read filename")
|
q.add_log_cmd("Star tracker: Set flash read filename")
|
||||||
filename = input("Specify filename: ")
|
filename = input("Specify filename: ")
|
||||||
data = (
|
data = (
|
||||||
@ -474,15 +503,15 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(filename, "utf-8")
|
+ bytearray(filename, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "37":
|
if cmd_str == "37":
|
||||||
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 == OpCode.SET_TIME_FROM_SYS_TIME:
|
if cmd_str == OpCode.SET_TIME_FROM_SYS_TIME:
|
||||||
q.add_log_cmd(Info.SET_TIME_FROM_SYS_TIME)
|
q.add_log_cmd(Info.SET_TIME_FROM_SYS_TIME)
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.SET_TIME_FROM_SYS_TIME)
|
data = obyt + struct.pack("!I", StarTrackerActionId.SET_TIME_FROM_SYS_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 cmd_str == "39":
|
||||||
q.add_log_cmd("Star tracker: Download Centroid")
|
q.add_log_cmd("Star tracker: Download Centroid")
|
||||||
id = 0
|
id = 0
|
||||||
data = (
|
data = (
|
||||||
@ -491,7 +520,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ struct.pack("!B", id)
|
+ struct.pack("!B", id)
|
||||||
)
|
)
|
||||||
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 == "41":
|
if cmd_str == "41":
|
||||||
q.add_log_cmd("Star tracker: Download matched star")
|
q.add_log_cmd("Star tracker: Download matched star")
|
||||||
id = 0
|
id = 0
|
||||||
data = (
|
data = (
|
||||||
@ -500,7 +529,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ struct.pack("!B", id)
|
+ struct.pack("!B", id)
|
||||||
)
|
)
|
||||||
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 == "42":
|
if cmd_str == "42":
|
||||||
q.add_log_cmd("Star tracker: Download DB Image")
|
q.add_log_cmd("Star tracker: Download DB Image")
|
||||||
id = 0
|
id = 0
|
||||||
data = (
|
data = (
|
||||||
@ -509,7 +538,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ struct.pack("!B", id)
|
+ struct.pack("!B", id)
|
||||||
)
|
)
|
||||||
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 == "43":
|
if cmd_str == "43":
|
||||||
q.add_log_cmd("Star tracker: Download Blob Pixel")
|
q.add_log_cmd("Star tracker: Download Blob Pixel")
|
||||||
id = 0
|
id = 0
|
||||||
type = 1 # 0 - normal, 1 - fast
|
type = 1 # 0 - normal, 1 - fast
|
||||||
@ -520,7 +549,7 @@ 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 == "47":
|
if cmd_str == "47":
|
||||||
q.add_log_cmd("Star tracker: FPGA action")
|
q.add_log_cmd("Star tracker: FPGA action")
|
||||||
id = 3
|
id = 3
|
||||||
data = (
|
data = (
|
||||||
@ -529,19 +558,19 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ struct.pack("!B", id)
|
+ struct.pack("!B", id)
|
||||||
)
|
)
|
||||||
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 == "48":
|
if cmd_str == "48":
|
||||||
q.add_log_cmd("Star tracker: Unlock")
|
q.add_log_cmd("Star tracker: Unlock")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.UNLOCK)
|
data = obyt + struct.pack("!I", StarTrackerActionId.UNLOCK)
|
||||||
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 == "49":
|
if cmd_str == "49":
|
||||||
q.add_log_cmd("Star tracker: Request camera parameters")
|
q.add_log_cmd("Star tracker: Request camera parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CAMERA_PARAMS)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CAMERA_PARAMS)
|
||||||
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 == "50":
|
if cmd_str == "50":
|
||||||
q.add_log_cmd("Star tracker: Request limits")
|
q.add_log_cmd("Star tracker: Request limits")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LIMITS)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LIMITS)
|
||||||
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 == OpCode.SET_IMG_PROCESSOR_MODE:
|
if cmd_str == OpCode.SET_IMG_PROCESSOR_MODE:
|
||||||
q.add_log_cmd(Info.SET_IMG_PROCESSOR_MODE)
|
q.add_log_cmd(Info.SET_IMG_PROCESSOR_MODE)
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -550,7 +579,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "52":
|
if cmd_str == "52":
|
||||||
q.add_log_cmd("Star tracker: EGSE load ground config camera parameters")
|
q.add_log_cmd("Star tracker: EGSE load ground config camera parameters")
|
||||||
data = (
|
data = (
|
||||||
obyt
|
obyt
|
||||||
@ -558,7 +587,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(FileDefs.egse_ground_config, "utf-8")
|
+ bytearray(FileDefs.egse_ground_config, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "53":
|
if cmd_str == "53":
|
||||||
q.add_log_cmd("Star tracker: EGSE load flight config camera parameters")
|
q.add_log_cmd("Star tracker: EGSE load flight config camera parameters")
|
||||||
data = (
|
data = (
|
||||||
obyt
|
obyt
|
||||||
@ -566,55 +595,55 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(FileDefs.egse_flight_config, "utf-8")
|
+ bytearray(FileDefs.egse_flight_config, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "54":
|
if cmd_str == "54":
|
||||||
q.add_log_cmd("Star tracker: Request log level parameters")
|
q.add_log_cmd("Star tracker: Request log level parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LOG_LEVEL)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LOG_LEVEL)
|
||||||
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 == "55":
|
if cmd_str == "55":
|
||||||
q.add_log_cmd("Star tracker: Request mounting parameters")
|
q.add_log_cmd("Star tracker: Request mounting parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_MOUNTING)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_MOUNTING)
|
||||||
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 == "56":
|
if cmd_str == "56":
|
||||||
q.add_log_cmd("Star tracker: Request image processor parameters")
|
q.add_log_cmd("Star tracker: Request image processor parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_IMAGE_PROCESSOR)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_IMAGE_PROCESSOR)
|
||||||
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 == "57":
|
if cmd_str == "57":
|
||||||
q.add_log_cmd("Star tracker: Request centroiding parameters")
|
q.add_log_cmd("Star tracker: Request centroiding parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CENTROIDING)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CENTROIDING)
|
||||||
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 == "58":
|
if cmd_str == "58":
|
||||||
q.add_log_cmd("Star tracker: Request lisa parameters")
|
q.add_log_cmd("Star tracker: Request lisa parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LISA)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LISA)
|
||||||
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 == "59":
|
if cmd_str == "59":
|
||||||
q.add_log_cmd("Star tracker: Request matching parameters")
|
q.add_log_cmd("Star tracker: Request matching parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_MATCHING)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_MATCHING)
|
||||||
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 == "60":
|
if cmd_str == "60":
|
||||||
q.add_log_cmd("Star tracker: Request tracking parameters")
|
q.add_log_cmd("Star tracker: Request tracking parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TRACKING)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TRACKING)
|
||||||
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 == "61":
|
if cmd_str == "61":
|
||||||
q.add_log_cmd("Star tracker: Request validation parameters")
|
q.add_log_cmd("Star tracker: Request validation parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_VALIDATION)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_VALIDATION)
|
||||||
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 == "62":
|
if cmd_str == "62":
|
||||||
q.add_log_cmd("Star tracker: Request algo parameters")
|
q.add_log_cmd("Star tracker: Request algo parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_ALGO)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_ALGO)
|
||||||
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 == "63":
|
if cmd_str == "63":
|
||||||
q.add_log_cmd("Star tracker: Request subscription parameters")
|
q.add_log_cmd("Star tracker: Request subscription parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_SUBSCRIPTION)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_SUBSCRIPTION)
|
||||||
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 == "64":
|
if cmd_str == "64":
|
||||||
q.add_log_cmd("Star tracker: Request log subscription parameters")
|
q.add_log_cmd("Star tracker: Request log subscription parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LOG_SUBSCRIPTION)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LOG_SUBSCRIPTION)
|
||||||
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 == "65":
|
if cmd_str == "65":
|
||||||
q.add_log_cmd("Star tracker: Request debug camera parameters")
|
q.add_log_cmd("Star tracker: Request debug camera parameters")
|
||||||
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_DEBUG_CAMERA)
|
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_DEBUG_CAMERA)
|
||||||
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 == "66":
|
if cmd_str == "66":
|
||||||
q.add_log_cmd("Star tracker: Set log level parameters")
|
q.add_log_cmd("Star tracker: Set log level parameters")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -623,7 +652,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "67":
|
if cmd_str == "67":
|
||||||
q.add_log_cmd("Star tracker: Set log subscription parameters")
|
q.add_log_cmd("Star tracker: Set log subscription parameters")
|
||||||
|
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
@ -633,7 +662,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "68":
|
if cmd_str == "68":
|
||||||
q.add_log_cmd("Star tracker: Set debug camera parameters")
|
q.add_log_cmd("Star tracker: Set debug camera parameters")
|
||||||
json_file = get_config_file()
|
json_file = get_config_file()
|
||||||
data = (
|
data = (
|
||||||
@ -642,16 +671,25 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
+ bytearray(json_file, "utf-8")
|
+ bytearray(json_file, "utf-8")
|
||||||
)
|
)
|
||||||
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 == OpCode.FW_UPDATE:
|
if cmd_str == OpCode.FW_UPDATE_MAIN:
|
||||||
q.add_log_cmd(Info.FW_UPDATE)
|
q.add_log_cmd(Info.FW_UPDATE_MAIN)
|
||||||
firmware = get_firmware()
|
firmware = get_firmware()
|
||||||
data = (
|
data = (
|
||||||
obyt
|
obyt
|
||||||
+ struct.pack("!I", StarTrackerActionId.FIRMWARE_UPDATE)
|
+ struct.pack("!I", StarTrackerActionId.FIRMWARE_UPDATE_MAIN)
|
||||||
+ firmware.encode()
|
+ firmware.encode()
|
||||||
)
|
)
|
||||||
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 == OpCode.ADD_SECONDARY_TM_TO_NORMAL_MODE:
|
if cmd_str == OpCode.FW_UPDATE_BACKUP:
|
||||||
|
q.add_log_cmd(Info.FW_UPDATE_BACKUP)
|
||||||
|
firmware = get_firmware()
|
||||||
|
data = (
|
||||||
|
obyt
|
||||||
|
+ struct.pack("!I", StarTrackerActionId.FIRMWARE_UPDATE_BACKUP)
|
||||||
|
+ firmware.encode()
|
||||||
|
)
|
||||||
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
|
if cmd_str == OpCode.ADD_SECONDARY_TM_TO_NORMAL_MODE:
|
||||||
q.add_log_cmd(Info.ADD_SECONDARY_TM_TO_NORMAL_MODE)
|
q.add_log_cmd(Info.ADD_SECONDARY_TM_TO_NORMAL_MODE)
|
||||||
for val in SetId:
|
for val in SetId:
|
||||||
print("{:<2}: {:<20}".format(val, val.name))
|
print("{:<2}: {:<20}".format(val, val.name))
|
||||||
@ -663,7 +701,7 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
struct.pack("!I", set_id),
|
struct.pack("!I", set_id),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.RESET_SECONDARY_TM_SET:
|
if cmd_str == OpCode.RESET_SECONDARY_TM_SET:
|
||||||
q.add_log_cmd(Info.RESET_SECONDARY_TM_SET)
|
q.add_log_cmd(Info.RESET_SECONDARY_TM_SET)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
@ -671,18 +709,54 @@ def pack_star_tracker_commands( # noqa C901
|
|||||||
StarTrackerActionId.RESET_SECONDARY_TM_SET,
|
StarTrackerActionId.RESET_SECONDARY_TM_SET,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.READ_SECONDARY_TM_SET:
|
if cmd_str == OpCode.READ_SECONDARY_TM_SET:
|
||||||
q.add_log_cmd(Info.READ_SECONDARY_TM_SET)
|
q.add_log_cmd(Info.READ_SECONDARY_TM_SET)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
STAR_TRACKER_ID, StarTrackerActionId.READ_SECONDARY_TM_SET
|
STAR_TRACKER_ID, StarTrackerActionId.READ_SECONDARY_TM_SET
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.RELOAD_JSON_CFG_FILE:
|
if cmd_str == OpCode.RELOAD_JSON_CFG_FILE:
|
||||||
q.add_log_cmd(Info.RELOAD_JSON_CFG_FILE)
|
q.add_log_cmd(Info.RELOAD_JSON_CFG_FILE)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(STAR_TRACKER_ID, StarTrackerActionId.RELOAD_JSON_CFG_FILE)
|
create_action_cmd(STAR_TRACKER_ID, StarTrackerActionId.RELOAD_JSON_CFG_FILE)
|
||||||
)
|
)
|
||||||
|
if cmd_str == OpCode.SELECT_TARGET_FIRMWARE_MAIN:
|
||||||
|
q.add_log_cmd(Info.SELECT_TARGET_FIRMWARE_MAIN)
|
||||||
|
q.add_pus_tc(create_update_firmware_target_cmd(False, FirmwareTarget.MAIN))
|
||||||
|
if cmd_str == OpCode.SELECT_TARGET_FIRMWARE_BACKUP:
|
||||||
|
q.add_log_cmd(Info.SELECT_TARGET_FIRMWARE_BACKUP)
|
||||||
|
q.add_pus_tc(create_update_firmware_target_cmd(False, FirmwareTarget.BACKUP))
|
||||||
|
if cmd_str == OpCode.SELECT_TARGET_FIRMWARE_MAIN_PERSISTENT:
|
||||||
|
q.add_log_cmd(Info.SELECT_TARGET_FIRMWARE_BACKUP)
|
||||||
|
q.add_pus_tc(create_update_firmware_target_cmd(True, FirmwareTarget.MAIN))
|
||||||
|
if cmd_str == OpCode.SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT:
|
||||||
|
q.add_log_cmd(Info.SELECT_TARGET_FIRMWARE_BACKUP)
|
||||||
|
q.add_pus_tc(create_update_firmware_target_cmd(True, FirmwareTarget.BACKUP))
|
||||||
|
if cmd_str == OpCode.REQUEST_VERSION:
|
||||||
|
q.add_log_cmd(Info.REQUEST_VERSION)
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_action_cmd(
|
||||||
|
object_id=STAR_TRACKER_ID, action_id=StarTrackerActionId.REQ_VERSION
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_update_firmware_target_cmd(
|
||||||
|
persistent: bool, fw_target: FirmwareTarget
|
||||||
|
) -> PusTelecommand:
|
||||||
|
if persistent:
|
||||||
|
param_id = ParamId.FIRMWARE_TARGET_PERSISTENT
|
||||||
|
else:
|
||||||
|
param_id = ParamId.FIRMWARE_TARGET
|
||||||
|
return create_load_param_cmd(
|
||||||
|
create_scalar_u8_parameter(
|
||||||
|
STAR_TRACKER_ID,
|
||||||
|
0,
|
||||||
|
param_id,
|
||||||
|
fw_target,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def request_dataset(q: DefaultPusQueueHelper, req_type: DataSetRequest):
|
def request_dataset(q: DefaultPusQueueHelper, req_type: DataSetRequest):
|
||||||
@ -814,6 +888,10 @@ def handle_str_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
|||||||
handle_centroids_set(hk_data, pw)
|
handle_centroids_set(hk_data, pw)
|
||||||
elif set_id == SetId.CONTRAST:
|
elif set_id == SetId.CONTRAST:
|
||||||
handle_contrast_set(hk_data, pw)
|
handle_contrast_set(hk_data, pw)
|
||||||
|
elif set_id == SetId.BLOB_STATS:
|
||||||
|
handle_blob_stats_set(hk_data, pw)
|
||||||
|
elif set_id == SetId.VERSION:
|
||||||
|
handle_version_set(hk_data, pw)
|
||||||
else:
|
else:
|
||||||
_LOGGER.warning(f"HK parsing for Star Tracker set ID {set_id} unimplemented")
|
_LOGGER.warning(f"HK parsing for Star Tracker set ID {set_id} unimplemented")
|
||||||
|
|
||||||
@ -836,6 +914,25 @@ def unpack_time_hk(hk_data: bytes, current_idx: int, pw: PrintWrapper) -> int:
|
|||||||
return current_idx
|
return current_idx
|
||||||
|
|
||||||
|
|
||||||
|
def handle_version_set(hk_data: bytes, pw: PrintWrapper):
|
||||||
|
pw.dlog("Received Version Set")
|
||||||
|
if len(hk_data) != 16:
|
||||||
|
_LOGGER.warning(
|
||||||
|
f"Version dataset HK with length {len(hk_data)} of unexpected size"
|
||||||
|
)
|
||||||
|
current_idx = unpack_time_hk(hk_data, 0, pw)
|
||||||
|
program = struct.unpack("!B", hk_data[current_idx : current_idx + 1])[0]
|
||||||
|
pw.dlog(f"Program: {program}")
|
||||||
|
current_idx += 1
|
||||||
|
major = struct.unpack("!B", hk_data[current_idx : current_idx + 1])[0]
|
||||||
|
pw.dlog(f"Major: {major}")
|
||||||
|
current_idx += 1
|
||||||
|
minor = struct.unpack("!B", hk_data[current_idx : current_idx + 1])[0]
|
||||||
|
pw.dlog(f"Minor: {minor}")
|
||||||
|
current_idx += 1
|
||||||
|
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=5))
|
||||||
|
|
||||||
|
|
||||||
def handle_temperature_set(hk_data: bytes, pw: PrintWrapper):
|
def handle_temperature_set(hk_data: bytes, pw: PrintWrapper):
|
||||||
pw.dlog("Received temperature set")
|
pw.dlog("Received temperature set")
|
||||||
if len(hk_data) < 24:
|
if len(hk_data) < 24:
|
||||||
@ -924,7 +1021,7 @@ def handle_solution_set(hk_data: bytes, pw: PrintWrapper):
|
|||||||
solution_strategy = hk_data[current_idx]
|
solution_strategy = hk_data[current_idx]
|
||||||
pw.dlog(f"Solution strategy: {solution_strategy}")
|
pw.dlog(f"Solution strategy: {solution_strategy}")
|
||||||
current_idx += 1
|
current_idx += 1
|
||||||
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 23)
|
print(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 23))
|
||||||
|
|
||||||
|
|
||||||
def handle_blob_set(hk_data: bytes, pw: PrintWrapper):
|
def handle_blob_set(hk_data: bytes, pw: PrintWrapper):
|
||||||
@ -1116,6 +1213,35 @@ def handle_contrast_set(hk_data: bytes, pw: PrintWrapper):
|
|||||||
handle_histo_or_contrast_set("Contrast", hk_data, pw)
|
handle_histo_or_contrast_set("Contrast", hk_data, pw)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_blob_stats_set(hk_data: bytes, pw: PrintWrapper):
|
||||||
|
pw.dlog("Received Blob Stats Set")
|
||||||
|
if len(hk_data) < 65:
|
||||||
|
raise ValueError(
|
||||||
|
f"Matched BlobStats set with length {len(hk_data)} too short. Expected 65 bytes."
|
||||||
|
)
|
||||||
|
current_idx = unpack_time_hk(hk_data, 0, pw)
|
||||||
|
|
||||||
|
def fill_list(current_idx: int) -> Tuple[List[int], int]:
|
||||||
|
list_to_fill = []
|
||||||
|
for _ in range(16):
|
||||||
|
list_to_fill.append(hk_data[current_idx])
|
||||||
|
current_idx += 1
|
||||||
|
return list_to_fill, current_idx
|
||||||
|
|
||||||
|
noise_list, current_idx = fill_list(current_idx)
|
||||||
|
threshold_list, current_idx = fill_list(current_idx)
|
||||||
|
lvalid_list, current_idx = fill_list(current_idx)
|
||||||
|
oflow_list, current_idx = fill_list(current_idx)
|
||||||
|
pw.dlog("Index | Noise | Threshold | LValid | Oflow")
|
||||||
|
for i in range(16):
|
||||||
|
pw.dlog(
|
||||||
|
"{:<3} {:<3} {:<3} {:<3} {:<3}".format(
|
||||||
|
i, noise_list[i], threshold_list[i], lvalid_list[i], oflow_list[i]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=6))
|
||||||
|
|
||||||
|
|
||||||
def handle_star_tracker_action_replies(
|
def handle_star_tracker_action_replies(
|
||||||
action_id: int, pw: PrintWrapper, custom_data: bytes
|
action_id: int, pw: PrintWrapper, custom_data: bytes
|
||||||
):
|
):
|
||||||
@ -1155,27 +1281,16 @@ def handle_read_secondary_tm_set(pw: PrintWrapper, custom_data: bytes):
|
|||||||
pw.dlog(f"Unknown Set ID {set_id}")
|
pw.dlog(f"Unknown Set ID {set_id}")
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_str_node() -> CmdTreeNode:
|
||||||
def add_str_cmds(defs: TmtcDefinitionWrapper):
|
# Zip the two classes together into a dictionary
|
||||||
oce = OpCodeEntry()
|
op_code_strs = [
|
||||||
oce.add(OpCode.ON_BOOTLOADER, "Mode On, Submode Bootloader")
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
oce.add(OpCode.ON_FIRMWARE, "Mode On, Submode Firmware")
|
]
|
||||||
oce.add(OpCode.NORMAL, "Mode Normal")
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
oce.add(OpCode.OFF, "Mode Off")
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
oce.add(OpCode.PING, "Star Tracker: Ping")
|
node = CmdTreeNode(
|
||||||
oce.add(OpCode.TAKE_IMAGE, "Take Image")
|
"str", "Star Tracker Device", hide_children_which_are_leaves=True
|
||||||
oce.add(OpCode.UPLOAD_IMAGE, Info.UPLOAD_IMAGE)
|
|
||||||
oce.add(OpCode.DOWNLOAD_IMAGE, Info.DOWNLOAD_IMAGE)
|
|
||||||
oce.add(OpCode.ONE_SHOOT_HK, Info.ONE_SHOOT_HK)
|
|
||||||
oce.add(OpCode.ENABLE_HK, Info.ENABLE_HK)
|
|
||||||
oce.add(OpCode.DISABLE_HK, Info.DISABLE_HK)
|
|
||||||
oce.add(OpCode.SET_IMG_PROCESSOR_MODE, Info.SET_IMG_PROCESSOR_MODE)
|
|
||||||
oce.add(
|
|
||||||
OpCode.ADD_SECONDARY_TM_TO_NORMAL_MODE, Info.ADD_SECONDARY_TM_TO_NORMAL_MODE
|
|
||||||
)
|
)
|
||||||
oce.add(OpCode.READ_SECONDARY_TM_SET, Info.READ_SECONDARY_TM_SET)
|
for op_code, info in combined_dict.items():
|
||||||
oce.add(OpCode.RESET_SECONDARY_TM_SET, Info.RESET_SECONDARY_TM_SET)
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
oce.add(OpCode.FW_UPDATE, Info.FW_UPDATE)
|
return node
|
||||||
oce.add(OpCode.SET_TIME_FROM_SYS_TIME, Info.SET_TIME_FROM_SYS_TIME)
|
|
||||||
oce.add(OpCode.RELOAD_JSON_CFG_FILE, Info.RELOAD_JSON_CFG_FILE)
|
|
||||||
defs.add_service(CustomServiceList.STAR_TRACKER.value, "Star Tracker", oce)
|
|
||||||
|
@ -1,22 +1,19 @@
|
|||||||
import enum
|
import enum
|
||||||
from typing import Tuple, Dict
|
from typing import Dict, Tuple
|
||||||
|
|
||||||
from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode
|
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
|
||||||
from eive_tmtc.config.object_ids import ACS_SUBSYSTEM_ID
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
CmdTreeNode,
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
)
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservices
|
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservices
|
||||||
from tmtccmd.tmtc import service_provider
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
|
from eive_tmtc.config.object_ids import ACS_SUBSYSTEM_ID
|
||||||
|
from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode
|
||||||
|
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||||
|
|
||||||
|
|
||||||
class OpCode(str, enum.Enum):
|
class CmdStr(str, enum.Enum):
|
||||||
OFF = "off"
|
OFF = "off"
|
||||||
SAFE = "safe"
|
SAFE = "safe"
|
||||||
DETUMBLE = "detumble"
|
DETUMBLE = "detumble"
|
||||||
@ -41,23 +38,20 @@ class Info(str, enum.Enum):
|
|||||||
|
|
||||||
|
|
||||||
HANDLER_LIST: Dict[str, Tuple[int, int, str]] = {
|
HANDLER_LIST: Dict[str, Tuple[int, int, str]] = {
|
||||||
OpCode.OFF: (AcsMode.OFF, 0, Info.OFF),
|
CmdStr.OFF: (AcsMode.OFF, 0, Info.OFF),
|
||||||
OpCode.SAFE: (AcsMode.SAFE, SafeSubmode.DEFAULT, Info.SAFE),
|
CmdStr.SAFE: (AcsMode.SAFE, SafeSubmode.DEFAULT, Info.SAFE),
|
||||||
OpCode.DETUMBLE: (AcsMode.SAFE, SafeSubmode.DETUMBLE, Info.DETUMBLE),
|
CmdStr.DETUMBLE: (AcsMode.SAFE, SafeSubmode.DETUMBLE, Info.DETUMBLE),
|
||||||
OpCode.IDLE: (AcsMode.IDLE, 0, Info.IDLE),
|
CmdStr.IDLE: (AcsMode.IDLE, 0, Info.IDLE),
|
||||||
OpCode.PTG_TARGET: (AcsMode.PTG_TARGET, 0, Info.PTG_TARGET),
|
CmdStr.PTG_TARGET: (AcsMode.PTG_TARGET, 0, Info.PTG_TARGET),
|
||||||
OpCode.PTG_TARGET_GS: (AcsMode.PTG_TARGET_GS, 0, Info.PTG_TARGET_GS),
|
CmdStr.PTG_TARGET_GS: (AcsMode.PTG_TARGET_GS, 0, Info.PTG_TARGET_GS),
|
||||||
OpCode.PTG_TARGET_NADIR: (AcsMode.PTG_NADIR, 0, Info.PTG_TARGET_NADIR),
|
CmdStr.PTG_TARGET_NADIR: (AcsMode.PTG_NADIR, 0, Info.PTG_TARGET_NADIR),
|
||||||
OpCode.PTG_TARGET_INERTIAL: (AcsMode.PTG_INERTIAL, 0, Info.PTG_TARGET_INERTIAL),
|
CmdStr.PTG_TARGET_INERTIAL: (AcsMode.PTG_INERTIAL, 0, Info.PTG_TARGET_INERTIAL),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.ACS_SS.value)
|
def build_acs_subsystem_cmd(q: DefaultPusQueueHelper, cmd_path: str):
|
||||||
def build_acs_subsystem_cmd(p: ServiceProviderParams):
|
|
||||||
op_code = p.op_code
|
|
||||||
q = p.queue_helper
|
|
||||||
info_prefix = "ACS Subsystem"
|
info_prefix = "ACS Subsystem"
|
||||||
if op_code in OpCode.REPORT_ALL_MODES:
|
if cmd_path in CmdStr.REPORT_ALL_MODES:
|
||||||
q.add_log_cmd(f"{info_prefix}: {Info.REPORT_ALL_MODES}")
|
q.add_log_cmd(f"{info_prefix}: {Info.REPORT_ALL_MODES}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -66,7 +60,7 @@ def build_acs_subsystem_cmd(p: ServiceProviderParams):
|
|||||||
app_data=ACS_SUBSYSTEM_ID,
|
app_data=ACS_SUBSYSTEM_ID,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
mode_info_tup = HANDLER_LIST.get(op_code)
|
mode_info_tup = HANDLER_LIST.get(cmd_path)
|
||||||
if mode_info_tup is None:
|
if mode_info_tup is None:
|
||||||
return
|
return
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
@ -78,10 +72,9 @@ def build_acs_subsystem_cmd(p: ServiceProviderParams):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_acs_subsystem_node() -> CmdTreeNode:
|
||||||
def add_acs_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
node = CmdTreeNode("acs", "ACS Subsystem", hide_children_which_are_leaves=True)
|
||||||
oce = OpCodeEntry()
|
for cmd_str, (_, _, info) in HANDLER_LIST.items():
|
||||||
for op_code, (_, _, info) in HANDLER_LIST.items():
|
node.add_child(CmdTreeNode(cmd_str, info))
|
||||||
oce.add(op_code, info)
|
node.add_child(CmdTreeNode(CmdStr.REPORT_ALL_MODES, Info.REPORT_ALL_MODES))
|
||||||
oce.add(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES)
|
return node
|
||||||
defs.add_service(CustomServiceList.ACS_SS, "ACS Subsystem", oce)
|
|
||||||
|
@ -1,22 +1,19 @@
|
|||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from tmtccmd.config.tmtc import (
|
||||||
|
CmdTreeNode,
|
||||||
|
)
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import Mode
|
||||||
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
|
||||||
from eive_tmtc.config.object_ids import SUS_BOARD_ASS_ID
|
from eive_tmtc.config.object_ids import SUS_BOARD_ASS_ID
|
||||||
from eive_tmtc.tmtc.acs.acs_board import DualSideSubmode
|
from eive_tmtc.tmtc.acs.acs_board import DualSideSubmode
|
||||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||||
from tmtccmd.config.tmtc import (
|
|
||||||
tmtc_definitions_provider,
|
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
|
||||||
from tmtccmd.tmtc import service_provider, DefaultPusQueueHelper
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Mode
|
|
||||||
|
|
||||||
|
|
||||||
class SusOpCode:
|
class SusOpCode:
|
||||||
SUS_ASS_NOM_SIDE = ["0", "nom"]
|
SUS_ASS_NOM_SIDE = "nom"
|
||||||
SUS_ASS_RED_SIDE = ["1", "red"]
|
SUS_ASS_RED_SIDE = "red"
|
||||||
SUS_ASS_DUAL_MODE = ["2", "dual"]
|
SUS_ASS_DUAL_MODE = "dual"
|
||||||
SUS_ASS_OFF = ["3", "off"]
|
SUS_ASS_OFF = "off"
|
||||||
|
|
||||||
|
|
||||||
def pack_sus_cmds(q: DefaultPusQueueHelper, op_code: str):
|
def pack_sus_cmds(q: DefaultPusQueueHelper, op_code: str):
|
||||||
@ -54,34 +51,16 @@ def pack_sus_cmds(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.SUS_BRD_ASS)
|
def create_sus_board_node() -> CmdTreeNode:
|
||||||
def pack_sus_cmds_prvoider(p: ServiceProviderParams):
|
node = CmdTreeNode("sus_brd_assy", "SUS board assembly")
|
||||||
op_code = p.op_code
|
node.add_child(
|
||||||
q = p.queue_helper
|
CmdTreeNode(SusOpCode.SUS_ASS_RED_SIDE, "Switch SUS board to nominal side")
|
||||||
pack_sus_cmds(q, op_code)
|
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
|
||||||
def add_sus_board_cmds(defs: TmtcDefinitionWrapper):
|
|
||||||
oce = OpCodeEntry()
|
|
||||||
oce.add(
|
|
||||||
keys=SusOpCode.SUS_ASS_NOM_SIDE,
|
|
||||||
info="Switch SUS board to nominal side",
|
|
||||||
)
|
)
|
||||||
oce.add(
|
node.add_child(
|
||||||
keys=SusOpCode.SUS_ASS_RED_SIDE,
|
CmdTreeNode(SusOpCode.SUS_ASS_RED_SIDE, "Switch SUS board to redundant side")
|
||||||
info="Switch SUS board to redundant side",
|
|
||||||
)
|
)
|
||||||
oce.add(
|
node.add_child(CmdTreeNode(SusOpCode.SUS_ASS_OFF, "Switch SUS board off"))
|
||||||
keys=SusOpCode.SUS_ASS_OFF,
|
node.add_child(
|
||||||
info="Switch off SUS board",
|
CmdTreeNode(SusOpCode.SUS_ASS_DUAL_MODE, "Switch SUS board to dual mode")
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=SusOpCode.SUS_ASS_DUAL_MODE,
|
|
||||||
info="Switch SUS board to dual mode",
|
|
||||||
)
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.SUS_BRD_ASS.value,
|
|
||||||
info="SUS Board Assembly",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
)
|
||||||
|
return node
|
||||||
|
@ -1 +0,0 @@
|
|||||||
from .subsystem import add_com_subsystem_cmds
|
|
@ -8,6 +8,8 @@
|
|||||||
import enum
|
import enum
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
from tmtccmd.config import CmdTreeNode
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
@ -51,11 +53,11 @@ class Submode(enum.IntEnum):
|
|||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
ENABLE_WITH_LOW_DATARATE = ["enable_low_datarate"]
|
ENABLE_WITH_LOW_DATARATE = "enable_low_datarate"
|
||||||
ENABLE_WITH_HIGH_DATARATE = ["enable_high_datarate"]
|
ENABLE_WITH_HIGH_DATARATE = "enable_high_datarate"
|
||||||
DISABLE = ["disable"]
|
DISABLE = "disable"
|
||||||
ENABLE_ACTION = ["legacy_enable_tx"]
|
ENABLE_ACTION = "legacy_enable_tx"
|
||||||
DISABLE_ACTION = ["legacy_disable_tx"]
|
DISABLE_ACTION = "legacy_disable_tx"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -67,29 +69,29 @@ class Info:
|
|||||||
|
|
||||||
|
|
||||||
def pack_ccsds_handler_command( # noqa C901
|
def pack_ccsds_handler_command( # noqa C901
|
||||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
):
|
):
|
||||||
obyt = object_id.as_bytes
|
obyt = object_id.as_bytes
|
||||||
prefix = "CCSDS Handler"
|
prefix = "CCSDS Handler"
|
||||||
q.add_log_cmd(f"Testing CCSDS handler with object id: {object_id.as_hex_string}")
|
q.add_log_cmd(f"Testing CCSDS handler with object id: {object_id.as_hex_string}")
|
||||||
if op_code in OpCode.ENABLE_WITH_LOW_DATARATE:
|
if cmd_str in OpCode.ENABLE_WITH_LOW_DATARATE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_WITH_LOW_DATARATE}")
|
q.add_log_cmd(f"{prefix}: {Info.ENABLE_WITH_LOW_DATARATE}")
|
||||||
q.add_pus_tc(create_mode_command(obyt, Mode.ON, Submode.DATARATE_LOW))
|
q.add_pus_tc(create_mode_command(obyt, Mode.ON, Submode.DATARATE_LOW))
|
||||||
if op_code in OpCode.ENABLE_WITH_HIGH_DATARATE:
|
if cmd_str in OpCode.ENABLE_WITH_HIGH_DATARATE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_WITH_HIGH_DATARATE}")
|
q.add_log_cmd(f"{prefix}: {Info.ENABLE_WITH_HIGH_DATARATE}")
|
||||||
q.add_pus_tc(create_mode_command(obyt, Mode.ON, Submode.DATARATE_HIGH))
|
q.add_pus_tc(create_mode_command(obyt, Mode.ON, Submode.DATARATE_HIGH))
|
||||||
if op_code in OpCode.DISABLE:
|
if cmd_str in OpCode.DISABLE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.DISABLE}")
|
q.add_log_cmd(f"{prefix}: {Info.DISABLE}")
|
||||||
q.add_pus_tc(create_mode_command(obyt, Mode.OFF, 0))
|
q.add_pus_tc(create_mode_command(obyt, Mode.OFF, 0))
|
||||||
if op_code in OpCode.ENABLE_ACTION:
|
if cmd_str in OpCode.ENABLE_ACTION:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_ACTION}")
|
q.add_log_cmd(f"{prefix}: {Info.ENABLE_ACTION}")
|
||||||
command = obyt + struct.pack("!I", ActionId.EN_TRANSMITTER)
|
command = obyt + struct.pack("!I", ActionId.EN_TRANSMITTER)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code in OpCode.DISABLE_ACTION:
|
if cmd_str in OpCode.DISABLE_ACTION:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.DISABLE_ACTION}")
|
q.add_log_cmd(f"{prefix}: {Info.DISABLE_ACTION}")
|
||||||
command = obyt + struct.pack("!I", ActionId.DIS_TRANSMITTER)
|
command = obyt + struct.pack("!I", ActionId.DIS_TRANSMITTER)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "4":
|
if cmd_str == "4":
|
||||||
q.add_log_cmd("CCSDS Handler: Set arbitrary bitrate")
|
q.add_log_cmd("CCSDS Handler: Set arbitrary bitrate")
|
||||||
bitrate = int(input("Specify bit rate (bps): "))
|
bitrate = int(input("Specify bit rate (bps): "))
|
||||||
command = (
|
command = (
|
||||||
@ -98,24 +100,36 @@ def pack_ccsds_handler_command( # noqa C901
|
|||||||
+ struct.pack("!I", bitrate)
|
+ struct.pack("!I", bitrate)
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "5":
|
if cmd_str == "5":
|
||||||
q.add_log_cmd("CCSDS Handler: Enable tx clock manipulator")
|
q.add_log_cmd("CCSDS Handler: Enable tx clock manipulator")
|
||||||
command = obyt + struct.pack("!I", ActionId.ENABLE_TX_CLK_MANIPULATOR)
|
command = obyt + struct.pack("!I", ActionId.ENABLE_TX_CLK_MANIPULATOR)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "6":
|
if cmd_str == "6":
|
||||||
q.add_log_cmd("CCSDS Handler: Disable tx clock manipulator")
|
q.add_log_cmd("CCSDS Handler: Disable tx clock manipulator")
|
||||||
command = obyt + struct.pack("!I", ActionId.DISABLE_TX_CLK_MANIPULATOR)
|
command = obyt + struct.pack("!I", ActionId.DISABLE_TX_CLK_MANIPULATOR)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "7":
|
if cmd_str == "7":
|
||||||
q.add_log_cmd("CCSDS Handler: Update tx data on rising edge of tx clock")
|
q.add_log_cmd("CCSDS Handler: Update tx data on rising edge of tx clock")
|
||||||
command = obyt + struct.pack("!I", ActionId.UPDATE_ON_RISING_EDGE)
|
command = obyt + struct.pack("!I", ActionId.UPDATE_ON_RISING_EDGE)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "8":
|
if cmd_str == "8":
|
||||||
q.add_log_cmd("CCSDS Handler: Update tx data on falling edge of tx clock")
|
q.add_log_cmd("CCSDS Handler: Update tx data on falling edge of tx clock")
|
||||||
command = obyt + struct.pack("!I", ActionId.UPDATE_ON_FALLING_EDGE)
|
command = obyt + struct.pack("!I", ActionId.UPDATE_ON_FALLING_EDGE)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
|
|
||||||
|
|
||||||
|
def create_ccsds_node() -> CmdTreeNode:
|
||||||
|
op_code_strs = [
|
||||||
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
|
]
|
||||||
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
|
node = CmdTreeNode("ccsds", "CCSDS Handler", hide_children_for_print=True)
|
||||||
|
for op_code, info in combined_dict.items():
|
||||||
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_ccsds_cmds(defs: TmtcDefinitionWrapper):
|
def add_ccsds_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
|
@ -60,20 +60,20 @@ class Info:
|
|||||||
RESET_NO_INIT = "Reset with mandatory initialization"
|
RESET_NO_INIT = "Reset with mandatory initialization"
|
||||||
|
|
||||||
|
|
||||||
def pack_pdec_handler_test(
|
def pack_pdec_handler_commands(
|
||||||
object_id: bytearray, q: DefaultPusQueueHelper, op_code: str
|
object_id: bytes, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
):
|
):
|
||||||
q.add_log_cmd(f"Testing PDEC handler with object id: {object_id.hex()}")
|
q.add_log_cmd(f"Testing PDEC handler with object id: {object_id.hex()}")
|
||||||
prefix = "PDEC Handler "
|
prefix = "PDEC Handler "
|
||||||
if op_code == OpCode.PRINT_CLCW:
|
if cmd_str == OpCode.PRINT_CLCW:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.PRINT_CLCW}")
|
q.add_log_cmd(f"{prefix}: {Info.PRINT_CLCW}")
|
||||||
command = object_id + CommandId.PRINT_CLCW
|
command = object_id + CommandId.PRINT_CLCW
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.PRINT_MON_REG:
|
if cmd_str == OpCode.PRINT_MON_REG:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.PRINT_MON_REG}")
|
q.add_log_cmd(f"{prefix}: {Info.PRINT_MON_REG}")
|
||||||
command = object_id + CommandId.PRINT_PDEC_MON
|
command = object_id + CommandId.PRINT_PDEC_MON
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.POSITIVE_WINDOW:
|
if cmd_str == OpCode.POSITIVE_WINDOW:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.POSITIVE_WINDOW}")
|
q.add_log_cmd(f"{prefix}: {Info.POSITIVE_WINDOW}")
|
||||||
pw = int(input("Specify positive window to set: "))
|
pw = int(input("Specify positive window to set: "))
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -86,7 +86,7 @@ def pack_pdec_handler_test(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NEGATIVE_WINDOW:
|
if cmd_str == OpCode.NEGATIVE_WINDOW:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.NEGATIVE_WINDOW}")
|
q.add_log_cmd(f"{prefix}: {Info.NEGATIVE_WINDOW}")
|
||||||
nw = int(input("Specify negative window to set: "))
|
nw = int(input("Specify negative window to set: "))
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -99,12 +99,12 @@ def pack_pdec_handler_test(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.RESET_NO_INIT:
|
if cmd_str == OpCode.RESET_NO_INIT:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.RESET_NO_INIT}")
|
q.add_log_cmd(f"{prefix}: {Info.RESET_NO_INIT}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(object_id=object_id, action_id=ActionId.RESET_NO_INIT)
|
create_action_cmd(object_id=object_id, action_id=ActionId.RESET_NO_INIT)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.RESET_WITH_INIT:
|
if cmd_str == OpCode.RESET_WITH_INIT:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.RESET_WITH_INIT}")
|
q.add_log_cmd(f"{prefix}: {Info.RESET_WITH_INIT}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(object_id=object_id, action_id=ActionId.RESET_WITH_INIT)
|
create_action_cmd(object_id=object_id, action_id=ActionId.RESET_WITH_INIT)
|
||||||
|
@ -1,30 +1,25 @@
|
|||||||
import enum
|
import enum
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import COM_SUBSYSTEM_ID
|
|
||||||
from eive_tmtc.tmtc.com.syrlinks_handler import Datarate
|
|
||||||
from tmtccmd.pus.s20_fsfw_param_defs import create_scalar_u8_parameter
|
|
||||||
|
|
||||||
from .defs import Mode as ComMode
|
|
||||||
|
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
CmdTreeNode,
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
|
||||||
from tmtccmd.tmtc import service_provider
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import (
|
|
||||||
create_mode_command,
|
|
||||||
create_read_mode_command,
|
|
||||||
create_announce_mode_command,
|
|
||||||
create_announce_mode_recursive_command,
|
|
||||||
)
|
)
|
||||||
from tmtccmd.pus.s20_fsfw_param import (
|
from tmtccmd.pus.s20_fsfw_param import (
|
||||||
create_load_param_cmd,
|
create_load_param_cmd,
|
||||||
|
create_scalar_u32_parameter,
|
||||||
)
|
)
|
||||||
|
from tmtccmd.pus.s20_fsfw_param_defs import create_scalar_u8_parameter
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import (
|
||||||
|
create_announce_mode_command,
|
||||||
|
create_announce_mode_recursive_command,
|
||||||
|
create_mode_command,
|
||||||
|
create_read_mode_command,
|
||||||
|
)
|
||||||
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
|
||||||
from tmtccmd.pus.s20_fsfw_param import create_scalar_u32_parameter
|
from eive_tmtc.config.object_ids import COM_SUBSYSTEM_ID
|
||||||
|
from eive_tmtc.tmtc.com.syrlinks_handler import Datarate
|
||||||
|
|
||||||
|
from .defs import Mode as ComMode
|
||||||
|
|
||||||
|
|
||||||
class ParameterId(enum.IntEnum):
|
class ParameterId(enum.IntEnum):
|
||||||
@ -48,9 +43,9 @@ class OpCode:
|
|||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
RX_ONLY = "Syrlinks RX Only"
|
RX_ONLY = "Syrlinks RX Only"
|
||||||
TX_AND_RX_DEF_DATARATE = "Syrlinks with TX default datarate"
|
TX_AND_RX_DEF_RATE = "Syrlinks with TX default datarate"
|
||||||
TX_AND_RX_LOW_DATARATE = "Syrlinks with TX low datarate (BPSK modulation)"
|
TX_AND_RX_LOW_RATE = "Syrlinks with TX low datarate (BPSK modulation)"
|
||||||
TX_AND_RX_HIGH_DATARATE = "Syrlinks with TX high datarate (0QPSK modulation)"
|
TX_AND_RX_HIGH_RATE = "Syrlinks with TX high datarate (0QPSK modulation)"
|
||||||
TX_AND_RX_CARRIER_WAVE = "Syrlinks with TX carrier wave"
|
TX_AND_RX_CARRIER_WAVE = "Syrlinks with TX carrier wave"
|
||||||
UPDATE_DEFAULT_DATARATE_LOW = "Configure default low datarate (BPSK modulation)"
|
UPDATE_DEFAULT_DATARATE_LOW = "Configure default low datarate (BPSK modulation)"
|
||||||
UPDATE_DEFAULT_DATARATE_HIGH = "Configure default high datarate (0QPSK modulation)"
|
UPDATE_DEFAULT_DATARATE_HIGH = "Configure default high datarate (0QPSK modulation)"
|
||||||
@ -60,30 +55,27 @@ class Info:
|
|||||||
ANNOUNCE_MODE_RECURSIVE = "Announce mode recursively"
|
ANNOUNCE_MODE_RECURSIVE = "Announce mode recursively"
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.COM_SS)
|
def build_com_subsystem_procedure(q: DefaultPusQueueHelper, cmd_str: str): # noqa C901
|
||||||
def build_com_subsystem_cmd(p: ServiceProviderParams): # noqa C901
|
|
||||||
q = p.queue_helper
|
|
||||||
o = p.op_code
|
|
||||||
prefix = "COM Subsystem"
|
prefix = "COM Subsystem"
|
||||||
if o == OpCode.RX_ONLY:
|
if cmd_str == OpCode.RX_ONLY:
|
||||||
q.add_log_cmd(Info.RX_ONLY)
|
q.add_log_cmd(Info.RX_ONLY)
|
||||||
q.add_pus_tc(create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_ONLY, 0))
|
q.add_pus_tc(create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_ONLY, 0))
|
||||||
elif o == OpCode.TX_AND_RX_DEF_RATE:
|
elif cmd_str == OpCode.TX_AND_RX_DEF_RATE:
|
||||||
q.add_log_cmd(Info.TX_AND_RX_DEF_DATARATE)
|
q.add_log_cmd(Info.TX_AND_RX_DEF_RATE)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_AND_TX_DEF_DATARATE, 0)
|
create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_AND_TX_DEF_DATARATE, 0)
|
||||||
)
|
)
|
||||||
elif o == OpCode.TX_AND_RX_LOW_RATE:
|
elif cmd_str == OpCode.TX_AND_RX_LOW_RATE:
|
||||||
q.add_log_cmd(Info.TX_AND_RX_LOW_DATARATE)
|
q.add_log_cmd(Info.TX_AND_RX_LOW_RATE)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_AND_TX_LOW_DATARATE, 0)
|
create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_AND_TX_LOW_DATARATE, 0)
|
||||||
)
|
)
|
||||||
elif o == OpCode.TX_AND_RX_HIGH_RATE:
|
elif cmd_str == OpCode.TX_AND_RX_HIGH_RATE:
|
||||||
q.add_log_cmd(Info.TX_AND_RX_HIGH_DATARATE)
|
q.add_log_cmd(Info.TX_AND_RX_HIGH_RATE)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_AND_TX_HIGH_DATARATE, 0)
|
create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_AND_TX_HIGH_DATARATE, 0)
|
||||||
)
|
)
|
||||||
if o == OpCode.UPDATE_DEFAULT_DATARATE_LOW:
|
if cmd_str == OpCode.UPDATE_DEFAULT_DATARATE_LOW:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_LOW}")
|
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_LOW}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_load_param_cmd(
|
create_load_param_cmd(
|
||||||
@ -95,7 +87,7 @@ def build_com_subsystem_cmd(p: ServiceProviderParams): # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if o == OpCode.UPDATE_DEFAULT_DATARATE_HIGH:
|
if cmd_str == OpCode.UPDATE_DEFAULT_DATARATE_HIGH:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_HIGH}")
|
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_HIGH}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_load_param_cmd(
|
create_load_param_cmd(
|
||||||
@ -107,12 +99,12 @@ def build_com_subsystem_cmd(p: ServiceProviderParams): # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif o == OpCode.TX_AND_RX_CARRIER_WAVE:
|
elif cmd_str == OpCode.TX_AND_RX_CARRIER_WAVE:
|
||||||
q.add_log_cmd(Info.TX_AND_RX_CARRIER_WAVE)
|
q.add_log_cmd(Info.TX_AND_RX_CARRIER_WAVE)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_AND_TX_CARRIER_WAVE, 0)
|
create_mode_command(COM_SUBSYSTEM_ID, ComMode.RX_AND_TX_CARRIER_WAVE, 0)
|
||||||
)
|
)
|
||||||
elif o == OpCode.CHANGE_TRANSMITTER_TIMEOUT:
|
elif cmd_str == OpCode.CHANGE_TRANSMITTER_TIMEOUT:
|
||||||
timeout = int(input("Specify timeout to set [ms]: "))
|
timeout = int(input("Specify timeout to set [ms]: "))
|
||||||
q.add_log_cmd(Info.CHANGE_TRANSMITTER_TIMEOUT)
|
q.add_log_cmd(Info.CHANGE_TRANSMITTER_TIMEOUT)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -125,28 +117,24 @@ def build_com_subsystem_cmd(p: ServiceProviderParams): # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif o == OpCode.READ_MODE:
|
elif cmd_str == OpCode.READ_MODE:
|
||||||
q.add_log_cmd(Info.READ_MODE)
|
q.add_log_cmd(Info.READ_MODE)
|
||||||
q.add_pus_tc(create_read_mode_command(COM_SUBSYSTEM_ID))
|
q.add_pus_tc(create_read_mode_command(COM_SUBSYSTEM_ID))
|
||||||
elif o == OpCode.ANNOUNCE_MODE:
|
elif cmd_str == OpCode.ANNOUNCE_MODE:
|
||||||
q.add_log_cmd(Info.ANNOUNCE_MODE)
|
q.add_log_cmd(Info.ANNOUNCE_MODE)
|
||||||
q.add_pus_tc(create_announce_mode_command(COM_SUBSYSTEM_ID))
|
q.add_pus_tc(create_announce_mode_command(COM_SUBSYSTEM_ID))
|
||||||
elif o == OpCode.ANNOUNCE_MODE_RECURSIVE:
|
elif cmd_str == OpCode.ANNOUNCE_MODE_RECURSIVE:
|
||||||
q.add_log_cmd(Info.ANNOUNCE_MODE_RECURSIVE)
|
q.add_log_cmd(Info.ANNOUNCE_MODE_RECURSIVE)
|
||||||
q.add_pus_tc(create_announce_mode_recursive_command(COM_SUBSYSTEM_ID))
|
q.add_pus_tc(create_announce_mode_recursive_command(COM_SUBSYSTEM_ID))
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_com_subsystem_node() -> CmdTreeNode:
|
||||||
def add_com_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
op_code_strs = [
|
||||||
oce = OpCodeEntry()
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
oce.add(OpCode.RX_ONLY, Info.RX_ONLY)
|
]
|
||||||
oce.add(OpCode.TX_AND_RX_LOW_RATE, Info.TX_AND_RX_LOW_DATARATE)
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
oce.add(OpCode.TX_AND_RX_HIGH_RATE, Info.TX_AND_RX_HIGH_DATARATE)
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
oce.add(OpCode.TX_AND_RX_DEF_RATE, Info.TX_AND_RX_DEF_DATARATE)
|
node = CmdTreeNode("com", "COM Subsystem", hide_children_which_are_leaves=True)
|
||||||
oce.add(OpCode.UPDATE_DEFAULT_DATARATE_LOW, Info.UPDATE_DEFAULT_DATARATE_LOW)
|
for op_code, info in combined_dict.items():
|
||||||
oce.add(OpCode.UPDATE_DEFAULT_DATARATE_HIGH, Info.UPDATE_DEFAULT_DATARATE_HIGH)
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
oce.add(OpCode.CHANGE_TRANSMITTER_TIMEOUT, Info.CHANGE_TRANSMITTER_TIMEOUT)
|
return node
|
||||||
oce.add(OpCode.READ_MODE, Info.READ_MODE)
|
|
||||||
oce.add(OpCode.ANNOUNCE_MODE, Info.ANNOUNCE_MODE)
|
|
||||||
oce.add(OpCode.ANNOUNCE_MODE_RECURSIVE, Info.ANNOUNCE_MODE_RECURSIVE)
|
|
||||||
defs.add_service(CustomServiceList.COM_SS, "COM Subsystem", oce)
|
|
||||||
|
@ -8,30 +8,32 @@
|
|||||||
import enum
|
import enum
|
||||||
import logging
|
import logging
|
||||||
import math
|
import math
|
||||||
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
|
||||||
from eive_tmtc.tmtc.com.defs import Mode as ComMode
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from tmtccmd.config.tmtc import (
|
|
||||||
tmtc_definitions_provider,
|
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
|
||||||
make_sid,
|
|
||||||
create_request_one_diag_command,
|
|
||||||
create_request_one_hk_command,
|
|
||||||
create_enable_periodic_hk_command_with_interval_with_diag,
|
|
||||||
create_disable_periodic_hk_command_with_diag,
|
|
||||||
)
|
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Mode, create_mode_command
|
|
||||||
from eive_tmtc.config.object_ids import SYRLINKS_HANDLER_ID
|
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
from tmtccmd.util import ObjectIdU32
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
|
from tmtccmd.config.tmtc import (
|
||||||
|
CmdTreeNode,
|
||||||
|
OpCodeEntry,
|
||||||
|
TmtcDefinitionWrapper,
|
||||||
|
tmtc_definitions_provider,
|
||||||
|
)
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import Mode, create_mode_command
|
||||||
|
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||||
|
create_disable_periodic_hk_command_with_diag,
|
||||||
|
create_enable_periodic_hk_command_with_interval_with_diag,
|
||||||
|
create_request_one_diag_command,
|
||||||
|
create_request_one_hk_command,
|
||||||
|
make_sid,
|
||||||
|
)
|
||||||
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
from tmtccmd.util import ObjectIdU32
|
||||||
|
|
||||||
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
|
from eive_tmtc.config.object_ids import SYRLINKS_HANDLER_ID
|
||||||
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
|
from eive_tmtc.pus_tm.hk import HkTmInfo
|
||||||
|
from eive_tmtc.tmtc.com.defs import Mode as ComMode
|
||||||
|
|
||||||
|
|
||||||
class SetId(enum.IntEnum):
|
class SetId(enum.IntEnum):
|
||||||
@ -57,6 +59,7 @@ class OpCode:
|
|||||||
HK_TX_REGS = "hk_tx_regs"
|
HK_TX_REGS = "hk_tx_regs"
|
||||||
TX_STATUS = "tx_status"
|
TX_STATUS = "tx_status"
|
||||||
RX_STATUS = "rx_status"
|
RX_STATUS = "rx_status"
|
||||||
|
SET_CW = "tx_cw"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -102,6 +105,18 @@ class Datarate(enum.IntEnum):
|
|||||||
HIGH_RATE_MODULATION_0QPSK = 1
|
HIGH_RATE_MODULATION_0QPSK = 1
|
||||||
|
|
||||||
|
|
||||||
|
def create_syrlinks_node() -> CmdTreeNode:
|
||||||
|
op_code_strs = [
|
||||||
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
|
]
|
||||||
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
|
node = CmdTreeNode("syrlinks", "Syrlinks Device", hide_children_for_print=True)
|
||||||
|
for op_code, info in combined_dict.items():
|
||||||
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_syrlinks_cmds(defs: TmtcDefinitionWrapper):
|
def add_syrlinks_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
@ -143,42 +158,42 @@ def normal_mode_cmd(q: DefaultPusQueueHelper, info: str, submode: int):
|
|||||||
|
|
||||||
|
|
||||||
def pack_syrlinks_command( # noqa C901: Complexity okay here.
|
def pack_syrlinks_command( # noqa C901: Complexity okay here.
|
||||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
):
|
):
|
||||||
obyt = object_id.as_bytes
|
obyt = object_id.as_bytes
|
||||||
prefix = "Syrlinks"
|
prefix = "Syrlinks"
|
||||||
q.add_log_cmd(f"Testing Syrlinks with object id: {object_id.as_hex_string}")
|
q.add_log_cmd(f"Testing Syrlinks with object id: {object_id.as_hex_string}")
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.OFF}")
|
q.add_log_cmd(f"{prefix}: {Info.OFF}")
|
||||||
q.add_pus_tc(create_mode_command(obyt, Mode.OFF, 0))
|
q.add_pus_tc(create_mode_command(obyt, Mode.OFF, 0))
|
||||||
if op_code == OpCode.ON:
|
if cmd_str == OpCode.ON:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ON}")
|
q.add_log_cmd(f"{prefix}: {Info.ON}")
|
||||||
q.add_pus_tc(create_mode_command(obyt, Mode.ON, ComMode.RX_ONLY))
|
q.add_pus_tc(create_mode_command(obyt, Mode.ON, ComMode.RX_ONLY))
|
||||||
if op_code == OpCode.NORMAL_RX_ONLY:
|
if cmd_str == OpCode.NORMAL_RX_ONLY:
|
||||||
normal_mode_cmd(q, Info.NORMAL_RX_ONLY, ComMode.RX_ONLY)
|
normal_mode_cmd(q, Info.NORMAL_RX_ONLY, ComMode.RX_ONLY)
|
||||||
if op_code == OpCode.NORMAL_RX_AND_TX_LOW_DATARATE:
|
if cmd_str == OpCode.NORMAL_RX_AND_TX_LOW_DATARATE:
|
||||||
normal_mode_cmd(
|
normal_mode_cmd(
|
||||||
q, Info.NORMAL_RX_AND_TX_LOW_DATARATE, ComMode.RX_AND_TX_LOW_DATARATE
|
q, Info.NORMAL_RX_AND_TX_LOW_DATARATE, ComMode.RX_AND_TX_LOW_DATARATE
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NORMAL_RX_AND_TX_DEF_DATARATE:
|
if cmd_str == OpCode.NORMAL_RX_AND_TX_DEF_DATARATE:
|
||||||
normal_mode_cmd(
|
normal_mode_cmd(
|
||||||
q, Info.NORMAL_RX_AND_TX_DEF_DATARATE, ComMode.RX_AND_TX_DEF_DATARATE
|
q, Info.NORMAL_RX_AND_TX_DEF_DATARATE, ComMode.RX_AND_TX_DEF_DATARATE
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NORMAL_RX_AND_TX_HIGH_DATARATE:
|
if cmd_str == OpCode.NORMAL_RX_AND_TX_HIGH_DATARATE:
|
||||||
normal_mode_cmd(
|
normal_mode_cmd(
|
||||||
q, Info.NORMAL_RX_AND_TX_HIGH_DATARATE, ComMode.RX_AND_TX_HIGH_DATARATE
|
q, Info.NORMAL_RX_AND_TX_HIGH_DATARATE, ComMode.RX_AND_TX_HIGH_DATARATE
|
||||||
)
|
)
|
||||||
if op_code in OpCode.NORMAL_RX_AND_TX_CW:
|
if cmd_str in OpCode.NORMAL_RX_AND_TX_CW:
|
||||||
normal_mode_cmd(q, Info.NORMAL_RX_AND_TX_CW, ComMode.RX_AND_TX_CARRIER_WAVE)
|
normal_mode_cmd(q, Info.NORMAL_RX_AND_TX_CW, ComMode.RX_AND_TX_CARRIER_WAVE)
|
||||||
if op_code in OpCode.HK_RX_REGS:
|
if cmd_str in OpCode.HK_RX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.HK_RX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.HK_RX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
||||||
q.add_pus_tc(create_request_one_diag_command(sid))
|
q.add_pus_tc(create_request_one_diag_command(sid))
|
||||||
if op_code in OpCode.HK_TEMPS:
|
if cmd_str in OpCode.HK_TEMPS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.HK_TEMPS}")
|
q.add_log_cmd(f"{prefix}: {Info.HK_TEMPS}")
|
||||||
sid = make_sid(obyt, SetId.TEMPERATURE_SET_ID)
|
sid = make_sid(obyt, SetId.TEMPERATURE_SET_ID)
|
||||||
q.add_pus_tc(create_request_one_hk_command(sid))
|
q.add_pus_tc(create_request_one_hk_command(sid))
|
||||||
if op_code in OpCode.ENABLE_HK_RX_REGS:
|
if cmd_str in OpCode.ENABLE_HK_RX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_RX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_RX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
||||||
interval = float(input("HK interval in floating point seconds"))
|
interval = float(input("HK interval in floating point seconds"))
|
||||||
@ -187,11 +202,11 @@ def pack_syrlinks_command( # noqa C901: Complexity okay here.
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCode.DISABLE_HK_RX_REGS:
|
if cmd_str in OpCode.DISABLE_HK_RX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_RX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_RX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
|
||||||
q.add_pus_tc(create_disable_periodic_hk_command_with_diag(True, sid))
|
q.add_pus_tc(create_disable_periodic_hk_command_with_diag(True, sid))
|
||||||
if op_code in OpCode.ENABLE_HK_TX_REGS:
|
if cmd_str in OpCode.ENABLE_HK_TX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_TX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_TX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
||||||
interval = float(input("HK interval in floating point seconds"))
|
interval = float(input("HK interval in floating point seconds"))
|
||||||
@ -200,76 +215,82 @@ def pack_syrlinks_command( # noqa C901: Complexity okay here.
|
|||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCode.DISABLE_HK_TX_REGS:
|
if cmd_str in OpCode.DISABLE_HK_TX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_TX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_TX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
||||||
q.add_pus_tc(create_disable_periodic_hk_command_with_diag(True, sid))
|
q.add_pus_tc(create_disable_periodic_hk_command_with_diag(True, sid))
|
||||||
if op_code in OpCode.HK_TX_REGS:
|
if cmd_str in OpCode.HK_TX_REGS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.HK_TX_REGS}")
|
q.add_log_cmd(f"{prefix}: {Info.HK_TX_REGS}")
|
||||||
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
|
||||||
q.add_pus_tc(create_request_one_diag_command(sid))
|
q.add_pus_tc(create_request_one_diag_command(sid))
|
||||||
if op_code in OpCode.TX_STATUS:
|
if cmd_str in OpCode.TX_STATUS:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.TX_STATUS}")
|
q.add_log_cmd(f"{prefix}: {Info.TX_STATUS}")
|
||||||
command = obyt + struct.pack("!I", CommandId.READ_TX_STATUS)
|
command = obyt + struct.pack("!I", CommandId.READ_TX_STATUS)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "9":
|
if cmd_str == "9":
|
||||||
q.add_log_cmd("Syrlinks: Read TX waveform")
|
q.add_log_cmd("Syrlinks: Read TX waveform")
|
||||||
command = obyt + struct.pack("!I", CommandId.READ_TX_WAVEFORM)
|
command = obyt + struct.pack("!I", CommandId.READ_TX_WAVEFORM)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "10":
|
if cmd_str == "10":
|
||||||
q.add_log_cmd("Syrlinks: Read TX AGC value high byte")
|
q.add_log_cmd("Syrlinks: Read TX AGC value high byte")
|
||||||
command = obyt + struct.pack("!I", CommandId.READ_TX_AGC_VALUE_HIGH_BYTE)
|
command = obyt + struct.pack("!I", CommandId.READ_TX_AGC_VALUE_HIGH_BYTE)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "11":
|
if cmd_str == "11":
|
||||||
q.add_log_cmd("Syrlinks: Read TX AGC value low byte")
|
q.add_log_cmd("Syrlinks: Read TX AGC value low byte")
|
||||||
command = obyt + struct.pack("!I", CommandId.READ_TX_AGC_VALUE_LOW_BYTE)
|
command = obyt + struct.pack("!I", CommandId.READ_TX_AGC_VALUE_LOW_BYTE)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "12":
|
if cmd_str == "12":
|
||||||
q.add_log_cmd("Syrlinks: Write LCL config")
|
q.add_log_cmd("Syrlinks: Write LCL config")
|
||||||
command = obyt + struct.pack("!I", CommandId.WRITE_LCL_CONFIG)
|
command = obyt + struct.pack("!I", CommandId.WRITE_LCL_CONFIG)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "13":
|
if cmd_str == "13":
|
||||||
q.add_log_cmd("Syrlinks: Read RX status registers")
|
q.add_log_cmd("Syrlinks: Read RX status registers")
|
||||||
command = obyt + struct.pack("!I", CommandId.READ_RX_STATUS_REGISTERS)
|
command = obyt + struct.pack("!I", CommandId.READ_RX_STATUS_REGISTERS)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "14":
|
if cmd_str == "14":
|
||||||
q.add_log_cmd("Syrlinks: Read LCL config register")
|
q.add_log_cmd("Syrlinks: Read LCL config register")
|
||||||
command = obyt + struct.pack("!I", CommandId.READ_LCL_CONFIG_REGISTER)
|
command = obyt + struct.pack("!I", CommandId.READ_LCL_CONFIG_REGISTER)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "15":
|
if cmd_str == "15":
|
||||||
q.add_log_cmd("Syrlinks: Set waveform OQPSK")
|
q.add_log_cmd("Syrlinks: Set waveform OQPSK")
|
||||||
command = obyt + struct.pack("!I", CommandId.SET_WAVEFORM_OQPSK)
|
command = obyt + struct.pack("!I", CommandId.SET_WAVEFORM_OQPSK)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "16":
|
if cmd_str == "16":
|
||||||
q.add_log_cmd("Syrlinks: Set waveform BPSK")
|
q.add_log_cmd("Syrlinks: Set waveform BPSK")
|
||||||
command = obyt + struct.pack("!I", CommandId.SET_WAVEFORM_BPSK)
|
command = obyt + struct.pack("!I", CommandId.SET_WAVEFORM_BPSK)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "17":
|
if cmd_str == "17":
|
||||||
q.add_log_cmd("Syrlinks: Set second config")
|
q.add_log_cmd("Syrlinks: Set second config")
|
||||||
command = obyt + struct.pack("!I", CommandId.SET_SECOND_CONFIG)
|
command = obyt + struct.pack("!I", CommandId.SET_SECOND_CONFIG)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "18":
|
if cmd_str == "18":
|
||||||
q.add_log_cmd("Syrlinks: Enable debug printout")
|
q.add_log_cmd("Syrlinks: Enable debug printout")
|
||||||
command = obyt + struct.pack("!I", CommandId.ENABLE_DEBUG)
|
command = obyt + struct.pack("!I", CommandId.ENABLE_DEBUG)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "19":
|
if cmd_str == "19":
|
||||||
q.add_log_cmd("Syrlinks: Disable debug printout")
|
q.add_log_cmd("Syrlinks: Disable debug printout")
|
||||||
command = obyt + struct.pack("!I", CommandId.DISABLE_DEBUG)
|
command = obyt + struct.pack("!I", CommandId.DISABLE_DEBUG)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
|
|
||||||
|
|
||||||
def handle_syrlinks_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
|
def handle_syrlinks_hk_data(
|
||||||
if set_id == SetId.RX_REGISTERS_DATASET:
|
hk_info: HkTmInfo,
|
||||||
return handle_syrlinks_rx_registers_dataset(pw, hk_data)
|
pw: PrintWrapper,
|
||||||
elif set_id == SetId.TX_REGISTERS_DATASET:
|
):
|
||||||
return handle_syrlinks_tx_registers_dataset(pw, hk_data)
|
if hk_info.set_id == SetId.RX_REGISTERS_DATASET:
|
||||||
elif set_id == SetId.TEMPERATURE_SET_ID:
|
return handle_syrlinks_rx_registers_dataset(hk_info, pw)
|
||||||
return handle_syrlinks_temp_dataset(pw, hk_data)
|
elif hk_info.set_id == SetId.TX_REGISTERS_DATASET:
|
||||||
|
return handle_syrlinks_tx_registers_dataset(hk_info, pw)
|
||||||
|
elif hk_info.set_id == SetId.TEMPERATURE_SET_ID:
|
||||||
|
return handle_syrlinks_temp_dataset(hk_info, pw)
|
||||||
else:
|
else:
|
||||||
pw.dlog(f"Service 3 TM: Syrlinks handler reply with unknown set ID {set_id}")
|
pw.dlog(
|
||||||
|
f"Service 3 TM: Syrlinks handler reply with unknown set ID {hk_info.set_id}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def handle_syrlinks_temp_dataset(pw: PrintWrapper, hk_data: bytes):
|
def handle_syrlinks_temp_dataset(hk_info: HkTmInfo, pw: PrintWrapper):
|
||||||
|
hk_data = hk_info.hk_data
|
||||||
if len(hk_data) < 8:
|
if len(hk_data) < 8:
|
||||||
raise ValueError("expected at least 8 bytes of HK data")
|
raise ValueError("expected at least 8 bytes of HK data")
|
||||||
temp_power_amplifier = struct.unpack("!f", hk_data[0:4])[0]
|
temp_power_amplifier = struct.unpack("!f", hk_data[0:4])[0]
|
||||||
@ -279,7 +300,11 @@ def handle_syrlinks_temp_dataset(pw: PrintWrapper, hk_data: bytes):
|
|||||||
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[8:], 2))
|
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[8:], 2))
|
||||||
|
|
||||||
|
|
||||||
def handle_syrlinks_rx_registers_dataset(pw: PrintWrapper, hk_data: bytes):
|
def handle_syrlinks_rx_registers_dataset(
|
||||||
|
hk_info: HkTmInfo,
|
||||||
|
pw: PrintWrapper,
|
||||||
|
):
|
||||||
|
hk_data = hk_info.hk_data
|
||||||
header_list = [
|
header_list = [
|
||||||
"RX Status",
|
"RX Status",
|
||||||
"RX Sensitivity",
|
"RX Sensitivity",
|
||||||
@ -342,14 +367,44 @@ def handle_syrlinks_rx_registers_dataset(pw: PrintWrapper, hk_data: bytes):
|
|||||||
pw.dlog(
|
pw.dlog(
|
||||||
FsfwTmTcPrinter.get_validity_buffer(validity_buffer=validity_buffer, num_vars=8)
|
FsfwTmTcPrinter.get_validity_buffer(validity_buffer=validity_buffer, num_vars=8)
|
||||||
)
|
)
|
||||||
pw.dlog(f"Carrier Detect: {carrier_detect}")
|
print(f"Carrier Detect: {carrier_detect}")
|
||||||
pw.dlog(f"Carrier Lock: {carrier_lock}")
|
print(f"Carrier Lock: {carrier_lock}")
|
||||||
pw.dlog(f"Data Lock (data clock recovery loop lock status): {data_lock}")
|
print(f"Data Lock (data clock recovery loop lock status): {data_lock}")
|
||||||
pw.dlog(f"Data Valid (valid if TEB < 10e-5): {data_valid}")
|
print(f"Data Valid (valid if TEB < 10e-5): {data_valid}")
|
||||||
pw.dlog(f"Data Lock (data clock recovery loop lock status): {data_lock}")
|
print(f"Data Lock (data clock recovery loop lock status): {data_lock}")
|
||||||
pw.dlog(f"RX AGC Inhibit: {rx_agc_inhibit}")
|
print(f"RX AGC Inhibit: {rx_agc_inhibit}")
|
||||||
pw.dlog(f"RX AGC: {rx_agc}")
|
print(f"RX AGC: {rx_agc}")
|
||||||
pw.dlog(f"Eb / E0RX [dB]: {eb_to_n0}")
|
print(f"Eb / E0RX [dB]: {eb_to_n0}")
|
||||||
|
cursor = hk_info.db_con.cursor()
|
||||||
|
cursor.execute(
|
||||||
|
"""
|
||||||
|
CREATE TABLE IF NOT EXISTS syrlinks_rx_regs(
|
||||||
|
packet_uuid TEXT PRIMARY KEY,
|
||||||
|
generation_time TEXT,
|
||||||
|
carrier_detect NUM,
|
||||||
|
carrier_lock NUM,
|
||||||
|
data_lock NUM,
|
||||||
|
data_valid NUM,
|
||||||
|
rx_agc_inhibit NUM,
|
||||||
|
rx_agc NUM,
|
||||||
|
eb_to_e0_rx NUM
|
||||||
|
)"""
|
||||||
|
)
|
||||||
|
cursor.execute(
|
||||||
|
"INSERT INTO syrlinks_rx_regs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||||
|
(
|
||||||
|
str(hk_info.packet_uuid),
|
||||||
|
hk_info.hk_packet.pus_tm.time_provider.as_datetime(), # type: ignore
|
||||||
|
carrier_detect,
|
||||||
|
carrier_lock,
|
||||||
|
data_lock,
|
||||||
|
data_valid,
|
||||||
|
rx_agc_inhibit,
|
||||||
|
rx_agc,
|
||||||
|
eb_to_n0,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
hk_info.db_con.commit()
|
||||||
|
|
||||||
|
|
||||||
class TxConv(enum.IntEnum):
|
class TxConv(enum.IntEnum):
|
||||||
@ -375,11 +430,11 @@ WAVEFORM_STRINGS = ["OFF", "CW", "QPSK", "0QPSK", "PCM/PM", "PSK/PM", "BPSK"]
|
|||||||
|
|
||||||
|
|
||||||
def handle_syrlinks_tx_registers_dataset(
|
def handle_syrlinks_tx_registers_dataset(
|
||||||
|
hk_info: HkTmInfo,
|
||||||
pw: PrintWrapper,
|
pw: PrintWrapper,
|
||||||
hk_data: bytes,
|
|
||||||
):
|
):
|
||||||
header_list = ["TX Status Raw", "TX Waveform", "TX AGC value"]
|
header_list = ["TX Status Raw", "TX Waveform", "TX AGC value"]
|
||||||
tx_status = hk_data[0]
|
tx_status = hk_info.hk_data[0]
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
tx_conv = TxConv(tx_status & 0b111)
|
tx_conv = TxConv(tx_status & 0b111)
|
||||||
@ -397,9 +452,10 @@ def handle_syrlinks_tx_registers_dataset(
|
|||||||
logging.getLogger(__name__).warning(
|
logging.getLogger(__name__).warning(
|
||||||
f"invalid TX conf set {(tx_status >> 2) & 0b11}"
|
f"invalid TX conf set {(tx_status >> 2) & 0b11}"
|
||||||
)
|
)
|
||||||
tx_conf_set = -1
|
# Hack to make DB insertion work.
|
||||||
|
tx_conf_set = TxCfgSet.START_WITH_CURRENT_CFG
|
||||||
tx_clock_detect = (tx_status >> 4) & 0b1
|
tx_clock_detect = (tx_status >> 4) & 0b1
|
||||||
tx_waveform = hk_data[1]
|
tx_waveform = hk_info.hk_data[1]
|
||||||
waveform = tx_waveform & 0b1111
|
waveform = tx_waveform & 0b1111
|
||||||
try:
|
try:
|
||||||
waveform_str = WAVEFORM_STRINGS[waveform]
|
waveform_str = WAVEFORM_STRINGS[waveform]
|
||||||
@ -407,11 +463,11 @@ def handle_syrlinks_tx_registers_dataset(
|
|||||||
logging.getLogger(__name__).warning(f"Unknown waveform value {waveform}")
|
logging.getLogger(__name__).warning(f"Unknown waveform value {waveform}")
|
||||||
waveform_str = "Unknown"
|
waveform_str = "Unknown"
|
||||||
pcm_mode = (tx_waveform >> 4) & 0b1
|
pcm_mode = (tx_waveform >> 4) & 0b1
|
||||||
tx_agc_value = struct.unpack("!H", hk_data[2:4])[0]
|
tx_agc_value = struct.unpack("!H", hk_info.hk_data[2:4])[0]
|
||||||
tx_agc_inhibit = (tx_agc_value >> 15) & 0b1
|
tx_agc_inhibit = (tx_agc_value >> 15) & 0b1
|
||||||
tx_agc = tx_agc_value & 0xFFF
|
tx_agc = tx_agc_value & 0xFFF
|
||||||
content_list = [tx_status, tx_waveform, tx_agc_value]
|
content_list = [tx_status, tx_waveform, tx_agc_value]
|
||||||
validity_buffer = hk_data[4:]
|
validity_buffer = hk_info.hk_data[4:]
|
||||||
for header, content in zip(header_list, content_list):
|
for header, content in zip(header_list, content_list):
|
||||||
pw.dlog(f"{header}: {content}")
|
pw.dlog(f"{header}: {content}")
|
||||||
pw.dlog(
|
pw.dlog(
|
||||||
@ -419,10 +475,46 @@ def handle_syrlinks_tx_registers_dataset(
|
|||||||
)
|
)
|
||||||
# pw.dlog(f"TX CONV: {tx_conv!r}")
|
# pw.dlog(f"TX CONV: {tx_conv!r}")
|
||||||
# pw.dlog(f"TX DIFF (differential encoder enable): {tx_diff_encoder_enable}")
|
# pw.dlog(f"TX DIFF (differential encoder enable): {tx_diff_encoder_enable}")
|
||||||
pw.dlog(f"TX Status: {tx_status_status!r}")
|
print(f"TX Status: {tx_status_status!r}")
|
||||||
pw.dlog(f"TX Config Set: {tx_conf_set!r}")
|
print(f"TX Config Set: {tx_conf_set!r}")
|
||||||
pw.dlog(f"TX Clock Detect: {tx_clock_detect}")
|
print(f"TX Clock Detect: {tx_clock_detect}")
|
||||||
pw.dlog(f"Waveform: {waveform_str}")
|
print(f"Waveform: {waveform_str}")
|
||||||
pw.dlog(f"PCM Mode: {pcm_mode}")
|
print(f"PCM Mode: {pcm_mode}")
|
||||||
pw.dlog(f"TX AGC Inhibit: {tx_agc_inhibit}")
|
print(f"TX AGC Inhibit: {tx_agc_inhibit}")
|
||||||
pw.dlog(f"TX AGC: {tx_agc}")
|
print(f"TX AGC: {tx_agc}")
|
||||||
|
cursor = hk_info.db_con.cursor()
|
||||||
|
cursor.execute(
|
||||||
|
"""
|
||||||
|
CREATE TABLE IF NOT EXISTS syrlinks_tx_regs(
|
||||||
|
packet_uuid TEXT PRIMARY KEY,
|
||||||
|
generation_time TEXT,
|
||||||
|
tx_status NUM,
|
||||||
|
tx_status_str TEXT,
|
||||||
|
tx_cfg_set NUM,
|
||||||
|
tx_cfg_set_str TEXT,
|
||||||
|
tx_clock_detect NUM,
|
||||||
|
waveform NUM,
|
||||||
|
waveform_str TEXT,
|
||||||
|
pcm_mode NUM,
|
||||||
|
tx_agc_inhibut NUM,
|
||||||
|
tx_agc NUM
|
||||||
|
)"""
|
||||||
|
)
|
||||||
|
cursor.execute(
|
||||||
|
"INSERT INTO syrlinks_tx_regs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||||
|
(
|
||||||
|
str(hk_info.packet_uuid),
|
||||||
|
hk_info.hk_packet.pus_tm.time_provider.as_datetime(), # type: ignore
|
||||||
|
tx_status_status,
|
||||||
|
tx_status_status.name,
|
||||||
|
tx_conf_set,
|
||||||
|
tx_conf_set.name,
|
||||||
|
tx_clock_detect,
|
||||||
|
waveform,
|
||||||
|
waveform_str,
|
||||||
|
pcm_mode,
|
||||||
|
tx_agc_inhibit,
|
||||||
|
tx_agc,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
hk_info.db_con.commit()
|
||||||
|
@ -5,11 +5,8 @@ import struct
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper
|
from tmtccmd.config import CmdTreeNode
|
||||||
|
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
@ -18,9 +15,14 @@ from tmtccmd.pus.s20_fsfw_param import (
|
|||||||
create_scalar_u8_parameter,
|
create_scalar_u8_parameter,
|
||||||
create_load_param_cmd,
|
create_load_param_cmd,
|
||||||
)
|
)
|
||||||
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
|
|
||||||
from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID
|
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
|
from tmtccmd.pus.s11_tc_sched import (
|
||||||
|
create_enable_tc_sched_cmd,
|
||||||
|
create_disable_tc_sched_cmd,
|
||||||
|
)
|
||||||
|
|
||||||
|
from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID
|
||||||
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -66,6 +68,8 @@ class ActionId(enum.IntEnum):
|
|||||||
MV_HELPER = 53
|
MV_HELPER = 53
|
||||||
RM_HELPER = 54
|
RM_HELPER = 54
|
||||||
MKDIR_HELPER = 55
|
MKDIR_HELPER = 55
|
||||||
|
ENABLE_SCHEDULER = 56
|
||||||
|
UPDATE_LEAP_SECONRS = 60
|
||||||
|
|
||||||
|
|
||||||
class ParamId(enum.IntEnum):
|
class ParamId(enum.IntEnum):
|
||||||
@ -90,20 +94,20 @@ class OpCode:
|
|||||||
RM_HELPER = "rm_helper"
|
RM_HELPER = "rm_helper"
|
||||||
MKDIR_HELPER = "mkdir_helper"
|
MKDIR_HELPER = "mkdir_helper"
|
||||||
SET_PREF_SD = "set_pref_sd"
|
SET_PREF_SD = "set_pref_sd"
|
||||||
REBOOT_XSC = ["reboot_xsc"]
|
REBOOT_XSC = "reboot_xsc"
|
||||||
XSC_REBOOT_SELF = ["reboot_self"]
|
XSC_REBOOT_SELF = "reboot_self"
|
||||||
XSC_REBOOT_0_0 = ["reboot_00"]
|
XSC_REBOOT_0_0 = "reboot_00"
|
||||||
XSC_REBOOT_0_1 = ["reboot_01"]
|
XSC_REBOOT_0_1 = "reboot_01"
|
||||||
XSC_REBOOT_1_0 = ["reboot_10"]
|
XSC_REBOOT_1_0 = "reboot_10"
|
||||||
XSC_REBOOT_1_1 = ["reboot_11"]
|
XSC_REBOOT_1_1 = "reboot_11"
|
||||||
REBOOT_FULL = ["reboot_regular"]
|
REBOOT_FULL = "reboot_regular"
|
||||||
GET_HK = ["get_hk"]
|
GET_HK = "get_hk"
|
||||||
OBSW_UPDATE_FROM_SD_0 = ["obsw_update_sd0"]
|
OBSW_UPDATE_FROM_SD_0 = "obsw_update_sd0"
|
||||||
OBSW_UPDATE_FROM_SD_1 = ["obsw_update_sd1"]
|
OBSW_UPDATE_FROM_SD_1 = "obsw_update_sd1"
|
||||||
OBSW_UPDATE_FROM_TMP = ["obsw_update_tmp"]
|
OBSW_UPDATE_FROM_TMP = "obsw_update_tmp"
|
||||||
SWITCH_TO_SD_0 = ["switch_to_sd_0"]
|
SWITCH_TO_SD_0 = "switch_to_sd_0"
|
||||||
SWITCH_TO_SD_1 = ["switch_to_sd_1"]
|
SWITCH_TO_SD_1 = "switch_to_sd_1"
|
||||||
SWITCH_TO_BOTH_SD_CARDS = ["switch_to_both_sd_cards"]
|
SWITCH_TO_BOTH_SD_CARDS = "switch_to_both_sd_cards"
|
||||||
READ_REBOOT_MECHANISM_INFO = "rbh_info"
|
READ_REBOOT_MECHANISM_INFO = "rbh_info"
|
||||||
ENABLE_REBOOT_FILE_HANDLING = "rwd_on"
|
ENABLE_REBOOT_FILE_HANDLING = "rwd_on"
|
||||||
DISABLE_REBOOT_FILE_HANDLING = "rwd_off"
|
DISABLE_REBOOT_FILE_HANDLING = "rwd_off"
|
||||||
@ -115,6 +119,9 @@ class OpCode:
|
|||||||
RWD_SET_MAX_REBOOT_CNT = "rwd_max_cnt"
|
RWD_SET_MAX_REBOOT_CNT = "rwd_max_cnt"
|
||||||
AUTO_SWITCH_ENABLE = "auto_switch_enable"
|
AUTO_SWITCH_ENABLE = "auto_switch_enable"
|
||||||
AUTO_SWITCH_DISABLE = "auto_switch_disable"
|
AUTO_SWITCH_DISABLE = "auto_switch_disable"
|
||||||
|
ENABLE_SCHEDULER = "enable_scheduler"
|
||||||
|
DISABLE_SCHEDULER = "disable_scheduler"
|
||||||
|
UPDATE_LEAP_SECONDS = "leap_seconds_update"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -127,6 +134,11 @@ class Info:
|
|||||||
SET_PREF_SD = "Set preferred SD card"
|
SET_PREF_SD = "Set preferred SD card"
|
||||||
REBOOT_XSC = "XSC reboot with prompt"
|
REBOOT_XSC = "XSC reboot with prompt"
|
||||||
REBOOT_FULL = "Full regular reboot"
|
REBOOT_FULL = "Full regular reboot"
|
||||||
|
XSC_REBOOT_SELF = "Reboot Self"
|
||||||
|
XSC_REBOOT_0_0 = "Reboot to 0 0"
|
||||||
|
XSC_REBOOT_0_1 = "Reboot to 0 1"
|
||||||
|
XSC_REBOOT_1_0 = "Reboot to 1 0"
|
||||||
|
XSC_REBOOT_1_1 = "Reboot to 1 1"
|
||||||
OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0"
|
OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0"
|
||||||
OBSW_UPDATE_FROM_SD_1 = "Update OBSW from SD Card 1"
|
OBSW_UPDATE_FROM_SD_1 = "Update OBSW from SD Card 1"
|
||||||
OBSW_UPDATE_FROM_TMP = "Update OBSW from tmp folder"
|
OBSW_UPDATE_FROM_TMP = "Update OBSW from tmp folder"
|
||||||
@ -140,8 +152,20 @@ class Info:
|
|||||||
MV_HELPER = "Filesystem Move Helper"
|
MV_HELPER = "Filesystem Move Helper"
|
||||||
RM_HELPER = "Filesystem Removal Helper"
|
RM_HELPER = "Filesystem Removal Helper"
|
||||||
MKDIR_HELPER = "Filesystem Directory Creation Helper"
|
MKDIR_HELPER = "Filesystem Directory Creation Helper"
|
||||||
|
ENABLE_REBOOT_FILE_HANDLING = "Enable reboot file handling"
|
||||||
|
DISABLE_REBOOT_FILE_HANDLING = "Disable reboot file handling"
|
||||||
|
RESET_ALL_REBOOT_COUNTERS = "Reset all reboot counters"
|
||||||
|
RWD_RESET_REBOOT_COUNTER_00 = "Reset reboot counter 0 0"
|
||||||
|
RWD_RESET_REBOOT_COUNTER_01 = "Reset reboot counter 0 0"
|
||||||
|
RWD_RESET_REBOOT_COUNTER_10 = "Reset reboot counter 1 0"
|
||||||
|
GET_HK = "Get HK set"
|
||||||
|
RWD_RESET_REBOOT_COUNTER_11 = "Reset reboot counter 1 1"
|
||||||
|
RWD_SET_MAX_REBOOT_CNT = "rwd_max_cnt"
|
||||||
AUTO_SWITCH_ENABLE = "Enable Auto-Switch Feature with a specific target image"
|
AUTO_SWITCH_ENABLE = "Enable Auto-Switch Feature with a specific target image"
|
||||||
AUTO_SWITCH_DISABLE = "Disable Auto-Switch Feature"
|
AUTO_SWITCH_DISABLE = "Disable Auto-Switch Feature"
|
||||||
|
ENABLE_SCHEDULER = "Enable scheduler"
|
||||||
|
DISABLE_SCHEDULER = "Disable scheduler"
|
||||||
|
UPDATE_LEAP_SECONDS = "Updates the Leap Seconds"
|
||||||
|
|
||||||
|
|
||||||
class Chip(enum.IntEnum):
|
class Chip(enum.IntEnum):
|
||||||
@ -162,105 +186,35 @@ class SystemctlCmd(enum.IntEnum):
|
|||||||
RESTART = 2
|
RESTART = 2
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_core_node() -> CmdTreeNode:
|
||||||
def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
op_code_strs = [
|
||||||
oce = OpCodeEntry()
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
oce.add(keys=OpCode.ANNOUNCE_VERSION, info=Info.ANNOUNCE_VERSION)
|
]
|
||||||
oce.add(keys=OpCode.ANNOUNCE_CURRENT_IMAGE, info=Info.ANNOUNCE_CURRENT_IMAGE)
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
oce.add(keys=OpCode.ANNOUNCE_BOOT_COUNTS, info=Info.ANNOUNCE_BOOT_COUNTS)
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
oce.add(keys=OpCode.REBOOT_XSC, info=Info.REBOOT_XSC)
|
node = CmdTreeNode("core", "Core Controller", hide_children_for_print=True)
|
||||||
oce.add(keys=OpCode.REBOOT_XSC, info=Info.REBOOT_XSC)
|
for op_code, info in combined_dict.items():
|
||||||
oce.add(keys=OpCode.REBOOT_FULL, info=Info.REBOOT_FULL)
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
oce.add(keys=OpCode.XSC_REBOOT_SELF, info="Reboot Self")
|
return node
|
||||||
oce.add(keys=OpCode.XSC_REBOOT_0_0, info="Reboot 0 0")
|
|
||||||
oce.add(keys=OpCode.XSC_REBOOT_0_1, info="Reboot 0 1")
|
|
||||||
oce.add(keys=OpCode.XSC_REBOOT_1_0, info="Reboot 1 0")
|
|
||||||
oce.add(keys=OpCode.XSC_REBOOT_1_1, info="Reboot 1 1")
|
|
||||||
oce.add(keys=OpCode.SET_PREF_SD, info=Info.SET_PREF_SD)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.READ_REBOOT_MECHANISM_INFO, info=Info.READ_REBOOT_MECHANISM_INFO
|
|
||||||
)
|
|
||||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
|
|
||||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_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.AUTO_SWITCH_ENABLE, info=Info.AUTO_SWITCH_ENABLE)
|
|
||||||
oce.add(keys=OpCode.AUTO_SWITCH_DISABLE, info=Info.AUTO_SWITCH_DISABLE)
|
|
||||||
oce.add(keys=OpCode.SYSTEMCTL_CMD_EXECUTOR, info=Info.SYSTEMCTL_CMD_EXECUTOR)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.EXECUTE_SHELL_CMD_BLOCKING, info=Info.EXECUTE_SHELL_CMD_BLOCKING
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.EXECUTE_SHELL_CMD_NON_BLOCKING,
|
|
||||||
info=Info.EXECUTE_SHELL_CMD_NON_BLOCKING,
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.GET_HK,
|
|
||||||
info="Request housekeeping set",
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.ENABLE_REBOOT_FILE_HANDLING,
|
|
||||||
info="Enable reboot file handling",
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.DISABLE_REBOOT_FILE_HANDLING,
|
|
||||||
info="Disable reboot file handling",
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.RESET_ALL_REBOOT_COUNTERS,
|
|
||||||
info="Reset all reboot counters",
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.RWD_RESET_REBOOT_COUNTER_00,
|
|
||||||
info="Reset reboot counter 0 0",
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.RWD_RESET_REBOOT_COUNTER_01,
|
|
||||||
info="Reset reboot counter 0 1",
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.RWD_RESET_REBOOT_COUNTER_10,
|
|
||||||
info="Reset reboot counter 1 0",
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
keys=OpCode.RWD_RESET_REBOOT_COUNTER_11,
|
|
||||||
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_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.SWITCH_TO_SD_0, info=Info.SWITCH_TO_SD_0)
|
|
||||||
oce.add(keys=OpCode.SWITCH_TO_SD_1, info=Info.SWITCH_TO_SD_1)
|
|
||||||
oce.add(keys=OpCode.SWITCH_TO_BOTH_SD_CARDS, info=Info.SWITCH_TO_BOTH_SD_CARDS)
|
|
||||||
oce.add(keys=OpCode.LIST_DIR_INTO_FILE, info=Info.LIST_DIR_INTO_FILE)
|
|
||||||
oce.add(keys=OpCode.LIST_DIR_DUMP_DIRECTLY, info=Info.LIST_DIR_DUMP_DIRECTLY)
|
|
||||||
oce.add(keys=OpCode.MV_HELPER, info=Info.MV_HELPER)
|
|
||||||
oce.add(keys=OpCode.CP_HELPER, info=Info.CP_HELPER)
|
|
||||||
oce.add(keys=OpCode.RM_HELPER, info=Info.RM_HELPER)
|
|
||||||
oce.add(keys=OpCode.MKDIR_HELPER, info=Info.MKDIR_HELPER)
|
|
||||||
defs.add_service(CustomServiceList.CORE.value, "Core Controller", oce)
|
|
||||||
|
|
||||||
|
|
||||||
def pack_core_commands( # noqa C901
|
def pack_core_commands( # noqa C901
|
||||||
q: DefaultPusQueueHelper, op_code: str
|
q: DefaultPusQueueHelper, cmd_str: str
|
||||||
): # noqa: C901 , complexity okay here
|
): # noqa: C901 , complexity okay here
|
||||||
if op_code == OpCode.ANNOUNCE_VERSION:
|
if cmd_str == OpCode.ANNOUNCE_VERSION:
|
||||||
q.add_log_cmd(f"{Info.ANNOUNCE_VERSION}")
|
q.add_log_cmd(f"{Info.ANNOUNCE_VERSION}")
|
||||||
q.add_pus_tc(create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_VERSION))
|
q.add_pus_tc(create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_VERSION))
|
||||||
elif op_code == OpCode.ANNOUNCE_CURRENT_IMAGE:
|
elif cmd_str == OpCode.ANNOUNCE_CURRENT_IMAGE:
|
||||||
q.add_log_cmd(f"{Info.ANNOUNCE_CURRENT_IMAGE}")
|
q.add_log_cmd(f"{Info.ANNOUNCE_CURRENT_IMAGE}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_CURRENT_IMAGE)
|
create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_CURRENT_IMAGE)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.ANNOUNCE_BOOT_COUNTS:
|
elif cmd_str == OpCode.ANNOUNCE_BOOT_COUNTS:
|
||||||
q.add_log_cmd(f"{Info.ANNOUNCE_BOOT_COUNTS}")
|
q.add_log_cmd(f"{Info.ANNOUNCE_BOOT_COUNTS}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_BOOT_COUNTS)
|
create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_BOOT_COUNTS)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.REBOOT_XSC:
|
elif cmd_str == OpCode.REBOOT_XSC:
|
||||||
reboot_self, chip_select, copy_select = determine_reboot_params()
|
reboot_self, chip_select, copy_select = determine_reboot_params()
|
||||||
add_xsc_reboot_cmd(
|
add_xsc_reboot_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
@ -268,16 +222,16 @@ def pack_core_commands( # noqa C901
|
|||||||
chip=chip_select,
|
chip=chip_select,
|
||||||
copy=copy_select,
|
copy=copy_select,
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.REBOOT_FULL:
|
elif cmd_str == OpCode.REBOOT_FULL:
|
||||||
q.add_log_cmd(f"Core Command: {Info.REBOOT_FULL}")
|
q.add_log_cmd(f"Core Command: {Info.REBOOT_FULL}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
object_id=CORE_CONTROLLER_ID, action_id=ActionId.FULL_REBOOT
|
object_id=CORE_CONTROLLER_ID, action_id=ActionId.FULL_REBOOT
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.XSC_REBOOT_SELF:
|
elif cmd_str == OpCode.XSC_REBOOT_SELF:
|
||||||
add_xsc_reboot_cmd(q=q, reboot_self=True)
|
add_xsc_reboot_cmd(q=q, reboot_self=True)
|
||||||
elif op_code == OpCode.SYSTEMCTL_CMD_EXECUTOR:
|
elif cmd_str == OpCode.SYSTEMCTL_CMD_EXECUTOR:
|
||||||
print("systemctl command types: ")
|
print("systemctl command types: ")
|
||||||
for entry in SystemctlCmd:
|
for entry in SystemctlCmd:
|
||||||
print(f"{entry}: {entry.name}")
|
print(f"{entry}: {entry.name}")
|
||||||
@ -286,7 +240,7 @@ def pack_core_commands( # noqa C901
|
|||||||
)
|
)
|
||||||
unit_name = input("Specify unit name: ")
|
unit_name = input("Specify unit name: ")
|
||||||
q.add_pus_tc(create_systemctl_cmd(systemctl_cmd, unit_name))
|
q.add_pus_tc(create_systemctl_cmd(systemctl_cmd, unit_name))
|
||||||
elif op_code == OpCode.EXECUTE_SHELL_CMD_BLOCKING:
|
elif cmd_str == OpCode.EXECUTE_SHELL_CMD_BLOCKING:
|
||||||
custom_cmd = input("Please specify command to execute: ")
|
custom_cmd = input("Please specify command to execute: ")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
@ -295,7 +249,7 @@ def pack_core_commands( # noqa C901
|
|||||||
user_data=custom_cmd.encode(),
|
user_data=custom_cmd.encode(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.EXECUTE_SHELL_CMD_NON_BLOCKING:
|
elif cmd_str == OpCode.EXECUTE_SHELL_CMD_NON_BLOCKING:
|
||||||
custom_cmd = input("Please specify command to execute: ")
|
custom_cmd = input("Please specify command to execute: ")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
@ -304,29 +258,29 @@ def pack_core_commands( # noqa C901
|
|||||||
user_data=custom_cmd.encode(),
|
user_data=custom_cmd.encode(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.XSC_REBOOT_0_0:
|
elif cmd_str == OpCode.XSC_REBOOT_0_0:
|
||||||
add_xsc_reboot_cmd(
|
add_xsc_reboot_cmd(
|
||||||
q=q, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM
|
q=q, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.XSC_REBOOT_0_1:
|
elif cmd_str == OpCode.XSC_REBOOT_0_1:
|
||||||
add_xsc_reboot_cmd(
|
add_xsc_reboot_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
reboot_self=False,
|
reboot_self=False,
|
||||||
chip=Chip.CHIP_0,
|
chip=Chip.CHIP_0,
|
||||||
copy=Copy.COPY_1_GOLD,
|
copy=Copy.COPY_1_GOLD,
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.XSC_REBOOT_1_0:
|
elif cmd_str == OpCode.XSC_REBOOT_1_0:
|
||||||
add_xsc_reboot_cmd(
|
add_xsc_reboot_cmd(
|
||||||
q=q, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_0_NOM
|
q=q, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_0_NOM
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.XSC_REBOOT_1_1:
|
elif cmd_str == OpCode.XSC_REBOOT_1_1:
|
||||||
add_xsc_reboot_cmd(
|
add_xsc_reboot_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
reboot_self=False,
|
reboot_self=False,
|
||||||
chip=Chip.CHIP_1,
|
chip=Chip.CHIP_1,
|
||||||
copy=Copy.COPY_1_GOLD,
|
copy=Copy.COPY_1_GOLD,
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.READ_REBOOT_MECHANISM_INFO:
|
elif cmd_str == OpCode.READ_REBOOT_MECHANISM_INFO:
|
||||||
q.add_log_cmd(Info.READ_REBOOT_MECHANISM_INFO)
|
q.add_log_cmd(Info.READ_REBOOT_MECHANISM_INFO)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
@ -334,7 +288,7 @@ def pack_core_commands( # noqa C901
|
|||||||
action_id=ActionId.READ_REBOOT_MECHANISM_INFO,
|
action_id=ActionId.READ_REBOOT_MECHANISM_INFO,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.DISABLE_REBOOT_FILE_HANDLING:
|
elif cmd_str == OpCode.DISABLE_REBOOT_FILE_HANDLING:
|
||||||
q.add_log_cmd("Disabling reboot file handling")
|
q.add_log_cmd("Disabling reboot file handling")
|
||||||
user_data = bytearray([0])
|
user_data = bytearray([0])
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -344,7 +298,7 @@ def pack_core_commands( # noqa C901
|
|||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.ENABLE_REBOOT_FILE_HANDLING:
|
elif cmd_str == OpCode.ENABLE_REBOOT_FILE_HANDLING:
|
||||||
q.add_log_cmd("Enabling reboot file handling")
|
q.add_log_cmd("Enabling reboot file handling")
|
||||||
user_data = bytearray([1])
|
user_data = bytearray([1])
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -354,7 +308,7 @@ def pack_core_commands( # noqa C901
|
|||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.RESET_ALL_REBOOT_COUNTERS:
|
elif cmd_str == OpCode.RESET_ALL_REBOOT_COUNTERS:
|
||||||
q.add_log_cmd("Resetting all reboot counters")
|
q.add_log_cmd("Resetting all reboot counters")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
@ -362,15 +316,15 @@ def pack_core_commands( # noqa C901
|
|||||||
action_id=ActionId.RESET_REBOOT_COUNTER,
|
action_id=ActionId.RESET_REBOOT_COUNTER,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_00:
|
elif cmd_str == OpCode.RWD_RESET_REBOOT_COUNTER_00:
|
||||||
reset_specific_boot_counter(q, 0, 0)
|
reset_specific_boot_counter(q, 0, 0)
|
||||||
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_01:
|
elif cmd_str == OpCode.RWD_RESET_REBOOT_COUNTER_01:
|
||||||
reset_specific_boot_counter(q, 0, 1)
|
reset_specific_boot_counter(q, 0, 1)
|
||||||
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_10:
|
elif cmd_str == OpCode.RWD_RESET_REBOOT_COUNTER_10:
|
||||||
reset_specific_boot_counter(q, 1, 0)
|
reset_specific_boot_counter(q, 1, 0)
|
||||||
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_11:
|
elif cmd_str == 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:
|
elif cmd_str == OpCode.RWD_SET_MAX_REBOOT_CNT:
|
||||||
max_count = int(input("Set new maximum reboot threshold [1, 50]: "))
|
max_count = int(input("Set new maximum reboot threshold [1, 50]: "))
|
||||||
if max_count < 1 or max_count > 50:
|
if max_count < 1 or max_count > 50:
|
||||||
raise ValueError("Invalid value, must be in range 1 to 50")
|
raise ValueError("Invalid value, must be in range 1 to 50")
|
||||||
@ -381,16 +335,16 @@ def pack_core_commands( # noqa C901
|
|||||||
user_data=bytes([max_count]),
|
user_data=bytes([max_count]),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.OBSW_UPDATE_FROM_SD_0:
|
elif cmd_str == 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))
|
||||||
elif op_code in OpCode.OBSW_UPDATE_FROM_SD_1:
|
elif cmd_str == OpCode.OBSW_UPDATE_FROM_SD_1:
|
||||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_1)
|
q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_1)
|
||||||
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_SD_1))
|
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_SD_1))
|
||||||
elif op_code in OpCode.OBSW_UPDATE_FROM_TMP:
|
elif cmd_str == OpCode.OBSW_UPDATE_FROM_TMP:
|
||||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_TMP)
|
q.add_log_cmd(Info.OBSW_UPDATE_FROM_TMP)
|
||||||
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_TMP))
|
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_TMP))
|
||||||
elif op_code in OpCode.AUTO_SWITCH_ENABLE:
|
elif cmd_str == OpCode.AUTO_SWITCH_ENABLE:
|
||||||
q.add_log_cmd(Info.AUTO_SWITCH_ENABLE)
|
q.add_log_cmd(Info.AUTO_SWITCH_ENABLE)
|
||||||
chip, copy = determine_chip_and_copy()
|
chip, copy = determine_chip_and_copy()
|
||||||
user_data = bytes([chip, copy])
|
user_data = bytes([chip, copy])
|
||||||
@ -399,26 +353,26 @@ def pack_core_commands( # noqa C901
|
|||||||
CORE_CONTROLLER_ID, ActionId.AUTO_SWITCH_ENABLE, user_data
|
CORE_CONTROLLER_ID, ActionId.AUTO_SWITCH_ENABLE, user_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.AUTO_SWITCH_DISABLE:
|
elif cmd_str == OpCode.AUTO_SWITCH_DISABLE:
|
||||||
q.add_log_cmd(Info.AUTO_SWITCH_DISABLE)
|
q.add_log_cmd(Info.AUTO_SWITCH_DISABLE)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.AUTO_SWITCH_DISABLE)
|
create_action_cmd(CORE_CONTROLLER_ID, ActionId.AUTO_SWITCH_DISABLE)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.SWITCH_TO_SD_0:
|
elif cmd_str == OpCode.SWITCH_TO_SD_0:
|
||||||
q.add_log_cmd(Info.SWITCH_TO_SD_0)
|
q.add_log_cmd(Info.SWITCH_TO_SD_0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
object_id=CORE_CONTROLLER_ID, action_id=ActionId.SWITCH_TO_SD_0
|
object_id=CORE_CONTROLLER_ID, action_id=ActionId.SWITCH_TO_SD_0
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.SWITCH_TO_SD_1:
|
elif cmd_str == OpCode.SWITCH_TO_SD_1:
|
||||||
q.add_log_cmd(Info.SWITCH_TO_SD_1)
|
q.add_log_cmd(Info.SWITCH_TO_SD_1)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
object_id=CORE_CONTROLLER_ID, action_id=ActionId.SWITCH_TO_SD_1
|
object_id=CORE_CONTROLLER_ID, action_id=ActionId.SWITCH_TO_SD_1
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.SWITCH_TO_BOTH_SD_CARDS:
|
elif cmd_str == OpCode.SWITCH_TO_BOTH_SD_CARDS:
|
||||||
while True:
|
while True:
|
||||||
active_sd_card = int(input("Please specify active SD card [0/1]: "))
|
active_sd_card = int(input("Please specify active SD card [0/1]: "))
|
||||||
if active_sd_card not in [0, 1]:
|
if active_sd_card not in [0, 1]:
|
||||||
@ -432,11 +386,11 @@ def pack_core_commands( # noqa C901
|
|||||||
user_data=bytes([active_sd_card]),
|
user_data=bytes([active_sd_card]),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.GET_HK:
|
elif cmd_str == OpCode.GET_HK:
|
||||||
q.add_log_cmd("Requesting housekeeping set")
|
q.add_log_cmd("Requesting housekeeping set")
|
||||||
sid = make_sid(object_id=CORE_CONTROLLER_ID, set_id=SetId.HK)
|
sid = make_sid(object_id=CORE_CONTROLLER_ID, set_id=SetId.HK)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid))
|
q.add_pus_tc(generate_one_hk_command(sid))
|
||||||
elif op_code in OpCode.SET_PREF_SD:
|
elif cmd_str == OpCode.SET_PREF_SD:
|
||||||
q.add_log_cmd("Set preferred SD card")
|
q.add_log_cmd("Set preferred SD card")
|
||||||
pref_sd = int(
|
pref_sd = int(
|
||||||
input("Specify which SD card to set as the preferred one (0/1): ")
|
input("Specify which SD card to set as the preferred one (0/1): ")
|
||||||
@ -453,7 +407,7 @@ def pack_core_commands( # noqa C901
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.CP_HELPER:
|
elif cmd_str == OpCode.CP_HELPER:
|
||||||
cp_recursive = int(input("Copy recursively (0/1) ?: "))
|
cp_recursive = int(input("Copy recursively (0/1) ?: "))
|
||||||
if cp_recursive not in [0, 1]:
|
if cp_recursive not in [0, 1]:
|
||||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||||
@ -466,13 +420,13 @@ def pack_core_commands( # noqa C901
|
|||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.CP_HELPER, user_data)
|
create_action_cmd(CORE_CONTROLLER_ID, ActionId.CP_HELPER, user_data)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.MV_HELPER:
|
elif cmd_str == OpCode.MV_HELPER:
|
||||||
user_data = packet_source_dest_path("Move")
|
user_data = packet_source_dest_path("Move")
|
||||||
q.add_log_cmd(Info.MV_HELPER)
|
q.add_log_cmd(Info.MV_HELPER)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.MV_HELPER, user_data)
|
create_action_cmd(CORE_CONTROLLER_ID, ActionId.MV_HELPER, user_data)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.RM_HELPER:
|
elif cmd_str == OpCode.RM_HELPER:
|
||||||
rm_recursive = int(input("Remove with recursive (-r) option (0/1) ?: "))
|
rm_recursive = int(input("Remove with recursive (-r) option (0/1) ?: "))
|
||||||
if rm_recursive not in [0, 1]:
|
if rm_recursive not in [0, 1]:
|
||||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||||
@ -487,7 +441,7 @@ def pack_core_commands( # noqa C901
|
|||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.RM_HELPER, user_data)
|
create_action_cmd(CORE_CONTROLLER_ID, ActionId.RM_HELPER, user_data)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.LIST_DIR_INTO_FILE:
|
elif cmd_str == OpCode.LIST_DIR_INTO_FILE:
|
||||||
q.add_log_cmd(Info.LIST_DIR_INTO_FILE)
|
q.add_log_cmd(Info.LIST_DIR_INTO_FILE)
|
||||||
user_data = list_directory_base_user_data()
|
user_data = list_directory_base_user_data()
|
||||||
dest_file_path = input("Destination file path: ")
|
dest_file_path = input("Destination file path: ")
|
||||||
@ -498,7 +452,7 @@ def pack_core_commands( # noqa C901
|
|||||||
CORE_CONTROLLER_ID, ActionId.LIST_DIR_INTO_FILE, user_data
|
CORE_CONTROLLER_ID, ActionId.LIST_DIR_INTO_FILE, user_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.LIST_DIR_DUMP_DIRECTLY:
|
elif cmd_str == OpCode.LIST_DIR_DUMP_DIRECTLY:
|
||||||
q.add_log_cmd(Info.LIST_DIR_DUMP_DIRECTLY)
|
q.add_log_cmd(Info.LIST_DIR_DUMP_DIRECTLY)
|
||||||
user_data = list_directory_base_user_data()
|
user_data = list_directory_base_user_data()
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -506,7 +460,7 @@ def pack_core_commands( # noqa C901
|
|||||||
CORE_CONTROLLER_ID, ActionId.LIST_DIR_DUMP_DIRECTLY, user_data
|
CORE_CONTROLLER_ID, ActionId.LIST_DIR_DUMP_DIRECTLY, user_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code == OpCode.MKDIR_HELPER:
|
elif cmd_str == OpCode.MKDIR_HELPER:
|
||||||
q.add_log_cmd(Info.MKDIR_HELPER)
|
q.add_log_cmd(Info.MKDIR_HELPER)
|
||||||
user_data = input("Specify absolute path of newly created directory: ")
|
user_data = input("Specify absolute path of newly created directory: ")
|
||||||
user_data = bytearray(user_data.encode())
|
user_data = bytearray(user_data.encode())
|
||||||
@ -514,9 +468,25 @@ def pack_core_commands( # noqa C901
|
|||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(CORE_CONTROLLER_ID, ActionId.MKDIR_HELPER, user_data)
|
create_action_cmd(CORE_CONTROLLER_ID, ActionId.MKDIR_HELPER, user_data)
|
||||||
)
|
)
|
||||||
|
elif cmd_str == OpCode.ENABLE_SCHEDULER:
|
||||||
|
q.add_log_cmd(Info.ENABLE_SCHEDULER)
|
||||||
|
q.add_pus_tc(create_enable_tc_sched_cmd())
|
||||||
|
elif cmd_str == OpCode.DISABLE_SCHEDULER:
|
||||||
|
q.add_log_cmd(Info.DISABLE_SCHEDULER)
|
||||||
|
q.add_pus_tc(create_disable_tc_sched_cmd())
|
||||||
|
elif cmd_str == OpCode.UPDATE_LEAP_SECONDS:
|
||||||
|
q.add_log_cmd(Info.UPDATE_LEAP_SECONDS)
|
||||||
|
leap_seconds = int(input("Specify new Leap Seconds Value: ")).to_bytes(
|
||||||
|
length=2, signed=False, byteorder="big"
|
||||||
|
)
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_action_cmd(
|
||||||
|
CORE_CONTROLLER_ID, ActionId.UPDATE_LEAP_SECONRS, leap_seconds
|
||||||
|
)
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
f"Unknown operation code {op_code} for core controller commands"
|
f"Unknown operation code {cmd_str} for core controller commands"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.tmtc.obj_prompt import prompt_object
|
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
CmdTreeNode,
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
)
|
||||||
from tmtccmd.tmtc import service_provider
|
from tmtccmd.pus.s201_fsfw_health import FsfwHealth, Subservice
|
||||||
from tmtccmd.pus.s201_fsfw_health import Subservice, FsfwHealth
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
|
from eive_tmtc.tmtc.obj_prompt import prompt_object
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
@ -30,11 +28,8 @@ def prompt_health() -> FsfwHealth:
|
|||||||
return FsfwHealth(health_idx)
|
return FsfwHealth(health_idx)
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.HEALTH)
|
def build_health_cmds(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
def pack_test_command(p: ServiceProviderParams):
|
if cmd_str == OpCode.SET_HEALTH:
|
||||||
o = p.op_code
|
|
||||||
q = p.queue_helper
|
|
||||||
if o == OpCode.SET_HEALTH:
|
|
||||||
app_data = bytearray(prompt_object())
|
app_data = bytearray(prompt_object())
|
||||||
health = prompt_health()
|
health = prompt_health()
|
||||||
app_data.append(health)
|
app_data.append(health)
|
||||||
@ -44,7 +39,7 @@ def pack_test_command(p: ServiceProviderParams):
|
|||||||
service=201, subservice=Subservice.TC_SET_HEALTH, app_data=app_data
|
service=201, subservice=Subservice.TC_SET_HEALTH, app_data=app_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif o == OpCode.ANNOUNCE_HEALTH:
|
elif cmd_str == OpCode.ANNOUNCE_HEALTH:
|
||||||
app_data = bytearray(prompt_object())
|
app_data = bytearray(prompt_object())
|
||||||
q.add_log_cmd(Info.ANNOUNCE_HEALTH)
|
q.add_log_cmd(Info.ANNOUNCE_HEALTH)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -52,19 +47,22 @@ def pack_test_command(p: ServiceProviderParams):
|
|||||||
service=201, subservice=Subservice.TC_ANNOUNCE_HEALTH, app_data=app_data
|
service=201, subservice=Subservice.TC_ANNOUNCE_HEALTH, app_data=app_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif o == OpCode.ANNOUNCE_HEALTH_ALL:
|
elif cmd_str == OpCode.ANNOUNCE_HEALTH_ALL:
|
||||||
q.add_log_cmd(Info.ANNOUNCE_HEALTH_ALL)
|
q.add_log_cmd(Info.ANNOUNCE_HEALTH_ALL)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(service=201, subservice=Subservice.TC_ANNOUNCE_HEALTH_ALL)
|
PusTelecommand(service=201, subservice=Subservice.TC_ANNOUNCE_HEALTH_ALL)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"unknown op code {o} for service {CustomServiceList.HEALTH}")
|
raise ValueError(
|
||||||
|
f"unknown command string {cmd_str} for service {CustomServiceList.HEALTH}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_global_health_node() -> CmdTreeNode:
|
||||||
def add_health_cmd_defs(defs: TmtcDefinitionWrapper):
|
health_node = CmdTreeNode("health", "Health Commands")
|
||||||
oce = OpCodeEntry()
|
health_node.add_child(
|
||||||
oce.add(OpCode.ANNOUNCE_HEALTH_ALL, Info.ANNOUNCE_HEALTH_ALL)
|
CmdTreeNode(OpCode.ANNOUNCE_HEALTH_ALL, Info.ANNOUNCE_HEALTH_ALL)
|
||||||
oce.add(OpCode.ANNOUNCE_HEALTH, Info.ANNOUNCE_HEALTH)
|
)
|
||||||
oce.add(OpCode.SET_HEALTH, Info.SET_HEALTH)
|
health_node.add_child(CmdTreeNode(OpCode.ANNOUNCE_HEALTH, Info.ANNOUNCE_HEALTH))
|
||||||
defs.add_service(CustomServiceList.HEALTH, info="Health Service", op_code_entry=oce)
|
health_node.add_child(CmdTreeNode(OpCode.SET_HEALTH, Info.SET_HEALTH))
|
||||||
|
return health_node
|
||||||
|
@ -6,6 +6,8 @@ from eive_tmtc.config.object_ids import (
|
|||||||
GYRO_1_L3G_HANDLER_ID,
|
GYRO_1_L3G_HANDLER_ID,
|
||||||
GYRO_2_ADIS_HANDLER_ID,
|
GYRO_2_ADIS_HANDLER_ID,
|
||||||
ACS_BOARD_ASS_ID,
|
ACS_BOARD_ASS_ID,
|
||||||
|
PLOC_MPSOC_ID,
|
||||||
|
PLOC_SUPV_ID,
|
||||||
RW_ASSEMBLY,
|
RW_ASSEMBLY,
|
||||||
SUS_BOARD_ASS_ID,
|
SUS_BOARD_ASS_ID,
|
||||||
MGM_0_LIS3_HANDLER_ID,
|
MGM_0_LIS3_HANDLER_ID,
|
||||||
@ -28,6 +30,7 @@ SUBSYSTEM_DICT = {
|
|||||||
0: "acs",
|
0: "acs",
|
||||||
1: "tcs",
|
1: "tcs",
|
||||||
2: "com",
|
2: "com",
|
||||||
|
3: "payload",
|
||||||
}
|
}
|
||||||
|
|
||||||
ACS_OBJ_DICT = {
|
ACS_OBJ_DICT = {
|
||||||
@ -59,6 +62,11 @@ TCS_OBJ_DICT = {
|
|||||||
5: ("TMP1075 IF BOARD", TMP1075_HANDLER_IF_BRD_ID),
|
5: ("TMP1075 IF BOARD", TMP1075_HANDLER_IF_BRD_ID),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PAYLOAD_OBJ_DICT = {
|
||||||
|
0: ("Payload MPSoC", PLOC_MPSOC_ID),
|
||||||
|
1: ("Payload Supervisor", PLOC_SUPV_ID),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_obj_if_from_dict(lut: dict) -> bytes:
|
def get_obj_if_from_dict(lut: dict) -> bytes:
|
||||||
for k, v in lut.items():
|
for k, v in lut.items():
|
||||||
@ -81,6 +89,8 @@ def prompt_object() -> bytes:
|
|||||||
return get_obj_if_from_dict(ACS_OBJ_DICT)
|
return get_obj_if_from_dict(ACS_OBJ_DICT)
|
||||||
elif subsystem == "tcs":
|
elif subsystem == "tcs":
|
||||||
return get_obj_if_from_dict(TCS_OBJ_DICT)
|
return get_obj_if_from_dict(TCS_OBJ_DICT)
|
||||||
|
elif subsystem == "payload":
|
||||||
|
return get_obj_if_from_dict(PAYLOAD_OBJ_DICT)
|
||||||
else:
|
else:
|
||||||
print(f"No object for subsystem {subsystem}")
|
print(f"No object for subsystem {subsystem}")
|
||||||
return bytes()
|
return bytes()
|
||||||
|
@ -15,15 +15,16 @@ from eive_tmtc.config.definitions import CustomServiceList
|
|||||||
from eive_tmtc.config.object_ids import get_object_ids, PLOC_MPSOC_ID
|
from eive_tmtc.config.object_ids import get_object_ids, PLOC_MPSOC_ID
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
|
CmdTreeNode,
|
||||||
tmtc_definitions_provider,
|
tmtc_definitions_provider,
|
||||||
OpCodeEntry,
|
OpCodeEntry,
|
||||||
TmtcDefinitionWrapper,
|
TmtcDefinitionWrapper,
|
||||||
)
|
)
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.tmtc import service_provider
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from eive_tmtc.utility.input_helper import InputHelper
|
from eive_tmtc.utility.input_helper import InputHelper
|
||||||
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode
|
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode
|
||||||
|
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd, create_scalar_u8_parameter
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -93,6 +94,10 @@ class ActionId(enum.IntEnum):
|
|||||||
TC_FLASH_READ_FULL_FILE = 30
|
TC_FLASH_READ_FULL_FILE = 30
|
||||||
|
|
||||||
|
|
||||||
|
class ParamId(enum.IntEnum):
|
||||||
|
PLOC_SUPV_SKIP_CMD_TO_ON = 1
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
ON = "on"
|
ON = "on"
|
||||||
OFF = "off"
|
OFF = "off"
|
||||||
@ -115,6 +120,8 @@ class OpCode:
|
|||||||
SIMPLEX_SEND_FILE = "simplex_send_file"
|
SIMPLEX_SEND_FILE = "simplex_send_file"
|
||||||
DOWNLINK_DATA_MODULATE = "downlink_data_modulate"
|
DOWNLINK_DATA_MODULATE = "downlink_data_modulate"
|
||||||
MODE_SNAPSHOT = "mode_snapshot"
|
MODE_SNAPSHOT = "mode_snapshot"
|
||||||
|
ENABLE_PLOC_SUPV_COMMANDING_TO_ON = "enable_ploc_supv_cmd_to_on"
|
||||||
|
DISABLE_PLOC_SUPV_COMMANDING_TO_ON = "disable_ploc_supv_cmd_to_on"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -128,6 +135,8 @@ class Info:
|
|||||||
REPLAY_WRITE_SEQ = "Replay write sequence"
|
REPLAY_WRITE_SEQ = "Replay write sequence"
|
||||||
DOWNLINK_PWR_ON = "Downlink Power On"
|
DOWNLINK_PWR_ON = "Downlink Power On"
|
||||||
DOWNLINK_PWR_OFF = "Downlink Power Off"
|
DOWNLINK_PWR_OFF = "Downlink Power Off"
|
||||||
|
MEM_WRITE = "Write to Memory"
|
||||||
|
MEM_READ = "Read from Memory"
|
||||||
REPLAY_START = "Replay Start"
|
REPLAY_START = "Replay Start"
|
||||||
CAM_TAKE_PIC = "Cam Take Picture"
|
CAM_TAKE_PIC = "Cam Take Picture"
|
||||||
SIMPLEX_SEND_FILE = "Simplex Send File"
|
SIMPLEX_SEND_FILE = "Simplex Send File"
|
||||||
@ -137,12 +146,29 @@ class Info:
|
|||||||
FLASH_GET_DIR_CONTENT = "Get flash directory content on MPSoC"
|
FLASH_GET_DIR_CONTENT = "Get flash directory content on MPSoC"
|
||||||
DOWNLINK_DATA_MODULATE = "Downlink data modulate"
|
DOWNLINK_DATA_MODULATE = "Downlink data modulate"
|
||||||
MODE_SNAPSHOT = "Mode Snapshot"
|
MODE_SNAPSHOT = "Mode Snapshot"
|
||||||
|
ENABLE_PLOC_SUPV_COMMANDING_TO_ON = "Enable PLOC SUPV commanding when switching ON"
|
||||||
|
DISABLE_PLOC_SUPV_COMMANDING_TO_ON = (
|
||||||
|
"Disable PLOC SUPV commanding when switching ON"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class MemAddresses(enum.IntEnum):
|
class MemAddresses(enum.IntEnum):
|
||||||
DEADBEEF = 0x40000004
|
DEADBEEF = 0x40000004
|
||||||
|
|
||||||
|
|
||||||
|
def create_ploc_mpsoc_node() -> CmdTreeNode:
|
||||||
|
op_code_strs = [
|
||||||
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
|
]
|
||||||
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
|
node = CmdTreeNode("ploc_mpsoc", "PLOC MPSoC", hide_children_for_print=True)
|
||||||
|
for op_code, info in combined_dict.items():
|
||||||
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
|
# Legacy command definitions.
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_ploc_mpsoc_cmds(defs: TmtcDefinitionWrapper):
|
def add_ploc_mpsoc_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
@ -171,34 +197,39 @@ def add_ploc_mpsoc_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
oce.add(OpCode.SIMPLEX_SEND_FILE, Info.SIMPLEX_SEND_FILE)
|
oce.add(OpCode.SIMPLEX_SEND_FILE, Info.SIMPLEX_SEND_FILE)
|
||||||
oce.add(OpCode.DOWNLINK_DATA_MODULATE, Info.DOWNLINK_DATA_MODULATE)
|
oce.add(OpCode.DOWNLINK_DATA_MODULATE, Info.DOWNLINK_DATA_MODULATE)
|
||||||
oce.add(OpCode.MODE_SNAPSHOT, Info.MODE_SNAPSHOT)
|
oce.add(OpCode.MODE_SNAPSHOT, Info.MODE_SNAPSHOT)
|
||||||
|
oce.add(
|
||||||
|
OpCode.ENABLE_PLOC_SUPV_COMMANDING_TO_ON, Info.ENABLE_PLOC_SUPV_COMMANDING_TO_ON
|
||||||
|
)
|
||||||
|
oce.add(
|
||||||
|
OpCode.DISABLE_PLOC_SUPV_COMMANDING_TO_ON,
|
||||||
|
Info.DISABLE_PLOC_SUPV_COMMANDING_TO_ON,
|
||||||
|
)
|
||||||
defs.add_service(CustomServiceList.PLOC_MPSOC.value, "Ploc MPSoC", oce)
|
defs.add_service(CustomServiceList.PLOC_MPSOC.value, "Ploc MPSoC", oce)
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.PLOC_MPSOC)
|
def pack_ploc_mpsoc_commands(
|
||||||
def pack_ploc_mpsoc_commands( # noqa C901
|
q: DefaultPusQueueHelper, cmd_str: str
|
||||||
p: ServiceProviderParams,
|
|
||||||
): # noqa C901: Complexity okay here.
|
): # noqa C901: Complexity okay here.
|
||||||
object_id = get_object_ids().get(PLOC_MPSOC_ID)
|
object_id = get_object_ids().get(PLOC_MPSOC_ID)
|
||||||
q = p.queue_helper
|
assert object_id is not None
|
||||||
prefix = "PLOC MPSoC"
|
prefix = "PLOC MPSoC"
|
||||||
op_code = p.op_code
|
|
||||||
q.add_log_cmd(
|
q.add_log_cmd(
|
||||||
f"Generate command for PLOC MPSoC with object id: {object_id.as_hex_string}"
|
f"Generate command for PLOC MPSoC with object id: {object_id.as_hex_string}"
|
||||||
)
|
)
|
||||||
obyt = object_id.as_bytes
|
obyt = object_id.as_bytes
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.OFF}")
|
q.add_log_cmd(f"{prefix}: {Info.OFF}")
|
||||||
command = pack_mode_data(obyt, Mode.OFF, 0)
|
command = pack_mode_data(obyt, Mode.OFF, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||||
if op_code == OpCode.ON:
|
if cmd_str == OpCode.ON:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ON}")
|
q.add_log_cmd(f"{prefix}: {Info.ON}")
|
||||||
data = pack_mode_data(obyt, Mode.ON, 0)
|
data = pack_mode_data(obyt, Mode.ON, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||||
if op_code == OpCode.NORMAL:
|
if cmd_str == OpCode.NORMAL:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.NORMAL}")
|
q.add_log_cmd(f"{prefix}: {Info.NORMAL}")
|
||||||
data = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
|
data = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||||
if op_code == OpCode.MEM_WRITE:
|
if cmd_str == OpCode.MEM_WRITE:
|
||||||
q.add_log_cmd("PLOC MPSoC: TC mem write test")
|
q.add_log_cmd("PLOC MPSoC: TC mem write test")
|
||||||
memory_address = int(
|
memory_address = int(
|
||||||
input("PLOC MPSoC: Tc Mem Write: Type memory address: 0x"), 16
|
input("PLOC MPSoC: Tc Mem Write: Type memory address: 0x"), 16
|
||||||
@ -210,39 +241,35 @@ def pack_ploc_mpsoc_commands( # noqa C901
|
|||||||
object_id.as_bytes, memory_address, memory_data, mem_len
|
object_id.as_bytes, memory_address, memory_data, mem_len
|
||||||
)
|
)
|
||||||
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 == "4":
|
if cmd_str == OpCode.FLASH_WRITE_FILE:
|
||||||
q.add_log_cmd("PLOC MPSoC: TC mem read test")
|
|
||||||
data = prepare_mem_read_command(object_id=object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
|
||||||
if op_code == OpCode.FLASH_WRITE_FILE:
|
|
||||||
q.add_log_cmd(f"{prefix}: {Info.FLASH_WRITE_FILE}")
|
q.add_log_cmd(f"{prefix}: {Info.FLASH_WRITE_FILE}")
|
||||||
data = prepare_flash_write_cmd(object_id.as_bytes)
|
data = prepare_flash_write_cmd(object_id.as_bytes)
|
||||||
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 == OpCode.FLASH_READ_FILE:
|
if cmd_str == OpCode.FLASH_READ_FILE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.FLASH_READ_FILE}")
|
q.add_log_cmd(f"{prefix}: {Info.FLASH_READ_FILE}")
|
||||||
data = prepare_flash_read_cmd(object_id.as_bytes)
|
data = prepare_flash_read_cmd(object_id.as_bytes)
|
||||||
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 == OpCode.FLASH_DELETE_FILE:
|
if cmd_str == OpCode.FLASH_DELETE_FILE:
|
||||||
q.add_log_cmd("PLOC MPSoC: Flash delete")
|
q.add_log_cmd("PLOC MPSoC: Flash delete")
|
||||||
data = prepare_flash_delete_cmd(object_id.as_bytes)
|
data = prepare_flash_delete_cmd(object_id.as_bytes)
|
||||||
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 in OpCode.REPLAY_START:
|
if cmd_str in OpCode.REPLAY_START:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REPLAY_START}")
|
q.add_log_cmd(f"{prefix}: {Info.REPLAY_START}")
|
||||||
data = prepare_replay_start_cmd(object_id.as_bytes)
|
data = prepare_replay_start_cmd(object_id.as_bytes)
|
||||||
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 == OpCode.REPLAY_STOP:
|
if cmd_str == OpCode.REPLAY_STOP:
|
||||||
q.add_log_cmd("PLOC MPSoC: Replay stop")
|
q.add_log_cmd("PLOC MPSoC: Replay stop")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_REPLAY_STOP)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_REPLAY_STOP)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == OpCode.DOWNLINK_PWR_ON:
|
if cmd_str == OpCode.DOWNLINK_PWR_ON:
|
||||||
q.add_log_cmd(f"{prefix}: {OpCode.DOWNLINK_PWR_ON}")
|
q.add_log_cmd(f"{prefix}: {OpCode.DOWNLINK_PWR_ON}")
|
||||||
data = prepare_downlink_pwr_on_cmd(object_id.as_bytes)
|
data = prepare_downlink_pwr_on_cmd(object_id.as_bytes)
|
||||||
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 == OpCode.DOWNLINK_PWR_OFF:
|
if cmd_str == OpCode.DOWNLINK_PWR_OFF:
|
||||||
q.add_log_cmd("PLOC MPSoC: Downlink pwr off")
|
q.add_log_cmd("PLOC MPSoC: Downlink pwr off")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_DOWNLINK_PWR_OFF)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_DOWNLINK_PWR_OFF)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == OpCode.FLASH_GET_DIR_CONTENT:
|
if cmd_str == OpCode.FLASH_GET_DIR_CONTENT:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.FLASH_GET_DIR_CONTENT}")
|
q.add_log_cmd(f"{prefix}: {Info.FLASH_GET_DIR_CONTENT}")
|
||||||
dir_name = input("Please specify MPSoC directory name to get information for: ")
|
dir_name = input("Please specify MPSoC directory name to get information for: ")
|
||||||
dir_name = bytearray(dir_name.encode("utf-8"))
|
dir_name = bytearray(dir_name.encode("utf-8"))
|
||||||
@ -254,15 +281,15 @@ def pack_ploc_mpsoc_commands( # noqa C901
|
|||||||
user_data=dir_name,
|
user_data=dir_name,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.REPLAY_WRITE_SEQ:
|
if cmd_str == OpCode.REPLAY_WRITE_SEQ:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REPLAY_WRITE_SEQ}")
|
q.add_log_cmd(f"{prefix}: {Info.REPLAY_WRITE_SEQ}")
|
||||||
data = prepare_replay_write_sequence_cmd(object_id.as_bytes)
|
data = prepare_replay_write_sequence_cmd(object_id.as_bytes)
|
||||||
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 == "12":
|
if cmd_str == "12":
|
||||||
q.add_log_cmd("PLOC MPSoC: Reset OBSW sequence count")
|
q.add_log_cmd("PLOC MPSoC: Reset OBSW sequence count")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.OBSW_RESET_SEQ_COUNT)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.OBSW_RESET_SEQ_COUNT)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == OpCode.VERIFY_BOOT:
|
if cmd_str == OpCode.VERIFY_BOOT:
|
||||||
num_words = 1
|
num_words = 1
|
||||||
q.add_log_cmd(f"{prefix} {Info.VERIFY_BOOT}")
|
q.add_log_cmd(f"{prefix} {Info.VERIFY_BOOT}")
|
||||||
data = (
|
data = (
|
||||||
@ -272,15 +299,15 @@ def pack_ploc_mpsoc_commands( # noqa C901
|
|||||||
+ struct.pack("!H", num_words)
|
+ struct.pack("!H", num_words)
|
||||||
)
|
)
|
||||||
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 == OpCode.MODE_REPLAY:
|
if cmd_str == OpCode.MODE_REPLAY:
|
||||||
q.add_log_cmd("PLOC MPSoC: Tc mode replay")
|
q.add_log_cmd("PLOC MPSoC: Tc mode replay")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_REPLAY)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_REPLAY)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == OpCode.MODE_IDLE:
|
if cmd_str == OpCode.MODE_IDLE:
|
||||||
q.add_log_cmd("PLOC MPSoC: Tc mode idle")
|
q.add_log_cmd("PLOC MPSoC: Tc mode idle")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_IDLE)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_IDLE)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == "16":
|
if cmd_str == "16":
|
||||||
q.add_log_cmd("PLOC MPSoC: Tc cam command send")
|
q.add_log_cmd("PLOC MPSoC: Tc cam command send")
|
||||||
cam_cmd = input("Specify cam command string: ")
|
cam_cmd = input("Specify cam command string: ")
|
||||||
data = (
|
data = (
|
||||||
@ -289,30 +316,48 @@ def pack_ploc_mpsoc_commands( # noqa C901
|
|||||||
+ bytearray(cam_cmd, "utf-8")
|
+ bytearray(cam_cmd, "utf-8")
|
||||||
)
|
)
|
||||||
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 == "17":
|
if cmd_str == "17":
|
||||||
q.add_log_cmd("PLOC MPSoC: Set UART TX tristate")
|
q.add_log_cmd("PLOC MPSoC: Set UART TX tristate")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.SET_UART_TX_TRISTATE)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.SET_UART_TX_TRISTATE)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == "18":
|
if cmd_str == "18":
|
||||||
q.add_log_cmd("PLOC MPSoC: Release UART TX")
|
q.add_log_cmd("PLOC MPSoC: Release UART TX")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.RELEASE_UART_TX)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.RELEASE_UART_TX)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if op_code == OpCode.CAM_TAKE_PIC:
|
if cmd_str == OpCode.CAM_TAKE_PIC:
|
||||||
q.add_log_cmd("PLOC MPSoC: Cam take picture")
|
q.add_log_cmd("PLOC MPSoC: Cam take picture")
|
||||||
data = prepare_cam_take_pic_cmd(object_id.as_bytes)
|
data = prepare_cam_take_pic_cmd(object_id.as_bytes)
|
||||||
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 == OpCode.SIMPLEX_SEND_FILE:
|
if cmd_str == OpCode.SIMPLEX_SEND_FILE:
|
||||||
q.add_log_cmd("PLOC MPSoC: Simplex send file")
|
q.add_log_cmd("PLOC MPSoC: Simplex send file")
|
||||||
data = prepare_simplex_send_file_cmd(object_id.as_bytes)
|
data = prepare_simplex_send_file_cmd(object_id.as_bytes)
|
||||||
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 == OpCode.DOWNLINK_DATA_MODULATE:
|
if cmd_str == OpCode.DOWNLINK_DATA_MODULATE:
|
||||||
q.add_log_cmd("PLOC MPSoC: Downlink data modulate")
|
q.add_log_cmd("PLOC MPSoC: Downlink data modulate")
|
||||||
data = prepare_downlink_data_modulate_cmd(object_id.as_bytes)
|
data = prepare_downlink_data_modulate_cmd(object_id.as_bytes)
|
||||||
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 == OpCode.MODE_SNAPSHOT:
|
if cmd_str == OpCode.MODE_SNAPSHOT:
|
||||||
q.add_log_cmd("PLOC MPSoC: Mode snapshot")
|
q.add_log_cmd("PLOC MPSoC: Mode snapshot")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_SNAPSHOT)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_SNAPSHOT)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
|
if cmd_str == OpCode.ENABLE_PLOC_SUPV_COMMANDING_TO_ON:
|
||||||
|
q.add_log_cmd(Info.ENABLE_PLOC_SUPV_COMMANDING_TO_ON)
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_load_param_cmd(
|
||||||
|
create_scalar_u8_parameter(
|
||||||
|
object_id.as_bytes, 0, ParamId.PLOC_SUPV_SKIP_CMD_TO_ON, 0
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if cmd_str == OpCode.DISABLE_PLOC_SUPV_COMMANDING_TO_ON:
|
||||||
|
q.add_log_cmd(Info.DISABLE_PLOC_SUPV_COMMANDING_TO_ON)
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_load_param_cmd(
|
||||||
|
create_scalar_u8_parameter(
|
||||||
|
object_id.as_bytes, 0, ParamId.PLOC_SUPV_SKIP_CMD_TO_ON, 1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def generate_write_mem_command(
|
def generate_write_mem_command(
|
||||||
@ -674,7 +719,6 @@ def handle_mpsoc_data_reply(action_id: int, pw: PrintWrapper, custom_data: bytea
|
|||||||
num_elements = struct.unpack("!I", custom_data[current_idx : current_idx + 4])[
|
num_elements = struct.unpack("!I", custom_data[current_idx : current_idx + 4])[
|
||||||
0
|
0
|
||||||
]
|
]
|
||||||
current_idx += 4
|
|
||||||
elem_names = []
|
elem_names = []
|
||||||
elem_attrs = []
|
elem_attrs = []
|
||||||
elem_sizes = []
|
elem_sizes = []
|
||||||
|
@ -6,23 +6,20 @@
|
|||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 10.07.2021
|
@date 10.07.2021
|
||||||
"""
|
"""
|
||||||
|
from datetime import datetime
|
||||||
import enum
|
import enum
|
||||||
import logging
|
import logging
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper
|
|
||||||
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
|
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Mode, pack_mode_data
|
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import generate_one_hk_command, make_sid
|
|
||||||
from tmtccmd.tmtc import service_provider
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import PLOC_SUPV_ID, get_object_ids
|
from eive_tmtc.config.object_ids import PLOC_SUPV_ID, get_object_ids
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
|
from tmtccmd.pus.tc.s3_fsfw_hk import generate_one_hk_command, make_sid
|
||||||
|
from tmtccmd.config.tmtc import CmdTreeNode
|
||||||
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode
|
||||||
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
from eive_tmtc.utility.input_helper import InputHelper
|
from eive_tmtc.utility.input_helper import InputHelper
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -42,14 +39,14 @@ MANUAL_INPUT = "1"
|
|||||||
HARDCODED_FILE = "/home/rmueller/EIVE/mpsoc_boot.bin"
|
HARDCODED_FILE = "/home/rmueller/EIVE/mpsoc_boot.bin"
|
||||||
|
|
||||||
UPDATE_FILE_DICT = {
|
UPDATE_FILE_DICT = {
|
||||||
HARDCODED: ["hardcoded", ""],
|
HARDCODED: ("hardcoded", ""),
|
||||||
MANUAL_INPUT: ["manual input", ""],
|
MANUAL_INPUT: ("manual input", ""),
|
||||||
"2": ["/mnt/sd0/ploc/mpsoc/image.bin", "/mnt/sd0/ploc/mpsoc/image.bin"],
|
"2": ("/mnt/sd0/ploc/mpsoc/image.bin", "/mnt/sd0/ploc/mpsoc/image.bin"),
|
||||||
}
|
}
|
||||||
|
|
||||||
EVENT_BUFFER_PATH_DICT = {
|
EVENT_BUFFER_PATH_DICT = {
|
||||||
MANUAL_INPUT: ["manual input", ""],
|
MANUAL_INPUT: ("manual input", ""),
|
||||||
"2": ["/mnt/sd0/ploc/supervisor", "/mnt/sd0/ploc/supervisor"],
|
"2": ("/mnt/sd0/ploc/supervisor", "/mnt/sd0/ploc/supervisor"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -133,126 +130,90 @@ class OpCode:
|
|||||||
ON = "on"
|
ON = "on"
|
||||||
NORMAL = "nml"
|
NORMAL = "nml"
|
||||||
HK_TO_OBC = "hk_to_obc"
|
HK_TO_OBC = "hk_to_obc"
|
||||||
REQUEST_HK_SET_FROM_DEV = "req_hk_from_dev"
|
REQUEST_GENERIC_HK_SET = "req_generic_hk"
|
||||||
REQUEST_HK_SET = "req_hk"
|
|
||||||
START_MPSOC = "start_mpsoc"
|
START_MPSOC = "start_mpsoc"
|
||||||
SHUTDOWN_MPSOC = "stop_mpsoc"
|
SHUTDOWN_MPSOC = "stop_mpsoc"
|
||||||
SEL_NVM = "sel_nvm"
|
SEL_NVM = "sel_nvm"
|
||||||
SET_TIME_REF = "set_time_ref"
|
SET_TIME_REF = "set_time_ref"
|
||||||
FACTORY_FLASH = "factory_flash"
|
FACTORY_FLASH = "factory_flash"
|
||||||
REQ_BOOT_STATUS_REPORT = "boot_report"
|
|
||||||
START_UPDATE = "start_update"
|
START_UPDATE = "start_update"
|
||||||
PERFORM_UPDATE = "update"
|
PERFORM_UPDATE = "update"
|
||||||
FACTORY_RESET = "factory_reset"
|
FACTORY_RESET = "factory_reset"
|
||||||
MEM_CHECK = "mem_check"
|
MEM_CHECK = "mem_check"
|
||||||
RESET_MPSOC = "reset_mpsoc"
|
RESET_MPSOC = "reset_mpsoc"
|
||||||
|
SET_GPIO = "set_gpio"
|
||||||
|
READ_GPIO = "read_gpio"
|
||||||
|
READ_STATUS_REPORT = "read_status_report"
|
||||||
|
|
||||||
|
|
||||||
class Info(str, enum.Enum):
|
class Info(str, enum.Enum):
|
||||||
value: str
|
|
||||||
OFF = "Switch Off"
|
OFF = "Switch Off"
|
||||||
ON = "Switch On"
|
ON = "Switch On"
|
||||||
NML = "Switch Normal"
|
NORMAL = "Switch Normal"
|
||||||
HK_TO_OBC = "Request HK from PLOC SUPV"
|
HK_TO_OBC = "Request HK from PLOC SUPV"
|
||||||
REQUEST_HK_SET_FROM_DEV = "Request HK set from the device to the PLOC Handler"
|
REQUEST_GENERIC_HK_SET = "Request prompted HK set from PLOC Handler"
|
||||||
REQUEST_HK_SET = "Request HK set from PLOC Handler"
|
START_MPSOC = "Start MPSoC"
|
||||||
|
SHUTDOWN_MPSOC = "Shutdown MPSoC"
|
||||||
SET_TIME_REF = "Set time reference"
|
SET_TIME_REF = "Set time reference"
|
||||||
FACTORY_FLASH = "Factory Flash Mode"
|
FACTORY_FLASH = "Factory Flash Mode"
|
||||||
PERFORM_UPDATE = "Start or continue MPSoC SW update at starting bytes"
|
PERFORM_UPDATE = "Start or continue MPSoC SW update at starting bytes"
|
||||||
START_UPDATE = "Start new MPSoC SW update"
|
START_UPDATE = "Start new MPSoC SW update"
|
||||||
FACTORY_RESET = "Factory Reset of loggers"
|
FACTORY_RESET = "Factory Reset of loggers"
|
||||||
REQ_BOOT_STATUS_REPORT = "Request boot status report and HK"
|
|
||||||
MEM_CHECK = "Memory Check"
|
MEM_CHECK = "Memory Check"
|
||||||
SEL_NVM = "Select NVM"
|
SEL_NVM = "Select NVM"
|
||||||
RESET_MPSOC = "Reset MPSoC"
|
RESET_MPSOC = "Reset MPSoC"
|
||||||
|
SET_GPIO = "Set GPIO"
|
||||||
|
READ_GPIO = "Read GPIO"
|
||||||
|
READ_STATUS_REPORT = "Read HK status report"
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_ploc_supv_node() -> CmdTreeNode:
|
||||||
def add_ploc_supv_cmds(defs: TmtcDefinitionWrapper):
|
op_code_strs = [
|
||||||
oce = OpCodeEntry()
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
oce.add(OpCode.OFF, Info.OFF)
|
]
|
||||||
oce.add(OpCode.ON, Info.ON)
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
oce.add(OpCode.NORMAL, Info.NML)
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
oce.add(OpCode.HK_TO_OBC, Info.HK_TO_OBC)
|
node = CmdTreeNode("ploc_supv", "PLOC Supervisor", hide_children_for_print=True)
|
||||||
oce.add(OpCode.REQUEST_HK_SET, Info.REQUEST_HK_SET)
|
for op_code, info in combined_dict.items():
|
||||||
oce.add(OpCode.REQUEST_HK_SET_FROM_DEV, Info.REQUEST_HK_SET_FROM_DEV)
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
oce.add(OpCode.START_MPSOC, "PLOC Supervisor: Start MPSoC")
|
return node
|
||||||
oce.add(OpCode.SHUTDOWN_MPSOC, "PLOC Supervisor: Shutdown MPSoC")
|
|
||||||
oce.add(OpCode.SEL_NVM, Info.SEL_NVM)
|
|
||||||
oce.add(OpCode.SET_TIME_REF, Info.SET_TIME_REF)
|
|
||||||
oce.add(OpCode.FACTORY_RESET, Info.FACTORY_RESET)
|
|
||||||
oce.add(OpCode.RESET_MPSOC, Info.RESET_MPSOC)
|
|
||||||
oce.add("8", "PLOC Supervisor: Set max restart tries")
|
|
||||||
oce.add("11", "PLOC Supervisor: Set boot timeout")
|
|
||||||
oce.add("12", "PLOC Supervisor: Disable Hk")
|
|
||||||
oce.add(OpCode.REQ_BOOT_STATUS_REPORT, Info.REQ_BOOT_STATUS_REPORT)
|
|
||||||
oce.add("17", "PLOC Supervisor: Enable latchup alert")
|
|
||||||
oce.add("18", "PLOC Supervisor: Disable latchup alert")
|
|
||||||
oce.add("20", "PLOC Supervisor: Set alert limit")
|
|
||||||
oce.add("23", "PLOC Supervisor: Set ADC enabled channels")
|
|
||||||
oce.add("24", "PLOC Supervisor: Set ADC window and stride")
|
|
||||||
oce.add("25", "PLOC Supervisor: Set ADC threshold")
|
|
||||||
oce.add("26", "PLOC Supervisor: Request latchup status report")
|
|
||||||
oce.add("27", "PLOC Supervisor: Copy ADC data to MRAM")
|
|
||||||
oce.add("30", "PLOC Supervisor: Run auto EM tests")
|
|
||||||
oce.add("31", "PLOC Supervisor: MRAM Wipe")
|
|
||||||
oce.add("35", "PLOC Supervisor: Set GPIO")
|
|
||||||
oce.add("36", "PLOC Supervisor: Read GPIO")
|
|
||||||
oce.add("37", "PLOC Supervisor: Restart supervisor")
|
|
||||||
oce.add(OpCode.PERFORM_UPDATE, Info.PERFORM_UPDATE)
|
|
||||||
oce.add(OpCode.START_UPDATE, Info.START_UPDATE)
|
|
||||||
oce.add("43", "PLOC Supervisor: Terminate supervisor process")
|
|
||||||
oce.add("44", "PLOC Supervisor: Start MPSoC quiet")
|
|
||||||
oce.add("45", "PLOC Supervisor: Set shutdown timeout")
|
|
||||||
oce.add(OpCode.FACTORY_FLASH, Info.FACTORY_FLASH)
|
|
||||||
oce.add("47", "PLOC Supervisor: Enable auto TM")
|
|
||||||
oce.add("48", "PLOC Supervisor: Disable auto TM")
|
|
||||||
oce.add("51", "PLOC Supervisor: Logging request event buffers")
|
|
||||||
oce.add("52", "PLOC Supervisor: Logging clear counters")
|
|
||||||
oce.add("53", "PLOC Supervisor: Logging set topic")
|
|
||||||
oce.add("54", "PLOC Supervisor: Logging request counters")
|
|
||||||
oce.add("55", "PLOC Supervisor: Request ADC Report")
|
|
||||||
oce.add("56", "PLOC Supervisor: Reset PL")
|
|
||||||
oce.add("57", "PLOC Supervisor: Enable NVMs")
|
|
||||||
oce.add("58", "PLOC Supervisor: Continue update")
|
|
||||||
oce.add(OpCode.MEM_CHECK, Info.MEM_CHECK)
|
|
||||||
defs.add_service(CustomServiceList.PLOC_SUPV.value, "PLOC Supervisor", oce)
|
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.PLOC_SUPV)
|
def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C901
|
||||||
def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
|
|
||||||
q = p.queue_helper
|
|
||||||
op_code = p.op_code
|
|
||||||
object_id = get_object_ids().get(PLOC_SUPV_ID)
|
object_id = get_object_ids().get(PLOC_SUPV_ID)
|
||||||
assert object_id is not None
|
assert object_id is not None
|
||||||
q.add_log_cmd(f"Testing PLOC Supervisor with object id: {object_id.as_hex_string}")
|
q.add_log_cmd(f"Testing PLOC Supervisor with object id: {object_id.as_hex_string}")
|
||||||
obyt = object_id.as_bytes
|
obyt = object_id.as_bytes
|
||||||
prefix = "PLOC Supervisor"
|
prefix = "PLOC Supervisor"
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.OFF}")
|
q.add_log_cmd(f"{prefix}: {Info.OFF}")
|
||||||
command = pack_mode_data(object_id.as_bytes, Mode.OFF, 0)
|
command = pack_mode_data(object_id.as_bytes, Mode.OFF, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||||
if op_code == OpCode.ON:
|
if cmd_str == OpCode.ON:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ON}")
|
q.add_log_cmd(f"{prefix}: {Info.ON}")
|
||||||
command = pack_mode_data(object_id.as_bytes, Mode.ON, 0)
|
command = pack_mode_data(object_id.as_bytes, Mode.ON, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||||
if op_code == OpCode.NORMAL:
|
if cmd_str == OpCode.NORMAL:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.NML}")
|
q.add_log_cmd(f"{prefix}: {Info.NORMAL}")
|
||||||
command = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
|
command = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||||
if op_code == OpCode.HK_TO_OBC:
|
if cmd_str == OpCode.HK_TO_OBC:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.HK_TO_OBC}")
|
q.add_log_cmd(f"{prefix}: {Info.HK_TO_OBC}")
|
||||||
command = obyt + struct.pack("!I", SupvActionId.REQUEST_HK_REPORT)
|
command = obyt + struct.pack("!I", SupvActionId.REQUEST_HK_REPORT)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.REQUEST_HK_SET:
|
if cmd_str == OpCode.START_MPSOC:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REQUEST_HK_SET}")
|
q.add_log_cmd("PLOC Supervisor: Start MPSoC")
|
||||||
sid = make_sid(object_id.as_bytes, prompt_set_id())
|
command = obyt + struct.pack("!I", SupvActionId.START_MPSOC)
|
||||||
cmd = generate_one_hk_command(sid)
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
q.add_pus_tc(cmd)
|
if cmd_str == OpCode.SHUTDOWN_MPSOC:
|
||||||
if op_code == OpCode.REQUEST_HK_SET_FROM_DEV:
|
q.add_log_cmd("PLOC Supervisor: Shutdown MPSoC")
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REQUEST_HK_SET_FROM_DEV}")
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.SHUTWOWN_MPSOC)
|
||||||
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
|
if cmd_str == OpCode.READ_STATUS_REPORT:
|
||||||
|
q.add_log_cmd(f"{prefix}: {Info.READ_STATUS_REPORT}")
|
||||||
set_id = prompt_set_id()
|
set_id = prompt_set_id()
|
||||||
action_cmd = None
|
action_cmd = None
|
||||||
|
# First read the set from the device.
|
||||||
if set_id == SetId.HK_REPORT:
|
if set_id == SetId.HK_REPORT:
|
||||||
action_cmd = create_action_cmd(PLOC_SUPV_ID, SupvActionId.REQUEST_HK_REPORT)
|
action_cmd = create_action_cmd(PLOC_SUPV_ID, SupvActionId.REQUEST_HK_REPORT)
|
||||||
if set_id == SetId.ADC_REPORT:
|
if set_id == SetId.ADC_REPORT:
|
||||||
@ -263,17 +224,33 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
|
|||||||
action_cmd = create_action_cmd(
|
action_cmd = create_action_cmd(
|
||||||
PLOC_SUPV_ID, SupvActionId.REQUEST_LOGGING_COUNTERS
|
PLOC_SUPV_ID, SupvActionId.REQUEST_LOGGING_COUNTERS
|
||||||
)
|
)
|
||||||
assert action_cmd is not None
|
if set_id == SetId.LATCHUP_REPORT:
|
||||||
|
action_cmd = create_action_cmd(
|
||||||
|
PLOC_SUPV_ID, SupvActionId.GET_LATCHUP_STATUS_REPORT
|
||||||
|
)
|
||||||
|
if set_id == SetId.BOOT_STATUS_REPORT:
|
||||||
|
action_cmd = create_action_cmd(
|
||||||
|
PLOC_SUPV_ID, SupvActionId.GET_BOOT_STATUS_REPORT
|
||||||
|
)
|
||||||
|
if action_cmd is None:
|
||||||
|
_LOGGER.warning(f"invalid set ID {set_id!r} for PLOC SUPV")
|
||||||
|
return
|
||||||
|
# Now dump the HK set.
|
||||||
|
sid = make_sid(object_id.as_bytes, set_id)
|
||||||
|
req_hk = generate_one_hk_command(sid)
|
||||||
q.add_pus_tc(action_cmd)
|
q.add_pus_tc(action_cmd)
|
||||||
elif op_code == OpCode.START_MPSOC:
|
q.add_wait_seconds(2.0)
|
||||||
|
q.add_pus_tc(req_hk)
|
||||||
|
assert action_cmd is not None
|
||||||
|
elif cmd_str == OpCode.START_MPSOC:
|
||||||
q.add_log_cmd("PLOC Supervisor: Start MPSoC")
|
q.add_log_cmd("PLOC Supervisor: Start MPSoC")
|
||||||
command = obyt + struct.pack("!I", SupvActionId.START_MPSOC)
|
command = obyt + struct.pack("!I", SupvActionId.START_MPSOC)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.SHUTDOWN_MPSOC:
|
if cmd_str == OpCode.SHUTDOWN_MPSOC:
|
||||||
q.add_log_cmd("PLOC Supervisor: Shutdown MPSoC")
|
q.add_log_cmd("PLOC Supervisor: Shutdown MPSoC")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.SHUTWOWN_MPSOC)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.SHUTWOWN_MPSOC)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.SEL_NVM:
|
if cmd_str == OpCode.SEL_NVM:
|
||||||
q.add_log_cmd("PLOC Supervisor: Select MPSoC boot image")
|
q.add_log_cmd("PLOC Supervisor: Select MPSoC boot image")
|
||||||
mem = int(input("MEM (NVM0 - 0 or NVM1 - 1): "))
|
mem = int(input("MEM (NVM0 - 0 or NVM1 - 1): "))
|
||||||
bp0 = int(input("BP0 (0 or 1): "))
|
bp0 = int(input("BP0 (0 or 1): "))
|
||||||
@ -281,7 +258,7 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
|
|||||||
bp2 = int(input("BP2 (0 or 1): "))
|
bp2 = int(input("BP2 (0 or 1): "))
|
||||||
command = pack_sel_boot_image_cmd(object_id.as_bytes, mem, bp0, bp1, bp2)
|
command = pack_sel_boot_image_cmd(object_id.as_bytes, mem, bp0, bp1, bp2)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.FACTORY_RESET:
|
if cmd_str == OpCode.FACTORY_RESET:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.FACTORY_RESET}")
|
q.add_log_cmd(f"{prefix}: {Info.FACTORY_RESET}")
|
||||||
while True:
|
while True:
|
||||||
print("Please select the key for a factory reset operation")
|
print("Please select the key for a factory reset operation")
|
||||||
@ -298,7 +275,7 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
|
|||||||
user_data=bytes([key]),
|
user_data=bytes([key]),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == "8":
|
if cmd_str == "8":
|
||||||
q.add_log_cmd("PLOC Supervisor: Set max restart tries")
|
q.add_log_cmd("PLOC Supervisor: Set max restart tries")
|
||||||
restart_tries = int(input("Specify maximum restart tries: "))
|
restart_tries = int(input("Specify maximum restart tries: "))
|
||||||
command = (
|
command = (
|
||||||
@ -307,15 +284,15 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
|
|||||||
+ struct.pack("!B", restart_tries)
|
+ struct.pack("!B", restart_tries)
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.RESET_MPSOC:
|
if cmd_str == OpCode.RESET_MPSOC:
|
||||||
q.add_log_cmd(Info.RESET_MPSOC)
|
q.add_log_cmd(Info.RESET_MPSOC)
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.RESET_MPSOC)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.RESET_MPSOC)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.SET_TIME_REF:
|
if cmd_str == OpCode.SET_TIME_REF:
|
||||||
q.add_log_cmd("PLOC Supervisor: Set time reference")
|
q.add_log_cmd("PLOC Supervisor: Set time reference")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.SET_TIME_REF)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.SET_TIME_REF)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "11":
|
if cmd_str == "11":
|
||||||
q.add_log_cmd("PLOC Supervisor: Set boot timeout")
|
q.add_log_cmd("PLOC Supervisor: Set boot timeout")
|
||||||
boot_timeout = int(input("Specify boot timeout [ms]: "))
|
boot_timeout = int(input("Specify boot timeout [ms]: "))
|
||||||
command = (
|
command = (
|
||||||
@ -324,143 +301,63 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
|
|||||||
+ struct.pack("!I", boot_timeout)
|
+ struct.pack("!I", boot_timeout)
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "12":
|
if cmd_str == "23":
|
||||||
q.add_log_cmd("PLOC Supervisor: Disable HK")
|
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.DISABLE_HK)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code in OpCode.REQ_BOOT_STATUS_REPORT:
|
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REQ_BOOT_STATUS_REPORT}")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.GET_BOOT_STATUS_REPORT
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
q.add_wait_seconds(2.0)
|
|
||||||
sid = make_sid(object_id.as_bytes, SetId.BOOT_STATUS_REPORT)
|
|
||||||
req_hk = generate_one_hk_command(sid)
|
|
||||||
q.add_pus_tc(req_hk)
|
|
||||||
if op_code == "17":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Enable latchup alert")
|
|
||||||
command = pack_lachtup_alert_cmd(object_id.as_bytes, True)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "18":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Disable latchup alert")
|
|
||||||
command = pack_lachtup_alert_cmd(object_id.as_bytes, False)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "20":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Set alert limit")
|
|
||||||
command = pack_set_alert_limit_cmd(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "23":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Set ADC enabled channels")
|
q.add_log_cmd("PLOC Supervisor: Set ADC enabled channels")
|
||||||
command = pack_set_adc_enabled_channels_cmd(object_id.as_bytes)
|
command = pack_set_adc_enabled_channels_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "24":
|
if cmd_str == "24":
|
||||||
q.add_log_cmd("PLOC Supervisor: Set ADC window and stride")
|
q.add_log_cmd("PLOC Supervisor: Set ADC window and stride")
|
||||||
command = pack_set_adc_window_and_stride_cmd(object_id.as_bytes)
|
command = pack_set_adc_window_and_stride_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "25":
|
if cmd_str == "25":
|
||||||
q.add_log_cmd("PLOC Supervisor: Set ADC threshold")
|
q.add_log_cmd("PLOC Supervisor: Set ADC threshold")
|
||||||
command = pack_set_adc_threshold_cmd(object_id.as_bytes)
|
command = pack_set_adc_threshold_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "26":
|
if cmd_str == OpCode.SET_GPIO:
|
||||||
q.add_log_cmd("PLOC Supervisor: Request latchup status report")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.GET_LATCHUP_STATUS_REPORT
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "27":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Copy ADC data to MRAM")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.COPY_ADC_DATA_TO_MRAM
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "30":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Run auto EM tests")
|
|
||||||
command = pack_auto_em_tests_cmd(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "31":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Wipe MRAM")
|
|
||||||
command = pack_mram_wipe_cmd(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "35":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Set GPIO command")
|
q.add_log_cmd("PLOC Supervisor: Set GPIO command")
|
||||||
command = pack_set_gpio_cmd(object_id.as_bytes)
|
command = pack_set_gpio_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "36":
|
if cmd_str == OpCode.READ_GPIO:
|
||||||
q.add_log_cmd("PLOC Supervisor: Read GPIO command")
|
q.add_log_cmd("PLOC Supervisor: Read GPIO command")
|
||||||
command = pack_read_gpio_cmd(object_id.as_bytes)
|
command = pack_read_gpio_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "37":
|
if cmd_str == "37":
|
||||||
q.add_log_cmd("PLOC Supervisor: Restart supervisor")
|
q.add_log_cmd("PLOC Supervisor: Restart supervisor")
|
||||||
command = object_id.as_bytes + struct.pack(
|
command = object_id.as_bytes + struct.pack(
|
||||||
"!I", SupvActionId.RESTART_SUPERVISOR
|
"!I", SupvActionId.RESTART_SUPERVISOR
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code in OpCode.START_UPDATE:
|
if cmd_str in OpCode.START_UPDATE:
|
||||||
q.add_log_cmd("PLOC Supversior: Start new MPSoC SW update")
|
q.add_log_cmd("PLOC Supversior: Start new MPSoC SW update")
|
||||||
command = pack_update_command(object_id.as_bytes, True)
|
command = pack_update_command(object_id.as_bytes, True)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code in OpCode.PERFORM_UPDATE:
|
if cmd_str in OpCode.PERFORM_UPDATE:
|
||||||
q.add_log_cmd("PLOC Supervisor: Perform MPSoC SW update")
|
q.add_log_cmd("PLOC Supervisor: Perform MPSoC SW update")
|
||||||
command = pack_update_command(object_id.as_bytes, False)
|
command = pack_update_command(object_id.as_bytes, False)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "43":
|
if cmd_str == "43":
|
||||||
q.add_log_cmd("PLOC Supervisor: Terminate supervisor process")
|
q.add_log_cmd("PLOC Supervisor: Terminate supervisor process")
|
||||||
command = object_id.as_bytes + struct.pack(
|
command = object_id.as_bytes + struct.pack(
|
||||||
"!I", SupvActionId.TERMINATE_SUPV_HELPER
|
"!I", SupvActionId.TERMINATE_SUPV_HELPER
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "44":
|
if cmd_str == "44":
|
||||||
q.add_log_cmd("PLOC Supervisor: Start MPSoC quiet")
|
q.add_log_cmd("PLOC Supervisor: Start MPSoC quiet")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.START_MPSOC_QUIET)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.START_MPSOC_QUIET)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "45":
|
if cmd_str == "45":
|
||||||
q.add_log_cmd("PLOC Supervisor: Set shutdown timeout")
|
q.add_log_cmd("PLOC Supervisor: Set shutdown timeout")
|
||||||
command = pack_set_shutdown_timeout_command(object_id.as_bytes)
|
command = pack_set_shutdown_timeout_command(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code in OpCode.FACTORY_FLASH:
|
if cmd_str in OpCode.FACTORY_FLASH:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.FACTORY_FLASH}")
|
q.add_log_cmd(f"{prefix}: {Info.FACTORY_FLASH}")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.FACTORY_FLASH)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.FACTORY_FLASH)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "47":
|
if cmd_str == "56":
|
||||||
q.add_log_cmd("PLOC Supervisor: Enable auto TM")
|
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.ENABLE_AUTO_TM)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "48":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Disable auto TM")
|
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.DISABLE_AUTO_TM)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "51":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Logging request event buffers")
|
|
||||||
command = pack_logging_buffer_request(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "52":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Logging clear counters")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.LOGGING_CLEAR_COUNTERS
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "53":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Logging set topic")
|
|
||||||
command = pack_logging_set_topic(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "54":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Logging request counters")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.REQUEST_LOGGING_COUNTERS
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "55":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Request ADC report")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.REQUEST_ADC_REPORT
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if op_code == "56":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Reset PL")
|
q.add_log_cmd("PLOC Supervisor: Reset PL")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.RESET_PL)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.RESET_PL)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "57":
|
if cmd_str == "57":
|
||||||
q.add_log_cmd("PLOC Supervisor: Enable NVMs")
|
q.add_log_cmd("PLOC Supervisor: Enable NVMs")
|
||||||
nvm01 = int(input("Enable (1) or disable(0) NVM 0 and 1: "))
|
nvm01 = int(input("Enable (1) or disable(0) NVM 0 and 1: "))
|
||||||
nvm3 = int(input("Enable (1) or disable(0) NVM 3: "))
|
nvm3 = int(input("Enable (1) or disable(0) NVM 3: "))
|
||||||
@ -471,11 +368,11 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
|
|||||||
+ struct.pack("B", nvm3)
|
+ struct.pack("B", nvm3)
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == "58":
|
if cmd_str == "58":
|
||||||
q.add_log_cmd("PLOC Supervisor: Continue update")
|
q.add_log_cmd("PLOC Supervisor: Continue update")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.CONTINUE_UPDATE)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.CONTINUE_UPDATE)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code == OpCode.MEM_CHECK:
|
if cmd_str == OpCode.MEM_CHECK:
|
||||||
custom_data = bytearray()
|
custom_data = bytearray()
|
||||||
update_file = get_update_file()
|
update_file = get_update_file()
|
||||||
memory_id = int(input("Specify memory ID: "))
|
memory_id = int(input("Specify memory ID: "))
|
||||||
@ -768,6 +665,8 @@ def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
|||||||
handle_adc_report(hk_data)
|
handle_adc_report(hk_data)
|
||||||
elif set_id == SetId.COUNTERS_REPORT:
|
elif set_id == SetId.COUNTERS_REPORT:
|
||||||
handle_counters_report(hk_data)
|
handle_counters_report(hk_data)
|
||||||
|
elif set_id == SetId.LATCHUP_REPORT:
|
||||||
|
handle_latchup_status_report(hk_data)
|
||||||
else:
|
else:
|
||||||
pw.dlog(f"PLOC SUPV: HK handling not implemented for set ID {set_id}")
|
pw.dlog(f"PLOC SUPV: HK handling not implemented for set ID {set_id}")
|
||||||
pw.dlog(f"Raw Data: 0x[{hk_data.hex(sep=',')}]")
|
pw.dlog(f"Raw Data: 0x[{hk_data.hex(sep=',')}]")
|
||||||
@ -912,3 +811,53 @@ def handle_counters_report(hk_data: bytes):
|
|||||||
print(f"MM task lost: {mm_task_lost}")
|
print(f"MM task lost: {mm_task_lost}")
|
||||||
print(f"HK task lost: {hk_task_lost}")
|
print(f"HK task lost: {hk_task_lost}")
|
||||||
print(f"DL task lost: {dl_task_lost}")
|
print(f"DL task lost: {dl_task_lost}")
|
||||||
|
|
||||||
|
|
||||||
|
def handle_latchup_status_report(hk_data: bytes):
|
||||||
|
# 1 byte ID, 7 times 2 bytes of counts, and 8 bytes of time and 1 byte sync status.
|
||||||
|
if len(hk_data) < 24:
|
||||||
|
raise ValueError("Latchup status report smaller than expected")
|
||||||
|
current_idx = 0
|
||||||
|
id = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
counts_of_alerts = []
|
||||||
|
for _ in range(7):
|
||||||
|
counts_of_alerts.append(
|
||||||
|
struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
|
||||||
|
)
|
||||||
|
current_idx += 2
|
||||||
|
print(f"ID: {id}")
|
||||||
|
print(f"Counts of alerts: {counts_of_alerts}")
|
||||||
|
time_ms = struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
|
||||||
|
current_idx += 2
|
||||||
|
time_seconds = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
time_minutes = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
time_hour = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
time_day = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
time_month = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
# Is stored as years since 1900.
|
||||||
|
time_year = 1900 + hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
is_synced = hk_data[current_idx]
|
||||||
|
print(f"Time Sync Status: {is_synced}")
|
||||||
|
try:
|
||||||
|
dt = datetime(
|
||||||
|
year=time_year,
|
||||||
|
month=time_month,
|
||||||
|
day=time_day,
|
||||||
|
hour=time_hour,
|
||||||
|
minute=time_minutes,
|
||||||
|
second=time_seconds,
|
||||||
|
microsecond=time_ms * 1000,
|
||||||
|
)
|
||||||
|
print(f"Time Now: {dt}")
|
||||||
|
except ValueError:
|
||||||
|
print(
|
||||||
|
f"Time: {time_day}.{time_month}.{time_year}T"
|
||||||
|
f"{time_hour}:{time_minutes}:{time_seconds}.{time_ms}"
|
||||||
|
)
|
||||||
|
@ -6,7 +6,7 @@ from typing import Optional
|
|||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper
|
from tmtccmd.config import CmdTreeNode, TmtcDefinitionWrapper
|
||||||
|
|
||||||
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
|
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
@ -34,7 +34,6 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
SWITCH_HPA_ON_PROC = ["0", "proc_hpa"]
|
|
||||||
SWITCH_ON = "on"
|
SWITCH_ON = "on"
|
||||||
SWITCH_OFF = "off"
|
SWITCH_OFF = "off"
|
||||||
NORMAL_SSR = "nml_ssr"
|
NORMAL_SSR = "nml_ssr"
|
||||||
@ -76,12 +75,17 @@ class Info:
|
|||||||
NORMAL_HPA = f"{NORMAL}, HPA on"
|
NORMAL_HPA = f"{NORMAL}, HPA on"
|
||||||
NORMAL_CUSTOM = f"{NORMAL}, Custom Channel Settings"
|
NORMAL_CUSTOM = f"{NORMAL}, Custom Channel Settings"
|
||||||
REQ_OS_HK = "Request One Shot HK"
|
REQ_OS_HK = "Request One Shot HK"
|
||||||
SWITCH_HPA_ON_PROC = "Switch HPA on procedure"
|
|
||||||
ENABLE_HK = "Enable HK"
|
ENABLE_HK = "Enable HK"
|
||||||
DISABLE_HK = "Disable HK"
|
DISABLE_HK = "Disable HK"
|
||||||
UPDATE_I_UPPER_LIMIT = "Update upper current parameter"
|
UPDATE_I_UPPER_LIMIT = "Update upper current parameter"
|
||||||
UPDATE_V_LOWER_LIMIT = "Update lower voltage parameter"
|
UPDATE_V_LOWER_LIMIT = "Update lower voltage parameter"
|
||||||
UPDATE_V_UPPER_LIMIT = "Update upper voltage parameter"
|
UPDATE_V_UPPER_LIMIT = "Update upper voltage parameter"
|
||||||
|
INJECT_SSR_TO_DRO_FAILURE = "Inject SSR to DRO failure"
|
||||||
|
INJECT_DRO_TO_X8_FAILURE = "Inject DRO to X8 failure"
|
||||||
|
INJECT_X8_TO_TX_FAILURE = "Inject X8 to TX failure"
|
||||||
|
INJECT_TX_TO_MPA_FAILURE = "Inject TX to MPA failure"
|
||||||
|
INJECT_MPA_TO_HPA_FAILURE = "Inject MPA to HPA failure"
|
||||||
|
INJECT_ALL_ON_FAILURE = "Inject all on failure"
|
||||||
DISABLE_ORDER_CHECKING = "Disable order checks"
|
DISABLE_ORDER_CHECKING = "Disable order checks"
|
||||||
ENABLE_ORDER_CHECKING = "Enable order checks"
|
ENABLE_ORDER_CHECKING = "Enable order checks"
|
||||||
|
|
||||||
@ -182,10 +186,21 @@ class DevSelect(enum.IntEnum):
|
|||||||
HPA = 5
|
HPA = 5
|
||||||
|
|
||||||
|
|
||||||
|
def create_pl_pcdu_node() -> CmdTreeNode:
|
||||||
|
op_code_strs = [
|
||||||
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
|
]
|
||||||
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
|
node = CmdTreeNode("pl_pcdu", "Payload PCDU", hide_children_for_print=True)
|
||||||
|
for op_code, info in combined_dict.items():
|
||||||
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_pl_pcdu_cmds(defs: TmtcDefinitionWrapper):
|
def add_pl_pcdu_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
oce.add(keys=OpCode.SWITCH_HPA_ON_PROC, info=Info.SWITCH_HPA_ON_PROC)
|
|
||||||
oce.add(keys=OpCode.SWITCH_ON, info=Info.SWITCH_ON)
|
oce.add(keys=OpCode.SWITCH_ON, info=Info.SWITCH_ON)
|
||||||
oce.add(keys=OpCode.SWITCH_OFF, info=Info.SWITCH_OFF)
|
oce.add(keys=OpCode.SWITCH_OFF, info=Info.SWITCH_OFF)
|
||||||
oce.add(keys=OpCode.NORMAL_SSR, info=Info.NORMAL_SSR)
|
oce.add(keys=OpCode.NORMAL_SSR, info=Info.NORMAL_SSR)
|
||||||
@ -227,13 +242,13 @@ def add_pl_pcdu_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
|
|
||||||
|
|
||||||
def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
||||||
q: DefaultPusQueueHelper, op_code: str
|
q: DefaultPusQueueHelper, cmd_str: str
|
||||||
): # noqa C901: Complexity is okay here.
|
): # noqa C901: Complexity is okay here.
|
||||||
if op_code == OpCode.SWITCH_ON:
|
if cmd_str == OpCode.SWITCH_ON:
|
||||||
pack_pl_pcdu_mode_cmd(q=q, info=Info.SWITCH_ON, mode=Mode.ON, submode=0)
|
pack_pl_pcdu_mode_cmd(q=q, info=Info.SWITCH_ON, mode=Mode.ON, submode=0)
|
||||||
if op_code == OpCode.SWITCH_OFF:
|
if cmd_str == OpCode.SWITCH_OFF:
|
||||||
pack_pl_pcdu_mode_cmd(q=q, info=Info.SWITCH_OFF, mode=Mode.OFF, submode=0)
|
pack_pl_pcdu_mode_cmd(q=q, info=Info.SWITCH_OFF, mode=Mode.OFF, submode=0)
|
||||||
if op_code in OpCode.ENABLE_HK:
|
if cmd_str in OpCode.ENABLE_HK:
|
||||||
interval = float(
|
interval = float(
|
||||||
input("Please enter HK collection interval in floating point seconds: ")
|
input("Please enter HK collection interval in floating point seconds: ")
|
||||||
)
|
)
|
||||||
@ -243,13 +258,13 @@ def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
|||||||
q.add_log_cmd(f"Enable PL PCDU HK with interval of {interval} seconds")
|
q.add_log_cmd(f"Enable PL PCDU HK with interval of {interval} seconds")
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code == OpCode.DISABLE_HK:
|
if cmd_str == OpCode.DISABLE_HK:
|
||||||
cmd = disable_periodic_hk_command(
|
cmd = disable_periodic_hk_command(
|
||||||
diag=True, sid=make_sid(PL_PCDU_ID, SetId.ADC)
|
diag=True, sid=make_sid(PL_PCDU_ID, SetId.ADC)
|
||||||
)
|
)
|
||||||
q.add_log_cmd("Disabling PL PCDU HK")
|
q.add_log_cmd("Disabling PL PCDU HK")
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code == OpCode.NORMAL_SSR:
|
if cmd_str == OpCode.NORMAL_SSR:
|
||||||
pack_pl_pcdu_mode_cmd(
|
pack_pl_pcdu_mode_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
info=Info.NORMAL_SSR,
|
info=Info.NORMAL_SSR,
|
||||||
@ -258,57 +273,57 @@ def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
|||||||
NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NORMAL_DRO:
|
if cmd_str == OpCode.NORMAL_DRO:
|
||||||
pack_pl_pcdu_mode_cmd(
|
pack_pl_pcdu_mode_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
info=Info.NORMAL_DRO,
|
info=Info.NORMAL_DRO,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON),
|
submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON),
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NORMAL_X8:
|
if cmd_str == OpCode.NORMAL_X8:
|
||||||
pack_pl_pcdu_mode_cmd(
|
pack_pl_pcdu_mode_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
info=Info.NORMAL_X8,
|
info=Info.NORMAL_X8,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON),
|
submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON),
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NORMAL_TX:
|
if cmd_str == OpCode.NORMAL_TX:
|
||||||
pack_pl_pcdu_mode_cmd(
|
pack_pl_pcdu_mode_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
info=Info.NORMAL_TX,
|
info=Info.NORMAL_TX,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON),
|
submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON),
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NORMAL_MPA:
|
if cmd_str == OpCode.NORMAL_MPA:
|
||||||
pack_pl_pcdu_mode_cmd(
|
pack_pl_pcdu_mode_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
info=Info.NORMAL_MPA,
|
info=Info.NORMAL_MPA,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON),
|
submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON),
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NORMAL_HPA:
|
if cmd_str == OpCode.NORMAL_HPA:
|
||||||
pack_pl_pcdu_mode_cmd(
|
pack_pl_pcdu_mode_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
info=Info.NORMAL_HPA,
|
info=Info.NORMAL_HPA,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON),
|
submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON),
|
||||||
)
|
)
|
||||||
|
if cmd_str == OpCode.NORMAL_CUSTOM:
|
||||||
if op_code == OpCode.NORMAL_CUSTOM:
|
|
||||||
pack_pl_pcdu_mode_cmd(
|
pack_pl_pcdu_mode_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
info=Info.NORMAL_CUSTOM,
|
info=Info.NORMAL_CUSTOM,
|
||||||
mode=Mode.NORMAL,
|
mode=Mode.NORMAL,
|
||||||
submode=prompt_custom_normal_submode(),
|
submode=prompt_custom_normal_submode(),
|
||||||
)
|
)
|
||||||
if op_code == OpCode.REQ_OS_HK:
|
|
||||||
|
if cmd_str == OpCode.REQ_OS_HK:
|
||||||
q.add_log_cmd(f"PL PCDU: {Info.REQ_OS_HK}")
|
q.add_log_cmd(f"PL PCDU: {Info.REQ_OS_HK}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_diag_command(
|
generate_one_diag_command(
|
||||||
sid=make_sid(object_id=PL_PCDU_ID, set_id=SetId.ADC)
|
sid=make_sid(object_id=PL_PCDU_ID, set_id=SetId.ADC)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.DISABLE_ORDER_CHECKING:
|
if cmd_str == OpCode.DISABLE_ORDER_CHECKING:
|
||||||
q.add_log_cmd(Info.DISABLE_ORDER_CHECKING)
|
q.add_log_cmd(Info.DISABLE_ORDER_CHECKING)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_load_param_cmd(
|
create_load_param_cmd(
|
||||||
@ -318,7 +333,7 @@ def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.ENABLE_ORDER_CHECKING:
|
if cmd_str == OpCode.ENABLE_ORDER_CHECKING:
|
||||||
q.add_log_cmd(Info.ENABLE_ORDER_CHECKING)
|
q.add_log_cmd(Info.ENABLE_ORDER_CHECKING)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_load_param_cmd(
|
create_load_param_cmd(
|
||||||
@ -328,7 +343,7 @@ def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.UPDATE_I_UPPER_LIMIT:
|
if cmd_str == OpCode.UPDATE_I_UPPER_LIMIT:
|
||||||
q.add_log_cmd(Info.UPDATE_I_UPPER_LIMIT)
|
q.add_log_cmd(Info.UPDATE_I_UPPER_LIMIT)
|
||||||
print("Select device to update lower current limit for: ")
|
print("Select device to update lower current limit for: ")
|
||||||
param_id = dev_select_to_upper_i_update_param_id(dev_select_prompt(True))
|
param_id = dev_select_to_upper_i_update_param_id(dev_select_prompt(True))
|
||||||
@ -340,7 +355,7 @@ def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
|||||||
create_scalar_double_parameter(PL_PCDU_ID, 0, param_id, new_param_value)
|
create_scalar_double_parameter(PL_PCDU_ID, 0, param_id, new_param_value)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.UPDATE_V_LOWER_LIMIT:
|
if cmd_str == OpCode.UPDATE_V_LOWER_LIMIT:
|
||||||
q.add_log_cmd(Info.UPDATE_V_LOWER_LIMIT)
|
q.add_log_cmd(Info.UPDATE_V_LOWER_LIMIT)
|
||||||
print("Select device to update lower voltage limit for: ")
|
print("Select device to update lower voltage limit for: ")
|
||||||
param_id = dev_select_to_lower_u_update_param_id(dev_select_prompt(False))
|
param_id = dev_select_to_lower_u_update_param_id(dev_select_prompt(False))
|
||||||
@ -352,7 +367,7 @@ def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
|||||||
create_scalar_double_parameter(PL_PCDU_ID, 0, param_id, new_param_value)
|
create_scalar_double_parameter(PL_PCDU_ID, 0, param_id, new_param_value)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.UPDATE_V_UPPER_LIMIT:
|
if cmd_str == OpCode.UPDATE_V_UPPER_LIMIT:
|
||||||
q.add_log_cmd(Info.UPDATE_V_UPPER_LIMIT)
|
q.add_log_cmd(Info.UPDATE_V_UPPER_LIMIT)
|
||||||
print("Select device to update upper voltage limit for: ")
|
print("Select device to update upper voltage limit for: ")
|
||||||
param_id = dev_select_to_upper_u_update_param_id(dev_select_prompt(False))
|
param_id = dev_select_to_upper_u_update_param_id(dev_select_prompt(False))
|
||||||
@ -364,9 +379,7 @@ def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
|
|||||||
create_scalar_double_parameter(PL_PCDU_ID, 0, param_id, new_param_value)
|
create_scalar_double_parameter(PL_PCDU_ID, 0, param_id, new_param_value)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.SWITCH_HPA_ON_PROC:
|
if cmd_str == OpCode.INJECT_ALL_ON_FAILURE:
|
||||||
hpa_on_procedure(q)
|
|
||||||
if op_code == OpCode.INJECT_ALL_ON_FAILURE:
|
|
||||||
pack_failure_injection_cmd(
|
pack_failure_injection_cmd(
|
||||||
q=q,
|
q=q,
|
||||||
param_id=ParamId.INJECT_ALL_ON_FAILURE,
|
param_id=ParamId.INJECT_ALL_ON_FAILURE,
|
||||||
|
@ -66,27 +66,27 @@ def add_rad_sens_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def pack_rad_sensor_test_into(
|
def create_rad_sensor_cmd(
|
||||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
):
|
):
|
||||||
q.add_log_cmd(f"Commanding Radiation sensor handler {object_id}")
|
q.add_log_cmd(f"Commanding Radiation sensor handler {object_id}")
|
||||||
|
|
||||||
if op_code in OpCode.ON:
|
if cmd_str in OpCode.ON:
|
||||||
rad_sensor_mode_cmd(object_id, Mode.ON, Info.ON, q)
|
rad_sensor_mode_cmd(object_id, Mode.ON, Info.ON, q)
|
||||||
if op_code in OpCode.NORMAL:
|
if cmd_str in OpCode.NORMAL:
|
||||||
rad_sensor_mode_cmd(object_id, Mode.NORMAL, Info.NORMAL, q)
|
rad_sensor_mode_cmd(object_id, Mode.NORMAL, Info.NORMAL, q)
|
||||||
if op_code in OpCode.OFF:
|
if cmd_str in OpCode.OFF:
|
||||||
rad_sensor_mode_cmd(object_id, Mode.OFF, Info.OFF, q)
|
rad_sensor_mode_cmd(object_id, Mode.OFF, Info.OFF, q)
|
||||||
if op_code in OpCode.REQ_HK_ONCE:
|
if cmd_str in OpCode.REQ_HK_ONCE:
|
||||||
q.add_log_cmd(f"Rad sensor: {Info.REQ_OS_HK}")
|
q.add_log_cmd(f"Rad sensor: {Info.REQ_OS_HK}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_hk_command(sid=make_sid(object_id.as_bytes, set_id=SetId.HK))
|
generate_one_hk_command(sid=make_sid(object_id.as_bytes, set_id=SetId.HK))
|
||||||
)
|
)
|
||||||
if op_code in OpCode.DEBUG_ON:
|
if cmd_str in OpCode.DEBUG_ON:
|
||||||
q.add_log_cmd(f"Rad sensor: {Info.DEBUG_ON}")
|
q.add_log_cmd(f"Rad sensor: {Info.DEBUG_ON}")
|
||||||
command = object_id.as_bytes + struct.pack("!I", CommandId.ENABLE_DEBUG_OUTPUT)
|
command = object_id.as_bytes + struct.pack("!I", CommandId.ENABLE_DEBUG_OUTPUT)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if op_code in OpCode.DEBUG_OFF:
|
if cmd_str in OpCode.DEBUG_OFF:
|
||||||
q.add_log_cmd(f"Rad sensor: {Info.DEBUG_OFF}")
|
q.add_log_cmd(f"Rad sensor: {Info.DEBUG_OFF}")
|
||||||
command = object_id.as_bytes + struct.pack("!I", CommandId.DISABLE_DEBUG_OUTPUT)
|
command = object_id.as_bytes + struct.pack("!I", CommandId.DISABLE_DEBUG_OUTPUT)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
|
@ -2,16 +2,12 @@ import enum
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
|
from tmtccmd.config.tmtc import CmdTreeNode
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Mode, pack_mode_data, Subservice
|
|
||||||
from tmtccmd.tmtc import service_provider
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
from tmtccmd.config import OpCodeEntry, TmtcDefinitionWrapper
|
from tmtccmd.pus.s200_fsfw_mode import Mode, Subservice, pack_mode_data
|
||||||
from eive_tmtc.config.object_ids import SCEX_HANDLER_ID
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
|
||||||
|
from eive_tmtc.config.object_ids import SCEX_HANDLER_ID
|
||||||
|
|
||||||
USE_SCEX_CONF_FILE = True
|
USE_SCEX_CONF_FILE = True
|
||||||
|
|
||||||
@ -26,10 +22,8 @@ class OpCode:
|
|||||||
ALL_CELLS_CMD = "allcells"
|
ALL_CELLS_CMD = "allcells"
|
||||||
FRAM = "fram"
|
FRAM = "fram"
|
||||||
|
|
||||||
ON = "on"
|
|
||||||
SWITCH_ON = "on"
|
SWITCH_ON = "on"
|
||||||
OFF = "off"
|
SWITCH_OFF = "off"
|
||||||
SWITCH_OFF = OFF
|
|
||||||
NORMAL = "normal"
|
NORMAL = "normal"
|
||||||
|
|
||||||
|
|
||||||
@ -59,31 +53,20 @@ class Info:
|
|||||||
NORMAL = "Switch SCEX to normal mode"
|
NORMAL = "Switch SCEX to normal mode"
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_scex_node() -> CmdTreeNode:
|
||||||
def add_scex_cmds(defs: TmtcDefinitionWrapper):
|
op_code_strs = [
|
||||||
oce = OpCodeEntry()
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
oce.add(keys=OpCode.PING, info=Info.PING)
|
]
|
||||||
oce.add(keys=OpCode.ION_CMD, info=Info.ION_CMD)
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
oce.add(keys=OpCode.TEMP_CMD, info=Info.TEMP_CMD)
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
oce.add(keys=OpCode.EXP_STATUS_CMD, info=Info.EXP_STATUS_CMD)
|
scex_node = CmdTreeNode("scex", "Solar Cell Experiment")
|
||||||
oce.add(keys=OpCode.ONE_CELLS_CMD, info=Info.ONE_CELLS_CMD)
|
for op_code, info in combined_dict.items():
|
||||||
|
scex_node.add_child(CmdTreeNode(op_code, info))
|
||||||
oce.add(keys=OpCode.ALL_CELLS_CMD, info=Info.ALL_CELLS_CMD)
|
return scex_node
|
||||||
oce.add(keys=OpCode.FRAM, info=Info.FRAM)
|
|
||||||
oce.add(keys=OpCode.ON, info=Info.SWITCH_ON)
|
|
||||||
oce.add(keys=OpCode.OFF, info=Info.SWITCH_OFF)
|
|
||||||
oce.add(keys=OpCode.NORMAL, info=Info.NORMAL)
|
|
||||||
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.SCEX.value, info="SCEX Device", op_code_entry=oce
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.SCEX.value)
|
def pack_scex_cmds(q: DefaultPusQueueHelper, cmd_str: str): # noqa C901
|
||||||
def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
if cmd_str == OpCode.SWITCH_ON:
|
||||||
op_code = p.op_code
|
|
||||||
q = p.queue_helper
|
|
||||||
if op_code == OpCode.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(
|
||||||
@ -92,7 +75,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.ON, 0),
|
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.ON, 0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.NORMAL:
|
if cmd_str == OpCode.NORMAL:
|
||||||
q.add_log_cmd(Info.NORMAL)
|
q.add_log_cmd(Info.NORMAL)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -101,7 +84,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.NORMAL, 0),
|
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.NORMAL, 0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == 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(
|
||||||
@ -110,20 +93,20 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.OFF, 0),
|
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.OFF, 0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.PING:
|
if cmd_str == OpCode.PING:
|
||||||
q.add_log_cmd(Info.PING)
|
q.add_log_cmd(Info.PING)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.PING, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.PING, app_data))
|
||||||
if op_code == OpCode.ION_CMD:
|
if cmd_str == OpCode.ION_CMD:
|
||||||
q.add_log_cmd(Info.ION_CMD)
|
q.add_log_cmd(Info.ION_CMD)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.ION_CMD, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.ION_CMD, app_data))
|
||||||
if op_code == OpCode.TEMP_CMD:
|
if cmd_str == OpCode.TEMP_CMD:
|
||||||
q.add_log_cmd(Info.TEMP_CMD)
|
q.add_log_cmd(Info.TEMP_CMD)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.TEMP_CMD, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.TEMP_CMD, app_data))
|
||||||
|
|
||||||
if op_code == OpCode.EXP_STATUS_CMD:
|
if cmd_str == 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(
|
||||||
@ -131,7 +114,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
)
|
)
|
||||||
|
|
||||||
# one cell
|
# one cell
|
||||||
if op_code == OpCode.ONE_CELLS_CMD:
|
if cmd_str == 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])
|
||||||
|
|
||||||
@ -161,7 +144,8 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
dac_weight1 = json_data["dac_weight1"]
|
dac_weight1 = json_data["dac_weight1"]
|
||||||
dac_weight2 = json_data["dac_weight2"]
|
dac_weight2 = json_data["dac_weight2"]
|
||||||
dac_weight3 = json_data["dac_weight3"]
|
dac_weight3 = json_data["dac_weight3"]
|
||||||
|
else:
|
||||||
|
raise ValueError("CLI support for SCEX params not implemented")
|
||||||
# in app_data
|
# in app_data
|
||||||
# app_data.extend(struct.pack("!H", first_dac))
|
# app_data.extend(struct.pack("!H", first_dac))
|
||||||
app_data.append(cell_select)
|
app_data.append(cell_select)
|
||||||
@ -178,7 +162,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
create_action_cmd(SCEX_HANDLER_ID, ActionId.ONE_CELLS_CMD, app_data)
|
create_action_cmd(SCEX_HANDLER_ID, ActionId.ONE_CELLS_CMD, app_data)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.ALL_CELLS_CMD:
|
if cmd_str == 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])
|
||||||
|
|
||||||
@ -195,6 +179,8 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
dac_weight2 = json_data["dac_weight2"]
|
dac_weight2 = json_data["dac_weight2"]
|
||||||
dac_weight3 = json_data["dac_weight3"]
|
dac_weight3 = json_data["dac_weight3"]
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise ValueError("CLI support for SCEX params not implemented")
|
||||||
# in app_data
|
# in app_data
|
||||||
# app_data.extend(struct.pack("!H", first_dac))
|
# app_data.extend(struct.pack("!H", first_dac))
|
||||||
append_16_bit_val(packet=app_data, val=first_dac[cn])
|
append_16_bit_val(packet=app_data, val=first_dac[cn])
|
||||||
@ -210,7 +196,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
create_action_cmd(SCEX_HANDLER_ID, ActionId.ALL_CELLS_CMD, app_data)
|
create_action_cmd(SCEX_HANDLER_ID, ActionId.ALL_CELLS_CMD, app_data)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code == OpCode.FRAM:
|
if cmd_str == 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))
|
||||||
|
@ -1,14 +1,11 @@
|
|||||||
import enum
|
import enum
|
||||||
from typing import Dict, Tuple
|
from typing import Dict, Tuple
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import PL_SUBSYSTEM_ID
|
from eive_tmtc.config.object_ids import PL_SUBSYSTEM_ID
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
from tmtccmd.config import CmdTreeNode
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.tmtc import service_provider
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservice
|
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservice
|
||||||
|
|
||||||
|
|
||||||
@ -24,24 +21,28 @@ class ModeId(enum.IntEnum):
|
|||||||
class OpCode(str, enum.Enum):
|
class OpCode(str, enum.Enum):
|
||||||
OFF = "off"
|
OFF = "off"
|
||||||
REPORT_ALL_MODES = "report_modes"
|
REPORT_ALL_MODES = "report_modes"
|
||||||
|
MPSOC_STREAM = "mode_mpsoc_stream"
|
||||||
|
CAM_STREAM = "mode_cam_stream"
|
||||||
|
EARTH_OBSV = "mode_eart_obsv"
|
||||||
|
|
||||||
|
|
||||||
class Info(str, enum.Enum):
|
class Info(str, enum.Enum):
|
||||||
OFF = "Off Command"
|
OFF = "Off Command"
|
||||||
REPORT_ALL_MODES = "Report all modes"
|
REPORT_ALL_MODES = "Report all modes"
|
||||||
|
MPSOC_STREAM = "MPSoC Stream Mode"
|
||||||
|
CAM_STREAM = "Camera Stream Mode"
|
||||||
|
EARTH_OBSV = "Earth Observation Mode"
|
||||||
|
|
||||||
|
|
||||||
HANDLER_LIST: Dict[str, Tuple[int, str]] = {
|
HANDLER_LIST: Dict[str, Tuple[int, str]] = {
|
||||||
OpCode.OFF: (ModeId.OFF, Info.OFF),
|
OpCode.OFF: (ModeId.OFF, Info.OFF),
|
||||||
|
OpCode.MPSOC_STREAM: (ModeId.MPSOC_STREAM, Info.MPSOC_STREAM),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.PL_SS)
|
def create_payload_subsystem_cmd(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
def build_acs_subsystem_cmd(p: ServiceProviderParams):
|
info_prefix = "Payload Subsystem"
|
||||||
op_code = p.op_code
|
if cmd_str == OpCode.REPORT_ALL_MODES:
|
||||||
q = p.queue_helper
|
|
||||||
info_prefix = "ACS Subsystem"
|
|
||||||
if op_code in OpCode.REPORT_ALL_MODES:
|
|
||||||
q.add_log_cmd(f"{info_prefix}: {Info.REPORT_ALL_MODES}")
|
q.add_log_cmd(f"{info_prefix}: {Info.REPORT_ALL_MODES}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -50,21 +51,29 @@ def build_acs_subsystem_cmd(p: ServiceProviderParams):
|
|||||||
app_data=PL_SUBSYSTEM_ID,
|
app_data=PL_SUBSYSTEM_ID,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
mode_info_tup = HANDLER_LIST.get(op_code)
|
mode_info_tup = HANDLER_LIST.get(cmd_str)
|
||||||
|
assert mode_info_tup is not None
|
||||||
if mode_info_tup is None:
|
if mode_info_tup is None:
|
||||||
return
|
return
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
object_id=PL_SUBSYSTEM_ID,
|
object_id=PL_SUBSYSTEM_ID,
|
||||||
info=f"{info_prefix}: {mode_info_tup[1]}",
|
info=f"{info_prefix}: {mode_info_tup[1]}",
|
||||||
submode=0,
|
|
||||||
mode=mode_info_tup[0],
|
mode=mode_info_tup[0],
|
||||||
|
submode=0,
|
||||||
q=q,
|
q=q,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_payload_subsystem_node() -> CmdTreeNode:
|
||||||
def add_payload_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
payload_node = CmdTreeNode("payload", "Payload Subsystem")
|
||||||
oce = OpCodeEntry()
|
subsystem_node = CmdTreeNode("subsystem", "Subsystem Commands")
|
||||||
oce.add(OpCode.OFF, Info.OFF)
|
subsystem_node.add_child(CmdTreeNode(OpCode.OFF, Info.OFF))
|
||||||
oce.add(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES)
|
subsystem_node.add_child(CmdTreeNode(OpCode.MPSOC_STREAM, Info.MPSOC_STREAM))
|
||||||
defs.add_service(CustomServiceList.PL_SS, "Payload Subsystem", oce)
|
subsystem_node.add_child(CmdTreeNode(OpCode.EARTH_OBSV, Info.EARTH_OBSV))
|
||||||
|
subsystem_node.add_child(CmdTreeNode(OpCode.CAM_STREAM, Info.CAM_STREAM))
|
||||||
|
|
||||||
|
subsystem_node.add_child(
|
||||||
|
CmdTreeNode(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES)
|
||||||
|
)
|
||||||
|
payload_node.add_child(subsystem_node)
|
||||||
|
return payload_node
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
from .subsystem import add_eps_subsystem_cmds
|
|
||||||
from .pwr_ctrl import pwr_cmd_defs
|
|
@ -8,6 +8,7 @@ import struct
|
|||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from eive_tmtc.tmtc.power.common_power import (
|
from eive_tmtc.tmtc.power.common_power import (
|
||||||
|
add_gomspace_nodes,
|
||||||
pack_common_gomspace_cmds,
|
pack_common_gomspace_cmds,
|
||||||
add_gomspace_cmd_defs,
|
add_gomspace_cmd_defs,
|
||||||
req_hk_cmds,
|
req_hk_cmds,
|
||||||
@ -16,7 +17,7 @@ from eive_tmtc.tmtc.power.common_power import (
|
|||||||
OBC_ENDIANNESS,
|
OBC_ENDIANNESS,
|
||||||
unpack_array_in_data,
|
unpack_array_in_data,
|
||||||
)
|
)
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
from tmtccmd.config import CmdTreeNode, TmtcDefinitionWrapper, OpCodeEntry
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||||
|
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
@ -50,6 +51,15 @@ class Info:
|
|||||||
TEST = "ACU Test"
|
TEST = "ACU Test"
|
||||||
|
|
||||||
|
|
||||||
|
def create_acu_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode(
|
||||||
|
"acu", "P60 PCDU ACU device", hide_children_which_are_leaves=True
|
||||||
|
)
|
||||||
|
add_gomspace_nodes(node)
|
||||||
|
node.add_child(CmdTreeNode(OpCode.TEST[0], Info.TEST))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_acu_cmds(defs: TmtcDefinitionWrapper):
|
def add_acu_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
@ -63,11 +73,11 @@ def add_acu_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def pack_acu_commands(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str):
|
def pack_acu_commands(object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
q.add_log_cmd("Handling ACU command")
|
q.add_log_cmd("Handling ACU command")
|
||||||
pack_common_power_cmds("ACU", object_id, q, op_code)
|
pack_common_power_cmds("ACU", object_id, q, cmd_str)
|
||||||
pack_common_gomspace_cmds("ACU", object_id, q, op_code)
|
pack_common_gomspace_cmds("ACU", object_id, q, cmd_str)
|
||||||
acu_req_hk_cmds(q, op_code)
|
acu_req_hk_cmds(q, cmd_str)
|
||||||
pack_test_cmds(object_id=object_id, q=q)
|
pack_test_cmds(object_id=object_id, q=q)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,23 +1,19 @@
|
|||||||
import enum
|
import enum
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import BPX_HANDLER_ID
|
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
CmdTreeNode,
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
)
|
||||||
from tmtccmd.tmtc import service_provider
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import generate_one_hk_command, make_sid
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservices
|
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import Mode, pack_mode_data
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservices
|
||||||
|
from tmtccmd.pus.tc.s3_fsfw_hk import generate_one_hk_command, make_sid
|
||||||
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
|
||||||
|
from eive_tmtc.config.object_ids import BPX_HANDLER_ID
|
||||||
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
|
|
||||||
|
|
||||||
class BpxSetId(enum.IntEnum):
|
class BpxSetId(enum.IntEnum):
|
||||||
@ -54,38 +50,38 @@ class BpxOpCode:
|
|||||||
REBOOT = "reboot"
|
REBOOT = "reboot"
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_bpx_batt_node() -> CmdTreeNode:
|
||||||
def add_bpx_cmd_definitions(defs: TmtcDefinitionWrapper):
|
node = CmdTreeNode("bat", "BPX battery device", hide_children_for_print=True)
|
||||||
oce = OpCodeEntry()
|
node.add_child(CmdTreeNode(BpxOpCode.ON, "ON command"))
|
||||||
oce.add(keys=BpxOpCode.ON, info="On command")
|
node.add_child(CmdTreeNode(BpxOpCode.OFF, "OFF command"))
|
||||||
oce.add(keys=BpxOpCode.OFF, info="Off command")
|
node.add_child(CmdTreeNode(BpxOpCode.HK, "HK command"))
|
||||||
oce.add(keys=BpxOpCode.HK, info="Request BPX HK")
|
node.add_child(CmdTreeNode(BpxOpCode.RST_BOOT_CNT, "Reset boot count"))
|
||||||
oce.add(keys=BpxOpCode.RST_BOOT_CNT, info="Reset Boot Count")
|
node.add_child(
|
||||||
oce.add(keys=BpxOpCode.RST_CFG, info="Reset Config to stored default settings")
|
CmdTreeNode(BpxOpCode.RST_CFG, "Reset Config to stored default settings")
|
||||||
oce.add(keys=BpxOpCode.SET_CFG, info="Set BPX configuration")
|
|
||||||
oce.add(keys=BpxOpCode.MAN_HEATER_ON, info="Manual heater on")
|
|
||||||
oce.add(keys=BpxOpCode.MAN_HEATER_OFF, info="Manual heater off")
|
|
||||||
oce.add(keys=BpxOpCode.REQUEST_CFG, info="Request Configuration Struct (Step 1)")
|
|
||||||
oce.add(
|
|
||||||
keys=BpxOpCode.REQUEST_CFG_HK, info="Request Configuration Struct HK (Step 2)"
|
|
||||||
)
|
)
|
||||||
oce.add(keys=BpxOpCode.REBOOT, info="Reboot Command")
|
node.add_child(CmdTreeNode(BpxOpCode.SET_CFG, "Set BPX configuration"))
|
||||||
defs.add_service(
|
node.add_child(CmdTreeNode(BpxOpCode.MAN_HEATER_ON, "Manual heater on"))
|
||||||
name=CustomServiceList.BPX_BATTERY.value,
|
node.add_child(CmdTreeNode(BpxOpCode.MAN_HEATER_OFF, "Manual heater off"))
|
||||||
info="BPX Battery Handler",
|
node.add_child(
|
||||||
op_code_entry=oce,
|
CmdTreeNode(BpxOpCode.REQUEST_CFG, "Request Configuration Struct (Step 1)")
|
||||||
)
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
BpxOpCode.REQUEST_CFG_HK, "Request Configuration Struct HK (Step 2)"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(CmdTreeNode(BpxOpCode.REBOOT, "Reboot Command"))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.BPX_BATTERY.value)
|
def pack_bpx_commands(
|
||||||
def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is okay here.
|
q: DefaultPusQueueHelper, cmd_str: str
|
||||||
op_code = p.op_code
|
): # noqa C901: Complexity is okay here.
|
||||||
q = p.queue_helper
|
if cmd_str == BpxOpCode.HK:
|
||||||
if op_code == BpxOpCode.HK:
|
|
||||||
q.add_log_cmd("Requesting BPX battery HK set")
|
q.add_log_cmd("Requesting BPX battery HK set")
|
||||||
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_HK_SET)
|
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_HK_SET)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
||||||
if op_code == BpxOpCode.OFF:
|
if cmd_str == BpxOpCode.OFF:
|
||||||
q.add_log_cmd("Off mode")
|
q.add_log_cmd("Off mode")
|
||||||
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.OFF, 0)
|
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.OFF, 0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -95,7 +91,7 @@ def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is oka
|
|||||||
app_data=mode_cmd,
|
app_data=mode_cmd,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.ON:
|
if cmd_str == BpxOpCode.ON:
|
||||||
q.add_log_cmd("On mode")
|
q.add_log_cmd("On mode")
|
||||||
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.ON, 0)
|
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.ON, 0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -105,21 +101,21 @@ def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is oka
|
|||||||
app_data=mode_cmd,
|
app_data=mode_cmd,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.RST_BOOT_CNT:
|
if cmd_str == BpxOpCode.RST_BOOT_CNT:
|
||||||
q.add_log_cmd("Resetting reboot counters")
|
q.add_log_cmd("Resetting reboot counters")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
object_id=BPX_HANDLER_ID, action_id=BpxActionId.RESET_COUNTERS
|
object_id=BPX_HANDLER_ID, action_id=BpxActionId.RESET_COUNTERS
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.RST_CFG:
|
if cmd_str == BpxOpCode.RST_CFG:
|
||||||
q.add_log_cmd("Reset BPX configuration")
|
q.add_log_cmd("Reset BPX configuration")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
object_id=BPX_HANDLER_ID, action_id=BpxActionId.CONFIG_CMD
|
object_id=BPX_HANDLER_ID, action_id=BpxActionId.CONFIG_CMD
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.SET_CFG:
|
if cmd_str == BpxOpCode.SET_CFG:
|
||||||
q.add_log_cmd("Setting BPX configuration")
|
q.add_log_cmd("Setting BPX configuration")
|
||||||
user_data = bytearray()
|
user_data = bytearray()
|
||||||
batt_mode = BpxHeaterModeSelect(
|
batt_mode = BpxHeaterModeSelect(
|
||||||
@ -137,21 +133,21 @@ def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is oka
|
|||||||
user_data=user_data,
|
user_data=user_data,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.REQUEST_CFG:
|
if cmd_str == BpxOpCode.REQUEST_CFG:
|
||||||
q.add_log_cmd("Requesting configuration struct")
|
q.add_log_cmd("Requesting configuration struct")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.GET_CFG)
|
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.GET_CFG)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.REQUEST_CFG_HK:
|
if cmd_str == BpxOpCode.REQUEST_CFG_HK:
|
||||||
q.add_log_cmd("Requesting configuration struct HK")
|
q.add_log_cmd("Requesting configuration struct HK")
|
||||||
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_CFG_SET)
|
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_CFG_SET)
|
||||||
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
||||||
if op_code == BpxOpCode.REBOOT:
|
if cmd_str == BpxOpCode.REBOOT:
|
||||||
q.add_log_cmd("Rebooting BPX battery")
|
q.add_log_cmd("Rebooting BPX battery")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.REBOOT)
|
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.REBOOT)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.MAN_HEATER_ON:
|
if cmd_str == BpxOpCode.MAN_HEATER_ON:
|
||||||
q.add_log_cmd("BPX manual heater on with seconds burntime")
|
q.add_log_cmd("BPX manual heater on with seconds burntime")
|
||||||
burn_time = int(input("BPX heater burn time in seconds [1-65535]: "))
|
burn_time = int(input("BPX heater burn time in seconds [1-65535]: "))
|
||||||
if burn_time < 1 or burn_time > 65535:
|
if burn_time < 1 or burn_time > 65535:
|
||||||
@ -163,7 +159,7 @@ def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is oka
|
|||||||
user_data=struct.pack("!H", burn_time),
|
user_data=struct.pack("!H", burn_time),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == BpxOpCode.MAN_HEATER_OFF:
|
if cmd_str == BpxOpCode.MAN_HEATER_OFF:
|
||||||
q.add_log_cmd("BPX manual heater off")
|
q.add_log_cmd("BPX manual heater off")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_action_cmd(
|
create_action_cmd(
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import enum
|
import enum
|
||||||
import struct
|
import struct
|
||||||
from typing import List
|
from typing import List, Tuple
|
||||||
|
|
||||||
from eive_tmtc.gomspace.gomspace_common import (
|
from eive_tmtc.gomspace.gomspace_common import (
|
||||||
pack_set_u8_param_command,
|
pack_set_u8_param_command,
|
||||||
@ -14,8 +14,7 @@ from eive_tmtc.gomspace.gomspace_common import (
|
|||||||
pack_reboot_command,
|
pack_reboot_command,
|
||||||
)
|
)
|
||||||
from eive_tmtc.gomspace.gomspace_pdu_definitions import OUT_ENABLE_LIST
|
from eive_tmtc.gomspace.gomspace_pdu_definitions import OUT_ENABLE_LIST
|
||||||
from spacepackets.ecss import PusTelecommand
|
from tmtccmd.config import CmdTreeNode, OpCodeEntry
|
||||||
from tmtccmd.config import OpCodeEntry
|
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||||
make_sid,
|
make_sid,
|
||||||
@ -258,7 +257,7 @@ def req_hk_cmds(
|
|||||||
q: DefaultPusQueueHelper,
|
q: DefaultPusQueueHelper,
|
||||||
op_code: str,
|
op_code: str,
|
||||||
obj_id: bytes,
|
obj_id: bytes,
|
||||||
set_id_pair: [int, int],
|
set_id_pair: Tuple[int, int],
|
||||||
):
|
):
|
||||||
if op_code in PowerOpCodes.REQUEST_CORE_HK_ONCE:
|
if op_code in PowerOpCodes.REQUEST_CORE_HK_ONCE:
|
||||||
q.add_log_cmd(f"{prefix}: {PowerInfo.REQUEST_CORE_HK_ONCE}")
|
q.add_log_cmd(f"{prefix}: {PowerInfo.REQUEST_CORE_HK_ONCE}")
|
||||||
@ -270,10 +269,6 @@ def req_hk_cmds(
|
|||||||
q.add_pus_tc(generate_one_hk_command(sid=hk_sid))
|
q.add_pus_tc(generate_one_hk_command(sid=hk_sid))
|
||||||
|
|
||||||
|
|
||||||
def pack_pdu_disable_safe_off_cmd() -> PusTelecommand:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def generic_on_cmd(
|
def generic_on_cmd(
|
||||||
object_id: bytes, q: DefaultPusQueueHelper, info_str: str, out_idx: int
|
object_id: bytes, q: DefaultPusQueueHelper, info_str: str, out_idx: int
|
||||||
):
|
):
|
||||||
@ -311,6 +306,54 @@ def add_common_power_defs(oce: OpCodeEntry):
|
|||||||
oce.add(keys=PowerOpCodes.DISABLE_INFO_HK, info=PowerInfo.DISABLE_INFO_HK)
|
oce.add(keys=PowerOpCodes.DISABLE_INFO_HK, info=PowerInfo.DISABLE_INFO_HK)
|
||||||
|
|
||||||
|
|
||||||
|
def add_gomspace_nodes(node: CmdTreeNode):
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.REQUEST_CORE_HK_ONCE[0], PowerInfo.REQUEST_CORE_HK_ONCE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.REQUEST_AUX_HK_ONCE[0], PowerInfo.REQUEST_AUX_HK_ONCE)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.ENABLE_INFO_HK[0], PowerInfo.ENABLE_INFO_HK)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.DISABLE_INFO_HK[0], PowerInfo.DISABLE_INFO_HK)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.REQUEST_CORE_HK_ONCE[0],
|
||||||
|
PowerInfo.REQUEST_CORE_HK_ONCE,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.REQUEST_AUX_HK_ONCE[0],
|
||||||
|
PowerInfo.REQUEST_AUX_HK_ONCE,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.PRINT_LATCHUPS[0], PowerInfo.PRINT_LATCHUPS)
|
||||||
|
)
|
||||||
|
node.add_child(CmdTreeNode(GomspaceOpCode.GET_PARAM[0], GsInfo.GET_PARAMETER))
|
||||||
|
node.add_child(CmdTreeNode(GomspaceOpCode.REBOOT[0], GsInfo.REBOOT))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(GomspaceOpCode.SET_INTEGER_PARAM[0], GsInfo.SET_PARAMETER)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(GomspaceOpCode.REQUEST_CONFIG_TABLE[0], GsInfo.REQUEST_CONFIG_TABLE)
|
||||||
|
)
|
||||||
|
node.add_child(CmdTreeNode(GomspaceOpCode.SAVE_TABLE[0], GsInfo.SAVE_TABLE))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(GomspaceOpCode.SAVE_TABLE_DEFAULT[0], GsInfo.SAVE_TABLE_DEFAULT)
|
||||||
|
)
|
||||||
|
node.add_child(CmdTreeNode(GomspaceOpCode.LOAD_TABLE[0], GsInfo.LOAD_TABLE))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(GomspaceOpCode.RESET_GND_WATCHDOG[0], GsInfo.RESET_GND_WATCHDOG)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def add_gomspace_cmd_defs(oce: OpCodeEntry):
|
def add_gomspace_cmd_defs(oce: OpCodeEntry):
|
||||||
oce.add(
|
oce.add(
|
||||||
keys=PowerOpCodes.REQUEST_CORE_HK_ONCE,
|
keys=PowerOpCodes.REQUEST_CORE_HK_ONCE,
|
||||||
|
@ -5,7 +5,9 @@
|
|||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 13.12.2020
|
@date 13.12.2020
|
||||||
"""
|
"""
|
||||||
|
from tmtccmd.config import CmdTreeNode
|
||||||
from eive_tmtc.tmtc.power.common_power import (
|
from eive_tmtc.tmtc.power.common_power import (
|
||||||
|
add_gomspace_nodes,
|
||||||
pack_common_gomspace_cmds,
|
pack_common_gomspace_cmds,
|
||||||
req_hk_cmds,
|
req_hk_cmds,
|
||||||
pack_common_power_cmds,
|
pack_common_power_cmds,
|
||||||
@ -27,22 +29,24 @@ from eive_tmtc.config.object_ids import P60_DOCK_HANDLER
|
|||||||
from tmtccmd.util import ObjectIdU32
|
from tmtccmd.util import ObjectIdU32
|
||||||
|
|
||||||
|
|
||||||
class P60OpCode:
|
class CmdString:
|
||||||
STACK_3V3_ON = "stack_3v3_on"
|
STACK_3V3_ON = "stack_3v3_on"
|
||||||
STACK_3V3_OFF = "stack_3v3_off"
|
STACK_3V3_OFF = "stack_3v3_off"
|
||||||
STACK_5V_ON = "stack_5v_on"
|
STACK_5V_ON = "stack_5v_on"
|
||||||
STACK_5V_OFF = "stack_5v_off"
|
STACK_5V_OFF = "stack_5v_off"
|
||||||
|
TEST = "test"
|
||||||
ACU_OFF = "acu_off"
|
ACU_OFF = "acu_off"
|
||||||
ACU_ON = "acu_on"
|
ACU_ON = "acu_on"
|
||||||
TEST = ["test", "0"]
|
|
||||||
|
|
||||||
|
|
||||||
class P60Info:
|
class CmdInfo:
|
||||||
PREFIX = "P60 Dock"
|
PREFIX = "P60 Dock"
|
||||||
STACK_3V3_ON = f"{PREFIX}: Turn Stack 3V3 on"
|
STACK_3V3_ON = f"{PREFIX}: Turn Stack 3V3 on"
|
||||||
STACK_3V3_OFF = f"{PREFIX}: Turn Stack 3V3 off"
|
STACK_3V3_OFF = f"{PREFIX}: Turn Stack 3V3 off"
|
||||||
STACK_5V_ON = f"{PREFIX}: Turn Stack 5V on"
|
STACK_5V_ON = f"{PREFIX}: Turn Stack 5V on"
|
||||||
STACK_5V_OFF = f"{PREFIX}: Turn Stack 5V off"
|
STACK_5V_OFF = f"{PREFIX}: Turn Stack 5V off"
|
||||||
|
ACU_OFF = "Switch ACU off"
|
||||||
|
ACU_ON = "Switch ACU on"
|
||||||
|
|
||||||
|
|
||||||
class P60DockTestProcedure:
|
class P60DockTestProcedure:
|
||||||
@ -101,14 +105,14 @@ class P60DockHkTable:
|
|||||||
|
|
||||||
|
|
||||||
def pack_p60dock_cmds( # noqa C901: Complexity okay here.
|
def pack_p60dock_cmds( # noqa C901: Complexity okay here.
|
||||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
):
|
):
|
||||||
objb = object_id.as_bytes
|
objb = object_id.as_bytes
|
||||||
pack_common_power_cmds("P60 Dock", object_id, q, op_code)
|
pack_common_power_cmds("P60 Dock", object_id, q, cmd_str)
|
||||||
pack_common_gomspace_cmds("P60 Dock", object_id, q, op_code)
|
pack_common_gomspace_cmds("P60 Dock", object_id, q, cmd_str)
|
||||||
p60_dock_req_hk_cmds(q, op_code)
|
p60_dock_req_hk_cmds(q, cmd_str)
|
||||||
if op_code in P60OpCode.STACK_3V3_ON:
|
if cmd_str == CmdString.STACK_3V3_ON:
|
||||||
q.add_log_cmd(P60Info.STACK_3V3_ON)
|
q.add_log_cmd(CmdInfo.STACK_3V3_ON)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_set_u8_param_command(
|
pack_set_u8_param_command(
|
||||||
objb,
|
objb,
|
||||||
@ -116,8 +120,8 @@ def pack_p60dock_cmds( # noqa C901: Complexity okay here.
|
|||||||
Channel.on,
|
Channel.on,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in P60OpCode.STACK_3V3_OFF:
|
if cmd_str == CmdString.STACK_3V3_OFF:
|
||||||
q.add_log_cmd(P60Info.STACK_3V3_OFF)
|
q.add_log_cmd(CmdInfo.STACK_3V3_OFF)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_set_u8_param_command(
|
pack_set_u8_param_command(
|
||||||
objb,
|
objb,
|
||||||
@ -125,8 +129,8 @@ def pack_p60dock_cmds( # noqa C901: Complexity okay here.
|
|||||||
Channel.off,
|
Channel.off,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in P60OpCode.STACK_5V_ON:
|
if cmd_str == CmdString.STACK_5V_ON:
|
||||||
q.add_log_cmd(P60Info.STACK_5V_ON)
|
q.add_log_cmd(CmdInfo.STACK_5V_ON)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_set_u8_param_command(
|
pack_set_u8_param_command(
|
||||||
objb,
|
objb,
|
||||||
@ -134,8 +138,8 @@ def pack_p60dock_cmds( # noqa C901: Complexity okay here.
|
|||||||
Channel.on,
|
Channel.on,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in P60OpCode.STACK_5V_OFF:
|
if cmd_str == CmdString.STACK_5V_OFF:
|
||||||
q.add_log_cmd(P60Info.STACK_5V_OFF)
|
q.add_log_cmd(CmdInfo.STACK_5V_OFF)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_set_u8_param_command(
|
pack_set_u8_param_command(
|
||||||
objb,
|
objb,
|
||||||
@ -241,5 +245,18 @@ def pack_p60dock_cmds( # noqa C901: Complexity okay here.
|
|||||||
q.add_pus_tc(pack_set_u16_param_command(objb, invalid_address, parameter))
|
q.add_pus_tc(pack_set_u16_param_command(objb, invalid_address, parameter))
|
||||||
|
|
||||||
|
|
||||||
|
def create_p60_dock_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode(
|
||||||
|
"p60_dock", "P60 PCDU dock device", hide_children_which_are_leaves=True
|
||||||
|
)
|
||||||
|
add_gomspace_nodes(node)
|
||||||
|
node.add_child(CmdTreeNode(CmdString.STACK_3V3_ON, CmdInfo.STACK_3V3_ON))
|
||||||
|
node.add_child(CmdTreeNode(CmdString.STACK_3V3_OFF, CmdInfo.STACK_3V3_OFF))
|
||||||
|
node.add_child(CmdTreeNode(CmdString.STACK_5V_ON, CmdInfo.STACK_5V_ON))
|
||||||
|
node.add_child(CmdTreeNode(CmdString.STACK_5V_OFF, CmdInfo.STACK_5V_OFF))
|
||||||
|
node.add_child(CmdTreeNode(CmdString.TEST, "P60 Tests"))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
def p60_dock_req_hk_cmds(q: DefaultPusQueueHelper, op_code: str):
|
def p60_dock_req_hk_cmds(q: DefaultPusQueueHelper, op_code: str):
|
||||||
req_hk_cmds("P60 Dock", q, op_code, P60_DOCK_HANDLER, [SetId.CORE, SetId.AUX])
|
req_hk_cmds("P60 Dock", q, op_code, P60_DOCK_HANDLER, [SetId.CORE, SetId.AUX])
|
||||||
|
@ -14,6 +14,7 @@ from eive_tmtc.gomspace.gomspace_common import (
|
|||||||
)
|
)
|
||||||
from eive_tmtc.gomspace.gomspace_pdu_definitions import PduHkTable
|
from eive_tmtc.gomspace.gomspace_pdu_definitions import PduHkTable
|
||||||
from eive_tmtc.tmtc.power.common_power import (
|
from eive_tmtc.tmtc.power.common_power import (
|
||||||
|
add_gomspace_nodes,
|
||||||
pack_common_gomspace_cmds,
|
pack_common_gomspace_cmds,
|
||||||
req_hk_cmds,
|
req_hk_cmds,
|
||||||
PowerOpCodes,
|
PowerOpCodes,
|
||||||
@ -23,14 +24,12 @@ from eive_tmtc.tmtc.power.common_power import (
|
|||||||
create_generic_on_cmd,
|
create_generic_on_cmd,
|
||||||
create_generic_off_cmd,
|
create_generic_off_cmd,
|
||||||
pack_common_power_cmds,
|
pack_common_power_cmds,
|
||||||
GomspaceOpCode,
|
|
||||||
GsInfo,
|
|
||||||
add_common_power_defs,
|
add_common_power_defs,
|
||||||
SetId,
|
SetId,
|
||||||
)
|
)
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
|
|
||||||
from tmtccmd.config import OpCodeEntry, TmtcDefinitionWrapper
|
from tmtccmd.config import CmdTreeNode, OpCodeEntry, TmtcDefinitionWrapper
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.util import ObjectIdU32
|
from tmtccmd.util import ObjectIdU32
|
||||||
@ -75,13 +74,13 @@ class PDU1TestProcedure:
|
|||||||
turn_channel_3_off = False
|
turn_channel_3_off = False
|
||||||
|
|
||||||
|
|
||||||
def pack_pdu1_commands(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str):
|
def pack_pdu1_commands(object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
q.add_log_cmd("Commanding PDU1")
|
q.add_log_cmd("Commanding PDU1")
|
||||||
objb = object_id.as_bytes
|
objb = object_id.as_bytes
|
||||||
pdu1_switch_cmds(q, op_code)
|
pdu1_switch_cmds(q, cmd_str)
|
||||||
pdu1_req_hk_cmds(q, op_code)
|
pdu1_req_hk_cmds(q, cmd_str)
|
||||||
pack_common_power_cmds("PDU1", object_id, q, op_code)
|
pack_common_power_cmds("PDU1", object_id, q, cmd_str)
|
||||||
pack_common_gomspace_cmds("PDU1", object_id, q, op_code)
|
pack_common_gomspace_cmds("PDU1", object_id, q, cmd_str)
|
||||||
if PDU1TestProcedure.all or PDU1TestProcedure.ping:
|
if PDU1TestProcedure.all or PDU1TestProcedure.ping:
|
||||||
q.add_log_cmd("PDU1: Ping Test")
|
q.add_log_cmd("PDU1: Ping Test")
|
||||||
ping_data = bytearray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
|
ping_data = bytearray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
|
||||||
@ -111,39 +110,39 @@ def info_off_pdu1(base: str) -> str:
|
|||||||
|
|
||||||
|
|
||||||
def pdu1_switch_cmds( # noqa C901: Complexity is okay here.
|
def pdu1_switch_cmds( # noqa C901: Complexity is okay here.
|
||||||
q: DefaultPusQueueHelper, op_code: str
|
q: DefaultPusQueueHelper, cmd_str: str
|
||||||
): # noqa C901: Complexity okay here
|
): # noqa C901: Complexity okay here
|
||||||
if op_code in PowerOpCodes.TCS_ON:
|
if cmd_str in PowerOpCodes.TCS_ON:
|
||||||
tcs_on_cmd(q)
|
tcs_on_cmd(q)
|
||||||
elif op_code in PowerOpCodes.TCS_OFF:
|
elif cmd_str in PowerOpCodes.TCS_OFF:
|
||||||
tcs_off_cmd(q)
|
tcs_off_cmd(q)
|
||||||
elif op_code in PowerOpCodes.SYRLINKS_ON:
|
elif cmd_str in PowerOpCodes.SYRLINKS_ON:
|
||||||
syrlinks_on_cmd(q)
|
syrlinks_on_cmd(q)
|
||||||
elif op_code in PowerOpCodes.SYRLINKS_OFF:
|
elif cmd_str in PowerOpCodes.SYRLINKS_OFF:
|
||||||
syrlinks_off_cmd(q)
|
syrlinks_off_cmd(q)
|
||||||
elif op_code in PowerOpCodes.STAR_TRACKER_ON:
|
elif cmd_str in PowerOpCodes.STAR_TRACKER_ON:
|
||||||
startracker_on_cmd(q)
|
startracker_on_cmd(q)
|
||||||
elif op_code in PowerOpCodes.STAR_TRACKER_OFF:
|
elif cmd_str in PowerOpCodes.STAR_TRACKER_OFF:
|
||||||
startracker_off_cmd(q)
|
startracker_off_cmd(q)
|
||||||
elif op_code in PowerOpCodes.MGT_ON:
|
elif cmd_str in PowerOpCodes.MGT_ON:
|
||||||
mgt_on_cmd(q)
|
mgt_on_cmd(q)
|
||||||
elif op_code in PowerOpCodes.MGT_OFF:
|
elif cmd_str in PowerOpCodes.MGT_OFF:
|
||||||
mgt_off_cmd(q)
|
mgt_off_cmd(q)
|
||||||
elif op_code in PowerOpCodes.SUS_N_ON:
|
elif cmd_str in PowerOpCodes.SUS_N_ON:
|
||||||
sun_sensor_nominal_on_cmd(q)
|
sun_sensor_nominal_on_cmd(q)
|
||||||
elif op_code in PowerOpCodes.SUS_N_OFF:
|
elif cmd_str in PowerOpCodes.SUS_N_OFF:
|
||||||
sun_sensor_nominal_off_cmd(q)
|
sun_sensor_nominal_off_cmd(q)
|
||||||
elif op_code in PowerOpCodes.SCEX_ON:
|
elif cmd_str in PowerOpCodes.SCEX_ON:
|
||||||
solar_cell_experiment_on_cmd(q)
|
solar_cell_experiment_on_cmd(q)
|
||||||
elif op_code in PowerOpCodes.SCEX_OFF:
|
elif cmd_str in PowerOpCodes.SCEX_OFF:
|
||||||
solar_cell_experiment_off_cmd(q)
|
solar_cell_experiment_off_cmd(q)
|
||||||
elif op_code in PowerOpCodes.PLOC_ON:
|
elif cmd_str in PowerOpCodes.PLOC_ON:
|
||||||
ploc_on_cmd(q)
|
ploc_on_cmd(q)
|
||||||
elif op_code in PowerOpCodes.PLOC_OFF:
|
elif cmd_str in PowerOpCodes.PLOC_OFF:
|
||||||
ploc_off_cmd(q)
|
ploc_off_cmd(q)
|
||||||
elif op_code in PowerOpCodes.ACS_A_ON:
|
elif cmd_str in PowerOpCodes.ACS_A_ON:
|
||||||
acs_board_a_on_cmd(q)
|
acs_board_a_on_cmd(q)
|
||||||
elif op_code in PowerOpCodes.ACS_A_OFF:
|
elif cmd_str in PowerOpCodes.ACS_A_OFF:
|
||||||
acs_board_a_off_cmd(q)
|
acs_board_a_off_cmd(q)
|
||||||
|
|
||||||
|
|
||||||
@ -166,6 +165,67 @@ def add_pdu1_common_defs(oce: OpCodeEntry):
|
|||||||
oce.add(keys=PowerOpCodes.SCEX_OFF, info=info_off_pdu1(Pdu1InfoBase.SCEX))
|
oce.add(keys=PowerOpCodes.SCEX_OFF, info=info_off_pdu1(Pdu1InfoBase.SCEX))
|
||||||
|
|
||||||
|
|
||||||
|
def add_pdu1_subnodes(node: CmdTreeNode):
|
||||||
|
node.add_child(CmdTreeNode(PowerOpCodes.TCS_ON[0], info_on_pdu1(Pdu1InfoBase.TCS)))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.TCS_OFF[0], info_off_pdu1(Pdu1InfoBase.TCS))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.STAR_TRACKER_ON[0], info_on_pdu1(Pdu1InfoBase.STR))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.STAR_TRACKER_OFF[0], info_off_pdu1(Pdu1InfoBase.STR))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.SUS_N_ON[0], info_on_pdu1(Pdu1InfoBase.SUS_N))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.SUS_N_OFF[0], info_off_pdu1(Pdu1InfoBase.SUS_N))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.ACS_A_ON[0], info_on_pdu1(Pdu1InfoBase.ACS_A))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.ACS_A_OFF[0], info_off_pdu1(Pdu1InfoBase.ACS_A))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.SYRLINKS_ON[0], info_on_pdu1(Pdu1InfoBase.SYRLINKS))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.SYRLINKS_OFF[0], info_off_pdu1(Pdu1InfoBase.SYRLINKS))
|
||||||
|
)
|
||||||
|
node.add_child(CmdTreeNode(PowerOpCodes.MGT_ON[0], info_on_pdu1(Pdu1InfoBase.MGT)))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.MGT_OFF[0], info_off_pdu1(Pdu1InfoBase.MGT))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.PLOC_ON[0], info_on_pdu1(Pdu1InfoBase.PLOC))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.PLOC_OFF[0], info_off_pdu1(Pdu1InfoBase.PLOC))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.SCEX_ON[0], info_on_pdu1(Pdu1InfoBase.SCEX))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.SCEX_OFF[0], info_off_pdu1(Pdu1InfoBase.SCEX))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_pdu1_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode(
|
||||||
|
"pdu1", "P60 PCDU PDU1 device", hide_children_which_are_leaves=True
|
||||||
|
)
|
||||||
|
add_gomspace_nodes(node)
|
||||||
|
add_pdu1_subnodes(node)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.PRINT_SWITCH_V_I[0], "PDU1: Print Switches, Voltages, Currents"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_pdu1_cmds(defs: TmtcDefinitionWrapper):
|
def add_pdu1_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
@ -176,7 +236,6 @@ def add_pdu1_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
keys=PowerOpCodes.PRINT_SWITCH_V_I,
|
keys=PowerOpCodes.PRINT_SWITCH_V_I,
|
||||||
info="PDU1: Print Switches, Voltages, Currents",
|
info="PDU1: Print Switches, Voltages, Currents",
|
||||||
)
|
)
|
||||||
oce.add(keys=GomspaceOpCode.GET_PARAM, info=GsInfo.GET_PARAMETER)
|
|
||||||
|
|
||||||
defs.add_service(
|
defs.add_service(
|
||||||
name=CustomServiceList.PDU1.value,
|
name=CustomServiceList.PDU1.value,
|
||||||
|
@ -19,6 +19,7 @@ from eive_tmtc.gomspace.gomspace_common import (
|
|||||||
)
|
)
|
||||||
from eive_tmtc.gomspace.gomspace_pdu_definitions import PduHkTable, PduConfigTable
|
from eive_tmtc.gomspace.gomspace_pdu_definitions import PduHkTable, PduConfigTable
|
||||||
from eive_tmtc.tmtc.power.common_power import (
|
from eive_tmtc.tmtc.power.common_power import (
|
||||||
|
add_gomspace_nodes,
|
||||||
pack_common_gomspace_cmds,
|
pack_common_gomspace_cmds,
|
||||||
req_hk_cmds,
|
req_hk_cmds,
|
||||||
PowerOpCodes,
|
PowerOpCodes,
|
||||||
@ -32,7 +33,7 @@ from eive_tmtc.tmtc.power.common_power import (
|
|||||||
add_common_power_defs,
|
add_common_power_defs,
|
||||||
)
|
)
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
from tmtccmd.config import OpCodeEntry, TmtcDefinitionWrapper
|
from tmtccmd.config import CmdTreeNode, OpCodeEntry, TmtcDefinitionWrapper
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.util import ObjectIdU32
|
from tmtccmd.util import ObjectIdU32
|
||||||
@ -88,13 +89,13 @@ class PDU2TestProcedure:
|
|||||||
request_hk_table = False
|
request_hk_table = False
|
||||||
|
|
||||||
|
|
||||||
def pack_pdu2_commands(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str):
|
def pack_pdu2_commands(object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
q.add_log_cmd("Testing PDU2")
|
q.add_log_cmd("Testing PDU2")
|
||||||
objb = object_id.as_bytes
|
objb = object_id.as_bytes
|
||||||
pdu2_switch_cmds(q, op_code)
|
pdu2_switch_cmds(q, cmd_str)
|
||||||
pdu2_req_hk_cmds(q, op_code)
|
pdu2_req_hk_cmds(q, cmd_str)
|
||||||
pack_common_power_cmds("PDU2", object_id, q, op_code)
|
pack_common_power_cmds("PDU2", object_id, q, cmd_str)
|
||||||
pack_common_gomspace_cmds("PDU2", object_id, q, op_code)
|
pack_common_gomspace_cmds("PDU2", object_id, q, cmd_str)
|
||||||
if PDU2TestProcedure.all or PDU2TestProcedure.reboot:
|
if PDU2TestProcedure.all or PDU2TestProcedure.reboot:
|
||||||
q.add_log_cmd("PDU2: Reboot")
|
q.add_log_cmd("PDU2: Reboot")
|
||||||
q.add_pus_tc(pack_reboot_command(object_id))
|
q.add_pus_tc(pack_reboot_command(object_id))
|
||||||
@ -171,6 +172,85 @@ def add_pdu2_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_pdu2_subnodes(node: CmdTreeNode):
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.ACS_B_ON[0], info_on_pdu2(Pdu2InfoBase.ACS_B))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.ACS_B_OFF[0], info_off_pdu2(Pdu2InfoBase.ACS_B))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.SUS_R_ON[0], info_on_pdu2(Pdu2InfoBase.SUS_R))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.SUS_R_OFF[0], info_off_pdu2(Pdu2InfoBase.SUS_R))
|
||||||
|
)
|
||||||
|
node.add_child(CmdTreeNode(PowerOpCodes.RW_ON[0], info_on_pdu2(Pdu2InfoBase.RW)))
|
||||||
|
node.add_child(CmdTreeNode(PowerOpCodes.RW_OFF[0], info_off_pdu2(Pdu2InfoBase.RW)))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.PL_PCDU_VBAT_NOM_ON[0],
|
||||||
|
info_on_pdu2(Pdu2InfoBase.PL_PCDU_BAT_NOM),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.PL_PCDU_VBAT_NOM_OFF[0],
|
||||||
|
info_off_pdu2(Pdu2InfoBase.PL_PCDU_BAT_NOM),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.PL_PCDU_VBAT_RED_ON[0],
|
||||||
|
info_on_pdu2(Pdu2InfoBase.PL_PCDU_BAT_RED),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.PL_PCDU_VBAT_RED_OFF[0],
|
||||||
|
info_off_pdu2(Pdu2InfoBase.PL_PCDU_BAT_RED),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.HEATER_ON[0], info_on_pdu2(Pdu2InfoBase.HEATER))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.HEATER_OFF[0], info_off_pdu2(Pdu2InfoBase.HEATER))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.SOLAR_ARRAY_DEPL_ON[0],
|
||||||
|
info_on_pdu2(Pdu2InfoBase.SOLAR_ARRAY_DEPL),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.SOLAR_ARRAY_DEPL_OFF[0],
|
||||||
|
info_off_pdu2(Pdu2InfoBase.SOLAR_ARRAY_DEPL),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.PL_CAM_ON[0], info_on_pdu2(Pdu2InfoBase.PL_CAM))
|
||||||
|
)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.PL_CAM_OFF[0], info_off_pdu2(Pdu2InfoBase.PL_CAM))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_pdu2_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode(
|
||||||
|
"pdu2", "P60 PCDU PDU2 device", hide_children_which_are_leaves=True
|
||||||
|
)
|
||||||
|
add_gomspace_nodes(node)
|
||||||
|
add_pdu2_subnodes(node)
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(
|
||||||
|
PowerOpCodes.PRINT_SWITCH_V_I[0], "PDU2: Print Switches, Voltages, Currents"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
def pdu2_switch_cmds(q: DefaultPusQueueHelper, op_code: str): # noqa C901
|
def pdu2_switch_cmds(q: DefaultPusQueueHelper, op_code: str): # noqa C901
|
||||||
if op_code in PowerOpCodes.PL_PCDU_VBAT_NOM_ON:
|
if op_code in PowerOpCodes.PL_PCDU_VBAT_NOM_ON:
|
||||||
pl_pcdu_bat_nom_on_cmd(q)
|
pl_pcdu_bat_nom_on_cmd(q)
|
||||||
|
@ -16,21 +16,23 @@ from eive_tmtc.config.object_ids import (
|
|||||||
get_object_ids,
|
get_object_ids,
|
||||||
)
|
)
|
||||||
from eive_tmtc.tmtc.power.pdu1 import (
|
from eive_tmtc.tmtc.power.pdu1 import (
|
||||||
|
add_pdu1_subnodes,
|
||||||
pdu1_req_hk_cmds,
|
pdu1_req_hk_cmds,
|
||||||
pdu1_switch_cmds,
|
pdu1_switch_cmds,
|
||||||
add_pdu1_common_defs,
|
add_pdu1_common_defs,
|
||||||
add_pdu1_cmds,
|
add_pdu1_cmds,
|
||||||
)
|
)
|
||||||
from eive_tmtc.tmtc.power.pdu2 import (
|
from eive_tmtc.tmtc.power.pdu2 import (
|
||||||
|
add_pdu2_subnodes,
|
||||||
pdu2_req_hk_cmds,
|
pdu2_req_hk_cmds,
|
||||||
add_pdu2_common_defs,
|
add_pdu2_common_defs,
|
||||||
pdu2_switch_cmds,
|
pdu2_switch_cmds,
|
||||||
add_pdu2_cmds,
|
add_pdu2_cmds,
|
||||||
)
|
)
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
from tmtccmd.config import CmdTreeNode, TmtcDefinitionWrapper, OpCodeEntry
|
||||||
from eive_tmtc.config.object_ids import PCDU_HANDLER_ID
|
from eive_tmtc.config.object_ids import PCDU_HANDLER_ID
|
||||||
|
|
||||||
from eive_tmtc.tmtc.power.p60dock import P60OpCode, P60Info, p60_dock_req_hk_cmds
|
from eive_tmtc.tmtc.power.p60dock import CmdString, CmdInfo, p60_dock_req_hk_cmds
|
||||||
from eive_tmtc.tmtc.power.acu import add_acu_cmds, acu_req_hk_cmds
|
from eive_tmtc.tmtc.power.acu import add_acu_cmds, acu_req_hk_cmds
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||||
create_request_one_diag_command,
|
create_request_one_diag_command,
|
||||||
@ -73,29 +75,29 @@ class PcduSwitches(enum.IntEnum):
|
|||||||
P60_DOCK_3V3_STACK = 19
|
P60_DOCK_3V3_STACK = 19
|
||||||
|
|
||||||
|
|
||||||
def pack_power_commands(q: DefaultPusQueueHelper, op_code: str):
|
def pack_power_commands(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
pdu1_switch_cmds(q, op_code)
|
pdu1_switch_cmds(q, cmd_str)
|
||||||
pdu2_switch_cmds(q, op_code)
|
pdu2_switch_cmds(q, cmd_str)
|
||||||
if op_code in PowerOpCodes.SWITCHER_HK:
|
if cmd_str in PowerOpCodes.SWITCHER_HK:
|
||||||
q.add_log_cmd("Requesting switcher state HK")
|
q.add_log_cmd("Requesting switcher state HK")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_diag_command(
|
create_request_one_diag_command(
|
||||||
make_sid(PCDU_HANDLER_ID, PcduSetIds.SWITCHER_SET)
|
make_sid(PCDU_HANDLER_ID, PcduSetIds.SWITCHER_SET)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in PowerOpCodes.INFO_CORE:
|
if cmd_str in PowerOpCodes.INFO_CORE:
|
||||||
pdu1_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
pdu1_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
||||||
pdu2_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
pdu2_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
||||||
p60_dock_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
p60_dock_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
||||||
acu_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
acu_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
||||||
q.add_wait_seconds(8.0)
|
q.add_wait_seconds(8.0)
|
||||||
elif op_code in PowerOpCodes.INFO_AUX:
|
elif cmd_str in PowerOpCodes.INFO_AUX:
|
||||||
pdu1_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
pdu1_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
||||||
pdu2_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
pdu2_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
||||||
p60_dock_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
p60_dock_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
||||||
acu_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
acu_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
||||||
q.add_wait_seconds(8.0)
|
q.add_wait_seconds(8.0)
|
||||||
elif op_code in PowerOpCodes.INFO_ALL:
|
elif cmd_str in PowerOpCodes.INFO_ALL:
|
||||||
pdu1_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
pdu1_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
||||||
pdu2_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
pdu2_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
||||||
pdu1_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
pdu1_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
||||||
@ -105,7 +107,7 @@ def pack_power_commands(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
acu_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
acu_req_hk_cmds(q, PowerOpCodes.REQUEST_CORE_HK_ONCE[0])
|
||||||
acu_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
acu_req_hk_cmds(q, PowerOpCodes.REQUEST_AUX_HK_ONCE[0])
|
||||||
q.add_wait_seconds(8.0)
|
q.add_wait_seconds(8.0)
|
||||||
elif op_code in PowerOpCodes.RESET_ALL_GND_WDTS:
|
elif cmd_str in PowerOpCodes.RESET_ALL_GND_WDTS:
|
||||||
oids = get_object_ids()
|
oids = get_object_ids()
|
||||||
pack_reset_gnd_wdt_cmd(q, "P60 Dock", oids[P60_DOCK_HANDLER])
|
pack_reset_gnd_wdt_cmd(q, "P60 Dock", oids[P60_DOCK_HANDLER])
|
||||||
pack_reset_gnd_wdt_cmd(q, "ACU", oids[ACU_HANDLER_ID])
|
pack_reset_gnd_wdt_cmd(q, "ACU", oids[ACU_HANDLER_ID])
|
||||||
@ -114,24 +116,38 @@ def pack_power_commands(q: DefaultPusQueueHelper, op_code: str):
|
|||||||
q.add_wait_seconds(5.0)
|
q.add_wait_seconds(5.0)
|
||||||
if q.empty():
|
if q.empty():
|
||||||
logging.getLogger(__name__).info(
|
logging.getLogger(__name__).info(
|
||||||
f"Queue is empty, no stack for op code {op_code}"
|
f"Queue is empty, no stack for op code {cmd_str}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_p60_cmds(defs: TmtcDefinitionWrapper):
|
def add_p60_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
oce.add(keys=P60OpCode.STACK_3V3_ON, info=P60Info.STACK_3V3_ON)
|
oce.add(keys=CmdString.STACK_3V3_ON, info=CmdInfo.STACK_3V3_ON)
|
||||||
oce.add(keys=P60OpCode.STACK_3V3_OFF, info=P60Info.STACK_3V3_OFF)
|
oce.add(keys=CmdString.STACK_3V3_OFF, info=CmdInfo.STACK_3V3_OFF)
|
||||||
oce.add(keys=P60OpCode.STACK_5V_ON, info=P60Info.STACK_5V_ON)
|
oce.add(keys=CmdString.STACK_5V_ON, info=CmdInfo.STACK_5V_ON)
|
||||||
oce.add(keys=P60OpCode.STACK_5V_OFF, info=P60Info.STACK_5V_OFF)
|
oce.add(keys=CmdString.STACK_5V_OFF, info=CmdInfo.STACK_5V_OFF)
|
||||||
add_gomspace_cmd_defs(oce)
|
add_gomspace_cmd_defs(oce)
|
||||||
oce.add(keys=P60OpCode.TEST, info="P60 Tests")
|
oce.add(keys=CmdString.TEST, info="P60 Tests")
|
||||||
defs.add_service(
|
defs.add_service(
|
||||||
name=CustomServiceList.P60DOCK.value, info="P60 Device", op_code_entry=oce
|
name=CustomServiceList.P60DOCK.value, info="P60 Device", op_code_entry=oce
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_power_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode("power", "Power commands", hide_children_which_are_leaves=True)
|
||||||
|
add_pdu1_subnodes(node)
|
||||||
|
add_pdu2_subnodes(node)
|
||||||
|
node.add_child(CmdTreeNode(PowerOpCodes.SWITCHER_HK[0], PowerInfo.SWITCHER_HK))
|
||||||
|
node.add_child(CmdTreeNode(PowerOpCodes.INFO_ALL[0], PowerInfo.INFO_ALL))
|
||||||
|
node.add_child(CmdTreeNode(PowerOpCodes.INFO_CORE[0], PowerInfo.INFO_CORE))
|
||||||
|
node.add_child(CmdTreeNode(PowerOpCodes.INFO_AUX[0], PowerInfo.INFO_AUX))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(PowerOpCodes.RESET_ALL_GND_WDTS[0], PowerInfo.RESET_ALL_GND_WDTS)
|
||||||
|
)
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_power_cmd_defs(defs: TmtcDefinitionWrapper):
|
def add_power_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
|
@ -3,32 +3,26 @@ import enum
|
|||||||
import logging
|
import logging
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import PWR_CONTROLLER
|
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
CmdTreeNode,
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
|
||||||
from tmtccmd.tmtc import service_provider
|
|
||||||
from tmtccmd.tmtc.queue import DefaultPusQueueHelper
|
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Mode, pack_mode_command
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
|
||||||
generate_one_hk_command,
|
|
||||||
make_sid,
|
|
||||||
enable_periodic_hk_command_with_interval,
|
|
||||||
disable_periodic_hk_command,
|
|
||||||
)
|
)
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
|
|
||||||
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd
|
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd
|
||||||
|
|
||||||
from tmtccmd.pus.s20_fsfw_param_defs import (
|
from tmtccmd.pus.s20_fsfw_param_defs import (
|
||||||
create_scalar_float_parameter,
|
|
||||||
create_scalar_double_parameter,
|
create_scalar_double_parameter,
|
||||||
|
create_scalar_float_parameter,
|
||||||
)
|
)
|
||||||
|
from tmtccmd.pus.s200_fsfw_mode import Mode, pack_mode_command
|
||||||
|
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||||
|
disable_periodic_hk_command,
|
||||||
|
enable_periodic_hk_command_with_interval,
|
||||||
|
generate_one_hk_command,
|
||||||
|
make_sid,
|
||||||
|
)
|
||||||
|
from tmtccmd.tmtc.queue import DefaultPusQueueHelper
|
||||||
|
|
||||||
|
from eive_tmtc.config.object_ids import PWR_CONTROLLER
|
||||||
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -51,17 +45,17 @@ class ParamId(enum.IntEnum):
|
|||||||
HIGHER_MODES_LIMIT = 6
|
HIGHER_MODES_LIMIT = 6
|
||||||
|
|
||||||
|
|
||||||
class OpCodes:
|
class OpCode:
|
||||||
OFF = ["mode_off"]
|
OFF = "off"
|
||||||
ON = ["mode_on"]
|
ON = "on"
|
||||||
NML = ["mode_normal"]
|
NML = "normal"
|
||||||
SET_PARAMETER = ["set_parameter"]
|
SET_PARAMETER = "set_parameter"
|
||||||
REQUEST_CORE_HK = ["core_hk"]
|
REQUEST_CORE_HK = "core_hk"
|
||||||
ENABLE_CORE_HK = ["core_enable_hk"]
|
ENABLE_CORE_HK = "core_enable_hk"
|
||||||
DISABLE_CORE_HK = ["core_disable_hk"]
|
DISABLE_CORE_HK = "core_disable_hk"
|
||||||
REQUEST_ENABLE_PL_HK = ["enable_pl_hk"]
|
REQUEST_ENABLE_PL_HK = "enable_pl_hk"
|
||||||
ENABLE_ENABLE_PL_HK = ["enable_pl_enable_hk"]
|
ENABLE_ENABLE_PL_HK = "enable_pl_enable_hk"
|
||||||
DISABLE_ENABLE_PL_HK = ["enable_pl_disable_hk"]
|
DISABLE_ENABLE_PL_HK = "enable_pl_disable_hk"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -77,46 +71,37 @@ class Info:
|
|||||||
DISABLE_ENABLE_PL_HK = "Disable Enable PL HK Data Generation"
|
DISABLE_ENABLE_PL_HK = "Disable Enable PL HK Data Generation"
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_pwr_ctrl_node() -> CmdTreeNode:
|
||||||
def pwr_cmd_defs(defs: TmtcDefinitionWrapper):
|
op_code_strs = [
|
||||||
oce = OpCodeEntry()
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
oce.add(keys=OpCodes.OFF, info=Info.OFF)
|
]
|
||||||
oce.add(keys=OpCodes.ON, info=Info.ON)
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
oce.add(keys=OpCodes.NML, info=Info.NML)
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
oce.add(keys=OpCodes.SET_PARAMETER, info=Info.SET_PARAMETER)
|
node = CmdTreeNode("pwr_ctrl", "Power Controller", hide_children_for_print=True)
|
||||||
oce.add(keys=OpCodes.REQUEST_CORE_HK, info=Info.REQUEST_CORE_HK)
|
for op_code, info in combined_dict.items():
|
||||||
oce.add(keys=OpCodes.ENABLE_CORE_HK, info=Info.ENABLE_CORE_HK)
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
oce.add(keys=OpCodes.DISABLE_CORE_HK, info=Info.DISABLE_CORE_HK)
|
return node
|
||||||
oce.add(keys=OpCodes.REQUEST_ENABLE_PL_HK, info=Info.REQUEST_ENABLE_PL_HK)
|
|
||||||
oce.add(keys=OpCodes.ENABLE_ENABLE_PL_HK, info=Info.ENABLE_ENABLE_PL_HK)
|
|
||||||
oce.add(keys=OpCodes.DISABLE_ENABLE_PL_HK, info=Info.DISABLE_ENABLE_PL_HK)
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.PWR_CTRL.value, info="PWR Controller", op_code_entry=oce
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.PWR_CTRL.value)
|
def pack_power_ctrl_command(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
def pack_acs_ctrl_command(p: ServiceProviderParams):
|
if cmd_str == OpCode.OFF:
|
||||||
op_code = p.op_code
|
|
||||||
q = p.queue_helper
|
|
||||||
if op_code in OpCodes.OFF:
|
|
||||||
q.add_log_cmd(f"{Info.OFF}")
|
q.add_log_cmd(f"{Info.OFF}")
|
||||||
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.OFF, 0))
|
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.OFF, 0))
|
||||||
elif op_code in OpCodes.ON:
|
elif cmd_str == OpCode.ON:
|
||||||
q.add_log_cmd(f"{Info.ON}")
|
q.add_log_cmd(f"{Info.ON}")
|
||||||
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.ON, 0))
|
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.ON, 0))
|
||||||
elif op_code in OpCodes.NML:
|
elif cmd_str == OpCode.NML:
|
||||||
q.add_log_cmd(f"{Info.NML}")
|
q.add_log_cmd(f"{Info.NML}")
|
||||||
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.NORMAL, 0))
|
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.NORMAL, 0))
|
||||||
elif op_code in OpCodes.SET_PARAMETER:
|
elif cmd_str in OpCode.SET_PARAMETER:
|
||||||
q.add_log_cmd(f"{Info.SET_PARAMETER}")
|
q.add_log_cmd(f"{Info.SET_PARAMETER}")
|
||||||
set_pwr_ctrl_param(q)
|
set_pwr_ctrl_param(q)
|
||||||
elif op_code in OpCodes.REQUEST_CORE_HK:
|
elif cmd_str == OpCode.REQUEST_CORE_HK:
|
||||||
q.add_log_cmd(Info.REQUEST_CORE_HK)
|
q.add_log_cmd(Info.REQUEST_CORE_HK)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_hk_command(make_sid(PWR_CONTROLLER, SetId.CORE_HK_SET))
|
generate_one_hk_command(make_sid(PWR_CONTROLLER, SetId.CORE_HK_SET))
|
||||||
)
|
)
|
||||||
elif op_code in OpCodes.ENABLE_CORE_HK:
|
elif cmd_str == OpCode.ENABLE_CORE_HK:
|
||||||
interval = float(input("Please specify interval in floating point seconds: "))
|
interval = float(input("Please specify interval in floating point seconds: "))
|
||||||
q.add_log_cmd(Info.ENABLE_CORE_HK)
|
q.add_log_cmd(Info.ENABLE_CORE_HK)
|
||||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||||
@ -124,19 +109,19 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
|||||||
)
|
)
|
||||||
q.add_pus_tc(cmd_tuple[0])
|
q.add_pus_tc(cmd_tuple[0])
|
||||||
q.add_pus_tc(cmd_tuple[1])
|
q.add_pus_tc(cmd_tuple[1])
|
||||||
elif op_code in OpCodes.DISABLE_CORE_HK:
|
elif cmd_str == OpCode.DISABLE_CORE_HK:
|
||||||
q.add_log_cmd(Info.DISABLE_CORE_HK)
|
q.add_log_cmd(Info.DISABLE_CORE_HK)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
disable_periodic_hk_command(
|
disable_periodic_hk_command(
|
||||||
False, make_sid(PWR_CONTROLLER, SetId.CORE_HK_SET)
|
False, make_sid(PWR_CONTROLLER, SetId.CORE_HK_SET)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif op_code in OpCodes.REQUEST_ENABLE_PL_HK:
|
elif cmd_str == OpCode.REQUEST_ENABLE_PL_HK:
|
||||||
q.add_log_cmd(Info.REQUEST_ENABLE_PL_HK)
|
q.add_log_cmd(Info.REQUEST_ENABLE_PL_HK)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_hk_command(make_sid(PWR_CONTROLLER, SetId.ENABLE_PL_SET))
|
generate_one_hk_command(make_sid(PWR_CONTROLLER, SetId.ENABLE_PL_SET))
|
||||||
)
|
)
|
||||||
elif op_code in OpCodes.ENABLE_ENABLE_PL_HK:
|
elif cmd_str == OpCode.ENABLE_ENABLE_PL_HK:
|
||||||
interval = float(input("Please specify interval in floating point seconds: "))
|
interval = float(input("Please specify interval in floating point seconds: "))
|
||||||
q.add_log_cmd(Info.ENABLE_ENABLE_PL_HK)
|
q.add_log_cmd(Info.ENABLE_ENABLE_PL_HK)
|
||||||
cmd_tuple = enable_periodic_hk_command_with_interval(
|
cmd_tuple = enable_periodic_hk_command_with_interval(
|
||||||
@ -144,7 +129,7 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
|
|||||||
)
|
)
|
||||||
q.add_pus_tc(cmd_tuple[0])
|
q.add_pus_tc(cmd_tuple[0])
|
||||||
q.add_pus_tc(cmd_tuple[1])
|
q.add_pus_tc(cmd_tuple[1])
|
||||||
elif op_code in OpCodes.DISABLE_ENABLE_PL_HK:
|
elif cmd_str == OpCode.DISABLE_ENABLE_PL_HK:
|
||||||
q.add_log_cmd(Info.DISABLE_ENABLE_PL_HK)
|
q.add_log_cmd(Info.DISABLE_ENABLE_PL_HK)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
disable_periodic_hk_command(
|
disable_periodic_hk_command(
|
||||||
|
@ -1,18 +1,16 @@
|
|||||||
import enum
|
import enum
|
||||||
from typing import Tuple, Dict
|
from typing import Dict, Tuple
|
||||||
|
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
|
||||||
from eive_tmtc.config.object_ids import EPS_SUBSYSTEM_ID
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
CmdTreeNode,
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
)
|
||||||
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservices, Mode
|
from tmtccmd.pus.s200_fsfw_mode import Mode
|
||||||
from tmtccmd.tmtc import service_provider
|
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservices
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
|
||||||
|
from eive_tmtc.config.object_ids import EPS_SUBSYSTEM_ID
|
||||||
|
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||||
|
|
||||||
|
|
||||||
class OpCode(str, enum.Enum):
|
class OpCode(str, enum.Enum):
|
||||||
@ -33,12 +31,9 @@ HANDLER_LIST: Dict[str, Tuple[int, int, str]] = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.EPS_SS.value)
|
def build_eps_subsystem_cmd(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
def build_eps_subsystem_cmd(p: ServiceProviderParams):
|
|
||||||
op_code = p.op_code
|
|
||||||
q = p.queue_helper
|
|
||||||
info_prefix = "EPS Subsystem"
|
info_prefix = "EPS Subsystem"
|
||||||
if op_code in OpCode.REPORT_ALL_MODES:
|
if cmd_str in OpCode.REPORT_ALL_MODES:
|
||||||
q.add_log_cmd(f"{info_prefix}: {Info.REPORT_ALL_MODES}")
|
q.add_log_cmd(f"{info_prefix}: {Info.REPORT_ALL_MODES}")
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -47,7 +42,7 @@ def build_eps_subsystem_cmd(p: ServiceProviderParams):
|
|||||||
app_data=EPS_SUBSYSTEM_ID,
|
app_data=EPS_SUBSYSTEM_ID,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
mode_info_tup = HANDLER_LIST.get(op_code)
|
mode_info_tup = HANDLER_LIST.get(cmd_str)
|
||||||
if mode_info_tup is None:
|
if mode_info_tup is None:
|
||||||
return
|
return
|
||||||
pack_mode_cmd_with_info(
|
pack_mode_cmd_with_info(
|
||||||
@ -59,10 +54,9 @@ def build_eps_subsystem_cmd(p: ServiceProviderParams):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_eps_subsystem_node() -> CmdTreeNode:
|
||||||
def add_eps_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
eps_node = CmdTreeNode("eps", "EPS Subsystem")
|
||||||
oce = OpCodeEntry()
|
for cmd_str, (_, _, info) in HANDLER_LIST.items():
|
||||||
for op_code, (_, _, info) in HANDLER_LIST.items():
|
eps_node.add_child(CmdTreeNode(cmd_str, info))
|
||||||
oce.add(op_code, info)
|
eps_node.add_child(CmdTreeNode(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES))
|
||||||
oce.add(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES)
|
return eps_node
|
||||||
defs.add_service(CustomServiceList.EPS_SS, "EPS Subsystem", oce)
|
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
|
import dataclasses
|
||||||
import struct
|
import struct
|
||||||
|
import logging
|
||||||
|
import sqlite3
|
||||||
from typing import List, Tuple
|
from typing import List, Tuple
|
||||||
|
from eive_tmtc.pus_tm.hk import HkTmInfo
|
||||||
|
|
||||||
from eive_tmtc.tmtc.power.acu import acu_config_table_handler
|
from eive_tmtc.tmtc.power.acu import acu_config_table_handler
|
||||||
from eive_tmtc.tmtc.power.common_power import (
|
from eive_tmtc.tmtc.power.common_power import (
|
||||||
@ -19,6 +23,8 @@ from eive_tmtc.config.object_ids import (
|
|||||||
ACU_HANDLER_ID,
|
ACU_HANDLER_ID,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
P60_INDEX_LIST = [
|
P60_INDEX_LIST = [
|
||||||
"ACU VCC",
|
"ACU VCC",
|
||||||
"PDU1 VCC",
|
"PDU1 VCC",
|
||||||
@ -146,7 +152,25 @@ class DevicesInfoParser:
|
|||||||
return "Unknown Type"
|
return "Unknown Type"
|
||||||
|
|
||||||
|
|
||||||
def handle_pdu_data(pw: PrintWrapper, pdu_idx: int, set_id: int, hk_data: bytes):
|
@dataclasses.dataclass
|
||||||
|
class PduData:
|
||||||
|
boot_count: int
|
||||||
|
batt_mode: int
|
||||||
|
temperature: float
|
||||||
|
vcc: int
|
||||||
|
vbat: int
|
||||||
|
out_enables: List[bool]
|
||||||
|
voltages: List[int]
|
||||||
|
currents: List[int]
|
||||||
|
|
||||||
|
|
||||||
|
def handle_pdu_data(
|
||||||
|
hk_data: bytes,
|
||||||
|
hk_info: HkTmInfo,
|
||||||
|
pw: PrintWrapper,
|
||||||
|
pdu_idx: int,
|
||||||
|
set_id: int,
|
||||||
|
):
|
||||||
current_idx = 0
|
current_idx = 0
|
||||||
priv_idx = pdu_idx - 1
|
priv_idx = pdu_idx - 1
|
||||||
if set_id == SetId.AUX or set_id == SetId.AUX:
|
if set_id == SetId.AUX or set_id == SetId.AUX:
|
||||||
@ -219,7 +243,86 @@ def handle_pdu_data(pw: PrintWrapper, pdu_idx: int, set_id: int, hk_data: bytes)
|
|||||||
f"Boot Count {boot_count} | Battery Mode {batt_mode} | "
|
f"Boot Count {boot_count} | Battery Mode {batt_mode} | "
|
||||||
f"Temperature {temperature} | VCC {vcc} | VBAT {vbat}"
|
f"Temperature {temperature} | VCC {vcc} | VBAT {vbat}"
|
||||||
)
|
)
|
||||||
pw.dlog(info)
|
try:
|
||||||
|
handle_pdu_db_insertion(
|
||||||
|
hk_info,
|
||||||
|
pdu_idx,
|
||||||
|
PduData(
|
||||||
|
boot_count,
|
||||||
|
batt_mode,
|
||||||
|
temperature,
|
||||||
|
vcc,
|
||||||
|
vbat,
|
||||||
|
output_enb_list,
|
||||||
|
voltage_list,
|
||||||
|
current_list,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
except sqlite3.OperationalError as e:
|
||||||
|
_LOGGER.warning(f"SQLite error {e}")
|
||||||
|
_LOGGER.info(info)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_pdu_db_insertion(
|
||||||
|
hk_info: HkTmInfo,
|
||||||
|
pdu_idx: int,
|
||||||
|
pdu_data: PduData,
|
||||||
|
):
|
||||||
|
cursor = hk_info.db_con.cursor()
|
||||||
|
if pdu_idx == 1:
|
||||||
|
tbl_base_name = "pdu1"
|
||||||
|
channel_list = PDU1_CHANNELS_NAMES
|
||||||
|
else:
|
||||||
|
tbl_base_name = "pdu2"
|
||||||
|
channel_list = PDU2_CHANNELS_NAMES
|
||||||
|
cursor.execute(
|
||||||
|
f"""
|
||||||
|
CREATE TABLE IF NOT EXISTS {tbl_base_name}(
|
||||||
|
packet_uuid TEXT PRIMARY KEY,
|
||||||
|
generation_time TEXT,
|
||||||
|
boot_count NUM,
|
||||||
|
bat_mode NUM,
|
||||||
|
temp REAL,
|
||||||
|
vcc NUM,
|
||||||
|
vbat NUM
|
||||||
|
)"""
|
||||||
|
)
|
||||||
|
cursor.execute(
|
||||||
|
f"INSERT INTO {tbl_base_name} VALUES(?, ?, ?, ?, ?, ?, ?)",
|
||||||
|
(
|
||||||
|
str(hk_info.packet_uuid),
|
||||||
|
hk_info.packet_datetime,
|
||||||
|
pdu_data.boot_count,
|
||||||
|
pdu_data.batt_mode,
|
||||||
|
pdu_data.temperature,
|
||||||
|
pdu_data.vcc,
|
||||||
|
pdu_data.vbat,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
for idx, name in enumerate(channel_list):
|
||||||
|
words = name.split()
|
||||||
|
camel_case_name = "_".join(word.lower() for word in words)
|
||||||
|
tbl_name = f"{tbl_base_name}_{camel_case_name}"
|
||||||
|
cursor.execute(
|
||||||
|
f"""
|
||||||
|
CREATE TABLE IF NOT EXISTS {tbl_name}(
|
||||||
|
packet_uuid TEXT PRIMARY KEY,
|
||||||
|
generation_time TEXT,
|
||||||
|
out_enable NUM,
|
||||||
|
voltage NUM,
|
||||||
|
current NUM
|
||||||
|
)"""
|
||||||
|
)
|
||||||
|
value_tuple = (
|
||||||
|
str(hk_info.packet_uuid),
|
||||||
|
hk_info.packet_datetime,
|
||||||
|
pdu_data.out_enables[idx],
|
||||||
|
pdu_data.voltages[idx],
|
||||||
|
pdu_data.currents[idx],
|
||||||
|
)
|
||||||
|
cursor.execute(f"INSERT INTO {tbl_name} VALUES(?, ?, ?, ?, ?)", value_tuple)
|
||||||
|
hk_info.db_con.commit()
|
||||||
|
|
||||||
|
|
||||||
def handle_p60_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
|
def handle_p60_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
|
||||||
|
@ -9,17 +9,14 @@
|
|||||||
import logging
|
import logging
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import SOLAR_ARRAY_DEPLOYMENT_ID
|
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
tmtc_definitions_provider,
|
CmdTreeNode,
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
)
|
||||||
from tmtccmd.tmtc import service_provider, DefaultPusQueueHelper
|
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
|
||||||
|
from eive_tmtc.config.object_ids import SOLAR_ARRAY_DEPLOYMENT_ID
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
@ -38,25 +35,17 @@ class ActionId:
|
|||||||
MANUAL_DEPLOYMENT = 5
|
MANUAL_DEPLOYMENT = 5
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def add_solar_array_deployment_node() -> CmdTreeNode:
|
||||||
def add_sa_depl_cmds(defs: TmtcDefinitionWrapper):
|
node = CmdTreeNode("solar_array_deployment", "Solar Array Deployment")
|
||||||
oce = OpCodeEntry()
|
node.add_child(CmdTreeNode(OpCode.MANUAL_DEPLOYMENT, Info.MANUAL_DEPLOYMENT))
|
||||||
oce.add(keys=OpCode.MANUAL_DEPLOYMENT, info=Info.MANUAL_DEPLOYMENT)
|
node.add_child(CmdTreeNode(OpCode.BURN_SA_0_ONLY, Info.BURN_SA_0_ONLY))
|
||||||
oce.add(keys=OpCode.BURN_SA_0_ONLY, info=Info.BURN_SA_0_ONLY)
|
node.add_child(CmdTreeNode(OpCode.BURN_SA_1_ONLY, Info.BURN_SA_1_ONLY))
|
||||||
oce.add(keys=OpCode.BURN_SA_1_ONLY, info=Info.BURN_SA_1_ONLY)
|
return node
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.SA_DEPLYOMENT,
|
|
||||||
info="Solar Array Deployment",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.SA_DEPLYOMENT)
|
def pack_solar_array_deployment_test_into(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
def pack_solar_array_deployment_test_into(p: ServiceProviderParams):
|
|
||||||
q = p.queue_helper
|
|
||||||
op_code = p.op_code
|
|
||||||
switch_interval_ms = 0
|
switch_interval_ms = 0
|
||||||
if op_code == OpCode.MANUAL_DEPLOYMENT:
|
if cmd_str == OpCode.MANUAL_DEPLOYMENT:
|
||||||
while True:
|
while True:
|
||||||
burn_time_secs = prompt_burn_time()
|
burn_time_secs = prompt_burn_time()
|
||||||
if burn_time_secs < 0:
|
if burn_time_secs < 0:
|
||||||
@ -80,9 +69,9 @@ def pack_solar_array_deployment_test_into(p: ServiceProviderParams):
|
|||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
pack_manual_array_depl_cmd(burn_time_secs, switch_interval_ms, dry_run)
|
pack_manual_array_depl_cmd(burn_time_secs, switch_interval_ms, dry_run)
|
||||||
)
|
)
|
||||||
elif op_code in OpCode.BURN_SA_0_ONLY:
|
elif cmd_str == OpCode.BURN_SA_0_ONLY:
|
||||||
burn_one_channel_only(q, 0)
|
burn_one_channel_only(q, 0)
|
||||||
elif op_code in OpCode.BURN_SA_1_ONLY:
|
elif cmd_str == OpCode.BURN_SA_1_ONLY:
|
||||||
burn_one_channel_only(q, 1)
|
burn_one_channel_only(q, 1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,18 +3,18 @@ import enum
|
|||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.tmtc.acs.subsystem import AcsMode
|
from eive_tmtc.tmtc.acs.subsystem import AcsMode
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
|
CmdTreeNode,
|
||||||
tmtc_definitions_provider,
|
tmtc_definitions_provider,
|
||||||
TmtcDefinitionWrapper,
|
TmtcDefinitionWrapper,
|
||||||
OpCodeEntry,
|
OpCodeEntry,
|
||||||
)
|
)
|
||||||
from tmtccmd.tmtc import service_provider
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from eive_tmtc.config.object_ids import EIVE_SYSTEM_ID
|
from eive_tmtc.config.object_ids import EIVE_SYSTEM_ID
|
||||||
from tmtccmd.pus.s200_fsfw_mode import (
|
from tmtccmd.pus.s200_fsfw_mode import (
|
||||||
create_mode_command,
|
create_mode_command,
|
||||||
create_announce_mode_recursive_command,
|
create_announce_mode_recursive_command,
|
||||||
)
|
)
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
|
|
||||||
|
|
||||||
class SystemMode:
|
class SystemMode:
|
||||||
@ -55,40 +55,49 @@ class Info:
|
|||||||
REBOOT_I2C = "Reboot I2C bus"
|
REBOOT_I2C = "Reboot I2C bus"
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.SYSTEM.value)
|
def build_system_cmds(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
def build_system_cmds(p: ServiceProviderParams):
|
|
||||||
o = p.op_code
|
|
||||||
q = p.queue_helper
|
|
||||||
prefix = "EIVE System"
|
prefix = "EIVE System"
|
||||||
if o == OpCode.SAFE_MODE:
|
if cmd_str == OpCode.SAFE_MODE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.SAFE_MODE}")
|
q.add_log_cmd(f"{prefix}: {Info.SAFE_MODE}")
|
||||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.SAFE, 0))
|
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.SAFE, 0))
|
||||||
elif o == OpCode.IDLE_MODE:
|
elif cmd_str == OpCode.IDLE_MODE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.IDLE_MODE}")
|
q.add_log_cmd(f"{prefix}: {Info.IDLE_MODE}")
|
||||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.IDLE, 0))
|
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.IDLE, 0))
|
||||||
elif o == OpCode.NADIR_MODE:
|
elif cmd_str == OpCode.NADIR_MODE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.NADIR_MODE}")
|
q.add_log_cmd(f"{prefix}: {Info.NADIR_MODE}")
|
||||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_NADIR, 0))
|
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_NADIR, 0))
|
||||||
elif o == OpCode.TARGET_MODE:
|
elif cmd_str == OpCode.TARGET_MODE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.TARGET_MODE}")
|
q.add_log_cmd(f"{prefix}: {Info.TARGET_MODE}")
|
||||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_TARGET, 0))
|
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_TARGET, 0))
|
||||||
elif o == OpCode.TARGET_GS_MODE:
|
elif cmd_str == OpCode.TARGET_GS_MODE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.TARGET_GS_MODE}")
|
q.add_log_cmd(f"{prefix}: {Info.TARGET_GS_MODE}")
|
||||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_TARGET_GS, 0))
|
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_TARGET_GS, 0))
|
||||||
elif o == OpCode.INERTIAL_MODE:
|
elif cmd_str == OpCode.INERTIAL_MODE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.INERTIAL_MODE}")
|
q.add_log_cmd(f"{prefix}: {Info.INERTIAL_MODE}")
|
||||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_INERTIAL, 0))
|
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_INERTIAL, 0))
|
||||||
elif o == OpCode.ANNOUNCE_MODES:
|
elif cmd_str == OpCode.ANNOUNCE_MODES:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.ANNOUNCE_MODES}")
|
q.add_log_cmd(f"{prefix}: {Info.ANNOUNCE_MODES}")
|
||||||
q.add_pus_tc(create_announce_mode_recursive_command(EIVE_SYSTEM_ID))
|
q.add_pus_tc(create_announce_mode_recursive_command(EIVE_SYSTEM_ID))
|
||||||
elif o == OpCode.BOOT_MODE:
|
elif cmd_str == OpCode.BOOT_MODE:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.BOOT_MODE}")
|
q.add_log_cmd(f"{prefix}: {Info.BOOT_MODE}")
|
||||||
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.BOOT, 0))
|
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.BOOT, 0))
|
||||||
elif o == OpCode.REBOOT_I2C:
|
elif cmd_str == OpCode.REBOOT_I2C:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REBOOT_I2C}")
|
q.add_log_cmd(f"{prefix}: {Info.REBOOT_I2C}")
|
||||||
q.add_pus_tc(create_action_cmd(EIVE_SYSTEM_ID, ActionId.EXECUTE_I2C_REBOOT))
|
q.add_pus_tc(create_action_cmd(EIVE_SYSTEM_ID, ActionId.EXECUTE_I2C_REBOOT))
|
||||||
|
|
||||||
|
|
||||||
|
def create_system_node() -> CmdTreeNode:
|
||||||
|
op_code_strs = [
|
||||||
|
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||||
|
]
|
||||||
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
|
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||||
|
node = CmdTreeNode("system", "EIVE System")
|
||||||
|
for op_code, info in combined_dict.items():
|
||||||
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_system_cmd_defs(defs: TmtcDefinitionWrapper):
|
def add_system_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
|
@ -3,6 +3,7 @@ from eive_tmtc.config.object_ids import TCS_CONTROLLER
|
|||||||
from eive_tmtc.tmtc.tcs import CtrlSetId
|
from eive_tmtc.tmtc.tcs import CtrlSetId
|
||||||
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 (
|
||||||
|
CmdTreeNode,
|
||||||
tmtc_definitions_provider,
|
tmtc_definitions_provider,
|
||||||
TmtcDefinitionWrapper,
|
TmtcDefinitionWrapper,
|
||||||
OpCodeEntry,
|
OpCodeEntry,
|
||||||
@ -17,7 +18,7 @@ from tmtccmd.pus.tc.s3_fsfw_hk import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class CmdStr:
|
||||||
REQUEST_PRIMARY_TEMP_SET = "temp"
|
REQUEST_PRIMARY_TEMP_SET = "temp"
|
||||||
ENABLE_TEMP_SET = "enable_temp_set"
|
ENABLE_TEMP_SET = "enable_temp_set"
|
||||||
REQUEST_DEVICE_TEMP_SET = "temp_devs"
|
REQUEST_DEVICE_TEMP_SET = "temp_devs"
|
||||||
@ -26,7 +27,7 @@ class OpCode:
|
|||||||
REQUEST_TCS_CTRL_INFO = "tcs_ctrl_info"
|
REQUEST_TCS_CTRL_INFO = "tcs_ctrl_info"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class CmdInfo:
|
||||||
ENABLE_TEMP_SET = "Enable Primary Temperature Set"
|
ENABLE_TEMP_SET = "Enable Primary Temperature Set"
|
||||||
REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
|
REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
|
||||||
REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
|
REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
|
||||||
@ -35,56 +36,74 @@ class Info:
|
|||||||
REQUEST_TCS_CTRL_INFO = "Request TCS controller information"
|
REQUEST_TCS_CTRL_INFO = "Request TCS controller information"
|
||||||
|
|
||||||
|
|
||||||
def pack_tcs_ctrl_commands(q: DefaultPusQueueHelper, op_code: str):
|
def pack_tcs_ctrl_commands(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
if op_code == OpCode.REQUEST_PRIMARY_TEMP_SET:
|
if cmd_str == CmdStr.REQUEST_PRIMARY_TEMP_SET:
|
||||||
sensor_set_sid = make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS)
|
sensor_set_sid = make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS)
|
||||||
q.add_log_cmd(Info.REQUEST_PRIMARY_TEMP_SET)
|
q.add_log_cmd(CmdInfo.REQUEST_PRIMARY_TEMP_SET)
|
||||||
q.add_pus_tc(generate_one_hk_command(sensor_set_sid))
|
q.add_pus_tc(generate_one_hk_command(sensor_set_sid))
|
||||||
if op_code == OpCode.REQUEST_DEVICE_TEMP_SET:
|
if cmd_str == CmdStr.REQUEST_DEVICE_TEMP_SET:
|
||||||
q.add_log_cmd(Info.REQUEST_DEVICE_TEMP_SET)
|
q.add_log_cmd(CmdInfo.REQUEST_DEVICE_TEMP_SET)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_hk_command(make_sid(TCS_CONTROLLER, CtrlSetId.DEVICE_SENSORS))
|
generate_one_hk_command(make_sid(TCS_CONTROLLER, CtrlSetId.DEVICE_SENSORS))
|
||||||
)
|
)
|
||||||
if op_code == OpCode.REQUEST_DEVICE_SUS_SET:
|
if cmd_str == CmdStr.REQUEST_DEVICE_SUS_SET:
|
||||||
q.add_log_cmd(Info.REQUEST_DEVICE_SUS_SET)
|
q.add_log_cmd(CmdInfo.REQUEST_DEVICE_SUS_SET)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
generate_one_hk_command(
|
generate_one_hk_command(
|
||||||
make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS)
|
make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.REQUEST_HEATER_INFO:
|
if cmd_str == CmdStr.REQUEST_HEATER_INFO:
|
||||||
q.add_log_cmd(Info.REQUEST_HEATER_INFO)
|
q.add_log_cmd(CmdInfo.REQUEST_HEATER_INFO)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_diag_command(
|
create_request_one_diag_command(
|
||||||
make_sid(TCS_CONTROLLER, CtrlSetId.HEATER_INFO)
|
make_sid(TCS_CONTROLLER, CtrlSetId.HEATER_INFO)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.REQUEST_TCS_CTRL_INFO:
|
if cmd_str == CmdStr.REQUEST_TCS_CTRL_INFO:
|
||||||
q.add_log_cmd(Info.REQUEST_TCS_CTRL_INFO)
|
q.add_log_cmd(CmdInfo.REQUEST_TCS_CTRL_INFO)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
create_request_one_hk_command(
|
create_request_one_hk_command(
|
||||||
make_sid(TCS_CONTROLLER, CtrlSetId.TCS_CTRL_INFO)
|
make_sid(TCS_CONTROLLER, CtrlSetId.TCS_CTRL_INFO)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code == OpCode.ENABLE_TEMP_SET:
|
if cmd_str == CmdStr.ENABLE_TEMP_SET:
|
||||||
interval_seconds = float(input("Please specify interval in seconds: "))
|
interval_seconds = float(input("Please specify interval in seconds: "))
|
||||||
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
|
||||||
False, make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS), interval_seconds
|
False, make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS), interval_seconds
|
||||||
)
|
)
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
pack_tcs_ass_cmds(q, op_code)
|
pack_tcs_ass_cmds(q, cmd_str)
|
||||||
|
|
||||||
|
|
||||||
|
CTN = CmdTreeNode
|
||||||
|
|
||||||
|
|
||||||
|
def create_tcs_ctrl_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode(
|
||||||
|
"tcs_ctrl", "TCS Controller", hide_children_which_are_leaves=True
|
||||||
|
)
|
||||||
|
node.add_child(CTN(CmdStr.ENABLE_TEMP_SET, CmdInfo.ENABLE_TEMP_SET))
|
||||||
|
node.add_child(
|
||||||
|
CTN(CmdStr.REQUEST_PRIMARY_TEMP_SET, CmdInfo.REQUEST_PRIMARY_TEMP_SET)
|
||||||
|
)
|
||||||
|
node.add_child(CTN(CmdStr.REQUEST_DEVICE_TEMP_SET, CmdInfo.REQUEST_DEVICE_TEMP_SET))
|
||||||
|
node.add_child(CTN(CmdStr.REQUEST_DEVICE_SUS_SET, CmdInfo.REQUEST_DEVICE_SUS_SET))
|
||||||
|
node.add_child(CTN(CmdStr.REQUEST_HEATER_INFO, CmdInfo.REQUEST_HEATER_INFO))
|
||||||
|
node.add_child(CTN(CmdStr.REQUEST_TCS_CTRL_INFO, CmdInfo.REQUEST_TCS_CTRL_INFO))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_tcs_ctrl_cmds(defs: TmtcDefinitionWrapper):
|
def add_tcs_ctrl_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
oce.add(keys=OpCode.ENABLE_TEMP_SET, info=Info.ENABLE_TEMP_SET)
|
oce.add(keys=CmdStr.ENABLE_TEMP_SET, info=CmdInfo.ENABLE_TEMP_SET)
|
||||||
oce.add(keys=OpCode.REQUEST_PRIMARY_TEMP_SET, info=Info.REQUEST_PRIMARY_TEMP_SET)
|
oce.add(keys=CmdStr.REQUEST_PRIMARY_TEMP_SET, info=CmdInfo.REQUEST_PRIMARY_TEMP_SET)
|
||||||
oce.add(keys=OpCode.REQUEST_DEVICE_TEMP_SET, info=Info.REQUEST_DEVICE_TEMP_SET)
|
oce.add(keys=CmdStr.REQUEST_DEVICE_TEMP_SET, info=CmdInfo.REQUEST_DEVICE_TEMP_SET)
|
||||||
oce.add(keys=OpCode.REQUEST_DEVICE_SUS_SET, info=Info.REQUEST_DEVICE_SUS_SET)
|
oce.add(keys=CmdStr.REQUEST_DEVICE_SUS_SET, info=CmdInfo.REQUEST_DEVICE_SUS_SET)
|
||||||
oce.add(keys=OpCode.REQUEST_HEATER_INFO, info=Info.REQUEST_HEATER_INFO)
|
oce.add(keys=CmdStr.REQUEST_HEATER_INFO, info=CmdInfo.REQUEST_HEATER_INFO)
|
||||||
oce.add(keys=OpCode.REQUEST_TCS_CTRL_INFO, info=Info.REQUEST_TCS_CTRL_INFO)
|
oce.add(keys=CmdStr.REQUEST_TCS_CTRL_INFO, info=CmdInfo.REQUEST_TCS_CTRL_INFO)
|
||||||
defs.add_service(
|
defs.add_service(
|
||||||
name=CustomServiceList.TCS_CTRL,
|
name=CustomServiceList.TCS_CTRL,
|
||||||
info="TCS controller",
|
info="TCS controller",
|
||||||
|
@ -5,21 +5,21 @@
|
|||||||
"""
|
"""
|
||||||
import enum
|
import enum
|
||||||
|
|
||||||
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
|
from tmtccmd.config import CmdTreeNode, OpCodeEntry, TmtcDefinitionWrapper
|
||||||
|
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||||
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
|
from tmtccmd.pus.s201_fsfw_health import (
|
||||||
|
FsfwHealth,
|
||||||
|
Subservice,
|
||||||
|
pack_set_health_cmd_data,
|
||||||
|
)
|
||||||
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
|
from tmtccmd.util.obj_id import ObjectIdU32
|
||||||
|
|
||||||
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 eive_tmtc.tmtc.tcs.defs import Heater
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
|
||||||
from tmtccmd.util.obj_id import ObjectIdU32
|
|
||||||
from tmtccmd.pus.s201_fsfw_health import (
|
|
||||||
pack_set_health_cmd_data,
|
|
||||||
FsfwHealth,
|
|
||||||
Subservice,
|
|
||||||
)
|
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
|
||||||
|
|
||||||
|
|
||||||
HEATER_LOCATION = [
|
HEATER_LOCATION = [
|
||||||
"PLOC Processing Board",
|
"PLOC Processing Board",
|
||||||
@ -34,10 +34,10 @@ HEATER_LOCATION = [
|
|||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
HEATER_CMD = ["switch_cmd"]
|
HEATER_CMD = "switch_cmd"
|
||||||
HEATER_EXT_CTRL = ["set_ext_ctrl"]
|
HEATER_EXT_CTRL = "set_ext_ctrl"
|
||||||
HEATER_FAULTY_CMD = ["set_faulty"]
|
HEATER_FAULTY_CMD = "set_faulty"
|
||||||
HEATER_HEALTHY_CMD = ["set_healthy"]
|
HEATER_HEALTHY_CMD = "set_healthy"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -55,6 +55,18 @@ class ActionIds(enum.IntEnum):
|
|||||||
SWITCH_HEATER = 0
|
SWITCH_HEATER = 0
|
||||||
|
|
||||||
|
|
||||||
|
CTN = CmdTreeNode
|
||||||
|
|
||||||
|
|
||||||
|
def create_heater_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode("heaters", "Heater Device", hide_children_which_are_leaves=True)
|
||||||
|
node.add_child(CTN(OpCode.HEATER_CMD, Info.HEATER_CMD))
|
||||||
|
node.add_child(CTN(OpCode.HEATER_HEALTHY_CMD, Info.HEATER_HEALTHY_CMD))
|
||||||
|
node.add_child(CTN(OpCode.HEATER_EXT_CTRL, Info.HEATER_EXT_CTRL))
|
||||||
|
node.add_child(CTN(OpCode.HEATER_FAULTY_CMD, Info.HEATER_FAULTY_CMD))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_heater_cmds(defs: TmtcDefinitionWrapper):
|
def add_heater_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
@ -69,8 +81,8 @@ def add_heater_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def pack_heater_cmds(object_id: bytearray, op_code: str, q: DefaultPusQueueHelper):
|
def pack_heater_cmds(object_id: bytes, cmd_str: str, q: DefaultPusQueueHelper):
|
||||||
if op_code in OpCode.HEATER_CMD:
|
if cmd_str == OpCode.HEATER_CMD:
|
||||||
q.add_log_cmd("Heater Switching")
|
q.add_log_cmd("Heater Switching")
|
||||||
heater_number = prompt_heater()
|
heater_number = prompt_heater()
|
||||||
while True:
|
while True:
|
||||||
@ -90,7 +102,7 @@ def pack_heater_cmds(object_id: bytearray, op_code: str, q: DefaultPusQueueHelpe
|
|||||||
debug_string = f"Switching heater {heater_number} {act_str}"
|
debug_string = f"Switching heater {heater_number} {act_str}"
|
||||||
q.add_log_cmd(debug_string)
|
q.add_log_cmd(debug_string)
|
||||||
q.add_pus_tc(pack_switch_heater_command(object_id, heater_number, action))
|
q.add_pus_tc(pack_switch_heater_command(object_id, heater_number, action))
|
||||||
if op_code in OpCode.HEATER_EXT_CTRL:
|
if cmd_str == OpCode.HEATER_EXT_CTRL:
|
||||||
heater_number = prompt_heater()
|
heater_number = prompt_heater()
|
||||||
obj_id = heater_idx_to_obj(heater_number)
|
obj_id = heater_idx_to_obj(heater_number)
|
||||||
health_cmd(
|
health_cmd(
|
||||||
@ -100,7 +112,7 @@ def pack_heater_cmds(object_id: bytearray, op_code: str, q: DefaultPusQueueHelpe
|
|||||||
health_str="External Control",
|
health_str="External Control",
|
||||||
heater_idx=heater_number,
|
heater_idx=heater_number,
|
||||||
)
|
)
|
||||||
if op_code in OpCode.HEATER_FAULTY_CMD:
|
if cmd_str == OpCode.HEATER_FAULTY_CMD:
|
||||||
heater_number = prompt_heater()
|
heater_number = prompt_heater()
|
||||||
obj_id = heater_idx_to_obj(heater_number)
|
obj_id = heater_idx_to_obj(heater_number)
|
||||||
health_cmd(
|
health_cmd(
|
||||||
@ -110,7 +122,7 @@ def pack_heater_cmds(object_id: bytearray, op_code: str, q: DefaultPusQueueHelpe
|
|||||||
health_str="Faulty",
|
health_str="Faulty",
|
||||||
heater_idx=heater_number,
|
heater_idx=heater_number,
|
||||||
)
|
)
|
||||||
if op_code in OpCode.HEATER_HEALTHY_CMD:
|
if cmd_str == OpCode.HEATER_HEALTHY_CMD:
|
||||||
heater_number = prompt_heater()
|
heater_number = prompt_heater()
|
||||||
obj_id = heater_idx_to_obj(heater_number)
|
obj_id = heater_idx_to_obj(heater_number)
|
||||||
health_cmd(
|
health_cmd(
|
||||||
|
@ -5,7 +5,7 @@ import struct
|
|||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from spacepackets.ecss import PusTelecommand
|
from spacepackets.ecss import PusTelecommand
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
from tmtccmd.config import CmdTreeNode, TmtcDefinitionWrapper, OpCodeEntry
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||||
|
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
@ -81,34 +81,43 @@ class SetId(enum.IntEnum):
|
|||||||
TEMPERATURE = 1
|
TEMPERATURE = 1
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class CmdStr:
|
||||||
ON = ["0", "on"]
|
ON = "on"
|
||||||
OFF = ["1", "off"]
|
OFF = "off"
|
||||||
NORMAL = ["2", "normal"]
|
NORMAL = "normal"
|
||||||
WRITE_CONFIG = ["3", "Write config"]
|
WRITE_CONFIG = "write_cfg"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class CmdInfo:
|
||||||
ON = "Switch handler on"
|
ON = "Switch handler on"
|
||||||
OFF = "Switch handler off"
|
OFF = "Switch handler off"
|
||||||
NORMAL = "Switch handler normal"
|
NORMAL = "Switch handler normal"
|
||||||
WRITE_CONFIG = "Write config"
|
WRITE_CONFIG = "Write config"
|
||||||
|
|
||||||
|
|
||||||
|
def create_rtd_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode("rtd", "RTD commands", hide_children_which_are_leaves=True)
|
||||||
|
node.add_child(CmdTreeNode(CmdStr.ON, CmdInfo.ON))
|
||||||
|
node.add_child(CmdTreeNode(CmdStr.NORMAL, CmdInfo.NORMAL))
|
||||||
|
node.add_child(CmdTreeNode(CmdStr.OFF, CmdInfo.OFF))
|
||||||
|
node.add_child(CmdTreeNode(CmdStr.WRITE_CONFIG, CmdInfo.WRITE_CONFIG))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def specify_rtd_cmds(defs: TmtcDefinitionWrapper):
|
def specify_rtd_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
oce.add(keys=OpCode.ON, info=Info.ON)
|
oce.add(keys=CmdStr.ON, info=CmdInfo.ON)
|
||||||
oce.add(keys=OpCode.NORMAL, info=Info.NORMAL)
|
oce.add(keys=CmdStr.NORMAL, info=CmdInfo.NORMAL)
|
||||||
oce.add(keys=OpCode.OFF, info=Info.OFF)
|
oce.add(keys=CmdStr.OFF, info=CmdInfo.OFF)
|
||||||
oce.add(keys=OpCode.WRITE_CONFIG, info=Info.WRITE_CONFIG)
|
oce.add(keys=CmdStr.WRITE_CONFIG, info=CmdInfo.WRITE_CONFIG)
|
||||||
defs.add_service(
|
defs.add_service(
|
||||||
name=CustomServiceList.RTD.value, info="RTD commands", op_code_entry=oce
|
name=CustomServiceList.RTD.value, info="RTD commands", op_code_entry=oce
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def pack_rtd_commands(
|
def pack_rtd_commands(
|
||||||
op_code: str, object_id: Optional[ObjectIdU32], q: DefaultPusQueueHelper
|
cmd_str: str, object_id: Optional[ObjectIdU32], q: DefaultPusQueueHelper
|
||||||
):
|
):
|
||||||
if object_id is not None and object_id not in RTD_IDS:
|
if object_id is not None and object_id not in RTD_IDS:
|
||||||
print("Specified object ID not a valid RTD ID")
|
print("Specified object ID not a valid RTD ID")
|
||||||
@ -117,14 +126,14 @@ def pack_rtd_commands(
|
|||||||
tgt_rtd_idx = prompt_rtd_idx()
|
tgt_rtd_idx = prompt_rtd_idx()
|
||||||
object_id_dict = get_object_ids()
|
object_id_dict = get_object_ids()
|
||||||
object_id = object_id_dict.get(RTD_IDS[tgt_rtd_idx])
|
object_id = object_id_dict.get(RTD_IDS[tgt_rtd_idx])
|
||||||
if op_code in OpCode.ON:
|
if cmd_str == CmdStr.ON:
|
||||||
app_data = pack_mode_data(object_id=object_id.as_bytes, mode=Mode.ON, submode=0)
|
app_data = pack_mode_data(object_id=object_id.as_bytes, mode=Mode.ON, submode=0)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=app_data
|
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=app_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.NORMAL:
|
if cmd_str == CmdStr.NORMAL:
|
||||||
app_data = pack_mode_data(
|
app_data = pack_mode_data(
|
||||||
object_id=object_id.as_bytes, mode=Mode.NORMAL, submode=0
|
object_id=object_id.as_bytes, mode=Mode.NORMAL, submode=0
|
||||||
)
|
)
|
||||||
@ -133,7 +142,7 @@ def pack_rtd_commands(
|
|||||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=app_data
|
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=app_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.OFF:
|
if cmd_str == CmdStr.OFF:
|
||||||
app_data = pack_mode_data(
|
app_data = pack_mode_data(
|
||||||
object_id=object_id.as_bytes, mode=Mode.OFF, submode=0
|
object_id=object_id.as_bytes, mode=Mode.OFF, submode=0
|
||||||
)
|
)
|
||||||
@ -142,7 +151,7 @@ def pack_rtd_commands(
|
|||||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=app_data
|
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=app_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.WRITE_CONFIG:
|
if cmd_str in CmdStr.WRITE_CONFIG:
|
||||||
command = object_id.as_bytes + struct.pack("!I", CommandId.WRITE_CONFIG)
|
command = object_id.as_bytes + struct.pack("!I", CommandId.WRITE_CONFIG)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
|
|
||||||
|
@ -23,17 +23,17 @@ class InfoSys:
|
|||||||
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, cmd_str: str):
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == OpCode.OFF:
|
||||||
q.add_log_cmd(InfoSys.OFF)
|
q.add_log_cmd(InfoSys.OFF)
|
||||||
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.OFF, 0, q, InfoSys.OFF)
|
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.OFF, 0, q, InfoSys.OFF)
|
||||||
if op_code == OpCode.NML:
|
if cmd_str == 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 == OpCode.ANNOUNCE_MODES:
|
if cmd_str == OpCode.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, cmd_str)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
import enum
|
import enum
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
from tmtccmd.config import CmdTreeNode
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
@ -23,14 +25,14 @@ from tmtccmd.pus.tc.s3_fsfw_hk import create_request_one_hk_command, make_sid
|
|||||||
from tmtccmd.util import ObjectIdU32
|
from tmtccmd.util import ObjectIdU32
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class CmdStr:
|
||||||
OFF = "off"
|
OFF = "off"
|
||||||
ON = "on"
|
ON = "on"
|
||||||
NML = "nml"
|
NML = "nml"
|
||||||
HK = "hk"
|
HK = "hk"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class CmdInfo:
|
||||||
OFF = "Off"
|
OFF = "Off"
|
||||||
ON = "On"
|
ON = "On"
|
||||||
NML = "Normal"
|
NML = "Normal"
|
||||||
@ -47,37 +49,46 @@ class SetId(enum.IntEnum):
|
|||||||
|
|
||||||
|
|
||||||
def pack_tmp1075_test_into(
|
def pack_tmp1075_test_into(
|
||||||
object_id: ObjectIdU32, op_code: str, q: DefaultPusQueueHelper
|
object_id: ObjectIdU32, cmd_str: str, q: DefaultPusQueueHelper
|
||||||
):
|
):
|
||||||
q.add_log_cmd(
|
q.add_log_cmd(
|
||||||
f"Testing Tmp1075 Temperature Sensor Handler with object id: {object_id}"
|
f"Testing Tmp1075 Temperature Sensor Handler with object id: {object_id}"
|
||||||
)
|
)
|
||||||
obyt = object_id.as_bytes
|
obyt = object_id.as_bytes
|
||||||
if op_code == OpCode.OFF:
|
if cmd_str == CmdStr.OFF:
|
||||||
q.add_log_cmd("TMP1075: Set Normal Off")
|
q.add_log_cmd("TMP1075: Set Normal Off")
|
||||||
mode_data = pack_mode_data(obyt, Mode.OFF, 0)
|
mode_data = pack_mode_data(obyt, Mode.OFF, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||||
if op_code == OpCode.NML:
|
if cmd_str == CmdStr.NML:
|
||||||
q.add_log_cmd("TMP1075: Set Mode Normal")
|
q.add_log_cmd("TMP1075: Set Mode Normal")
|
||||||
mode_data = pack_mode_data(obyt, Mode.NORMAL, 0)
|
mode_data = pack_mode_data(obyt, Mode.NORMAL, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||||
if op_code == OpCode.ON:
|
if cmd_str == CmdStr.ON:
|
||||||
q.add_log_cmd("TMP1075: Set Mode On")
|
q.add_log_cmd("TMP1075: Set Mode On")
|
||||||
mode_data = pack_mode_data(obyt, Mode.ON, 0)
|
mode_data = pack_mode_data(obyt, Mode.ON, 0)
|
||||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||||
if op_code == OpCode.HK:
|
if cmd_str == CmdStr.HK:
|
||||||
q.add_log_cmd("TMP1075: Request One-Shot HK")
|
q.add_log_cmd("TMP1075: Request One-Shot HK")
|
||||||
q.add_pus_tc(create_request_one_hk_command(make_sid(obyt, SetId.TEMPERATURE)))
|
q.add_pus_tc(create_request_one_hk_command(make_sid(obyt, SetId.TEMPERATURE)))
|
||||||
return q
|
return q
|
||||||
|
|
||||||
|
|
||||||
|
def create_tmp_sens_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode("tmp_1075", "TMP1075 Temperatur Sensors")
|
||||||
|
node.add_child(CmdTreeNode(CmdStr.OFF, CmdInfo.OFF))
|
||||||
|
node.add_child(CmdTreeNode(CmdStr.ON, CmdInfo.ON))
|
||||||
|
node.add_child(CmdTreeNode(CmdStr.NML, CmdInfo.NML))
|
||||||
|
node.add_child(CmdTreeNode(CmdStr.HK, CmdInfo.HK))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_tmp_sens_cmds(defs: TmtcDefinitionWrapper):
|
def add_tmp_sens_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
oce.add(OpCode.OFF, Info.OFF)
|
oce.add(CmdStr.OFF, CmdInfo.OFF)
|
||||||
oce.add(OpCode.ON, Info.ON)
|
oce.add(CmdStr.ON, CmdInfo.ON)
|
||||||
oce.add(OpCode.NML, Info.NML)
|
oce.add(CmdStr.NML, CmdInfo.NML)
|
||||||
oce.add(OpCode.HK, Info.HK)
|
oce.add(CmdStr.HK, CmdInfo.HK)
|
||||||
defs.add_service(CustomServiceList.TMP1075.value, "TMP1075 Temperature Sensor", oce)
|
defs.add_service(CustomServiceList.TMP1075.value, "TMP1075 Temperature Sensor", oce)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,52 +1,60 @@
|
|||||||
from spacepackets.ecss import PusTelecommand, PusService
|
import datetime
|
||||||
from tmtccmd.config import CoreServiceList
|
import math
|
||||||
from tmtccmd.config.tmtc import (
|
import struct
|
||||||
tmtc_definitions_provider,
|
|
||||||
TmtcDefinitionWrapper,
|
from spacepackets.ecss import PusService, PusTelecommand
|
||||||
OpCodeEntry,
|
from tmtccmd.config import CmdTreeNode
|
||||||
)
|
from tmtccmd.pus.s11_tc_sched import create_time_tagged_cmd
|
||||||
from tmtccmd.pus.s17_test import create_service_17_ping_command
|
from tmtccmd.pus.s17_test import create_service_17_ping_command
|
||||||
from tmtccmd.tmtc import service_provider
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
|
|
||||||
|
|
||||||
class OpCodes:
|
class OpCode:
|
||||||
PING = "ping"
|
PING = "ping"
|
||||||
TRIGGER_EVENT = "trig_event"
|
TRIGGER_EVENT = "trig_event"
|
||||||
PING_WITH_DATA = "ping_with_data"
|
PING_WITH_DATA = "ping_with_data"
|
||||||
|
SCHEDULE_PING = "sched_ping"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
PING = "Simple Ping and Connection Test"
|
PING = "Simple Ping and Connection Test"
|
||||||
TRIGGER_EVENT = "Trigger an event"
|
TRIGGER_EVENT = "Trigger an event"
|
||||||
PING_WITH_DATA = "Ping with data. Size of sent data is sent back"
|
PING_WITH_DATA = "Ping with data. Size of sent data is sent back"
|
||||||
|
SCHEDULE_PING = "Schedule a ping"
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_test_node() -> CmdTreeNode:
|
||||||
def add_test_defs(defs: TmtcDefinitionWrapper):
|
node = CmdTreeNode("test", "Test Commands")
|
||||||
oce = OpCodeEntry()
|
node.add_child(CmdTreeNode(OpCode.PING, Info.PING))
|
||||||
oce.add(keys=OpCodes.PING, info=Info.PING)
|
node.add_child(CmdTreeNode(OpCode.TRIGGER_EVENT, Info.TRIGGER_EVENT))
|
||||||
oce.add(keys=OpCodes.TRIGGER_EVENT, info=Info.TRIGGER_EVENT)
|
node.add_child(CmdTreeNode(OpCode.PING_WITH_DATA, Info.PING_WITH_DATA))
|
||||||
oce.add(keys=OpCodes.PING_WITH_DATA, info=Info.PING_WITH_DATA)
|
node.add_child(CmdTreeNode(OpCode.SCHEDULE_PING, Info.SCHEDULE_PING))
|
||||||
|
return node
|
||||||
defs.add_service(
|
|
||||||
name=CoreServiceList.SERVICE_17_ALT,
|
|
||||||
info="PUS 17 Test Service",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CoreServiceList.SERVICE_17_ALT)
|
def build_test_commands(q: DefaultPusQueueHelper, cmd_path: str):
|
||||||
def pack_test_command(p: ServiceProviderParams):
|
if cmd_path == OpCode.PING:
|
||||||
info = p.info
|
|
||||||
q = p.queue_helper
|
|
||||||
if info.op_code == OpCodes.PING:
|
|
||||||
q.add_log_cmd("Sending PUS TC [17,1]")
|
q.add_log_cmd("Sending PUS TC [17,1]")
|
||||||
q.add_pus_tc(create_service_17_ping_command())
|
q.add_pus_tc(create_service_17_ping_command())
|
||||||
if info.op_code == OpCodes.TRIGGER_EVENT:
|
if cmd_path == OpCode.TRIGGER_EVENT:
|
||||||
q.add_log_cmd("Sending PUS TC Event Trigger [17, 128]")
|
q.add_log_cmd("Sending PUS TC Event Trigger [17, 128]")
|
||||||
q.add_pus_tc(PusTelecommand(service=PusService.S17_TEST, subservice=128))
|
q.add_pus_tc(PusTelecommand(service=PusService.S17_TEST, subservice=128))
|
||||||
if info.op_code == OpCodes.PING_WITH_DATA:
|
if cmd_path == OpCode.SCHEDULE_PING:
|
||||||
|
q.add_log_cmd("Sending scheduled PUS ping")
|
||||||
|
# Generate a UNIX timestamp 30 seconds in the future using the datetime API with a UTC timezone
|
||||||
|
now = datetime.datetime.now(tz=datetime.timezone.utc)
|
||||||
|
second_offset_to_now = input("Please specify offset to now in seconds: ")
|
||||||
|
now += datetime.timedelta(seconds=int(second_offset_to_now))
|
||||||
|
unix_stamp = struct.pack("!I", math.floor(now.timestamp()))
|
||||||
|
print(f"Sending ping scheuled at {now}")
|
||||||
|
ping = PusTelecommand(service=PusService.S17_TEST, subservice=128)
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_time_tagged_cmd(
|
||||||
|
release_time=unix_stamp,
|
||||||
|
tc_to_insert=ping,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if cmd_path == OpCode.PING_WITH_DATA:
|
||||||
q.add_log_cmd("Sending Ping With Data, Size Reported Back [17, 129]")
|
q.add_log_cmd("Sending Ping With Data, Size Reported Back [17, 129]")
|
||||||
while True:
|
while True:
|
||||||
data_size = int(input("Please specify data size [0-1024]: "))
|
data_size = int(input("Please specify data size [0-1024]: "))
|
||||||
@ -55,7 +63,7 @@ def pack_test_command(p: ServiceProviderParams):
|
|||||||
break
|
break
|
||||||
dummy_data = bytearray()
|
dummy_data = bytearray()
|
||||||
next_byte = True
|
next_byte = True
|
||||||
for i in range(data_size):
|
for _ in range(data_size):
|
||||||
dummy_data.append(int(next_byte))
|
dummy_data.append(int(next_byte))
|
||||||
next_byte = not next_byte
|
next_byte = not next_byte
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
|
@ -1,44 +1,42 @@
|
|||||||
import enum
|
import enum
|
||||||
|
import struct
|
||||||
import logging
|
import logging
|
||||||
from datetime import datetime
|
import datetime
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from spacepackets.ecss import PusTelecommand, PusService
|
from spacepackets.ecss import PusTelecommand, PusService
|
||||||
from tmtccmd.config.tmtc import (
|
|
||||||
tmtc_definitions_provider,
|
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
OpCodeEntry,
|
|
||||||
)
|
|
||||||
|
|
||||||
from tmtccmd.tmtc import service_provider
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
from tmtccmd.config import CmdTreeNode
|
||||||
|
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Subservice(enum.IntEnum):
|
class Subservice(enum.IntEnum):
|
||||||
SET_TIME = 128
|
SET_TIME = 128
|
||||||
DUMP_TIME = 129
|
DUMP_TIME = 129
|
||||||
|
RELATIVE_TIMESHIFT = 130
|
||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class CmdStr:
|
||||||
SET_CURRENT_TIME = ["set_curr_time"]
|
SET_CURRENT_TIME = "set_curr_time"
|
||||||
DUMP_TIME = ["dump_time"]
|
RELATIVE_TIMESHIFT = "relative_timeshift"
|
||||||
|
DUMP_TIME = "dump_time"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
SET_CURRENT_TIME = "Setting current time in ASCII format"
|
SET_CURRENT_TIME = "Setting current time in ASCII format"
|
||||||
|
RELATIVE_TIMESHIFT = "Shift time with a relative offset"
|
||||||
DUMP_TIME = "Dump system time as event"
|
DUMP_TIME = "Dump system time as event"
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.TIME.value)
|
def pack_time_management_cmd(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
def pack_set_current_time_ascii_command(p: ServiceProviderParams):
|
if cmd_str == CmdStr.SET_CURRENT_TIME:
|
||||||
q = p.queue_helper
|
current_time = (
|
||||||
o = p.op_code
|
datetime.datetime.now(datetime.timezone.utc).isoformat() + "Z" + "\0"
|
||||||
if o in OpCode.SET_CURRENT_TIME:
|
|
||||||
current_time = datetime.utcnow().isoformat() + "Z" + "\0"
|
|
||||||
current_time_ascii = current_time.encode("ascii")
|
|
||||||
logging.getLogger(__name__).info(
|
|
||||||
f"Current time in ASCII format: {current_time_ascii}"
|
|
||||||
)
|
)
|
||||||
|
current_time_ascii = current_time.encode("ascii")
|
||||||
|
_LOGGER.info(f"Current time in ASCII format: {current_time_ascii}")
|
||||||
q.add_log_cmd(Info.SET_CURRENT_TIME)
|
q.add_log_cmd(Info.SET_CURRENT_TIME)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -47,7 +45,18 @@ def pack_set_current_time_ascii_command(p: ServiceProviderParams):
|
|||||||
app_data=current_time_ascii,
|
app_data=current_time_ascii,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif o in OpCode.DUMP_TIME:
|
elif cmd_str == CmdStr.RELATIVE_TIMESHIFT:
|
||||||
|
nanos = int(input("Specify relative timeshift in nanoseconds: "))
|
||||||
|
nanos_packed = struct.pack("!q", nanos)
|
||||||
|
q.add_log_cmd(Info.RELATIVE_TIMESHIFT)
|
||||||
|
q.add_pus_tc(
|
||||||
|
PusTelecommand(
|
||||||
|
service=PusService.S9_TIME_MGMT,
|
||||||
|
subservice=Subservice.RELATIVE_TIMESHIFT,
|
||||||
|
app_data=nanos_packed,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
elif cmd_str == CmdStr.DUMP_TIME:
|
||||||
q.add_log_cmd(Info.DUMP_TIME)
|
q.add_log_cmd(Info.DUMP_TIME)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@ -56,16 +65,9 @@ def pack_set_current_time_ascii_command(p: ServiceProviderParams):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_time_node() -> CmdTreeNode:
|
||||||
def add_time_cmds(defs: TmtcDefinitionWrapper):
|
time_node = CmdTreeNode("time", "Time Management")
|
||||||
oce = OpCodeEntry()
|
time_node.add_child(CmdTreeNode(CmdStr.SET_CURRENT_TIME, "Set current time"))
|
||||||
oce.add(
|
time_node.add_child(CmdTreeNode(CmdStr.DUMP_TIME, "Dumpy current time"))
|
||||||
keys=OpCode.SET_CURRENT_TIME,
|
time_node.add_child(CmdTreeNode(CmdStr.RELATIVE_TIMESHIFT, Info.RELATIVE_TIMESHIFT))
|
||||||
info=Info.SET_CURRENT_TIME,
|
return time_node
|
||||||
)
|
|
||||||
oce.add(keys=OpCode.DUMP_TIME, info=Info.DUMP_TIME)
|
|
||||||
defs.add_service(
|
|
||||||
name=CustomServiceList.TIME.value,
|
|
||||||
info="Time Service",
|
|
||||||
op_code_entry=oce,
|
|
||||||
)
|
|
||||||
|
@ -5,24 +5,23 @@ import math
|
|||||||
import struct
|
import struct
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
|
from dateutil.parser import parse
|
||||||
|
from spacepackets.ecss.pus_15_tm_storage import Subservice
|
||||||
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
|
from tmtccmd.config import CmdTreeNode, TmtcDefinitionWrapper
|
||||||
|
from tmtccmd.config.tmtc import OpCodeEntry
|
||||||
|
from tmtccmd.tmtc.queue import DefaultPusQueueHelper
|
||||||
|
from tmtccmd.util import ObjectIdU32
|
||||||
|
|
||||||
|
from eive_tmtc.config.definitions import CustomServiceList
|
||||||
from eive_tmtc.config.object_ids import (
|
from eive_tmtc.config.object_ids import (
|
||||||
|
CFDP_TM_STORE,
|
||||||
HK_TM_STORE,
|
HK_TM_STORE,
|
||||||
MISC_TM_STORE,
|
MISC_TM_STORE,
|
||||||
OK_TM_STORE,
|
|
||||||
NOT_OK_TM_STORE,
|
NOT_OK_TM_STORE,
|
||||||
CFDP_TM_STORE,
|
OK_TM_STORE,
|
||||||
get_object_ids,
|
get_object_ids,
|
||||||
)
|
)
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from tmtccmd.config import TmtcDefinitionWrapper
|
|
||||||
from tmtccmd.config.tmtc import tmtc_definitions_provider, OpCodeEntry
|
|
||||||
from tmtccmd.tmtc import service_provider
|
|
||||||
from tmtccmd.tmtc.decorator import ServiceProviderParams
|
|
||||||
from dateutil.parser import parse
|
|
||||||
|
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
|
||||||
from spacepackets.ecss.pus_15_tm_storage import Subservice
|
|
||||||
from tmtccmd.util import ObjectIdU32
|
|
||||||
|
|
||||||
|
|
||||||
class CustomSubservice(enum.IntEnum):
|
class CustomSubservice(enum.IntEnum):
|
||||||
@ -44,12 +43,9 @@ class Info:
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@service_provider(CustomServiceList.TM_STORE)
|
def pack_tm_store_commands(q: DefaultPusQueueHelper, cmd_path: str):
|
||||||
def pack_tm_store_commands(p: ServiceProviderParams):
|
if cmd_path == OpCode.DELETE_UP_TO:
|
||||||
q = p.queue_helper
|
obj_id, store_string = store_select_prompt()
|
||||||
o = p.op_code
|
|
||||||
if o == OpCode.DELETE_UP_TO:
|
|
||||||
obj_id, _ = store_select_prompt()
|
|
||||||
app_data = bytearray(obj_id.as_bytes)
|
app_data = bytearray(obj_id.as_bytes)
|
||||||
delete_up_to_time = time_prompt("Determining deletion end time")
|
delete_up_to_time = time_prompt("Determining deletion end time")
|
||||||
end_stamp = int(math.floor(delete_up_to_time.timestamp()))
|
end_stamp = int(math.floor(delete_up_to_time.timestamp()))
|
||||||
@ -62,7 +58,7 @@ def pack_tm_store_commands(p: ServiceProviderParams):
|
|||||||
service=15, subservice=Subservice.DELETE_UP_TO, app_data=app_data
|
service=15, subservice=Subservice.DELETE_UP_TO, app_data=app_data
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif o == OpCode.RETRIEVAL_BY_TIME_RANGE:
|
elif cmd_path == OpCode.RETRIEVAL_BY_TIME_RANGE:
|
||||||
q.add_log_cmd(Info.RETRIEVAL_BY_TIME_RANGE)
|
q.add_log_cmd(Info.RETRIEVAL_BY_TIME_RANGE)
|
||||||
obj_id, _ = store_select_prompt()
|
obj_id, _ = store_select_prompt()
|
||||||
app_data = bytearray(obj_id.as_bytes)
|
app_data = bytearray(obj_id.as_bytes)
|
||||||
@ -84,7 +80,7 @@ def pack_tm_store_commands(p: ServiceProviderParams):
|
|||||||
app_data=app_data,
|
app_data=app_data,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif o == OpCode.DELETE_BY_TIME_RANGE:
|
elif cmd_path == OpCode.DELETE_BY_TIME_RANGE:
|
||||||
q.add_log_cmd(Info.DELETE_BY_TIME_RANGE)
|
q.add_log_cmd(Info.DELETE_BY_TIME_RANGE)
|
||||||
obj_id, _ = store_select_prompt()
|
obj_id, _ = store_select_prompt()
|
||||||
app_data = bytearray(obj_id.as_bytes)
|
app_data = bytearray(obj_id.as_bytes)
|
||||||
@ -108,7 +104,16 @@ def pack_tm_store_commands(p: ServiceProviderParams):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
def create_persistent_tm_store_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode("tm_store", "Persistent TM Store")
|
||||||
|
node.add_child(CmdTreeNode(OpCode.DELETE_UP_TO, Info.DELETE_UP_TO))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.DELETE_BY_TIME_RANGE, Info.DELETE_BY_TIME_RANGE))
|
||||||
|
node.add_child(
|
||||||
|
CmdTreeNode(OpCode.RETRIEVAL_BY_TIME_RANGE, Info.RETRIEVAL_BY_TIME_RANGE)
|
||||||
|
)
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
def add_persistent_tm_store_cmd_defs(defs: TmtcDefinitionWrapper):
|
def add_persistent_tm_store_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
oce.add(keys=OpCode.DELETE_UP_TO, info=Info.DELETE_UP_TO)
|
oce.add(keys=OpCode.DELETE_UP_TO, info=Info.DELETE_UP_TO)
|
||||||
@ -159,8 +164,7 @@ def time_prompt(info_str: str) -> datetime.datetime:
|
|||||||
return time_prompt_fully_manually()
|
return time_prompt_fully_manually()
|
||||||
elif time_input_key == 2:
|
elif time_input_key == 2:
|
||||||
return time_prompt_offset_from_now()
|
return time_prompt_offset_from_now()
|
||||||
else:
|
raise ValueError("can not determine datetime")
|
||||||
raise ValueError()
|
|
||||||
|
|
||||||
|
|
||||||
def time_prompt_fully_manually() -> datetime.datetime:
|
def time_prompt_fully_manually() -> datetime.datetime:
|
||||||
@ -207,5 +211,6 @@ def store_select_prompt() -> Tuple[ObjectIdU32, str]:
|
|||||||
break
|
break
|
||||||
obj_id_raw = desc_and_obj_id[0]
|
obj_id_raw = desc_and_obj_id[0]
|
||||||
obj_id = obj_id_dict.get(obj_id_raw)
|
obj_id = obj_id_dict.get(obj_id_raw)
|
||||||
|
assert obj_id is not None
|
||||||
print(f"Selected store: {obj_id} ({desc_and_obj_id[1]})")
|
print(f"Selected store: {obj_id} ({desc_and_obj_id[1]})")
|
||||||
return obj_id_dict.get(obj_id_raw), desc_and_obj_id[1]
|
return obj_id, desc_and_obj_id[1]
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import enum
|
import enum
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
|
CmdTreeNode,
|
||||||
OpCodeEntry,
|
OpCodeEntry,
|
||||||
TmtcDefinitionWrapper,
|
TmtcDefinitionWrapper,
|
||||||
tmtc_definitions_provider,
|
tmtc_definitions_provider,
|
||||||
@ -26,13 +27,20 @@ class ActionId(enum.IntEnum):
|
|||||||
DISABLE = 1
|
DISABLE = 1
|
||||||
|
|
||||||
|
|
||||||
def pack_wdt_commands(q: DefaultPusQueueHelper, op_code: str):
|
def pack_wdt_commands(q: DefaultPusQueueHelper, cmd_str: str):
|
||||||
if op_code == OpCode.ENABLE:
|
if cmd_str == OpCode.ENABLE:
|
||||||
q.add_pus_tc(create_action_cmd(XIPHOS_WDT_ID, ActionId.ENABLE))
|
q.add_pus_tc(create_action_cmd(XIPHOS_WDT_ID, ActionId.ENABLE))
|
||||||
if op_code == OpCode.DISABLE:
|
if cmd_str == OpCode.DISABLE:
|
||||||
q.add_pus_tc(create_action_cmd(XIPHOS_WDT_ID, ActionId.DISABLE))
|
q.add_pus_tc(create_action_cmd(XIPHOS_WDT_ID, ActionId.DISABLE))
|
||||||
|
|
||||||
|
|
||||||
|
def create_wdt_node() -> CmdTreeNode:
|
||||||
|
node = CmdTreeNode("xiphos_wdt", "Xiphos Watchdog Timer")
|
||||||
|
node.add_child(CmdTreeNode(OpCode.ENABLE, Info.ENABLE))
|
||||||
|
node.add_child(CmdTreeNode(OpCode.DISABLE, Info.DISABLE))
|
||||||
|
return node
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_xiphos_wdt_defs(defs: TmtcDefinitionWrapper):
|
def add_xiphos_wdt_defs(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
oce = OpCodeEntry()
|
||||||
|
@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
name = "eive-tmtc"
|
name = "eive-tmtc"
|
||||||
description = "TMTC Commander EIVE"
|
description = "TMTC Commander EIVE"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
version = "5.12.0"
|
version = "6.2.0"
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
license = {text = "Apache-2.0"}
|
license = {text = "Apache-2.0"}
|
||||||
authors = [
|
authors = [
|
||||||
@ -29,9 +29,10 @@ classifiers = [
|
|||||||
"Topic :: Scientific/Engineering"
|
"Topic :: Scientific/Engineering"
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tmtccmd ~= 7.0",
|
"tmtccmd ~= 8.0.0rc1",
|
||||||
|
"cfdp-py~=0.1.0",
|
||||||
|
# "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@main",
|
||||||
"python-dateutil ~= 2.8",
|
"python-dateutil ~= 2.8",
|
||||||
# "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@main"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
|
62
tmtcc.py
62
tmtcc.py
@ -7,20 +7,20 @@ from pathlib import Path
|
|||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
import tmtccmd
|
import tmtccmd
|
||||||
|
from cfdppy.handler import RemoteEntityCfgTable
|
||||||
|
from cfdppy.mib import (
|
||||||
|
IndicationCfg,
|
||||||
|
LocalEntityCfg,
|
||||||
|
RemoteEntityCfg,
|
||||||
|
)
|
||||||
from spacepackets.cfdp import (
|
from spacepackets.cfdp import (
|
||||||
ChecksumType,
|
ChecksumType,
|
||||||
TransmissionMode,
|
TransmissionMode,
|
||||||
)
|
)
|
||||||
from spacepackets.ecss import PusVerificator
|
from spacepackets.ecss import PusVerificator
|
||||||
|
from spacepackets.seqcount import FileSeqCountProvider, PusFileSeqCountProvider
|
||||||
from spacepackets.version import get_version as get_sp_version
|
from spacepackets.version import get_version as get_sp_version
|
||||||
from tmtccmd import BackendBase
|
from tmtccmd import BackendBase
|
||||||
from tmtccmd.cfdp.handler import RemoteEntityCfgTable
|
|
||||||
from eive_tmtc.cfdp.handler import CfdpInCcsdsHandler
|
|
||||||
from tmtccmd.cfdp.mib import (
|
|
||||||
IndicationCfg,
|
|
||||||
LocalEntityCfg,
|
|
||||||
RemoteEntityCfg,
|
|
||||||
)
|
|
||||||
from tmtccmd.config import (
|
from tmtccmd.config import (
|
||||||
SetupWrapper,
|
SetupWrapper,
|
||||||
default_json_path,
|
default_json_path,
|
||||||
@ -30,6 +30,7 @@ from tmtccmd.config.args import (
|
|||||||
PreArgsParsingWrapper,
|
PreArgsParsingWrapper,
|
||||||
ProcedureParamsWrapper,
|
ProcedureParamsWrapper,
|
||||||
SetupParams,
|
SetupParams,
|
||||||
|
perform_tree_printout,
|
||||||
)
|
)
|
||||||
from tmtccmd.core import BackendRequest
|
from tmtccmd.core import BackendRequest
|
||||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||||
@ -40,11 +41,11 @@ from tmtccmd.logging.pus import (
|
|||||||
TimedLogWhen,
|
TimedLogWhen,
|
||||||
)
|
)
|
||||||
from tmtccmd.pus import VerificationWrapper
|
from tmtccmd.pus import VerificationWrapper
|
||||||
from tmtccmd.tmtc import CcsdsTmHandler, GenericApidHandlerBase, SpecificApidHandlerBase
|
from tmtccmd.tmtc import CcsdsTmHandler
|
||||||
from tmtccmd.util import FileSeqCountProvider, PusFileSeqCountProvider
|
|
||||||
|
|
||||||
from eive_tmtc import APP_LOGGER
|
from eive_tmtc import APP_LOGGER
|
||||||
from eive_tmtc.cfdp.fault_handler import EiveCfdpFaultHandler
|
from eive_tmtc.cfdp.fault_handler import EiveCfdpFaultHandler
|
||||||
|
from eive_tmtc.cfdp.handler import CfdpInCcsdsHandler
|
||||||
from eive_tmtc.cfdp.tm import CfdpInCcsdsWrapper
|
from eive_tmtc.cfdp.tm import CfdpInCcsdsWrapper
|
||||||
from eive_tmtc.cfdp.user import EiveCfdpUser, EiveCheckTimerProvider
|
from eive_tmtc.cfdp.user import EiveCfdpUser, EiveCheckTimerProvider
|
||||||
from eive_tmtc.config.definitions import (
|
from eive_tmtc.config.definitions import (
|
||||||
@ -55,8 +56,7 @@ from eive_tmtc.config.definitions import (
|
|||||||
)
|
)
|
||||||
from eive_tmtc.config.hook import EiveHookObject
|
from eive_tmtc.config.hook import EiveHookObject
|
||||||
from eive_tmtc.pus_tc.tc_handler import TcHandler
|
from eive_tmtc.pus_tc.tc_handler import TcHandler
|
||||||
from eive_tmtc.pus_tm.hk_handler import HkFilter
|
from eive_tmtc.pus_tm.pus_handler import PusHandler, UnknownApidHandler
|
||||||
from eive_tmtc.pus_tm.pus_demux import pus_factory_hook
|
|
||||||
|
|
||||||
_LOGGER = APP_LOGGER
|
_LOGGER = APP_LOGGER
|
||||||
_LOG_LEVEL = logging.INFO
|
_LOG_LEVEL = logging.INFO
|
||||||
@ -66,42 +66,6 @@ ROTATING_TIMED_LOGGER_INTERVAL_WHEN = TimedLogWhen.PER_MINUTE
|
|||||||
ROTATING_TIMED_LOGGER_INTERVAL = 30
|
ROTATING_TIMED_LOGGER_INTERVAL = 30
|
||||||
|
|
||||||
|
|
||||||
class PusHandler(SpecificApidHandlerBase):
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
wrapper: VerificationWrapper,
|
|
||||||
printer: FsfwTmTcPrinter,
|
|
||||||
raw_logger: RawTmtcTimedLogWrapper,
|
|
||||||
hk_level: int,
|
|
||||||
):
|
|
||||||
super().__init__(PUS_APID, None)
|
|
||||||
self.printer = printer
|
|
||||||
self.verif_wrapper = wrapper
|
|
||||||
self.raw_logger = raw_logger
|
|
||||||
self.hk_level = hk_level
|
|
||||||
self.these_objs_hk_only = []
|
|
||||||
self.hk_filter = HkFilter(object_ids=self.these_objs_hk_only, set_ids=[])
|
|
||||||
|
|
||||||
def handle_tm(self, packet: bytes, _user_args: any):
|
|
||||||
# with open("tc.bin", "wb") as of:
|
|
||||||
# of.write(packet)
|
|
||||||
pus_factory_hook(
|
|
||||||
packet,
|
|
||||||
self.verif_wrapper,
|
|
||||||
self.printer,
|
|
||||||
self.raw_logger,
|
|
||||||
self.hk_level,
|
|
||||||
self.hk_filter,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class UnknownApidHandler(GenericApidHandlerBase):
|
|
||||||
def handle_tm(self, apid: int, packet: bytes, _user_args: any):
|
|
||||||
_LOGGER.warning(
|
|
||||||
f"Packet with unknown APID {apid} detected: {packet.hex(sep=',')}"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class CustomCcsdsTmHandler(CcsdsTmHandler):
|
class CustomCcsdsTmHandler(CcsdsTmHandler):
|
||||||
def user_hook(self, apid: int, packet: bytes):
|
def user_hook(self, apid: int, packet: bytes):
|
||||||
_LOGGER.debug(f"Received packet {packet.hex(sep=',')} with APID {apid}")
|
_LOGGER.debug(f"Received packet {packet.hex(sep=',')} with APID {apid}")
|
||||||
@ -133,6 +97,9 @@ def setup_params() -> Tuple[SetupWrapper, int]:
|
|||||||
hk_level = int(post_arg_parsing_wrapper.args_raw.hk)
|
hk_level = int(post_arg_parsing_wrapper.args_raw.hk)
|
||||||
else:
|
else:
|
||||||
hk_level = 0
|
hk_level = 0
|
||||||
|
if params.app_params.print_tree:
|
||||||
|
perform_tree_printout(params.app_params, hook_obj.get_command_definitions())
|
||||||
|
sys.exit(0)
|
||||||
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.")
|
||||||
@ -205,6 +172,7 @@ def setup_tmtc_handlers(
|
|||||||
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)
|
||||||
seq_count_provider = PusFileSeqCountProvider()
|
seq_count_provider = PusFileSeqCountProvider()
|
||||||
|
assert printer.file_logger is not None
|
||||||
tc_handler = TcHandler(
|
tc_handler = TcHandler(
|
||||||
seq_count_provider=seq_count_provider,
|
seq_count_provider=seq_count_provider,
|
||||||
pus_verificator=verificator,
|
pus_verificator=verificator,
|
||||||
|
Loading…
Reference in New Issue
Block a user