import enum from config.definitions import CustomServiceList from tmtccmd.config import add_op_code_entry, add_service_op_code_entry from tmtccmd.config.definitions import QueueCommands, ServiceOpCodeDictT from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.pus_8_funccmd import generate_action_command from tmtccmd.logging import get_console_logger from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command from config.object_ids import CORE_CONTROLLER_ID LOGGER = get_console_logger() class ActionIds(enum.IntEnum): LIST_DIR_INTO_FILE = 0 SWITCH_REBOOT_FILE_HANDLING = 5 RESET_ALL_REBOOT_COUNTERS = 6 RESET_REBOOT_COUNTER_00 = 7 RESET_REBOOT_COUNTER_01 = 8 RESET_REBOOT_COUNTER_10 = 9 RESET_REBOOT_COUNTER_11 = 10 SET_MAX_REBOOT_CNT = 11 XSC_REBOOT = 32 FULL_REBOOT = 34 class SetIds(enum.IntEnum): HK = 5 class OpCodes: REBOOT_XSC = ["0", "reboot-xsc"] XSC_REBOOT_SELF = ["1", "reboot-self"] XSC_REBOOT_0_0 = ["2", "reboot-00"] XSC_REBOOT_0_1 = ["3", "reboot-01"] XSC_REBOOT_1_0 = ["4", "reboot-10"] XSC_REBOOT_1_1 = ["5", "reboot-11"] REBOOT_FULL = ["6", "reboot-regular"] GET_HK = ["7", "get-hk"] ENABLE_REBOOT_FILE_HANDLING = ["32", "rbh-off"] DISABLE_REBOOT_FILE_HANDLING = ["33", "rbh-on"] RESET_ALL_REBOOT_COUNTERS = ["34", "rbh-reset-a"] RESET_REBOOT_COUNTER_00 = ["35", "rbh-reset-00"] RESET_REBOOT_COUNTER_01 = ["36", "rbh-reset-01"] RESET_REBOOT_COUNTER_10 = ["37", "rbh-reset-10"] RESET_REBOOT_COUNTER_11 = ["38", "rbh-reset-11"] SET_MAX_REBOOT_CNT = ["39", "rbh-max-cnt"] class Info: REBOOT_XSC = "XSC reboot with prompt" REBOOT_FULL = "Full regular reboot" class Chip(enum.IntEnum): CHIP_0 = 0 CHIP_1 = 1 NONE = 2 class Copy(enum.IntEnum): COPY_0_NOM = 0 COPY_1_GOLD = 1 NONE = 2 def add_core_controller_definitions(cmd_dict: ServiceOpCodeDictT): od = dict() add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_XSC, info=Info.REBOOT_XSC) add_op_code_entry(op_code_dict=od, keys=OpCodes.REBOOT_FULL, info=Info.REBOOT_FULL) add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_SELF, info="Reboot Self") add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_0_0, info="Reboot 0 0") add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_0_1, info="Reboot 0 1") add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_1_0, info="Reboot 1 0") add_op_code_entry(op_code_dict=od, keys=OpCodes.XSC_REBOOT_1_1, info="Reboot 1 1") add_op_code_entry( op_code_dict=od, keys=OpCodes.GET_HK, info="Request housekeeping set", ) add_op_code_entry( op_code_dict=od, keys=OpCodes.ENABLE_REBOOT_FILE_HANDLING, info="Enable reboot file handling", ) add_op_code_entry( op_code_dict=od, keys=OpCodes.DISABLE_REBOOT_FILE_HANDLING, info="Disable reboot file handling", ) add_op_code_entry( op_code_dict=od, keys=OpCodes.RESET_ALL_REBOOT_COUNTERS, info="Reset all reboot counters", ) add_op_code_entry( op_code_dict=od, keys=OpCodes.RESET_REBOOT_COUNTER_00, info="Reset reboot counter 0 0", ) add_op_code_entry( op_code_dict=od, keys=OpCodes.RESET_REBOOT_COUNTER_01, info="Reset reboot counter 0 1", ) add_op_code_entry( op_code_dict=od, keys=OpCodes.RESET_REBOOT_COUNTER_10, info="Reset reboot counter 1 0", ) add_op_code_entry( op_code_dict=od, keys=OpCodes.RESET_REBOOT_COUNTER_11, info="Reset reboot counter 1 1", ) add_service_op_code_entry( srv_op_code_dict=cmd_dict, name=CustomServiceList.CORE.value, info="Core Controller", op_code_entry=od, ) def pack_core_commands(tc_queue: TcQueueT, op_code: str): if op_code in OpCodes.REBOOT_XSC: reboot_self, chip_select, copy_select = determine_reboot_params() perform_reboot_cmd( tc_queue=tc_queue, reboot_self=reboot_self, chip=chip_select, copy=copy_select, ) if op_code in OpCodes.REBOOT_FULL: tc_queue.appendleft((QueueCommands.PRINT, f"Core Command: {Info.REBOOT_FULL}")) cmd = generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.FULL_REBOOT ) tc_queue.appendleft(cmd.pack_command_tuple()) if op_code in OpCodes.XSC_REBOOT_SELF: perform_reboot_cmd(tc_queue=tc_queue, reboot_self=True) if op_code in OpCodes.XSC_REBOOT_0_0: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM ) if op_code in OpCodes.XSC_REBOOT_0_1: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_1_GOLD, ) if op_code in OpCodes.XSC_REBOOT_1_0: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_0_NOM ) if op_code in OpCodes.XSC_REBOOT_1_1: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_1_GOLD, ) if op_code in OpCodes.DISABLE_REBOOT_FILE_HANDLING: tc_queue.appendleft((QueueCommands.PRINT, "Disabling reboot file handling")) app_data = bytearray([0]) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING, app_data=app_data, ) if op_code in OpCodes.ENABLE_REBOOT_FILE_HANDLING: tc_queue.appendleft((QueueCommands.PRINT, "Enabling reboot file handling")) app_data = bytearray([1]) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING, app_data=app_data, ) if op_code in OpCodes.RESET_ALL_REBOOT_COUNTERS: tc_queue.appendleft((QueueCommands.PRINT, "Resetting all reboot counters")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_ALL_REBOOT_COUNTERS ) if op_code in OpCodes.RESET_REBOOT_COUNTER_00: tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 0 0")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_00 ) if op_code in OpCodes.RESET_REBOOT_COUNTER_01: tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 0 1")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_01 ) if op_code in OpCodes.RESET_REBOOT_COUNTER_10: tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 1 0")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_10 ) if op_code in OpCodes.RESET_REBOOT_COUNTER_11: tc_queue.appendleft((QueueCommands.PRINT, "Resetting reboot counter 1 1")) generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.RESET_REBOOT_COUNTER_11 ) if op_code in OpCodes.GET_HK: tc_queue.appendleft((QueueCommands.PRINT, "Requesting housekeeping set")) sid = make_sid(object_id=CORE_CONTROLLER_ID, set_id=SetIds.HK) command = generate_one_hk_command(sid, 201) tc_queue.appendleft(command.pack_command_tuple()) def determine_reboot_params() -> (bool, Chip, Copy): chip_select = -1 copy_select = -1 reboot_self = input("Reboot self? [y/n]: ") if reboot_self in ["y", "yes", "1"]: LOGGER.info("Rebooting currently running image") return True, chip_select, copy_select LOGGER.info("Rebooting image specified by chip and copy") while True: chip_select = input("Chip select [0/1]: ") if chip_select in ["0", "1"]: if chip_select == "0": chip_select = Chip.CHIP_0 else: chip_select = Chip.CHIP_1 break else: LOGGER.warning("Invalid chip select value. Try again") while True: copy_select = input("Copy select [0/1]: ") if copy_select in ["0", "1"]: if copy_select == "0": copy_select = Copy.COPY_0_NOM else: copy_select = Copy.COPY_1_GOLD break else: LOGGER.warning("Invalid copy select value. Try again") return False, chip_select, copy_select def perform_reboot_cmd( tc_queue: TcQueueT, reboot_self: bool, chip: Chip = Chip.NONE, copy: Copy = Copy.NONE, ): tc_data = bytearray() if reboot_self: tc_queue.appendleft( (QueueCommands.PRINT, "Packing reboot command for current image") ) tc_data.append(True) else: tc_data.append(False) tc_data.append(chip) tc_data.append(copy) tc_queue.append( ( QueueCommands.PRINT, f"Packing reboot command for chip {chip} and copy {copy}", ) ) action_cmd = generate_action_command( object_id=CORE_CONTROLLER_ID, action_id=ActionIds.XSC_REBOOT, app_data=tc_data, ssc=0, ) tc_queue.appendleft(action_cmd.pack_command_tuple())