eive-tmtc/eive_tmtc/pus_tm/pus_demux.py

126 lines
5.4 KiB
Python
Raw Normal View History

2022-04-06 16:41:46 +02:00
"""Core EIVE TM handler module
2020-12-17 17:50:00 +01:00
"""
2023-02-01 11:17:04 +01:00
import logging
2023-10-26 20:45:14 +02:00
from eive_tmtc.config.object_ids import get_object_ids
2022-07-04 15:22:53 +02:00
from spacepackets.ecss import PusTelemetry
2022-08-19 12:42:27 +02:00
from spacepackets.ecss.pus_17_test import Service17Tm
2022-07-04 15:22:53 +02:00
from spacepackets.util import PrintFormats
2023-01-16 17:45:46 +01:00
from spacepackets.ccsds.time import CdsShortTimestamp
2022-07-04 15:22:53 +02:00
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
from tmtccmd.pus import VerificationWrapper
from tmtccmd.tm import Service20FsfwTm, Service200FsfwTm
2023-01-31 12:56:13 +01:00
from tmtccmd.tm.pus_20_fsfw_param import Service20ParamDumpWrapper
from tmtccmd.pus.s20_fsfw_param_defs import CustomSubservice as ParamSubservice
from tmtccmd.tm.pus_200_fsfw_mode import Subservice as ModeSubservice
2023-05-25 11:31:06 +02:00
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
2022-10-11 15:08:00 +02:00
from .defs import PrintWrapper
2022-04-06 16:41:46 +02:00
2022-04-05 17:05:11 +02:00
from .event_handler import handle_event_packet
2022-10-11 15:08:00 +02:00
from .verification_handler import handle_service_1_fsfw_packet, generic_retval_printout
2023-10-26 19:49:45 +02:00
from .hk_handler import handle_hk_packet, HkFilter
2022-04-06 16:41:46 +02:00
from .action_reply_handler import handle_action_reply
2020-12-17 17:50:00 +01:00
2023-02-01 11:17:04 +01:00
_LOGGER = logging.getLogger(__name__)
2020-12-17 17:50:00 +01:00
2023-06-19 17:16:00 +02:00
def pus_factory_hook( # noqa C901 : Complexity okay here
2022-07-04 15:22:53 +02:00
packet: bytes,
verif_wrapper: VerificationWrapper,
printer: FsfwTmTcPrinter,
raw_logger: RawTmtcTimedLogWrapper,
hk_level: int,
2023-10-26 19:49:45 +02:00
hk_filter: HkFilter,
2022-07-04 15:22:53 +02:00
):
if len(packet) < 8:
2023-02-01 11:17:04 +01:00
_LOGGER.warning("Detected packet shorter than 8 bytes!")
2021-12-16 16:07:59 +01:00
return
2021-12-15 11:19:19 +01:00
try:
2023-01-16 17:45:46 +01:00
tm_packet = PusTelemetry.unpack(packet, CdsShortTimestamp.empty())
2023-06-28 13:10:10 +02:00
# _LOGGER.info(f"Sequence count: {tm_packet.seq_count}")
2023-06-07 16:56:43 +02:00
except ValueError as value_error:
_LOGGER.warning(f"{value_error}")
2023-02-01 11:17:04 +01:00
_LOGGER.warning("Could not generate PUS TM object from raw data")
_LOGGER.warning(f"Raw Packet: [{packet.hex(sep=',')}], REPR: {packet!r}")
2022-07-04 15:22:53 +02:00
return
service = tm_packet.service
obj_id_dict = get_object_ids()
2023-05-24 13:50:37 +02:00
pw = PrintWrapper(printer.file_logger)
2022-07-04 15:22:53 +02:00
dedicated_handler = True
if service == 1:
handle_service_1_fsfw_packet(wrapper=verif_wrapper, raw_tm=packet)
2022-07-04 15:22:53 +02:00
elif service == 3:
handle_hk_packet(
2023-10-26 19:49:45 +02:00
printer=printer,
raw_tm=packet,
obj_id_dict=obj_id_dict,
hk_level=hk_level,
hk_filter=hk_filter,
)
2022-07-04 15:22:53 +02:00
elif service == 5:
2023-05-24 13:50:37 +02:00
handle_event_packet(raw_tm=packet, pw=pw)
2022-07-04 15:22:53 +02:00
elif service == 8:
handle_action_reply(raw_tm=packet, printer=printer, obj_id_dict=obj_id_dict)
elif service == 17:
2023-01-16 17:45:46 +01:00
tm_packet = Service17Tm.unpack(
2023-02-02 18:20:50 +01:00
data=packet, time_reader=CdsShortTimestamp.empty()
2023-01-16 17:45:46 +01:00
)
2022-08-19 12:42:27 +02:00
if tm_packet.subservice == 2:
verif_wrapper.dlog("Received Ping Reply TM[17,2]")
dedicated_handler = True
2022-07-04 15:22:53 +02:00
elif service == 20:
2023-01-28 14:48:36 +01:00
param_packet = Service20FsfwTm.unpack(
2023-01-16 17:45:46 +01:00
raw_telemetry=packet, time_reader=CdsShortTimestamp.empty()
)
2023-01-28 14:36:21 +01:00
if tm_packet.subservice == ParamSubservice.TM_DUMP_REPLY:
2023-01-28 14:48:36 +01:00
param_wrapper = Service20ParamDumpWrapper(param_tm=param_packet)
2023-01-28 14:36:21 +01:00
try:
param = param_wrapper.get_param()
2023-01-28 14:48:36 +01:00
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}")
2023-02-01 11:17:04 +01:00
if param.rows == 1 and param.columns == 1:
2023-01-28 14:48:36 +01:00
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:
2023-06-19 17:16:00 +02:00
pw.dlog(f"received {e} trying to parse scalar parameter")
2023-01-28 14:48:36 +01:00
else:
# TODO: Could improve display further by actually displaying a matrix as a
# matrix using row and column information
pw.dlog(
2023-09-12 13:48:38 +02:00
"Received vector or matrix data:"
f" {param.param_raw.hex(sep=',')}"
2023-01-28 14:48:36 +01:00
)
2023-01-28 14:36:21 +01:00
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")
2022-07-04 15:22:53 +02:00
elif service == 200:
2023-01-16 17:45:46 +01:00
tm_packet = Service200FsfwTm.unpack(
raw_telemetry=packet, time_reader=CdsShortTimestamp.empty()
)
2023-01-28 14:36:21 +01:00
if tm_packet.subservice == ModeSubservice.TM_CANT_REACH_MODE:
2022-10-11 15:08:00 +02:00
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
2022-07-04 15:22:53 +02:00
else:
2023-02-01 11:17:04 +01:00
_LOGGER.info(f"The service {service} is not implemented in Telemetry Factory")
2022-07-04 15:22:53 +02:00
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)