Compare commits
19 Commits
dfa45dbdba
...
v7.0.0
Author | SHA1 | Date | |
---|---|---|---|
9a06c64dfa | |||
cc7837a55b | |||
9cc4fa702c | |||
ada099cab1 | |||
376f94b167 | |||
5e1b12fa52 | |||
de34952df5 | |||
5da55c3c99 | |||
3b903e5639 | |||
da35c7fdf1 | |||
8c7cbd1bd6 | |||
ba0a3e35d2 | |||
fc2667c150 | |||
f9041f215a | |||
a59aceda75 | |||
c50f8c2ce2 | |||
3700769e46 | |||
baf1b44d23 | |||
342a3bbcc9 |
@@ -10,10 +10,14 @@ list yields a list of all related PRs for each release.
|
||||
|
||||
# [unreleased]
|
||||
|
||||
# [v7.0.0] 2024-04-25
|
||||
# [v7.0.0] 2024-05-06
|
||||
|
||||
- Reworked PLOC MPSoC commanding to be inline with OBSW update.
|
||||
|
||||
## Fixed
|
||||
|
||||
- GNSS commands working again (again).
|
||||
|
||||
## Added
|
||||
|
||||
- Added handling for new clock events.
|
||||
|
@@ -135,7 +135,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/plocMpsocHelpers.h
|
||||
11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/payload/plocMpsocHelpers.h
|
||||
11607;0x2d57;SUPV_NOT_ON;LOW;SUPV not on for boot or shutdown process. P1: 0 for OFF transition, 1 for ON transition.;linux/payload/plocMpsocHelpers.h
|
||||
11608;0x2d58;SUPV_REPLY_TIMEOUT;LOW;No description;linux/payload/plocMpsocHelpers.h
|
||||
11608;0x2d58;SUPV_REPLY_TIMEOUT;LOW;SUPV reply timeout.;linux/payload/plocMpsocHelpers.h
|
||||
11609;0x2d59;CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE;LOW;Camera must be commanded on first.;linux/payload/plocMpsocHelpers.h
|
||||
11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
|
||||
11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
|
||||
11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
|
||||
|
|
@@ -227,7 +227,7 @@ def handle_acs_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: Lis
|
||||
object_id=RW4_ID, rw_idx=4, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||
)
|
||||
|
||||
if cmd_path_list[0] == "gnss_devs":
|
||||
if cmd_path_list[0] == "gnss_ctrl":
|
||||
return pack_gps_command(
|
||||
object_id=oids.GPS_CONTROLLER, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
|
@@ -23,7 +23,11 @@ class GpsInfo:
|
||||
MAX_SATELLITES = 30
|
||||
|
||||
|
||||
class GnssChip(enum.IntEnum):
|
||||
class ActIds:
|
||||
RESET_GNSS = 5
|
||||
|
||||
|
||||
class AcsBoardSides(enum.IntEnum):
|
||||
A_SIDE = 0
|
||||
B_SIDE = 1
|
||||
|
||||
@@ -37,7 +41,7 @@ class OpCode:
|
||||
REQ_SKYVIEW_HK = "skyview_hk_request"
|
||||
ENABLE_SKYVIEW_HK = "skyview_hk_enable"
|
||||
DISABLE_SKYVIEW_HK = "skyview_hk_disable"
|
||||
RESET_GNSS = "reset"
|
||||
RESET_GNSS = "reset_gnss"
|
||||
|
||||
|
||||
class Info:
|
||||
@@ -63,7 +67,7 @@ def create_gnss_node() -> CmdTreeNode:
|
||||
]
|
||||
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||
node = CmdTreeNode("gnss_devs", "GNSS Controller", hide_children_for_print=True)
|
||||
node = CmdTreeNode("gnss_ctrl", "GNSS Ctrl", hide_children_for_print=True)
|
||||
for op_code, info in combined_dict.items():
|
||||
node.add_child(CmdTreeNode(op_code, info))
|
||||
return node
|
||||
@@ -73,16 +77,17 @@ def pack_gps_command( # noqa: C901
|
||||
object_id: bytes, q: DefaultPusQueueHelper, cmd_str: str
|
||||
): # noqa: C901:
|
||||
if cmd_str == OpCode.RESET_GNSS:
|
||||
for val in GnssChip:
|
||||
for val in AcsBoardSides:
|
||||
print("{:<2}: {:<20}".format(val, val.name))
|
||||
chip: str = ""
|
||||
while chip not in ["0", "1"]:
|
||||
chip = input("Please specify which chip to reset: ")
|
||||
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
|
||||
board_side = int(input("Select Board Side \n" ""))
|
||||
q.add_log_cmd(f"GPS: {Info.RESET_GNSS}")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(object_id=object_id, action_id=5, user_data=chip.encode())
|
||||
create_action_cmd(
|
||||
object_id=object_id,
|
||||
action_id=ActIds.RESET_GNSS,
|
||||
user_data=bytearray([board_side]),
|
||||
)
|
||||
)
|
||||
_LOGGER.warning("Reset pin handling needs to be re-implemented")
|
||||
if cmd_str == OpCode.ENABLE_CORE_HK:
|
||||
interval = float(input("Please specify interval in floating point seconds: "))
|
||||
if interval <= 0:
|
||||
|
@@ -90,7 +90,7 @@ class ActionId(enum.IntEnum):
|
||||
TC_FLASH_DIR_GET_CONTENT = 28
|
||||
TM_FLASH_DIRECTORY_CONTENT = 29
|
||||
TC_FLASH_READ_FULL_FILE = 30
|
||||
TC_SIMPLEX_STORE_FILE = 31
|
||||
TC_SPLIT_FILE = 31
|
||||
TC_VERIFY_BOOT = 32
|
||||
TC_ENABLE_TC_EXECUTION = 33
|
||||
TC_FLASH_MKFS = 34
|
||||
@@ -125,7 +125,7 @@ class OpCode:
|
||||
CAM_CMD_SEND = "cam_cmd_send"
|
||||
CAM_TAKE_PIC = "cam_take_pic"
|
||||
SIMPLEX_STREAM_FILE = "simplex_stream_file"
|
||||
SIMPLEX_STORE_FILE = "simplex_store_file"
|
||||
SPLIT_FILE = "split_file"
|
||||
DOWNLINK_DATA_MODULATE = "downlink_data_modulate"
|
||||
ENABLE_PLOC_SUPV_COMMANDING_TO_ON = "enable_ploc_supv_cmd_to_on"
|
||||
DISABLE_PLOC_SUPV_COMMANDING_TO_ON = "disable_ploc_supv_cmd_to_on"
|
||||
@@ -153,7 +153,7 @@ class Info:
|
||||
CAM_TAKE_PIC = "Cam Take Picture"
|
||||
CAM_CMD_SEND = "Send Camera Command"
|
||||
SIMPLEX_STREAM_FILE = "Simplex Stream File with E-Band"
|
||||
SIMPLEX_STORE_FILE = "Simplex Store File on MPSoC"
|
||||
SPLIT_FILE = "Split file on MPSoC Flash"
|
||||
FLASH_READ_FILE = "Copy file from MPSoC to OBC"
|
||||
FLASH_WRITE_FILE = "Copy file from OBC to MPSoC"
|
||||
FLASH_DELETE_FILE = "Delete file on MPSoC"
|
||||
@@ -308,6 +308,15 @@ def pack_ploc_mpsoc_commands(
|
||||
)
|
||||
)
|
||||
|
||||
if cmd_str == OpCode.SPLIT_FILE:
|
||||
q.add_log_cmd(Info.SPLIT_FILE)
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
PLOC_MPSOC_ID,
|
||||
ActionId.TC_SPLIT_FILE,
|
||||
user_data=prepare_simplex_store_file_user_data(),
|
||||
)
|
||||
)
|
||||
if cmd_str == "17":
|
||||
q.add_log_cmd("PLOC MPSoC: Set UART TX tristate")
|
||||
data = object_id.as_bytes + struct.pack("!I", ActionId.SET_UART_TX_TRISTATE)
|
||||
@@ -322,8 +331,12 @@ def pack_ploc_mpsoc_commands(
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if cmd_str == OpCode.SIMPLEX_STREAM_FILE:
|
||||
q.add_log_cmd(Info.SIMPLEX_STREAM_FILE)
|
||||
data = prepare_simplex_stream_file_cmd(object_id.as_bytes)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
data = prepare_simplex_stream_file_user_data()
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
PLOC_MPSOC_ID, ActionId.TC_SIMPLEX_STREAM_FILE, user_data=data
|
||||
)
|
||||
)
|
||||
if cmd_str == OpCode.DOWNLINK_DATA_MODULATE:
|
||||
q.add_log_cmd("PLOC MPSoC: Downlink data modulate")
|
||||
data = prepare_downlink_data_modulate_cmd(object_id.as_bytes)
|
||||
@@ -481,10 +494,10 @@ def prepare_replay_write_sequence_cmd(object_id: bytes) -> bytearray:
|
||||
return bytearray(command)
|
||||
|
||||
|
||||
def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
||||
selection = input("Use default parameter? (Y/N): ")
|
||||
def prepare_cam_take_pic_cmd(object_id: bytes) -> bytes:
|
||||
filename = input("Specify target filename: ")
|
||||
selection = input("Use default parameter? (y/n): ")
|
||||
if selection.lower() in ["y", "1", "yes"]:
|
||||
filename = "0:/test"
|
||||
encoder_setting_y = 7
|
||||
quantization_y = 0
|
||||
encoder_setting_cb = 7
|
||||
@@ -493,7 +506,6 @@ def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
||||
quantization_cr = 0
|
||||
bypass_compressor = 0
|
||||
else:
|
||||
filename = input("Specify filename: ")
|
||||
encoder_setting_y = int(input("Specify encoderSetting_Y: "))
|
||||
quantization_y = int(input("Specify quantization_Y: "))
|
||||
encoder_setting_cb = int(input("Specify encoderSetting_Cb: "))
|
||||
@@ -504,7 +516,7 @@ def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", ActionId.TC_CAM_TAKE_PIC)
|
||||
+ bytearray(filename, "utf-8")
|
||||
+ filename.encode()
|
||||
+ bytes([0])
|
||||
+ struct.pack("!B", encoder_setting_y)
|
||||
+ struct.pack("!Q", quantization_y)
|
||||
@@ -514,30 +526,21 @@ def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
||||
+ struct.pack("!Q", quantization_cr)
|
||||
+ struct.pack("!B", bypass_compressor)
|
||||
)
|
||||
return bytearray(command)
|
||||
|
||||
|
||||
def prepare_simplex_stream_file_cmd(object_id: bytes) -> bytes:
|
||||
filename = input("Specify filename: ")
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", ActionId.TC_SIMPLEX_STREAM_FILE)
|
||||
+ bytearray(filename, "utf-8")
|
||||
+ bytes([0])
|
||||
)
|
||||
return command
|
||||
|
||||
|
||||
def prepare_simplex_store_file_cmd(object_id: bytes) -> bytes:
|
||||
def prepare_simplex_stream_file_user_data() -> bytes:
|
||||
filename = input("Specify filename: ")
|
||||
command = filename.encode() + bytes([0])
|
||||
return command
|
||||
|
||||
|
||||
def prepare_simplex_store_file_user_data() -> bytes:
|
||||
num_of_chunks = int(input("Please specify the number of chunks: "))
|
||||
assert num_of_chunks >= 0
|
||||
filename = input("Specify filename: ")
|
||||
command = (
|
||||
object_id
|
||||
+ struct.pack("!I", ActionId.TC_SIMPLEX_STORE_FILE)
|
||||
+ struct.pack("!I", num_of_chunks)
|
||||
+ bytearray(filename, "utf-8")
|
||||
+ bytes([0])
|
||||
struct.pack("!I", num_of_chunks) + bytearray(filename, "utf-8") + bytes([0])
|
||||
)
|
||||
return command
|
||||
|
||||
@@ -742,11 +745,13 @@ def handle_mpsoc_data_reply(action_id: int, pw: PrintWrapper, custom_data: bytea
|
||||
"PLOC MPSoC flash directory data shorter than minimum 16 bytes"
|
||||
)
|
||||
current_idx = 0
|
||||
dir_name_short = custom_data[current_idx : current_idx + 12].decode("utf-8")
|
||||
end_of_str = custom_data[current_idx : current_idx + 12].index(b"\x00")
|
||||
dir_name_short = custom_data[current_idx : current_idx + end_of_str].decode()
|
||||
current_idx += 12
|
||||
num_elements = struct.unpack("!I", custom_data[current_idx : current_idx + 4])[
|
||||
0
|
||||
]
|
||||
current_idx += 4
|
||||
elem_names = []
|
||||
elem_attrs = []
|
||||
elem_sizes = []
|
||||
@@ -762,9 +767,7 @@ def handle_mpsoc_data_reply(action_id: int, pw: PrintWrapper, custom_data: bytea
|
||||
# It is as weird as it looks..
|
||||
for _ in range(num_elements):
|
||||
end_of_str = custom_data[current_idx : current_idx + 12].index(b"\x00")
|
||||
elem_name = custom_data[current_idx : current_idx + end_of_str].decode(
|
||||
"utf-8"
|
||||
)
|
||||
elem_name = custom_data[current_idx : current_idx + end_of_str].decode()
|
||||
current_idx += 12
|
||||
elem_names.append(elem_name)
|
||||
for _ in range(num_elements):
|
||||
|
@@ -112,7 +112,7 @@ class SupvActionId(enum.IntEnum):
|
||||
REQUEST_ADC_REPORT = 57
|
||||
RESET_PL = 58
|
||||
ENABLE_NVMS = 59
|
||||
CONTINUE_UPDATE = 60
|
||||
RESUME_UPDATE = 60
|
||||
MEM_CHECK = 61
|
||||
|
||||
|
||||
@@ -137,7 +137,7 @@ class OpCode:
|
||||
SET_TIME_REF = "set_time_ref"
|
||||
FACTORY_FLASH = "factory_flash"
|
||||
START_UPDATE = "start_update"
|
||||
PERFORM_UPDATE = "update"
|
||||
RESUME_UPDATE = "resum_update"
|
||||
FACTORY_RESET = "factory_reset"
|
||||
MEM_CHECK = "mem_check"
|
||||
RESET_MPSOC = "reset_mpsoc"
|
||||
@@ -156,7 +156,7 @@ class Info(str, enum.Enum):
|
||||
SHUTDOWN_MPSOC = "Shutdown MPSoC"
|
||||
SET_TIME_REF = "Set time reference"
|
||||
FACTORY_FLASH = "Factory Flash Mode"
|
||||
PERFORM_UPDATE = "Start or continue MPSoC SW update at starting bytes"
|
||||
RESUME_UPDATE = "Start or continue MPSoC SW update at starting bytes"
|
||||
START_UPDATE = "Start new MPSoC SW update"
|
||||
FACTORY_RESET = "Factory Reset of loggers"
|
||||
MEM_CHECK = "Memory Check"
|
||||
@@ -331,7 +331,7 @@ def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C90
|
||||
q.add_log_cmd("PLOC Supversior: Start new MPSoC SW update")
|
||||
command = pack_update_command(object_id.as_bytes, True)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str in OpCode.PERFORM_UPDATE:
|
||||
if cmd_str in OpCode.RESUME_UPDATE:
|
||||
q.add_log_cmd("PLOC Supervisor: Perform MPSoC SW update")
|
||||
command = pack_update_command(object_id.as_bytes, False)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
@@ -370,7 +370,7 @@ def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C90
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str == "58":
|
||||
q.add_log_cmd("PLOC Supervisor: Continue update")
|
||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.CONTINUE_UPDATE)
|
||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.RESUME_UPDATE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str == OpCode.MEM_CHECK:
|
||||
custom_data = bytearray()
|
||||
@@ -650,8 +650,10 @@ def get_event_buffer_path() -> str:
|
||||
class SocState(enum.IntEnum):
|
||||
OFF = 0
|
||||
BOOTING = 1
|
||||
OPERATIONAL = 2
|
||||
SHUTDOWN = 3
|
||||
UPDATE = 2
|
||||
OPERATIONAL = 3
|
||||
RESET = 4
|
||||
FAULTY = 5
|
||||
|
||||
|
||||
def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
||||
@@ -691,7 +693,10 @@ def handle_hk_report(hk_data: bytes, pw: PrintWrapper):
|
||||
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)}")
|
||||
try:
|
||||
pw.dlog(f"SOC state {SocState(soc_state)}")
|
||||
except ValueError:
|
||||
pw.dlog(f"Invalid SOC state {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}")
|
||||
|
@@ -29,10 +29,10 @@ classifiers = [
|
||||
"Topic :: Scientific/Engineering"
|
||||
]
|
||||
dependencies = [
|
||||
"tmtccmd ~= 8.0.0rc1",
|
||||
"tmtccmd == 8.0.0rc1",
|
||||
"cfdp-py~=0.1.0",
|
||||
# "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@main",
|
||||
"python-dateutil ~= 2.8",
|
||||
# "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@main",
|
||||
"python-dateutil ~= 2.8",
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
|
Reference in New Issue
Block a user