Compare commits

...

12 Commits

Author SHA1 Message Date
be032ab925 prep v2.14.0 2023-02-22 15:01:48 +01:00
336ed58272 Merge pull request 'Transmitter Timeout Param Command' (#138) from meier/com-ss into main
Reviewed-on: #138
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2023-02-22 14:35:53 +01:00
Jakob Meier
679df9ebe1 removed unused import 2023-02-22 12:59:56 +01:00
Jakob Meier
6228181357 parameter command to change transmitter timeout 2023-02-22 12:56:57 +01:00
Jakob Meier
a06f703d6f Merge branch 'main' into meier/com-ss 2023-02-22 09:53:23 +01:00
f409d694aa Merge pull request 'robin fixes' (#137) from kranz_robin_fixes into main
Reviewed-on: #137
2023-02-21 14:30:34 +01:00
a470484b9e robin fixes 2023-02-21 14:29:40 +01:00
4ced2d0b18 changelog update 2023-02-21 11:25:29 +01:00
0f5401a2db prep v2.13.0 2023-02-21 11:24:29 +01:00
5f082cd9fc improve TCS HK handling 2023-02-21 02:28:32 +01:00
d1f96cb83d add announce mode cmds 2023-02-21 01:30:24 +01:00
Jakob Meier
a3a3aaa883 parameter command to change transmitter timeout 2023-02-02 16:01:56 +01:00
14 changed files with 188 additions and 33 deletions

View File

@@ -10,11 +10,16 @@ list yields a list of all related PRs for each release.
# [unreleased] # [unreleased]
# [v2.13.0] 2023-02-21
tmtccmd version 4.0.0 tmtccmd version 4.0.0
Added `python-dateutil` dependency for time prompts.
## Added ## Added
- Basic persistent TM store commanding - Basic persistent TM store commanding
- System and TCS system announce mode commands
## Changed ## Changed

View File

@@ -1,12 +1,12 @@
__version__ = "2.12.7" __version__ = "2.14.0"
import logging import logging
from pathlib import Path from pathlib import Path
SW_NAME = "eive-tmtc" SW_NAME = "eive-tmtc"
VERSION_MAJOR = 2 VERSION_MAJOR = 2
VERSION_MINOR = 12 VERSION_MINOR = 14
VERSION_REVISION = 7 VERSION_REVISION = 0
EIVE_TMTC_ROOT = Path(__file__).parent EIVE_TMTC_ROOT = Path(__file__).parent
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent PACKAGE_ROOT = EIVE_TMTC_ROOT.parent

View File

@@ -36,6 +36,7 @@ class CustomServiceList(str, enum.Enum):
POWER = "power" POWER = "power"
ACU = "acu" ACU = "acu"
ACS = "acs" ACS = "acs"
GYRO = "gyro"
COM_SS = "com" COM_SS = "com"
BPX_BATTERY = "bpx" BPX_BATTERY = "bpx"
HEATER = "heater" HEATER = "heater"

View File

@@ -145,8 +145,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/ipcore/PdecHandler.h 12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/ipcore/PdecHandler.h
12405;0x3075;LOST_CARRIER_LOCK_PDEC;INFO;Lost carrier lock;linux/ipcore/PdecHandler.h 12405;0x3075;LOST_CARRIER_LOCK_PDEC;INFO;Lost carrier lock;linux/ipcore/PdecHandler.h
12406;0x3076;LOST_BIT_LOCK_PDEC;INFO;Lost bit lock;linux/ipcore/PdecHandler.h 12406;0x3076;LOST_BIT_LOCK_PDEC;INFO;Lost bit lock;linux/ipcore/PdecHandler.h
12407;0x3077;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h 12407;0x3077;TOO_MANY_IRQS;MEDIUM;Too many IRQs over the time window of one second. P1: Allowed TCs;linux/ipcore/PdecHandler.h
12408;0x3078;WRITE_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h 12408;0x3078;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h
12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h
12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h 12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h
12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h 12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h
12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h 12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h
1 Event ID (dec) Event ID (hex) Name Severity Description File Path
145 12404 0x3074 BIT_LOCK_PDEC INFO Bit lock detected (data valid) linux/ipcore/PdecHandler.h
146 12405 0x3075 LOST_CARRIER_LOCK_PDEC INFO Lost carrier lock linux/ipcore/PdecHandler.h
147 12406 0x3076 LOST_BIT_LOCK_PDEC INFO Lost bit lock linux/ipcore/PdecHandler.h
148 12407 0x3077 POLL_SYSCALL_ERROR_PDEC TOO_MANY_IRQS MEDIUM No description Too many IRQs over the time window of one second. P1: Allowed TCs linux/ipcore/PdecHandler.h
149 12408 0x3078 WRITE_SYSCALL_ERROR_PDEC POLL_SYSCALL_ERROR_PDEC MEDIUM No description linux/ipcore/PdecHandler.h
150 12409 0x3079 WRITE_SYSCALL_ERROR_PDEC MEDIUM No description linux/ipcore/PdecHandler.h
151 12500 0x30d4 IMAGE_UPLOAD_FAILED LOW Image upload failed linux/devices/startracker/StrHelper.h
152 12501 0x30d5 IMAGE_DOWNLOAD_FAILED LOW Image download failed linux/devices/startracker/StrHelper.h
153 12502 0x30d6 IMAGE_UPLOAD_SUCCESSFUL LOW Uploading image to star tracker was successfulop linux/devices/startracker/StrHelper.h

View File

@@ -3,6 +3,7 @@
import logging import logging
from typing import cast from typing import cast
from eive_tmtc.tmtc.acs.gyros import handle_gyr_cmd
from eive_tmtc.tmtc.power.power import pack_power_commands from eive_tmtc.tmtc.power.power import pack_power_commands
from eive_tmtc.tmtc.tcs.rtd import pack_rtd_commands from eive_tmtc.tmtc.tcs.rtd import pack_rtd_commands
from eive_tmtc.tmtc.payload.scex import pack_scex_cmds from eive_tmtc.tmtc.payload.scex import pack_scex_cmds
@@ -177,6 +178,8 @@ def handle_default_procedure(
return pack_syrlinks_command( return pack_syrlinks_command(
object_id=object_id, q=queue_helper, op_code=op_code object_id=object_id, q=queue_helper, op_code=op_code
) )
if service == CustomServiceList.GYRO.value:
return handle_gyr_cmd(q=queue_helper, op_code=op_code)
if service == CustomServiceList.PROCEDURE.value: if service == CustomServiceList.PROCEDURE.value:
return pack_proc_commands(q=queue_helper, op_code=op_code) return pack_proc_commands(q=queue_helper, op_code=op_code)
if service == CustomServiceList.PL_PCDU.value: if service == CustomServiceList.PL_PCDU.value:

View File

@@ -0,0 +1 @@
from .gyros import add_gyr_cmd_defs

View File

@@ -1,13 +1,25 @@
import enum import enum
import logging
import struct import struct
import eive_tmtc.config.object_ids as obj_ids from tmtccmd.tc import DefaultPusQueueHelper
import eive_tmtc.config.object_ids as obj_ids
from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_hk_command, make_sid
from tmtccmd.config.tmtc import tmtc_definitions_provider, OpCodeEntry, TmtcDefinitionWrapper
from eive_tmtc.config.object_ids import GYRO_0_ADIS_HANDLER_ID, GYRO_1_L3G_HANDLER_ID, GYRO_2_ADIS_HANDLER_ID, GYRO_3_L3G_HANDLER_ID
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.pus_tm.defs import PrintWrapper from eive_tmtc.pus_tm.defs import PrintWrapper
from tmtccmd.util import ObjectIdU32 from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
class OpCode:
CORE_HK = "core_hk"
CFG_HK = "cfg_hk"
class AdisGyroSetId(enum.IntEnum): class AdisGyroSetId(enum.IntEnum):
CORE_HK = 0 CORE_HK = 0
CFG_HK = 1 CFG_HK = 1
@@ -17,6 +29,46 @@ class L3gGyroSetId(enum.IntEnum):
CORE_HK = 0 CORE_HK = 0
class GyrSel(enum.IntEnum):
GYR_0_ADIS = 0
GYR_1_L3G = 1
GYR_2_ADIS = 2
GYR_3_L3G = 3
GYR_SEL_DICT = {
GyrSel.GYR_0_ADIS: ("GYRO_0_ADIS", GYRO_0_ADIS_HANDLER_ID),
GyrSel.GYR_1_L3G: ("GYRO_1_L3G", GYRO_1_L3G_HANDLER_ID),
GyrSel.GYR_2_ADIS: ("GYRO_2_ADIS", GYRO_2_ADIS_HANDLER_ID),
GyrSel.GYR_3_L3G: ("GYRO_3_L3G", GYRO_3_L3G_HANDLER_ID),
}
def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
print("Please select the Gyro Device")
for (k, v) in GYR_SEL_DICT.items():
print(f"{k}: {v[0]}")
sel_idx = int(input("Select gyro device by index: "))
gyr_info = GYR_SEL_DICT[GyrSel(sel_idx)]
gyr_obj_id = gyr_info[1]
is_adis = False
if sel_idx == GyrSel.GYR_0_ADIS or sel_idx == GyrSel.GYR_2_ADIS:
is_adis = True
core_hk_id = AdisGyroSetId.CORE_HK
else:
core_hk_id = L3gGyroSetId.CORE_HK
if op_code == OpCode.CORE_HK:
q.add_log_cmd(f"Gyro {gyr_info[0]} Core HK")
q.add_pus_tc(create_request_one_hk_command(make_sid(gyr_obj_id, core_hk_id)))
elif op_code == OpCode.CFG_HK:
if not is_adis:
raise ValueError("No config HK for L3 device")
q.add_log_cmd(f"Gyro {gyr_info[0]} CFG HK")
q.add_pus_tc(create_request_one_hk_command(make_sid(gyr_obj_id, AdisGyroSetId.CFG_HK)))
else:
logging.getLogger(__name__).warning(f"invalid op code {op_code} for gyro command")
def handle_gyros_hk_data( def handle_gyros_hk_data(
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
): ):
@@ -43,24 +95,26 @@ def handle_adis_gyro_hk(
pw = PrintWrapper(printer) pw = PrintWrapper(printer)
fmt_str = "!ddddddf" fmt_str = "!ddddddf"
inc_len = struct.calcsize(fmt_str) inc_len = struct.calcsize(fmt_str)
(angVelocX, angVelocY, angVelocZ, accelX, accelY, accelZ, temp) = struct.unpack( (ang_veloc_x, ang_veloc_y, ang_veloc_z, accel_x, accel_y, accel_z, temp) = struct.unpack(
fmt_str, hk_data[0 : 0 + inc_len] fmt_str, hk_data[0 : 0 + inc_len]
) )
pw.dlog(f"Received ADIS1650X Gyro HK data from object {object_id}") pw.dlog(f"Received ADIS1650X Gyro HK data from object {object_id}")
pw.dlog( pw.dlog(
f"Angular Velocities (degrees per second): X {angVelocX} | " f"Angular Velocities (degrees per second): X {ang_veloc_x} | "
f"Y {angVelocY} | Z {angVelocZ}" f"Y {ang_veloc_y} | Z {ang_veloc_z}"
) )
pw.dlog(f"Acceleration (m/s^2): X {accelX} | Y {accelY} | Z {accelZ}") pw.dlog(f"Acceleration (m/s^2): X {accel_x} | Y {accel_y} | Z {accel_z}")
pw.dlog(f"Temperature {temp} C") pw.dlog(f"Temperature {temp} C")
if set_id == AdisGyroSetId.CFG_HK: if set_id == AdisGyroSetId.CFG_HK:
pw = PrintWrapper(printer) pw = PrintWrapper(printer)
fmt_str = "!HBHH" fmt_str = "!HBHHH"
inc_len = struct.calcsize(fmt_str) inc_len = struct.calcsize(fmt_str)
(diag_stat_reg, filter_setting, msc_ctrl_reg, dec_rate_reg) = struct.unpack( print(len(hk_data))
(diag_stat_reg, filter_setting, range_mdl, msc_ctrl_reg, dec_rate_reg) = struct.unpack(
fmt_str, hk_data[0 : 0 + inc_len] fmt_str, hk_data[0 : 0 + inc_len]
) )
pw.dlog(f"Diagnostic Status Register {diag_stat_reg:#018b}") pw.dlog(f"Diagnostic Status Register {diag_stat_reg:#018b}")
pw.dlog(f"Range MDL {range_mdl}")
pw.dlog(f"Filter Settings {filter_setting:#010b}") pw.dlog(f"Filter Settings {filter_setting:#010b}")
pw.dlog(f"Miscellaneous Control Register {msc_ctrl_reg:#018b}") pw.dlog(f"Miscellaneous Control Register {msc_ctrl_reg:#018b}")
pw.dlog(f"Decimation Rate {dec_rate_reg:#06x}") pw.dlog(f"Decimation Rate {dec_rate_reg:#06x}")
@@ -82,3 +136,11 @@ def handle_l3g_gyro_hk(
f"Y {angVelocY} | Z {angVelocZ}" f"Y {angVelocY} | Z {angVelocZ}"
) )
pw.dlog(f"Temperature {temp} °C") pw.dlog(f"Temperature {temp} °C")
@tmtc_definitions_provider
def add_gyr_cmd_defs(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCode.CORE_HK, info="Request Core HK")
oce.add(keys=OpCode.CFG_HK, info="Request CFG HK")
defs.add_service(CustomServiceList.GYRO, info="Gyro", op_code_entry=oce)

View File

@@ -57,7 +57,7 @@ def handle_mgm_rm3100_hk_data(
fmt_str = f"!fff" fmt_str = f"!fff"
inc_len = struct.calcsize(fmt_str) inc_len = struct.calcsize(fmt_str)
(field_x, field_y, field_z) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len]) (field_x, field_y, field_z) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len])
pw.dlog(f"Received MGM LIS3 from object {object_id}") pw.dlog(f"Received MGM RM3100 from object {object_id}")
pw.dlog( pw.dlog(
f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}" f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}"
) )

View File

@@ -21,9 +21,14 @@ from tmtccmd.tc.pus_20_fsfw_param import (
pack_scalar_u8_parameter_app_data, pack_scalar_u8_parameter_app_data,
) )
from tmtccmd.pus.s20_fsfw_param_defs import (
create_scalar_u32_parameter
)
class ParameterId(enum.IntEnum): class ParameterId(enum.IntEnum):
DATARATE = 0 DATARATE = 0
TRANSMITTER_TIMEOUT = 1
class Submode(enum.IntEnum): class Submode(enum.IntEnum):
@@ -42,6 +47,7 @@ class OpCode:
TX_AND_RX_CARRIER_WAVE = "rx_and_tx_carrier_wave" TX_AND_RX_CARRIER_WAVE = "rx_and_tx_carrier_wave"
UPDATE_DEFAULT_DATARATE_LOW = "update_default_rate_low" UPDATE_DEFAULT_DATARATE_LOW = "update_default_rate_low"
UPDATE_DEFAULT_DATARATE_HIGH = "update_default_rate_high" UPDATE_DEFAULT_DATARATE_HIGH = "update_default_rate_high"
CHANGE_TRANSMITTER_TIMEOUT = "change_transmitter_timeout"
READ_MODE = "read_mode" READ_MODE = "read_mode"
ANNOUNCE_MODE = "announce_mode" ANNOUNCE_MODE = "announce_mode"
ANNOUNCE_MODE_RECURSIVE = "announce_mode_recursive" ANNOUNCE_MODE_RECURSIVE = "announce_mode_recursive"
@@ -55,6 +61,7 @@ class Info:
TX_AND_RX_CARRIER_WAVE = "Syrlinks with TX carrier wave" TX_AND_RX_CARRIER_WAVE = "Syrlinks with TX carrier wave"
UPDATE_DEFAULT_DATARATE_LOW = "Configure default low datarate (BPSK modulation)" UPDATE_DEFAULT_DATARATE_LOW = "Configure default low datarate (BPSK modulation)"
UPDATE_DEFAULT_DATARATE_HIGH = "Configure default high datarate (0QPSK modulation)" UPDATE_DEFAULT_DATARATE_HIGH = "Configure default high datarate (0QPSK modulation)"
CHANGE_TRANSMITTER_TIMEOUT = "Changes the transmitter timeout"
READ_MODE = "Read Mode" READ_MODE = "Read Mode"
ANNOUNCE_MODE = "Announce Mode" ANNOUNCE_MODE = "Announce Mode"
ANNOUNCE_MODE_RECURSIVE = "Announce mode recursively" ANNOUNCE_MODE_RECURSIVE = "Announce mode recursively"
@@ -112,6 +119,19 @@ def build_com_subsystem_cmd(p: ServiceProviderParams):
q.add_pus_tc( q.add_pus_tc(
create_mode_command(COM_SUBSYSTEM_ID, Submode.RX_AND_TX_CARRIER_WAVE, 0) create_mode_command(COM_SUBSYSTEM_ID, Submode.RX_AND_TX_CARRIER_WAVE, 0)
) )
elif o == OpCode.CHANGE_TRANSMITTER_TIMEOUT:
timeout = int(input("Specify timeout to set [ms]: "))
q.add_log_cmd(Info.CHANGE_TRANSMITTER_TIMEOUT)
q.add_pus_tc(
create_load_param_cmd(
create_scalar_u32_parameter(
COM_SUBSYSTEM_ID,
0,
ParameterId.TRANSMITTER_TIMEOUT,
timeout,
).pack()
)
)
elif o == OpCode.READ_MODE: elif o == OpCode.READ_MODE:
q.add_log_cmd(Info.READ_MODE) q.add_log_cmd(Info.READ_MODE)
q.add_pus_tc(create_read_mode_command(COM_SUBSYSTEM_ID)) q.add_pus_tc(create_read_mode_command(COM_SUBSYSTEM_ID))
@@ -132,6 +152,7 @@ def add_com_subsystem_cmds(defs: TmtcDefinitionWrapper):
oce.add(OpCode.TX_AND_RX_DEF_RATE, Info.TX_AND_RX_DEF_DATARATE) oce.add(OpCode.TX_AND_RX_DEF_RATE, Info.TX_AND_RX_DEF_DATARATE)
oce.add(OpCode.UPDATE_DEFAULT_DATARATE_LOW, Info.UPDATE_DEFAULT_DATARATE_LOW) oce.add(OpCode.UPDATE_DEFAULT_DATARATE_LOW, Info.UPDATE_DEFAULT_DATARATE_LOW)
oce.add(OpCode.UPDATE_DEFAULT_DATARATE_HIGH, Info.UPDATE_DEFAULT_DATARATE_HIGH) oce.add(OpCode.UPDATE_DEFAULT_DATARATE_HIGH, Info.UPDATE_DEFAULT_DATARATE_HIGH)
oce.add(OpCode.CHANGE_TRANSMITTER_TIMEOUT, Info.CHANGE_TRANSMITTER_TIMEOUT)
oce.add(OpCode.READ_MODE, Info.READ_MODE) oce.add(OpCode.READ_MODE, Info.READ_MODE)
oce.add(OpCode.ANNOUNCE_MODE, Info.ANNOUNCE_MODE) oce.add(OpCode.ANNOUNCE_MODE, Info.ANNOUNCE_MODE)
oce.add(OpCode.ANNOUNCE_MODE_RECURSIVE, Info.ANNOUNCE_MODE_RECURSIVE) oce.add(OpCode.ANNOUNCE_MODE_RECURSIVE, Info.ANNOUNCE_MODE_RECURSIVE)

View File

@@ -7,18 +7,24 @@ from tmtccmd.config.tmtc import (
) )
from tmtccmd.tc import service_provider from tmtccmd.tc import service_provider
from eive_tmtc.config.object_ids import EIVE_SYSTEM_ID from eive_tmtc.config.object_ids import EIVE_SYSTEM_ID
from tmtccmd.tc.pus_200_fsfw_mode import create_mode_command, Mode from tmtccmd.tc.pus_200_fsfw_mode import (
create_mode_command,
Mode,
create_announce_mode_recursive_command,
)
from tmtccmd.tc.decorator import ServiceProviderParams from tmtccmd.tc.decorator import ServiceProviderParams
class OpCode: class OpCode:
SAFE_MODE = "safe" SAFE_MODE = "safe"
IDLE_MODE = "idle" IDLE_MODE = "idle"
ANNOUNCE_MODES = "announce_modes"
class Info: class Info:
SAFE_MODE = "Command System into Safe Mode" SAFE_MODE = "Command System into Safe Mode"
IDLE_MODE = "Command System into Idle Pointing Mode" IDLE_MODE = "Command System into Idle Pointing Mode"
ANNOUNCE_MODES = "Announce mode recursively"
@service_provider(CustomServiceList.SYSTEM.value) @service_provider(CustomServiceList.SYSTEM.value)
@@ -32,6 +38,9 @@ def build_system_cmds(p: ServiceProviderParams):
elif o == OpCode.IDLE_MODE: elif o == OpCode.IDLE_MODE:
q.add_log_cmd(f"{prefix}: {Info.IDLE_MODE}") q.add_log_cmd(f"{prefix}: {Info.IDLE_MODE}")
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, AcsMode.IDLE, 0)) q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, AcsMode.IDLE, 0))
elif o == OpCode.ANNOUNCE_MODES:
q.add_log_cmd(f"{prefix}: {Info.ANNOUNCE_MODES}")
q.add_pus_tc(create_announce_mode_recursive_command(EIVE_SYSTEM_ID))
@tmtc_definitions_provider @tmtc_definitions_provider
@@ -39,6 +48,7 @@ def add_system_cmd_defs(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry() oce = OpCodeEntry()
oce.add(keys=OpCode.SAFE_MODE, info=Info.SAFE_MODE) oce.add(keys=OpCode.SAFE_MODE, info=Info.SAFE_MODE)
oce.add(keys=OpCode.IDLE_MODE, info=Info.IDLE_MODE) oce.add(keys=OpCode.IDLE_MODE, info=Info.IDLE_MODE)
oce.add(keys=OpCode.ANNOUNCE_MODES, info=Info.ANNOUNCE_MODES)
defs.add_service( defs.add_service(
name=CustomServiceList.SYSTEM.value, name=CustomServiceList.SYSTEM.value,
info="EIVE system commands", info="EIVE system commands",

View File

@@ -5,3 +5,4 @@ class CtrlSetId(enum.IntEnum):
PRIMARY_SENSORS = 0 PRIMARY_SENSORS = 0
DEVICE_SENSORS = 1 DEVICE_SENSORS = 1
SUS_TEMP_SENSORS = 2 SUS_TEMP_SENSORS = 2
HEATER_INFO = 4

View File

@@ -32,6 +32,18 @@ class Heater(enum.IntEnum):
NUMBER_OF_SWITCHES = 8 NUMBER_OF_SWITCHES = 8
HEATER_LOCATION = [
"OBC Board",
"PLOC Processing Board",
"ACS Board",
"PCDU PDU",
"Camera",
"Startracker",
"DRO",
"HPA",
]
class OpCode: class OpCode:
HEATER_CMD = ["switch_cmd"] HEATER_CMD = ["switch_cmd"]
HEATER_EXT_CTRL = ["set_ext_ctrl"] HEATER_EXT_CTRL = ["set_ext_ctrl"]

View File

@@ -9,8 +9,12 @@ from tmtccmd.config.tmtc import (
OpCodeEntry, OpCodeEntry,
) )
from tmtccmd.tc import DefaultPusQueueHelper from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import Mode from tmtccmd.tc.pus_200_fsfw_mode import Mode, create_announce_mode_recursive_command
from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command from tmtccmd.tc.pus_3_fsfw_hk import (
make_sid,
generate_one_hk_command,
create_request_one_diag_command,
)
class OpCodeSys: class OpCodeSys:
@@ -19,6 +23,8 @@ class OpCodeSys:
REQUEST_PRIMARY_TEMP_SET = ["temp"] REQUEST_PRIMARY_TEMP_SET = ["temp"]
REQUEST_DEVICE_TEMP_SET = ["temp_devs"] REQUEST_DEVICE_TEMP_SET = ["temp_devs"]
REQUEST_DEVICE_SUS_SET = ["temp_sus"] REQUEST_DEVICE_SUS_SET = ["temp_sus"]
REQUEST_HEATER_INFO = "heater_info"
ANNOUNCE_MODES = "announce_modes"
class InfoSys: class InfoSys:
@@ -27,6 +33,8 @@ class InfoSys:
REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures" REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures" REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
REQUEST_DEVICE_SUS_SET = "Request HK set of the SUS temperatures" REQUEST_DEVICE_SUS_SET = "Request HK set of the SUS temperatures"
REQUEST_HEATER_INFO = "Request heater information"
ANNOUNCE_MODES = "Announce Modes recursively"
def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str): def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
@@ -46,12 +54,22 @@ def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS) make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS)
) )
) )
if op_code == OpCodeSys.REQUEST_HEATER_INFO:
q.add_log_cmd(InfoSys.REQUEST_HEATER_INFO)
q.add_pus_tc(
create_request_one_diag_command(
make_sid(TCS_CONTROLLER, CtrlSetId.HEATER_INFO)
)
)
if op_code in OpCodeSys.OFF: if op_code in OpCodeSys.OFF:
q.add_log_cmd(InfoSys.OFF) q.add_log_cmd(InfoSys.OFF)
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.OFF, 0, q, InfoSys.OFF) pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.OFF, 0, q, InfoSys.OFF)
if op_code in OpCodeSys.NML: if op_code in OpCodeSys.NML:
q.add_log_cmd(InfoSys.NML) q.add_log_cmd(InfoSys.NML)
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.NORMAL, 0, q, InfoSys.OFF) pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.NORMAL, 0, q, InfoSys.OFF)
if op_code == OpCodeSys.ANNOUNCE_MODES:
q.add_log_cmd(InfoSys.ANNOUNCE_MODES)
q.add_pus_tc(create_announce_mode_recursive_command(TCS_SUBSYSTEM_ID))
pack_tcs_ass_cmds(q, op_code) pack_tcs_ass_cmds(q, op_code)
@@ -67,6 +85,8 @@ def add_tcs_subsystem_cmds(defs: TmtcDefinitionWrapper):
keys=OpCodeSys.REQUEST_DEVICE_TEMP_SET, info=InfoSys.REQUEST_DEVICE_TEMP_SET keys=OpCodeSys.REQUEST_DEVICE_TEMP_SET, info=InfoSys.REQUEST_DEVICE_TEMP_SET
) )
oce.add(keys=OpCodeSys.REQUEST_DEVICE_SUS_SET, info=InfoSys.REQUEST_DEVICE_SUS_SET) oce.add(keys=OpCodeSys.REQUEST_DEVICE_SUS_SET, info=InfoSys.REQUEST_DEVICE_SUS_SET)
oce.add(keys=OpCodeSys.REQUEST_HEATER_INFO, info=InfoSys.REQUEST_HEATER_INFO)
oce.add(keys=OpCodeSys.ANNOUNCE_MODES, info=InfoSys.ANNOUNCE_MODES)
defs.add_service( defs.add_service(
name=CustomServiceList.TCS, name=CustomServiceList.TCS,
info="TCS Board", info="TCS Board",

View File

@@ -1,10 +1,16 @@
import logging
import pprint import pprint
import struct import struct
from eive_tmtc.pus_tm.defs import PrintWrapper from eive_tmtc.pus_tm.defs import PrintWrapper
from tmtccmd.fsfw import validity_buffer_list
from tmtccmd.util import ObjectIdU32 from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from .defs import CtrlSetId from .defs import CtrlSetId
from .heater import HEATER_LOCATION
_LOGGER = logging.getLogger(__name__)
def handle_thermal_controller_hk_data( def handle_thermal_controller_hk_data(
@@ -22,7 +28,10 @@ def handle_thermal_controller_hk_data(
pw.dlog("Received sensor temperature data") pw.dlog("Received sensor temperature data")
# get all the floats # get all the floats
tm_data = struct.unpack("!fffffffffffffffffffff", hk_data[: 21 * 4]) fmt_str = "!fffffffffffffffffffff"
fmt_len = struct.calcsize(fmt_str)
tm_data = struct.unpack(fmt_str, hk_data[:fmt_len])
valid_list = validity_buffer_list(hk_data[fmt_len:], 21)
parsed_data = { parsed_data = {
"SENSOR_PLOC_HEATSPREADER": tm_data[0], "SENSOR_PLOC_HEATSPREADER": tm_data[0],
"SENSOR_PLOC_MISSIONBOARD": tm_data[1], "SENSOR_PLOC_MISSIONBOARD": tm_data[1],
@@ -46,14 +55,15 @@ def handle_thermal_controller_hk_data(
"TMP1075 PL PCDU 1": tm_data[19], "TMP1075 PL PCDU 1": tm_data[19],
"TMP1075 IF BOARD": tm_data[20], "TMP1075 IF BOARD": tm_data[20],
} }
printer.file_logger.info(str(parsed_data)) for idx, (k, v) in enumerate(parsed_data.items()):
pp = pprint.PrettyPrinter(depth=4) print(f"{str(k).ljust(30)}: Valid: {valid_list[idx]}, Value: {v}")
pp.pprint(parsed_data)
elif set_id == CtrlSetId.DEVICE_SENSORS: elif set_id == CtrlSetId.DEVICE_SENSORS:
pw = PrintWrapper(printer) pw = PrintWrapper(printer)
pw.dlog("Received device temperature data") pw.dlog("Received device temperature data")
fmt_str = "!fhhhhiiiifffhffffffffffffff" fmt_str = "!fhhhhiiiifffhffffffffffffff"
fmt_len = struct.calcsize(fmt_str)
tm_data = struct.unpack(fmt_str, hk_data[:98]) tm_data = struct.unpack(fmt_str, hk_data[:98])
valid_list = validity_buffer_list(hk_data[fmt_len:], 25)
parsed_data = { parsed_data = {
"Q7S_TEMPERATURE": tm_data[0], "Q7S_TEMPERATURE": tm_data[0],
"BATTERY_TEMPERATURE_1": tm_data[1], "BATTERY_TEMPERATURE_1": tm_data[1],
@@ -68,9 +78,7 @@ def handle_thermal_controller_hk_data(
"SYRLINKS_POWER_AMPLIFIER_TEMPERATURE": tm_data[10], "SYRLINKS_POWER_AMPLIFIER_TEMPERATURE": tm_data[10],
"SYRLINKS_BASEBAND_BOARD_TEMPERATURE": tm_data[11], "SYRLINKS_BASEBAND_BOARD_TEMPERATURE": tm_data[11],
"MGT_TEMPERATURE": tm_data[12], "MGT_TEMPERATURE": tm_data[12],
"ACU_TEMPERATURE_1": tm_data[13], "ACU_TEMPERATURES": (tm_data[13], tm_data[14], tm_data[15]),
"ACU_TEMPERATURE_2": tm_data[14],
"ACU_TEMPERATURE_3": tm_data[15],
"PDU1_TEMPERATURE": tm_data[16], "PDU1_TEMPERATURE": tm_data[16],
"PDU2_TEMPERATURE": tm_data[17], "PDU2_TEMPERATURE": tm_data[17],
"P60DOCK_TEMPERATURE_1": tm_data[18], "P60DOCK_TEMPERATURE_1": tm_data[18],
@@ -79,18 +87,19 @@ def handle_thermal_controller_hk_data(
"GYRO_1_TEMPERATURE": tm_data[21], "GYRO_1_TEMPERATURE": tm_data[21],
"GYRO_2_TEMPERATURE": tm_data[22], "GYRO_2_TEMPERATURE": tm_data[22],
"GYRO_3_TEMPERATURE": tm_data[23], "GYRO_3_TEMPERATURE": tm_data[23],
"MGM_0_TEMPERATURE": tm_data[24], "MGM_0_LIS3_TEMPERATURE": tm_data[24],
"MGM_1_TEMPERATURE": tm_data[25], "MGM_2_LIS3_TEMPERATURE": tm_data[25],
"ADC_PL_PCDU_TEMPERATURE": tm_data[26], "ADC_PL_PCDU_TEMPERATURE": tm_data[26],
} }
printer.file_logger.info(str(parsed_data)) for idx, (k, v) in enumerate(parsed_data.items()):
pp = pprint.PrettyPrinter(depth=4) print(f"{str(k).ljust(30)}: Valid: {valid_list[idx]}, Value: {v}")
pp.pprint(parsed_data)
elif set_id == CtrlSetId.SUS_TEMP_SENSORS: elif set_id == CtrlSetId.SUS_TEMP_SENSORS:
pw = PrintWrapper(printer) pw = PrintWrapper(printer)
pw.dlog("Received SUS temperature data") pw.dlog("Received SUS temperature data")
fmt_str = "!ffffffffffffffffff" fmt_str = "!ffffffffffff"
tm_data = struct.unpack(fmt_str, hk_data[: 4 * 18]) fmt_len = struct.calcsize(fmt_str)
tm_data = struct.unpack(fmt_str, hk_data[: 12 * 4])
valid_list = validity_buffer_list(hk_data[fmt_len:], 12)
parsed_data = { parsed_data = {
"SUS_0": tm_data[0], "SUS_0": tm_data[0],
"SUS_1": tm_data[1], "SUS_1": tm_data[1],
@@ -105,6 +114,15 @@ def handle_thermal_controller_hk_data(
"SUS_10": tm_data[10], "SUS_10": tm_data[10],
"SUS_11": tm_data[11], "SUS_11": tm_data[11],
} }
printer.file_logger.info(str(parsed_data)) for idx, (k, v) in enumerate(parsed_data.items()):
pp = pprint.PrettyPrinter(depth=4) print(f"{str(k).ljust(30)}: Valid: {valid_list[idx]}, Value: {v}")
pp.pprint(parsed_data) elif set_id == CtrlSetId.HEATER_INFO:
print("Heater Switch States")
for i in range(8):
print(
f"{HEATER_LOCATION[i].ljust(25)}: {'On' if hk_data[i] == 1 else 'Off'}"
)
current_draw = struct.unpack("!H", hk_data[8:10])[0]
print(f"Heater Power Channel Current Draw: {current_draw} mA")
else:
_LOGGER.warning(f"Unimplemented set ID {set_id}")