# -*- coding: utf-8 -*- """ @file star_tracker.py @brief Star tracker commanding @author J. Meier @date 14.08.2021 """ import struct from tmtccmd.config.definitions import QueueCommands from tmtccmd.tc.packer import TcQueueT from spacepackets.ecss.tc import PusTelecommand from tmtccmd.tc.service_200_mode import pack_mode_data, Modes from tmtccmd.logging import get_console_logger from utility.input_helper import InputHelper LOGGER = get_console_logger() class StarTrackerActionIds: PING = 0 BOOT = 1 REQ_VERSION = 2 REQ_INTERFACE = 3 REQ_TIME = 4 UNLOCK = 6 SWITCH_TO_BOOTLOADER_PROGRAM = 7 REQ_POWER = 11 TAKE_IMAGE = 15 DOWNLOAD_IMAGE = 9 UPLOAD_IMAGE = 10 DOWNLOAD_CENTROID = 16 UPLOAD_CENTROID = 17 SUBSCRIPTION = 18 IMAGE_PROCESSOR = 19 REQ_SOLUTION = 24 REQ_TEMPERATURE = 25 REQ_HISTOGRAM = 28 REQ_CONTRAST = 29 LIMITS = 40 MOUNTING = 41 CAMERA = 42 BLOB = 43 CENTROIDING = 44 LISA = 45 MATCHING = 46 TRACKING = 47 VALIDATION = 48 ALGO = 49 CHECKSUM = 50 FLASH_READ = 51 FLASH_WRITE = 52 DOWNLOAD_MATCHED_STAR = 53 STOP_STR_HELPER = 55 RESET_ERROR = 56 CHANGE_DOWNLOAD_IMAGE = 57 SET_JSON_FILE_NAME = 58 SET_FLASH_READ_FILENAME = 59 SET_TIME = 60 DOWNLOAD_DBIMAGE = 61 DOWNLOAD_BLOBPIXEL = 62 DOWNLOAD_FPGA_IMAGE = 63 CHANGE_FPGA_DOWNLOAD_FILE = 64 UPLOAD_FPGA_IMAGE = 65 FPGA_ACTION = 66 REQ_CAMERA_PARAMS = 67 REQ_LIMITS = 68 REQ_LOG_LEVEL = 69 REQ_MOUNTING = 70 REQ_IMAGE_PROCESSOR = 71 REQ_CENTROIDING = 72 REQ_LISA = 73 REQ_MATCHING = 74 REQ_TRACKING = 75 REQ_VALIDATION = 76 REQ_ALGO = 77 REQ_SUBSCRIPTION = 78 REQ_LOG_SUBSCRIPTION = 79 REQ_DEBUG_CAMERA = 80 LOGLEVEL = 81 LOG_SUBSCRIPTION = 82 DEBUG_CAMERA = 83 FIRMWARE_UPDATE = 84 class FileDefs: download_path = "/mnt/sd0/startracker" json_file = "/mnt/sd0/startracker/full.json" egse_ground_config = "/home/pi/arcsec/json/ground-config.json" egse_flight_config = "/home/pi/arcsec/json/flight-config.json" egse_solution_upload_img_config = "/home/pi/arcsec/json/upload-image-solution.json" egse_histogram_upload_img_config = ( "/home/pi/arcsec/json/upload-image-histogram.json" ) q7s_ground_config = "/mnt/sd0/startracker/json/ground-config.json" q7s_flight_config = "/mnt/sd0/startracker/flight-config.json" firmware2_1 = "/home/pi/arcsec/firmware/sagitta-2-1.bin" firmware22_1 = "/home/pi/arcsec/firmware/sagitta-22-1.bin" firmware_origin = "/home/pi/arcsec/firmware/sagitta-origin.bin" json_dict = { "1": ["Q7S flight config", FileDefs.q7s_flight_config], "2": ["Q7S ground config", FileDefs.q7s_ground_config], "3": ["EGSE flight config", FileDefs.egse_flight_config], "4": ["EGSE ground config", FileDefs.egse_ground_config], "5": [ "EGSE get solution, upload image config", FileDefs.egse_solution_upload_img_config, ], "6": [ "EGSE get histogram, upload image config", FileDefs.egse_solution_upload_img_config, ], } firmware_dict = { "1": ["Firmware Major = 2, Minor = 1", FileDefs.firmware2_1], "2": ["Firmware Major = 22, Minor = 1", FileDefs.firmware22_1], "3": ["Firmware Origin", FileDefs.firmware_origin], } upload_image_dict = { "1": ["q7s gemma", "/mnt/sd0/startracker/gemma.bin"], "2": ["egse gemma", "/home/pi/arcsec/star-images/gemma.bin"], "3": ["q7s polaris", "/mnt/sd0/startracker/polaris.bin"], "4": ["egse polaris", "/home/pi/arcsec/star-images/polaris.bin"], } class StartRegion: # Definition according to datasheet (which turned out to be partially faulty) BOOTLOADER = 0 STAR_TRACKER_FIRMWARE = 1 class PartitionSize: # Size of most recent firmware image STAR_TRACKER_FIRMWARE = 464572 class Submode: BOOTLOADER = 1 FIRMWARE = 2 def pack_star_tracker_commands( object_id: bytearray, tc_queue: TcQueueT, op_code: str ) -> TcQueueT: tc_queue.appendleft( ( QueueCommands.PRINT, "Generate command for star tracker with object id: 0x" + object_id.hex(), ) ) if op_code == "0": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Mode On, Submode Bootloader") ) command = pack_mode_data(object_id, Modes.ON, Submode.BOOTLOADER) command = PusTelecommand(service=200, subservice=1, ssc=9, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "1": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Mode On, Submode Firmware") ) command = pack_mode_data(object_id, Modes.ON, Submode.FIRMWARE) command = PusTelecommand(service=200, subservice=1, ssc=10, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "2": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Mode Normal")) command = pack_mode_data(object_id, Modes.NORMAL, 0) command = PusTelecommand(service=200, subservice=1, ssc=11, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "3": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Mode Off")) command = pack_mode_data(object_id, Modes.OFF, 0) command = PusTelecommand(service=200, subservice=1, ssc=12, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "4": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Mode Raw")) command = pack_mode_data(object_id, 3, 0) command = PusTelecommand(service=200, subservice=1, ssc=13, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "5": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Ping")) command = object_id + struct.pack("!I", StarTrackerActionIds.PING) command = PusTelecommand(service=8, subservice=128, ssc=30, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "6": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Switch to bootloader program") ) command = object_id + struct.pack( "!I", StarTrackerActionIds.SWITCH_TO_BOOTLOADER_PROGRAM ) command = PusTelecommand(service=8, subservice=128, ssc=31, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "7": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Temperature request")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_TEMPERATURE) command = PusTelecommand(service=8, subservice=128, ssc=32, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "8": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Request version")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_VERSION) command = PusTelecommand(service=8, subservice=128, ssc=33, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "9": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Request interface")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_INTERFACE) command = PusTelecommand(service=8, subservice=128, ssc=34, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "10": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Request power")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_POWER) command = PusTelecommand(service=8, subservice=128, ssc=35, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "11": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Set subscription parameters") ) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.SUBSCRIPTION) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=36, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "12": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Boot")) command = object_id + struct.pack("!I", StarTrackerActionIds.BOOT) command = PusTelecommand(service=8, subservice=128, ssc=37, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "13": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Request time")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_TIME) command = PusTelecommand(service=8, subservice=128, ssc=38, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "14": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Request solution")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_SOLUTION) command = PusTelecommand(service=8, subservice=128, ssc=39, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "15": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Upload image")) image = get_upload_image() command = ( object_id + struct.pack("!I", StarTrackerActionIds.UPLOAD_IMAGE) + bytearray(image, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=40, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "16": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Download image")) path = input("Specify storage location (default - /mnt/sd0/startracker): ") if not path: path = FileDefs.download_path command = ( object_id + struct.pack("!I", StarTrackerActionIds.DOWNLOAD_IMAGE) + bytearray(path, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=53, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "17": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Set limits")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.LIMITS) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=42, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "18": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Set tracking parameters") ) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.TRACKING) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=43, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "19": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Mounting")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.MOUNTING) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=44, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "20": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Camera")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.CAMERA) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=45, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "22": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Centroiding")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.CENTROIDING) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=47, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "23": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: LISA")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.LISA) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=48, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "24": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Matching")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.MATCHING) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=49, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "25": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Validation")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.VALIDATION) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=50, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "26": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Algo")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.ALGO) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=51, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "27": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Take image")) actionid = int(input("Specify parameter ID (take image - 4): ")) command = ( object_id + struct.pack("!I", StarTrackerActionIds.TAKE_IMAGE) + struct.pack("!B", actionid) ) command = PusTelecommand(service=8, subservice=128, ssc=52, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "28": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Stop str helper")) command = object_id + struct.pack("!I", StarTrackerActionIds.STOP_STR_HELPER) command = PusTelecommand(service=8, subservice=128, ssc=54, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "30": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Set name of download image") ) filename = input("Specify download image name: ") command = ( object_id + struct.pack("!I", StarTrackerActionIds.CHANGE_DOWNLOAD_IMAGE) + bytearray(filename, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=54, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "31": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Request histogram")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_HISTOGRAM) command = PusTelecommand(service=8, subservice=128, ssc=55, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "32": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Request contrast")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_CONTRAST) command = PusTelecommand(service=8, subservice=128, ssc=56, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "33": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Set json filename")) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.SET_JSON_FILE_NAME) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=57, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "35": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Flash read")) command = pack_read_command(object_id) command = PusTelecommand(service=8, subservice=128, ssc=59, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "36": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Set flash read filename") ) filename = input("Specify filename: ") command = ( object_id + struct.pack("!I", StarTrackerActionIds.SET_FLASH_READ_FILENAME) + bytearray(filename, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=60, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "37": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Get checksum")) command = pack_checksum_command(object_id) command = PusTelecommand(service=8, subservice=128, ssc=61, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "38": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Set time")) unix_time = 1640783543 command = ( object_id + struct.pack("!I", StarTrackerActionIds.SET_TIME) + struct.pack("!Q", unix_time) ) command = PusTelecommand(service=8, subservice=128, ssc=61, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "39": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Download Centroid")) id = 0 command = ( object_id + struct.pack("!I", StarTrackerActionIds.DOWNLOAD_CENTROID) + struct.pack("!B", id) ) command = PusTelecommand(service=8, subservice=128, ssc=62, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "41": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Download matched star") ) id = 0 command = ( object_id + struct.pack("!I", StarTrackerActionIds.DOWNLOAD_MATCHED_STAR) + struct.pack("!B", id) ) command = PusTelecommand(service=8, subservice=128, ssc=64, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "42": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Download DB Image")) id = 0 command = ( object_id + struct.pack("!I", StarTrackerActionIds.DOWNLOAD_DBIMAGE) + struct.pack("!B", id) ) command = PusTelecommand(service=8, subservice=128, ssc=65, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "43": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Download Blob Pixel")) id = 0 type = 1 # 0 - normal, 1 - fast command = ( object_id + struct.pack("!I", StarTrackerActionIds.DOWNLOAD_BLOBPIXEL) + struct.pack("!B", id) + struct.pack("!B", type) ) command = PusTelecommand(service=8, subservice=128, ssc=65, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "44": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Download FPGA Image")) position = int(input("Start position: ")) length = int(input("Size to download: ")) command = ( object_id + struct.pack("!I", StarTrackerActionIds.DOWNLOAD_FPGA_IMAGE) + struct.pack("!I", position) + struct.pack("!I", length) + bytearray(FileDefs.downloadFpgaImagePath, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=66, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "45": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Change donwload FPGA image file name") ) command = ( object_id + struct.pack("!I", StarTrackerActionIds.CHANGE_FPGA_DOWNLOAD_FILE) + bytearray(FileDefs.downloadFpgaImageName, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=67, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "46": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Upload FPGA image")) command = ( object_id + struct.pack("!I", StarTrackerActionIds.UPLOAD_FPGA_IMAGE) + bytearray(FileDefs.uploadFpgaImageName, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=68, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "47": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: FPGA action")) id = 3 command = ( object_id + struct.pack("!I", StarTrackerActionIds.FPGA_ACTION) + struct.pack("!B", id) ) command = PusTelecommand(service=8, subservice=128, ssc=69, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "48": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Unlock")) command = object_id + struct.pack("!I", StarTrackerActionIds.UNLOCK) command = PusTelecommand(service=8, subservice=128, ssc=70, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "49": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request camera parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_CAMERA_PARAMS) command = PusTelecommand(service=8, subservice=128, ssc=71, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "50": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Request limits")) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_LIMITS) command = PusTelecommand(service=8, subservice=128, ssc=72, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "51": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Set image processor parameters") ) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.IMAGE_PROCESSOR) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=70, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "52": tc_queue.appendleft( ( QueueCommands.PRINT, "Star tracker: EGSE load ground config camera parameters", ) ) command = ( object_id + struct.pack("!I", StarTrackerActionIds.CAMERA) + bytearray(FileDefs.egse_ground_config, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=71, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "53": tc_queue.appendleft( ( QueueCommands.PRINT, "Star tracker: EGSE load flight config camera parameters", ) ) command = ( object_id + struct.pack("!I", StarTrackerActionIds.CAMERA) + bytearray(FileDefs.egse_flight_config, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=72, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "54": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request log level parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_LOG_LEVEL) command = PusTelecommand(service=8, subservice=128, ssc=74, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "55": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request mounting parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_MOUNTING) command = PusTelecommand(service=8, subservice=128, ssc=75, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "56": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request image processor parameters") ) command = object_id + struct.pack( "!I", StarTrackerActionIds.REQ_IMAGE_PROCESSOR ) command = PusTelecommand(service=8, subservice=128, ssc=76, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "57": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request centroiding parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_CENTROIDING) command = PusTelecommand(service=8, subservice=128, ssc=75, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "58": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request lisa parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_LISA) command = PusTelecommand(service=8, subservice=128, ssc=76, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "59": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request matching parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_MATCHING) command = PusTelecommand(service=8, subservice=128, ssc=77, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "60": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request tracking parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_TRACKING) command = PusTelecommand(service=8, subservice=128, ssc=78, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "61": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request validation parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_VALIDATION) command = PusTelecommand(service=8, subservice=128, ssc=79, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "62": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request algo parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_ALGO) command = PusTelecommand(service=8, subservice=128, ssc=80, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "63": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request subscription parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_SUBSCRIPTION) command = PusTelecommand(service=8, subservice=128, ssc=81, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "64": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request log subscription parameters") ) command = object_id + struct.pack( "!I", StarTrackerActionIds.REQ_LOG_SUBSCRIPTION ) command = PusTelecommand(service=8, subservice=128, ssc=82, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "65": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Request debug camera parameters") ) command = object_id + struct.pack("!I", StarTrackerActionIds.REQ_DEBUG_CAMERA) command = PusTelecommand(service=8, subservice=128, ssc=83, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "66": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Set log level parameters") ) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.LOGLEVEL) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=84, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "67": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Set log subscription parameters") ) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.LOG_SUBSCRIPTION) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=85, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "68": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Set debug camera parameters") ) json_file = get_config_file() command = ( object_id + struct.pack("!I", StarTrackerActionIds.DEBUG_CAMERA) + bytearray(json_file, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=86, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "69": tc_queue.appendleft((QueueCommands.PRINT, "Star tracker: Firmware update")) firmware = get_firmware() command = ( object_id + struct.pack("!I", StarTrackerActionIds.FIRMWARE_UPDATE) + bytearray(firmware, "utf-8") ) command = PusTelecommand(service=8, subservice=128, ssc=87, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "70": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Disable timestamp generation") ) command = object_id + struct.pack( "!I", StarTrackerActionIds.DISBALE_TIMESTAMP_GENERATION ) command = PusTelecommand(service=8, subservice=128, ssc=88, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) if op_code == "71": tc_queue.appendleft( (QueueCommands.PRINT, "Star tracker: Enable timestamp generation") ) command = object_id + struct.pack( "!I", StarTrackerActionIds.ENABLE_TIMESTAMP_GENERATION ) command = PusTelecommand(service=8, subservice=128, ssc=89, app_data=command) tc_queue.appendleft(command.pack_command_tuple()) def pack_read_command(object_id: bytearray) -> bytearray: start_region = StartRegion.STAR_TRACKER_FIRMWARE size = PartitionSize.STAR_TRACKER_FIRMWARE path = input("Specify storage location (default - /mnt/sd0/startracker): ") if not path: path = FileDefs.download_path command = ( object_id + struct.pack("!I", StarTrackerActionIds.FLASH_READ) + struct.pack("!B", start_region) + struct.pack("!I", size) + bytearray(path, "utf-8") ) return command def pack_checksum_command(object_id: bytearray) -> bytearray: start_region = StartRegion.STAR_TRACKER_FIRMWARE address = 0 size = PartitionSize.STAR_TRACKER_FIRMWARE command = ( object_id + struct.pack("!I", StarTrackerActionIds.CHECKSUM) + struct.pack("!B", start_region) + struct.pack("!I", address) + struct.pack("!I", size) ) return command def get_config_file() -> str: LOGGER.info("Specify json file") input_helper = InputHelper(json_dict) key = input_helper.get_key() json_file = json_dict[key][1] return json_file def get_firmware() -> str: LOGGER.info("Specify firmware file") input_helper = InputHelper(firmware_dict) key = input_helper.get_key() firmware = firmware_dict[key][1] return firmware def get_upload_image() -> str: LOGGER.info("Specify image to upload") input_helper = InputHelper(upload_image_dict) key = input_helper.get_key() image = upload_image_dict[key][1] return image