2022-05-18 16:02:23 +02:00
|
|
|
"""HK Handling for EIVE OBSW"""
|
2024-04-08 13:24:40 +02:00
|
|
|
|
2023-10-26 19:49:45 +02:00
|
|
|
import dataclasses
|
2023-02-01 11:17:04 +01:00
|
|
|
import logging
|
2024-05-06 11:23:31 +02:00
|
|
|
import base64
|
2023-11-13 08:50:51 +01:00
|
|
|
import sqlite3
|
2024-05-06 11:23:31 +02:00
|
|
|
import struct
|
2023-11-13 11:12:18 +01:00
|
|
|
from typing import List, cast
|
|
|
|
from uuid import UUID
|
2024-05-06 11:23:31 +02:00
|
|
|
|
|
|
|
from spacepackets.ccsds.time import CdsShortTimestamp
|
|
|
|
from spacepackets.ecss import PusTm
|
2024-04-10 17:34:54 +02:00
|
|
|
from eive_tmtc.config.definitions import PRINT_RAW_HK_B64_STR
|
2023-11-13 14:50:49 +01:00
|
|
|
from eive_tmtc.pus_tm.hk import HkTmInfo
|
2023-02-01 11:17:04 +01:00
|
|
|
|
2023-03-14 10:11:01 +01:00
|
|
|
from eive_tmtc.tmtc.acs.acs_ctrl import handle_acs_ctrl_hk_data
|
2023-06-28 10:43:11 +02:00
|
|
|
from eive_tmtc.tmtc.internal_err_reporter import handle_ier_hk_data
|
2023-05-04 14:50:38 +02:00
|
|
|
from eive_tmtc.tmtc.payload.ploc_mpsoc import handle_ploc_mpsoc_hk_data
|
2023-03-14 10:11:01 +01:00
|
|
|
from eive_tmtc.tmtc.tcs.rtd import RTD_NAMES, handle_rtd_hk
|
2023-03-12 12:54:12 +01:00
|
|
|
from eive_tmtc.tmtc.acs.star_tracker import handle_str_hk_data
|
2023-10-23 16:30:16 +02:00
|
|
|
from eive_tmtc.tmtc.payload.plpcdu import handle_plpcdu_hk
|
2023-02-01 16:25:17 +01:00
|
|
|
from eive_tmtc.tmtc.payload.rad_sensor import handle_rad_sensor_data
|
|
|
|
from eive_tmtc.tmtc.acs.sus import handle_sus_hk
|
2022-11-29 16:53:29 +01:00
|
|
|
from eive_tmtc.tmtc.payload.ploc_supervisor import handle_supv_hk_data
|
|
|
|
from eive_tmtc.tmtc.acs.reaction_wheels import handle_rw_hk_data
|
2023-12-01 13:03:38 +01:00
|
|
|
from eive_tmtc.tmtc.power.pwr_ctrl import handle_pwr_ctrl_hk_data
|
2023-01-25 14:14:22 +01:00
|
|
|
from eive_tmtc.tmtc.com.syrlinks_handler import handle_syrlinks_hk_data
|
2023-01-16 17:11:20 +01:00
|
|
|
from eive_tmtc.tmtc.tcs import handle_thermal_controller_hk_data
|
2023-06-18 13:30:45 +02:00
|
|
|
from eive_tmtc.tmtc.tcs.tmp1075 import handle_tmp_1075_hk_data
|
2024-01-24 17:59:16 +01:00
|
|
|
from tmtccmd.pus.tm.s3_hk_base import HkContentType
|
2022-07-08 16:25:46 +02:00
|
|
|
from tmtccmd.util.obj_id import ObjectIdU32, ObjectIdDictT
|
2022-05-18 16:02:23 +02:00
|
|
|
|
2023-02-01 16:25:17 +01:00
|
|
|
from eive_tmtc.tmtc.power.bpx_batt import handle_bpx_hk_data
|
|
|
|
from eive_tmtc.tmtc.acs.gps import handle_gps_data
|
2023-02-01 15:58:34 +01:00
|
|
|
from eive_tmtc.tmtc.acs.gyros import handle_gyros_hk_data
|
2022-11-29 16:53:29 +01:00
|
|
|
from eive_tmtc.tmtc.power.tm import (
|
|
|
|
handle_pdu_data,
|
|
|
|
handle_p60_hk_data,
|
|
|
|
handle_acu_hk_data,
|
2022-12-22 16:12:31 +01:00
|
|
|
handle_pcdu_hk,
|
2022-11-29 16:53:29 +01:00
|
|
|
)
|
|
|
|
from eive_tmtc.tmtc.acs.imtq import (
|
2023-02-19 13:25:12 +01:00
|
|
|
handle_imtq_hk,
|
2022-10-21 11:28:33 +02:00
|
|
|
)
|
2023-05-23 09:54:51 +02:00
|
|
|
from eive_tmtc.pus_tm.defs import FsfwTmTcPrinter, PrintWrapper
|
2023-01-11 14:19:47 +01:00
|
|
|
from eive_tmtc.tmtc.core import handle_core_hk_data
|
2023-02-01 15:58:34 +01:00
|
|
|
from eive_tmtc.tmtc.acs.mgms import handle_mgm_hk_data
|
2022-11-29 16:53:29 +01:00
|
|
|
import eive_tmtc.config.object_ids as obj_ids
|
2022-05-18 16:02:23 +02:00
|
|
|
|
|
|
|
|
2023-02-01 11:17:04 +01:00
|
|
|
_LOGGER = logging.getLogger(__name__)
|
2022-05-18 16:02:23 +02:00
|
|
|
|
|
|
|
|
2022-08-19 14:48:10 +02:00
|
|
|
FORWARD_SENSOR_TEMPS = False
|
|
|
|
|
|
|
|
|
2023-10-26 19:49:45 +02:00
|
|
|
@dataclasses.dataclass
|
|
|
|
class HkFilter:
|
2024-02-29 12:09:53 +01:00
|
|
|
object_ids: List[bytes]
|
2023-10-26 19:49:45 +02:00
|
|
|
set_ids: List[int]
|
|
|
|
|
|
|
|
|
2022-05-18 16:02:23 +02:00
|
|
|
def handle_hk_packet(
|
2023-10-26 19:49:45 +02:00
|
|
|
raw_tm: bytes,
|
2023-11-13 11:12:18 +01:00
|
|
|
packet_uuid: UUID,
|
2023-10-26 19:49:45 +02:00
|
|
|
obj_id_dict: ObjectIdDictT,
|
|
|
|
printer: FsfwTmTcPrinter,
|
|
|
|
hk_filter: HkFilter,
|
|
|
|
hk_level: int,
|
2023-11-13 11:12:18 +01:00
|
|
|
db_con: sqlite3.Connection,
|
2022-05-18 16:02:23 +02:00
|
|
|
):
|
2024-05-06 11:23:31 +02:00
|
|
|
tm_packet = PusTm.unpack(raw_tm, CdsShortTimestamp.TIMESTAMP_SIZE)
|
|
|
|
obj_id_raw = struct.unpack("!I", tm_packet.tm_data[0:4])[0]
|
|
|
|
named_obj_id = cast(ObjectIdU32, obj_id_dict.get(obj_id_raw))
|
2022-05-18 16:02:23 +02:00
|
|
|
if named_obj_id is None:
|
2024-05-06 11:23:31 +02:00
|
|
|
named_obj_id = ObjectIdU32(obj_id_raw, "Unknown ID")
|
2022-05-18 16:02:23 +02:00
|
|
|
if tm_packet.subservice == 25 or tm_packet.subservice == 26:
|
2024-05-06 11:23:31 +02:00
|
|
|
set_id = struct.unpack("!I", tm_packet.tm_data[4:8])[0]
|
2022-05-18 16:02:23 +02:00
|
|
|
hk_data = tm_packet.tm_data[8:]
|
2024-02-29 12:09:53 +01:00
|
|
|
if named_obj_id.as_bytes in hk_filter.object_ids:
|
2024-04-10 17:34:54 +02:00
|
|
|
if PRINT_RAW_HK_B64_STR:
|
|
|
|
print(f"PUS TM Base64: {base64.b64encode(raw_tm)}")
|
2023-10-26 19:49:45 +02:00
|
|
|
handle_regular_hk_print(
|
|
|
|
printer=printer,
|
2024-05-06 11:23:31 +02:00
|
|
|
set_id=set_id,
|
2024-01-25 13:27:10 +01:00
|
|
|
packet_uuid=packet_uuid,
|
2023-10-26 19:49:45 +02:00
|
|
|
object_id=named_obj_id,
|
|
|
|
hk_packet=tm_packet,
|
|
|
|
hk_data=hk_data,
|
2023-11-13 11:12:18 +01:00
|
|
|
db=db_con,
|
2023-10-26 19:49:45 +02:00
|
|
|
)
|
|
|
|
return
|
2022-05-23 14:04:34 +02:00
|
|
|
try:
|
2023-10-26 19:49:45 +02:00
|
|
|
if hk_level >= 1:
|
|
|
|
printer.generic_hk_tm_print(
|
2024-05-06 11:23:31 +02:00
|
|
|
HkContentType.HK, named_obj_id, set_id, hk_data
|
2023-10-26 19:49:45 +02:00
|
|
|
)
|
|
|
|
if hk_level >= 1:
|
2023-06-22 14:52:28 +02:00
|
|
|
handle_regular_hk_print(
|
|
|
|
printer=printer,
|
2024-05-06 11:23:31 +02:00
|
|
|
set_id=set_id,
|
2023-11-13 11:12:18 +01:00
|
|
|
packet_uuid=packet_uuid,
|
2023-06-22 14:52:28 +02:00
|
|
|
object_id=named_obj_id,
|
|
|
|
hk_packet=tm_packet,
|
|
|
|
hk_data=hk_data,
|
2023-11-13 11:12:18 +01:00
|
|
|
db=db_con,
|
2023-06-22 14:52:28 +02:00
|
|
|
)
|
2022-05-23 14:04:34 +02:00
|
|
|
except ValueError as e:
|
2023-02-01 11:17:04 +01:00
|
|
|
_LOGGER.exception(
|
2022-05-23 14:04:34 +02:00
|
|
|
f"{e} error when parsing HK data coming from {named_obj_id}"
|
|
|
|
)
|
2022-05-18 16:02:23 +02:00
|
|
|
if tm_packet.subservice == 10 or tm_packet.subservice == 12:
|
2023-02-01 11:17:04 +01:00
|
|
|
_LOGGER.warning("HK definitions printout not implemented yet")
|
2022-05-18 16:02:23 +02:00
|
|
|
|
2022-05-19 13:20:22 +02:00
|
|
|
|
2023-06-19 17:16:00 +02:00
|
|
|
def handle_regular_hk_print( # noqa C901: Complexity okay here
|
2024-05-06 11:23:31 +02:00
|
|
|
hk_packet: PusTm,
|
|
|
|
set_id: int,
|
2023-11-13 11:12:18 +01:00
|
|
|
packet_uuid: UUID,
|
2022-05-18 16:02:23 +02:00
|
|
|
hk_data: bytes,
|
2023-11-13 11:12:18 +01:00
|
|
|
db: sqlite3.Connection,
|
|
|
|
object_id: ObjectIdU32,
|
|
|
|
printer: FsfwTmTcPrinter,
|
2022-05-18 16:02:23 +02:00
|
|
|
):
|
|
|
|
objb = object_id.as_bytes
|
2023-11-13 14:50:49 +01:00
|
|
|
hk_info = HkTmInfo(
|
2024-05-06 11:23:31 +02:00
|
|
|
packet_uuid=packet_uuid,
|
|
|
|
hk_packet=hk_packet,
|
|
|
|
db_con=db,
|
|
|
|
hk_data=hk_data,
|
|
|
|
set_id=set_id,
|
2023-11-13 14:50:49 +01:00
|
|
|
)
|
2024-05-06 11:23:31 +02:00
|
|
|
timestamp = CdsShortTimestamp.unpack(hk_packet.timestamp)
|
|
|
|
packet_dt = timestamp.as_datetime()
|
2023-05-23 09:54:51 +02:00
|
|
|
pw = PrintWrapper(printer.file_logger)
|
2022-05-18 16:02:23 +02:00
|
|
|
"""This function is called when a Service 3 Housekeeping packet is received."""
|
2022-07-05 02:12:54 +02:00
|
|
|
if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
|
2023-05-23 09:54:51 +02:00
|
|
|
return handle_rw_hk_data(pw, object_id, set_id, hk_data)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.SYRLINKS_HANDLER_ID:
|
2023-11-13 14:50:49 +01:00
|
|
|
return handle_syrlinks_hk_data(
|
|
|
|
hk_info=hk_info,
|
|
|
|
pw=pw,
|
|
|
|
)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.IMTQ_HANDLER_ID:
|
2023-05-23 09:54:51 +02:00
|
|
|
return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.GPS_CONTROLLER:
|
2023-08-04 15:39:40 +02:00
|
|
|
return handle_gps_data(
|
2023-11-13 14:50:49 +01:00
|
|
|
pw=pw,
|
|
|
|
set_id=set_id,
|
|
|
|
hk_data=hk_data,
|
2024-05-06 11:23:31 +02:00
|
|
|
packet_time=timestamp.as_datetime(),
|
2023-08-04 15:39:40 +02:00
|
|
|
)
|
2022-12-22 16:12:31 +01:00
|
|
|
elif objb == obj_ids.PCDU_HANDLER_ID:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_pcdu_hk(pw=pw, set_id=set_id, hk_data=hk_data)
|
2022-05-27 14:32:58 +02:00
|
|
|
elif objb == obj_ids.BPX_HANDLER_ID:
|
2023-05-24 13:50:37 +02:00
|
|
|
return handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, pw=pw)
|
2022-05-27 14:32:58 +02:00
|
|
|
elif objb == obj_ids.CORE_CONTROLLER_ID:
|
2023-05-24 13:50:37 +02:00
|
|
|
return handle_core_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.PDU_1_HANDLER_ID:
|
2023-11-13 08:50:51 +01:00
|
|
|
return handle_pdu_data(
|
2023-11-13 14:50:49 +01:00
|
|
|
hk_info=hk_info,
|
2023-11-13 08:50:51 +01:00
|
|
|
pw=pw,
|
|
|
|
pdu_idx=1,
|
|
|
|
set_id=set_id,
|
|
|
|
hk_data=hk_data,
|
|
|
|
)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.PDU_2_HANDLER_ID:
|
2023-11-13 08:50:51 +01:00
|
|
|
return handle_pdu_data(
|
2023-11-13 14:50:49 +01:00
|
|
|
hk_info=hk_info,
|
2023-11-13 08:50:51 +01:00
|
|
|
pw=pw,
|
|
|
|
pdu_idx=2,
|
|
|
|
set_id=set_id,
|
|
|
|
hk_data=hk_data,
|
|
|
|
)
|
2023-05-04 14:50:38 +02:00
|
|
|
elif objb == obj_ids.PLOC_MPSOC_ID:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_ploc_mpsoc_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.ACU_HANDLER_ID:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_acu_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
2023-06-28 10:43:11 +02:00
|
|
|
elif objb == obj_ids.INTERNAL_ERROR_REPORTER_ID:
|
|
|
|
return handle_ier_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.RAD_SENSOR_ID:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_rad_sensor_data(pw=pw, hk_data=hk_data, set_id=set_id)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
|
2022-05-18 16:02:23 +02:00
|
|
|
return handle_rw_hk_data(
|
2023-05-24 13:44:45 +02:00
|
|
|
pw=pw, object_id=object_id, set_id=set_id, hk_data=hk_data
|
2022-05-18 16:02:23 +02:00
|
|
|
)
|
2022-05-27 09:54:06 +02:00
|
|
|
if objb in [
|
|
|
|
obj_ids.SUS_0_N_LOC_XFYFZM_PT_XF,
|
|
|
|
obj_ids.SUS_1_N_LOC_XBYFZM_PT_XB,
|
|
|
|
obj_ids.SUS_2_N_LOC_XFYBZB_PT_YB,
|
|
|
|
obj_ids.SUS_3_N_LOC_XFYBZF_PT_YF,
|
|
|
|
obj_ids.SUS_4_N_LOC_XMYFZF_PT_ZF,
|
|
|
|
obj_ids.SUS_5_N_LOC_XFYMZB_PT_ZB,
|
|
|
|
obj_ids.SUS_6_R_LOC_XFYBZM_PT_XF,
|
|
|
|
obj_ids.SUS_7_R_LOC_XBYBZM_PT_XB,
|
|
|
|
obj_ids.SUS_8_R_LOC_XBYBZB_PT_YB,
|
|
|
|
obj_ids.SUS_9_R_LOC_XBYBZB_PT_YF,
|
|
|
|
obj_ids.SUS_10_R_LOC_XMYBZF_PT_ZF,
|
|
|
|
obj_ids.SUS_11_R_LOC_XBYMZB_PT_ZB,
|
|
|
|
]:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_sus_hk(object_id=object_id, hk_data=hk_data, pw=pw, set_id=set_id)
|
2023-03-14 10:11:01 +01:00
|
|
|
elif objb in RTD_NAMES.keys():
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_rtd_hk(object_id=objb, hk_data=hk_data, pw=pw)
|
2022-05-27 14:32:58 +02:00
|
|
|
elif objb == obj_ids.P60_DOCK_HANDLER:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_p60_hk_data(pw=pw, set_id=set_id, hk_data=hk_data)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb in [
|
2022-05-19 13:58:43 +02:00
|
|
|
obj_ids.GYRO_0_ADIS_HANDLER_ID,
|
|
|
|
obj_ids.GYRO_1_L3G_HANDLER_ID,
|
|
|
|
obj_ids.GYRO_2_ADIS_HANDLER_ID,
|
|
|
|
obj_ids.GYRO_3_L3G_HANDLER_ID,
|
2022-05-19 13:20:22 +02:00
|
|
|
]:
|
2023-02-17 02:04:43 +01:00
|
|
|
return handle_gyros_hk_data(
|
2023-05-24 13:44:45 +02:00
|
|
|
object_id=object_id, hk_data=hk_data, pw=pw, set_id=set_id
|
2022-05-19 13:20:22 +02:00
|
|
|
)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb in [
|
2022-05-19 13:58:43 +02:00
|
|
|
obj_ids.MGM_0_LIS3_HANDLER_ID,
|
|
|
|
obj_ids.MGM_1_RM3100_HANDLER_ID,
|
|
|
|
obj_ids.MGM_2_LIS3_HANDLER_ID,
|
|
|
|
obj_ids.MGM_3_RM3100_HANDLER_ID,
|
2022-05-19 13:20:22 +02:00
|
|
|
]:
|
2023-02-17 02:04:43 +01:00
|
|
|
return handle_mgm_hk_data(
|
2023-05-24 13:44:45 +02:00
|
|
|
object_id=object_id, hk_data=hk_data, pw=pw, set_id=set_id
|
2022-05-19 13:20:22 +02:00
|
|
|
)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.PL_PCDU_ID:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_plpcdu_hk(set_id=set_id, hk_data=hk_data, pw=pw)
|
2022-05-24 01:49:57 +02:00
|
|
|
elif objb == obj_ids.THERMAL_CONTROLLER_ID:
|
2023-02-17 02:04:43 +01:00
|
|
|
return handle_thermal_controller_hk_data(
|
2023-05-24 13:44:45 +02:00
|
|
|
object_id=object_id, pw=pw, set_id=set_id, hk_data=hk_data
|
2022-05-19 13:20:22 +02:00
|
|
|
)
|
2023-03-08 19:57:28 +01:00
|
|
|
elif objb == obj_ids.STAR_TRACKER_ID:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_str_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
2022-08-19 14:48:10 +02:00
|
|
|
elif objb == obj_ids.PLOC_SUPV_ID:
|
2023-05-24 13:44:45 +02:00
|
|
|
return handle_supv_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
2023-06-18 13:30:45 +02:00
|
|
|
elif objb in [
|
|
|
|
obj_ids.TMP1075_HANDLER_TCS_BRD_0_ID,
|
|
|
|
obj_ids.TMP1075_HANDLER_TCS_BRD_1_ID,
|
|
|
|
obj_ids.TMP1075_HANDLER_IF_BRD_ID,
|
|
|
|
obj_ids.TMP1075_HANDLER_PLPCDU_0_ID,
|
2023-06-19 17:59:14 +02:00
|
|
|
obj_ids.TMP1075_HANDLER_PLPCDU_1_ID,
|
2023-06-18 13:30:45 +02:00
|
|
|
]:
|
|
|
|
return handle_tmp_1075_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
2022-08-16 11:48:53 +02:00
|
|
|
elif objb == obj_ids.ACS_CONTROLLER:
|
2023-03-14 18:09:52 +01:00
|
|
|
return handle_acs_ctrl_hk_data(
|
2023-05-24 13:44:45 +02:00
|
|
|
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
|
2023-03-14 18:09:52 +01:00
|
|
|
)
|
2023-12-01 13:03:38 +01:00
|
|
|
elif objb == obj_ids.PWR_CONTROLLER:
|
|
|
|
return handle_pwr_ctrl_hk_data(
|
|
|
|
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
|
|
|
|
)
|
2022-05-18 16:02:23 +02:00
|
|
|
else:
|
2023-02-01 11:17:04 +01:00
|
|
|
_LOGGER.info(
|
2022-05-25 10:37:38 +02:00
|
|
|
f"Service 3 TM: Parsing for object {object_id} and set ID {set_id} "
|
2023-09-12 13:48:38 +02:00
|
|
|
"has not been implemented."
|
2022-05-25 10:37:38 +02:00
|
|
|
)
|