2021-04-26 14:56:51 +02:00
|
|
|
import struct
|
2022-11-29 16:53:29 +01:00
|
|
|
from eive_tmtc.config.object_ids import *
|
2023-01-16 14:13:06 +01:00
|
|
|
from eive_tmtc.tmtc.acs.imtq import ImtqActionId
|
2022-11-29 16:53:29 +01:00
|
|
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
|
|
|
from eive_tmtc.tmtc.payload.ploc_mpsoc import PlocReplyIds
|
2023-01-16 14:13:06 +01:00
|
|
|
from eive_tmtc.tmtc.payload.ploc_supervisor import SupvActionId
|
|
|
|
from eive_tmtc.pus_tc.devs.star_tracker import StarTrackerActionId
|
2022-11-29 16:53:29 +01:00
|
|
|
from eive_tmtc.tmtc.power.tm import handle_get_param_data_reply
|
2022-04-05 00:51:52 +02:00
|
|
|
from tmtccmd.logging import get_console_logger
|
2022-04-06 16:41:46 +02:00
|
|
|
from tmtccmd.tm import Service8FsfwTm
|
2022-07-08 16:25:46 +02:00
|
|
|
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
2023-01-16 17:45:46 +01:00
|
|
|
from spacepackets.ccsds.time import CdsShortTimestamp
|
2021-12-24 07:32:35 +01:00
|
|
|
|
|
|
|
LOGGER = get_console_logger()
|
2021-02-09 12:35:10 +01:00
|
|
|
|
|
|
|
|
2022-04-06 16:41:46 +02:00
|
|
|
def handle_action_reply(
|
|
|
|
raw_tm: bytes, printer: FsfwTmTcPrinter, obj_id_dict: ObjectIdDictT
|
|
|
|
):
|
|
|
|
"""Core Action reply handler
|
|
|
|
:return:
|
2021-02-09 12:35:10 +01:00
|
|
|
"""
|
2023-01-16 17:45:46 +01:00
|
|
|
tm_packet = Service8FsfwTm.unpack(
|
|
|
|
raw_telemetry=raw_tm, time_reader=CdsShortTimestamp.empty()
|
|
|
|
)
|
2022-04-06 16:41:46 +02:00
|
|
|
printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
|
2022-04-30 09:26:19 +02:00
|
|
|
object_id = obj_id_dict.get(tm_packet.source_object_id_as_bytes)
|
2022-08-24 11:19:49 +02:00
|
|
|
pw = PrintWrapper(printer)
|
2022-04-06 16:41:46 +02:00
|
|
|
custom_data = tm_packet.custom_data
|
|
|
|
action_id = tm_packet.action_id
|
2022-04-06 17:01:01 +02:00
|
|
|
generic_print_str = printer.generic_action_packet_tm_print(
|
|
|
|
packet=tm_packet, obj_id=object_id
|
|
|
|
)
|
2022-08-24 11:19:49 +02:00
|
|
|
pw.dlog(generic_print_str)
|
2022-04-30 09:26:19 +02:00
|
|
|
if object_id.as_bytes == IMTQ_HANDLER_ID:
|
2022-04-06 16:41:46 +02:00
|
|
|
return handle_imtq_replies(action_id, printer, custom_data)
|
2022-04-30 09:26:19 +02:00
|
|
|
elif object_id.as_bytes == PLOC_MPSOC_ID:
|
2022-04-06 16:41:46 +02:00
|
|
|
return handle_ploc_replies(action_id, printer, custom_data)
|
2022-04-30 09:26:19 +02:00
|
|
|
elif object_id.as_bytes == PLOC_SUPV_ID:
|
2022-04-06 16:41:46 +02:00
|
|
|
return handle_supervisor_replies(action_id, printer, custom_data)
|
2022-04-30 09:26:19 +02:00
|
|
|
elif object_id.as_bytes == STAR_TRACKER_ID:
|
2022-04-06 16:41:46 +02:00
|
|
|
return handle_startracker_replies(action_id, printer, custom_data)
|
2022-08-24 11:24:25 +02:00
|
|
|
elif object_id.as_bytes in [
|
|
|
|
ACU_HANDLER_ID,
|
|
|
|
PDU_1_HANDLER_ID,
|
|
|
|
PDU_2_HANDLER_ID,
|
|
|
|
P60_DOCK_HANDLER,
|
|
|
|
]:
|
2022-08-25 18:13:37 +02:00
|
|
|
return handle_get_param_data_reply(object_id, action_id, pw, custom_data)
|
2022-08-24 11:19:49 +02:00
|
|
|
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=',')}")
|
2021-04-25 17:46:53 +02:00
|
|
|
|
|
|
|
|
2022-04-06 16:41:46 +02:00
|
|
|
def handle_imtq_replies(
|
2022-04-06 17:01:01 +02:00
|
|
|
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
|
2022-04-06 16:41:46 +02:00
|
|
|
):
|
2023-01-16 14:13:06 +01:00
|
|
|
if action_id == struct.unpack("!I", ImtqActionId.get_commanded_dipole)[0]:
|
2022-04-06 16:41:46 +02:00
|
|
|
header_list = [
|
2022-02-03 16:02:55 +01:00
|
|
|
"Commanded X-Dipole",
|
|
|
|
"Commanded Y-Dipole",
|
|
|
|
"Commanded Z-Dipole",
|
|
|
|
]
|
2022-04-06 17:01:01 +02:00
|
|
|
[x_dipole, y_dipole, z_dipole] = struct.unpack("!HHH", custom_data[0:6])
|
2022-04-06 16:41:46 +02:00
|
|
|
content_list = [x_dipole, y_dipole, z_dipole]
|
|
|
|
print(header_list)
|
|
|
|
print(content_list)
|
|
|
|
printer.file_logger.info(header_list)
|
|
|
|
printer.file_logger.info(content_list)
|
2021-04-26 15:01:22 +02:00
|
|
|
|
|
|
|
|
2022-04-06 16:41:46 +02:00
|
|
|
def handle_ploc_replies(
|
2022-04-06 17:01:01 +02:00
|
|
|
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
|
2022-04-06 16:41:46 +02:00
|
|
|
):
|
2022-05-04 19:08:54 +02:00
|
|
|
if action_id == PlocReplyIds.TM_MEM_READ_RPT:
|
2022-04-06 16:41:46 +02:00
|
|
|
header_list = [
|
2022-02-03 16:02:55 +01:00
|
|
|
"PLOC Memory Address",
|
|
|
|
"PLOC Mem Len",
|
|
|
|
"PLOC Read Memory Data",
|
|
|
|
]
|
2022-04-06 16:41:46 +02:00
|
|
|
content_list = [
|
2022-03-22 19:29:55 +01:00
|
|
|
"0x" + custom_data[:4].hex(),
|
|
|
|
struct.unpack("!H", custom_data[4:6])[0],
|
|
|
|
"0x" + custom_data[6:10].hex(),
|
|
|
|
]
|
2022-04-06 16:41:46 +02:00
|
|
|
print(header_list)
|
|
|
|
print(content_list)
|
|
|
|
printer.file_logger.info(header_list)
|
|
|
|
printer.file_logger.info(content_list)
|
2022-05-04 19:08:54 +02:00
|
|
|
elif action_id == PlocReplyIds.TM_CAM_CMD_RPT:
|
|
|
|
header_list = ["Camera reply string", "ACK"]
|
2022-05-05 14:30:28 +02:00
|
|
|
content_list = [
|
|
|
|
custom_data[: len(custom_data) - 1].decode("utf-8"),
|
|
|
|
hex(custom_data[-1]),
|
|
|
|
]
|
2022-05-04 19:08:54 +02:00
|
|
|
print(header_list)
|
|
|
|
print(content_list)
|
|
|
|
printer.file_logger.info(header_list)
|
|
|
|
printer.file_logger.info(content_list)
|
2021-07-31 08:32:14 +02:00
|
|
|
|
|
|
|
|
2022-01-18 14:03:56 +01:00
|
|
|
def handle_supervisor_replies(
|
2022-04-06 17:01:01 +02:00
|
|
|
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
|
2022-04-06 16:41:46 +02:00
|
|
|
):
|
2023-01-16 14:13:06 +01:00
|
|
|
if action_id == SupvActionId.DUMP_MRAM:
|
2022-04-06 16:41:46 +02:00
|
|
|
header_list = ["MRAM Dump"]
|
|
|
|
content_list = [custom_data[: len(custom_data)]]
|
|
|
|
print(header_list)
|
|
|
|
print(content_list)
|
|
|
|
printer.file_logger.info(header_list)
|
|
|
|
printer.file_logger.info(content_list)
|
2023-01-16 14:13:06 +01:00
|
|
|
elif action_id == SupvActionId.READ_GPIO:
|
2022-05-03 19:09:23 +02:00
|
|
|
header_list = ["GPIO state"]
|
2022-05-05 14:30:28 +02:00
|
|
|
content_list = [struct.unpack("!H", custom_data[:2])[0]]
|
2022-05-03 19:09:23 +02:00
|
|
|
print(header_list)
|
|
|
|
print(content_list)
|
|
|
|
printer.file_logger.info(header_list)
|
|
|
|
printer.file_logger.info(content_list)
|
|
|
|
|
|
|
|
|
2022-01-18 14:03:56 +01:00
|
|
|
def handle_startracker_replies(
|
2022-04-06 17:01:01 +02:00
|
|
|
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
|
2022-04-06 16:41:46 +02:00
|
|
|
):
|
2023-01-16 14:13:06 +01:00
|
|
|
if action_id == StarTrackerActionId.CHECKSUM:
|
2021-12-24 07:32:35 +01:00
|
|
|
if len(custom_data) != 5:
|
2022-01-18 14:03:56 +01:00
|
|
|
LOGGER.warning(
|
|
|
|
"Star tracker reply has invalid length {0}".format(len(custom_data))
|
|
|
|
)
|
2022-04-06 16:41:46 +02:00
|
|
|
return
|
|
|
|
header_list = ["Checksum", "Checksum valid"]
|
2021-12-24 07:32:35 +01:00
|
|
|
print(custom_data[4])
|
|
|
|
checksum_valid_flag = custom_data[4] >> 8
|
2022-04-06 16:41:46 +02:00
|
|
|
content_list = ["0x" + custom_data[:4].hex(), checksum_valid_flag]
|
|
|
|
print(header_list)
|
|
|
|
print(content_list)
|
|
|
|
printer.file_logger.info(header_list)
|
|
|
|
printer.file_logger.info(content_list)
|