Compare commits
29 Commits
bump-depen
...
v7.0.0
Author | SHA1 | Date | |
---|---|---|---|
9a06c64dfa | |||
cc7837a55b | |||
9cc4fa702c | |||
ada099cab1 | |||
376f94b167 | |||
5e1b12fa52 | |||
de34952df5 | |||
5da55c3c99 | |||
3b903e5639 | |||
da35c7fdf1 | |||
8c7cbd1bd6 | |||
ba0a3e35d2 | |||
fc2667c150 | |||
f9041f215a | |||
a59aceda75 | |||
c50f8c2ce2 | |||
dfa45dbdba
|
|||
36d9323b57
|
|||
e04b5bf9d7
|
|||
3700769e46 | |||
69fda96d7a
|
|||
0c51cad813
|
|||
05d5955236
|
|||
18860ec2c6
|
|||
fc5fb0eed3
|
|||
d5bb6fe6c5
|
|||
37eafb722b
|
|||
baf1b44d23 | |||
342a3bbcc9 |
@ -10,6 +10,14 @@ list yields a list of all related PRs for each release.
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
# [v7.0.0] 2024-05-06
|
||||||
|
|
||||||
|
- Reworked PLOC MPSoC commanding to be inline with OBSW update.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- GNSS commands working again (again).
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
|
||||||
- Added handling for new clock events.
|
- Added handling for new clock events.
|
||||||
|
@ -128,14 +128,15 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
|
11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
|
||||||
11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
|
11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
|
||||||
11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/SolarArrayDeploymentHandler.h
|
11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/SolarArrayDeploymentHandler.h
|
||||||
11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/PlocMpsocHandler.h
|
11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/plocMpsocHelpers.h
|
||||||
11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h
|
11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/plocMpsocHelpers.h
|
||||||
11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h
|
11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/plocMpsocHelpers.h
|
||||||
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/PlocMpsocHandler.h
|
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/plocMpsocHelpers.h
|
||||||
11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHandler.h
|
11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/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/PlocMpsocHandler.h
|
11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/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/PlocMpsocHandler.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/PlocMpsocHandler.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
|
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
|
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
|
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
|
||||||
|
|
@ -56,6 +56,7 @@
|
|||||||
0x44330015;PLOC_MPSOC_HANDLER
|
0x44330015;PLOC_MPSOC_HANDLER
|
||||||
0x44330016;PLOC_SUPERVISOR_HANDLER
|
0x44330016;PLOC_SUPERVISOR_HANDLER
|
||||||
0x44330017;PLOC_SUPERVISOR_HELPER
|
0x44330017;PLOC_SUPERVISOR_HELPER
|
||||||
|
0x44330018;PLOC_MPSOC_COMMUNICATION
|
||||||
0x44330032;SCEX
|
0x44330032;SCEX
|
||||||
0x444100A2;SOLAR_ARRAY_DEPL_HANDLER
|
0x444100A2;SOLAR_ARRAY_DEPL_HANDLER
|
||||||
0x444100A4;HEATER_HANDLER
|
0x444100A4;HEATER_HANDLER
|
||||||
|
|
@ -561,16 +561,17 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
|||||||
0x67a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
|
0x67a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
|
||||||
0x67a3;SADPL_SwitchingDeplSa1Failed;No description;163;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
|
0x67a3;SADPL_SwitchingDeplSa1Failed;No description;163;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
|
||||||
0x67a4;SADPL_SwitchingDeplSa2Failed;No description;164;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
|
0x67a4;SADPL_SwitchingDeplSa2Failed;No description;164;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
|
||||||
0x68a0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;160;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x6810;MPSOCRTVIF_CommandTimeout;Command has timed out.;16;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;161;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;160;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;162;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;161;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;163;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;162;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a4;MPSOCRTVIF_InvalidLength;Received command with invalid length;164;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;163;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;165;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a4;MPSOCRTVIF_InvalidLength;Received command with invalid length;164;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;166;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;165;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);167;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;166;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;168;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);167;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x68a9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;169;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h
|
0x68a8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;168;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
|
0x68a9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;169;MPSOC_RETURN_VALUES_IF;linux/payload/plocMpsocHelpers.h
|
||||||
0x69a0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;160;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
0x69a0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;160;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||||
0x69a1;SPVRTVIF_InvalidServiceId;No description;161;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
0x69a1;SPVRTVIF_InvalidServiceId;No description;161;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||||
0x69a2;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;162;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
0x69a2;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;162;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
|
||||||
@ -626,4 +627,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
|||||||
0x6f02;TMS_NoWriteActive;No description;2;TM_SINK;mission/tmtc/DirectTmSinkIF.h
|
0x6f02;TMS_NoWriteActive;No description;2;TM_SINK;mission/tmtc/DirectTmSinkIF.h
|
||||||
0x6f03;TMS_Timeout;No description;3;TM_SINK;mission/tmtc/DirectTmSinkIF.h
|
0x6f03;TMS_Timeout;No description;3;TM_SINK;mission/tmtc/DirectTmSinkIF.h
|
||||||
0x7000;VCS_ChannelDoesNotExist;No description;0;VIRTUAL_CHANNEL;mission/com/VirtualChannel.h
|
0x7000;VCS_ChannelDoesNotExist;No description;0;VIRTUAL_CHANNEL;mission/com/VirtualChannel.h
|
||||||
0x7200;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
|
0x7100;PLMPCOM_PacketReceived;No description;0;PLOC_MPSOC_COM;linux/payload/MpsocCommunication.h
|
||||||
|
0x7101;PLMPCOM_FaultyPacketSize;No description;1;PLOC_MPSOC_COM;linux/payload/MpsocCommunication.h
|
||||||
|
0x7102;PLMPCOM_CrcCheckFailed;No description;2;PLOC_MPSOC_COM;linux/payload/MpsocCommunication.h
|
||||||
|
0x7300;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
import logging
|
import logging
|
||||||
from typing import List, cast
|
from typing import List, cast
|
||||||
|
|
||||||
from tmtccmd import TreeCommandingProcedure
|
from tmtccmd import DefaultProcedureInfo
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from tmtccmd.util import ObjectIdU32
|
from tmtccmd.util import ObjectIdU32
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ from eive_tmtc.utility.input_helper import InputHelper
|
|||||||
|
|
||||||
|
|
||||||
def handle_pus_procedure(
|
def handle_pus_procedure(
|
||||||
info: TreeCommandingProcedure,
|
info: DefaultProcedureInfo,
|
||||||
queue_helper: DefaultPusQueueHelper,
|
queue_helper: DefaultPusQueueHelper,
|
||||||
):
|
):
|
||||||
cmd_path = info.cmd_path
|
cmd_path = info.cmd_path
|
||||||
@ -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]
|
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(
|
return pack_gps_command(
|
||||||
object_id=oids.GPS_CONTROLLER, q=queue_helper, cmd_str=cmd_path_list[1]
|
object_id=oids.GPS_CONTROLLER, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||||
)
|
)
|
||||||
|
@ -23,7 +23,11 @@ class GpsInfo:
|
|||||||
MAX_SATELLITES = 30
|
MAX_SATELLITES = 30
|
||||||
|
|
||||||
|
|
||||||
class GnssChip(enum.IntEnum):
|
class ActIds:
|
||||||
|
RESET_GNSS = 5
|
||||||
|
|
||||||
|
|
||||||
|
class AcsBoardSides(enum.IntEnum):
|
||||||
A_SIDE = 0
|
A_SIDE = 0
|
||||||
B_SIDE = 1
|
B_SIDE = 1
|
||||||
|
|
||||||
@ -37,7 +41,7 @@ class OpCode:
|
|||||||
REQ_SKYVIEW_HK = "skyview_hk_request"
|
REQ_SKYVIEW_HK = "skyview_hk_request"
|
||||||
ENABLE_SKYVIEW_HK = "skyview_hk_enable"
|
ENABLE_SKYVIEW_HK = "skyview_hk_enable"
|
||||||
DISABLE_SKYVIEW_HK = "skyview_hk_disable"
|
DISABLE_SKYVIEW_HK = "skyview_hk_disable"
|
||||||
RESET_GNSS = "reset"
|
RESET_GNSS = "reset_gnss"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
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("__")]
|
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||||
combined_dict = dict(zip(op_code_strs, info_strs))
|
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():
|
for op_code, info in combined_dict.items():
|
||||||
node.add_child(CmdTreeNode(op_code, info))
|
node.add_child(CmdTreeNode(op_code, info))
|
||||||
return node
|
return node
|
||||||
@ -73,16 +77,17 @@ def pack_gps_command( # noqa: C901
|
|||||||
object_id: bytes, q: DefaultPusQueueHelper, cmd_str: str
|
object_id: bytes, q: DefaultPusQueueHelper, cmd_str: str
|
||||||
): # noqa: C901:
|
): # noqa: C901:
|
||||||
if cmd_str == OpCode.RESET_GNSS:
|
if cmd_str == OpCode.RESET_GNSS:
|
||||||
for val in GnssChip:
|
for val in AcsBoardSides:
|
||||||
print("{:<2}: {:<20}".format(val, val.name))
|
print("{:<2}: {:<20}".format(val, val.name))
|
||||||
chip: str = ""
|
board_side = int(input("Select Board Side \n" ""))
|
||||||
while chip not in ["0", "1"]:
|
q.add_log_cmd(f"GPS: {Info.RESET_GNSS}")
|
||||||
chip = input("Please specify which chip to reset: ")
|
|
||||||
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
|
|
||||||
q.add_pus_tc(
|
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:
|
if cmd_str == 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:
|
||||||
|
@ -11,19 +11,15 @@ import logging
|
|||||||
import struct
|
import struct
|
||||||
import enum
|
import enum
|
||||||
|
|
||||||
from eive_tmtc.config.definitions import CustomServiceList
|
|
||||||
from eive_tmtc.config.object_ids import get_object_ids, PLOC_MPSOC_ID
|
from eive_tmtc.config.object_ids import get_object_ids, PLOC_MPSOC_ID
|
||||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||||
from tmtccmd.config.tmtc import (
|
from tmtccmd.config.tmtc import (
|
||||||
CmdTreeNode,
|
CmdTreeNode,
|
||||||
tmtc_definitions_provider,
|
|
||||||
OpCodeEntry,
|
|
||||||
TmtcDefinitionWrapper,
|
|
||||||
)
|
)
|
||||||
from spacepackets.ecss.tc import PusTelecommand
|
from spacepackets.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||||
from eive_tmtc.utility.input_helper import InputHelper
|
from eive_tmtc.utility.input_helper import InputHelper
|
||||||
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode
|
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode, create_mode_command
|
||||||
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd, create_scalar_u8_parameter
|
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd, create_scalar_u8_parameter
|
||||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||||
|
|
||||||
@ -31,6 +27,8 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
MANUAL_INPUT = "1"
|
MANUAL_INPUT = "1"
|
||||||
|
|
||||||
|
CRIT_CMD_APID_DICT = {"1": ("flash_mkfs", 0x12A)}
|
||||||
|
|
||||||
OBC_WRITE_FILE_DICT = {
|
OBC_WRITE_FILE_DICT = {
|
||||||
MANUAL_INPUT: ("manual input", ""),
|
MANUAL_INPUT: ("manual input", ""),
|
||||||
"2": ("/mnt/sd0/ploc/mpsoc/flash_write.bin", "/mnt/sd0/ploc/mpsoc/flash_write.bin"),
|
"2": ("/mnt/sd0/ploc/mpsoc/flash_write.bin", "/mnt/sd0/ploc/mpsoc/flash_write.bin"),
|
||||||
@ -86,12 +84,22 @@ class ActionId(enum.IntEnum):
|
|||||||
SET_UART_TX_TRISTATE = 20
|
SET_UART_TX_TRISTATE = 20
|
||||||
RELEASE_UART_TX = 21
|
RELEASE_UART_TX = 21
|
||||||
TC_CAM_TAKE_PIC = 22
|
TC_CAM_TAKE_PIC = 22
|
||||||
TC_SIMPLEX_SEND_FILE = 23
|
TC_SIMPLEX_STREAM_FILE = 23
|
||||||
TC_DOWNLINK_DATA_MODULATE = 24
|
TC_DOWNLINK_DATA_MODULATE = 24
|
||||||
TC_MODE_SNAPSHOT = 25
|
TC_MODE_SNAPSHOT = 25
|
||||||
TC_FLASH_DIR_GET_CONTENT = 28
|
TC_FLASH_DIR_GET_CONTENT = 28
|
||||||
TM_FLASH_DIRECTORY_CONTENT = 29
|
TM_FLASH_DIRECTORY_CONTENT = 29
|
||||||
TC_FLASH_READ_FULL_FILE = 30
|
TC_FLASH_READ_FULL_FILE = 30
|
||||||
|
TC_SPLIT_FILE = 31
|
||||||
|
TC_VERIFY_BOOT = 32
|
||||||
|
TC_ENABLE_TC_EXECUTION = 33
|
||||||
|
TC_FLASH_MKFS = 34
|
||||||
|
|
||||||
|
|
||||||
|
class Submode(enum.IntEnum):
|
||||||
|
IDLE_OR_NONE = 0
|
||||||
|
REPLAY = 1
|
||||||
|
SNAPSHOT = 2
|
||||||
|
|
||||||
|
|
||||||
class ParamId(enum.IntEnum):
|
class ParamId(enum.IntEnum):
|
||||||
@ -103,8 +111,6 @@ class OpCode:
|
|||||||
OFF = "off"
|
OFF = "off"
|
||||||
NORMAL = "normal"
|
NORMAL = "normal"
|
||||||
VERIFY_BOOT = "verify_boot"
|
VERIFY_BOOT = "verify_boot"
|
||||||
MODE_REPLAY = "mode_replay"
|
|
||||||
MODE_IDLE = "mode_idle"
|
|
||||||
REPLAY_WRITE_SEQ = "replay_write"
|
REPLAY_WRITE_SEQ = "replay_write"
|
||||||
DOWNLINK_PWR_ON = "downlink_pwr_on"
|
DOWNLINK_PWR_ON = "downlink_pwr_on"
|
||||||
MEM_WRITE = "memory_write"
|
MEM_WRITE = "memory_write"
|
||||||
@ -116,12 +122,18 @@ class OpCode:
|
|||||||
FLASH_GET_DIR_CONTENT = "flash_get_dir_content"
|
FLASH_GET_DIR_CONTENT = "flash_get_dir_content"
|
||||||
REPLAY_STOP = "replay_stop"
|
REPLAY_STOP = "replay_stop"
|
||||||
REPLAY_START = "replay_start"
|
REPLAY_START = "replay_start"
|
||||||
|
CAM_CMD_SEND = "cam_cmd_send"
|
||||||
CAM_TAKE_PIC = "cam_take_pic"
|
CAM_TAKE_PIC = "cam_take_pic"
|
||||||
SIMPLEX_SEND_FILE = "simplex_send_file"
|
SIMPLEX_STREAM_FILE = "simplex_stream_file"
|
||||||
|
SPLIT_FILE = "split_file"
|
||||||
DOWNLINK_DATA_MODULATE = "downlink_data_modulate"
|
DOWNLINK_DATA_MODULATE = "downlink_data_modulate"
|
||||||
MODE_SNAPSHOT = "mode_snapshot"
|
|
||||||
ENABLE_PLOC_SUPV_COMMANDING_TO_ON = "enable_ploc_supv_cmd_to_on"
|
ENABLE_PLOC_SUPV_COMMANDING_TO_ON = "enable_ploc_supv_cmd_to_on"
|
||||||
DISABLE_PLOC_SUPV_COMMANDING_TO_ON = "disable_ploc_supv_cmd_to_on"
|
DISABLE_PLOC_SUPV_COMMANDING_TO_ON = "disable_ploc_supv_cmd_to_on"
|
||||||
|
MODE_IDLE = "mode_idle"
|
||||||
|
MODE_REPLAY = "mode_replay"
|
||||||
|
MODE_SNAPSHOT = "mode_snapshot"
|
||||||
|
ENABLE_TC_EXECUTION = "enable_tc_exec"
|
||||||
|
FLASH_MKFS = "flash_mkfs"
|
||||||
|
|
||||||
|
|
||||||
class Info:
|
class Info:
|
||||||
@ -139,7 +151,9 @@ class Info:
|
|||||||
MEM_READ = "Read from Memory"
|
MEM_READ = "Read from Memory"
|
||||||
REPLAY_START = "Replay Start"
|
REPLAY_START = "Replay Start"
|
||||||
CAM_TAKE_PIC = "Cam Take Picture"
|
CAM_TAKE_PIC = "Cam Take Picture"
|
||||||
SIMPLEX_SEND_FILE = "Simplex Send File"
|
CAM_CMD_SEND = "Send Camera Command"
|
||||||
|
SIMPLEX_STREAM_FILE = "Simplex Stream File with E-Band"
|
||||||
|
SPLIT_FILE = "Split file on MPSoC Flash"
|
||||||
FLASH_READ_FILE = "Copy file from MPSoC to OBC"
|
FLASH_READ_FILE = "Copy file from MPSoC to OBC"
|
||||||
FLASH_WRITE_FILE = "Copy file from OBC to MPSoC"
|
FLASH_WRITE_FILE = "Copy file from OBC to MPSoC"
|
||||||
FLASH_DELETE_FILE = "Delete file on MPSoC"
|
FLASH_DELETE_FILE = "Delete file on MPSoC"
|
||||||
@ -150,6 +164,8 @@ class Info:
|
|||||||
DISABLE_PLOC_SUPV_COMMANDING_TO_ON = (
|
DISABLE_PLOC_SUPV_COMMANDING_TO_ON = (
|
||||||
"Disable PLOC SUPV commanding when switching ON"
|
"Disable PLOC SUPV commanding when switching ON"
|
||||||
)
|
)
|
||||||
|
ENABLE_TC_EXECUTION = "Enable execution of critical commands"
|
||||||
|
FLASH_MKFS = "Flash MKFS command"
|
||||||
|
|
||||||
|
|
||||||
class MemAddresses(enum.IntEnum):
|
class MemAddresses(enum.IntEnum):
|
||||||
@ -168,45 +184,6 @@ def create_ploc_mpsoc_node() -> CmdTreeNode:
|
|||||||
return node
|
return node
|
||||||
|
|
||||||
|
|
||||||
# Legacy command definitions.
|
|
||||||
@tmtc_definitions_provider
|
|
||||||
def add_ploc_mpsoc_cmds(defs: TmtcDefinitionWrapper):
|
|
||||||
oce = OpCodeEntry()
|
|
||||||
oce.add(OpCode.OFF, Info.OFF)
|
|
||||||
oce.add(OpCode.ON, Info.ON)
|
|
||||||
oce.add(OpCode.NORMAL, Info.NORMAL)
|
|
||||||
oce.add(OpCode.MEM_WRITE, "Ploc MPSoC: Memory write")
|
|
||||||
oce.add(OpCode.MEM_READ, "Ploc MPSoC: Memory read")
|
|
||||||
oce.add(OpCode.FLASH_WRITE_FILE, Info.FLASH_WRITE_FILE)
|
|
||||||
oce.add(OpCode.FLASH_READ_FILE, Info.FLASH_READ_FILE)
|
|
||||||
oce.add(OpCode.FLASH_DELETE_FILE, Info.FLASH_DELETE_FILE)
|
|
||||||
oce.add(OpCode.FLASH_GET_DIR_CONTENT, Info.FLASH_GET_DIR_CONTENT)
|
|
||||||
oce.add(OpCode.REPLAY_START, Info.REPLAY_START)
|
|
||||||
oce.add(OpCode.REPLAY_STOP, Info.REPLAY_STOP)
|
|
||||||
oce.add(OpCode.DOWNLINK_PWR_ON, Info.DOWNLINK_PWR_ON)
|
|
||||||
oce.add(OpCode.DOWNLINK_PWR_OFF, Info.DOWNLINK_PWR_OFF)
|
|
||||||
oce.add(OpCode.REPLAY_WRITE_SEQ, Info.REPLAY_WRITE_SEQ)
|
|
||||||
oce.add("12", "Ploc MPSoC: OBSW reset sequence count")
|
|
||||||
oce.add(OpCode.VERIFY_BOOT, Info.VERIFY_BOOT)
|
|
||||||
oce.add(OpCode.MODE_REPLAY, Info.MODE_REPLAY)
|
|
||||||
oce.add(OpCode.MODE_IDLE, Info.MODE_IDLE)
|
|
||||||
oce.add("16", "Ploc MPSoC: Tc cam command send")
|
|
||||||
oce.add("17", "Ploc MPSoC: Set UART TX tristate")
|
|
||||||
oce.add("18", "Ploc MPSoC: Relesase UART TX")
|
|
||||||
oce.add(OpCode.CAM_TAKE_PIC, Info.CAM_TAKE_PIC)
|
|
||||||
oce.add(OpCode.SIMPLEX_SEND_FILE, Info.SIMPLEX_SEND_FILE)
|
|
||||||
oce.add(OpCode.DOWNLINK_DATA_MODULATE, Info.DOWNLINK_DATA_MODULATE)
|
|
||||||
oce.add(OpCode.MODE_SNAPSHOT, Info.MODE_SNAPSHOT)
|
|
||||||
oce.add(
|
|
||||||
OpCode.ENABLE_PLOC_SUPV_COMMANDING_TO_ON, Info.ENABLE_PLOC_SUPV_COMMANDING_TO_ON
|
|
||||||
)
|
|
||||||
oce.add(
|
|
||||||
OpCode.DISABLE_PLOC_SUPV_COMMANDING_TO_ON,
|
|
||||||
Info.DISABLE_PLOC_SUPV_COMMANDING_TO_ON,
|
|
||||||
)
|
|
||||||
defs.add_service(CustomServiceList.PLOC_MPSOC.value, "Ploc MPSoC", oce)
|
|
||||||
|
|
||||||
|
|
||||||
def pack_ploc_mpsoc_commands(
|
def pack_ploc_mpsoc_commands(
|
||||||
q: DefaultPusQueueHelper, cmd_str: str
|
q: DefaultPusQueueHelper, cmd_str: str
|
||||||
): # noqa C901: Complexity okay here.
|
): # noqa C901: Complexity okay here.
|
||||||
@ -290,25 +267,11 @@ def pack_ploc_mpsoc_commands(
|
|||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.OBSW_RESET_SEQ_COUNT)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.OBSW_RESET_SEQ_COUNT)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if cmd_str == OpCode.VERIFY_BOOT:
|
if cmd_str == OpCode.VERIFY_BOOT:
|
||||||
num_words = 1
|
|
||||||
q.add_log_cmd(f"{prefix} {Info.VERIFY_BOOT}")
|
q.add_log_cmd(f"{prefix} {Info.VERIFY_BOOT}")
|
||||||
data = (
|
app_data = object_id.as_bytes + struct.pack("!I", ActionId.TC_VERIFY_BOOT)
|
||||||
object_id.as_bytes
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=app_data))
|
||||||
+ struct.pack("!I", ActionId.TC_MEM_READ)
|
if cmd_str == OpCode.CAM_CMD_SEND:
|
||||||
+ struct.pack("!I", MemAddresses.DEADBEEF)
|
q.add_log_cmd(Info.CAM_CMD_SEND)
|
||||||
+ struct.pack("!H", num_words)
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
|
||||||
if cmd_str == OpCode.MODE_REPLAY:
|
|
||||||
q.add_log_cmd("PLOC MPSoC: Tc mode replay")
|
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_REPLAY)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
|
||||||
if cmd_str == OpCode.MODE_IDLE:
|
|
||||||
q.add_log_cmd("PLOC MPSoC: Tc mode idle")
|
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_IDLE)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
|
||||||
if cmd_str == "16":
|
|
||||||
q.add_log_cmd("PLOC MPSoC: Tc cam command send")
|
|
||||||
cam_cmd = input("Specify cam command string: ")
|
cam_cmd = input("Specify cam command string: ")
|
||||||
data = (
|
data = (
|
||||||
object_id.as_bytes
|
object_id.as_bytes
|
||||||
@ -316,6 +279,44 @@ def pack_ploc_mpsoc_commands(
|
|||||||
+ bytearray(cam_cmd, "utf-8")
|
+ bytearray(cam_cmd, "utf-8")
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
|
if cmd_str == OpCode.ENABLE_TC_EXECUTION:
|
||||||
|
q.add_log_cmd(Info.ENABLE_TC_EXECUTION)
|
||||||
|
while True:
|
||||||
|
for key, val in CRIT_CMD_APID_DICT.items():
|
||||||
|
print(f"{key}: {val[0]} with APID {val[1]}")
|
||||||
|
key = input("Please specify the command to enable by key: ")
|
||||||
|
if key not in CRIT_CMD_APID_DICT:
|
||||||
|
print("invalid key")
|
||||||
|
continue
|
||||||
|
apid = CRIT_CMD_APID_DICT[key][1]
|
||||||
|
break
|
||||||
|
app_data = struct.pack("!H", apid)
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_action_cmd(PLOC_MPSOC_ID, ActionId.TC_ENABLE_TC_EXECUTION, app_data)
|
||||||
|
)
|
||||||
|
if cmd_str == OpCode.FLASH_MKFS:
|
||||||
|
q.add_log_cmd(Info.FLASH_MKFS)
|
||||||
|
while True:
|
||||||
|
flash_select = int(input("Please select the flash ID (0 or 1): "))
|
||||||
|
if flash_select != 0 and flash_select != 1:
|
||||||
|
_LOGGER.warn("invalid flash select")
|
||||||
|
continue
|
||||||
|
break
|
||||||
|
q.add_pus_tc(
|
||||||
|
create_action_cmd(
|
||||||
|
PLOC_MPSOC_ID, ActionId.TC_FLASH_MKFS, bytes([flash_select])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
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":
|
if cmd_str == "17":
|
||||||
q.add_log_cmd("PLOC MPSoC: Set UART TX tristate")
|
q.add_log_cmd("PLOC MPSoC: Set UART TX tristate")
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.SET_UART_TX_TRISTATE)
|
data = object_id.as_bytes + struct.pack("!I", ActionId.SET_UART_TX_TRISTATE)
|
||||||
@ -328,18 +329,30 @@ def pack_ploc_mpsoc_commands(
|
|||||||
q.add_log_cmd("PLOC MPSoC: Cam take picture")
|
q.add_log_cmd("PLOC MPSoC: Cam take picture")
|
||||||
data = prepare_cam_take_pic_cmd(object_id.as_bytes)
|
data = prepare_cam_take_pic_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if cmd_str == OpCode.SIMPLEX_SEND_FILE:
|
if cmd_str == OpCode.SIMPLEX_STREAM_FILE:
|
||||||
q.add_log_cmd("PLOC MPSoC: Simplex send file")
|
q.add_log_cmd(Info.SIMPLEX_STREAM_FILE)
|
||||||
data = prepare_simplex_send_file_cmd(object_id.as_bytes)
|
data = prepare_simplex_stream_file_user_data()
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=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:
|
if cmd_str == OpCode.DOWNLINK_DATA_MODULATE:
|
||||||
q.add_log_cmd("PLOC MPSoC: Downlink data modulate")
|
q.add_log_cmd("PLOC MPSoC: Downlink data modulate")
|
||||||
data = prepare_downlink_data_modulate_cmd(object_id.as_bytes)
|
data = prepare_downlink_data_modulate_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||||
if cmd_str == OpCode.MODE_SNAPSHOT:
|
if cmd_str == OpCode.MODE_SNAPSHOT:
|
||||||
q.add_log_cmd("PLOC MPSoC: Mode snapshot")
|
q.add_log_cmd(Info.MODE_SNAPSHOT)
|
||||||
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_SNAPSHOT)
|
mode = prompt_mode_for_submode_change()
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
q.add_pus_tc(create_mode_command(PLOC_MPSOC_ID, mode, Submode.SNAPSHOT))
|
||||||
|
if cmd_str == OpCode.MODE_IDLE:
|
||||||
|
q.add_log_cmd(Info.MODE_IDLE)
|
||||||
|
mode = prompt_mode_for_submode_change()
|
||||||
|
q.add_pus_tc(create_mode_command(PLOC_MPSOC_ID, mode, Submode.IDLE_OR_NONE))
|
||||||
|
if cmd_str == OpCode.MODE_REPLAY:
|
||||||
|
q.add_log_cmd(Info.MODE_REPLAY)
|
||||||
|
mode = prompt_mode_for_submode_change()
|
||||||
|
q.add_pus_tc(create_mode_command(PLOC_MPSOC_ID, mode, Submode.REPLAY))
|
||||||
if cmd_str == OpCode.ENABLE_PLOC_SUPV_COMMANDING_TO_ON:
|
if cmd_str == OpCode.ENABLE_PLOC_SUPV_COMMANDING_TO_ON:
|
||||||
q.add_log_cmd(Info.ENABLE_PLOC_SUPV_COMMANDING_TO_ON)
|
q.add_log_cmd(Info.ENABLE_PLOC_SUPV_COMMANDING_TO_ON)
|
||||||
q.add_pus_tc(
|
q.add_pus_tc(
|
||||||
@ -360,6 +373,20 @@ def pack_ploc_mpsoc_commands(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def prompt_mode_for_submode_change() -> int:
|
||||||
|
while True:
|
||||||
|
mode = input("Please specify primary mode [0: ON, 1: NORMAL]: ")
|
||||||
|
if mode == "0":
|
||||||
|
mode = Mode.ON
|
||||||
|
elif mode == "1":
|
||||||
|
mode = Mode.NORMAL
|
||||||
|
else:
|
||||||
|
print("Invalid mode")
|
||||||
|
continue
|
||||||
|
break
|
||||||
|
return mode
|
||||||
|
|
||||||
|
|
||||||
def generate_write_mem_command(
|
def generate_write_mem_command(
|
||||||
object_id: bytes, memory_address: int, memory_data: int, mem_len: int
|
object_id: bytes, memory_address: int, memory_data: int, mem_len: int
|
||||||
) -> bytearray:
|
) -> bytearray:
|
||||||
@ -467,10 +494,10 @@ def prepare_replay_write_sequence_cmd(object_id: bytes) -> bytearray:
|
|||||||
return bytearray(command)
|
return bytearray(command)
|
||||||
|
|
||||||
|
|
||||||
def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
def prepare_cam_take_pic_cmd(object_id: bytes) -> bytes:
|
||||||
selection = input("Use default parameter? (Y/N): ")
|
filename = input("Specify target filename: ")
|
||||||
|
selection = input("Use default parameter? (y/n): ")
|
||||||
if selection.lower() in ["y", "1", "yes"]:
|
if selection.lower() in ["y", "1", "yes"]:
|
||||||
filename = "0:/test"
|
|
||||||
encoder_setting_y = 7
|
encoder_setting_y = 7
|
||||||
quantization_y = 0
|
quantization_y = 0
|
||||||
encoder_setting_cb = 7
|
encoder_setting_cb = 7
|
||||||
@ -479,7 +506,6 @@ def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
|||||||
quantization_cr = 0
|
quantization_cr = 0
|
||||||
bypass_compressor = 0
|
bypass_compressor = 0
|
||||||
else:
|
else:
|
||||||
filename = input("Specify filename: ")
|
|
||||||
encoder_setting_y = int(input("Specify encoderSetting_Y: "))
|
encoder_setting_y = int(input("Specify encoderSetting_Y: "))
|
||||||
quantization_y = int(input("Specify quantization_Y: "))
|
quantization_y = int(input("Specify quantization_Y: "))
|
||||||
encoder_setting_cb = int(input("Specify encoderSetting_Cb: "))
|
encoder_setting_cb = int(input("Specify encoderSetting_Cb: "))
|
||||||
@ -490,7 +516,7 @@ def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
|||||||
command = (
|
command = (
|
||||||
object_id
|
object_id
|
||||||
+ struct.pack("!I", ActionId.TC_CAM_TAKE_PIC)
|
+ struct.pack("!I", ActionId.TC_CAM_TAKE_PIC)
|
||||||
+ bytearray(filename, "utf-8")
|
+ filename.encode()
|
||||||
+ bytes([0])
|
+ bytes([0])
|
||||||
+ struct.pack("!B", encoder_setting_y)
|
+ struct.pack("!B", encoder_setting_y)
|
||||||
+ struct.pack("!Q", quantization_y)
|
+ struct.pack("!Q", quantization_y)
|
||||||
@ -500,18 +526,23 @@ def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
|
|||||||
+ struct.pack("!Q", quantization_cr)
|
+ struct.pack("!Q", quantization_cr)
|
||||||
+ struct.pack("!B", bypass_compressor)
|
+ struct.pack("!B", bypass_compressor)
|
||||||
)
|
)
|
||||||
return bytearray(command)
|
return command
|
||||||
|
|
||||||
|
|
||||||
def prepare_simplex_send_file_cmd(object_id: bytes) -> bytearray:
|
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: ")
|
filename = input("Specify filename: ")
|
||||||
command = (
|
command = (
|
||||||
object_id
|
struct.pack("!I", num_of_chunks) + bytearray(filename, "utf-8") + bytes([0])
|
||||||
+ struct.pack("!I", ActionId.TC_SIMPLEX_SEND_FILE)
|
|
||||||
+ bytearray(filename, "utf-8")
|
|
||||||
+ bytes([0])
|
|
||||||
)
|
)
|
||||||
return bytearray(command)
|
return command
|
||||||
|
|
||||||
|
|
||||||
def prepare_downlink_data_modulate_cmd(object_id: bytes) -> bytearray:
|
def prepare_downlink_data_modulate_cmd(object_id: bytes) -> bytearray:
|
||||||
@ -714,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"
|
"PLOC MPSoC flash directory data shorter than minimum 16 bytes"
|
||||||
)
|
)
|
||||||
current_idx = 0
|
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
|
current_idx += 12
|
||||||
num_elements = struct.unpack("!I", custom_data[current_idx : current_idx + 4])[
|
num_elements = struct.unpack("!I", custom_data[current_idx : current_idx + 4])[
|
||||||
0
|
0
|
||||||
]
|
]
|
||||||
|
current_idx += 4
|
||||||
elem_names = []
|
elem_names = []
|
||||||
elem_attrs = []
|
elem_attrs = []
|
||||||
elem_sizes = []
|
elem_sizes = []
|
||||||
@ -734,9 +767,7 @@ def handle_mpsoc_data_reply(action_id: int, pw: PrintWrapper, custom_data: bytea
|
|||||||
# It is as weird as it looks..
|
# It is as weird as it looks..
|
||||||
for _ in range(num_elements):
|
for _ in range(num_elements):
|
||||||
end_of_str = custom_data[current_idx : current_idx + 12].index(b"\x00")
|
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(
|
elem_name = custom_data[current_idx : current_idx + end_of_str].decode()
|
||||||
"utf-8"
|
|
||||||
)
|
|
||||||
current_idx += 12
|
current_idx += 12
|
||||||
elem_names.append(elem_name)
|
elem_names.append(elem_name)
|
||||||
for _ in range(num_elements):
|
for _ in range(num_elements):
|
||||||
|
@ -112,7 +112,7 @@ class SupvActionId(enum.IntEnum):
|
|||||||
REQUEST_ADC_REPORT = 57
|
REQUEST_ADC_REPORT = 57
|
||||||
RESET_PL = 58
|
RESET_PL = 58
|
||||||
ENABLE_NVMS = 59
|
ENABLE_NVMS = 59
|
||||||
CONTINUE_UPDATE = 60
|
RESUME_UPDATE = 60
|
||||||
MEM_CHECK = 61
|
MEM_CHECK = 61
|
||||||
|
|
||||||
|
|
||||||
@ -137,7 +137,7 @@ class OpCode:
|
|||||||
SET_TIME_REF = "set_time_ref"
|
SET_TIME_REF = "set_time_ref"
|
||||||
FACTORY_FLASH = "factory_flash"
|
FACTORY_FLASH = "factory_flash"
|
||||||
START_UPDATE = "start_update"
|
START_UPDATE = "start_update"
|
||||||
PERFORM_UPDATE = "update"
|
RESUME_UPDATE = "resum_update"
|
||||||
FACTORY_RESET = "factory_reset"
|
FACTORY_RESET = "factory_reset"
|
||||||
MEM_CHECK = "mem_check"
|
MEM_CHECK = "mem_check"
|
||||||
RESET_MPSOC = "reset_mpsoc"
|
RESET_MPSOC = "reset_mpsoc"
|
||||||
@ -156,7 +156,7 @@ class Info(str, enum.Enum):
|
|||||||
SHUTDOWN_MPSOC = "Shutdown MPSoC"
|
SHUTDOWN_MPSOC = "Shutdown MPSoC"
|
||||||
SET_TIME_REF = "Set time reference"
|
SET_TIME_REF = "Set time reference"
|
||||||
FACTORY_FLASH = "Factory Flash Mode"
|
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"
|
START_UPDATE = "Start new MPSoC SW update"
|
||||||
FACTORY_RESET = "Factory Reset of loggers"
|
FACTORY_RESET = "Factory Reset of loggers"
|
||||||
MEM_CHECK = "Memory Check"
|
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")
|
q.add_log_cmd("PLOC Supversior: Start new MPSoC SW update")
|
||||||
command = pack_update_command(object_id.as_bytes, True)
|
command = pack_update_command(object_id.as_bytes, True)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
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")
|
q.add_log_cmd("PLOC Supervisor: Perform MPSoC SW update")
|
||||||
command = pack_update_command(object_id.as_bytes, False)
|
command = pack_update_command(object_id.as_bytes, False)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
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))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if cmd_str == "58":
|
if cmd_str == "58":
|
||||||
q.add_log_cmd("PLOC Supervisor: Continue update")
|
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))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if cmd_str == OpCode.MEM_CHECK:
|
if cmd_str == OpCode.MEM_CHECK:
|
||||||
custom_data = bytearray()
|
custom_data = bytearray()
|
||||||
@ -650,8 +650,10 @@ def get_event_buffer_path() -> str:
|
|||||||
class SocState(enum.IntEnum):
|
class SocState(enum.IntEnum):
|
||||||
OFF = 0
|
OFF = 0
|
||||||
BOOTING = 1
|
BOOTING = 1
|
||||||
OPERATIONAL = 2
|
UPDATE = 2
|
||||||
SHUTDOWN = 3
|
OPERATIONAL = 3
|
||||||
|
RESET = 4
|
||||||
|
FAULTY = 5
|
||||||
|
|
||||||
|
|
||||||
def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
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"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"Uptime {uptime} | CPU Load {cpu_load} | Avail Heap {avail_heap}")
|
||||||
pw.dlog(f"Number TCs {num_tcs} | Number TMs {num_tms}")
|
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 01 State {nvm_0_1_state}")
|
||||||
pw.dlog(f"NVM 3 State {nvm_3_state}")
|
pw.dlog(f"NVM 3 State {nvm_3_state}")
|
||||||
pw.dlog(f"Mission IO state {mission_io_state}")
|
pw.dlog(f"Mission IO state {mission_io_state}")
|
||||||
|
@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
name = "eive-tmtc"
|
name = "eive-tmtc"
|
||||||
description = "TMTC Commander EIVE"
|
description = "TMTC Commander EIVE"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
version = "6.2.0"
|
version = "7.0.0"
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
license = {text = "Apache-2.0"}
|
license = {text = "Apache-2.0"}
|
||||||
authors = [
|
authors = [
|
||||||
@ -29,9 +29,9 @@ classifiers = [
|
|||||||
"Topic :: Scientific/Engineering"
|
"Topic :: Scientific/Engineering"
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
# "tmtccmd~=8.0.0rc2",
|
"tmtccmd == 8.0.0rc1",
|
||||||
"cfdp-py~=0.1.1",
|
"cfdp-py~=0.1.0",
|
||||||
"tmtccmd @ git+https://github.com/robamu-org/tmtccmd@main",
|
# "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@main",
|
||||||
"python-dateutil ~= 2.8",
|
"python-dateutil ~= 2.8",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
6
tmtcc.py
6
tmtcc.py
@ -97,8 +97,8 @@ def setup_params() -> Tuple[SetupWrapper, int]:
|
|||||||
hk_level = int(post_arg_parsing_wrapper.args_raw.hk)
|
hk_level = int(post_arg_parsing_wrapper.args_raw.hk)
|
||||||
else:
|
else:
|
||||||
hk_level = 0
|
hk_level = 0
|
||||||
if params.tc_params.print_tree:
|
if params.app_params.print_tree:
|
||||||
perform_tree_printout(params.tc_params, hook_obj.get_command_definitions())
|
perform_tree_printout(params.app_params, hook_obj.get_command_definitions())
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
params.apid = PUS_APID
|
params.apid = PUS_APID
|
||||||
if params.com_if is None:
|
if params.com_if is None:
|
||||||
@ -232,7 +232,6 @@ def main(): # noqa C901: Complexity okay here.
|
|||||||
state = tmtc_backend.periodic_op(None)
|
state = tmtc_backend.periodic_op(None)
|
||||||
tc_handler.cfdp_in_ccsds_handler.state_machine()
|
tc_handler.cfdp_in_ccsds_handler.state_machine()
|
||||||
if state.request == BackendRequest.TERMINATION_NO_ERROR:
|
if state.request == BackendRequest.TERMINATION_NO_ERROR:
|
||||||
tmtc_backend.close_com_if()
|
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
elif state.request == BackendRequest.DELAY_IDLE:
|
elif state.request == BackendRequest.DELAY_IDLE:
|
||||||
_LOGGER.info("TMTC Client in IDLE mode")
|
_LOGGER.info("TMTC Client in IDLE mode")
|
||||||
@ -253,7 +252,6 @@ def main(): # noqa C901: Complexity okay here.
|
|||||||
elif state.request == BackendRequest.CALL_NEXT:
|
elif state.request == BackendRequest.CALL_NEXT:
|
||||||
pass
|
pass
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
tmtc_backend.close_com_if()
|
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user