diff --git a/eive_tmtc/pus_tm/action_reply_handler.py b/eive_tmtc/pus_tm/action_reply_handler.py index a5051dc..9ce56eb 100644 --- a/eive_tmtc/pus_tm/action_reply_handler.py +++ b/eive_tmtc/pus_tm/action_reply_handler.py @@ -2,6 +2,7 @@ import logging import struct from spacepackets.ecss import PusTm +from tmtccmd.pus.s8_fsfw_action_defs import CustomSubservice from eive_tmtc.config.object_ids import ( ACU_HANDLER_ID, PDU_1_HANDLER_ID, @@ -22,59 +23,74 @@ from eive_tmtc.tmtc.payload.ploc_supervisor import SupvActionId from eive_tmtc.tmtc.acs.star_tracker import handle_star_tracker_action_replies from eive_tmtc.tmtc.acs.acs_ctrl import handle_acs_ctrl_action_replies from eive_tmtc.tmtc.power.tm import handle_get_param_data_reply -from tmtccmd.pus.s8_fsfw_action import Service8FsfwTm -from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter from spacepackets.ccsds.time import CdsShortTimestamp -from tmtccmd.util import ObjectIdDictT +from tmtccmd.util import ObjectIdBase, ObjectIdDictT, ObjectIdU32 _LOGGER = logging.getLogger(__name__) -def handle_action_reply( - raw_tm: bytes, printer: FsfwTmTcPrinter, obj_id_dict: ObjectIdDictT +_LOGGER = logging.getLogger(__name__) + + +def handle_action_service_tm( + raw_tm: bytes, pw: PrintWrapper, obj_id_dict: ObjectIdDictT ): """Core Action reply handler :return: """ tm_packet = PusTm.unpack(raw_tm, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE) - pw = PrintWrapper(printer.file_logger) if len(tm_packet.source_data) < 8: - _LOGGER.warn( - "invalid TM packet length for PUS 8 reply, must have at least 8 bytes" + _LOGGER.warning( + "received action service reply with source data smaller than 8 bytes" ) return object_id_raw = struct.unpack("!I", tm_packet.source_data[0:4])[0] action_id = struct.unpack("!I", tm_packet.source_data[4:8])[0] + object_id = obj_id_dict.get(object_id_raw) custom_data = tm_packet.source_data[8:] - generic_print_str = printer.generic_action_packet_tm_print( - packet=tm_packet, obj_id=object_id - ) - pw.dlog(generic_print_str) - if object_id.as_bytes == IMTQ_HANDLER_ID: - return handle_imtq_replies(action_id, pw, custom_data) - elif object_id.as_bytes == PLOC_MPSOC_ID: - return handle_mpsoc_data_reply(action_id, pw, custom_data) - elif object_id.as_bytes == PLOC_SUPV_ID: - return handle_supervisor_replies(action_id, pw, custom_data) - elif object_id.as_bytes == CORE_CONTROLLER_ID: - return handle_core_ctrl_action_replies(action_id, pw, custom_data) - elif object_id.as_bytes == STAR_TRACKER_ID: - return handle_star_tracker_action_replies(action_id, pw, custom_data) - elif object_id.as_bytes == ACS_CONTROLLER: - return handle_acs_ctrl_action_replies(action_id, pw, custom_data) - elif object_id.as_bytes in [ - ACU_HANDLER_ID, - PDU_1_HANDLER_ID, - PDU_2_HANDLER_ID, - P60_DOCK_HANDLER, - ]: - return handle_get_param_data_reply(object_id, action_id, pw, custom_data) + if object_id is None: + object_id = ObjectIdU32(object_id_raw, "Unknown ID") + if tm_packet.subservice == CustomSubservice.TM_DATA_REPLY: + if object_id.as_bytes == IMTQ_HANDLER_ID: + return handle_imtq_replies(action_id, pw, custom_data) + elif object_id.as_bytes == PLOC_MPSOC_ID: + return handle_mpsoc_data_reply(action_id, pw, custom_data) + elif object_id.as_bytes == PLOC_SUPV_ID: + return handle_supervisor_replies(action_id, pw, custom_data) + elif object_id.as_bytes == CORE_CONTROLLER_ID: + return handle_core_ctrl_action_replies(action_id, pw, custom_data) + elif object_id.as_bytes == STAR_TRACKER_ID: + return handle_star_tracker_action_replies(action_id, pw, custom_data) + elif object_id.as_bytes == ACS_CONTROLLER: + return handle_acs_ctrl_action_replies(action_id, pw, custom_data) + elif object_id.as_bytes in [ + ACU_HANDLER_ID, + PDU_1_HANDLER_ID, + PDU_2_HANDLER_ID, + P60_DOCK_HANDLER, + ]: + return handle_get_param_data_reply(object_id, action_id, pw, custom_data) + else: + # TODO: Could add a handler here depending on action ID and object ID. + handle_action_data_reply(tm_packet, object_id, action_id, pw) else: - pw.dlog(f"No dedicated action reply handler found for reply from {object_id}") - pw.dlog(f"Raw Data: {tm_packet.custom_data.hex(sep=',')}") + pw.dlog( + f"service 8 packet from {object_id} with action ID {action_id} " + f"and unknown subservice {tm_packet.subservice}" + ) -def handle_imtq_replies(action_id: int, pw: PrintWrapper, custom_data: bytearray): +def handle_action_data_reply( + tm_packet: PusTm, named_obj_id: ObjectIdBase, action_id: int, printer: PrintWrapper +): + print_string = ( + f"service 8 data reply from {named_obj_id} with action ID {action_id} " + f"and data size {len(tm_packet.tm_data[8:])}" + ) + printer.dlog(print_string) + + +def handle_imtq_replies(action_id: int, pw: PrintWrapper, custom_data: bytes): if action_id == struct.unpack("!I", ImtqActionId.get_commanded_dipole)[0]: header_list = [ "Commanded X-Dipole", @@ -87,7 +103,7 @@ def handle_imtq_replies(action_id: int, pw: PrintWrapper, custom_data: bytearray pw.dlog(f"{content_list}") -def handle_supervisor_replies(action_id: int, pw: PrintWrapper, custom_data: bytearray): +def handle_supervisor_replies(action_id: int, pw: PrintWrapper, custom_data: bytes): if action_id == SupvActionId.DUMP_MRAM: header_list = ["MRAM Dump"] content_list = [custom_data[: len(custom_data)]] diff --git a/eive_tmtc/pus_tm/pus_handler.py b/eive_tmtc/pus_tm/pus_handler.py index e9ca983..805c6ec 100644 --- a/eive_tmtc/pus_tm/pus_handler.py +++ b/eive_tmtc/pus_tm/pus_handler.py @@ -22,7 +22,7 @@ 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 .action_reply_handler import handle_action_service_tm from .defs import PrintWrapper from .event_handler import handle_event_packet from .hk_handler import HkFilter, handle_hk_packet @@ -96,8 +96,8 @@ class PusHandler(SpecificApidHandlerBase): 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 + handle_action_service_tm( + raw_tm=packet, pw=self.pw, obj_id_dict=self.obj_id_dict ) elif service == 17: pus17_tm = Service17Tm.unpack( diff --git a/eive_tmtc/tmtc/payload/ploc_mpsoc.py b/eive_tmtc/tmtc/payload/ploc_mpsoc.py index 49a5bd4..cfde89c 100644 --- a/eive_tmtc/tmtc/payload/ploc_mpsoc.py +++ b/eive_tmtc/tmtc/payload/ploc_mpsoc.py @@ -686,7 +686,7 @@ class DirElement: size: int -def handle_mpsoc_data_reply(action_id: int, pw: PrintWrapper, custom_data: bytearray): +def handle_mpsoc_data_reply(action_id: int, pw: PrintWrapper, custom_data: bytes): if action_id == ActionId.TM_MEM_READ_RPT: header_list = [ "PLOC Memory Address", diff --git a/eive_tmtc/tmtc/power/tm.py b/eive_tmtc/tmtc/power/tm.py index 455ccf3..a2acf81 100644 --- a/eive_tmtc/tmtc/power/tm.py +++ b/eive_tmtc/tmtc/power/tm.py @@ -537,7 +537,7 @@ def handle_acu_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes): def handle_get_param_data_reply( - obj_id: ObjectIdBase, action_id: int, pw: PrintWrapper, custom_data: bytearray + obj_id: ObjectIdBase, action_id: int, pw: PrintWrapper, custom_data: bytes ): if action_id == GomspaceDeviceActionId.PARAM_GET: pw.dlog(f"Parameter Get Request received for object {obj_id}") diff --git a/pyproject.toml b/pyproject.toml index e3bf870..2b029eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ "Topic :: Scientific/Engineering" ] dependencies = [ - "tmtccmd ~= 8.0.0rc1", + "tmtccmd ~= 8.0", "cfdp-py~=0.1.0", # "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@prep_v8.0.0", "python-dateutil ~= 2.8",