Compare commits
19 Commits
v5.3.0
...
fd3a799019
Author | SHA1 | Date | |
---|---|---|---|
fd3a799019 | |||
1664e6adb5 | |||
8042f3607d
|
|||
beae6b3f05 | |||
1ddb93410e | |||
b0b186ac1f | |||
f95331742b | |||
c91ad9e08b | |||
fcabaa5b09 | |||
bf9ab7edf7 | |||
4b054b7628 | |||
9001a28545
|
|||
6b2fbc6917 | |||
ab770a0057 | |||
0cbf28f25c
|
|||
cbcc06ede7 | |||
a55aa4a667
|
|||
d2324dace9
|
|||
1e4e524f95
|
@@ -10,6 +10,13 @@ list yields a list of all related PRs for each release.
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
# [v5.3.1] 2023-07-26
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Adaptions for ACS CTRL strategy enum to make it compatible to software. Also make it re-usable
|
||||||
|
by putting it in global scope.
|
||||||
|
|
||||||
# [v5.3.0] 2023-07-26
|
# [v5.3.0] 2023-07-26
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
__version__ = "5.3.0"
|
__version__ = "5.3.1"
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -6,7 +6,7 @@ from pathlib import Path
|
|||||||
SW_NAME = "eive-tmtc"
|
SW_NAME = "eive-tmtc"
|
||||||
VERSION_MAJOR = 5
|
VERSION_MAJOR = 5
|
||||||
VERSION_MINOR = 3
|
VERSION_MINOR = 3
|
||||||
VERSION_REVISION = 0
|
VERSION_REVISION = 1
|
||||||
|
|
||||||
EIVE_TMTC_ROOT = Path(__file__).parent
|
EIVE_TMTC_ROOT = Path(__file__).parent
|
||||||
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
|
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
|
||||||
|
@@ -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
|
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
|
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
|
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
|
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
|
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
|
12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/acs/StrComHandler.h
|
||||||
@@ -255,6 +256,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h
|
13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h
|
||||||
13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h
|
13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h
|
||||||
13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h
|
13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h
|
||||||
|
13803;0x35eb;FS_UNUSABLE;LOW;No description;mission/payload/scexHelpers.h
|
||||||
13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
||||||
13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
||||||
13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
|
||||||
|
|
@@ -101,7 +101,9 @@ def handle_regular_hk_print( # noqa C901: Complexity okay here
|
|||||||
elif objb == obj_ids.IMTQ_HANDLER_ID:
|
elif objb == obj_ids.IMTQ_HANDLER_ID:
|
||||||
return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id)
|
return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id)
|
||||||
elif objb == obj_ids.GPS_CONTROLLER:
|
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:
|
elif objb == obj_ids.PCDU_HANDLER_ID:
|
||||||
return handle_pcdu_hk(pw=pw, set_id=set_id, hk_data=hk_data)
|
return handle_pcdu_hk(pw=pw, set_id=set_id, hk_data=hk_data)
|
||||||
elif objb == obj_ids.BPX_HANDLER_ID:
|
elif objb == obj_ids.BPX_HANDLER_ID:
|
||||||
|
@@ -68,6 +68,29 @@ class ActionId(enum.IntEnum):
|
|||||||
RESTORE_MEKF_NONFINITE_RECOVERY = 2
|
RESTORE_MEKF_NONFINITE_RECOVERY = 2
|
||||||
|
|
||||||
|
|
||||||
|
CTRL_STRAT_DICT = {
|
||||||
|
0: "OFF",
|
||||||
|
1: "NO_MAG_FIELD_FOR_CONTROL",
|
||||||
|
2: "NO_SENSORS_FOR_CONTROL",
|
||||||
|
# OBSW <= v6.1.0
|
||||||
|
10: "LEGACY_SAFE_MEKF",
|
||||||
|
11: "LEGACY_WITHOUT_MEKF",
|
||||||
|
12: "LEGACY_ECLIPSE_DAMPING",
|
||||||
|
13: "LEGACY_ECLIPSE_IDELING",
|
||||||
|
# Added in OBSW v6.2.0
|
||||||
|
14: "SAFE_MEKF",
|
||||||
|
15: "SAFE_GYR",
|
||||||
|
16: "SAFE_SUSMGM",
|
||||||
|
17: "SAFE_ECLIPSE_DAMPING_GYR",
|
||||||
|
18: "SAFE_ECLIPSE_DAMPING_SUSMGM",
|
||||||
|
19: "SAFE_ECLIPSE_IDELING",
|
||||||
|
20: "DETUMBLE_FULL",
|
||||||
|
21: "DETUMBLE_DETERIORATED",
|
||||||
|
30: "PTG_MEKF",
|
||||||
|
31: "PTG_RAW",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class OpCodes:
|
class OpCodes:
|
||||||
OFF = ["off"]
|
OFF = ["off"]
|
||||||
SAFE = ["safe"]
|
SAFE = ["safe"]
|
||||||
@@ -1058,21 +1081,6 @@ def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
|
|
||||||
|
|
||||||
def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
||||||
ctrl_strat = {
|
|
||||||
0: "OFF",
|
|
||||||
1: "NO_MAG_FIELD_FOR_CONTROL",
|
|
||||||
2: "NO_SENSORS_FOR_CONTROL",
|
|
||||||
10: "SAFE_MEKF",
|
|
||||||
11: "SAFE_GYR",
|
|
||||||
12: "SAFE_SUSMGM",
|
|
||||||
13: "SAFE_ECLIPSE_DAMPING_GYR",
|
|
||||||
14: "SAFE_ECLIPSE_DAMPING_SUSMGM",
|
|
||||||
15: "SAFE_ECLIPSE_IDELING",
|
|
||||||
20: "DETUMBLE_FULL",
|
|
||||||
21: "DETUMBLE_DETERIORATED",
|
|
||||||
30: "PTG_MEKF",
|
|
||||||
31: "PTG_RAW",
|
|
||||||
}
|
|
||||||
pw.dlog("Received CTRL Values Set")
|
pw.dlog("Received CTRL Values Set")
|
||||||
fmt_strat = "!B"
|
fmt_strat = "!B"
|
||||||
fmt_quat = "!dddd"
|
fmt_quat = "!dddd"
|
||||||
@@ -1118,8 +1126,8 @@ def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
current_idx += inc_len_vec
|
current_idx += inc_len_vec
|
||||||
if ctrl_strat.get(strat) is not None:
|
if CTRL_STRAT_DICT.get(strat) is not None:
|
||||||
pw.dlog(f"{'Safe Ctrl Strategy'.ljust(25)}: {ctrl_strat[strat]}")
|
pw.dlog(f"{'Safe Ctrl Strategy'.ljust(25)}: {CTRL_STRAT_DICT[strat]}")
|
||||||
else:
|
else:
|
||||||
pw.dlog(f"{'Safe Ctrl Strategy (key unknown)'.ljust(25)}: {strat}")
|
pw.dlog(f"{'Safe Ctrl Strategy (key unknown)'.ljust(25)}: {strat}")
|
||||||
pw.dlog(f"Control Values Target Quaternion: {tgt_quat}")
|
pw.dlog(f"Control Values Target Quaternion: {tgt_quat}")
|
||||||
|
@@ -19,38 +19,50 @@ from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
class GpsInfo:
|
||||||
|
MAX_SATELLITES = 30
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
OFF = "off"
|
OFF = "off"
|
||||||
ON = "on"
|
ON = "on"
|
||||||
REQ_OS_HK = ["hk"]
|
REQ_CORE_HK = ["core_hk_request"]
|
||||||
ENABLE_HK = ["enable_hk"]
|
ENABLE_CORE_HK = ["core_hk_enable"]
|
||||||
DISABLE_HK = ["disable_hk"]
|
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"]
|
RESET_GNSS = ["reset"]
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
OFF = "Off"
|
OFF = "Off"
|
||||||
ON = "On"
|
ON = "On"
|
||||||
REQ_OS_HK = "Request One-Shot HK"
|
REQ_CORE_HK = "Request Core HK"
|
||||||
ENABLE_HK = "Enable HK"
|
ENABLE_CORE_HK = "Enable Core HK"
|
||||||
DISABLE_HK = "Disable 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"
|
RESET_GNSS = "Reset GNSS using reset pin"
|
||||||
|
|
||||||
|
|
||||||
class SetId(enum.IntEnum):
|
class SetId(enum.IntEnum):
|
||||||
HK = 0
|
CORE_HK = 0
|
||||||
|
SKYVIEW_HK = 1
|
||||||
|
|
||||||
|
|
||||||
@tmtc_definitions_provider
|
@tmtc_definitions_provider
|
||||||
def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
||||||
oce = OpCodeEntry()
|
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.OFF, info=Info.OFF)
|
||||||
oce.add(keys=OpCode.ON, info=Info.ON)
|
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(
|
defs.add_service(
|
||||||
name=CustomServiceList.GPS_CTRL.value,
|
name=CustomServiceList.GPS_CTRL.value,
|
||||||
info="GPS/GNSS Controller",
|
info="GPS/GNSS Controller",
|
||||||
@@ -59,26 +71,43 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
|
|
||||||
|
|
||||||
def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str):
|
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 in OpCode.RESET_GNSS:
|
||||||
# TODO: This needs to be re-implemented
|
# TODO: This needs to be re-implemented
|
||||||
_LOGGER.warning("Reset pin handling 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 in OpCode.ENABLE_CORE_HK:
|
||||||
interval = float(input("Please specify interval in floating point seconds: "))
|
interval = float(input("Please specify interval in floating point seconds: "))
|
||||||
if interval <= 0:
|
if interval <= 0:
|
||||||
raise ValueError("invalid interval")
|
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(
|
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:
|
for cmd in cmds:
|
||||||
q.add_pus_tc(cmd)
|
q.add_pus_tc(cmd)
|
||||||
if op_code in OpCode.DISABLE_HK:
|
if op_code in OpCode.DISABLE_CORE_HK:
|
||||||
q.add_log_cmd(f"gps: {Info.DISABLE_HK}")
|
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
|
||||||
q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=sid))
|
q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=make_sid(object_id=object_id,
|
||||||
if op_code in OpCode.REQ_OS_HK:
|
set_id=SetId.CORE_HK)))
|
||||||
q.add_log_cmd(f"GPS: {Info.REQ_OS_HK}")
|
if op_code in OpCode.REQ_CORE_HK:
|
||||||
q.add_pus_tc(create_request_one_hk_command(sid=sid))
|
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:
|
if op_code in OpCode.ON:
|
||||||
q.add_log_cmd(f"GPS: {Info.ON}")
|
q.add_log_cmd(f"GPS: {Info.ON}")
|
||||||
q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0))
|
q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0))
|
||||||
@@ -87,8 +116,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))
|
q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0))
|
||||||
|
|
||||||
|
|
||||||
def handle_gps_data(pw: PrintWrapper, hk_data: bytes):
|
def handle_gps_data(
|
||||||
pw.dlog(f"Received GPS data, HK data length {len(hk_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_skyview_data(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
|
current_idx = 0
|
||||||
fmt_str = "!ddddBBBHBBBBBI"
|
fmt_str = "!ddddBBBHBBBBBI"
|
||||||
inc_len = struct.calcsize(fmt_str)
|
inc_len = struct.calcsize(fmt_str)
|
||||||
@@ -126,3 +174,43 @@ def handle_gps_data(pw: PrintWrapper, hk_data: bytes):
|
|||||||
FsfwTmTcPrinter.get_validity_buffer(
|
FsfwTmTcPrinter.get_validity_buffer(
|
||||||
validity_buffer=hk_data[current_idx:], num_vars=14
|
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
|
||||||
|
)
|
||||||
|
|
||||||
|
@@ -17,17 +17,17 @@ USE_SCEX_CONF_FILE = True
|
|||||||
|
|
||||||
|
|
||||||
class OpCode:
|
class OpCode:
|
||||||
PING = ["0", "ping"]
|
PING = "ping"
|
||||||
ION_CMD = ["1", "ion"]
|
ION_CMD = "ion"
|
||||||
TEMP_CMD = ["2", "temp"]
|
TEMP_CMD = "temp"
|
||||||
EXP_STATUS_CMD = ["3", "expstatus"]
|
EXP_STATUS_CMD = "expstatus"
|
||||||
|
|
||||||
ONE_CELLS_CMD = ["4", "onecell"]
|
ONE_CELLS_CMD = "onecell"
|
||||||
ALL_CELLS_CMD = ["5", "allcells"]
|
ALL_CELLS_CMD = "allcells"
|
||||||
FRAM = ["6", "fram"]
|
FRAM = "fram"
|
||||||
|
|
||||||
SWITCH_ON = ["7", "on"]
|
SWITCH_ON = "on"
|
||||||
SWITCH_OFF = ["8", "off"]
|
SWITCH_OFF = "off"
|
||||||
|
|
||||||
|
|
||||||
class ActionId(enum.IntEnum):
|
class ActionId(enum.IntEnum):
|
||||||
@@ -78,7 +78,7 @@ def add_scex_cmds(defs: TmtcDefinitionWrapper):
|
|||||||
def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
||||||
op_code = p.op_code
|
op_code = p.op_code
|
||||||
q = p.queue_helper
|
q = p.queue_helper
|
||||||
if op_code in OpCode.SWITCH_ON:
|
if op_code == OpCode.SWITCH_ON:
|
||||||
q.add_log_cmd(Info.SWITCH_ON)
|
q.add_log_cmd(Info.SWITCH_ON)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@@ -87,7 +87,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.ON, 0),
|
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.ON, 0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.SWITCH_OFF:
|
if op_code == OpCode.SWITCH_OFF:
|
||||||
q.add_log_cmd(Info.SWITCH_OFF)
|
q.add_log_cmd(Info.SWITCH_OFF)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
PusTelecommand(
|
PusTelecommand(
|
||||||
@@ -96,20 +96,20 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.OFF, 0),
|
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.OFF, 0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if op_code in OpCode.PING:
|
if op_code == OpCode.PING:
|
||||||
q.add_log_cmd(Info.PING)
|
q.add_log_cmd(Info.PING)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.PING, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.PING, app_data))
|
||||||
if op_code in OpCode.ION_CMD:
|
if op_code == OpCode.ION_CMD:
|
||||||
q.add_log_cmd(Info.ION_CMD)
|
q.add_log_cmd(Info.ION_CMD)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.ION_CMD, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.ION_CMD, app_data))
|
||||||
if op_code in OpCode.TEMP_CMD:
|
if op_code == OpCode.TEMP_CMD:
|
||||||
q.add_log_cmd(Info.TEMP_CMD)
|
q.add_log_cmd(Info.TEMP_CMD)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.TEMP_CMD, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.TEMP_CMD, app_data))
|
||||||
|
|
||||||
if op_code in OpCode.EXP_STATUS_CMD:
|
if op_code == OpCode.EXP_STATUS_CMD:
|
||||||
q.add_log_cmd(Info.EXP_STATUS_CMD)
|
q.add_log_cmd(Info.EXP_STATUS_CMD)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@@ -117,7 +117,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
)
|
)
|
||||||
|
|
||||||
# one cell
|
# one cell
|
||||||
if op_code in OpCode.ONE_CELLS_CMD:
|
if op_code == OpCode.ONE_CELLS_CMD:
|
||||||
q.add_log_cmd(Info.ONE_CELLS_CMD)
|
q.add_log_cmd(Info.ONE_CELLS_CMD)
|
||||||
app_data = bytearray([0])
|
app_data = bytearray([0])
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
create_action_cmd(SCEX_HANDLER_ID, ActionId.ONE_CELLS_CMD, app_data)
|
create_action_cmd(SCEX_HANDLER_ID, ActionId.ONE_CELLS_CMD, app_data)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code in OpCode.ALL_CELLS_CMD:
|
if op_code == OpCode.ALL_CELLS_CMD:
|
||||||
q.add_log_cmd(Info.ALL_CELLS_CMD)
|
q.add_log_cmd(Info.ALL_CELLS_CMD)
|
||||||
app_data = bytearray([0])
|
app_data = bytearray([0])
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
|
|||||||
create_action_cmd(SCEX_HANDLER_ID, ActionId.ALL_CELLS_CMD, app_data)
|
create_action_cmd(SCEX_HANDLER_ID, ActionId.ALL_CELLS_CMD, app_data)
|
||||||
)
|
)
|
||||||
|
|
||||||
if op_code in OpCode.FRAM:
|
if op_code == OpCode.FRAM:
|
||||||
q.add_log_cmd(Info.FRAM)
|
q.add_log_cmd(Info.FRAM)
|
||||||
app_data = bytes([0])
|
app_data = bytes([0])
|
||||||
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.FRAM, app_data))
|
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.FRAM, app_data))
|
||||||
|
Reference in New Issue
Block a user