Compare commits

..

2 Commits

Author SHA1 Message Date
7e4c46092b changelog
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
2024-06-24 13:42:39 +02:00
50f504992b reworked fused rotation rate set implemented 2024-06-24 13:40:12 +02:00
5 changed files with 54 additions and 45 deletions

View File

@ -10,20 +10,14 @@ list yields a list of all related PRs for each release.
# [unreleased] # [unreleased]
# [v7.1.1] 2025-02-10 ## Changed
- Bumped `tmtccmd` to v8.2.0 - Added support for new fused rotation rate dataset.
# [v7.1.0] 2025-01-17
- Bumped `tmtccmd` to v8.1.0
## Fixed
- Use new mode TM API.
# [v7.0.0] 2024-05-06 # [v7.0.0] 2024-05-06
## Changed
- Reworked PLOC MPSoC commanding to be inline with OBSW update. - Reworked PLOC MPSoC commanding to be inline with OBSW update.
## Fixed ## Fixed

View File

@ -4,8 +4,7 @@ import logging
from spacepackets.cfdp import ConditionCode from spacepackets.cfdp import ConditionCode
from spacepackets.util import UnsignedByteField from spacepackets.util import UnsignedByteField
from cfdppy import CfdpUserBase, TransactionId from cfdppy import CfdpUserBase, TransactionId
from cfdppy.mib import CheckTimerProvider, EntityType from cfdppy.mib import CheckTimerProvider, Countdown, EntityType
from spacepackets.countdown import Countdown
from cfdppy.user import ( from cfdppy.user import (
TransactionFinishedParams, TransactionFinishedParams,
MetadataRecvParams, MetadataRecvParams,

View File

@ -15,7 +15,7 @@ from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
from tmtccmd.pus import VerificationWrapper from tmtccmd.pus import VerificationWrapper
from tmtccmd.pus.s20_fsfw_param import Service20FsfwTm, Service20ParamDumpWrapper from tmtccmd.pus.s20_fsfw_param import Service20FsfwTm, Service20ParamDumpWrapper
from tmtccmd.pus.s20_fsfw_param_defs import CustomSubservice as ParamSubservice from tmtccmd.pus.s20_fsfw_param_defs import CustomSubservice as ParamSubservice
from tmtccmd.pus.s200_fsfw_mode import Service200FsfwReader, Service200FsfwTm from tmtccmd.pus.s200_fsfw_mode import Service200FsfwTm
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservice from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservice
from tmtccmd.tmtc import GenericApidHandlerBase, SpecificApidHandlerBase from tmtccmd.tmtc import GenericApidHandlerBase, SpecificApidHandlerBase
from eive_tmtc.config.definitions import TM_DB_PATH, PUS_APID from eive_tmtc.config.definitions import TM_DB_PATH, PUS_APID
@ -109,7 +109,7 @@ class PusHandler(SpecificApidHandlerBase):
elif service == 20: elif service == 20:
self._handle_param_packet(packet, tm_packet) self._handle_param_packet(packet, tm_packet)
elif service == 200: elif service == 200:
dedicated_handler = self._handle_mode_packet(tm_packet) dedicated_handler = self._handle_mode_packet(packet, tm_packet)
else: else:
_LOGGER.info( _LOGGER.info(
f"The service {service} is not implemented in Telemetry Factory" f"The service {service} is not implemented in Telemetry Factory"
@ -193,21 +193,21 @@ class PusHandler(SpecificApidHandlerBase):
f"unknown subservice {tm_packet.subservice} for parameter service" f"unknown subservice {tm_packet.subservice} for parameter service"
) )
def _handle_mode_packet(self, pus_tm: PusTelemetry) -> bool: def _handle_mode_packet(self, raw_data: bytes, _: PusTelemetry) -> bool:
tm_packet = Service200FsfwReader(pus_tm) tm_packet = Service200FsfwTm.unpack(
if tm_packet.tm.subservice == ModeSubservice.TM_CANT_REACH_MODE: raw_telemetry=raw_data, time_reader=CdsShortTimestamp.empty()
)
if tm_packet.subservice == ModeSubservice.TM_CANT_REACH_MODE:
obj_id = tm_packet.object_id obj_id = tm_packet.object_id
obj_id_obj = self.obj_id_dict.get(obj_id) obj_id_obj = self.obj_id_dict.get(obj_id)
retval = tm_packet.return_value retval = tm_packet.return_value
assert retval is not None
string_list = generic_retval_printout(retval) string_list = generic_retval_printout(retval)
self.pw.dlog(f"Received Mode Reply from {obj_id_obj}: Can't reach mode.") self.pw.dlog(f"Received Mode Reply from {obj_id_obj}: Can't reach mode.")
for string in string_list: for string in string_list:
self.pw.dlog(f"Reason: {string}") self.pw.dlog(f"Reason: {string}")
return True return True
if tm_packet.tm.subservice == ModeSubservice.TM_WRONG_MODE_REPLY: if tm_packet.subservice == ModeSubservice.TM_WRONG_MODE_REPLY:
self.pw.dlog(f"Received Mode TM wrong mode reply, mode: {tm_packet.mode}") self.pw.dlog(f"Received Mode TM wrong mode reply, mode: {tm_packet.mode}")
return True
return False return False

View File

@ -988,27 +988,43 @@ def handle_fused_rot_rate_data(pw: PrintWrapper, hk_data: bytes):
inc_len_vec3_double = struct.calcsize(fmt_vec3_double) inc_len_vec3_double = struct.calcsize(fmt_vec3_double)
fmt_source = "!B" fmt_source = "!B"
inc_len_source = struct.calcsize(fmt_source) inc_len_source = struct.calcsize(fmt_source)
old_size = 3 * inc_len_vec3_double + 1 v0_size = 3 * inc_len_vec3_double + 1
new_size = 3 * inc_len_vec3_double + inc_len_source + 1 v1_size = 3 * inc_len_vec3_double + inc_len_source + 1
v2_size = 2 * inc_len_vec3_double + inc_len_source + 1
size = len(hk_data) size = len(hk_data)
if size not in [old_size, new_size]: if size not in [v0_size, v1_size, v2_size]:
pw.dlog(f"Received Fused Rot Rate HK set of unexpected size: {len(hk_data)}") pw.dlog(f"Received Fused Rot Rate HK set of unexpected size: {len(hk_data)}")
return return
current_idx = 0 current_idx = 0
rot_rate_orthogonal = [ if size in [v0_size, v1_size]:
f"{val*180/math.pi:8.3f}" rot_rate_orthogonal = [
for val in struct.unpack( f"{val*180/math.pi:8.3f}"
fmt_vec3_double, hk_data[current_idx : current_idx + inc_len_vec3_double] for val in struct.unpack(
) fmt_vec3_double,
] hk_data[current_idx : current_idx + inc_len_vec3_double],
current_idx += inc_len_vec3_double )
rot_rate_parallel = [ ]
f"{val*180/math.pi:8.3f}" current_idx += inc_len_vec3_double
for val in struct.unpack( pw.dlog(f"Fused Rotational Rate Orthogonal: {rot_rate_orthogonal} [deg/s]")
fmt_vec3_double, hk_data[current_idx : current_idx + inc_len_vec3_double] rot_rate_parallel = [
) f"{val*180/math.pi:8.3f}"
] for val in struct.unpack(
current_idx += inc_len_vec3_double fmt_vec3_double,
hk_data[current_idx : current_idx + inc_len_vec3_double],
)
]
current_idx += inc_len_vec3_double
pw.dlog(f"Fused Rotational Rate Parallel: {rot_rate_parallel} [deg/s]")
else:
rot_rate_susmgm = [
f"{val * 180 / math.pi:8.3f}"
for val in struct.unpack(
fmt_vec3_double,
hk_data[current_idx: current_idx + inc_len_vec3_double],
)
]
current_idx += inc_len_vec3_double
pw.dlog(f"Fused Rotational Rate SUSMGM: {rot_rate_susmgm} [deg/s]")
rot_rate_total = [ rot_rate_total = [
f"{val*180/math.pi:8.3f}" f"{val*180/math.pi:8.3f}"
for val in struct.unpack( for val in struct.unpack(
@ -1016,10 +1032,8 @@ def handle_fused_rot_rate_data(pw: PrintWrapper, hk_data: bytes):
) )
] ]
current_idx += inc_len_vec3_double current_idx += inc_len_vec3_double
pw.dlog(f"Fused Rotational Rate Orthogonal: {rot_rate_orthogonal} [deg/s]")
pw.dlog(f"Fused Rotational Rate Parallel: {rot_rate_parallel} [deg/s]")
pw.dlog(f"Fused Rotational Rate Total: {rot_rate_total} [deg/s]") pw.dlog(f"Fused Rotational Rate Total: {rot_rate_total} [deg/s]")
if size == new_size: if size in [v1_size, v2_size]:
rot_rate_source = struct.unpack( rot_rate_source = struct.unpack(
fmt_source, hk_data[current_idx : current_idx + inc_len_source] fmt_source, hk_data[current_idx : current_idx + inc_len_source]
)[0] )[0]
@ -1030,9 +1044,10 @@ def handle_fused_rot_rate_data(pw: PrintWrapper, hk_data: bytes):
) )
else: else:
pw.dlog(f"Ctrl Strategy (key unknown): {rot_rate_source}") pw.dlog(f"Ctrl Strategy (key unknown): {rot_rate_source}")
if size in [v0_size, v2_size]:
pw.dlog(get_validity_buffer_str(hk_data[current_idx:], num_vars=3))
else:
pw.dlog(get_validity_buffer_str(hk_data[current_idx:], num_vars=4)) pw.dlog(get_validity_buffer_str(hk_data[current_idx:], num_vars=4))
return
pw.dlog(get_validity_buffer_str(hk_data[current_idx:], num_vars=3))
def handle_fused_rot_rate_source_data(pw: PrintWrapper, hk_data: bytes): def handle_fused_rot_rate_source_data(pw: PrintWrapper, hk_data: bytes):

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 = "7.2.0" version = "7.1.0"
requires-python = ">=3.10" requires-python = ">=3.10"
license = {text = "Apache-2.0"} license = {text = "Apache-2.0"}
authors = [ authors = [
@ -29,8 +29,9 @@ classifiers = [
"Topic :: Scientific/Engineering" "Topic :: Scientific/Engineering"
] ]
dependencies = [ dependencies = [
"tmtccmd~=8.2.0", "tmtccmd ~= 8.0.1",
"cfdp-py~=0.5.1", # "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@main",
"cfdp-py~=0.1.0",
"python-dateutil ~= 2.8", "python-dateutil ~= 2.8",
] ]