v6.0.0-dev #269

Merged
meggert merged 56 commits from v6.0.0-dev into main 2024-02-06 10:28:29 +01:00
65 changed files with 2632 additions and 1690 deletions

5
.gitignore vendored
View File

@ -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

View File

@ -10,10 +10,16 @@ list yields a list of all related PRs for each release.
# [unreleased] # [unreleased]
## Changed
- Bumped `tmccmd` to `v8.0.0rc1` to introduce new command tree handling.
# [v5.13.0] 2024-01-30 # [v5.13.0] 2024-01-30
## Added ## 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. - Added new parameter commands for PLOC MPSoC to skip SUPV commanding.
# [v5.12.1] 2023-12-13 # [v5.12.1] 2023-12-13

View File

@ -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}")

View File

@ -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

View File

@ -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__)

View File

@ -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

View File

@ -0,0 +1 @@
from .definitions import * # noqa

View File

@ -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)

View File

@ -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")

View File

@ -0,0 +1,304 @@
"""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.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.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()
if len(cmd_path_list) == 1:
return pack_power_commands(queue_helper, cmd_path_list[0])
assert len(cmd_path_list) >= 2
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) >= 3
if cmd_path_list[1] == "rw_assy":
assert len(cmd_path_list) >= 4
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) >= 4
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) >= 4
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) >= 4
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) >= 4
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()
assert len(cmd_path_list) >= 2
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":
assert len(cmd_path_list) >= 3
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])
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]
)

View File

@ -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}")

View File

@ -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(

View File

@ -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")

21
eive_tmtc/pus_tm/hk.py Normal file
View 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

View File

@ -1,7 +1,10 @@
"""HK Handling for EIVE OBSW""" """HK Handling for EIVE OBSW"""
import dataclasses import dataclasses
import logging import logging
from typing import List 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 +20,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
@ -57,13 +58,15 @@ class HkFilter:
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:
@ -72,10 +75,11 @@ def handle_hk_packet(
if named_obj_id in hk_filter.object_ids: if named_obj_id in hk_filter.object_ids:
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 +90,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 +105,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 +144,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:

View File

@ -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)

View File

@ -0,0 +1,210 @@
"""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=',')}"
)

View File

@ -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

View File

@ -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

View File

@ -8,6 +8,7 @@ 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, OpCodeEntry,
TmtcDefinitionWrapper, TmtcDefinitionWrapper,
tmtc_definitions_provider, tmtc_definitions_provider,
@ -34,8 +35,6 @@ 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.definitions import CustomServiceList
@ -169,6 +168,21 @@ if PERFORM_MGM_CALIBRATION:
CALIBR_SOCKET.connect(CALIBRATION_ADDR) CALIBR_SOCKET.connect(CALIBRATION_ADDR)
def create_acs_ctrl_node() -> CmdTreeNode:
# Zip the two classes together into a dictionary
op_code_strs = [
getattr(OpCodes, key) for key in dir(OpCodes) if not key.startswith("__")
]
info_strs = [getattr(Info, key) for key in dir(OpCodes) if not key.startswith("__")]
combined_dict = dict(zip(op_code_strs, info_strs))
acs_ctrl = CmdTreeNode(
"acs_ctrl", "ACS Controller", hide_children_which_are_leaves=True
)
for op_code, info in combined_dict.items():
acs_ctrl.add_child(CmdTreeNode(op_code, info))
return acs_ctrl
@tmtc_definitions_provider @tmtc_definitions_provider
def acs_cmd_defs(defs: TmtcDefinitionWrapper): def acs_cmd_defs(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry() oce = OpCodeEntry()
@ -199,54 +213,51 @@ def acs_cmd_defs(defs: TmtcDefinitionWrapper):
) )
@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 +273,38 @@ 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 in OpCodes.SET_PARAMETER_SCALAR:
q.add_log_cmd(f"{Info.READ_TLE}")
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.READ_TLE))
elif op_code == 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 in 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 in 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.READ_TLE:
q.add_log_cmd(f"{Info.READ_TLE}")
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.READ_TLE))
elif cmd_str == OpCodes.SET_PARAMETER_SCALAR:
q.add_log_cmd(f"{Info.SET_PARAMETER_SCALAR}")
set_acs_ctrl_param_scalar(q)
elif cmd_str == OpCodes.SET_PARAMETER_VECTOR:
q.add_log_cmd(f"{Info.SET_PARAMETER_VECTOR}")
set_acs_ctrl_param_vector(q)
elif cmd_str == OpCodes.SET_PARAMETER_MATRIX:
q.add_log_cmd(f"{Info.SET_PARAMETER_MATRIX}")
set_acs_ctrl_param_matrix(q)
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 +448,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 +641,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 +1144,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())

View File

@ -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 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.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
@ -27,13 +27,13 @@ class GpsInfo:
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,6 +53,18 @@ class SetId(enum.IntEnum):
SKYVIEW_HK = 1 SKYVIEW_HK = 1
def create_gnss_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("gnss", "GNSS 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_gps_cmds(defs: TmtcDefinitionWrapper): def add_gps_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry() oce = OpCodeEntry()
@ -73,12 +85,12 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper):
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 # TODO: This needs to be re-implemented
_LOGGER.warning("Reset pin handling needs to be re-implemented") _LOGGER.warning("Reset pin handling needs to be re-implemented")
if op_code in OpCode.ENABLE_CORE_HK: if 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 +102,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 +128,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))

View File

@ -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()

View File

@ -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(

View File

@ -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()

View File

@ -10,7 +10,7 @@ from typing import List
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, 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
from tmtccmd.pus.tc.s3_fsfw_hk import ( from tmtccmd.pus.tc.s3_fsfw_hk import (
@ -53,11 +53,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,6 +99,41 @@ class RampTime:
MS_1000 = 1000 MS_1000 = 1000
def create_reaction_wheels_nodes() -> List[CmdTreeNode]:
nodes = []
for i in range(4):
next_node = CmdTreeNode(
f"rw_{i}", f"Reaction Wheel {i}", hide_children_which_are_leaves=True
)
next_node.add_child(CmdTreeNode(InfoDev.SPEED, OpCodesDev.SPEED))
next_node.add_child(CmdTreeNode(InfoDev.ON, OpCodesDev.ON))
next_node.add_child(CmdTreeNode(InfoDev.OFF, OpCodesDev.OFF))
next_node.add_child(CmdTreeNode(InfoDev.NML, OpCodesDev.NML))
next_node.add_child(CmdTreeNode(InfoDev.REQ_TM, OpCodesDev.REQ_TM))
next_node.add_child(CmdTreeNode(InfoDev.GET_STATUS, OpCodesDev.GET_STATUS))
next_node.add_child(CmdTreeNode(InfoDev.GET_TM, OpCodesDev.GET_TM))
next_node.add_child(
CmdTreeNode(InfoDev.ENABLE_STATUS_HK, OpCodesDev.ENABLE_STATUS_HK)
)
next_node.add_child(
CmdTreeNode(InfoDev.DISABLE_STATUS_HK, OpCodesDev.DISABLE_STATUS_HK)
)
nodes.append(next_node)
return nodes
def create_reaction_wheel_assembly_node() -> CmdTreeNode:
node = CmdTreeNode(
"rw_assy", "Reaction Wheels Assembly", hide_children_which_are_leaves=True
)
node.add_child(CmdTreeNode(InfoAss.ON, OpCodesAss.ON))
node.add_child(CmdTreeNode(InfoAss.NML, OpCodesAss.NML))
node.add_child(CmdTreeNode(InfoAss.OFF, OpCodesAss.OFF))
node.add_child(CmdTreeNode(InfoAss.ALL_SPEED_UP, OpCodesAss.ALL_SPEED_UP))
node.add_child(CmdTreeNode(InfoAss.ALL_SPEED_OFF, OpCodesAss.ALL_SPEED_OFF))
return node
@tmtc_definitions_provider @tmtc_definitions_provider
def add_rw_cmds(defs: TmtcDefinitionWrapper): def add_rw_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry() oce = OpCodeEntry()
@ -144,10 +179,10 @@ def add_rw_cmds(defs: TmtcDefinitionWrapper):
) )
def pack_single_rw_test_into( # noqa C901: Complexity is okay here. def create_single_rw_cmd( # noqa C901: Complexity is okay here.
object_id: bytes, rw_idx: int, q: DefaultPusQueueHelper, op_code: str 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 +190,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 +232,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,32 +241,32 @@ 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()
) )

View File

@ -14,7 +14,7 @@ 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, TmtcDefinitionWrapper, OpCodeEntry
from tmtccmd.config.tmtc import tmtc_definitions_provider 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,
@ -241,68 +241,68 @@ 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 == "8":
q.add_log_cmd("Star tracker: Request version") q.add_log_cmd("Star tracker: Request version")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_VERSION) data = obyt + struct.pack("!I", StarTrackerActionId.REQ_VERSION)
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 == "9": if cmd_str == "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 +311,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 +328,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 +339,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 +348,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 +357,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 +366,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 +375,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 +384,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 +393,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 +402,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 +411,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 +420,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 +431,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 +444,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 +461,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 +474,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 +491,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 +500,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 +509,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 +520,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 +529,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 +550,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 +558,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 +566,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 +623,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 +633,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,7 +642,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.FW_UPDATE: if cmd_str == OpCode.FW_UPDATE:
q.add_log_cmd(Info.FW_UPDATE) q.add_log_cmd(Info.FW_UPDATE)
firmware = get_firmware() firmware = get_firmware()
data = ( data = (
@ -651,7 +651,7 @@ def pack_star_tracker_commands( # noqa C901
+ 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.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 +663,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,14 +671,14 @@ 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)
@ -1155,6 +1155,43 @@ 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}")
def create_str_node() -> CmdTreeNode:
node = CmdTreeNode(
"str", "Star Tracker Device", hide_children_which_are_leaves=True
)
node.add_child(CmdTreeNode(OpCode.ON_BOOTLOADER, "Mode On, Submode Bootloader"))
node.add_child(CmdTreeNode(OpCode.ON_FIRMWARE, "Mode On, Submode Firmware"))
node.add_child(CmdTreeNode(OpCode.NORMAL, "Mode Normal"))
node.add_child(CmdTreeNode(OpCode.OFF, "Mode Off"))
node.add_child(CmdTreeNode(OpCode.PING, "Star Tracker: Ping"))
node.add_child(CmdTreeNode(OpCode.TAKE_IMAGE, "Take Image"))
node.add_child(CmdTreeNode(OpCode.UPLOAD_IMAGE, Info.UPLOAD_IMAGE))
node.add_child(CmdTreeNode(OpCode.DOWNLOAD_IMAGE, Info.DOWNLOAD_IMAGE))
node.add_child(CmdTreeNode(OpCode.ONE_SHOOT_HK, Info.ONE_SHOOT_HK))
node.add_child(CmdTreeNode(OpCode.ENABLE_HK, Info.ENABLE_HK))
node.add_child(CmdTreeNode(OpCode.DISABLE_HK, Info.DISABLE_HK))
node.add_child(
CmdTreeNode(OpCode.SET_IMG_PROCESSOR_MODE, Info.SET_IMG_PROCESSOR_MODE)
)
node.add_child(
CmdTreeNode(
OpCode.ADD_SECONDARY_TM_TO_NORMAL_MODE,
Info.ADD_SECONDARY_TM_TO_NORMAL_MODE,
)
)
node.add_child(
CmdTreeNode(OpCode.READ_SECONDARY_TM_SET, Info.READ_SECONDARY_TM_SET)
)
node.add_child(
CmdTreeNode(OpCode.RESET_SECONDARY_TM_SET, Info.RESET_SECONDARY_TM_SET)
)
node.add_child(CmdTreeNode(OpCode.FW_UPDATE, Info.FW_UPDATE))
node.add_child(
CmdTreeNode(OpCode.SET_TIME_FROM_SYS_TIME, Info.SET_TIME_FROM_SYS_TIME)
)
return node
@tmtc_definitions_provider @tmtc_definitions_provider
def add_str_cmds(defs: TmtcDefinitionWrapper): def add_str_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry() oce = OpCodeEntry()

View File

@ -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)

View File

@ -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

View File

@ -1 +0,0 @@
from .subsystem import add_com_subsystem_cmds

View File

@ -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()

View File

@ -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)

View File

@ -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)

View File

@ -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()

View File

@ -6,20 +6,21 @@ from pathlib import Path
from typing import Tuple from typing import Tuple
from spacepackets.ecss import PusTelecommand from spacepackets.ecss import PusTelecommand
from tmtccmd.config import TmtcDefinitionWrapper from tmtccmd.config import CmdTreeNode, TmtcDefinitionWrapper
from tmtccmd.tmtc import DefaultPusQueueHelper
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
from tmtccmd.pus.tc.s3_fsfw_hk import make_sid, generate_one_hk_command
from tmtccmd.pus.s20_fsfw_param import (
create_scalar_u8_parameter,
create_load_param_cmd,
)
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider from tmtccmd.config.tmtc import OpCodeEntry, 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.s11_tc_sched import ( from tmtccmd.pus.s11_tc_sched import (
create_enable_tc_sched_cmd, create_enable_tc_sched_cmd,
create_disable_tc_sched_cmd, create_disable_tc_sched_cmd,
) )
from tmtccmd.pus.s20_fsfw_param import (
create_load_param_cmd,
create_scalar_u8_parameter,
)
from tmtccmd.pus.tc.s3_fsfw_hk import generate_one_hk_command, make_sid
from tmtccmd.tmtc import DefaultPusQueueHelper
from eive_tmtc.config.definitions import CustomServiceList from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID
@ -94,20 +95,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"
@ -133,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"
@ -146,6 +152,15 @@ 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" ENABLE_SCHEDULER = "Enable scheduler"
@ -170,6 +185,18 @@ class SystemctlCmd(enum.IntEnum):
RESTART = 2 RESTART = 2
def create_core_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("core", "Core Controller", 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_core_controller_definitions(defs: TmtcDefinitionWrapper): def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry() oce = OpCodeEntry()
@ -255,22 +282,22 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
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,
@ -278,16 +305,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}")
@ -296,7 +323,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(
@ -305,7 +332,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(
@ -314,29 +341,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(
@ -344,7 +371,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(
@ -354,7 +381,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(
@ -364,7 +391,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(
@ -372,15 +399,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")
@ -391,16 +418,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])
@ -409,26 +436,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]:
@ -442,11 +469,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): ")
@ -463,7 +490,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")
@ -476,13 +503,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")
@ -497,7 +524,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: ")
@ -508,7 +535,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(
@ -516,7 +543,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())
@ -524,15 +551,15 @@ 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 op_code == OpCode.ENABLE_SCHEDULER: elif cmd_str == OpCode.ENABLE_SCHEDULER:
q.add_log_cmd(Info.ENABLE_SCHEDULER) q.add_log_cmd(Info.ENABLE_SCHEDULER)
q.add_pus_tc(create_enable_tc_sched_cmd()) q.add_pus_tc(create_enable_tc_sched_cmd())
elif op_code == OpCode.DISABLE_SCHEDULER: elif cmd_str == OpCode.DISABLE_SCHEDULER:
q.add_log_cmd(Info.DISABLE_SCHEDULER) q.add_log_cmd(Info.DISABLE_SCHEDULER)
q.add_pus_tc(create_disable_tc_sched_cmd()) q.add_pus_tc(create_disable_tc_sched_cmd())
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"
) )

View File

@ -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

View File

@ -15,13 +15,13 @@ 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.s20_fsfw_param import create_load_param_cmd, create_scalar_u8_parameter
@ -95,7 +95,7 @@ class ActionId(enum.IntEnum):
class ParamId(enum.IntEnum): class ParamId(enum.IntEnum):
PLOC_SUPV_CMD_TO_ON = 1 PLOC_SUPV_SKIP_CMD_TO_ON = 1
class OpCode: class OpCode:
@ -135,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"
@ -154,6 +156,19 @@ 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()
@ -192,32 +207,29 @@ def add_ploc_mpsoc_cmds(defs: TmtcDefinitionWrapper):
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)
assert object_id is not None assert object_id is not None
q = p.queue_helper
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
@ -229,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"))
@ -273,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 = (
@ -291,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 = (
@ -308,45 +316,45 @@ 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 op_code == OpCode.ENABLE_PLOC_SUPV_COMMANDING_TO_ON: if cmd_str == OpCode.ENABLE_PLOC_SUPV_COMMANDING_TO_ON:
q.add_log_cmd(Info.ENABLE_PLOC_SUPV_COMMANDING_TO_ON) q.add_log_cmd(Info.ENABLE_PLOC_SUPV_COMMANDING_TO_ON)
q.add_pus_tc( q.add_pus_tc(
create_load_param_cmd( create_load_param_cmd(
create_scalar_u8_parameter( create_scalar_u8_parameter(
object_id.as_bytes, 0, ParamId.PLOC_SUPV_CMD_TO_ON, 0 object_id.as_bytes, 0, ParamId.PLOC_SUPV_SKIP_CMD_TO_ON, 0
) )
) )
) )
if op_code == OpCode.DISABLE_PLOC_SUPV_COMMANDING_TO_ON: if cmd_str == OpCode.DISABLE_PLOC_SUPV_COMMANDING_TO_ON:
q.add_log_cmd(Info.DISABLE_PLOC_SUPV_COMMANDING_TO_ON) q.add_log_cmd(Info.DISABLE_PLOC_SUPV_COMMANDING_TO_ON)
q.add_pus_tc( q.add_pus_tc(
create_load_param_cmd( create_load_param_cmd(
create_scalar_u8_parameter( create_scalar_u8_parameter(
object_id.as_bytes, 0, ParamId.PLOC_SUPV_CMD_TO_ON, 1 object_id.as_bytes, 0, ParamId.PLOC_SUPV_SKIP_CMD_TO_ON, 1
) )
) )
) )
@ -711,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 = []

View File

@ -10,19 +10,15 @@ 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 +38,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"),
} }
@ -149,11 +145,12 @@ class OpCode:
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"
START_MPSOC = "Start MPSoC"
SHUTDOWN_MPSOC = "Shutdown MPSoC"
REQUEST_HK_SET_FROM_DEV = "Request HK set from the device to the PLOC Handler" REQUEST_HK_SET_FROM_DEV = "Request HK set from the device to the PLOC Handler"
REQUEST_HK_SET = "Request HK set from PLOC Handler" REQUEST_HK_SET = "Request HK set from PLOC Handler"
SET_TIME_REF = "Set time reference" SET_TIME_REF = "Set time reference"
@ -167,89 +164,54 @@ class Info(str, enum.Enum):
RESET_MPSOC = "Reset MPSoC" RESET_MPSOC = "Reset MPSoC"
@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: elif cmd_str == OpCode.START_MPSOC:
q.add_log_cmd("PLOC Supervisor: Start MPSoC")
command = obyt + struct.pack("!I", SupvActionId.START_MPSOC)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
if cmd_str == OpCode.SHUTDOWN_MPSOC:
q.add_log_cmd("PLOC Supervisor: Shutdown MPSoC")
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.REQUEST_HK_SET:
q.add_log_cmd(f"{prefix}: {Info.REQUEST_HK_SET}") q.add_log_cmd(f"{prefix}: {Info.REQUEST_HK_SET}")
sid = make_sid(object_id.as_bytes, prompt_set_id()) sid = make_sid(object_id.as_bytes, prompt_set_id())
cmd = generate_one_hk_command(sid) cmd = generate_one_hk_command(sid)
q.add_pus_tc(cmd) q.add_pus_tc(cmd)
if op_code == OpCode.REQUEST_HK_SET_FROM_DEV: if cmd_str == OpCode.REQUEST_HK_SET_FROM_DEV:
q.add_log_cmd(f"{prefix}: {Info.REQUEST_HK_SET_FROM_DEV}") q.add_log_cmd(f"{prefix}: {Info.REQUEST_HK_SET_FROM_DEV}")
set_id = prompt_set_id() set_id = prompt_set_id()
action_cmd = None action_cmd = None
@ -265,15 +227,15 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
) )
assert action_cmd is not None assert action_cmd is not None
q.add_pus_tc(action_cmd) q.add_pus_tc(action_cmd)
elif op_code == OpCode.START_MPSOC: 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 +243,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 +260,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 +269,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,11 +286,11 @@ 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 == "12":
q.add_log_cmd("PLOC Supervisor: Disable HK") q.add_log_cmd("PLOC Supervisor: Disable HK")
command = object_id.as_bytes + struct.pack("!I", SupvActionId.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)) q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
if op_code in OpCode.REQ_BOOT_STATUS_REPORT: if cmd_str in OpCode.REQ_BOOT_STATUS_REPORT:
q.add_log_cmd(f"{prefix}: {Info.REQ_BOOT_STATUS_REPORT}") q.add_log_cmd(f"{prefix}: {Info.REQ_BOOT_STATUS_REPORT}")
command = object_id.as_bytes + struct.pack( command = object_id.as_bytes + struct.pack(
"!I", SupvActionId.GET_BOOT_STATUS_REPORT "!I", SupvActionId.GET_BOOT_STATUS_REPORT
@ -338,129 +300,129 @@ def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
sid = make_sid(object_id.as_bytes, SetId.BOOT_STATUS_REPORT) sid = make_sid(object_id.as_bytes, SetId.BOOT_STATUS_REPORT)
req_hk = generate_one_hk_command(sid) req_hk = generate_one_hk_command(sid)
q.add_pus_tc(req_hk) q.add_pus_tc(req_hk)
if op_code == "17": if cmd_str == "17":
q.add_log_cmd("PLOC Supervisor: Enable latchup alert") q.add_log_cmd("PLOC Supervisor: Enable latchup alert")
command = pack_lachtup_alert_cmd(object_id.as_bytes, True) command = pack_lachtup_alert_cmd(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 == "18": if cmd_str == "18":
q.add_log_cmd("PLOC Supervisor: Disable latchup alert") q.add_log_cmd("PLOC Supervisor: Disable latchup alert")
command = pack_lachtup_alert_cmd(object_id.as_bytes, False) command = pack_lachtup_alert_cmd(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 == "20": if cmd_str == "20":
q.add_log_cmd("PLOC Supervisor: Set alert limit") q.add_log_cmd("PLOC Supervisor: Set alert limit")
command = pack_set_alert_limit_cmd(object_id.as_bytes) command = pack_set_alert_limit_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 == "23": if cmd_str == "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 == "26":
q.add_log_cmd("PLOC Supervisor: Request latchup status report") q.add_log_cmd("PLOC Supervisor: Request latchup status report")
command = object_id.as_bytes + struct.pack( command = object_id.as_bytes + struct.pack(
"!I", SupvActionId.GET_LATCHUP_STATUS_REPORT "!I", SupvActionId.GET_LATCHUP_STATUS_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 == "27": if cmd_str == "27":
q.add_log_cmd("PLOC Supervisor: Copy ADC data to MRAM") q.add_log_cmd("PLOC Supervisor: Copy ADC data to MRAM")
command = object_id.as_bytes + struct.pack( command = object_id.as_bytes + struct.pack(
"!I", SupvActionId.COPY_ADC_DATA_TO_MRAM "!I", SupvActionId.COPY_ADC_DATA_TO_MRAM
) )
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 == "30": if cmd_str == "30":
q.add_log_cmd("PLOC Supervisor: Run auto EM tests") q.add_log_cmd("PLOC Supervisor: Run auto EM tests")
command = pack_auto_em_tests_cmd(object_id.as_bytes) command = pack_auto_em_tests_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 == "31": if cmd_str == "31":
q.add_log_cmd("PLOC Supervisor: Wipe MRAM") q.add_log_cmd("PLOC Supervisor: Wipe MRAM")
command = pack_mram_wipe_cmd(object_id.as_bytes) command = pack_mram_wipe_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 == "35": if cmd_str == "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 == "36":
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 == "47":
q.add_log_cmd("PLOC Supervisor: Enable auto TM") q.add_log_cmd("PLOC Supervisor: Enable auto TM")
command = object_id.as_bytes + struct.pack("!I", SupvActionId.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)) q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
if op_code == "48": if cmd_str == "48":
q.add_log_cmd("PLOC Supervisor: Disable auto TM") q.add_log_cmd("PLOC Supervisor: Disable auto TM")
command = object_id.as_bytes + struct.pack("!I", SupvActionId.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)) q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
if op_code == "51": if cmd_str == "51":
q.add_log_cmd("PLOC Supervisor: Logging request event buffers") q.add_log_cmd("PLOC Supervisor: Logging request event buffers")
command = pack_logging_buffer_request(object_id.as_bytes) command = pack_logging_buffer_request(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 == "52": if cmd_str == "52":
q.add_log_cmd("PLOC Supervisor: Logging clear counters") q.add_log_cmd("PLOC Supervisor: Logging clear counters")
command = object_id.as_bytes + struct.pack( command = object_id.as_bytes + struct.pack(
"!I", SupvActionId.LOGGING_CLEAR_COUNTERS "!I", SupvActionId.LOGGING_CLEAR_COUNTERS
) )
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 == "53": if cmd_str == "53":
q.add_log_cmd("PLOC Supervisor: Logging set topic") q.add_log_cmd("PLOC Supervisor: Logging set topic")
command = pack_logging_set_topic(object_id.as_bytes) command = pack_logging_set_topic(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 == "54": if cmd_str == "54":
q.add_log_cmd("PLOC Supervisor: Logging request counters") q.add_log_cmd("PLOC Supervisor: Logging request counters")
command = object_id.as_bytes + struct.pack( command = object_id.as_bytes + struct.pack(
"!I", SupvActionId.REQUEST_LOGGING_COUNTERS "!I", SupvActionId.REQUEST_LOGGING_COUNTERS
) )
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 == "55": if cmd_str == "55":
q.add_log_cmd("PLOC Supervisor: Request ADC report") q.add_log_cmd("PLOC Supervisor: Request ADC report")
command = object_id.as_bytes + struct.pack( command = object_id.as_bytes + struct.pack(
"!I", SupvActionId.REQUEST_ADC_REPORT "!I", SupvActionId.REQUEST_ADC_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 == "56": if cmd_str == "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 +433,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: "))

View File

@ -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,

View File

@ -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))

View File

@ -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))

View File

@ -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
@ -36,12 +33,9 @@ HANDLER_LIST: Dict[str, Tuple[int, str]] = {
} }
@service_provider(CustomServiceList.PL_SS) def build_acs_subsystem_cmd(q: DefaultPusQueueHelper, cmd_str: 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_str == 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,7 +44,7 @@ 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)
if mode_info_tup is None: if mode_info_tup is None:
return return
pack_mode_cmd_with_info( pack_mode_cmd_with_info(
@ -62,9 +56,8 @@ def build_acs_subsystem_cmd(p: ServiceProviderParams):
) )
@tmtc_definitions_provider def create_payload_subsystem_node() -> CmdTreeNode:
def add_payload_subsystem_cmds(defs: TmtcDefinitionWrapper): payload_node = CmdTreeNode("payload", "Payload Subsystem")
oce = OpCodeEntry() payload_node.add_child(CmdTreeNode(OpCode.OFF, Info.OFF))
oce.add(OpCode.OFF, Info.OFF) payload_node.add_child(CmdTreeNode(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES))
oce.add(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES) return payload_node
defs.add_service(CustomServiceList.PL_SS, "Payload Subsystem", oce)

View File

@ -1,2 +0,0 @@
from .subsystem import add_eps_subsystem_cmds
from .pwr_ctrl import pwr_cmd_defs

View File

@ -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)

View File

@ -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(

View File

@ -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,

View File

@ -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])

View File

@ -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,

View File

@ -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)

View File

@ -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()

View File

@ -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(

View File

@ -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)

View File

@ -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):

View File

@ -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)

View File

@ -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()

View File

@ -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",

View File

@ -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("heater", "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(

View File

@ -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))

View File

@ -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

View File

@ -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)

View File

@ -1,21 +1,15 @@
import struct
import datetime import datetime
import math import math
import struct
from spacepackets.ecss import PusService, PusTelecommand from spacepackets.ecss import PusService, PusTelecommand
from tmtccmd.config import CoreServiceList from tmtccmd.config import CmdTreeNode
from tmtccmd.config.tmtc import (
OpCodeEntry,
TmtcDefinitionWrapper,
tmtc_definitions_provider,
)
from tmtccmd.pus.s11_tc_sched import create_time_tagged_cmd 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"
@ -29,32 +23,23 @@ class Info:
SCHEDULE_PING = "Schedule a ping" 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))
oce.add(keys=OpCodes.SCHEDULE_PING, info=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.SCHEDULE_PING: if cmd_path == OpCode.SCHEDULE_PING:
q.add_log_cmd("Sending scheduled PUS 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 # 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) now = datetime.datetime.now(tz=datetime.timezone.utc)
@ -69,7 +54,7 @@ def pack_test_command(p: ServiceProviderParams):
tc_to_insert=ping, tc_to_insert=ping,
) )
) )
if info.op_code == OpCodes.PING_WITH_DATA: 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]: "))
@ -78,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(

View File

@ -2,16 +2,10 @@ import enum
import logging import logging
from datetime import datetime from 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
class Subservice(enum.IntEnum): class Subservice(enum.IntEnum):
@ -19,9 +13,9 @@ class Subservice(enum.IntEnum):
DUMP_TIME = 129 DUMP_TIME = 129
class OpCode: class CmdStr:
SET_CURRENT_TIME = ["set_curr_time"] SET_CURRENT_TIME = "set_curr_time"
DUMP_TIME = ["dump_time"] DUMP_TIME = "dump_time"
class Info: class Info:
@ -29,11 +23,8 @@ class Info:
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
o = p.op_code
if o in OpCode.SET_CURRENT_TIME:
current_time = datetime.utcnow().isoformat() + "Z" + "\0" current_time = datetime.utcnow().isoformat() + "Z" + "\0"
current_time_ascii = current_time.encode("ascii") current_time_ascii = current_time.encode("ascii")
logging.getLogger(__name__).info( logging.getLogger(__name__).info(
@ -47,7 +38,7 @@ 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.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 +47,8 @@ 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, return time_node
info=Info.SET_CURRENT_TIME,
)
oce.add(keys=OpCode.DUMP_TIME, info=Info.DUMP_TIME)
defs.add_service(
name=CustomServiceList.TIME.value,
info="Time Service",
op_code_entry=oce,
)

View File

@ -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,15 @@ 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.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 +163,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 +210,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]

View File

@ -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()

View File

@ -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]

View File

@ -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,