From 2accfef011152afdee4974c0136a73e29b89de6b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 8 Apr 2022 09:59:21 +0200 Subject: [PATCH 1/6] longer ping timeout --- config/hook_implementations.py | 2 +- pus_tc/devs/star_tracker.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/hook_implementations.py b/config/hook_implementations.py index d684ac5..3d68132 100644 --- a/config/hook_implementations.py +++ b/config/hook_implementations.py @@ -124,7 +124,7 @@ def get_eive_service_op_code_dict(service_op_code_dict: ServiceOpCodeDictT): "2": ("Star Tracker: Mode Normal", {OpCodeDictKeys.TIMEOUT: 2.0}), "3": ("Star Tracker: Mode Off", {OpCodeDictKeys.TIMEOUT: 2.0}), "4": ("Star Tracker: Mode Raw", {OpCodeDictKeys.TIMEOUT: 2.0}), - "5": ("Star Tracker: Ping", {OpCodeDictKeys.TIMEOUT: 2.0}), + "5": ("Star Tracker: Ping", {OpCodeDictKeys.TIMEOUT: 5.0}), "6": ( "Star Tracker: Switch to bootloader program", {OpCodeDictKeys.TIMEOUT: 2.0}, diff --git a/pus_tc/devs/star_tracker.py b/pus_tc/devs/star_tracker.py index 47a06b0..0125211 100644 --- a/pus_tc/devs/star_tracker.py +++ b/pus_tc/devs/star_tracker.py @@ -148,7 +148,7 @@ class Submode: def pack_star_tracker_commands( object_id: bytearray, tc_queue: TcQueueT, op_code: str -) -> TcQueueT: +): tc_queue.appendleft( ( QueueCommands.PRINT, From 633bc406c7d5299626f5783df7af6816914b450f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 8 Apr 2022 14:10:44 +0200 Subject: [PATCH 2/6] submodule updates --- spacepackets | 2 +- tmtccmd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spacepackets b/spacepackets index 9cebf41..f31bf25 160000 --- a/spacepackets +++ b/spacepackets @@ -1 +1 @@ -Subproject commit 9cebf416583b0ce5b07081be9d832674ed4c9c4f +Subproject commit f31bf25eb9f3618973bf76f8d137eefa67c6cf4c diff --git a/tmtccmd b/tmtccmd index 4473b49..48b6b83 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 4473b490331d5ad4de50ee8c7d174993c1131f22 +Subproject commit 48b6b8396eb3ea5ec4527ccb96f5909a29cd95f6 From a966471fe560f126383cb826da1e1729141e7a7c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 12 Apr 2022 15:36:04 +0200 Subject: [PATCH 3/6] add pdu HK handler --- pus_tm/hk_handling.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 2f133ec..991972c 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -16,16 +16,8 @@ from pus_tc.devs.syrlinks_hk_handler import SetIds from pus_tc.devs.p60dock import SetIds from pus_tc.devs.imtq import ImtqSetIds from tmtccmd.pus.obj_id import ObjectId, ObjectIdDictT -from config.object_ids import ( - SYRLINKS_HANDLER_ID, - IMTQ_HANDLER_ID, - GPS_HANDLER_0_ID, - GPS_HANDLER_1_ID, - BPX_HANDLER_ID, - CORE_CONTROLLER_ID, - P60_DOCK_HANDLER, - PL_PCDU_ID, -) +import config.object_ids as obj_ids + LOGGER = get_console_logger() @@ -66,29 +58,33 @@ def handle_regular_hk_print( object_id = object_id.as_bytes set_id = hk_packet.set_id """This function is called when a Service 3 Housekeeping packet is received.""" - if object_id == SYRLINKS_HANDLER_ID: + if object_id == obj_ids.SYRLINKS_HANDLER_ID: if set_id == SetIds.RX_REGISTERS_DATASET: return handle_syrlinks_rx_registers_dataset(printer, hk_data) elif set_id == SetIds.TX_REGISTERS_DATASET: return handle_syrlinks_tx_registers_dataset(printer, hk_data) else: LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id") - elif object_id == IMTQ_HANDLER_ID: + elif object_id == obj_ids.IMTQ_HANDLER_ID: if (set_id >= ImtqSetIds.POSITIVE_X_TEST) and ( set_id <= ImtqSetIds.NEGATIVE_Z_TEST ): return handle_self_test_data(printer, hk_data) else: LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id") - elif object_id == GPS_HANDLER_0_ID or object_id == GPS_HANDLER_1_ID: + elif object_id == obj_ids.GPS_HANDLER_0_ID or object_id == obj_ids.GPS_HANDLER_1_ID: handle_gps_data(printer=printer, hk_data=hk_data) - elif object_id == BPX_HANDLER_ID: + elif object_id == obj_ids.BPX_HANDLER_ID: handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer) - elif object_id == CORE_CONTROLLER_ID: + elif object_id == obj_ids.CORE_CONTROLLER_ID: return handle_core_hk_data(printer=printer, hk_data=hk_data) - elif object_id == P60_DOCK_HANDLER: + elif object_id == obj_ids.PDU_1_HANDLER_ID: + return handle_pdu_data(printer=printer, pdu_idx=1, hk_data=hk_data) + elif object_id == obj_ids.PDU_2_HANDLER_ID: + return handle_pdu_data(printer=printer, pdu_idx=2, hk_data=hk_data) + elif object_id == obj_ids.P60_DOCK_HANDLER: handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) - elif object_id == PL_PCDU_ID: + elif object_id == obj_ids.PL_PCDU_ID: log_to_both(printer, "Received PL PCDU HK data") else: LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.") @@ -430,6 +426,10 @@ P60_INDEX_LIST = [ WDT_LIST = ["GND", "I2C", "CAN", "CSP0", "CSP1"] +def handle_pdu_data(printer: FsfwTmTcPrinter, pdu_idx: int, hk_data: bytes): + log_to_both(printer, f"Received PDU HK from PDU {pdu_idx}") + + def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): if set_id == SetIds.P60_CORE: log_to_both(printer, "Received P60 Core HK. Voltages in mV, currents in mA") From 259cd25b6ed7a88790dff58483537eb250036f00 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 12 Apr 2022 16:00:37 +0200 Subject: [PATCH 4/6] continued pdu1 pdu2 handling --- gomspace/gomspace_common.py | 12 +++--- pus_tm/hk_handling.py | 75 +++++++++++++++++++++++++++++++++++-- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/gomspace/gomspace_common.py b/gomspace/gomspace_common.py index e7fa956..c8741c1 100644 --- a/gomspace/gomspace_common.py +++ b/gomspace/gomspace_common.py @@ -37,11 +37,13 @@ class Info: class SetIds: - PDU_1 = 1 - PDU_2 = 2 - P60_CORE = 3 - P60_AUX = 4 - ACU = 5 + PDU_1_CORE = 1 + PDU_1_AUX = 2 + PDU_2_CORE = 3 + PDU_2_AUX = 4 + P60_CORE = 5 + P60_AUX = 6 + ACU = 7 class TableIds: diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 991972c..5d59eda 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -425,10 +425,79 @@ P60_INDEX_LIST = [ WDT_LIST = ["GND", "I2C", "CAN", "CSP0", "CSP1"] +PDU1_CHANNELS_NAMES = [ + "TCS Board", + "Syrlinks", + "Startracker", + "MGT", + "SUS Nominal", + "SCEX", + "PLOC", + "ACS A Side", + "Unused Channel 8" +] + +PDU2_CHANNELS_NAMES = [ + "Q7S", + "Payload PCDU CH1", + "RW", + "TCS Heater In", + "SUS Redundant", + "Deployment Mechanism", + "Payload PCDU CH6", + "ACS B Side", + "Payload Camera" +] + +PDU_CHANNEL_NAMES = [ + PDU1_CHANNELS_NAMES, + PDU2_CHANNELS_NAMES +] + + +def handle_pdu_data(printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes): + if set_id == SetIds.PDU_1_AUX or set_id == SetIds.PDU_2_AUX: + log_to_both(printer, "PDU AUX HK TODO") + if set_id == SetIds.PDU_1_CORE or set_id == SetIds.PDU_2_CORE: + log_to_both(printer, f"Received PDU HK from PDU {pdu_idx}") + current_list = [] + current_idx = 0 + priv_idx = pdu_idx - 1 + for idx in range(len(PDU1_CHANNELS_NAMES)): + current_list.append( + struct.unpack("!h", hk_data[current_idx: current_idx + 2])[0] + ) + current_idx += 2 + voltage_list = [] + for idx in range(len(PDU1_CHANNELS_NAMES)): + voltage_list.append( + struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] + ) + current_idx += 2 + output_enb_list = [] + for idx in range(len(PDU1_CHANNELS_NAMES)): + output_enb_list.append(hk_data[current_idx]) + current_idx += 1 + header_str = f"{'Name'.ljust(24)} | OutEnb | U [mV] | I [mA]" + print(header_str) + printer.file_logger.info(header_str) + for idx in range(len(PDU1_CHANNELS_NAMES)): + out_enb = f"{output_enb_list[idx]}".ljust(6) + content_line = ( + f"{PDU_CHANNEL_NAMES[priv_idx][idx].ljust(24)} | {out_enb} | " + f"{voltage_list[idx]:05} | {current_list[idx]:04}" + ) + log_to_both(printer, content_line) + fmt_str = "!IBh" + inc_len = struct.calcsize(fmt_str) + ( + boot_count, + batt_mode, + temperature + ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) + info = f"Boot Count {boot_count} | Battery Mode {batt_mode} | Temperature {temperature}" + log_to_both(printer, info) -def handle_pdu_data(printer: FsfwTmTcPrinter, pdu_idx: int, hk_data: bytes): - log_to_both(printer, f"Received PDU HK from PDU {pdu_idx}") - def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): if set_id == SetIds.P60_CORE: From c995ca2ddac4b352bce34071366a8cee7724973a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 12 Apr 2022 16:10:51 +0200 Subject: [PATCH 5/6] core hk handling working --- pus_tc/devs/pdu1.py | 4 ++-- pus_tc/devs/pdu2.py | 4 ++-- pus_tm/hk_handling.py | 38 +++++++++++++++++++++----------------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/pus_tc/devs/pdu1.py b/pus_tc/devs/pdu1.py index c7897af..a1799b0 100644 --- a/pus_tc/devs/pdu1.py +++ b/pus_tc/devs/pdu1.py @@ -211,8 +211,8 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE: - tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Requesting HK Table Once")) - hk_sid = make_sid(object_id=PDU_1_HANDLER_ID, set_id=SetIds.PDU_1) + tc_queue.appendleft((QueueCommands.PRINT, f"PDU1: {Info.REQUEST_CORE_HK_ONCE}")) + hk_sid = make_sid(object_id=PDU_1_HANDLER_ID, set_id=SetIds.PDU_1_CORE) command = generate_one_hk_command(sid=hk_sid, ssc=0) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I: diff --git a/pus_tc/devs/pdu2.py b/pus_tc/devs/pdu2.py index 0ab8829..1c8f9b7 100644 --- a/pus_tc/devs/pdu2.py +++ b/pus_tc/devs/pdu2.py @@ -233,8 +233,8 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE: - tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Requesting HK Table Once")) - hk_sid = make_sid(object_id=PDU_2_HANDLER_ID, set_id=SetIds.PDU_2) + tc_queue.appendleft((QueueCommands.PRINT, f"PDU2: {Info.REQUEST_CORE_HK_ONCE}")) + hk_sid = make_sid(object_id=PDU_2_HANDLER_ID, set_id=SetIds.PDU_2_CORE) command = generate_one_hk_command(sid=hk_sid, ssc=0) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I: diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 5d59eda..ccf3dad 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -79,9 +79,13 @@ def handle_regular_hk_print( elif object_id == obj_ids.CORE_CONTROLLER_ID: return handle_core_hk_data(printer=printer, hk_data=hk_data) elif object_id == obj_ids.PDU_1_HANDLER_ID: - return handle_pdu_data(printer=printer, pdu_idx=1, hk_data=hk_data) + return handle_pdu_data( + printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data + ) elif object_id == obj_ids.PDU_2_HANDLER_ID: - return handle_pdu_data(printer=printer, pdu_idx=2, hk_data=hk_data) + return handle_pdu_data( + printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data + ) elif object_id == obj_ids.P60_DOCK_HANDLER: handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) elif object_id == obj_ids.PL_PCDU_ID: @@ -434,7 +438,7 @@ PDU1_CHANNELS_NAMES = [ "SCEX", "PLOC", "ACS A Side", - "Unused Channel 8" + "Unused Channel 8", ] PDU2_CHANNELS_NAMES = [ @@ -446,16 +450,15 @@ PDU2_CHANNELS_NAMES = [ "Deployment Mechanism", "Payload PCDU CH6", "ACS B Side", - "Payload Camera" + "Payload Camera", ] -PDU_CHANNEL_NAMES = [ - PDU1_CHANNELS_NAMES, - PDU2_CHANNELS_NAMES -] +PDU_CHANNEL_NAMES = [PDU1_CHANNELS_NAMES, PDU2_CHANNELS_NAMES] -def handle_pdu_data(printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes): +def handle_pdu_data( + printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes +): if set_id == SetIds.PDU_1_AUX or set_id == SetIds.PDU_2_AUX: log_to_both(printer, "PDU AUX HK TODO") if set_id == SetIds.PDU_1_CORE or set_id == SetIds.PDU_2_CORE: @@ -465,13 +468,13 @@ def handle_pdu_data(printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data priv_idx = pdu_idx - 1 for idx in range(len(PDU1_CHANNELS_NAMES)): current_list.append( - struct.unpack("!h", hk_data[current_idx: current_idx + 2])[0] + struct.unpack("!h", hk_data[current_idx : current_idx + 2])[0] ) current_idx += 2 voltage_list = [] for idx in range(len(PDU1_CHANNELS_NAMES)): voltage_list.append( - struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] + struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] ) current_idx += 2 output_enb_list = [] @@ -490,12 +493,13 @@ def handle_pdu_data(printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data log_to_both(printer, content_line) fmt_str = "!IBh" inc_len = struct.calcsize(fmt_str) - ( - boot_count, - batt_mode, - temperature - ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) - info = f"Boot Count {boot_count} | Battery Mode {batt_mode} | Temperature {temperature}" + (boot_count, batt_mode, temperature) = struct.unpack( + fmt_str, hk_data[current_idx : current_idx + inc_len] + ) + info = ( + f"Boot Count {boot_count} | Battery Mode {batt_mode} | " + f"Temperature {temperature / 10.0}" + ) log_to_both(printer, info) From ecb973c37fe43954d0be1f19b0735b3546d2ef1b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 12 Apr 2022 16:35:34 +0200 Subject: [PATCH 6/6] hk handling working for both core and aux from pdus --- pus_tc/cmd_definitions.py | 14 ++++- pus_tc/devs/pdu1.py | 11 +++- pus_tc/devs/pdu2.py | 11 +++- pus_tm/hk_handling.py | 112 +++++++++++++++++++++++++++++--------- 4 files changed, 118 insertions(+), 30 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 26691ca..b5eb7ca 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -335,7 +335,12 @@ def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): add_op_code_entry( op_code_dict=op_code_dict, keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE, - info="PDU1: Request HK once", + info=GsInfo.REQUEST_CORE_HK_ONCE, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE, + info=GsInfo.REQUEST_AUX_HK_ONCE, ) add_op_code_entry( op_code_dict=op_code_dict, @@ -442,7 +447,12 @@ def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): add_op_code_entry( op_code_dict=op_code_dict, keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE, - info="PDU2: Request HK once", + info=GsInfo.REQUEST_CORE_HK_ONCE, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE, + info=GsInfo.REQUEST_AUX_HK_ONCE, ) add_op_code_entry( op_code_dict=op_code_dict, diff --git a/pus_tc/devs/pdu1.py b/pus_tc/devs/pdu1.py index a1799b0..2028639 100644 --- a/pus_tc/devs/pdu1.py +++ b/pus_tc/devs/pdu1.py @@ -5,7 +5,11 @@ """ from tmtccmd.config.definitions import QueueCommands from tmtccmd.tc.packer import TcQueueT -from tmtccmd.tc.service_3_housekeeping import generate_one_hk_command, make_sid +from tmtccmd.tc.service_3_housekeeping import ( + generate_one_hk_command, + make_sid, + generate_one_diag_command, +) from gomspace.gomspace_common import * from gomspace.gomspace_pdu_definitions import * from config.object_ids import PDU_1_HANDLER_ID @@ -213,6 +217,11 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE: tc_queue.appendleft((QueueCommands.PRINT, f"PDU1: {Info.REQUEST_CORE_HK_ONCE}")) hk_sid = make_sid(object_id=PDU_1_HANDLER_ID, set_id=SetIds.PDU_1_CORE) + command = generate_one_diag_command(sid=hk_sid, ssc=0) + tc_queue.appendleft(command.pack_command_tuple()) + if op_code in GomspaceOpCodes.REQUEST_AUX_HK_ONCE: + tc_queue.appendleft((QueueCommands.PRINT, f"PDU1: {Info.REQUEST_AUX_HK_ONCE}")) + hk_sid = make_sid(object_id=PDU_1_HANDLER_ID, set_id=SetIds.PDU_1_AUX) command = generate_one_hk_command(sid=hk_sid, ssc=0) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I: diff --git a/pus_tc/devs/pdu2.py b/pus_tc/devs/pdu2.py index 1c8f9b7..c4e3623 100644 --- a/pus_tc/devs/pdu2.py +++ b/pus_tc/devs/pdu2.py @@ -8,7 +8,11 @@ """ from tmtccmd.config.definitions import QueueCommands from tmtccmd.tc.packer import TcQueueT -from tmtccmd.tc.service_3_housekeeping import generate_one_hk_command, make_sid +from tmtccmd.tc.service_3_housekeeping import ( + generate_one_hk_command, + generate_one_diag_command, + make_sid, +) from gomspace.gomspace_common import * from gomspace.gomspace_pdu_definitions import * from config.object_ids import PDU_2_HANDLER_ID @@ -235,6 +239,11 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE: tc_queue.appendleft((QueueCommands.PRINT, f"PDU2: {Info.REQUEST_CORE_HK_ONCE}")) hk_sid = make_sid(object_id=PDU_2_HANDLER_ID, set_id=SetIds.PDU_2_CORE) + command = generate_one_diag_command(sid=hk_sid, ssc=0) + tc_queue.appendleft(command.pack_command_tuple()) + if op_code in GomspaceOpCodes.REQUEST_AUX_HK_ONCE: + tc_queue.appendleft((QueueCommands.PRINT, f"PDU2: {Info.REQUEST_AUX_HK_ONCE}")) + hk_sid = make_sid(object_id=PDU_2_HANDLER_ID, set_id=SetIds.PDU_2_AUX) command = generate_one_hk_command(sid=hk_sid, ssc=0) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I: diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index ccf3dad..0902f36 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -456,16 +456,96 @@ PDU2_CHANNELS_NAMES = [ PDU_CHANNEL_NAMES = [PDU1_CHANNELS_NAMES, PDU2_CHANNELS_NAMES] +class WdtInfo: + def __init__(self): + self.wdt_reboots_list = [] + self.time_pings_left_list = [] + + def print(self, printer: FsfwTmTcPrinter): + wdt_info = "WDT Type | Reboots | Time or Pings left (CSP only)" + log_to_both(printer, wdt_info) + for idx in range(len(self.wdt_reboots_list)): + log_to_both( + printer, + f"{WDT_LIST[idx].ljust(5)} | " + f"{self.wdt_reboots_list[idx]:010} | {self.time_pings_left_list[idx]:010}", + ) + + def parse(self, wdt_data: bytes, current_idx: int) -> int: + priv_idx = 0 + self.wdt_reboots_list = [] + self.time_pings_left_list = [] + for idx in range(5): + self.wdt_reboots_list.append( + struct.unpack("!I", wdt_data[priv_idx : priv_idx + 4])[0] + ) + priv_idx += 4 + current_idx += 4 + for idx in range(3): + self.time_pings_left_list.append( + struct.unpack("!I", wdt_data[priv_idx : priv_idx + 4])[0] + ) + priv_idx += 4 + current_idx += 4 + for idx in range(2): + self.time_pings_left_list.append(wdt_data[priv_idx]) + current_idx += 1 + priv_idx += 1 + return current_idx + + def handle_pdu_data( printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes ): + current_idx = 0 + priv_idx = pdu_idx - 1 if set_id == SetIds.PDU_1_AUX or set_id == SetIds.PDU_2_AUX: - log_to_both(printer, "PDU AUX HK TODO") + fmt_str = "!hhBBBIIH" + inc_len = struct.calcsize(fmt_str) + ( + vcc, + vbat, + conv_enb_0, + conv_enb_1, + conv_enb_2, + boot_cause, + uptime, + reset_cause, + ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) + log_to_both(printer, f"VCC {vcc} mV | VBAT {vbat} mV") + log_to_both( + printer, f"Converter Enables [{conv_enb_0},{conv_enb_1},{conv_enb_2}]" + ) + log_to_both( + printer, + f"Boot Cause {boot_cause} | Uptime {uptime} | Reset Cause {reset_cause}", + ) + current_idx += inc_len + latchup_list = [] + log_to_both(printer, "Latchups") + for idx in range(len(PDU1_CHANNELS_NAMES)): + latchup_list.append( + struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] + ) + content_line = ( + f"{PDU_CHANNEL_NAMES[priv_idx][idx].ljust(24)} | {latchup_list[idx]}" + ) + log_to_both(printer, content_line) + current_idx += 2 + device_types = [] + for idx in range(len(PDU1_CHANNELS_NAMES)): + device_types.append(hk_data[current_idx]) + current_idx += 1 + device_statuses = [] + for idx in range(len(PDU1_CHANNELS_NAMES)): + device_statuses.append(hk_data[current_idx]) + current_idx += 1 + wdt = WdtInfo() + current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx) + wdt.print(printer=printer) if set_id == SetIds.PDU_1_CORE or set_id == SetIds.PDU_2_CORE: log_to_both(printer, f"Received PDU HK from PDU {pdu_idx}") current_list = [] - current_idx = 0 - priv_idx = pdu_idx - 1 for idx in range(len(PDU1_CHANNELS_NAMES)): current_list.append( struct.unpack("!h", hk_data[current_idx : current_idx + 2])[0] @@ -579,21 +659,8 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): dearm_status, ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) current_idx += inc_len - wdt_reboots_list = [] - for idx in range(5): - wdt_reboots_list.append( - struct.unpack("!I", hk_data[current_idx : current_idx + 4])[0] - ) - current_idx += 4 - time_pings_left_list = [] - for idx in range(3): - time_pings_left_list.append( - struct.unpack("!I", hk_data[current_idx : current_idx + 4])[0] - ) - current_idx += 4 - for idx in range(2): - time_pings_left_list.append(hk_data[current_idx]) - current_idx += 1 + wdt = WdtInfo() + current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx) fmt_str = "!hhbb" inc_len = struct.calcsize(fmt_str) ( @@ -620,14 +687,7 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): ) log_to_both(printer, util_info) log_to_both(printer, util_info_2) - wdt_info = "WDT Type | Reboots | Time or Pings left (CSP only)" - log_to_both(printer, wdt_info) - for idx in range(len(wdt_reboots_list)): - log_to_both( - printer, - f"{WDT_LIST[idx].ljust(5)} | " - f"{wdt_reboots_list[idx]:010} | {time_pings_left_list[idx]:010}", - ) + wdt.print(printer) misc_info = ( f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}" )