From aadbfb2594f4032e63798aabddb767fc1a9a68d0 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Tue, 17 May 2022 10:41:45 +0200 Subject: [PATCH 001/132] Added TCs to command Thermal Controller (to be continued) --- config/definitions.py | 1 + config/object_ids.py | 1 + pus_tc/cmd_definitions.py | 21 +++++++++++++++++++++ pus_tc/system/acs.py | 25 ++++++++++++------------- pus_tc/system/common.py | 2 +- pus_tc/system/controllers.py | 35 +++++++++++++++++++++++++++++++++++ pus_tc/system/tcs.py | 6 +++--- pus_tc/tc_packer_hook.py | 3 +++ 8 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 pus_tc/system/controllers.py diff --git a/config/definitions.py b/config/definitions.py index d6a75f9..882fd97 100644 --- a/config/definitions.py +++ b/config/definitions.py @@ -47,3 +47,4 @@ class CustomServiceList(enum.Enum): SUS_ASS = "sus-ass" TCS_ASS = "tcs-ass" TIME = "time" + CONTROLLERS = "controllers" diff --git a/config/object_ids.py b/config/object_ids.py index e678f9c..99c5b9b 100644 --- a/config/object_ids.py +++ b/config/object_ids.py @@ -27,6 +27,7 @@ ACU_HANDLER_ID = bytes([0x44, 0x25, 0x00, 0x03]) BPX_HANDLER_ID = bytes([0x44, 0x26, 0x00, 0x00]) # Thermal Object IDs +THERMAL_CONTROLLER_ID = bytes([0x43, 0x40, 0x00, 0x01]) HEATER_ID = bytes([0x44, 0x41, 0x00, 0xA4]) TMP_1075_1_HANDLER_ID = bytes([0x44, 0x42, 0x00, 0x04]) TMP_1075_2_HANDLER_ID = bytes([0x44, 0x42, 0x00, 0x05]) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 3db7e9d..1bec4da 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -944,6 +944,7 @@ def add_ploc_supv_cmds(cmd_dict: ServiceOpCodeDictT): def add_system_cmds(cmd_dict: ServiceOpCodeDictT): from pus_tc.system.acs import AcsOpCodes, SusOpCodes import pus_tc.system.tcs as tcs + import pus_tc.system.controllers as controllers default_opts = generate_op_code_options( enter_listener_mode=False, custom_timeout=8.0 @@ -1049,3 +1050,23 @@ def add_system_cmds(cmd_dict: ServiceOpCodeDictT): info="TCS Board Assembly", op_code_entry=op_code_dict, ) + + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, + keys=controllers.OpCodes.THERMAL_CONTROLLER_NORMAL, + info=controllers.Info.THERMAL_CONTROLLER_NORMAL, + options=default_opts, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=controllers.OpCodes.THERMAL_CONTROLLER_OFF, + info=controllers.Info.THERMAL_CONTROLLER_OFF, + options=default_opts, + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.CONTROLLERS.value, + info="Controllers", + op_code_entry=op_code_dict, + ) diff --git a/pus_tc/system/acs.py b/pus_tc/system/acs.py index ea97734..7d3eb48 100644 --- a/pus_tc/system/acs.py +++ b/pus_tc/system/acs.py @@ -3,8 +3,7 @@ from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.pus_200_fsfw_modes import Modes from config.object_ids import ACS_BOARD_ASS_ID, SUS_BOARD_ASS_ID -from .common import command_assembly - +from .common import command_mode class AcsOpCodes: ACS_ASS_A_SIDE = ["0", "acs-a"] @@ -31,7 +30,7 @@ class DualSideSubmodes(enum.IntEnum): def pack_acs_command(tc_queue: TcQueueT, op_code: str): if op_code in AcsOpCodes.ACS_ASS_A_SIDE: - command_assembly( + command_mode( object_id=ACS_BOARD_ASS_ID, mode=Modes.NORMAL, submode=DualSideSubmodes.A_SIDE, @@ -39,7 +38,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str): info="Switching to ACS board assembly A side", ) if op_code in AcsOpCodes.ACS_ASS_B_SIDE: - command_assembly( + command_mode( object_id=ACS_BOARD_ASS_ID, mode=Modes.NORMAL, submode=DualSideSubmodes.B_SIDE, @@ -47,7 +46,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str): info="Switching to ACS board assembly B side", ) if op_code in AcsOpCodes.ACS_ASS_DUAL_MODE: - command_assembly( + command_mode( object_id=ACS_BOARD_ASS_ID, mode=Modes.NORMAL, submode=DualSideSubmodes.DUAL_SIDE, @@ -55,7 +54,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str): info="Switching to ACS board assembly dual mode", ) if op_code in AcsOpCodes.ACS_ASS_A_ON: - command_assembly( + command_mode( object_id=ACS_BOARD_ASS_ID, mode=Modes.ON, submode=DualSideSubmodes.A_SIDE, @@ -63,7 +62,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str): info="Switching ACS board assembly A side on", ) if op_code in AcsOpCodes.ACS_ASS_B_ON: - command_assembly( + command_mode( object_id=ACS_BOARD_ASS_ID, mode=Modes.ON, submode=DualSideSubmodes.B_SIDE, @@ -71,7 +70,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str): info="Switching ACS board assembly B side on", ) if op_code in AcsOpCodes.ACS_ASS_DUAL_ON: - command_assembly( + command_mode( object_id=ACS_BOARD_ASS_ID, mode=Modes.ON, submode=DualSideSubmodes.B_SIDE, @@ -79,7 +78,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str): info="Switching ACS board assembly dual side on", ) if op_code in AcsOpCodes.ACS_ASS_OFF: - command_assembly( + command_mode( object_id=ACS_BOARD_ASS_ID, mode=Modes.OFF, submode=0, @@ -90,7 +89,7 @@ def pack_acs_command(tc_queue: TcQueueT, op_code: str): def pack_sus_cmds(tc_queue: TcQueueT, op_code: str): if op_code in SusOpCodes.SUS_ASS_NOM_SIDE: - command_assembly( + command_mode( object_id=SUS_BOARD_ASS_ID, mode=Modes.NORMAL, submode=DualSideSubmodes.A_SIDE, @@ -98,7 +97,7 @@ def pack_sus_cmds(tc_queue: TcQueueT, op_code: str): info="Switching to SUS board to nominal side", ) if op_code in SusOpCodes.SUS_ASS_RED_SIDE: - command_assembly( + command_mode( object_id=SUS_BOARD_ASS_ID, mode=Modes.NORMAL, submode=DualSideSubmodes.B_SIDE, @@ -106,7 +105,7 @@ def pack_sus_cmds(tc_queue: TcQueueT, op_code: str): info="Switching to SUS board to redundant side", ) if op_code in SusOpCodes.SUS_ASS_OFF: - command_assembly( + command_mode( object_id=SUS_BOARD_ASS_ID, mode=Modes.OFF, submode=0, @@ -114,7 +113,7 @@ def pack_sus_cmds(tc_queue: TcQueueT, op_code: str): info="Switching SUS board off", ) if op_code in SusOpCodes.SUS_ASS_DUAL_MODE: - command_assembly( + command_mode( object_id=SUS_BOARD_ASS_ID, mode=Modes.NORMAL, submode=DualSideSubmodes.DUAL_SIDE, diff --git a/pus_tc/system/common.py b/pus_tc/system/common.py index 55ae7b3..c712ea3 100644 --- a/pus_tc/system/common.py +++ b/pus_tc/system/common.py @@ -3,7 +3,7 @@ from spacepackets.ecss.tc import PusTelecommand from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes, Subservices -def command_assembly( +def command_mode( object_id: bytes, mode: Modes, submode: int, tc_queue: TcQueueT, info: str ): tc_queue.appendleft((QueueCommands.PRINT, info)) diff --git a/pus_tc/system/controllers.py b/pus_tc/system/controllers.py new file mode 100644 index 0000000..183d1ec --- /dev/null +++ b/pus_tc/system/controllers.py @@ -0,0 +1,35 @@ +from tmtccmd.tc.definitions import TcQueueT, QueueCommands +from tmtccmd.tc.pus_200_fsfw_modes import Modes + +from .common import command_mode +import config.object_ids as obj_ids + + +class OpCodes: + THERMAL_CONTROLLER_NORMAL = ["0", "thermal-normal"] + THERMAL_CONTROLLER_OFF = ["1", "thermal-off"] + + +class Info: + THERMAL_CONTROLLER_NORMAL = "Switching Thermal Controller into normal" + THERMAL_CONTROLLER_OFF = "Switching Thermal Controller off" + + +def pack_controller_commands(tc_queue: TcQueueT, op_code: str): + if op_code in OpCodes.THERMAL_CONTROLLER_NORMAL: + command_mode( + object_id=obj_ids.THERMAL_CONTROLLER_ID, + mode=Modes.NORMAL, + submode=0, + tc_queue=tc_queue, + info=Info.THERMAL_CONTROLLER_NORMAL, + ) + if op_code in OpCodes.THERMAL_CONTROLLER_OFF: + command_mode( + object_id=obj_ids.THERMAL_CONTROLLER_ID, + mode=Modes.OFF, + submode=0, + tc_queue=tc_queue, + info=Info.THERMAL_CONTROLLER_OFF, + ) + diff --git a/pus_tc/system/tcs.py b/pus_tc/system/tcs.py index 5b98ddc..47ab31d 100644 --- a/pus_tc/system/tcs.py +++ b/pus_tc/system/tcs.py @@ -1,7 +1,7 @@ from tmtccmd.tc.definitions import TcQueueT, QueueCommands from tmtccmd.tc.pus_200_fsfw_modes import Modes -from .common import command_assembly +from .common import command_mode from config.object_ids import TCS_BOARD_ASS_ID @@ -17,7 +17,7 @@ class Info: def pack_tcs_sys_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.TCS_BOARD_ASS_NORMAL: - command_assembly( + command_mode( object_id=TCS_BOARD_ASS_ID, mode=Modes.NORMAL, submode=0, @@ -25,7 +25,7 @@ def pack_tcs_sys_commands(tc_queue: TcQueueT, op_code: str): info=Info.TCS_BOARD_ASS_NORMAL, ) if op_code in OpCodes.TCS_BOARD_ASS_OFF: - command_assembly( + command_mode( object_id=TCS_BOARD_ASS_ID, mode=Modes.OFF, submode=0, diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py index e999f59..52046cb 100644 --- a/pus_tc/tc_packer_hook.py +++ b/pus_tc/tc_packer_hook.py @@ -41,6 +41,7 @@ from pus_tc.system.acs import pack_acs_command, pack_sus_cmds from pus_tc.devs.plpcdu import pack_pl_pcdu_commands from pus_tc.devs.str_img_helper import pack_str_img_helper_command from pus_tc.system.tcs import pack_tcs_sys_commands +from pus_tc.system.controllers import pack_controller_commands from config.definitions import CustomServiceList from config.object_ids import ( P60_DOCK_HANDLER, @@ -239,6 +240,8 @@ def pack_service_queue_user( return pack_rw_ass_cmds( tc_queue=service_queue, object_id=RW_ASSEMBLY, op_code=op_code ) + if service == CustomServiceList.CONTROLLERS.value: + return pack_controller_commands(tc_queue=service_queue, op_code=op_code) LOGGER.warning("Invalid Service !") From 05ca9e37c3d57891fc29d529958f32253c8e9c5d Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Tue, 17 May 2022 10:43:59 +0200 Subject: [PATCH 002/132] WIP: parsing Thermal Controller TM and sending it via TCP/IP --- pus_tm/hk_handling.py | 51 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 4dd3d25..5c975c4 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -2,6 +2,8 @@ import struct import os import datetime +import json +import socket from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter from tmtccmd.config.definitions import HkReplyUnpacked @@ -21,6 +23,12 @@ import config.object_ids as obj_ids from pus_tm.devs.reaction_wheels import handle_rw_hk_data from pus_tm.defs import PrintWrapper, FsfwTmTcPrinter, log_to_both + +#TODO add to configuration parameters +THERMAL_HOST = "127.0.0.1" +THERMAL_PORT = 7302 + + LOGGER = get_console_logger() @@ -98,6 +106,8 @@ def handle_regular_hk_print( handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) if objb == obj_ids.PL_PCDU_ID: log_to_both(printer, "Received PL PCDU HK data") + if objb == obj_ids.THERMAL_CONTROLLER_ID: + handle_thermal_controller_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) else: LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.") return HkReplyUnpacked() @@ -289,6 +299,47 @@ def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes): log_to_both(printer, str(content_list)) printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars) +def handle_thermal_controller_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + if set_id == 0: + LOGGER.info("Received Sensor Temperature data") + + #get all the floats + tm_data = struct.unpack("!ffffffffffffffff", hk_data[:16*4]) + parsed_data = {} + + #put them into a nice dictionary + parsed_data["SID"] = set_id + parsed_data["content"] = {} + parsed_data["content"]["SENSOR_PLOC_HEATSPREADER"] = tm_data[0] + parsed_data["content"]["SENSOR_PLOC_MISSIONBOARD"] = tm_data[1] + parsed_data["content"]["SENSOR_4K_CAMERA"] = tm_data[2] + parsed_data["content"]["SENSOR_DAC_HEATSPREADER"] = tm_data[3] + parsed_data["content"]["SENSOR_STARTRACKER"] = tm_data[4] + parsed_data["content"]["SENSOR_RW1"] = tm_data[5] + parsed_data["content"]["SENSOR_DRO"] = tm_data[6] + parsed_data["content"]["SENSOR_SCEX"] = tm_data[7] + parsed_data["content"]["SENSOR_X8"] = tm_data[8] + parsed_data["content"]["SENSOR_HPA"] = tm_data[9] + parsed_data["content"]["SENSOR_TX_MODUL"] = tm_data[10] + parsed_data["content"]["SENSOR_MPA"] = tm_data[11] + parsed_data["content"]["SENSOR_ACU"] = tm_data[12] + parsed_data["content"]["SENSOR_PLPCDU_HEATSPREADER"] = tm_data[13] + parsed_data["content"]["SENSOR_TCS_BOARD"] = tm_data[14] + parsed_data["content"]["SENSOR_MAGNETTORQUER"] = tm_data[15] + + #which in turn will become a json to be sent over the wire + json_string = json.dumps(parsed_data) + #print(json_string) + + #try to send it to a tcp server + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((THERMAL_HOST, THERMAL_PORT)) + s.sendall(bytes(json_string, encoding="utf-8")) + except: + #fail silently if there is noone listening, should be a non breaking feature + pass + def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes): LOGGER.info(f"Received GPS data, HK data length {len(hk_data)}") From a6f669e9740b98c1502e753509750bad7fdf6539 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 17 May 2022 17:21:03 +0200 Subject: [PATCH 003/132] cleaner TM handling --- pus_tc/cmd_definitions.py | 3 ++- pus_tc/devs/ploc_supervisor.py | 16 ++++++++-------- pus_tm/factory_hook.py | 11 ++++++++--- pus_tm/verification_handler.py | 2 -- tmtcc.py | 4 +++- tmtccli.py | 9 +++++++-- tmtccmd | 2 +- tmtcloop.py | 6 +++--- 8 files changed, 32 insertions(+), 21 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index dc21110..94f3e82 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -14,6 +14,7 @@ from pus_tc.devs.bpx_batt import BpxOpCodes def get_eive_service_op_code_dict() -> ServiceOpCodeDictT: from tmtccmd.config.globals import get_default_service_op_code_dict + service_op_code_dict = get_default_service_op_code_dict() add_bpx_cmd_definitions(cmd_dict=service_op_code_dict) add_core_controller_definitions(cmd_dict=service_op_code_dict) @@ -806,7 +807,7 @@ def add_ploc_mpsoc_cmds(cmd_dict: ServiceOpCodeDictT): "14": ("Ploc MPSoC: Mode replay", {OpCodeDictKeys.TIMEOUT: 2.0}), "15": ("Ploc MPSoC: Mode idle", {OpCodeDictKeys.TIMEOUT: 2.0}), "16": ("Ploc MPSoC: Tc cam command send", {OpCodeDictKeys.TIMEOUT: 2.0}), - "17": ("Ploc MPSoC: Set UART TX tristate" , {OpCodeDictKeys.TIMEOUT: 2.0}), + "17": ("Ploc MPSoC: Set UART TX tristate", {OpCodeDictKeys.TIMEOUT: 2.0}), "18": ("Ploc MPSoC: Relesase UART TX", {OpCodeDictKeys.TIMEOUT: 2.0}), } service_ploc_mpsoc_tuple = ("Ploc MPSoC", op_code_dict_srv_ploc_mpsoc) diff --git a/pus_tc/devs/ploc_supervisor.py b/pus_tc/devs/ploc_supervisor.py index d9b9104..c6fcd56 100644 --- a/pus_tc/devs/ploc_supervisor.py +++ b/pus_tc/devs/ploc_supervisor.py @@ -277,18 +277,14 @@ def pack_ploc_supv_commands( tc_queue.appendleft( (QueueCommands.PRINT, "PLOC Supervisor: Restart supervisor") ) - command = object_id + struct.pack( - "!I", SupvActionIds.RESTART_SUPERVISOR - ) + command = object_id + struct.pack("!I", SupvActionIds.RESTART_SUPERVISOR) command = PusTelecommand(service=8, subservice=128, ssc=52, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) elif op_code == "38": tc_queue.appendleft( (QueueCommands.PRINT, "PLOC Supervisor: Factory reset clear all") ) - command = object_id + struct.pack( - "!I", SupvActionIds.FACTORY_RESET_CLEAR_ALL - ) + command = object_id + struct.pack("!I", SupvActionIds.FACTORY_RESET_CLEAR_ALL) command = PusTelecommand(service=8, subservice=128, ssc=53, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) elif op_code == "39": @@ -393,8 +389,12 @@ def pack_ploc_supv_commands( tc_queue.appendleft((QueueCommands.PRINT, "PLOC Supervisor: Enable NVMs")) nvm01 = int(input("Enable (1) or disable(0) NVM 0 and 1: ")) nvm3 = int(input("Enable (1) or disable(0) NVM 3: ")) - command = object_id + struct.pack('!I', SupvActionIds.ENABLE_NVMS) + struct.pack('B', nvm01) + \ - struct.pack('B', nvm3) + command = ( + object_id + + struct.pack("!I", SupvActionIds.ENABLE_NVMS) + + struct.pack("B", nvm01) + + struct.pack("B", nvm3) + ) command = PusTelecommand(service=8, subservice=128, ssc=72, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) diff --git a/pus_tm/factory_hook.py b/pus_tm/factory_hook.py index d1829ca..6fdca91 100644 --- a/pus_tm/factory_hook.py +++ b/pus_tm/factory_hook.py @@ -41,7 +41,9 @@ def pus_factory_hook(raw_tm_packet: bytes): subservice_type = raw_tm_packet[8] file_logger = FSFW_PRINTER.file_logger obj_id_dict = get_object_ids() + dedicated_handler = True try: + tm_packet = None if service_type == 1: handle_service_1_packet(printer=FSFW_PRINTER, raw_tm=raw_tm_packet) elif service_type == 3: @@ -58,19 +60,22 @@ def pus_factory_hook(raw_tm_packet: bytes): ) elif service_type == 17: tm_packet = Service17TMExtended.unpack(raw_telemetry=raw_tm_packet) - FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet) + dedicated_handler = False elif service_type == 20: tm_packet = Service20FsfwTm.unpack(raw_telemetry=raw_tm_packet) - FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet) + dedicated_handler = False elif service_type == 200: tm_packet = Service200FsfwTm.unpack(raw_telemetry=raw_tm_packet) - FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet) + dedicated_handler = False else: LOGGER.info( f"The service {service_type} is not implemented in Telemetry Factory" ) tm_packet = PusTelemetry.unpack(raw_telemetry=raw_tm_packet) tm_packet.print_source_data(PrintFormats.HEX) + dedicated_handler = True + if not dedicated_handler and tm_packet is not None: + FSFW_PRINTER.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet) log_raw_pus_tm( packet=raw_tm_packet, srv_subservice=(service_type, subservice_type) ) diff --git a/pus_tm/verification_handler.py b/pus_tm/verification_handler.py index 6182f9d..08c0099 100644 --- a/pus_tm/verification_handler.py +++ b/pus_tm/verification_handler.py @@ -1,5 +1,3 @@ -import logging -from datetime import datetime from typing import cast from tmtccmd.tm.pus_1_verification import Service1TMExtended diff --git a/tmtcc.py b/tmtcc.py index 0dc37b3..e704716 100644 --- a/tmtcc.py +++ b/tmtcc.py @@ -45,7 +45,9 @@ def tmtcc_pre_args() -> EiveHookObject: return EiveHookObject(json_cfg_path=default_json_path()) -def tmtcc_post_args(hook_obj: EiveHookObject, use_gui: bool, args: Optional[argparse.Namespace]): +def tmtcc_post_args( + hook_obj: EiveHookObject, use_gui: bool, args: Optional[argparse.Namespace] +): setup_args = SetupArgs( hook_obj=hook_obj, use_gui=use_gui, apid=PUS_APID, cli_args=args ) diff --git a/tmtccli.py b/tmtccli.py index 3541bd4..29f3615 100755 --- a/tmtccli.py +++ b/tmtccli.py @@ -1,7 +1,12 @@ #!/usr/bin/env python3 """TMTC commander for EIVE""" -from tmtcc import tmtcc_post_args, tmtcc_pre_args, create_default_args_parser, \ - add_default_tmtccmd_args, parse_default_input_arguments +from tmtcc import ( + tmtcc_post_args, + tmtcc_pre_args, + create_default_args_parser, + add_default_tmtccmd_args, + parse_default_input_arguments, +) def main(): diff --git a/tmtccmd b/tmtccmd index 0895aae..e81e6db 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 0895aae63414cdca4a16c53028fe72401c1b50e0 +Subproject commit e81e6dbd594c1cdf51cd355a724cbd267d9dee38 diff --git a/tmtcloop.py b/tmtcloop.py index d2cfb5b..c48f436 100755 --- a/tmtcloop.py +++ b/tmtcloop.py @@ -58,7 +58,7 @@ def main(): ) tmtc_file_logger = create_tmtc_logger() tmtc_backend.usr_send_wrapper = (pre_tc_send_cb, tmtc_file_logger) - + tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE) get_console_logger().info("Disabling console logger for continuous operation") @@ -69,7 +69,7 @@ def main(): # remove cmdline args so that we can reuse code sys.argv = sys.argv[:1] - + while True: args = parse_default_input_arguments(arg_parser, hook_obj) setup_args = SetupArgs( @@ -77,7 +77,7 @@ def main(): ) tmtccmd.setup(setup_args=setup_args) tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE) - + tmtccmd.performOperation(tmtc_backend=tmtc_backend) From 2beffdbb2772a831317ee917d8ff03e94269f14d Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Tue, 17 May 2022 22:04:56 +0200 Subject: [PATCH 004/132] updated tmtccmd version --- tmtccmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtccmd b/tmtccmd index 0895aae..862fdf2 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 0895aae63414cdca4a16c53028fe72401c1b50e0 +Subproject commit 862fdf23bc4a90ced47ee1c811de4237e3508536 From 73c8e95dce1ac4b5da56cdc7f6bedd6f24384926 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Tue, 17 May 2022 22:10:53 +0200 Subject: [PATCH 005/132] fixed looping mode --- tmtcloop.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tmtcloop.py b/tmtcloop.py index d2cfb5b..1302dac 100755 --- a/tmtcloop.py +++ b/tmtcloop.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """EIVE TMTC Commander""" +from distutils.log import debug import sys import traceback @@ -11,6 +12,7 @@ try: create_default_args_parser, add_default_tmtccmd_args, parse_default_input_arguments, + handle_unspecified_args, ) from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidHandler from tmtccmd.logging import get_console_logger @@ -62,7 +64,7 @@ def main(): tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE) get_console_logger().info("Disabling console logger for continuous operation") - get_console_logger().disabled = True + get_console_logger().setLevel("ERROR") tmtccmd.init_and_start_daemons(tmtc_backend=tmtc_backend) tmtccmd.performOperation(tmtc_backend=tmtc_backend) @@ -71,11 +73,12 @@ def main(): sys.argv = sys.argv[:1] while True: - args = parse_default_input_arguments(arg_parser, hook_obj) - setup_args = SetupArgs( - hook_obj=hook_obj, use_gui=False, apid=PUS_APID, cli_args=args - ) - tmtccmd.setup(setup_args=setup_args) + args.service = None + args.op_code = None + handle_unspecified_args(args, hook_obj.get_service_op_code_dictionary()) + + tmtc_backend.set_service(args.service) + tmtc_backend.set_opcode(args.op_code) tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE) tmtccmd.performOperation(tmtc_backend=tmtc_backend) From 476066a5ac261943a24caa5e1aa270595a6cc120 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Tue, 17 May 2022 22:11:31 +0200 Subject: [PATCH 006/132] changed controller commanding to allow more flexibility --- pus_tc/cmd_definitions.py | 8 +++--- pus_tc/system/controllers.py | 55 +++++++++++++++++++++--------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index c3ea712..db803da 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -1058,14 +1058,14 @@ def add_system_cmds(cmd_dict: ServiceOpCodeDictT): op_code_dict = dict() add_op_code_entry( op_code_dict=op_code_dict, - keys=controllers.OpCodes.THERMAL_CONTROLLER_NORMAL, - info=controllers.Info.THERMAL_CONTROLLER_NORMAL, + keys=controllers.OpCodes.THERMAL_CONTROLLER, + info=controllers.Info.THERMAL_CONTROLLER, options=default_opts, ) add_op_code_entry( op_code_dict=op_code_dict, - keys=controllers.OpCodes.THERMAL_CONTROLLER_OFF, - info=controllers.Info.THERMAL_CONTROLLER_OFF, + keys=controllers.OpCodes.CORE_CONTROLLER, + info=controllers.Info.CORE_CONTROLLER, options=default_opts, ) add_service_op_code_entry( diff --git a/pus_tc/system/controllers.py b/pus_tc/system/controllers.py index 183d1ec..30a5b4d 100644 --- a/pus_tc/system/controllers.py +++ b/pus_tc/system/controllers.py @@ -1,35 +1,44 @@ -from tmtccmd.tc.definitions import TcQueueT, QueueCommands -from tmtccmd.tc.pus_200_fsfw_modes import Modes +from ast import Pass +from tmtccmd.tc.definitions import TcQueueT + + from .common import command_mode import config.object_ids as obj_ids class OpCodes: - THERMAL_CONTROLLER_NORMAL = ["0", "thermal-normal"] - THERMAL_CONTROLLER_OFF = ["1", "thermal-off"] + THERMAL_CONTROLLER = [obj_ids.THERMAL_CONTROLLER_ID.hex(), "thermal_controller"] + CORE_CONTROLLER = [obj_ids.CORE_CONTROLLER_ID.hex(), "core_controller"] class Info: - THERMAL_CONTROLLER_NORMAL = "Switching Thermal Controller into normal" - THERMAL_CONTROLLER_OFF = "Switching Thermal Controller off" + THERMAL_CONTROLLER = "Thermal controller" + CORE_CONTROLLER = "ACS controller" def pack_controller_commands(tc_queue: TcQueueT, op_code: str): - if op_code in OpCodes.THERMAL_CONTROLLER_NORMAL: - command_mode( - object_id=obj_ids.THERMAL_CONTROLLER_ID, - mode=Modes.NORMAL, - submode=0, - tc_queue=tc_queue, - info=Info.THERMAL_CONTROLLER_NORMAL, - ) - if op_code in OpCodes.THERMAL_CONTROLLER_OFF: - command_mode( - object_id=obj_ids.THERMAL_CONTROLLER_ID, - mode=Modes.OFF, - submode=0, - tc_queue=tc_queue, - info=Info.THERMAL_CONTROLLER_OFF, - ) - + mode = int(input("Specify mode: (OFF = 0; ON = 1; NORMAL = 2) [2] ") or "2") + print(mode) + if mode < 0 or mode > 2: + print("Invalid Mode, defaulting to OFF") + mode = 0 + submode = int(input("Specify submode [0]: ") or "0") + command_mode( + object_id=get_object_from_op_code(op_code), + mode=mode, + submode=submode, + tc_queue=tc_queue, + info=op_code + " to " + str(mode) + "," + str(submode), + ) + +def get_object_from_op_code(op_code: str): + try: + return bytes.fromhex(op_code) + except: + pass + + if op_code in OpCodes.THERMAL_CONTROLLER: + return obj_ids.THERMAL_CONTROLLER_ID + if op_code in OpCodes.CORE_CONTROLLER: + return obj_ids.CORE_CONTROLLER_ID From 963f48120eaa4642113700ac104cdc4992a42c78 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Tue, 17 May 2022 22:08:30 +0200 Subject: [PATCH 007/132] added sending of TM via TCP Port --- pus_tm/factory_hook.py | 5 +- pus_tm/hk_handler.py | 840 +++++++++++++++++++++++++++++++++++++++++ pus_tm/hk_handling.py | 760 ------------------------------------- 3 files changed, 843 insertions(+), 762 deletions(-) create mode 100644 pus_tm/hk_handler.py delete mode 100644 pus_tm/hk_handling.py diff --git a/pus_tm/factory_hook.py b/pus_tm/factory_hook.py index d1829ca..5ca178b 100644 --- a/pus_tm/factory_hook.py +++ b/pus_tm/factory_hook.py @@ -19,7 +19,7 @@ from config.object_ids import get_object_ids from .event_handler import handle_event_packet from .verification_handler import handle_service_1_packet -from .hk_handling import handle_hk_packet +from .hk_handler import HkHandler from .action_reply_handler import handle_action_reply LOGGER = get_console_logger() @@ -33,6 +33,7 @@ def ccsds_tm_handler(apid: int, raw_tm_packet: bytes, _user_args: any) -> None: pus_factory_hook(raw_tm_packet=raw_tm_packet) + def pus_factory_hook(raw_tm_packet: bytes): if len(raw_tm_packet) < 8: LOGGER.warning("Detected packet shorter than 8 bytes!") @@ -45,7 +46,7 @@ def pus_factory_hook(raw_tm_packet: bytes): if service_type == 1: handle_service_1_packet(printer=FSFW_PRINTER, raw_tm=raw_tm_packet) elif service_type == 3: - handle_hk_packet( + HkHandler.getInstance().handle_hk_packet( printer=FSFW_PRINTER, raw_tm=raw_tm_packet, obj_id_dict=obj_id_dict ) elif service_type == 5: diff --git a/pus_tm/hk_handler.py b/pus_tm/hk_handler.py new file mode 100644 index 0000000..67f0d74 --- /dev/null +++ b/pus_tm/hk_handler.py @@ -0,0 +1,840 @@ +"""HK Handling for EIVE OBSW""" +import struct +import os +import datetime +import json +import socket +import base64 + +from tmtccmd.config.definitions import HkReplyUnpacked +from tmtccmd.tm.pus_3_fsfw_hk import ( + Service3Base, + HkContentType, + Service3FsfwTm, +) +from tmtccmd.logging import get_console_logger +from pus_tc.devs.bpx_batt import BpxSetIds +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.utility.obj_id import ObjectId, ObjectIdDictT +import config.object_ids as obj_ids + +from pus_tm.devs.reaction_wheels import handle_rw_hk_data +from pus_tm.defs import FsfwTmTcPrinter, log_to_both + + +# TODO add to configuration parameters +THERMAL_HOST = "127.0.0.1" +THERMAL_PORT = 7302 + + +LOGGER = get_console_logger() + + +class HkHandler(): + + _Instance = None + + def getInstance(): + if HkHandler._Instance == None: + HkHandler._Instance = HkHandler() + return HkHandler._Instance + + def __init__( + self): + + self.raw_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.parsed_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + self.raw_server_socket.bind(("", 3705)) + self.parsed_server_socket.bind(("", 3706)) + + # for now, only accept one connection + self.raw_server_socket.listen(0) + self.parsed_server_socket.listen(0) + + self.raw_server_socket.setblocking(False) + self.parsed_server_socket.setblocking(False) + + self.raw_connection = None + self.parsed_connection = None + + def __del__(self): + try: + self.close() + except: + LOGGER.warning("Could not close sockets!") + + def close(self): + self.raw_server_socket.close + self.parsed_server_socket.close + if self.raw_connection != None: + self.raw_connection.close() + + def report_raw_data(self, object_id: ObjectId, + set_id: int, + hk_data: bytes): + + data_dict = {} + data_dict["objectId"] = object_id.as_string + data_dict["setId"] = set_id + data_dict["rawData"] = base64.b64encode(hk_data).decode() + + self.send_dictionary_over_socket(data_dict, True) + + def send_dictionary_over_socket(self, dictionary, raw=False): + # keep listeners current + if self.raw_connection == None: + # no running connection, see if a client wants to connect + try: + (self.raw_connection, _) = self.raw_server_socket.accept() + self.raw_connection.setblocking(False) + except: + # no client waiting + pass + + if self.parsed_connection == None: + # no running connection, see if a client wants to connect + try: + (self.parsed_connection, _) = self.parsed_server_socket.accept() + self.parsed_connection.setblocking(False) + except: + # no client waiting + pass + + socket_to_use = self.parsed_connection + if raw: + socket_to_use = self.raw_connection + + if socket_to_use == None: + return + + data_json_bytes = json.dumps(dictionary).encode() + + # dle encode the bytes + # Taking a shortcut as json is inherently + # not binary (we also encoded it as utf-8), so there + # can not be any 0x02 or 0x03 be in there + data_json_bytes = b'\x02' + data_json_bytes + b'\n' + b'\x03' + + try: + sent_length = socket_to_use.send(data_json_bytes) + except: + socket_to_use = None + return + if sent_length == 0: + socket_to_use.close() + socket_to_use = None + + def handle_hk_packet( + self, + raw_tm: bytes, + obj_id_dict: ObjectIdDictT, + printer: FsfwTmTcPrinter, + ): + tm_packet = Service3FsfwTm.unpack(raw_telemetry=raw_tm, custom_hk_handling=False) + named_obj_id = obj_id_dict.get(tm_packet.object_id.as_bytes) + if named_obj_id is None: + named_obj_id = tm_packet.object_id + if tm_packet.subservice == 25 or tm_packet.subservice == 26: + hk_data = tm_packet.tm_data[8:] + self.report_raw_data(object_id=named_obj_id, + set_id=tm_packet.set_id, + hk_data=hk_data) + printer.generic_hk_tm_print( + content_type=HkContentType.HK, + object_id=named_obj_id, + set_id=tm_packet.set_id, + hk_data=hk_data, + ) + self.handle_regular_hk_print( + printer=printer, + object_id=named_obj_id, + hk_packet=tm_packet, + hk_data=hk_data, + ) + if tm_packet.subservice == 10 or tm_packet.subservice == 12: + LOGGER.warning("HK definitions printout not implemented yet") + + def handle_regular_hk_print( + self, + printer: FsfwTmTcPrinter, + object_id: ObjectId, + hk_packet: Service3Base, + hk_data: bytes, + ): + objb = 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 in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: + handle_rw_hk_data(printer, object_id, set_id, hk_data) + if objb == obj_ids.SYRLINKS_HANDLER_ID: + if set_id == SetIds.RX_REGISTERS_DATASET: + return self.handle_syrlinks_rx_registers_dataset(printer, hk_data) + elif set_id == SetIds.TX_REGISTERS_DATASET: + return self.handle_syrlinks_tx_registers_dataset(printer, hk_data) + else: + LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id") + if objb == obj_ids.IMTQ_HANDLER_ID: + if (set_id >= ImtqSetIds.POSITIVE_X_TEST) and ( + set_id <= ImtqSetIds.NEGATIVE_Z_TEST + ): + return self.handle_self_test_data(printer, hk_data) + else: + LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id") + if objb == obj_ids.GPS_HANDLER_0_ID or object_id == obj_ids.GPS_HANDLER_1_ID: + self.handle_gps_data(printer=printer, hk_data=hk_data) + if objb == obj_ids.BPX_HANDLER_ID: + self.handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer) + if objb == obj_ids.CORE_CONTROLLER_ID: + return self.handle_core_hk_data(printer=printer, hk_data=hk_data) + if objb == obj_ids.PDU_1_HANDLER_ID: + return self.handle_pdu_data( + printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data + ) + if objb == obj_ids.PDU_2_HANDLER_ID: + return self.handle_pdu_data( + printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data + ) + if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: + return handle_rw_hk_data( + printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data + ) + if objb == obj_ids.P60_DOCK_HANDLER: + self.handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) + if objb == obj_ids.PL_PCDU_ID: + log_to_both(printer, "Received PL PCDU HK data") + if objb == obj_ids.THERMAL_CONTROLLER_ID: + self.handle_thermal_controller_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) + else: + LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.") + return HkReplyUnpacked() + + def handle_syrlinks_rx_registers_dataset(self, printer: FsfwTmTcPrinter, hk_data: bytes): + reply = HkReplyUnpacked() + header_list = [ + "RX Status", + "RX Sensitivity", + "RX Frequency Shift", + "RX IQ Power", + "RX AGC Value", + "RX Demod Eb", + "RX Demod N0", + "RX Datarate", + ] + rx_status = hk_data[0] + rx_sensitivity = struct.unpack("!I", hk_data[1:5]) + rx_frequency_shift = struct.unpack("!I", hk_data[5:9]) + rx_iq_power = struct.unpack("!H", hk_data[9:11]) + rx_agc_value = struct.unpack("!H", hk_data[11:13]) + rx_demod_eb = struct.unpack("!I", hk_data[13:17]) + rx_demod_n0 = struct.unpack("!I", hk_data[17:21]) + rx_data_rate = hk_data[21] + content_list = [ + rx_status, + rx_sensitivity, + rx_frequency_shift, + rx_iq_power, + rx_agc_value, + rx_demod_eb, + rx_demod_n0, + rx_data_rate, + ] + validity_buffer = hk_data[22:] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8) + + def handle_syrlinks_tx_registers_dataset( + self, + printer: FsfwTmTcPrinter, + hk_data: bytes, + ): + reply = HkReplyUnpacked() + header_list = ["TX Status", "TX Waveform", "TX AGC value"] + tx_status = hk_data[0] + tx_waveform = hk_data[1] + tx_agc_value = struct.unpack("!H", hk_data[2:4]) + content_list = [tx_status, tx_waveform, tx_agc_value] + validity_buffer = hk_data[4:] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3) + + def handle_self_test_data(self, printer: FsfwTmTcPrinter, hk_data: bytes): + header_list = [ + "Init Err", + "Init Raw Mag X [nT]", + "Init Raw Mag Y [nT]", + "Init Raw Mag Z [nT]", + "Init Cal Mag X [nT]", + "Init Cal Mag Y [nT]", + "Init Cal Mag Z [nT]", + "Init Coil X Current [mA]", + "Init Coil Y Current [mA]", + "Init Coil Z Current [mA]", + "Init Coil X Temperature [°C]", + "Init Coil Y Temperature [°C]", + "Init Coil Z Temperature [°C]", + "Err", + "Raw Mag X [nT]", + "Raw Mag Y [nT]", + "Raw Mag Z [nT]", + "Cal Mag X [nT]", + "Cal Mag Y [nT]", + "Cal Mag Z [nT]", + "Coil X Current [mA]", + "Coil Y Current [mA]", + "Coil Z Current [mA]", + "Coil X Temperature [°C]", + "Coil Y Temperature [°C]", + "Coil Z Temperature [°C]", + "Fina Err", + "Fina Raw Mag X [nT]", + "Fina Raw Mag Y [nT]", + "Fina Raw Mag Z [nT]", + "Fina Cal Mag X [nT]", + "Fina Cal Mag Y [nT]", + "Fina Cal Mag Z [nT]", + "Fina Coil X Current [mA]", + "Fina Coil Y Current [mA]", + "Fina Coil Z Current [mA]", + "Fina Coil X Temperature [°C]", + "Fina Coil Y Temperature [°C]", + "Fina Coil Z Temperature [°C]", + ] + # INIT step (no coil actuation) + init_err = hk_data[0] + init_raw_mag_x = struct.unpack("!f", hk_data[1:5])[0] + init_raw_mag_y = struct.unpack("!f", hk_data[5:9])[0] + init_raw_mag_z = struct.unpack("!f", hk_data[9:13])[0] + init_cal_mag_x = struct.unpack("!f", hk_data[13:17])[0] + init_cal_mag_y = struct.unpack("!f", hk_data[17:21])[0] + init_cal_mag_z = struct.unpack("!f", hk_data[21:25])[0] + init_coil_x_current = struct.unpack("!f", hk_data[25:29])[0] + init_coil_y_current = struct.unpack("!f", hk_data[29:33])[0] + init_coil_z_current = struct.unpack("!f", hk_data[33:37])[0] + init_coil_x_temperature = struct.unpack("!H", hk_data[37:39])[0] + init_coil_y_temperature = struct.unpack("!H", hk_data[39:41])[0] + init_coil_z_temperature = struct.unpack("!H", hk_data[41:43])[0] + + # Actuation step + err = hk_data[43] + raw_mag_x = struct.unpack("!f", hk_data[44:48])[0] + raw_mag_y = struct.unpack("!f", hk_data[48:52])[0] + raw_mag_z = struct.unpack("!f", hk_data[52:56])[0] + cal_mag_x = struct.unpack("!f", hk_data[56:60])[0] + cal_mag_y = struct.unpack("!f", hk_data[60:64])[0] + cal_mag_z = struct.unpack("!f", hk_data[64:68])[0] + coil_x_current = struct.unpack("!f", hk_data[68:72])[0] + coil_y_current = struct.unpack("!f", hk_data[72:76])[0] + coil_z_current = struct.unpack("!f", hk_data[76:80])[0] + coil_x_temperature = struct.unpack("!H", hk_data[80:82])[0] + coil_y_temperature = struct.unpack("!H", hk_data[82:84])[0] + coil_z_temperature = struct.unpack("!H", hk_data[84:86])[0] + + # FINA step (no coil actuation) + fina_err = hk_data[86] + fina_raw_mag_x = struct.unpack("!f", hk_data[87:91])[0] + fina_raw_mag_y = struct.unpack("!f", hk_data[91:95])[0] + fina_raw_mag_z = struct.unpack("!f", hk_data[95:99])[0] + fina_cal_mag_x = struct.unpack("!f", hk_data[99:103])[0] + fina_cal_mag_y = struct.unpack("!f", hk_data[103:107])[0] + fina_cal_mag_z = struct.unpack("!f", hk_data[107:111])[0] + fina_coil_x_current = struct.unpack("!f", hk_data[111:115])[0] + fina_coil_y_current = struct.unpack("!f", hk_data[115:119])[0] + fina_coil_z_current = struct.unpack("!f", hk_data[119:123])[0] + fina_coil_x_temperature = struct.unpack("!H", hk_data[123:125])[0] + fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0] + fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0] + + validity_buffer = hk_data[129:] + content_list = [ + init_err, + init_raw_mag_x, + init_raw_mag_y, + init_raw_mag_z, + init_cal_mag_x, + init_cal_mag_y, + init_cal_mag_z, + init_coil_x_current, + init_coil_y_current, + init_coil_z_current, + init_coil_x_temperature, + init_coil_y_temperature, + init_coil_z_temperature, + err, + raw_mag_x, + raw_mag_y, + raw_mag_z, + cal_mag_x, + cal_mag_y, + cal_mag_z, + coil_x_current, + coil_y_current, + coil_z_current, + coil_x_temperature, + coil_y_temperature, + coil_z_temperature, + fina_err, + fina_raw_mag_x, + fina_raw_mag_y, + fina_raw_mag_z, + fina_cal_mag_x, + fina_cal_mag_y, + fina_cal_mag_z, + fina_coil_x_current, + fina_coil_y_current, + fina_coil_z_current, + fina_coil_x_temperature, + fina_coil_y_temperature, + fina_coil_z_temperature, + ] + num_of_vars = len(header_list) + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars) + + def handle_thermal_controller_hk_data(self, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + if set_id == 0: + LOGGER.info("Received Sensor Temperature data") + + # get all the floats + tm_data = struct.unpack("!ffffffffffffffff", hk_data[:16 * 4]) + parsed_data = {} + + # put them into a nice dictionary + parsed_data["SID"] = set_id + parsed_data["content"] = {} + parsed_data["content"]["SENSOR_PLOC_HEATSPREADER"] = tm_data[0] + parsed_data["content"]["SENSOR_PLOC_MISSIONBOARD"] = tm_data[1] + parsed_data["content"]["SENSOR_4K_CAMERA"] = tm_data[2] + parsed_data["content"]["SENSOR_DAC_HEATSPREADER"] = tm_data[3] + parsed_data["content"]["SENSOR_STARTRACKER"] = tm_data[4] + parsed_data["content"]["SENSOR_RW1"] = tm_data[5] + parsed_data["content"]["SENSOR_DRO"] = tm_data[6] + parsed_data["content"]["SENSOR_SCEX"] = tm_data[7] + parsed_data["content"]["SENSOR_X8"] = tm_data[8] + parsed_data["content"]["SENSOR_HPA"] = tm_data[9] + parsed_data["content"]["SENSOR_TX_MODUL"] = tm_data[10] + parsed_data["content"]["SENSOR_MPA"] = tm_data[11] + parsed_data["content"]["SENSOR_ACU"] = tm_data[12] + parsed_data["content"]["SENSOR_PLPCDU_HEATSPREADER"] = tm_data[13] + parsed_data["content"]["SENSOR_TCS_BOARD"] = tm_data[14] + parsed_data["content"]["SENSOR_MAGNETTORQUER"] = tm_data[15] + + self.send_dictionary_over_socket(parsed_data) + + def handle_gps_data(self, printer: FsfwTmTcPrinter, hk_data: bytes): + LOGGER.info(f"Received GPS data, HK data length {len(hk_data)}") + reply = HkReplyUnpacked() + var_index = 0 + header_list = [ + "Latitude", + "Longitude", + "Altitude", + "Fix Mode", + "Sats in Use", + "Date", + "Unix Seconds", + ] + latitude = struct.unpack("!d", hk_data[0:8])[0] + longitude = struct.unpack("!d", hk_data[8:16])[0] + altitude = struct.unpack("!d", hk_data[16:24])[0] + fix_mode = hk_data[24] + sat_in_use = hk_data[25] + year = struct.unpack("!H", hk_data[26:28])[0] + month = hk_data[28] + day = hk_data[29] + hours = hk_data[30] + minutes = hk_data[31] + seconds = hk_data[32] + date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}" + unix_seconds = struct.unpack("!I", hk_data[33:37])[0] + content_list = [ + latitude, + longitude, + altitude, + fix_mode, + sat_in_use, + date_string, + unix_seconds, + ] + var_index += 13 + reply.num_of_vars = var_index + if not os.path.isfile("gps_log.txt"): + with open("gps_log.txt", "w") as gps_file: + gps_file.write( + "Time, Latitude [deg], Longitude [deg], Altitude [m], Fix Mode, Sats in Use, " + "Date, Unix Seconds\n" + ) + with open("gps_log.txt", "a") as gps_file: + gps_file.write( + f"{datetime.datetime.now()}, {latitude}, {longitude}, {altitude}, " + f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n" + ) + validity_buffer = hk_data[37:39] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) + + def handle_bpx_hk_data(self, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + if set_id == BpxSetIds.GET_HK_SET: + fmt_str = "!HHHHhhhhIB" + inc_len = struct.calcsize(fmt_str) + ( + charge_current, + discharge_current, + heater_current, + batt_voltage, + batt_temp_1, + batt_temp_2, + batt_temp_3, + batt_temp_4, + reboot_cntr, + boot_cause, + ) = struct.unpack(fmt_str, hk_data[0:inc_len]) + header_list = [ + "Charge Current", + "Discharge Current", + "Heater Current", + "Battery Voltage", + "Batt Temp 1", + "Batt Temp 2", + "Batt Temp 3", + "Batt Temp 4", + "Reboot Counter", + "Boot Cause", + ] + content_list = [ + charge_current, + discharge_current, + heater_current, + batt_voltage, + batt_temp_1, + batt_temp_2, + batt_temp_3, + batt_temp_4, + reboot_cntr, + boot_cause, + ] + validity_buffer = hk_data[inc_len:] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) + elif set_id == BpxSetIds.GET_CFG_SET: + battheat_mode = hk_data[0] + battheat_low = struct.unpack("!b", hk_data[1:2])[0] + battheat_high = struct.unpack("!b", hk_data[2:3])[0] + header_list = [ + "Battery Heater Mode", + "Battery Heater Low Limit", + "Battery Heater High Limit", + ] + content_list = [battheat_mode, battheat_low, battheat_high] + validity_buffer = hk_data[3:] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) + + def handle_core_hk_data(self, printer: FsfwTmTcPrinter, hk_data: bytes): + + fmt_str = "!fffH" + inc_len = struct.calcsize(fmt_str) + (temperature, ps_voltage, pl_voltage, tx_agc_value) = struct.unpack( + fmt_str, hk_data[0: 0 + inc_len] + ) + printout = ( + f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | " + f"PL Voltage [mV] {pl_voltage} | TX AGC {tx_agc_value}" + ) + log_to_both(printer, printout) + printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=4) + + P60_INDEX_LIST = [ + "ACU VCC", + "PDU1 VCC", + "X3 IDLE VCC", + "PDU2 VCC", + "ACU VBAT", + "PDU1 VBAT", + "X3 IDLE VBAT", + "PDU2 VBAT", + "STACK VBAT", + "STACK 3V3", + "STACK 5V", + "GS3V3", + "GS5V", + ] + + 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] + + 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"{TmHandler.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( + self, 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: + 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(TmHandler.PDU1_CHANNELS_NAMES)): + latchup_list.append( + struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] + ) + content_line = ( + f"{TmHandler.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(TmHandler.PDU1_CHANNELS_NAMES)): + device_types.append(hk_data[current_idx]) + current_idx += 1 + device_statuses = [] + for idx in range(len(TmHandler.PDU1_CHANNELS_NAMES)): + device_statuses.append(hk_data[current_idx]) + current_idx += 1 + wdt = self.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 = [] + for idx in range(len(TmHandler.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(TmHandler.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(TmHandler.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(TmHandler.PDU1_CHANNELS_NAMES)): + out_enb = f"{output_enb_list[idx]}".ljust(6) + content_line = ( + f"{TmHandler.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} | " + f"Temperature {temperature / 10.0}" + ) + log_to_both(printer, info) + + def handle_p60_hk_data(self, 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") + current_idx = 0 + current_list = [] + for idx in range(13): + current_list.append( + struct.unpack("!h", hk_data[current_idx: current_idx + 2])[0] + ) + current_idx += 2 + voltage_list = [] + for idx in range(13): + voltage_list.append( + struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] + ) + current_idx += 2 + out_enb_list = [] + for idx in range(13): + out_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(13): + out_enb = f"{out_enb_list[idx]}".ljust(6) + content_line = ( + f"{TmHandler.P60_INDEX_LIST[idx].ljust(24)} | {out_enb} | " + f"{voltage_list[idx]:05} | {current_list[idx]:04}" + ) + log_to_both(printer, content_line) + fmt_str = "!IBhHhh" + inc_len = struct.calcsize(fmt_str) + ( + boot_count, + batt_mode, + batt_current, + batt_voltage, + temp_0, + temp_1, + ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) + current_idx += inc_len + batt_info = ( + f"Batt: Mode {batt_mode} | Boot Count {boot_count} | " + f"Charge current {batt_current} | Voltage {batt_voltage}" + ) + temps = f"In C: Temp 0 {temp_0 / 10.0} | Temp 1 {temp_1 / 10.0} | " + log_to_both(printer, temps) + log_to_both(printer, batt_info) + printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9) + if set_id == SetIds.P60_AUX: + log_to_both(printer, "Received P60 AUX HK. Voltages in mV, currents in mA") + current_idx = 0 + latchup_list = [] + log_to_both(printer, "P60 Dock Latchups") + for idx in range(0, 13): + latchup_list.append( + struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] + ) + content_line = f"{TmHandler.P60_INDEX_LIST[idx].ljust(24)} | {latchup_list[idx]}" + log_to_both(printer, content_line) + current_idx += 2 + fmt_str = "!IIHBBHHhhB" + inc_len = struct.calcsize(fmt_str) + ( + boot_cause, + uptime, + reset_cause, + heater_on, + conv_5v_on, + dock_vbat, + dock_vcc_c, + batt_temp_0, + batt_temp_1, + dearm_status, + ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) + current_idx += inc_len + wdt = self.WdtInfo() + current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx) + fmt_str = "!hhbb" + inc_len = struct.calcsize(fmt_str) + ( + batt_charge_current, + batt_discharge_current, + ant6_depl, + ar6_depl, + ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) + current_idx += inc_len + device_types = [] + device_statuses = [] + for idx in range(8): + device_types.append(hk_data[current_idx]) + current_idx += 1 + for idx in range(8): + device_statuses.append(hk_data[current_idx]) + current_idx += 1 + util_info = ( + f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}" + ) + util_info_2 = ( + f"Conv 5V on {conv_5v_on} | Heater On {heater_on} | " + f"Dock VBAT {dock_vbat} | DOCK VCC Current {dock_vcc_c}" + ) + log_to_both(printer, util_info) + log_to_both(printer, util_info_2) + wdt.print(printer) + misc_info = ( + f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}" + ) + log_to_both(printer, misc_info) + batt_info = ( + f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | " + f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}" + ) + log_to_both(printer, batt_info) + printer.print_validity_buffer( + validity_buffer=hk_data[current_idx:], num_vars=27 + ) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py deleted file mode 100644 index 8627554..0000000 --- a/pus_tm/hk_handling.py +++ /dev/null @@ -1,760 +0,0 @@ -"""HK Handling for EIVE OBSW""" -import struct -import os -import datetime -import json -import socket - -from tmtccmd.config.definitions import HkReplyUnpacked -from tmtccmd.tm.pus_3_fsfw_hk import ( - Service3Base, - HkContentType, - Service3FsfwTm, -) -from tmtccmd.logging import get_console_logger -from pus_tc.devs.bpx_batt import BpxSetIds -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.utility.obj_id import ObjectId, ObjectIdDictT -import config.object_ids as obj_ids - -from pus_tm.devs.reaction_wheels import handle_rw_hk_data -from pus_tm.defs import FsfwTmTcPrinter, log_to_both - - -#TODO add to configuration parameters -THERMAL_HOST = "127.0.0.1" -THERMAL_PORT = 7302 - - -LOGGER = get_console_logger() - - -def handle_hk_packet( - raw_tm: bytes, - obj_id_dict: ObjectIdDictT, - printer: FsfwTmTcPrinter, -): - tm_packet = Service3FsfwTm.unpack(raw_telemetry=raw_tm, custom_hk_handling=False) - named_obj_id = obj_id_dict.get(tm_packet.object_id.as_bytes) - if named_obj_id is None: - named_obj_id = tm_packet.object_id - if tm_packet.subservice == 25 or tm_packet.subservice == 26: - hk_data = tm_packet.tm_data[8:] - printer.generic_hk_tm_print( - content_type=HkContentType.HK, - object_id=named_obj_id, - set_id=tm_packet.set_id, - hk_data=hk_data, - ) - handle_regular_hk_print( - printer=printer, - object_id=named_obj_id, - hk_packet=tm_packet, - hk_data=hk_data, - ) - if tm_packet.subservice == 10 or tm_packet.subservice == 12: - LOGGER.warning("HK definitions printout not implemented yet") - - -def handle_regular_hk_print( - printer: FsfwTmTcPrinter, - object_id: ObjectId, - hk_packet: Service3Base, - hk_data: bytes, -): - objb = 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 in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: - handle_rw_hk_data(printer, object_id, set_id, hk_data) - if objb == 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") - if objb == 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") - if objb == obj_ids.GPS_HANDLER_0_ID or object_id == obj_ids.GPS_HANDLER_1_ID: - handle_gps_data(printer=printer, hk_data=hk_data) - if objb == obj_ids.BPX_HANDLER_ID: - handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer) - if objb == obj_ids.CORE_CONTROLLER_ID: - return handle_core_hk_data(printer=printer, hk_data=hk_data) - if objb == obj_ids.PDU_1_HANDLER_ID: - return handle_pdu_data( - printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data - ) - if objb == obj_ids.PDU_2_HANDLER_ID: - return handle_pdu_data( - printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data - ) - if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: - return handle_rw_hk_data( - printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data - ) - if objb == obj_ids.P60_DOCK_HANDLER: - handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) - if objb == obj_ids.PL_PCDU_ID: - log_to_both(printer, "Received PL PCDU HK data") - if objb == obj_ids.THERMAL_CONTROLLER_ID: - handle_thermal_controller_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) - else: - LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.") - return HkReplyUnpacked() - - -def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: bytes): - reply = HkReplyUnpacked() - header_list = [ - "RX Status", - "RX Sensitivity", - "RX Frequency Shift", - "RX IQ Power", - "RX AGC Value", - "RX Demod Eb", - "RX Demod N0", - "RX Datarate", - ] - rx_status = hk_data[0] - rx_sensitivity = struct.unpack("!I", hk_data[1:5]) - rx_frequency_shift = struct.unpack("!I", hk_data[5:9]) - rx_iq_power = struct.unpack("!H", hk_data[9:11]) - rx_agc_value = struct.unpack("!H", hk_data[11:13]) - rx_demod_eb = struct.unpack("!I", hk_data[13:17]) - rx_demod_n0 = struct.unpack("!I", hk_data[17:21]) - rx_data_rate = hk_data[21] - content_list = [ - rx_status, - rx_sensitivity, - rx_frequency_shift, - rx_iq_power, - rx_agc_value, - rx_demod_eb, - rx_demod_n0, - rx_data_rate, - ] - validity_buffer = hk_data[22:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8) - - -def handle_syrlinks_tx_registers_dataset( - printer: FsfwTmTcPrinter, - hk_data: bytes, -): - reply = HkReplyUnpacked() - header_list = ["TX Status", "TX Waveform", "TX AGC value"] - tx_status = hk_data[0] - tx_waveform = hk_data[1] - tx_agc_value = struct.unpack("!H", hk_data[2:4]) - content_list = [tx_status, tx_waveform, tx_agc_value] - validity_buffer = hk_data[4:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3) - - -def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes): - header_list = [ - "Init Err", - "Init Raw Mag X [nT]", - "Init Raw Mag Y [nT]", - "Init Raw Mag Z [nT]", - "Init Cal Mag X [nT]", - "Init Cal Mag Y [nT]", - "Init Cal Mag Z [nT]", - "Init Coil X Current [mA]", - "Init Coil Y Current [mA]", - "Init Coil Z Current [mA]", - "Init Coil X Temperature [°C]", - "Init Coil Y Temperature [°C]", - "Init Coil Z Temperature [°C]", - "Err", - "Raw Mag X [nT]", - "Raw Mag Y [nT]", - "Raw Mag Z [nT]", - "Cal Mag X [nT]", - "Cal Mag Y [nT]", - "Cal Mag Z [nT]", - "Coil X Current [mA]", - "Coil Y Current [mA]", - "Coil Z Current [mA]", - "Coil X Temperature [°C]", - "Coil Y Temperature [°C]", - "Coil Z Temperature [°C]", - "Fina Err", - "Fina Raw Mag X [nT]", - "Fina Raw Mag Y [nT]", - "Fina Raw Mag Z [nT]", - "Fina Cal Mag X [nT]", - "Fina Cal Mag Y [nT]", - "Fina Cal Mag Z [nT]", - "Fina Coil X Current [mA]", - "Fina Coil Y Current [mA]", - "Fina Coil Z Current [mA]", - "Fina Coil X Temperature [°C]", - "Fina Coil Y Temperature [°C]", - "Fina Coil Z Temperature [°C]", - ] - # INIT step (no coil actuation) - init_err = hk_data[0] - init_raw_mag_x = struct.unpack("!f", hk_data[1:5])[0] - init_raw_mag_y = struct.unpack("!f", hk_data[5:9])[0] - init_raw_mag_z = struct.unpack("!f", hk_data[9:13])[0] - init_cal_mag_x = struct.unpack("!f", hk_data[13:17])[0] - init_cal_mag_y = struct.unpack("!f", hk_data[17:21])[0] - init_cal_mag_z = struct.unpack("!f", hk_data[21:25])[0] - init_coil_x_current = struct.unpack("!f", hk_data[25:29])[0] - init_coil_y_current = struct.unpack("!f", hk_data[29:33])[0] - init_coil_z_current = struct.unpack("!f", hk_data[33:37])[0] - init_coil_x_temperature = struct.unpack("!H", hk_data[37:39])[0] - init_coil_y_temperature = struct.unpack("!H", hk_data[39:41])[0] - init_coil_z_temperature = struct.unpack("!H", hk_data[41:43])[0] - - # Actuation step - err = hk_data[43] - raw_mag_x = struct.unpack("!f", hk_data[44:48])[0] - raw_mag_y = struct.unpack("!f", hk_data[48:52])[0] - raw_mag_z = struct.unpack("!f", hk_data[52:56])[0] - cal_mag_x = struct.unpack("!f", hk_data[56:60])[0] - cal_mag_y = struct.unpack("!f", hk_data[60:64])[0] - cal_mag_z = struct.unpack("!f", hk_data[64:68])[0] - coil_x_current = struct.unpack("!f", hk_data[68:72])[0] - coil_y_current = struct.unpack("!f", hk_data[72:76])[0] - coil_z_current = struct.unpack("!f", hk_data[76:80])[0] - coil_x_temperature = struct.unpack("!H", hk_data[80:82])[0] - coil_y_temperature = struct.unpack("!H", hk_data[82:84])[0] - coil_z_temperature = struct.unpack("!H", hk_data[84:86])[0] - - # FINA step (no coil actuation) - fina_err = hk_data[86] - fina_raw_mag_x = struct.unpack("!f", hk_data[87:91])[0] - fina_raw_mag_y = struct.unpack("!f", hk_data[91:95])[0] - fina_raw_mag_z = struct.unpack("!f", hk_data[95:99])[0] - fina_cal_mag_x = struct.unpack("!f", hk_data[99:103])[0] - fina_cal_mag_y = struct.unpack("!f", hk_data[103:107])[0] - fina_cal_mag_z = struct.unpack("!f", hk_data[107:111])[0] - fina_coil_x_current = struct.unpack("!f", hk_data[111:115])[0] - fina_coil_y_current = struct.unpack("!f", hk_data[115:119])[0] - fina_coil_z_current = struct.unpack("!f", hk_data[119:123])[0] - fina_coil_x_temperature = struct.unpack("!H", hk_data[123:125])[0] - fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0] - fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0] - - validity_buffer = hk_data[129:] - content_list = [ - init_err, - init_raw_mag_x, - init_raw_mag_y, - init_raw_mag_z, - init_cal_mag_x, - init_cal_mag_y, - init_cal_mag_z, - init_coil_x_current, - init_coil_y_current, - init_coil_z_current, - init_coil_x_temperature, - init_coil_y_temperature, - init_coil_z_temperature, - err, - raw_mag_x, - init_raw_mag_y, - raw_mag_z, - cal_mag_x, - cal_mag_y, - cal_mag_z, - coil_x_current, - coil_y_current, - coil_z_current, - coil_x_temperature, - coil_y_temperature, - coil_z_temperature, - fina_err, - fina_raw_mag_x, - fina_raw_mag_y, - fina_raw_mag_z, - fina_cal_mag_x, - fina_cal_mag_y, - fina_cal_mag_z, - fina_coil_x_current, - fina_coil_y_current, - fina_coil_z_current, - fina_coil_x_temperature, - fina_coil_y_temperature, - fina_coil_z_temperature, - ] - num_of_vars = len(header_list) - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars) - -def handle_thermal_controller_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): - if set_id == 0: - LOGGER.info("Received Sensor Temperature data") - - #get all the floats - tm_data = struct.unpack("!ffffffffffffffff", hk_data[:16*4]) - parsed_data = {} - - #put them into a nice dictionary - parsed_data["SID"] = set_id - parsed_data["content"] = {} - parsed_data["content"]["SENSOR_PLOC_HEATSPREADER"] = tm_data[0] - parsed_data["content"]["SENSOR_PLOC_MISSIONBOARD"] = tm_data[1] - parsed_data["content"]["SENSOR_4K_CAMERA"] = tm_data[2] - parsed_data["content"]["SENSOR_DAC_HEATSPREADER"] = tm_data[3] - parsed_data["content"]["SENSOR_STARTRACKER"] = tm_data[4] - parsed_data["content"]["SENSOR_RW1"] = tm_data[5] - parsed_data["content"]["SENSOR_DRO"] = tm_data[6] - parsed_data["content"]["SENSOR_SCEX"] = tm_data[7] - parsed_data["content"]["SENSOR_X8"] = tm_data[8] - parsed_data["content"]["SENSOR_HPA"] = tm_data[9] - parsed_data["content"]["SENSOR_TX_MODUL"] = tm_data[10] - parsed_data["content"]["SENSOR_MPA"] = tm_data[11] - parsed_data["content"]["SENSOR_ACU"] = tm_data[12] - parsed_data["content"]["SENSOR_PLPCDU_HEATSPREADER"] = tm_data[13] - parsed_data["content"]["SENSOR_TCS_BOARD"] = tm_data[14] - parsed_data["content"]["SENSOR_MAGNETTORQUER"] = tm_data[15] - - #which in turn will become a json to be sent over the wire - json_string = json.dumps(parsed_data) - #print(json_string) - - #try to send it to a tcp server - try: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.connect((THERMAL_HOST, THERMAL_PORT)) - s.sendall(bytes(json_string, encoding="utf-8")) - except: - #fail silently if there is noone listening, should be a non breaking feature - pass - - -def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes): - LOGGER.info(f"Received GPS data, HK data length {len(hk_data)}") - reply = HkReplyUnpacked() - var_index = 0 - header_list = [ - "Latitude", - "Longitude", - "Altitude", - "Fix Mode", - "Sats in Use", - "Date", - "Unix Seconds", - ] - latitude = struct.unpack("!d", hk_data[0:8])[0] - longitude = struct.unpack("!d", hk_data[8:16])[0] - altitude = struct.unpack("!d", hk_data[16:24])[0] - fix_mode = hk_data[24] - sat_in_use = hk_data[25] - year = struct.unpack("!H", hk_data[26:28])[0] - month = hk_data[28] - day = hk_data[29] - hours = hk_data[30] - minutes = hk_data[31] - seconds = hk_data[32] - date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}" - unix_seconds = struct.unpack("!I", hk_data[33:37])[0] - content_list = [ - latitude, - longitude, - altitude, - fix_mode, - sat_in_use, - date_string, - unix_seconds, - ] - var_index += 13 - reply.num_of_vars = var_index - if not os.path.isfile("gps_log.txt"): - with open("gps_log.txt", "w") as gps_file: - gps_file.write( - "Time, Latitude [deg], Longitude [deg], Altitude [m], Fix Mode, Sats in Use, " - "Date, Unix Seconds\n" - ) - with open("gps_log.txt", "a") as gps_file: - gps_file.write( - f"{datetime.datetime.now()}, {latitude}, {longitude}, {altitude}, " - f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n" - ) - validity_buffer = hk_data[37:39] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - - -def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): - if set_id == BpxSetIds.GET_HK_SET: - fmt_str = "!HHHHhhhhIB" - inc_len = struct.calcsize(fmt_str) - ( - charge_current, - discharge_current, - heater_current, - batt_voltage, - batt_temp_1, - batt_temp_2, - batt_temp_3, - batt_temp_4, - reboot_cntr, - boot_cause, - ) = struct.unpack(fmt_str, hk_data[0:inc_len]) - header_list = [ - "Charge Current", - "Discharge Current", - "Heater Current", - "Battery Voltage", - "Batt Temp 1", - "Batt Temp 2", - "Batt Temp 3", - "Batt Temp 4", - "Reboot Counter", - "Boot Cause", - ] - content_list = [ - charge_current, - discharge_current, - heater_current, - batt_voltage, - batt_temp_1, - batt_temp_2, - batt_temp_3, - batt_temp_4, - reboot_cntr, - boot_cause, - ] - validity_buffer = hk_data[inc_len:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - elif set_id == BpxSetIds.GET_CFG_SET: - battheat_mode = hk_data[0] - battheat_low = struct.unpack("!b", hk_data[1:2])[0] - battheat_high = struct.unpack("!b", hk_data[2:3])[0] - header_list = [ - "Battery Heater Mode", - "Battery Heater Low Limit", - "Battery Heater High Limit", - ] - content_list = [battheat_mode, battheat_low, battheat_high] - validity_buffer = hk_data[3:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - - -def handle_core_hk_data(printer: FsfwTmTcPrinter, hk_data: bytes): - - fmt_str = "!fffH" - inc_len = struct.calcsize(fmt_str) - (temperature, ps_voltage, pl_voltage, tx_agc_value) = struct.unpack( - fmt_str, hk_data[0 : 0 + inc_len] - ) - printout = ( - f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | " - f"PL Voltage [mV] {pl_voltage} | TX AGC {tx_agc_value}" - ) - log_to_both(printer, printout) - printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=4) - - -P60_INDEX_LIST = [ - "ACU VCC", - "PDU1 VCC", - "X3 IDLE VCC", - "PDU2 VCC", - "ACU VBAT", - "PDU1 VBAT", - "X3 IDLE VBAT", - "PDU2 VBAT", - "STACK VBAT", - "STACK 3V3", - "STACK 5V", - "GS3V3", - "GS5V", -] - -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] - - -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: - 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 = [] - 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} | " - f"Temperature {temperature / 10.0}" - ) - log_to_both(printer, info) - - -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") - current_idx = 0 - current_list = [] - for idx in range(13): - current_list.append( - struct.unpack("!h", hk_data[current_idx : current_idx + 2])[0] - ) - current_idx += 2 - voltage_list = [] - for idx in range(13): - voltage_list.append( - struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] - ) - current_idx += 2 - out_enb_list = [] - for idx in range(13): - out_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(13): - out_enb = f"{out_enb_list[idx]}".ljust(6) - content_line = ( - f"{P60_INDEX_LIST[idx].ljust(24)} | {out_enb} | " - f"{voltage_list[idx]:05} | {current_list[idx]:04}" - ) - log_to_both(printer, content_line) - fmt_str = "!IBhHhh" - inc_len = struct.calcsize(fmt_str) - ( - boot_count, - batt_mode, - batt_current, - batt_voltage, - temp_0, - temp_1, - ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) - current_idx += inc_len - batt_info = ( - f"Batt: Mode {batt_mode} | Boot Count {boot_count} | " - f"Charge current {batt_current} | Voltage {batt_voltage}" - ) - temps = f"In C: Temp 0 {temp_0 / 10.0} | Temp 1 {temp_1 / 10.0} | " - log_to_both(printer, temps) - log_to_both(printer, batt_info) - printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9) - if set_id == SetIds.P60_AUX: - log_to_both(printer, "Received P60 AUX HK. Voltages in mV, currents in mA") - current_idx = 0 - latchup_list = [] - log_to_both(printer, "P60 Dock Latchups") - for idx in range(0, 13): - latchup_list.append( - struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] - ) - content_line = f"{P60_INDEX_LIST[idx].ljust(24)} | {latchup_list[idx]}" - log_to_both(printer, content_line) - current_idx += 2 - fmt_str = "!IIHBBHHhhB" - inc_len = struct.calcsize(fmt_str) - ( - boot_cause, - uptime, - reset_cause, - heater_on, - conv_5v_on, - dock_vbat, - dock_vcc_c, - batt_temp_0, - batt_temp_1, - dearm_status, - ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) - current_idx += inc_len - 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) - ( - batt_charge_current, - batt_discharge_current, - ant6_depl, - ar6_depl, - ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) - current_idx += inc_len - device_types = [] - device_statuses = [] - for idx in range(8): - device_types.append(hk_data[current_idx]) - current_idx += 1 - for idx in range(8): - device_statuses.append(hk_data[current_idx]) - current_idx += 1 - util_info = ( - f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}" - ) - util_info_2 = ( - f"Conv 5V on {conv_5v_on} | Heater On {heater_on} | " - f"Dock VBAT {dock_vbat} | DOCK VCC Current {dock_vcc_c}" - ) - log_to_both(printer, util_info) - log_to_both(printer, util_info_2) - wdt.print(printer) - misc_info = ( - f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}" - ) - log_to_both(printer, misc_info) - batt_info = ( - f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | " - f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}" - ) - log_to_both(printer, batt_info) - printer.print_validity_buffer( - validity_buffer=hk_data[current_idx:], num_vars=27 - ) From 437be64a28230690609981dd4f790b522d402278 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Wed, 18 May 2022 16:02:23 +0200 Subject: [PATCH 008/132] move tcp server into own class and reverted hk handling back to functions from class --- pus_tm/factory_hook.py | 4 +- pus_tm/hk_handler.py | 840 ---------------------------------------- pus_tm/hk_handling.py | 739 +++++++++++++++++++++++++++++++++++ pus_tm/tm_tcp_server.py | 102 +++++ 4 files changed, 843 insertions(+), 842 deletions(-) delete mode 100644 pus_tm/hk_handler.py create mode 100644 pus_tm/hk_handling.py create mode 100644 pus_tm/tm_tcp_server.py diff --git a/pus_tm/factory_hook.py b/pus_tm/factory_hook.py index 3c892be..afac7c0 100644 --- a/pus_tm/factory_hook.py +++ b/pus_tm/factory_hook.py @@ -19,7 +19,7 @@ from config.object_ids import get_object_ids from .event_handler import handle_event_packet from .verification_handler import handle_service_1_packet -from .hk_handler import HkHandler +from .hk_handling import handle_hk_packet from .action_reply_handler import handle_action_reply LOGGER = get_console_logger() @@ -48,7 +48,7 @@ def pus_factory_hook(raw_tm_packet: bytes): if service_type == 1: handle_service_1_packet(printer=FSFW_PRINTER, raw_tm=raw_tm_packet) elif service_type == 3: - HkHandler.getInstance().handle_hk_packet( + handle_hk_packet( printer=FSFW_PRINTER, raw_tm=raw_tm_packet, obj_id_dict=obj_id_dict ) elif service_type == 5: diff --git a/pus_tm/hk_handler.py b/pus_tm/hk_handler.py deleted file mode 100644 index 67f0d74..0000000 --- a/pus_tm/hk_handler.py +++ /dev/null @@ -1,840 +0,0 @@ -"""HK Handling for EIVE OBSW""" -import struct -import os -import datetime -import json -import socket -import base64 - -from tmtccmd.config.definitions import HkReplyUnpacked -from tmtccmd.tm.pus_3_fsfw_hk import ( - Service3Base, - HkContentType, - Service3FsfwTm, -) -from tmtccmd.logging import get_console_logger -from pus_tc.devs.bpx_batt import BpxSetIds -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.utility.obj_id import ObjectId, ObjectIdDictT -import config.object_ids as obj_ids - -from pus_tm.devs.reaction_wheels import handle_rw_hk_data -from pus_tm.defs import FsfwTmTcPrinter, log_to_both - - -# TODO add to configuration parameters -THERMAL_HOST = "127.0.0.1" -THERMAL_PORT = 7302 - - -LOGGER = get_console_logger() - - -class HkHandler(): - - _Instance = None - - def getInstance(): - if HkHandler._Instance == None: - HkHandler._Instance = HkHandler() - return HkHandler._Instance - - def __init__( - self): - - self.raw_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.parsed_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - self.raw_server_socket.bind(("", 3705)) - self.parsed_server_socket.bind(("", 3706)) - - # for now, only accept one connection - self.raw_server_socket.listen(0) - self.parsed_server_socket.listen(0) - - self.raw_server_socket.setblocking(False) - self.parsed_server_socket.setblocking(False) - - self.raw_connection = None - self.parsed_connection = None - - def __del__(self): - try: - self.close() - except: - LOGGER.warning("Could not close sockets!") - - def close(self): - self.raw_server_socket.close - self.parsed_server_socket.close - if self.raw_connection != None: - self.raw_connection.close() - - def report_raw_data(self, object_id: ObjectId, - set_id: int, - hk_data: bytes): - - data_dict = {} - data_dict["objectId"] = object_id.as_string - data_dict["setId"] = set_id - data_dict["rawData"] = base64.b64encode(hk_data).decode() - - self.send_dictionary_over_socket(data_dict, True) - - def send_dictionary_over_socket(self, dictionary, raw=False): - # keep listeners current - if self.raw_connection == None: - # no running connection, see if a client wants to connect - try: - (self.raw_connection, _) = self.raw_server_socket.accept() - self.raw_connection.setblocking(False) - except: - # no client waiting - pass - - if self.parsed_connection == None: - # no running connection, see if a client wants to connect - try: - (self.parsed_connection, _) = self.parsed_server_socket.accept() - self.parsed_connection.setblocking(False) - except: - # no client waiting - pass - - socket_to_use = self.parsed_connection - if raw: - socket_to_use = self.raw_connection - - if socket_to_use == None: - return - - data_json_bytes = json.dumps(dictionary).encode() - - # dle encode the bytes - # Taking a shortcut as json is inherently - # not binary (we also encoded it as utf-8), so there - # can not be any 0x02 or 0x03 be in there - data_json_bytes = b'\x02' + data_json_bytes + b'\n' + b'\x03' - - try: - sent_length = socket_to_use.send(data_json_bytes) - except: - socket_to_use = None - return - if sent_length == 0: - socket_to_use.close() - socket_to_use = None - - def handle_hk_packet( - self, - raw_tm: bytes, - obj_id_dict: ObjectIdDictT, - printer: FsfwTmTcPrinter, - ): - tm_packet = Service3FsfwTm.unpack(raw_telemetry=raw_tm, custom_hk_handling=False) - named_obj_id = obj_id_dict.get(tm_packet.object_id.as_bytes) - if named_obj_id is None: - named_obj_id = tm_packet.object_id - if tm_packet.subservice == 25 or tm_packet.subservice == 26: - hk_data = tm_packet.tm_data[8:] - self.report_raw_data(object_id=named_obj_id, - set_id=tm_packet.set_id, - hk_data=hk_data) - printer.generic_hk_tm_print( - content_type=HkContentType.HK, - object_id=named_obj_id, - set_id=tm_packet.set_id, - hk_data=hk_data, - ) - self.handle_regular_hk_print( - printer=printer, - object_id=named_obj_id, - hk_packet=tm_packet, - hk_data=hk_data, - ) - if tm_packet.subservice == 10 or tm_packet.subservice == 12: - LOGGER.warning("HK definitions printout not implemented yet") - - def handle_regular_hk_print( - self, - printer: FsfwTmTcPrinter, - object_id: ObjectId, - hk_packet: Service3Base, - hk_data: bytes, - ): - objb = 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 in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: - handle_rw_hk_data(printer, object_id, set_id, hk_data) - if objb == obj_ids.SYRLINKS_HANDLER_ID: - if set_id == SetIds.RX_REGISTERS_DATASET: - return self.handle_syrlinks_rx_registers_dataset(printer, hk_data) - elif set_id == SetIds.TX_REGISTERS_DATASET: - return self.handle_syrlinks_tx_registers_dataset(printer, hk_data) - else: - LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id") - if objb == obj_ids.IMTQ_HANDLER_ID: - if (set_id >= ImtqSetIds.POSITIVE_X_TEST) and ( - set_id <= ImtqSetIds.NEGATIVE_Z_TEST - ): - return self.handle_self_test_data(printer, hk_data) - else: - LOGGER.info("Service 3 TM: Syrlinks handler reply with unknown set id") - if objb == obj_ids.GPS_HANDLER_0_ID or object_id == obj_ids.GPS_HANDLER_1_ID: - self.handle_gps_data(printer=printer, hk_data=hk_data) - if objb == obj_ids.BPX_HANDLER_ID: - self.handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer) - if objb == obj_ids.CORE_CONTROLLER_ID: - return self.handle_core_hk_data(printer=printer, hk_data=hk_data) - if objb == obj_ids.PDU_1_HANDLER_ID: - return self.handle_pdu_data( - printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data - ) - if objb == obj_ids.PDU_2_HANDLER_ID: - return self.handle_pdu_data( - printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data - ) - if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: - return handle_rw_hk_data( - printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data - ) - if objb == obj_ids.P60_DOCK_HANDLER: - self.handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) - if objb == obj_ids.PL_PCDU_ID: - log_to_both(printer, "Received PL PCDU HK data") - if objb == obj_ids.THERMAL_CONTROLLER_ID: - self.handle_thermal_controller_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) - else: - LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.") - return HkReplyUnpacked() - - def handle_syrlinks_rx_registers_dataset(self, printer: FsfwTmTcPrinter, hk_data: bytes): - reply = HkReplyUnpacked() - header_list = [ - "RX Status", - "RX Sensitivity", - "RX Frequency Shift", - "RX IQ Power", - "RX AGC Value", - "RX Demod Eb", - "RX Demod N0", - "RX Datarate", - ] - rx_status = hk_data[0] - rx_sensitivity = struct.unpack("!I", hk_data[1:5]) - rx_frequency_shift = struct.unpack("!I", hk_data[5:9]) - rx_iq_power = struct.unpack("!H", hk_data[9:11]) - rx_agc_value = struct.unpack("!H", hk_data[11:13]) - rx_demod_eb = struct.unpack("!I", hk_data[13:17]) - rx_demod_n0 = struct.unpack("!I", hk_data[17:21]) - rx_data_rate = hk_data[21] - content_list = [ - rx_status, - rx_sensitivity, - rx_frequency_shift, - rx_iq_power, - rx_agc_value, - rx_demod_eb, - rx_demod_n0, - rx_data_rate, - ] - validity_buffer = hk_data[22:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8) - - def handle_syrlinks_tx_registers_dataset( - self, - printer: FsfwTmTcPrinter, - hk_data: bytes, - ): - reply = HkReplyUnpacked() - header_list = ["TX Status", "TX Waveform", "TX AGC value"] - tx_status = hk_data[0] - tx_waveform = hk_data[1] - tx_agc_value = struct.unpack("!H", hk_data[2:4]) - content_list = [tx_status, tx_waveform, tx_agc_value] - validity_buffer = hk_data[4:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3) - - def handle_self_test_data(self, printer: FsfwTmTcPrinter, hk_data: bytes): - header_list = [ - "Init Err", - "Init Raw Mag X [nT]", - "Init Raw Mag Y [nT]", - "Init Raw Mag Z [nT]", - "Init Cal Mag X [nT]", - "Init Cal Mag Y [nT]", - "Init Cal Mag Z [nT]", - "Init Coil X Current [mA]", - "Init Coil Y Current [mA]", - "Init Coil Z Current [mA]", - "Init Coil X Temperature [°C]", - "Init Coil Y Temperature [°C]", - "Init Coil Z Temperature [°C]", - "Err", - "Raw Mag X [nT]", - "Raw Mag Y [nT]", - "Raw Mag Z [nT]", - "Cal Mag X [nT]", - "Cal Mag Y [nT]", - "Cal Mag Z [nT]", - "Coil X Current [mA]", - "Coil Y Current [mA]", - "Coil Z Current [mA]", - "Coil X Temperature [°C]", - "Coil Y Temperature [°C]", - "Coil Z Temperature [°C]", - "Fina Err", - "Fina Raw Mag X [nT]", - "Fina Raw Mag Y [nT]", - "Fina Raw Mag Z [nT]", - "Fina Cal Mag X [nT]", - "Fina Cal Mag Y [nT]", - "Fina Cal Mag Z [nT]", - "Fina Coil X Current [mA]", - "Fina Coil Y Current [mA]", - "Fina Coil Z Current [mA]", - "Fina Coil X Temperature [°C]", - "Fina Coil Y Temperature [°C]", - "Fina Coil Z Temperature [°C]", - ] - # INIT step (no coil actuation) - init_err = hk_data[0] - init_raw_mag_x = struct.unpack("!f", hk_data[1:5])[0] - init_raw_mag_y = struct.unpack("!f", hk_data[5:9])[0] - init_raw_mag_z = struct.unpack("!f", hk_data[9:13])[0] - init_cal_mag_x = struct.unpack("!f", hk_data[13:17])[0] - init_cal_mag_y = struct.unpack("!f", hk_data[17:21])[0] - init_cal_mag_z = struct.unpack("!f", hk_data[21:25])[0] - init_coil_x_current = struct.unpack("!f", hk_data[25:29])[0] - init_coil_y_current = struct.unpack("!f", hk_data[29:33])[0] - init_coil_z_current = struct.unpack("!f", hk_data[33:37])[0] - init_coil_x_temperature = struct.unpack("!H", hk_data[37:39])[0] - init_coil_y_temperature = struct.unpack("!H", hk_data[39:41])[0] - init_coil_z_temperature = struct.unpack("!H", hk_data[41:43])[0] - - # Actuation step - err = hk_data[43] - raw_mag_x = struct.unpack("!f", hk_data[44:48])[0] - raw_mag_y = struct.unpack("!f", hk_data[48:52])[0] - raw_mag_z = struct.unpack("!f", hk_data[52:56])[0] - cal_mag_x = struct.unpack("!f", hk_data[56:60])[0] - cal_mag_y = struct.unpack("!f", hk_data[60:64])[0] - cal_mag_z = struct.unpack("!f", hk_data[64:68])[0] - coil_x_current = struct.unpack("!f", hk_data[68:72])[0] - coil_y_current = struct.unpack("!f", hk_data[72:76])[0] - coil_z_current = struct.unpack("!f", hk_data[76:80])[0] - coil_x_temperature = struct.unpack("!H", hk_data[80:82])[0] - coil_y_temperature = struct.unpack("!H", hk_data[82:84])[0] - coil_z_temperature = struct.unpack("!H", hk_data[84:86])[0] - - # FINA step (no coil actuation) - fina_err = hk_data[86] - fina_raw_mag_x = struct.unpack("!f", hk_data[87:91])[0] - fina_raw_mag_y = struct.unpack("!f", hk_data[91:95])[0] - fina_raw_mag_z = struct.unpack("!f", hk_data[95:99])[0] - fina_cal_mag_x = struct.unpack("!f", hk_data[99:103])[0] - fina_cal_mag_y = struct.unpack("!f", hk_data[103:107])[0] - fina_cal_mag_z = struct.unpack("!f", hk_data[107:111])[0] - fina_coil_x_current = struct.unpack("!f", hk_data[111:115])[0] - fina_coil_y_current = struct.unpack("!f", hk_data[115:119])[0] - fina_coil_z_current = struct.unpack("!f", hk_data[119:123])[0] - fina_coil_x_temperature = struct.unpack("!H", hk_data[123:125])[0] - fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0] - fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0] - - validity_buffer = hk_data[129:] - content_list = [ - init_err, - init_raw_mag_x, - init_raw_mag_y, - init_raw_mag_z, - init_cal_mag_x, - init_cal_mag_y, - init_cal_mag_z, - init_coil_x_current, - init_coil_y_current, - init_coil_z_current, - init_coil_x_temperature, - init_coil_y_temperature, - init_coil_z_temperature, - err, - raw_mag_x, - raw_mag_y, - raw_mag_z, - cal_mag_x, - cal_mag_y, - cal_mag_z, - coil_x_current, - coil_y_current, - coil_z_current, - coil_x_temperature, - coil_y_temperature, - coil_z_temperature, - fina_err, - fina_raw_mag_x, - fina_raw_mag_y, - fina_raw_mag_z, - fina_cal_mag_x, - fina_cal_mag_y, - fina_cal_mag_z, - fina_coil_x_current, - fina_coil_y_current, - fina_coil_z_current, - fina_coil_x_temperature, - fina_coil_y_temperature, - fina_coil_z_temperature, - ] - num_of_vars = len(header_list) - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars) - - def handle_thermal_controller_hk_data(self, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): - if set_id == 0: - LOGGER.info("Received Sensor Temperature data") - - # get all the floats - tm_data = struct.unpack("!ffffffffffffffff", hk_data[:16 * 4]) - parsed_data = {} - - # put them into a nice dictionary - parsed_data["SID"] = set_id - parsed_data["content"] = {} - parsed_data["content"]["SENSOR_PLOC_HEATSPREADER"] = tm_data[0] - parsed_data["content"]["SENSOR_PLOC_MISSIONBOARD"] = tm_data[1] - parsed_data["content"]["SENSOR_4K_CAMERA"] = tm_data[2] - parsed_data["content"]["SENSOR_DAC_HEATSPREADER"] = tm_data[3] - parsed_data["content"]["SENSOR_STARTRACKER"] = tm_data[4] - parsed_data["content"]["SENSOR_RW1"] = tm_data[5] - parsed_data["content"]["SENSOR_DRO"] = tm_data[6] - parsed_data["content"]["SENSOR_SCEX"] = tm_data[7] - parsed_data["content"]["SENSOR_X8"] = tm_data[8] - parsed_data["content"]["SENSOR_HPA"] = tm_data[9] - parsed_data["content"]["SENSOR_TX_MODUL"] = tm_data[10] - parsed_data["content"]["SENSOR_MPA"] = tm_data[11] - parsed_data["content"]["SENSOR_ACU"] = tm_data[12] - parsed_data["content"]["SENSOR_PLPCDU_HEATSPREADER"] = tm_data[13] - parsed_data["content"]["SENSOR_TCS_BOARD"] = tm_data[14] - parsed_data["content"]["SENSOR_MAGNETTORQUER"] = tm_data[15] - - self.send_dictionary_over_socket(parsed_data) - - def handle_gps_data(self, printer: FsfwTmTcPrinter, hk_data: bytes): - LOGGER.info(f"Received GPS data, HK data length {len(hk_data)}") - reply = HkReplyUnpacked() - var_index = 0 - header_list = [ - "Latitude", - "Longitude", - "Altitude", - "Fix Mode", - "Sats in Use", - "Date", - "Unix Seconds", - ] - latitude = struct.unpack("!d", hk_data[0:8])[0] - longitude = struct.unpack("!d", hk_data[8:16])[0] - altitude = struct.unpack("!d", hk_data[16:24])[0] - fix_mode = hk_data[24] - sat_in_use = hk_data[25] - year = struct.unpack("!H", hk_data[26:28])[0] - month = hk_data[28] - day = hk_data[29] - hours = hk_data[30] - minutes = hk_data[31] - seconds = hk_data[32] - date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}" - unix_seconds = struct.unpack("!I", hk_data[33:37])[0] - content_list = [ - latitude, - longitude, - altitude, - fix_mode, - sat_in_use, - date_string, - unix_seconds, - ] - var_index += 13 - reply.num_of_vars = var_index - if not os.path.isfile("gps_log.txt"): - with open("gps_log.txt", "w") as gps_file: - gps_file.write( - "Time, Latitude [deg], Longitude [deg], Altitude [m], Fix Mode, Sats in Use, " - "Date, Unix Seconds\n" - ) - with open("gps_log.txt", "a") as gps_file: - gps_file.write( - f"{datetime.datetime.now()}, {latitude}, {longitude}, {altitude}, " - f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n" - ) - validity_buffer = hk_data[37:39] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - - def handle_bpx_hk_data(self, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): - if set_id == BpxSetIds.GET_HK_SET: - fmt_str = "!HHHHhhhhIB" - inc_len = struct.calcsize(fmt_str) - ( - charge_current, - discharge_current, - heater_current, - batt_voltage, - batt_temp_1, - batt_temp_2, - batt_temp_3, - batt_temp_4, - reboot_cntr, - boot_cause, - ) = struct.unpack(fmt_str, hk_data[0:inc_len]) - header_list = [ - "Charge Current", - "Discharge Current", - "Heater Current", - "Battery Voltage", - "Batt Temp 1", - "Batt Temp 2", - "Batt Temp 3", - "Batt Temp 4", - "Reboot Counter", - "Boot Cause", - ] - content_list = [ - charge_current, - discharge_current, - heater_current, - batt_voltage, - batt_temp_1, - batt_temp_2, - batt_temp_3, - batt_temp_4, - reboot_cntr, - boot_cause, - ] - validity_buffer = hk_data[inc_len:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - elif set_id == BpxSetIds.GET_CFG_SET: - battheat_mode = hk_data[0] - battheat_low = struct.unpack("!b", hk_data[1:2])[0] - battheat_high = struct.unpack("!b", hk_data[2:3])[0] - header_list = [ - "Battery Heater Mode", - "Battery Heater Low Limit", - "Battery Heater High Limit", - ] - content_list = [battheat_mode, battheat_low, battheat_high] - validity_buffer = hk_data[3:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - - def handle_core_hk_data(self, printer: FsfwTmTcPrinter, hk_data: bytes): - - fmt_str = "!fffH" - inc_len = struct.calcsize(fmt_str) - (temperature, ps_voltage, pl_voltage, tx_agc_value) = struct.unpack( - fmt_str, hk_data[0: 0 + inc_len] - ) - printout = ( - f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | " - f"PL Voltage [mV] {pl_voltage} | TX AGC {tx_agc_value}" - ) - log_to_both(printer, printout) - printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=4) - - P60_INDEX_LIST = [ - "ACU VCC", - "PDU1 VCC", - "X3 IDLE VCC", - "PDU2 VCC", - "ACU VBAT", - "PDU1 VBAT", - "X3 IDLE VBAT", - "PDU2 VBAT", - "STACK VBAT", - "STACK 3V3", - "STACK 5V", - "GS3V3", - "GS5V", - ] - - 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] - - 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"{TmHandler.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( - self, 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: - 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(TmHandler.PDU1_CHANNELS_NAMES)): - latchup_list.append( - struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] - ) - content_line = ( - f"{TmHandler.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(TmHandler.PDU1_CHANNELS_NAMES)): - device_types.append(hk_data[current_idx]) - current_idx += 1 - device_statuses = [] - for idx in range(len(TmHandler.PDU1_CHANNELS_NAMES)): - device_statuses.append(hk_data[current_idx]) - current_idx += 1 - wdt = self.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 = [] - for idx in range(len(TmHandler.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(TmHandler.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(TmHandler.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(TmHandler.PDU1_CHANNELS_NAMES)): - out_enb = f"{output_enb_list[idx]}".ljust(6) - content_line = ( - f"{TmHandler.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} | " - f"Temperature {temperature / 10.0}" - ) - log_to_both(printer, info) - - def handle_p60_hk_data(self, 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") - current_idx = 0 - current_list = [] - for idx in range(13): - current_list.append( - struct.unpack("!h", hk_data[current_idx: current_idx + 2])[0] - ) - current_idx += 2 - voltage_list = [] - for idx in range(13): - voltage_list.append( - struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] - ) - current_idx += 2 - out_enb_list = [] - for idx in range(13): - out_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(13): - out_enb = f"{out_enb_list[idx]}".ljust(6) - content_line = ( - f"{TmHandler.P60_INDEX_LIST[idx].ljust(24)} | {out_enb} | " - f"{voltage_list[idx]:05} | {current_list[idx]:04}" - ) - log_to_both(printer, content_line) - fmt_str = "!IBhHhh" - inc_len = struct.calcsize(fmt_str) - ( - boot_count, - batt_mode, - batt_current, - batt_voltage, - temp_0, - temp_1, - ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) - current_idx += inc_len - batt_info = ( - f"Batt: Mode {batt_mode} | Boot Count {boot_count} | " - f"Charge current {batt_current} | Voltage {batt_voltage}" - ) - temps = f"In C: Temp 0 {temp_0 / 10.0} | Temp 1 {temp_1 / 10.0} | " - log_to_both(printer, temps) - log_to_both(printer, batt_info) - printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9) - if set_id == SetIds.P60_AUX: - log_to_both(printer, "Received P60 AUX HK. Voltages in mV, currents in mA") - current_idx = 0 - latchup_list = [] - log_to_both(printer, "P60 Dock Latchups") - for idx in range(0, 13): - latchup_list.append( - struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] - ) - content_line = f"{TmHandler.P60_INDEX_LIST[idx].ljust(24)} | {latchup_list[idx]}" - log_to_both(printer, content_line) - current_idx += 2 - fmt_str = "!IIHBBHHhhB" - inc_len = struct.calcsize(fmt_str) - ( - boot_cause, - uptime, - reset_cause, - heater_on, - conv_5v_on, - dock_vbat, - dock_vcc_c, - batt_temp_0, - batt_temp_1, - dearm_status, - ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) - current_idx += inc_len - wdt = self.WdtInfo() - current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx) - fmt_str = "!hhbb" - inc_len = struct.calcsize(fmt_str) - ( - batt_charge_current, - batt_discharge_current, - ant6_depl, - ar6_depl, - ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) - current_idx += inc_len - device_types = [] - device_statuses = [] - for idx in range(8): - device_types.append(hk_data[current_idx]) - current_idx += 1 - for idx in range(8): - device_statuses.append(hk_data[current_idx]) - current_idx += 1 - util_info = ( - f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}" - ) - util_info_2 = ( - f"Conv 5V on {conv_5v_on} | Heater On {heater_on} | " - f"Dock VBAT {dock_vbat} | DOCK VCC Current {dock_vcc_c}" - ) - log_to_both(printer, util_info) - log_to_both(printer, util_info_2) - wdt.print(printer) - misc_info = ( - f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}" - ) - log_to_both(printer, misc_info) - batt_info = ( - f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | " - f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}" - ) - log_to_both(printer, batt_info) - printer.print_validity_buffer( - validity_buffer=hk_data[current_idx:], num_vars=27 - ) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py new file mode 100644 index 0000000..2db8e5d --- /dev/null +++ b/pus_tm/hk_handling.py @@ -0,0 +1,739 @@ +"""HK Handling for EIVE OBSW""" +import struct +import os +import datetime + + + +from tmtccmd.config.definitions import HkReplyUnpacked +from tmtccmd.tm.pus_3_fsfw_hk import ( + Service3Base, + HkContentType, + Service3FsfwTm, +) +from tmtccmd.logging import get_console_logger +from pus_tc.devs.bpx_batt import BpxSetIds +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.utility.obj_id import ObjectId, ObjectIdDictT +import config.object_ids as obj_ids + +from pus_tm.devs.reaction_wheels import handle_rw_hk_data +from pus_tm.defs import FsfwTmTcPrinter, log_to_both + +from pus_tm.tm_tcp_server import TmTcpServer + + + +LOGGER = get_console_logger() + +TM_TCP_SERVER = TmTcpServer.getInstance() + + +def handle_hk_packet( + raw_tm: bytes, + obj_id_dict: ObjectIdDictT, + printer: FsfwTmTcPrinter, +): + tm_packet = Service3FsfwTm.unpack(raw_telemetry=raw_tm, custom_hk_handling=False) + named_obj_id = obj_id_dict.get(tm_packet.object_id.as_bytes) + if named_obj_id is None: + named_obj_id = tm_packet.object_id + if tm_packet.subservice == 25 or tm_packet.subservice == 26: + hk_data = tm_packet.tm_data[8:] + TM_TCP_SERVER.report_raw_hk_data(object_id=named_obj_id, + set_id=tm_packet.set_id, + hk_data=hk_data) + printer.generic_hk_tm_print( + content_type=HkContentType.HK, + object_id=named_obj_id, + set_id=tm_packet.set_id, + hk_data=hk_data, + ) + handle_regular_hk_print( + printer=printer, + object_id=named_obj_id, + hk_packet=tm_packet, + hk_data=hk_data, + ) + if tm_packet.subservice == 10 or tm_packet.subservice == 12: + LOGGER.warning("HK definitions printout not implemented yet") + +def handle_regular_hk_print( + printer: FsfwTmTcPrinter, + object_id: ObjectId, + hk_packet: Service3Base, + hk_data: bytes, +): + objb = 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 in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: + handle_rw_hk_data(printer, object_id, set_id, hk_data) + if objb == 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") + if objb == 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") + if objb == obj_ids.GPS_HANDLER_0_ID or object_id == obj_ids.GPS_HANDLER_1_ID: + handle_gps_data(printer=printer, hk_data=hk_data) + if objb == obj_ids.BPX_HANDLER_ID: + handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer) + if objb == obj_ids.CORE_CONTROLLER_ID: + return handle_core_hk_data(printer=printer, hk_data=hk_data) + if objb == obj_ids.PDU_1_HANDLER_ID: + return handle_pdu_data( + printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data + ) + if objb == obj_ids.PDU_2_HANDLER_ID: + return handle_pdu_data( + printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data + ) + if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: + return handle_rw_hk_data( + printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data + ) + if objb == obj_ids.P60_DOCK_HANDLER: + handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) + if objb == obj_ids.PL_PCDU_ID: + log_to_both(printer, "Received PL PCDU HK data") + if objb == obj_ids.THERMAL_CONTROLLER_ID: + handle_thermal_controller_hk_data( object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data) + else: + LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.") + return HkReplyUnpacked() + +def handle_syrlinks_rx_registers_dataset( printer: FsfwTmTcPrinter, hk_data: bytes): + reply = HkReplyUnpacked() + header_list = [ + "RX Status", + "RX Sensitivity", + "RX Frequency Shift", + "RX IQ Power", + "RX AGC Value", + "RX Demod Eb", + "RX Demod N0", + "RX Datarate", + ] + rx_status = hk_data[0] + rx_sensitivity = struct.unpack("!I", hk_data[1:5]) + rx_frequency_shift = struct.unpack("!I", hk_data[5:9]) + rx_iq_power = struct.unpack("!H", hk_data[9:11]) + rx_agc_value = struct.unpack("!H", hk_data[11:13]) + rx_demod_eb = struct.unpack("!I", hk_data[13:17]) + rx_demod_n0 = struct.unpack("!I", hk_data[17:21]) + rx_data_rate = hk_data[21] + content_list = [ + rx_status, + rx_sensitivity, + rx_frequency_shift, + rx_iq_power, + rx_agc_value, + rx_demod_eb, + rx_demod_n0, + rx_data_rate, + ] + validity_buffer = hk_data[22:] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8) + +def handle_syrlinks_tx_registers_dataset( + printer: FsfwTmTcPrinter, + hk_data: bytes, +): + reply = HkReplyUnpacked() + header_list = ["TX Status", "TX Waveform", "TX AGC value"] + tx_status = hk_data[0] + tx_waveform = hk_data[1] + tx_agc_value = struct.unpack("!H", hk_data[2:4]) + content_list = [tx_status, tx_waveform, tx_agc_value] + validity_buffer = hk_data[4:] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3) + +def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes): + header_list = [ + "Init Err", + "Init Raw Mag X [nT]", + "Init Raw Mag Y [nT]", + "Init Raw Mag Z [nT]", + "Init Cal Mag X [nT]", + "Init Cal Mag Y [nT]", + "Init Cal Mag Z [nT]", + "Init Coil X Current [mA]", + "Init Coil Y Current [mA]", + "Init Coil Z Current [mA]", + "Init Coil X Temperature [°C]", + "Init Coil Y Temperature [°C]", + "Init Coil Z Temperature [°C]", + "Err", + "Raw Mag X [nT]", + "Raw Mag Y [nT]", + "Raw Mag Z [nT]", + "Cal Mag X [nT]", + "Cal Mag Y [nT]", + "Cal Mag Z [nT]", + "Coil X Current [mA]", + "Coil Y Current [mA]", + "Coil Z Current [mA]", + "Coil X Temperature [°C]", + "Coil Y Temperature [°C]", + "Coil Z Temperature [°C]", + "Fina Err", + "Fina Raw Mag X [nT]", + "Fina Raw Mag Y [nT]", + "Fina Raw Mag Z [nT]", + "Fina Cal Mag X [nT]", + "Fina Cal Mag Y [nT]", + "Fina Cal Mag Z [nT]", + "Fina Coil X Current [mA]", + "Fina Coil Y Current [mA]", + "Fina Coil Z Current [mA]", + "Fina Coil X Temperature [°C]", + "Fina Coil Y Temperature [°C]", + "Fina Coil Z Temperature [°C]", + ] + # INIT step (no coil actuation) + init_err = hk_data[0] + init_raw_mag_x = struct.unpack("!f", hk_data[1:5])[0] + init_raw_mag_y = struct.unpack("!f", hk_data[5:9])[0] + init_raw_mag_z = struct.unpack("!f", hk_data[9:13])[0] + init_cal_mag_x = struct.unpack("!f", hk_data[13:17])[0] + init_cal_mag_y = struct.unpack("!f", hk_data[17:21])[0] + init_cal_mag_z = struct.unpack("!f", hk_data[21:25])[0] + init_coil_x_current = struct.unpack("!f", hk_data[25:29])[0] + init_coil_y_current = struct.unpack("!f", hk_data[29:33])[0] + init_coil_z_current = struct.unpack("!f", hk_data[33:37])[0] + init_coil_x_temperature = struct.unpack("!H", hk_data[37:39])[0] + init_coil_y_temperature = struct.unpack("!H", hk_data[39:41])[0] + init_coil_z_temperature = struct.unpack("!H", hk_data[41:43])[0] + + # Actuation step + err = hk_data[43] + raw_mag_x = struct.unpack("!f", hk_data[44:48])[0] + raw_mag_y = struct.unpack("!f", hk_data[48:52])[0] + raw_mag_z = struct.unpack("!f", hk_data[52:56])[0] + cal_mag_x = struct.unpack("!f", hk_data[56:60])[0] + cal_mag_y = struct.unpack("!f", hk_data[60:64])[0] + cal_mag_z = struct.unpack("!f", hk_data[64:68])[0] + coil_x_current = struct.unpack("!f", hk_data[68:72])[0] + coil_y_current = struct.unpack("!f", hk_data[72:76])[0] + coil_z_current = struct.unpack("!f", hk_data[76:80])[0] + coil_x_temperature = struct.unpack("!H", hk_data[80:82])[0] + coil_y_temperature = struct.unpack("!H", hk_data[82:84])[0] + coil_z_temperature = struct.unpack("!H", hk_data[84:86])[0] + + # FINA step (no coil actuation) + fina_err = hk_data[86] + fina_raw_mag_x = struct.unpack("!f", hk_data[87:91])[0] + fina_raw_mag_y = struct.unpack("!f", hk_data[91:95])[0] + fina_raw_mag_z = struct.unpack("!f", hk_data[95:99])[0] + fina_cal_mag_x = struct.unpack("!f", hk_data[99:103])[0] + fina_cal_mag_y = struct.unpack("!f", hk_data[103:107])[0] + fina_cal_mag_z = struct.unpack("!f", hk_data[107:111])[0] + fina_coil_x_current = struct.unpack("!f", hk_data[111:115])[0] + fina_coil_y_current = struct.unpack("!f", hk_data[115:119])[0] + fina_coil_z_current = struct.unpack("!f", hk_data[119:123])[0] + fina_coil_x_temperature = struct.unpack("!H", hk_data[123:125])[0] + fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0] + fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0] + + validity_buffer = hk_data[129:] + content_list = [ + init_err, + init_raw_mag_x, + init_raw_mag_y, + init_raw_mag_z, + init_cal_mag_x, + init_cal_mag_y, + init_cal_mag_z, + init_coil_x_current, + init_coil_y_current, + init_coil_z_current, + init_coil_x_temperature, + init_coil_y_temperature, + init_coil_z_temperature, + err, + raw_mag_x, + raw_mag_y, + raw_mag_z, + cal_mag_x, + cal_mag_y, + cal_mag_z, + coil_x_current, + coil_y_current, + coil_z_current, + coil_x_temperature, + coil_y_temperature, + coil_z_temperature, + fina_err, + fina_raw_mag_x, + fina_raw_mag_y, + fina_raw_mag_z, + fina_cal_mag_x, + fina_cal_mag_y, + fina_cal_mag_z, + fina_coil_x_current, + fina_coil_y_current, + fina_coil_z_current, + fina_coil_x_temperature, + fina_coil_y_temperature, + fina_coil_z_temperature, + ] + num_of_vars = len(header_list) + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars) + +def handle_thermal_controller_hk_data(object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + if set_id == 0: + LOGGER.info("Received Sensor Temperature data") + + # get all the floats + tm_data = struct.unpack("!ffffffffffffffff", hk_data[:16 * 4]) + parsed_data = {} + + # put them into a nice dictionary + parsed_data["SENSOR_PLOC_HEATSPREADER"] = tm_data[0] + parsed_data["SENSOR_PLOC_MISSIONBOARD"] = tm_data[1] + parsed_data["SENSOR_4K_CAMERA"] = tm_data[2] + parsed_data["SENSOR_DAC_HEATSPREADER"] = tm_data[3] + parsed_data["SENSOR_STARTRACKER"] = tm_data[4] + parsed_data["SENSOR_RW1"] = tm_data[5] + parsed_data["SENSOR_DRO"] = tm_data[6] + parsed_data["SENSOR_SCEX"] = tm_data[7] + parsed_data["SENSOR_X8"] = tm_data[8] + parsed_data["SENSOR_HPA"] = tm_data[9] + parsed_data["SENSOR_TX_MODUL"] = tm_data[10] + parsed_data["SENSOR_MPA"] = tm_data[11] + parsed_data["SENSOR_ACU"] = tm_data[12] + parsed_data["SENSOR_PLPCDU_HEATSPREADER"] = tm_data[13] + parsed_data["SENSOR_TCS_BOARD"] = tm_data[14] + parsed_data["SENSOR_MAGNETTORQUER"] = tm_data[15] + + TM_TCP_SERVER.report_parsed_hk_data(object_id, set_id, parsed_data) + +def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes): + LOGGER.info(f"Received GPS data, HK data length {len(hk_data)}") + reply = HkReplyUnpacked() + var_index = 0 + header_list = [ + "Latitude", + "Longitude", + "Altitude", + "Fix Mode", + "Sats in Use", + "Date", + "Unix Seconds", + ] + latitude = struct.unpack("!d", hk_data[0:8])[0] + longitude = struct.unpack("!d", hk_data[8:16])[0] + altitude = struct.unpack("!d", hk_data[16:24])[0] + fix_mode = hk_data[24] + sat_in_use = hk_data[25] + year = struct.unpack("!H", hk_data[26:28])[0] + month = hk_data[28] + day = hk_data[29] + hours = hk_data[30] + minutes = hk_data[31] + seconds = hk_data[32] + date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}" + unix_seconds = struct.unpack("!I", hk_data[33:37])[0] + content_list = [ + latitude, + longitude, + altitude, + fix_mode, + sat_in_use, + date_string, + unix_seconds, + ] + var_index += 13 + reply.num_of_vars = var_index + if not os.path.isfile("gps_log.txt"): + with open("gps_log.txt", "w") as gps_file: + gps_file.write( + "Time, Latitude [deg], Longitude [deg], Altitude [m], Fix Mode, Sats in Use, " + "Date, Unix Seconds\n" + ) + with open("gps_log.txt", "a") as gps_file: + gps_file.write( + f"{datetime.datetime.now()}, {latitude}, {longitude}, {altitude}, " + f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n" + ) + validity_buffer = hk_data[37:39] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) + +def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + if set_id == BpxSetIds.GET_HK_SET: + fmt_str = "!HHHHhhhhIB" + inc_len = struct.calcsize(fmt_str) + ( + charge_current, + discharge_current, + heater_current, + batt_voltage, + batt_temp_1, + batt_temp_2, + batt_temp_3, + batt_temp_4, + reboot_cntr, + boot_cause, + ) = struct.unpack(fmt_str, hk_data[0:inc_len]) + header_list = [ + "Charge Current", + "Discharge Current", + "Heater Current", + "Battery Voltage", + "Batt Temp 1", + "Batt Temp 2", + "Batt Temp 3", + "Batt Temp 4", + "Reboot Counter", + "Boot Cause", + ] + content_list = [ + charge_current, + discharge_current, + heater_current, + batt_voltage, + batt_temp_1, + batt_temp_2, + batt_temp_3, + batt_temp_4, + reboot_cntr, + boot_cause, + ] + validity_buffer = hk_data[inc_len:] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) + elif set_id == BpxSetIds.GET_CFG_SET: + battheat_mode = hk_data[0] + battheat_low = struct.unpack("!b", hk_data[1:2])[0] + battheat_high = struct.unpack("!b", hk_data[2:3])[0] + header_list = [ + "Battery Heater Mode", + "Battery Heater Low Limit", + "Battery Heater High Limit", + ] + content_list = [battheat_mode, battheat_low, battheat_high] + validity_buffer = hk_data[3:] + log_to_both(printer, str(header_list)) + log_to_both(printer, str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) + +def handle_core_hk_data(printer: FsfwTmTcPrinter, hk_data: bytes): + + fmt_str = "!fffH" + inc_len = struct.calcsize(fmt_str) + (temperature, ps_voltage, pl_voltage, tx_agc_value) = struct.unpack( + fmt_str, hk_data[0: 0 + inc_len] + ) + printout = ( + f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | " + f"PL Voltage [mV] {pl_voltage} | TX AGC {tx_agc_value}" + ) + log_to_both(printer, printout) + printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=4) + +P60_INDEX_LIST = [ + "ACU VCC", + "PDU1 VCC", + "X3 IDLE VCC", + "PDU2 VCC", + "ACU VBAT", + "PDU1 VBAT", + "X3 IDLE VBAT", + "PDU2 VBAT", + "STACK VBAT", + "STACK 3V3", + "STACK 5V", + "GS3V3", + "GS5V", +] + +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] + +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"{TmHandler.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: + 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(TmHandler.PDU1_CHANNELS_NAMES)): + latchup_list.append( + struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] + ) + content_line = ( + f"{TmHandler.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(TmHandler.PDU1_CHANNELS_NAMES)): + device_types.append(hk_data[current_idx]) + current_idx += 1 + device_statuses = [] + for idx in range(len(TmHandler.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 = [] + for idx in range(len(TmHandler.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(TmHandler.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(TmHandler.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(TmHandler.PDU1_CHANNELS_NAMES)): + out_enb = f"{output_enb_list[idx]}".ljust(6) + content_line = ( + f"{TmHandler.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} | " + f"Temperature {temperature / 10.0}" + ) + log_to_both(printer, info) + +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") + current_idx = 0 + current_list = [] + for idx in range(13): + current_list.append( + struct.unpack("!h", hk_data[current_idx: current_idx + 2])[0] + ) + current_idx += 2 + voltage_list = [] + for idx in range(13): + voltage_list.append( + struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] + ) + current_idx += 2 + out_enb_list = [] + for idx in range(13): + out_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(13): + out_enb = f"{out_enb_list[idx]}".ljust(6) + content_line = ( + f"{TmHandler.P60_INDEX_LIST[idx].ljust(24)} | {out_enb} | " + f"{voltage_list[idx]:05} | {current_list[idx]:04}" + ) + log_to_both(printer, content_line) + fmt_str = "!IBhHhh" + inc_len = struct.calcsize(fmt_str) + ( + boot_count, + batt_mode, + batt_current, + batt_voltage, + temp_0, + temp_1, + ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) + current_idx += inc_len + batt_info = ( + f"Batt: Mode {batt_mode} | Boot Count {boot_count} | " + f"Charge current {batt_current} | Voltage {batt_voltage}" + ) + temps = f"In C: Temp 0 {temp_0 / 10.0} | Temp 1 {temp_1 / 10.0} | " + log_to_both(printer, temps) + log_to_both(printer, batt_info) + printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9) + if set_id == SetIds.P60_AUX: + log_to_both(printer, "Received P60 AUX HK. Voltages in mV, currents in mA") + current_idx = 0 + latchup_list = [] + log_to_both(printer, "P60 Dock Latchups") + for idx in range(0, 13): + latchup_list.append( + struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] + ) + content_line = f"{TmHandler.P60_INDEX_LIST[idx].ljust(24)} | {latchup_list[idx]}" + log_to_both(printer, content_line) + current_idx += 2 + fmt_str = "!IIHBBHHhhB" + inc_len = struct.calcsize(fmt_str) + ( + boot_cause, + uptime, + reset_cause, + heater_on, + conv_5v_on, + dock_vbat, + dock_vcc_c, + batt_temp_0, + batt_temp_1, + dearm_status, + ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) + current_idx += inc_len + 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) + ( + batt_charge_current, + batt_discharge_current, + ant6_depl, + ar6_depl, + ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) + current_idx += inc_len + device_types = [] + device_statuses = [] + for idx in range(8): + device_types.append(hk_data[current_idx]) + current_idx += 1 + for idx in range(8): + device_statuses.append(hk_data[current_idx]) + current_idx += 1 + util_info = ( + f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}" + ) + util_info_2 = ( + f"Conv 5V on {conv_5v_on} | Heater On {heater_on} | " + f"Dock VBAT {dock_vbat} | DOCK VCC Current {dock_vcc_c}" + ) + log_to_both(printer, util_info) + log_to_both(printer, util_info_2) + wdt.print(printer) + misc_info = ( + f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}" + ) + log_to_both(printer, misc_info) + batt_info = ( + f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | " + f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}" + ) + log_to_both(printer, batt_info) + printer.print_validity_buffer( + validity_buffer=hk_data[current_idx:], num_vars=27 + ) diff --git a/pus_tm/tm_tcp_server.py b/pus_tm/tm_tcp_server.py new file mode 100644 index 0000000..acd5d9f --- /dev/null +++ b/pus_tm/tm_tcp_server.py @@ -0,0 +1,102 @@ +import socket +from typing import Optional +import json +import base64 + +from tmtccmd.logging import get_console_logger +from tmtccmd.utility.obj_id import ObjectId + + +# TODO add to configuration parameters +SERVER_HOST = "" +SERVER_PORT = 7305 + +LOGGER = get_console_logger() + + +class TmTcpServer: + + _Instance = None + + def __init__( + self): + + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + self.server_socket.bind((SERVER_HOST, SERVER_PORT)) + + # for now, only accept one connection + self.server_socket.listen(0) + + self.server_socket.setblocking(False) + + self.client_connection: Optional[socket.socket] = None + + def __del__(self): + try: + self.close() + except: + LOGGER.warning("Could not close sockets!") + + def close(self): + self.server_socket.close() + if self.client_connection != None: + self.client_connection.close() + + def getInstance(): + if TmTcpServer._Instance == None: + TmTcpServer._Instance = TmTcpServer() + return TmTcpServer._Instance + + def _send_dictionary_over_socket(self, dictionary): + # keep listeners current + if self.client_connection == None: + # no running connection, see if a client wants to connect + try: + (self.client_connection, _) = self.server_socket.accept() + self.client_connection.setblocking(False) + except: + # no client waiting + return + + data_json_bytes = json.dumps(dictionary).encode() + + # dle encode the bytes + # Taking a shortcut as json is inherently + # not binary (we also encoded it as utf-8), so there + # can not be any 0x02 or 0x03 be in there + data_json_bytes = b'\x02' + data_json_bytes + b'\n' + b'\x03' + + try: + sent_length = self.client_connection.send(data_json_bytes) + except: + self.client_connection = None + return + if sent_length == 0: + self.client_connection.close() + self.client_connection = None + + def report_raw_hk_data(self, object_id: ObjectId, + set_id: int, + hk_data: bytes): + + data_dict = {} + data_dict["type"] = "TM" + data_dict["tmType"] = "Raw HK" + data_dict["objectId"] = object_id.as_string + data_dict["setId"] = set_id + data_dict["rawData"] = base64.b64encode(hk_data).decode() + + self._send_dictionary_over_socket(data_dict) + + def report_parsed_hk_data(self, object_id: ObjectId, + set_id: int, + data_dictionary): + data_dict = {} + data_dict["type"] = "TM" + data_dict["tmType"] = "Parsed HK" + data_dict["objectId"] = object_id.as_string + data_dict["setId"] = set_id + data_dict["content"] = data_dictionary + + self._send_dictionary_over_socket(data_dict) \ No newline at end of file From bde8a2947340275fc023b631c24f32e63f035570 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Wed, 18 May 2022 16:41:10 +0200 Subject: [PATCH 009/132] added TODO --- pus_tm/tm_tcp_server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pus_tm/tm_tcp_server.py b/pus_tm/tm_tcp_server.py index acd5d9f..bc4dfd5 100644 --- a/pus_tm/tm_tcp_server.py +++ b/pus_tm/tm_tcp_server.py @@ -65,6 +65,7 @@ class TmTcpServer: # Taking a shortcut as json is inherently # not binary (we also encoded it as utf-8), so there # can not be any 0x02 or 0x03 be in there + # TODO use dle encoder to be format compliant data_json_bytes = b'\x02' + data_json_bytes + b'\n' + b'\x03' try: From b0bdb2208fd518ba46d0d493a4747e473e8f541a Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Wed, 18 May 2022 17:01:48 +0200 Subject: [PATCH 010/132] using dle encoder in tm tcp server --- pus_tm/tm_tcp_server.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pus_tm/tm_tcp_server.py b/pus_tm/tm_tcp_server.py index bc4dfd5..4bf0138 100644 --- a/pus_tm/tm_tcp_server.py +++ b/pus_tm/tm_tcp_server.py @@ -5,7 +5,7 @@ import base64 from tmtccmd.logging import get_console_logger from tmtccmd.utility.obj_id import ObjectId - +from dle_encoder import DleEncoder # TODO add to configuration parameters SERVER_HOST = "" @@ -32,6 +32,8 @@ class TmTcpServer: self.client_connection: Optional[socket.socket] = None + self.dle_encoder = DleEncoder() + def __del__(self): try: self.close() @@ -62,11 +64,8 @@ class TmTcpServer: data_json_bytes = json.dumps(dictionary).encode() # dle encode the bytes - # Taking a shortcut as json is inherently - # not binary (we also encoded it as utf-8), so there - # can not be any 0x02 or 0x03 be in there - # TODO use dle encoder to be format compliant - data_json_bytes = b'\x02' + data_json_bytes + b'\n' + b'\x03' + # adding a newline because someone might want to look at it in a console + data_json_bytes = self.dle_encoder.encode(data_json_bytes + b'\n') try: sent_length = self.client_connection.send(data_json_bytes) From dff2c1b04179c20d466203effd90887fdf8c5777 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Wed, 18 May 2022 17:40:03 +0200 Subject: [PATCH 011/132] made parsed hk in json an array, so it can be iterated in order --- pus_tm/hk_handling.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 2db8e5d..2197f8d 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -305,23 +305,24 @@ def handle_thermal_controller_hk_data(object_id: ObjectId, printer: FsfwTmTcPrin tm_data = struct.unpack("!ffffffffffffffff", hk_data[:16 * 4]) parsed_data = {} - # put them into a nice dictionary - parsed_data["SENSOR_PLOC_HEATSPREADER"] = tm_data[0] - parsed_data["SENSOR_PLOC_MISSIONBOARD"] = tm_data[1] - parsed_data["SENSOR_4K_CAMERA"] = tm_data[2] - parsed_data["SENSOR_DAC_HEATSPREADER"] = tm_data[3] - parsed_data["SENSOR_STARTRACKER"] = tm_data[4] - parsed_data["SENSOR_RW1"] = tm_data[5] - parsed_data["SENSOR_DRO"] = tm_data[6] - parsed_data["SENSOR_SCEX"] = tm_data[7] - parsed_data["SENSOR_X8"] = tm_data[8] - parsed_data["SENSOR_HPA"] = tm_data[9] - parsed_data["SENSOR_TX_MODUL"] = tm_data[10] - parsed_data["SENSOR_MPA"] = tm_data[11] - parsed_data["SENSOR_ACU"] = tm_data[12] - parsed_data["SENSOR_PLPCDU_HEATSPREADER"] = tm_data[13] - parsed_data["SENSOR_TCS_BOARD"] = tm_data[14] - parsed_data["SENSOR_MAGNETTORQUER"] = tm_data[15] + # put them into an list with their names + parsed_data = [] + parsed_data.append({"SENSOR_PLOC_HEATSPREADER": tm_data[0]}) + parsed_data.append({"SENSOR_PLOC_MISSIONBOARD": tm_data[1]}) + parsed_data.append({"SENSOR_4K_CAMERA": tm_data[2]}) + parsed_data.append({"SENSOR_DAC_HEATSPREADER": tm_data[3]}) + parsed_data.append({"SENSOR_STARTRACKER": tm_data[4]}) + parsed_data.append({"SENSOR_RW1": tm_data[5]}) + parsed_data.append({"SENSOR_DRO": tm_data[6]}) + parsed_data.append({"SENSOR_SCEX": tm_data[7]}) + parsed_data.append({"SENSOR_X8": tm_data[8]}) + parsed_data.append({"SENSOR_HPA": tm_data[9]}) + parsed_data.append({"SENSOR_TX_MODUL": tm_data[10]}) + parsed_data.append({"SENSOR_MPA": tm_data[11]}) + parsed_data.append({"SENSOR_ACU": tm_data[12]}) + parsed_data.append({"SENSOR_PLPCDU_HEATSPREADER": tm_data[13]}) + parsed_data.append({"SENSOR_TCS_BOARD": tm_data[14]}) + parsed_data.append({"SENSOR_MAGNETTORQUER": tm_data[15]}) TM_TCP_SERVER.report_parsed_hk_data(object_id, set_id, parsed_data) From b008cc8392917d984eb675b1d9d9c869e3ef8a4c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 18 May 2022 18:32:20 +0200 Subject: [PATCH 012/132] README fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a32765..6b72ac8 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Run GUI mode 1. Create virtual environment ```sh - py -m venv . + py -m venv venv ``` 2. Activate virtual environment From 973bdeadd61a91141fd1fa5771e06ddae8263194 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Wed, 18 May 2022 18:39:18 +0200 Subject: [PATCH 013/132] proc service added --- config/definitions.py | 1 + config/hook_implementations.py | 2 ++ pus_tc/cmd_definitions.py | 16 ++++++++++++++++ pus_tc/system/proc.py | 24 ++++++++++++++++++++++++ pus_tc/tc_packer_hook.py | 3 +++ tmtc_conf.json | 6 ++++++ 6 files changed, 52 insertions(+) create mode 100644 pus_tc/system/proc.py create mode 100644 tmtc_conf.json diff --git a/config/definitions.py b/config/definitions.py index 80a7ddb..20aa498 100644 --- a/config/definitions.py +++ b/config/definitions.py @@ -46,3 +46,4 @@ class CustomServiceList(enum.Enum): SUS_ASS = "sus-ass" TCS_ASS = "tcs-ass" TIME = "time" + PROCEDURE = "proc" diff --git a/config/hook_implementations.py b/config/hook_implementations.py index 9f50c1f..400672e 100644 --- a/config/hook_implementations.py +++ b/config/hook_implementations.py @@ -71,6 +71,7 @@ def get_eive_service_op_code_dict(service_op_code_dict: ServiceOpCodeDictT): add_ploc_supv_cmds, add_system_cmds, add_time_cmds, + add_proc_cmds, ) from pus_tc.devs.gps import GpsOpCodes @@ -85,6 +86,7 @@ def get_eive_service_op_code_dict(service_op_code_dict: ServiceOpCodeDictT): add_ploc_supv_cmds(cmd_dict=service_op_code_dict) add_system_cmds(cmd_dict=service_op_code_dict) add_time_cmds(cmd_dict=service_op_code_dict) + add_proc_cmds(cmd_dict=service_op_code_dict) op_code_dict = { GpsOpCodes.RESET_GNSS.value: ("Reset GPS", {OpCodeDictKeys.TIMEOUT: 2.0}) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 37e4a8e..a9e4387 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -685,6 +685,22 @@ def add_ploc_supv_cmds(cmd_dict: ServiceOpCodeDictT): ] = service_ploc_memory_dumper_tuple +def add_proc_cmds(cmd_dict: ServiceOpCodeDictT): + from pus_tc.system.proc import OpCodes, Info + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.HEATER, + info=Info.HEATER + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.PROCEDURE.value, + info="Procedures", + op_code_entry=op_code_dict, + ) + + def add_system_cmds(cmd_dict: ServiceOpCodeDictT): from pus_tc.system.acs import AcsOpCodes, SusOpCodes import pus_tc.system.tcs as tcs diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py new file mode 100644 index 0000000..0544df0 --- /dev/null +++ b/pus_tc/system/proc.py @@ -0,0 +1,24 @@ +from tmtccmd.config import QueueCommands +from tmtccmd.tc.definitions import TcQueueT + + +class OpCodes: + HEATER = ["0", "heater"] + + +class Info: + HEATER = "heater procedure" + + +def pack_proc_commands(tc_queue: TcQueueT, op_code: str): + testint = 10 + print(f"hello world{op_code} {testint}") + if op_code in OpCodes.HEATER: + tc_queue.appendleft((QueueCommands.PRINT, "TUrning heater 0 on")) + tc_queue.appendleft(heater1cmd_on.pack_command_tuple()) + tc_queue.appendleft((QueueCommands.PRINT, "TUrning heater 0 off")) + tc_queue.appendleft(heater1cmd_off.pack_command_tuple()) + tc_queue.appendleft(heater1cmd.pack_command_tuple()) + tc_queue.appendleft(heater1cmd.pack_command_tuple()) + + pass diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py index 420a768..cb370cb 100644 --- a/pus_tc/tc_packer_hook.py +++ b/pus_tc/tc_packer_hook.py @@ -41,6 +41,7 @@ from pus_tc.system.acs import pack_acs_command, pack_sus_cmds from pus_tc.devs.plpcdu import pack_pl_pcdu_commands from pus_tc.devs.str_img_helper import pack_str_img_helper_command from pus_tc.system.tcs import pack_tcs_sys_commands +from pus_tc.system.proc import pack_proc_commands from config.definitions import CustomServiceList from config.object_ids import ( P60_DOCK_HANDLER, @@ -223,6 +224,8 @@ def pack_service_queue_user( return pack_solar_array_deployment_test_into( object_id=SOLAR_ARRAY_DEPLOYMENT_ID, tc_queue=service_queue ) + if service == CustomServiceList.PROCEDURE.value: + return pack_proc_commands(tc_queue=service_queue, op_code=op_code) if service == CustomServiceList.SUS_ASS.value: return pack_sus_cmds(tc_queue=service_queue, op_code=op_code) if service == CustomServiceList.PL_PCDU.value: diff --git a/tmtc_conf.json b/tmtc_conf.json new file mode 100644 index 0000000..e7b49d5 --- /dev/null +++ b/tmtc_conf.json @@ -0,0 +1,6 @@ +{ + "com_if": "dummy", + "tcpip_tcp_ip_addr": "127.0.0.1", + "tcpip_tcp_port": 1536, + "tcpip_tcp_recv_max_size": 1500 +} \ No newline at end of file From 817a89370a3189b79555104099642c08dab05cfe Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 18 May 2022 20:00:59 +0200 Subject: [PATCH 014/132] add battery tv test procedure --- config/definitions.py | 1 + pus_tc/cmd_definitions.py | 15 ++++++++++----- pus_tc/system/proc.py | 38 ++++++++++++++++++++++++++++---------- tmtc_conf.json | 6 ------ tmtccmd | 2 +- 5 files changed, 40 insertions(+), 22 deletions(-) delete mode 100644 tmtc_conf.json diff --git a/config/definitions.py b/config/definitions.py index 0445033..8f8507d 100644 --- a/config/definitions.py +++ b/config/definitions.py @@ -48,3 +48,4 @@ class CustomServiceList(enum.Enum): TCS_ASS = "tcs-ass" TIME = "time" PROCEDURE = "proc" + TVTTESTPROCEDURE = "tvtestproc" diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index ad4c3f3..8ca7c03 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -949,18 +949,23 @@ def add_ploc_supv_cmds(cmd_dict: ServiceOpCodeDictT): def add_proc_cmds(cmd_dict: ServiceOpCodeDictT): from pus_tc.system.proc import OpCodes, Info + op_code_dict = dict() - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.HEATER, - info=Info.HEATER - ) + add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.HEATER, info=Info.HEATER) add_service_op_code_entry( srv_op_code_dict=cmd_dict, name=CustomServiceList.PROCEDURE.value, info="Procedures", op_code_entry=op_code_dict, ) + op_code_dict = dict() + add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.BAT_FT, info=Info.BAT_FT) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.PROCEDURE.value, + info="TV Test Procedures", + op_code_entry=op_code_dict, + ) def add_system_cmds(cmd_dict: ServiceOpCodeDictT): diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 0544df0..0893469 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -1,24 +1,42 @@ from tmtccmd.config import QueueCommands from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.tc.pus_3_fsfw_hk import * +from config.object_ids import BPX_HANDLER_ID +from pus_tc.devs.bpx_batt import BpxSetIds class OpCodes: HEATER = ["0", "heater"] + BAT_FT = ["bat-ft"] class Info: HEATER = "heater procedure" + BAT_FT = "battery functional test" def pack_proc_commands(tc_queue: TcQueueT, op_code: str): - testint = 10 - print(f"hello world{op_code} {testint}") - if op_code in OpCodes.HEATER: - tc_queue.appendleft((QueueCommands.PRINT, "TUrning heater 0 on")) - tc_queue.appendleft(heater1cmd_on.pack_command_tuple()) - tc_queue.appendleft((QueueCommands.PRINT, "TUrning heater 0 off")) - tc_queue.appendleft(heater1cmd_off.pack_command_tuple()) - tc_queue.appendleft(heater1cmd.pack_command_tuple()) - tc_queue.appendleft(heater1cmd.pack_command_tuple()) - + if op_code in OpCodes.BAT_FT: + tc_queue.appendleft( + ( + QueueCommands.PRINT, + f"Executing Battery functional test Procedure ({OpCodes.BAT_FT})", + ) + ) + tc_queue.appendleft((QueueCommands.PRINT, f"Enabling periodic HK for Battery")) + cmd_tuple = enable_periodic_hk_command_with_interval( + diag=False, + sid=make_sid(BPX_HANDLER_ID, BpxSetIds.GET_HK_SET), + interval_seconds=10.0, + ssc=0, + ) + for cmd in cmd_tuple: + tc_queue.appendleft(cmd.pack_command_tuple()) + tc_queue.appendleft((QueueCommands.WAIT, 120.0)) + tc_queue.appendleft((QueueCommands.PRINT, "Disabling periodic HK for Battery")) + tc_queue.appendleft( + disable_periodic_hk_command( + diag=False, sid=make_sid(BPX_HANDLER_ID, BpxSetIds.GET_HK_SET), ssc=0 + ).pack_command_tuple() + ) pass diff --git a/tmtc_conf.json b/tmtc_conf.json deleted file mode 100644 index e7b49d5..0000000 --- a/tmtc_conf.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "com_if": "dummy", - "tcpip_tcp_ip_addr": "127.0.0.1", - "tcpip_tcp_port": 1536, - "tcpip_tcp_recv_max_size": 1500 -} \ No newline at end of file diff --git a/tmtccmd b/tmtccmd index e81e6db..4433284 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit e81e6dbd594c1cdf51cd355a724cbd267d9dee38 +Subproject commit 443328422a03395bd51d072d3360de3397e1d88b From 2ba33309a758390e9bfd449079280d28aa6d284e Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Wed, 18 May 2022 21:43:46 +0200 Subject: [PATCH 015/132] hk handling back to using a dict as I learned it is now ordered --- pus_tm/hk_handling.py | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 2197f8d..53b7aab 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -305,24 +305,23 @@ def handle_thermal_controller_hk_data(object_id: ObjectId, printer: FsfwTmTcPrin tm_data = struct.unpack("!ffffffffffffffff", hk_data[:16 * 4]) parsed_data = {} - # put them into an list with their names - parsed_data = [] - parsed_data.append({"SENSOR_PLOC_HEATSPREADER": tm_data[0]}) - parsed_data.append({"SENSOR_PLOC_MISSIONBOARD": tm_data[1]}) - parsed_data.append({"SENSOR_4K_CAMERA": tm_data[2]}) - parsed_data.append({"SENSOR_DAC_HEATSPREADER": tm_data[3]}) - parsed_data.append({"SENSOR_STARTRACKER": tm_data[4]}) - parsed_data.append({"SENSOR_RW1": tm_data[5]}) - parsed_data.append({"SENSOR_DRO": tm_data[6]}) - parsed_data.append({"SENSOR_SCEX": tm_data[7]}) - parsed_data.append({"SENSOR_X8": tm_data[8]}) - parsed_data.append({"SENSOR_HPA": tm_data[9]}) - parsed_data.append({"SENSOR_TX_MODUL": tm_data[10]}) - parsed_data.append({"SENSOR_MPA": tm_data[11]}) - parsed_data.append({"SENSOR_ACU": tm_data[12]}) - parsed_data.append({"SENSOR_PLPCDU_HEATSPREADER": tm_data[13]}) - parsed_data.append({"SENSOR_TCS_BOARD": tm_data[14]}) - parsed_data.append({"SENSOR_MAGNETTORQUER": tm_data[15]}) + # put them into an nice dictionary + parsed_data["SENSOR_PLOC_HEATSPREADER"] = tm_data[0] + parsed_data["SENSOR_PLOC_MISSIONBOARD"] = tm_data[1] + parsed_data["SENSOR_4K_CAMERA"] = tm_data[2] + parsed_data["SENSOR_DAC_HEATSPREADER"] = tm_data[3] + parsed_data["SENSOR_STARTRACKER"] = tm_data[4] + parsed_data["SENSOR_RW1"] = tm_data[5] + parsed_data["SENSOR_DRO"] = tm_data[6] + parsed_data["SENSOR_SCEX"] = tm_data[7] + parsed_data["SENSOR_X8"] = tm_data[8] + parsed_data["SENSOR_HPA"] = tm_data[9] + parsed_data["SENSOR_TX_MODUL"] = tm_data[10] + parsed_data["SENSOR_MPA"] = tm_data[11] + parsed_data["SENSOR_ACU"] = tm_data[12] + parsed_data["SENSOR_PLPCDU_HEATSPREADER"] = tm_data[13] + parsed_data["SENSOR_TCS_BOARD"] = tm_data[14] + parsed_data["SENSOR_MAGNETTORQUER"] = tm_data[15] TM_TCP_SERVER.report_parsed_hk_data(object_id, set_id, parsed_data) From 8ca85d4474ab230c55000c800ebef03a26ae643a Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Thu, 19 May 2022 00:46:21 +0200 Subject: [PATCH 016/132] updated tmtccmd --- tmtccmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtccmd b/tmtccmd index 862fdf2..b0b1dfe 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 862fdf23bc4a90ced47ee1c811de4237e3508536 +Subproject commit b0b1dfef055fb1c6eb757cae59336f151fbb632c From 9bd0783c573b3a59dfdb1a2f838924b226e5ff4a Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Thu, 19 May 2022 11:01:11 +0200 Subject: [PATCH 017/132] deleted bakcup files --- config/definitions_BACKUP_10148.py | 55 ------------------------------ config/definitions_BASE_10148.py | 49 -------------------------- config/definitions_LOCAL_10148.py | 51 --------------------------- config/definitions_REMOTE_10148.py | 50 --------------------------- 4 files changed, 205 deletions(-) delete mode 100644 config/definitions_BACKUP_10148.py delete mode 100644 config/definitions_BASE_10148.py delete mode 100644 config/definitions_LOCAL_10148.py delete mode 100644 config/definitions_REMOTE_10148.py diff --git a/config/definitions_BACKUP_10148.py b/config/definitions_BACKUP_10148.py deleted file mode 100644 index 6109c67..0000000 --- a/config/definitions_BACKUP_10148.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -@brief This file transfers control of the custom definitions like modes to the user. -@details Template configuration file. Copy this folder to the TMTC commander root and adapt - it to your needs. -""" - -import enum - - -PUS_APID = 0x65 -SPACE_PACKET_IDS = (0x08 << 8 | PUS_APID,) - - -class CustomServiceList(enum.Enum): - TEST_DEVICE = "test" - P60DOCK = "p60dock" - PDU1 = "pdu1" - PDU2 = "pdu2" - ACU = "acu" - ACS = "acs" - BPX_BATTERY = "bpx" - TMP1075_1 = "tmp1075_1" - TMP1075_2 = "tmp1075_2" - HEATER = "heater" - IMTQ = "imtq" - PLOC_SUPV = "ploc_supv" - PLOC_MPSOC = "ploc_mpsoc" - PCDU = "pcdu" - PL_PCDU = "plpcdu" - SA_DEPLYOMENT = "sa_depl" - REACTION_WHEEL_1 = "rw-1" - REACTION_WHEEL_2 = "rw-2" - REACTION_WHEEL_3 = "rw-3" - REACTION_WHEEL_4 = "rw-4" - RW_ASSEMBLY = "rw-ass" - RAD_SENSOR = "rad_sensor" - GPS_0 = "gps0" - GPS_1 = "gps1" - PLOC_MEMORY_DUMPER = "ploc_memory_dumper" - CORE = "core" - STAR_TRACKER = "star_tracker" - CCSDS_HANDLER = "ccsds_handler" - PDEC_HANDLER = "pdec_handler" - STR_IMG_HELPER = "str_img_helper" - SYRLINKS = "syrlinks" - ACS_ASS = "acs-ass" - SUS_ASS = "sus-ass" - TCS_ASS = "tcs-ass" - TIME = "time" -<<<<<<< HEAD - PROCEDURE = "proc" - TVTTESTPROCEDURE = "tvtestproc" -======= - CONTROLLERS = "controllers" ->>>>>>> origin/develop diff --git a/config/definitions_BASE_10148.py b/config/definitions_BASE_10148.py deleted file mode 100644 index c98e7da..0000000 --- a/config/definitions_BASE_10148.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -@brief This file transfers control of the custom definitions like modes to the user. -@details Template configuration file. Copy this folder to the TMTC commander root and adapt - it to your needs. -""" - -import enum - - -PUS_APID = 0x65 -SPACE_PACKET_IDS = (0x08 << 8 | PUS_APID,) - - -class CustomServiceList(enum.Enum): - TEST_DEVICE = "test" - P60DOCK = "p60dock" - PDU1 = "pdu1" - PDU2 = "pdu2" - ACU = "acu" - ACS = "acs" - BPX_BATTERY = "bpx" - TMP1075_1 = "tmp1075_1" - TMP1075_2 = "tmp1075_2" - HEATER = "heater" - IMTQ = "imtq" - PLOC_SUPV = "ploc_supv" - PLOC_MPSOC = "ploc_mpsoc" - PCDU = "pcdu" - PL_PCDU = "plpcdu" - SA_DEPLYOMENT = "sa_depl" - REACTION_WHEEL_1 = "rw-1" - REACTION_WHEEL_2 = "rw-2" - REACTION_WHEEL_3 = "rw-3" - REACTION_WHEEL_4 = "rw-4" - RW_ASSEMBLY = "rw-ass" - RAD_SENSOR = "rad_sensor" - GPS_0 = "gps0" - GPS_1 = "gps1" - PLOC_MEMORY_DUMPER = "ploc_memory_dumper" - CORE = "core" - STAR_TRACKER = "star_tracker" - CCSDS_HANDLER = "ccsds_handler" - PDEC_HANDLER = "pdec_handler" - STR_IMG_HELPER = "str_img_helper" - SYRLINKS = "syrlinks" - ACS_ASS = "acs-ass" - SUS_ASS = "sus-ass" - TCS_ASS = "tcs-ass" - TIME = "time" diff --git a/config/definitions_LOCAL_10148.py b/config/definitions_LOCAL_10148.py deleted file mode 100644 index 8f8507d..0000000 --- a/config/definitions_LOCAL_10148.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -@brief This file transfers control of the custom definitions like modes to the user. -@details Template configuration file. Copy this folder to the TMTC commander root and adapt - it to your needs. -""" - -import enum - - -PUS_APID = 0x65 -SPACE_PACKET_IDS = (0x08 << 8 | PUS_APID,) - - -class CustomServiceList(enum.Enum): - TEST_DEVICE = "test" - P60DOCK = "p60dock" - PDU1 = "pdu1" - PDU2 = "pdu2" - ACU = "acu" - ACS = "acs" - BPX_BATTERY = "bpx" - TMP1075_1 = "tmp1075_1" - TMP1075_2 = "tmp1075_2" - HEATER = "heater" - IMTQ = "imtq" - PLOC_SUPV = "ploc_supv" - PLOC_MPSOC = "ploc_mpsoc" - PCDU = "pcdu" - PL_PCDU = "plpcdu" - SA_DEPLYOMENT = "sa_depl" - REACTION_WHEEL_1 = "rw-1" - REACTION_WHEEL_2 = "rw-2" - REACTION_WHEEL_3 = "rw-3" - REACTION_WHEEL_4 = "rw-4" - RW_ASSEMBLY = "rw-ass" - RAD_SENSOR = "rad_sensor" - GPS_0 = "gps0" - GPS_1 = "gps1" - PLOC_MEMORY_DUMPER = "ploc_memory_dumper" - CORE = "core" - STAR_TRACKER = "star_tracker" - CCSDS_HANDLER = "ccsds_handler" - PDEC_HANDLER = "pdec_handler" - STR_IMG_HELPER = "str_img_helper" - SYRLINKS = "syrlinks" - ACS_ASS = "acs-ass" - SUS_ASS = "sus-ass" - TCS_ASS = "tcs-ass" - TIME = "time" - PROCEDURE = "proc" - TVTTESTPROCEDURE = "tvtestproc" diff --git a/config/definitions_REMOTE_10148.py b/config/definitions_REMOTE_10148.py deleted file mode 100644 index 7d88116..0000000 --- a/config/definitions_REMOTE_10148.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -@brief This file transfers control of the custom definitions like modes to the user. -@details Template configuration file. Copy this folder to the TMTC commander root and adapt - it to your needs. -""" - -import enum - - -PUS_APID = 0x65 -SPACE_PACKET_IDS = (0x08 << 8 | PUS_APID,) - - -class CustomServiceList(enum.Enum): - TEST_DEVICE = "test" - P60DOCK = "p60dock" - PDU1 = "pdu1" - PDU2 = "pdu2" - ACU = "acu" - ACS = "acs" - BPX_BATTERY = "bpx" - TMP1075_1 = "tmp1075_1" - TMP1075_2 = "tmp1075_2" - HEATER = "heater" - IMTQ = "imtq" - PLOC_SUPV = "ploc_supv" - PLOC_MPSOC = "ploc_mpsoc" - PCDU = "pcdu" - PL_PCDU = "plpcdu" - SA_DEPLYOMENT = "sa_depl" - REACTION_WHEEL_1 = "rw-1" - REACTION_WHEEL_2 = "rw-2" - REACTION_WHEEL_3 = "rw-3" - REACTION_WHEEL_4 = "rw-4" - RW_ASSEMBLY = "rw-ass" - RAD_SENSOR = "rad_sensor" - GPS_0 = "gps0" - GPS_1 = "gps1" - PLOC_MEMORY_DUMPER = "ploc_memory_dumper" - CORE = "core" - STAR_TRACKER = "star_tracker" - CCSDS_HANDLER = "ccsds_handler" - PDEC_HANDLER = "pdec_handler" - STR_IMG_HELPER = "str_img_helper" - SYRLINKS = "syrlinks" - ACS_ASS = "acs-ass" - SUS_ASS = "sus-ass" - TCS_ASS = "tcs-ass" - TIME = "time" - CONTROLLERS = "controllers" From 260a0830919332d246c1be1f6159cfafd1cb7b6d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 19 May 2022 13:20:22 +0200 Subject: [PATCH 018/132] continued hk parsing --- pus_tc/system/acs.py | 1 + pus_tc/system/controllers.py | 4 +- pus_tm/devs/bpx_bat.py | 66 ++++ pus_tm/devs/gps.py | 59 +++ pus_tm/devs/gyros.py | 8 + pus_tm/devs/imtq_mgt.py | 140 +++++++ pus_tm/devs/mgms.py | 8 + pus_tm/devs/pcdu.py | 294 +++++++++++++++ pus_tm/devs/syrlinks.py | 67 ++++ pus_tm/factory_hook.py | 2 - pus_tm/hk_handling.py | 687 ++--------------------------------- pus_tm/system/__init__.py | 0 pus_tm/system/core.py | 21 ++ pus_tm/system/tcs.py | 39 ++ pus_tm/tm_tcp_server.py | 41 +-- tmtccmd | 2 +- tmtcgui.py | 1 + 17 files changed, 765 insertions(+), 675 deletions(-) create mode 100644 pus_tm/devs/bpx_bat.py create mode 100644 pus_tm/devs/gps.py create mode 100644 pus_tm/devs/gyros.py create mode 100644 pus_tm/devs/imtq_mgt.py create mode 100644 pus_tm/devs/mgms.py create mode 100644 pus_tm/devs/pcdu.py create mode 100644 pus_tm/devs/syrlinks.py create mode 100644 pus_tm/system/__init__.py create mode 100644 pus_tm/system/core.py create mode 100644 pus_tm/system/tcs.py diff --git a/pus_tc/system/acs.py b/pus_tc/system/acs.py index 7d3eb48..76b3dcc 100644 --- a/pus_tc/system/acs.py +++ b/pus_tc/system/acs.py @@ -5,6 +5,7 @@ from config.object_ids import ACS_BOARD_ASS_ID, SUS_BOARD_ASS_ID from .common import command_mode + class AcsOpCodes: ACS_ASS_A_SIDE = ["0", "acs-a"] ACS_ASS_B_SIDE = ["1", "acs-b"] diff --git a/pus_tc/system/controllers.py b/pus_tc/system/controllers.py index 30a5b4d..6696426 100644 --- a/pus_tc/system/controllers.py +++ b/pus_tc/system/controllers.py @@ -2,7 +2,6 @@ from ast import Pass from tmtccmd.tc.definitions import TcQueueT - from .common import command_mode import config.object_ids as obj_ids @@ -20,7 +19,7 @@ class Info: def pack_controller_commands(tc_queue: TcQueueT, op_code: str): mode = int(input("Specify mode: (OFF = 0; ON = 1; NORMAL = 2) [2] ") or "2") print(mode) - if mode < 0 or mode > 2: + if mode < 0 or mode > 2: print("Invalid Mode, defaulting to OFF") mode = 0 submode = int(input("Specify submode [0]: ") or "0") @@ -32,6 +31,7 @@ def pack_controller_commands(tc_queue: TcQueueT, op_code: str): info=op_code + " to " + str(mode) + "," + str(submode), ) + def get_object_from_op_code(op_code: str): try: return bytes.fromhex(op_code) diff --git a/pus_tm/devs/bpx_bat.py b/pus_tm/devs/bpx_bat.py new file mode 100644 index 0000000..eb27286 --- /dev/null +++ b/pus_tm/devs/bpx_bat.py @@ -0,0 +1,66 @@ +import struct + +from pus_tc.devs.bpx_batt import BpxSetIds +from pus_tm.defs import PrintWrapper +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + pw = PrintWrapper(printer) + if set_id == BpxSetIds.GET_HK_SET: + fmt_str = "!HHHHhhhhIB" + inc_len = struct.calcsize(fmt_str) + ( + charge_current, + discharge_current, + heater_current, + batt_voltage, + batt_temp_1, + batt_temp_2, + batt_temp_3, + batt_temp_4, + reboot_cntr, + boot_cause, + ) = struct.unpack(fmt_str, hk_data[0:inc_len]) + header_list = [ + "Charge Current", + "Discharge Current", + "Heater Current", + "Battery Voltage", + "Batt Temp 1", + "Batt Temp 2", + "Batt Temp 3", + "Batt Temp 4", + "Reboot Counter", + "Boot Cause", + ] + content_list = [ + charge_current, + discharge_current, + heater_current, + batt_voltage, + batt_temp_1, + batt_temp_2, + batt_temp_3, + batt_temp_4, + reboot_cntr, + boot_cause, + ] + validity_buffer = hk_data[inc_len:] + pw.dlog(str(header_list)) + pw.dlog(str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) + elif set_id == BpxSetIds.GET_CFG_SET: + battheat_mode = hk_data[0] + battheat_low = struct.unpack("!b", hk_data[1:2])[0] + battheat_high = struct.unpack("!b", hk_data[2:3])[0] + header_list = [ + "Battery Heater Mode", + "Battery Heater Low Limit", + "Battery Heater High Limit", + ] + content_list = [battheat_mode, battheat_low, battheat_high] + validity_buffer = hk_data[3:] + pw.dlog(str(header_list)) + pw.dlog(str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) diff --git a/pus_tm/devs/gps.py b/pus_tm/devs/gps.py new file mode 100644 index 0000000..d60828d --- /dev/null +++ b/pus_tm/devs/gps.py @@ -0,0 +1,59 @@ +import os +import struct +from datetime import datetime + +from pus_tm.defs import PrintWrapper +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes): + pw = PrintWrapper(printer) + pw.dlog(f"Received GPS data, HK data length {len(hk_data)}") + var_index = 0 + header_list = [ + "Latitude", + "Longitude", + "Altitude", + "Fix Mode", + "Sats in Use", + "Date", + "Unix Seconds", + ] + latitude = struct.unpack("!d", hk_data[0:8])[0] + longitude = struct.unpack("!d", hk_data[8:16])[0] + altitude = struct.unpack("!d", hk_data[16:24])[0] + fix_mode = hk_data[24] + sat_in_use = hk_data[25] + year = struct.unpack("!H", hk_data[26:28])[0] + month = hk_data[28] + day = hk_data[29] + hours = hk_data[30] + minutes = hk_data[31] + seconds = hk_data[32] + date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}" + unix_seconds = struct.unpack("!I", hk_data[33:37])[0] + content_list = [ + latitude, + longitude, + altitude, + fix_mode, + sat_in_use, + date_string, + unix_seconds, + ] + var_index += 13 + if not os.path.isfile("gps_log.txt"): + with open("gps_log.txt", "w") as gps_file: + gps_file.write( + "Time, Latitude [deg], Longitude [deg], Altitude [m], Fix Mode, Sats in Use, " + "Date, Unix Seconds\n" + ) + with open("gps_log.txt", "a") as gps_file: + gps_file.write( + f"{datetime.now()}, {latitude}, {longitude}, {altitude}, " + f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n" + ) + validity_buffer = hk_data[37:39] + pw.dlog(str(header_list)) + pw.dlog(str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) diff --git a/pus_tm/devs/gyros.py b/pus_tm/devs/gyros.py new file mode 100644 index 0000000..9646368 --- /dev/null +++ b/pus_tm/devs/gyros.py @@ -0,0 +1,8 @@ +from tmtccmd.utility import ObjectId +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_gyros_hk_data( + object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes +): + pass diff --git a/pus_tm/devs/imtq_mgt.py b/pus_tm/devs/imtq_mgt.py new file mode 100644 index 0000000..8ed68c6 --- /dev/null +++ b/pus_tm/devs/imtq_mgt.py @@ -0,0 +1,140 @@ +import struct + +from pus_tm.defs import PrintWrapper +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes): + pw = PrintWrapper(printer) + header_list = [ + "Init Err", + "Init Raw Mag X [nT]", + "Init Raw Mag Y [nT]", + "Init Raw Mag Z [nT]", + "Init Cal Mag X [nT]", + "Init Cal Mag Y [nT]", + "Init Cal Mag Z [nT]", + "Init Coil X Current [mA]", + "Init Coil Y Current [mA]", + "Init Coil Z Current [mA]", + "Init Coil X Temperature [°C]", + "Init Coil Y Temperature [°C]", + "Init Coil Z Temperature [°C]", + "Err", + "Raw Mag X [nT]", + "Raw Mag Y [nT]", + "Raw Mag Z [nT]", + "Cal Mag X [nT]", + "Cal Mag Y [nT]", + "Cal Mag Z [nT]", + "Coil X Current [mA]", + "Coil Y Current [mA]", + "Coil Z Current [mA]", + "Coil X Temperature [°C]", + "Coil Y Temperature [°C]", + "Coil Z Temperature [°C]", + "Fina Err", + "Fina Raw Mag X [nT]", + "Fina Raw Mag Y [nT]", + "Fina Raw Mag Z [nT]", + "Fina Cal Mag X [nT]", + "Fina Cal Mag Y [nT]", + "Fina Cal Mag Z [nT]", + "Fina Coil X Current [mA]", + "Fina Coil Y Current [mA]", + "Fina Coil Z Current [mA]", + "Fina Coil X Temperature [°C]", + "Fina Coil Y Temperature [°C]", + "Fina Coil Z Temperature [°C]", + ] + # INIT step (no coil actuation) + init_err = hk_data[0] + init_raw_mag_x = struct.unpack("!f", hk_data[1:5])[0] + init_raw_mag_y = struct.unpack("!f", hk_data[5:9])[0] + init_raw_mag_z = struct.unpack("!f", hk_data[9:13])[0] + init_cal_mag_x = struct.unpack("!f", hk_data[13:17])[0] + init_cal_mag_y = struct.unpack("!f", hk_data[17:21])[0] + init_cal_mag_z = struct.unpack("!f", hk_data[21:25])[0] + init_coil_x_current = struct.unpack("!f", hk_data[25:29])[0] + init_coil_y_current = struct.unpack("!f", hk_data[29:33])[0] + init_coil_z_current = struct.unpack("!f", hk_data[33:37])[0] + init_coil_x_temperature = struct.unpack("!H", hk_data[37:39])[0] + init_coil_y_temperature = struct.unpack("!H", hk_data[39:41])[0] + init_coil_z_temperature = struct.unpack("!H", hk_data[41:43])[0] + + # Actuation step + err = hk_data[43] + raw_mag_x = struct.unpack("!f", hk_data[44:48])[0] + raw_mag_y = struct.unpack("!f", hk_data[48:52])[0] + raw_mag_z = struct.unpack("!f", hk_data[52:56])[0] + cal_mag_x = struct.unpack("!f", hk_data[56:60])[0] + cal_mag_y = struct.unpack("!f", hk_data[60:64])[0] + cal_mag_z = struct.unpack("!f", hk_data[64:68])[0] + coil_x_current = struct.unpack("!f", hk_data[68:72])[0] + coil_y_current = struct.unpack("!f", hk_data[72:76])[0] + coil_z_current = struct.unpack("!f", hk_data[76:80])[0] + coil_x_temperature = struct.unpack("!H", hk_data[80:82])[0] + coil_y_temperature = struct.unpack("!H", hk_data[82:84])[0] + coil_z_temperature = struct.unpack("!H", hk_data[84:86])[0] + + # FINA step (no coil actuation) + fina_err = hk_data[86] + fina_raw_mag_x = struct.unpack("!f", hk_data[87:91])[0] + fina_raw_mag_y = struct.unpack("!f", hk_data[91:95])[0] + fina_raw_mag_z = struct.unpack("!f", hk_data[95:99])[0] + fina_cal_mag_x = struct.unpack("!f", hk_data[99:103])[0] + fina_cal_mag_y = struct.unpack("!f", hk_data[103:107])[0] + fina_cal_mag_z = struct.unpack("!f", hk_data[107:111])[0] + fina_coil_x_current = struct.unpack("!f", hk_data[111:115])[0] + fina_coil_y_current = struct.unpack("!f", hk_data[115:119])[0] + fina_coil_z_current = struct.unpack("!f", hk_data[119:123])[0] + fina_coil_x_temperature = struct.unpack("!H", hk_data[123:125])[0] + fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0] + fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0] + + validity_buffer = hk_data[129:] + content_list = [ + init_err, + init_raw_mag_x, + init_raw_mag_y, + init_raw_mag_z, + init_cal_mag_x, + init_cal_mag_y, + init_cal_mag_z, + init_coil_x_current, + init_coil_y_current, + init_coil_z_current, + init_coil_x_temperature, + init_coil_y_temperature, + init_coil_z_temperature, + err, + raw_mag_x, + init_raw_mag_y, + raw_mag_z, + cal_mag_x, + cal_mag_y, + cal_mag_z, + coil_x_current, + coil_y_current, + coil_z_current, + coil_x_temperature, + coil_y_temperature, + coil_z_temperature, + fina_err, + fina_raw_mag_x, + fina_raw_mag_y, + fina_raw_mag_z, + fina_cal_mag_x, + fina_cal_mag_y, + fina_cal_mag_z, + fina_coil_x_current, + fina_coil_y_current, + fina_coil_z_current, + fina_coil_x_temperature, + fina_coil_y_temperature, + fina_coil_z_temperature, + ] + num_of_vars = len(header_list) + pw.dlog(str(header_list)) + pw.dlog(str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars) diff --git a/pus_tm/devs/mgms.py b/pus_tm/devs/mgms.py new file mode 100644 index 0000000..671902d --- /dev/null +++ b/pus_tm/devs/mgms.py @@ -0,0 +1,8 @@ +from tmtccmd.utility import ObjectId +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_mgm_hk_data( + object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes +): + pass diff --git a/pus_tm/devs/pcdu.py b/pus_tm/devs/pcdu.py new file mode 100644 index 0000000..d33ddc6 --- /dev/null +++ b/pus_tm/devs/pcdu.py @@ -0,0 +1,294 @@ +import struct + +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter +from pus_tm.defs import PrintWrapper +from gomspace.gomspace_common import SetIds + +P60_INDEX_LIST = [ + "ACU VCC", + "PDU1 VCC", + "X3 IDLE VCC", + "PDU2 VCC", + "ACU VBAT", + "PDU1 VBAT", + "X3 IDLE VBAT", + "PDU2 VBAT", + "STACK VBAT", + "STACK 3V3", + "STACK 5V", + "GS3V3", + "GS5V", +] + +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] + + +class WdtInfo: + def __init__(self, pw: PrintWrapper): + self.wdt_reboots_list = [] + self.time_pings_left_list = [] + self.pw = pw + + def print(self): + wdt_info = "WDT Type | Reboots | Time or Pings left (CSP only)" + self.pw.dlog(wdt_info) + for idx in range(len(self.wdt_reboots_list)): + self.pw.dlog( + 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 +): + pw = PrintWrapper(printer=printer) + current_idx = 0 + priv_idx = pdu_idx - 1 + if set_id == SetIds.PDU_1_AUX or set_id == SetIds.PDU_2_AUX: + 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]) + pw.dlog(f"VCC {vcc} mV | VBAT {vbat} mV") + pw.dlog(f"Converter Enables [{conv_enb_0},{conv_enb_1},{conv_enb_2}]") + pw.dlog( + f"Boot Cause {boot_cause} | Uptime {uptime} | Reset Cause {reset_cause}", + ) + current_idx += inc_len + latchup_list = [] + pw.dlog("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]}" + ) + pw.dlog(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(pw=pw) + current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx) + wdt.print() + if set_id == SetIds.PDU_1_CORE or set_id == SetIds.PDU_2_CORE: + pw.dlog(f"Received PDU HK from PDU {pdu_idx}") + current_list = [] + 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}" + ) + pw.dlog(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} | " + f"Temperature {temperature / 10.0}" + ) + pw.dlog(info) + + +def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + pw = PrintWrapper(printer=printer) + if set_id == SetIds.P60_CORE: + pw.dlog("Received P60 Core HK. Voltages in mV, currents in mA") + current_idx = 0 + current_list = [] + for idx in range(13): + current_list.append( + struct.unpack("!h", hk_data[current_idx : current_idx + 2])[0] + ) + current_idx += 2 + voltage_list = [] + for idx in range(13): + voltage_list.append( + struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] + ) + current_idx += 2 + out_enb_list = [] + for idx in range(13): + out_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(13): + out_enb = f"{out_enb_list[idx]}".ljust(6) + content_line = ( + f"{P60_INDEX_LIST[idx].ljust(24)} | {out_enb} | " + f"{voltage_list[idx]:05} | {current_list[idx]:04}" + ) + pw.dlog(content_line) + fmt_str = "!IBhHhh" + inc_len = struct.calcsize(fmt_str) + ( + boot_count, + batt_mode, + batt_current, + batt_voltage, + temp_0, + temp_1, + ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) + current_idx += inc_len + batt_info = ( + f"Batt: Mode {batt_mode} | Boot Count {boot_count} | " + f"Charge current {batt_current} | Voltage {batt_voltage}" + ) + temps = f"In C: Temp 0 {temp_0 / 10.0} | Temp 1 {temp_1 / 10.0} | " + pw.dlog(temps) + pw.dlog(batt_info) + printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9) + if set_id == SetIds.P60_AUX: + pw.dlog("Received P60 AUX HK. Voltages in mV, currents in mA") + current_idx = 0 + latchup_list = [] + pw.dlog("P60 Dock Latchups") + for idx in range(0, 13): + latchup_list.append( + struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] + ) + content_line = f"{P60_INDEX_LIST[idx].ljust(24)} | {latchup_list[idx]}" + pw.dlog(content_line) + current_idx += 2 + fmt_str = "!IIHBBHHhhB" + inc_len = struct.calcsize(fmt_str) + ( + boot_cause, + uptime, + reset_cause, + heater_on, + conv_5v_on, + dock_vbat, + dock_vcc_c, + batt_temp_0, + batt_temp_1, + dearm_status, + ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) + current_idx += inc_len + wdt = WdtInfo(pw=pw) + current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx) + fmt_str = "!hhbb" + inc_len = struct.calcsize(fmt_str) + ( + batt_charge_current, + batt_discharge_current, + ant6_depl, + ar6_depl, + ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) + current_idx += inc_len + device_types = [] + device_statuses = [] + for idx in range(8): + device_types.append(hk_data[current_idx]) + current_idx += 1 + for idx in range(8): + device_statuses.append(hk_data[current_idx]) + current_idx += 1 + util_info = ( + f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}" + ) + util_info_2 = ( + f"Conv 5V on {conv_5v_on} | Heater On {heater_on} | " + f"Dock VBAT {dock_vbat} | DOCK VCC Current {dock_vcc_c}" + ) + pw.dlog(util_info) + pw.dlog(util_info_2) + wdt.print() + misc_info = ( + f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}" + ) + pw.dlog(misc_info) + batt_info = ( + f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | " + f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}" + ) + pw.dlog(batt_info) + printer.print_validity_buffer( + validity_buffer=hk_data[current_idx:], num_vars=27 + ) diff --git a/pus_tm/devs/syrlinks.py b/pus_tm/devs/syrlinks.py new file mode 100644 index 0000000..3c82f7a --- /dev/null +++ b/pus_tm/devs/syrlinks.py @@ -0,0 +1,67 @@ +import struct + +from pus_tm.defs import PrintWrapper +from pus_tc.devs.syrlinks_hk_handler import SetIds +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_syrlinks_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + 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: + pw = PrintWrapper(printer) + pw.dlog(f"Service 3 TM: Syrlinks handler reply with unknown set ID {set_id}") + + +def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: bytes): + pw = PrintWrapper(printer) + header_list = [ + "RX Status", + "RX Sensitivity", + "RX Frequency Shift", + "RX IQ Power", + "RX AGC Value", + "RX Demod Eb", + "RX Demod N0", + "RX Datarate", + ] + rx_status = hk_data[0] + rx_sensitivity = struct.unpack("!I", hk_data[1:5]) + rx_frequency_shift = struct.unpack("!I", hk_data[5:9]) + rx_iq_power = struct.unpack("!H", hk_data[9:11]) + rx_agc_value = struct.unpack("!H", hk_data[11:13]) + rx_demod_eb = struct.unpack("!I", hk_data[13:17]) + rx_demod_n0 = struct.unpack("!I", hk_data[17:21]) + rx_data_rate = hk_data[21] + content_list = [ + rx_status, + rx_sensitivity, + rx_frequency_shift, + rx_iq_power, + rx_agc_value, + rx_demod_eb, + rx_demod_n0, + rx_data_rate, + ] + validity_buffer = hk_data[22:] + pw.dlog(str(header_list)) + pw.dlog(str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8) + + +def handle_syrlinks_tx_registers_dataset( + printer: FsfwTmTcPrinter, + hk_data: bytes, +): + pw = PrintWrapper(printer) + header_list = ["TX Status", "TX Waveform", "TX AGC value"] + tx_status = hk_data[0] + tx_waveform = hk_data[1] + tx_agc_value = struct.unpack("!H", hk_data[2:4]) + content_list = [tx_status, tx_waveform, tx_agc_value] + validity_buffer = hk_data[4:] + pw.dlog(str(header_list)) + pw.dlog(str(content_list)) + printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3) diff --git a/pus_tm/factory_hook.py b/pus_tm/factory_hook.py index afac7c0..8bd8fe1 100644 --- a/pus_tm/factory_hook.py +++ b/pus_tm/factory_hook.py @@ -33,7 +33,6 @@ def ccsds_tm_handler(apid: int, raw_tm_packet: bytes, _user_args: any) -> None: pus_factory_hook(raw_tm_packet=raw_tm_packet) - def pus_factory_hook(raw_tm_packet: bytes): if len(raw_tm_packet) < 8: LOGGER.warning("Detected packet shorter than 8 bytes!") @@ -81,6 +80,5 @@ def pus_factory_hook(raw_tm_packet: bytes): packet=raw_tm_packet, srv_subservice=(service_type, subservice_type) ) except ValueError: - # TODO: Log faulty packet LOGGER.warning("Invalid packet format detected") log_raw_unknown_packet(packet=raw_tm_packet, packet_type=PacketTypes.TM) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 2197f8d..4d04a5d 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -1,31 +1,32 @@ """HK Handling for EIVE OBSW""" import struct -import os -import datetime - - +from pus_tm.system.tcs import handle_thermal_controller_hk_data from tmtccmd.config.definitions import HkReplyUnpacked from tmtccmd.tm.pus_3_fsfw_hk import ( Service3Base, HkContentType, Service3FsfwTm, ) -from tmtccmd.logging import get_console_logger -from pus_tc.devs.bpx_batt import BpxSetIds -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.utility.obj_id import ObjectId, ObjectIdDictT -import config.object_ids as obj_ids +from tmtccmd.logging import get_console_logger +from pus_tm.devs.bpx_bat import handle_bpx_hk_data +from pus_tm.devs.gps import handle_gps_data +from pus_tm.devs.gyros import handle_gyros_hk_data +from pus_tm.devs.imtq_mgt import handle_self_test_data +from pus_tm.devs.pcdu import handle_pdu_data, handle_p60_hk_data +from pus_tm.devs.syrlinks import handle_syrlinks_hk_data +from pus_tc.devs.imtq import ImtqSetIds from pus_tm.devs.reaction_wheels import handle_rw_hk_data from pus_tm.defs import FsfwTmTcPrinter, log_to_both +from pus_tm.system.core import handle_core_hk_data +from pus_tm.devs.mgms import handle_mgm_hk_data +import config.object_ids as obj_ids from pus_tm.tm_tcp_server import TmTcpServer - LOGGER = get_console_logger() TM_TCP_SERVER = TmTcpServer.getInstance() @@ -42,9 +43,9 @@ def handle_hk_packet( named_obj_id = tm_packet.object_id if tm_packet.subservice == 25 or tm_packet.subservice == 26: hk_data = tm_packet.tm_data[8:] - TM_TCP_SERVER.report_raw_hk_data(object_id=named_obj_id, - set_id=tm_packet.set_id, - hk_data=hk_data) + TM_TCP_SERVER.report_raw_hk_data( + object_id=named_obj_id, set_id=tm_packet.set_id, hk_data=hk_data + ) printer.generic_hk_tm_print( content_type=HkContentType.HK, object_id=named_obj_id, @@ -60,6 +61,7 @@ def handle_hk_packet( if tm_packet.subservice == 10 or tm_packet.subservice == 12: LOGGER.warning("HK definitions printout not implemented yet") + def handle_regular_hk_print( printer: FsfwTmTcPrinter, object_id: ObjectId, @@ -72,12 +74,7 @@ def handle_regular_hk_print( if object_id in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: handle_rw_hk_data(printer, object_id, set_id, hk_data) if objb == 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") + handle_syrlinks_hk_data(printer=printer, hk_data=hk_data, set_id=set_id) if objb == obj_ids.IMTQ_HANDLER_ID: if (set_id >= ImtqSetIds.POSITIVE_X_TEST) and ( set_id <= ImtqSetIds.NEGATIVE_Z_TEST @@ -90,7 +87,7 @@ def handle_regular_hk_print( if objb == obj_ids.BPX_HANDLER_ID: handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer) if objb == obj_ids.CORE_CONTROLLER_ID: - return handle_core_hk_data(printer=printer, hk_data=hk_data) + return handle_core_hk_data(printer=printer, hk_data=hk_data, set_id=set_id) if objb == obj_ids.PDU_1_HANDLER_ID: return handle_pdu_data( printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data @@ -105,636 +102,30 @@ def handle_regular_hk_print( ) if objb == obj_ids.P60_DOCK_HANDLER: handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) + if objb in [ + obj_ids.GYRO_0_HANDLER_ID, + obj_ids.GYRO_1_HANDLER_ID, + obj_ids.GYRO_2_HANDLER_ID, + obj_ids.GYRO_3_HANDLER_ID, + ]: + handle_gyros_hk_data( + object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id + ) + if objb in [ + obj_ids.MGM_0_HANDLER_ID, + obj_ids.MGM_1_HANDLER_ID, + obj_ids.MGM_2_HANDLER_ID, + obj_ids.MGM_3_HANDLER_ID, + ]: + handle_mgm_hk_data( + object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id + ) if objb == obj_ids.PL_PCDU_ID: log_to_both(printer, "Received PL PCDU HK data") if objb == obj_ids.THERMAL_CONTROLLER_ID: - handle_thermal_controller_hk_data( object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data) + handle_thermal_controller_hk_data( + object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data + ) else: LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.") return HkReplyUnpacked() - -def handle_syrlinks_rx_registers_dataset( printer: FsfwTmTcPrinter, hk_data: bytes): - reply = HkReplyUnpacked() - header_list = [ - "RX Status", - "RX Sensitivity", - "RX Frequency Shift", - "RX IQ Power", - "RX AGC Value", - "RX Demod Eb", - "RX Demod N0", - "RX Datarate", - ] - rx_status = hk_data[0] - rx_sensitivity = struct.unpack("!I", hk_data[1:5]) - rx_frequency_shift = struct.unpack("!I", hk_data[5:9]) - rx_iq_power = struct.unpack("!H", hk_data[9:11]) - rx_agc_value = struct.unpack("!H", hk_data[11:13]) - rx_demod_eb = struct.unpack("!I", hk_data[13:17]) - rx_demod_n0 = struct.unpack("!I", hk_data[17:21]) - rx_data_rate = hk_data[21] - content_list = [ - rx_status, - rx_sensitivity, - rx_frequency_shift, - rx_iq_power, - rx_agc_value, - rx_demod_eb, - rx_demod_n0, - rx_data_rate, - ] - validity_buffer = hk_data[22:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8) - -def handle_syrlinks_tx_registers_dataset( - printer: FsfwTmTcPrinter, - hk_data: bytes, -): - reply = HkReplyUnpacked() - header_list = ["TX Status", "TX Waveform", "TX AGC value"] - tx_status = hk_data[0] - tx_waveform = hk_data[1] - tx_agc_value = struct.unpack("!H", hk_data[2:4]) - content_list = [tx_status, tx_waveform, tx_agc_value] - validity_buffer = hk_data[4:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3) - -def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes): - header_list = [ - "Init Err", - "Init Raw Mag X [nT]", - "Init Raw Mag Y [nT]", - "Init Raw Mag Z [nT]", - "Init Cal Mag X [nT]", - "Init Cal Mag Y [nT]", - "Init Cal Mag Z [nT]", - "Init Coil X Current [mA]", - "Init Coil Y Current [mA]", - "Init Coil Z Current [mA]", - "Init Coil X Temperature [°C]", - "Init Coil Y Temperature [°C]", - "Init Coil Z Temperature [°C]", - "Err", - "Raw Mag X [nT]", - "Raw Mag Y [nT]", - "Raw Mag Z [nT]", - "Cal Mag X [nT]", - "Cal Mag Y [nT]", - "Cal Mag Z [nT]", - "Coil X Current [mA]", - "Coil Y Current [mA]", - "Coil Z Current [mA]", - "Coil X Temperature [°C]", - "Coil Y Temperature [°C]", - "Coil Z Temperature [°C]", - "Fina Err", - "Fina Raw Mag X [nT]", - "Fina Raw Mag Y [nT]", - "Fina Raw Mag Z [nT]", - "Fina Cal Mag X [nT]", - "Fina Cal Mag Y [nT]", - "Fina Cal Mag Z [nT]", - "Fina Coil X Current [mA]", - "Fina Coil Y Current [mA]", - "Fina Coil Z Current [mA]", - "Fina Coil X Temperature [°C]", - "Fina Coil Y Temperature [°C]", - "Fina Coil Z Temperature [°C]", - ] - # INIT step (no coil actuation) - init_err = hk_data[0] - init_raw_mag_x = struct.unpack("!f", hk_data[1:5])[0] - init_raw_mag_y = struct.unpack("!f", hk_data[5:9])[0] - init_raw_mag_z = struct.unpack("!f", hk_data[9:13])[0] - init_cal_mag_x = struct.unpack("!f", hk_data[13:17])[0] - init_cal_mag_y = struct.unpack("!f", hk_data[17:21])[0] - init_cal_mag_z = struct.unpack("!f", hk_data[21:25])[0] - init_coil_x_current = struct.unpack("!f", hk_data[25:29])[0] - init_coil_y_current = struct.unpack("!f", hk_data[29:33])[0] - init_coil_z_current = struct.unpack("!f", hk_data[33:37])[0] - init_coil_x_temperature = struct.unpack("!H", hk_data[37:39])[0] - init_coil_y_temperature = struct.unpack("!H", hk_data[39:41])[0] - init_coil_z_temperature = struct.unpack("!H", hk_data[41:43])[0] - - # Actuation step - err = hk_data[43] - raw_mag_x = struct.unpack("!f", hk_data[44:48])[0] - raw_mag_y = struct.unpack("!f", hk_data[48:52])[0] - raw_mag_z = struct.unpack("!f", hk_data[52:56])[0] - cal_mag_x = struct.unpack("!f", hk_data[56:60])[0] - cal_mag_y = struct.unpack("!f", hk_data[60:64])[0] - cal_mag_z = struct.unpack("!f", hk_data[64:68])[0] - coil_x_current = struct.unpack("!f", hk_data[68:72])[0] - coil_y_current = struct.unpack("!f", hk_data[72:76])[0] - coil_z_current = struct.unpack("!f", hk_data[76:80])[0] - coil_x_temperature = struct.unpack("!H", hk_data[80:82])[0] - coil_y_temperature = struct.unpack("!H", hk_data[82:84])[0] - coil_z_temperature = struct.unpack("!H", hk_data[84:86])[0] - - # FINA step (no coil actuation) - fina_err = hk_data[86] - fina_raw_mag_x = struct.unpack("!f", hk_data[87:91])[0] - fina_raw_mag_y = struct.unpack("!f", hk_data[91:95])[0] - fina_raw_mag_z = struct.unpack("!f", hk_data[95:99])[0] - fina_cal_mag_x = struct.unpack("!f", hk_data[99:103])[0] - fina_cal_mag_y = struct.unpack("!f", hk_data[103:107])[0] - fina_cal_mag_z = struct.unpack("!f", hk_data[107:111])[0] - fina_coil_x_current = struct.unpack("!f", hk_data[111:115])[0] - fina_coil_y_current = struct.unpack("!f", hk_data[115:119])[0] - fina_coil_z_current = struct.unpack("!f", hk_data[119:123])[0] - fina_coil_x_temperature = struct.unpack("!H", hk_data[123:125])[0] - fina_coil_y_temperature = struct.unpack("!H", hk_data[125:127])[0] - fina_coil_z_temperature = struct.unpack("!H", hk_data[127:129])[0] - - validity_buffer = hk_data[129:] - content_list = [ - init_err, - init_raw_mag_x, - init_raw_mag_y, - init_raw_mag_z, - init_cal_mag_x, - init_cal_mag_y, - init_cal_mag_z, - init_coil_x_current, - init_coil_y_current, - init_coil_z_current, - init_coil_x_temperature, - init_coil_y_temperature, - init_coil_z_temperature, - err, - raw_mag_x, - raw_mag_y, - raw_mag_z, - cal_mag_x, - cal_mag_y, - cal_mag_z, - coil_x_current, - coil_y_current, - coil_z_current, - coil_x_temperature, - coil_y_temperature, - coil_z_temperature, - fina_err, - fina_raw_mag_x, - fina_raw_mag_y, - fina_raw_mag_z, - fina_cal_mag_x, - fina_cal_mag_y, - fina_cal_mag_z, - fina_coil_x_current, - fina_coil_y_current, - fina_coil_z_current, - fina_coil_x_temperature, - fina_coil_y_temperature, - fina_coil_z_temperature, - ] - num_of_vars = len(header_list) - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars) - -def handle_thermal_controller_hk_data(object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): - if set_id == 0: - LOGGER.info("Received Sensor Temperature data") - - # get all the floats - tm_data = struct.unpack("!ffffffffffffffff", hk_data[:16 * 4]) - parsed_data = {} - - # put them into an list with their names - parsed_data = [] - parsed_data.append({"SENSOR_PLOC_HEATSPREADER": tm_data[0]}) - parsed_data.append({"SENSOR_PLOC_MISSIONBOARD": tm_data[1]}) - parsed_data.append({"SENSOR_4K_CAMERA": tm_data[2]}) - parsed_data.append({"SENSOR_DAC_HEATSPREADER": tm_data[3]}) - parsed_data.append({"SENSOR_STARTRACKER": tm_data[4]}) - parsed_data.append({"SENSOR_RW1": tm_data[5]}) - parsed_data.append({"SENSOR_DRO": tm_data[6]}) - parsed_data.append({"SENSOR_SCEX": tm_data[7]}) - parsed_data.append({"SENSOR_X8": tm_data[8]}) - parsed_data.append({"SENSOR_HPA": tm_data[9]}) - parsed_data.append({"SENSOR_TX_MODUL": tm_data[10]}) - parsed_data.append({"SENSOR_MPA": tm_data[11]}) - parsed_data.append({"SENSOR_ACU": tm_data[12]}) - parsed_data.append({"SENSOR_PLPCDU_HEATSPREADER": tm_data[13]}) - parsed_data.append({"SENSOR_TCS_BOARD": tm_data[14]}) - parsed_data.append({"SENSOR_MAGNETTORQUER": tm_data[15]}) - - TM_TCP_SERVER.report_parsed_hk_data(object_id, set_id, parsed_data) - -def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes): - LOGGER.info(f"Received GPS data, HK data length {len(hk_data)}") - reply = HkReplyUnpacked() - var_index = 0 - header_list = [ - "Latitude", - "Longitude", - "Altitude", - "Fix Mode", - "Sats in Use", - "Date", - "Unix Seconds", - ] - latitude = struct.unpack("!d", hk_data[0:8])[0] - longitude = struct.unpack("!d", hk_data[8:16])[0] - altitude = struct.unpack("!d", hk_data[16:24])[0] - fix_mode = hk_data[24] - sat_in_use = hk_data[25] - year = struct.unpack("!H", hk_data[26:28])[0] - month = hk_data[28] - day = hk_data[29] - hours = hk_data[30] - minutes = hk_data[31] - seconds = hk_data[32] - date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}" - unix_seconds = struct.unpack("!I", hk_data[33:37])[0] - content_list = [ - latitude, - longitude, - altitude, - fix_mode, - sat_in_use, - date_string, - unix_seconds, - ] - var_index += 13 - reply.num_of_vars = var_index - if not os.path.isfile("gps_log.txt"): - with open("gps_log.txt", "w") as gps_file: - gps_file.write( - "Time, Latitude [deg], Longitude [deg], Altitude [m], Fix Mode, Sats in Use, " - "Date, Unix Seconds\n" - ) - with open("gps_log.txt", "a") as gps_file: - gps_file.write( - f"{datetime.datetime.now()}, {latitude}, {longitude}, {altitude}, " - f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n" - ) - validity_buffer = hk_data[37:39] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - -def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): - if set_id == BpxSetIds.GET_HK_SET: - fmt_str = "!HHHHhhhhIB" - inc_len = struct.calcsize(fmt_str) - ( - charge_current, - discharge_current, - heater_current, - batt_voltage, - batt_temp_1, - batt_temp_2, - batt_temp_3, - batt_temp_4, - reboot_cntr, - boot_cause, - ) = struct.unpack(fmt_str, hk_data[0:inc_len]) - header_list = [ - "Charge Current", - "Discharge Current", - "Heater Current", - "Battery Voltage", - "Batt Temp 1", - "Batt Temp 2", - "Batt Temp 3", - "Batt Temp 4", - "Reboot Counter", - "Boot Cause", - ] - content_list = [ - charge_current, - discharge_current, - heater_current, - batt_voltage, - batt_temp_1, - batt_temp_2, - batt_temp_3, - batt_temp_4, - reboot_cntr, - boot_cause, - ] - validity_buffer = hk_data[inc_len:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - elif set_id == BpxSetIds.GET_CFG_SET: - battheat_mode = hk_data[0] - battheat_low = struct.unpack("!b", hk_data[1:2])[0] - battheat_high = struct.unpack("!b", hk_data[2:3])[0] - header_list = [ - "Battery Heater Mode", - "Battery Heater Low Limit", - "Battery Heater High Limit", - ] - content_list = [battheat_mode, battheat_low, battheat_high] - validity_buffer = hk_data[3:] - log_to_both(printer, str(header_list)) - log_to_both(printer, str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) - -def handle_core_hk_data(printer: FsfwTmTcPrinter, hk_data: bytes): - - fmt_str = "!fffH" - inc_len = struct.calcsize(fmt_str) - (temperature, ps_voltage, pl_voltage, tx_agc_value) = struct.unpack( - fmt_str, hk_data[0: 0 + inc_len] - ) - printout = ( - f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | " - f"PL Voltage [mV] {pl_voltage} | TX AGC {tx_agc_value}" - ) - log_to_both(printer, printout) - printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=4) - -P60_INDEX_LIST = [ - "ACU VCC", - "PDU1 VCC", - "X3 IDLE VCC", - "PDU2 VCC", - "ACU VBAT", - "PDU1 VBAT", - "X3 IDLE VBAT", - "PDU2 VBAT", - "STACK VBAT", - "STACK 3V3", - "STACK 5V", - "GS3V3", - "GS5V", -] - -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] - -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"{TmHandler.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: - 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(TmHandler.PDU1_CHANNELS_NAMES)): - latchup_list.append( - struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] - ) - content_line = ( - f"{TmHandler.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(TmHandler.PDU1_CHANNELS_NAMES)): - device_types.append(hk_data[current_idx]) - current_idx += 1 - device_statuses = [] - for idx in range(len(TmHandler.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 = [] - for idx in range(len(TmHandler.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(TmHandler.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(TmHandler.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(TmHandler.PDU1_CHANNELS_NAMES)): - out_enb = f"{output_enb_list[idx]}".ljust(6) - content_line = ( - f"{TmHandler.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} | " - f"Temperature {temperature / 10.0}" - ) - log_to_both(printer, info) - -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") - current_idx = 0 - current_list = [] - for idx in range(13): - current_list.append( - struct.unpack("!h", hk_data[current_idx: current_idx + 2])[0] - ) - current_idx += 2 - voltage_list = [] - for idx in range(13): - voltage_list.append( - struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] - ) - current_idx += 2 - out_enb_list = [] - for idx in range(13): - out_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(13): - out_enb = f"{out_enb_list[idx]}".ljust(6) - content_line = ( - f"{TmHandler.P60_INDEX_LIST[idx].ljust(24)} | {out_enb} | " - f"{voltage_list[idx]:05} | {current_list[idx]:04}" - ) - log_to_both(printer, content_line) - fmt_str = "!IBhHhh" - inc_len = struct.calcsize(fmt_str) - ( - boot_count, - batt_mode, - batt_current, - batt_voltage, - temp_0, - temp_1, - ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) - current_idx += inc_len - batt_info = ( - f"Batt: Mode {batt_mode} | Boot Count {boot_count} | " - f"Charge current {batt_current} | Voltage {batt_voltage}" - ) - temps = f"In C: Temp 0 {temp_0 / 10.0} | Temp 1 {temp_1 / 10.0} | " - log_to_both(printer, temps) - log_to_both(printer, batt_info) - printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9) - if set_id == SetIds.P60_AUX: - log_to_both(printer, "Received P60 AUX HK. Voltages in mV, currents in mA") - current_idx = 0 - latchup_list = [] - log_to_both(printer, "P60 Dock Latchups") - for idx in range(0, 13): - latchup_list.append( - struct.unpack("!H", hk_data[current_idx: current_idx + 2])[0] - ) - content_line = f"{TmHandler.P60_INDEX_LIST[idx].ljust(24)} | {latchup_list[idx]}" - log_to_both(printer, content_line) - current_idx += 2 - fmt_str = "!IIHBBHHhhB" - inc_len = struct.calcsize(fmt_str) - ( - boot_cause, - uptime, - reset_cause, - heater_on, - conv_5v_on, - dock_vbat, - dock_vcc_c, - batt_temp_0, - batt_temp_1, - dearm_status, - ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) - current_idx += inc_len - 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) - ( - batt_charge_current, - batt_discharge_current, - ant6_depl, - ar6_depl, - ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) - current_idx += inc_len - device_types = [] - device_statuses = [] - for idx in range(8): - device_types.append(hk_data[current_idx]) - current_idx += 1 - for idx in range(8): - device_statuses.append(hk_data[current_idx]) - current_idx += 1 - util_info = ( - f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}" - ) - util_info_2 = ( - f"Conv 5V on {conv_5v_on} | Heater On {heater_on} | " - f"Dock VBAT {dock_vbat} | DOCK VCC Current {dock_vcc_c}" - ) - log_to_both(printer, util_info) - log_to_both(printer, util_info_2) - wdt.print(printer) - misc_info = ( - f"Dearm {dearm_status} | ANT6 Depl {ant6_depl} | AR6 Deply {ar6_depl}" - ) - log_to_both(printer, misc_info) - batt_info = ( - f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | " - f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}" - ) - log_to_both(printer, batt_info) - printer.print_validity_buffer( - validity_buffer=hk_data[current_idx:], num_vars=27 - ) diff --git a/pus_tm/system/__init__.py b/pus_tm/system/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pus_tm/system/core.py b/pus_tm/system/core.py new file mode 100644 index 0000000..1c2ae5d --- /dev/null +++ b/pus_tm/system/core.py @@ -0,0 +1,21 @@ +import struct + +from pus_tm.defs import PrintWrapper +from pus_tc.system.core import SetIds +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_core_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + if set_id == SetIds.HK: + pw = PrintWrapper(printer) + fmt_str = "!fff" + inc_len = struct.calcsize(fmt_str) + (temperature, ps_voltage, pl_voltage) = struct.unpack( + fmt_str, hk_data[0 : 0 + inc_len] + ) + printout = ( + f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | " + f"PL Voltage [mV] {pl_voltage}" + ) + pw.dlog(printout) + printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=4) diff --git a/pus_tm/system/tcs.py b/pus_tm/system/tcs.py new file mode 100644 index 0000000..315c17f --- /dev/null +++ b/pus_tm/system/tcs.py @@ -0,0 +1,39 @@ +import struct + +from pus_tm.defs import PrintWrapper +from pus_tm.hk_handling import TM_TCP_SERVER +from tmtccmd.utility import ObjectId +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_thermal_controller_hk_data( + object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes +): + if set_id == 0: + pw = PrintWrapper(printer) + pw.dlog("Received Sensor Temperature data") + + # get all the floats + tm_data = struct.unpack("!ffffffffffffffff", hk_data[: 16 * 4]) + + # put them into an list with their names + parsed_data = [ + {"SENSOR_PLOC_HEATSPREADER": tm_data[0]}, + {"SENSOR_PLOC_MISSIONBOARD": tm_data[1]}, + {"SENSOR_4K_CAMERA": tm_data[2]}, + {"SENSOR_DAC_HEATSPREADER": tm_data[3]}, + {"SENSOR_STARTRACKER": tm_data[4]}, + {"SENSOR_RW1": tm_data[5]}, + {"SENSOR_DRO": tm_data[6]}, + {"SENSOR_SCEX": tm_data[7]}, + {"SENSOR_X8": tm_data[8]}, + {"SENSOR_HPA": tm_data[9]}, + {"SENSOR_TX_MODUL": tm_data[10]}, + {"SENSOR_MPA": tm_data[11]}, + {"SENSOR_ACU": tm_data[12]}, + {"SENSOR_PLPCDU_HEATSPREADER": tm_data[13]}, + {"SENSOR_TCS_BOARD": tm_data[14]}, + {"SENSOR_MAGNETTORQUER": tm_data[15]}, + ] + + TM_TCP_SERVER.report_parsed_hk_data(object_id, set_id, parsed_data) diff --git a/pus_tm/tm_tcp_server.py b/pus_tm/tm_tcp_server.py index 4bf0138..f6d0e88 100644 --- a/pus_tm/tm_tcp_server.py +++ b/pus_tm/tm_tcp_server.py @@ -18,8 +18,7 @@ class TmTcpServer: _Instance = None - def __init__( - self): + def __init__(self): self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -65,7 +64,7 @@ class TmTcpServer: # dle encode the bytes # adding a newline because someone might want to look at it in a console - data_json_bytes = self.dle_encoder.encode(data_json_bytes + b'\n') + data_json_bytes = self.dle_encoder.encode(data_json_bytes + b"\n") try: sent_length = self.client_connection.send(data_json_bytes) @@ -76,27 +75,25 @@ class TmTcpServer: self.client_connection.close() self.client_connection = None - def report_raw_hk_data(self, object_id: ObjectId, - set_id: int, - hk_data: bytes): + def report_raw_hk_data(self, object_id: ObjectId, set_id: int, hk_data: bytes): - data_dict = {} - data_dict["type"] = "TM" - data_dict["tmType"] = "Raw HK" - data_dict["objectId"] = object_id.as_string - data_dict["setId"] = set_id - data_dict["rawData"] = base64.b64encode(hk_data).decode() + data_dict = { + "type": "TM", + "tmType": "Raw HK", + "objectId": object_id.as_string, + "setId": set_id, + "rawData": base64.b64encode(hk_data).decode(), + } self._send_dictionary_over_socket(data_dict) - def report_parsed_hk_data(self, object_id: ObjectId, - set_id: int, - data_dictionary): - data_dict = {} - data_dict["type"] = "TM" - data_dict["tmType"] = "Parsed HK" - data_dict["objectId"] = object_id.as_string - data_dict["setId"] = set_id - data_dict["content"] = data_dictionary + def report_parsed_hk_data(self, object_id: ObjectId, set_id: int, data_dictionary): + data_dict = { + "type": "TM", + "tmType": "Parsed HK", + "objectId": object_id.as_string, + "setId": set_id, + "content": data_dictionary, + } - self._send_dictionary_over_socket(data_dict) \ No newline at end of file + self._send_dictionary_over_socket(data_dict) diff --git a/tmtccmd b/tmtccmd index 862fdf2..4433284 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 862fdf23bc4a90ced47ee1c811de4237e3508536 +Subproject commit 443328422a03395bd51d072d3360de3397e1d88b diff --git a/tmtcgui.py b/tmtcgui.py index 6c8a1fd..22d5eed 100755 --- a/tmtcgui.py +++ b/tmtcgui.py @@ -10,3 +10,4 @@ def main(): if __name__ == "__main__": main() +c From fcb5e9b48cd843376745708e57b09bf51a792b36 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 19 May 2022 13:22:24 +0200 Subject: [PATCH 019/132] remove stray letter --- tmtcgui.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tmtcgui.py b/tmtcgui.py index 22d5eed..6c8a1fd 100755 --- a/tmtcgui.py +++ b/tmtcgui.py @@ -10,4 +10,3 @@ def main(): if __name__ == "__main__": main() -c From 730acf5ebe97142a8760127170e9df9f68ff83d3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 19 May 2022 13:58:43 +0200 Subject: [PATCH 020/132] added gyros hk handling --- config/object_ids.py | 16 +++++----- pus_tc/devs/gyros.py | 10 +++++++ pus_tc/devs/mgms.py | 9 ++++++ pus_tm/devs/gyros.py | 69 ++++++++++++++++++++++++++++++++++++++++++- pus_tm/hk_handling.py | 16 +++++----- 5 files changed, 103 insertions(+), 17 deletions(-) create mode 100644 pus_tc/devs/gyros.py create mode 100644 pus_tc/devs/mgms.py diff --git a/config/object_ids.py b/config/object_ids.py index b7c605c..b2b3aaf 100644 --- a/config/object_ids.py +++ b/config/object_ids.py @@ -36,14 +36,14 @@ TMP_1075_2_HANDLER_ID = bytes([0x44, 0x42, 0x00, 0x05]) SYRLINKS_HANDLER_ID = bytes([0x44, 0x53, 0x00, 0xA3]) # ACS Object IDs -MGM_0_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x06]) -MGM_1_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x07]) -MGM_2_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x08]) -MGM_3_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x09]) -GYRO_0_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x10]) -GYRO_1_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x11]) -GYRO_2_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x12]) -GYRO_3_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x13]) +MGM_0_LIS3_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x06]) +MGM_1_RM3100_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x07]) +MGM_2_LIS3_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x08]) +MGM_3_RM3100_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x09]) +GYRO_0_ADIS_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x10]) +GYRO_1_L3G_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x11]) +GYRO_2_ADIS_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x12]) +GYRO_3_L3G_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x13]) GPS_HANDLER_0_ID = bytes([0x44, 0x13, 0x00, 0x45]) GPS_HANDLER_1_ID = bytes([0x44, 0x13, 0x01, 0x46]) RW1_ID = bytes([0x44, 0x12, 0x00, 0x47]) diff --git a/pus_tc/devs/gyros.py b/pus_tc/devs/gyros.py new file mode 100644 index 0000000..6cdc775 --- /dev/null +++ b/pus_tc/devs/gyros.py @@ -0,0 +1,10 @@ +import enum + + +class AdisGyroSetIds(enum.IntEnum): + CORE_HK = 0 + CFG_HK = 1 + + +class L3gGyroSetIds(enum.IntEnum): + CORE_HK = 0 diff --git a/pus_tc/devs/mgms.py b/pus_tc/devs/mgms.py new file mode 100644 index 0000000..9bd6199 --- /dev/null +++ b/pus_tc/devs/mgms.py @@ -0,0 +1,9 @@ +import enum + + +class MgmLis3SetIds(enum.IntEnum): + CORE_HK = 0 + + +class MgmRm3100SetIds(enum.IntEnum): + CORE_HK = 0 diff --git a/pus_tm/devs/gyros.py b/pus_tm/devs/gyros.py index 9646368..ff56abf 100644 --- a/pus_tm/devs/gyros.py +++ b/pus_tm/devs/gyros.py @@ -1,8 +1,75 @@ +import struct + +from pus_tm.defs import PrintWrapper from tmtccmd.utility import ObjectId from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter +from pus_tc.devs.gyros import L3gGyroSetIds, AdisGyroSetIds +import config.object_ids as obj_ids + def handle_gyros_hk_data( object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes ): - pass + if object_id.as_bytes in [ + obj_ids.GYRO_0_ADIS_HANDLER_ID, + obj_ids.GYRO_2_ADIS_HANDLER_ID, + ]: + handle_adis_gyro_hk( + object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data + ) + elif object_id.as_bytes in [ + obj_ids.GYRO_1_L3G_HANDLER_ID, + obj_ids.GYRO_3_L3G_HANDLER_ID, + ]: + handle_l3g_gyro_hk( + object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data + ) + + +def handle_adis_gyro_hk( + object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes +): + if set_id == AdisGyroSetIds.CORE_HK: + pw = PrintWrapper(printer) + fmt_str = "!ddddddf" + inc_len = struct.calcsize(fmt_str) + (angVelocX, angVelocY, angVelocZ, accelX, accelY, accelZ, temp) = struct.unpack( + fmt_str, hk_data[0 : 0 + inc_len] + ) + pw.dlog(f"Received ADIS1650X Gyro HK data from object {object_id}") + pw.dlog( + f"Angular Velocities (degrees per second): X {angVelocX} | " + f"Y {angVelocY} | Z {angVelocZ}" + ) + pw.dlog(f"Acceleration (m/s^2): X {accelX} | Y {accelY} | Z {accelZ}") + pw.dlog(f"Temperature {temp} C") + if set_id == AdisGyroSetIds.CFG_HK: + pw = PrintWrapper(printer) + fmt_str = "!HBHH" + inc_len = struct.calcsize(fmt_str) + (diag_stat_reg, filter_setting, msc_ctrl_reg, dec_rate_reg) = struct.unpack( + fmt_str, hk_data[0 : 0 + inc_len] + ) + pw.dlog(f"Diagnostic Status Register {diag_stat_reg:#018b}") + pw.dlog(f"Filter Settings {filter_setting:#010b}") + pw.dlog(f"Miscellaneous Control Register {msc_ctrl_reg:#018b}") + pw.dlog(f"Decimation Rate {dec_rate_reg:#06x}") + + +def handle_l3g_gyro_hk( + object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes +): + if set_id == L3gGyroSetIds: + pw = PrintWrapper(printer) + fmt_str = "!ffff" + inc_len = struct.calcsize(fmt_str) + (angVelocX, angVelocY, angVelocZ, temp) = struct.unpack( + fmt_str, hk_data[0 : 0 + inc_len] + ) + pw.dlog(f"Received L3GD20H Gyro HK data from object {object_id}") + pw.dlog( + f"Angular Velocities (degrees per second): X {angVelocX} | " + f"Y {angVelocY} | Z {angVelocZ}" + ) + pw.dlog(f"Temperature {temp} C") diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 4d04a5d..f0959fc 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -103,19 +103,19 @@ def handle_regular_hk_print( if objb == obj_ids.P60_DOCK_HANDLER: handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) if objb in [ - obj_ids.GYRO_0_HANDLER_ID, - obj_ids.GYRO_1_HANDLER_ID, - obj_ids.GYRO_2_HANDLER_ID, - obj_ids.GYRO_3_HANDLER_ID, + 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, ]: handle_gyros_hk_data( object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id ) if objb in [ - obj_ids.MGM_0_HANDLER_ID, - obj_ids.MGM_1_HANDLER_ID, - obj_ids.MGM_2_HANDLER_ID, - obj_ids.MGM_3_HANDLER_ID, + 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, ]: handle_mgm_hk_data( object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id From ef4c0a9189527ac25e07f4abeee12228c70e8b13 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 19 May 2022 14:50:24 +0200 Subject: [PATCH 021/132] added mgm hk handling --- pus_tm/devs/mgms.py | 36 ++++++++++++++++++++++++++++++++++++ pus_tm/hk_handling.py | 2 -- pus_tm/system/tcs.py | 5 ++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/pus_tm/devs/mgms.py b/pus_tm/devs/mgms.py index 671902d..e88fd20 100644 --- a/pus_tm/devs/mgms.py +++ b/pus_tm/devs/mgms.py @@ -1,8 +1,44 @@ +import struct + +from pus_tm.defs import PrintWrapper +from pus_tc.devs.mgms import MgmRm3100SetIds, MgmLis3SetIds from tmtccmd.utility import ObjectId from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter +import config.object_ids as obj_ids def handle_mgm_hk_data( object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes ): + if object_id in [obj_ids.MGM_0_LIS3_HANDLER_ID, obj_ids.MGM_2_LIS3_HANDLER_ID]: + handle_mgm_lis3_hk_data(object_id, printer, set_id, hk_data) pass + + +def handle_mgm_lis3_hk_data( + object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes +): + if set_id == MgmLis3SetIds.CORE_HK: + pw = PrintWrapper(printer) + fmt_str = "!ffff" + inc_len = struct.calcsize(fmt_str) + (field_x, field_y, field_z, temp) = struct.unpack( + fmt_str, hk_data[0 : 0 + inc_len] + ) + pw.dlog(f"Received MGM LIS3 from object {object_id}") + pw.dlog(f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}") + pw.dlog(f"Temperature {temp} C") + + +def handle_mgm_rm3100_hk_data( + object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes +): + if set_id == MgmRm3100SetIds.CORE_HK: + pw = PrintWrapper(printer) + fmt_str = f"!fff" + inc_len = struct.calcsize(fmt_str) + (field_x, field_y, field_z) = struct.unpack( + fmt_str, hk_data[0 : 0 + inc_len] + ) + pw.dlog(f"Received MGM LIS3 from object {object_id}") + pw.dlog(f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}") diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index f0959fc..219e40e 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -29,8 +29,6 @@ from pus_tm.tm_tcp_server import TmTcpServer LOGGER = get_console_logger() -TM_TCP_SERVER = TmTcpServer.getInstance() - def handle_hk_packet( raw_tm: bytes, diff --git a/pus_tm/system/tcs.py b/pus_tm/system/tcs.py index 315c17f..e8d59b8 100644 --- a/pus_tm/system/tcs.py +++ b/pus_tm/system/tcs.py @@ -1,11 +1,14 @@ import struct from pus_tm.defs import PrintWrapper -from pus_tm.hk_handling import TM_TCP_SERVER +from pus_tm.tm_tcp_server import TmTcpServer from tmtccmd.utility import ObjectId from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter +TM_TCP_SERVER = TmTcpServer.getInstance() + + def handle_thermal_controller_hk_data( object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes ): From a6132dd4f8ec70a375162198ad4eb817be5cd25b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 19 May 2022 17:52:01 +0200 Subject: [PATCH 022/132] some bugfixes --- pus_tm/hk_handling.py | 4 +--- tmtccmd | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 219e40e..a7178b0 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -1,7 +1,7 @@ """HK Handling for EIVE OBSW""" import struct -from pus_tm.system.tcs import handle_thermal_controller_hk_data +from pus_tm.system.tcs import handle_thermal_controller_hk_data, TM_TCP_SERVER from tmtccmd.config.definitions import HkReplyUnpacked from tmtccmd.tm.pus_3_fsfw_hk import ( Service3Base, @@ -24,8 +24,6 @@ from pus_tm.system.core import handle_core_hk_data from pus_tm.devs.mgms import handle_mgm_hk_data import config.object_ids as obj_ids -from pus_tm.tm_tcp_server import TmTcpServer - LOGGER = get_console_logger() diff --git a/tmtccmd b/tmtccmd index 4433284..bca6440 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 443328422a03395bd51d072d3360de3397e1d88b +Subproject commit bca6440dba775b4691e693551e29849f2ab6542f From d53e26b589c663b83e60594105c68a681c37a108 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Thu, 19 May 2022 18:14:38 +0200 Subject: [PATCH 023/132] switch to generic hk function --- pus_tc/devs/p60dock.py | 3 -- pus_tc/system/proc.py | 86 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/pus_tc/devs/p60dock.py b/pus_tc/devs/p60dock.py index 03bbd5b..be71cac 100644 --- a/pus_tc/devs/p60dock.py +++ b/pus_tc/devs/p60dock.py @@ -16,9 +16,6 @@ from gomspace.gomspace_common import * from config.object_ids import P60_DOCK_HANDLER -HK_SET_ID = 0x3 - - class P60OpCodes: STACK_3V3_ON = ["stack-3v3-on", "1"] STACK_3V3_OFF = ["stack-3v3-off", "2"] diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 0893469..0d3c136 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -1,42 +1,96 @@ from tmtccmd.config import QueueCommands from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.pus_3_fsfw_hk import * -from config.object_ids import BPX_HANDLER_ID +from config.object_ids import ( + BPX_HANDLER_ID, + P60_DOCK_HANDLER, + PDU_1_HANDLER_ID, + PDU_2_HANDLER_ID, + ACU_HANDLER_ID, +) from pus_tc.devs.bpx_batt import BpxSetIds +from gomspace.gomspace_common import SetIds as GsSetIds class OpCodes: HEATER = ["0", "heater"] BAT_FT = ["bat-ft"] + PCDU_FT = ["pcdu-ft"] class Info: HEATER = "heater procedure" BAT_FT = "battery functional test" + PCDU_FT = "pcdu functional test" def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.BAT_FT: + device = Info.BAT_FT.split()[0] tc_queue.appendleft( - ( - QueueCommands.PRINT, - f"Executing Battery functional test Procedure ({OpCodes.BAT_FT})", - ) + (QueueCommands.PRINT, f"Executing {device} Procedure ({device})") ) - tc_queue.appendleft((QueueCommands.PRINT, f"Enabling periodic HK for Battery")) - cmd_tuple = enable_periodic_hk_command_with_interval( + sid = make_sid(BPX_HANDLER_ID, BpxSetIds.GET_HK_SET) + + listen_to_hk_for_x_seconds( diag=False, - sid=make_sid(BPX_HANDLER_ID, BpxSetIds.GET_HK_SET), + device=device, + sid=sid, interval_seconds=10.0, - ssc=0, + collection_time=120.0, ) - for cmd in cmd_tuple: - tc_queue.appendleft(cmd.pack_command_tuple()) - tc_queue.appendleft((QueueCommands.WAIT, 120.0)) - tc_queue.appendleft((QueueCommands.PRINT, "Disabling periodic HK for Battery")) + + if op_code in OpCodes.PCDU_FT: + device = Info.PCDU_FT.split()[0] tc_queue.appendleft( - disable_periodic_hk_command( - diag=False, sid=make_sid(BPX_HANDLER_ID, BpxSetIds.GET_HK_SET), ssc=0 - ).pack_command_tuple() + (QueueCommands.PRINT, f"Executing {device} Procedure ({device})") ) + sid = make_sid(P60_DOCK_HANDLER, GsSetIds.P60_CORE) + + listen_to_hk_for_x_seconds( + diag=False, + device=device, + sid=sid, + interval_seconds=10.0, + collection_time=120.0, + ) + pass + + +def listen_to_hk_for_x_seconds( + tc_queue: TcQueueT, + diag: bool, + device: str, + sid: bytes, + interval_seconds: float, + collection_time: float, +): + """ + enable_periodic_hk_command_with_interval( + diag: bool, sid: bytes, interval_seconds: float, ssc: int + """ + """ + function with periodic HK generation + interval_seconds = at which rate HK is saved + collection_time = how long the HK is saved for + device = for which device the HK is saved + functional_test = + diagnostic Hk = yes diagnostic or no diagnostic + sid = structural ID for specific device + device Hk set ID + """ + + tc_queue.appendleft((QueueCommands.PRINT, f"Enabling periodic HK for {device}")) + cmd_tuple = enable_periodic_hk_command_with_interval( + diag=diag, sid=sid, interval_seconds=interval_seconds, ssc=0 + ) + for cmd in cmd_tuple: + tc_queue.appendleft(cmd.pack_command_tuple()) + + tc_queue.appendleft((QueueCommands.WAIT, collection_time)) + + tc_queue.appendleft((QueueCommands.PRINT, f"Disabling periodic HK for {device}")) + tc_queue.appendleft( + disable_periodic_hk_command(diag=diag, sid=sid, ssc=0).pack_command_tuple() + ) From e15d3a0b7ad423a0cba2551957c9d44f7ead2f13 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 19 May 2022 18:47:23 +0200 Subject: [PATCH 024/132] continued procedures --- pus_tc/cmd_definitions.py | 16 ++++++-- pus_tc/system/proc.py | 78 +++++++++++++++++++++++++-------------- pus_tm/devs/mgms.py | 14 ++++--- tmtccmd | 2 +- 4 files changed, 73 insertions(+), 37 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 2414fee..f554b2a 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -948,10 +948,12 @@ def add_ploc_supv_cmds(cmd_dict: ServiceOpCodeDictT): def add_proc_cmds(cmd_dict: ServiceOpCodeDictT): - from pus_tc.system.proc import OpCodes, Info + from pus_tc.system.proc import OpCodes, KAI op_code_dict = dict() - add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.HEATER, info=Info.HEATER) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.HEATER, info=KAI.HEATER[1] + ) add_service_op_code_entry( srv_op_code_dict=cmd_dict, name=CustomServiceList.PROCEDURE.value, @@ -959,7 +961,15 @@ def add_proc_cmds(cmd_dict: ServiceOpCodeDictT): op_code_entry=op_code_dict, ) op_code_dict = dict() - add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.BAT_FT, info=Info.BAT_FT) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.BAT_FT, info=KAI.BAT_FT[1] + ) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.PCDU_FT, info=KAI.PCDU_FT[1] + ) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.CORE_FT, info=KAI.CORE_FT[1] + ) add_service_op_code_entry( srv_op_code_dict=cmd_dict, name=CustomServiceList.PROCEDURE.value, diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 0d3c136..edd2c29 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -7,55 +7,79 @@ from config.object_ids import ( PDU_1_HANDLER_ID, PDU_2_HANDLER_ID, ACU_HANDLER_ID, + CORE_CONTROLLER_ID, ) +import config.object_ids as oids from pus_tc.devs.bpx_batt import BpxSetIds +from pus_tc.system.core import SetIds as CoreSetIds from gomspace.gomspace_common import SetIds as GsSetIds class OpCodes: HEATER = ["0", "heater"] BAT_FT = ["bat-ft"] + CORE_FT = ["core-ft"] PCDU_FT = ["pcdu-ft"] -class Info: - HEATER = "heater procedure" - BAT_FT = "battery functional test" - PCDU_FT = "pcdu functional test" +class KeyAndInfo: + HEATER = ["Heater", "heater procedure"] + BAT_FT = ["BPX Battery", "battery functional test"] + PCDU_FT = ["PCDU", "PCDU functional test"] + CORE_FT = ["OBC", "OBC functional test"] + + +KAI = KeyAndInfo + +PROC_INFO_DICT = { + KAI.BAT_FT[0]: [OpCodes.BAT_FT, KAI.BAT_FT[1], 120.0, 10.0], + KAI.PCDU_FT[0]: [OpCodes.PCDU_FT, KeyAndInfo.PCDU_FT[1], 120.0, 10.0], + KAI.CORE_FT[0]: [OpCodes.CORE_FT, KeyAndInfo.CORE_FT[1], 120.0, 10.0], +} + + +def generic_print(tc_queue: TcQueueT, key: str): + info = PROC_INFO_DICT[key] + tc_queue.appendleft( + (QueueCommands.PRINT, f"Executing {info[0]} Procedure (OpCodes: {info[1]})") + ) + + +def pack_generic_hk_listening_cmds( + tc_queue: TcQueueT, proc_key: str, sid: bytes, diag: bool +): + generic_print(tc_queue=tc_queue, key=proc_key) + listen_to_hk_for_x_seconds( + diag=diag, + tc_queue=tc_queue, + device=proc_key, + sid=sid, + interval_seconds=10.0, + collection_time=120.0, + ) def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.BAT_FT: - device = Info.BAT_FT.split()[0] - tc_queue.appendleft( - (QueueCommands.PRINT, f"Executing {device} Procedure ({device})") - ) + key = KAI.BAT_FT[0] sid = make_sid(BPX_HANDLER_ID, BpxSetIds.GET_HK_SET) - - listen_to_hk_for_x_seconds( - diag=False, - device=device, - sid=sid, - interval_seconds=10.0, - collection_time=120.0, + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) if op_code in OpCodes.PCDU_FT: - device = Info.PCDU_FT.split()[0] - tc_queue.appendleft( - (QueueCommands.PRINT, f"Executing {device} Procedure ({device})") - ) + key = KAI.PCDU_FT[0] sid = make_sid(P60_DOCK_HANDLER, GsSetIds.P60_CORE) - - listen_to_hk_for_x_seconds( - diag=False, - device=device, - sid=sid, - interval_seconds=10.0, - collection_time=120.0, + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - pass + if op_code in OpCodes.CORE_FT: + key = KAI.CORE_FT[0] + sid = make_sid(oids.CORE_CONTROLLER_ID, CoreSetIds.HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) def listen_to_hk_for_x_seconds( diff --git a/pus_tm/devs/mgms.py b/pus_tm/devs/mgms.py index e88fd20..0a9db2c 100644 --- a/pus_tm/devs/mgms.py +++ b/pus_tm/devs/mgms.py @@ -26,19 +26,21 @@ def handle_mgm_lis3_hk_data( fmt_str, hk_data[0 : 0 + inc_len] ) pw.dlog(f"Received MGM LIS3 from object {object_id}") - pw.dlog(f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}") + pw.dlog( + f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}" + ) pw.dlog(f"Temperature {temp} C") def handle_mgm_rm3100_hk_data( - object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes + object_id: ObjectId, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes ): if set_id == MgmRm3100SetIds.CORE_HK: pw = PrintWrapper(printer) fmt_str = f"!fff" inc_len = struct.calcsize(fmt_str) - (field_x, field_y, field_z) = struct.unpack( - fmt_str, hk_data[0 : 0 + inc_len] - ) + (field_x, field_y, field_z) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len]) pw.dlog(f"Received MGM LIS3 from object {object_id}") - pw.dlog(f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}") + pw.dlog( + f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}" + ) diff --git a/tmtccmd b/tmtccmd index bca6440..cf0afec 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit bca6440dba775b4691e693551e29849f2ab6542f +Subproject commit cf0afec762de4077f89b8da1f43b98e993fca6d0 From 022551139c0d237369265ab234a4afc528ce9a7b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 19 May 2022 19:24:57 +0200 Subject: [PATCH 025/132] some improvements --- .run/tmtcloop.run.xml | 24 ++++++++++++++++++++++++ pus_tc/cmd_definitions.py | 2 +- pus_tm/system/core.py | 2 +- tmtccmd | 2 +- tmtcloop.py | 9 ++++----- 5 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 .run/tmtcloop.run.xml diff --git a/.run/tmtcloop.run.xml b/.run/tmtcloop.run.xml new file mode 100644 index 0000000..ee5f5f7 --- /dev/null +++ b/.run/tmtcloop.run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index f554b2a..4d5920a 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -968,7 +968,7 @@ def add_proc_cmds(cmd_dict: ServiceOpCodeDictT): op_code_dict=op_code_dict, keys=OpCodes.PCDU_FT, info=KAI.PCDU_FT[1] ) add_op_code_entry( - op_code_dict=op_code_dict, keys=OpCodes.CORE_FT, info=KAI.CORE_FT[1] + op_code_dict=op_code_dict, keys=OpCodes.CORE_FT, info=KAI.CORE_FT[1], options={} ) add_service_op_code_entry( srv_op_code_dict=cmd_dict, diff --git a/pus_tm/system/core.py b/pus_tm/system/core.py index 1c2ae5d..883d044 100644 --- a/pus_tm/system/core.py +++ b/pus_tm/system/core.py @@ -18,4 +18,4 @@ def handle_core_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): f"PL Voltage [mV] {pl_voltage}" ) pw.dlog(printout) - printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=4) + printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=3) diff --git a/tmtccmd b/tmtccmd index cf0afec..163ed8c 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit cf0afec762de4077f89b8da1f43b98e993fca6d0 +Subproject commit 163ed8c5d5295a511bfee72f4a62864aa67e59be diff --git a/tmtcloop.py b/tmtcloop.py index 52d1848..0a7fdc8 100755 --- a/tmtcloop.py +++ b/tmtcloop.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 """EIVE TMTC Commander""" -from distutils.log import debug import sys import traceback @@ -63,11 +62,11 @@ def main(): tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE) - get_console_logger().info("Disabling console logger for continuous operation") - get_console_logger().setLevel("ERROR") + # get_console_logger().info("Disabling console logger for continuous operation") + # get_console_logger().setLevel("ERROR") tmtccmd.init_and_start_daemons(tmtc_backend=tmtc_backend) - tmtccmd.performOperation(tmtc_backend=tmtc_backend) + tmtc_backend.perform_operation() # remove cmdline args so that we can reuse code sys.argv = sys.argv[:1] @@ -81,7 +80,7 @@ def main(): tmtc_backend.set_opcode(args.op_code) tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE) - tmtccmd.performOperation(tmtc_backend=tmtc_backend) + tmtc_backend.perform_operation() if __name__ == "__main__": From 9e8dc4f1e2b593a00b072ac05bac8b6b9f05cd87 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 20 May 2022 15:30:11 +0200 Subject: [PATCH 026/132] bump tmtccmd dependency --- tmtccmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtccmd b/tmtccmd index 163ed8c..4fbbf12 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 163ed8c5d5295a511bfee72f4a62864aa67e59be +Subproject commit 4fbbf129e140e593b1cc54a0361fa20cc8726789 From b8e61b38b0f1b712361108407286efb14d0e0096 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Fri, 20 May 2022 16:40:58 +0200 Subject: [PATCH 027/132] extended tv test procedures --- pus_tc/system/proc.py | 111 ++++++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 31 deletions(-) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index edd2c29..2f82c3d 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -1,6 +1,7 @@ from tmtccmd.config import QueueCommands from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.pus_3_fsfw_hk import * +""" from config.object_ids import ( BPX_HANDLER_ID, P60_DOCK_HANDLER, @@ -9,10 +10,14 @@ from config.object_ids import ( ACU_HANDLER_ID, CORE_CONTROLLER_ID, ) +""" import config.object_ids as oids from pus_tc.devs.bpx_batt import BpxSetIds from pus_tc.system.core import SetIds as CoreSetIds from gomspace.gomspace_common import SetIds as GsSetIds +from pus_tc.devs.rad_sensor import CommandIds as RadSetIds +from pus_tc.system.tcs import pack_tcs_sys_commands +from pus_tc.system.controllers import pack_controller_commands class OpCodes: @@ -20,56 +25,57 @@ class OpCodes: BAT_FT = ["bat-ft"] CORE_FT = ["core-ft"] PCDU_FT = ["pcdu-ft"] + RAD_SEN_FT = ["rad-sen-ft"] + TCS_FT = ["tcs-ft-on"] class KeyAndInfo: HEATER = ["Heater", "heater procedure"] BAT_FT = ["BPX Battery", "battery functional test"] - PCDU_FT = ["PCDU", "PCDU functional test"] CORE_FT = ["OBC", "OBC functional test"] + PCDU_FT = ["PCDU", "PCDU functional test"] + RAD_SEN_FT = ["Radiation Sensor", "Radiation Sensor functional test"] + TCS_FT = ["TCS Act.", "TCS functional test activation"] KAI = KeyAndInfo PROC_INFO_DICT = { KAI.BAT_FT[0]: [OpCodes.BAT_FT, KAI.BAT_FT[1], 120.0, 10.0], - KAI.PCDU_FT[0]: [OpCodes.PCDU_FT, KeyAndInfo.PCDU_FT[1], 120.0, 10.0], - KAI.CORE_FT[0]: [OpCodes.CORE_FT, KeyAndInfo.CORE_FT[1], 120.0, 10.0], + KAI.CORE_FT[0]: [OpCodes.CORE_FT, KAI.CORE_FT[1], 120.0, 10.0], + KAI.PCDU_FT[0]: [OpCodes.PCDU_FT, KAI.PCDU_FT[1], 120.0, 10.0], + KAI.RAD_SEN_FT[0]: [OpCodes.RAD_SEN_FT, KAI.RAD_SEN_FT[1], 120.0, 10.0], + KAI.TCS_FT[0]: [OpCodes.TCS_FT, KAI.TCS_FT[1], 1800.0, 10.0], + + } -def generic_print(tc_queue: TcQueueT, key: str): - info = PROC_INFO_DICT[key] +def generic_print(tc_queue: TcQueueT, info: dict): tc_queue.appendleft( - (QueueCommands.PRINT, f"Executing {info[0]} Procedure (OpCodes: {info[1]})") + (QueueCommands.PRINT, f"Executing {info[1]} Procedure (OpCodes: {info[0]})") ) def pack_generic_hk_listening_cmds( tc_queue: TcQueueT, proc_key: str, sid: bytes, diag: bool ): - generic_print(tc_queue=tc_queue, key=proc_key) + info = PROC_INFO_DICT[proc_key] + generic_print(tc_queue=tc_queue, info=info) listen_to_hk_for_x_seconds( diag=diag, tc_queue=tc_queue, device=proc_key, sid=sid, - interval_seconds=10.0, - collection_time=120.0, + interval_seconds=info[3], + collection_time=info[2], ) def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.BAT_FT: key = KAI.BAT_FT[0] - sid = make_sid(BPX_HANDLER_ID, BpxSetIds.GET_HK_SET) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - - if op_code in OpCodes.PCDU_FT: - key = KAI.PCDU_FT[0] - sid = make_sid(P60_DOCK_HANDLER, GsSetIds.P60_CORE) + sid = make_sid(oids.BPX_HANDLER_ID, BpxSetIds.GET_HK_SET) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) @@ -81,6 +87,63 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) +# PCDU + + if op_code in OpCodes.PCDU_FT: + key = KAI.PCDU_FT[0] + + sid = make_sid(oids.P60_DOCK_HANDLER, GsSetIds.P60_CORE) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.PDU_1_HANDLER_ID, GsSetIds.PDU_1_CORE) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_CORE) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + +# AUX und 2er + sid = make_sid(oids.P60_DOCK_HANDLER, GsSetIds.P60_AUX) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.PDU_1_HANDLER_ID, GsSetIds.PDU_1_AUX) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_AUX) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + + if op_code in OpCodes.RAD_SEN_FT: + key = KAI.CORE_FT[0] + sid = make_sid(oids.RAD_SENSOR_ID, RadSetIds.READ_CONVERSIONS) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + + if op_code in OpCodes.TCS_FT: + pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-normal") + pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") + + key = KAI.CORE_FT[0] +# Ids for TCS Board missing. No HK generation? + sid = make_sid(oids.TCS_BOARD_ASS_ID, RadSetIds.READ_CONVERSIONS) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + + pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-off") + pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") + def listen_to_hk_for_x_seconds( tc_queue: TcQueueT, @@ -90,20 +153,6 @@ def listen_to_hk_for_x_seconds( interval_seconds: float, collection_time: float, ): - """ - enable_periodic_hk_command_with_interval( - diag: bool, sid: bytes, interval_seconds: float, ssc: int - """ - """ - function with periodic HK generation - interval_seconds = at which rate HK is saved - collection_time = how long the HK is saved for - device = for which device the HK is saved - functional_test = - diagnostic Hk = yes diagnostic or no diagnostic - sid = structural ID for specific device - device Hk set ID - """ tc_queue.appendleft((QueueCommands.PRINT, f"Enabling periodic HK for {device}")) cmd_tuple = enable_periodic_hk_command_with_interval( From 2cb801dc97c7def694883b214f365592c6b7c8ab Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Sun, 22 May 2022 21:28:34 +0200 Subject: [PATCH 028/132] added prompt that either uses cli or, if available qt --- pus_tc/prompt_parameters.py | 112 ++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 pus_tc/prompt_parameters.py diff --git a/pus_tc/prompt_parameters.py b/pus_tc/prompt_parameters.py new file mode 100644 index 0000000..7959c34 --- /dev/null +++ b/pus_tc/prompt_parameters.py @@ -0,0 +1,112 @@ +from PyQt5.QtWidgets import ( + QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QGroupBox, QGridLayout, QLineEdit +) + +from PyQt5 import QtCore + + +from tmtccmd.core.globals_manager import get_global +from tmtccmd.config.definitions import CoreGlobalIds + + +class Parameter: + def __init__(self, name: str, defaultValue: str, widget: QLineEdit): + self.name = name + self.defaultValue = defaultValue + self.widget = widget + self.value = self.defaultValue + self.widget.setPlaceholderText(self.defaultValue) + + def reset(self): + self.value = self.defaultValue + self.widget.setPlaceholderText(self.defaultValue) + self.widget.setText("") + +class ParameterDialog(QDialog): + def __init__(self): + super().__init__() + + self.setWindowTitle("Enter Parameters") + + Buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Reset + + self.buttonBox = QDialogButtonBox(Buttons) + self.buttonBox.accepted.connect(self.accept) + self.buttonBox.rejected.connect(self.reject) + self.buttonBox.button(QDialogButtonBox.Reset).clicked.connect(self._reset) + + self.data = 1 + + self.rootLayout = QVBoxLayout() + self.group = QGroupBox("Parameters") + self.rootLayout.addWidget(self.group) + self.rootLayout.addWidget(self.buttonBox) + self.setLayout(self.rootLayout) + + self.groupLayout = QGridLayout() + self.group.setLayout(self.groupLayout) + + self.parameters = {} + + def addParameter(self, name: str, defaultValue: str): + row = self.groupLayout.rowCount() + 1 + description = QLabel(name) + self.groupLayout.addWidget(description, row, 0) + valueWidget = QLineEdit() + self.groupLayout.addWidget(valueWidget, row, 1) + + parameter = Parameter(name, defaultValue, valueWidget) + + self.parameters[name] = parameter + + + def _reset(self): + for value in self.parameters.values(): + value.reset() + + def getParameters(self): + output = {} + for key, parameter in self.parameters.items(): + if parameter.widget != None: + if parameter.widget.text() != "": + parameter.value = parameter.widget.text() + output[key] = parameter.value + return output + + @QtCore.pyqtSlot() + def reject(self): + print("reject") + self._reset() + super().reject() + + + + + +"""Prompt the user to specify additional Parameters + + :param parameterList: array of dictionaries with name and defaultValue attributes + :return: dict with all names as key and user supplied input as value string + """ +def prompt_parameters(parameterList): + gui = get_global(CoreGlobalIds.GUI) + if gui: + return _gui_prompt(parameterList) + else: + return _cli_prompt(parameterList) + +def _gui_prompt(parameterList): + dialog = ParameterDialog() + for parameter in parameterList: + dialog.addParameter(parameter["name"], parameter["defaultValue"]) + dialog.exec_() + return dialog.getParameters() + +def _cli_prompt(parameterList): + result = {} + for parameter in parameterList: + userInput = input("Specify {} [{}]: ".format(parameter["name"], parameter["defaultValue"])) + if userInput == "": + userInput = parameter["defaultValue"] + result[parameter["name"]] = userInput + return result \ No newline at end of file From 77f77489c219ef7a1710daf6d3130f0842c2e1ea Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Sun, 22 May 2022 21:29:09 +0200 Subject: [PATCH 029/132] using new prompt in controllers --- pus_tc/system/controllers.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pus_tc/system/controllers.py b/pus_tc/system/controllers.py index 30a5b4d..16f3252 100644 --- a/pus_tc/system/controllers.py +++ b/pus_tc/system/controllers.py @@ -1,11 +1,11 @@ -from ast import Pass from tmtccmd.tc.definitions import TcQueueT - from .common import command_mode import config.object_ids as obj_ids +from pus_tc.prompt_parameters import prompt_parameters + class OpCodes: THERMAL_CONTROLLER = [obj_ids.THERMAL_CONTROLLER_ID.hex(), "thermal_controller"] @@ -18,12 +18,11 @@ class Info: def pack_controller_commands(tc_queue: TcQueueT, op_code: str): - mode = int(input("Specify mode: (OFF = 0; ON = 1; NORMAL = 2) [2] ") or "2") - print(mode) - if mode < 0 or mode > 2: - print("Invalid Mode, defaulting to OFF") - mode = 0 - submode = int(input("Specify submode [0]: ") or "0") + + parameters = prompt_parameters([{"name": "Mode", "defaultValue": "2"}, { + "name": "Submode", "defaultValue": "0"}]) + mode = int(parameters["Mode"]) + submode = int(parameters["Submode"]) command_mode( object_id=get_object_from_op_code(op_code), mode=mode, @@ -32,6 +31,7 @@ def pack_controller_commands(tc_queue: TcQueueT, op_code: str): info=op_code + " to " + str(mode) + "," + str(submode), ) + def get_object_from_op_code(op_code: str): try: return bytes.fromhex(op_code) From 4237ed0d293841557cbef5e4baaa4f125cb9104c Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Sun, 22 May 2022 21:35:51 +0200 Subject: [PATCH 030/132] working on gui --- tmtccmd | 2 +- tmtcgui.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tmtccmd b/tmtccmd index b0b1dfe..de8656e 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit b0b1dfef055fb1c6eb757cae59336f151fbb632c +Subproject commit de8656e3a657782e457630ea10de0fce08856f35 diff --git a/tmtcgui.py b/tmtcgui.py index 6c8a1fd..6366d6f 100755 --- a/tmtcgui.py +++ b/tmtcgui.py @@ -1,11 +1,18 @@ #!/usr/bin/env python3 """TMTC commander for EIVE""" from tmtcc import tmtcc_post_args, tmtcc_pre_args - +from tmtccmd.config.args import ( + create_default_args_parser, + add_gui_tmtccmd_args, + parse_gui_input_arguments, + ) def main(): hook_obj = tmtcc_pre_args() - tmtcc_post_args(hook_obj=hook_obj, use_gui=True, args=None) + arg_parser = create_default_args_parser() + add_gui_tmtccmd_args(arg_parser) + args = parse_gui_input_arguments(arg_parser) + tmtcc_post_args(hook_obj=hook_obj, use_gui=True, args=args) if __name__ == "__main__": From 85a3c936a4b38f490a18ec7446f08e505b08cc2d Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Mon, 23 May 2022 00:20:06 +0200 Subject: [PATCH 031/132] tmtcgui -m7 is kinda working like I would expect it to --- pus_tc/prompt_parameters.py | 7 +++++-- pus_tc/system/controllers.py | 12 +++++++++++- tmtccmd | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/pus_tc/prompt_parameters.py b/pus_tc/prompt_parameters.py index 7959c34..aa7dacb 100644 --- a/pus_tc/prompt_parameters.py +++ b/pus_tc/prompt_parameters.py @@ -6,7 +6,7 @@ from PyQt5 import QtCore from tmtccmd.core.globals_manager import get_global -from tmtccmd.config.definitions import CoreGlobalIds +from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList class Parameter: @@ -90,7 +90,10 @@ class ParameterDialog(QDialog): """ def prompt_parameters(parameterList): gui = get_global(CoreGlobalIds.GUI) - if gui: + mode = get_global(CoreGlobalIds.MODE) + + # gui only works in cont mode right now + if gui and mode == CoreModeList.CONTINUOUS_MODE: return _gui_prompt(parameterList) else: return _cli_prompt(parameterList) diff --git a/pus_tc/system/controllers.py b/pus_tc/system/controllers.py index 50db0de..1f44f32 100644 --- a/pus_tc/system/controllers.py +++ b/pus_tc/system/controllers.py @@ -1,5 +1,5 @@ from tmtccmd.tc.definitions import TcQueueT - +from tmtccmd.config import QueueCommands from .common import command_mode import config.object_ids as obj_ids @@ -33,6 +33,16 @@ def pack_controller_commands(tc_queue: TcQueueT, op_code: str): info=op_code + " to " + str(mode) + "," + str(submode), ) + tc_queue.appendleft((QueueCommands.WAIT, 20)) + + command_mode( + object_id=get_object_from_op_code(op_code), + mode=0, + submode=0, + tc_queue=tc_queue, + info=op_code + " to 0,0", + ) + def get_object_from_op_code(op_code: str): try: diff --git a/tmtccmd b/tmtccmd index 208f577..b031eef 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 208f5779327db817841f073d0bbdd96da491b5d9 +Subproject commit b031eefe4aea7829e5aa2051e7493472529e6d2d From ea1e440407ed69a079153387e3ed7b0ba0a9abd2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 11:24:55 +0200 Subject: [PATCH 032/132] start acu hk handling --- gomspace/gomspace_common.py | 24 +-- pus_tc/cmd_definitions.py | 283 ---------------------------------- pus_tc/devs/acu.py | 210 +++++++++++++++---------- pus_tc/devs/p60dock.py | 37 ++--- pus_tc/devs/pcdu.py | 295 ++++++++++++++++++++++++++++++++++++ pus_tc/devs/pdu1.py | 52 +++---- pus_tc/devs/pdu2.py | 54 +++---- pus_tc/tc_packer_hook.py | 14 +- pus_tm/devs/pcdu.py | 10 ++ 9 files changed, 529 insertions(+), 450 deletions(-) create mode 100644 pus_tc/devs/pcdu.py diff --git a/gomspace/gomspace_common.py b/gomspace/gomspace_common.py index aff5d20..5fe1cb9 100644 --- a/gomspace/gomspace_common.py +++ b/gomspace/gomspace_common.py @@ -10,6 +10,7 @@ import enum from tmtccmd.tc.pus_8_funccmd import generate_action_command from tmtccmd.tc.definitions import PusTelecommand +from tmtccmd.utility import ObjectId class GomspaceDeviceActionIds(enum.IntEnum): @@ -43,7 +44,8 @@ class SetIds: PDU_2_AUX = 4 P60_CORE = 5 P60_AUX = 6 - ACU = 7 + ACU_CORE = 7 + ACU_AUX = 8 class TableIds: @@ -67,7 +69,7 @@ class Channel: def pack_get_param_command( - object_id: bytearray, table_id: int, memory_address: bytearray, parameter_size: int + object_id: bytes, table_id: int, memory_address: bytearray, parameter_size: int ) -> PusTelecommand: """Function to generate a command to retrieve parameters like the temperature from a gomspace device. @param object_id: The object id of the gomspace device handler. @@ -88,7 +90,7 @@ def pack_get_param_command( def pack_set_param_command( - object_id: bytearray, + object_id: bytes, memory_address: bytearray, parameter_size: int, parameter: int, @@ -128,7 +130,7 @@ def pack_set_param_command( ) -def pack_ping_command(object_id: bytearray, data: bytearray) -> PusTelecommand: +def pack_ping_command(object_id: ObjectId, data: bytearray) -> PusTelecommand: """ " Function to generate the command to ping a gomspace device @param object_id Object Id of the gomspace device handler. @param data Bytearray containing the bytes to send to the gomspace device. For now the on board software @@ -137,33 +139,33 @@ def pack_ping_command(object_id: bytearray, data: bytearray) -> PusTelecommand: data are simply copied by the device and then sent back. """ return generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.PING, app_data=data + object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.PING, app_data=data ) -def pack_gnd_wdt_reset_command(object_id: bytearray) -> PusTelecommand: +def pack_gnd_wdt_reset_command(object_id: ObjectId) -> PusTelecommand: """ " Function to generate the command to reset the watchdog of a gomspace device. @param object_id Object Id of the gomspace device handler. """ return generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.WDT_RESET + object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.WDT_RESET ) -def pack_reboot_command(object_id: bytearray) -> PusTelecommand: +def pack_reboot_command(object_id: ObjectId) -> PusTelecommand: """Function to generate the command which triggers a reboot of a gomspace device @param object_id The object id of the gomspace device handler. """ return generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.REBOOT + object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.REBOOT ) -def pack_request_full_hk_table_command(object_id: bytearray) -> PusTelecommand: +def pack_request_full_hk_table_command(object_id: ObjectId) -> PusTelecommand: """Function to generate the command to request the full housekeeping table from a gomspace device. @param object_id The object id of the gomspace device handler. """ return generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.REQUEST_HK_TABLE + object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.REQUEST_HK_TABLE ) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 4d5920a..5aa0075 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -476,289 +476,6 @@ def add_time_cmds(cmd_dict: ServiceOpCodeDictT): ) -def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): - from pus_tc.devs.p60dock import P60OpCodes, GomspaceOpCodes, Info - from pus_tc.devs.pdu1 import Pdu1OpCodes - from pus_tc.devs.pdu2 import Pdu2OpCodes - from gomspace.gomspace_common import Info as GsInfo - - op_code_dict = dict() - add_op_code_entry( - op_code_dict=op_code_dict, - keys=P60OpCodes.STACK_3V3_ON, - info=Info.STACK_3V3_ON, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=P60OpCodes.STACK_3V3_OFF, - info=Info.STACK_3V3_OFF, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=P60OpCodes.STACK_5V_ON, - info=Info.STACK_5V_ON, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=P60OpCodes.STACK_5V_OFF, - info=Info.STACK_5V_OFF, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=GomspaceOpCodes.REQUEST_CORE_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, - keys=GomspaceOpCodes.PRINT_SWITCH_V_I, - info="P60 Dock: Print Switches, Voltages, Currents", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=GomspaceOpCodes.PRINT_LATCHUPS, - info="P60 Dock: Print Latchups", - ) - add_op_code_entry(op_code_dict=op_code_dict, keys=P60OpCodes.TEST, info="P60 Tests") - add_service_op_code_entry( - srv_op_code_dict=cmd_dict, - name=CustomServiceList.P60DOCK.value, - info="P60 Device", - op_code_entry=op_code_dict, - ) - - op_code_dict = dict() - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.TCS_BOARD_ON.value, - info="PDU1: Turn TCS board on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.TCS_BOARD_OFF.value, - info="PDU1: Turn TCS board off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.STAR_TRACKER_ON.value, - info="PDU1: Turn star tracker on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.STAR_TRACKER_OFF.value, - info="PDU1: Turn star tracker off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.SUS_NOMINAL_ON.value, - info="PDU1: Turn SUS nominal on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.SUS_NOMINAL_OFF.value, - info="PDU1: Turn SUS nominal off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.ACS_A_SIDE_ON.value, - info="PDU1: Turn ACS A side on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.ACS_A_SIDE_OFF.value, - info="PDU1: Turn ACS A side off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.SYRLINKS_ON.value, - info="PDU1: Turn Syrlinks on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.SYRLINKS_OFF.value, - info="PDU1: Turn Syrlinks off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.MGT_ON.value, - info="PDU1: Turn MGT on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.MGT_OFF.value, - info="PDU1: Turn MGT off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.PLOC_ON.value, - info="PDU1: Turn PLOC on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.PLOC_OFF.value, - info="PDU1: Turn PLOC off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.SCEX_ON.value, - info="PDU1: Turn Solar Cell Experiment on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu1OpCodes.SCEX_OFF.value, - info="PDU1: Turn Solar Cell Experiment off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=GomspaceOpCodes.REQUEST_CORE_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, - keys=GomspaceOpCodes.PRINT_SWITCH_V_I, - info="PDU1: Print Switches, Voltages, Currents", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=GomspaceOpCodes.PRINT_LATCHUPS, - info="PDU1: Print Latchups", - ) - add_op_code_entry( - op_code_dict=op_code_dict, keys=Pdu1OpCodes.TESTS.value, info="PDU1 Tests" - ) - add_service_op_code_entry( - srv_op_code_dict=cmd_dict, - name=CustomServiceList.PDU1.value, - info="PDU1 Device", - op_code_entry=op_code_dict, - ) - - op_code_dict = dict() - add_op_code_entry(op_code_dict=op_code_dict, keys="0", info="PDU2 Tests") - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.ACS_SIDE_B_ON.value, - info="PDU2: Turn ACS Side B on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.ACS_SIDE_B_OFF.value, - info="PDU2: Turn ACS Side B off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.SUS_REDUNDANT_ON.value, - info="PDU2: Turn SUS redundant on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.SUS_REDUNDANT_OFF.value, - info="PDU2: Turn SUS redundant off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.RW_ON.value, - info="PDU2: Turn reaction wheels on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.RW_OFF.value, - info="PDU2: Turn reaction wheels off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.PL_PCDU_VBAT_NOM_ON.value, - info="PDU2: PL PCDU Switch Channel Nominal (1) on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.PL_PCDU_VBAT_NOM_OFF.value, - info="PDU2: PL PCDU Switch Channel Nominal (1) off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.PL_PCDU_VBAT_RED_ON.value, - info="PDU2: PL PCDU Switch Channel Redundant (1) on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.PL_PCDU_VBAT_RED_OFF.value, - info="PDU2: PL PCDU Switch Channel Redundant (1) off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.TCS_HEATER_IN_ON.value, - info="PDU2: Switch TCS Heater Input on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.TCS_HEATER_IN_OFF.value, - info="PDU2: Switch TCS Heater Input off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.SOLAR_ARRAY_DEPL_ON.value, - info="PDU2: Switch Solar Array Deployment On", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.SOLAR_ARRAY_DEPL_OFF.value, - info="PDU2: Switch Solar Array Deployment Off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.PL_CAMERA_ON.value, - info="PDU2: Turn payload camera on", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=Pdu2OpCodes.PL_CAMERA_OFF.value, - info="PDU2: Turn payload camera off", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=GomspaceOpCodes.REQUEST_CORE_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, - keys=GomspaceOpCodes.PRINT_SWITCH_V_I, - info="PDU2: Print Switches, Voltages, Currents", - options={OpCodeDictKeys.TIMEOUT: 2.0}, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=GomspaceOpCodes.PRINT_LATCHUPS, - info="PDU2: Print Latchups", - ) - add_service_op_code_entry( - srv_op_code_dict=cmd_dict, - name="pdu2", - info="PDU2 Device", - op_code_entry=op_code_dict, - ) - op_code_dict = { - "0": ("ACU: Tests", {OpCodeDictKeys.TIMEOUT: 2.0}), - "51": ("ACU: Print channel statistics", {OpCodeDictKeys.TIMEOUT: 2.0}), - } - service_tuple = ("ACU Devices", op_code_dict) - cmd_dict[CustomServiceList.ACU.value] = service_tuple - - def add_imtq_cmds(cmd_dict: ServiceOpCodeDictT): op_code_dict_srv_imtq = { "0": ("IMTQ Tests All", {OpCodeDictKeys.TIMEOUT: 2.0}), diff --git a/pus_tc/devs/acu.py b/pus_tc/devs/acu.py index f08494d..4379dca 100644 --- a/pus_tc/devs/acu.py +++ b/pus_tc/devs/acu.py @@ -1,15 +1,101 @@ # -*- coding: utf-8 -*- -""" -@file tmtcc_tc_acu.py -@brief ACU tests -@author J. Meier +"""ACU commands +@author J. Meier, R. Mueller @date 21.12.2020 """ -import struct +from config.definitions import CustomServiceList +from tmtccmd.config import add_op_code_entry, add_service_op_code_entry from tmtccmd.tc.packer import TcQueueT -from tmtccmd.config.definitions import QueueCommands -from gomspace.gomspace_common import * +from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT +from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_diag_command, generate_one_hk_command +import gomspace.gomspace_common as gs +from gomspace.gomspace_common import GomspaceOpCodes +from gomspace.gomspace_common import Info as GsInfo +from config.object_ids import ACU_HANDLER_ID from pus_tc.devs.p60dock import P60DockConfigTable +from tmtccmd.tc.pus_8_funccmd import generate_action_command +from tmtccmd.utility import ObjectId + + +class ACUConfigTable: + mppt_mode = gs.TableEntry(bytearray([0x00, 0x00]), gs.TableEntry.uint8_size) + mppt_d_mode = gs.TableEntry(bytearray([0x00, 0x01]), gs.TableEntry.uint8_size) + vboost = gs.TableEntry(bytearray([0x00, 0x02]), gs.TableEntry.uint16_size) + vbat_max_hi = gs.TableEntry(bytearray([0x00, 0x10]), gs.TableEntry.uint16_size) + vbat_max_lo = gs.TableEntry(bytearray([0x00, 0x12]), gs.TableEntry.uint16_size) + ov_mode = gs.TableEntry(bytearray([0x00, 0x1A]), gs.TableEntry.uint8_size) + + +class ACUHkTable: + temperature1 = gs.TableEntry(bytearray([0x00, 0x1C]), gs.TableEntry.uint16_size) + temperature2 = gs.TableEntry(bytearray([0x00, 0x1D]), gs.TableEntry.uint16_size) + temperature3 = gs.TableEntry(bytearray([0x00, 0x1E]), gs.TableEntry.uint16_size) + # Ground WDT value (remaining seconds until reboot) + wdt_gnd_left = gs.TableEntry(bytearray([0x00, 0x74]), gs.TableEntry.uint32_size) + + +class OpCodes: + TEST = ["0", "test"] + + +class Info: + TEST = "ACU Test" + + +def add_acu_cmds(cmd_dict: ServiceOpCodeDictT): + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.REQUEST_CORE_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, + keys=GomspaceOpCodes.REQUEST_AUX_HK_ONCE, + info=GsInfo.REQUEST_AUX_HK_ONCE + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.TEST, + info=Info.TEST + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + op_code_entry=op_code_dict, + name=CustomServiceList.ACU.value, + info="ACU Device" + ) + + +def pack_acu_commands( + object_id: ObjectId, tc_queue: TcQueueT, op_code: str +) -> TcQueueT: + tc_queue.appendleft((QueueCommands.PRINT, "Handling ACU command")) + if op_code in GomspaceOpCodes.PRINT_SWITCH_V_I: + tc_queue.appendleft((QueueCommands.PRINT, "ACU: Print channel stats")) + command = generate_action_command( + object_id=object_id.as_bytes, + action_id=gs.GomspaceDeviceActionIds.PRINT_SWITCH_V_I + ) + tc_queue.appendleft(command.pack_command_tuple()) + if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE: + tc_queue.appendleft((QueueCommands.PRINT, f"PDU1: {GsInfo.REQUEST_CORE_HK_ONCE}")) + hk_sid = make_sid(object_id=object_id.as_bytes, set_id=gs.SetIds.ACU_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: {GsInfo.REQUEST_AUX_HK_ONCE}")) + hk_sid = make_sid(object_id=object_id.as_bytes, set_id=gs.SetIds.ACU_AUX) + command = generate_one_hk_command(sid=hk_sid, ssc=0) + tc_queue.appendleft(command.pack_command_tuple()) + pack_test_cmds(object_id=object_id, tc_queue=tc_queue) + + return tc_queue class ACUTestProcedure: @@ -26,59 +112,28 @@ class ACUTestProcedure: ping = False read_temperature1 = False read_temperature2 = False - read_temperature3 = True - read_mppt_mode = True - read_vboost = True - read_vbat_max_hi = True - read_vbat_max_lo = True - read_ov_mode = True + read_temperature3 = False + read_mppt_mode = False + read_vboost = False + read_vbat_max_hi = False + read_vbat_max_lo = False + read_ov_mode = False + off = False -class ACUConfigTable: - mppt_mode = TableEntry(bytearray([0x00, 0x00]), TableEntry.uint8_size) - mppt_d_mode = TableEntry(bytearray([0x00, 0x01]), TableEntry.uint8_size) - vboost = TableEntry(bytearray([0x00, 0x02]), TableEntry.uint16_size) - vbat_max_hi = TableEntry(bytearray([0x00, 0x10]), TableEntry.uint16_size) - vbat_max_lo = TableEntry(bytearray([0x00, 0x12]), TableEntry.uint16_size) - ov_mode = TableEntry(bytearray([0x00, 0x1A]), TableEntry.uint8_size) - - -class ACUHkTable: - temperature1 = TableEntry(bytearray([0x00, 0x1C]), TableEntry.uint16_size) - temperature2 = TableEntry(bytearray([0x00, 0x1D]), TableEntry.uint16_size) - temperature3 = TableEntry(bytearray([0x00, 0x1E]), TableEntry.uint16_size) - # Ground WDT value (remaining seconds until reboot) - wdt_gnd_left = TableEntry(bytearray([0x00, 0x74]), TableEntry.uint32_size) - - -class CommandId: - PRINT_CHANNEL_STATS = 51 - - -def pack_acu_test_into( - object_id: bytearray, tc_queue: TcQueueT, op_code: str -) -> TcQueueT: - tc_queue.appendleft((QueueCommands.PRINT, "Testing ACU")) - - if op_code == "51": - tc_queue.appendleft((QueueCommands.PRINT, "ACU: Print channel stats")) - command = object_id + struct.pack("!I", CommandId.PRINT_CHANNEL_STATS) - command = PusTelecommand(service=8, subservice=128, ssc=30, app_data=command) - tc_queue.appendleft(command.pack_command_tuple()) - return - +def pack_test_cmds(object_id: ObjectId, tc_queue: TcQueueT): if ACUTestProcedure.all or ACUTestProcedure.reboot: tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reboot")) - command = pack_reboot_command(object_id) + command = gs.pack_reboot_command(object_id) # command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if ACUTestProcedure.all or ACUTestProcedure.read_gnd_wdt: tc_queue.appendleft( (QueueCommands.PRINT, "ACU: Reading ground watchdog timer value") ) - command = pack_get_param_command( - object_id, - TableIds.hk, + command = gs.pack_get_param_command( + object_id.as_bytes, + gs.TableIds.hk, ACUHkTable.wdt_gnd_left.parameter_address, ACUHkTable.wdt_gnd_left.parameter_size, ) @@ -86,20 +141,20 @@ def pack_acu_test_into( tc_queue.appendleft(command.pack_command_tuple()) if ACUTestProcedure.all or ACUTestProcedure.gnd_wdt_reset: tc_queue.appendleft((QueueCommands.PRINT, "ACU: Testing ground watchdog reset")) - command = pack_gnd_wdt_reset_command(object_id) + command = gs.pack_gnd_wdt_reset_command(object_id) # command = PusTelecommand(service=8, subservice=128, ssc=21, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if ACUTestProcedure.all or ACUTestProcedure.ping: tc_queue.appendleft((QueueCommands.PRINT, "ACU: Ping Test")) ping_data = bytearray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) - command = pack_ping_command(object_id, ping_data) + command = gs.pack_ping_command(object_id, ping_data) # command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if ACUTestProcedure.all or ACUTestProcedure.read_temperature3: tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading temperature 3")) - command = pack_get_param_command( - object_id, - TableIds.hk, + command = gs.pack_get_param_command( + object_id.as_bytes, + gs.TableIds.hk, ACUHkTable.temperature3.parameter_address, ACUHkTable.temperature3.parameter_size, ) @@ -107,9 +162,9 @@ def pack_acu_test_into( tc_queue.appendleft(command.pack_command_tuple()) if ACUTestProcedure.all or ACUTestProcedure.read_vboost: tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading vboost value")) - command = pack_get_param_command( - object_id, - TableIds.config, + command = gs.pack_get_param_command( + object_id.as_bytes, + gs.TableIds.config, ACUConfigTable.vboost.parameter_address, ACUConfigTable.vboost.parameter_size, ) @@ -117,9 +172,9 @@ def pack_acu_test_into( tc_queue.appendleft(command.pack_command_tuple()) if ACUTestProcedure.all or ACUTestProcedure.read_vbat_max_hi: tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading vbat_max_hi")) - command = pack_get_param_command( - object_id, - TableIds.config, + command = gs.pack_get_param_command( + object_id.as_bytes, + gs.TableIds.config, ACUConfigTable.vbat_max_hi.parameter_address, ACUConfigTable.vbat_max_hi.parameter_size, ) @@ -127,9 +182,9 @@ def pack_acu_test_into( tc_queue.appendleft(command.pack_command_tuple()) if ACUTestProcedure.all or ACUTestProcedure.read_vbat_max_lo: tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading vbat_max_lo")) - command = pack_get_param_command( - object_id, - TableIds.config, + command = gs.pack_get_param_command( + object_id.as_bytes, + gs.TableIds.config, ACUConfigTable.vbat_max_lo.parameter_address, ACUConfigTable.vbat_max_lo.parameter_size, ) @@ -137,23 +192,20 @@ def pack_acu_test_into( tc_queue.appendleft(command.pack_command_tuple()) if ACUTestProcedure.all or ACUTestProcedure.read_ov_mode: tc_queue.appendleft((QueueCommands.PRINT, "ACU: Reading ov_mode")) - command = pack_get_param_command( - object_id, - TableIds.config, + command = gs.pack_get_param_command( + object_id.as_bytes, + gs.TableIds.config, ACUConfigTable.ov_mode.parameter_address, ACUConfigTable.ov_mode.parameter_size, ) # command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) - - tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Turning off ACU")) - command = pack_set_param_command( - p60dock_object_id, - P60DockConfigTable.out_en_0.parameter_address, - P60DockConfigTable.out_en_0.parameter_size, - Channel.off, - ) - # command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command) - tc_queue.appendleft(command.pack_command_tuple()) - - return tc_queue + if ACUTestProcedure.all or ACUTestProcedure.off: + tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Turning off ACU")) + command = gs.pack_set_param_command( + ACU_HANDLER_ID, + P60DockConfigTable.out_en_0.parameter_address, + P60DockConfigTable.out_en_0.parameter_size, + gs.Channel.off, + ) + tc_queue.appendleft(command.pack_command_tuple()) \ No newline at end of file diff --git a/pus_tc/devs/p60dock.py b/pus_tc/devs/p60dock.py index be71cac..c0f395a 100644 --- a/pus_tc/devs/p60dock.py +++ b/pus_tc/devs/p60dock.py @@ -87,11 +87,12 @@ class P60DockHkTable: wdt_gnd_left = TableEntry(bytearray([0x00, 0xA8]), TableEntry.uint32_size) -def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): +def pack_p60dock_cmds(object_id: ObjectId, tc_queue: TcQueueT, op_code: str): + objb = object_id.as_bytes if op_code in P60OpCodes.STACK_3V3_ON: tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_3V3_ON)) command = pack_set_param_command( - object_id, + objb, P60DockConfigTable.out_en_9.parameter_address, P60DockConfigTable.out_en_9.parameter_size, Channel.on, @@ -100,7 +101,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code in P60OpCodes.STACK_3V3_OFF: tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_3V3_OFF)) command = pack_set_param_command( - object_id, + objb, P60DockConfigTable.out_en_9.parameter_address, P60DockConfigTable.out_en_9.parameter_size, Channel.off, @@ -109,7 +110,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code in P60OpCodes.STACK_5V_ON: tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_5V_ON)) command = pack_set_param_command( - object_id, + objb, P60DockConfigTable.out_en_10.parameter_address, P60DockConfigTable.out_en_10.parameter_size, Channel.on, @@ -118,7 +119,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code in P60OpCodes.STACK_5V_OFF: tc_queue.appendleft((QueueCommands.PRINT, Info.STACK_5V_OFF)) command = pack_set_param_command( - object_id, + objb, P60DockConfigTable.out_en_10.parameter_address, P60DockConfigTable.out_en_10.parameter_size, Channel.off, @@ -143,13 +144,13 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "P60 Dock: Print Switches, Voltages, Currents") ) command = generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I + object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I ) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.PRINT_LATCHUPS: tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Print Latchups")) command = generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS + object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS ) tc_queue.appendleft(command.pack_command_tuple()) if P60DockTestProcedure.all or P60DockTestProcedure.reboot: @@ -162,7 +163,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "P60 Dock: Reading ground watchdog timer value") ) command = pack_get_param_command( - object_id, + objb, TableIds.hk, P60DockHkTable.wdt_gnd_left.parameter_address, P60DockHkTable.wdt_gnd_left.parameter_size, @@ -188,7 +189,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) parameter = 0 # set channel off command = pack_set_param_command( - object_id, + objb, P60DockConfigTable.out_en_3.parameter_address, P60DockConfigTable.out_en_3.parameter_size, parameter, @@ -200,7 +201,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "P60 Dock: Testing temperature reading") ) command = pack_get_param_command( - object_id, + objb, TableIds.hk, P60DockHkTable.temperature1.parameter_address, P60DockHkTable.temperature1.parameter_size, @@ -212,7 +213,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "P60 Dock: Testing Output Channel 3 state (PDU2)") ) command = pack_get_param_command( - object_id, + objb, TableIds.config, P60DockConfigTable.out_en_3.parameter_address, P60DockConfigTable.out_en_3.parameter_size, @@ -227,7 +228,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) ) command = pack_get_param_command( - object_id, + objb, TableIds.config, P60DockConfigTable.cur_lu_lim_0.parameter_address, P60DockConfigTable.cur_lu_lim_0.parameter_size, @@ -240,7 +241,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) parameter = 1 # set channel on command = pack_set_param_command( - object_id, + objb, P60DockConfigTable.out_en_3.parameter_address, P60DockConfigTable.out_en_3.parameter_size, parameter, @@ -253,7 +254,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) table_id_invalid = 5 command = pack_get_param_command( - object_id, + objb, table_id_invalid, P60DockHkTable.temperature1.parameter_address, P60DockHkTable.temperature1.parameter_size, @@ -269,7 +270,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) invalid_address = bytearray([0x01, 0xF4]) command = pack_get_param_command( - object_id, + objb, TableIds.hk, invalid_address, P60DockHkTable.temperature1.parameter_size, @@ -286,7 +287,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): parameter_size = 2 parameter = 1 command = pack_set_param_command( - object_id, invalid_address, parameter_size, parameter + objb, invalid_address, parameter_size, parameter ) # command = PusTelecommand(service=8, subservice=128, ssc=30, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) @@ -299,7 +300,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) invalid_size = 5 command = pack_get_param_command( - object_id, + objb, TableIds.hk, P60DockHkTable.temperature1.parameter_address, invalid_size, @@ -314,7 +315,7 @@ def pack_p60dock_cmds(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) parameter = 1 command = pack_set_param_command( - object_id, + objb, P60DockConfigTable.out_en_3.parameter_address, invalid_size, parameter, diff --git a/pus_tc/devs/pcdu.py b/pus_tc/devs/pcdu.py new file mode 100644 index 0000000..9cab064 --- /dev/null +++ b/pus_tc/devs/pcdu.py @@ -0,0 +1,295 @@ +from config.definitions import CustomServiceList +from tmtccmd.config import ServiceOpCodeDictT, add_op_code_entry, add_service_op_code_entry, \ + OpCodeDictKeys + +from pus_tc.devs.p60dock import P60OpCodes, GomspaceOpCodes, Info +from pus_tc.devs.pdu1 import Pdu1OpCodes +from pus_tc.devs.pdu2 import Pdu2OpCodes +from pus_tc.devs.acu import add_acu_cmds +from gomspace.gomspace_common import Info as GsInfo + + +def add_p60_cmds(cmd_dict: ServiceOpCodeDictT): + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, + keys=P60OpCodes.STACK_3V3_ON, + info=Info.STACK_3V3_ON, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=P60OpCodes.STACK_3V3_OFF, + info=Info.STACK_3V3_OFF, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=P60OpCodes.STACK_5V_ON, + info=Info.STACK_5V_ON, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=P60OpCodes.STACK_5V_OFF, + info=Info.STACK_5V_OFF, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.REQUEST_CORE_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, + keys=GomspaceOpCodes.PRINT_SWITCH_V_I, + info="P60 Dock: Print Switches, Voltages, Currents", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.PRINT_LATCHUPS, + info="P60 Dock: Print Latchups", + ) + add_op_code_entry(op_code_dict=op_code_dict, keys=P60OpCodes.TEST, info="P60 Tests") + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.P60DOCK.value, + info="P60 Device", + op_code_entry=op_code_dict, + ) + + +def add_pdu1_cmds(cmd_dict: ServiceOpCodeDictT): + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.TCS_BOARD_OFF.value, + info="PDU1: Turn TCS board off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.STAR_TRACKER_ON.value, + info="PDU1: Turn star tracker on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.STAR_TRACKER_OFF.value, + info="PDU1: Turn star tracker off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.SUS_NOMINAL_ON.value, + info="PDU1: Turn SUS nominal on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.SUS_NOMINAL_OFF.value, + info="PDU1: Turn SUS nominal off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.ACS_A_SIDE_ON.value, + info="PDU1: Turn ACS A side on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.ACS_A_SIDE_OFF.value, + info="PDU1: Turn ACS A side off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.SYRLINKS_ON.value, + info="PDU1: Turn Syrlinks on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.SYRLINKS_OFF.value, + info="PDU1: Turn Syrlinks off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.MGT_ON.value, + info="PDU1: Turn MGT on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.MGT_OFF.value, + info="PDU1: Turn MGT off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.PLOC_ON.value, + info="PDU1: Turn PLOC on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.PLOC_OFF.value, + info="PDU1: Turn PLOC off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.SCEX_ON.value, + info="PDU1: Turn Solar Cell Experiment on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.SCEX_OFF.value, + info="PDU1: Turn Solar Cell Experiment off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.REQUEST_CORE_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, + keys=GomspaceOpCodes.PRINT_SWITCH_V_I, + info="PDU1: Print Switches, Voltages, Currents", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu1OpCodes.TCS_BOARD_ON.value, + info="PDU1: Turn TCS board on", + ) + + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.PRINT_LATCHUPS, + info="PDU1: Print Latchups", + ) + add_op_code_entry( + op_code_dict=op_code_dict, keys=Pdu1OpCodes.TESTS.value, info="PDU1 Tests" + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.PDU1.value, + info="PDU1 Device", + op_code_entry=op_code_dict, + ) + + +def add_pdu2_cmds(cmd_dict: ServiceOpCodeDictT): + op_code_dict = dict() + add_op_code_entry(op_code_dict=op_code_dict, keys="0", info="PDU2 Tests") + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.ACS_SIDE_B_ON.value, + info="PDU2: Turn ACS Side B on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.ACS_SIDE_B_OFF.value, + info="PDU2: Turn ACS Side B off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.SUS_REDUNDANT_ON.value, + info="PDU2: Turn SUS redundant on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.SUS_REDUNDANT_OFF.value, + info="PDU2: Turn SUS redundant off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.RW_ON.value, + info="PDU2: Turn reaction wheels on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.RW_OFF.value, + info="PDU2: Turn reaction wheels off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.PL_PCDU_VBAT_NOM_ON.value, + info="PDU2: PL PCDU Switch Channel Nominal (1) on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.PL_PCDU_VBAT_NOM_OFF.value, + info="PDU2: PL PCDU Switch Channel Nominal (1) off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.PL_PCDU_VBAT_RED_ON.value, + info="PDU2: PL PCDU Switch Channel Redundant (1) on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.PL_PCDU_VBAT_RED_OFF.value, + info="PDU2: PL PCDU Switch Channel Redundant (1) off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.TCS_HEATER_IN_ON.value, + info="PDU2: Switch TCS Heater Input on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.TCS_HEATER_IN_OFF.value, + info="PDU2: Switch TCS Heater Input off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.SOLAR_ARRAY_DEPL_ON.value, + info="PDU2: Switch Solar Array Deployment On", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.SOLAR_ARRAY_DEPL_OFF.value, + info="PDU2: Switch Solar Array Deployment Off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.PL_CAMERA_ON.value, + info="PDU2: Turn payload camera on", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=Pdu2OpCodes.PL_CAMERA_OFF.value, + info="PDU2: Turn payload camera off", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.REQUEST_CORE_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, + keys=GomspaceOpCodes.PRINT_SWITCH_V_I, + info="PDU2: Print Switches, Voltages, Currents", + options={OpCodeDictKeys.TIMEOUT: 2.0}, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=GomspaceOpCodes.PRINT_LATCHUPS, + info="PDU2: Print Latchups", + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name="pdu2", + info="PDU2 Device", + op_code_entry=op_code_dict, + ) + + +def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): + add_p60_cmds(cmd_dict) + add_pdu1_cmds(cmd_dict) + add_pdu2_cmds(cmd_dict) + add_acu_cmds(cmd_dict) + + diff --git a/pus_tc/devs/pdu1.py b/pus_tc/devs/pdu1.py index 08ddbd9..04c042e 100644 --- a/pus_tc/devs/pdu1.py +++ b/pus_tc/devs/pdu1.py @@ -54,13 +54,13 @@ class PDU1TestProcedure: turn_channel_3_off = False -def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): +def pack_pdu1_commands(object_id: ObjectId, tc_queue: TcQueueT, op_code: str): tc_queue.appendleft((QueueCommands.PRINT, "Commanding PDU1")) - + objb = object_id.as_bytes if op_code == Pdu1OpCodes.TCS_BOARD_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn TCS board on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_0.parameter_address, PDUConfigTable.out_en_0.parameter_size, Channel.on, @@ -69,7 +69,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.TCS_BOARD_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn TCS board off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_0.parameter_address, PDUConfigTable.out_en_0.parameter_size, Channel.off, @@ -78,7 +78,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.STAR_TRACKER_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn star tracker on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, Channel.on, @@ -87,7 +87,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.STAR_TRACKER_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn star tracker off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, Channel.off, @@ -96,7 +96,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.SUS_NOMINAL_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn SUS nominal on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_4.parameter_address, PDUConfigTable.out_en_4.parameter_size, Channel.on, @@ -105,7 +105,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.SUS_NOMINAL_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn SUS nominal off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_4.parameter_address, PDUConfigTable.out_en_4.parameter_size, Channel.off, @@ -114,7 +114,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.ACS_A_SIDE_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn ACS Side A on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_7.parameter_address, PDUConfigTable.out_en_7.parameter_size, Channel.on, @@ -123,7 +123,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.ACS_A_SIDE_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn ACS Side A off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_7.parameter_address, PDUConfigTable.out_en_7.parameter_size, Channel.off, @@ -132,7 +132,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.SUS_NOMINAL_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn SUS nominal off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_4.parameter_address, PDUConfigTable.out_en_4.parameter_size, Channel.off, @@ -143,7 +143,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU1: Turn Solar Cell Experiment on") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_5.parameter_address, PDUConfigTable.out_en_5.parameter_size, Channel.on, @@ -154,7 +154,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU1: Turn Solar Cell Experiment off") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_5.parameter_address, PDUConfigTable.out_en_5.parameter_size, Channel.off, @@ -163,7 +163,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.SYRLINKS_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn Syrlinks on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_1.parameter_address, PDUConfigTable.out_en_1.parameter_size, Channel.on, @@ -172,7 +172,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.SYRLINKS_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn Syrlinks off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_1.parameter_address, PDUConfigTable.out_en_1.parameter_size, Channel.off, @@ -181,7 +181,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.MGT_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn MGT on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_3.parameter_address, PDUConfigTable.out_en_3.parameter_size, Channel.on, @@ -190,7 +190,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.MGT_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn MGT off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_3.parameter_address, PDUConfigTable.out_en_3.parameter_size, Channel.off, @@ -199,7 +199,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.PLOC_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn PLOC on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_6.parameter_address, PDUConfigTable.out_en_6.parameter_size, Channel.on, @@ -208,7 +208,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu1OpCodes.PLOC_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn PLOC off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_6.parameter_address, PDUConfigTable.out_en_6.parameter_size, Channel.off, @@ -229,13 +229,13 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU1: Print Switches, Voltages, Currents") ) command = generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I + object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I ) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.PRINT_LATCHUPS: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Print Latchups")) command = generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS + object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS ) tc_queue.appendleft(command.pack_command_tuple()) if PDU1TestProcedure.all or PDU1TestProcedure.ping: @@ -246,7 +246,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if PDU1TestProcedure.all or PDU1TestProcedure.read_temperature: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Testing temperature reading")) command = pack_get_param_command( - object_id, + objb, TableIds.hk, PDUHkTable.temperature.parameter_address, PDUHkTable.temperature.parameter_size, @@ -257,7 +257,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU1: Turn channel 2 on (Star Tracker)") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, Channel.on, @@ -268,7 +268,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU1: Turn channel 2 off (Star Tracker)") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, Channel.off, @@ -277,7 +277,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if PDU1TestProcedure.all or PDU1TestProcedure.turn_channel_3_on: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn channel 3 on (MTQ)")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_3.parameter_address, PDUConfigTable.out_en_3.parameter_size, Channel.on, @@ -286,7 +286,7 @@ def pack_pdu1_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if PDU1TestProcedure.all or PDU1TestProcedure.turn_channel_3_off: tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn channel 3 off (MTQ)")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_3.parameter_address, PDUConfigTable.out_en_3.parameter_size, Channel.off, diff --git a/pus_tc/devs/pdu2.py b/pus_tc/devs/pdu2.py index 12c1636..df4c883 100644 --- a/pus_tc/devs/pdu2.py +++ b/pus_tc/devs/pdu2.py @@ -66,13 +66,13 @@ class PDU2TestProcedure: request_hk_table = False -def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): +def pack_pdu2_commands(object_id: ObjectId, tc_queue: TcQueueT, op_code: str): tc_queue.appendleft((QueueCommands.PRINT, "Testing PDU2")) - + objb = object_id.as_bytes if op_code == Pdu2OpCodes.ACS_SIDE_B_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn ACS Side B on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_7.parameter_address, PDUConfigTable.out_en_7.parameter_size, Channel.on, @@ -82,7 +82,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.ACS_SIDE_B_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn ACS Side B off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_7.parameter_address, PDUConfigTable.out_en_7.parameter_size, Channel.off, @@ -92,7 +92,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.Q7S_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "Turning off Q7S OBC")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_0.parameter_address, PDUConfigTable.out_en_0.parameter_size, Channel.off, @@ -101,7 +101,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.SUS_REDUNDANT_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn SUS redundant on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_4.parameter_address, PDUConfigTable.out_en_4.parameter_size, Channel.on, @@ -110,7 +110,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.SUS_REDUNDANT_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn SUS redundant off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_4.parameter_address, PDUConfigTable.out_en_4.parameter_size, Channel.off, @@ -119,7 +119,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.RW_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn reaction wheels on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, Channel.on, @@ -128,7 +128,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.RW_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn reaction wheels off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, Channel.off, @@ -139,7 +139,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Turn PDU2 PL PCDU Channel 1 on") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_1.parameter_address, PDUConfigTable.out_en_1.parameter_size, Channel.on, @@ -150,7 +150,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Turn PDU2 PL PCDU Channel 1 off") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_1.parameter_address, PDUConfigTable.out_en_1.parameter_size, Channel.off, @@ -161,7 +161,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Turn PDU2 PL PCDU Channel 6 on") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_6.parameter_address, PDUConfigTable.out_en_6.parameter_size, Channel.off, @@ -172,7 +172,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Turn PDU2 PL PCDU Channel 6 off") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_6.parameter_address, PDUConfigTable.out_en_6.parameter_size, Channel.off, @@ -181,7 +181,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.TCS_HEATER_IN_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn TCS Heater Input on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_3.parameter_address, PDUConfigTable.out_en_3.parameter_size, Channel.on, @@ -190,7 +190,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.TCS_HEATER_IN_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn TCS Heater Input off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_3.parameter_address, PDUConfigTable.out_en_3.parameter_size, Channel.off, @@ -201,7 +201,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Turn Solar Array Deployment On") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_5.parameter_address, PDUConfigTable.out_en_5.parameter_size, Channel.on, @@ -212,7 +212,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Turn Solar Array Deployment Off") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_5.parameter_address, PDUConfigTable.out_en_5.parameter_size, Channel.off, @@ -221,7 +221,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.PL_CAMERA_ON.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn payload camera on")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_8.parameter_address, PDUConfigTable.out_en_8.parameter_size, Channel.on, @@ -230,7 +230,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if op_code == Pdu2OpCodes.PL_CAMERA_OFF.value: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Turn payload camera off")) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_8.parameter_address, PDUConfigTable.out_en_8.parameter_size, Channel.off, @@ -251,13 +251,13 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Print Switches, Currents, Voltahes") ) command = generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I + object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_SWITCH_V_I ) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.PRINT_LATCHUPS: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Print Latchups")) command = generate_action_command( - object_id=object_id, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS + object_id=objb, action_id=GomspaceDeviceActionIds.PRINT_LATCHUPS ) tc_queue.appendleft(command.pack_command_tuple()) if PDU2TestProcedure.all or PDU2TestProcedure.reboot: @@ -269,7 +269,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Reading ground watchdog timer value") ) command = pack_get_param_command( - object_id, + objb, TableIds.hk, PDUHkTable.wdt_gnd_left.parameter_address, PDUHkTable.wdt_gnd_left.parameter_size, @@ -294,7 +294,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, Channel.on, @@ -303,7 +303,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): if PDU2TestProcedure.all or PDU2TestProcedure.read_temperature: tc_queue.appendleft((QueueCommands.PRINT, "PDU2: Testing temperature reading")) command = pack_get_param_command( - object_id, + objb, TableIds.hk, PDUHkTable.temperature.parameter_address, PDUHkTable.temperature.parameter_size, @@ -314,7 +314,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Reading output channel 2 state (TCS Heater)") ) command = pack_get_param_command( - object_id, + objb, TableIds.config, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, @@ -328,7 +328,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): ) ) command = pack_get_param_command( - object_id, + objb, TableIds.config, PDUConfigTable.cur_lu_lim_0.parameter_address, PDUConfigTable.cur_lu_lim_0.parameter_size, @@ -339,7 +339,7 @@ def pack_pdu2_commands(object_id: bytearray, tc_queue: TcQueueT, op_code: str): (QueueCommands.PRINT, "PDU2: Testing setting output channel 2 off") ) command = pack_set_param_command( - object_id, + objb, PDUConfigTable.out_en_2.parameter_address, PDUConfigTable.out_en_2.parameter_size, Channel.off, diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py index c2e3f60..22eb89a 100644 --- a/pus_tc/tc_packer_hook.py +++ b/pus_tc/tc_packer_hook.py @@ -20,7 +20,7 @@ from pus_tc.devs.p60dock import pack_p60dock_cmds from pus_tc.devs.pdu2 import pack_pdu2_commands from pus_tc.devs.pdu1 import pack_pdu1_commands from pus_tc.devs.bpx_batt import pack_bpx_commands -from pus_tc.devs.acu import pack_acu_test_into +from pus_tc.devs.acu import pack_acu_commands from pus_tc.devs.solar_array_deployment import pack_solar_array_deployment_test_into from pus_tc.devs.imtq import pack_imtq_test_into from pus_tc.devs.tmp1075 import pack_tmp1075_test_into @@ -44,6 +44,7 @@ from pus_tc.system.proc import pack_proc_commands from pus_tc.system.controllers import pack_controller_commands from config.definitions import CustomServiceList from config.object_ids import ( + get_object_ids, P60_DOCK_HANDLER, PDU_1_HANDLER_ID, PDU_2_HANDLER_ID, @@ -98,6 +99,7 @@ def pre_tc_send_cb( def pack_service_queue_user( service: Union[str, int], op_code: str, service_queue: TcQueueT ): + obj_id_man = get_object_ids() if service == CoreServiceList.SERVICE_5.value: return pack_generic_service5_test_into(tc_queue=service_queue) if service == CoreServiceList.SERVICE_17.value: @@ -107,23 +109,23 @@ def pack_service_queue_user( if service == CoreServiceList.SERVICE_200.value: return pack_service200_test_into(tc_queue=service_queue) if service == CustomServiceList.P60DOCK.value: - object_id = P60_DOCK_HANDLER + object_id = obj_id_man.get(P60_DOCK_HANDLER) return pack_p60dock_cmds( object_id=object_id, tc_queue=service_queue, op_code=op_code ) if service == CustomServiceList.PDU1.value: - object_id = PDU_1_HANDLER_ID + object_id = obj_id_man.get(PDU_1_HANDLER_ID) return pack_pdu1_commands( object_id=object_id, tc_queue=service_queue, op_code=op_code ) if service == CustomServiceList.PDU2.value: - object_id = PDU_2_HANDLER_ID + object_id = obj_id_man.get(PDU_2_HANDLER_ID) return pack_pdu2_commands( object_id=object_id, tc_queue=service_queue, op_code=op_code ) if service == CustomServiceList.ACU.value: - object_id = ACU_HANDLER_ID - return pack_acu_test_into( + object_id = obj_id_man.get(ACU_HANDLER_ID) + return pack_acu_commands( object_id=object_id, tc_queue=service_queue, op_code=op_code ) if service == CustomServiceList.BPX_BATTERY.value: diff --git a/pus_tm/devs/pcdu.py b/pus_tm/devs/pcdu.py index d33ddc6..e0ac54e 100644 --- a/pus_tm/devs/pcdu.py +++ b/pus_tm/devs/pcdu.py @@ -292,3 +292,13 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): printer.print_validity_buffer( validity_buffer=hk_data[current_idx:], num_vars=27 ) + + +def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + pw = PrintWrapper(printer=printer) + if set_id == SetIds.ACU_CORE: + pw.dlog("Received ACU Core HK. Voltages in mV, currents in mA") + pass + if set_id == SetIds.ACU_AUX: + pw.dlog("Received ACU Aux HK. Voltages in mV, currents in mA") + pass From c01f1d01916160888cf745ee3db6a2c46d795408 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 11:25:33 +0200 Subject: [PATCH 033/132] run black --- gomspace/gomspace_common.py | 4 +++- pus_tc/devs/acu.py | 32 ++++++++++++++++++-------------- pus_tc/devs/pcdu.py | 10 ++++++---- tmtccmd | 2 +- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/gomspace/gomspace_common.py b/gomspace/gomspace_common.py index 5fe1cb9..6e82950 100644 --- a/gomspace/gomspace_common.py +++ b/gomspace/gomspace_common.py @@ -139,7 +139,9 @@ def pack_ping_command(object_id: ObjectId, data: bytearray) -> PusTelecommand: data are simply copied by the device and then sent back. """ return generate_action_command( - object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.PING, app_data=data + object_id=object_id.as_bytes, + action_id=GomspaceDeviceActionIds.PING, + app_data=data, ) diff --git a/pus_tc/devs/acu.py b/pus_tc/devs/acu.py index 4379dca..06d6533 100644 --- a/pus_tc/devs/acu.py +++ b/pus_tc/devs/acu.py @@ -7,7 +7,11 @@ from config.definitions import CustomServiceList from tmtccmd.config import add_op_code_entry, add_service_op_code_entry from tmtccmd.tc.packer import TcQueueT from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT -from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_diag_command, generate_one_hk_command +from tmtccmd.tc.pus_3_fsfw_hk import ( + make_sid, + generate_one_diag_command, + generate_one_hk_command, +) import gomspace.gomspace_common as gs from gomspace.gomspace_common import GomspaceOpCodes from gomspace.gomspace_common import Info as GsInfo @@ -47,28 +51,24 @@ def add_acu_cmds(cmd_dict: ServiceOpCodeDictT): add_op_code_entry( op_code_dict=op_code_dict, keys=GomspaceOpCodes.REQUEST_CORE_HK_ONCE, - info=GsInfo.REQUEST_CORE_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 + info=GsInfo.REQUEST_AUX_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, - keys=OpCodes.TEST, - info=Info.TEST + info=GsInfo.REQUEST_AUX_HK_ONCE, ) + add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.TEST, info=Info.TEST) add_service_op_code_entry( srv_op_code_dict=cmd_dict, op_code_entry=op_code_dict, name=CustomServiceList.ACU.value, - info="ACU Device" + info="ACU Device", ) @@ -80,16 +80,20 @@ def pack_acu_commands( tc_queue.appendleft((QueueCommands.PRINT, "ACU: Print channel stats")) command = generate_action_command( object_id=object_id.as_bytes, - action_id=gs.GomspaceDeviceActionIds.PRINT_SWITCH_V_I + action_id=gs.GomspaceDeviceActionIds.PRINT_SWITCH_V_I, ) tc_queue.appendleft(command.pack_command_tuple()) if op_code in GomspaceOpCodes.REQUEST_CORE_HK_ONCE: - tc_queue.appendleft((QueueCommands.PRINT, f"PDU1: {GsInfo.REQUEST_CORE_HK_ONCE}")) + tc_queue.appendleft( + (QueueCommands.PRINT, f"PDU1: {GsInfo.REQUEST_CORE_HK_ONCE}") + ) hk_sid = make_sid(object_id=object_id.as_bytes, set_id=gs.SetIds.ACU_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: {GsInfo.REQUEST_AUX_HK_ONCE}")) + tc_queue.appendleft( + (QueueCommands.PRINT, f"PDU1: {GsInfo.REQUEST_AUX_HK_ONCE}") + ) hk_sid = make_sid(object_id=object_id.as_bytes, set_id=gs.SetIds.ACU_AUX) command = generate_one_hk_command(sid=hk_sid, ssc=0) tc_queue.appendleft(command.pack_command_tuple()) @@ -208,4 +212,4 @@ def pack_test_cmds(object_id: ObjectId, tc_queue: TcQueueT): P60DockConfigTable.out_en_0.parameter_size, gs.Channel.off, ) - tc_queue.appendleft(command.pack_command_tuple()) \ No newline at end of file + tc_queue.appendleft(command.pack_command_tuple()) diff --git a/pus_tc/devs/pcdu.py b/pus_tc/devs/pcdu.py index 9cab064..bd95d3d 100644 --- a/pus_tc/devs/pcdu.py +++ b/pus_tc/devs/pcdu.py @@ -1,6 +1,10 @@ from config.definitions import CustomServiceList -from tmtccmd.config import ServiceOpCodeDictT, add_op_code_entry, add_service_op_code_entry, \ - OpCodeDictKeys +from tmtccmd.config import ( + ServiceOpCodeDictT, + add_op_code_entry, + add_service_op_code_entry, + OpCodeDictKeys, +) from pus_tc.devs.p60dock import P60OpCodes, GomspaceOpCodes, Info from pus_tc.devs.pdu1 import Pdu1OpCodes @@ -291,5 +295,3 @@ def add_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): add_pdu1_cmds(cmd_dict) add_pdu2_cmds(cmd_dict) add_acu_cmds(cmd_dict) - - diff --git a/tmtccmd b/tmtccmd index 4fbbf12..0e193f9 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 4fbbf129e140e593b1cc54a0361fa20cc8726789 +Subproject commit 0e193f9c76973a6105926ed133b179f8ea467981 From b3751004a6f5ebe2a4bbbcf0fdbb3f590b2eb4e8 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Mon, 23 May 2022 11:53:31 +0200 Subject: [PATCH 034/132] added acs functional test --- pus_tc/system/proc.py | 125 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 3 deletions(-) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 2f82c3d..0837ad8 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -16,8 +16,15 @@ from pus_tc.devs.bpx_batt import BpxSetIds from pus_tc.system.core import SetIds as CoreSetIds from gomspace.gomspace_common import SetIds as GsSetIds from pus_tc.devs.rad_sensor import CommandIds as RadSetIds +from pus_tc.devs.mgms import MgmLis3SetIds as MgmSetIds_0_2 +from pus_tc.devs.mgms import MgmRm3100SetIds as MgmSetIds_1_3 +from pus_tc.devs.gyros import AdisGyroSetIds as GyroSetIds_0_2 +from pus_tc.devs.gyros import L3gGyroSetIds as GyroSetIds_1_3 + + from pus_tc.system.tcs import pack_tcs_sys_commands from pus_tc.system.controllers import pack_controller_commands +from pus_tc.system.acs import pack_acs_command class OpCodes: @@ -27,6 +34,7 @@ class OpCodes: PCDU_FT = ["pcdu-ft"] RAD_SEN_FT = ["rad-sen-ft"] TCS_FT = ["tcs-ft-on"] + ACS_FT = ["acs-ft"] class KeyAndInfo: @@ -35,7 +43,8 @@ class KeyAndInfo: CORE_FT = ["OBC", "OBC functional test"] PCDU_FT = ["PCDU", "PCDU functional test"] RAD_SEN_FT = ["Radiation Sensor", "Radiation Sensor functional test"] - TCS_FT = ["TCS Act.", "TCS functional test activation"] + TCS_FT = ["TCS", "TCS functional test"] + ACS_FT = ["ACS", "ACS functional test"] KAI = KeyAndInfo @@ -46,6 +55,7 @@ PROC_INFO_DICT = { KAI.PCDU_FT[0]: [OpCodes.PCDU_FT, KAI.PCDU_FT[1], 120.0, 10.0], KAI.RAD_SEN_FT[0]: [OpCodes.RAD_SEN_FT, KAI.RAD_SEN_FT[1], 120.0, 10.0], KAI.TCS_FT[0]: [OpCodes.TCS_FT, KAI.TCS_FT[1], 1800.0, 10.0], + KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0] } @@ -124,17 +134,18 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): ) if op_code in OpCodes.RAD_SEN_FT: - key = KAI.CORE_FT[0] + key = KAI.RAD_SEN_FT[0] sid = make_sid(oids.RAD_SENSOR_ID, RadSetIds.READ_CONVERSIONS) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) if op_code in OpCodes.TCS_FT: +# does not work with .WAIT pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-normal") pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") - key = KAI.CORE_FT[0] + key = KAI.TCS_FT[0] # Ids for TCS Board missing. No HK generation? sid = make_sid(oids.TCS_BOARD_ASS_ID, RadSetIds.READ_CONVERSIONS) pack_generic_hk_listening_cmds( @@ -144,6 +155,114 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-off") pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") + if op_code in OpCodes.ACS_FT: + key = KAI.ACS_FT[0] + + pack_acs_command(tc_queue=tc_queue, op_code="acs-a") + + sid = make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.MGM_1_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + + sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_1_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + +# GNSS0 missing + + + pack_acs_command(tc_queue=tc_queue, op_code="acs-off") + tc_queue.appendleft((QueueCommands.WAIT, 5.0)) + pack_acs_command(tc_queue=tc_queue, op_code="acs-b") + + sid = make_sid(oids.MGM_2_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.MGM_3_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + + sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_3_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + +# GNSS1 missing + + pack_acs_command(tc_queue=tc_queue, op_code="acs-off") + tc_queue.appendleft((QueueCommands.WAIT, 5.0)) + pack_acs_command(tc_queue=tc_queue, op_code="acs-d") + + sid = make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.MGM_1_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.MGM_2_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.MGM_3_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + + sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_1_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GYRO_3_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + +# GNSS0+1 missing + + pack_acs_command(tc_queue=tc_queue, op_code="acs-off") + def listen_to_hk_for_x_seconds( tc_queue: TcQueueT, From 580b3818489a87f9ea1b31754c7b0285c2bb6a10 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 12:38:50 +0200 Subject: [PATCH 035/132] completed ACU hk parsing --- pus_tc/cmd_definitions.py | 1 + pus_tm/devs/pcdu.py | 136 ++++++++++++++++++++++++++++++++------ 2 files changed, 115 insertions(+), 22 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 5aa0075..8f812c7 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -1,4 +1,5 @@ from pus_tc.devs.gps import GpsOpCodes +from pus_tc.devs.pcdu import add_pcdu_cmds from tmtccmd.config import ( add_op_code_entry, add_service_op_code_entry, diff --git a/pus_tm/devs/pcdu.py b/pus_tm/devs/pcdu.py index e0ac54e..2134352 100644 --- a/pus_tm/devs/pcdu.py +++ b/pus_tm/devs/pcdu.py @@ -1,4 +1,5 @@ import struct +from typing import List, Tuple from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter from pus_tm.defs import PrintWrapper @@ -87,6 +88,26 @@ class WdtInfo: return current_idx +class DevicesInfoParser: + def __int__(self): + self.dev_types = [] + self.dev_statuses = [] + + def parse(self, hk_data: bytes, current_idx: int) -> int: + for idx in range(8): + self.dev_types.append(hk_data[current_idx]) + current_idx += 1 + for idx in range(8): + self.dev_statuses.append(hk_data[current_idx]) + current_idx += 1 + return current_idx + + def print(self, pw: PrintWrapper): + pw.dlog(f"Device Type | Device State (0:None | 1:OK | 3:ERROR | 4:NOT FOUND)") + for i in range(len(self.dev_types)): + pw.dlog(f"{self.dev_types} | {self.dev_statuses}") + + def handle_pdu_data( printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes ): @@ -123,17 +144,13 @@ def handle_pdu_data( ) pw.dlog(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 + dev_parser = DevicesInfoParser() + current_idx = dev_parser.parse(hk_data=hk_data, current_idx=current_idx) wdt = WdtInfo(pw=pw) current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx) wdt.print() + pw.dlog(f"PDU Device Types: 0:FRAM|1:ADC|2:ADC|3:TempSens|4,5,6,7:Reserved") + dev_parser.print(pw=pw) if set_id == SetIds.PDU_1_CORE or set_id == SetIds.PDU_2_CORE: pw.dlog(f"Received PDU HK from PDU {pdu_idx}") current_list = [] @@ -153,8 +170,7 @@ def handle_pdu_data( 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) + pw.dlog(header_str) for idx in range(len(PDU1_CHANNELS_NAMES)): out_enb = f"{output_enb_list[idx]}".ljust(6) content_line = ( @@ -196,8 +212,7 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): out_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) + pw.dlog(header_str) for idx in range(13): out_enb = f"{out_enb_list[idx]}".ljust(6) content_line = ( @@ -262,14 +277,8 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): ar6_depl, ) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) current_idx += inc_len - device_types = [] - device_statuses = [] - for idx in range(8): - device_types.append(hk_data[current_idx]) - current_idx += 1 - for idx in range(8): - device_statuses.append(hk_data[current_idx]) - current_idx += 1 + dev_parser = DevicesInfoParser() + current_idx = dev_parser.parse(hk_data=hk_data, current_idx=current_idx) util_info = ( f"Reset Cause {reset_cause} | Boot Cause {boot_cause} | Uptime {uptime}" ) @@ -289,16 +298,99 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}" ) pw.dlog(batt_info) + pw.dlog( + "P60 Dock Dev Types: 0:FRAM|1:ADC|2:ADC|3:ADC|4:TempSens|5:RTC|" + "6:TempSens(BatPack)|7:TempSens(BatPack)" + ) + dev_parser.print(pw=pw) printer.print_validity_buffer( validity_buffer=hk_data[current_idx:], num_vars=27 ) +def gen_six_entry_u16_list(hk_data: bytes, current_idx: int) -> Tuple[int, List[int]]: + u16_list = [] + for idx in range(6): + u16_list.append(hk_data[current_idx : current_idx + 2]) + current_idx += 2 + return current_idx, u16_list + + def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): pw = PrintWrapper(printer=printer) if set_id == SetIds.ACU_CORE: + current_idx = 0 + fmt_str = "!B" + inc_len = struct.calcsize(fmt_str) + mppt_mode = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) + current_idx += inc_len + current_idx, currents = gen_six_entry_u16_list( + hk_data=hk_data, current_idx=current_idx + ) + current_idx, voltages = gen_six_entry_u16_list( + hk_data=hk_data, current_idx=current_idx + ) + vcc = hk_data[current_idx : current_idx + 2] + current_idx += 2 + vbat = hk_data[current_idx : current_idx + 2] + current_idx += 2 + current_idx, vboosts = gen_six_entry_u16_list( + hk_data=hk_data, current_idx=current_idx + ) + current_idx, powers = gen_six_entry_u16_list( + hk_data=hk_data, current_idx=current_idx + ) + fmt_str = "!HHHIIHH" + inc_len = struct.calcsize(fmt_str) + (tmp0, tmp1, tmp2, bootcnt, uptime, mppt_time, mppt_period) = struct.unpack( + fmt_str, hk_data[current_idx : current_idx + inc_len] + ) + current_idx += inc_len pw.dlog("Received ACU Core HK. Voltages in mV, currents in mA") - pass + pw.dlog(f"VCC {vcc} mV | VBAT {vbat} mV | MPPT Mode {mppt_mode}") + header_str = f"Channel | Input U [mV] | Input I [mA] | U Boost [mV] | Power [?]" + pw.dlog(header_str) + for i in range(6): + pw.dlog(f"{i} | {voltages[i]} | {currents[i]} | {vboosts[i]} | {powers[i]}") + pw.dlog(f"Temperatures in C: Ch0 {tmp0} | Ch1 {tmp1} | Ch2 {tmp2}") + pw.dlog( + f"Boot Count {bootcnt} | Uptime {uptime} | " + f"MPPT Time {mppt_time} msec | MPPT Period {mppt_period} msec" + ) + printer.print_validity_buffer( + validity_buffer=hk_data[current_idx:], num_vars=12 + ) if set_id == SetIds.ACU_AUX: + current_idx = 0 + fmt_str = "!IBhHhh" + inc_len = struct.calcsize(fmt_str) + (dac_enb0, dac_enb1, dac_enb2) = struct.unpack( + fmt_str, hk_data[current_idx : current_idx + inc_len] + ) + current_idx += inc_len + current_idx, dac_channels_raw = gen_six_entry_u16_list( + hk_data=hk_data, current_idx=current_idx + ) + fmt_str = "!IHII" + inc_len = struct.calcsize(fmt_str) + (boot_cause, reset_cause, wdt_cnt_gnd, wdt_gnd_time_left) = struct.unpack( + fmt_str, hk_data[current_idx : current_idx + inc_len] + ) + current_idx += inc_len + dev_parser = DevicesInfoParser() + current_idx = dev_parser.parse(hk_data=hk_data, current_idx=current_idx) pw.dlog("Received ACU Aux HK. Voltages in mV, currents in mA") - pass + pw.dlog( + f"DAC Enable States: DAC 0 {dac_enb0} | DAC 1 {dac_enb1} | DAC 2 {dac_enb2}" + ) + pw.dlog(f"Boot Cause {boot_cause} | Reset Cause {reset_cause}") + pw.dlog( + f"Ground WDT: Reboot Count {wdt_cnt_gnd} | Time Left {wdt_gnd_time_left} sec" + ) + + pw.dlog( + f"ACU Dev Types: 0:FRAM|1:ADC|2:ADC|3:DAC|4:DAC|" + f"5:DAC|6:TempSens|7:Reserved" + ) + dev_parser.print(pw=pw) + printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=8) From e03360917784fdf98a753a2ec493b0041473ccef Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 13:47:01 +0200 Subject: [PATCH 036/132] run black --- pus_tm/devs/pcdu.py | 24 ++++++++++++++++-------- pus_tm/hk_handling.py | 4 +++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/pus_tm/devs/pcdu.py b/pus_tm/devs/pcdu.py index 2134352..c97bf5a 100644 --- a/pus_tm/devs/pcdu.py +++ b/pus_tm/devs/pcdu.py @@ -311,7 +311,7 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): def gen_six_entry_u16_list(hk_data: bytes, current_idx: int) -> Tuple[int, List[int]]: u16_list = [] for idx in range(6): - u16_list.append(hk_data[current_idx : current_idx + 2]) + u16_list.append(struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]) current_idx += 2 return current_idx, u16_list @@ -322,7 +322,9 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): current_idx = 0 fmt_str = "!B" inc_len = struct.calcsize(fmt_str) - mppt_mode = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) + mppt_mode = struct.unpack( + fmt_str, hk_data[current_idx : current_idx + inc_len] + )[0] current_idx += inc_len current_idx, currents = gen_six_entry_u16_list( hk_data=hk_data, current_idx=current_idx @@ -330,9 +332,9 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): current_idx, voltages = gen_six_entry_u16_list( hk_data=hk_data, current_idx=current_idx ) - vcc = hk_data[current_idx : current_idx + 2] + vcc = struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] current_idx += 2 - vbat = hk_data[current_idx : current_idx + 2] + vbat = struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] current_idx += 2 current_idx, vboosts = gen_six_entry_u16_list( hk_data=hk_data, current_idx=current_idx @@ -348,13 +350,19 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): current_idx += inc_len pw.dlog("Received ACU Core HK. Voltages in mV, currents in mA") pw.dlog(f"VCC {vcc} mV | VBAT {vbat} mV | MPPT Mode {mppt_mode}") - header_str = f"Channel | Input U [mV] | Input I [mA] | U Boost [mV] | Power [?]" + header_str = ( + f"Channel | Input U [mV] | Input I [mA] | U Boost [mV] | Power [mW]" + ) pw.dlog(header_str) for i in range(6): - pw.dlog(f"{i} | {voltages[i]} | {currents[i]} | {vboosts[i]} | {powers[i]}") - pw.dlog(f"Temperatures in C: Ch0 {tmp0} | Ch1 {tmp1} | Ch2 {tmp2}") + pw.dlog( + f"{i} | {str(voltages[i]).ljust(4)} | {str(currents[i]).ljust(4)} | {str(vboosts[i]).ljust(4)} | {str(powers[i]).ljust(2)}" + ) pw.dlog( - f"Boot Count {bootcnt} | Uptime {uptime} | " + f"Temperatures in C: Ch0 {tmp0/10.0} | Ch1 {tmp1/10.0} | Ch2 {tmp2/10.0}" + ) + pw.dlog( + f"Boot Count {bootcnt} | Uptime {uptime} sec | " f"MPPT Time {mppt_time} msec | MPPT Period {mppt_period} msec" ) printer.print_validity_buffer( diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index a7178b0..81166da 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -15,7 +15,7 @@ from pus_tm.devs.bpx_bat import handle_bpx_hk_data from pus_tm.devs.gps import handle_gps_data from pus_tm.devs.gyros import handle_gyros_hk_data from pus_tm.devs.imtq_mgt import handle_self_test_data -from pus_tm.devs.pcdu import handle_pdu_data, handle_p60_hk_data +from pus_tm.devs.pcdu import handle_pdu_data, handle_p60_hk_data, handle_acu_hk_data from pus_tm.devs.syrlinks import handle_syrlinks_hk_data from pus_tc.devs.imtq import ImtqSetIds from pus_tm.devs.reaction_wheels import handle_rw_hk_data @@ -92,6 +92,8 @@ def handle_regular_hk_print( return handle_pdu_data( printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data ) + if objb == obj_ids.ACU_HANDLER_ID: + return handle_acu_hk_data(printer=printer, hk_data=hk_data, set_id=set_id) if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: return handle_rw_hk_data( printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data From b9de13ffe7a4f8112e2e7732049816833f89d17d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 14:04:34 +0200 Subject: [PATCH 037/132] something not working --- pus_tm/devs/pcdu.py | 13 ++++++++----- pus_tm/hk_handling.py | 17 +++++++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/pus_tm/devs/pcdu.py b/pus_tm/devs/pcdu.py index c97bf5a..de62cb3 100644 --- a/pus_tm/devs/pcdu.py +++ b/pus_tm/devs/pcdu.py @@ -89,11 +89,13 @@ class WdtInfo: class DevicesInfoParser: - def __int__(self): - self.dev_types = [] - self.dev_statuses = [] + def __init__(self): + self.dev_types = None + self.dev_statuses = None def parse(self, hk_data: bytes, current_idx: int) -> int: + self.dev_types = [] + self.dev_statuses = [] for idx in range(8): self.dev_types.append(hk_data[current_idx]) current_idx += 1 @@ -356,7 +358,8 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): pw.dlog(header_str) for i in range(6): pw.dlog( - f"{i} | {str(voltages[i]).ljust(4)} | {str(currents[i]).ljust(4)} | {str(vboosts[i]).ljust(4)} | {str(powers[i]).ljust(2)}" + f"{i} | {str(voltages[i]).ljust(4)} | {str(currents[i]).ljust(4)} | " + f"{str(vboosts[i]).ljust(4)} | {str(powers[i]).ljust(2)}" ) pw.dlog( f"Temperatures in C: Ch0 {tmp0/10.0} | Ch1 {tmp1/10.0} | Ch2 {tmp2/10.0}" @@ -370,7 +373,7 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): ) if set_id == SetIds.ACU_AUX: current_idx = 0 - fmt_str = "!IBhHhh" + fmt_str = "!HHH" inc_len = struct.calcsize(fmt_str) (dac_enb0, dac_enb1, dac_enb2) = struct.unpack( fmt_str, hk_data[current_idx : current_idx + inc_len] diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 81166da..b67299f 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -48,12 +48,17 @@ def handle_hk_packet( set_id=tm_packet.set_id, hk_data=hk_data, ) - handle_regular_hk_print( - printer=printer, - object_id=named_obj_id, - hk_packet=tm_packet, - hk_data=hk_data, - ) + try: + handle_regular_hk_print( + printer=printer, + object_id=named_obj_id, + hk_packet=tm_packet, + hk_data=hk_data, + ) + except ValueError as e: + LOGGER.exception( + f"{e} error when parsing HK data coming from {named_obj_id}" + ) if tm_packet.subservice == 10 or tm_packet.subservice == 12: LOGGER.warning("HK definitions printout not implemented yet") From bcaac870c1f0c28e3a498a01c5cb0335af73b5c5 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Mon, 23 May 2022 15:28:41 +0200 Subject: [PATCH 038/132] changed tcs and acs tv test proc --- pus_tc/system/proc.py | 97 +++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 31 deletions(-) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 0837ad8..1cf7a1f 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -15,11 +15,14 @@ import config.object_ids as oids from pus_tc.devs.bpx_batt import BpxSetIds from pus_tc.system.core import SetIds as CoreSetIds from gomspace.gomspace_common import SetIds as GsSetIds -from pus_tc.devs.rad_sensor import CommandIds as RadSetIds +from pus_tc.devs.rad_sensor import SetIds as RadSetIds from pus_tc.devs.mgms import MgmLis3SetIds as MgmSetIds_0_2 from pus_tc.devs.mgms import MgmRm3100SetIds as MgmSetIds_1_3 from pus_tc.devs.gyros import AdisGyroSetIds as GyroSetIds_0_2 from pus_tc.devs.gyros import L3gGyroSetIds as GyroSetIds_1_3 +from pus_tc.devs.gps import Gnss0SetIds as GnssSetIds_0 +from pus_tc.devs.gps import Gnss1SetIds as GnssSetIds_1 +from pus_tc.devs.imtq import ImtqSetIds from pus_tc.system.tcs import pack_tcs_sys_commands @@ -33,8 +36,11 @@ class OpCodes: CORE_FT = ["core-ft"] PCDU_FT = ["pcdu-ft"] RAD_SEN_FT = ["rad-sen-ft"] - TCS_FT = ["tcs-ft-on"] + TCS_FT_ON = ["tcs-ft-on"] + TCS_FT_OFF = ["tcs-ft-off"] ACS_FT = ["acs-ft"] + MGT_FT = ["mgt-ft"] + MGT_FT_DP = ["mgt-ft-dp"] class KeyAndInfo: @@ -43,8 +49,11 @@ class KeyAndInfo: CORE_FT = ["OBC", "OBC functional test"] PCDU_FT = ["PCDU", "PCDU functional test"] RAD_SEN_FT = ["Radiation Sensor", "Radiation Sensor functional test"] - TCS_FT = ["TCS", "TCS functional test"] + TCS_FT_ON = ["TCS Act.", "TCS functional test activation"] + TCS_FT_OFF = ["TCS Deact.", "TCS functional test deactivation"] ACS_FT = ["ACS", "ACS functional test"] + MGT_FT = ["MGT", "MGT functional test"] + MGT_FT_DP = ["MGT dipole", "MGT functional test with dipole"] KAI = KeyAndInfo @@ -54,8 +63,9 @@ PROC_INFO_DICT = { KAI.CORE_FT[0]: [OpCodes.CORE_FT, KAI.CORE_FT[1], 120.0, 10.0], KAI.PCDU_FT[0]: [OpCodes.PCDU_FT, KAI.PCDU_FT[1], 120.0, 10.0], KAI.RAD_SEN_FT[0]: [OpCodes.RAD_SEN_FT, KAI.RAD_SEN_FT[1], 120.0, 10.0], - KAI.TCS_FT[0]: [OpCodes.TCS_FT, KAI.TCS_FT[1], 1800.0, 10.0], - KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0] + KAI.TCS_FT_ON[0]: [OpCodes.TCS_FT_ON, KAI.TCS_FT_ON[1], 120.0, 10.0], + KAI.TCS_FT_OFF[0]: [OpCodes.TCS_FT_OFF, KAI.TCS_FT_OFF[1], 120.0, 10.0], + KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0], } @@ -97,8 +107,6 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) -# PCDU - if op_code in OpCodes.PCDU_FT: key = KAI.PCDU_FT[0] @@ -118,8 +126,6 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - -# AUX und 2er sid = make_sid(oids.P60_DOCK_HANDLER, GsSetIds.P60_AUX) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -135,24 +141,17 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.RAD_SEN_FT: key = KAI.RAD_SEN_FT[0] - sid = make_sid(oids.RAD_SENSOR_ID, RadSetIds.READ_CONVERSIONS) + sid = make_sid(oids.RAD_SENSOR_ID, RadSetIds.RAD_SEN_CORE) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - if op_code in OpCodes.TCS_FT: -# does not work with .WAIT - pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-normal") + if op_code in OpCodes.TCS_FT_ON: + # pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-normal") pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") - key = KAI.TCS_FT[0] -# Ids for TCS Board missing. No HK generation? - sid = make_sid(oids.TCS_BOARD_ASS_ID, RadSetIds.READ_CONVERSIONS) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - - pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-off") + if op_code in OpCodes.TCS_FT_OFF: + # pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-off") pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") if op_code in OpCodes.ACS_FT: @@ -160,6 +159,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_acs_command(tc_queue=tc_queue, op_code="acs-a") +# MGMs sid = make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -168,7 +168,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - +# Gyros sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -181,14 +181,17 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - -# GNSS0 missing - +# GNSS0 + sid = make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") tc_queue.appendleft((QueueCommands.WAIT, 5.0)) pack_acs_command(tc_queue=tc_queue, op_code="acs-b") +# MGMs sid = make_sid(oids.MGM_2_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -197,7 +200,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - +# Gyros sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -210,13 +213,17 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - -# GNSS1 missing +#GNSS1 + sid = make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") tc_queue.appendleft((QueueCommands.WAIT, 5.0)) pack_acs_command(tc_queue=tc_queue, op_code="acs-d") +# MGMs sid = make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -233,7 +240,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - +# Gyros sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -258,11 +265,39 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - -# GNSS0+1 missing +# GNSS0+1 + sid = make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") + if op_code in OpCodes.MGT_FT: + key = KAI.MGT_FT[0] + + sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + + +# mgt 1: imtq und hk +# mgt 2.: imtq + dual side + dipole + + def listen_to_hk_for_x_seconds( tc_queue: TcQueueT, From 314071de1c8578d5e6c5f21c8c0e20d4baad0e3a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 15:38:05 +0200 Subject: [PATCH 039/132] rad sensor data --- pus_tm/devs/rad_sensor.py | 5 +++++ pus_tm/hk_handling.py | 3 +++ tmtccmd | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 pus_tm/devs/rad_sensor.py diff --git a/pus_tm/devs/rad_sensor.py b/pus_tm/devs/rad_sensor.py new file mode 100644 index 0000000..91e6752 --- /dev/null +++ b/pus_tm/devs/rad_sensor.py @@ -0,0 +1,5 @@ +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter + + +def handle_rad_sensor_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + pass diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index a7178b0..02f3866 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -1,6 +1,7 @@ """HK Handling for EIVE OBSW""" import struct +from pus_tm.devs.rad_sensor import handle_rad_sensor_data from pus_tm.system.tcs import handle_thermal_controller_hk_data, TM_TCP_SERVER from tmtccmd.config.definitions import HkReplyUnpacked from tmtccmd.tm.pus_3_fsfw_hk import ( @@ -92,6 +93,8 @@ def handle_regular_hk_print( return handle_pdu_data( printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data ) + if objb == obj_ids.RAD_SENSOR_ID: + return handle_rad_sensor_data(printer=printer, hk_data=hk_data, set_id=set_id) if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: return handle_rw_hk_data( printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data diff --git a/tmtccmd b/tmtccmd index 4fbbf12..0e193f9 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 4fbbf129e140e593b1cc54a0361fa20cc8726789 +Subproject commit 0e193f9c76973a6105926ed133b179f8ea467981 From 2506d911de2e5dba34c54dc15962726a18bef6d7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 15:49:21 +0200 Subject: [PATCH 040/132] rad sensor HK parsing --- pus_tc/devs/rad_sensor.py | 4 ++++ pus_tm/devs/rad_sensor.py | 21 ++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pus_tc/devs/rad_sensor.py b/pus_tc/devs/rad_sensor.py index 8fe63b4..30c6d24 100644 --- a/pus_tc/devs/rad_sensor.py +++ b/pus_tc/devs/rad_sensor.py @@ -14,6 +14,10 @@ from spacepackets.ecss.tc import PusTelecommand from pus_tc.service_200_mode import pack_mode_data, Modes +class SetIds: + HK = 3 + + class CommandIds: START_CONVERSIONS = 2 READ_CONVERSIONS = 3 diff --git a/pus_tm/devs/rad_sensor.py b/pus_tm/devs/rad_sensor.py index 91e6752..998f0fd 100644 --- a/pus_tm/devs/rad_sensor.py +++ b/pus_tm/devs/rad_sensor.py @@ -1,5 +1,24 @@ +import struct + +from pus_tm.defs import PrintWrapper from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter +from pus_tc.devs.rad_sensor import SetIds def handle_rad_sensor_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): - pass + if set_id == SetIds.HK: + pw = PrintWrapper(printer) + current_idx = 0 + pw.dlog("Received Radiation Sensor HK data") + fmt_str = "!fHHHHHH" + inc_len = struct.calcsize(fmt_str) + (temp, ain0, ain1, ain4, ain5, ain6, ain7) = struct.unpack( + fmt_str, hk_data[current_idx : current_idx + inc_len] + ) + ain_dict = {{0: ain0}, {1: ain1}, {4: ain4}, {5: ain5}, {6: ain6}, {7: ain7}} + pw.dlog(f"Temperature: {temp} C") + pw.dlog(f"AIN Channel | Raw Value (hex) | Raw Value (dec)") + for idx, val in ain_dict: + pw.dlog(f"{idx} | {val:#04x} | {str(val).ljust(5)}") + current_idx += inc_len + printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=7) From 648e0b781483119e17799e34d669f554559692f0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 16:11:55 +0200 Subject: [PATCH 041/132] bump tmtccmd --- tmtccmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtccmd b/tmtccmd index b031eef..0e193f9 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit b031eefe4aea7829e5aa2051e7493472529e6d2d +Subproject commit 0e193f9c76973a6105926ed133b179f8ea467981 From 8eae5a42788c441b64ceb11ca278770f8ea2079e Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Mon, 23 May 2022 16:38:44 +0200 Subject: [PATCH 042/132] command to continue failed mpsoc update --- config/events.csv | 407 ++++++------ config/objects.csv | 10 - config/returnvalues.csv | 1112 ++++++++++++++++---------------- pus_tc/cmd_definitions.py | 36 +- pus_tc/devs/ploc_supervisor.py | 6 + 5 files changed, 766 insertions(+), 805 deletions(-) diff --git a/config/events.csv b/config/events.csv index c16f83f..8e38379 100644 --- a/config/events.csv +++ b/config/events.csv @@ -1,204 +1,203 @@ -2200;0x0898;STORE_SEND_WRITE_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2201;0x0899;STORE_WRITE_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2202;0x089a;STORE_SEND_READ_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2203;0x089b;STORE_READ_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2204;0x089c;UNEXPECTED_MSG;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2205;0x089d;STORING_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2206;0x089e;TM_DUMP_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2207;0x089f;STORE_INIT_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2208;0x08a0;STORE_INIT_EMPTY;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2209;0x08a1;STORE_CONTENT_CORRUPTED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2210;0x08a2;STORE_INITIALIZE;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2211;0x08a3;INIT_DONE;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2212;0x08a4;DUMP_FINISHED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2213;0x08a5;DELETION_FINISHED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2214;0x08a6;DELETION_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2215;0x08a7;AUTO_CATALOGS_SENDING_FAILED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2600;0x0a28;GET_DATA_FAILED;LOW;;fsfw/src/fsfw/storagemanager/StorageManagerIF.h -2601;0x0a29;STORE_DATA_FAILED;LOW;;fsfw/src/fsfw/storagemanager/StorageManagerIF.h -2800;0x0af0;DEVICE_BUILDING_COMMAND_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2801;0x0af1;DEVICE_SENDING_COMMAND_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2802;0x0af2;DEVICE_REQUESTING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2803;0x0af3;DEVICE_READING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2804;0x0af4;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2805;0x0af5;DEVICE_MISSED_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2806;0x0af6;DEVICE_UNKNOWN_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2807;0x0af7;DEVICE_UNREQUESTED_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2808;0x0af8;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2809;0x0af9;MONITORING_LIMIT_EXCEEDED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2810;0x0afa;MONITORING_AMBIGUOUS;HIGH;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2811;0x0afb;DEVICE_WANTS_HARD_REBOOT;HIGH;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -4201;0x1069;FUSE_CURRENT_HIGH;LOW;;fsfw/src/fsfw/power/Fuse.h -4202;0x106a;FUSE_WENT_OFF;LOW;;fsfw/src/fsfw/power/Fuse.h -4204;0x106c;POWER_ABOVE_HIGH_LIMIT;LOW;;fsfw/src/fsfw/power/Fuse.h -4205;0x106d;POWER_BELOW_LOW_LIMIT;LOW;;fsfw/src/fsfw/power/Fuse.h -4300;0x10cc;SWITCH_WENT_OFF;LOW;;fsfw/src/fsfw/power/PowerSwitchIF.h -5000;0x1388;HEATER_ON;INFO;;fsfw/src/fsfw/thermal/Heater.h -5001;0x1389;HEATER_OFF;INFO;;fsfw/src/fsfw/thermal/Heater.h -5002;0x138a;HEATER_TIMEOUT;LOW;;fsfw/src/fsfw/thermal/Heater.h -5003;0x138b;HEATER_STAYED_ON;LOW;;fsfw/src/fsfw/thermal/Heater.h -5004;0x138c;HEATER_STAYED_OFF;LOW;;fsfw/src/fsfw/thermal/Heater.h -5200;0x1450;TEMP_SENSOR_HIGH;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h -5201;0x1451;TEMP_SENSOR_LOW;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h -5202;0x1452;TEMP_SENSOR_GRADIENT;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h -5901;0x170d;COMPONENT_TEMP_LOW;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h -5902;0x170e;COMPONENT_TEMP_HIGH;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h -5903;0x170f;COMPONENT_TEMP_OOL_LOW;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h -5904;0x1710;COMPONENT_TEMP_OOL_HIGH;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h -5905;0x1711;TEMP_NOT_IN_OP_RANGE;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h -7101;0x1bbd;FDIR_CHANGED_STATE;INFO;;fsfw/src/fsfw/fdir/FailureIsolationBase.h -7102;0x1bbe;FDIR_STARTS_RECOVERY;MEDIUM;;fsfw/src/fsfw/fdir/FailureIsolationBase.h -7103;0x1bbf;FDIR_TURNS_OFF_DEVICE;MEDIUM;;fsfw/src/fsfw/fdir/FailureIsolationBase.h -7201;0x1c21;MONITOR_CHANGED_STATE;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h -7202;0x1c22;VALUE_BELOW_LOW_LIMIT;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h -7203;0x1c23;VALUE_ABOVE_HIGH_LIMIT;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h -7204;0x1c24;VALUE_OUT_OF_RANGE;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h -7400;0x1ce8;CHANGING_MODE;INFO;;fsfw/src/fsfw/modes/HasModesIF.h -7401;0x1ce9;MODE_INFO;INFO;;fsfw/src/fsfw/modes/HasModesIF.h -7402;0x1cea;FALLBACK_FAILED;HIGH;;fsfw/src/fsfw/modes/HasModesIF.h -7403;0x1ceb;MODE_TRANSITION_FAILED;LOW;;fsfw/src/fsfw/modes/HasModesIF.h -7404;0x1cec;CANT_KEEP_MODE;HIGH;;fsfw/src/fsfw/modes/HasModesIF.h -7405;0x1ced;OBJECT_IN_INVALID_MODE;LOW;;fsfw/src/fsfw/modes/HasModesIF.h -7406;0x1cee;FORCING_MODE;MEDIUM;;fsfw/src/fsfw/modes/HasModesIF.h -7407;0x1cef;MODE_CMD_REJECTED;LOW;;fsfw/src/fsfw/modes/HasModesIF.h -7506;0x1d52;HEALTH_INFO;INFO;;fsfw/src/fsfw/health/HasHealthIF.h -7507;0x1d53;CHILD_CHANGED_HEALTH;INFO;;fsfw/src/fsfw/health/HasHealthIF.h -7508;0x1d54;CHILD_PROBLEMS;LOW;;fsfw/src/fsfw/health/HasHealthIF.h -7509;0x1d55;OVERWRITING_HEALTH;LOW;;fsfw/src/fsfw/health/HasHealthIF.h -7510;0x1d56;TRYING_RECOVERY;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h -7511;0x1d57;RECOVERY_STEP;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h -7512;0x1d58;RECOVERY_DONE;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h -7900;0x1edc;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -7901;0x1edd;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -8900;0x22c4;CLOCK_SET;INFO;;fsfw/src/fsfw/pus/Service9TimeManagement.h -8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw/src/fsfw/pus/Service9TimeManagement.h -9700;0x25e4;TEST;INFO;;fsfw/src/fsfw/pus/Service17Test.h -10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h -11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h -11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h -11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h -11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h -11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission/devices/HeaterHandler.h -11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;;mission/devices/HeaterHandler.h -11402;0x2c8a;HEATER_WENT_ON;INFO;;mission/devices/HeaterHandler.h -11403;0x2c8b;HEATER_WENT_OFF;INFO;;mission/devices/HeaterHandler.h -11404;0x2c8c;SWITCH_ALREADY_ON;LOW;;mission/devices/HeaterHandler.h -11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;;mission/devices/HeaterHandler.h -11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;;mission/devices/HeaterHandler.h -11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;;mission/devices/HeaterHandler.h -11500;0x2cec;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h -11501;0x2ced;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h -11502;0x2cee;DEPLOYMENT_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h -11503;0x2cef;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h -11504;0x2cf0;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h -11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/devices/ploc/PlocMPSoCHandler.h -11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h -11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h -11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/devices/ploc/PlocMPSoCHandler.h -11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHandler.h -11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/devices/ploc/PlocMPSoCHandler.h -11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h -11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h -11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h -11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h -11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h -11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h -11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h -11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/IMTQHandler.h -11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/RwDefinitions.h -11802;0x2e1a;RESET_OCCURED;LOW;;mission/devices/devicedefinitions/RwDefinitions.h -11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h -11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h -12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h -12002;0x2ee2;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/devices/ploc/PlocSupervisorHandler.h -12003;0x2ee3;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/devices/ploc/PlocSupervisorHandler.h -12004;0x2ee4;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/devices/ploc/PlocSupervisorHandler.h -12005;0x2ee5;SUPV_MPSOC_SHUWDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/devices/ploc/PlocSupervisorHandler.h -12100;0x2f44;SANITIZATION_FAILED;LOW;;bsp_q7s/memory/SdCardManager.h -12101;0x2f45;MOUNTED_SD_CARD;INFO;;bsp_q7s/memory/SdCardManager.h -12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/devices/ploc/PlocMemoryDumper.h -12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/devices/ploc/PlocMemoryDumper.h -12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/devices/ploc/PlocMemoryDumper.h -12401;0x3071;INVALID_TC_FRAME;HIGH;;linux/obc/PdecHandler.h -12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/obc/PdecHandler.h -12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/obc/PdecHandler.h -12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/obc/PdecHandler.h -12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h -12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h -12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h -12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/devices/startracker/StrHelper.h -12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/devices/startracker/StrHelper.h -12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/devices/startracker/StrHelper.h -12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/devices/startracker/StrHelper.h -12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/devices/startracker/StrHelper.h -12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/devices/startracker/StrHelper.h -12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h -12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h -12511;0x30df;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux/devices/startracker/StrHelper.h -12512;0x30e0;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/devices/startracker/StrHelper.h -12513;0x30e1;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/devices/startracker/StrHelper.h -12514;0x30e2;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/devices/startracker/StrHelper.h -12515;0x30e3;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux/devices/startracker/StrHelper.h -12516;0x30e4;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux/devices/startracker/StrHelper.h -12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/devices/ploc/PlocMPSoCHelper.h -12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/devices/ploc/PlocMPSoCHelper.h -12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;;linux/devices/ploc/PlocMPSoCHelper.h -12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHelper.h -12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/devices/PayloadPcduHandler.h -12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission/system/AcsBoardAssembly.h -12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/AcsBoardAssembly.h -12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/AcsBoardAssembly.h -12803;0x3203;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/AcsBoardAssembly.h -12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission/system/SusAssembly.h -12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/SusAssembly.h -12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/SusAssembly.h -12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/SusAssembly.h -13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;;mission/system/TcsBoardAssembly.h -13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/devices/devicedefinitions/GPSDefinitions.h -13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/devices/P60DockHandler.h -13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/devices/P60DockHandler.h -13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/devices/P60DockHandler.h -13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux/devices/ploc/PlocSupvHelper.h -13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux/devices/ploc/PlocSupvHelper.h -13602;0x3522;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux/devices/ploc/PlocSupvHelper.h -13603;0x3523;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux/devices/ploc/PlocSupvHelper.h -13604;0x3524;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux/devices/ploc/PlocSupvHelper.h -13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux/devices/ploc/PlocSupvHelper.h -13606;0x3526;SUPV_SENDING_COMMAND_FAILED;LOW;;linux/devices/ploc/PlocSupvHelper.h -13607;0x3527;SUPV_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h -13608;0x3528;SUPV_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h -13609;0x3529;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocSupvHelper.h -13610;0x352a;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h -13611;0x352b;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h -13612;0x352c;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux/devices/ploc/PlocSupvHelper.h -13613;0x352d;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h -13614;0x352e;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvHelper.h -13615;0x352f;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux/devices/ploc/PlocSupvHelper.h -13616;0x3530;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux/devices/ploc/PlocSupvHelper.h -13617;0x3531;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet with number P1 P1: Packet number for which the memory write command fails;linux/devices/ploc/PlocSupvHelper.h -13700;0x3584;ALLOC_FAILURE;MEDIUM;;bsp_q7s/core/CoreController.h -13701;0x3585;REBOOT_SW;MEDIUM; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h -13702;0x3586;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s/core/CoreController.h -13703;0x3587;REBOOT_HW;MEDIUM;;bsp_q7s/core/CoreController.h +2200;0x0898;STORE_SEND_WRITE_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2201;0x0899;STORE_WRITE_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2202;0x089a;STORE_SEND_READ_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2203;0x089b;STORE_READ_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2204;0x089c;UNEXPECTED_MSG;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2205;0x089d;STORING_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2206;0x089e;TM_DUMP_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2207;0x089f;STORE_INIT_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2208;0x08a0;STORE_INIT_EMPTY;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2209;0x08a1;STORE_CONTENT_CORRUPTED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2210;0x08a2;STORE_INITIALIZE;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2211;0x08a3;INIT_DONE;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2212;0x08a4;DUMP_FINISHED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2213;0x08a5;DELETION_FINISHED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2214;0x08a6;DELETION_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2215;0x08a7;AUTO_CATALOGS_SENDING_FAILED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h +2600;0x0a28;GET_DATA_FAILED;LOW;;fsfw\src\fsfw\storagemanager\StorageManagerIF.h +2601;0x0a29;STORE_DATA_FAILED;LOW;;fsfw\src\fsfw\storagemanager\StorageManagerIF.h +2800;0x0af0;DEVICE_BUILDING_COMMAND_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2801;0x0af1;DEVICE_SENDING_COMMAND_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2802;0x0af2;DEVICE_REQUESTING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2803;0x0af3;DEVICE_READING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2804;0x0af4;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2805;0x0af5;DEVICE_MISSED_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2806;0x0af6;DEVICE_UNKNOWN_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2807;0x0af7;DEVICE_UNREQUESTED_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2808;0x0af8;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2809;0x0af9;MONITORING_LIMIT_EXCEEDED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2810;0x0afa;MONITORING_AMBIGUOUS;HIGH;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +2811;0x0afb;DEVICE_WANTS_HARD_REBOOT;HIGH;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h +4201;0x1069;FUSE_CURRENT_HIGH;LOW;;fsfw\src\fsfw\power\Fuse.h +4202;0x106a;FUSE_WENT_OFF;LOW;;fsfw\src\fsfw\power\Fuse.h +4204;0x106c;POWER_ABOVE_HIGH_LIMIT;LOW;;fsfw\src\fsfw\power\Fuse.h +4205;0x106d;POWER_BELOW_LOW_LIMIT;LOW;;fsfw\src\fsfw\power\Fuse.h +4300;0x10cc;SWITCH_WENT_OFF;LOW;;fsfw\src\fsfw\power\PowerSwitchIF.h +5000;0x1388;HEATER_ON;INFO;;fsfw\src\fsfw\thermal\Heater.h +5001;0x1389;HEATER_OFF;INFO;;fsfw\src\fsfw\thermal\Heater.h +5002;0x138a;HEATER_TIMEOUT;LOW;;fsfw\src\fsfw\thermal\Heater.h +5003;0x138b;HEATER_STAYED_ON;LOW;;fsfw\src\fsfw\thermal\Heater.h +5004;0x138c;HEATER_STAYED_OFF;LOW;;fsfw\src\fsfw\thermal\Heater.h +5200;0x1450;TEMP_SENSOR_HIGH;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h +5201;0x1451;TEMP_SENSOR_LOW;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h +5202;0x1452;TEMP_SENSOR_GRADIENT;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h +5901;0x170d;COMPONENT_TEMP_LOW;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h +5902;0x170e;COMPONENT_TEMP_HIGH;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h +5903;0x170f;COMPONENT_TEMP_OOL_LOW;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h +5904;0x1710;COMPONENT_TEMP_OOL_HIGH;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h +5905;0x1711;TEMP_NOT_IN_OP_RANGE;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h +7101;0x1bbd;FDIR_CHANGED_STATE;INFO;;fsfw\src\fsfw\fdir\FailureIsolationBase.h +7102;0x1bbe;FDIR_STARTS_RECOVERY;MEDIUM;;fsfw\src\fsfw\fdir\FailureIsolationBase.h +7103;0x1bbf;FDIR_TURNS_OFF_DEVICE;MEDIUM;;fsfw\src\fsfw\fdir\FailureIsolationBase.h +7201;0x1c21;MONITOR_CHANGED_STATE;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h +7202;0x1c22;VALUE_BELOW_LOW_LIMIT;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h +7203;0x1c23;VALUE_ABOVE_HIGH_LIMIT;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h +7204;0x1c24;VALUE_OUT_OF_RANGE;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h +7400;0x1ce8;CHANGING_MODE;INFO;;fsfw\src\fsfw\modes\HasModesIF.h +7401;0x1ce9;MODE_INFO;INFO;;fsfw\src\fsfw\modes\HasModesIF.h +7402;0x1cea;FALLBACK_FAILED;HIGH;;fsfw\src\fsfw\modes\HasModesIF.h +7403;0x1ceb;MODE_TRANSITION_FAILED;LOW;;fsfw\src\fsfw\modes\HasModesIF.h +7404;0x1cec;CANT_KEEP_MODE;HIGH;;fsfw\src\fsfw\modes\HasModesIF.h +7405;0x1ced;OBJECT_IN_INVALID_MODE;LOW;;fsfw\src\fsfw\modes\HasModesIF.h +7406;0x1cee;FORCING_MODE;MEDIUM;;fsfw\src\fsfw\modes\HasModesIF.h +7407;0x1cef;MODE_CMD_REJECTED;LOW;;fsfw\src\fsfw\modes\HasModesIF.h +7506;0x1d52;HEALTH_INFO;INFO;;fsfw\src\fsfw\health\HasHealthIF.h +7507;0x1d53;CHILD_CHANGED_HEALTH;INFO;;fsfw\src\fsfw\health\HasHealthIF.h +7508;0x1d54;CHILD_PROBLEMS;LOW;;fsfw\src\fsfw\health\HasHealthIF.h +7509;0x1d55;OVERWRITING_HEALTH;LOW;;fsfw\src\fsfw\health\HasHealthIF.h +7510;0x1d56;TRYING_RECOVERY;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h +7511;0x1d57;RECOVERY_STEP;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h +7512;0x1d58;RECOVERY_DONE;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h +7900;0x1edc;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h +7901;0x1edd;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h +7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h +7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h +7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h +8900;0x22c4;CLOCK_SET;INFO;;fsfw\src\fsfw\pus\Service9TimeManagement.h +8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw\src\fsfw\pus\Service9TimeManagement.h +9700;0x25e4;TEST;INFO;;fsfw\src\fsfw\pus\Service17Test.h +10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw\hal\src\fsfw_hal\devicehandlers\MgmLIS3MDLHandler.h +11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission\devices\devicedefinitions\powerDefinitions.h +11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission\devices\devicedefinitions\powerDefinitions.h +11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;;mission\devices\devicedefinitions\powerDefinitions.h +11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;;mission\devices\devicedefinitions\powerDefinitions.h +11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission\devices\HeaterHandler.h +11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;;mission\devices\HeaterHandler.h +11402;0x2c8a;SWITCH_ALREADY_ON;LOW;;mission\devices\HeaterHandler.h +11403;0x2c8b;SWITCH_ALREADY_OFF;LOW;;mission\devices\HeaterHandler.h +11404;0x2c8c;MAIN_SWITCH_TIMEOUT;LOW;;mission\devices\HeaterHandler.h +11500;0x2cec;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h +11501;0x2ced;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h +11502;0x2cee;DEPLOYMENT_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h +11503;0x2cef;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h +11504;0x2cf0;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h +11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux\devices\ploc\PlocMPSoCHandler.h +11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux\devices\ploc\PlocMPSoCHandler.h +11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux\devices\ploc\PlocMPSoCHandler.h +11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux\devices\ploc\PlocMPSoCHandler.h +11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux\devices\ploc\PlocMPSoCHandler.h +11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux\devices\ploc\PlocMPSoCHandler.h +11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h +11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h +11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h +11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h +11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h +11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h +11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h +11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission\devices\IMTQHandler.h +11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission\devices\devicedefinitions\RwDefinitions.h +11802;0x2e1a;RESET_OCCURED;LOW;;mission\devices\devicedefinitions\RwDefinitions.h +11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux\devices\startracker\StarTrackerHandler.h +11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux\devices\startracker\StarTrackerHandler.h +12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux\devices\ploc\PlocSupervisorHandler.h +12002;0x2ee2;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux\devices\ploc\PlocSupervisorHandler.h +12003;0x2ee3;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux\devices\ploc\PlocSupervisorHandler.h +12004;0x2ee4;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux\devices\ploc\PlocSupervisorHandler.h +12005;0x2ee5;SUPV_MPSOC_SHUWDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux\devices\ploc\PlocSupervisorHandler.h +12100;0x2f44;SANITIZATION_FAILED;LOW;;bsp_q7s\memory\SdCardManager.h +12101;0x2f45;MOUNTED_SD_CARD;INFO;;bsp_q7s\memory\SdCardManager.h +12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux\devices\ploc\PlocMemoryDumper.h +12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux\devices\ploc\PlocMemoryDumper.h +12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux\devices\ploc\PlocMemoryDumper.h +12401;0x3071;INVALID_TC_FRAME;HIGH;;linux\obc\PdecHandler.h +12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux\obc\PdecHandler.h +12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux\obc\PdecHandler.h +12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux\obc\PdecHandler.h +12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux\devices\startracker\StrHelper.h +12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux\devices\startracker\StrHelper.h +12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux\devices\startracker\StrHelper.h +12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux\devices\startracker\StrHelper.h +12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux\devices\startracker\StrHelper.h +12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux\devices\startracker\StrHelper.h +12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux\devices\startracker\StrHelper.h +12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux\devices\startracker\StrHelper.h +12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux\devices\startracker\StrHelper.h +12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux\devices\startracker\StrHelper.h +12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux\devices\startracker\StrHelper.h +12511;0x30df;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux\devices\startracker\StrHelper.h +12512;0x30e0;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux\devices\startracker\StrHelper.h +12513;0x30e1;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux\devices\startracker\StrHelper.h +12514;0x30e2;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux\devices\startracker\StrHelper.h +12515;0x30e3;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux\devices\startracker\StrHelper.h +12516;0x30e4;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux\devices\startracker\StrHelper.h +12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux\devices\ploc\PlocMPSoCHelper.h +12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux\devices\ploc\PlocMPSoCHelper.h +12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;;linux\devices\ploc\PlocMPSoCHelper.h +12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h +12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h +12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h +12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h +12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h +12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h +12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h +12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h +12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux\devices\ploc\PlocMPSoCHelper.h +12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission\devices\PayloadPcduHandler.h +12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission\devices\PayloadPcduHandler.h +12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission\system\AcsBoardAssembly.h +12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission\system\AcsBoardAssembly.h +12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission\system\AcsBoardAssembly.h +12803;0x3203;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission\system\AcsBoardAssembly.h +12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission\system\SusAssembly.h +12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission\system\SusAssembly.h +12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission\system\SusAssembly.h +12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission\system\SusAssembly.h +13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;;mission\system\TcsBoardAssembly.h +13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission\devices\devicedefinitions\GPSDefinitions.h +13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission\devices\P60DockHandler.h +13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission\devices\P60DockHandler.h +13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission\devices\P60DockHandler.h +13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux\devices\ploc\PlocSupvHelper.h +13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux\devices\ploc\PlocSupvHelper.h +13602;0x3522;SUPV_CONTINUE_UPDATE_FAILED;LOW;Continue update command failed;linux\devices\ploc\PlocSupvHelper.h +13603;0x3523;SUPV_CONTINUE_UPDATE_SUCCESSFUL;LOW;Continue update command successful;linux\devices\ploc\PlocSupvHelper.h +13604;0x3524;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux\devices\ploc\PlocSupvHelper.h +13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux\devices\ploc\PlocSupvHelper.h +13606;0x3526;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux\devices\ploc\PlocSupvHelper.h +13607;0x3527;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux\devices\ploc\PlocSupvHelper.h +13608;0x3528;SUPV_SENDING_COMMAND_FAILED;LOW;;linux\devices\ploc\PlocSupvHelper.h +13609;0x3529;SUPV_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h +13610;0x352a;SUPV_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h +13611;0x352b;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux\devices\ploc\PlocSupvHelper.h +13612;0x352c;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h +13613;0x352d;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h +13614;0x352e;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux\devices\ploc\PlocSupvHelper.h +13615;0x352f;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h +13616;0x3530;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux\devices\ploc\PlocSupvHelper.h +13617;0x3531;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux\devices\ploc\PlocSupvHelper.h +13618;0x3532;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux\devices\ploc\PlocSupvHelper.h +13619;0x3533;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet with number P1 P1: Packet number for which the memory write command fails;linux\devices\ploc\PlocSupvHelper.h +13700;0x3584;ALLOC_FAILURE;MEDIUM;;bsp_q7s\core\CoreController.h +13701;0x3585;REBOOT_SW;MEDIUM; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s\core\CoreController.h +13702;0x3586;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s\core\CoreController.h +13703;0x3587;REBOOT_HW;MEDIUM;;bsp_q7s\core\CoreController.h diff --git a/config/objects.csv b/config/objects.csv index 432a50b..22fed88 100644 --- a/config/objects.csv +++ b/config/objects.csv @@ -40,8 +40,6 @@ 0x44330001;PLOC_MEMORY_DUMPER 0x44330002;STR_HELPER 0x44330003;PLOC_MPSOC_HELPER -0x44330004;AXI_PTME_CONFIG -0x44330005;PTME_CONFIG 0x44330015;PLOC_MPSOC_HANDLER 0x44330016;PLOC_SUPERVISOR_HANDLER 0x44330017;PLOC_SUPERVISOR_HELPER @@ -111,14 +109,6 @@ 0x5400CAFE;DUMMY_INTERFACE 0x54123456;LIBGPIOD_TEST 0x54694269;TEST_TASK -0x60000000;HEATER_0_PLOC_PROC_BRD -0x60000001;HEATER_1_PCDU_BRD -0x60000002;HEATER_2_ACS_BRD -0x60000003;HEATER_3_OBC_BRD -0x60000004;HEATER_4_CAMERA -0x60000005;HEATER_5_STR -0x60000006;HEATER_6_DRO -0x60000007;HEATER_7_HPA 0x73000001;ACS_BOARD_ASS 0x73000002;SUS_BOARD_ASS 0x73000003;TCS_BOARD_ASS diff --git a/config/returnvalues.csv b/config/returnvalues.csv index b25649f..fef766e 100644 --- a/config/returnvalues.csv +++ b/config/returnvalues.csv @@ -1,558 +1,558 @@ 0x0;OK;System-wide code for ok.;RETURN_OK;HasReturnvaluesIF.h;HasReturnvaluesIF 0x1;Failed;Unspecified system-wide code for failed.;RETURN_FAILED;HasReturnvaluesIF.h;HasReturnvaluesIF -0x63a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;0xA0;mission/tmtc/CCSDSHandler.h;CCSDS_HANDLER -0x69a0;SADPL_CommandNotSupported;;0xA0;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x69a1;SADPL_DeploymentAlreadyExecuting;;0xA1;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x69a2;SADPL_MainSwitchTimeoutFailure;;0xA2;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x69a3;SADPL_SwitchingDeplSa1Failed;;0xA3;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x69a4;SADPL_SwitchingDeplSa2Failed;;0xA4;mission/devices/SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x5ba0;SUSS_ErrorUnlockMutex;;0xA0;mission/devices/SusHandler.h;SUS_HANDLER -0x5ba1;SUSS_ErrorLockMutex;;0xA1;mission/devices/SusHandler.h;SUS_HANDLER -0x55b0;RWHA_SpiWriteFailure;;0xB0;mission/devices/RwHandler.h;RW_HANDLER -0x55b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;0xB1;mission/devices/RwHandler.h;RW_HANDLER -0x55b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;0xB2;mission/devices/RwHandler.h;RW_HANDLER -0x55b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;0xB3;mission/devices/RwHandler.h;RW_HANDLER -0x55b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;0xB4;mission/devices/RwHandler.h;RW_HANDLER -0x55b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;0xB5;mission/devices/RwHandler.h;RW_HANDLER -0x55b6;RWHA_NoStartMarker;Expected a start marker as first byte;0xB6;mission/devices/RwHandler.h;RW_HANDLER -0x55a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000; 1000] or [1000; 65000];0xA0;mission/devices/RwHandler.h;RW_HANDLER -0x55a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;0xA1;mission/devices/RwHandler.h;RW_HANDLER -0x55a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;0xA2;mission/devices/RwHandler.h;RW_HANDLER -0x55a3;RWHA_ExecutionFailed;Command execution failed;0xA3;mission/devices/RwHandler.h;RW_HANDLER -0x55a4;RWHA_CrcError;Reaction wheel reply has invalid crc;0xA4;mission/devices/RwHandler.h;RW_HANDLER -0x54a0;IMTQ_InvalidCommandCode;;0xA0;mission/devices/IMTQHandler.h;IMTQ_HANDLER -0x54a1;IMTQ_ParameterMissing;;0xA1;mission/devices/IMTQHandler.h;IMTQ_HANDLER -0x54a2;IMTQ_ParameterInvalid;;0xA2;mission/devices/IMTQHandler.h;IMTQ_HANDLER -0x54a3;IMTQ_CcUnavailable;;0xA3;mission/devices/IMTQHandler.h;IMTQ_HANDLER -0x54a4;IMTQ_InternalProcessingError;;0xA4;mission/devices/IMTQHandler.h;IMTQ_HANDLER -0x54a5;IMTQ_RejectedWithoutReason;;0xA5;mission/devices/IMTQHandler.h;IMTQ_HANDLER -0x54a6;IMTQ_CmdErrUnknown;;0xA6;mission/devices/IMTQHandler.h;IMTQ_HANDLER -0x54a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;0xA7;mission/devices/IMTQHandler.h;IMTQ_HANDLER -0x52a1;HEATER_CommandNotSupported;;0xA1;mission/devices/HeaterHandler.h;HEATER_HANDLER -0x52a2;HEATER_InitFailed;;0xA2;mission/devices/HeaterHandler.h;HEATER_HANDLER -0x52a3;HEATER_InvalidSwitchNr;;0xA3;mission/devices/HeaterHandler.h;HEATER_HANDLER -0x52a4;HEATER_MainSwitchSetTimeout;;0xA4;mission/devices/HeaterHandler.h;HEATER_HANDLER -0x52a5;HEATER_CommandAlreadyWaiting;;0xA5;mission/devices/HeaterHandler.h;HEATER_HANDLER -0x6000;GOMS_PacketTooLong;;0;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6001;GOMS_InvalidTableId;;1;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6002;GOMS_InvalidAddress;;2;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6003;GOMS_InvalidParamSize;;3;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6004;GOMS_InvalidPayloadSize;;4;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6005;GOMS_UnknownReplyId;;5;mission/devices/GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x53a0;SYRLINKS_CrcFailure;;0xA0;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a1;SYRLINKS_UartFraminOrParityErrorAck;;0xA1;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a2;SYRLINKS_BadCharacterAck;;0xA2;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a3;SYRLINKS_BadParameterValueAck;;0xA3;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a4;SYRLINKS_BadEndOfFrameAck;;0xA4;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a5;SYRLINKS_UnknownCommandIdAck;;0xA5;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a6;SYRLINKS_BadCrcAck;;0xA6;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a7;SYRLINKS_ReplyWrongSize;;0xA7;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a8;SYRLINKS_MissingStartFrameCharacter;;0xA8;mission/devices/SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x66a0;NVMB_KeyNotExists;Specified key does not exist in json file;0xA0;mission/memory/NVMParameterBase.h;NVM_PARAM_BASE -0x4300; HSPI_OpeningFileFailed;;0;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI -0x4301; HSPI_FullDuplexTransferFailed;;1;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI -0x4302; HSPI_HalfDuplexTransferFailed;;2;fsfw/hal/src/fsfw_hal/linux/spi/SpiComIF.h;HAL_SPI -0x4401; HURT_UartReadFailure;;1;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART -0x4402; HURT_UartReadSizeMissmatch;;2;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART -0x4403; HURT_UartRxBufferTooSmall;;3;fsfw/hal/src/fsfw_hal/linux/uart/UartComIF.h;HAL_UART -0x4601; HGIO_UnknownGpioId;;1;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO -0x4602; HGIO_DriveGpioFailure;;2;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO -0x4603; HGIO_GpioTypeFailure;;3;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO -0x4604; HGIO_GpioInvalidInstance;;4;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO -0x4605; HGIO_GpioDuplicateDetected;;5;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO -0x4606; HGIO_GpioInitFailed;;6;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO -0x4607; HGIO_GpioGetValueFailed;;7;fsfw/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h;HAL_GPIO -0x4200; UXOS_ExecutionFinished;Execution of the current command has finished;0;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL -0x4201; UXOS_CommandPending;Command is pending. This will also be returned if the user tries to load another command but a command is still pending;1;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL -0x4202; UXOS_BytesRead;Some bytes have been read from the executing process;2;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL -0x4203; UXOS_CommandError;Command execution failed;3;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL -0x4204; UXOS_NoCommandLoadedOrPending;;4;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL -0x4206; UXOS_PcloseCallError;;6;fsfw/hal/src/fsfw_hal/linux/CommandExecutor.h;LINUX_OSAL -0x3b00; LPIF_PoolEntryNotFound;;0x00;fsfw/src/fsfw/datapoollocal/localPoolDefinitions.h;LOCAL_POOL_OWNER_IF -0x3b01; LPIF_PoolEntryTypeConflict;;0x01;fsfw/src/fsfw/datapoollocal/localPoolDefinitions.h;LOCAL_POOL_OWNER_IF -0x3d00; HKM_QueueOrDestinationInvalid;;0;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER -0x3d01; HKM_WrongHkPacketType;;1;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER -0x3d02; HKM_ReportingStatusUnchanged;;2;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER -0x3d03; HKM_PeriodicHelperInvalid;;3;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER -0x3d04; HKM_PoolobjectNotFound;;4;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER -0x3d05; HKM_DatasetNotFound;;5;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h;HOUSEKEEPING_MANAGER -0x3501; CFDP_InvalidTlvType;;1;fsfw/src/fsfw/cfdp/definitions.h;CFDP -0x3502; CFDP_InvalidDirectiveFields;;2;fsfw/src/fsfw/cfdp/definitions.h;CFDP -0x3503; CFDP_InvalidPduDatafieldLen;;3;fsfw/src/fsfw/cfdp/definitions.h;CFDP -0x3504; CFDP_InvalidAckDirectiveFields;;4;fsfw/src/fsfw/cfdp/definitions.h;CFDP -0x3505; CFDP_MetadataCantParseOptions;;5;fsfw/src/fsfw/cfdp/definitions.h;CFDP -0x3506; CFDP_FinishedCantParseFsResponses;;6;fsfw/src/fsfw/cfdp/definitions.h;CFDP -0x3508; CFDP_FilestoreRequiresSecondFile;;8;fsfw/src/fsfw/cfdp/definitions.h;CFDP -0x3509; CFDP_FilestoreResponseCantParseFsMessage;;9;fsfw/src/fsfw/cfdp/definitions.h;CFDP -0x3101; CF_ObjectHasNoFunctions;;1;fsfw/src/fsfw/action/CommandsActionsIF.h;COMMANDS_ACTIONS_IF -0x3102; CF_AlreadyCommanding;;2;fsfw/src/fsfw/action/CommandsActionsIF.h;COMMANDS_ACTIONS_IF -0x3201; HF_IsBusy;;1;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF -0x3202; HF_InvalidParameters;;2;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF -0x3203; HF_ExecutionFinished;;3;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF -0x3204; HF_InvalidActionId;;4;fsfw/src/fsfw/action/HasActionsIF.h;HAS_ACTIONS_IF -0x2d01; HPA_InvalidIdentifierId;;0x01;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF -0x2d02; HPA_InvalidDomainId;;0x02;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF -0x2d03; HPA_InvalidValue;;0x03;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF -0x2d05; HPA_ReadOnly;;0x05;fsfw/src/fsfw/parameters/HasParametersIF.h;HAS_PARAMETERS_IF -0x2c01; PAW_UnknownDatatype;;0x01;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER -0x2c02; PAW_DatatypeMissmatch;;0x02;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER -0x2c03; PAW_Readonly;;0x03;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER -0x2c04; PAW_TooBig;;0x04;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER -0x2c05; PAW_SourceNotSet;;0x05;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER -0x2c06; PAW_OutOfBounds;;0x06;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER -0x2c07; PAW_NotSet;;0x07;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER -0x2c08; PAW_ColumnOrRowsZero;;0x08;fsfw/src/fsfw/parameters/ParameterWrapper.h;PARAMETER_WRAPPER -0x1701; HHI_ObjectNotHealthy;;1;fsfw/src/fsfw/health/HasHealthIF.h;HAS_HEALTH_IF -0x1702; HHI_InvalidHealthState;;2;fsfw/src/fsfw/health/HasHealthIF.h;HAS_HEALTH_IF -0x2701; SM_DataTooLarge;;1;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF -0x2702; SM_DataStorageFull;;2;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF -0x2703; SM_IllegalStorageId;;3;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF -0x2704; SM_DataDoesNotExist;;4;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF -0x2705; SM_IllegalAddress;;5;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF -0x2706; SM_PoolTooLarge;;6;fsfw/src/fsfw/storagemanager/StorageManagerIF.h;STORAGE_MANAGER_IF -0x2301; MT_TooDetailedRequest;;1;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS -0x2302; MT_TooGeneralRequest;;2;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS -0x2303; MT_NoMatch;;3;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS -0x2304; MT_Full;;4;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS -0x2305; MT_NewNodeCreated;;5;fsfw/src/fsfw/globalfunctions/matching/MatchTree.h;MATCH_TREE_CLASS -0x3e01; DLEE_StreamTooShort;;0x01;fsfw/src/fsfw/globalfunctions/DleEncoder.h;DLE_ENCODER -0x3e02; DLEE_DecodingError;;0x02;fsfw/src/fsfw/globalfunctions/DleEncoder.h;DLE_ENCODER -0x2e01; ASC_TooLongForTargetType;;1;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER -0x2e02; ASC_InvalidCharacters;;2;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER -0x2e03; ASC_BufferTooSmall;;0x3;fsfw/src/fsfw/globalfunctions/AsciiConverter.h;ASCII_CONVERTER -0x1c01; TCD_PacketLost;;1;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION -0x1c02; TCD_DestinationNotFound;;2;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION -0x1c03; TCD_ServiceIdAlreadyExists;;3;fsfw/src/fsfw/tcdistribution/TcDistributor.h;PACKET_DISTRIBUTION -0x1b00; TCC_IllegalApid;;0;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK -0x1b01; TCC_IncompletePacket;;1;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK -0x1b02; TCC_IncorrectChecksum;;2;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK -0x1b03; TCC_IllegalPacketType;;3;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK -0x1b04; TCC_IllegalPacketSubtype;;4;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK -0x1b05; TCC_IncorrectPrimaryHeader;;5;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK -0x1b06; TCC_IncorrectSecondaryHeader;;6;fsfw/src/fsfw/tcdistribution/TcPacketCheckPUS.h;TC_PACKET_CHECK -0x3901; MQI_Empty;;1;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF -0x3902; MQI_Full;No space left for more messages;2;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF -0x3903; MQI_NoReplyPartner;Returned if a reply method was called without partner;3;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF -0x3904; MQI_DestinationInvalid;Returned if the target destination is invalid.;4;fsfw/src/fsfw/ipc/MessageQueueIF.h;MESSAGE_QUEUE_IF -0xf01; CM_UnknownCommand;;1;fsfw/src/fsfw/ipc/CommandMessageIF.h;COMMAND_MESSAGE -0x3801; MUX_NotEnoughResources;;1;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x3802; MUX_InsufficientMemory;;2;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x3803; MUX_NoPrivilege;;3;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x3804; MUX_WrongAttributeSetting;;4;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x3805; MUX_MutexAlreadyLocked;;5;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x3806; MUX_MutexNotFound;;6;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x3807; MUX_MutexMaxLocks;;7;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x3808; MUX_CurrThreadAlreadyOwnsMutex;;8;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x3809; MUX_CurrThreadDoesNotOwnMutex;;9;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x380a; MUX_MutexTimeout;;10;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x380b; MUX_MutexInvalidId;;11;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x380c; MUX_MutexDestroyedWhileWaiting;;12;fsfw/src/fsfw/ipc/MutexIF.h;MUTEX_IF -0x2801; TC_InvalidTargetState;;1;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF -0x28f1; TC_AboveOperationalLimit;;0xF1;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF -0x28f2; TC_BelowOperationalLimit;;0xF2;fsfw/src/fsfw/thermal/ThermalComponentIF.h;THERMAL_COMPONENT_IF -0x801; DPS_InvalidParameterDefinition;;1;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS -0x802; DPS_SetWasAlreadyRead;;2;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS -0x803; DPS_CommitingWithoutReading;;3;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS -0x804; DPS_DataSetUninitialised;;4;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS -0x805; DPS_DataSetFull;;5;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS -0x806; DPS_PoolVarNull;;6;fsfw/src/fsfw/datapool/DataSetIF.h;DATA_SET_CLASS -0x3ca0; PVA_InvalidReadWriteMode;;0xA0;fsfw/src/fsfw/datapool/PoolVariableIF.h;POOL_VARIABLE_IF -0x3ca1; PVA_InvalidPoolEntry;;0xA1;fsfw/src/fsfw/datapool/PoolVariableIF.h;POOL_VARIABLE_IF -0xc02; MS_InvalidEntry;;0x02;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF -0xc03; MS_TooManyElements;;0x03;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF -0xc04; MS_CantStoreEmpty;;0x04;fsfw/src/fsfw/subsystem/modes/ModeStoreIF.h;MODE_STORE_IF -0xd01; SS_SequenceAlreadyExists;;0x01;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd02; SS_TableAlreadyExists;;0x02;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd03; SS_TableDoesNotExist;;0x03;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd04; SS_TableOrSequenceLengthInvalid;;0x04;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd05; SS_SequenceDoesNotExist;;0x05;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd06; SS_TableContainsInvalidObjectId;;0x06;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd07; SS_FallbackSequenceDoesNotExist;;0x07;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd08; SS_NoTargetTable;;0x08;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd09; SS_SequenceOrTableTooLong;;0x09;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd0b; SS_IsFallbackSequence;;0x0B;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd0c; SS_AccessDenied;;0x0C;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xd0e; SS_TableInUse;;0x0E;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xda1; SS_TargetTableNotReached;;0xA1;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xda2; SS_TableCheckFailed;;0xA2;fsfw/src/fsfw/subsystem/Subsystem.h;SUBSYSTEM -0xb01; SB_ChildNotFound;;0x01;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE -0xb02; SB_ChildInfoUpdated;;0x02;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE -0xb03; SB_ChildDoesntHaveModes;;0x03;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE -0xb04; SB_CouldNotInsertChild;;0x04;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE -0xb05; SB_TableContainsInvalidObjectId;;0x05;fsfw/src/fsfw/subsystem/SubsystemBase.h;SUBSYSTEM_BASE -0xb00; SB_ConnBroken;;0;fsfw/src/fsfw/osal/common/TcpTmTcServer.h;SUBSYSTEM_BASE -0x2901; IEC_NoConfigurationTable;;0x01;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2902; IEC_NoCpuTable;;0x02;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2903; IEC_InvalidWorkspaceAddress;;0x03;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2904; IEC_TooLittleWorkspace;;0x04;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2905; IEC_WorkspaceAllocation;;0x05;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2906; IEC_InterruptStackTooSmall;;0x06;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2907; IEC_ThreadExitted;;0x07;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2908; IEC_InconsistentMpInformation;;0x08;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2909; IEC_InvalidNode;;0x09;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x290a; IEC_NoMpci;;0x0a;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x290b; IEC_BadPacket;;0x0b;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x290c; IEC_OutOfPackets;;0x0c;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x290d; IEC_OutOfGlobalObjects;;0x0d;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x290e; IEC_OutOfProxies;;0x0e;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x290f; IEC_InvalidGlobalId;;0x0f;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2910; IEC_BadStackHook;;0x10;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2911; IEC_BadAttributes;;0x11;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2912; IEC_ImplementationKeyCreateInconsistency;;0x12;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2913; IEC_ImplementationBlockingOperationCancel;;0x13;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2914; IEC_MutexObtainFromBadState;;0x14;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x2915; IEC_UnlimitedAndMaximumIs0;;0x15;fsfw/src/fsfw/osal/InternalErrorCodes.h;INTERNAL_ERROR_CODES -0x1401; SE_BufferTooShort;;1;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF -0x1402; SE_StreamTooShort;;2;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF -0x1403; SE_TooManyElements;;3;fsfw/src/fsfw/serialize/SerializeIF.h;SERIALIZE_IF -0x4a00; SPPA_NoPacketFound;;0x00;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h;SPACE_PACKET_PARSER -0x4a01; SPPA_SplitPacket;;0x01;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h;SPACE_PACKET_PARSER -0x1d01; PUS_ActivityStarted;;1;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF -0x1d02; PUS_InvalidSubservice;;2;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF -0x1d03; PUS_IllegalApplicationData;;3;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF -0x1d04; PUS_SendTmFailed;;4;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF -0x1d05; PUS_Timeout;;5;fsfw/src/fsfw/tmtcservices/AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF -0x1f01; CSB_ExecutionComplete;;1;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE -0x1f02; CSB_NoStepMessage;;2;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE -0x1f03; CSB_ObjectBusy;;3;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE -0x1f04; CSB_Busy;;4;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE -0x1f05; CSB_InvalidTc;;5;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE -0x1f06; CSB_InvalidObject;;6;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE -0x1f07; CSB_InvalidReply;;7;fsfw/src/fsfw/tmtcservices/CommandingServiceBase.h;COMMAND_SERVICE_BASE -0x2500; FDI_YourFault;;0;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF -0x2501; FDI_MyFault;;1;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF -0x2502; FDI_ConfirmLater;;2;fsfw/src/fsfw/fdir/ConfirmsFailuresIF.h;HANDLES_FAILURES_IF -0x4e1; RMP_CommandNoDescriptorsAvailable;;0xE1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4e2; RMP_CommandBufferFull;;0xE2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4e3; RMP_CommandChannelOutOfRange;;0xE3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4e6; RMP_CommandChannelDeactivated;;0xE6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4e7; RMP_CommandPortOutOfRange;;0xE7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4e8; RMP_CommandPortInUse;;0xE8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4e9; RMP_CommandNoChannel;;0xE9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4ea; RMP_NoHwCrc;;0xEA;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4d0; RMP_ReplyNoReply;;0xD0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4d1; RMP_ReplyNotSent;;0xD1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4d2; RMP_ReplyNotYetSent;;0xD2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4d3; RMP_ReplyMissmatch;;0xD3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4d4; RMP_ReplyTimeout;;0xD4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4c0; RMP_ReplyInterfaceBusy;;0xC0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4c1; RMP_ReplyTransmissionError;;0xC1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4c2; RMP_ReplyInvalidData;;0xC2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4c3; RMP_ReplyNotSupported;;0xC3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f0; RMP_LinkDown;;0xF0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f1; RMP_SpwCredit;;0xF1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f2; RMP_SpwEscape;;0xF2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f3; RMP_SpwDisconnect;;0xF3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f4; RMP_SpwParity;;0xF4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f5; RMP_SpwWriteSync;;0xF5;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f6; RMP_SpwInvalidAddress;;0xF6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f7; RMP_SpwEarlyEop;;0xF7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f8; RMP_SpwDma;;0xF8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x4f9; RMP_SpwLinkError;;0xF9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x400; RMP_ReplyOk;;0;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x401; RMP_ReplyGeneralErrorCode;;1;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x402; RMP_ReplyUnusedPacketTypeOrCommandCode;;2;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x403; RMP_ReplyInvalidKey;;3;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x404; RMP_ReplyInvalidDataCrc;;4;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x405; RMP_ReplyEarlyEop;;5;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x406; RMP_ReplyTooMuchData;;6;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x407; RMP_ReplyEep;;7;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x408; RMP_ReplyReserved;;8;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x409; RMP_ReplyVerifyBufferOverrun;;9;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x40a; RMP_ReplyCommandNotImplementedOrNotAuthorised;;10;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x40b; RMP_ReplyRmwDataLengthError;;11;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x40c; RMP_ReplyInvalidTargetLogicalAddress;;12;fsfw/src/fsfw/rmap/RMAP.h;RMAP_CHANNEL -0x2b01; CCS_BcIsSetVrCommand;;0x01;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2b02; CCS_BcIsUnlockCommand;;0x02;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bb0; CCS_BcIllegalCommand;;0xB0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bb1; CCS_BoardReadingNotFinished;;0xB1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bf0; CCS_NsPositiveW;;0xF0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bf1; CCS_NsNegativeW;;0xF1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bf2; CCS_NsLockout;;0xF2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bf3; CCS_FarmInLockout;;0xF3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bf4; CCS_FarmInWait;;0xF4;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be0; CCS_WrongSymbol;;0xE0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be1; CCS_DoubleStart;;0xE1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be2; CCS_StartSymbolMissed;;0xE2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be3; CCS_EndWithoutStart;;0xE3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be4; CCS_TooLarge;;0xE4;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be5; CCS_TooShort;;0xE5;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be6; CCS_WrongTfVersion;;0xE6;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be7; CCS_WrongSpacecraftId;;0xE7;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be8; CCS_NoValidFrameType;;0xE8;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2be9; CCS_CrcFailed;;0xE9;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bea; CCS_VcNotFound;;0xEA;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2beb; CCS_ForwardingFailed;;0xEB;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bec; CCS_ContentTooLarge;;0xEC;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bed; CCS_ResidualData;;0xED;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bee; CCS_DataCorrupted;;0xEE;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bef; CCS_IllegalSegmentationFlag;;0xEF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bd0; CCS_IllegalFlagCombination;;0xD0;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bd1; CCS_ShorterThanHeader;;0xD1;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bd2; CCS_TooShortBlockedPacket;;0xD2;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x2bd3; CCS_TooShortMapExtraction;;0xD3;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF -0x37a1; SGP4_InvalidEccentricity;;0xA1;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS -0x37a2; SGP4_InvalidMeanMotion;;0xA2;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS -0x37a3; SGP4_InvalidPerturbationElements;;0xA3;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS -0x37a4; SGP4_InvalidSemiLatusRectum;;0xA4;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS -0x37a5; SGP4_InvalidEpochElements;;0xA5;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS -0x37a6; SGP4_SatelliteHasDecayed;;0xA6;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS -0x37b1; SGP4_TleTooOld;;0xB1;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS -0x37b2; SGP4_TleNotInitialized;;0xB2;fsfw/src/fsfw/coordinates/Sgp4Propagator.h;SGP4PROPAGATOR_CLASS -0x13e0; MH_UnknownCmd;;0xE0;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER -0x13e1; MH_InvalidAddress;;0xE1;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER -0x13e2; MH_InvalidSize;;0xE2;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER -0x13e3; MH_StateMismatch;;0xE3;fsfw/src/fsfw/memory/MemoryHelper.h;MEMORY_HELPER -0x4100; FILS_GenericFileError;;0;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x4101; FILS_IsBusy;;1;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x4102; FILS_InvalidParameters;;2;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x4105; FILS_FileDoesNotExist;;5;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x4106; FILS_FileAlreadyExists;;6;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x4107; FILS_FileLocked;;7;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x410a; FILS_DirectoryDoesNotExist;;10;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x410b; FILS_DirectoryAlreadyExists;;11;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x410c; FILS_DirectoryNotEmpty;;12;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x410f; FILS_SequencePacketMissingWrite;;15;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x4110; FILS_SequencePacketMissingRead;;16;fsfw/src/fsfw/memory/HasFileSystemIF.h;FILE_SYSTEM -0x601; PP_DoItMyself;;1;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x602; PP_PointsToVariable;;2;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x603; PP_PointsToMemory;;3;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x604; PP_ActivityCompleted;;4;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x605; PP_PointsToVectorUint8;;5;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x606; PP_PointsToVectorUint16;;6;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x607; PP_PointsToVectorUint32;;7;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x608; PP_PointsToVectorFloat;;8;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x6a0; PP_DumpNotSupported;;0xA0;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x6e0; PP_InvalidSize;;0xE0;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x6e1; PP_InvalidAddress;;0xE1;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x6e2; PP_InvalidContent;;0xE2;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x6e3; PP_UnalignedAccess;;0xE3;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x6e4; PP_WriteProtected;;0xE4;fsfw/src/fsfw/memory/HasMemoryIF.h;HAS_MEMORY_IF -0x201; OM_InsertionFailed;;1;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF -0x202; OM_NotFound;;2;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF -0x203; OM_ChildInitFailed;;3;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF -0x204; OM_InternalErrReporterUninit;;4;fsfw/src/fsfw/objectmanager/ObjectManagerIF.h;OBJECT_MANAGER_IF -0x501; PS_SwitchOn;;1;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF -0x500; PS_SwitchOff;;0;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF -0x502; PS_SwitchTimeout;;2;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF -0x503; PS_FuseOn;;3;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF -0x504; PS_FuseOff;;4;fsfw/src/fsfw/power/PowerSwitchIF.h;POWER_SWITCH_IF -0x2f01; POS_InPowerTransition;;1;fsfw/src/fsfw/power/PowerSwitcher.h;POWER_SWITCHER -0x2f02; POS_SwitchStateMismatch;;2;fsfw/src/fsfw/power/PowerSwitcher.h;POWER_SWITCHER -0x1000; TIM_UnsupportedTimeFormat;;0;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS -0x1001; TIM_NotEnoughInformationForTargetFormat;;1;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS -0x1002; TIM_LengthMismatch;;2;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS -0x1003; TIM_InvalidTimeFormat;;3;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS -0x1004; TIM_InvalidDayOfYear;;4;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS -0x1005; TIM_TimeDoesNotFitFormat;;5;fsfw/src/fsfw/timemanager/CCSDSTime.h;CCSDS_TIME_HELPER_CLASS -0x3601; TSI_BadTimestamp;;1;fsfw/src/fsfw/timemanager/TimeStamperIF.h;TIME_STAMPER_IF -0x2101; TMF_Busy;;1;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2102; TMF_LastPacketFound;;2;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2103; TMF_StopFetch;;3;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2104; TMF_Timeout;;4;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2105; TMF_TmChannelFull;;5;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2106; TMF_NotStored;;6;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2107; TMF_AllDeleted;;7;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2108; TMF_InvalidData;;8;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2109; TMF_NotReady;;9;fsfw/src/fsfw/tmstorage/TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF -0x2001; TMB_Busy;;1;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x2002; TMB_Full;;2;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x2003; TMB_Empty;;3;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x2004; TMB_NullRequested;;4;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x2005; TMB_TooLarge;;5;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x2006; TMB_NotReady;;6;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x2007; TMB_DumpError;;7;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x2008; TMB_CrcError;;8;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x2009; TMB_Timeout;;9;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x200a; TMB_IdlePacketFound;;10;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x200b; TMB_TelecommandFound;;11;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x200c; TMB_NoPusATm;;12;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x200d; TMB_TooSmall;;13;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x200e; TMB_BlockNotFound;;14;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0x200f; TMB_InvalidRequest;;15;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h;TM_STORE_BACKEND_IF -0xe01; HM_InvalidMode;;0x01;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF -0xe02; HM_TransNotAllowed;;0x02;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF -0xe03; HM_InTransition;;0x03;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF -0xe04; HM_InvalidSubmode;;0x04;fsfw/src/fsfw/modes/HasModesIF.h;HAS_MODES_IF -0x1501; FM_KeyAlreadyExists;;0x01;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP -0x1502; FM_MapFull;;0x02;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP -0x1503; FM_KeyDoesNotExist;;0x03;fsfw/src/fsfw/container/FixedMap.h;FIXED_MAP -0x1101; AL_Full;;0x01;fsfw/src/fsfw/container/ArrayList.h;ARRAY_LIST -0x1601; FMM_MapFull;;0x01;fsfw/src/fsfw/container/FixedOrderedMultimap.h;FIXED_MULTIMAP -0x1602; FMM_KeyDoesNotExist;;0x02;fsfw/src/fsfw/container/FixedOrderedMultimap.h;FIXED_MULTIMAP -0x1801; FF_Full;;1;fsfw/src/fsfw/container/FIFOBase.h;FIFO_CLASS -0x1802; FF_Empty;;2;fsfw/src/fsfw/container/FIFOBase.h;FIFO_CLASS -0x3a0; DHB_InvalidChannel;;0xA0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x3b0; DHB_AperiodicReply;;0xB0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x3b1; DHB_IgnoreReplyData;;0xB1;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x3b2; DHB_IgnoreFullPacket;;0xB2;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x3c0; DHB_NothingToSend;;0xC0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x3c2; DHB_CommandMapError;;0xC2;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x3d0; DHB_NoSwitch;;0xD0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x3e0; DHB_ChildTimeout;;0xE0;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x3e1; DHB_SwitchFailed;;0xE1;fsfw/src/fsfw/devicehandlers/DeviceHandlerBase.h;DEVICE_HANDLER_BASE -0x1201; AB_NeedSecondStep;;0x01;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE -0x1202; AB_NeedToReconfigure;;0x02;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE -0x1203; AB_ModeFallback;;0x03;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE -0x1204; AB_ChildNotCommandable;;0x04;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE -0x1205; AB_NeedToChangeHealth;;0x05;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE -0x12a1; AB_NotEnoughChildrenInCorrectState;;0xa1;fsfw/src/fsfw/devicehandlers/AssemblyBase.h;ASSEMBLY_BASE -0x26a0; DHI_NoCommandData;;0xA0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a1; DHI_CommandNotSupported;;0xA1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a2; DHI_CommandAlreadySent;;0xA2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a3; DHI_CommandWasNotSent;;0xA3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a4; DHI_CantSwitchAddress;;0xA4;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a5; DHI_WrongModeForCommand;;0xA5;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a6; DHI_Timeout;;0xA6;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a7; DHI_Busy;;0xA7;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a8; DHI_NoReplyExpected;;0xA8;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26a9; DHI_NonOpTemperature;;0xA9;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26aa; DHI_CommandNotImplemented;;0xAA;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26b0; DHI_ChecksumError;;0xB0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26b1; DHI_LengthMissmatch;;0xB1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26b2; DHI_InvalidData;;0xB2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26b3; DHI_ProtocolError;;0xB3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26c0; DHI_DeviceDidNotExecute;;0xC0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26c1; DHI_DeviceReportedError;;0xC1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26c2; DHI_UnknownDeviceReply;;0xC2;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26c3; DHI_DeviceReplyInvalid;;0xC3;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26d0; DHI_InvalidCommandParameter;;0xD0;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x26d1; DHI_InvalidNumberOrLengthOfParameters;;0xD1;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h;DEVICE_HANDLER_IF -0x3301; DC_NoReplyReceived;;0x01;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF -0x3302; DC_ProtocolError;;0x02;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF -0x3303; DC_Nullpointer;;0x03;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF -0x3304; DC_InvalidCookieType;;0x04;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF -0x3305; DC_NotActive;;0x05;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF -0x3306; DC_TooMuchData;;0x06;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF -0x2401; EV_ListenerNotFound;;1;fsfw/src/fsfw/events/EventManagerIF.h;EVENT_MANAGER_IF -0x1a01; TRC_NotEnoughSensors;;1;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK -0x1a02; TRC_LowestValueOol;;2;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK -0x1a03; TRC_HighestValueOol;;3;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK -0x1a04; TRC_BothValuesOol;;4;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK -0x1a05; TRC_DuplexOol;;5;fsfw/src/fsfw/monitoring/TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK -0x3001; LIM_Unchecked;;1;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x3002; LIM_Invalid;;2;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x3003; LIM_Unselected;;3;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x3004; LIM_BelowLowLimit;;4;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x3005; LIM_AboveHighLimit;;5;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x3006; LIM_UnexpectedValue;;6;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x3007; LIM_OutOfRange;;7;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x30a0; LIM_FirstSample;;0xA0;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x30e0; LIM_InvalidSize;;0xE0;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x30e1; LIM_WrongType;;0xE1;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x30e2; LIM_WrongPid;;0xE2;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x30e3; LIM_WrongLimitId;;0xE3;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x30ee; LIM_MonitorNotFound;;0xEE;fsfw/src/fsfw/monitoring/MonitoringIF.h;LIMITS_IF -0x3a01; SPH_SemaphoreTimeout;;1;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF -0x3a02; SPH_SemaphoreNotOwned;;2;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF -0x3a03; SPH_SemaphoreInvalid;;3;fsfw/src/fsfw/tasks/SemaphoreIF.h;SEMAPHORE_IF -0x7200; SDMA_OpOngoing;;0;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x7201; SDMA_AlreadyOn;;1;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x7202; SDMA_AlreadyMounted;;2;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x7203; SDMA_AlreadyOff;;3;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x720a; SDMA_StatusFileNexists;;10;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x720b; SDMA_StatusFileFormatInvalid;;11;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x720c; SDMA_MountError;;12;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x720d; SDMA_UnmountError;;13;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x720e; SDMA_SystemCallError;;14;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x720f; SDMA_PopenCallError;;15;bsp_q7s/memory/SdCardManager.h;SD_CARD_MANAGER -0x7300; SCBU_KeyNotFound;;0;bsp_q7s/memory/scratchApi.h;SCRATCH_BUFFER -0x67a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;0xA0;bsp_q7s/memory/FilesystemHelper.h;FILE_SYSTEM_HELPER -0x67a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;bsp_q7s/memory/FilesystemHelper.h;FILE_SYSTEM_HELPER -0x6aa0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;0xA0;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;0xA1;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;0xA2;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;0xA3;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa4;MPSOCRTVIF_InvalidLength;Received command with invalid length;0xA4;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;0xA5;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;0xA6;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);0xA7;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;0xA8;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;0xA9;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6ba0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;0xA0;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba1;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;0xA1;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba2;SPVRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;0xA2;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba3;SPVRTVIF_InvalidApid;Received space packet with invalid APID from PLOC supervisor;0xA3;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba4;SPVRTVIF_GetTimeFailure;Failed to read current system time;0xA4;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba5;SPVRTVIF_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;0xA5;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba6;SPVRTVIF_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;0xA6;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba7;SPVRTVIF_InvalidLatchupId;Received latchup config command with invalid latchup ID;0xA7;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba8;SPVRTVIF_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;0xA8;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba9;SPVRTVIF_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;0xA9;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6baa;SPVRTVIF_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;0xAA;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bab;SPVRTVIF_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);0xAB;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bac;SPVRTVIF_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;0xAC;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bad;SPVRTVIF_PathDoesNotExist;Path to PLOC directory on SD card does not exist;0xAD;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bae;SPVRTVIF_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;0xAE;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6baf;SPVRTVIF_InvalidLength;Received action command has invalid length;0xAF;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bb0;SPVRTVIF_FilenameTooLong;Filename too long;0xB0;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bb1;SPVRTVIF_UpdateStatusReportInvalidLength;Received update status report with invalid packet length field;0xB1;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bb2;SPVRTVIF_UpdateCrcFailure;Update status report does not contain expected CRC. There might be a bit flip in the update memory region.;0xB2;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bb3;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);0xB3;linux/devices/devicedefinitions/SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x57e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);0xE0;linux/devices/devicedefinitions/PlocMPSoCDefinitions.h;DWLPWRON_CMD -0x57e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);0xE1;linux/devices/devicedefinitions/PlocMPSoCDefinitions.h;DWLPWRON_CMD -0x61a0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;0xA0;linux/devices/ploc/PlocMemoryDumper.h;PLOC_MEMORY_DUMPER -0x61a1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;0xA1;linux/devices/ploc/PlocMemoryDumper.h;PLOC_MEMORY_DUMPER -0x68a0; PLMPHLP_FileClosedAccidentally;File accidentally close;0xA0;linux/devices/ploc/PlocMPSoCHelper.h;PLOC_MPSOC_HELPER -0x5aa0;PLSPVhLP_FileClosedAccidentally;File accidentally close;0xA0;linux/devices/ploc/PlocSupvHelper.h;PLOC_SUPV_HELPER -0x5aa1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;0xA1;linux/devices/ploc/PlocSupvHelper.h;PLOC_SUPV_HELPER -0x5aa2;PLSPVhLP_PathNotExists;Received command with invalid pathname;0xA2;linux/devices/ploc/PlocSupvHelper.h;PLOC_SUPV_HELPER -0x5aa3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;0xA3;linux/devices/ploc/PlocSupvHelper.h;PLOC_SUPV_HELPER -0x6501;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE -0x6502;JSONBASE_SetNotExists;Requested set does not exist in json file;2;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE -0x6503;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;linux/devices/startracker/ArcsecJsonParamBase.h;ARCSEC_JSON_BASE -0x56a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;0xA0;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a1;STRH_PingFailed;Ping command failed;0xA1;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a2;STRH_VersionReqFailed;Status in version reply signals error;0xA2;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a3;STRH_InterfaceReqFailed;Status in interface reply signals error;0xA3;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a4;STRH_PowerReqFailed;Status in power reply signals error;0xA4;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;0xA5;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a6;STRH_ActionFailed;Status of reply to action command signals error;0xA6;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;0xA7;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a8;STRH_FilenameTooLong;Name of file received with command is too long;0xA8;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56a9;STRH_InvalidProgram;Received version reply with invalid program ID;0xA9;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56aa;STRH_ReplyError;Status field reply signals error;0xAA;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);0xAB;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);0xAC;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56ad;STRH_RegionMismatch;Region mismatch between send and received data;0xAD;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56ae;STRH_AddressMismatch;Address mismatch between send and received data;0xAE;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56af;STRH_LengthMismatch;Length field mismatch between send and received data;0xAF;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b0;STRH_FileNotExists;Specified file does not exist;0xB0;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b1;STRH_InvalidType;Download blob pixel command has invalid type field;0xB1;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b2;STRH_InvalidId;Received FPGA action command with invalid ID;0xB2;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b3;STRH_ReplyTooShort;Received reply is too short;0xB3;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b4;STRH_CrcFailure;Received reply with invalid CRC;0xB4;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;0xB5;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;0xB6;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b7;STRH_StartrackerRunningFirmware;Star tracker is in firmware mode but must be in bootloader mode to execute this command;0xB7;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x56b8;STRH_StartrackerRunningBootloader;Star tracker is in bootloader mode but must be in firmware mode to execute this command;0xB8;linux/devices/startracker/StarTrackerHandler.h;STR_HANDLER -0x5fa0;STRHLP_SdNotMounted;SD card specified in path string not mounted;0xA0;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5fa1;STRHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5fa2;STRHLP_PathNotExists;Specified path does not exist;0xA2;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5fa3;STRHLP_FileCreationFailed;Failed to create download image or read flash file;0xA3;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5fa4;STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;0xA4;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5fa5;STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;0xA5;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5fa6;STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;0xA6;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5fa7;STRHLP_StatusError;Status field in reply signals error;0xA7;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5fa8;STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);0xA8;linux/devices/startracker/StrHelper.h;STR_HELPER -0x5ca0;IPCI_PapbBusy;;0xA0;linux/obc/PapbVcInterface.h;CCSDS_IP_CORE_BRIDGE -0x5da0;PTME_UnknownVcId;;0xA0;linux/obc/Ptme.h;PTME -0x64a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;0xA0;linux/obc/PtmeConfig.h;RATE_SETTER -0x64a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);0xA1;linux/obc/PtmeConfig.h;RATE_SETTER -0x64a2;RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;0xA2;linux/obc/PtmeConfig.h;RATE_SETTER -0x64a3;RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;0xA3;linux/obc/PtmeConfig.h;RATE_SETTER -0x62a0;PDEC_AbandonedCltu;;0xA0;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a1;PDEC_FrameDirty;;0xA1;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a2;PDEC_FrameIllegalMultipleReasons;;0xA2;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a3;PDEC_AdDiscardedLockout;;0xA3;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a4;PDEC_AdDiscardedWait;;0xA4;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a5;PDEC_AdDiscardedNsVs;;0xA5;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62b0;PDEC_CommandNotImplemented;Received action message with unknown action id;0xB0;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a6;PDEC_NoReport;;0xA6;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a7;PDEC_ErrorVersionNumber;;0xA7;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a8;PDEC_IllegalCombination;;0xA8;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62a9;PDEC_InvalidScId;;0xA9;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62aa;PDEC_InvalidVcIdMsb;;0xAA;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62ab;PDEC_InvalidVcIdLsb;;0xAB;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62ac;PDEC_NsNotZero;;0xAC;linux/obc/PdecHandler.h;PDEC_HANDLER -0x62ae;PDEC_InvalidBcCc;;0xAE;linux/obc/PdecHandler.h;PDEC_HANDLER +0x6000;GOMS_PacketTooLong;;0;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6001;GOMS_InvalidTableId;;1;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6002;GOMS_InvalidAddress;;2;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6003;GOMS_InvalidParamSize;;3;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6004;GOMS_InvalidPayloadSize;;4;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6005;GOMS_UnknownReplyId;;5;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x52a1;HEATER_CommandNotSupported;;0xA1;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x52a2;HEATER_InitFailed;;0xA2;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x52a3;HEATER_InvalidSwitchNr;;0xA3;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x52a4;HEATER_MainSwitchSetTimeout;;0xA4;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x52a5;HEATER_CommandAlreadyWaiting;;0xA5;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x54a0;IMTQ_InvalidCommandCode;;0xA0;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x54a1;IMTQ_ParameterMissing;;0xA1;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x54a2;IMTQ_ParameterInvalid;;0xA2;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x54a3;IMTQ_CcUnavailable;;0xA3;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x54a4;IMTQ_InternalProcessingError;;0xA4;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x54a5;IMTQ_RejectedWithoutReason;;0xA5;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x54a6;IMTQ_CmdErrUnknown;;0xA6;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x54a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;0xA7;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x55b0;RWHA_SpiWriteFailure;;0xB0;mission\devices\RwHandler.h;RW_HANDLER +0x55b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;0xB1;mission\devices\RwHandler.h;RW_HANDLER +0x55b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;0xB2;mission\devices\RwHandler.h;RW_HANDLER +0x55b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;0xB3;mission\devices\RwHandler.h;RW_HANDLER +0x55b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;0xB4;mission\devices\RwHandler.h;RW_HANDLER +0x55b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;0xB5;mission\devices\RwHandler.h;RW_HANDLER +0x55b6;RWHA_NoStartMarker;Expected a start marker as first byte;0xB6;mission\devices\RwHandler.h;RW_HANDLER +0x55a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000; 1000] or [1000; 65000];0xA0;mission\devices\RwHandler.h;RW_HANDLER +0x55a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;0xA1;mission\devices\RwHandler.h;RW_HANDLER +0x55a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;0xA2;mission\devices\RwHandler.h;RW_HANDLER +0x55a3;RWHA_ExecutionFailed;Command execution failed;0xA3;mission\devices\RwHandler.h;RW_HANDLER +0x55a4;RWHA_CrcError;Reaction wheel reply has invalid crc;0xA4;mission\devices\RwHandler.h;RW_HANDLER +0x69a0;SADPL_CommandNotSupported;;0xA0;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x69a1;SADPL_DeploymentAlreadyExecuting;;0xA1;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x69a2;SADPL_MainSwitchTimeoutFailure;;0xA2;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x69a3;SADPL_SwitchingDeplSa1Failed;;0xA3;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x69a4;SADPL_SwitchingDeplSa2Failed;;0xA4;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x5ba0;SUSS_ErrorUnlockMutex;;0xA0;mission\devices\SusHandler.h;SUS_HANDLER +0x5ba1;SUSS_ErrorLockMutex;;0xA1;mission\devices\SusHandler.h;SUS_HANDLER +0x53a0;SYRLINKS_CrcFailure;;0xA0;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x53a1;SYRLINKS_UartFraminOrParityErrorAck;;0xA1;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x53a2;SYRLINKS_BadCharacterAck;;0xA2;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x53a3;SYRLINKS_BadParameterValueAck;;0xA3;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x53a4;SYRLINKS_BadEndOfFrameAck;;0xA4;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x53a5;SYRLINKS_UnknownCommandIdAck;;0xA5;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x53a6;SYRLINKS_BadCrcAck;;0xA6;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x53a7;SYRLINKS_ReplyWrongSize;;0xA7;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x53a8;SYRLINKS_MissingStartFrameCharacter;;0xA8;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x66a0;NVMB_KeyNotExists;Specified key does not exist in json file;0xA0;mission\memory\NVMParameterBase.h;NVM_PARAM_BASE +0x63a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;0xA0;mission\tmtc\CCSDSHandler.h;CCSDS_HANDLER +0x4601; HGIO_UnknownGpioId;;1;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4602; HGIO_DriveGpioFailure;;2;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4603; HGIO_GpioTypeFailure;;3;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4604; HGIO_GpioInvalidInstance;;4;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4605; HGIO_GpioDuplicateDetected;;5;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4606; HGIO_GpioInitFailed;;6;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4607; HGIO_GpioGetValueFailed;;7;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4300; HSPI_HalTimeoutRetval;;0;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI +0x4301; HSPI_HalBusyRetval;;1;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI +0x4302; HSPI_HalErrorRetval;;2;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI +0x4401; HURT_UartReadFailure;;1;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART +0x4402; HURT_UartReadSizeMissmatch;;2;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART +0x4403; HURT_UartRxBufferTooSmall;;3;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART +0x4200; UXOS_ExecutionFinished;Execution of the current command has finished;0;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4201; UXOS_CommandPending;Command is pending. This will also be returned if the user tries to load another command but a command is still pending;1;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4202; UXOS_BytesRead;Some bytes have been read from the executing process;2;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4203; UXOS_CommandError;Command execution failed;3;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4204; UXOS_NoCommandLoadedOrPending;;4;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4206; UXOS_PcloseCallError;;6;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x3101; CF_ObjectHasNoFunctions;;1;fsfw\src\fsfw\action\CommandsActionsIF.h;COMMANDS_ACTIONS_IF +0x3102; CF_AlreadyCommanding;;2;fsfw\src\fsfw\action\CommandsActionsIF.h;COMMANDS_ACTIONS_IF +0x3201; HF_IsBusy;;1;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF +0x3202; HF_InvalidParameters;;2;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF +0x3203; HF_ExecutionFinished;;3;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF +0x3204; HF_InvalidActionId;;4;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF +0x3501; CFDP_InvalidTlvType;;1;fsfw\src\fsfw\cfdp\definitions.h;CFDP +0x3502; CFDP_InvalidDirectiveFields;;2;fsfw\src\fsfw\cfdp\definitions.h;CFDP +0x3503; CFDP_InvalidPduDatafieldLen;;3;fsfw\src\fsfw\cfdp\definitions.h;CFDP +0x3504; CFDP_InvalidAckDirectiveFields;;4;fsfw\src\fsfw\cfdp\definitions.h;CFDP +0x3505; CFDP_MetadataCantParseOptions;;5;fsfw\src\fsfw\cfdp\definitions.h;CFDP +0x3506; CFDP_FinishedCantParseFsResponses;;6;fsfw\src\fsfw\cfdp\definitions.h;CFDP +0x3508; CFDP_FilestoreRequiresSecondFile;;8;fsfw\src\fsfw\cfdp\definitions.h;CFDP +0x3509; CFDP_FilestoreResponseCantParseFsMessage;;9;fsfw\src\fsfw\cfdp\definitions.h;CFDP +0x1101; AL_Full;;0x01;fsfw\src\fsfw\container\ArrayList.h;ARRAY_LIST +0x1801; FF_Full;;1;fsfw\src\fsfw\container\FIFOBase.h;FIFO_CLASS +0x1802; FF_Empty;;2;fsfw\src\fsfw\container\FIFOBase.h;FIFO_CLASS +0x1501; FM_KeyAlreadyExists;;0x01;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP +0x1502; FM_MapFull;;0x02;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP +0x1503; FM_KeyDoesNotExist;;0x03;fsfw\src\fsfw\container\FixedMap.h;FIXED_MAP +0x1601; FMM_MapFull;;0x01;fsfw\src\fsfw\container\FixedOrderedMultimap.h;FIXED_MULTIMAP +0x1602; FMM_KeyDoesNotExist;;0x02;fsfw\src\fsfw\container\FixedOrderedMultimap.h;FIXED_MULTIMAP +0x37a1; SGP4_InvalidEccentricity;;0xA1;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS +0x37a2; SGP4_InvalidMeanMotion;;0xA2;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS +0x37a3; SGP4_InvalidPerturbationElements;;0xA3;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS +0x37a4; SGP4_InvalidSemiLatusRectum;;0xA4;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS +0x37a5; SGP4_InvalidEpochElements;;0xA5;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS +0x37a6; SGP4_SatelliteHasDecayed;;0xA6;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS +0x37b1; SGP4_TleTooOld;;0xB1;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS +0x37b2; SGP4_TleNotInitialized;;0xB2;fsfw\src\fsfw\coordinates\Sgp4Propagator.h;SGP4PROPAGATOR_CLASS +0x2b01; CCS_BcIsSetVrCommand;;0x01;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2b02; CCS_BcIsUnlockCommand;;0x02;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bb0; CCS_BcIllegalCommand;;0xB0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bb1; CCS_BoardReadingNotFinished;;0xB1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bf0; CCS_NsPositiveW;;0xF0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bf1; CCS_NsNegativeW;;0xF1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bf2; CCS_NsLockout;;0xF2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bf3; CCS_FarmInLockout;;0xF3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bf4; CCS_FarmInWait;;0xF4;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be0; CCS_WrongSymbol;;0xE0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be1; CCS_DoubleStart;;0xE1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be2; CCS_StartSymbolMissed;;0xE2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be3; CCS_EndWithoutStart;;0xE3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be4; CCS_TooLarge;;0xE4;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be5; CCS_TooShort;;0xE5;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be6; CCS_WrongTfVersion;;0xE6;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be7; CCS_WrongSpacecraftId;;0xE7;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be8; CCS_NoValidFrameType;;0xE8;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2be9; CCS_CrcFailed;;0xE9;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bea; CCS_VcNotFound;;0xEA;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2beb; CCS_ForwardingFailed;;0xEB;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bec; CCS_ContentTooLarge;;0xEC;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bed; CCS_ResidualData;;0xED;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bee; CCS_DataCorrupted;;0xEE;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bef; CCS_IllegalSegmentationFlag;;0xEF;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bd0; CCS_IllegalFlagCombination;;0xD0;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bd1; CCS_ShorterThanHeader;;0xD1;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bd2; CCS_TooShortBlockedPacket;;0xD2;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x2bd3; CCS_TooShortMapExtraction;;0xD3;fsfw\src\fsfw\datalinklayer\CCSDSReturnValuesIF.h;CCSDS_HANDLER_IF +0x801; DPS_InvalidParameterDefinition;;1;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS +0x802; DPS_SetWasAlreadyRead;;2;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS +0x803; DPS_CommitingWithoutReading;;3;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS +0x804; DPS_DataSetUninitialised;;4;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS +0x805; DPS_DataSetFull;;5;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS +0x806; DPS_PoolVarNull;;6;fsfw\src\fsfw\datapool\DataSetIF.h;DATA_SET_CLASS +0x3ca0; PVA_InvalidReadWriteMode;;0xA0;fsfw\src\fsfw\datapool\PoolVariableIF.h;POOL_VARIABLE_IF +0x3ca1; PVA_InvalidPoolEntry;;0xA1;fsfw\src\fsfw\datapool\PoolVariableIF.h;POOL_VARIABLE_IF +0x3d00; HKM_QueueOrDestinationInvalid;;0;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER +0x3d01; HKM_WrongHkPacketType;;1;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER +0x3d02; HKM_ReportingStatusUnchanged;;2;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER +0x3d03; HKM_PeriodicHelperInvalid;;3;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER +0x3d04; HKM_PoolobjectNotFound;;4;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER +0x3d05; HKM_DatasetNotFound;;5;fsfw\src\fsfw\datapoollocal\LocalDataPoolManager.h;HOUSEKEEPING_MANAGER +0x3b00; LPIF_PoolEntryNotFound;;0x00;fsfw\src\fsfw\datapoollocal\localPoolDefinitions.h;LOCAL_POOL_OWNER_IF +0x3b01; LPIF_PoolEntryTypeConflict;;0x01;fsfw\src\fsfw\datapoollocal\localPoolDefinitions.h;LOCAL_POOL_OWNER_IF +0x1201; AB_NeedSecondStep;;0x01;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE +0x1202; AB_NeedToReconfigure;;0x02;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE +0x1203; AB_ModeFallback;;0x03;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE +0x1204; AB_ChildNotCommandable;;0x04;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE +0x1205; AB_NeedToChangeHealth;;0x05;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE +0x12a1; AB_NotEnoughChildrenInCorrectState;;0xa1;fsfw\src\fsfw\devicehandlers\AssemblyBase.h;ASSEMBLY_BASE +0x3301; DC_NoReplyReceived;;0x01;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF +0x3302; DC_ProtocolError;;0x02;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF +0x3303; DC_Nullpointer;;0x03;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF +0x3304; DC_InvalidCookieType;;0x04;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF +0x3305; DC_NotActive;;0x05;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF +0x3306; DC_TooMuchData;;0x06;fsfw\src\fsfw\devicehandlers\DeviceCommunicationIF.h;DEVICE_COMMUNICATION_IF +0x3a0; DHB_InvalidChannel;;0xA0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x3b0; DHB_AperiodicReply;;0xB0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x3b1; DHB_IgnoreReplyData;;0xB1;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x3b2; DHB_IgnoreFullPacket;;0xB2;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x3c0; DHB_NothingToSend;;0xC0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x3c2; DHB_CommandMapError;;0xC2;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x3d0; DHB_NoSwitch;;0xD0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x3e0; DHB_ChildTimeout;;0xE0;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x3e1; DHB_SwitchFailed;;0xE1;fsfw\src\fsfw\devicehandlers\DeviceHandlerBase.h;DEVICE_HANDLER_BASE +0x26a0; DHI_NoCommandData;;0xA0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a1; DHI_CommandNotSupported;;0xA1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a2; DHI_CommandAlreadySent;;0xA2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a3; DHI_CommandWasNotSent;;0xA3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a4; DHI_CantSwitchAddress;;0xA4;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a5; DHI_WrongModeForCommand;;0xA5;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a6; DHI_Timeout;;0xA6;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a7; DHI_Busy;;0xA7;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a8; DHI_NoReplyExpected;;0xA8;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26a9; DHI_NonOpTemperature;;0xA9;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26aa; DHI_CommandNotImplemented;;0xAA;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26b0; DHI_ChecksumError;;0xB0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26b1; DHI_LengthMissmatch;;0xB1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26b2; DHI_InvalidData;;0xB2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26b3; DHI_ProtocolError;;0xB3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26c0; DHI_DeviceDidNotExecute;;0xC0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26c1; DHI_DeviceReportedError;;0xC1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26c2; DHI_UnknownDeviceReply;;0xC2;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26c3; DHI_DeviceReplyInvalid;;0xC3;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26d0; DHI_InvalidCommandParameter;;0xD0;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x26d1; DHI_InvalidNumberOrLengthOfParameters;;0xD1;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h;DEVICE_HANDLER_IF +0x2401; EV_ListenerNotFound;;1;fsfw\src\fsfw\events\EventManagerIF.h;EVENT_MANAGER_IF +0x2500; FDI_YourFault;;0;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF +0x2501; FDI_MyFault;;1;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF +0x2502; FDI_ConfirmLater;;2;fsfw\src\fsfw\fdir\ConfirmsFailuresIF.h;HANDLES_FAILURES_IF +0x2301; MT_TooDetailedRequest;;1;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS +0x2302; MT_TooGeneralRequest;;2;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS +0x2303; MT_NoMatch;;3;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS +0x2304; MT_Full;;4;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS +0x2305; MT_NewNodeCreated;;5;fsfw\src\fsfw\globalfunctions\matching\MatchTree.h;MATCH_TREE_CLASS +0x2e01; ASC_TooLongForTargetType;;1;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER +0x2e02; ASC_InvalidCharacters;;2;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER +0x2e03; ASC_BufferTooSmall;;0x3;fsfw\src\fsfw\globalfunctions\AsciiConverter.h;ASCII_CONVERTER +0x3e01; DLEE_StreamTooShort;;0x01;fsfw\src\fsfw\globalfunctions\DleEncoder.h;DLE_ENCODER +0x3e02; DLEE_DecodingError;;0x02;fsfw\src\fsfw\globalfunctions\DleEncoder.h;DLE_ENCODER +0x1701; HHI_ObjectNotHealthy;;1;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF +0x1702; HHI_InvalidHealthState;;2;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF +0xf01; CM_UnknownCommand;;1;fsfw\src\fsfw\ipc\CommandMessageIF.h;COMMAND_MESSAGE +0x3901; MQI_Empty;;1;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF +0x3902; MQI_Full;No space left for more messages;2;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF +0x3903; MQI_NoReplyPartner;Returned if a reply method was called without partner;3;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF +0x3904; MQI_DestinationInvalid;Returned if the target destination is invalid.;4;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF +0x3801; MUX_NotEnoughResources;;1;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x3802; MUX_InsufficientMemory;;2;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x3803; MUX_NoPrivilege;;3;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x3804; MUX_WrongAttributeSetting;;4;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x3805; MUX_MutexAlreadyLocked;;5;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x3806; MUX_MutexNotFound;;6;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x3807; MUX_MutexMaxLocks;;7;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x3808; MUX_CurrThreadAlreadyOwnsMutex;;8;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x3809; MUX_CurrThreadDoesNotOwnMutex;;9;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x380a; MUX_MutexTimeout;;10;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x380b; MUX_MutexInvalidId;;11;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x380c; MUX_MutexDestroyedWhileWaiting;;12;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF +0x4100; FILS_GenericFileError;;0;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4101; FILS_IsBusy;;1;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4102; FILS_InvalidParameters;;2;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4105; FILS_FileDoesNotExist;;5;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4106; FILS_FileAlreadyExists;;6;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4107; FILS_FileLocked;;7;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x410a; FILS_DirectoryDoesNotExist;;10;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x410b; FILS_DirectoryAlreadyExists;;11;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x410c; FILS_DirectoryNotEmpty;;12;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x410f; FILS_SequencePacketMissingWrite;;15;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4110; FILS_SequencePacketMissingRead;;16;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x601; PP_DoItMyself;;1;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x602; PP_PointsToVariable;;2;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x603; PP_PointsToMemory;;3;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x604; PP_ActivityCompleted;;4;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x605; PP_PointsToVectorUint8;;5;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x606; PP_PointsToVectorUint16;;6;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x607; PP_PointsToVectorUint32;;7;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x608; PP_PointsToVectorFloat;;8;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x6a0; PP_DumpNotSupported;;0xA0;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x6e0; PP_InvalidSize;;0xE0;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x6e1; PP_InvalidAddress;;0xE1;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x6e2; PP_InvalidContent;;0xE2;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x6e3; PP_UnalignedAccess;;0xE3;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x6e4; PP_WriteProtected;;0xE4;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF +0x13e0; MH_UnknownCmd;;0xE0;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER +0x13e1; MH_InvalidAddress;;0xE1;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER +0x13e2; MH_InvalidSize;;0xE2;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER +0x13e3; MH_StateMismatch;;0xE3;fsfw\src\fsfw\memory\MemoryHelper.h;MEMORY_HELPER +0xe01; HM_InvalidMode;;0x01;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF +0xe02; HM_TransNotAllowed;;0x02;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF +0xe03; HM_InTransition;;0x03;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF +0xe04; HM_InvalidSubmode;;0x04;fsfw\src\fsfw\modes\HasModesIF.h;HAS_MODES_IF +0x3001; LIM_Unchecked;;1;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x3002; LIM_Invalid;;2;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x3003; LIM_Unselected;;3;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x3004; LIM_BelowLowLimit;;4;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x3005; LIM_AboveHighLimit;;5;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x3006; LIM_UnexpectedValue;;6;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x3007; LIM_OutOfRange;;7;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x30a0; LIM_FirstSample;;0xA0;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x30e0; LIM_InvalidSize;;0xE0;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x30e1; LIM_WrongType;;0xE1;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x30e2; LIM_WrongPid;;0xE2;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x30e3; LIM_WrongLimitId;;0xE3;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x30ee; LIM_MonitorNotFound;;0xEE;fsfw\src\fsfw\monitoring\MonitoringIF.h;LIMITS_IF +0x1a01; TRC_NotEnoughSensors;;1;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK +0x1a02; TRC_LowestValueOol;;2;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK +0x1a03; TRC_HighestValueOol;;3;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK +0x1a04; TRC_BothValuesOol;;4;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK +0x1a05; TRC_DuplexOol;;5;fsfw\src\fsfw\monitoring\TriplexMonitor.h;TRIPLE_REDUNDACY_CHECK +0x201; OM_InsertionFailed;;1;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF +0x202; OM_NotFound;;2;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF +0x203; OM_ChildInitFailed;;3;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF +0x204; OM_InternalErrReporterUninit;;4;fsfw\src\fsfw\objectmanager\ObjectManagerIF.h;OBJECT_MANAGER_IF +0x200; OM_ConnBroken;;0;fsfw\src\fsfw\osal\common\TcpTmTcServer.h;OBJECT_MANAGER_IF +0x2901; IEC_NoConfigurationTable;;0x01;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2902; IEC_NoCpuTable;;0x02;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2903; IEC_InvalidWorkspaceAddress;;0x03;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2904; IEC_TooLittleWorkspace;;0x04;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2905; IEC_WorkspaceAllocation;;0x05;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2906; IEC_InterruptStackTooSmall;;0x06;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2907; IEC_ThreadExitted;;0x07;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2908; IEC_InconsistentMpInformation;;0x08;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2909; IEC_InvalidNode;;0x09;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x290a; IEC_NoMpci;;0x0a;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x290b; IEC_BadPacket;;0x0b;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x290c; IEC_OutOfPackets;;0x0c;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x290d; IEC_OutOfGlobalObjects;;0x0d;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x290e; IEC_OutOfProxies;;0x0e;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x290f; IEC_InvalidGlobalId;;0x0f;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2910; IEC_BadStackHook;;0x10;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2911; IEC_BadAttributes;;0x11;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2912; IEC_ImplementationKeyCreateInconsistency;;0x12;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2913; IEC_ImplementationBlockingOperationCancel;;0x13;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2914; IEC_MutexObtainFromBadState;;0x14;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2915; IEC_UnlimitedAndMaximumIs0;;0x15;fsfw\src\fsfw\osal\InternalErrorCodes.h;INTERNAL_ERROR_CODES +0x2d01; HPA_InvalidIdentifierId;;0x01;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF +0x2d02; HPA_InvalidDomainId;;0x02;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF +0x2d03; HPA_InvalidValue;;0x03;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF +0x2d05; HPA_ReadOnly;;0x05;fsfw\src\fsfw\parameters\HasParametersIF.h;HAS_PARAMETERS_IF +0x2c01; PAW_UnknownDatatype;;0x01;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER +0x2c02; PAW_DatatypeMissmatch;;0x02;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER +0x2c03; PAW_Readonly;;0x03;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER +0x2c04; PAW_TooBig;;0x04;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER +0x2c05; PAW_SourceNotSet;;0x05;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER +0x2c06; PAW_OutOfBounds;;0x06;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER +0x2c07; PAW_NotSet;;0x07;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER +0x2c08; PAW_ColumnOrRowsZero;;0x08;fsfw\src\fsfw\parameters\ParameterWrapper.h;PARAMETER_WRAPPER +0x2f01; POS_InPowerTransition;;1;fsfw\src\fsfw\power\PowerSwitcher.h;POWER_SWITCHER +0x2f02; POS_SwitchStateMismatch;;2;fsfw\src\fsfw\power\PowerSwitcher.h;POWER_SWITCHER +0x501; PS_SwitchOn;;1;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF +0x500; PS_SwitchOff;;0;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF +0x502; PS_SwitchTimeout;;2;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF +0x503; PS_FuseOn;;3;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF +0x504; PS_FuseOff;;4;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF +0x4e1; RMP_CommandNoDescriptorsAvailable;;0xE1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4e2; RMP_CommandBufferFull;;0xE2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4e3; RMP_CommandChannelOutOfRange;;0xE3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4e6; RMP_CommandChannelDeactivated;;0xE6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4e7; RMP_CommandPortOutOfRange;;0xE7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4e8; RMP_CommandPortInUse;;0xE8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4e9; RMP_CommandNoChannel;;0xE9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4ea; RMP_NoHwCrc;;0xEA;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4d0; RMP_ReplyNoReply;;0xD0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4d1; RMP_ReplyNotSent;;0xD1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4d2; RMP_ReplyNotYetSent;;0xD2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4d3; RMP_ReplyMissmatch;;0xD3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4d4; RMP_ReplyTimeout;;0xD4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4c0; RMP_ReplyInterfaceBusy;;0xC0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4c1; RMP_ReplyTransmissionError;;0xC1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4c2; RMP_ReplyInvalidData;;0xC2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4c3; RMP_ReplyNotSupported;;0xC3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f0; RMP_LinkDown;;0xF0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f1; RMP_SpwCredit;;0xF1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f2; RMP_SpwEscape;;0xF2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f3; RMP_SpwDisconnect;;0xF3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f4; RMP_SpwParity;;0xF4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f5; RMP_SpwWriteSync;;0xF5;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f6; RMP_SpwInvalidAddress;;0xF6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f7; RMP_SpwEarlyEop;;0xF7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f8; RMP_SpwDma;;0xF8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x4f9; RMP_SpwLinkError;;0xF9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x400; RMP_ReplyOk;;0;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x401; RMP_ReplyGeneralErrorCode;;1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x402; RMP_ReplyUnusedPacketTypeOrCommandCode;;2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x403; RMP_ReplyInvalidKey;;3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x404; RMP_ReplyInvalidDataCrc;;4;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x405; RMP_ReplyEarlyEop;;5;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x406; RMP_ReplyTooMuchData;;6;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x407; RMP_ReplyEep;;7;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x408; RMP_ReplyReserved;;8;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x409; RMP_ReplyVerifyBufferOverrun;;9;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x40a; RMP_ReplyCommandNotImplementedOrNotAuthorised;;10;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x40b; RMP_ReplyRmwDataLengthError;;11;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x40c; RMP_ReplyInvalidTargetLogicalAddress;;12;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL +0x1401; SE_BufferTooShort;;1;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF +0x1402; SE_StreamTooShort;;2;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF +0x1403; SE_TooManyElements;;3;fsfw\src\fsfw\serialize\SerializeIF.h;SERIALIZE_IF +0x2701; SM_DataTooLarge;;1;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF +0x2702; SM_DataStorageFull;;2;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF +0x2703; SM_IllegalStorageId;;3;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF +0x2704; SM_DataDoesNotExist;;4;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF +0x2705; SM_IllegalAddress;;5;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF +0x2706; SM_PoolTooLarge;;6;fsfw\src\fsfw\storagemanager\StorageManagerIF.h;STORAGE_MANAGER_IF +0xc02; MS_InvalidEntry;;0x02;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF +0xc03; MS_TooManyElements;;0x03;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF +0xc04; MS_CantStoreEmpty;;0x04;fsfw\src\fsfw\subsystem\modes\ModeStoreIF.h;MODE_STORE_IF +0xd01; SS_SequenceAlreadyExists;;0x01;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd02; SS_TableAlreadyExists;;0x02;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd03; SS_TableDoesNotExist;;0x03;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd04; SS_TableOrSequenceLengthInvalid;;0x04;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd05; SS_SequenceDoesNotExist;;0x05;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd06; SS_TableContainsInvalidObjectId;;0x06;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd07; SS_FallbackSequenceDoesNotExist;;0x07;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd08; SS_NoTargetTable;;0x08;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd09; SS_SequenceOrTableTooLong;;0x09;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd0b; SS_IsFallbackSequence;;0x0B;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd0c; SS_AccessDenied;;0x0C;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xd0e; SS_TableInUse;;0x0E;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xda1; SS_TargetTableNotReached;;0xA1;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xda2; SS_TableCheckFailed;;0xA2;fsfw\src\fsfw\subsystem\Subsystem.h;SUBSYSTEM +0xb01; SB_ChildNotFound;;0x01;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE +0xb02; SB_ChildInfoUpdated;;0x02;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE +0xb03; SB_ChildDoesntHaveModes;;0x03;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE +0xb04; SB_CouldNotInsertChild;;0x04;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE +0xb05; SB_TableContainsInvalidObjectId;;0x05;fsfw\src\fsfw\subsystem\SubsystemBase.h;SUBSYSTEM_BASE +0x3a01; SPH_SemaphoreTimeout;;1;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF +0x3a02; SPH_SemaphoreNotOwned;;2;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF +0x3a03; SPH_SemaphoreInvalid;;3;fsfw\src\fsfw\tasks\SemaphoreIF.h;SEMAPHORE_IF +0x1c01; TCD_PacketLost;;1;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION +0x1c02; TCD_DestinationNotFound;;2;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION +0x1c03; TCD_ServiceIdAlreadyExists;;3;fsfw\src\fsfw\tcdistribution\TcDistributor.h;PACKET_DISTRIBUTION +0x1b00; TCC_IllegalApid;;0;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK +0x1b01; TCC_IncompletePacket;;1;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK +0x1b02; TCC_IncorrectChecksum;;2;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK +0x1b03; TCC_IllegalPacketType;;3;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK +0x1b04; TCC_IllegalPacketSubtype;;4;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK +0x1b05; TCC_IncorrectPrimaryHeader;;5;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK +0x1b06; TCC_IncorrectSecondaryHeader;;6;fsfw\src\fsfw\tcdistribution\TcPacketCheckPUS.h;TC_PACKET_CHECK +0x2801; TC_InvalidTargetState;;1;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF +0x28f1; TC_AboveOperationalLimit;;0xF1;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF +0x28f2; TC_BelowOperationalLimit;;0xF2;fsfw\src\fsfw\thermal\ThermalComponentIF.h;THERMAL_COMPONENT_IF +0x1000; TIM_UnsupportedTimeFormat;;0;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS +0x1001; TIM_NotEnoughInformationForTargetFormat;;1;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS +0x1002; TIM_LengthMismatch;;2;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS +0x1003; TIM_InvalidTimeFormat;;3;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS +0x1004; TIM_InvalidDayOfYear;;4;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS +0x1005; TIM_TimeDoesNotFitFormat;;5;fsfw\src\fsfw\timemanager\CCSDSTime.h;CCSDS_TIME_HELPER_CLASS +0x3601; TSI_BadTimestamp;;1;fsfw\src\fsfw\timemanager\TimeStamperIF.h;TIME_STAMPER_IF +0x2001; TMB_Busy;;1;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2002; TMB_Full;;2;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2003; TMB_Empty;;3;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2004; TMB_NullRequested;;4;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2005; TMB_TooLarge;;5;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2006; TMB_NotReady;;6;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2007; TMB_DumpError;;7;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2008; TMB_CrcError;;8;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2009; TMB_Timeout;;9;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x200a; TMB_IdlePacketFound;;10;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x200b; TMB_TelecommandFound;;11;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x200c; TMB_NoPusATm;;12;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x200d; TMB_TooSmall;;13;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x200e; TMB_BlockNotFound;;14;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x200f; TMB_InvalidRequest;;15;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h;TM_STORE_BACKEND_IF +0x2101; TMF_Busy;;1;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x2102; TMF_LastPacketFound;;2;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x2103; TMF_StopFetch;;3;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x2104; TMF_Timeout;;4;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x2105; TMF_TmChannelFull;;5;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x2106; TMF_NotStored;;6;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x2107; TMF_AllDeleted;;7;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x2108; TMF_InvalidData;;8;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x2109; TMF_NotReady;;9;fsfw\src\fsfw\tmstorage\TmStoreFrontendIF.h;TM_STORE_FRONTEND_IF +0x1d01; PUS_ActivityStarted;;1;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF +0x1d02; PUS_InvalidSubservice;;2;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF +0x1d03; PUS_IllegalApplicationData;;3;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF +0x1d04; PUS_SendTmFailed;;4;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF +0x1d05; PUS_Timeout;;5;fsfw\src\fsfw\tmtcservices\AcceptsTelecommandsIF.h;ACCEPTS_TELECOMMANDS_IF +0x1f01; CSB_ExecutionComplete;;1;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE +0x1f02; CSB_NoStepMessage;;2;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE +0x1f03; CSB_ObjectBusy;;3;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE +0x1f04; CSB_Busy;;4;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE +0x1f05; CSB_InvalidTc;;5;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE +0x1f06; CSB_InvalidObject;;6;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE +0x1f07; CSB_InvalidReply;;7;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE +0x4a00; SPPA_NoPacketFound;;0x00;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER +0x4a01; SPPA_SplitPacket;;0x01;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER +0x67a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;0xA0;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER +0x67a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER +0x7300; SCBU_KeyNotFound;;0;bsp_q7s\memory\scratchApi.h;SCRATCH_BUFFER +0x7200; SDMA_OpOngoing;;0;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x7201; SDMA_AlreadyOn;;1;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x7202; SDMA_AlreadyMounted;;2;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x7203; SDMA_AlreadyOff;;3;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x720a; SDMA_StatusFileNexists;;10;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x720b; SDMA_StatusFileFormatInvalid;;11;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x720c; SDMA_MountError;;12;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x720d; SDMA_UnmountError;;13;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x720e; SDMA_SystemCallError;;14;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x720f; SDMA_PopenCallError;;15;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x6aa0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;0xA0;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;0xA1;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;0xA2;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;0xA3;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa4;MPSOCRTVIF_InvalidLength;Received command with invalid length;0xA4;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;0xA5;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;0xA6;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);0xA7;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;0xA8;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6aa9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;0xA9;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x57e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);0xE0;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD +0x57e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);0xE1;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD +0x6ba0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;0xA0;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba1;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;0xA1;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba2;SPVRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;0xA2;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba3;SPVRTVIF_InvalidApid;Received space packet with invalid APID from PLOC supervisor;0xA3;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba4;SPVRTVIF_GetTimeFailure;Failed to read current system time;0xA4;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba5;SPVRTVIF_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;0xA5;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba6;SPVRTVIF_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;0xA6;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba7;SPVRTVIF_InvalidLatchupId;Received latchup config command with invalid latchup ID;0xA7;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba8;SPVRTVIF_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;0xA8;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ba9;SPVRTVIF_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;0xA9;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6baa;SPVRTVIF_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;0xAA;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6bab;SPVRTVIF_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);0xAB;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6bac;SPVRTVIF_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;0xAC;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6bad;SPVRTVIF_PathDoesNotExist;Path to PLOC directory on SD card does not exist;0xAD;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6bae;SPVRTVIF_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;0xAE;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6baf;SPVRTVIF_InvalidLength;Received action command has invalid length;0xAF;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6bb0;SPVRTVIF_FilenameTooLong;Filename too long;0xB0;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6bb1;SPVRTVIF_UpdateStatusReportInvalidLength;Received update status report with invalid packet length field;0xB1;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6bb2;SPVRTVIF_UpdateCrcFailure;Update status report does not contain expected CRC. There might be a bit flip in the update memory region.;0xB2;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6bb3;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);0xB3;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x61a0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;0xA0;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER +0x61a1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;0xA1;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER +0x68a0; PLMPHLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocMPSoCHelper.h;PLOC_MPSOC_HELPER +0x5aa0;PLSPVhLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER +0x5aa1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;0xA1;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER +0x5aa2;PLSPVhLP_PathNotExists;Received command with invalid pathname;0xA2;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER +0x5aa3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;0xA3;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER +0x56a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;0xA0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56a1;STRH_PingFailed;Ping command failed;0xA1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56a2;STRH_VersionReqFailed;Status in version reply signals error;0xA2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x6501;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE +0x6502;JSONBASE_SetNotExists;Requested set does not exist in json file;2;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE +0x6503;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE +0x56a3;STRH_InterfaceReqFailed;Status in interface reply signals error;0xA3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56a4;STRH_PowerReqFailed;Status in power reply signals error;0xA4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;0xA5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56a6;STRH_ActionFailed;Status of reply to action command signals error;0xA6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;0xA7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56a8;STRH_FilenameTooLong;Name of file received with command is too long;0xA8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56a9;STRH_InvalidProgram;Received version reply with invalid program ID;0xA9;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56aa;STRH_ReplyError;Status field reply signals error;0xAA;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);0xAB;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);0xAC;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56ad;STRH_RegionMismatch;Region mismatch between send and received data;0xAD;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56ae;STRH_AddressMismatch;Address mismatch between send and received data;0xAE;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56af;STRH_LengthMismatch;Length field mismatch between send and received data;0xAF;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b0;STRH_FileNotExists;Specified file does not exist;0xB0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b1;STRH_InvalidType;Download blob pixel command has invalid type field;0xB1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b2;STRH_InvalidId;Received FPGA action command with invalid ID;0xB2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b3;STRH_ReplyTooShort;Received reply is too short;0xB3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b4;STRH_CrcFailure;Received reply with invalid CRC;0xB4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;0xB5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;0xB6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b7;STRH_StartrackerRunningFirmware;Star tracker is in firmware mode but must be in bootloader mode to execute this command;0xB7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x56b8;STRH_StartrackerRunningBootloader;Star tracker is in bootloader mode but must be in firmware mode to execute this command;0xB8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x5fa0;STRHLP_SdNotMounted;SD card specified in path string not mounted;0xA0;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5fa1;STRHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5fa2;STRHLP_PathNotExists;Specified path does not exist;0xA2;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5fa3;STRHLP_FileCreationFailed;Failed to create download image or read flash file;0xA3;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5fa4;STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;0xA4;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5fa5;STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;0xA5;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5fa6;STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;0xA6;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5fa7;STRHLP_StatusError;Status field in reply signals error;0xA7;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5fa8;STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);0xA8;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5ca0;IPCI_PapbBusy;;0xA0;linux\obc\PapbVcInterface.h;CCSDS_IP_CORE_BRIDGE +0x62a0;PDEC_AbandonedCltu;;0xA0;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a1;PDEC_FrameDirty;;0xA1;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a2;PDEC_FrameIllegalMultipleReasons;;0xA2;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a3;PDEC_AdDiscardedLockout;;0xA3;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a4;PDEC_AdDiscardedWait;;0xA4;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a5;PDEC_AdDiscardedNsVs;;0xA5;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62b0;PDEC_CommandNotImplemented;Received action message with unknown action id;0xB0;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a6;PDEC_NoReport;;0xA6;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a7;PDEC_ErrorVersionNumber;;0xA7;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a8;PDEC_IllegalCombination;;0xA8;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62a9;PDEC_InvalidScId;;0xA9;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62aa;PDEC_InvalidVcIdMsb;;0xAA;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62ab;PDEC_InvalidVcIdLsb;;0xAB;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62ac;PDEC_NsNotZero;;0xAC;linux\obc\PdecHandler.h;PDEC_HANDLER +0x62ae;PDEC_InvalidBcCc;;0xAE;linux\obc\PdecHandler.h;PDEC_HANDLER +0x5da0;PTME_UnknownVcId;;0xA0;linux\obc\Ptme.h;PTME +0x64a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;0xA0;linux\obc\PtmeConfig.h;RATE_SETTER +0x64a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);0xA1;linux\obc\PtmeConfig.h;RATE_SETTER +0x64a2;RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;0xA2;linux\obc\PtmeConfig.h;RATE_SETTER +0x64a3;RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;0xA3;linux\obc\PtmeConfig.h;RATE_SETTER diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 4d5920a..2db6622 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -904,43 +904,9 @@ def add_ploc_supv_cmds(cmd_dict: ServiceOpCodeDictT): "55": ("PLOC Supervisor: Request ADC Report", {OpCodeDictKeys.TIMEOUT: 2.0}), "56": ("PLOC Supervisor: Reset PL", {OpCodeDictKeys.TIMEOUT: 2.0}), "57": ("PLOC Supervisor: Enable NVMs", {OpCodeDictKeys.TIMEOUT: 2.0}), + "58": ("PLOC Supervisor: Continue update", {OpCodeDictKeys.TIMEOUT: 2.0}), } service_ploc_supv_tuple = ("PLOC Supervisor", op_code_dict_srv_ploc_supv) - - op_code_dict_srv_ploc_updater = { - "0": ( - "Ploc Updater: Update uboot on partition A", - {OpCodeDictKeys.TIMEOUT: 2.0}, - ), - "1": ( - "Ploc Updater: Update bitstream on partition A", - {OpCodeDictKeys.TIMEOUT: 2.0}, - ), - "2": ( - "Ploc Updater: Update linux on partition A", - {OpCodeDictKeys.TIMEOUT: 2.0}, - ), - "3": ( - "Ploc Updater: Update application on partition A", - {OpCodeDictKeys.TIMEOUT: 2.0}, - ), - "4": ( - "Ploc Updater: Update uboot on partition B", - {OpCodeDictKeys.TIMEOUT: 2.0}, - ), - "5": ( - "Ploc Updater: Update bitstream on partition B", - {OpCodeDictKeys.TIMEOUT: 2.0}, - ), - "6": ( - "Ploc Updater: Update linux on partition B", - {OpCodeDictKeys.TIMEOUT: 2.0}, - ), - "7": ( - "Ploc Updater: Update application on partition B", - {OpCodeDictKeys.TIMEOUT: 2.0}, - ), - } cmd_dict[CustomServiceList.PLOC_SUPV.value] = service_ploc_supv_tuple cmd_dict[ CustomServiceList.PLOC_MEMORY_DUMPER.value diff --git a/pus_tc/devs/ploc_supervisor.py b/pus_tc/devs/ploc_supervisor.py index c6fcd56..8222cc7 100644 --- a/pus_tc/devs/ploc_supervisor.py +++ b/pus_tc/devs/ploc_supervisor.py @@ -98,6 +98,7 @@ class SupvActionIds: REQUEST_ADC_REPORT = 57 RESET_PL = 58 ENABLE_NVMS = 59 + CONTINUE_UPDATE = 60 class SupvHkIds: @@ -397,6 +398,11 @@ def pack_ploc_supv_commands( ) command = PusTelecommand(service=8, subservice=128, ssc=72, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) + elif op_code == "58": + tc_queue.appendleft((QueueCommands.PRINT, "PLOC Supervisor: Continue update")) + command = object_id + struct.pack("!I", SupvActionIds.CONTINUE_UPDATE) + command = PusTelecommand(service=8, subservice=128, ssc=73, app_data=command) + tc_queue.appendleft(command.pack_command_tuple()) return tc_queue From 181e6d62ad09c6f6dc57cc0eeac47bc203800d5b Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Mon, 23 May 2022 16:42:27 +0200 Subject: [PATCH 043/132] n --- pus_tc/system/proc.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 1cf7a1f..5b54a7f 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -297,6 +297,26 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): # mgt 1: imtq und hk # mgt 2.: imtq + dual side + dipole + if op_code in OpCodes.MGT_FT_DP: + key = KAI.MGT_FT[0] + pack_acs_command(tc_queue=tc_queue, op_code="acs-a") + + + sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) + + + pack_acs_command(tc_queue=tc_queue, op_code="acs-off") def listen_to_hk_for_x_seconds( From 15e0861c4def44d4a2facbfd8347b1933d671f21 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Mon, 23 May 2022 17:03:45 +0200 Subject: [PATCH 044/132] run generator script --- config/events.csv | 9 +- config/objects.csv | 13 ++ config/returnvalues.csv | 386 ++++++++++++++++++++-------------------- 3 files changed, 214 insertions(+), 194 deletions(-) diff --git a/config/events.csv b/config/events.csv index 8e38379..1bf9fa3 100644 --- a/config/events.csv +++ b/config/events.csv @@ -83,9 +83,12 @@ 11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;;mission\devices\devicedefinitions\powerDefinitions.h 11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission\devices\HeaterHandler.h 11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;;mission\devices\HeaterHandler.h -11402;0x2c8a;SWITCH_ALREADY_ON;LOW;;mission\devices\HeaterHandler.h -11403;0x2c8b;SWITCH_ALREADY_OFF;LOW;;mission\devices\HeaterHandler.h -11404;0x2c8c;MAIN_SWITCH_TIMEOUT;LOW;;mission\devices\HeaterHandler.h +11402;0x2c8a;HEATER_WENT_ON;INFO;;mission\devices\HeaterHandler.h +11403;0x2c8b;HEATER_WENT_OFF;INFO;;mission\devices\HeaterHandler.h +11404;0x2c8c;SWITCH_ALREADY_ON;LOW;;mission\devices\HeaterHandler.h +11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;;mission\devices\HeaterHandler.h +11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;;mission\devices\HeaterHandler.h +11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;;mission\devices\HeaterHandler.h 11500;0x2cec;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h 11501;0x2ced;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h 11502;0x2cee;DEPLOYMENT_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h diff --git a/config/objects.csv b/config/objects.csv index 22fed88..f0d29ee 100644 --- a/config/objects.csv +++ b/config/objects.csv @@ -37,9 +37,12 @@ 0x44260000;BPX_BATT_HANDLER 0x44300000;PLPCDU_HANDLER 0x443200A5;RAD_SENSOR +0x44330000;PLOC_UPDATER 0x44330001;PLOC_MEMORY_DUMPER 0x44330002;STR_HELPER 0x44330003;PLOC_MPSOC_HELPER +0x44330004;AXI_PTME_CONFIG +0x44330005;PTME_CONFIG 0x44330015;PLOC_MPSOC_HANDLER 0x44330016;PLOC_SUPERVISOR_HANDLER 0x44330017;PLOC_SUPERVISOR_HELPER @@ -68,6 +71,7 @@ 0x49010005;GPIO_IF 0x49020004;SPI_MAIN_COM_IF 0x49020005;SPI_RW_COM_IF +0x49020006;SPI_RTD_COM_IF 0x49030003;UART_COM_IF 0x49040002;I2C_COM_IF 0x49050001;CSP_COM_IF @@ -88,6 +92,7 @@ 0x53000005;PUS_SERVICE_5_EVENT_REPORTING 0x53000008;PUS_SERVICE_8_FUNCTION_MGMT 0x53000009;PUS_SERVICE_9_TIME_MGMT +0x53000011;PUS_SERVICE_11_TC_SCHEDULER 0x53000017;PUS_SERVICE_17_TEST 0x53000020;PUS_SERVICE_20_PARAMETERS 0x53000200;PUS_SERVICE_200_MODE_MGMT @@ -109,6 +114,14 @@ 0x5400CAFE;DUMMY_INTERFACE 0x54123456;LIBGPIOD_TEST 0x54694269;TEST_TASK +0x60000000;HEATER_0_PLOC_PROC_BRD +0x60000001;HEATER_1_PCDU_BRD +0x60000002;HEATER_2_ACS_BRD +0x60000003;HEATER_3_OBC_BRD +0x60000004;HEATER_4_CAMERA +0x60000005;HEATER_5_STR +0x60000006;HEATER_6_DRO +0x60000007;HEATER_7_HPA 0x73000001;ACS_BOARD_ASS 0x73000002;SUS_BOARD_ASS 0x73000003;TCS_BOARD_ASS diff --git a/config/returnvalues.csv b/config/returnvalues.csv index fef766e..ab5c75b 100644 --- a/config/returnvalues.csv +++ b/config/returnvalues.csv @@ -1,73 +1,73 @@ 0x0;OK;System-wide code for ok.;RETURN_OK;HasReturnvaluesIF.h;HasReturnvaluesIF 0x1;Failed;Unspecified system-wide code for failed.;RETURN_FAILED;HasReturnvaluesIF.h;HasReturnvaluesIF -0x6000;GOMS_PacketTooLong;;0;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6001;GOMS_InvalidTableId;;1;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6002;GOMS_InvalidAddress;;2;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6003;GOMS_InvalidParamSize;;3;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6004;GOMS_InvalidPayloadSize;;4;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x6005;GOMS_UnknownReplyId;;5;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER -0x52a1;HEATER_CommandNotSupported;;0xA1;mission\devices\HeaterHandler.h;HEATER_HANDLER -0x52a2;HEATER_InitFailed;;0xA2;mission\devices\HeaterHandler.h;HEATER_HANDLER -0x52a3;HEATER_InvalidSwitchNr;;0xA3;mission\devices\HeaterHandler.h;HEATER_HANDLER -0x52a4;HEATER_MainSwitchSetTimeout;;0xA4;mission\devices\HeaterHandler.h;HEATER_HANDLER -0x52a5;HEATER_CommandAlreadyWaiting;;0xA5;mission\devices\HeaterHandler.h;HEATER_HANDLER -0x54a0;IMTQ_InvalidCommandCode;;0xA0;mission\devices\IMTQHandler.h;IMTQ_HANDLER -0x54a1;IMTQ_ParameterMissing;;0xA1;mission\devices\IMTQHandler.h;IMTQ_HANDLER -0x54a2;IMTQ_ParameterInvalid;;0xA2;mission\devices\IMTQHandler.h;IMTQ_HANDLER -0x54a3;IMTQ_CcUnavailable;;0xA3;mission\devices\IMTQHandler.h;IMTQ_HANDLER -0x54a4;IMTQ_InternalProcessingError;;0xA4;mission\devices\IMTQHandler.h;IMTQ_HANDLER -0x54a5;IMTQ_RejectedWithoutReason;;0xA5;mission\devices\IMTQHandler.h;IMTQ_HANDLER -0x54a6;IMTQ_CmdErrUnknown;;0xA6;mission\devices\IMTQHandler.h;IMTQ_HANDLER -0x54a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;0xA7;mission\devices\IMTQHandler.h;IMTQ_HANDLER -0x55b0;RWHA_SpiWriteFailure;;0xB0;mission\devices\RwHandler.h;RW_HANDLER -0x55b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;0xB1;mission\devices\RwHandler.h;RW_HANDLER -0x55b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;0xB2;mission\devices\RwHandler.h;RW_HANDLER -0x55b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;0xB3;mission\devices\RwHandler.h;RW_HANDLER -0x55b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;0xB4;mission\devices\RwHandler.h;RW_HANDLER -0x55b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;0xB5;mission\devices\RwHandler.h;RW_HANDLER -0x55b6;RWHA_NoStartMarker;Expected a start marker as first byte;0xB6;mission\devices\RwHandler.h;RW_HANDLER -0x55a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000; 1000] or [1000; 65000];0xA0;mission\devices\RwHandler.h;RW_HANDLER -0x55a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;0xA1;mission\devices\RwHandler.h;RW_HANDLER -0x55a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;0xA2;mission\devices\RwHandler.h;RW_HANDLER -0x55a3;RWHA_ExecutionFailed;Command execution failed;0xA3;mission\devices\RwHandler.h;RW_HANDLER -0x55a4;RWHA_CrcError;Reaction wheel reply has invalid crc;0xA4;mission\devices\RwHandler.h;RW_HANDLER -0x69a0;SADPL_CommandNotSupported;;0xA0;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x69a1;SADPL_DeploymentAlreadyExecuting;;0xA1;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x69a2;SADPL_MainSwitchTimeoutFailure;;0xA2;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x69a3;SADPL_SwitchingDeplSa1Failed;;0xA3;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x69a4;SADPL_SwitchingDeplSa2Failed;;0xA4;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER -0x5ba0;SUSS_ErrorUnlockMutex;;0xA0;mission\devices\SusHandler.h;SUS_HANDLER -0x5ba1;SUSS_ErrorLockMutex;;0xA1;mission\devices\SusHandler.h;SUS_HANDLER -0x53a0;SYRLINKS_CrcFailure;;0xA0;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a1;SYRLINKS_UartFraminOrParityErrorAck;;0xA1;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a2;SYRLINKS_BadCharacterAck;;0xA2;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a3;SYRLINKS_BadParameterValueAck;;0xA3;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a4;SYRLINKS_BadEndOfFrameAck;;0xA4;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a5;SYRLINKS_UnknownCommandIdAck;;0xA5;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a6;SYRLINKS_BadCrcAck;;0xA6;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a7;SYRLINKS_ReplyWrongSize;;0xA7;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x53a8;SYRLINKS_MissingStartFrameCharacter;;0xA8;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER -0x66a0;NVMB_KeyNotExists;Specified key does not exist in json file;0xA0;mission\memory\NVMParameterBase.h;NVM_PARAM_BASE -0x63a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;0xA0;mission\tmtc\CCSDSHandler.h;CCSDS_HANDLER -0x4601; HGIO_UnknownGpioId;;1;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO -0x4602; HGIO_DriveGpioFailure;;2;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO -0x4603; HGIO_GpioTypeFailure;;3;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO -0x4604; HGIO_GpioInvalidInstance;;4;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO -0x4605; HGIO_GpioDuplicateDetected;;5;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO -0x4606; HGIO_GpioInitFailed;;6;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO -0x4607; HGIO_GpioGetValueFailed;;7;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO -0x4300; HSPI_HalTimeoutRetval;;0;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI -0x4301; HSPI_HalBusyRetval;;1;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI -0x4302; HSPI_HalErrorRetval;;2;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI -0x4401; HURT_UartReadFailure;;1;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART -0x4402; HURT_UartReadSizeMissmatch;;2;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART -0x4403; HURT_UartRxBufferTooSmall;;3;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART -0x4200; UXOS_ExecutionFinished;Execution of the current command has finished;0;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL -0x4201; UXOS_CommandPending;Command is pending. This will also be returned if the user tries to load another command but a command is still pending;1;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL -0x4202; UXOS_BytesRead;Some bytes have been read from the executing process;2;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL -0x4203; UXOS_CommandError;Command execution failed;3;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL -0x4204; UXOS_NoCommandLoadedOrPending;;4;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL -0x4206; UXOS_PcloseCallError;;6;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x6100; GOMS_PacketTooLong;;0;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6101; GOMS_InvalidTableId;;1;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6102; GOMS_InvalidAddress;;2;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6103; GOMS_InvalidParamSize;;3;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6104; GOMS_InvalidPayloadSize;;4;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x6105; GOMS_UnknownReplyId;;5;mission\devices\GomspaceDeviceHandler.h;GOM_SPACE_HANDLER +0x53a1; HEATER_CommandNotSupported;;0xA1;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x53a2; HEATER_InitFailed;;0xA2;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x53a3; HEATER_InvalidSwitchNr;;0xA3;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x53a4; HEATER_MainSwitchSetTimeout;;0xA4;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x53a5; HEATER_CommandAlreadyWaiting;;0xA5;mission\devices\HeaterHandler.h;HEATER_HANDLER +0x55a0; IMTQ_InvalidCommandCode;;0xA0;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x55a1; IMTQ_ParameterMissing;;0xA1;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x55a2; IMTQ_ParameterInvalid;;0xA2;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x55a3; IMTQ_CcUnavailable;;0xA3;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x55a4; IMTQ_InternalProcessingError;;0xA4;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x55a5; IMTQ_RejectedWithoutReason;;0xA5;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x55a6; IMTQ_CmdErrUnknown;;0xA6;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x55a7; IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;0xA7;mission\devices\IMTQHandler.h;IMTQ_HANDLER +0x56b0; RWHA_SpiWriteFailure;;0xB0;mission\devices\RwHandler.h;RW_HANDLER +0x56b1; RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;0xB1;mission\devices\RwHandler.h;RW_HANDLER +0x56b2; RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;0xB2;mission\devices\RwHandler.h;RW_HANDLER +0x56b3; RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;0xB3;mission\devices\RwHandler.h;RW_HANDLER +0x56b4; RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;0xB4;mission\devices\RwHandler.h;RW_HANDLER +0x56b5; RWHA_NoReply;Reaction wheel only responds with empty frames.;0xB5;mission\devices\RwHandler.h;RW_HANDLER +0x56b6; RWHA_NoStartMarker;Expected a start marker as first byte;0xB6;mission\devices\RwHandler.h;RW_HANDLER +0x56a0; RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000; 1000] or [1000; 65000];0xA0;mission\devices\RwHandler.h;RW_HANDLER +0x56a1; RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;0xA1;mission\devices\RwHandler.h;RW_HANDLER +0x56a2; RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;0xA2;mission\devices\RwHandler.h;RW_HANDLER +0x56a3; RWHA_ExecutionFailed;Command execution failed;0xA3;mission\devices\RwHandler.h;RW_HANDLER +0x56a4; RWHA_CrcError;Reaction wheel reply has invalid crc;0xA4;mission\devices\RwHandler.h;RW_HANDLER +0x6aa0; SADPL_CommandNotSupported;;0xA0;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x6aa1; SADPL_DeploymentAlreadyExecuting;;0xA1;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x6aa2; SADPL_MainSwitchTimeoutFailure;;0xA2;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x6aa3; SADPL_SwitchingDeplSa1Failed;;0xA3;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x6aa4; SADPL_SwitchingDeplSa2Failed;;0xA4;mission\devices\SolarArrayDeploymentHandler.h;SA_DEPL_HANDLER +0x5ca0; SUSS_ErrorUnlockMutex;;0xA0;mission\devices\SusHandler.h;SUS_HANDLER +0x5ca1; SUSS_ErrorLockMutex;;0xA1;mission\devices\SusHandler.h;SUS_HANDLER +0x54a0; SYRLINKS_CrcFailure;;0xA0;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x54a1; SYRLINKS_UartFraminOrParityErrorAck;;0xA1;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x54a2; SYRLINKS_BadCharacterAck;;0xA2;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x54a3; SYRLINKS_BadParameterValueAck;;0xA3;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x54a4; SYRLINKS_BadEndOfFrameAck;;0xA4;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x54a5; SYRLINKS_UnknownCommandIdAck;;0xA5;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x54a6; SYRLINKS_BadCrcAck;;0xA6;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x54a7; SYRLINKS_ReplyWrongSize;;0xA7;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x54a8; SYRLINKS_MissingStartFrameCharacter;;0xA8;mission\devices\SyrlinksHkHandler.h;SYRLINKS_HANDLER +0x67a0; NVMB_KeyNotExists;Specified key does not exist in json file;0xA0;mission\memory\NVMParameterBase.h;NVM_PARAM_BASE +0x64a0; CCSDS_CommandNotImplemented;Received action message with unknown action id;0xA0;mission\tmtc\CCSDSHandler.h;CCSDS_HANDLER +0x4701; HGIO_UnknownGpioId;;1;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4702; HGIO_DriveGpioFailure;;2;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4703; HGIO_GpioTypeFailure;;3;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4704; HGIO_GpioInvalidInstance;;4;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4705; HGIO_GpioDuplicateDetected;;5;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4706; HGIO_GpioInitFailed;;6;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4707; HGIO_GpioGetValueFailed;;7;fsfw\hal\src\fsfw_hal\linux\gpio\LinuxLibgpioIF.h;HAL_GPIO +0x4400; HSPI_HalTimeoutRetval;;0;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI +0x4401; HSPI_HalBusyRetval;;1;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI +0x4402; HSPI_HalErrorRetval;;2;fsfw\hal\src\fsfw_hal\stm32h7\spi\spiDefinitions.h;HAL_SPI +0x4501; HURT_UartReadFailure;;1;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART +0x4502; HURT_UartReadSizeMissmatch;;2;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART +0x4503; HURT_UartRxBufferTooSmall;;3;fsfw\hal\src\fsfw_hal\linux\uart\UartComIF.h;HAL_UART +0x4300; UXOS_ExecutionFinished;Execution of the current command has finished;0;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4301; UXOS_CommandPending;Command is pending. This will also be returned if the user tries to load another command but a command is still pending;1;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4302; UXOS_BytesRead;Some bytes have been read from the executing process;2;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4303; UXOS_CommandError;Command execution failed;3;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4304; UXOS_NoCommandLoadedOrPending;;4;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL +0x4306; UXOS_PcloseCallError;;6;fsfw\hal\src\fsfw_hal\linux\CommandExecutor.h;LINUX_OSAL 0x3101; CF_ObjectHasNoFunctions;;1;fsfw\src\fsfw\action\CommandsActionsIF.h;COMMANDS_ACTIONS_IF 0x3102; CF_AlreadyCommanding;;2;fsfw\src\fsfw\action\CommandsActionsIF.h;COMMANDS_ACTIONS_IF 0x3201; HF_IsBusy;;1;fsfw\src\fsfw\action\HasActionsIF.h;HAS_ACTIONS_IF @@ -201,6 +201,7 @@ 0x3e02; DLEE_DecodingError;;0x02;fsfw\src\fsfw\globalfunctions\DleEncoder.h;DLE_ENCODER 0x1701; HHI_ObjectNotHealthy;;1;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF 0x1702; HHI_InvalidHealthState;;2;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF +0x1703; HHI_IsExternallyControlled;;3;fsfw\src\fsfw\health\HasHealthIF.h;HAS_HEALTH_IF 0xf01; CM_UnknownCommand;;1;fsfw\src\fsfw\ipc\CommandMessageIF.h;COMMAND_MESSAGE 0x3901; MQI_Empty;;1;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF 0x3902; MQI_Full;No space left for more messages;2;fsfw\src\fsfw\ipc\MessageQueueIF.h;MESSAGE_QUEUE_IF @@ -218,17 +219,17 @@ 0x380a; MUX_MutexTimeout;;10;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF 0x380b; MUX_MutexInvalidId;;11;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF 0x380c; MUX_MutexDestroyedWhileWaiting;;12;fsfw\src\fsfw\ipc\MutexIF.h;MUTEX_IF -0x4100; FILS_GenericFileError;;0;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x4101; FILS_IsBusy;;1;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x4102; FILS_InvalidParameters;;2;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x4105; FILS_FileDoesNotExist;;5;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x4106; FILS_FileAlreadyExists;;6;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x4107; FILS_FileLocked;;7;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x410a; FILS_DirectoryDoesNotExist;;10;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x410b; FILS_DirectoryAlreadyExists;;11;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x410c; FILS_DirectoryNotEmpty;;12;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x410f; FILS_SequencePacketMissingWrite;;15;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM -0x4110; FILS_SequencePacketMissingRead;;16;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4200; FILS_GenericFileError;;0;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4201; FILS_IsBusy;;1;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4202; FILS_InvalidParameters;;2;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4205; FILS_FileDoesNotExist;;5;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4206; FILS_FileAlreadyExists;;6;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4207; FILS_FileLocked;;7;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x420a; FILS_DirectoryDoesNotExist;;10;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x420b; FILS_DirectoryAlreadyExists;;11;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x420c; FILS_DirectoryNotEmpty;;12;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x420f; FILS_SequencePacketMissingWrite;;15;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM +0x4210; FILS_SequencePacketMissingRead;;16;fsfw\src\fsfw\memory\HasFileSystemIF.h;FILE_SYSTEM 0x601; PP_DoItMyself;;1;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF 0x602; PP_PointsToVariable;;2;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF 0x603; PP_PointsToMemory;;3;fsfw\src\fsfw\memory\HasMemoryIF.h;HAS_MEMORY_IF @@ -314,6 +315,9 @@ 0x502; PS_SwitchTimeout;;2;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF 0x503; PS_FuseOn;;3;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF 0x504; PS_FuseOff;;4;fsfw\src\fsfw\power\PowerSwitchIF.h;POWER_SWITCH_IF +0x4101; PUS11_InvalidTypeTimeWindow;;1;fsfw\src\fsfw\pus\Service11TelecommandScheduling.h;PUS_SERVICE_11 +0x4102; PUS11_TimeshiftingNotPossible;;2;fsfw\src\fsfw\pus\Service11TelecommandScheduling.h;PUS_SERVICE_11 +0x4103; PUS11_InvalidRelativeTime;;3;fsfw\src\fsfw\pus\Service11TelecommandScheduling.h;PUS_SERVICE_11 0x4e1; RMP_CommandNoDescriptorsAvailable;;0xE1;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL 0x4e2; RMP_CommandBufferFull;;0xE2;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL 0x4e3; RMP_CommandChannelOutOfRange;;0xE3;fsfw\src\fsfw\rmap\RMAP.h;RMAP_CHANNEL @@ -444,115 +448,115 @@ 0x1f05; CSB_InvalidTc;;5;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE 0x1f06; CSB_InvalidObject;;6;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE 0x1f07; CSB_InvalidReply;;7;fsfw\src\fsfw\tmtcservices\CommandingServiceBase.h;COMMAND_SERVICE_BASE -0x4a00; SPPA_NoPacketFound;;0x00;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER -0x4a01; SPPA_SplitPacket;;0x01;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER -0x67a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;0xA0;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER -0x67a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER -0x7300; SCBU_KeyNotFound;;0;bsp_q7s\memory\scratchApi.h;SCRATCH_BUFFER -0x7200; SDMA_OpOngoing;;0;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x7201; SDMA_AlreadyOn;;1;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x7202; SDMA_AlreadyMounted;;2;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x7203; SDMA_AlreadyOff;;3;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x720a; SDMA_StatusFileNexists;;10;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x720b; SDMA_StatusFileFormatInvalid;;11;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x720c; SDMA_MountError;;12;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x720d; SDMA_UnmountError;;13;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x720e; SDMA_SystemCallError;;14;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x720f; SDMA_PopenCallError;;15;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER -0x6aa0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;0xA0;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;0xA1;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;0xA2;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;0xA3;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa4;MPSOCRTVIF_InvalidLength;Received command with invalid length;0xA4;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;0xA5;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;0xA6;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);0xA7;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;0xA8;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x6aa9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;0xA9;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF -0x57e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);0xE0;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD -0x57e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);0xE1;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD -0x6ba0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;0xA0;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba1;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;0xA1;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba2;SPVRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;0xA2;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba3;SPVRTVIF_InvalidApid;Received space packet with invalid APID from PLOC supervisor;0xA3;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba4;SPVRTVIF_GetTimeFailure;Failed to read current system time;0xA4;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba5;SPVRTVIF_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;0xA5;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba6;SPVRTVIF_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;0xA6;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba7;SPVRTVIF_InvalidLatchupId;Received latchup config command with invalid latchup ID;0xA7;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba8;SPVRTVIF_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;0xA8;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6ba9;SPVRTVIF_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;0xA9;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6baa;SPVRTVIF_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;0xAA;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bab;SPVRTVIF_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);0xAB;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bac;SPVRTVIF_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;0xAC;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bad;SPVRTVIF_PathDoesNotExist;Path to PLOC directory on SD card does not exist;0xAD;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bae;SPVRTVIF_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;0xAE;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6baf;SPVRTVIF_InvalidLength;Received action command has invalid length;0xAF;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bb0;SPVRTVIF_FilenameTooLong;Filename too long;0xB0;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bb1;SPVRTVIF_UpdateStatusReportInvalidLength;Received update status report with invalid packet length field;0xB1;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bb2;SPVRTVIF_UpdateCrcFailure;Update status report does not contain expected CRC. There might be a bit flip in the update memory region.;0xB2;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x6bb3;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);0xB3;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF -0x61a0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;0xA0;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER -0x61a1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;0xA1;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER -0x68a0; PLMPHLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocMPSoCHelper.h;PLOC_MPSOC_HELPER -0x5aa0;PLSPVhLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER -0x5aa1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;0xA1;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER -0x5aa2;PLSPVhLP_PathNotExists;Received command with invalid pathname;0xA2;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER -0x5aa3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;0xA3;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER -0x56a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;0xA0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56a1;STRH_PingFailed;Ping command failed;0xA1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56a2;STRH_VersionReqFailed;Status in version reply signals error;0xA2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x6501;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE -0x6502;JSONBASE_SetNotExists;Requested set does not exist in json file;2;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE -0x6503;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE -0x56a3;STRH_InterfaceReqFailed;Status in interface reply signals error;0xA3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56a4;STRH_PowerReqFailed;Status in power reply signals error;0xA4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;0xA5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56a6;STRH_ActionFailed;Status of reply to action command signals error;0xA6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;0xA7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56a8;STRH_FilenameTooLong;Name of file received with command is too long;0xA8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56a9;STRH_InvalidProgram;Received version reply with invalid program ID;0xA9;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56aa;STRH_ReplyError;Status field reply signals error;0xAA;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);0xAB;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);0xAC;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56ad;STRH_RegionMismatch;Region mismatch between send and received data;0xAD;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56ae;STRH_AddressMismatch;Address mismatch between send and received data;0xAE;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56af;STRH_LengthMismatch;Length field mismatch between send and received data;0xAF;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b0;STRH_FileNotExists;Specified file does not exist;0xB0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b1;STRH_InvalidType;Download blob pixel command has invalid type field;0xB1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b2;STRH_InvalidId;Received FPGA action command with invalid ID;0xB2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b3;STRH_ReplyTooShort;Received reply is too short;0xB3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b4;STRH_CrcFailure;Received reply with invalid CRC;0xB4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;0xB5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;0xB6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b7;STRH_StartrackerRunningFirmware;Star tracker is in firmware mode but must be in bootloader mode to execute this command;0xB7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x56b8;STRH_StartrackerRunningBootloader;Star tracker is in bootloader mode but must be in firmware mode to execute this command;0xB8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER -0x5fa0;STRHLP_SdNotMounted;SD card specified in path string not mounted;0xA0;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5fa1;STRHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5fa2;STRHLP_PathNotExists;Specified path does not exist;0xA2;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5fa3;STRHLP_FileCreationFailed;Failed to create download image or read flash file;0xA3;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5fa4;STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;0xA4;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5fa5;STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;0xA5;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5fa6;STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;0xA6;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5fa7;STRHLP_StatusError;Status field in reply signals error;0xA7;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5fa8;STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);0xA8;linux\devices\startracker\StrHelper.h;STR_HELPER -0x5ca0;IPCI_PapbBusy;;0xA0;linux\obc\PapbVcInterface.h;CCSDS_IP_CORE_BRIDGE -0x62a0;PDEC_AbandonedCltu;;0xA0;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a1;PDEC_FrameDirty;;0xA1;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a2;PDEC_FrameIllegalMultipleReasons;;0xA2;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a3;PDEC_AdDiscardedLockout;;0xA3;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a4;PDEC_AdDiscardedWait;;0xA4;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a5;PDEC_AdDiscardedNsVs;;0xA5;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62b0;PDEC_CommandNotImplemented;Received action message with unknown action id;0xB0;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a6;PDEC_NoReport;;0xA6;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a7;PDEC_ErrorVersionNumber;;0xA7;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a8;PDEC_IllegalCombination;;0xA8;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62a9;PDEC_InvalidScId;;0xA9;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62aa;PDEC_InvalidVcIdMsb;;0xAA;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62ab;PDEC_InvalidVcIdLsb;;0xAB;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62ac;PDEC_NsNotZero;;0xAC;linux\obc\PdecHandler.h;PDEC_HANDLER -0x62ae;PDEC_InvalidBcCc;;0xAE;linux\obc\PdecHandler.h;PDEC_HANDLER -0x5da0;PTME_UnknownVcId;;0xA0;linux\obc\Ptme.h;PTME -0x64a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;0xA0;linux\obc\PtmeConfig.h;RATE_SETTER -0x64a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);0xA1;linux\obc\PtmeConfig.h;RATE_SETTER -0x64a2;RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;0xA2;linux\obc\PtmeConfig.h;RATE_SETTER -0x64a3;RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;0xA3;linux\obc\PtmeConfig.h;RATE_SETTER +0x4b00; SPPA_NoPacketFound;;0x00;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER +0x4b01; SPPA_SplitPacket;;0x01;fsfw\src\fsfw\tmtcservices\SpacePacketParser.h;SPACE_PACKET_PARSER +0x68a0; FSHLP_SdNotMounted;SD card specified with path string not mounted;0xA0;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER +0x68a1; FSHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;bsp_q7s\memory\FilesystemHelper.h;FILE_SYSTEM_HELPER +0x7400; SCBU_KeyNotFound;;0;bsp_q7s\memory\scratchApi.h;SCRATCH_BUFFER +0x7300; SDMA_OpOngoing;;0;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x7301; SDMA_AlreadyOn;;1;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x7302; SDMA_AlreadyMounted;;2;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x7303; SDMA_AlreadyOff;;3;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x730a; SDMA_StatusFileNexists;;10;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x730b; SDMA_StatusFileFormatInvalid;;11;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x730c; SDMA_MountError;;12;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x730d; SDMA_UnmountError;;13;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x730e; SDMA_SystemCallError;;14;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x730f; SDMA_PopenCallError;;15;bsp_q7s\memory\SdCardManager.h;SD_CARD_MANAGER +0x6ba0; MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;0xA0;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba1; MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;0xA1;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba2; MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;0xA2;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba3; MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;0xA3;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba4; MPSOCRTVIF_InvalidLength;Received command with invalid length;0xA4;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba5; MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;0xA5;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba6; MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;0xA6;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba7; MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);0xA7;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba8; MPSOCRTVIF_InvalidParameter;Command has invalid parameter;0xA8;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x6ba9; MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;0xA9;linux\devices\devicedefinitions\MPSoCReturnValuesIF.h;MPSOC_RETURN_VALUES_IF +0x58e0; DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);0xE0;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD +0x58e1; DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);0xE1;linux\devices\devicedefinitions\PlocMPSoCDefinitions.h;DWLPWRON_CMD +0x6ca0; SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;0xA0;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca1; SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;0xA1;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca2; SPVRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;0xA2;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca3; SPVRTVIF_InvalidApid;Received space packet with invalid APID from PLOC supervisor;0xA3;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca4; SPVRTVIF_GetTimeFailure;Failed to read current system time;0xA4;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca5; SPVRTVIF_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;0xA5;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca6; SPVRTVIF_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;0xA6;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca7; SPVRTVIF_InvalidLatchupId;Received latchup config command with invalid latchup ID;0xA7;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca8; SPVRTVIF_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;0xA8;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6ca9; SPVRTVIF_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;0xA9;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6caa; SPVRTVIF_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;0xAA;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6cab; SPVRTVIF_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);0xAB;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6cac; SPVRTVIF_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;0xAC;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6cad; SPVRTVIF_PathDoesNotExist;Path to PLOC directory on SD card does not exist;0xAD;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6cae; SPVRTVIF_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;0xAE;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6caf; SPVRTVIF_InvalidLength;Received action command has invalid length;0xAF;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6cb0; SPVRTVIF_FilenameTooLong;Filename too long;0xB0;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6cb1; SPVRTVIF_UpdateStatusReportInvalidLength;Received update status report with invalid packet length field;0xB1;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6cb2; SPVRTVIF_UpdateCrcFailure;Update status report does not contain expected CRC. There might be a bit flip in the update memory region.;0xB2;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x6cb3; SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);0xB3;linux\devices\devicedefinitions\SupvReturnValuesIF.h;SUPV_RETURN_VALUES_IF +0x62a0; PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;0xA0;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER +0x62a1; PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;0xA1;linux\devices\ploc\PlocMemoryDumper.h;PLOC_MEMORY_DUMPER +0x69a0; PLMPHLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocMPSoCHelper.h;PLOC_MPSOC_HELPER +0x5ba0; PLSPVhLP_FileClosedAccidentally;File accidentally close;0xA0;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER +0x5ba1; PLSPVhLP_ProcessTerminated;Process has been terminated by command;0xA1;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER +0x5ba2; PLSPVhLP_PathNotExists;Received command with invalid pathname;0xA2;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER +0x5ba3; PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;0xA3;linux\devices\ploc\PlocSupvHelper.h;PLOC_SUPV_HELPER +0x57a0; STRH_TemperatureReqFailed;Status in temperature reply signals error;0xA0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57a1; STRH_PingFailed;Ping command failed;0xA1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57a2; STRH_VersionReqFailed;Status in version reply signals error;0xA2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x6601; JSONBASE_JsonFileNotExists;Specified json file does not exist;1;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE +0x6602; JSONBASE_SetNotExists;Requested set does not exist in json file;2;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE +0x6603; JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;linux\devices\startracker\ArcsecJsonParamBase.h;ARCSEC_JSON_BASE +0x57a3; STRH_InterfaceReqFailed;Status in interface reply signals error;0xA3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57a4; STRH_PowerReqFailed;Status in power reply signals error;0xA4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57a5; STRH_SetParamFailed;Status of reply to parameter set command signals error;0xA5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57a6; STRH_ActionFailed;Status of reply to action command signals error;0xA6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57a7; STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;0xA7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57a8; STRH_FilenameTooLong;Name of file received with command is too long;0xA8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57a9; STRH_InvalidProgram;Received version reply with invalid program ID;0xA9;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57aa; STRH_ReplyError;Status field reply signals error;0xAA;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57ab; STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);0xAB;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57ac; STRH_InvalidLength;Received command with invalid length (too few or too many parameters);0xAC;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57ad; STRH_RegionMismatch;Region mismatch between send and received data;0xAD;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57ae; STRH_AddressMismatch;Address mismatch between send and received data;0xAE;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57af; STRH_LengthMismatch;Length field mismatch between send and received data;0xAF;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b0; STRH_FileNotExists;Specified file does not exist;0xB0;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b1; STRH_InvalidType;Download blob pixel command has invalid type field;0xB1;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b2; STRH_InvalidId;Received FPGA action command with invalid ID;0xB2;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b3; STRH_ReplyTooShort;Received reply is too short;0xB3;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b4; STRH_CrcFailure;Received reply with invalid CRC;0xB4;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b5; STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;0xB5;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b6; STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;0xB6;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b7; STRH_StartrackerRunningFirmware;Star tracker is in firmware mode but must be in bootloader mode to execute this command;0xB7;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x57b8; STRH_StartrackerRunningBootloader;Star tracker is in bootloader mode but must be in firmware mode to execute this command;0xB8;linux\devices\startracker\StarTrackerHandler.h;STR_HANDLER +0x60a0; STRHLP_SdNotMounted;SD card specified in path string not mounted;0xA0;linux\devices\startracker\StrHelper.h;STR_HELPER +0x60a1; STRHLP_FileNotExists;Specified file does not exist on filesystem;0xA1;linux\devices\startracker\StrHelper.h;STR_HELPER +0x60a2; STRHLP_PathNotExists;Specified path does not exist;0xA2;linux\devices\startracker\StrHelper.h;STR_HELPER +0x60a3; STRHLP_FileCreationFailed;Failed to create download image or read flash file;0xA3;linux\devices\startracker\StrHelper.h;STR_HELPER +0x60a4; STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;0xA4;linux\devices\startracker\StrHelper.h;STR_HELPER +0x60a5; STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;0xA5;linux\devices\startracker\StrHelper.h;STR_HELPER +0x60a6; STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;0xA6;linux\devices\startracker\StrHelper.h;STR_HELPER +0x60a7; STRHLP_StatusError;Status field in reply signals error;0xA7;linux\devices\startracker\StrHelper.h;STR_HELPER +0x60a8; STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);0xA8;linux\devices\startracker\StrHelper.h;STR_HELPER +0x5da0; IPCI_PapbBusy;;0xA0;linux\obc\PapbVcInterface.h;CCSDS_IP_CORE_BRIDGE +0x63a0; PDEC_AbandonedCltu;;0xA0;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a1; PDEC_FrameDirty;;0xA1;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a2; PDEC_FrameIllegalMultipleReasons;;0xA2;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a3; PDEC_AdDiscardedLockout;;0xA3;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a4; PDEC_AdDiscardedWait;;0xA4;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a5; PDEC_AdDiscardedNsVs;;0xA5;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63b0; PDEC_CommandNotImplemented;Received action message with unknown action id;0xB0;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a6; PDEC_NoReport;;0xA6;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a7; PDEC_ErrorVersionNumber;;0xA7;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a8; PDEC_IllegalCombination;;0xA8;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63a9; PDEC_InvalidScId;;0xA9;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63aa; PDEC_InvalidVcIdMsb;;0xAA;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63ab; PDEC_InvalidVcIdLsb;;0xAB;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63ac; PDEC_NsNotZero;;0xAC;linux\obc\PdecHandler.h;PDEC_HANDLER +0x63ae; PDEC_InvalidBcCc;;0xAE;linux\obc\PdecHandler.h;PDEC_HANDLER +0x5ea0; PTME_UnknownVcId;;0xA0;linux\obc\Ptme.h;PTME +0x65a0; RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;0xA0;linux\obc\PtmeConfig.h;RATE_SETTER +0x65a1; RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);0xA1;linux\obc\PtmeConfig.h;RATE_SETTER +0x65a2; RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;0xA2;linux\obc\PtmeConfig.h;RATE_SETTER +0x65a3; RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;0xA3;linux\obc\PtmeConfig.h;RATE_SETTER From 7e36b387fe83505bcd0cedbeabd1ba01fd912af9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 17:50:08 +0200 Subject: [PATCH 045/132] add rtd cmds --- config/definitions.py | 1 + config/object_ids.py | 18 ++++++ pus_tc/cmd_definitions.py | 2 + pus_tc/devs/rtd.py | 113 ++++++++++++++++++++++++++++++++++++++ pus_tc/tc_packer_hook.py | 3 + 5 files changed, 137 insertions(+) create mode 100644 pus_tc/devs/rtd.py diff --git a/config/definitions.py b/config/definitions.py index 708701f..5aa4174 100644 --- a/config/definitions.py +++ b/config/definitions.py @@ -48,5 +48,6 @@ class CustomServiceList(enum.Enum): TCS_ASS = "tcs-ass" TIME = "time" PROCEDURE = "proc" + RTD = "rtd" TVTTESTPROCEDURE = "tvtestproc" CONTROLLERS = "controllers" diff --git a/config/object_ids.py b/config/object_ids.py index b2b3aaf..045d671 100644 --- a/config/object_ids.py +++ b/config/object_ids.py @@ -77,6 +77,24 @@ HEATER_5_STR = bytes([0x60, 0x00, 0x00, 0x05]) HEATER_6_DRO = bytes([0x60, 0x00, 0x00, 0x06]) HEATER_7_HPA = bytes([0x60, 0x00, 0x00, 0x07]) +# RTDs +RTD_0_PLOC_HSPD = bytes([0x44, 0x42, 0x00, 0x16]) +RTD_1_PLOC_MISSIONBRD= bytes([0x44, 0x42, 0x00, 0x17]) +RTD_2_4K_CAM = bytes([0x44, 0x42, 0x00, 0x18]) +RTD_3_DAC_HSPD = bytes([0x44, 0x42, 0x00, 0x19]) +RTD_4_STR = bytes([0x44, 0x42, 0x00, 0x20]) +RTD_5_RW1_MX_MY = bytes([0x44, 0x42, 0x00, 0x21]) +RTD_6_DRO = bytes([0x44, 0x42, 0x00, 0x22]) +RTD_7_SCEX = bytes([0x44, 0x42, 0x00, 0x23]) +RTD_8_X8 = bytes([0x44, 0x42, 0x00, 0x24]) +RTD_9_HPA = bytes([0x44, 0x42, 0x00, 0x25]) +RTD_10_PL_TX = bytes([0x44, 0x42, 0x00, 0x26]) +RTD_11_MPA = bytes([0x44, 0x42, 0x00, 0x27]) +RTD_12_ACU = bytes([0x44, 0x42, 0x00, 0x28]) +RTD_13_PLPCDU_HSPD = bytes([0x44, 0x42, 0x00, 0x29]) +RTD_14_TCS_BRD = bytes([0x44, 0x42, 0x00, 0x30]) +RTD_15_IMTQ = bytes([0x44, 0x42, 0x00, 0x31]) + # System and Assembly Objects ACS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x01]) SUS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x02]) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 4d5920a..655afc3 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -8,6 +8,7 @@ from tmtccmd.config import ( ) from config.definitions import CustomServiceList from pus_tc.devs.heater import add_heater_cmds +from pus_tc.devs.rtd import specify_rtd_cmds from pus_tc.devs.reaction_wheels import add_rw_cmds from pus_tc.devs.bpx_batt import BpxOpCodes @@ -20,6 +21,7 @@ def get_eive_service_op_code_dict() -> ServiceOpCodeDictT: add_core_controller_definitions(cmd_dict=service_op_code_dict) add_pl_pcdu_cmds(cmd_dict=service_op_code_dict) add_pcdu_cmds(cmd_dict=service_op_code_dict) + specify_rtd_cmds(cmd_dict=service_op_code_dict) add_imtq_cmds(cmd_dict=service_op_code_dict) add_rad_sens_cmds(cmd_dict=service_op_code_dict) add_rw_cmds(cmd_dict=service_op_code_dict) diff --git a/pus_tc/devs/rtd.py b/pus_tc/devs/rtd.py new file mode 100644 index 0000000..f15dc32 --- /dev/null +++ b/pus_tc/devs/rtd.py @@ -0,0 +1,113 @@ +from typing import Optional + +from config.definitions import CustomServiceList +from spacepackets.ecss import PusTelecommand +from tmtccmd.config import ServiceOpCodeDictT, add_op_code_entry, add_service_op_code_entry +from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.utility import ObjectId +from tmtccmd.tc.pus_200_fsfw_modes import Modes, pack_mode_data, Subservices +import config.object_ids as oids +from config.object_ids import get_object_ids + +RTD_IDS = [ + oids.RTD_0_PLOC_HSPD, + oids.RTD_1_PLOC_MISSIONBRD, + oids.RTD_2_4K_CAM, + oids.RTD_3_DAC_HSPD, + oids.RTD_4_STR, + oids.RTD_5_RW1_MX_MY, + oids.RTD_6_DRO, + oids.RTD_7_SCEX, + oids.RTD_8_X8, + oids.RTD_9_HPA, + oids.RTD_10_PL_TX, + oids.RTD_11_MPA, + oids.RTD_12_ACU, + oids.RTD_13_PLPCDU_HSPD, + oids.RTD_14_TCS_BRD, + oids.RTD_15_IMTQ +] + + +class OpCodes: + ON = ["0", "on"] + OFF = ["1", "off"] + NORMAL = ["2", "normal"] + + +class Info: + ON = "Switch handler on" + OFF = "Switch handler off" + NORMAL = "Switch handler normal" + + +def specify_rtd_cmds(cmd_dict: ServiceOpCodeDictT): + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.ON, + info=Info.ON + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL, + info=Info.NORMAL + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.OFF, + info=Info.OFF + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + op_code_entry=op_code_dict, + name=CustomServiceList.RTD.value, + info="RTD commands" + ) + + +def pack_rtd_commands(op_code: str, object_id: Optional[ObjectId], tc_queue: TcQueueT): + if object_id is not None and object_id not in RTD_IDS: + print("Specified object ID not a valid RTD ID") + object_id = None + if object_id is None: + tgt_rtd_idx = prompt_rtd_idx() + object_id_dict = get_object_ids() + object_id = object_id_dict.get(RTD_IDS[tgt_rtd_idx]) + if op_code in OpCodes.ON: + app_data = pack_mode_data(object_id=object_id.as_bytes, mode=Modes.ON, submode=0) + cmd = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=app_data + ) + tc_queue.appendleft(cmd.pack_command_tuple()) + if op_code in OpCodes.NORMAL: + app_data = pack_mode_data(object_id=object_id.as_bytes, mode=Modes.NORMAL, submode=0) + cmd = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=app_data + ) + tc_queue.appendleft(cmd.pack_command_tuple()) + if op_code in OpCodes.OFF: + app_data = pack_mode_data(object_id=object_id.as_bytes, mode=Modes.OFF, submode=0) + cmd = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=app_data + ) + tc_queue.appendleft(cmd.pack_command_tuple()) + + +def prompt_rtd_idx(): + while True: + rtd_idx = input("Please specify RTD index [0-15]: ") + if not rtd_idx.isdigit(): + print("Invalid input") + continue + rtd_idx = int(rtd_idx) + if rtd_idx < 0 or rtd_idx > 15: + print("Invalid device index") + continue + return rtd_idx diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py index c2e3f60..97bb051 100644 --- a/pus_tc/tc_packer_hook.py +++ b/pus_tc/tc_packer_hook.py @@ -5,6 +5,7 @@ import os from collections import deque from typing import Union +from pus_tc.devs.rtd import pack_rtd_commands from spacepackets.ecss import PusTelecommand from tmtccmd.com_if.com_interface_base import CommunicationInterface from tmtccmd.config.definitions import CoreServiceList, QueueCommands @@ -111,6 +112,8 @@ def pack_service_queue_user( return pack_p60dock_cmds( object_id=object_id, tc_queue=service_queue, op_code=op_code ) + if service == CustomServiceList.RTD.value: + return pack_rtd_commands(object_id=None, tc_queue=service_queue, op_code=op_code) if service == CustomServiceList.PDU1.value: object_id = PDU_1_HANDLER_ID return pack_pdu1_commands( From 4de3e7d107ae16c7c89eae340419ec92097fb92f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:25:25 +0200 Subject: [PATCH 046/132] rad sensor reading works --- pus_tc/cmd_definitions.py | 15 +---- pus_tc/devs/rad_sensor.py | 118 ++++++++++++++++++++++------------- pus_tc/prompt_parameters.py | 29 ++++++--- pus_tc/system/controllers.py | 8 ++- pus_tc/tc_packer_hook.py | 4 +- pus_tm/devs/rad_sensor.py | 6 +- tmtcgui.py | 9 +-- 7 files changed, 113 insertions(+), 76 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 2db6622..32f6c2c 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -1,4 +1,5 @@ from pus_tc.devs.gps import GpsOpCodes +from pus_tc.devs.rad_sensor import add_rad_sens_cmds from tmtccmd.config import ( add_op_code_entry, add_service_op_code_entry, @@ -775,20 +776,6 @@ def add_imtq_cmds(cmd_dict: ServiceOpCodeDictT): cmd_dict[CustomServiceList.IMTQ.value] = service_imtq_tuple -def add_rad_sens_cmds(cmd_dict: ServiceOpCodeDictT): - op_code_dict_srv_rad_sensor = { - "0": ("Radiation Sensor: Set mode on", {OpCodeDictKeys.TIMEOUT: 2.0}), - "1": ("Radiation Sensor: Set mode normal", {OpCodeDictKeys.TIMEOUT: 2.0}), - "2": ("Radiation Sensor: Set mode off", {OpCodeDictKeys.TIMEOUT: 2.0}), - "3": ("Radiation Sensor: Start conversions", {OpCodeDictKeys.TIMEOUT: 2.0}), - "4": ("Radiation Sensor: Read conversions", {OpCodeDictKeys.TIMEOUT: 2.0}), - "5": ("Radiation Sensor: Enable debug output", {OpCodeDictKeys.TIMEOUT: 2.0}), - "6": ("Radiation Sensor: Disable debug putput", {OpCodeDictKeys.TIMEOUT: 2.0}), - } - service_rad_sensor_tuple = ("Radiation Sensor", op_code_dict_srv_rad_sensor) - cmd_dict[CustomServiceList.RAD_SENSOR.value] = service_rad_sensor_tuple - - def add_ploc_mpsoc_cmds(cmd_dict: ServiceOpCodeDictT): op_code_dict_srv_ploc_mpsoc = { "0": ("Ploc MPSoC: Set mode off", {OpCodeDictKeys.TIMEOUT: 2.0}), diff --git a/pus_tc/devs/rad_sensor.py b/pus_tc/devs/rad_sensor.py index 30c6d24..7d66597 100644 --- a/pus_tc/devs/rad_sensor.py +++ b/pus_tc/devs/rad_sensor.py @@ -7,17 +7,39 @@ """ import struct -from tmtccmd.config.definitions import QueueCommands +from config.definitions import CustomServiceList +from tmtccmd.config import add_op_code_entry, add_service_op_code_entry +from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT, OpCodeDictKeys from tmtccmd.tc.packer import TcQueueT from spacepackets.ecss.tc import PusTelecommand from pus_tc.service_200_mode import pack_mode_data, Modes +from tmtccmd.tc.pus_3_fsfw_hk import generate_one_hk_command, make_sid +from tmtccmd.utility import ObjectId class SetIds: HK = 3 +class OpCodes: + ON = ["0", "on"] + NORMAL = ["1", "normal"] + OFF = ["2", "off"] + REQ_HK_ONCE = ["3", "hk-os"] + DEBUG_ON = ["10", "dbg-on"] + DEBUG_OFF = ["11", "dbg-off"] + + +class Info: + ON = "Switch Rad Sensor on" + NORMAL = "Switch Rad Sensor normal" + OFF = "Switch Rad sensor off" + REQ_OS_HK = "Request one-shot HK" + DEBUG_ON = "Switch debug output on" + DEBUG_OFF = "Switch debug output off" + + class CommandIds: START_CONVERSIONS = 2 READ_CONVERSIONS = 3 @@ -25,52 +47,64 @@ class CommandIds: DISABLE_DEBUG_OUTPUT = 5 -def pack_rad_sensor_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: str): - tc_queue.appendleft( - ( - QueueCommands.PRINT, - "Testing radiation sensor handler with object id: 0x" + object_id.hex(), - ) +def add_rad_sens_cmds(cmd_dict: ServiceOpCodeDictT): + + op_code_dict = dict() + add_op_code_entry(op_code_dict=op_code_dict, info=Info.ON, keys=OpCodes.ON) + add_op_code_entry(op_code_dict=op_code_dict, info=Info.OFF, keys=OpCodes.OFF) + add_op_code_entry(op_code_dict=op_code_dict, info=Info.NORMAL, keys=OpCodes.NORMAL) + add_op_code_entry( + op_code_dict=op_code_dict, info=Info.REQ_OS_HK, keys=OpCodes.REQ_HK_ONCE + ) + add_op_code_entry( + op_code_dict=op_code_dict, info=Info.DEBUG_ON, keys=OpCodes.DEBUG_ON + ) + add_op_code_entry( + op_code_dict=op_code_dict, info=Info.DEBUG_OFF, keys=OpCodes.DEBUG_OFF + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.RAD_SENSOR.value, + info="Radiation Sensor", + op_code_entry=op_code_dict, ) - if op_code == "0": - tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Switch to mode on")) - mode_data = pack_mode_data(object_id, Modes.ON, 0) - command = PusTelecommand(service=200, subservice=1, ssc=41, app_data=mode_data) - tc_queue.appendleft(command.pack_command_tuple()) - if op_code == "1": - tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Switch to mode normal")) - mode_data = pack_mode_data(object_id, Modes.NORMAL, 0) - command = PusTelecommand(service=200, subservice=1, ssc=42, app_data=mode_data) - tc_queue.appendleft(command.pack_command_tuple()) +def pack_rad_sensor_test_into(object_id: ObjectId, tc_queue: TcQueueT, op_code: str): + tc_queue.appendleft( + (QueueCommands.PRINT, f"Commanding Radiation sensor handler {object_id}") + ) - if op_code == "2": - tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Switch to mode off")) - mode_data = pack_mode_data(object_id, Modes.OFF, 0) - command = PusTelecommand(service=200, subservice=1, ssc=42, app_data=mode_data) + if op_code in OpCodes.ON: + rad_sensor_mode_cmd(object_id, Modes.ON, Info.ON, tc_queue) + if op_code in OpCodes.NORMAL: + rad_sensor_mode_cmd(object_id, Modes.NORMAL, Info.NORMAL, tc_queue) + if op_code in OpCodes.OFF: + rad_sensor_mode_cmd(object_id, Modes.OFF, Info.OFF, tc_queue) + if op_code in OpCodes.REQ_HK_ONCE: + tc_queue.appendleft((QueueCommands.PRINT, f"Rad sensor: {Info.REQ_OS_HK}")) + cmd = generate_one_hk_command( + sid=make_sid(object_id.as_bytes, set_id=SetIds.HK), ssc=0 + ) + tc_queue.appendleft(cmd.pack_command_tuple()) + if op_code in OpCodes.DEBUG_ON: + tc_queue.appendleft((QueueCommands.PRINT, f"Rad sensor: {Info.DEBUG_ON}")) + command = object_id.as_bytes + struct.pack("!I", CommandIds.ENABLE_DEBUG_OUTPUT) + command = PusTelecommand(service=8, subservice=128, ssc=45, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) - - if op_code == "3": - tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Start conversions")) - command = object_id + struct.pack("!I", CommandIds.START_CONVERSIONS) - command = PusTelecommand(service=8, subservice=128, ssc=43, app_data=command) - tc_queue.appendleft(command.pack_command_tuple()) - - if op_code == "4": - tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Read conversions")) - command = object_id + struct.pack("!I", CommandIds.READ_CONVERSIONS) - command = PusTelecommand(service=8, subservice=128, ssc=44, app_data=command) - tc_queue.appendleft(command.pack_command_tuple()) - - if op_code == "5": - tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Enable debug output")) - command = object_id + struct.pack("!I", CommandIds.ENABLE_DEBUG_OUTPUT) + if op_code in OpCodes.DEBUG_OFF: + tc_queue.appendleft((QueueCommands.PRINT, f"Rad sensor: {Info.DEBUG_OFF}")) + command = object_id.as_bytes + struct.pack( + "!I", CommandIds.DISABLE_DEBUG_OUTPUT + ) command = PusTelecommand(service=8, subservice=128, ssc=45, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) - if op_code == "6": - tc_queue.appendleft((QueueCommands.PRINT, "Rad sensor: Disable debug output")) - command = object_id + struct.pack("!I", CommandIds.DISABLE_DEBUG_OUTPUT) - command = PusTelecommand(service=8, subservice=128, ssc=45, app_data=command) - tc_queue.appendleft(command.pack_command_tuple()) + +def rad_sensor_mode_cmd( + object_id: ObjectId, mode: Modes, info: str, tc_queue: TcQueueT +): + tc_queue.appendleft((QueueCommands.PRINT, f"Rad sensor: {info}")) + mode_data = pack_mode_data(object_id.as_bytes, mode, 0) + command = PusTelecommand(service=200, subservice=1, ssc=41, app_data=mode_data) + tc_queue.appendleft(command.pack_command_tuple()) diff --git a/pus_tc/prompt_parameters.py b/pus_tc/prompt_parameters.py index aa7dacb..feca256 100644 --- a/pus_tc/prompt_parameters.py +++ b/pus_tc/prompt_parameters.py @@ -1,5 +1,11 @@ from PyQt5.QtWidgets import ( - QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QGroupBox, QGridLayout, QLineEdit + QDialog, + QDialogButtonBox, + QVBoxLayout, + QLabel, + QGroupBox, + QGridLayout, + QLineEdit, ) from PyQt5 import QtCore @@ -16,12 +22,13 @@ class Parameter: self.widget = widget self.value = self.defaultValue self.widget.setPlaceholderText(self.defaultValue) - + def reset(self): self.value = self.defaultValue self.widget.setPlaceholderText(self.defaultValue) self.widget.setText("") + class ParameterDialog(QDialog): def __init__(self): super().__init__() @@ -42,7 +49,7 @@ class ParameterDialog(QDialog): self.rootLayout.addWidget(self.group) self.rootLayout.addWidget(self.buttonBox) self.setLayout(self.rootLayout) - + self.groupLayout = QGridLayout() self.group.setLayout(self.groupLayout) @@ -59,7 +66,6 @@ class ParameterDialog(QDialog): self.parameters[name] = parameter - def _reset(self): for value in self.parameters.values(): value.reset() @@ -80,14 +86,13 @@ class ParameterDialog(QDialog): super().reject() - - - """Prompt the user to specify additional Parameters :param parameterList: array of dictionaries with name and defaultValue attributes :return: dict with all names as key and user supplied input as value string """ + + def prompt_parameters(parameterList): gui = get_global(CoreGlobalIds.GUI) mode = get_global(CoreGlobalIds.MODE) @@ -95,9 +100,10 @@ def prompt_parameters(parameterList): # gui only works in cont mode right now if gui and mode == CoreModeList.CONTINUOUS_MODE: return _gui_prompt(parameterList) - else: + else: return _cli_prompt(parameterList) + def _gui_prompt(parameterList): dialog = ParameterDialog() for parameter in parameterList: @@ -105,11 +111,14 @@ def _gui_prompt(parameterList): dialog.exec_() return dialog.getParameters() + def _cli_prompt(parameterList): result = {} for parameter in parameterList: - userInput = input("Specify {} [{}]: ".format(parameter["name"], parameter["defaultValue"])) + userInput = input( + "Specify {} [{}]: ".format(parameter["name"], parameter["defaultValue"]) + ) if userInput == "": userInput = parameter["defaultValue"] result[parameter["name"]] = userInput - return result \ No newline at end of file + return result diff --git a/pus_tc/system/controllers.py b/pus_tc/system/controllers.py index 1f44f32..b7949d2 100644 --- a/pus_tc/system/controllers.py +++ b/pus_tc/system/controllers.py @@ -18,8 +18,12 @@ class Info: def pack_controller_commands(tc_queue: TcQueueT, op_code: str): - parameters = prompt_parameters([{"name": "Mode", "defaultValue": "2"}, { - "name": "Submode", "defaultValue": "0"}]) + parameters = prompt_parameters( + [ + {"name": "Mode", "defaultValue": "2"}, + {"name": "Submode", "defaultValue": "0"}, + ] + ) mode = int(parameters["Mode"]) if mode < 0 or mode > 2: print("Invalid Mode, defaulting to OFF") diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py index c2e3f60..9a671d9 100644 --- a/pus_tc/tc_packer_hook.py +++ b/pus_tc/tc_packer_hook.py @@ -69,6 +69,7 @@ from config.object_ids import ( SYRLINKS_HANDLER_ID, SOLAR_ARRAY_DEPLOYMENT_ID, RW_ASSEMBLY, + get_object_ids, ) @@ -98,6 +99,7 @@ def pre_tc_send_cb( def pack_service_queue_user( service: Union[str, int], op_code: str, service_queue: TcQueueT ): + obj_id_man = get_object_ids() if service == CoreServiceList.SERVICE_5.value: return pack_generic_service5_test_into(tc_queue=service_queue) if service == CoreServiceList.SERVICE_17.value: @@ -170,7 +172,7 @@ def pack_service_queue_user( object_id=RW4_ID, rw_idx=4, tc_queue=service_queue, op_code=op_code ) if service == CustomServiceList.RAD_SENSOR.value: - object_id = RAD_SENSOR_ID + object_id = obj_id_man.get(RAD_SENSOR_ID) return pack_rad_sensor_test_into( object_id=object_id, tc_queue=service_queue, op_code=op_code ) diff --git a/pus_tm/devs/rad_sensor.py b/pus_tm/devs/rad_sensor.py index 998f0fd..de0e65d 100644 --- a/pus_tm/devs/rad_sensor.py +++ b/pus_tm/devs/rad_sensor.py @@ -15,10 +15,10 @@ def handle_rad_sensor_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes (temp, ain0, ain1, ain4, ain5, ain6, ain7) = struct.unpack( fmt_str, hk_data[current_idx : current_idx + inc_len] ) - ain_dict = {{0: ain0}, {1: ain1}, {4: ain4}, {5: ain5}, {6: ain6}, {7: ain7}} + ain_dict = {0: ain0, 1: ain1, 4: ain4, 5: ain5, 6: ain6, 7: ain7} pw.dlog(f"Temperature: {temp} C") pw.dlog(f"AIN Channel | Raw Value (hex) | Raw Value (dec)") - for idx, val in ain_dict: - pw.dlog(f"{idx} | {val:#04x} | {str(val).ljust(5)}") + for idx, val in ain_dict.items(): + pw.dlog(f"{idx} | {val:#06x} | {str(val).ljust(5)}") current_idx += inc_len printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=7) diff --git a/tmtcgui.py b/tmtcgui.py index 6366d6f..b36f61c 100755 --- a/tmtcgui.py +++ b/tmtcgui.py @@ -2,10 +2,11 @@ """TMTC commander for EIVE""" from tmtcc import tmtcc_post_args, tmtcc_pre_args from tmtccmd.config.args import ( - create_default_args_parser, - add_gui_tmtccmd_args, - parse_gui_input_arguments, - ) + create_default_args_parser, + add_gui_tmtccmd_args, + parse_gui_input_arguments, +) + def main(): hook_obj = tmtcc_pre_args() From ea1865bd453b1ab433240ad6a1ca520243065fcb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:29:50 +0200 Subject: [PATCH 047/132] update changelog --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a00ec9..f351cc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,18 @@ list yields a list of all related PRs for each release. # [unreleased] +# [v1.12.0] + +- Add Rad Sensor HK parsing + PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/81 +- Add procedures, parser functions and general application functionalities + for the thermal-vacuum test. This includes daemon functionality to poll + all Telemetry even when there is no operator present + PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/76 + https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/74 + https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/79 + https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/73 + # [v1.11.0] - Add `setup.cfg` and `setup.py` file, allowing package installation From 2698756b2946339432121f7ea089d23bef5808b1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:32:59 +0200 Subject: [PATCH 048/132] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f351cc8..0a24f0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ list yields a list of all related PRs for each release. https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/74 https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/79 https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/73 +- Add ACU HK parsing + PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/80 # [v1.11.0] From c9f5a5652ebf1b4577d235b4450f97d49478d869 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:33:35 +0200 Subject: [PATCH 049/132] run afmt --- pus_tc/prompt_parameters.py | 29 +++++++++++++++++++---------- pus_tc/system/controllers.py | 8 ++++++-- pus_tc/system/proc.py | 28 ++++++++++++---------------- tmtcgui.py | 9 +++++---- 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/pus_tc/prompt_parameters.py b/pus_tc/prompt_parameters.py index aa7dacb..feca256 100644 --- a/pus_tc/prompt_parameters.py +++ b/pus_tc/prompt_parameters.py @@ -1,5 +1,11 @@ from PyQt5.QtWidgets import ( - QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QGroupBox, QGridLayout, QLineEdit + QDialog, + QDialogButtonBox, + QVBoxLayout, + QLabel, + QGroupBox, + QGridLayout, + QLineEdit, ) from PyQt5 import QtCore @@ -16,12 +22,13 @@ class Parameter: self.widget = widget self.value = self.defaultValue self.widget.setPlaceholderText(self.defaultValue) - + def reset(self): self.value = self.defaultValue self.widget.setPlaceholderText(self.defaultValue) self.widget.setText("") + class ParameterDialog(QDialog): def __init__(self): super().__init__() @@ -42,7 +49,7 @@ class ParameterDialog(QDialog): self.rootLayout.addWidget(self.group) self.rootLayout.addWidget(self.buttonBox) self.setLayout(self.rootLayout) - + self.groupLayout = QGridLayout() self.group.setLayout(self.groupLayout) @@ -59,7 +66,6 @@ class ParameterDialog(QDialog): self.parameters[name] = parameter - def _reset(self): for value in self.parameters.values(): value.reset() @@ -80,14 +86,13 @@ class ParameterDialog(QDialog): super().reject() - - - """Prompt the user to specify additional Parameters :param parameterList: array of dictionaries with name and defaultValue attributes :return: dict with all names as key and user supplied input as value string """ + + def prompt_parameters(parameterList): gui = get_global(CoreGlobalIds.GUI) mode = get_global(CoreGlobalIds.MODE) @@ -95,9 +100,10 @@ def prompt_parameters(parameterList): # gui only works in cont mode right now if gui and mode == CoreModeList.CONTINUOUS_MODE: return _gui_prompt(parameterList) - else: + else: return _cli_prompt(parameterList) + def _gui_prompt(parameterList): dialog = ParameterDialog() for parameter in parameterList: @@ -105,11 +111,14 @@ def _gui_prompt(parameterList): dialog.exec_() return dialog.getParameters() + def _cli_prompt(parameterList): result = {} for parameter in parameterList: - userInput = input("Specify {} [{}]: ".format(parameter["name"], parameter["defaultValue"])) + userInput = input( + "Specify {} [{}]: ".format(parameter["name"], parameter["defaultValue"]) + ) if userInput == "": userInput = parameter["defaultValue"] result[parameter["name"]] = userInput - return result \ No newline at end of file + return result diff --git a/pus_tc/system/controllers.py b/pus_tc/system/controllers.py index 1f44f32..b7949d2 100644 --- a/pus_tc/system/controllers.py +++ b/pus_tc/system/controllers.py @@ -18,8 +18,12 @@ class Info: def pack_controller_commands(tc_queue: TcQueueT, op_code: str): - parameters = prompt_parameters([{"name": "Mode", "defaultValue": "2"}, { - "name": "Submode", "defaultValue": "0"}]) + parameters = prompt_parameters( + [ + {"name": "Mode", "defaultValue": "2"}, + {"name": "Submode", "defaultValue": "0"}, + ] + ) mode = int(parameters["Mode"]) if mode < 0 or mode > 2: print("Invalid Mode, defaulting to OFF") diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 5b54a7f..2d4f02f 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -1,6 +1,7 @@ from tmtccmd.config import QueueCommands from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.pus_3_fsfw_hk import * + """ from config.object_ids import ( BPX_HANDLER_ID, @@ -66,8 +67,6 @@ PROC_INFO_DICT = { KAI.TCS_FT_ON[0]: [OpCodes.TCS_FT_ON, KAI.TCS_FT_ON[1], 120.0, 10.0], KAI.TCS_FT_OFF[0]: [OpCodes.TCS_FT_OFF, KAI.TCS_FT_OFF[1], 120.0, 10.0], KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0], - - } @@ -159,7 +158,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_acs_command(tc_queue=tc_queue, op_code="acs-a") -# MGMs + # MGMs sid = make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -168,7 +167,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) -# Gyros + # Gyros sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -181,7 +180,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) -# GNSS0 + # GNSS0 sid = make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -191,7 +190,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue.appendleft((QueueCommands.WAIT, 5.0)) pack_acs_command(tc_queue=tc_queue, op_code="acs-b") -# MGMs + # MGMs sid = make_sid(oids.MGM_2_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -200,7 +199,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) -# Gyros + # Gyros sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -213,7 +212,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) -#GNSS1 + # GNSS1 sid = make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -223,7 +222,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue.appendleft((QueueCommands.WAIT, 5.0)) pack_acs_command(tc_queue=tc_queue, op_code="acs-d") -# MGMs + # MGMs sid = make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -240,7 +239,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) -# Gyros + # Gyros sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -265,7 +264,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) -# GNSS0+1 + # GNSS0+1 sid = make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -293,15 +292,13 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - -# mgt 1: imtq und hk -# mgt 2.: imtq + dual side + dipole + # mgt 1: imtq und hk + # mgt 2.: imtq + dual side + dipole if op_code in OpCodes.MGT_FT_DP: key = KAI.MGT_FT[0] pack_acs_command(tc_queue=tc_queue, op_code="acs-a") - sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False @@ -315,7 +312,6 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - pack_acs_command(tc_queue=tc_queue, op_code="acs-off") diff --git a/tmtcgui.py b/tmtcgui.py index 6366d6f..b36f61c 100755 --- a/tmtcgui.py +++ b/tmtcgui.py @@ -2,10 +2,11 @@ """TMTC commander for EIVE""" from tmtcc import tmtcc_post_args, tmtcc_pre_args from tmtccmd.config.args import ( - create_default_args_parser, - add_gui_tmtccmd_args, - parse_gui_input_arguments, - ) + create_default_args_parser, + add_gui_tmtccmd_args, + parse_gui_input_arguments, +) + def main(): hook_obj = tmtcc_pre_args() From e7cb7ca0963663a9674591c2945c5f24647cb00c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:34:28 +0200 Subject: [PATCH 050/132] run afmt --- config/object_ids.py | 2 +- pus_tc/devs/rtd.py | 52 +++++++++++++++++----------------------- pus_tc/tc_packer_hook.py | 4 +++- 3 files changed, 26 insertions(+), 32 deletions(-) diff --git a/config/object_ids.py b/config/object_ids.py index 045d671..c2c25b1 100644 --- a/config/object_ids.py +++ b/config/object_ids.py @@ -79,7 +79,7 @@ HEATER_7_HPA = bytes([0x60, 0x00, 0x00, 0x07]) # RTDs RTD_0_PLOC_HSPD = bytes([0x44, 0x42, 0x00, 0x16]) -RTD_1_PLOC_MISSIONBRD= bytes([0x44, 0x42, 0x00, 0x17]) +RTD_1_PLOC_MISSIONBRD = bytes([0x44, 0x42, 0x00, 0x17]) RTD_2_4K_CAM = bytes([0x44, 0x42, 0x00, 0x18]) RTD_3_DAC_HSPD = bytes([0x44, 0x42, 0x00, 0x19]) RTD_4_STR = bytes([0x44, 0x42, 0x00, 0x20]) diff --git a/pus_tc/devs/rtd.py b/pus_tc/devs/rtd.py index f15dc32..531989e 100644 --- a/pus_tc/devs/rtd.py +++ b/pus_tc/devs/rtd.py @@ -2,7 +2,11 @@ from typing import Optional from config.definitions import CustomServiceList from spacepackets.ecss import PusTelecommand -from tmtccmd.config import ServiceOpCodeDictT, add_op_code_entry, add_service_op_code_entry +from tmtccmd.config import ( + ServiceOpCodeDictT, + add_op_code_entry, + add_service_op_code_entry, +) from tmtccmd.tc.definitions import TcQueueT from tmtccmd.utility import ObjectId from tmtccmd.tc.pus_200_fsfw_modes import Modes, pack_mode_data, Subservices @@ -25,7 +29,7 @@ RTD_IDS = [ oids.RTD_12_ACU, oids.RTD_13_PLPCDU_HSPD, oids.RTD_14_TCS_BRD, - oids.RTD_15_IMTQ + oids.RTD_15_IMTQ, ] @@ -43,26 +47,14 @@ class Info: def specify_rtd_cmds(cmd_dict: ServiceOpCodeDictT): op_code_dict = dict() - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.ON, - info=Info.ON - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL, - info=Info.NORMAL - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.OFF, - info=Info.OFF - ) + add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.ON, info=Info.ON) + add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.NORMAL, info=Info.NORMAL) + add_op_code_entry(op_code_dict=op_code_dict, keys=OpCodes.OFF, info=Info.OFF) add_service_op_code_entry( srv_op_code_dict=cmd_dict, op_code_entry=op_code_dict, name=CustomServiceList.RTD.value, - info="RTD commands" + info="RTD commands", ) @@ -75,27 +67,27 @@ def pack_rtd_commands(op_code: str, object_id: Optional[ObjectId], tc_queue: TcQ object_id_dict = get_object_ids() object_id = object_id_dict.get(RTD_IDS[tgt_rtd_idx]) if op_code in OpCodes.ON: - app_data = pack_mode_data(object_id=object_id.as_bytes, mode=Modes.ON, submode=0) + app_data = pack_mode_data( + object_id=object_id.as_bytes, mode=Modes.ON, submode=0 + ) cmd = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=app_data + service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data ) tc_queue.appendleft(cmd.pack_command_tuple()) if op_code in OpCodes.NORMAL: - app_data = pack_mode_data(object_id=object_id.as_bytes, mode=Modes.NORMAL, submode=0) + app_data = pack_mode_data( + object_id=object_id.as_bytes, mode=Modes.NORMAL, submode=0 + ) cmd = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=app_data + service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data ) tc_queue.appendleft(cmd.pack_command_tuple()) if op_code in OpCodes.OFF: - app_data = pack_mode_data(object_id=object_id.as_bytes, mode=Modes.OFF, submode=0) + app_data = pack_mode_data( + object_id=object_id.as_bytes, mode=Modes.OFF, submode=0 + ) cmd = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=app_data + service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data ) tc_queue.appendleft(cmd.pack_command_tuple()) diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py index e9a860d..049667e 100644 --- a/pus_tc/tc_packer_hook.py +++ b/pus_tc/tc_packer_hook.py @@ -115,7 +115,9 @@ def pack_service_queue_user( object_id=object_id, tc_queue=service_queue, op_code=op_code ) if service == CustomServiceList.RTD.value: - return pack_rtd_commands(object_id=None, tc_queue=service_queue, op_code=op_code) + return pack_rtd_commands( + object_id=None, tc_queue=service_queue, op_code=op_code + ) if service == CustomServiceList.PDU1.value: object_id = PDU_1_HANDLER_ID return pack_pdu1_commands( From 7f03dcb3a613d26462ac2571140ed6ecb91dd9f0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 18:59:19 +0200 Subject: [PATCH 051/132] bugfix for acu hk parsing --- pus_tm/devs/pcdu.py | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/pus_tm/devs/pcdu.py b/pus_tm/devs/pcdu.py index de62cb3..ae24d7e 100644 --- a/pus_tm/devs/pcdu.py +++ b/pus_tm/devs/pcdu.py @@ -104,10 +104,31 @@ class DevicesInfoParser: current_idx += 1 return current_idx + def map_idx_to_type(self, devtype: int) -> str: + if devtype == 0: + return "Reserved" + if devtype == 1: + return "ADC" + if devtype == 2: + return "ADC" + if devtype == 3: + return "DAC" + if devtype == 4: + return "Temperature Sensor" + if devtype == 5: + return "Temperature Sensor (Bat Pack)" + if devtype == 6: + return "RTC" + if devtype == 7: + return "FRAM" + return "Unknown Type" + def print(self, pw: PrintWrapper): pw.dlog(f"Device Type | Device State (0:None | 1:OK | 3:ERROR | 4:NOT FOUND)") for i in range(len(self.dev_types)): - pw.dlog(f"{self.dev_types} | {self.dev_statuses}") + pw.dlog( + f"{self.map_idx_to_type(self.dev_types[i])} | {self.dev_statuses[i]}" + ) def handle_pdu_data( @@ -321,13 +342,8 @@ def gen_six_entry_u16_list(hk_data: bytes, current_idx: int) -> Tuple[int, List[ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): pw = PrintWrapper(printer=printer) if set_id == SetIds.ACU_CORE: - current_idx = 0 - fmt_str = "!B" - inc_len = struct.calcsize(fmt_str) - mppt_mode = struct.unpack( - fmt_str, hk_data[current_idx : current_idx + inc_len] - )[0] - current_idx += inc_len + mppt_mode = hk_data[0] + current_idx = 1 current_idx, currents = gen_six_entry_u16_list( hk_data=hk_data, current_idx=current_idx ) @@ -373,11 +389,11 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): ) if set_id == SetIds.ACU_AUX: current_idx = 0 - fmt_str = "!HHH" + fmt_str = "!BBB" inc_len = struct.calcsize(fmt_str) - (dac_enb0, dac_enb1, dac_enb2) = struct.unpack( - fmt_str, hk_data[current_idx : current_idx + inc_len] - ) + enb_tuple = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len]) + (dac_enb0, dac_enb1, dac_enb2) = enb_tuple + dac_enb_str = ["on" if entry == 1 else "off" for entry in enb_tuple] current_idx += inc_len current_idx, dac_channels_raw = gen_six_entry_u16_list( hk_data=hk_data, current_idx=current_idx @@ -391,8 +407,9 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): dev_parser = DevicesInfoParser() current_idx = dev_parser.parse(hk_data=hk_data, current_idx=current_idx) pw.dlog("Received ACU Aux HK. Voltages in mV, currents in mA") + pw.dlog( - f"DAC Enable States: DAC 0 {dac_enb0} | DAC 1 {dac_enb1} | DAC 2 {dac_enb2}" + f"DAC Enable States: DAC 0 {dac_enb_str[0]} | DAC 1 {dac_enb_str[1]} | DAC 2 {dac_enb_str[2]}" ) pw.dlog(f"Boot Cause {boot_cause} | Reset Cause {reset_cause}") pw.dlog( From 51bbeaa693a11bfc4d2cb342354041972dd93c1e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 23 May 2022 22:24:10 +0200 Subject: [PATCH 052/132] transform into static method --- pus_tm/devs/pcdu.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pus_tm/devs/pcdu.py b/pus_tm/devs/pcdu.py index ae24d7e..ca39a75 100644 --- a/pus_tm/devs/pcdu.py +++ b/pus_tm/devs/pcdu.py @@ -104,7 +104,15 @@ class DevicesInfoParser: current_idx += 1 return current_idx - def map_idx_to_type(self, devtype: int) -> str: + def print(self, pw: PrintWrapper): + pw.dlog(f"Device Type | Device State (0:None | 1:OK | 3:ERROR | 4:NOT FOUND)") + for i in range(len(self.dev_types)): + pw.dlog( + f"{self.map_idx_to_type(self.dev_types[i])} | {self.dev_statuses[i]}" + ) + + @staticmethod + def map_idx_to_type(devtype: int) -> str: if devtype == 0: return "Reserved" if devtype == 1: @@ -123,13 +131,6 @@ class DevicesInfoParser: return "FRAM" return "Unknown Type" - def print(self, pw: PrintWrapper): - pw.dlog(f"Device Type | Device State (0:None | 1:OK | 3:ERROR | 4:NOT FOUND)") - for i in range(len(self.dev_types)): - pw.dlog( - f"{self.map_idx_to_type(self.dev_types[i])} | {self.dev_statuses[i]}" - ) - def handle_pdu_data( printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes From 575932f64603e033017ccae9b1f89a50f5102afe Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 01:13:21 +0200 Subject: [PATCH 053/132] new reboot command --- pus_tc/cmd_definitions.py | 63 +----------------- pus_tc/system/core.py | 134 +++++++++++++++++++++++++++++--------- 2 files changed, 104 insertions(+), 93 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 6307702..16bd542 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -1,6 +1,7 @@ from pus_tc.devs.gps import GpsOpCodes from pus_tc.devs.pcdu import add_pcdu_cmds from pus_tc.devs.rad_sensor import add_rad_sens_cmds +from pus_tc.system.core import add_core_controller_definitions from tmtccmd.config import ( add_op_code_entry, add_service_op_code_entry, @@ -13,11 +14,10 @@ from pus_tc.devs.heater import add_heater_cmds from pus_tc.devs.rtd import specify_rtd_cmds from pus_tc.devs.reaction_wheels import add_rw_cmds from pus_tc.devs.bpx_batt import BpxOpCodes +from tmtccmd.config.globals import get_default_service_op_code_dict def get_eive_service_op_code_dict() -> ServiceOpCodeDictT: - from tmtccmd.config.globals import get_default_service_op_code_dict - service_op_code_dict = get_default_service_op_code_dict() add_bpx_cmd_definitions(cmd_dict=service_op_code_dict) add_core_controller_definitions(cmd_dict=service_op_code_dict) @@ -322,67 +322,8 @@ def add_bpx_cmd_definitions(cmd_dict: ServiceOpCodeDictT): ) -def add_core_controller_definitions(cmd_dict: ServiceOpCodeDictT): - from pus_tc.system.core import OpCodes - - od = dict() - add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT, info="Reboot with Prompt") - add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_SELF, info="Reboot Self") - add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_0_0, info="Reboot 0 0") - add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_0_1, info="Reboot 0 1") - add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_1_0, info="Reboot 1 0") - add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_1_1, info="Reboot 1 1") - add_op_code_entry( - op_code_dict=od, - keys=OpCodes.ENABLE_REBOOT_FILE_HANDLING, - info="Enable reboot file handling", - ) - add_op_code_entry( - op_code_dict=od, - keys=OpCodes.DISABLE_REBOOT_FILE_HANDLING, - info="Disable reboot file handling", - ) - add_op_code_entry( - op_code_dict=od, - keys=OpCodes.RESET_ALL_REBOOT_COUNTERS, - info="Reset all reboot counters", - ) - add_op_code_entry( - op_code_dict=od, - keys=OpCodes.RESET_REBOOT_COUNTER_00, - info="Reset reboot counter 0 0", - ) - add_op_code_entry( - op_code_dict=od, - keys=OpCodes.RESET_REBOOT_COUNTER_01, - info="Reset reboot counter 0 1", - ) - add_op_code_entry( - op_code_dict=od, - keys=OpCodes.RESET_REBOOT_COUNTER_10, - info="Reset reboot counter 1 0", - ) - add_op_code_entry( - op_code_dict=od, - keys=OpCodes.RESET_REBOOT_COUNTER_11, - info="Reset reboot counter 1 1", - ) - add_op_code_entry( - op_code_dict=od, - keys=OpCodes.GET_HK, - info="Request housekeeping set", - ) - add_service_op_code_entry( - srv_op_code_dict=cmd_dict, - name=CustomServiceList.CORE.value, - info="Reboot Self", - op_code_entry=od, - ) - - def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): from pus_tc.devs.plpcdu import OpCodes, Info - op_code_dict = dict() add_op_code_entry( op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON diff --git a/pus_tc/system/core.py b/pus_tc/system/core.py index a4e5c6e..ece17c2 100644 --- a/pus_tc/system/core.py +++ b/pus_tc/system/core.py @@ -1,6 +1,8 @@ import enum -from tmtccmd.config.definitions import QueueCommands +from config.definitions import CustomServiceList +from tmtccmd.config import add_op_code_entry, add_service_op_code_entry +from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.pus_8_funccmd import generate_action_command from tmtccmd.logging import get_console_logger @@ -19,7 +21,8 @@ class ActionIds(enum.IntEnum): RESET_REBOOT_COUNTER_10 = 9 RESET_REBOOT_COUNTER_11 = 10 SET_MAX_REBOOT_CNT = 11 - REBOOT = 32 + XSC_REBOOT = 32 + FULL_REBOOT = 34 class SetIds(enum.IntEnum): @@ -27,21 +30,27 @@ class SetIds(enum.IntEnum): class OpCodes: - REBOOT = ["0", "reboot"] - REBOOT_SELF = ["1", "reboot_self"] - REBOOT_0_0 = ["2", "reboot_0_0"] - REBOOT_0_1 = ["3", "reboot_0_1"] - REBOOT_1_0 = ["4", "reboot_1_0"] - REBOOT_1_1 = ["5", "reboot_1_1"] - ENABLE_REBOOT_FILE_HANDLING = ["6", "rbh-off"] - DISABLE_REBOOT_FILE_HANDLING = ["7", "rbh-on"] - RESET_ALL_REBOOT_COUNTERS = ["8", "rbh-reset-a"] - RESET_REBOOT_COUNTER_00 = ["9", "rbh-reset-00"] - RESET_REBOOT_COUNTER_01 = ["10", "rbh-reset-01"] - RESET_REBOOT_COUNTER_10 = ["11", "rbh-reset-10"] - RESET_REBOOT_COUNTER_11 = ["12", "rbh-reset-11"] - SET_MAX_REBOOT_CNT = ["13", "rbh-max-cnt"] - GET_HK = ["14", "get-hk"] + REBOOT_XSC = ["0", "reboot-xsc"] + XSC_REBOOT_SELF = ["1", "reboot-self"] + XSC_REBOOT_0_0 = ["2", "reboot-00"] + XSC_REBOOT_0_1 = ["3", "reboot-01"] + XSC_REBOOT_1_0 = ["4", "reboot-10"] + XSC_REBOOT_1_1 = ["5", "reboot-11"] + REBOOT_FULL = ["6", "reboot-regular"] + GET_HK = ["7", "get-hk"] + ENABLE_REBOOT_FILE_HANDLING = ["32", "rbh-off"] + DISABLE_REBOOT_FILE_HANDLING = ["33", "rbh-on"] + RESET_ALL_REBOOT_COUNTERS = ["34", "rbh-reset-a"] + RESET_REBOOT_COUNTER_00 = ["35", "rbh-reset-00"] + RESET_REBOOT_COUNTER_01 = ["36", "rbh-reset-01"] + RESET_REBOOT_COUNTER_10 = ["37", "rbh-reset-10"] + RESET_REBOOT_COUNTER_11 = ["38", "rbh-reset-11"] + SET_MAX_REBOOT_CNT = ["39", "rbh-max-cnt"] + + +class Info: + REBOOT_XSC = "XSC reboot with prompt" + REBOOT_FULL = "Full regular reboot" class Chip(enum.IntEnum): @@ -56,8 +65,65 @@ class Copy(enum.IntEnum): NONE = 2 +def add_core_controller_definitions(cmd_dict: ServiceOpCodeDictT): + od = dict() + add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_XSC, info=Info.REBOOT_XSC) + add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_FULL, info=Info.REBOOT_FULL) + add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_SELF, info="Reboot Self") + add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_0_0, info="Reboot 0 0") + add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_0_1, info="Reboot 0 1") + add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_1_0, info="Reboot 1 0") + add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_1_1, info="Reboot 1 1") + add_op_code_entry( + op_code_dict=od, + keys=OpCodes.GET_HK, + info="Request housekeeping set", + ) + add_op_code_entry( + op_code_dict=od, + keys=OpCodes.ENABLE_REBOOT_FILE_HANDLING, + info="Enable reboot file handling", + ) + add_op_code_entry( + op_code_dict=od, + keys=OpCodes.DISABLE_REBOOT_FILE_HANDLING, + info="Disable reboot file handling", + ) + add_op_code_entry( + op_code_dict=od, + keys=OpCodes.RESET_ALL_REBOOT_COUNTERS, + info="Reset all reboot counters", + ) + add_op_code_entry( + op_code_dict=od, + keys=OpCodes.RESET_REBOOT_COUNTER_00, + info="Reset reboot counter 0 0", + ) + add_op_code_entry( + op_code_dict=od, + keys=OpCodes.RESET_REBOOT_COUNTER_01, + info="Reset reboot counter 0 1", + ) + add_op_code_entry( + op_code_dict=od, + keys=OpCodes.RESET_REBOOT_COUNTER_10, + info="Reset reboot counter 1 0", + ) + add_op_code_entry( + op_code_dict=od, + keys=OpCodes.RESET_REBOOT_COUNTER_11, + info="Reset reboot counter 1 1", + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.CORE.value, + info="Core Controller", + op_code_entry=od, + ) + + def pack_core_commands(tc_queue: TcQueueT, op_code: str): - if op_code in OpCodes.REBOOT: + if op_code in OpCodes.REBOOT_XSC: reboot_self, chip_select, copy_select = determine_reboot_params() perform_reboot_cmd( tc_queue=tc_queue, @@ -65,31 +131,35 @@ def pack_core_commands(tc_queue: TcQueueT, op_code: str): chip=chip_select, copy=copy_select, ) - elif op_code in OpCodes.REBOOT_SELF: + if op_code in OpCodes.REBOOT_FULL: + tc_queue.appendleft((QueueCommands.PRINT, f"Core Command: {Info.REBOOT_FULL}")) + cmd = generate_action_command(object_id=CORE_CONTROLLER_ID, action_id=ActionIds.FULL_REBOOT) + tc_queue.appendleft(cmd.pack_command_tuple()) + if op_code in OpCodes.XSC_REBOOT_SELF: perform_reboot_cmd(tc_queue=tc_queue, reboot_self=True) - elif op_code in OpCodes.REBOOT_0_0: + if op_code in OpCodes.XSC_REBOOT_0_0: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM ) - elif op_code in OpCodes.REBOOT_0_1: + if op_code in OpCodes.XSC_REBOOT_0_1: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_1_GOLD, ) - elif op_code in OpCodes.REBOOT_1_0: + if op_code in OpCodes.XSC_REBOOT_1_0: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_0_NOM ) - elif op_code in OpCodes.REBOOT_1_1: + if op_code in OpCodes.XSC_REBOOT_1_1: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_1_GOLD, ) - elif op_code in OpCodes.DISABLE_REBOOT_FILE_HANDLING: + if op_code in OpCodes.DISABLE_REBOOT_FILE_HANDLING: tc_queue.appendleft((QueueCommands.PRINT, "Disabling reboot file handling")) app_data = bytearray([0]) generate_action_command( @@ -97,7 +167,7 @@ def pack_core_commands(tc_queue: TcQueueT, op_code: str): action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING, app_data=app_data, ) - elif op_code in OpCodes.ENABLE_REBOOT_FILE_HANDLING: + if op_code in OpCodes.ENABLE_REBOOT_FILE_HANDLING: tc_queue.appendleft((QueueCommands.PRINT, "Enabling reboot file handling")) app_data = bytearray([1]) generate_action_command( @@ -105,32 +175,32 @@ def pack_core_commands(tc_queue: TcQueueT, op_code: str): action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING, app_data=app_data, ) - elif op_code in OpCodes.RESET_ALL_REBOOT_COUNTERS: + if op_code in OpCodes.RESET_ALL_REBOOT_COUNTERS: tc_queue.appendleft((QueueCommands.PRINT, "Resetting all reboot counters")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_ALL_REBOOT_COUNTERS ) - elif op_code in OpCodes.RESET_REBOOT_COUNTER_00: + if op_code in OpCodes.RESET_REBOOT_COUNTER_00: tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 0 0")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_00 ) - elif op_code in OpCodes.RESET_REBOOT_COUNTER_01: + if op_code in OpCodes.RESET_REBOOT_COUNTER_01: tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 0 1")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_01 ) - elif op_code in OpCodes.RESET_REBOOT_COUNTER_10: + if op_code in OpCodes.RESET_REBOOT_COUNTER_10: tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 1 0")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_10 ) - elif op_code in OpCodes.RESET_REBOOT_COUNTER_11: + if op_code in OpCodes.RESET_REBOOT_COUNTER_11: tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 1 1")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_11 ) - elif op_code in OpCodes.GET_HK: + if op_code in OpCodes.GET_HK: tc_queue.appendleft((QueueCommands.PRINT, "Requesting housekeeping set")) sid = make_sid(object_id=CORE_CONTROLLER_ID, set_id=SetIds.HK) command = generate_one_hk_command(sid, 201) @@ -192,7 +262,7 @@ def perform_reboot_cmd( ) action_cmd = generate_action_command( object_id=CORE_CONTROLLER_ID, - action_id=ActionIds.REBOOT, + action_id=ActionIds.XSC_REBOOT, app_data=tc_data, ssc=0, ) From 41f1f4c99a99fd7e0892773fd209ed6273810885 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 01:13:43 +0200 Subject: [PATCH 054/132] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a24f0b..5c49783 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ list yields a list of all related PRs for each release. # [v1.12.0] +- Add full regular reboot command - Add Rad Sensor HK parsing PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/81 - Add procedures, parser functions and general application functionalities From 9fc90ba487adb165a62eb76cd3970054e9454f6c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 01:34:33 +0200 Subject: [PATCH 055/132] update gps hk parsing --- config/definitions.py | 3 +- pus_tc/cmd_definitions.py | 11 +----- pus_tc/devs/gps.py | 53 +++++++++++++++++++++++---- pus_tm/devs/gps.py | 76 ++++++++++++++------------------------- 4 files changed, 76 insertions(+), 67 deletions(-) diff --git a/config/definitions.py b/config/definitions.py index 5aa4174..c12a6d2 100644 --- a/config/definitions.py +++ b/config/definitions.py @@ -34,8 +34,7 @@ class CustomServiceList(enum.Enum): REACTION_WHEEL_4 = "rw-4" RW_ASSEMBLY = "rw-ass" RAD_SENSOR = "rad_sensor" - GPS_0 = "gps0" - GPS_1 = "gps1" + GPS_CTRL = "gnss-ctrl" PLOC_MEMORY_DUMPER = "ploc_memory_dumper" CORE = "core" STAR_TRACKER = "star_tracker" diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 6307702..a9f1764 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -1,4 +1,4 @@ -from pus_tc.devs.gps import GpsOpCodes +from pus_tc.devs.gps import OpCodes from pus_tc.devs.pcdu import add_pcdu_cmds from pus_tc.devs.rad_sensor import add_rad_sens_cmds from tmtccmd.config import ( @@ -89,15 +89,6 @@ def add_ccsds_cmds(cmd_dict: ServiceOpCodeDictT): cmd_dict[CustomServiceList.CCSDS_HANDLER.value] = service_ccsds_handler_tuple -def add_gps_cmds(cmd_dict: ServiceOpCodeDictT): - op_code_dict = { - GpsOpCodes.RESET_GNSS.value: ("Reset GPS", {OpCodeDictKeys.TIMEOUT: 2.0}) - } - service_tuple = ("GPS 0", op_code_dict) - cmd_dict[CustomServiceList.GPS_0.value] = service_tuple - cmd_dict[CustomServiceList.GPS_1.value] = service_tuple - - def add_str_cmds(cmd_dict: ServiceOpCodeDictT): op_code_dict_srv_star_tracker = { "0": ( diff --git a/pus_tc/devs/gps.py b/pus_tc/devs/gps.py index d0f3f21..db3d153 100644 --- a/pus_tc/devs/gps.py +++ b/pus_tc/devs/gps.py @@ -1,22 +1,63 @@ import enum -from tmtccmd.config.definitions import QueueCommands +from config.definitions import CustomServiceList +from tmtccmd.config import add_op_code_entry, add_service_op_code_entry +from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command +from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT +from tmtccmd.logging import get_console_logger from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.pus_8_funccmd import generate_action_command from config.object_ids import GPS_HANDLER_1_ID, GPS_HANDLER_0_ID +LOGGER = get_console_logger() -class GpsOpCodes(enum.Enum): - RESET_GNSS = "5" + +class OpCodes: + REQ_OS_HK = ["0", "hk-os"] + RESET_GNSS = ["5", "reset"] + + +class Info: + REQ_OS_HK = "Request One-Shot HK" + RESET_GNSS = "Reset GNSS using reset pin" + + +class SetIds: + HK = 0 + + +def add_gps_cmds(cmd_dict: ServiceOpCodeDictT): + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.RESET_GNSS, info=Info.RESET_GNSS + ) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.REQ_OS_HK, info=Info.REQ_OS_HK + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + op_code_entry=op_code_dict, + name=CustomServiceList.GPS_CTRL.value, + info="GPS/GNSS Controller" + ) def pack_gps_command(object_id: bytes, tc_queue: TcQueueT, op_code: str): - if op_code == GpsOpCodes.RESET_GNSS.value: + if op_code in OpCodes.RESET_GNSS: if object_id == GPS_HANDLER_0_ID: - tc_queue.appendleft((QueueCommands.PRINT, "Resetting GPS device 0")) + # TODO: This needs to be re-implemented + LOGGER.warning("Reset pin handling needs to be re-implemented") + return + # tc_queue.appendleft((QueueCommands.PRINT, "Resetting GPS device 0")) elif object_id == GPS_HANDLER_1_ID: - tc_queue.appendleft((QueueCommands.PRINT, "Resetting GPS device 1")) + LOGGER.warning("Reset pin handling needs to be re-implemented") + return + # tc_queue.appendleft((QueueCommands.PRINT, "Resetting GPS device 1")) cmd = generate_action_command(object_id=object_id, action_id=int(op_code)) tc_queue.appendleft(cmd.pack_command_tuple()) + if op_code in OpCodes.REQ_OS_HK: + tc_queue.appendleft((QueueCommands.PRINT, f"GMSS: {Info.REQ_OS_HK}")) + cmd = generate_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetIds.HK), ssc=0) + tc_queue.appendleft(cmd.pack_command_tuple()) diff --git a/pus_tm/devs/gps.py b/pus_tm/devs/gps.py index d60828d..fdeaa4b 100644 --- a/pus_tm/devs/gps.py +++ b/pus_tm/devs/gps.py @@ -1,6 +1,4 @@ -import os import struct -from datetime import datetime from pus_tm.defs import PrintWrapper from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter @@ -9,51 +7,31 @@ from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes): pw = PrintWrapper(printer) pw.dlog(f"Received GPS data, HK data length {len(hk_data)}") - var_index = 0 - header_list = [ - "Latitude", - "Longitude", - "Altitude", - "Fix Mode", - "Sats in Use", - "Date", - "Unix Seconds", - ] - latitude = struct.unpack("!d", hk_data[0:8])[0] - longitude = struct.unpack("!d", hk_data[8:16])[0] - altitude = struct.unpack("!d", hk_data[16:24])[0] - fix_mode = hk_data[24] - sat_in_use = hk_data[25] - year = struct.unpack("!H", hk_data[26:28])[0] - month = hk_data[28] - day = hk_data[29] - hours = hk_data[30] - minutes = hk_data[31] - seconds = hk_data[32] + current_idx = 0 + fmt_str = "!ddddBBBHBBBBBI" + inc_len = struct.calcsize(fmt_str) + ( + lat, + long, + alt, + speed, + fix, + sats_in_use, + sats_in_view, + year, + month, + day, + hours, + minutes, + seconds, + unix_seconds + ) = struct.unpack(fmt_str, hk_data[current_idx: current_idx + inc_len]) + current_idx += inc_len date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}" - unix_seconds = struct.unpack("!I", hk_data[33:37])[0] - content_list = [ - latitude, - longitude, - altitude, - fix_mode, - sat_in_use, - date_string, - unix_seconds, - ] - var_index += 13 - if not os.path.isfile("gps_log.txt"): - with open("gps_log.txt", "w") as gps_file: - gps_file.write( - "Time, Latitude [deg], Longitude [deg], Altitude [m], Fix Mode, Sats in Use, " - "Date, Unix Seconds\n" - ) - with open("gps_log.txt", "a") as gps_file: - gps_file.write( - f"{datetime.now()}, {latitude}, {longitude}, {altitude}, " - f"{fix_mode}, {sat_in_use}, {date_string}, {unix_seconds}\n" - ) - validity_buffer = hk_data[37:39] - pw.dlog(str(header_list)) - pw.dlog(str(content_list)) - printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10) + pw.dlog(f"Lat: {lat} deg") + pw.dlog(f"Long: {long} deg") + pw.dlog(f"Altitude: {alt} m | Speed: {speed} m/s") + pw.dlog(f"Fix Type: {fix} | Sats in View {sats_in_view} | Sats in Use {sats_in_use}") + pw.dlog(f"GNSS Date: {date_string}") + pw.dlog(f"Unix seconds {unix_seconds}") + printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=14) From b7a6291560a874728ff33d88d5be44a60f82692a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 01:49:57 +0200 Subject: [PATCH 056/132] update gps hk parsing --- config/object_ids.py | 3 +-- pus_tc/cmd_definitions.py | 2 +- pus_tc/devs/gps.py | 15 ++------------- pus_tc/tc_packer_hook.py | 14 ++++---------- pus_tm/hk_handling.py | 38 +++++++++++++++++++------------------- 5 files changed, 27 insertions(+), 45 deletions(-) diff --git a/config/object_ids.py b/config/object_ids.py index c2c25b1..b0e450f 100644 --- a/config/object_ids.py +++ b/config/object_ids.py @@ -44,8 +44,7 @@ GYRO_0_ADIS_HANDLER_ID = bytes([0x44, 0x12, 0x00, 0x10]) GYRO_1_L3G_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x11]) GYRO_2_ADIS_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x12]) GYRO_3_L3G_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x13]) -GPS_HANDLER_0_ID = bytes([0x44, 0x13, 0x00, 0x45]) -GPS_HANDLER_1_ID = bytes([0x44, 0x13, 0x01, 0x46]) +GPS_CONTROLLER = bytes([0x44, 0x13, 0x00, 0x45]) RW1_ID = bytes([0x44, 0x12, 0x00, 0x47]) RW2_ID = bytes([0x44, 0x12, 0x01, 0x48]) RW3_ID = bytes([0x44, 0x12, 0x02, 0x49]) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index a9f1764..ee28489 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -1,4 +1,4 @@ -from pus_tc.devs.gps import OpCodes +from pus_tc.devs.gps import add_gps_cmds from pus_tc.devs.pcdu import add_pcdu_cmds from pus_tc.devs.rad_sensor import add_rad_sens_cmds from tmtccmd.config import ( diff --git a/pus_tc/devs/gps.py b/pus_tc/devs/gps.py index db3d153..4d5824f 100644 --- a/pus_tc/devs/gps.py +++ b/pus_tc/devs/gps.py @@ -9,8 +9,6 @@ from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.pus_8_funccmd import generate_action_command -from config.object_ids import GPS_HANDLER_1_ID, GPS_HANDLER_0_ID - LOGGER = get_console_logger() @@ -46,17 +44,8 @@ def add_gps_cmds(cmd_dict: ServiceOpCodeDictT): def pack_gps_command(object_id: bytes, tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.RESET_GNSS: - if object_id == GPS_HANDLER_0_ID: - # TODO: This needs to be re-implemented - LOGGER.warning("Reset pin handling needs to be re-implemented") - return - # tc_queue.appendleft((QueueCommands.PRINT, "Resetting GPS device 0")) - elif object_id == GPS_HANDLER_1_ID: - LOGGER.warning("Reset pin handling needs to be re-implemented") - return - # tc_queue.appendleft((QueueCommands.PRINT, "Resetting GPS device 1")) - cmd = generate_action_command(object_id=object_id, action_id=int(op_code)) - tc_queue.appendleft(cmd.pack_command_tuple()) + # TODO: This needs to be re-implemented + LOGGER.warning("Reset pin handling needs to be re-implemented") if op_code in OpCodes.REQ_OS_HK: tc_queue.appendleft((QueueCommands.PRINT, f"GMSS: {Info.REQ_OS_HK}")) cmd = generate_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetIds.HK), ssc=0) diff --git a/pus_tc/tc_packer_hook.py b/pus_tc/tc_packer_hook.py index 137877b..2964012 100644 --- a/pus_tc/tc_packer_hook.py +++ b/pus_tc/tc_packer_hook.py @@ -63,8 +63,6 @@ from config.object_ids import ( PLOC_SUPV_ID, STAR_TRACKER_ID, PLOC_MEMORY_DUMPER_ID, - GPS_HANDLER_0_ID, - GPS_HANDLER_1_ID, CCSDS_HANDLER_ID, PDEC_HANDLER_ID, STR_IMG_HELPER_ID, @@ -73,7 +71,7 @@ from config.object_ids import ( RW_ASSEMBLY, get_object_ids, ) - +import config.object_ids as oids LOGGER = get_console_logger() @@ -206,13 +204,9 @@ def pack_service_queue_user( ) if service == CustomServiceList.ACS.value: return pack_acs_command(tc_queue=service_queue, op_code=op_code) - if service == CustomServiceList.GPS_0.value: + if service == CustomServiceList.GPS_CTRL.value: return pack_gps_command( - object_id=GPS_HANDLER_0_ID, tc_queue=service_queue, op_code=op_code - ) - if service == CustomServiceList.GPS_1.value: - return pack_gps_command( - object_id=GPS_HANDLER_1_ID, tc_queue=service_queue, op_code=op_code + object_id=oids.GPS_CONTROLLER, tc_queue=service_queue, op_code=op_code ) if service == CustomServiceList.CCSDS_HANDLER.value: return pack_ccsds_handler_test( @@ -248,7 +242,7 @@ def pack_service_queue_user( ) if service == CustomServiceList.CONTROLLERS.value: return pack_controller_commands(tc_queue=service_queue, op_code=op_code) - LOGGER.warning("Invalid Service !") + LOGGER.warning(f"Invalid Service {service}") def create_total_tc_queue_user() -> TcQueueT: diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 427017c..a468aaf 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -75,40 +75,40 @@ def handle_regular_hk_print( """This function is called when a Service 3 Housekeeping packet is received.""" if object_id in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: handle_rw_hk_data(printer, object_id, set_id, hk_data) - if objb == obj_ids.SYRLINKS_HANDLER_ID: + elif objb == obj_ids.SYRLINKS_HANDLER_ID: handle_syrlinks_hk_data(printer=printer, hk_data=hk_data, set_id=set_id) - if objb == obj_ids.IMTQ_HANDLER_ID: + elif objb == 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") - if objb == obj_ids.GPS_HANDLER_0_ID or object_id == obj_ids.GPS_HANDLER_1_ID: - handle_gps_data(printer=printer, hk_data=hk_data) - if objb == obj_ids.BPX_HANDLER_ID: - handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer) - if objb == obj_ids.CORE_CONTROLLER_ID: + elif objb == obj_ids.GPS_CONTROLLER: + return handle_gps_data(printer=printer, hk_data=hk_data) + elif objb == obj_ids.BPX_HANDLER_ID: + return handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer) + elif objb == obj_ids.CORE_CONTROLLER_ID: return handle_core_hk_data(printer=printer, hk_data=hk_data, set_id=set_id) - if objb == obj_ids.PDU_1_HANDLER_ID: + elif objb == obj_ids.PDU_1_HANDLER_ID: return handle_pdu_data( printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data ) - if objb == obj_ids.PDU_2_HANDLER_ID: + elif objb == obj_ids.PDU_2_HANDLER_ID: return handle_pdu_data( printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data ) - if objb == obj_ids.ACU_HANDLER_ID: + elif objb == obj_ids.ACU_HANDLER_ID: return handle_acu_hk_data(printer=printer, hk_data=hk_data, set_id=set_id) - if objb == obj_ids.RAD_SENSOR_ID: + elif objb == obj_ids.RAD_SENSOR_ID: return handle_rad_sensor_data(printer=printer, hk_data=hk_data, set_id=set_id) - if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: + elif objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]: return handle_rw_hk_data( printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data ) - if objb == obj_ids.P60_DOCK_HANDLER: + elif objb == obj_ids.P60_DOCK_HANDLER: handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data) - if objb in [ + elif objb in [ obj_ids.GYRO_0_ADIS_HANDLER_ID, obj_ids.GYRO_1_L3G_HANDLER_ID, obj_ids.GYRO_2_ADIS_HANDLER_ID, @@ -117,7 +117,7 @@ def handle_regular_hk_print( handle_gyros_hk_data( object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id ) - if objb in [ + elif objb in [ obj_ids.MGM_0_LIS3_HANDLER_ID, obj_ids.MGM_1_RM3100_HANDLER_ID, obj_ids.MGM_2_LIS3_HANDLER_ID, @@ -126,12 +126,12 @@ def handle_regular_hk_print( handle_mgm_hk_data( object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id ) - if objb == obj_ids.PL_PCDU_ID: + elif objb == obj_ids.PL_PCDU_ID: log_to_both(printer, "Received PL PCDU HK data") - if objb == obj_ids.THERMAL_CONTROLLER_ID: + elif objb == obj_ids.THERMAL_CONTROLLER_ID: handle_thermal_controller_hk_data( object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data ) else: - LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.") - return HkReplyUnpacked() + LOGGER.info(f"Service 3 TM: Parsing for object {object_id} and set ID {set_id} " + f"has not been implemented.") From 4d18ececa3258f10a7e57e2816e7810491752865 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 02:16:54 +0200 Subject: [PATCH 057/132] added PL PCDU HK parsing --- pus_tc/cmd_definitions.py | 84 +---------------------------- pus_tc/devs/plpcdu.py | 110 +++++++++++++++++++++++++++++++++++++- pus_tm/devs/plpcdu.py | 52 ++++++++++++++++++ pus_tm/hk_handling.py | 7 +-- 4 files changed, 166 insertions(+), 87 deletions(-) create mode 100644 pus_tm/devs/plpcdu.py diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 6307702..eca016b 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -1,5 +1,6 @@ from pus_tc.devs.gps import GpsOpCodes from pus_tc.devs.pcdu import add_pcdu_cmds +from pus_tc.devs.plpcdu import add_pl_pcdu_cmds from pus_tc.devs.rad_sensor import add_rad_sens_cmds from tmtccmd.config import ( add_op_code_entry, @@ -380,89 +381,6 @@ def add_core_controller_definitions(cmd_dict: ServiceOpCodeDictT): ) -def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): - from pus_tc.devs.plpcdu import OpCodes, Info - - op_code_dict = dict() - add_op_code_entry( - op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_SSR, - info=Info.NORMAL_SSR, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_DRO, - info=Info.NORMAL_DRO, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_X8, - info=Info.NORMAL_X8, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_TX, - info=Info.NORMAL_TX, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_MPA, - info=Info.NORMAL_MPA, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_HPA, - info=Info.NORMAL_HPA, - ) - add_op_code_entry( - op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.UPDATE_DRO_TO_X8_WAIT, - info="Update DRO to X8 wait time", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_SSR_TO_DRO_FAILURE, - info="Inject failure SSR to DRO transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_DRO_TO_X8_FAILURE, - info="Inject failure in DRO to X8 transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_X8_TO_TX_FAILURE, - info="Inject failure in X8 to TX transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_TX_TO_MPA_FAILURE, - info="Inject failure in TX to MPA transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_MPA_TO_HPA_FAILURE, - info="Inject failure in MPA to HPA transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_ALL_ON_FAILURE, - info="Inject failure in all on mode", - ) - add_service_op_code_entry( - srv_op_code_dict=cmd_dict, - name=CustomServiceList.PL_PCDU.value, - info="PL PCDU", - op_code_entry=op_code_dict, - ) - - def add_time_cmds(cmd_dict: ServiceOpCodeDictT): from pus_tc.system.time import OpCodes, Info diff --git a/pus_tc/devs/plpcdu.py b/pus_tc/devs/plpcdu.py index 28775d0..bbed01d 100644 --- a/pus_tc/devs/plpcdu.py +++ b/pus_tc/devs/plpcdu.py @@ -1,8 +1,19 @@ import enum from typing import Optional -from tmtccmd.config import QueueCommands +from config.definitions import CustomServiceList +from tmtccmd.config import ( + QueueCommands, + ServiceOpCodeDictT, + add_op_code_entry, + add_service_op_code_entry, +) from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.tc.pus_3_fsfw_hk import ( + generate_one_hk_command, + make_sid, + generate_one_diag_command, +) from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes, Subservices from tmtccmd.tc.pus_20_params import ( pack_scalar_double_param_app_data, @@ -26,6 +37,8 @@ class OpCodes: NORMAL_MPA = ["6", "nml-mpa"] NORMAL_HPA = ["7", "nml-hpa"] + REQ_OS_HK = ["8", "hk-os"] + INJECT_SSR_TO_DRO_FAILURE = ["10", "inject-ssr-dro-fault"] INJECT_DRO_TO_X8_FAILURE = ["11", "inject-dro-x8-fault"] INJECT_X8_TO_TX_FAILURE = ["12", "inject-x8-tx-fault"] @@ -50,6 +63,11 @@ class Info: NORMAL_TX = f"{NORMAL}, TX on" NORMAL_MPA = f"{NORMAL}, MPA on" NORMAL_HPA = f"{NORMAL}, HPA on" + REQ_OS_HK = "Request One Shot HK" + + +class SetIds(enum.IntEnum): + ADC = 0 class NormalSubmodesMask(enum.IntEnum): @@ -99,6 +117,90 @@ class ParamIds(enum.IntEnum): INJECT_ALL_ON_FAILURE = 35 +def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_SSR, + info=Info.NORMAL_SSR, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_DRO, + info=Info.NORMAL_DRO, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_X8, + info=Info.NORMAL_X8, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_TX, + info=Info.NORMAL_TX, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_MPA, + info=Info.NORMAL_MPA, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_HPA, + info=Info.NORMAL_HPA, + ) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.REQ_OS_HK, info=Info.REQ_OS_HK + ) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.UPDATE_DRO_TO_X8_WAIT, + info="Update DRO to X8 wait time", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_SSR_TO_DRO_FAILURE, + info="Inject failure SSR to DRO transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_DRO_TO_X8_FAILURE, + info="Inject failure in DRO to X8 transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_X8_TO_TX_FAILURE, + info="Inject failure in X8 to TX transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_TX_TO_MPA_FAILURE, + info="Inject failure in TX to MPA transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_MPA_TO_HPA_FAILURE, + info="Inject failure in MPA to HPA transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_ALL_ON_FAILURE, + info="Inject failure in all on mode", + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.PL_PCDU.value, + info="PL PCDU", + op_code_entry=op_code_dict, + ) + + def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.SWITCH_ON: pack_pl_pcdu_mode_cmd( @@ -175,6 +277,12 @@ def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str): | (1 << NormalSubmodesMask.HPA_ON) ), ) + if op_code in OpCodes.REQ_OS_HK: + tc_queue.appendleft((QueueCommands.PRINT, f"PL PCDU: {Info.REQ_OS_HK}")) + cmd = generate_one_diag_command( + sid=make_sid(object_id=PL_PCDU_ID, set_id=SetIds.ADC), ssc=0 + ) + tc_queue.appendleft(cmd.pack_command_tuple()) if op_code in OpCodes.INJECT_ALL_ON_FAILURE: pack_failure_injection_cmd( tc_queue=tc_queue, diff --git a/pus_tm/devs/plpcdu.py b/pus_tm/devs/plpcdu.py new file mode 100644 index 0000000..33eb3ca --- /dev/null +++ b/pus_tm/devs/plpcdu.py @@ -0,0 +1,52 @@ +import struct + +from pus_tm.defs import PrintWrapper +from tmtccmd.utility.tmtc_printer import FsfwTmTcPrinter +from pus_tc.devs.plpcdu import SetIds + + +ADC_CHANNELS_NAMED = [ + "U BAT DIV 6", + "U NEG V FB", + "I HPA", + "U HPA DIV 6", + "I MPA", + "U MPA DIV 6", + "I TX", + "U TX DIV 6", + "I X8", + "U X8 DIV 6", + "I DRO", + "U DRO DIV 6", +] + + +def handle_plpcdu_hk(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes): + if set_id == SetIds.ADC: + pw = PrintWrapper(printer) + current_idx = 0 + pw.dlog("Received PL PCDU ADC HK data") + channels = [] + ch_print = "Channels Raw (hex): [" + for i in range(12): + channels.append( + struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0] + ) + if i < 11: + ch_print += f"{channels[i]:06x}," + else: + ch_print += f"{channels[i]:06x}]" + current_idx += 2 + processed_vals = [] + for i in range(12): + processed_vals.append( + struct.unpack("!f", hk_data[current_idx : current_idx + 4])[0] + ) + current_idx += 4 + temp = struct.unpack("!f", hk_data[current_idx : current_idx + 4])[0] + current_idx += 4 + pw.dlog(f"Temperature: {temp} C") + pw.dlog(ch_print) + for i in range(12): + pw.dlog(f"{ADC_CHANNELS_NAMED[i].ljust(24)} | {processed_vals[i]}") + printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=3) diff --git a/pus_tm/hk_handling.py b/pus_tm/hk_handling.py index 427017c..34f49e3 100644 --- a/pus_tm/hk_handling.py +++ b/pus_tm/hk_handling.py @@ -1,6 +1,7 @@ """HK Handling for EIVE OBSW""" import struct +from pus_tm.devs.plpcdu import handle_plpcdu_hk from pus_tm.devs.rad_sensor import handle_rad_sensor_data from pus_tm.system.tcs import handle_thermal_controller_hk_data, TM_TCP_SERVER from tmtccmd.config.definitions import HkReplyUnpacked @@ -126,9 +127,9 @@ def handle_regular_hk_print( handle_mgm_hk_data( object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id ) - if objb == obj_ids.PL_PCDU_ID: - log_to_both(printer, "Received PL PCDU HK data") - if objb == obj_ids.THERMAL_CONTROLLER_ID: + elif objb == obj_ids.PL_PCDU_ID: + handle_plpcdu_hk(set_id=set_id, hk_data=hk_data, printer=printer) + elif objb == obj_ids.THERMAL_CONTROLLER_ID: handle_thermal_controller_hk_data( object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data ) From 3d939c42b69825990f499d026e73bf571097d837 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 02:18:37 +0200 Subject: [PATCH 058/132] update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a24f0b..4d9dd0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ list yields a list of all related PRs for each release. # [v1.12.0] +- Update GPS HK Parsing + PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/86 +- PL PCDU HK Parsing + PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/87 - Add Rad Sensor HK parsing PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/81 - Add procedures, parser functions and general application functionalities From 4b762328c53ffbe8f892b90cd89dec581b478dee Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Tue, 24 May 2022 14:58:13 +0200 Subject: [PATCH 059/132] changed to new procedure --- pus_tc/system/proc.py | 57 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 2d4f02f..158808b 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -77,10 +77,22 @@ def generic_print(tc_queue: TcQueueT, info: dict): def pack_generic_hk_listening_cmds( - tc_queue: TcQueueT, proc_key: str, sid: bytes, diag: bool + tc_queue: TcQueueT, proc_key: str, sid_list: bytes, diag: bool ): info = PROC_INFO_DICT[proc_key] generic_print(tc_queue=tc_queue, info=info) + + for sid in sid_list: + enable_listen_to_hk_for_x_seconds( + diag=diag, + tc_queue=tc_queue, + device=proc_key, + sid=sid, + interval_seconds=info[3], + ) + + +""" OLD listen_to_hk_for_x_seconds( diag=diag, tc_queue=tc_queue, @@ -89,9 +101,10 @@ def pack_generic_hk_listening_cmds( interval_seconds=info[3], collection_time=info[2], ) - +""" def pack_proc_commands(tc_queue: TcQueueT, op_code: str): + sid_list = [] if op_code in OpCodes.BAT_FT: key = KAI.BAT_FT[0] sid = make_sid(oids.BPX_HANDLER_ID, BpxSetIds.GET_HK_SET) @@ -101,9 +114,9 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.CORE_FT: key = KAI.CORE_FT[0] - sid = make_sid(oids.CORE_CONTROLLER_ID, CoreSetIds.HK) + sid_list += make_sid(oids.CORE_CONTROLLER_ID, CoreSetIds.HK) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) if op_code in OpCodes.PCDU_FT: @@ -121,7 +134,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) - sid = make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU) + sid = make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU_CORE) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) @@ -137,6 +150,10 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid=sid, diag=False ) + sid = make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU_AUX) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + ) if op_code in OpCodes.RAD_SEN_FT: key = KAI.RAD_SEN_FT[0] @@ -337,3 +354,33 @@ def listen_to_hk_for_x_seconds( tc_queue.appendleft( disable_periodic_hk_command(diag=diag, sid=sid, ssc=0).pack_command_tuple() ) + + +def enable_listen_to_hk_for_x_seconds( + tc_queue: TcQueueT, + diag: bool, + device: str, + sid: bytes, + interval_seconds: float, +): + tc_queue.appendleft((QueueCommands.PRINT, f"Enabling periodic HK for {device}")) + cmd_tuple = enable_periodic_hk_command_with_interval( + diag=diag, sid=sid, interval_seconds=interval_seconds, ssc=0 + ) + for cmd in cmd_tuple: + tc_queue.appendleft(cmd.pack_command_tuple()) + + tc_queue.appendleft((QueueCommands.WAIT, 2.0)) + + +def disable_listen_to_hk_for_x_seconds( + tc_queue: TcQueueT, + diag: bool, + device: str, + sid: bytes, +): + tc_queue.appendleft((QueueCommands.PRINT, f"Disabling periodic HK for {device}")) + tc_queue.appendleft( + disable_periodic_hk_command(diag=diag, sid=sid, ssc=0).pack_command_tuple() + ) + From ccafa89a9294a10bfe4dbe15ca2833b60773850a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 15:06:26 +0200 Subject: [PATCH 060/132] bump tmtccmd dependency --- tmtccmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmtccmd b/tmtccmd index 0e193f9..0adb957 160000 --- a/tmtccmd +++ b/tmtccmd @@ -1 +1 @@ -Subproject commit 0e193f9c76973a6105926ed133b179f8ea467981 +Subproject commit 0adb957c5037721d602d7ab47199f7d4ff42a87e From 095cf822ee5c9cac47dc195bb19f41f65d2d97d7 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Tue, 24 May 2022 15:26:08 +0200 Subject: [PATCH 061/132] cleaned new addition --- pus_tc/system/proc.py | 211 +++++++++++++----------------------------- 1 file changed, 64 insertions(+), 147 deletions(-) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 158808b..a6aeda8 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -77,9 +77,10 @@ def generic_print(tc_queue: TcQueueT, info: dict): def pack_generic_hk_listening_cmds( - tc_queue: TcQueueT, proc_key: str, sid_list: bytes, diag: bool + tc_queue: TcQueueT, proc_key: str, sid_list: list[bytearray], diag: bool ): info = PROC_INFO_DICT[proc_key] + collection_time = info[2] generic_print(tc_queue=tc_queue, info=info) for sid in sid_list: @@ -91,6 +92,18 @@ def pack_generic_hk_listening_cmds( interval_seconds=info[3], ) + tc_queue.appendleft((QueueCommands.WAIT, collection_time)) + + for sid in sid_list: + disable_listen_to_hk_for_x_seconds( + diag=diag, + tc_queue=tc_queue, + device=proc_key, + sid=sid, + ) + + sid_list.clear() + """ OLD listen_to_hk_for_x_seconds( @@ -103,63 +116,42 @@ def pack_generic_hk_listening_cmds( ) """ + def pack_proc_commands(tc_queue: TcQueueT, op_code: str): sid_list = [] if op_code in OpCodes.BAT_FT: key = KAI.BAT_FT[0] - sid = make_sid(oids.BPX_HANDLER_ID, BpxSetIds.GET_HK_SET) + sid_list.append(make_sid(oids.BPX_HANDLER_ID, BpxSetIds.GET_HK_SET)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) if op_code in OpCodes.CORE_FT: key = KAI.CORE_FT[0] - sid_list += make_sid(oids.CORE_CONTROLLER_ID, CoreSetIds.HK) + sid_list.append(make_sid(oids.CORE_CONTROLLER_ID, CoreSetIds.HK)) pack_generic_hk_listening_cmds( tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) if op_code in OpCodes.PCDU_FT: key = KAI.PCDU_FT[0] - - sid = make_sid(oids.P60_DOCK_HANDLER, GsSetIds.P60_CORE) + sid_list.append(make_sid(oids.P60_DOCK_HANDLER, GsSetIds.P60_CORE)) + sid_list.append(make_sid(oids.PDU_1_HANDLER_ID, GsSetIds.PDU_1_CORE)) + sid_list.append(make_sid(oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_CORE)) + sid_list.append(make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU_CORE)) + sid_list.append(make_sid(oids.P60_DOCK_HANDLER, GsSetIds.P60_AUX)) + sid_list.append(make_sid(oids.PDU_1_HANDLER_ID, GsSetIds.PDU_1_AUX)) + sid_list.append(make_sid(oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_AUX)) + sid_list.append(make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU_AUX)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.PDU_1_HANDLER_ID, GsSetIds.PDU_1_CORE) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_CORE) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU_CORE) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.P60_DOCK_HANDLER, GsSetIds.P60_AUX) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.PDU_1_HANDLER_ID, GsSetIds.PDU_1_AUX) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_AUX) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU_AUX) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) if op_code in OpCodes.RAD_SEN_FT: key = KAI.RAD_SEN_FT[0] - sid = make_sid(oids.RAD_SENSOR_ID, RadSetIds.RAD_SEN_CORE) + sid_list.append(make_sid(oids.RAD_SENSOR_ID, RadSetIds.RAD_SEN_CORE)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) if op_code in OpCodes.TCS_FT_ON: @@ -176,31 +168,16 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_acs_command(tc_queue=tc_queue, op_code="acs-a") # MGMs - sid = make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.MGM_1_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) + sid_list.append(make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK)) + sid_list.append(make_sid(oids.MGM_1_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK)) # Gyros - sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_1_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) + sid_list.append(make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK)) + sid_list.append(make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK)) + sid_list.append(make_sid(oids.GYRO_1_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK)) # GNSS0 - sid = make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK) + sid_list.append(make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") @@ -208,31 +185,16 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_acs_command(tc_queue=tc_queue, op_code="acs-b") # MGMs - sid = make_sid(oids.MGM_2_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.MGM_3_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) + sid_list.append(make_sid(oids.MGM_2_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK)) + sid_list.append(make_sid(oids.MGM_3_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK)) # Gyros - sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_3_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) + sid_list.append(make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK)) + sid_list.append(make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK)) + sid_list.append(make_sid(oids.GYRO_3_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK)) # GNSS1 - sid = make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK) + sid_list.append(make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") @@ -240,55 +202,22 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_acs_command(tc_queue=tc_queue, op_code="acs-d") # MGMs - sid = make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.MGM_1_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.MGM_2_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.MGM_3_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) + sid_list.append(make_sid(oids.MGM_0_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK)) + sid_list.append(make_sid(oids.MGM_1_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK)) + sid_list.append(make_sid(oids.MGM_2_LIS3_HANDLER_ID, MgmSetIds_0_2.CORE_HK)) + sid_list.append(make_sid(oids.MGM_3_RM3100_HANDLER_ID, MgmSetIds_1_3.CORE_HK)) # Gyros - sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_1_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GYRO_3_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) + sid_list.append(make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK)) + sid_list.append(make_sid(oids.GYRO_0_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK)) + sid_list.append(make_sid(oids.GYRO_1_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK)) + sid_list.append(make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CORE_HK)) + sid_list.append(make_sid(oids.GYRO_2_ADIS_HANDLER_ID, GyroSetIds_0_2.CFG_HK)) + sid_list.append(make_sid(oids.GYRO_3_L3G_HANDLER_ID, GyroSetIds_1_3.CORE_HK)) # GNSS0+1 - sid = make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK) + sid_list.append(make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK)) + sid_list.append(make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") @@ -296,17 +225,11 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.MGT_FT: key = KAI.MGT_FT[0] - sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET) + sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET)) + sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET)) + sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) # mgt 1: imtq und hk @@ -316,17 +239,11 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): key = KAI.MGT_FT[0] pack_acs_command(tc_queue=tc_queue, op_code="acs-a") - sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET) + sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET)) + sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET)) + sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False - ) - sid = make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET) - pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid=sid, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") From 931cbe26e6a994b3adf0656a5201ffd754bc5de8 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Tue, 24 May 2022 16:59:05 +0200 Subject: [PATCH 062/132] changes to imtq (added dipole command packing as PUS) and proc (added MGT proc) --- pus_tc/devs/imtq.py | 4 +- pus_tc/system/proc.py | 90 ++++++++++++++++++++++++++++++------------- 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/pus_tc/devs/imtq.py b/pus_tc/devs/imtq.py index 7c1f136..3784167 100644 --- a/pus_tc/devs/imtq.py +++ b/pus_tc/devs/imtq.py @@ -211,7 +211,6 @@ def pack_imtq_test_into( z_dipole = 0 duration = 0 # ms command = pack_dipole_command(object_id, x_dipole, y_dipole, z_dipole, duration) - command = PusTelecommand(service=8, subservice=128, ssc=20, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "0" or op_code == "8": @@ -225,7 +224,7 @@ def pack_imtq_test_into( def pack_dipole_command( object_id: bytearray, x_dipole: int, y_dipole: int, z_dipole: int, duration: int -) -> bytearray: +) -> PusTelecommand: """This function packs the command causing the ISIS IMTQ to generate a dipole. @param object_id The object id of the IMTQ handler. @param x_dipole The dipole of the x coil in 10^-4*Am^2 (max. 2000) @@ -242,4 +241,5 @@ def pack_dipole_command( command.extend(y_dipole.to_bytes(length=2, byteorder="big")) command.extend(z_dipole.to_bytes(length=2, byteorder="big")) command.extend(duration.to_bytes(length=2, byteorder="big")) + command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command) return command diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index a6aeda8..b1a5e78 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -29,6 +29,7 @@ from pus_tc.devs.imtq import ImtqSetIds from pus_tc.system.tcs import pack_tcs_sys_commands from pus_tc.system.controllers import pack_controller_commands from pus_tc.system.acs import pack_acs_command +from pus_tc.devs.imtq import pack_dipole_command class OpCodes: @@ -67,6 +68,8 @@ PROC_INFO_DICT = { KAI.TCS_FT_ON[0]: [OpCodes.TCS_FT_ON, KAI.TCS_FT_ON[1], 120.0, 10.0], KAI.TCS_FT_OFF[0]: [OpCodes.TCS_FT_OFF, KAI.TCS_FT_OFF[1], 120.0, 10.0], KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0], + KAI.MGT_FT[0]: [OpCodes.MGT_FT, KAI.MGT_FT[1], 120.0, 10.0], + KAI.MGT_FT_DP[0]: [OpCodes.MGT_FT_DP, KAI.MGT_FT_DP[1], 120.0, 10.0], } @@ -77,7 +80,7 @@ def generic_print(tc_queue: TcQueueT, info: dict): def pack_generic_hk_listening_cmds( - tc_queue: TcQueueT, proc_key: str, sid_list: list[bytearray], diag: bool + tc_queue: TcQueueT, proc_key: str, sid_list: list[bytearray], diag: bool, mgt: bool, ): info = PROC_INFO_DICT[proc_key] collection_time = info[2] @@ -92,6 +95,15 @@ def pack_generic_hk_listening_cmds( interval_seconds=info[3], ) + if mgt is True: + activate_mgts_alternately( + tc_queue=tc_queue, + ) + + else: + pass + +# collection_time maybe be reduced as a full 120seconds is not needed after MGTs are tested tc_queue.appendleft((QueueCommands.WAIT, collection_time)) for sid in sid_list: @@ -105,32 +117,20 @@ def pack_generic_hk_listening_cmds( sid_list.clear() -""" OLD - listen_to_hk_for_x_seconds( - diag=diag, - tc_queue=tc_queue, - device=proc_key, - sid=sid, - interval_seconds=info[3], - collection_time=info[2], - ) -""" - - def pack_proc_commands(tc_queue: TcQueueT, op_code: str): sid_list = [] if op_code in OpCodes.BAT_FT: key = KAI.BAT_FT[0] sid_list.append(make_sid(oids.BPX_HANDLER_ID, BpxSetIds.GET_HK_SET)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) if op_code in OpCodes.CORE_FT: key = KAI.CORE_FT[0] sid_list.append(make_sid(oids.CORE_CONTROLLER_ID, CoreSetIds.HK)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) if op_code in OpCodes.PCDU_FT: @@ -144,14 +144,14 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): sid_list.append(make_sid(oids.PDU_2_HANDLER_ID, GsSetIds.PDU_2_AUX)) sid_list.append(make_sid(oids.ACU_HANDLER_ID, GsSetIds.ACU_AUX)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) if op_code in OpCodes.RAD_SEN_FT: key = KAI.RAD_SEN_FT[0] sid_list.append(make_sid(oids.RAD_SENSOR_ID, RadSetIds.RAD_SEN_CORE)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) if op_code in OpCodes.TCS_FT_ON: @@ -177,7 +177,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): # GNSS0 sid_list.append(make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") @@ -194,7 +194,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): # GNSS1 sid_list.append(make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") @@ -217,7 +217,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): sid_list.append(make_sid(oids.GPS_HANDLER_0_ID, GnssSetIds_0.CORE_HK)) sid_list.append(make_sid(oids.GPS_HANDLER_1_ID, GnssSetIds_1.CORE_HK)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") @@ -225,27 +225,37 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.MGT_FT: key = KAI.MGT_FT[0] +# missing imtq to ON +# mgt 1: imtq und hk + + # MISSING: imtq board activation to ON (implementation pending by Jakob) + sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET)) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET)) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) - # mgt 1: imtq und hk - # mgt 2.: imtq + dual side + dipole + # MISSING: imtq board deactivation to OFF (implementation pending by Jakob) + +# missing imtq to ON +# mgt 2.: imtq + dual side + dipole if op_code in OpCodes.MGT_FT_DP: - key = KAI.MGT_FT[0] - pack_acs_command(tc_queue=tc_queue, op_code="acs-a") + key = KAI.MGT_FT_DP[0] + pack_acs_command(tc_queue=tc_queue, op_code="acs-d") + + # MISSING: imtq board activation to ON (implementation pending by Jakob) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET)) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET)) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET)) pack_generic_hk_listening_cmds( - tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=True ) + # MISSING: imtq board deactivation to OFF (implementation pending by Jakob) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") @@ -301,3 +311,31 @@ def disable_listen_to_hk_for_x_seconds( disable_periodic_hk_command(diag=diag, sid=sid, ssc=0).pack_command_tuple() ) + +def activate_mgts_alternately( + tc_queue: TcQueueT, +): + + command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=2000, y_dipole=0, z_dipole=0, duration=30000) + tc_queue.appendleft(command.pack_command_tuple()) + tc_queue.appendleft((QueueCommands.WAIT, 10.0)) + + command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=-2000, y_dipole=0, z_dipole=0, duration=30000) + tc_queue.appendleft(command.pack_command_tuple()) + tc_queue.appendleft((QueueCommands.WAIT, 10.0)) + + command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=0, y_dipole=2000, z_dipole=0, duration=30000) + tc_queue.appendleft(command.pack_command_tuple()) + tc_queue.appendleft((QueueCommands.WAIT, 10.0)) + + command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=0, y_dipole=-2000, z_dipole=0, duration=30000) + tc_queue.appendleft(command.pack_command_tuple()) + tc_queue.appendleft((QueueCommands.WAIT, 10.0)) + + command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=0, y_dipole=0, z_dipole=2000, duration=30000) + tc_queue.appendleft(command.pack_command_tuple()) + tc_queue.appendleft((QueueCommands.WAIT, 10.0)) + + command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=0, y_dipole=0, z_dipole=-2000, duration=30000) + tc_queue.appendleft(command.pack_command_tuple()) + tc_queue.appendleft((QueueCommands.WAIT, 10.0)) From 0c9547eb3ac2be0977d82ef84848ec9d4d6a0e03 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 17:01:35 +0200 Subject: [PATCH 063/132] pl pcdu procedure --- pus_tc/cmd_definitions.py | 97 ++---------- pus_tc/devs/plpcdu.py | 325 +++++++++++++++++++++++++++++++++----- pus_tc/system/core.py | 4 +- 3 files changed, 295 insertions(+), 131 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 16bd542..63e4df0 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -1,7 +1,3 @@ -from pus_tc.devs.gps import GpsOpCodes -from pus_tc.devs.pcdu import add_pcdu_cmds -from pus_tc.devs.rad_sensor import add_rad_sens_cmds -from pus_tc.system.core import add_core_controller_definitions from tmtccmd.config import ( add_op_code_entry, add_service_op_code_entry, @@ -9,12 +5,19 @@ from tmtccmd.config import ( ServiceOpCodeDictT, OpCodeDictKeys, ) -from config.definitions import CustomServiceList +from tmtccmd.config.globals import get_default_service_op_code_dict + +from pus_tc.devs.gps import GpsOpCodes +from pus_tc.devs.pcdu import add_pcdu_cmds +from pus_tc.devs.plpcdu import add_pl_pcdu_cmds +from pus_tc.devs.rad_sensor import add_rad_sens_cmds +from pus_tc.system.core import add_core_controller_definitions from pus_tc.devs.heater import add_heater_cmds from pus_tc.devs.rtd import specify_rtd_cmds from pus_tc.devs.reaction_wheels import add_rw_cmds from pus_tc.devs.bpx_batt import BpxOpCodes -from tmtccmd.config.globals import get_default_service_op_code_dict + +from config.definitions import CustomServiceList def get_eive_service_op_code_dict() -> ServiceOpCodeDictT: @@ -322,88 +325,6 @@ def add_bpx_cmd_definitions(cmd_dict: ServiceOpCodeDictT): ) -def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): - from pus_tc.devs.plpcdu import OpCodes, Info - op_code_dict = dict() - add_op_code_entry( - op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_SSR, - info=Info.NORMAL_SSR, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_DRO, - info=Info.NORMAL_DRO, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_X8, - info=Info.NORMAL_X8, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_TX, - info=Info.NORMAL_TX, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_MPA, - info=Info.NORMAL_MPA, - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.NORMAL_HPA, - info=Info.NORMAL_HPA, - ) - add_op_code_entry( - op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.UPDATE_DRO_TO_X8_WAIT, - info="Update DRO to X8 wait time", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_SSR_TO_DRO_FAILURE, - info="Inject failure SSR to DRO transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_DRO_TO_X8_FAILURE, - info="Inject failure in DRO to X8 transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_X8_TO_TX_FAILURE, - info="Inject failure in X8 to TX transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_TX_TO_MPA_FAILURE, - info="Inject failure in TX to MPA transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_MPA_TO_HPA_FAILURE, - info="Inject failure in MPA to HPA transition", - ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.INJECT_ALL_ON_FAILURE, - info="Inject failure in all on mode", - ) - add_service_op_code_entry( - srv_op_code_dict=cmd_dict, - name=CustomServiceList.PL_PCDU.value, - info="PL PCDU", - op_code_entry=op_code_dict, - ) - - def add_time_cmds(cmd_dict: ServiceOpCodeDictT): from pus_tc.system.time import OpCodes, Info diff --git a/pus_tc/devs/plpcdu.py b/pus_tc/devs/plpcdu.py index 28775d0..05367e3 100644 --- a/pus_tc/devs/plpcdu.py +++ b/pus_tc/devs/plpcdu.py @@ -1,8 +1,20 @@ import enum +import struct +import time from typing import Optional -from tmtccmd.config import QueueCommands +from config.definitions import CustomServiceList +from tmtccmd.config import ( + QueueCommands, + ServiceOpCodeDictT, + add_op_code_entry, + add_service_op_code_entry, +) from tmtccmd.tc.definitions import TcQueueT +from tmtccmd.tc.pus_11_tc_sched import ( + generate_enable_tc_sched_cmd, + generate_time_tagged_cmd, +) from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes, Subservices from tmtccmd.tc.pus_20_params import ( pack_scalar_double_param_app_data, @@ -26,18 +38,14 @@ class OpCodes: NORMAL_MPA = ["6", "nml-mpa"] NORMAL_HPA = ["7", "nml-hpa"] - INJECT_SSR_TO_DRO_FAILURE = ["10", "inject-ssr-dro-fault"] - INJECT_DRO_TO_X8_FAILURE = ["11", "inject-dro-x8-fault"] - INJECT_X8_TO_TX_FAILURE = ["12", "inject-x8-tx-fault"] - INJECT_TX_TO_MPA_FAILURE = ["13", "inject-tx-mpa-fault"] - INJECT_MPA_TO_HPA_FAILURE = ["14", "inject-mpa-hpa-fault"] - INJECT_ALL_ON_FAILURE = ["15", "inject-all-on-fault"] + SWITCH_HPA_ON_PROC = ["12", "proc-hpa"] - # The following commands might become deprecated in the future - UPDATE_DRO_TO_X8_WAIT = ["128", "dro-to-x8-wait"] - UPDATE_X8_TO_TX_WAIT_TIME = ["129", "x8-to-tx-wait"] - UPDATE_TX_TO_MPA_WAIT_TIME = ["130", "tx-to-mpa-wait"] - UPDATE_MPA_TO_HPA_WAIT_TIME = ["131", "mpa-to-hpa-wait"] + INJECT_SSR_TO_DRO_FAILURE = ["15", "inject-ssr-dro-fault"] + INJECT_DRO_TO_X8_FAILURE = ["16", "inject-dro-x8-fault"] + INJECT_X8_TO_TX_FAILURE = ["17", "inject-x8-tx-fault"] + INJECT_TX_TO_MPA_FAILURE = ["18", "inject-tx-mpa-fault"] + INJECT_MPA_TO_HPA_FAILURE = ["19", "inject-mpa-hpa-fault"] + INJECT_ALL_ON_FAILURE = ["20", "inject-all-on-fault"] class Info: @@ -51,6 +59,8 @@ class Info: NORMAL_MPA = f"{NORMAL}, MPA on" NORMAL_HPA = f"{NORMAL}, HPA on" + SWITCH_HPA_ON_PROC = "Full Procedure to switch HPA on" + class NormalSubmodesMask(enum.IntEnum): SOLID_STATE_RELAYS_ADC_ON = 0 @@ -99,6 +109,126 @@ class ParamIds(enum.IntEnum): INJECT_ALL_ON_FAILURE = 35 +def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): + op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_SSR, + info=Info.NORMAL_SSR, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_DRO, + info=Info.NORMAL_DRO, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_X8, + info=Info.NORMAL_X8, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_TX, + info=Info.NORMAL_TX, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_MPA, + info=Info.NORMAL_MPA, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.NORMAL_HPA, + info=Info.NORMAL_HPA, + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.SWITCH_HPA_ON_PROC, + info=Info.SWITCH_HPA_ON_PROC, + ) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_SSR_TO_DRO_FAILURE, + info="Inject failure SSR to DRO transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_DRO_TO_X8_FAILURE, + info="Inject failure in DRO to X8 transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_X8_TO_TX_FAILURE, + info="Inject failure in X8 to TX transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_TX_TO_MPA_FAILURE, + info="Inject failure in TX to MPA transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_MPA_TO_HPA_FAILURE, + info="Inject failure in MPA to HPA transition", + ) + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.INJECT_ALL_ON_FAILURE, + info="Inject failure in all on mode", + ) + add_service_op_code_entry( + srv_op_code_dict=cmd_dict, + name=CustomServiceList.PL_PCDU.value, + info="PL PCDU", + op_code_entry=op_code_dict, + ) + + +def submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int: + if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON: + return 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + if on_tgt == NormalSubmodesMask.DRO_ON: + return 1 << NormalSubmodesMask.DRO_ON | ( + 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + ) + if on_tgt == NormalSubmodesMask.X8_ON: + return ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + ) + if on_tgt == NormalSubmodesMask.TX_ON: + return ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + ) + if on_tgt == NormalSubmodesMask.MPA_ON: + return ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + | (1 << NormalSubmodesMask.MPA_ON) + ) + if on_tgt == NormalSubmodesMask.HPA_ON: + return ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + | (1 << NormalSubmodesMask.MPA_ON) + | (1 << NormalSubmodesMask.HPA_ON) + ) + + def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.SWITCH_ON: pack_pl_pcdu_mode_cmd( @@ -113,68 +243,179 @@ def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, info=Info.NORMAL_SSR, mode=Modes.NORMAL, - submode=(1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON), + submode=submode_mask_to_submode( + NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + ), ) if op_code in OpCodes.NORMAL_DRO: pack_pl_pcdu_mode_cmd( tc_queue=tc_queue, info=Info.NORMAL_DRO, mode=Modes.NORMAL, - submode=( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - ), + submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON), ) if op_code in OpCodes.NORMAL_X8: pack_pl_pcdu_mode_cmd( tc_queue=tc_queue, info=Info.NORMAL_X8, mode=Modes.NORMAL, - submode=( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - ), + submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON), ) if op_code in OpCodes.NORMAL_TX: pack_pl_pcdu_mode_cmd( tc_queue=tc_queue, info=Info.NORMAL_TX, mode=Modes.NORMAL, - submode=( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - | (1 << NormalSubmodesMask.TX_ON) - ), + submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON), ) if op_code in OpCodes.NORMAL_MPA: pack_pl_pcdu_mode_cmd( tc_queue=tc_queue, info=Info.NORMAL_MPA, mode=Modes.NORMAL, - submode=( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - | (1 << NormalSubmodesMask.TX_ON) - | (1 << NormalSubmodesMask.MPA_ON) - ), + submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON), ) if op_code in OpCodes.NORMAL_HPA: pack_pl_pcdu_mode_cmd( tc_queue=tc_queue, info=Info.NORMAL_HPA, mode=Modes.NORMAL, - submode=( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - | (1 << NormalSubmodesMask.TX_ON) - | (1 << NormalSubmodesMask.MPA_ON) - | (1 << NormalSubmodesMask.HPA_ON) + submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON), + ) + if op_code in OpCodes.SWITCH_HPA_ON_PROC: + while True: + delay_dro_to_x8 = input( + "Please specify delay between DRO and switching " + "on X8 [default 900]: " + ) + if delay_dro_to_x8 == "": + delay_dro_to_x8 = 900 + break + if delay_dro_to_x8.isdigit(): + print("Invalid value, not a number") + continue + delay_dro_to_x8 = int(delay_dro_to_x8) + if delay_dro_to_x8 < 0: + print("Invalid number") + break + tc_queue.appendleft( + ( + QueueCommands.PRINT, + f"Starting procedure to switch on PL PCDU HPA with DRO to X8 delay of {delay_dro_to_x8} seconds", + ) + ) + pl_pcdu_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data(object_id=PL_PCDU_ID, mode=Modes.ON, submode=0), + ) + ssr_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode( + NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + ), ), ) + dro_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON), + ), + ) + x8_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON), + ), + ) + tx_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON), + ), + ) + mpa_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON), + ), + ) + hpa_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON), + ), + ) + current_time = time.time() + + enb_sched = generate_enable_tc_sched_cmd(ssc=0) + + sched_time = current_time + 10 + tc_queue.appendleft(enb_sched.pack_command_tuple()) + tagged_on_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), + tc_to_insert=pl_pcdu_on, + ssc=1, + ) + tc_queue.appendleft(tagged_on_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_ssr_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), + tc_to_insert=ssr_on, + ssc=2, + ) + tc_queue.appendleft(tagged_ssr_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_dro_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=dro_on, ssc=3 + ) + tc_queue.appendleft(tagged_dro_cmd.pack_command_tuple()) + + sched_time += delay_dro_to_x8 + tagged_x8_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=x8_on, ssc=4 + ) + tc_queue.appendleft(tagged_x8_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_tx_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=tx_on, ssc=5 + ) + tc_queue.appendleft(tagged_tx_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_mpa_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=mpa_on, ssc=6 + ) + tc_queue.appendleft(tagged_mpa_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_hpa_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=hpa_on, ssc=7 + ) + tc_queue.appendleft(tagged_hpa_cmd.pack_command_tuple()) + if op_code in OpCodes.INJECT_ALL_ON_FAILURE: pack_failure_injection_cmd( tc_queue=tc_queue, diff --git a/pus_tc/system/core.py b/pus_tc/system/core.py index ece17c2..f44ad87 100644 --- a/pus_tc/system/core.py +++ b/pus_tc/system/core.py @@ -133,7 +133,9 @@ def pack_core_commands(tc_queue: TcQueueT, op_code: str): ) if op_code in OpCodes.REBOOT_FULL: tc_queue.appendleft((QueueCommands.PRINT, f"Core Command: {Info.REBOOT_FULL}")) - cmd = generate_action_command(object_id=CORE_CONTROLLER_ID, action_id=ActionIds.FULL_REBOOT) + cmd = generate_action_command( + object_id=CORE_CONTROLLER_ID, action_id=ActionIds.FULL_REBOOT + ) tc_queue.appendleft(cmd.pack_command_tuple()) if op_code in OpCodes.XSC_REBOOT_SELF: perform_reboot_cmd(tc_queue=tc_queue, reboot_self=True) From 66c3942afbc315da73a58dcb4f8a96b7849bcd5f Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Tue, 24 May 2022 17:03:32 +0200 Subject: [PATCH 064/132] function "listen_to_hk_for_x_seconds" might be deleted --- pus_tc/system/proc.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index b1a5e78..2bfc324 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -259,6 +259,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_acs_command(tc_queue=tc_queue, op_code="acs-off") +""" def listen_to_hk_for_x_seconds( tc_queue: TcQueueT, diag: bool, @@ -281,6 +282,7 @@ def listen_to_hk_for_x_seconds( tc_queue.appendleft( disable_periodic_hk_command(diag=diag, sid=sid, ssc=0).pack_command_tuple() ) +""" def enable_listen_to_hk_for_x_seconds( From 96c6feb7469418d4f985b57b6c56d9a22b3b02fa Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 17:04:03 +0200 Subject: [PATCH 065/132] cleaned up a bit --- pus_tc/devs/plpcdu.py | 334 +++++++++++++++++++++--------------------- 1 file changed, 163 insertions(+), 171 deletions(-) diff --git a/pus_tc/devs/plpcdu.py b/pus_tc/devs/plpcdu.py index 05367e3..2ff3946 100644 --- a/pus_tc/devs/plpcdu.py +++ b/pus_tc/devs/plpcdu.py @@ -190,45 +190,6 @@ def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): ) -def submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int: - if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON: - return 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON - if on_tgt == NormalSubmodesMask.DRO_ON: - return 1 << NormalSubmodesMask.DRO_ON | ( - 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON - ) - if on_tgt == NormalSubmodesMask.X8_ON: - return ( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - ) - if on_tgt == NormalSubmodesMask.TX_ON: - return ( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - | (1 << NormalSubmodesMask.TX_ON) - ) - if on_tgt == NormalSubmodesMask.MPA_ON: - return ( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - | (1 << NormalSubmodesMask.TX_ON) - | (1 << NormalSubmodesMask.MPA_ON) - ) - if on_tgt == NormalSubmodesMask.HPA_ON: - return ( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - | (1 << NormalSubmodesMask.TX_ON) - | (1 << NormalSubmodesMask.MPA_ON) - | (1 << NormalSubmodesMask.HPA_ON) - ) - - def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.SWITCH_ON: pack_pl_pcdu_mode_cmd( @@ -283,138 +244,7 @@ def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str): submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON), ) if op_code in OpCodes.SWITCH_HPA_ON_PROC: - while True: - delay_dro_to_x8 = input( - "Please specify delay between DRO and switching " - "on X8 [default 900]: " - ) - if delay_dro_to_x8 == "": - delay_dro_to_x8 = 900 - break - if delay_dro_to_x8.isdigit(): - print("Invalid value, not a number") - continue - delay_dro_to_x8 = int(delay_dro_to_x8) - if delay_dro_to_x8 < 0: - print("Invalid number") - break - tc_queue.appendleft( - ( - QueueCommands.PRINT, - f"Starting procedure to switch on PL PCDU HPA with DRO to X8 delay of {delay_dro_to_x8} seconds", - ) - ) - pl_pcdu_on = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=pack_mode_data(object_id=PL_PCDU_ID, mode=Modes.ON, submode=0), - ) - ssr_on = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=pack_mode_data( - object_id=PL_PCDU_ID, - mode=Modes.NORMAL, - submode=submode_mask_to_submode( - NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON - ), - ), - ) - dro_on = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=pack_mode_data( - object_id=PL_PCDU_ID, - mode=Modes.NORMAL, - submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON), - ), - ) - x8_on = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=pack_mode_data( - object_id=PL_PCDU_ID, - mode=Modes.NORMAL, - submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON), - ), - ) - tx_on = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=pack_mode_data( - object_id=PL_PCDU_ID, - mode=Modes.NORMAL, - submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON), - ), - ) - mpa_on = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=pack_mode_data( - object_id=PL_PCDU_ID, - mode=Modes.NORMAL, - submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON), - ), - ) - hpa_on = PusTelecommand( - service=200, - subservice=Subservices.TC_MODE_COMMAND, - app_data=pack_mode_data( - object_id=PL_PCDU_ID, - mode=Modes.NORMAL, - submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON), - ), - ) - current_time = time.time() - - enb_sched = generate_enable_tc_sched_cmd(ssc=0) - - sched_time = current_time + 10 - tc_queue.appendleft(enb_sched.pack_command_tuple()) - tagged_on_cmd = generate_time_tagged_cmd( - release_time=struct.pack("!I", sched_time), - tc_to_insert=pl_pcdu_on, - ssc=1, - ) - tc_queue.appendleft(tagged_on_cmd.pack_command_tuple()) - - sched_time += 5 - tagged_ssr_cmd = generate_time_tagged_cmd( - release_time=struct.pack("!I", sched_time), - tc_to_insert=ssr_on, - ssc=2, - ) - tc_queue.appendleft(tagged_ssr_cmd.pack_command_tuple()) - - sched_time += 5 - tagged_dro_cmd = generate_time_tagged_cmd( - release_time=struct.pack("!I", sched_time), tc_to_insert=dro_on, ssc=3 - ) - tc_queue.appendleft(tagged_dro_cmd.pack_command_tuple()) - - sched_time += delay_dro_to_x8 - tagged_x8_cmd = generate_time_tagged_cmd( - release_time=struct.pack("!I", sched_time), tc_to_insert=x8_on, ssc=4 - ) - tc_queue.appendleft(tagged_x8_cmd.pack_command_tuple()) - - sched_time += 5 - tagged_tx_cmd = generate_time_tagged_cmd( - release_time=struct.pack("!I", sched_time), tc_to_insert=tx_on, ssc=5 - ) - tc_queue.appendleft(tagged_tx_cmd.pack_command_tuple()) - - sched_time += 5 - tagged_mpa_cmd = generate_time_tagged_cmd( - release_time=struct.pack("!I", sched_time), tc_to_insert=mpa_on, ssc=6 - ) - tc_queue.appendleft(tagged_mpa_cmd.pack_command_tuple()) - - sched_time += 5 - tagged_hpa_cmd = generate_time_tagged_cmd( - release_time=struct.pack("!I", sched_time), tc_to_insert=hpa_on, ssc=7 - ) - tc_queue.appendleft(tagged_hpa_cmd.pack_command_tuple()) + hpa_on_procedure(tc_queue) if op_code in OpCodes.INJECT_ALL_ON_FAILURE: pack_failure_injection_cmd( @@ -424,6 +254,129 @@ def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str): ) +def hpa_on_procedure(tc_queue: TcQueueT): + delay_dro_to_x8 = request_wait_time() + if delay_dro_to_x8 is None: + delay_dro_to_x8 = 900 + tc_queue.appendleft( + ( + QueueCommands.PRINT, + f"Starting procedure to switch on PL PCDU HPA with DRO to X8 delay of {delay_dro_to_x8} seconds", + ) + ) + pl_pcdu_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data(object_id=PL_PCDU_ID, mode=Modes.ON, submode=0), + ) + ssr_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode( + NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + ), + ), + ) + dro_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON), + ), + ) + x8_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON), + ), + ) + tx_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON), + ), + ) + mpa_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON), + ), + ) + hpa_on = PusTelecommand( + service=200, + subservice=Subservices.TC_MODE_COMMAND, + app_data=pack_mode_data( + object_id=PL_PCDU_ID, + mode=Modes.NORMAL, + submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON), + ), + ) + current_time = time.time() + + enb_sched = generate_enable_tc_sched_cmd(ssc=0) + + sched_time = current_time + 10 + tc_queue.appendleft(enb_sched.pack_command_tuple()) + tagged_on_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), + tc_to_insert=pl_pcdu_on, + ssc=1, + ) + tc_queue.appendleft(tagged_on_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_ssr_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), + tc_to_insert=ssr_on, + ssc=2, + ) + tc_queue.appendleft(tagged_ssr_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_dro_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=dro_on, ssc=3 + ) + tc_queue.appendleft(tagged_dro_cmd.pack_command_tuple()) + + sched_time += delay_dro_to_x8 + tagged_x8_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=x8_on, ssc=4 + ) + tc_queue.appendleft(tagged_x8_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_tx_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=tx_on, ssc=5 + ) + tc_queue.appendleft(tagged_tx_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_mpa_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=mpa_on, ssc=6 + ) + tc_queue.appendleft(tagged_mpa_cmd.pack_command_tuple()) + + sched_time += 5 + tagged_hpa_cmd = generate_time_tagged_cmd( + release_time=struct.pack("!I", sched_time), tc_to_insert=hpa_on, ssc=7 + ) + tc_queue.appendleft(tagged_hpa_cmd.pack_command_tuple()) + + def request_wait_time() -> Optional[float]: while True: wait_time = input("Please enter DRO to X8 wait time in seconds, x to cancel: ") @@ -440,6 +393,45 @@ def request_wait_time() -> Optional[float]: return wait_time +def submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int: + if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON: + return 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + if on_tgt == NormalSubmodesMask.DRO_ON: + return 1 << NormalSubmodesMask.DRO_ON | ( + 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + ) + if on_tgt == NormalSubmodesMask.X8_ON: + return ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + ) + if on_tgt == NormalSubmodesMask.TX_ON: + return ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + ) + if on_tgt == NormalSubmodesMask.MPA_ON: + return ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + | (1 << NormalSubmodesMask.MPA_ON) + ) + if on_tgt == NormalSubmodesMask.HPA_ON: + return ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + | (1 << NormalSubmodesMask.MPA_ON) + | (1 << NormalSubmodesMask.HPA_ON) + ) + + def pack_wait_time_cmd(tc_queue: TcQueueT, param_id: int, print_str: str): wait_time = request_wait_time() tc_queue.appendleft( From e6eee0d5181c671d7116c97a24f2a189989a523e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 17:07:13 +0200 Subject: [PATCH 066/132] some reordering --- pus_tc/devs/plpcdu.py | 36 +++++++++++++++++------------------- spacepackets | 2 +- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/pus_tc/devs/plpcdu.py b/pus_tc/devs/plpcdu.py index 2ff3946..1728753 100644 --- a/pus_tc/devs/plpcdu.py +++ b/pus_tc/devs/plpcdu.py @@ -29,16 +29,15 @@ LOGGER = get_console_logger() class OpCodes: - SWITCH_ON = ["0", "on"] - SWITCH_OFF = ["1", "off"] - NORMAL_SSR = ["2", "nml-ssr"] - NORMAL_DRO = ["3", "nml-dro"] - NORMAL_X8 = ["4", "nml-x8"] - NORMAL_TX = ["5", "nml-tx"] - NORMAL_MPA = ["6", "nml-mpa"] - NORMAL_HPA = ["7", "nml-hpa"] - - SWITCH_HPA_ON_PROC = ["12", "proc-hpa"] + SWITCH_HPA_ON_PROC = ["0", "proc-hpa"] + SWITCH_ON = ["2", "on"] + SWITCH_OFF = ["3", "off"] + NORMAL_SSR = ["4", "nml-ssr"] + NORMAL_DRO = ["5", "nml-dro"] + NORMAL_X8 = ["6", "nml-x8"] + NORMAL_TX = ["7", "nml-tx"] + NORMAL_MPA = ["8", "nml-mpa"] + NORMAL_HPA = ["9", "nml-hpa"] INJECT_SSR_TO_DRO_FAILURE = ["15", "inject-ssr-dro-fault"] INJECT_DRO_TO_X8_FAILURE = ["16", "inject-dro-x8-fault"] @@ -111,9 +110,17 @@ class ParamIds(enum.IntEnum): def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): op_code_dict = dict() + add_op_code_entry( + op_code_dict=op_code_dict, + keys=OpCodes.SWITCH_HPA_ON_PROC, + info=Info.SWITCH_HPA_ON_PROC, + ) add_op_code_entry( op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON ) + add_op_code_entry( + op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF + ) add_op_code_entry( op_code_dict=op_code_dict, keys=OpCodes.NORMAL_SSR, @@ -144,14 +151,6 @@ def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): keys=OpCodes.NORMAL_HPA, info=Info.NORMAL_HPA, ) - add_op_code_entry( - op_code_dict=op_code_dict, - keys=OpCodes.SWITCH_HPA_ON_PROC, - info=Info.SWITCH_HPA_ON_PROC, - ) - add_op_code_entry( - op_code_dict=op_code_dict, keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF - ) add_op_code_entry( op_code_dict=op_code_dict, keys=OpCodes.INJECT_SSR_TO_DRO_FAILURE, @@ -245,7 +244,6 @@ def pack_pl_pcdu_commands(tc_queue: TcQueueT, op_code: str): ) if op_code in OpCodes.SWITCH_HPA_ON_PROC: hpa_on_procedure(tc_queue) - if op_code in OpCodes.INJECT_ALL_ON_FAILURE: pack_failure_injection_cmd( tc_queue=tc_queue, diff --git a/spacepackets b/spacepackets index d0c3f4a..9ee7922 160000 --- a/spacepackets +++ b/spacepackets @@ -1 +1 @@ -Subproject commit d0c3f4a802c3cddc5be2919af763b08fe6a6b05c +Subproject commit 9ee7922bf7b7a678f8e5ebd5926001defac9a3d4 From c37eb77da3ef257892acd944dd86b9c6dcc2e77c Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Tue, 24 May 2022 17:08:20 +0200 Subject: [PATCH 067/132] minor changes --- pus_tc/system/proc.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 2bfc324..fa45409 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -70,6 +70,7 @@ PROC_INFO_DICT = { KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0], KAI.MGT_FT[0]: [OpCodes.MGT_FT, KAI.MGT_FT[1], 120.0, 10.0], KAI.MGT_FT_DP[0]: [OpCodes.MGT_FT_DP, KAI.MGT_FT_DP[1], 120.0, 10.0], +# collection_time for KAI.MGT_FT_DP maybe be reduced as a full 120seconds is not needed after MGTs are tested } @@ -103,7 +104,6 @@ def pack_generic_hk_listening_cmds( else: pass -# collection_time maybe be reduced as a full 120seconds is not needed after MGTs are tested tc_queue.appendleft((QueueCommands.WAIT, collection_time)) for sid in sid_list: @@ -155,10 +155,12 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): ) if op_code in OpCodes.TCS_FT_ON: +# check whether tcs_assembly also has to be commanded to NORMAL Mode # pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-normal") pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") if op_code in OpCodes.TCS_FT_OFF: +# check whether tcs_assembly also has to be commanded to OFF Mode # pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-off") pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") From 9c5d16fb7cbaee9697a0c5dc96ee41a5ab53ad4a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 17:24:09 +0200 Subject: [PATCH 068/132] apply black --- pus_tc/cmd_definitions.py | 1 + pus_tc/system/core.py | 4 ++- pus_tc/system/proc.py | 68 +++++++++++++++++++++++++++++++-------- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/pus_tc/cmd_definitions.py b/pus_tc/cmd_definitions.py index 16bd542..357c126 100644 --- a/pus_tc/cmd_definitions.py +++ b/pus_tc/cmd_definitions.py @@ -324,6 +324,7 @@ def add_bpx_cmd_definitions(cmd_dict: ServiceOpCodeDictT): def add_pl_pcdu_cmds(cmd_dict: ServiceOpCodeDictT): from pus_tc.devs.plpcdu import OpCodes, Info + op_code_dict = dict() add_op_code_entry( op_code_dict=op_code_dict, keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON diff --git a/pus_tc/system/core.py b/pus_tc/system/core.py index ece17c2..f44ad87 100644 --- a/pus_tc/system/core.py +++ b/pus_tc/system/core.py @@ -133,7 +133,9 @@ def pack_core_commands(tc_queue: TcQueueT, op_code: str): ) if op_code in OpCodes.REBOOT_FULL: tc_queue.appendleft((QueueCommands.PRINT, f"Core Command: {Info.REBOOT_FULL}")) - cmd = generate_action_command(object_id=CORE_CONTROLLER_ID, action_id=ActionIds.FULL_REBOOT) + cmd = generate_action_command( + object_id=CORE_CONTROLLER_ID, action_id=ActionIds.FULL_REBOOT + ) tc_queue.appendleft(cmd.pack_command_tuple()) if op_code in OpCodes.XSC_REBOOT_SELF: perform_reboot_cmd(tc_queue=tc_queue, reboot_self=True) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index fa45409..c2cb707 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -70,7 +70,7 @@ PROC_INFO_DICT = { KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0], KAI.MGT_FT[0]: [OpCodes.MGT_FT, KAI.MGT_FT[1], 120.0, 10.0], KAI.MGT_FT_DP[0]: [OpCodes.MGT_FT_DP, KAI.MGT_FT_DP[1], 120.0, 10.0], -# collection_time for KAI.MGT_FT_DP maybe be reduced as a full 120seconds is not needed after MGTs are tested + # collection_time for KAI.MGT_FT_DP maybe be reduced as a full 120seconds is not needed after MGTs are tested } @@ -81,7 +81,11 @@ def generic_print(tc_queue: TcQueueT, info: dict): def pack_generic_hk_listening_cmds( - tc_queue: TcQueueT, proc_key: str, sid_list: list[bytearray], diag: bool, mgt: bool, + tc_queue: TcQueueT, + proc_key: str, + sid_list: list[bytearray], + diag: bool, + mgt: bool, ): info = PROC_INFO_DICT[proc_key] collection_time = info[2] @@ -155,12 +159,12 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): ) if op_code in OpCodes.TCS_FT_ON: -# check whether tcs_assembly also has to be commanded to NORMAL Mode + # check whether tcs_assembly also has to be commanded to NORMAL Mode # pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-normal") pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") if op_code in OpCodes.TCS_FT_OFF: -# check whether tcs_assembly also has to be commanded to OFF Mode + # check whether tcs_assembly also has to be commanded to OFF Mode # pack_tcs_sys_commands(tc_queue=tc_queue, op_code="tcs-off") pack_controller_commands(tc_queue=tc_queue, op_code="thermal_controller") @@ -227,8 +231,8 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.MGT_FT: key = KAI.MGT_FT[0] -# missing imtq to ON -# mgt 1: imtq und hk + # missing imtq to ON + # mgt 1: imtq und hk # MISSING: imtq board activation to ON (implementation pending by Jakob) @@ -241,8 +245,8 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): # MISSING: imtq board deactivation to OFF (implementation pending by Jakob) -# missing imtq to ON -# mgt 2.: imtq + dual side + dipole + # missing imtq to ON + # mgt 2.: imtq + dual side + dipole if op_code in OpCodes.MGT_FT_DP: key = KAI.MGT_FT_DP[0] @@ -320,26 +324,62 @@ def activate_mgts_alternately( tc_queue: TcQueueT, ): - command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=2000, y_dipole=0, z_dipole=0, duration=30000) + command = pack_dipole_command( + object_id=oids.IMTQ_HANDLER_ID, + x_dipole=2000, + y_dipole=0, + z_dipole=0, + duration=30000, + ) tc_queue.appendleft(command.pack_command_tuple()) tc_queue.appendleft((QueueCommands.WAIT, 10.0)) - command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=-2000, y_dipole=0, z_dipole=0, duration=30000) + command = pack_dipole_command( + object_id=oids.IMTQ_HANDLER_ID, + x_dipole=-2000, + y_dipole=0, + z_dipole=0, + duration=30000, + ) tc_queue.appendleft(command.pack_command_tuple()) tc_queue.appendleft((QueueCommands.WAIT, 10.0)) - command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=0, y_dipole=2000, z_dipole=0, duration=30000) + command = pack_dipole_command( + object_id=oids.IMTQ_HANDLER_ID, + x_dipole=0, + y_dipole=2000, + z_dipole=0, + duration=30000, + ) tc_queue.appendleft(command.pack_command_tuple()) tc_queue.appendleft((QueueCommands.WAIT, 10.0)) - command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=0, y_dipole=-2000, z_dipole=0, duration=30000) + command = pack_dipole_command( + object_id=oids.IMTQ_HANDLER_ID, + x_dipole=0, + y_dipole=-2000, + z_dipole=0, + duration=30000, + ) tc_queue.appendleft(command.pack_command_tuple()) tc_queue.appendleft((QueueCommands.WAIT, 10.0)) - command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=0, y_dipole=0, z_dipole=2000, duration=30000) + command = pack_dipole_command( + object_id=oids.IMTQ_HANDLER_ID, + x_dipole=0, + y_dipole=0, + z_dipole=2000, + duration=30000, + ) tc_queue.appendleft(command.pack_command_tuple()) tc_queue.appendleft((QueueCommands.WAIT, 10.0)) - command = pack_dipole_command(object_id=oids.IMTQ_HANDLER_ID, x_dipole=0, y_dipole=0, z_dipole=-2000, duration=30000) + command = pack_dipole_command( + object_id=oids.IMTQ_HANDLER_ID, + x_dipole=0, + y_dipole=0, + z_dipole=-2000, + duration=30000, + ) tc_queue.appendleft(command.pack_command_tuple()) tc_queue.appendleft((QueueCommands.WAIT, 10.0)) From f75a1a13c9f4e41d6bdb6ae1b338ac51c9345153 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 24 May 2022 17:36:07 +0200 Subject: [PATCH 069/132] added sus IDs --- config/object_ids.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/config/object_ids.py b/config/object_ids.py index c2c25b1..d8f3298 100644 --- a/config/object_ids.py +++ b/config/object_ids.py @@ -95,6 +95,33 @@ RTD_13_PLPCDU_HSPD = bytes([0x44, 0x42, 0x00, 0x29]) RTD_14_TCS_BRD = bytes([0x44, 0x42, 0x00, 0x30]) RTD_15_IMTQ = bytes([0x44, 0x42, 0x00, 0x31]) +# SUS +""" +Name convention for SUS devices +SUS___LOC_XYZ_PT_ +LOC: Location +PT: Pointing +N/R: Nominal/Redundant +F/M/B: Forward/Middle/Backwards +""" +SUS_0_N_LOC_XFYFZM_PT_XF = bytes([0x44, 0x12, 0x00, 0x32]) +SUS_6_R_LOC_XFYBZM_PT_XF = bytes([0x44, 0x12, 0x00, 0x38]) + +SUS_1_N_LOC_XBYFZM_PT_XB = bytes([0x44, 0x12, 0x00, 0x33]) +SUS_7_R_LOC_XBYBZM_PT_XB = bytes([0x44, 0x12, 0x00, 0x39]) + +SUS_2_N_LOC_XFYBZB_PT_YB = bytes([0x44, 0x12, 0x00, 0x34]) +SUS_8_R_LOC_XBYBZB_PT_YB = bytes([0x44, 0x12, 0x00, 0x40]) + +SUS_3_N_LOC_XFYBZF_PT_YF = bytes([0x44, 0x12, 0x00, 0x35]) +SUS_9_R_LOC_XBYBZB_PT_YF = bytes([0x44, 0x12, 0x00, 0x41]) + +SUS_4_N_LOC_XMYFZF_PT_ZF = bytes([0x44, 0x12, 0x00, 0x36]) +SUS_10_N_LOC_XMYBZF_PT_ZF = bytes([0x44, 0x12, 0x00, 0x42]) + +SUS_5_N_LOC_XFYMZB_PT_ZB = bytes([0x44, 0x12, 0x00, 0x37]) +SUS_11_R_LOC_XBYMZB_PT_ZB = bytes([0x44, 0x12, 0x00, 0x43]) + # System and Assembly Objects ACS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x01]) SUS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x02]) From 58a5c1850eab9ee2452eee8bc8cc4afef6d6dc3c Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Tue, 24 May 2022 18:13:17 +0200 Subject: [PATCH 070/132] added sus procedure --- pus_tc/system/proc.py | 72 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index c2cb707..7ade2e0 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -24,11 +24,22 @@ from pus_tc.devs.gyros import L3gGyroSetIds as GyroSetIds_1_3 from pus_tc.devs.gps import Gnss0SetIds as GnssSetIds_0 from pus_tc.devs.gps import Gnss1SetIds as GnssSetIds_1 from pus_tc.devs.imtq import ImtqSetIds - +from pus_tc.devs.sus import Sus0SetIds +from pus_tc.devs.sus import Sus1SetIds +from pus_tc.devs.sus import Sus2SetIds +from pus_tc.devs.sus import Sus3SetIds +from pus_tc.devs.sus import Sus4SetIds +from pus_tc.devs.sus import Sus5SetIds +from pus_tc.devs.sus import Sus6SetIds +from pus_tc.devs.sus import Sus7SetIds +from pus_tc.devs.sus import Sus8SetIds +from pus_tc.devs.sus import Sus9SetIds +from pus_tc.devs.sus import Sus10SetIds +from pus_tc.devs.sus import Sus11SetIds from pus_tc.system.tcs import pack_tcs_sys_commands from pus_tc.system.controllers import pack_controller_commands -from pus_tc.system.acs import pack_acs_command +from pus_tc.system.acs import pack_acs_command, pack_sus_cmds from pus_tc.devs.imtq import pack_dipole_command @@ -43,6 +54,7 @@ class OpCodes: ACS_FT = ["acs-ft"] MGT_FT = ["mgt-ft"] MGT_FT_DP = ["mgt-ft-dp"] + SUS_FT = ["sus-ft"] class KeyAndInfo: @@ -56,6 +68,7 @@ class KeyAndInfo: ACS_FT = ["ACS", "ACS functional test"] MGT_FT = ["MGT", "MGT functional test"] MGT_FT_DP = ["MGT dipole", "MGT functional test with dipole"] + SUS_FT = ["SUS", "SUS functional test"] KAI = KeyAndInfo @@ -71,6 +84,7 @@ PROC_INFO_DICT = { KAI.MGT_FT[0]: [OpCodes.MGT_FT, KAI.MGT_FT[1], 120.0, 10.0], KAI.MGT_FT_DP[0]: [OpCodes.MGT_FT_DP, KAI.MGT_FT_DP[1], 120.0, 10.0], # collection_time for KAI.MGT_FT_DP maybe be reduced as a full 120seconds is not needed after MGTs are tested + KAI.SUS_FT[0]: [OpCodes.SUS_FT, KAI.SUS_FT[1], 120.0, 10.0], } @@ -264,6 +278,60 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): # MISSING: imtq board deactivation to OFF (implementation pending by Jakob) pack_acs_command(tc_queue=tc_queue, op_code="acs-off") + if op_code in OpCodes.SUS_FT: + key = KAI.SUS_FT[0] + + pack_sus_cmds(tc_queue=tc_queue, op_code="sus-nom") + + # SUSs + sid_list.append(make_sid(oids.SUS_0_N_LOC_XFYFZM_PT_XF, Sus0SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_1_N_LOC_XBYFZM_PT_XB, Sus1SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_2_N_LOC_XFYBZB_PT_YB, Sus2SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_3_N_LOC_XFYBZF_PT_YF, Sus3SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_4_N_LOC_XMYFZF_PT_ZF, Sus4SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_5_N_LOC_XFYMZB_PT_ZB, Sus5SetIds.CORE_HK)) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False + ) + + pack_acs_command(tc_queue=tc_queue, op_code="sus-off") + tc_queue.appendleft((QueueCommands.WAIT, 5.0)) + pack_sus_cmds(tc_queue=tc_queue, op_code="sus-red") + + # SUSs + sid_list.append(make_sid(oids.SUS_6_R_LOC_XFYBZM_PT_XF, Sus6SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_7_R_LOC_XBYBZM_PT_XB, Sus7SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_8_R_LOC_XBYBZB_PT_YB, Sus8SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_9_R_LOC_XBYBZB_PT_YF, Sus9SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_10_R_LOC_XMYBZF_PT_ZF, Sus10SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_11_R_LOC_XBYMZB_PT_ZB, Sus11SetIds.CORE_HK)) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False + ) + + pack_acs_command(tc_queue=tc_queue, op_code="sus-off") + tc_queue.appendleft((QueueCommands.WAIT, 5.0)) + pack_sus_cmds(tc_queue=tc_queue, op_code="sus-d") + + # SUSs + sid_list.append(make_sid(oids.SUS_0_N_LOC_XFYFZM_PT_XF, Sus0SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_1_N_LOC_XBYFZM_PT_XB, Sus1SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_2_N_LOC_XFYBZB_PT_YB, Sus2SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_3_N_LOC_XFYBZF_PT_YF, Sus3SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_4_N_LOC_XMYFZF_PT_ZF, Sus4SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_5_N_LOC_XFYMZB_PT_ZB, Sus5SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_6_R_LOC_XFYBZM_PT_XF, Sus6SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_7_R_LOC_XBYBZM_PT_XB, Sus7SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_8_R_LOC_XBYBZB_PT_YB, Sus8SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_9_R_LOC_XBYBZB_PT_YF, Sus9SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_10_R_LOC_XMYBZF_PT_ZF, Sus10SetIds.CORE_HK)) + sid_list.append(make_sid(oids.SUS_11_R_LOC_XBYMZB_PT_ZB, Sus11SetIds.CORE_HK)) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False + ) + + pack_acs_command(tc_queue=tc_queue, op_code="sus-off") + """ def listen_to_hk_for_x_seconds( From 1c3d67aa15ce641f6f9ec80aabb9714c320c24c4 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Tue, 24 May 2022 18:34:25 +0200 Subject: [PATCH 071/132] updated mgt proc --- pus_tc/system/proc.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 7ade2e0..8e9a88b 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -40,7 +40,8 @@ from pus_tc.devs.sus import Sus11SetIds from pus_tc.system.tcs import pack_tcs_sys_commands from pus_tc.system.controllers import pack_controller_commands from pus_tc.system.acs import pack_acs_command, pack_sus_cmds -from pus_tc.devs.imtq import pack_dipole_command +from pus_tc.devs.imtq import pack_imtq_test_into, pack_dipole_command + class OpCodes: @@ -245,10 +246,8 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.MGT_FT: key = KAI.MGT_FT[0] - # missing imtq to ON - # mgt 1: imtq und hk - - # MISSING: imtq board activation to ON (implementation pending by Jakob) +# mgt 1: imtq und hk + pack_imtq_test_into(tc_queue=tc_queue, op_code="2") sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET)) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET)) @@ -257,16 +256,14 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) - # MISSING: imtq board deactivation to OFF (implementation pending by Jakob) - - # missing imtq to ON - # mgt 2.: imtq + dual side + dipole + pack_imtq_test_into(tc_queue=tc_queue, op_code="0") if op_code in OpCodes.MGT_FT_DP: key = KAI.MGT_FT_DP[0] - pack_acs_command(tc_queue=tc_queue, op_code="acs-d") - # MISSING: imtq board activation to ON (implementation pending by Jakob) + pack_acs_command(tc_queue=tc_queue, op_code="acs-d") +# mgt 2.: imtq + dual side + dipole + pack_imtq_test_into(tc_queue=tc_queue, op_code="2") sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET)) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET)) @@ -275,7 +272,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=True ) - # MISSING: imtq board deactivation to OFF (implementation pending by Jakob) + pack_imtq_test_into(tc_queue=tc_queue, op_code="0") pack_acs_command(tc_queue=tc_queue, op_code="acs-off") if op_code in OpCodes.SUS_FT: From e88bf7e9376edcb04549075206b8ecdfa6476792 Mon Sep 17 00:00:00 2001 From: Markus Kranz Date: Tue, 24 May 2022 18:56:15 +0200 Subject: [PATCH 072/132] added str proc and str temperature set_id --- pus_tc/devs/star_tracker.py | 4 ++++ pus_tc/system/proc.py | 26 ++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/pus_tc/devs/star_tracker.py b/pus_tc/devs/star_tracker.py index 73bbc37..d8c9a94 100644 --- a/pus_tc/devs/star_tracker.py +++ b/pus_tc/devs/star_tracker.py @@ -85,6 +85,10 @@ class StarTrackerActionIds: FIRMWARE_UPDATE = 84 +class SetIds: + TEMPERATURE = 25 + + class FileDefs: download_path = "/mnt/sd0/startracker" json_file = "/mnt/sd0/startracker/full.json" diff --git a/pus_tc/system/proc.py b/pus_tc/system/proc.py index 8e9a88b..d072874 100644 --- a/pus_tc/system/proc.py +++ b/pus_tc/system/proc.py @@ -36,11 +36,13 @@ from pus_tc.devs.sus import Sus8SetIds from pus_tc.devs.sus import Sus9SetIds from pus_tc.devs.sus import Sus10SetIds from pus_tc.devs.sus import Sus11SetIds +from pus_tc.devs.star_tracker import SetIds as StrSetIds from pus_tc.system.tcs import pack_tcs_sys_commands from pus_tc.system.controllers import pack_controller_commands from pus_tc.system.acs import pack_acs_command, pack_sus_cmds from pus_tc.devs.imtq import pack_imtq_test_into, pack_dipole_command +from pus_tc.devs.star_tracker import pack_star_tracker_commands @@ -56,6 +58,7 @@ class OpCodes: MGT_FT = ["mgt-ft"] MGT_FT_DP = ["mgt-ft-dp"] SUS_FT = ["sus-ft"] + STR_FT = ["str-ft"] class KeyAndInfo: @@ -70,6 +73,7 @@ class KeyAndInfo: MGT_FT = ["MGT", "MGT functional test"] MGT_FT_DP = ["MGT dipole", "MGT functional test with dipole"] SUS_FT = ["SUS", "SUS functional test"] + STR_FT = ["STR", "STR functional test"] KAI = KeyAndInfo @@ -86,6 +90,7 @@ PROC_INFO_DICT = { KAI.MGT_FT_DP[0]: [OpCodes.MGT_FT_DP, KAI.MGT_FT_DP[1], 120.0, 10.0], # collection_time for KAI.MGT_FT_DP maybe be reduced as a full 120seconds is not needed after MGTs are tested KAI.SUS_FT[0]: [OpCodes.SUS_FT, KAI.SUS_FT[1], 120.0, 10.0], + KAI.STR_FT[0]: [OpCodes.STR_FT, KAI.STR_FT[1], 120.0, 10.0], } @@ -247,7 +252,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): key = KAI.MGT_FT[0] # mgt 1: imtq und hk - pack_imtq_test_into(tc_queue=tc_queue, op_code="2") + pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="2") sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET)) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET)) @@ -256,14 +261,14 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False ) - pack_imtq_test_into(tc_queue=tc_queue, op_code="0") + pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="0") if op_code in OpCodes.MGT_FT_DP: key = KAI.MGT_FT_DP[0] pack_acs_command(tc_queue=tc_queue, op_code="acs-d") # mgt 2.: imtq + dual side + dipole - pack_imtq_test_into(tc_queue=tc_queue, op_code="2") + pack_imtq_test_into(object_id=oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="2") sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET)) sid_list.append(make_sid(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET)) @@ -272,7 +277,7 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=True ) - pack_imtq_test_into(tc_queue=tc_queue, op_code="0") + pack_imtq_test_into(oids.IMTQ_HANDLER_ID, tc_queue=tc_queue, op_code="0") pack_acs_command(tc_queue=tc_queue, op_code="acs-off") if op_code in OpCodes.SUS_FT: @@ -329,6 +334,19 @@ def pack_proc_commands(tc_queue: TcQueueT, op_code: str): pack_acs_command(tc_queue=tc_queue, op_code="sus-off") + if op_code in OpCodes.STR_FT: + key = KAI.STR_FT[0] + + pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, tc_queue=tc_queue, op_code="2") + + # STR + sid_list.append(make_sid(oids.STAR_TRACKER_ID, StrSetIds.TEMPERATURE)) + pack_generic_hk_listening_cmds( + tc_queue=tc_queue, proc_key=key, sid_list=sid_list, diag=False, mgt=False + ) + + pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, tc_queue=tc_queue, op_code="3") + """ def listen_to_hk_for_x_seconds( From f5367ac38136d281f4fe3cee9b04de5b338af39c Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Tue, 24 May 2022 18:57:52 +0200 Subject: [PATCH 073/132] imtq hk parsing --- .run/tmtccli.run.xml | 2 +- pus_tc/cmd_definitions.py | 23 ++++---- pus_tc/devs/imtq.py | 55 +++++++++++++++---- pus_tc/devs/ploc_supervisor.py | 2 +- pus_tm/devs/imtq_mgt.py | 98 ++++++++++++++++++++++++++++++++++ pus_tm/hk_handling.py | 11 +++- tmtccmd | 2 +- 7 files changed, 170 insertions(+), 23 deletions(-) diff --git a/.run/tmtccli.run.xml b/.run/tmtccli.run.xml index 1b4b29b..e11ccfd 100644 --- a/.run/tmtccli.run.xml +++ b/.run/tmtccli.run.xml @@ -13,7 +13,7 @@