From bf9ab7edf7f3bc54e3e1fbe8609eda9112862848 Mon Sep 17 00:00:00 2001 From: meggert Date: Fri, 4 Aug 2023 14:35:09 +0200 Subject: [PATCH 01/30] this was the fun part --- eive_tmtc/tmtc/acs/gps.py | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/eive_tmtc/tmtc/acs/gps.py b/eive_tmtc/tmtc/acs/gps.py index 8fffd13..9eaba95 100644 --- a/eive_tmtc/tmtc/acs/gps.py +++ b/eive_tmtc/tmtc/acs/gps.py @@ -23,34 +23,44 @@ _LOGGER = logging.getLogger(__name__) class OpCode: OFF = "off" ON = "on" - REQ_OS_HK = ["hk"] - ENABLE_HK = ["enable_hk"] - DISABLE_HK = ["disable_hk"] + REQ_CORE_HK = ["core_hk_request"] + ENABLE_CORE_HK = ["core_hk_enable"] + DISABLE_CORE_HK = ["core_hk_disable"] + REQ_SKYVIEW_HK = ["skyview_hk_request"] + ENABLE_SKYVIEW_HK = ["skyview_hk_enable"] + DISABLE_SKYVIEW_HK = ["skyview_hk_disable"] RESET_GNSS = ["reset"] class Info: OFF = "Off" ON = "On" - REQ_OS_HK = "Request One-Shot HK" - ENABLE_HK = "Enable HK" - DISABLE_HK = "Disable HK" + REQ_CORE_HK = "Request Core HK" + ENABLE_CORE_HK = "Enable Core HK" + DISABLE_CORE_HK = "Disable Core HK" + REQ_SKYVIEW_HK = "Request Skyview HK" + ENABLE_SKYVIEW_HK = "Enable Skyview HK" + DISABLE_SKYVIEW_HK = "Disable Skyview HK" RESET_GNSS = "Reset GNSS using reset pin" class SetId(enum.IntEnum): - HK = 0 + CORE_HK = 0 + SKYVIEW_HK = 1 @tmtc_definitions_provider def add_gps_cmds(defs: TmtcDefinitionWrapper): oce = OpCodeEntry() - oce.add(keys=OpCode.RESET_GNSS, info=Info.RESET_GNSS) - oce.add(keys=OpCode.REQ_OS_HK, info=Info.REQ_OS_HK) - oce.add(keys=OpCode.ENABLE_HK, info=Info.ENABLE_HK) - oce.add(keys=OpCode.DISABLE_HK, info=Info.DISABLE_HK) oce.add(keys=OpCode.OFF, info=Info.OFF) oce.add(keys=OpCode.ON, info=Info.ON) + oce.add(keys=OpCode.RESET_GNSS, info=Info.RESET_GNSS) + oce.add(keys=OpCode.REQ_CORE_HK, info=Info.REQ_CORE_HK) + oce.add(keys=OpCode.ENABLE_CORE_HK, info=Info.ENABLE_CORE_HK) + oce.add(keys=OpCode.DISABLE_CORE_HK, info=Info.DISABLE_CORE_HK) + oce.add(keys=OpCode.REQ_SKYVIEW_HK, info=Info.REQ_SKYVIEW_HK) + oce.add(keys=OpCode.ENABLE_SKYVIEW_HK, info=Info.ENABLE_SKYVIEW_HK) + oce.add(keys=OpCode.DISABLE_SKYVIEW_HK, info=Info.DISABLE_SKYVIEW_HK) defs.add_service( name=CustomServiceList.GPS_CTRL.value, info="GPS/GNSS Controller", From fcabaa5b09d78afe9c09ebf305a8605ff3b67d1b Mon Sep 17 00:00:00 2001 From: meggert Date: Fri, 4 Aug 2023 14:51:55 +0200 Subject: [PATCH 02/30] rework gps data handling --- eive_tmtc/tmtc/acs/gps.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/eive_tmtc/tmtc/acs/gps.py b/eive_tmtc/tmtc/acs/gps.py index 9eaba95..4bb0a66 100644 --- a/eive_tmtc/tmtc/acs/gps.py +++ b/eive_tmtc/tmtc/acs/gps.py @@ -97,8 +97,27 @@ def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0)) -def handle_gps_data(pw: PrintWrapper, hk_data: bytes): - pw.dlog(f"Received GPS data, HK data length {len(hk_data)}") +def handle_gps_data( + pw: PrintWrapper, + set_id: int, + hk_data: bytes, + packet_time: datetime.datetime, +): + pw.ilog(_LOGGER, f"Received GPS CTRL HK with packet time {packet_time}") + match set_id: + case SetId.CORE_HK: + handle_core_data(pw, hk_data) + case SetId.SKYVIEW_HK: + handle_mgm_data_processed(pw, hk_data) + + +def handle_core_data(pw: PrintWrapper, hk_data: bytes): + if len(hk_data) < 4*8+4+2+8: + pw.dlog( + f"GPS Core dataset with size {len(hk_data)} does not have expected size" + f" of {4*8+4+2+8} bytes" + ) + return current_idx = 0 fmt_str = "!ddddBBBHBBBBBI" inc_len = struct.calcsize(fmt_str) From c91ad9e08b47a51ec1d07297fecbf1fede1233ff Mon Sep 17 00:00:00 2001 From: meggert Date: Fri, 4 Aug 2023 15:01:34 +0200 Subject: [PATCH 03/30] bump --- eive_tmtc/tmtc/acs/gps.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/eive_tmtc/tmtc/acs/gps.py b/eive_tmtc/tmtc/acs/gps.py index 4bb0a66..2df5f95 100644 --- a/eive_tmtc/tmtc/acs/gps.py +++ b/eive_tmtc/tmtc/acs/gps.py @@ -69,30 +69,30 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper): def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): - sid = make_sid(object_id=object_id, set_id=SetId.HK) - if op_code in OpCode.RESET_GNSS: + if op_code == OpCode.RESET_GNSS: # TODO: This needs to be re-implemented _LOGGER.warning("Reset pin handling needs to be re-implemented") - if op_code in OpCode.ENABLE_HK: + if op_code == OpCode.ENABLE_CORE_HK: interval = float(input("Please specify interval in floating point seconds: ")) if interval <= 0: raise ValueError("invalid interval") - q.add_log_cmd(f"GPS: {Info.ENABLE_HK}") + q.add_log_cmd(f"GPS: {Info.ENABLE_CORE_HK}") cmds = create_enable_periodic_hk_command_with_interval( - diag=False, sid=sid, interval_seconds=interval + diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK), interval_seconds=interval ) for cmd in cmds: q.add_pus_tc(cmd) - if op_code in OpCode.DISABLE_HK: - q.add_log_cmd(f"gps: {Info.DISABLE_HK}") - q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=sid)) - if op_code in OpCode.REQ_OS_HK: - q.add_log_cmd(f"GPS: {Info.REQ_OS_HK}") - q.add_pus_tc(create_request_one_hk_command(sid=sid)) - if op_code in OpCode.ON: + if op_code == OpCode.DISABLE_CORE_HK: + q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}") + q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id, + set_id=SetId.CORE_HK))) + if op_code == OpCode.REQ_CORE_HK: + q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}") + q.add_pus_tc(create_request_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK))) + if op_code == OpCode.ON: q.add_log_cmd(f"GPS: {Info.ON}") q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0)) - if op_code in OpCode.OFF: + if op_code == OpCode.OFF: q.add_log_cmd(f"GPS: {Info.OFF}") q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0)) @@ -107,8 +107,8 @@ def handle_gps_data( match set_id: case SetId.CORE_HK: handle_core_data(pw, hk_data) - case SetId.SKYVIEW_HK: - handle_mgm_data_processed(pw, hk_data) + #case SetId.SKYVIEW_HK: + # handle_mgm_data_processed(pw, hk_data) def handle_core_data(pw: PrintWrapper, hk_data: bytes): From f95331742bd46c6efc6713e75f21e1d81f518ed3 Mon Sep 17 00:00:00 2001 From: meggert Date: Fri, 4 Aug 2023 15:38:32 +0200 Subject: [PATCH 04/30] fix --- eive_tmtc/tmtc/acs/gps.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/eive_tmtc/tmtc/acs/gps.py b/eive_tmtc/tmtc/acs/gps.py index 2df5f95..a70ca6a 100644 --- a/eive_tmtc/tmtc/acs/gps.py +++ b/eive_tmtc/tmtc/acs/gps.py @@ -69,10 +69,11 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper): def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): - if op_code == OpCode.RESET_GNSS: + print("Yo") + if op_code in OpCode.RESET_GNSS: # TODO: This needs to be re-implemented _LOGGER.warning("Reset pin handling needs to be re-implemented") - if op_code == OpCode.ENABLE_CORE_HK: + if op_code in OpCode.ENABLE_CORE_HK: interval = float(input("Please specify interval in floating point seconds: ")) if interval <= 0: raise ValueError("invalid interval") @@ -82,17 +83,18 @@ def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): ) for cmd in cmds: q.add_pus_tc(cmd) - if op_code == OpCode.DISABLE_CORE_HK: + if op_code in OpCode.DISABLE_CORE_HK: q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}") q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK))) - if op_code == OpCode.REQ_CORE_HK: + if op_code in OpCode.REQ_CORE_HK: + print("Waddup") q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}") q.add_pus_tc(create_request_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK))) - if op_code == OpCode.ON: + if op_code in OpCode.ON: q.add_log_cmd(f"GPS: {Info.ON}") q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0)) - if op_code == OpCode.OFF: + if op_code in OpCode.OFF: q.add_log_cmd(f"GPS: {Info.OFF}") q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0)) From b0b186ac1f604995468af08f0165c56247adfd6b Mon Sep 17 00:00:00 2001 From: meggert Date: Fri, 4 Aug 2023 15:39:40 +0200 Subject: [PATCH 05/30] we need this sed_id thingy --- eive_tmtc/pus_tm/hk_handler.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/eive_tmtc/pus_tm/hk_handler.py b/eive_tmtc/pus_tm/hk_handler.py index 73cc578..78c980b 100644 --- a/eive_tmtc/pus_tm/hk_handler.py +++ b/eive_tmtc/pus_tm/hk_handler.py @@ -101,7 +101,9 @@ def handle_regular_hk_print( # noqa C901: Complexity okay here elif objb == obj_ids.IMTQ_HANDLER_ID: return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id) elif objb == obj_ids.GPS_CONTROLLER: - return handle_gps_data(pw=pw, hk_data=hk_data) + return handle_gps_data( + pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt + ) elif objb == obj_ids.PCDU_HANDLER_ID: return handle_pcdu_hk(pw=pw, set_id=set_id, hk_data=hk_data) elif objb == obj_ids.BPX_HANDLER_ID: From 1ddb93410ef6dd418a1b151c586294fc838c1dba Mon Sep 17 00:00:00 2001 From: meggert Date: Fri, 4 Aug 2023 16:24:16 +0200 Subject: [PATCH 06/30] =?UTF-8?q?w=C3=B6rks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eive_tmtc/tmtc/acs/gps.py | 65 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/eive_tmtc/tmtc/acs/gps.py b/eive_tmtc/tmtc/acs/gps.py index a70ca6a..9de4692 100644 --- a/eive_tmtc/tmtc/acs/gps.py +++ b/eive_tmtc/tmtc/acs/gps.py @@ -19,6 +19,8 @@ from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter _LOGGER = logging.getLogger(__name__) +class GpsInfo: + MAX_SATELLITES = 30 class OpCode: OFF = "off" @@ -69,7 +71,6 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper): def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): - print("Yo") if op_code in OpCode.RESET_GNSS: # TODO: This needs to be re-implemented _LOGGER.warning("Reset pin handling needs to be re-implemented") @@ -88,9 +89,25 @@ def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK))) if op_code in OpCode.REQ_CORE_HK: - print("Waddup") q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}") q.add_pus_tc(create_request_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK))) + if op_code in OpCode.ENABLE_SKYVIEW_HK: + interval = float(input("Please specify interval in floating point seconds: ")) + if interval <= 0: + raise ValueError("invalid interval") + q.add_log_cmd(f"GPS: {Info.ENABLE_SKYVIEW_HK}") + cmds = create_enable_periodic_hk_command_with_interval( + diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK), interval_seconds=interval + ) + for cmd in cmds: + q.add_pus_tc(cmd) + if op_code in OpCode.DISABLE_SKYVIEW_HK: + q.add_log_cmd(f"gps: {Info.DISABLE_SKYVIEW_HK}") + q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id, + set_id=SetId.SKYVIEW_HK))) + if op_code in OpCode.REQ_SKYVIEW_HK: + q.add_log_cmd(f"GPS: {Info.REQ_SKYVIEW_HK}") + q.add_pus_tc(create_request_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK))) if op_code in OpCode.ON: q.add_log_cmd(f"GPS: {Info.ON}") q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0)) @@ -109,8 +126,8 @@ def handle_gps_data( match set_id: case SetId.CORE_HK: handle_core_data(pw, hk_data) - #case SetId.SKYVIEW_HK: - # handle_mgm_data_processed(pw, hk_data) + case SetId.SKYVIEW_HK: + handle_skyview_data(pw, hk_data) def handle_core_data(pw: PrintWrapper, hk_data: bytes): @@ -157,3 +174,43 @@ def handle_core_data(pw: PrintWrapper, hk_data: bytes): FsfwTmTcPrinter.get_validity_buffer( validity_buffer=hk_data[current_idx:], num_vars=14 ) + + +def handle_skyview_data(pw: PrintWrapper, hk_data: bytes): + data_length = 8+GpsInfo.MAX_SATELLITES*(8+3*2+1) + if len(hk_data) < data_length: + pw.dlog( + f"GPS Skyview dataset with size {len(hk_data)} does not have expected size" + f" of {data_length} bytes" + ) + return + current_idx = 0 + fmt_str_unix = "!d" + fmt_str_int16 = "!" + "h" * GpsInfo.MAX_SATELLITES + fmt_str_double = "!" + "d" * GpsInfo.MAX_SATELLITES + fmt_str_uint8 = "!" + "B" * GpsInfo.MAX_SATELLITES + inc_len_unix = struct.calcsize(fmt_str_unix) + inc_len_int16 = struct.calcsize(fmt_str_int16) + inc_len_double = struct.calcsize(fmt_str_double) + inc_len_uint8 = struct.calcsize(fmt_str_uint8) + unix = struct.unpack(fmt_str_unix, hk_data[current_idx: current_idx + inc_len_unix]) + current_idx += inc_len_unix + prn_id = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) + current_idx += inc_len_int16 + azimuth = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) + current_idx += inc_len_int16 + elevation = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) + current_idx += inc_len_int16 + signal_to_noise = struct.unpack(fmt_str_double, hk_data[current_idx: current_idx + inc_len_double]) + current_idx += inc_len_double + used = struct.unpack(fmt_str_uint8, hk_data[current_idx: current_idx + inc_len_uint8]) + current_idx += inc_len_uint8 + pw.dlog(f"Skyview Time: {unix} unix-sec") + pw.dlog("{:<8} {:<8} {:<8} {:<8} {:<8}".format('PRN_ID', 'AZ [°]', 'EL [°]', 'S2N [dBW]', 'USED')) + for idx in range(GpsInfo.MAX_SATELLITES): + pw.dlog("{:<8} {:<8} {:<8} {:<8} {:<8}".format(prn_id[idx], azimuth[idx], elevation[idx], signal_to_noise[idx], + used[idx])) + FsfwTmTcPrinter.get_validity_buffer( + validity_buffer=hk_data[current_idx:], num_vars=6 + ) + From 5571a6852ed30b490c0df0f1a8deee5d4f9214fc Mon Sep 17 00:00:00 2001 From: meggert Date: Mon, 7 Aug 2023 14:21:58 +0200 Subject: [PATCH 07/30] init --- eive_tmtc/tmtc/acs/acs_ctrl.py | 44 ++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index a16e5e6..96f35e8 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -1,3 +1,4 @@ +import array import datetime import enum import logging @@ -66,6 +67,7 @@ class ActionId(enum.IntEnum): SOLAR_ARRAY_DEPLOYMENT_SUCCESSFUL = 0 RESET_MEKF = 1 RESTORE_MEKF_NONFINITE_RECOVERY = 2 + UPDATE_TLE = 3 CTRL_STRAT_DICT = { @@ -90,6 +92,13 @@ CTRL_STRAT_DICT = { 31: "PTG_RAW", } +GPS_COURCE_DICT = { + 0: "NONE", + 1: "GPS", + 2: "PROPAGATION", + 3: "SPG4", +} + class OpCodes: OFF = ["off"] @@ -103,6 +112,7 @@ class OpCodes: SAFE_PTG = ["confirm_deployment"] RESET_MEKF = ["reset_mekf"] RESTORE_MEKF_NONFINITE_RECOVERY = ["restore_mekf_nonfinite_recovery"] + UPDATE_TLE = ["update_tle"] SET_PARAMETER_SCALAR = ["set_scalar_param"] SET_PARAMETER_VECTOR = ["set_vector_param"] SET_PARAMETER_MATRIX = ["set_matrix_param"] @@ -153,6 +163,7 @@ class Info: SAFE_PTG = "Confirm deployment of both solar arrays" RESET_MEKF = "Reset the MEKF" RESTORE_MEKF_NONFINITE_RECOVERY = "Restore MEKF non-finite recovery" + UPDATE_TLE = "Update TLE" SET_PARAMETER_SCALAR = "Set Scalar Parameter" SET_PARAMETER_VECTOR = "Set Vector Parameter" SET_PARAMETER_MATRIX = "Set Matrix Parameter" @@ -220,6 +231,7 @@ def acs_cmd_defs(defs: TmtcDefinitionWrapper): keys=OpCodes.RESTORE_MEKF_NONFINITE_RECOVERY, info=Info.RESTORE_MEKF_NONFINITE_RECOVERY, ) + oce.add(keys=OpCodes.UPDATE_TLE, info=Info.UPDATE_TLE) oce.add(keys=OpCodes.SET_PARAMETER_SCALAR, info=Info.SET_PARAMETER_SCALAR) oce.add(keys=OpCodes.SET_PARAMETER_VECTOR, info=Info.SET_PARAMETER_VECTOR) oce.add(keys=OpCodes.SET_PARAMETER_MATRIX, info=Info.SET_PARAMETER_MATRIX) @@ -308,6 +320,24 @@ def pack_acs_ctrl_command(p: ServiceProviderParams): # noqa C901 q.add_pus_tc( create_action_cmd(ACS_CONTROLLER, ActionId.RESTORE_MEKF_NONFINITE_RECOVERY) ) + elif op_code in OpCodes.UPDATE_TLE: + q.add_log_cmd(f"{Info.UPDATE_TLE}") + while True: + line1 = input("Please input the first line of the TLE: ") + if len(line1) == 69: + break + else: + print("The line does not have the required length of 69 characters") + while True: + line2 = input("Please input the second line of the TLE: ") + if len(line2) == 69: + break + else: + print("The line does not have the required length of 69 characters") + tle = line1.encode()+line2.encode() + q.add_pus_tc( + create_action_cmd(ACS_CONTROLLER, ActionId.UPDATE_TLE,tle) + ) elif op_code in OpCodes.SET_PARAMETER_SCALAR: q.add_log_cmd(f"{Info.SET_PARAMETER_SCALAR}") set_acs_ctrl_param_scalar(q) @@ -985,11 +1015,13 @@ def handle_gyr_data_processed(pw: PrintWrapper, hk_data: bytes): def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes): pw.dlog("Received GPS Processed Set") + fmt_source = "!B" fmt_scalar = "!d" fmt_vec = "!ddd" + inc_len_source = struct.calcsize(fmt_source) inc_len_scalar = struct.calcsize(fmt_scalar) inc_len_vec = struct.calcsize(fmt_vec) - if len(hk_data) < 2 * inc_len_scalar + 2 * inc_len_vec: + if len(hk_data) < 2 * inc_len_scalar + 2 * inc_len_vec + inc_len_source: pw.dlog("Received HK set too small") return current_idx = 0 @@ -1028,12 +1060,20 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes): ) ] current_idx += inc_len_vec + source = [ + f"{val:8.3f}" + for val in struct.unpack( + fmt_vec, hk_data[current_idx: current_idx + inc_len_source] + ) + ] + current_idx += inc_len_source + pw.dlog(f"GPS Source: {GPS_COURCE_DICT[source]}") pw.dlog(f"GPS Latitude: {lat} [deg]") pw.dlog(f"GPS Longitude: {long} [deg]") pw.dlog(f"GPS Altitude: {alt} [m]") pw.dlog(f"GPS Position: {pos} [m]") pw.dlog(f"GPS Velocity: {velo} [m/s]") - FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=5) + FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=6) def handle_mekf_data(pw: PrintWrapper, hk_data: bytes): From 6d88746ec3f73a4606eecd9e16ec1c9a43d2e394 Mon Sep 17 00:00:00 2001 From: meggert Date: Tue, 8 Aug 2023 09:40:37 +0200 Subject: [PATCH 08/30] fix --- eive_tmtc/tmtc/acs/acs_ctrl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index 96f35e8..c7008f2 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -1063,7 +1063,7 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes): source = [ f"{val:8.3f}" for val in struct.unpack( - fmt_vec, hk_data[current_idx: current_idx + inc_len_source] + fmt_source, hk_data[current_idx: current_idx + inc_len_source] ) ] current_idx += inc_len_source From 051e9e6ffbdc17b7713a3a72d758eb053e22164f Mon Sep 17 00:00:00 2001 From: meggert Date: Tue, 8 Aug 2023 10:01:50 +0200 Subject: [PATCH 09/30] lets be clean about this --- eive_tmtc/tmtc/acs/acs_ctrl.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index c7008f2..be3c1d4 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -1067,7 +1067,10 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes): ) ] current_idx += inc_len_source - pw.dlog(f"GPS Source: {GPS_COURCE_DICT[source]}") + if GPS_COURCE_DICT.get(source) is not None: + pw.dlog(f"GPS Source: {GPS_COURCE_DICT[source]}") + else: + pw.dlog(f"'GPS Source (key unknown)': {source}") pw.dlog(f"GPS Latitude: {lat} [deg]") pw.dlog(f"GPS Longitude: {long} [deg]") pw.dlog(f"GPS Altitude: {alt} [m]") From 1acbb8bb430fdd0fbd665a3d81e9142db657939c Mon Sep 17 00:00:00 2001 From: meggert Date: Tue, 8 Aug 2023 13:39:36 +0200 Subject: [PATCH 10/30] less copy-pasta helps sometimes --- eive_tmtc/tmtc/acs/acs_ctrl.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index be3c1d4..7c2f1c2 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -1060,12 +1060,7 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes): ) ] current_idx += inc_len_vec - source = [ - f"{val:8.3f}" - for val in struct.unpack( - fmt_source, hk_data[current_idx: current_idx + inc_len_source] - ) - ] + source = struct.unpack(fmt_source, hk_data[current_idx: current_idx + inc_len_source])[0] current_idx += inc_len_source if GPS_COURCE_DICT.get(source) is not None: pw.dlog(f"GPS Source: {GPS_COURCE_DICT[source]}") From 12c60ac31085674b05e7bc0d42aed535e388ff1d Mon Sep 17 00:00:00 2001 From: meggert Date: Wed, 9 Aug 2023 14:58:28 +0200 Subject: [PATCH 11/30] goddamnit --- eive_tmtc/tmtc/acs/acs_ctrl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index 7c2f1c2..06a194c 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -96,7 +96,7 @@ GPS_COURCE_DICT = { 0: "NONE", 1: "GPS", 2: "PROPAGATION", - 3: "SPG4", + 3: "SGP4", } From b58977fd6509ad28dc591c54209a544c37716c75 Mon Sep 17 00:00:00 2001 From: meggert Date: Mon, 14 Aug 2023 12:50:50 +0200 Subject: [PATCH 12/30] naming --- eive_tmtc/tmtc/acs/acs_ctrl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index 06a194c..ca5042c 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -95,7 +95,7 @@ CTRL_STRAT_DICT = { GPS_COURCE_DICT = { 0: "NONE", 1: "GPS", - 2: "PROPAGATION", + 2: "GPS_EXTRAPOLATED", 3: "SGP4", } From 8042f3607d3a09da89114f30eba525dc166b6fc0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Aug 2023 15:09:34 +0200 Subject: [PATCH 13/30] new pdec event --- eive_tmtc/config/events.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/eive_tmtc/config/events.csv b/eive_tmtc/config/events.csv index 1c6f646..ecdf953 100644 --- a/eive_tmtc/config/events.csv +++ b/eive_tmtc/config/events.csv @@ -161,6 +161,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 12412;0x307c;PDEC_RESET_FAILED;HIGH;Failed to pull PDEC reset to low;linux/ipcore/pdec.h 12413;0x307d;OPEN_IRQ_FILE_FAILED;HIGH;Failed to open the IRQ uio file;linux/ipcore/pdec.h 12414;0x307e;PDEC_INIT_FAILED;HIGH;PDEC initialization failed. This might also be due to the persistent confiuration never becoming available, for example due to SD card issues.;linux/ipcore/pdec.h +12415;0x307f;PDEC_CONFIG_CORRUPTED;HIGH;The PDEC configuration area has been corrupted P1: The first configuration word P2: The second configuration word;linux/ipcore/pdec.h 12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/acs/StrComHandler.h 12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/acs/StrComHandler.h 12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/acs/StrComHandler.h From f42318bc579f4b818ba22f8d9cdbd204626ab338 Mon Sep 17 00:00:00 2001 From: meggert Date: Mon, 14 Aug 2023 15:58:44 +0200 Subject: [PATCH 14/30] deprecated import --- eive_tmtc/tmtc/acs/acs_ctrl.py | 1 - 1 file changed, 1 deletion(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index ca5042c..2b6fec2 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -1,4 +1,3 @@ -import array import datetime import enum import logging From 02e7e809dee35612b1d19b41aa88a6de5fdc73e9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 11:47:07 +0200 Subject: [PATCH 15/30] PL PCDU enum --- eive_tmtc/tmtc/acs/acs_ctrl.py | 10 ++-- eive_tmtc/tmtc/acs/gps.py | 86 +++++++++++++++++++++++++--------- eive_tmtc/tmtc/power/plpcdu.py | 69 +++++++++++++++------------ 3 files changed, 109 insertions(+), 56 deletions(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index 2b6fec2..3206056 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -333,10 +333,8 @@ def pack_acs_ctrl_command(p: ServiceProviderParams): # noqa C901 break else: print("The line does not have the required length of 69 characters") - tle = line1.encode()+line2.encode() - q.add_pus_tc( - create_action_cmd(ACS_CONTROLLER, ActionId.UPDATE_TLE,tle) - ) + tle = line1.encode() + line2.encode() + q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.UPDATE_TLE, tle)) elif op_code in OpCodes.SET_PARAMETER_SCALAR: q.add_log_cmd(f"{Info.SET_PARAMETER_SCALAR}") set_acs_ctrl_param_scalar(q) @@ -1059,7 +1057,9 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes): ) ] current_idx += inc_len_vec - source = struct.unpack(fmt_source, hk_data[current_idx: current_idx + inc_len_source])[0] + source = struct.unpack( + fmt_source, hk_data[current_idx : current_idx + inc_len_source] + )[0] current_idx += inc_len_source if GPS_COURCE_DICT.get(source) is not None: pw.dlog(f"GPS Source: {GPS_COURCE_DICT[source]}") diff --git a/eive_tmtc/tmtc/acs/gps.py b/eive_tmtc/tmtc/acs/gps.py index 9de4692..41a8a7f 100644 --- a/eive_tmtc/tmtc/acs/gps.py +++ b/eive_tmtc/tmtc/acs/gps.py @@ -19,9 +19,11 @@ from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter _LOGGER = logging.getLogger(__name__) + class GpsInfo: MAX_SATELLITES = 30 + class OpCode: OFF = "off" ON = "on" @@ -70,7 +72,9 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper): ) -def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): +def pack_gps_command( # noqa: C901 + object_id: bytes, q: DefaultPusQueueHelper, op_code: str +): # noqa: C901 if op_code in OpCode.RESET_GNSS: # TODO: This needs to be re-implemented _LOGGER.warning("Reset pin handling needs to be re-implemented") @@ -80,34 +84,52 @@ def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): raise ValueError("invalid interval") q.add_log_cmd(f"GPS: {Info.ENABLE_CORE_HK}") cmds = create_enable_periodic_hk_command_with_interval( - diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK), interval_seconds=interval + diag=False, + sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK), + interval_seconds=interval, ) for cmd in cmds: q.add_pus_tc(cmd) if op_code in OpCode.DISABLE_CORE_HK: q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}") - q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id, - set_id=SetId.CORE_HK))) + q.add_pus_tc( + create_disable_periodic_hk_command( + diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK) + ) + ) if op_code in OpCode.REQ_CORE_HK: q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}") - q.add_pus_tc(create_request_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK))) + q.add_pus_tc( + create_request_one_hk_command( + sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK) + ) + ) if op_code in OpCode.ENABLE_SKYVIEW_HK: interval = float(input("Please specify interval in floating point seconds: ")) if interval <= 0: raise ValueError("invalid interval") q.add_log_cmd(f"GPS: {Info.ENABLE_SKYVIEW_HK}") cmds = create_enable_periodic_hk_command_with_interval( - diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK), interval_seconds=interval + diag=False, + sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK), + interval_seconds=interval, ) for cmd in cmds: q.add_pus_tc(cmd) if op_code in OpCode.DISABLE_SKYVIEW_HK: q.add_log_cmd(f"gps: {Info.DISABLE_SKYVIEW_HK}") - q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id, - set_id=SetId.SKYVIEW_HK))) + q.add_pus_tc( + create_disable_periodic_hk_command( + diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK) + ) + ) if op_code in OpCode.REQ_SKYVIEW_HK: q.add_log_cmd(f"GPS: {Info.REQ_SKYVIEW_HK}") - q.add_pus_tc(create_request_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK))) + q.add_pus_tc( + create_request_one_hk_command( + sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK) + ) + ) if op_code in OpCode.ON: q.add_log_cmd(f"GPS: {Info.ON}") q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0)) @@ -131,7 +153,7 @@ def handle_gps_data( def handle_core_data(pw: PrintWrapper, hk_data: bytes): - if len(hk_data) < 4*8+4+2+8: + if len(hk_data) < 4 * 8 + 4 + 2 + 8: pw.dlog( f"GPS Core dataset with size {len(hk_data)} does not have expected size" f" of {4*8+4+2+8} bytes" @@ -177,7 +199,7 @@ def handle_core_data(pw: PrintWrapper, hk_data: bytes): def handle_skyview_data(pw: PrintWrapper, hk_data: bytes): - data_length = 8+GpsInfo.MAX_SATELLITES*(8+3*2+1) + data_length = 8 + GpsInfo.MAX_SATELLITES * (8 + 3 * 2 + 1) if len(hk_data) < data_length: pw.dlog( f"GPS Skyview dataset with size {len(hk_data)} does not have expected size" @@ -193,24 +215,46 @@ def handle_skyview_data(pw: PrintWrapper, hk_data: bytes): inc_len_int16 = struct.calcsize(fmt_str_int16) inc_len_double = struct.calcsize(fmt_str_double) inc_len_uint8 = struct.calcsize(fmt_str_uint8) - unix = struct.unpack(fmt_str_unix, hk_data[current_idx: current_idx + inc_len_unix]) + unix = struct.unpack( + fmt_str_unix, hk_data[current_idx : current_idx + inc_len_unix] + ) current_idx += inc_len_unix - prn_id = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) + prn_id = struct.unpack( + fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16] + ) current_idx += inc_len_int16 - azimuth = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) + azimuth = struct.unpack( + fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16] + ) current_idx += inc_len_int16 - elevation = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) + elevation = struct.unpack( + fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16] + ) current_idx += inc_len_int16 - signal_to_noise = struct.unpack(fmt_str_double, hk_data[current_idx: current_idx + inc_len_double]) + signal_to_noise = struct.unpack( + fmt_str_double, hk_data[current_idx : current_idx + inc_len_double] + ) current_idx += inc_len_double - used = struct.unpack(fmt_str_uint8, hk_data[current_idx: current_idx + inc_len_uint8]) + used = struct.unpack( + fmt_str_uint8, hk_data[current_idx : current_idx + inc_len_uint8] + ) current_idx += inc_len_uint8 pw.dlog(f"Skyview Time: {unix} unix-sec") - pw.dlog("{:<8} {:<8} {:<8} {:<8} {:<8}".format('PRN_ID', 'AZ [°]', 'EL [°]', 'S2N [dBW]', 'USED')) + pw.dlog( + "{:<8} {:<8} {:<8} {:<8} {:<8}".format( + "PRN_ID", "AZ [°]", "EL [°]", "S2N [dBW]", "USED" + ) + ) for idx in range(GpsInfo.MAX_SATELLITES): - pw.dlog("{:<8} {:<8} {:<8} {:<8} {:<8}".format(prn_id[idx], azimuth[idx], elevation[idx], signal_to_noise[idx], - used[idx])) + pw.dlog( + "{:<8} {:<8} {:<8} {:<8} {:<8}".format( + prn_id[idx], + azimuth[idx], + elevation[idx], + signal_to_noise[idx], + used[idx], + ) + ) FsfwTmTcPrinter.get_validity_buffer( validity_buffer=hk_data[current_idx:], num_vars=6 ) - diff --git a/eive_tmtc/tmtc/power/plpcdu.py b/eive_tmtc/tmtc/power/plpcdu.py index 745d7b4..d9fe187 100644 --- a/eive_tmtc/tmtc/power/plpcdu.py +++ b/eive_tmtc/tmtc/power/plpcdu.py @@ -381,43 +381,52 @@ def request_wait_time() -> Optional[float]: return wait_time +class SubmodeForOnMode(enum.IntEnum): + SSR_ON = 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + DRO_ON = 1 << NormalSubmodesMask.DRO_ON | ( + 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + ) + X8_ON = ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + ) + TX_ON = ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + ) + MPA_ON = ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + | (1 << NormalSubmodesMask.MPA_ON) + ) + HPA_ON = ( + 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 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 + return SubmodeForOnMode.SSR_ON if on_tgt == NormalSubmodesMask.DRO_ON: - return 1 << NormalSubmodesMask.DRO_ON | ( - 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON - ) + return SubmodeForOnMode.DRO_ON if on_tgt == NormalSubmodesMask.X8_ON: - return ( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - ) + return SubmodeForOnMode.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) - ) + return SubmodeForOnMode.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) - ) + return SubmodeForOnMode.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) - ) + return SubmodeForOnMode.HPA_ON def pack_wait_time_cmd(q: DefaultPusQueueHelper, param_id: int, print_str: str): From 73bc043538078de2e64c876d3de1b113a41d20d8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 11:50:39 +0200 Subject: [PATCH 16/30] move enum --- eive_tmtc/tmtc/power/plpcdu.py | 66 +++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/eive_tmtc/tmtc/power/plpcdu.py b/eive_tmtc/tmtc/power/plpcdu.py index d9fe187..044930c 100644 --- a/eive_tmtc/tmtc/power/plpcdu.py +++ b/eive_tmtc/tmtc/power/plpcdu.py @@ -85,6 +85,39 @@ class NormalSubmodesMask(enum.IntEnum): HPA_ON = 5 +class SubmodeForOnMode(enum.IntEnum): + SSR_ON = 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + DRO_ON = 1 << NormalSubmodesMask.DRO_ON | ( + 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON + ) + X8_ON = ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + ) + TX_ON = ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + ) + MPA_ON = ( + 1 << NormalSubmodesMask.DRO_ON + | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) + | (1 << NormalSubmodesMask.X8_ON) + | (1 << NormalSubmodesMask.TX_ON) + | (1 << NormalSubmodesMask.MPA_ON) + ) + HPA_ON = ( + 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) + ) + + class ParamIds(enum.IntEnum): NEG_V_LOWER_BOUND = 0 NEG_V_UPPER_BOUND = 1 @@ -381,39 +414,6 @@ def request_wait_time() -> Optional[float]: return wait_time -class SubmodeForOnMode(enum.IntEnum): - SSR_ON = 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON - DRO_ON = 1 << NormalSubmodesMask.DRO_ON | ( - 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON - ) - X8_ON = ( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - ) - TX_ON = ( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - | (1 << NormalSubmodesMask.TX_ON) - ) - MPA_ON = ( - 1 << NormalSubmodesMask.DRO_ON - | (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON) - | (1 << NormalSubmodesMask.X8_ON) - | (1 << NormalSubmodesMask.TX_ON) - | (1 << NormalSubmodesMask.MPA_ON) - ) - HPA_ON = ( - 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 submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int: if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON: return SubmodeForOnMode.SSR_ON From d7b494a950f06b3272df34d95b8b1daab37091b3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 11:51:12 +0200 Subject: [PATCH 17/30] better name --- eive_tmtc/tmtc/power/plpcdu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eive_tmtc/tmtc/power/plpcdu.py b/eive_tmtc/tmtc/power/plpcdu.py index 044930c..bc2f106 100644 --- a/eive_tmtc/tmtc/power/plpcdu.py +++ b/eive_tmtc/tmtc/power/plpcdu.py @@ -85,7 +85,7 @@ class NormalSubmodesMask(enum.IntEnum): HPA_ON = 5 -class SubmodeForOnMode(enum.IntEnum): +class SubmodeForNormalMode(enum.IntEnum): SSR_ON = 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON DRO_ON = 1 << NormalSubmodesMask.DRO_ON | ( 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON From a6b3ccb4ccb0077476d457d870bdeeee56f51e16 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 11:51:41 +0200 Subject: [PATCH 18/30] more better names --- eive_tmtc/tmtc/power/plpcdu.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/eive_tmtc/tmtc/power/plpcdu.py b/eive_tmtc/tmtc/power/plpcdu.py index bc2f106..cfe9dac 100644 --- a/eive_tmtc/tmtc/power/plpcdu.py +++ b/eive_tmtc/tmtc/power/plpcdu.py @@ -416,17 +416,17 @@ def request_wait_time() -> Optional[float]: def submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int: if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON: - return SubmodeForOnMode.SSR_ON + return SubmodeForNormalMode.SSR_ON if on_tgt == NormalSubmodesMask.DRO_ON: - return SubmodeForOnMode.DRO_ON + return SubmodeForNormalMode.DRO_ON if on_tgt == NormalSubmodesMask.X8_ON: - return SubmodeForOnMode.X8_ON + return SubmodeForNormalMode.X8_ON if on_tgt == NormalSubmodesMask.TX_ON: - return SubmodeForOnMode.TX_ON + return SubmodeForNormalMode.TX_ON if on_tgt == NormalSubmodesMask.MPA_ON: - return SubmodeForOnMode.MPA_ON + return SubmodeForNormalMode.MPA_ON if on_tgt == NormalSubmodesMask.HPA_ON: - return SubmodeForOnMode.HPA_ON + return SubmodeForNormalMode.HPA_ON def pack_wait_time_cmd(q: DefaultPusQueueHelper, param_id: int, print_str: str): From 403657110b1555b0e15702cb96d7fe43e815a036 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 13:13:06 +0200 Subject: [PATCH 19/30] prep v5.4.0 --- CHANGELOG.md | 7 +++++++ eive_tmtc/__init__.py | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f020c1e..be50e7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,13 @@ list yields a list of all related PRs for each release. # [unreleased] +# [v5.4.0] 2023-08-15 + +## Added + +- New enumeration for PL PCDU commanding. +- Some new events + # [v5.3.1] 2023-07-26 ## Changed diff --git a/eive_tmtc/__init__.py b/eive_tmtc/__init__.py index 7215fe2..4d21f71 100644 --- a/eive_tmtc/__init__.py +++ b/eive_tmtc/__init__.py @@ -1,12 +1,12 @@ -__version__ = "5.3.1" +__version__ = "5.4.0" import logging from pathlib import Path SW_NAME = "eive-tmtc" VERSION_MAJOR = 5 -VERSION_MINOR = 3 -VERSION_REVISION = 1 +VERSION_MINOR = 4 +VERSION_REVISION = 0 EIVE_TMTC_ROOT = Path(__file__).parent PACKAGE_ROOT = EIVE_TMTC_ROOT.parent From 0e208629b0ae5095a98060f7a430129b60d2f232 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 13:20:43 +0200 Subject: [PATCH 20/30] subsystem enum is int enum now --- eive_tmtc/tmtc/payload/subsystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eive_tmtc/tmtc/payload/subsystem.py b/eive_tmtc/tmtc/payload/subsystem.py index 14eaa75..560891d 100644 --- a/eive_tmtc/tmtc/payload/subsystem.py +++ b/eive_tmtc/tmtc/payload/subsystem.py @@ -12,7 +12,7 @@ from tmtccmd.tc.decorator import ServiceProviderParams from tmtccmd.tc.pus_200_fsfw_mode import Subservice as ModeSubservice -class ModeId: +class ModeId(enum.IntEnum): OFF = 0 SUPV_ONLY = 10 MPSOC_STREAM = 11 From 8a1e5b7b99c26a5a9131adf7a77600678de2554e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 13:21:10 +0200 Subject: [PATCH 21/30] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be50e7a..8ab143d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ list yields a list of all related PRs for each release. # [unreleased] +## Changed + + - PL Subsystem mode ID is int enum now. + # [v5.4.0] 2023-08-15 ## Added From f76cd9453593375974bc67fa7ce3906c6eb4443a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 13:28:54 +0200 Subject: [PATCH 22/30] prep v5.4.1 --- CHANGELOG.md | 6 ++++++ eive_tmtc/__init__.py | 4 ++-- eive_tmtc/config/events.csv | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ab143d..aa5e5d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ list yields a list of all related PRs for each release. # [unreleased] +# [v5.4.1] 2023-08-15 + +## Added + +- New event TLE_TOO_OLD + ## Changed - PL Subsystem mode ID is int enum now. diff --git a/eive_tmtc/__init__.py b/eive_tmtc/__init__.py index 4d21f71..7261b05 100644 --- a/eive_tmtc/__init__.py +++ b/eive_tmtc/__init__.py @@ -1,4 +1,4 @@ -__version__ = "5.4.0" +__version__ = "5.4.1" import logging from pathlib import Path @@ -6,7 +6,7 @@ from pathlib import Path SW_NAME = "eive-tmtc" VERSION_MAJOR = 5 VERSION_MINOR = 4 -VERSION_REVISION = 0 +VERSION_REVISION = 1 EIVE_TMTC_ROOT = Path(__file__).parent PACKAGE_ROOT = EIVE_TMTC_ROOT.parent diff --git a/eive_tmtc/config/events.csv b/eive_tmtc/config/events.csv index ecdf953..b00c56b 100644 --- a/eive_tmtc/config/events.csv +++ b/eive_tmtc/config/events.csv @@ -94,6 +94,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 11205;0x2bc5;MEKF_AUTOMATIC_RESET;INFO;MEKF performed an automatic reset after detection of nonfinite values.;mission/acs/defs.h 11206;0x2bc6;MEKF_INVALID_MODE_VIOLATION;HIGH;MEKF was not able to compute a solution during any pointing ACS mode for a prolonged time.;mission/acs/defs.h 11207;0x2bc7;SAFE_MODE_CONTROLLER_FAILURE;HIGH;The ACS safe mode controller was not able to compute a solution and has failed. P1: Missing information about magnetic field, P2: Missing information about rotational rate;mission/acs/defs.h +11208;0x2bc8;TLE_TOO_OLD;INFO;The TLE for the SGP4 Propagator has become too old.;mission/acs/defs.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/power/defs.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/power/defs.h 11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/power/defs.h From b0562ea9c7d3ba41175a4e91652fbec9a9969510 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 13:54:18 +0200 Subject: [PATCH 23/30] added none entry for new enum --- eive_tmtc/tmtc/power/plpcdu.py | 1 + 1 file changed, 1 insertion(+) diff --git a/eive_tmtc/tmtc/power/plpcdu.py b/eive_tmtc/tmtc/power/plpcdu.py index cfe9dac..62517e3 100644 --- a/eive_tmtc/tmtc/power/plpcdu.py +++ b/eive_tmtc/tmtc/power/plpcdu.py @@ -86,6 +86,7 @@ class NormalSubmodesMask(enum.IntEnum): class SubmodeForNormalMode(enum.IntEnum): + NONE = 0 SSR_ON = 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON DRO_ON = 1 << NormalSubmodesMask.DRO_ON | ( 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON From 4b08f5dd5bc8a5226418587bdcec6d6c8701990f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 13:57:43 +0200 Subject: [PATCH 24/30] prep v5.4.2 --- CHANGELOG.md | 6 ++++++ eive_tmtc/__init__.py | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa5e5d3..55669aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ list yields a list of all related PRs for each release. # [unreleased] +# [v5.4.2] 2023-08-15 + +## Added + +- New NONE entry for PL PCDU submode enum. + # [v5.4.1] 2023-08-15 ## Added diff --git a/eive_tmtc/__init__.py b/eive_tmtc/__init__.py index 7261b05..ee439a5 100644 --- a/eive_tmtc/__init__.py +++ b/eive_tmtc/__init__.py @@ -1,4 +1,4 @@ -__version__ = "5.4.1" +__version__ = "5.4.2" import logging from pathlib import Path @@ -6,7 +6,7 @@ from pathlib import Path SW_NAME = "eive-tmtc" VERSION_MAJOR = 5 VERSION_MINOR = 4 -VERSION_REVISION = 1 +VERSION_REVISION = 2 EIVE_TMTC_ROOT = Path(__file__).parent PACKAGE_ROOT = EIVE_TMTC_ROOT.parent From 72def77d401ba512d8a4c92287e8612a5407e1ac Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 14:15:06 +0200 Subject: [PATCH 25/30] parse ploc supv HK --- eive_tmtc/tmtc/payload/ploc_supervisor.py | 34 ++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/eive_tmtc/tmtc/payload/ploc_supervisor.py b/eive_tmtc/tmtc/payload/ploc_supervisor.py index b696ecf..98573b2 100644 --- a/eive_tmtc/tmtc/payload/ploc_supervisor.py +++ b/eive_tmtc/tmtc/payload/ploc_supervisor.py @@ -722,10 +722,42 @@ def get_event_buffer_path() -> str: return file +class SocState(enum.IntEnum): + OFF = 0 + BOOTING = 1 + OPERATIONAL = 2 + SHUTDOWN = 3 + + def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper): current_idx = 0 if set_id == SetIds.HK_REPORT: - pass + fmt_str = "!IIIQIIIIIBBBB" + inc_len = struct.calcsize(fmt_str) + ( + temp_ps, + temp_pl, + temp_sup, + uptime, + cpu_load, + avail_heap, + num_tcs, + num_tms, + soc_state, + nvm_0_1_state, + nvm_3_state, + mission_io_state, + fmc_state + ) = struct.unpack(fmt_str, hk_data) + pw.dlog(f"Temp PS {temp_ps} | Temp PL {temp_pl} | Temp SUP {temp_sup}") + pw.dlog(f"Uptime {uptime} | CPU Load {cpu_load} | Avail Heap {avail_heap}") + pw.dlog(f"Number TCs {num_tcs} | Number TMs {num_tms}") + pw.dlog(f"SOC state {SocState(soc_state)}") + pw.dlog(f"NVM 01 State {nvm_0_1_state}") + pw.dlog(f"NVM 3 State {nvm_3_state}") + pw.dlog(f"Mission IO state {mission_io_state}") + pw.dlog(f"FMC state {fmc_state}") + FsfwTmTcPrinter.print_validity_buffer(hk_data[inc_len:], 13) elif set_id == SetIds.BOOT_STATUS_REPORT: fmt_str = "!BBIIBBBBBB" inc_len = struct.calcsize(fmt_str) From 2f8bed4581e05628a3945756cef57ea1602514cb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 14:31:49 +0200 Subject: [PATCH 26/30] works --- eive_tmtc/tmtc/payload/ploc_supervisor.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eive_tmtc/tmtc/payload/ploc_supervisor.py b/eive_tmtc/tmtc/payload/ploc_supervisor.py index 98573b2..18aebab 100644 --- a/eive_tmtc/tmtc/payload/ploc_supervisor.py +++ b/eive_tmtc/tmtc/payload/ploc_supervisor.py @@ -747,9 +747,9 @@ def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper): nvm_0_1_state, nvm_3_state, mission_io_state, - fmc_state - ) = struct.unpack(fmt_str, hk_data) - pw.dlog(f"Temp PS {temp_ps} | Temp PL {temp_pl} | Temp SUP {temp_sup}") + fmc_state, + ) = struct.unpack(fmt_str, hk_data[:inc_len]) + pw.dlog(f"Temp PS {temp_ps} C | Temp PL {temp_pl} C | Temp SUP {temp_sup} C") pw.dlog(f"Uptime {uptime} | CPU Load {cpu_load} | Avail Heap {avail_heap}") pw.dlog(f"Number TCs {num_tcs} | Number TMs {num_tms}") pw.dlog(f"SOC state {SocState(soc_state)}") @@ -757,7 +757,7 @@ def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper): pw.dlog(f"NVM 3 State {nvm_3_state}") pw.dlog(f"Mission IO state {mission_io_state}") pw.dlog(f"FMC state {fmc_state}") - FsfwTmTcPrinter.print_validity_buffer(hk_data[inc_len:], 13) + pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[inc_len:], 13)) elif set_id == SetIds.BOOT_STATUS_REPORT: fmt_str = "!BBIIBBBBBB" inc_len = struct.calcsize(fmt_str) From 772ef5b323550516629c2d8b02c6d14f47eab6de Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 14:35:45 +0200 Subject: [PATCH 27/30] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55669aa..4f7b930 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ list yields a list of all related PRs for each release. # [unreleased] +## Added + +- PLOC SUPV HK parsing. + # [v5.4.2] 2023-08-15 ## Added From 36799ef51db0ab19142465b72325a827d92dbd49 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Aug 2023 14:38:28 +0200 Subject: [PATCH 28/30] v5.4.3 --- CHANGELOG.md | 2 ++ eive_tmtc/__init__.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f7b930..5844963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ list yields a list of all related PRs for each release. # [unreleased] +# [v5.4.3] 2023-08-15 + ## Added - PLOC SUPV HK parsing. diff --git a/eive_tmtc/__init__.py b/eive_tmtc/__init__.py index ee439a5..d701219 100644 --- a/eive_tmtc/__init__.py +++ b/eive_tmtc/__init__.py @@ -1,4 +1,4 @@ -__version__ = "5.4.2" +__version__ = "5.4.3" import logging from pathlib import Path @@ -6,7 +6,7 @@ from pathlib import Path SW_NAME = "eive-tmtc" VERSION_MAJOR = 5 VERSION_MINOR = 4 -VERSION_REVISION = 2 +VERSION_REVISION = 3 EIVE_TMTC_ROOT = Path(__file__).parent PACKAGE_ROOT = EIVE_TMTC_ROOT.parent From 8ddcc37c74a0fad5189f7f2875060d934a5937b4 Mon Sep 17 00:00:00 2001 From: meggert Date: Wed, 16 Aug 2023 13:25:29 +0200 Subject: [PATCH 29/30] mini fixes --- eive_tmtc/tmtc/acs/acs_ctrl.py | 2 +- eive_tmtc/tmtc/acs/gps.py | 84 +++++++++------------------------- 2 files changed, 22 insertions(+), 64 deletions(-) diff --git a/eive_tmtc/tmtc/acs/acs_ctrl.py b/eive_tmtc/tmtc/acs/acs_ctrl.py index 3206056..441e898 100644 --- a/eive_tmtc/tmtc/acs/acs_ctrl.py +++ b/eive_tmtc/tmtc/acs/acs_ctrl.py @@ -1018,7 +1018,7 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes): inc_len_source = struct.calcsize(fmt_source) inc_len_scalar = struct.calcsize(fmt_scalar) inc_len_vec = struct.calcsize(fmt_vec) - if len(hk_data) < 2 * inc_len_scalar + 2 * inc_len_vec + inc_len_source: + if len(hk_data) < 3 * inc_len_scalar + 2 * inc_len_vec + inc_len_source: pw.dlog("Received HK set too small") return current_idx = 0 diff --git a/eive_tmtc/tmtc/acs/gps.py b/eive_tmtc/tmtc/acs/gps.py index 41a8a7f..da90ce1 100644 --- a/eive_tmtc/tmtc/acs/gps.py +++ b/eive_tmtc/tmtc/acs/gps.py @@ -72,9 +72,7 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper): ) -def pack_gps_command( # noqa: C901 - object_id: bytes, q: DefaultPusQueueHelper, op_code: str -): # noqa: C901 +def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str): if op_code in OpCode.RESET_GNSS: # TODO: This needs to be re-implemented _LOGGER.warning("Reset pin handling needs to be re-implemented") @@ -84,52 +82,34 @@ def pack_gps_command( # noqa: C901 raise ValueError("invalid interval") q.add_log_cmd(f"GPS: {Info.ENABLE_CORE_HK}") cmds = create_enable_periodic_hk_command_with_interval( - diag=False, - sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK), - interval_seconds=interval, + diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK), interval_seconds=interval ) for cmd in cmds: q.add_pus_tc(cmd) if op_code in OpCode.DISABLE_CORE_HK: q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}") - q.add_pus_tc( - create_disable_periodic_hk_command( - diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK) - ) - ) + q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id, + set_id=SetId.CORE_HK))) if op_code in OpCode.REQ_CORE_HK: q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}") - q.add_pus_tc( - create_request_one_hk_command( - sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK) - ) - ) + q.add_pus_tc(create_request_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK))) if op_code in OpCode.ENABLE_SKYVIEW_HK: interval = float(input("Please specify interval in floating point seconds: ")) if interval <= 0: raise ValueError("invalid interval") q.add_log_cmd(f"GPS: {Info.ENABLE_SKYVIEW_HK}") cmds = create_enable_periodic_hk_command_with_interval( - diag=False, - sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK), - interval_seconds=interval, + diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK), interval_seconds=interval ) for cmd in cmds: q.add_pus_tc(cmd) if op_code in OpCode.DISABLE_SKYVIEW_HK: q.add_log_cmd(f"gps: {Info.DISABLE_SKYVIEW_HK}") - q.add_pus_tc( - create_disable_periodic_hk_command( - diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK) - ) - ) + q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id, + set_id=SetId.SKYVIEW_HK))) if op_code in OpCode.REQ_SKYVIEW_HK: q.add_log_cmd(f"GPS: {Info.REQ_SKYVIEW_HK}") - q.add_pus_tc( - create_request_one_hk_command( - sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK) - ) - ) + q.add_pus_tc(create_request_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK))) if op_code in OpCode.ON: q.add_log_cmd(f"GPS: {Info.ON}") q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0)) @@ -153,7 +133,7 @@ def handle_gps_data( def handle_core_data(pw: PrintWrapper, hk_data: bytes): - if len(hk_data) < 4 * 8 + 4 + 2 + 8: + if len(hk_data) < 4*8+4+2+8: pw.dlog( f"GPS Core dataset with size {len(hk_data)} does not have expected size" f" of {4*8+4+2+8} bytes" @@ -199,7 +179,7 @@ def handle_core_data(pw: PrintWrapper, hk_data: bytes): def handle_skyview_data(pw: PrintWrapper, hk_data: bytes): - data_length = 8 + GpsInfo.MAX_SATELLITES * (8 + 3 * 2 + 1) + data_length = 8+GpsInfo.MAX_SATELLITES*(8+3*2+1) if len(hk_data) < data_length: pw.dlog( f"GPS Skyview dataset with size {len(hk_data)} does not have expected size" @@ -215,46 +195,24 @@ def handle_skyview_data(pw: PrintWrapper, hk_data: bytes): inc_len_int16 = struct.calcsize(fmt_str_int16) inc_len_double = struct.calcsize(fmt_str_double) inc_len_uint8 = struct.calcsize(fmt_str_uint8) - unix = struct.unpack( - fmt_str_unix, hk_data[current_idx : current_idx + inc_len_unix] - ) + unix = struct.unpack(fmt_str_unix, hk_data[current_idx: current_idx + inc_len_unix])[0] current_idx += inc_len_unix - prn_id = struct.unpack( - fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16] - ) + prn_id = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) current_idx += inc_len_int16 - azimuth = struct.unpack( - fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16] - ) + azimuth = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) current_idx += inc_len_int16 - elevation = struct.unpack( - fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16] - ) + elevation = struct.unpack(fmt_str_int16, hk_data[current_idx: current_idx + inc_len_int16]) current_idx += inc_len_int16 - signal_to_noise = struct.unpack( - fmt_str_double, hk_data[current_idx : current_idx + inc_len_double] - ) + signal_to_noise = struct.unpack(fmt_str_double, hk_data[current_idx: current_idx + inc_len_double]) current_idx += inc_len_double - used = struct.unpack( - fmt_str_uint8, hk_data[current_idx : current_idx + inc_len_uint8] - ) + used = struct.unpack(fmt_str_uint8, hk_data[current_idx: current_idx + inc_len_uint8]) current_idx += inc_len_uint8 pw.dlog(f"Skyview Time: {unix} unix-sec") - pw.dlog( - "{:<8} {:<8} {:<8} {:<8} {:<8}".format( - "PRN_ID", "AZ [°]", "EL [°]", "S2N [dBW]", "USED" - ) - ) + pw.dlog("{:<8} {:<8} {:<8} {:<8} {:<8}".format('PRN_ID', 'AZ [°]', 'EL [°]', 'S2N [dBW]', 'USED')) for idx in range(GpsInfo.MAX_SATELLITES): - pw.dlog( - "{:<8} {:<8} {:<8} {:<8} {:<8}".format( - prn_id[idx], - azimuth[idx], - elevation[idx], - signal_to_noise[idx], - used[idx], - ) - ) + pw.dlog("{:<8} {:<8} {:<8} {:<8} {:<8}".format(prn_id[idx], azimuth[idx], elevation[idx], signal_to_noise[idx], + used[idx])) FsfwTmTcPrinter.get_validity_buffer( validity_buffer=hk_data[current_idx:], num_vars=6 ) + From de57b9da5b459ea9aefeb80bc95832f2c50c3d5d Mon Sep 17 00:00:00 2001 From: meggert Date: Mon, 21 Aug 2023 15:59:55 +0200 Subject: [PATCH 30/30] events (wherever these changes come from?) --- eive_tmtc/config/returnvalues.csv | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eive_tmtc/config/returnvalues.csv b/eive_tmtc/config/returnvalues.csv index 1bc9186..065e539 100644 --- a/eive_tmtc/config/returnvalues.csv +++ b/eive_tmtc/config/returnvalues.csv @@ -357,7 +357,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3a02;MQI_Full;No space left for more messages;2;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a03;MQI_NoReplyPartner;Returned if a reply method was called without partner;3;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a04;MQI_DestinationInvalid;Returned if the target destination is invalid.;4;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h -0x3b00;SPH_ConnBroken;No description;0;SEMAPHORE_IF;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x3b01;SPH_SemaphoreTimeout;No description;1;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b02;SPH_SemaphoreNotOwned;No description;2;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b03;SPH_SemaphoreInvalid;No description;3;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h @@ -373,6 +372,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3e05;HKM_DatasetNotFound;No description;5;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3f01;DLEE_StreamTooShort;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h 0x3f02;DLEE_DecodingError;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h +0x4100;PUS9_ConnBroken;No description;0;PUS_SERVICE_9;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x4201;PUS11_InvalidTypeTimeWindow;No description;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4202;PUS11_InvalidTimeWindow;No description;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4203;PUS11_TimeshiftingNotPossible;No description;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h @@ -402,9 +402,9 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x4403;UXOS_CommandError;Command execution failed;3;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4404;UXOS_NoCommandLoadedOrPending;;4;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h 0x4406;UXOS_PcloseCallError;No description;6;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h -0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h -0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h -0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h +0x4500;HSPI_HalTimeoutRetval;No description;0;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h +0x4501;HSPI_HalBusyRetval;No description;1;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h +0x4502;HSPI_HalErrorRetval;No description;2;HAL_SPI;fsfw/src/fsfw_hal/stm32h7/spi/spiDefinitions.h 0x4503;HSPI_Timeout;No description;3;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h 0x4504;HSPI_Busy;No description;4;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h 0x4505;HSPI_GenericError;No description;5;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h