Compare commits

...

26 Commits

Author SHA1 Message Date
96636d59e9 Merge pull request 'relative timeshift' (#286) from relative-timeshift into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #286
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2024-04-09 14:32:28 +02:00
5a0edbefa8 fix comment block
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2024-04-08 13:38:28 +02:00
5bdba2dbad update events
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2024-04-08 13:35:34 +02:00
3ae6ccfb77 this should do the job 2024-04-08 13:35:06 +02:00
de84bf112b changelog
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2024-04-08 13:25:45 +02:00
d182a9d5ec re-run black 2024-04-08 13:24:40 +02:00
492d364246 relative timeshift
All checks were successful
EIVE/-/pipeline/head This commit looks good
2024-04-08 11:35:05 +02:00
33cf7b1613 Merge pull request 'Fix for Heater Cmd' (#284) from heater-health into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #284
2024-04-02 13:28:06 +02:00
d8c49aed80 Merge branch 'main' into heater-health 2024-04-02 13:27:56 +02:00
97afd24e52 Merge pull request 'EPS command bugfix' (#285) from eps-bugfix into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #285
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2024-03-27 09:01:22 +01:00
4704616ca7 changelog
All checks were successful
EIVE/-/pipeline/head This commit looks good
2024-03-26 17:52:41 +01:00
92c0172b59 bugfix for EPS
All checks were successful
EIVE/-/pipeline/head This commit looks good
2024-03-26 17:50:37 +01:00
49b55f01e3 s
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
2024-03-18 11:11:20 +01:00
f87095bf68 Merge pull request 'STR Improv' (#283) from str-version into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #283
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-14 10:55:59 +01:00
928759d1bc changelog
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2024-03-13 13:47:02 +01:00
dc17919108 smoll fix
Some checks are pending
EIVE/-/pipeline/head Build started...
2024-03-13 13:44:15 +01:00
5f71f27f0e size check
All checks were successful
EIVE/-/pipeline/head This commit looks good
2024-03-13 10:18:37 +01:00
f8d63e56cb version set
All checks were successful
EIVE/-/pipeline/head This commit looks good
2024-03-13 10:00:45 +01:00
c843356c8a Merge pull request 'Prep v6.1.1' (#282) from prep-v6.1.1 into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #282
2024-03-06 11:03:24 +01:00
49a614db10 cleanup
Some checks are pending
EIVE/-/pipeline/head Build started...
2024-03-06 11:02:10 +01:00
c90dd92162 bump version 2024-03-06 10:59:31 +01:00
bcb6a8b34e changelog 2024-03-06 10:59:09 +01:00
ed15bcaf35 Merge pull request 'Leap Seconds' (#281) from leap-seconds into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #281
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-06 10:53:57 +01:00
89202f2cfe changelog
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2024-03-06 09:51:03 +01:00
40c2a4b1f3 remove printout
All checks were successful
EIVE/-/pipeline/head This commit looks good
2024-03-05 11:53:00 +01:00
811786fd78 update leap seconds act cmd
All checks were successful
EIVE/-/pipeline/head This commit looks good
2024-03-05 11:43:18 +01:00
14 changed files with 119 additions and 166 deletions

View File

@ -10,6 +10,21 @@ list yields a list of all related PRs for each release.
# [unreleased] # [unreleased]
## Added
- Added version set for STR.
- Command for relative timeshift.
## Fixed
- EPS power commands working again.
# [v6.1.1] 2024-03-06
## Added
- Added Core Ctrl cmd to update leap seconds.
# [v6.1.0] 2024-02-29 # [v6.1.0] 2024-02-29
## Added ## Added

View File

@ -3,6 +3,7 @@
@details Template configuration file. Copy this folder to the TMTC commander root and adapt @details Template configuration file. Copy this folder to the TMTC commander root and adapt
it to your needs. it to your needs.
""" """
import enum import enum
from tmtccmd import CcsdsTmtcBackend from tmtccmd import CcsdsTmtcBackend

View File

@ -75,9 +75,10 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h 7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h 7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h 7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
8900;0x22c4;CLOCK_SET;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h 8900;0x22c4;CLOCK_SET;INFO;Clock has been set. P1: old timeval seconds. P2: new timeval seconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
8901;0x22c5;CLOCK_DUMP;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h 8901;0x22c5;CLOCK_DUMP_LEGACY;INFO;Clock dump event. P1: timeval seconds P2: timeval milliseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
8902;0x22c6;CLOCK_SET_FAILURE;LOW;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h 8902;0x22c6;CLOCK_SET_FAILURE;LOW;Clock could not be set. P1: Returncode.;fsfw/src/fsfw/pus/Service9TimeManagement.h
8903;0x22c7;CLOCK_DUMP;INFO;Clock dump event. P1: timeval seconds P2: timeval microseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h 9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h 10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h

1 Event ID (dec) Event ID (hex) Name Severity Description File Path
75 7902 0x1ede BIT_LOCK INFO A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0 fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
76 7903 0x1edf BIT_LOCK_LOST INFO A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0 fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
77 7905 0x1ee1 FRAME_PROCESSING_FAILED LOW The CCSDS Board could not interpret a TC fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
78 8900 0x22c4 CLOCK_SET INFO No description Clock has been set. P1: old timeval seconds. P2: new timeval seconds. fsfw/src/fsfw/pus/Service9TimeManagement.h
79 8901 0x22c5 CLOCK_DUMP CLOCK_DUMP_LEGACY INFO No description Clock dump event. P1: timeval seconds P2: timeval milliseconds. fsfw/src/fsfw/pus/Service9TimeManagement.h
80 8902 0x22c6 CLOCK_SET_FAILURE LOW No description Clock could not be set. P1: Returncode. fsfw/src/fsfw/pus/Service9TimeManagement.h
81 8903 0x22c7 CLOCK_DUMP INFO Clock dump event. P1: timeval seconds P2: timeval microseconds. fsfw/src/fsfw/pus/Service9TimeManagement.h
82 9100 0x238c TC_DELETION_FAILED MEDIUM Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
83 9700 0x25e4 TEST INFO No description fsfw/src/fsfw/pus/Service17Test.h
84 10600 0x2968 CHANGE_OF_SETUP_PARAMETER LOW No description fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h

View File

@ -3,6 +3,7 @@
@details Template configuration file. Copy this folder to the TMTC commander root and adapt @details Template configuration file. Copy this folder to the TMTC commander root and adapt
it to your needs. it to your needs.
""" """
import logging import logging
import os.path import os.path
from typing import Dict from typing import Dict

View File

@ -1,5 +1,6 @@
"""Hook function which packs telecommands based on service and operation code string """Hook function which packs telecommands based on service and operation code string
""" """
import logging import logging
from typing import List, cast from typing import List, cast
@ -116,9 +117,9 @@ def handle_pus_procedure(
def handle_eps_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]): def handle_eps_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
obj_id_man = get_object_ids() obj_id_man = get_object_ids()
if len(cmd_path_list) == 1: assert len(cmd_path_list) >= 1
return pack_power_commands(queue_helper, cmd_path_list[0]) if cmd_path_list[0] == "power":
assert len(cmd_path_list) >= 2 return pack_power_commands(queue_helper, cmd_path_list[1])
if cmd_path_list[0] == "pwr_ctrl": if cmd_path_list[0] == "pwr_ctrl":
return pack_power_ctrl_command(queue_helper, cmd_path_list[1]) return pack_power_ctrl_command(queue_helper, cmd_path_list[1])
if cmd_path_list[0] == "p60_dock": if cmd_path_list[0] == "p60_dock":

View File

@ -122,12 +122,18 @@ def handle_event_packet( # noqa C901: Complexity okay here
new_time_dt = datetime.datetime.fromtimestamp(new_time, datetime.timezone.utc) new_time_dt = datetime.datetime.fromtimestamp(new_time, datetime.timezone.utc)
pw.dlog(f"Old time (UTC): {old_time_dt}") pw.dlog(f"Old time (UTC): {old_time_dt}")
pw.dlog(f"New time (UTC): {new_time_dt}") pw.dlog(f"New time (UTC): {new_time_dt}")
if info.name == "CLOCK_DUMP": if info.name == "CLOCK_DUMP_LEGACY":
specific_handler = True specific_handler = True
# param 1 is timeval seconds, param 2 is timeval subsecond milliseconds # param 1 is timeval seconds, param 2 is timeval subsecond milliseconds
time = event_def.param1 + event_def.param2 / 1000.0 time = event_def.param1 + event_def.param2 / 1000.0
time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc) time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc)
pw.dlog(f"Current time: {time_dt}") pw.dlog(f"Current time: {time_dt}")
if info.name == "CLOCK_DUMP":
specific_handler = True
# param 1 is timeval seconds, param 2 is timeval subsecond microseconds
time = event_def.param1 + event_def.param2 / 1000000.0
time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc)
pw.dlog(f"Current time: {time_dt}")
if info.name == "ACTIVE_SD_INFO": if info.name == "ACTIVE_SD_INFO":
sd_0_state = (event_def.param2 >> 16) & 0xFFFF sd_0_state = (event_def.param2 >> 16) & 0xFFFF
sd_1_state = event_def.param2 & 0xFFFF sd_1_state = event_def.param2 & 0xFFFF

View File

@ -1,4 +1,5 @@
"""HK Handling for EIVE OBSW""" """HK Handling for EIVE OBSW"""
import dataclasses import dataclasses
import logging import logging
import base64 # noqa import base64 # noqa

View File

@ -1,5 +1,6 @@
"""Core EIVE TM handler module """Core EIVE TM handler module
""" """
import logging import logging
import sqlite3 import sqlite3
import uuid import uuid

View File

@ -7,12 +7,7 @@ import struct
from socket import AF_INET from socket import AF_INET
from typing import Tuple from typing import Tuple
from tmtccmd.config.tmtc import ( from tmtccmd.config.tmtc import CmdTreeNode
CmdTreeNode,
OpCodeEntry,
TmtcDefinitionWrapper,
tmtc_definitions_provider,
)
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.pus.s8_fsfw_action import create_action_cmd from tmtccmd.pus.s8_fsfw_action import create_action_cmd
from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd from tmtccmd.pus.s20_fsfw_param import create_load_param_cmd
@ -37,7 +32,6 @@ from tmtccmd.pus.tc.s3_fsfw_hk import (
) )
from tmtccmd.tmtc.queue import DefaultPusQueueHelper from tmtccmd.tmtc.queue import DefaultPusQueueHelper
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import ACS_CONTROLLER from eive_tmtc.config.object_ids import ACS_CONTROLLER
from eive_tmtc.pus_tm.defs import PrintWrapper from eive_tmtc.pus_tm.defs import PrintWrapper
from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode

View File

@ -140,9 +140,15 @@ class OpCode:
SELECT_TARGET_FIRMWARE_BACKUP = "fw_backup" SELECT_TARGET_FIRMWARE_BACKUP = "fw_backup"
SELECT_TARGET_FIRMWARE_MAIN_PERSISTENT = "fw_main_persistent" SELECT_TARGET_FIRMWARE_MAIN_PERSISTENT = "fw_main_persistent"
SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT = "fw_backup_persistent" SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT = "fw_backup_persistent"
REQUEST_VERSION = "request_version"
class Info: class Info:
ON_BOOTLOADER = "Switch to Mode On, Submode Bootloder"
ON_FIRMWARE = "Switch to Mode On, Submode Firmware"
NORMAL = "Switch to Mode Normal"
OFF = "Switch to Mode Off"
PING = "Send Ping"
ONE_SHOOT_HK = "One shoot HK Set" ONE_SHOOT_HK = "One shoot HK Set"
ENABLE_HK = "Enable Periodic HK" ENABLE_HK = "Enable Periodic HK"
DISABLE_HK = "Disable Periodic HK" DISABLE_HK = "Disable Periodic HK"
@ -163,6 +169,7 @@ class Info:
SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT = ( SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT = (
"Select backup firmware slot persistently" "Select backup firmware slot persistently"
) )
REQUEST_VERSION = "Request the active Firmware Version"
class SetId(enum.IntEnum): class SetId(enum.IntEnum):
@ -316,10 +323,6 @@ def pack_star_tracker_commands( # noqa C901
q.add_log_cmd("Star tracker: Temperature request") q.add_log_cmd("Star tracker: Temperature request")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TEMPERATURE) data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TEMPERATURE)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data)) q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if cmd_str == "8":
q.add_log_cmd("Star tracker: Request version")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_VERSION)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if cmd_str == "9": if cmd_str == "9":
q.add_log_cmd("Star tracker: Request interface") q.add_log_cmd("Star tracker: Request interface")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_INTERFACE) data = obyt + struct.pack("!I", StarTrackerActionId.REQ_INTERFACE)
@ -730,6 +733,13 @@ def pack_star_tracker_commands( # noqa C901
if cmd_str == OpCode.SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT: if cmd_str == OpCode.SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT:
q.add_log_cmd(Info.SELECT_TARGET_FIRMWARE_BACKUP) q.add_log_cmd(Info.SELECT_TARGET_FIRMWARE_BACKUP)
q.add_pus_tc(create_update_firmware_target_cmd(True, FirmwareTarget.BACKUP)) q.add_pus_tc(create_update_firmware_target_cmd(True, FirmwareTarget.BACKUP))
if cmd_str == OpCode.REQUEST_VERSION:
q.add_log_cmd(Info.REQUEST_VERSION)
q.add_pus_tc(
create_action_cmd(
object_id=STAR_TRACKER_ID, action_id=StarTrackerActionId.REQ_VERSION
)
)
def create_update_firmware_target_cmd( def create_update_firmware_target_cmd(
@ -880,6 +890,8 @@ def handle_str_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
handle_contrast_set(hk_data, pw) handle_contrast_set(hk_data, pw)
elif set_id == SetId.BLOB_STATS: elif set_id == SetId.BLOB_STATS:
handle_blob_stats_set(hk_data, pw) handle_blob_stats_set(hk_data, pw)
elif set_id == SetId.VERSION:
handle_version_set(hk_data, pw)
else: else:
_LOGGER.warning(f"HK parsing for Star Tracker set ID {set_id} unimplemented") _LOGGER.warning(f"HK parsing for Star Tracker set ID {set_id} unimplemented")
@ -902,6 +914,25 @@ def unpack_time_hk(hk_data: bytes, current_idx: int, pw: PrintWrapper) -> int:
return current_idx return current_idx
def handle_version_set(hk_data: bytes, pw: PrintWrapper):
pw.dlog("Received Version Set")
if len(hk_data) != 16:
_LOGGER.warning(
f"Version dataset HK with length {len(hk_data)} of unexpected size"
)
current_idx = unpack_time_hk(hk_data, 0, pw)
program = struct.unpack("!B", hk_data[current_idx : current_idx + 1])[0]
pw.dlog(f"Program: {program}")
current_idx += 1
major = struct.unpack("!B", hk_data[current_idx : current_idx + 1])[0]
pw.dlog(f"Major: {major}")
current_idx += 1
minor = struct.unpack("!B", hk_data[current_idx : current_idx + 1])[0]
pw.dlog(f"Minor: {minor}")
current_idx += 1
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=5))
def handle_temperature_set(hk_data: bytes, pw: PrintWrapper): def handle_temperature_set(hk_data: bytes, pw: PrintWrapper):
pw.dlog("Received temperature set") pw.dlog("Received temperature set")
if len(hk_data) < 24: if len(hk_data) < 24:
@ -1208,7 +1239,7 @@ def handle_blob_stats_set(hk_data: bytes, pw: PrintWrapper):
i, noise_list[i], threshold_list[i], lvalid_list[i], oflow_list[i] i, noise_list[i], threshold_list[i], lvalid_list[i], oflow_list[i]
) )
) )
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=4)) pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=6))
def handle_star_tracker_action_replies( def handle_star_tracker_action_replies(
@ -1251,60 +1282,15 @@ def handle_read_secondary_tm_set(pw: PrintWrapper, custom_data: bytes):
def create_str_node() -> CmdTreeNode: def create_str_node() -> CmdTreeNode:
# Zip the two classes together into a dictionary
op_code_strs = [
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
]
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
combined_dict = dict(zip(op_code_strs, info_strs))
node = CmdTreeNode( node = CmdTreeNode(
"str", "Star Tracker Device", hide_children_which_are_leaves=True "str", "Star Tracker Device", hide_children_which_are_leaves=True
) )
node.add_child(CmdTreeNode(OpCode.ON_BOOTLOADER, "Mode On, Submode Bootloader")) for op_code, info in combined_dict.items():
node.add_child(CmdTreeNode(OpCode.ON_FIRMWARE, "Mode On, Submode Firmware")) node.add_child(CmdTreeNode(op_code, info))
node.add_child(CmdTreeNode(OpCode.NORMAL, "Mode Normal"))
node.add_child(CmdTreeNode(OpCode.OFF, "Mode Off"))
node.add_child(CmdTreeNode(OpCode.PING, "Star Tracker: Ping"))
node.add_child(CmdTreeNode(OpCode.TAKE_IMAGE, "Take Image"))
node.add_child(CmdTreeNode(OpCode.UPLOAD_IMAGE, Info.UPLOAD_IMAGE))
node.add_child(CmdTreeNode(OpCode.DOWNLOAD_IMAGE, Info.DOWNLOAD_IMAGE))
node.add_child(CmdTreeNode(OpCode.ONE_SHOOT_HK, Info.ONE_SHOOT_HK))
node.add_child(CmdTreeNode(OpCode.ENABLE_HK, Info.ENABLE_HK))
node.add_child(CmdTreeNode(OpCode.DISABLE_HK, Info.DISABLE_HK))
node.add_child(
CmdTreeNode(OpCode.SET_IMG_PROCESSOR_MODE, Info.SET_IMG_PROCESSOR_MODE)
)
node.add_child(
CmdTreeNode(
OpCode.ADD_SECONDARY_TM_TO_NORMAL_MODE,
Info.ADD_SECONDARY_TM_TO_NORMAL_MODE,
)
)
node.add_child(
CmdTreeNode(OpCode.READ_SECONDARY_TM_SET, Info.READ_SECONDARY_TM_SET)
)
node.add_child(
CmdTreeNode(OpCode.RESET_SECONDARY_TM_SET, Info.RESET_SECONDARY_TM_SET)
)
node.add_child(CmdTreeNode(OpCode.FW_UPDATE_MAIN, Info.FW_UPDATE_MAIN))
node.add_child(CmdTreeNode(OpCode.FW_UPDATE_BACKUP, Info.FW_UPDATE_BACKUP))
node.add_child(
CmdTreeNode(
OpCode.SELECT_TARGET_FIRMWARE_MAIN, Info.SELECT_TARGET_FIRMWARE_MAIN
)
)
node.add_child(
CmdTreeNode(
OpCode.SELECT_TARGET_FIRMWARE_BACKUP, Info.SELECT_TARGET_FIRMWARE_BACKUP
)
)
node.add_child(
CmdTreeNode(
OpCode.SELECT_TARGET_FIRMWARE_MAIN_PERSISTENT,
Info.SELECT_TARGET_FIRMWARE_MAIN_PERSISTENT,
)
)
node.add_child(
CmdTreeNode(
OpCode.SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT,
Info.SELECT_TARGET_FIRMWARE_BACKUP_PERSISTENT,
)
)
node.add_child(
CmdTreeNode(OpCode.SET_TIME_FROM_SYS_TIME, Info.SET_TIME_FROM_SYS_TIME)
)
return node return node

View File

@ -6,7 +6,7 @@ from pathlib import Path
from typing import Tuple from typing import Tuple
from spacepackets.ecss import PusTelecommand from spacepackets.ecss import PusTelecommand
from tmtccmd.config import CmdTreeNode, TmtcDefinitionWrapper from tmtccmd.config import CmdTreeNode
from tmtccmd.tmtc import DefaultPusQueueHelper from tmtccmd.tmtc import DefaultPusQueueHelper
from tmtccmd.pus.s8_fsfw_action import create_action_cmd from tmtccmd.pus.s8_fsfw_action import create_action_cmd
@ -15,14 +15,12 @@ from tmtccmd.pus.s20_fsfw_param import (
create_scalar_u8_parameter, create_scalar_u8_parameter,
create_load_param_cmd, create_load_param_cmd,
) )
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.pus.s11_tc_sched import ( from tmtccmd.pus.s11_tc_sched import (
create_enable_tc_sched_cmd, create_enable_tc_sched_cmd,
create_disable_tc_sched_cmd, create_disable_tc_sched_cmd,
) )
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID
from eive_tmtc.pus_tm.defs import PrintWrapper from eive_tmtc.pus_tm.defs import PrintWrapper
@ -71,6 +69,7 @@ class ActionId(enum.IntEnum):
RM_HELPER = 54 RM_HELPER = 54
MKDIR_HELPER = 55 MKDIR_HELPER = 55
ENABLE_SCHEDULER = 56 ENABLE_SCHEDULER = 56
UPDATE_LEAP_SECONRS = 60
class ParamId(enum.IntEnum): class ParamId(enum.IntEnum):
@ -122,6 +121,7 @@ class OpCode:
AUTO_SWITCH_DISABLE = "auto_switch_disable" AUTO_SWITCH_DISABLE = "auto_switch_disable"
ENABLE_SCHEDULER = "enable_scheduler" ENABLE_SCHEDULER = "enable_scheduler"
DISABLE_SCHEDULER = "disable_scheduler" DISABLE_SCHEDULER = "disable_scheduler"
UPDATE_LEAP_SECONDS = "leap_seconds_update"
class Info: class Info:
@ -165,6 +165,7 @@ class Info:
AUTO_SWITCH_DISABLE = "Disable Auto-Switch Feature" AUTO_SWITCH_DISABLE = "Disable Auto-Switch Feature"
ENABLE_SCHEDULER = "Enable scheduler" ENABLE_SCHEDULER = "Enable scheduler"
DISABLE_SCHEDULER = "Disable scheduler" DISABLE_SCHEDULER = "Disable scheduler"
UPDATE_LEAP_SECONDS = "Updates the Leap Seconds"
class Chip(enum.IntEnum): class Chip(enum.IntEnum):
@ -197,90 +198,6 @@ def create_core_node() -> CmdTreeNode:
return node return node
@tmtc_definitions_provider
def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCode.ANNOUNCE_VERSION, info=Info.ANNOUNCE_VERSION)
oce.add(keys=OpCode.ANNOUNCE_CURRENT_IMAGE, info=Info.ANNOUNCE_CURRENT_IMAGE)
oce.add(keys=OpCode.ANNOUNCE_BOOT_COUNTS, info=Info.ANNOUNCE_BOOT_COUNTS)
oce.add(keys=OpCode.REBOOT_XSC, info=Info.REBOOT_XSC)
oce.add(keys=OpCode.REBOOT_XSC, info=Info.REBOOT_XSC)
oce.add(keys=OpCode.REBOOT_FULL, info=Info.REBOOT_FULL)
oce.add(keys=OpCode.XSC_REBOOT_SELF, info="Reboot Self")
oce.add(keys=OpCode.XSC_REBOOT_0_0, info="Reboot 0 0")
oce.add(keys=OpCode.XSC_REBOOT_0_1, info="Reboot 0 1")
oce.add(keys=OpCode.XSC_REBOOT_1_0, info="Reboot 1 0")
oce.add(keys=OpCode.XSC_REBOOT_1_1, info="Reboot 1 1")
oce.add(keys=OpCode.SET_PREF_SD, info=Info.SET_PREF_SD)
oce.add(
keys=OpCode.READ_REBOOT_MECHANISM_INFO, info=Info.READ_REBOOT_MECHANISM_INFO
)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
oce.add(keys=OpCode.AUTO_SWITCH_ENABLE, info=Info.AUTO_SWITCH_ENABLE)
oce.add(keys=OpCode.AUTO_SWITCH_DISABLE, info=Info.AUTO_SWITCH_DISABLE)
oce.add(keys=OpCode.SYSTEMCTL_CMD_EXECUTOR, info=Info.SYSTEMCTL_CMD_EXECUTOR)
oce.add(
keys=OpCode.EXECUTE_SHELL_CMD_BLOCKING, info=Info.EXECUTE_SHELL_CMD_BLOCKING
)
oce.add(
keys=OpCode.EXECUTE_SHELL_CMD_NON_BLOCKING,
info=Info.EXECUTE_SHELL_CMD_NON_BLOCKING,
)
oce.add(
keys=OpCode.GET_HK,
info="Request housekeeping set",
)
oce.add(
keys=OpCode.ENABLE_REBOOT_FILE_HANDLING,
info="Enable reboot file handling",
)
oce.add(
keys=OpCode.DISABLE_REBOOT_FILE_HANDLING,
info="Disable reboot file handling",
)
oce.add(
keys=OpCode.RESET_ALL_REBOOT_COUNTERS,
info="Reset all reboot counters",
)
oce.add(
keys=OpCode.RWD_RESET_REBOOT_COUNTER_00,
info="Reset reboot counter 0 0",
)
oce.add(
keys=OpCode.RWD_RESET_REBOOT_COUNTER_01,
info="Reset reboot counter 0 1",
)
oce.add(
keys=OpCode.RWD_RESET_REBOOT_COUNTER_10,
info="Reset reboot counter 1 0",
)
oce.add(
keys=OpCode.RWD_RESET_REBOOT_COUNTER_11,
info="Reset reboot counter 1 1",
)
oce.add(
keys=OpCode.RWD_SET_MAX_REBOOT_CNT,
info="Reset max reboot count for reboot watchdog",
)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
oce.add(keys=OpCode.SWITCH_TO_SD_0, info=Info.SWITCH_TO_SD_0)
oce.add(keys=OpCode.SWITCH_TO_SD_1, info=Info.SWITCH_TO_SD_1)
oce.add(keys=OpCode.SWITCH_TO_BOTH_SD_CARDS, info=Info.SWITCH_TO_BOTH_SD_CARDS)
oce.add(keys=OpCode.LIST_DIR_INTO_FILE, info=Info.LIST_DIR_INTO_FILE)
oce.add(keys=OpCode.LIST_DIR_DUMP_DIRECTLY, info=Info.LIST_DIR_DUMP_DIRECTLY)
oce.add(keys=OpCode.MV_HELPER, info=Info.MV_HELPER)
oce.add(keys=OpCode.CP_HELPER, info=Info.CP_HELPER)
oce.add(keys=OpCode.RM_HELPER, info=Info.RM_HELPER)
oce.add(keys=OpCode.MKDIR_HELPER, info=Info.MKDIR_HELPER)
oce.add(keys=OpCode.ENABLE_SCHEDULER, info=Info.ENABLE_SCHEDULER)
oce.add(keys=OpCode.DISABLE_SCHEDULER, info=Info.DISABLE_SCHEDULER)
defs.add_service(CustomServiceList.CORE.value, "Core Controller", oce)
def pack_core_commands( # noqa C901 def pack_core_commands( # noqa C901
q: DefaultPusQueueHelper, cmd_str: str q: DefaultPusQueueHelper, cmd_str: str
): # noqa: C901 , complexity okay here ): # noqa: C901 , complexity okay here
@ -557,6 +474,16 @@ def pack_core_commands( # noqa C901
elif cmd_str == OpCode.DISABLE_SCHEDULER: elif cmd_str == OpCode.DISABLE_SCHEDULER:
q.add_log_cmd(Info.DISABLE_SCHEDULER) q.add_log_cmd(Info.DISABLE_SCHEDULER)
q.add_pus_tc(create_disable_tc_sched_cmd()) q.add_pus_tc(create_disable_tc_sched_cmd())
elif cmd_str == OpCode.UPDATE_LEAP_SECONDS:
q.add_log_cmd(Info.UPDATE_LEAP_SECONDS)
leap_seconds = int(input("Specify new Leap Seconds Value: ")).to_bytes(
length=2, signed=False, byteorder="big"
)
q.add_pus_tc(
create_action_cmd(
CORE_CONTROLLER_ID, ActionId.UPDATE_LEAP_SECONRS, leap_seconds
)
)
else: else:
_LOGGER.warning( _LOGGER.warning(
f"Unknown operation code {cmd_str} for core controller commands" f"Unknown operation code {cmd_str} for core controller commands"

View File

@ -59,7 +59,7 @@ CTN = CmdTreeNode
def create_heater_node() -> CmdTreeNode: def create_heater_node() -> CmdTreeNode:
node = CmdTreeNode("heater", "Heater Device", hide_children_which_are_leaves=True) node = CmdTreeNode("heaters", "Heater Device", hide_children_which_are_leaves=True)
node.add_child(CTN(OpCode.HEATER_CMD, Info.HEATER_CMD)) node.add_child(CTN(OpCode.HEATER_CMD, Info.HEATER_CMD))
node.add_child(CTN(OpCode.HEATER_HEALTHY_CMD, Info.HEATER_HEALTHY_CMD)) node.add_child(CTN(OpCode.HEATER_HEALTHY_CMD, Info.HEATER_HEALTHY_CMD))
node.add_child(CTN(OpCode.HEATER_EXT_CTRL, Info.HEATER_EXT_CTRL)) node.add_child(CTN(OpCode.HEATER_EXT_CTRL, Info.HEATER_EXT_CTRL))

View File

@ -1,6 +1,7 @@
import enum import enum
import struct
import logging import logging
from datetime import datetime import datetime
from spacepackets.ecss import PusTelecommand, PusService from spacepackets.ecss import PusTelecommand, PusService
@ -8,28 +9,34 @@ from tmtccmd.tmtc import DefaultPusQueueHelper
from tmtccmd.config import CmdTreeNode from tmtccmd.config import CmdTreeNode
_LOGGER = logging.getLogger(__name__)
class Subservice(enum.IntEnum): class Subservice(enum.IntEnum):
SET_TIME = 128 SET_TIME = 128
DUMP_TIME = 129 DUMP_TIME = 129
RELATIVE_TIMESHIFT = 130
class CmdStr: class CmdStr:
SET_CURRENT_TIME = "set_curr_time" SET_CURRENT_TIME = "set_curr_time"
RELATIVE_TIMESHIFT = "relative_timeshift"
DUMP_TIME = "dump_time" DUMP_TIME = "dump_time"
class Info: class Info:
SET_CURRENT_TIME = "Setting current time in ASCII format" SET_CURRENT_TIME = "Setting current time in ASCII format"
RELATIVE_TIMESHIFT = "Shift time with a relative offset"
DUMP_TIME = "Dump system time as event" DUMP_TIME = "Dump system time as event"
def pack_time_management_cmd(q: DefaultPusQueueHelper, cmd_str: str): def pack_time_management_cmd(q: DefaultPusQueueHelper, cmd_str: str):
if cmd_str == CmdStr.SET_CURRENT_TIME: if cmd_str == CmdStr.SET_CURRENT_TIME:
current_time = datetime.utcnow().isoformat() + "Z" + "\0" current_time = (
current_time_ascii = current_time.encode("ascii") datetime.datetime.now(datetime.timezone.utc).isoformat() + "Z" + "\0"
logging.getLogger(__name__).info(
f"Current time in ASCII format: {current_time_ascii}"
) )
current_time_ascii = current_time.encode("ascii")
_LOGGER.info(f"Current time in ASCII format: {current_time_ascii}")
q.add_log_cmd(Info.SET_CURRENT_TIME) q.add_log_cmd(Info.SET_CURRENT_TIME)
q.add_pus_tc( q.add_pus_tc(
PusTelecommand( PusTelecommand(
@ -38,6 +45,17 @@ def pack_time_management_cmd(q: DefaultPusQueueHelper, cmd_str: str):
app_data=current_time_ascii, app_data=current_time_ascii,
) )
) )
elif cmd_str == CmdStr.RELATIVE_TIMESHIFT:
nanos = int(input("Specify relative timeshift in nanoseconds: "))
nanos_packed = struct.pack("!q", nanos)
q.add_log_cmd(Info.RELATIVE_TIMESHIFT)
q.add_pus_tc(
PusTelecommand(
service=PusService.S9_TIME_MGMT,
subservice=Subservice.RELATIVE_TIMESHIFT,
app_data=nanos_packed,
)
)
elif cmd_str == CmdStr.DUMP_TIME: elif cmd_str == CmdStr.DUMP_TIME:
q.add_log_cmd(Info.DUMP_TIME) q.add_log_cmd(Info.DUMP_TIME)
q.add_pus_tc( q.add_pus_tc(
@ -51,4 +69,5 @@ def create_time_node() -> CmdTreeNode:
time_node = CmdTreeNode("time", "Time Management") time_node = CmdTreeNode("time", "Time Management")
time_node.add_child(CmdTreeNode(CmdStr.SET_CURRENT_TIME, "Set current time")) time_node.add_child(CmdTreeNode(CmdStr.SET_CURRENT_TIME, "Set current time"))
time_node.add_child(CmdTreeNode(CmdStr.DUMP_TIME, "Dumpy current time")) time_node.add_child(CmdTreeNode(CmdStr.DUMP_TIME, "Dumpy current time"))
time_node.add_child(CmdTreeNode(CmdStr.RELATIVE_TIMESHIFT, Info.RELATIVE_TIMESHIFT))
return time_node return time_node

View File

@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
name = "eive-tmtc" name = "eive-tmtc"
description = "TMTC Commander EIVE" description = "TMTC Commander EIVE"
readme = "README.md" readme = "README.md"
version = "6.1.0" version = "6.1.1"
requires-python = ">=3.10" requires-python = ">=3.10"
license = {text = "Apache-2.0"} license = {text = "Apache-2.0"}
authors = [ authors = [