import enum import json from spacepackets.ecss import PusTelecommand from tmtccmd.config.tmtc import CmdTreeNode from tmtccmd.pus.s8_fsfw_action import create_action_cmd from tmtccmd.pus.s200_fsfw_mode import Mode, Subservice, pack_mode_data from tmtccmd.tmtc import DefaultPusQueueHelper from eive_tmtc.config.object_ids import SCEX_HANDLER_ID USE_SCEX_CONF_FILE = True class OpCode: PING = "ping" ION_CMD = "ion" TEMP_CMD = "temp" EXP_STATUS_CMD = "expstatus" ONE_CELLS_CMD = "onecell" ALL_CELLS_CMD = "allcells" FRAM = "fram" SWITCH_ON = "on" SWITCH_OFF = "off" NORMAL = "normal" class ActionId(enum.IntEnum): PING = 7 ION_CMD = 4 TEMP_CMD = 3 EXP_STATUS_CMD = 2 ONE_CELLS_CMD = 6 ALL_CELLS_CMD = 5 FRAM = 1 class Info: PING = "Send Ping command" ION_CMD = "Read Ion" TEMP_CMD = "Read Temperature" EXP_STATUS_CMD = "Read Experiment Status" ONE_CELLS_CMD = "One Cell" ALL_CELLS_CMD = "All Cells" FRAM = "Read FRAM" SWITCH_ON = "Switch Scex on" SWITCH_OFF = "Switch Scex off" NORMAL = "Switch SCEX to normal mode" def create_scex_node() -> CmdTreeNode: op_code_strs = [ getattr(OpCode, 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)) scex_node = CmdTreeNode("scex", "Solar Cell Experiment") for op_code, info in combined_dict.items(): scex_node.add_child(CmdTreeNode(op_code, info)) return scex_node def pack_scex_cmds(q: DefaultPusQueueHelper, cmd_str: str): # noqa C901 if cmd_str == OpCode.SWITCH_ON: q.add_log_cmd(Info.SWITCH_ON) q.add_pus_tc( PusTelecommand( service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.ON, 0), ) ) if cmd_str == OpCode.NORMAL: q.add_log_cmd(Info.NORMAL) q.add_pus_tc( PusTelecommand( service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.NORMAL, 0), ) ) if cmd_str == OpCode.SWITCH_OFF: q.add_log_cmd(Info.SWITCH_OFF) q.add_pus_tc( PusTelecommand( service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.OFF, 0), ) ) if cmd_str == OpCode.PING: q.add_log_cmd(Info.PING) app_data = bytes([0]) q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.PING, app_data)) if cmd_str == OpCode.ION_CMD: q.add_log_cmd(Info.ION_CMD) app_data = bytes([0]) q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.ION_CMD, app_data)) if cmd_str == OpCode.TEMP_CMD: q.add_log_cmd(Info.TEMP_CMD) app_data = bytes([0]) q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.TEMP_CMD, app_data)) if cmd_str == OpCode.EXP_STATUS_CMD: q.add_log_cmd(Info.EXP_STATUS_CMD) app_data = bytes([0]) q.add_pus_tc( create_action_cmd(SCEX_HANDLER_ID, ActionId.EXP_STATUS_CMD, app_data) ) # one cell if cmd_str == OpCode.ONE_CELLS_CMD: q.add_log_cmd(Info.ONE_CELLS_CMD) app_data = bytearray([0]) # cell number cn = 0 while True: cell_select = input("Which solar cell should be measured? (1-10): ") if not cell_select.isdigit(): print("Invalid cell number. Try again.") continue cell_select = int(cell_select) if cell_select < 1 or cell_select > 10: print( f"Invalid cell number {cell_select}, Please enter a valid number: " ) continue cn = cell_select - 1 break if USE_SCEX_CONF_FILE: with open("template/scex_conf.json") as json_file: json_data = json.load(json_file) first_dac = json_data["first_dac"] last_dac = json_data["last_dac"] res_switch1 = json_data["res_switch1"] res_switch2 = json_data["res_switch2"] dac_weight1 = json_data["dac_weight1"] dac_weight2 = json_data["dac_weight2"] dac_weight3 = json_data["dac_weight3"] else: raise ValueError("CLI support for SCEX params not implemented") # in app_data # app_data.extend(struct.pack("!H", first_dac)) app_data.append(cell_select) append_16_bit_val(packet=app_data, val=first_dac[cn]) append_16_bit_val(packet=app_data, val=last_dac[cn]) append_16_bit_val(packet=app_data, val=res_switch1[cn]) append_16_bit_val(packet=app_data, val=res_switch2[cn]) app_data.append(dac_weight1[cn]) app_data.append(dac_weight2[cn]) app_data.append(dac_weight3[cn]) q.add_pus_tc( create_action_cmd(SCEX_HANDLER_ID, ActionId.ONE_CELLS_CMD, app_data) ) if cmd_str == OpCode.ALL_CELLS_CMD: q.add_log_cmd(Info.ALL_CELLS_CMD) app_data = bytearray([0]) # cell number cn = 0 if USE_SCEX_CONF_FILE: with open("template/scex_conf.json") as json_file: json_data = json.load(json_file) first_dac = json_data["first_dac"] last_dac = json_data["last_dac"] res_switch1 = json_data["res_switch1"] res_switch2 = json_data["res_switch2"] dac_weight1 = json_data["dac_weight1"] dac_weight2 = json_data["dac_weight2"] dac_weight3 = json_data["dac_weight3"] else: raise ValueError("CLI support for SCEX params not implemented") # in app_data # app_data.extend(struct.pack("!H", first_dac)) append_16_bit_val(packet=app_data, val=first_dac[cn]) append_16_bit_val(packet=app_data, val=last_dac[cn]) append_16_bit_val(packet=app_data, val=res_switch1[cn]) append_16_bit_val(packet=app_data, val=res_switch2[cn]) app_data.append(dac_weight1[cn]) app_data.append(dac_weight2[cn]) app_data.append(dac_weight3[cn]) q.add_pus_tc( create_action_cmd(SCEX_HANDLER_ID, ActionId.ALL_CELLS_CMD, app_data) ) if cmd_str == OpCode.FRAM: q.add_log_cmd(Info.FRAM) app_data = bytes([0]) q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.FRAM, app_data)) def append_16_bit_val(packet: bytearray, val: int): packet.append((val >> 8) & 0xFF) packet.append(val & 0xFF)