import enum from tmtccmd.config.definitions import QueueCommands from tmtccmd.tc.definitions import TcQueueT from tmtccmd.tc.service_8_functional_cmd import generate_action_command from tmtccmd.utility.logger import get_console_logger from config.object_ids import CORE_CONTROLLER_ID LOGGER = get_console_logger() class ActionIds(enum.IntEnum): REBOOT = 32 class OpCodes(enum.Enum): REBOOT = 'reboot' REBOOT_SELF = 'reboot_self' REBOOT_0_0 = 'reboot_0_0' REBOOT_0_1 = 'reboot_0_1' REBOOT_1_0 = 'reboot_1_0' REBOOT_1_1 = 'reboot_1_1' 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 pack_core_commands(tc_queue: TcQueueT, op_code: str): if op_code == OpCodes.REBOOT.value: 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 ) elif op_code == OpCodes.REBOOT_SELF.value: perform_reboot_cmd(tc_queue=tc_queue, reboot_self=True) elif op_code == OpCodes.REBOOT_0_0.value: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM ) elif op_code == OpCodes.REBOOT_0_1.value: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_1_GOLD ) elif op_code == OpCodes.REBOOT_1_0.value: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_0_NOM ) elif op_code == OpCodes.REBOOT_1_1.value: perform_reboot_cmd( tc_queue=tc_queue, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_1_GOLD ) 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.REBOOT, app_data=tc_data, ssc=0 ) tc_queue.appendleft(action_cmd.pack_command_tuple())