2023-02-01 11:17:04 +01:00
|
|
|
import logging
|
2023-02-01 19:43:25 +01:00
|
|
|
import datetime
|
2023-02-08 11:47:37 +01:00
|
|
|
import struct
|
2023-02-08 11:51:55 +01:00
|
|
|
import sys
|
2022-12-01 11:14:28 +01:00
|
|
|
|
|
|
|
from eive_tmtc.config.events import get_event_dict
|
2022-11-29 16:53:29 +01:00
|
|
|
from eive_tmtc.config.object_ids import get_object_ids
|
|
|
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
|
|
|
from eive_tmtc.pus_tm.verification_handler import generic_retval_printout
|
2023-01-27 15:42:00 +01:00
|
|
|
from eive_tmtc.tmtc.acs.subsystem import AcsMode
|
2023-01-31 12:56:13 +01:00
|
|
|
from tmtccmd.tc.pus_200_fsfw_mode import Mode
|
2023-02-01 20:11:47 +01:00
|
|
|
from tmtccmd.tc.pus_201_fsfw_health import FsfwHealth
|
2022-04-05 00:55:17 +02:00
|
|
|
|
2022-04-05 17:05:11 +02:00
|
|
|
from tmtccmd.tm import Service5Tm
|
2022-07-08 16:25:46 +02:00
|
|
|
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
2022-12-01 11:14:28 +01:00
|
|
|
from tmtccmd.fsfw import EventInfo
|
2023-01-16 17:45:46 +01:00
|
|
|
from spacepackets.ccsds.time import CdsShortTimestamp
|
2022-03-03 19:57:22 +01:00
|
|
|
|
2023-02-01 11:17:04 +01:00
|
|
|
_LOGGER = logging.getLogger(__name__)
|
2022-03-04 11:02:10 +01:00
|
|
|
|
2022-03-03 19:57:22 +01:00
|
|
|
|
2022-08-22 10:47:10 +02:00
|
|
|
def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
|
|
|
|
pw = PrintWrapper(printer)
|
2023-02-02 18:20:50 +01:00
|
|
|
tm = Service5Tm.unpack(data=raw_tm, time_reader=CdsShortTimestamp.empty())
|
2022-03-04 14:27:19 +01:00
|
|
|
event_dict = get_event_dict()
|
2023-01-30 14:47:25 +01:00
|
|
|
event_def = tm.event_definition
|
|
|
|
info = event_dict.get(event_def.event_id)
|
2022-03-07 11:26:44 +01:00
|
|
|
if info is None:
|
2023-02-01 11:17:04 +01:00
|
|
|
_LOGGER.warning(f"Event ID {event_def.event_id} has no information")
|
2022-03-07 11:26:44 +01:00
|
|
|
info = EventInfo()
|
|
|
|
info.name = "Unknown event"
|
2022-03-04 14:27:19 +01:00
|
|
|
obj_ids = get_object_ids()
|
2023-01-30 14:47:25 +01:00
|
|
|
obj_id_obj = obj_ids.get(event_def.reporter_id)
|
2022-03-04 14:27:19 +01:00
|
|
|
if obj_id_obj is None:
|
2023-02-01 11:17:04 +01:00
|
|
|
_LOGGER.warning(f"Object ID 0x{event_def.reporter_id.hex(sep=',')} has no name")
|
2023-01-30 14:47:25 +01:00
|
|
|
obj_name = event_def.reporter_id.hex(sep=",")
|
2022-03-04 14:27:19 +01:00
|
|
|
else:
|
|
|
|
obj_name = obj_id_obj.name
|
2023-01-30 17:26:48 +01:00
|
|
|
generic_event_string = f"Object {obj_name} generated Event {info.name} (ID: {event_def.event_id:#04x}) at {tm.time_provider.as_date_time()}"
|
2023-02-01 20:42:21 +01:00
|
|
|
_LOGGER.info(generic_event_string)
|
2022-08-22 14:02:07 +02:00
|
|
|
pw.printer.file_logger.info(
|
2023-02-01 19:43:25 +01:00
|
|
|
f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: {generic_event_string}"
|
2022-08-22 14:02:07 +02:00
|
|
|
)
|
|
|
|
specific_handler = True
|
2022-10-11 15:38:31 +02:00
|
|
|
if info.name == "MODE_TRANSITION_FAILED":
|
2023-01-30 14:47:25 +01:00
|
|
|
reason = generic_retval_printout(event_def.param1)
|
2022-10-11 15:38:31 +02:00
|
|
|
for string in reason:
|
|
|
|
pw.dlog(f"Reason from event parameter 1: {string}")
|
2023-01-30 14:47:25 +01:00
|
|
|
pw.dlog(f"Mode, sequence or table: {event_def.param2:#08x}")
|
2022-08-22 11:47:12 +02:00
|
|
|
if info.name == "SUPV_UPDATE_PROGRESS" or info.name == "WRITE_MEMORY_FAILED":
|
2022-08-22 10:47:10 +02:00
|
|
|
additional_event_info = f"Additional info: {info.info}"
|
2022-08-22 11:47:12 +02:00
|
|
|
context = (
|
2023-01-30 14:47:25 +01:00
|
|
|
f"Progress Percent: {event_def.param1 >> 24 & 0xff} | Sequence Count: {event_def.param1 & 0xffff} "
|
|
|
|
f"| Bytes Written: {event_def.param2}"
|
2022-08-22 11:47:12 +02:00
|
|
|
)
|
2022-08-22 10:47:10 +02:00
|
|
|
pw.dlog(additional_event_info)
|
|
|
|
pw.dlog(context)
|
2022-10-10 11:20:57 +02:00
|
|
|
if info.name == "MODE_INFO":
|
2022-10-10 17:32:05 +02:00
|
|
|
mode_name = "Unknown"
|
2022-10-11 14:24:13 +02:00
|
|
|
if obj_name == "ACS_SUBSYSTEM":
|
2023-02-03 14:21:22 +01:00
|
|
|
acs_mode = AcsMode(event_def.param1)
|
|
|
|
pw.dlog(f"ACS Mode: {acs_mode!r}")
|
|
|
|
elif obj_name == "ACS_CONTROLLER_ID":
|
|
|
|
mode_name = Mode(event_def.param1)
|
|
|
|
submode = AcsMode(event_def.param2)
|
|
|
|
pw.dlog(f"Mode: {mode_name!r}")
|
|
|
|
pw.dlog(f"ACS Mode: {submode!r}")
|
2022-10-11 14:24:13 +02:00
|
|
|
else:
|
2023-01-30 14:47:25 +01:00
|
|
|
if event_def.param1 == Mode.OFF:
|
2022-10-11 14:24:13 +02:00
|
|
|
mode_name = "Off"
|
2023-01-30 14:47:25 +01:00
|
|
|
elif event_def.param1 == Mode.ON:
|
2022-10-11 14:24:13 +02:00
|
|
|
mode_name = "On"
|
2023-01-30 14:47:25 +01:00
|
|
|
elif event_def.param1 == Mode.NORMAL:
|
2022-10-11 14:24:13 +02:00
|
|
|
mode_name = "Normal"
|
2023-01-30 14:47:25 +01:00
|
|
|
elif event_def.param1 == Mode.RAW:
|
2022-10-11 14:24:13 +02:00
|
|
|
mode_name = "Raw"
|
2023-02-03 14:21:22 +01:00
|
|
|
pw.dlog(f"Mode Number {event_def.param1}, Mode Name {mode_name}")
|
|
|
|
pw.dlog(f"Submode: {event_def.param2}")
|
2023-02-08 11:47:37 +01:00
|
|
|
elif info.name == "VERSION_INFO":
|
2023-02-08 11:51:55 +01:00
|
|
|
ver_major = (event_def.param1 >> 24) & 0xFF
|
|
|
|
ver_minor = (event_def.param1 >> 16) & 0xFF
|
|
|
|
ver_rev = (event_def.param1 >> 8) & 0xFF
|
|
|
|
has_git_sha = bool(event_def.param1 & 0xFF)
|
2023-02-08 11:47:37 +01:00
|
|
|
git_sha = ""
|
|
|
|
if has_git_sha:
|
2023-02-08 11:51:55 +01:00
|
|
|
p2_as_bytes = event_def.param2.to_bytes(4, sys.byteorder)
|
2023-02-08 11:47:37 +01:00
|
|
|
git_sha = p2_as_bytes.decode("ascii")
|
|
|
|
version_string = f"v{ver_major}.{ver_minor}.{ver_rev}"
|
|
|
|
pw.dlog(f"Version {version_string}")
|
|
|
|
if has_git_sha:
|
|
|
|
pw.dlog(f"Git SHA first four letters: {git_sha}")
|
2023-02-01 19:43:25 +01:00
|
|
|
elif info.name == "CLOCK_SET":
|
|
|
|
old_time = event_def.param1
|
|
|
|
new_time = event_def.param2
|
|
|
|
old_time_dt = datetime.datetime.fromtimestamp(old_time, datetime.timezone.utc)
|
|
|
|
new_time_dt = datetime.datetime.fromtimestamp(new_time, datetime.timezone.utc)
|
|
|
|
pw.dlog(f"Old time (UTC): {old_time_dt}")
|
|
|
|
pw.dlog(f"New time (UTC): {new_time_dt}")
|
|
|
|
elif info.name == "CLOCK_DUMP":
|
|
|
|
# param 1 is timeval seconds, param 2 is timeval subsecond milliseconds
|
|
|
|
time = event_def.param1 + event_def.param2 / 1000.0
|
|
|
|
time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc)
|
|
|
|
pw.dlog(f"Current time: {time_dt}")
|
2023-02-01 20:11:47 +01:00
|
|
|
elif info.name == "HEALTH_INFO":
|
|
|
|
health = FsfwHealth(event_def.param1)
|
|
|
|
pw.dlog(f"{obj_name}: {health!r}")
|
2022-08-22 10:42:51 +02:00
|
|
|
else:
|
2022-08-22 14:02:07 +02:00
|
|
|
specific_handler = False
|
2022-08-22 10:42:51 +02:00
|
|
|
if info.info != "":
|
2023-01-30 14:47:25 +01:00
|
|
|
additional_event_info = f"Additional info: {info.info} | P1: {event_def.param1} | P2: {event_def.param2}"
|
2022-08-22 10:47:10 +02:00
|
|
|
pw.dlog(additional_event_info)
|
2022-08-22 14:02:07 +02:00
|
|
|
if not specific_handler:
|
2023-01-30 17:26:48 +01:00
|
|
|
# printer.handle_long_tm_print(packet_if=tm.pus_tm, info_if=tm.pus_tm)
|
|
|
|
pass
|