Compare commits
68 Commits
Author | SHA1 | Date | |
---|---|---|---|
c9f4a8070d | |||
b917358b9f | |||
5db9f383a6 | |||
fe3accb9ad | |||
68d74a4748 | |||
b6ec7da7fa | |||
c7df13fa68 | |||
daceb6bc1d | |||
8239e610cc | |||
b28d938468 | |||
e0457831d7 | |||
96fab88a55 | |||
50f2eb42f3 | |||
1bb8bea8d9 | |||
80d231586e | |||
5f44cb96be | |||
96136106c7 | |||
65a2d40614 | |||
7e5539ee05 | |||
698cdb3e1d | |||
91ea3669af | |||
dcf1483c47 | |||
0ad0dc391d | |||
774a291f8c | |||
f27333fa0d | |||
5083c9390c | |||
bb4cc59049 | |||
23e38990a3 | |||
8bbd37cf76 | |||
95511e484e | |||
276862fa6e | |||
4a5c2cdd4f | |||
be09b3475d | |||
8927949c4b | |||
acc58ebef1 | |||
7bc344755f | |||
bde17600af | |||
0b1aff220c | |||
cfbff77da8 | |||
673af7f097 | |||
6f5e70dce2 | |||
9b337d3077 | |||
b333ffe707 | |||
736c12a2f8 | |||
773cf59632 | |||
a3d6fa36e9 | |||
4043e30d34 | |||
0276d3dab4 | |||
1c59ff41c1 | |||
1c1af2c7c7 | |||
d74c3fc241 | |||
2b26f1b106 | |||
9e87142324 | |||
5c903d5b02 | |||
92b0b4189c | |||
8b99fbdc81 | |||
74f090833e | |||
a89ecbf6d7 | |||
5d17a1c2b3 | |||
c7a7ca9f79 | |||
3b34d70c23 | |||
45bd838a13 | |||
ba1bead5ad | |||
dbbd22960e | |||
4603329cf7 | |||
9374e9eaab | |||
b6a88ef08e | |||
fbe54e1a2b |
12
CHANGELOG.md
12
CHANGELOG.md
@ -10,6 +10,12 @@ list yields a list of all related PRs for each release.
|
||||
|
||||
# [unreleased]
|
||||
|
||||
# [v5.0.0]
|
||||
|
||||
## Changed
|
||||
|
||||
- Force flag for copy helper.
|
||||
|
||||
# [v4.1.0] 2023-06-14
|
||||
|
||||
## Added
|
||||
@ -31,6 +37,12 @@ list yields a list of all related PRs for each release.
|
||||
- Fix for PLOC power switching.
|
||||
- Bump `tmtccmd` to v5.0.0rc0 for important bugfix in CFDP header.
|
||||
|
||||
# [v3.1.2] 2023-06-19
|
||||
|
||||
## Fixed
|
||||
|
||||
- Pin `tmtccmd` to v4.1.3 to enforce correct `spacepackets` version on install
|
||||
|
||||
# [v3.1.1] 2023-04-17
|
||||
|
||||
## Added
|
||||
|
@ -1,11 +1,11 @@
|
||||
__version__ = "4.1.0"
|
||||
__version__ = "5.0.0"
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
SW_NAME = "eive-tmtc"
|
||||
VERSION_MAJOR = 4
|
||||
VERSION_MINOR = 1
|
||||
VERSION_MAJOR = 5
|
||||
VERSION_MINOR = 0
|
||||
VERSION_REVISION = 0
|
||||
|
||||
EIVE_TMTC_ROOT = Path(__file__).parent
|
||||
|
@ -70,7 +70,7 @@ class CustomServiceList(str, enum.Enum):
|
||||
TIME = "time"
|
||||
PROCEDURE = "proc"
|
||||
RTD = "rtd"
|
||||
TMP1075 = "tcs_tmp"
|
||||
TMP1075 = "tmp1075"
|
||||
TVTTESTPROCEDURE = "tvtestproc"
|
||||
SCEX = "scex"
|
||||
TM_STORE = "tm_store"
|
||||
|
@ -271,6 +271,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
14010;0x36ba;TRYING_I2C_RECOVERY;HIGH;I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C devices.;mission/sysDefs.h
|
||||
14011;0x36bb;I2C_REBOOT;HIGH;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h
|
||||
14012;0x36bc;PDEC_REBOOT;HIGH;PDEC recovery through reset was not possible, performing full reboot.;mission/sysDefs.h
|
||||
14013;0x36bd;FIRMWARE_INFO;INFO;Version information of the firmware (not OBSW). P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;mission/sysDefs.h
|
||||
14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||
14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||
14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
||||
|
|
@ -34,6 +34,7 @@ HEATER_CONTROLLER_ID = bytes([0x44, 0x41, 0x00, 0xA4])
|
||||
TMP1075_HANDLER_TCS_BRD_0_ID = bytes([0x44, 0x42, 0x00, 0x04])
|
||||
TMP1075_HANDLER_TCS_BRD_1_ID = bytes([0x44, 0x42, 0x00, 0x05])
|
||||
TMP1075_HANDLER_PLPCDU_0_ID = bytes([0x44, 0x42, 0x00, 0x06])
|
||||
TMP1075_HANDLER_PLPCDU_1_ID = bytes([0x44, 0x42, 0x00, 0x07])
|
||||
TMP1075_HANDLER_IF_BRD_ID = bytes([0x44, 0x42, 0x00, 0x08])
|
||||
|
||||
# Communication Object IDs
|
||||
|
@ -106,6 +106,7 @@ def handle_default_procedure( # noqa C901: Complexity okay here.
|
||||
"0": ("TMP1075 TCS Board 0", TMP1075_HANDLER_TCS_BRD_0_ID),
|
||||
"1": ("TMP1075 TCS Board 1", TMP1075_HANDLER_TCS_BRD_1_ID),
|
||||
"2": ("TMP1075 PL PCDU 0", TMP1075_HANDLER_PLPCDU_0_ID),
|
||||
"3": ("TMP1075 PL PCDU 1", oids.TMP1075_HANDLER_PLPCDU_1_ID),
|
||||
"4": ("TMP1075 IF Board", TMP1075_HANDLER_IF_BRD_ID),
|
||||
}
|
||||
input_helper = InputHelper(menu_dict)
|
||||
|
@ -13,6 +13,7 @@ from eive_tmtc.tmtc.payload.ploc_supervisor import handle_supv_hk_data
|
||||
from eive_tmtc.tmtc.acs.reaction_wheels import handle_rw_hk_data
|
||||
from eive_tmtc.tmtc.com.syrlinks_handler import handle_syrlinks_hk_data
|
||||
from eive_tmtc.tmtc.tcs import handle_thermal_controller_hk_data
|
||||
from eive_tmtc.tmtc.tcs.tmp1075 import handle_tmp_1075_hk_data
|
||||
from spacepackets.ecss import PusTelemetry
|
||||
from tmtccmd.tm.pus_3_fsfw_hk import (
|
||||
Service3Base,
|
||||
@ -43,6 +44,8 @@ _LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
FORWARD_SENSOR_TEMPS = False
|
||||
# TODO: Transform this into a CLI argument
|
||||
HK_OUTPUT_LEVEL = 1
|
||||
|
||||
|
||||
def handle_hk_packet(
|
||||
@ -69,13 +72,14 @@ def handle_hk_packet(
|
||||
hk_data=hk_data,
|
||||
)
|
||||
try:
|
||||
handle_regular_hk_print(
|
||||
printer=printer,
|
||||
object_id=named_obj_id,
|
||||
hk_packet=tm_packet,
|
||||
tm=tm_packet.pus_tm,
|
||||
hk_data=hk_data,
|
||||
)
|
||||
if HK_OUTPUT_LEVEL > 0:
|
||||
handle_regular_hk_print(
|
||||
printer=printer,
|
||||
object_id=named_obj_id,
|
||||
hk_packet=tm_packet,
|
||||
tm=tm_packet.pus_tm,
|
||||
hk_data=hk_data,
|
||||
)
|
||||
except ValueError as e:
|
||||
_LOGGER.exception(
|
||||
f"{e} error when parsing HK data coming from {named_obj_id}"
|
||||
@ -171,6 +175,14 @@ def handle_regular_hk_print( # noqa C901: Complexity okay here
|
||||
return handle_str_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
||||
elif objb == obj_ids.PLOC_SUPV_ID:
|
||||
return handle_supv_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
||||
elif objb in [
|
||||
obj_ids.TMP1075_HANDLER_TCS_BRD_0_ID,
|
||||
obj_ids.TMP1075_HANDLER_TCS_BRD_1_ID,
|
||||
obj_ids.TMP1075_HANDLER_IF_BRD_ID,
|
||||
obj_ids.TMP1075_HANDLER_PLPCDU_0_ID,
|
||||
obj_ids.TMP1075_HANDLER_PLPCDU_1_ID,
|
||||
]:
|
||||
return handle_tmp_1075_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
|
||||
elif objb == obj_ids.ACS_CONTROLLER:
|
||||
return handle_acs_ctrl_hk_data(
|
||||
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
|
||||
|
@ -5,3 +5,4 @@ from .time import add_time_cmds
|
||||
from .health import add_health_cmd_defs
|
||||
from .system import add_system_cmd_defs
|
||||
from .tm_store import add_persistent_tm_store_cmd_defs
|
||||
from .tcs import add_tmp_sens_cmds
|
||||
|
@ -32,6 +32,7 @@ class ActionId(enum.IntEnum):
|
||||
RESET_REBOOT_COUNTER = 6
|
||||
SWITCH_IMG_LOCK = 7
|
||||
SET_MAX_REBOOT_CNT = 8
|
||||
READ_REBOOT_MECHANISM_INFO = 9
|
||||
UPDATE_OBSW_FROM_SD_0 = 10
|
||||
UPDATE_OBSW_FROM_SD_1 = 11
|
||||
UPDATE_OBSW_FROM_TMP = 12
|
||||
@ -87,13 +88,14 @@ class OpCode:
|
||||
SWITCH_TO_SD_0 = ["switch_to_sd_0"]
|
||||
SWITCH_TO_SD_1 = ["switch_to_sd_1"]
|
||||
SWITCH_TO_BOTH_SD_CARDS = ["switch_to_both_sd_cards"]
|
||||
ENABLE_REBOOT_FILE_HANDLING = ["rbh_off"]
|
||||
DISABLE_REBOOT_FILE_HANDLING = ["rbh_on"]
|
||||
RESET_ALL_REBOOT_COUNTERS = ["rbh_reset_a"]
|
||||
RESET_REBOOT_COUNTER_00 = ["rbh_reset_00"]
|
||||
RESET_REBOOT_COUNTER_01 = ["rbh_reset_01"]
|
||||
RESET_REBOOT_COUNTER_10 = ["rbh_reset_10"]
|
||||
RESET_REBOOT_COUNTER_11 = ["rbh_reset_11"]
|
||||
READ_REBOOT_MECHANISM_INFO = "rbh_info"
|
||||
ENABLE_REBOOT_FILE_HANDLING = "rbh_off"
|
||||
DISABLE_REBOOT_FILE_HANDLING = "rbh_on"
|
||||
RESET_ALL_REBOOT_COUNTERS = "rbh_reset_a"
|
||||
RESET_REBOOT_COUNTER_00 = "rbh_reset_00"
|
||||
RESET_REBOOT_COUNTER_01 = "rbh_reset_01"
|
||||
RESET_REBOOT_COUNTER_10 = "rbh_reset_10"
|
||||
RESET_REBOOT_COUNTER_11 = "rbh_reset_11"
|
||||
SET_MAX_REBOOT_CNT = ["rbh_max_cnt"]
|
||||
|
||||
|
||||
@ -110,6 +112,7 @@ class Info:
|
||||
OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0"
|
||||
OBSW_UPDATE_FROM_SD_1 = "Update OBSW from SD Card 1"
|
||||
OBSW_UPDATE_FROM_TMP = "Update OBSW from tmp folder"
|
||||
READ_REBOOT_MECHANISM_INFO = "Read reboot mechansm information"
|
||||
SWITCH_TO_SD_0 = "Switch to SD card 0"
|
||||
SWITCH_TO_SD_1 = "Switch to SD card 1"
|
||||
SWITCH_TO_BOTH_SD_CARDS = "Switch to both SD cards with specified active card"
|
||||
@ -154,6 +157,9 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
||||
oce.add(keys=OpCode.XSC_REBOOT_1_0, info="Reboot 1 0")
|
||||
oce.add(keys=OpCode.XSC_REBOOT_1_1, info="Reboot 1 1")
|
||||
oce.add(keys=OpCode.SET_PREF_SD, info=Info.SET_PREF_SD)
|
||||
oce.add(
|
||||
keys=OpCode.READ_REBOOT_MECHANISM_INFO, info=Info.READ_REBOOT_MECHANISM_INFO
|
||||
)
|
||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
|
||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0)
|
||||
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
|
||||
@ -294,7 +300,15 @@ def pack_core_commands( # noqa C901
|
||||
chip=Chip.CHIP_1,
|
||||
copy=Copy.COPY_1_GOLD,
|
||||
)
|
||||
elif op_code in OpCode.DISABLE_REBOOT_FILE_HANDLING:
|
||||
elif op_code == OpCode.READ_REBOOT_MECHANISM_INFO:
|
||||
q.add_log_cmd(Info.READ_REBOOT_MECHANISM_INFO)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionId.READ_REBOOT_MECHANISM_INFO,
|
||||
)
|
||||
)
|
||||
elif op_code == OpCode.DISABLE_REBOOT_FILE_HANDLING:
|
||||
q.add_log_cmd("Disabling reboot file handling")
|
||||
user_data = bytearray([0])
|
||||
q.add_pus_tc(
|
||||
@ -304,7 +318,7 @@ def pack_core_commands( # noqa C901
|
||||
user_data=user_data,
|
||||
)
|
||||
)
|
||||
elif op_code in OpCode.ENABLE_REBOOT_FILE_HANDLING:
|
||||
elif op_code == OpCode.ENABLE_REBOOT_FILE_HANDLING:
|
||||
q.add_log_cmd("Enabling reboot file handling")
|
||||
user_data = bytearray([1])
|
||||
q.add_pus_tc(
|
||||
@ -314,7 +328,7 @@ def pack_core_commands( # noqa C901
|
||||
user_data=user_data,
|
||||
)
|
||||
)
|
||||
elif op_code in OpCode.RESET_ALL_REBOOT_COUNTERS:
|
||||
elif op_code == OpCode.RESET_ALL_REBOOT_COUNTERS:
|
||||
q.add_log_cmd("Resetting all reboot counters")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
@ -322,13 +336,13 @@ def pack_core_commands( # noqa C901
|
||||
action_id=ActionId.RESET_REBOOT_COUNTER,
|
||||
)
|
||||
)
|
||||
elif op_code in OpCode.RESET_REBOOT_COUNTER_00:
|
||||
elif op_code == OpCode.RESET_REBOOT_COUNTER_00:
|
||||
reset_specific_boot_counter(q, 0, 0)
|
||||
elif op_code in OpCode.RESET_REBOOT_COUNTER_01:
|
||||
elif op_code == OpCode.RESET_REBOOT_COUNTER_01:
|
||||
reset_specific_boot_counter(q, 0, 1)
|
||||
elif op_code in OpCode.RESET_REBOOT_COUNTER_10:
|
||||
elif op_code == OpCode.RESET_REBOOT_COUNTER_10:
|
||||
reset_specific_boot_counter(q, 1, 0)
|
||||
elif op_code in OpCode.RESET_REBOOT_COUNTER_11:
|
||||
elif op_code == OpCode.RESET_REBOOT_COUNTER_11:
|
||||
reset_specific_boot_counter(q, 1, 1)
|
||||
elif op_code in OpCode.OBSW_UPDATE_FROM_SD_0:
|
||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_0)
|
||||
@ -385,14 +399,17 @@ def pack_core_commands( # noqa C901
|
||||
domain_id=0,
|
||||
unique_id=ParamId.PREF_SD,
|
||||
parameter=pref_sd,
|
||||
).pack()
|
||||
)
|
||||
)
|
||||
)
|
||||
elif op_code == OpCode.CP_HELPER:
|
||||
cp_recursive = int(input("Copy recursively (0/1) ?: "))
|
||||
if cp_recursive not in [0, 1]:
|
||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||
user_data = bytearray([cp_recursive])
|
||||
cp_force = int(input("Copy with force option(0/1) ?: "))
|
||||
if cp_force not in [0, 1]:
|
||||
raise ValueError("Invalid value, only 0 or 1 allowed")
|
||||
user_data = bytearray([cp_recursive, cp_force])
|
||||
user_data.extend(packet_source_dest_path("Copy"))
|
||||
q.add_log_cmd(Info.CP_HELPER)
|
||||
q.add_pus_tc(
|
||||
@ -603,43 +620,85 @@ def handle_core_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
|
||||
def handle_core_ctrl_action_replies(
|
||||
action_id: int, pw: PrintWrapper, custom_data: bytes
|
||||
):
|
||||
if action_id == ActionId.LIST_DIR_DUMP_DIRECTLY:
|
||||
if len(custom_data) < 4:
|
||||
_LOGGER.warning("Data unexpectedly small")
|
||||
return
|
||||
seq_idx = struct.unpack("!I", custom_data[0:4])[0]
|
||||
total_chunks = struct.unpack("!I", custom_data[4:8])[0]
|
||||
compressed = custom_data[8]
|
||||
ls_cmd = custom_data[9:].split(b"\x00")[0].decode()
|
||||
# Include length of NULL termination
|
||||
file_data_offset = 9 + len(ls_cmd) + 1
|
||||
if action_id == ActionId.READ_REBOOT_MECHANISM_INFO:
|
||||
handle_reboot_mechanism_info_reply(pw, custom_data)
|
||||
elif action_id == ActionId.LIST_DIR_DUMP_DIRECTLY:
|
||||
handle_list_dir_dump_reply(pw, custom_data)
|
||||
|
||||
|
||||
def handle_reboot_mechanism_info_reply(pw: PrintWrapper, custom_data: bytes):
|
||||
pw.dlog("Received reboot mechansm information")
|
||||
fmt_str = "!BIIIIIBBBBBBBB"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
if len(custom_data) < inc_len:
|
||||
raise ValueError(f"Received custom data shorter than expected {inc_len}")
|
||||
(
|
||||
enabled,
|
||||
max_count,
|
||||
img00_count,
|
||||
img01_count,
|
||||
img10_count,
|
||||
img11_count,
|
||||
img00_lock,
|
||||
img01_lock,
|
||||
img10_lock,
|
||||
img11_lock,
|
||||
last_chip,
|
||||
last_copy,
|
||||
next_chip,
|
||||
next_copy,
|
||||
) = struct.unpack(fmt_str, custom_data[:inc_len])
|
||||
pw.dlog(f"Enabled: {enabled}")
|
||||
pw.dlog(f"Max Count: {max_count}")
|
||||
pw.dlog(f"Count 00: {img00_count}")
|
||||
pw.dlog(f"Count 01: {img01_count}")
|
||||
pw.dlog(f"Count 10: {img10_count}")
|
||||
pw.dlog(f"Count 11: {img11_count}")
|
||||
pw.dlog(f"Lock 00: {img00_lock}")
|
||||
pw.dlog(f"Lock 01: {img01_lock}")
|
||||
pw.dlog(f"Lock 10: {img10_lock}")
|
||||
pw.dlog(f"Lock 11: {img11_lock}")
|
||||
pw.dlog(f"Last Chip: {last_chip}")
|
||||
pw.dlog(f"Last Copy: {last_copy}")
|
||||
pw.dlog(f"Next Chip: {next_chip}")
|
||||
pw.dlog(f"Next Copy: {next_copy}")
|
||||
|
||||
|
||||
def handle_list_dir_dump_reply(pw: PrintWrapper, custom_data: bytes):
|
||||
if len(custom_data) < 4:
|
||||
_LOGGER.warning("Data unexpectedly small")
|
||||
return
|
||||
seq_idx = struct.unpack("!I", custom_data[0:4])[0]
|
||||
total_chunks = struct.unpack("!I", custom_data[4:8])[0]
|
||||
compressed = custom_data[8]
|
||||
ls_cmd = custom_data[9:].split(b"\x00")[0].decode()
|
||||
# Include length of NULL termination
|
||||
file_data_offset = 9 + len(ls_cmd) + 1
|
||||
pw.dlog(
|
||||
f"Received directory listing dump for ls command {ls_cmd}. "
|
||||
f"Chunk {seq_idx + 1}/{total_chunks}"
|
||||
)
|
||||
|
||||
def remove_if_exists_and_new(seq_idx_: int, path_: Path):
|
||||
if seq_idx_ == 0 and path_.exists():
|
||||
os.remove(path_)
|
||||
|
||||
if compressed:
|
||||
path = Path("dir_listing.txt.gz")
|
||||
remove_if_exists_and_new(seq_idx, path)
|
||||
pw.dlog(
|
||||
f"Received directory listing dump for ls command {ls_cmd}. "
|
||||
f"Chunk {seq_idx + 1}/{total_chunks}"
|
||||
f"Compression option: {compressed}. Dumping file into dir_listing.txt.gz"
|
||||
)
|
||||
|
||||
def remove_if_exists_and_new(seq_idx_: int, path_: Path):
|
||||
if seq_idx_ == 0 and path_.exists():
|
||||
os.remove(path_)
|
||||
|
||||
if compressed:
|
||||
path = Path("dir_listing.txt.gz")
|
||||
remove_if_exists_and_new(seq_idx, path)
|
||||
pw.dlog(
|
||||
f"Compression option: {compressed}. Dumping file into dir_listing.txt.gz"
|
||||
)
|
||||
with open(path, "ab") as listing_file:
|
||||
listing_file.write(custom_data[file_data_offset:])
|
||||
else:
|
||||
path = Path("dir_listing.txt")
|
||||
remove_if_exists_and_new(seq_idx, path)
|
||||
pw.dlog(
|
||||
f"Compression option: {compressed}. Dumping file into dir_listing.txt"
|
||||
)
|
||||
with open(path, "a") as listing_file:
|
||||
listing_file_str = custom_data[file_data_offset:].decode()
|
||||
listing_file.write(listing_file_str)
|
||||
if seq_idx + 1 == total_chunks:
|
||||
pw.dlog("Full directory listing: ")
|
||||
with open("dir_listing.txt", "r") as listing_file:
|
||||
print(listing_file.read())
|
||||
with open(path, "ab") as listing_file:
|
||||
listing_file.write(custom_data[file_data_offset:])
|
||||
else:
|
||||
path = Path("dir_listing.txt")
|
||||
remove_if_exists_and_new(seq_idx, path)
|
||||
pw.dlog(f"Compression option: {compressed}. Dumping file into dir_listing.txt")
|
||||
with open(path, "a") as listing_file:
|
||||
listing_file_str = custom_data[file_data_offset:].decode()
|
||||
listing_file.write(listing_file_str)
|
||||
if seq_idx + 1 == total_chunks:
|
||||
pw.dlog("Full directory listing: ")
|
||||
with open("dir_listing.txt", "r") as listing_file:
|
||||
print(listing_file.read())
|
||||
|
@ -41,15 +41,17 @@ class BpxHeaterModeSelect(enum.IntEnum):
|
||||
|
||||
|
||||
class BpxOpCode:
|
||||
HK = ["0", "hk"]
|
||||
OFF = ["off"]
|
||||
ON = ["on"]
|
||||
HK = "hk"
|
||||
OFF = "off"
|
||||
ON = "on"
|
||||
RST_CFG = "reset_cfg"
|
||||
SET_CFG = "set_cfg"
|
||||
RST_BOOT_CNT = ["1", "rst_boot_cnt"]
|
||||
REQUEST_CFG = ["2", "cfg"]
|
||||
REQUEST_CFG_HK = ["3", "cfg_hk"]
|
||||
REBOOT = ["4", "reboot"]
|
||||
MAN_HEATER_ON = "man_heater_on"
|
||||
MAN_HEATER_OFF = "man_heater_off"
|
||||
RST_BOOT_CNT = "rst_boot_cnt"
|
||||
REQUEST_CFG = "cfg"
|
||||
REQUEST_CFG_HK = "cfg_hk"
|
||||
REBOOT = "reboot"
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
@ -59,8 +61,10 @@ def add_bpx_cmd_definitions(defs: TmtcDefinitionWrapper):
|
||||
oce.add(keys=BpxOpCode.OFF, info="Off command")
|
||||
oce.add(keys=BpxOpCode.HK, info="Request BPX HK")
|
||||
oce.add(keys=BpxOpCode.RST_BOOT_CNT, info="Reset Boot Count")
|
||||
oce.add(keys=BpxOpCode.RST_CFG, info="Reset Config")
|
||||
oce.add(keys=BpxOpCode.RST_CFG, info="Reset Config to stored default settings")
|
||||
oce.add(keys=BpxOpCode.SET_CFG, info="Set BPX configuration")
|
||||
oce.add(keys=BpxOpCode.MAN_HEATER_ON, info="Manual heater on")
|
||||
oce.add(keys=BpxOpCode.MAN_HEATER_OFF, info="Manual heater off")
|
||||
oce.add(keys=BpxOpCode.REQUEST_CFG, info="Request Configuration Struct (Step 1)")
|
||||
oce.add(
|
||||
keys=BpxOpCode.REQUEST_CFG_HK, info="Request Configuration Struct HK (Step 2)"
|
||||
@ -74,14 +78,14 @@ def add_bpx_cmd_definitions(defs: TmtcDefinitionWrapper):
|
||||
|
||||
|
||||
@service_provider(CustomServiceList.BPX_BATTERY.value)
|
||||
def pack_bpx_commands(p: ServiceProviderParams):
|
||||
def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is okay here.
|
||||
op_code = p.op_code
|
||||
q = p.queue_helper
|
||||
if op_code in BpxOpCode.HK:
|
||||
if op_code == BpxOpCode.HK:
|
||||
q.add_log_cmd("Requesting BPX battery HK set")
|
||||
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_HK_SET)
|
||||
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
||||
if op_code in BpxOpCode.OFF:
|
||||
if op_code == BpxOpCode.OFF:
|
||||
q.add_log_cmd("Off mode")
|
||||
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.OFF, 0)
|
||||
q.add_pus_tc(
|
||||
@ -91,7 +95,7 @@ def pack_bpx_commands(p: ServiceProviderParams):
|
||||
app_data=mode_cmd,
|
||||
)
|
||||
)
|
||||
if op_code in BpxOpCode.ON:
|
||||
if op_code == BpxOpCode.ON:
|
||||
q.add_log_cmd("On mode")
|
||||
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.ON, 0)
|
||||
q.add_pus_tc(
|
||||
@ -101,7 +105,7 @@ def pack_bpx_commands(p: ServiceProviderParams):
|
||||
app_data=mode_cmd,
|
||||
)
|
||||
)
|
||||
if op_code in BpxOpCode.RST_BOOT_CNT:
|
||||
if op_code == BpxOpCode.RST_BOOT_CNT:
|
||||
q.add_log_cmd("Resetting reboot counters")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
@ -133,20 +137,39 @@ def pack_bpx_commands(p: ServiceProviderParams):
|
||||
user_data=user_data,
|
||||
)
|
||||
)
|
||||
if op_code in BpxOpCode.REQUEST_CFG:
|
||||
if op_code == BpxOpCode.REQUEST_CFG:
|
||||
q.add_log_cmd("Requesting configuration struct")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.GET_CFG)
|
||||
)
|
||||
if op_code in BpxOpCode.REQUEST_CFG_HK:
|
||||
if op_code == BpxOpCode.REQUEST_CFG_HK:
|
||||
q.add_log_cmd("Requesting configuration struct HK")
|
||||
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_CFG_SET)
|
||||
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
||||
if op_code in BpxOpCode.REBOOT:
|
||||
if op_code == BpxOpCode.REBOOT:
|
||||
q.add_log_cmd("Rebooting BPX battery")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.REBOOT)
|
||||
)
|
||||
if op_code == BpxOpCode.MAN_HEATER_ON:
|
||||
q.add_log_cmd("BPX manual heater on with seconds burntime")
|
||||
burn_time = int(input("BPX heater burn time in seconds [1-65535]: "))
|
||||
if burn_time < 1 or burn_time > 65535:
|
||||
raise ValueError("Invalid burntime, smaller than 0 or larger than 65535")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=BPX_HANDLER_ID,
|
||||
action_id=BpxActionId.MAN_HEATER_ON,
|
||||
user_data=struct.pack("!H", burn_time),
|
||||
)
|
||||
)
|
||||
if op_code == BpxOpCode.MAN_HEATER_OFF:
|
||||
q.add_log_cmd("BPX manual heater off")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=BPX_HANDLER_ID, action_id=BpxActionId.MAN_HEATER_OFF
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
HEADER_LIST = [
|
||||
|
@ -1 +1,2 @@
|
||||
from .tm import * # noqa
|
||||
from .tmp1075 import add_tmp_sens_cmds
|
||||
|
@ -13,6 +13,7 @@ from tmtccmd.tc.pus_200_fsfw_mode import Mode, create_announce_mode_recursive_co
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import (
|
||||
make_sid,
|
||||
generate_one_hk_command,
|
||||
create_enable_periodic_hk_command_with_interval,
|
||||
create_request_one_diag_command,
|
||||
)
|
||||
|
||||
@ -21,6 +22,7 @@ class OpCodeSys:
|
||||
OFF = ["off"]
|
||||
NML = ["nml"]
|
||||
REQUEST_PRIMARY_TEMP_SET = ["temp"]
|
||||
ENABLE_TEMP_SET = "enable_temp_set"
|
||||
REQUEST_DEVICE_TEMP_SET = ["temp_devs"]
|
||||
REQUEST_DEVICE_SUS_SET = ["temp_sus"]
|
||||
REQUEST_HEATER_INFO = "heater_info"
|
||||
@ -30,6 +32,7 @@ class OpCodeSys:
|
||||
class InfoSys:
|
||||
OFF = "Switch TCS subsystem OFF"
|
||||
NML = "Switch TCS subsystem NORMAL (nominal)"
|
||||
ENABLE_TEMP_SET = "Enable Primary Temperature Set"
|
||||
REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
|
||||
REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
|
||||
REQUEST_DEVICE_SUS_SET = "Request HK set of the SUS temperatures"
|
||||
@ -67,6 +70,13 @@ def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
if op_code in OpCodeSys.NML:
|
||||
q.add_log_cmd(InfoSys.NML)
|
||||
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.NORMAL, 0, q, InfoSys.OFF)
|
||||
if op_code == OpCodeSys.ENABLE_TEMP_SET:
|
||||
interval_seconds = float(input("Please specify interval in seconds: "))
|
||||
cmds = create_enable_periodic_hk_command_with_interval(
|
||||
False, make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS), interval_seconds
|
||||
)
|
||||
for cmd in cmds:
|
||||
q.add_pus_tc(cmd)
|
||||
if op_code == OpCodeSys.ANNOUNCE_MODES:
|
||||
q.add_log_cmd(InfoSys.ANNOUNCE_MODES)
|
||||
q.add_pus_tc(create_announce_mode_recursive_command(TCS_SUBSYSTEM_ID))
|
||||
@ -87,8 +97,9 @@ def add_tcs_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce.add(keys=OpCodeSys.REQUEST_DEVICE_SUS_SET, info=InfoSys.REQUEST_DEVICE_SUS_SET)
|
||||
oce.add(keys=OpCodeSys.REQUEST_HEATER_INFO, info=InfoSys.REQUEST_HEATER_INFO)
|
||||
oce.add(keys=OpCodeSys.ANNOUNCE_MODES, info=InfoSys.ANNOUNCE_MODES)
|
||||
oce.add(keys=OpCodeSys.ENABLE_TEMP_SET, info=InfoSys.ENABLE_TEMP_SET)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.TCS,
|
||||
info="TCS Board",
|
||||
info="TCS",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
|
@ -6,14 +6,17 @@
|
||||
@date 06.01.2021
|
||||
"""
|
||||
import enum
|
||||
import struct
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.config.tmtc import (
|
||||
tmtc_definitions_provider,
|
||||
TmtcDefinitionWrapper,
|
||||
OpCodeEntry,
|
||||
)
|
||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_data
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_hk_command, make_sid
|
||||
@ -76,3 +79,10 @@ def add_tmp_sens_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce.add(OpCode.NML, Info.NML)
|
||||
oce.add(OpCode.HK, Info.HK)
|
||||
defs.add_service(CustomServiceList.TMP1075.value, "TMP1075 Temperature Sensor", oce)
|
||||
|
||||
|
||||
def handle_tmp_1075_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
||||
if set_id == SetId.TEMPERATURE:
|
||||
temp = struct.unpack("!f", hk_data[0:4])[0]
|
||||
pw.dlog(f"TMP1075 Temperature: {temp}")
|
||||
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[4:], 1))
|
||||
|
Binary file not shown.
BIN
filetest/fake_10kb.bin
Normal file
BIN
filetest/fake_10kb.bin
Normal file
Binary file not shown.
BIN
filetest/fake_20kb.bin
Normal file
BIN
filetest/fake_20kb.bin
Normal file
Binary file not shown.
BIN
filetest/fake_2_5kb.bin
Normal file
BIN
filetest/fake_2_5kb.bin
Normal file
Binary file not shown.
Reference in New Issue
Block a user