eive-tmtc/eive_tmtc/tmtc/acs/star_tracker.py

892 lines
35 KiB
Python
Raw Normal View History

2021-08-16 10:03:40 +02:00
# -*- coding: utf-8 -*-
"""
@file star_tracker.py
@brief Star tracker commanding
@author J. Meier
@date 14.08.2021
"""
2023-03-08 19:57:28 +01:00
import datetime
2023-01-16 14:13:06 +01:00
import enum
2023-02-01 11:17:04 +01:00
import logging
2021-08-16 10:03:40 +02:00
import struct
2023-03-03 16:38:17 +01:00
from eive_tmtc.config.definitions import CustomServiceList
2023-03-08 19:57:28 +01:00
from eive_tmtc.pus_tm.defs import PrintWrapper
2023-03-10 13:16:14 +01:00
from eive_tmtc.utility.input_helper import InputHelper
2021-10-01 10:55:56 +02:00
from spacepackets.ecss.tc import PusTelecommand
2023-03-03 16:38:17 +01:00
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
from tmtccmd.config.tmtc import tmtc_definitions_provider
2023-03-21 17:00:53 +01:00
from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_diag_command, make_sid
2022-08-08 16:32:18 +02:00
from tmtccmd.tc import DefaultPusQueueHelper
2023-03-10 13:16:14 +01:00
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
2022-07-08 16:25:46 +02:00
from tmtccmd.util import ObjectIdU32
2023-03-08 19:57:28 +01:00
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
2023-04-04 01:24:33 +02:00
from eive_tmtc.config.object_ids import STR_ASSEMBLY, STAR_TRACKER_ID
2022-03-17 19:42:27 +01:00
2023-02-01 11:17:04 +01:00
_LOGGER = logging.getLogger(__name__)
2021-08-16 10:03:40 +02:00
2023-01-16 14:13:06 +01:00
class StarTrackerActionId(enum.IntEnum):
2021-08-16 10:03:40 +02:00
PING = 0
2021-12-02 08:01:18 +01:00
BOOT = 1
REQ_VERSION = 2
REQ_INTERFACE = 3
REQ_TIME = 4
2022-01-17 08:40:16 +01:00
UNLOCK = 6
2021-12-14 19:25:23 +01:00
SWITCH_TO_BOOTLOADER_PROGRAM = 7
2022-01-01 11:17:01 +01:00
REQ_POWER = 11
TAKE_IMAGE = 15
2021-12-06 15:44:34 +01:00
DOWNLOAD_IMAGE = 9
UPLOAD_IMAGE = 10
2021-12-29 20:33:49 +01:00
DOWNLOAD_CENTROID = 16
UPLOAD_CENTROID = 17
2022-02-11 08:46:48 +01:00
SUBSCRIPTION = 18
IMAGE_PROCESSOR = 19
2021-12-02 08:01:18 +01:00
REQ_SOLUTION = 24
2021-08-16 10:03:40 +02:00
REQ_TEMPERATURE = 25
REQ_HISTOGRAM = 28
2021-12-19 11:35:16 +01:00
REQ_CONTRAST = 29
2021-12-06 15:44:34 +01:00
LIMITS = 40
2021-12-13 07:55:34 +01:00
MOUNTING = 41
CAMERA = 42
BLOB = 43
CENTROIDING = 44
LISA = 45
MATCHING = 46
TRACKING = 47
VALIDATION = 48
ALGO = 49
2021-12-19 14:49:22 +01:00
CHECKSUM = 50
2022-02-27 16:17:24 +01:00
FLASH_READ = 51
FLASH_WRITE = 52
2021-12-29 20:33:49 +01:00
DOWNLOAD_MATCHED_STAR = 53
2022-01-01 11:17:01 +01:00
STOP_STR_HELPER = 55
2021-12-13 07:55:34 +01:00
RESET_ERROR = 56
CHANGE_DOWNLOAD_IMAGE = 57
2021-12-19 14:49:22 +01:00
SET_JSON_FILE_NAME = 58
2022-02-27 16:17:24 +01:00
SET_FLASH_READ_FILENAME = 59
2021-12-29 20:33:49 +01:00
SET_TIME = 60
DOWNLOAD_DBIMAGE = 61
DOWNLOAD_BLOBPIXEL = 62
DOWNLOAD_FPGA_IMAGE = 63
2021-12-30 12:55:24 +01:00
CHANGE_FPGA_DOWNLOAD_FILE = 64
UPLOAD_FPGA_IMAGE = 65
FPGA_ACTION = 66
REQ_CAMERA_PARAMS = 67
REQ_LIMITS = 68
2022-02-11 08:46:48 +01:00
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
2022-02-14 16:52:32 +01:00
FIRMWARE_UPDATE = 84
2021-12-06 15:44:34 +01:00
2022-05-27 14:29:56 +02:00
class OpCodes:
2023-03-03 16:38:17 +01:00
ON_BOOTLOADER = "on_bootloader"
ON_FIRMWARE = "on_firmware"
NORMAL = "nml"
OFF = "off"
PING = "ping"
REQUEST_SOLUTION_SET_HK = "hk_req_sol"
REQUEST_SOLUTION_SET_ACTION = "action_req_sol"
2023-03-21 17:00:53 +01:00
TAKE_IMAGE = "take_image"
UPLOAD_IMAGE = "upload_image"
SET_IMG_PROCESSOR_MODE = "set_img_proc_mode"
2023-04-13 12:08:00 +02:00
FW_UPDATE = "fw_update"
2023-03-21 17:00:53 +01:00
class Info:
REQUEST_SOLUTION_SET_HK = "Request Solution Set HK once"
REQUEST_SOLUTION_SET_ACTION = "Request Solution Set Action"
UPLOAD_IMAGE = "Upload Image"
TAKE_IMAGE = "Take Image"
SET_IMG_PROCESSOR_MODE = "Set Image Processor Mode"
2023-04-13 12:08:00 +02:00
FW_UPDATE = "Firmware Update"
2023-03-21 17:00:53 +01:00
2022-05-27 14:29:56 +02:00
2023-01-24 12:38:32 +01:00
class SetId(enum.IntEnum):
VERSION = 2
INTERFACE = 3
POWER = 11
TEMPERATURE = 25
2023-01-24 12:38:32 +01:00
SOLUTION = 24
HISTOGRAM = 28
CHECKSUM = 50
CAMERA = 67
LIMITS = 68
CENTROIDING = 72
LISA = 73
2022-02-14 16:52:32 +01:00
class FileDefs:
2022-02-27 16:17:24 +01:00
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/ground-config.json"
2022-02-27 16:17:24 +01:00
q7s_flight_config = "/mnt/sd0/startracker/flight-config.json"
2022-03-01 16:58:06 +01:00
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"
2023-04-13 12:08:00 +02:00
FW_SLOT_Q7S = "/mnt/sd0/startracker/updates/sagitta-update.bin"
2022-02-11 08:46:48 +01:00
2022-02-14 16:52:32 +01:00
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": (
2022-02-27 16:17:24 +01:00
"EGSE get solution, upload image config",
FileDefs.egse_solution_upload_img_config,
),
"6": (
2022-02-27 16:17:24 +01:00
"EGSE get histogram, upload image config",
FileDefs.egse_solution_upload_img_config,
),
2022-02-14 16:52:32 +01:00
}
2023-04-13 12:08:00 +02:00
FW_DICT = {
"0": ("Firmware Update Q7S", FileDefs.FW_SLOT_Q7S),
"1": ("Firmware Major = 2, Minor = 1", FileDefs.firmware2_1),
"2": ("Firmware Major = 22, Minor = 1", FileDefs.firmware22_1),
"3": ("Firmware Origin", FileDefs.firmware_origin),
2022-02-11 08:46:48 +01:00
}
2023-04-14 17:42:09 +02:00
UPLOAD_IMAGE_DICT = {
"0": ("custom path", "Custom Path"),
"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"),
2022-02-27 16:17:24 +01:00
}
2021-12-24 07:32:35 +01:00
2022-02-27 16:17:24 +01:00
class StartRegion:
2021-12-24 07:32:35 +01:00
# Definition according to datasheet (which turned out to be partially faulty)
BOOTLOADER = 0
STAR_TRACKER_FIRMWARE = 1
class PartitionSize:
2022-02-27 16:17:24 +01:00
# Size of most recent firmware image
STAR_TRACKER_FIRMWARE = 464572
2021-08-16 10:03:40 +02:00
class Submode(enum.IntEnum):
DEFAULT = 0
2022-02-23 18:16:10 +01:00
BOOTLOADER = 1
FIRMWARE = 2
2023-04-04 01:24:33 +02:00
def prompt_object_id_mode_cmd() -> bytes:
cmd_assy = input("Command Assembly (0) or Device Handler (1) ?: ")
if cmd_assy == "0":
return STR_ASSEMBLY
else:
return STAR_TRACKER_ID
2022-08-08 16:32:18 +02:00
def pack_star_tracker_commands(
2023-03-10 13:38:21 +01:00
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
2022-08-08 16:32:18 +02:00
):
2022-07-04 17:59:09 +02:00
q.add_log_cmd(
f"Generate command for star tracker with object id: {object_id.as_hex_string}"
2021-08-16 10:03:40 +02:00
)
2022-07-04 17:59:09 +02:00
obyt = object_id.as_bytes
2023-03-03 16:38:17 +01:00
if op_code == OpCodes.ON_BOOTLOADER:
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Mode On, Submode Bootloader")
2023-04-04 01:24:33 +02:00
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.ON, Submode.BOOTLOADER)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
2023-03-03 16:38:17 +01:00
if op_code == OpCodes.ON_FIRMWARE:
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Mode On, Submode Firmware")
2023-04-04 01:24:33 +02:00
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.ON, Submode.FIRMWARE)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
2023-03-03 16:38:17 +01:00
if op_code == OpCodes.NORMAL:
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Mode Normal")
2023-04-04 01:24:33 +02:00
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.NORMAL, 0)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
2023-03-03 16:38:17 +01:00
if op_code == OpCodes.OFF:
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Mode Off")
2023-04-04 01:24:33 +02:00
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.OFF, 0)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
if op_code == OpCodes.REQUEST_SOLUTION_SET_HK:
q.add_log_cmd(Info.REQUEST_SOLUTION_SET_HK)
2023-03-21 17:00:53 +01:00
q.add_pus_tc(create_request_one_diag_command(make_sid(obyt, SetId.SOLUTION)))
if op_code == OpCodes.REQUEST_SOLUTION_SET_ACTION:
q.add_log_cmd("Star tracker: Request solution")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_SOLUTION)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "4":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Mode Raw")
2023-01-16 15:05:33 +01:00
data = pack_mode_data(obyt, Mode.RAW, 0)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
2023-03-03 16:38:17 +01:00
if op_code == OpCodes.PING:
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Ping")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.PING)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "6":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Switch to bootloader program")
data = obyt + struct.pack(
2023-01-16 14:13:06 +01:00
"!I", StarTrackerActionId.SWITCH_TO_BOOTLOADER_PROGRAM
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "7":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Temperature request")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TEMPERATURE)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "8":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request version")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_VERSION)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "9":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request interface")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_INTERFACE)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "10":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request power")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_POWER)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "11":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set subscription parameters")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.SUBSCRIPTION)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "12":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Boot")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.BOOT)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "13":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request time")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TIME)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == OpCodes.UPLOAD_IMAGE:
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Upload image")
2022-02-27 16:17:24 +01:00
image = get_upload_image()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.UPLOAD_IMAGE)
+ bytearray(image, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "16":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Download image")
2022-02-05 15:44:50 +01:00
path = input("Specify storage location (default - /mnt/sd0/startracker): ")
if not path:
2022-02-27 16:17:24 +01:00
path = FileDefs.download_path
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.DOWNLOAD_IMAGE)
+ bytearray(path, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "17":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set limits")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.LIMITS)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "18":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set tracking parameters")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.TRACKING)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "19":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Mounting")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.MOUNTING)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "20":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Camera")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.CAMERA)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "22":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Centroiding")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.CENTROIDING)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "23":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: LISA")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.LISA)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "24":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Matching")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.MATCHING)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "25":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Validation")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.VALIDATION)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "26":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Algo")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.ALGO)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2023-03-21 17:00:53 +01:00
if op_code == OpCodes.TAKE_IMAGE:
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Take image")
actionid = int(
input("Specify parameter ID (4: take image, 7: get histogram): ")
)
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.TAKE_IMAGE)
+ struct.pack("!B", actionid)
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "28":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Stop str helper")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.STOP_STR_HELPER)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "30":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set name of download image")
2021-12-13 07:55:34 +01:00
filename = input("Specify download image name: ")
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.CHANGE_DOWNLOAD_IMAGE)
+ bytearray(filename, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "31":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request histogram")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_HISTOGRAM)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "32":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request contrast")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CONTRAST)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "33":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set json filename")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.SET_JSON_FILE_NAME)
+ bytearray(json_file, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "35":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Flash read")
data = pack_read_command(obyt)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "36":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set flash read filename")
2021-12-24 07:32:35 +01:00
filename = input("Specify filename: ")
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.SET_FLASH_READ_FILENAME)
+ bytearray(filename, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "37":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Get checksum")
data = pack_checksum_command(obyt)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "38":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set time")
2021-12-29 20:33:49 +01:00
unix_time = 1640783543
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.SET_TIME)
+ struct.pack("!Q", unix_time)
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "39":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Download Centroid")
2021-12-29 20:33:49 +01:00
id = 0
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.DOWNLOAD_CENTROID)
+ struct.pack("!B", id)
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "41":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Download matched star")
2021-12-29 20:33:49 +01:00
id = 0
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.DOWNLOAD_MATCHED_STAR)
+ struct.pack("!B", id)
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "42":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Download DB Image")
2021-12-29 20:33:49 +01:00
id = 0
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.DOWNLOAD_DBIMAGE)
+ struct.pack("!B", id)
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "43":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Download Blob Pixel")
2021-12-29 20:33:49 +01:00
id = 0
2022-01-18 14:03:56 +01:00
type = 1 # 0 - normal, 1 - fast
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.DOWNLOAD_BLOBPIXEL)
+ struct.pack("!B", id)
+ struct.pack("!B", type)
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "44":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Download FPGA Image")
2022-01-17 08:40:16 +01:00
position = int(input("Start position: "))
length = int(input("Size to download: "))
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.DOWNLOAD_FPGA_IMAGE)
+ struct.pack("!I", position)
+ struct.pack("!I", length)
+ bytearray(FileDefs.downloadFpgaImagePath, "utf-8")
2022-01-27 16:38:20 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "45":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Change donwload FPGA image file name")
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.CHANGE_FPGA_DOWNLOAD_FILE)
+ bytearray(FileDefs.downloadFpgaImageName, "utf-8")
2022-01-27 16:38:20 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "46":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Upload FPGA image")
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.UPLOAD_FPGA_IMAGE)
+ bytearray(FileDefs.uploadFpgaImageName, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "47":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: FPGA action")
2021-12-30 12:55:24 +01:00
id = 3
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.FPGA_ACTION)
+ struct.pack("!B", id)
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "48":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Unlock")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.UNLOCK)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "49":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request camera parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CAMERA_PARAMS)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "50":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request limits")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LIMITS)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == OpCodes.SET_IMG_PROCESSOR_MODE:
q.add_log_cmd(Info.SET_IMG_PROCESSOR_MODE)
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.IMAGE_PROCESSOR)
+ bytearray(json_file, "utf-8")
2022-02-27 16:17:24 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "52":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: EGSE load ground config camera parameters")
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.CAMERA)
+ bytearray(FileDefs.egse_ground_config, "utf-8")
2022-02-27 16:17:24 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "53":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: EGSE load flight config camera parameters")
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.CAMERA)
+ bytearray(FileDefs.egse_flight_config, "utf-8")
2022-02-27 16:17:24 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "54":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request log level parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LOG_LEVEL)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "55":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request mounting parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_MOUNTING)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "56":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request image processor parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_IMAGE_PROCESSOR)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "57":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request centroiding parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_CENTROIDING)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "58":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request lisa parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LISA)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "59":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request matching parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_MATCHING)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "60":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request tracking parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TRACKING)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "61":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request validation parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_VALIDATION)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "62":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request algo parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_ALGO)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "63":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request subscription parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_SUBSCRIPTION)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "64":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request log subscription parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LOG_SUBSCRIPTION)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "65":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Request debug camera parameters")
2023-01-16 14:13:06 +01:00
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_DEBUG_CAMERA)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "66":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set log level parameters")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.LOGLEVEL)
+ bytearray(json_file, "utf-8")
2022-02-27 16:17:24 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "67":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set log subscription parameters")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.LOG_SUBSCRIPTION)
+ bytearray(json_file, "utf-8")
2022-02-27 16:17:24 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2022-02-23 18:16:10 +01:00
if op_code == "68":
2022-07-04 17:59:09 +02:00
q.add_log_cmd("Star tracker: Set debug camera parameters")
2022-02-27 16:17:24 +01:00
json_file = get_config_file()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.DEBUG_CAMERA)
+ bytearray(json_file, "utf-8")
2022-02-27 16:17:24 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2023-04-13 12:08:00 +02:00
if op_code == OpCodes.FW_UPDATE:
q.add_log_cmd(Info.FW_UPDATE)
2022-02-14 16:52:32 +01:00
firmware = get_firmware()
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
obyt
+ struct.pack("!I", StarTrackerActionId.FIRMWARE_UPDATE)
2023-04-13 12:08:00 +02:00
+ firmware.encode()
2022-02-27 16:17:24 +01:00
)
2022-07-04 17:59:09 +02:00
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
2021-12-24 07:32:35 +01:00
2022-07-04 17:59:09 +02:00
def pack_read_command(object_id: bytes) -> bytearray:
2022-02-27 16:17:24 +01:00
start_region = StartRegion.STAR_TRACKER_FIRMWARE
2021-12-24 07:32:35 +01:00
size = PartitionSize.STAR_TRACKER_FIRMWARE
2022-02-27 16:17:24 +01:00
path = input("Specify storage location (default - /mnt/sd0/startracker): ")
if not path:
path = FileDefs.download_path
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
object_id
+ struct.pack("!I", StarTrackerActionId.FLASH_READ)
+ struct.pack("!B", start_region)
+ struct.pack("!I", size)
+ bytearray(path, "utf-8")
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
return bytearray(data)
2021-12-24 07:32:35 +01:00
2022-07-04 17:59:09 +02:00
def pack_checksum_command(object_id: bytes) -> bytearray:
2022-02-27 16:17:24 +01:00
start_region = StartRegion.STAR_TRACKER_FIRMWARE
2021-12-24 07:32:35 +01:00
address = 0
size = PartitionSize.STAR_TRACKER_FIRMWARE
2022-07-04 17:59:09 +02:00
data = (
2023-03-10 13:38:21 +01:00
object_id
+ struct.pack("!I", StarTrackerActionId.CHECKSUM)
+ struct.pack("!B", start_region)
+ struct.pack("!I", address)
+ struct.pack("!I", size)
2022-01-18 14:03:56 +01:00
)
2022-07-04 17:59:09 +02:00
return bytearray(data)
2022-02-11 08:46:48 +01:00
def get_config_file() -> str:
2023-02-01 11:17:04 +01:00
_LOGGER.info("Specify json file")
2022-02-14 16:52:32 +01:00
input_helper = InputHelper(json_dict)
key = input_helper.get_key()
2022-02-27 16:17:24 +01:00
json_file = json_dict[key][1]
return json_file
2022-02-11 08:46:48 +01:00
2022-02-14 16:52:32 +01:00
def get_firmware() -> str:
2023-02-01 11:17:04 +01:00
_LOGGER.info("Specify firmware file")
2023-04-13 12:08:00 +02:00
bin_select = int(input("Use hardcoded paths (0) or specify path manually (1) ?: "))
if bin_select == 0:
input_helper = InputHelper(FW_DICT)
key = input_helper.get_key()
firmware = FW_DICT[key][1]
else:
firmware = input("Specify absolute path of the firmware update file: ")
2022-02-14 16:52:32 +01:00
return firmware
2022-02-27 16:17:24 +01:00
def get_upload_image() -> str:
2023-02-01 11:17:04 +01:00
_LOGGER.info("Specify image to upload")
2023-04-14 17:42:09 +02:00
input_helper = InputHelper(UPLOAD_IMAGE_DICT)
2022-02-27 16:17:24 +01:00
key = input_helper.get_key()
2023-04-14 17:42:09 +02:00
if UPLOAD_IMAGE_DICT[key][0] == "custom path":
image = input("Please specify custom absolute path: ")
else:
image = UPLOAD_IMAGE_DICT[key][1]
2022-02-27 16:17:24 +01:00
return image
2023-03-03 16:38:17 +01:00
2023-03-08 19:57:28 +01:00
def handle_str_hk_data(set_id: int, hk_data: bytes, printer: FsfwTmTcPrinter):
pw = PrintWrapper(printer)
pw.dlog(f"Received STR HK set with set ID {set_id}")
if set_id == SetId.SOLUTION:
handle_solution_set(hk_data, pw)
2023-03-13 10:53:41 +01:00
elif set_id == SetId.TEMPERATURE:
handle_temperature_set(hk_data, pw)
2023-03-08 19:57:28 +01:00
else:
_LOGGER.warning(f"HK parsing for Star Tracker set ID {set_id} unimplemented")
2023-03-13 10:51:55 +01:00
def unpack_time_hk(hk_data: bytes, current_idx: int, pw: PrintWrapper) -> int:
2023-03-08 19:57:28 +01:00
ticks_time_fmt = "!IQ"
fmt_len = struct.calcsize(ticks_time_fmt)
(ticks, unix_time) = struct.unpack(
2023-03-10 13:38:21 +01:00
ticks_time_fmt, hk_data[current_idx : current_idx + fmt_len]
2023-03-08 19:57:28 +01:00
)
2023-03-21 17:00:53 +01:00
unix_as_dt = datetime.datetime.fromtimestamp(
2023-03-21 23:27:42 +01:00
int(round(unix_time / 10e6)), tz=datetime.timezone.utc
2023-03-21 17:00:53 +01:00
)
2023-03-08 19:57:28 +01:00
pw.dlog(f"Ticks: {ticks} | UNIX time: {unix_time}")
pw.dlog(f"UNIX as datetime: {unix_as_dt}")
current_idx += fmt_len
2023-03-13 10:51:55 +01:00
return current_idx
def handle_temperature_set(hk_data: bytes, pw: PrintWrapper):
pw.dlog("Received temperature set")
if len(hk_data) < 24:
_LOGGER.warning(f"Temperature dataset HK with length {len(hk_data)} too short")
current_idx = unpack_time_hk(hk_data, 0, pw)
temps_fmt = "!fff"
fmt_len = struct.calcsize(temps_fmt)
(mcu_temp, cmos_temp, fpga_temp) = struct.unpack(
temps_fmt, hk_data[current_idx : current_idx + fmt_len]
)
pw.dlog(f"MCU Temperature: {mcu_temp}")
pw.dlog(f"CMOS Temperature: {cmos_temp}")
pw.dlog(f"FPGA Temperature: {fpga_temp}")
current_idx += fmt_len
pw.printer.print_validity_buffer(hk_data[current_idx:], 5)
def handle_solution_set(hk_data: bytes, pw: PrintWrapper):
pw.dlog("Received solution set")
if len(hk_data) < 78:
_LOGGER.warning(
f"Solution dataset HK data with length {len(hk_data)} too short"
)
return
current_idx = unpack_time_hk(hk_data, 0, pw)
2023-03-08 19:57:28 +01:00
calib_quaternions_fmt = "!ffff"
fmt_len = struct.calcsize(calib_quaternions_fmt)
(calib_q_w, calib_q_x, calib_q_y, calib_q_z) = struct.unpack(
2023-03-10 13:38:21 +01:00
calib_quaternions_fmt, hk_data[current_idx : current_idx + fmt_len]
2023-03-08 19:57:28 +01:00
)
pw.dlog("Calibrated Quaternions")
pw.dlog(f"Quaternion w: {calib_q_w}")
pw.dlog(f"Quaternion x: {calib_q_x}")
pw.dlog(f"Quaternion y: {calib_q_y}")
pw.dlog(f"Quaternion z: {calib_q_z}")
current_idx += fmt_len
track_fmt = "!fffff"
fmt_len = struct.calcsize(track_fmt)
(track_confidence, track_q_w, track_q_x, track_q_y, track_q_z) = struct.unpack(
2023-03-10 13:38:21 +01:00
track_fmt, hk_data[current_idx : current_idx + fmt_len]
2023-03-08 19:57:28 +01:00
)
pw.dlog(f"Track Confidence: {track_confidence}")
pw.dlog(f"Track QW: {track_q_w}")
pw.dlog(f"Track QX: {track_q_x}")
pw.dlog(f"Track QY: {track_q_y}")
pw.dlog(f"Track QZ: {track_q_z}")
current_idx += fmt_len
track_removed = hk_data[current_idx]
pw.dlog(f"Number of stars removed from tracking solution: {track_removed}")
current_idx += 1
stars_centroided = hk_data[current_idx]
pw.dlog(f"Centroided stars: {stars_centroided}")
current_idx += 1
stars_matched_database = hk_data[current_idx]
pw.dlog(f"Stars matched: {stars_matched_database}")
current_idx += 1
# Result of LISA: Lost in space algorithm
lisa_fmt = "!fffffB"
2023-03-13 10:52:31 +01:00
fmt_len = struct.calcsize(lisa_fmt)
2023-03-10 13:38:21 +01:00
(
lisa_q_w,
lisa_q_x,
lisa_q_y,
lisa_q_z,
lisa_percentage_close_stars,
lisa_number_close_stars,
) = struct.unpack(lisa_fmt, hk_data[current_idx : current_idx + fmt_len])
2023-03-08 19:57:28 +01:00
pw.dlog(f"LISA QW: {lisa_q_w}")
pw.dlog(f"LISA QX: {lisa_q_x}")
pw.dlog(f"LISA QY: {lisa_q_y}")
pw.dlog(f"LISA QZ: {lisa_q_z}")
2023-03-10 13:38:21 +01:00
pw.dlog(
f"Percentage of close stars in LISA solution: {lisa_percentage_close_stars}"
)
2023-03-10 13:16:14 +01:00
pw.dlog(f"Number of close stars in LISA solution: {lisa_number_close_stars}")
2023-03-08 19:57:28 +01:00
current_idx += fmt_len
2023-04-14 17:42:09 +02:00
str_mode = hk_data[current_idx]
pw.dlog(f"STR mode: {str_mode}")
current_idx += 1
is_trustworthy = hk_data[current_idx]
pw.dlog(f"Trustworthy solution: {is_trustworthy}")
2023-03-08 19:57:28 +01:00
current_idx += 1
2023-03-13 10:57:23 +01:00
stable_count = struct.unpack("!I", hk_data[current_idx : current_idx + 4])[0]
2023-03-08 19:57:28 +01:00
pw.dlog(f"Stable count: {stable_count}")
current_idx += 4
solution_strategy = hk_data[current_idx]
pw.dlog(f"Solution strategy: {solution_strategy}")
2023-03-21 17:00:53 +01:00
current_idx += 1
2023-03-08 19:57:28 +01:00
pw.printer.print_validity_buffer(hk_data[current_idx:], 23)
2023-03-03 16:38:17 +01:00
@tmtc_definitions_provider
def add_str_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
2023-03-21 17:00:53 +01:00
oce.add(OpCodes.ON_BOOTLOADER, "Mode On, Submode Bootloader")
oce.add(OpCodes.ON_FIRMWARE, "Mode On, Submode Firmware")
oce.add(OpCodes.NORMAL, "Mode Normal")
oce.add(OpCodes.OFF, "Mode Off")
# oce.add("4", "Star Tracker: Mode Raw")
2023-03-03 16:38:17 +01:00
oce.add(OpCodes.PING, "Star Tracker: Ping")
2023-03-21 17:00:53 +01:00
oce.add(OpCodes.TAKE_IMAGE, "Take Image")
oce.add(OpCodes.REQUEST_SOLUTION_SET_HK, Info.REQUEST_SOLUTION_SET_HK)
oce.add(OpCodes.REQUEST_SOLUTION_SET_ACTION, Info.REQUEST_SOLUTION_SET_ACTION)
oce.add(OpCodes.UPLOAD_IMAGE, Info.UPLOAD_IMAGE)
oce.add(OpCodes.SET_IMG_PROCESSOR_MODE, Info.SET_IMG_PROCESSOR_MODE)
2023-03-03 16:38:17 +01:00
oce.add("6", "Star Tracker: Switch to bootloader program")
oce.add("7", "Star Tracker: Request temperature")
oce.add("8", "Star Tracker: Request version")
oce.add("9", "Star Tracker: Request interface")
oce.add("10", "Star Tracker: Request power")
oce.add("11", "Star Tracker: Set subscription parameters")
oce.add("12", "Star Tracker: Boot image (requires bootloader mode)")
oce.add("13", "Star Tracker: Request time")
oce.add("14", "Star Tracker: Request solution")
oce.add("16", "Star Tracker: Download image")
oce.add("17", "Star Tracker: Set limit parameters")
oce.add("17", "Star Tracker: Set limit parameters")
oce.add("18", "Star Tracker: Set tracking parameters")
oce.add("19", "Star Tracker: Set mounting parameters")
oce.add("20", "Star Tracker: Set camera parameters")
oce.add("22", "Star Tracker: Set centroiding parameters")
oce.add("23", "Star Tracker: Set LISA parameters")
oce.add("24", "Star Tracker: Set matching parameters")
oce.add("25", "Star Tracker: Set validation parameters")
oce.add("26", "Star Tracker: Set algo parameters")
oce.add("28", "Star Tracker: Stop str helper")
oce.add("30", "Star Tracker: Set name of download image")
oce.add("31", "Star Tracker: Request histogram")
oce.add("32", "Star Tracker: Request contrast")
oce.add("33", "Star Tracker: Set json filename")
oce.add("35", "Star Tracker: Flash read")
oce.add("36", "Star Tracker: Set flash read filename")
oce.add("37", "Star Tracker: Get checksum")
oce.add("49", "Star Tracker: Request camera parameter")
oce.add("50", "Star Tracker: Request limits")
oce.add("52", "Star Tracker: (EGSE only) Load camera ground config")
oce.add("53", "Star Tracker: (EGSE only) Load camera flight config")
oce.add("54", "Star Tracker: Request log level parameters")
oce.add("55", "Star Tracker: Request mounting parameters")
oce.add("56", "Star Tracker: Request image processor parameters")
oce.add("57", "Star Tracker: Request centroiding parameters")
oce.add("58", "Star Tracker: Request lisa parameters")
oce.add("59", "Star Tracker: Request matching parameters")
oce.add("60", "Star Tracker: Request tracking parameters")
oce.add("61", "Star Tracker: Request validation parameters")
oce.add("62", "Star Tracker: Request algo parameters")
oce.add("63", "Star Tracker: Request subscription parameters")
oce.add("64", "Star Tracker: Request log subscription parameters")
oce.add("65", "Star Tracker: Request debug camera parameters")
oce.add("66", "Star Tracker: Set log level parameters")
oce.add("67", "Star Tracker: Set log subscription parameters")
oce.add("68", "Star Tracker: Set debug camera parameters")
2023-04-13 12:08:00 +02:00
oce.add(OpCodes.FW_UPDATE, Info.FW_UPDATE)
2023-03-03 16:38:17 +01:00
oce.add("70", "Star Tracker: Disable timestamp generation")
oce.add("71", "Star Tracker: Enable timestamp generation")
defs.add_service(CustomServiceList.STAR_TRACKER.value, "Star Tracker", oce)