import enum import json from spacepackets.ecss import PusTelecommand from eive_tmtc.config.definitions import CustomServiceList from tmtccmd.config.tmtc import tmtc_definitions_provider from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_data, Subservice from tmtccmd.tc import service_provider from tmtccmd.tc.decorator import ServiceProviderParams from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd from tmtccmd.config import OpCodeEntry, TmtcDefinitionWrapper 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" ON = "on" SWITCH_ON = "on" OFF = "off" 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" @tmtc_definitions_provider def add_scex_cmds(defs: TmtcDefinitionWrapper): oce = OpCodeEntry() oce.add(keys=OpCode.PING, info=Info.PING) oce.add(keys=OpCode.ION_CMD, info=Info.ION_CMD) oce.add(keys=OpCode.TEMP_CMD, info=Info.TEMP_CMD) oce.add(keys=OpCode.EXP_STATUS_CMD, info=Info.EXP_STATUS_CMD) oce.add(keys=OpCode.ONE_CELLS_CMD, info=Info.ONE_CELLS_CMD) oce.add(keys=OpCode.ALL_CELLS_CMD, info=Info.ALL_CELLS_CMD) oce.add(keys=OpCode.FRAM, info=Info.FRAM) oce.add(keys=OpCode.ON, info=Info.SWITCH_ON) oce.add(keys=OpCode.OFF, info=Info.SWITCH_OFF) oce.add(keys=OpCode.NORMAL, info=Info.NORMAL) defs.add_service( name=CustomServiceList.SCEX.value, info="SCEX Device", op_code_entry=oce ) @service_provider(CustomServiceList.SCEX.value) def pack_scex_cmds(p: ServiceProviderParams): # noqa C901 op_code = p.op_code q = p.queue_helper if op_code == OpCode.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 op_code == 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 op_code == OpCode.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 op_code == 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 op_code == 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 op_code == 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 op_code == 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 op_code == 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"] # 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 op_code == 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"] # 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 op_code == 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)