# -*- 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.utility.logger 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