Compare commits
44 Commits
Author | SHA1 | Date | |
---|---|---|---|
0eb6736692 | |||
20a44b4b67 | |||
3927377e94 | |||
aaba7d5857 | |||
d241101d88 | |||
0b9bbf6212 | |||
01b5ae8252 | |||
8fc67c2665 | |||
4daddf7255 | |||
0e317a435a | |||
e4eed4602d | |||
6debacd946 | |||
24fbb26ac0 | |||
208724f0a9 | |||
fe1e6a2877 | |||
d413ec6d08 | |||
fc87e36c2e | |||
58c20e31cc | |||
cc5e4459b4 | |||
7a4d6ee13a | |||
74c9da8504 | |||
16ec4a1914 | |||
b4dcf2296c | |||
877b9bb5c1 | |||
eb9e93fbee | |||
e8f48480f5 | |||
acb48916cf | |||
a82e6b2e64 | |||
06750809cb | |||
e23bc11608 | |||
bc77e6ae76 | |||
fa58c8e2c3 | |||
e3342cf474 | |||
4d2b7a6150 | |||
574a3e9207 | |||
79e897b035 | |||
3e466f06ef | |||
934b79a2f1 | |||
5fe23be649 | |||
85f5bf2e6e | |||
7310513805 | |||
aa52ed79ea | |||
f40b70f66e | |||
80ee42089e |
10
.gitignore
vendored
10
.gitignore
vendored
@ -4,4 +4,12 @@ log
|
|||||||
.idea/*
|
.idea/*
|
||||||
!.idea/runConfigurations
|
!.idea/runConfigurations
|
||||||
|
|
||||||
*.json
|
*.json
|
||||||
|
|
||||||
|
/Lib
|
||||||
|
/Scripts
|
||||||
|
/pyvenv.cfg
|
||||||
|
/bin
|
||||||
|
/lib
|
||||||
|
/lib64
|
||||||
|
/share
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m 2 -c 2 --hk" />
|
<option name="PARAMETERS" value="-m listener --hk" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="false" />
|
<option name="EMULATE_TERMINAL" value="false" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
2
.idea/runConfigurations/tmtcc_Service_17_UDP.xml
generated
2
.idea/runConfigurations/tmtcc_Service_17_UDP.xml
generated
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s 17 -t 3" />
|
<option name="PARAMETERS" value="-s 17 -o 0 -t 3" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="true" />
|
<option name="EMULATE_TERMINAL" value="true" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s 200 -t 4" />
|
<option name="PARAMETERS" value="-s 200 -t 4" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="true" />
|
<option name="EMULATE_TERMINAL" value="true" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
2
.idea/runConfigurations/tmtcc_Service_2_UDP.xml
generated
2
.idea/runConfigurations/tmtcc_Service_2_UDP.xml
generated
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s 2 -t 4" />
|
<option name="PARAMETERS" value="-s 2 -t 4" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="false" />
|
<option name="EMULATE_TERMINAL" value="false" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
2
.idea/runConfigurations/tmtcc_Service_3_UDP.xml
generated
2
.idea/runConfigurations/tmtcc_Service_3_UDP.xml
generated
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s 3 -p --hk" />
|
<option name="PARAMETERS" value="-s 3 -p --hk" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="true" />
|
<option name="EMULATE_TERMINAL" value="true" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
2
.idea/runConfigurations/tmtcc_Service_8_UDP.xml
generated
2
.idea/runConfigurations/tmtcc_Service_8_UDP.xml
generated
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s 8 -t 8" />
|
<option name="PARAMETERS" value="-s 8 -t 8" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="true" />
|
<option name="EMULATE_TERMINAL" value="true" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
24
.idea/runConfigurations/tmtcc_Single_Command_UDP.xml
generated
24
.idea/runConfigurations/tmtcc_Single_Command_UDP.xml
generated
@ -1,24 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="tmtcc Single Command UDP" type="PythonConfigurationType" factoryName="Python" folderName="PUS">
|
|
||||||
<module name="tmtc" />
|
|
||||||
<option name="INTERPRETER_OPTIONS" value="" />
|
|
||||||
<option name="PARENT_ENVS" value="true" />
|
|
||||||
<envs>
|
|
||||||
<env name="PYTHONUNBUFFERED" value="1" />
|
|
||||||
</envs>
|
|
||||||
<option name="SDK_HOME" value="" />
|
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
|
||||||
<option name="IS_MODULE_SDK" value="true" />
|
|
||||||
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_core/tmtcc_runner.py" />
|
|
||||||
<option name="PARAMETERS" value="-m listener -c udp" />
|
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
|
||||||
<option name="EMULATE_TERMINAL" value="false" />
|
|
||||||
<option name="MODULE_MODE" value="false" />
|
|
||||||
<option name="REDIRECT_INPUT" value="false" />
|
|
||||||
<option name="INPUT_FILE" value="" />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s acu --boardIP 192.168.133.10 --clientIP 192.168.133.4 -l" />
|
<option name="PARAMETERS" value="-s acu -l" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="true" />
|
<option name="EMULATE_TERMINAL" value="true" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s p60dock --boardIP 192.168.133.10 --clientIP 192.168.133.4 -l" />
|
<option name="PARAMETERS" value="-s p60dock -l" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="true" />
|
<option name="EMULATE_TERMINAL" value="true" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s pdu1 --boardIP 192.168.133.10 --clientIP 192.168.133.4 -l" />
|
<option name="PARAMETERS" value="-s pdu1 -l" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="true" />
|
<option name="EMULATE_TERMINAL" value="true" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/tmtc_client_cli.py" />
|
||||||
<option name="PARAMETERS" value="-m seqcmd -c udp -s pdu2 --boardIP 192.168.133.10 --clientIP 192.168.133.4 -l -t 4" />
|
<option name="PARAMETERS" value="-s pdu2 -l -t 4" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="true" />
|
<option name="EMULATE_TERMINAL" value="true" />
|
||||||
<option name="MODULE_MODE" value="false" />
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
50
README.md
50
README.md
@ -1,8 +1,46 @@
|
|||||||
### How to use this folder
|
# TMTC Commander EIVE
|
||||||
|
|
||||||
This folder contains template files to set up the TMTC commander
|
# Set up virtual environment
|
||||||
for a new mission or project. These files are the adaption
|
|
||||||
point to customize the TMTC commander.
|
## Linux
|
||||||
|
|
||||||
|
1. Create virtual environment
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python3 -m venv .
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Activate virtual environment
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./Scripts/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Install `tmtccmd` for virtual environment. `-e` for interactive installation.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd tmtccmd
|
||||||
|
python3 -m pip install -e .[gui]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Windows
|
||||||
|
|
||||||
|
1. Create virtual environment
|
||||||
|
|
||||||
|
```sh
|
||||||
|
py -m venv .
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Activate virtual environment
|
||||||
|
|
||||||
|
```sh
|
||||||
|
Scripts\activate.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Install `tmtccmd` for virtual environment. `-e` for interactive installation.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd tmtccmd
|
||||||
|
py -m pip install -e .[gui]
|
||||||
|
```
|
||||||
|
|
||||||
To do so, simply copy all folder inside the TMTC commander root. This
|
|
||||||
step is also required because the TMTC commander core will load some modules.
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
import enum
|
import enum
|
||||||
|
|
||||||
from tmtccmd.core.backend import TmTcHandler
|
from tmtccmd.core.backend import TmTcHandler
|
||||||
from tmtccmd.utility.tmtcc_logger import get_logger
|
from tmtccmd.utility.logger import get_logger
|
||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
|
||||||
|
@ -7,7 +7,11 @@
|
|||||||
import enum
|
import enum
|
||||||
|
|
||||||
|
|
||||||
|
PUS_APID = 0x65
|
||||||
|
|
||||||
|
|
||||||
class CustomServiceList(enum.Enum):
|
class CustomServiceList(enum.Enum):
|
||||||
|
TEST_DEVICE = "test",
|
||||||
P60DOCK = "p60dock"
|
P60DOCK = "p60dock"
|
||||||
PDU1 = "pdu1"
|
PDU1 = "pdu1"
|
||||||
PDU2 = "pdu2"
|
PDU2 = "pdu2"
|
||||||
@ -15,3 +19,7 @@ class CustomServiceList(enum.Enum):
|
|||||||
TMP1075_1 = "tmp1075_1"
|
TMP1075_1 = "tmp1075_1"
|
||||||
TMP1075_2 = "tmp1075_2"
|
TMP1075_2 = "tmp1075_2"
|
||||||
HEATER = "heater"
|
HEATER = "heater"
|
||||||
|
IMTQ = "imtq"
|
||||||
|
PLOC = "ploc"
|
||||||
|
PCDU = "pcdu",
|
||||||
|
SA_DEPLYOMENT = "sa_depl"
|
||||||
|
@ -9,14 +9,12 @@ import argparse
|
|||||||
|
|
||||||
|
|
||||||
# All globals can be added here and will be part of a globals dictionary.
|
# All globals can be added here and will be part of a globals dictionary.
|
||||||
from config.definitions import CustomServiceList
|
from config.definitions import CustomServiceList, PUS_APID
|
||||||
from config.custom_mode_op import CustomModeList
|
from config.custom_mode_op import CustomModeList
|
||||||
from tmtccmd.core.definitions import CoreComInterfaces, CoreServiceList
|
from tmtccmd.config.definitions import CoreComInterfaces
|
||||||
from tmtccmd.defaults.globals_setup import set_default_globals_pre_args_parsing, \
|
from tmtccmd.config.globals import set_default_globals_pre_args_parsing, \
|
||||||
set_default_globals_post_args_parsing, get_core_service_dict
|
set_default_globals_post_args_parsing
|
||||||
from tmtccmd.core.globals_manager import update_global
|
from tmtccmd.utility.logger import get_logger
|
||||||
from tmtccmd.core.definitions import CoreGlobalIds
|
|
||||||
from tmtccmd.utility.tmtcc_logger import get_logger
|
|
||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
|
||||||
@ -27,29 +25,12 @@ class CustomGlobalIds(enum.Enum):
|
|||||||
|
|
||||||
|
|
||||||
def set_globals_pre_args_parsing(gui: bool = False):
|
def set_globals_pre_args_parsing(gui: bool = False):
|
||||||
set_default_globals_pre_args_parsing(gui=gui, apid=0x65, com_if_id=CoreComInterfaces.TCPIP_UDP)
|
set_default_globals_pre_args_parsing(
|
||||||
|
gui=gui, apid=PUS_APID, com_if_id=CoreComInterfaces.TCPIP_UDP.value)
|
||||||
servicelist = get_core_service_dict()
|
|
||||||
update_global(CoreGlobalIds.CURRENT_SERVICE, CoreServiceList.SERVICE_17)
|
|
||||||
update_global(CoreGlobalIds.SERVICE_DICT, servicelist)
|
|
||||||
|
|
||||||
|
|
||||||
def add_globals_post_args_parsing(args: argparse.Namespace):
|
def add_globals_post_args_parsing(args: argparse.Namespace, json_cfg_path: str):
|
||||||
set_default_globals_post_args_parsing(
|
set_default_globals_post_args_parsing(
|
||||||
args=args, custom_services_list=[CustomServiceList],
|
args=args, custom_services_list=[CustomServiceList],
|
||||||
custom_modes_list=[CustomModeList],
|
custom_modes_list=[CustomModeList], json_cfg_path=json_cfg_path
|
||||||
custom_com_ifs_lists=None
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def set_up_serial_cfg(com_if: CoreComInterfaces):
|
|
||||||
from tmtccmd.defaults.com_setup import default_serial_cfg_setup
|
|
||||||
default_serial_cfg_setup(com_if=com_if)
|
|
||||||
|
|
||||||
|
|
||||||
def set_up_ethernet_cfg():
|
|
||||||
from tmtccmd.defaults.com_setup import default_tcpip_udp_cfg_setup
|
|
||||||
default_tcpip_udp_cfg_setup()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,18 +1,86 @@
|
|||||||
import argparse
|
import argparse
|
||||||
from typing import Union, Dict, Tuple
|
from typing import Union, Dict, Tuple
|
||||||
|
|
||||||
|
from tmtccmd.config.definitions import ServiceOpCodeDictT
|
||||||
from tmtccmd.pus_tm.service_3_base import Service3Base
|
from tmtccmd.pus_tm.service_3_base import Service3Base
|
||||||
from tmtccmd.ecss.tm import PusTelemetry
|
from tmtccmd.ecss.tm import PusTelemetry
|
||||||
from tmtccmd.ecss.tc import PusTelecommand
|
|
||||||
from tmtccmd.pus_tc.definitions import TcQueueT
|
from tmtccmd.pus_tc.definitions import TcQueueT
|
||||||
from tmtccmd.com_if.com_interface_base import CommunicationInterface
|
from tmtccmd.com_if.com_interface_base import CommunicationInterface
|
||||||
from tmtccmd.core.backend import TmTcHandler
|
from tmtccmd.core.backend import TmTcHandler
|
||||||
from tmtccmd.core.hook_base import TmTcHookBase
|
from tmtccmd.config.hook import TmTcHookBase
|
||||||
from tmtccmd.utility.tmtc_printer import TmTcPrinter
|
from tmtccmd.utility.tmtc_printer import TmTcPrinter
|
||||||
|
from tmtccmd.config.globals import OpCodeDictKeys
|
||||||
|
|
||||||
|
from config.definitions import CustomServiceList
|
||||||
|
|
||||||
|
|
||||||
class EiveHookObject(TmTcHookBase):
|
class EiveHookObject(TmTcHookBase):
|
||||||
|
|
||||||
|
def get_service_op_code_dictionary(self) -> ServiceOpCodeDictT:
|
||||||
|
from tmtccmd.config.globals import get_default_service_op_code_dict
|
||||||
|
service_op_code_dict = get_default_service_op_code_dict()
|
||||||
|
op_code_dict_srv_acu = {
|
||||||
|
"0": ("ACU Tests", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
}
|
||||||
|
service_acu_tuple = ("ACU Devices", op_code_dict_srv_acu)
|
||||||
|
|
||||||
|
op_code_dict_srv_tmp1075 = {
|
||||||
|
"0": ("TMP1075 Tests", {OpCodeDictKeys.TIMEOUT: 2.2}),
|
||||||
|
}
|
||||||
|
service_tmp1075_1_tuple = ("TMP1075 1", op_code_dict_srv_tmp1075)
|
||||||
|
service_tmp1075_2_tuple = ("TMP1075 2", op_code_dict_srv_tmp1075)
|
||||||
|
|
||||||
|
op_code_dict_srv_p60 = {
|
||||||
|
"0": ("P60 Tests", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
}
|
||||||
|
service_p60_tuple = ("P60 Device", op_code_dict_srv_p60)
|
||||||
|
|
||||||
|
op_code_dict_srv_pdu1 = {
|
||||||
|
"0": ("PDU1 Tests", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
}
|
||||||
|
service_pdu1_tuple = ("PDU1 Device", op_code_dict_srv_pdu1)
|
||||||
|
|
||||||
|
op_code_dict_srv_pdu2 = {
|
||||||
|
"0": ("PDU2 Tests", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
}
|
||||||
|
service_pdu2_tuple = ("PDU2 Device", op_code_dict_srv_pdu2)
|
||||||
|
|
||||||
|
op_code_dict_srv_heater = {
|
||||||
|
"0": ("Heater Tests", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
}
|
||||||
|
service_heater_tuple = ("Heater Device", op_code_dict_srv_heater)
|
||||||
|
|
||||||
|
op_code_dict_srv_imtq = {
|
||||||
|
"0": ("IMTQ Tests All", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
"1": ("IMTQ perform pos X self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
"2": ("IMTQ perform neg X self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
"3": ("IMTQ perform pos Y self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
"4": ("IMTQ perform neg Y self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
"5": ("IMTQ perform pos Z self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
"6": ("IMTQ perform neg Z self test", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
"7": ("IMTQ command dipole", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
"8": ("IMTQ get commanded dipole", {OpCodeDictKeys.TIMEOUT: 2.0}),
|
||||||
|
}
|
||||||
|
service_imtq_tuple = ("IMTQ Device", op_code_dict_srv_imtq)
|
||||||
|
|
||||||
|
service_op_code_dict[CustomServiceList.ACU.value] = service_acu_tuple
|
||||||
|
service_op_code_dict[CustomServiceList.TMP1075_1.value] = service_tmp1075_1_tuple
|
||||||
|
service_op_code_dict[CustomServiceList.TMP1075_2.value] = service_tmp1075_2_tuple
|
||||||
|
service_op_code_dict[CustomServiceList.P60DOCK.value] = service_p60_tuple
|
||||||
|
service_op_code_dict[CustomServiceList.PDU1.value] = service_pdu1_tuple
|
||||||
|
service_op_code_dict[CustomServiceList.PDU1.value] = service_pdu2_tuple
|
||||||
|
service_op_code_dict[CustomServiceList.PDU1.value] = service_pdu2_tuple
|
||||||
|
service_op_code_dict[CustomServiceList.HEATER.value] = service_heater_tuple
|
||||||
|
service_op_code_dict[CustomServiceList.IMTQ.value] = service_imtq_tuple
|
||||||
|
return service_op_code_dict
|
||||||
|
|
||||||
|
def get_json_config_file_path(self) -> str:
|
||||||
|
"""
|
||||||
|
The user can specify a path and filename for the JSON configuration file by overriding this function.
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
return "config/tmtc_config.json"
|
||||||
|
|
||||||
def get_version(self) -> str:
|
def get_version(self) -> str:
|
||||||
from config.version import SW_NAME, VERSION_MAJOR, VERSION_MINOR, VERSION_SUBMINOR
|
from config.version import SW_NAME, VERSION_MAJOR, VERSION_MINOR, VERSION_SUBMINOR
|
||||||
return f"{SW_NAME} {VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_SUBMINOR}"
|
return f"{SW_NAME} {VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_SUBMINOR}"
|
||||||
@ -23,12 +91,15 @@ class EiveHookObject(TmTcHookBase):
|
|||||||
|
|
||||||
def add_globals_post_args_parsing(self, args: argparse.Namespace):
|
def add_globals_post_args_parsing(self, args: argparse.Namespace):
|
||||||
from config.globals_config import add_globals_post_args_parsing
|
from config.globals_config import add_globals_post_args_parsing
|
||||||
add_globals_post_args_parsing(args)
|
add_globals_post_args_parsing(args=args, json_cfg_path=self.get_json_config_file_path())
|
||||||
|
|
||||||
def assign_communication_interface(self, com_if: int, tmtc_printer: TmTcPrinter) -> \
|
def assign_communication_interface(self, com_if_key: str, tmtc_printer: TmTcPrinter) -> \
|
||||||
Union[CommunicationInterface, None]:
|
Union[CommunicationInterface, None]:
|
||||||
from tmtccmd.defaults.com_setup import create_communication_interface_default
|
from tmtccmd.config.com_if import create_communication_interface_default
|
||||||
return create_communication_interface_default(com_if=com_if, tmtc_printer=tmtc_printer)
|
return create_communication_interface_default(
|
||||||
|
com_if_key=com_if_key, tmtc_printer=tmtc_printer,
|
||||||
|
json_cfg_path=self.get_json_config_file_path()
|
||||||
|
)
|
||||||
|
|
||||||
def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int):
|
def perform_mode_operation(self, tmtc_backend: TmTcHandler, mode: int):
|
||||||
from config.custom_mode_op import custom_mode_operation
|
from config.custom_mode_op import custom_mode_operation
|
||||||
@ -42,21 +113,13 @@ class EiveHookObject(TmTcHookBase):
|
|||||||
from pus_tm.factory_hook import tm_user_factory_hook
|
from pus_tm.factory_hook import tm_user_factory_hook
|
||||||
return tm_user_factory_hook(raw_tm_packet=raw_tm_packet)
|
return tm_user_factory_hook(raw_tm_packet=raw_tm_packet)
|
||||||
|
|
||||||
def set_object_ids(self) -> Dict[int, bytearray]:
|
def get_object_ids(self) -> Dict[bytes, list]:
|
||||||
from config.object_ids import set_object_ids
|
from config.object_ids import get_object_ids
|
||||||
return set_object_ids()
|
return get_object_ids()
|
||||||
|
|
||||||
def pack_total_service_queue(self) -> Union[None, TcQueueT]:
|
|
||||||
from pus_tc.tc_packer_hook import create_total_tc_queue_user
|
|
||||||
return create_total_tc_queue_user()
|
|
||||||
|
|
||||||
def command_preparation_hook(self) -> Union[None, PusTelecommand]:
|
|
||||||
from custom_hooks import command_preparation_hook
|
|
||||||
return command_preparation_hook()
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def handle_service_8_telemetry(
|
def handle_service_8_telemetry(
|
||||||
object_id: int, action_id: int, custom_data: bytearray
|
object_id: bytes, action_id: int, custom_data: bytearray
|
||||||
) -> Tuple[list, list]:
|
) -> Tuple[list, list]:
|
||||||
from pus_tm.service_8_hook import user_analyze_service_8_data
|
from pus_tm.service_8_hook import user_analyze_service_8_data
|
||||||
return user_analyze_service_8_data(
|
return user_analyze_service_8_data(
|
||||||
@ -65,7 +128,7 @@ class EiveHookObject(TmTcHookBase):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def handle_service_3_housekeeping(
|
def handle_service_3_housekeeping(
|
||||||
object_id: int, set_id: int, hk_data: bytearray, service3_packet: Service3Base
|
object_id: bytes, set_id: int, hk_data: bytearray, service3_packet: Service3Base
|
||||||
) -> Tuple[list, list, bytearray, int]:
|
) -> Tuple[list, list, bytearray, int]:
|
||||||
from pus_tm.hk_handling import handle_user_hk_packet
|
from pus_tm.hk_handling import handle_user_hk_packet
|
||||||
return handle_user_hk_packet(
|
return handle_user_hk_packet(
|
||||||
|
@ -3,49 +3,36 @@
|
|||||||
@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
|
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
PUS_SERVICE_17_ID = bytearray([0x53, 0x00, 0x00, 0x17])
|
PUS_SERVICE_17_ID = bytes([0x53, 0x00, 0x00, 0x17])
|
||||||
TEST_DEVICE_ID = bytearray([0x44, 0x00, 0xAF, 0xFE])
|
TEST_DEVICE_ID = bytes([0x44, 0x00, 0xAF, 0xFE])
|
||||||
P60_DOCK_HANDLER = bytearray([0x44, 0x00, 0x00, 0x1])
|
P60_DOCK_HANDLER = bytes([0x44, 0x00, 0x00, 0x1])
|
||||||
PDU_1_HANDLER_ID = bytearray([0x44, 0x00, 0x00, 0x2])
|
PDU_1_HANDLER_ID = bytes([0x44, 0x00, 0x00, 0x2])
|
||||||
PDU_2_HANDLER_ID = bytearray([0x44, 0x00, 0x00, 0x3])
|
PDU_2_HANDLER_ID = bytes([0x44, 0x00, 0x00, 0x3])
|
||||||
ACU_HANDLER_ID = bytearray([0x44, 0x00, 0x00, 0x4])
|
ACU_HANDLER_ID = bytes([0x44, 0x00, 0x00, 0x4])
|
||||||
TMP_1075_1_HANDLER_ID = bytearray([0x44, 0x00, 0x00, 0x5])
|
TMP_1075_1_HANDLER_ID = bytes([0x44, 0x00, 0x00, 0x5])
|
||||||
TMP_1075_2_HANDLER_ID = bytearray([0x44, 0x00, 0x00, 0x6])
|
TMP_1075_2_HANDLER_ID = bytes([0x44, 0x00, 0x00, 0x6])
|
||||||
HEATER_ID = bytearray([0x54, 0x00, 0x00, 0x1])
|
HEATER_ID = bytes([0x54, 0x00, 0x00, 0x1])
|
||||||
PCDU_HANDLER_ID = bytearray([0x44, 0x00, 0x10, 0x00])
|
PCDU_HANDLER_ID = bytes([0x44, 0x00, 0x10, 0x00])
|
||||||
SOLAR_ARRAY_DEPLOYMENT_ID = bytearray([0x44, 0x00, 0x10, 0x01])
|
SOLAR_ARRAY_DEPLOYMENT_ID = bytes([0x44, 0x00, 0x10, 0x01])
|
||||||
|
SYRLINKS_HANDLER = bytes([0x44, 0x00, 0x10, 0x02])
|
||||||
|
IMTQ_HANDLER_ID = bytearray([0x44, 0x00, 0x00, 0x14])
|
||||||
|
PLOC_ID = bytearray([0x44, 0x00, 0x00, 0x15])
|
||||||
|
|
||||||
|
|
||||||
class ObjIdIds(enum.IntEnum):
|
def get_object_ids() -> Dict[bytes, list]:
|
||||||
PUS_SERVICE_17_ID = 0
|
|
||||||
TEST_DEVICE_ID = 1
|
|
||||||
P60DOCK_HANDLER_ID = 2
|
|
||||||
PDU1_HANDLER_ID = 3
|
|
||||||
PDU2_HANDLER_ID = 4
|
|
||||||
PCDU_HANDLER_ID = 5
|
|
||||||
ACU_HANDLER_ID = 6
|
|
||||||
TMP1075_1_HANDLER_ID = 7
|
|
||||||
TMP1075_2_HANDLER_ID = 8
|
|
||||||
HEATER_ID = 9
|
|
||||||
SOLAR_ARRAY_DEPLOYMENT_ID = 10
|
|
||||||
|
|
||||||
|
|
||||||
def set_object_ids() -> Dict[int, bytearray]:
|
|
||||||
object_id_dict = ({
|
object_id_dict = ({
|
||||||
ObjIdIds.PUS_SERVICE_17_ID: PUS_SERVICE_17_ID,
|
PUS_SERVICE_17_ID: "PUS Service 17",
|
||||||
ObjIdIds.TEST_DEVICE_ID: TEST_DEVICE_ID,
|
TEST_DEVICE_ID: "Test Device",
|
||||||
ObjIdIds.P60DOCK_HANDLER_ID: P60_DOCK_HANDLER,
|
P60_DOCK_HANDLER: "P60",
|
||||||
ObjIdIds.PDU1_HANDLER_ID: PDU_1_HANDLER_ID,
|
PDU_1_HANDLER_ID: "PCDU PDU1 Handler",
|
||||||
ObjIdIds.PDU2_HANDLER_ID: PDU_2_HANDLER_ID,
|
PDU_2_HANDLER_ID: "PCDU PDU2 Handler",
|
||||||
ObjIdIds.ACU_HANDLER_ID: ACU_HANDLER_ID,
|
ACU_HANDLER_ID: "ACU Handler",
|
||||||
ObjIdIds.TMP1075_1_HANDLER_ID: TMP_1075_1_HANDLER_ID,
|
TMP_1075_1_HANDLER_ID: "TMP 1075 Handler 1",
|
||||||
ObjIdIds.TMP1075_2_HANDLER_ID: TMP_1075_2_HANDLER_ID,
|
TMP_1075_2_HANDLER_ID: "TMP 1075 Handler 2",
|
||||||
ObjIdIds.HEATER_ID: HEATER_ID,
|
HEATER_ID: "Heater",
|
||||||
ObjIdIds.PCDU_HANDLER_ID: PCDU_HANDLER_ID,
|
PCDU_HANDLER_ID: "PCDU",
|
||||||
ObjIdIds.SOLAR_ARRAY_DEPLOYMENT_ID: SOLAR_ARRAY_DEPLOYMENT_ID,
|
SOLAR_ARRAY_DEPLOYMENT_ID: "Solar Array Deployment",
|
||||||
})
|
})
|
||||||
return object_id_dict
|
return object_id_dict
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
SW_NAME = "eive"
|
SW_NAME = "eive"
|
||||||
VERSION_MAJOR = 1
|
VERSION_MAJOR = 1
|
||||||
VERSION_MINOR = 4
|
VERSION_MINOR = 6
|
||||||
VERSION_SUBMINOR = 0
|
VERSION_SUBMINOR = 1
|
||||||
|
@ -6,6 +6,11 @@ class PDUConfigTable:
|
|||||||
out_en_1 = TableEntry(bytearray([0x00, 0x49]), TableEntry.uint8_size)
|
out_en_1 = TableEntry(bytearray([0x00, 0x49]), TableEntry.uint8_size)
|
||||||
out_en_2 = TableEntry(bytearray([0x00, 0x4A]), TableEntry.uint8_size)
|
out_en_2 = TableEntry(bytearray([0x00, 0x4A]), TableEntry.uint8_size)
|
||||||
out_en_3 = TableEntry(bytearray([0x00, 0x4B]), TableEntry.uint8_size)
|
out_en_3 = TableEntry(bytearray([0x00, 0x4B]), TableEntry.uint8_size)
|
||||||
|
out_en_4 = TableEntry(bytearray([0x00, 0x4C]), TableEntry.uint8_size)
|
||||||
|
out_en_5 = TableEntry(bytearray([0x00, 0x4D]), TableEntry.uint8_size)
|
||||||
|
out_en_6 = TableEntry(bytearray([0x00, 0x4E]), TableEntry.uint8_size)
|
||||||
|
out_en_7 = TableEntry(bytearray([0x00, 0x4F]), TableEntry.uint8_size)
|
||||||
|
out_en_8 = TableEntry(bytearray([0x00, 0x50]), TableEntry.uint8_size)
|
||||||
# When channel consumes more than cur_lu_lim, channel is turned of immediately
|
# When channel consumes more than cur_lu_lim, channel is turned of immediately
|
||||||
cur_lu_lim_0 = TableEntry(bytearray([0x00, 0xB8]), TableEntry.uint16_size)
|
cur_lu_lim_0 = TableEntry(bytearray([0x00, 0xB8]), TableEntry.uint16_size)
|
||||||
|
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
|
|
||||||
from tmtccmd.pus_tc.packer import TcQueueT
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
from tmtccmd.ecss.tc import PusTelecommand
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.core.definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
from gomspace.gomspace_common import *
|
from gomspace.gomspace_common import *
|
||||||
from pus_tc.p60dock import P60DockConfigTable
|
from pus_tc.p60dock import P60DockConfigTable
|
||||||
from config.object_ids import ObjIdIds
|
|
||||||
from tmtccmd.core.object_id_manager import get_object_id
|
from config.object_ids import P60_DOCK_HANDLER
|
||||||
|
|
||||||
|
|
||||||
class ACUTestProcedure:
|
class ACUTestProcedure:
|
||||||
@ -57,7 +57,7 @@ def pack_acu_test_into(object_id: bytearray, tc_queue: TcQueueT) -> TcQueueT:
|
|||||||
tc_queue.appendleft((QueueCommands.PRINT, "Testing ACU"))
|
tc_queue.appendleft((QueueCommands.PRINT, "Testing ACU"))
|
||||||
|
|
||||||
tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Enabling ACU connected to X1 slot (channel 0)"))
|
tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Enabling ACU connected to X1 slot (channel 0)"))
|
||||||
p60dock_object_id = get_object_id(ObjIdIds.P60DOCK_HANDLER_ID)
|
p60dock_object_id = P60_DOCK_HANDLER
|
||||||
command = pack_set_param_command(p60dock_object_id, P60DockConfigTable.out_en_0.parameter_address,
|
command = pack_set_param_command(p60dock_object_id, P60DockConfigTable.out_en_0.parameter_address,
|
||||||
P60DockConfigTable.out_en_0.parameter_size, Channel.on)
|
P60DockConfigTable.out_en_0.parameter_size, Channel.on)
|
||||||
command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
|
command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 30.01.2021
|
@date 30.01.2021
|
||||||
"""
|
"""
|
||||||
from tmtccmd.core.definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
from tmtccmd.pus_tc.packer import TcQueueT
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
from tmtccmd.ecss.tc import PusTelecommand
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
|
|
||||||
|
196
pus_tc/imtq.py
Normal file
196
pus_tc/imtq.py
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
@file imtq.py
|
||||||
|
@brief Tests for the ISIS IMTQ (Magnettorquer) device handler
|
||||||
|
@author J. Meier
|
||||||
|
@date 25.03.2021
|
||||||
|
"""
|
||||||
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
|
|
||||||
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
|
from tmtccmd.pus_tc.service_3_housekeeping import make_sid, generate_one_hk_command
|
||||||
|
|
||||||
|
|
||||||
|
class ImtqTestProcedure:
|
||||||
|
"""
|
||||||
|
@brief Use this class to define the tests to perform for the IMTQ Handler.
|
||||||
|
@details Setting all to True will run all tests.
|
||||||
|
Setting all to False will only run the tests set to True.
|
||||||
|
"""
|
||||||
|
all = False
|
||||||
|
command_dipole = False
|
||||||
|
get_commanded_dipole = False
|
||||||
|
positive_x_test = True
|
||||||
|
negative_x_test = False
|
||||||
|
positive_y_test = False
|
||||||
|
negative_y_test = False
|
||||||
|
positive_z_test = False
|
||||||
|
negative_z_test = False
|
||||||
|
|
||||||
|
|
||||||
|
class ImtqSetIds:
|
||||||
|
ENG_HK_SET = 1
|
||||||
|
CAL_MTM_SET = 2
|
||||||
|
RAW_MTM_SET = 3
|
||||||
|
POSITIVE_X_TEST = 4
|
||||||
|
NEGATIVE_X_TEST = 5
|
||||||
|
POSITIVE_Y_TEST = 6
|
||||||
|
NEGATIVE_Y_TEST = 7
|
||||||
|
POSITIVE_Z_TEST = 8
|
||||||
|
NEGATIVE_Z_TEST = 9
|
||||||
|
|
||||||
|
|
||||||
|
class ImtqActionIds:
|
||||||
|
start_actuation_dipole = bytearray([0x0, 0x0, 0x0, 0x02])
|
||||||
|
get_commanded_dipole = bytearray([0x0, 0x0, 0x0, 0x03])
|
||||||
|
perform_positive_x_test = bytearray([0x0, 0x0, 0x0, 0x07])
|
||||||
|
perform_negative_x_test = bytearray([0x0, 0x0, 0x0, 0x08])
|
||||||
|
perform_positive_y_test = bytearray([0x0, 0x0, 0x0, 0x09])
|
||||||
|
perform_negative_y_test = bytearray([0x0, 0x0, 0x0, 0x0A])
|
||||||
|
perform_positive_z_test = bytearray([0x0, 0x0, 0x0, 0x0B])
|
||||||
|
perform_negative_z_test = bytearray([0x0, 0x0, 0x0, 0x0C])
|
||||||
|
# Initiates the reading of the last performed self test. After sending this command the results can be downlinked
|
||||||
|
# via the housekeeping service by using the appropriate set ids listed above.
|
||||||
|
read_self_test_results = bytearray([0x0, 0x0, 0x0, 0x0D])
|
||||||
|
|
||||||
|
|
||||||
|
def pack_imtq_test_into(object_id: bytearray, tc_queue: TcQueueT, op_code: str) -> TcQueueT:
|
||||||
|
tc_queue.appendleft(
|
||||||
|
(QueueCommands.PRINT,
|
||||||
|
"Testing ISIS IMTQ handler with object id: 0x" + object_id.hex())
|
||||||
|
)
|
||||||
|
|
||||||
|
if op_code == "0" or op_code == "1":
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform positive x self test"))
|
||||||
|
command = object_id + ImtqActionIds.perform_positive_x_test
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=22, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Initiate reading of positive x self test results"))
|
||||||
|
command = object_id + ImtqActionIds.read_self_test_results
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Request dataset with positive x self test results"))
|
||||||
|
sid = make_sid(object_id, ImtqSetIds.POSITIVE_X_TEST)
|
||||||
|
command = generate_one_hk_command(sid, 24)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
if op_code == "0" or op_code == "2":
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform negative x self test"))
|
||||||
|
command = object_id + ImtqActionIds.perform_negative_x_test
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=25, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Initiate reading of negative x self test results"))
|
||||||
|
command = object_id + ImtqActionIds.read_self_test_results
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=26, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Request dataset with negative x self test results"))
|
||||||
|
sid = make_sid(object_id, ImtqSetIds.NEGATIVE_X_TEST)
|
||||||
|
command = generate_one_hk_command(sid, 27)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
if op_code == "0" or op_code == "3":
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform positive y self test"))
|
||||||
|
command = object_id + ImtqActionIds.perform_positive_y_test
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=28, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Initiate reading of positive y self test results"))
|
||||||
|
command = object_id + ImtqActionIds.read_self_test_results
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=29, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Request dataset with positive y self test results"))
|
||||||
|
sid = make_sid(object_id, ImtqSetIds.POSITIVE_Y_TEST)
|
||||||
|
command = generate_one_hk_command(sid, 30)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
if op_code == "0" or op_code == "4":
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform negative y self test"))
|
||||||
|
command = object_id + ImtqActionIds.perform_negative_y_test
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=31, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Initiate reading of negative y self test results"))
|
||||||
|
command = object_id + ImtqActionIds.read_self_test_results
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=32, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Request dataset with negative y self test results"))
|
||||||
|
sid = make_sid(object_id, ImtqSetIds.NEGATIVE_Y_TEST)
|
||||||
|
command = generate_one_hk_command(sid, 33)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
if op_code == "0" or op_code == "5":
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform positive z self test"))
|
||||||
|
command = object_id + ImtqActionIds.perform_positive_z_test
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=34, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Initiate reading of positive z self test results"))
|
||||||
|
command = object_id + ImtqActionIds.read_self_test_results
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=35, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Request dataset with positive z self test results"))
|
||||||
|
sid = make_sid(object_id, ImtqSetIds.POSITIVE_Y_TEST)
|
||||||
|
command = generate_one_hk_command(sid, 36)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
if op_code == "0" or op_code == "6":
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Perform negative z self test"))
|
||||||
|
command = object_id + ImtqActionIds.perform_negative_z_test
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=35, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Initiate reading of negative z self test results"))
|
||||||
|
command = object_id + ImtqActionIds.read_self_test_results
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=36, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Request dataset with negative z self test results"))
|
||||||
|
sid = make_sid(object_id, ImtqSetIds.NEGATIVE_Z_TEST)
|
||||||
|
command = generate_one_hk_command(sid, 37)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
if op_code == "0" or op_code == "7":
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Commanding dipole"))
|
||||||
|
x_dipole = 0
|
||||||
|
y_dipole = 0
|
||||||
|
z_dipole = 0
|
||||||
|
duration = 0 # ms
|
||||||
|
command = pack_dipole_command(object_id, x_dipole, y_dipole, z_dipole, duration)
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=20, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
if op_code == "0" or op_code == "8":
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "IMTQ: Get commanded dipole"))
|
||||||
|
command = object_id + ImtqActionIds.get_commanded_dipole
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=21, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
return tc_queue
|
||||||
|
|
||||||
|
|
||||||
|
def pack_dipole_command(object_id: bytearray, x_dipole: int, y_dipole: int, z_dipole: int, duration: int) -> bytearray:
|
||||||
|
""" This function packs the command causing the ISIS IMTQ to generate a dipole.
|
||||||
|
@param object_id The object id of the gomspace device handler.
|
||||||
|
@param x_dipole The dipole of the x coil in 10^-4*Am^2 (max. 2000)
|
||||||
|
@param y_dipole The dipole of the y coil in 10^-4*Am^2 (max. 2000)
|
||||||
|
@param z_dipole The dipole of the z coil in 10^-4*Am^2 (max. 2000)
|
||||||
|
@param duration The duration in milliseconds the dipole will be generated by the coils.
|
||||||
|
When set to 0, the dipole will be generated until a new dipole actuation
|
||||||
|
command is sent.
|
||||||
|
"""
|
||||||
|
action_id = ImtqActionIds.start_actuation_dipole
|
||||||
|
command = bytearray()
|
||||||
|
command = object_id + action_id
|
||||||
|
command.extend(x_dipole.to_bytes(length=2, byteorder='big'))
|
||||||
|
command.extend(y_dipole.to_bytes(length=2, byteorder='big'))
|
||||||
|
command.extend(z_dipole.to_bytes(length=2, byteorder='big'))
|
||||||
|
command.extend(duration.to_bytes(length=2, byteorder='big'))
|
||||||
|
return command
|
@ -5,7 +5,7 @@
|
|||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 13.12.2020
|
@date 13.12.2020
|
||||||
"""
|
"""
|
||||||
from tmtccmd.core.definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
from tmtccmd.pus_tc.packer import TcQueueT
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
from tmtccmd.ecss.tc import PusTelecommand
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
from gomspace.gomspace_common import *
|
from gomspace.gomspace_common import *
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 17.12.2020
|
@date 17.12.2020
|
||||||
"""
|
"""
|
||||||
from tmtccmd.core.definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
|
|
||||||
from tmtccmd.pus_tc.packer import TcQueueT
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
from tmtccmd.ecss.tc import PusTelecommand
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
@ -24,6 +24,10 @@ class PDU1TestProcedure:
|
|||||||
reboot = False
|
reboot = False
|
||||||
ping = False
|
ping = False
|
||||||
read_temperature = False
|
read_temperature = False
|
||||||
|
turn_channel_2_on = False # Star Tracker connected to this channel (5V)
|
||||||
|
turn_channel_2_off = False
|
||||||
|
turn_channel_3_on = False # MTQ connected to this channel (5V)
|
||||||
|
turn_channel_3_off = True
|
||||||
|
|
||||||
|
|
||||||
def pack_pdu1_test_into(
|
def pack_pdu1_test_into(
|
||||||
@ -31,14 +35,6 @@ def pack_pdu1_test_into(
|
|||||||
):
|
):
|
||||||
tc_queue.appendleft((QueueCommands.PRINT, "Testing PDU1"))
|
tc_queue.appendleft((QueueCommands.PRINT, "Testing PDU1"))
|
||||||
|
|
||||||
tc_queue.appendleft((QueueCommands.PRINT, "P60 Dock: Enabling PDU1"))
|
|
||||||
command = pack_set_param_command(
|
|
||||||
p60dock_object_id, P60DockConfigTable.out_en_1.parameter_address,
|
|
||||||
P60DockConfigTable.out_en_1.parameter_size, Channel.on
|
|
||||||
)
|
|
||||||
command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
|
|
||||||
tc_queue.appendleft(command.pack_command_tuple())
|
|
||||||
|
|
||||||
if PDU1TestProcedure.all or PDU1TestProcedure.ping:
|
if PDU1TestProcedure.all or PDU1TestProcedure.ping:
|
||||||
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Ping Test"))
|
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Ping Test"))
|
||||||
ping_data = bytearray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
|
ping_data = bytearray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
|
||||||
@ -53,3 +49,27 @@ def pack_pdu1_test_into(
|
|||||||
)
|
)
|
||||||
command = PusTelecommand(service=8, subservice=128, ssc=24, app_data=command)
|
command = PusTelecommand(service=8, subservice=128, ssc=24, app_data=command)
|
||||||
tc_queue.appendleft(command.pack_command_tuple())
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
if PDU1TestProcedure.all or PDU1TestProcedure.turn_channel_2_on:
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn channel 2 on (Star Tracker)"))
|
||||||
|
command = pack_set_param_command(pdu1_object_id, PDUConfigTable.out_en_2.parameter_address,
|
||||||
|
PDUConfigTable.out_en_2.parameter_size, Channel.on)
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=30, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
if PDU1TestProcedure.all or PDU1TestProcedure.turn_channel_2_off:
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn channel 2 off (Star Tracker)"))
|
||||||
|
command = pack_set_param_command(pdu1_object_id, PDUConfigTable.out_en_2.parameter_address,
|
||||||
|
PDUConfigTable.out_en_2.parameter_size, Channel.off)
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=31, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
if PDU1TestProcedure.all or PDU1TestProcedure.turn_channel_3_on:
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn channel 3 on (MTQ)"))
|
||||||
|
command = pack_set_param_command(pdu1_object_id, PDUConfigTable.out_en_3.parameter_address,
|
||||||
|
PDUConfigTable.out_en_3.parameter_size, Channel.on)
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=32, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
if PDU1TestProcedure.all or PDU1TestProcedure.turn_channel_3_off:
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "PDU1: Turn channel 3 off (MTQ)"))
|
||||||
|
command = pack_set_param_command(pdu1_object_id, PDUConfigTable.out_en_3.parameter_address,
|
||||||
|
PDUConfigTable.out_en_3.parameter_size, Channel.off)
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=33, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 17.12.2020
|
@date 17.12.2020
|
||||||
"""
|
"""
|
||||||
from tmtccmd.core.definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
from tmtccmd.pus_tc.packer import TcQueueT
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
from tmtccmd.ecss.tc import PusTelecommand
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
from gomspace.gomspace_common import *
|
from gomspace.gomspace_common import *
|
||||||
@ -101,4 +101,5 @@ def pack_pdu2_test_into(pdu2_object_id: bytearray, p60dock_object_id: bytearray,
|
|||||||
command = pack_request_full_hk_table_command(pdu2_object_id)
|
command = pack_request_full_hk_table_command(pdu2_object_id)
|
||||||
command = PusTelecommand(service=8, subservice=128, ssc=28, app_data=command)
|
command = PusTelecommand(service=8, subservice=128, ssc=28, app_data=command)
|
||||||
tc_queue.appendleft(command.pack_command_tuple())
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
return tc_queue
|
return tc_queue
|
||||||
|
67
pus_tc/ploc.py
Normal file
67
pus_tc/ploc.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
@file ploc.py
|
||||||
|
@brief TMP1075 tests
|
||||||
|
@author J. Meier
|
||||||
|
@date 06.01.2021
|
||||||
|
"""
|
||||||
|
import struct
|
||||||
|
|
||||||
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
|
|
||||||
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
|
|
||||||
|
|
||||||
|
class PlocTestProcedure:
|
||||||
|
"""
|
||||||
|
@brief Use this class to define the tests to perform for the PLOC.
|
||||||
|
@details Setting all to True will run all tests.
|
||||||
|
Setting all to False will only run the tests set to True.
|
||||||
|
"""
|
||||||
|
all = False
|
||||||
|
test_tc_mem_write = False
|
||||||
|
test_tc_mem_read = True
|
||||||
|
|
||||||
|
|
||||||
|
class PlocActionIds:
|
||||||
|
tc_mem_write = bytearray([0x0, 0x0, 0x0, 0x1])
|
||||||
|
tc_mem_read = bytearray([0x0, 0x0, 0x0, 0x2])
|
||||||
|
|
||||||
|
|
||||||
|
class PlocReplyIds:
|
||||||
|
tm_mem_read_report = 6
|
||||||
|
|
||||||
|
|
||||||
|
def pack_ploc_test_into(object_id: bytearray, tc_queue: TcQueueT) -> TcQueueT:
|
||||||
|
tc_queue.appendleft(
|
||||||
|
(QueueCommands.PRINT,
|
||||||
|
"Testing PLOC Handler with object id: 0x" + object_id.hex())
|
||||||
|
)
|
||||||
|
|
||||||
|
if PlocTestProcedure.all or PlocTestProcedure.test_tc_mem_write:
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "PLOC: TC Mem Write Test"))
|
||||||
|
memory_address = int(input("PLOC Tc Mem Write: Type memory address: 0x"), 16)
|
||||||
|
memory_data = int(input("PLOC Tc Mem Write: Type memory data: 0x"), 16)
|
||||||
|
command = generate_write_mem_command(object_id, struct.pack('!I', memory_address), memory_data)
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=23, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
if PlocTestProcedure.all or PlocTestProcedure.test_tc_mem_read:
|
||||||
|
tc_queue.appendleft((QueueCommands.PRINT, "PLOC: TC Mem Read Test"))
|
||||||
|
memory_address = int(input("PLOC Tc Mem Read: Type memory address: 0x"), 16)
|
||||||
|
command = object_id + PlocActionIds.tc_mem_read + struct.pack('!I', memory_address)
|
||||||
|
command = PusTelecommand(service=8, subservice=128, ssc=24, app_data=command)
|
||||||
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
|
return tc_queue
|
||||||
|
|
||||||
|
|
||||||
|
def generate_write_mem_command(object_id: bytearray, memory_address: bytearray, memory_data: int) -> bytearray:
|
||||||
|
""" This function generates the command to write to a memory address within the PLOC
|
||||||
|
@param object_id The object id of the PlocHandler
|
||||||
|
@param memory_address The PLOC memory address where to write to.
|
||||||
|
@param memory_data The data to write to the memory address specified by the bytearray memory_address.
|
||||||
|
"""
|
||||||
|
command = object_id + PlocActionIds.tc_mem_write + memory_address + struct.pack('!I', memory_data)
|
||||||
|
return command
|
@ -5,7 +5,7 @@
|
|||||||
@author R. Mueller
|
@author R. Mueller
|
||||||
@date 02.05.2020
|
@date 02.05.2020
|
||||||
"""
|
"""
|
||||||
from tmtccmd.core.definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
from tmtccmd.ecss.tc import PusTelecommand
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
from tmtccmd.pus_tc.packer import TcQueueT
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
from tmtccmd.pus_tc.service_200_mode import pack_mode_data
|
from tmtccmd.pus_tc.service_200_mode import pack_mode_data
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
@file tmtcc_tc_solar_array_deployment.py
|
@file solar_array_deployment.py
|
||||||
@brief The test function in this file simply returns a command which triggers the solar array deployment.
|
@brief The test function in this file simply returns a command which triggers the solar array deployment.
|
||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 15.02.2021
|
@date 15.02.2021
|
||||||
"""
|
"""
|
||||||
from tmtc_core.core.tmtc_core_definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
from tmtc_core.pus_tc.tmtcc_pus_tc_packer import TcQueueT
|
from tmtccmd.pus_tc.definitions import TcQueueT
|
||||||
from tmtc_core.pus_tc.tmtcc_pus_tc_base import PusTelecommand
|
from tmtccmd.pus_tc.packer import PusTelecommand
|
||||||
|
|
||||||
|
|
||||||
class ActionIds:
|
class ActionIds:
|
||||||
DEPLOY_SOLAR_ARRAYS = bytearray([0x0, 0x0, 0x0, 0x5])
|
DEPLOY_SOLAR_ARRAYS = bytearray([0x0, 0x0, 0x0, 0x5])
|
||||||
|
|
||||||
|
|
||||||
def pack_solar_array_deployment_test_into(object_id: bytearray, tc_queue: TcQueueT) -> TcQueueT:
|
def pack_solar_array_deployment_test_into(object_id: bytearray, tc_queue: TcQueueT):
|
||||||
tc_queue.appendleft((QueueCommands.PRINT, "Testing S/A Deployment"))
|
tc_queue.appendleft((QueueCommands.PRINT, "Testing S/A Deployment"))
|
||||||
|
|
||||||
command = object_id + ActionIds.DEPLOY_SOLAR_ARRAYS
|
command = object_id + ActionIds.DEPLOY_SOLAR_ARRAYS
|
@ -1,15 +1,14 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
@file tmtcc_tc_syrlinks_hk_handler.py
|
@file syrlinks_hk_handler.py
|
||||||
@brief Syrlinks Hk Handler tests
|
@brief Syrlinks Hk Handler tests
|
||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 13.12.2020
|
@date 13.12.2020
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from tmtc_core.core.tmtc_core_definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
from tmtc_core.pus_tc.tmtcc_pus_tc_packer import TcQueueT
|
from tmtccmd.pus_tc.definitions import TcQueueT
|
||||||
from tmtc_core.pus_tc.tmtcc_pus_tc_base import PusTelecommand
|
from tmtccmd.pus_tc.service_3_housekeeping import make_sid, generate_one_hk_command
|
||||||
from tmtc_core.pus_tc.tmtcc_tc_service_3_housekeeping import *
|
|
||||||
|
|
||||||
|
|
||||||
class SetIds:
|
class SetIds:
|
||||||
@ -17,7 +16,7 @@ class SetIds:
|
|||||||
TX_REGISTERS_DATASET = 2
|
TX_REGISTERS_DATASET = 2
|
||||||
|
|
||||||
|
|
||||||
def pack_syrlinks_hk_handler_test_into(object_id: bytearray, tc_queue: TcQueueT) -> TcQueueT:
|
def pack_syrlinks_hk_handler_test_into(object_id: bytearray, tc_queue: TcQueueT):
|
||||||
tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Get RX Registers"))
|
tc_queue.appendleft((QueueCommands.PRINT, "Syrlinks: Get RX Registers"))
|
||||||
sid = make_sid(object_id, SetIds.RX_REGISTERS_DATASET)
|
sid = make_sid(object_id, SetIds.RX_REGISTERS_DATASET)
|
||||||
command = generate_one_hk_command(sid, 200)
|
command = generate_one_hk_command(sid, 200)
|
||||||
@ -27,5 +26,3 @@ def pack_syrlinks_hk_handler_test_into(object_id: bytearray, tc_queue: TcQueueT)
|
|||||||
sid = make_sid(object_id, SetIds.TX_REGISTERS_DATASET)
|
sid = make_sid(object_id, SetIds.TX_REGISTERS_DATASET)
|
||||||
command = generate_one_hk_command(sid, 201)
|
command = generate_one_hk_command(sid, 201)
|
||||||
tc_queue.appendleft(command.pack_command_tuple())
|
tc_queue.appendleft(command.pack_command_tuple())
|
||||||
|
|
||||||
return tc_queue
|
|
@ -8,54 +8,67 @@ import os
|
|||||||
from collections import deque
|
from collections import deque
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
from tmtccmd.core.definitions import CoreServiceList
|
from tmtccmd.config.definitions import CoreServiceList
|
||||||
from tmtccmd.utility.tmtcc_logger import get_logger
|
from tmtccmd.utility.logger import get_logger
|
||||||
from tmtccmd.pus_tc.definitions import TcQueueT
|
from tmtccmd.pus_tc.definitions import TcQueueT
|
||||||
from tmtccmd.pus_tc.service_5_event import pack_generic_service5_test_into
|
from tmtccmd.pus_tc.service_5_event import pack_generic_service5_test_into
|
||||||
from tmtccmd.pus_tc.service_17_test import pack_service17_ping_command
|
from tmtccmd.pus_tc.service_17_test import pack_service17_ping_command
|
||||||
from tmtccmd.core.object_id_manager import get_object_id
|
|
||||||
|
|
||||||
from pus_tc.p60dock import pack_p60dock_test_into
|
from pus_tc.p60dock import pack_p60dock_test_into
|
||||||
from pus_tc.pdu2 import pack_pdu2_test_into
|
from pus_tc.pdu2 import pack_pdu2_test_into
|
||||||
from pus_tc.pdu1 import pack_pdu1_test_into
|
from pus_tc.pdu1 import pack_pdu1_test_into
|
||||||
from pus_tc.acu import pack_acu_test_into
|
from pus_tc.acu import pack_acu_test_into
|
||||||
|
from pus_tc.imtq import pack_imtq_test_into
|
||||||
from pus_tc.tmp1075 import pack_tmp1075_test_into
|
from pus_tc.tmp1075 import pack_tmp1075_test_into
|
||||||
|
from pus_tc.ploc import pack_ploc_test_into
|
||||||
from pus_tc.heater import pack_heater_test_into
|
from pus_tc.heater import pack_heater_test_into
|
||||||
from config.definitions import CustomServiceList
|
from config.definitions import CustomServiceList
|
||||||
from config.object_ids import ObjIdIds
|
from config.object_ids import P60_DOCK_HANDLER, PDU_1_HANDLER_ID, PDU_2_HANDLER_ID, ACU_HANDLER_ID, \
|
||||||
|
TMP_1075_1_HANDLER_ID, TMP_1075_2_HANDLER_ID, HEATER_ID, IMTQ_HANDLER_ID, PLOC_ID
|
||||||
|
|
||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
|
||||||
|
|
||||||
def pack_service_queue_user(service: Union[str, int], op_code: str, service_queue: TcQueueT):
|
def pack_service_queue_user(service: Union[str, int], op_code: str, service_queue: TcQueueT):
|
||||||
if service == CoreServiceList.SERVICE_5:
|
if service == CoreServiceList.SERVICE_5.value:
|
||||||
return pack_generic_service5_test_into(service_queue)
|
return pack_generic_service5_test_into(tc_queue=service_queue)
|
||||||
if service == CoreServiceList.SERVICE_17:
|
if service == CoreServiceList.SERVICE_17.value:
|
||||||
return service_queue.appendleft(pack_service17_ping_command(ssc=1700).pack_command_tuple())
|
return service_queue.appendleft(pack_service17_ping_command(ssc=1700).pack_command_tuple())
|
||||||
if service == CustomServiceList.P60DOCK.value:
|
if service == CustomServiceList.P60DOCK.value:
|
||||||
object_id = get_object_id(ObjIdIds.P60DOCK_HANDLER_ID)
|
object_id = P60_DOCK_HANDLER
|
||||||
return pack_p60dock_test_into(object_id, service_queue)
|
return pack_p60dock_test_into(object_id=object_id, tc_queue=service_queue)
|
||||||
if service == CustomServiceList.PDU1.value:
|
if service == CustomServiceList.PDU1.value:
|
||||||
pdu1_object_id = get_object_id(ObjIdIds.PDU1_HANDLER_ID)
|
pdu1_object_id = PDU_1_HANDLER_ID
|
||||||
p60dock_object_id = get_object_id(ObjIdIds.P60DOCK_HANDLER_ID)
|
p60dock_object_id = P60_DOCK_HANDLER
|
||||||
return pack_pdu1_test_into(pdu1_object_id, p60dock_object_id, service_queue)
|
return pack_pdu1_test_into(
|
||||||
|
pdu1_object_id=pdu1_object_id, p60dock_object_id=p60dock_object_id, tc_queue=service_queue
|
||||||
|
)
|
||||||
if service == CustomServiceList.PDU2.value:
|
if service == CustomServiceList.PDU2.value:
|
||||||
pdu2_object_id = get_object_id(ObjIdIds.PDU2_HANDLER_ID)
|
pdu2_object_id = PDU_2_HANDLER_ID
|
||||||
p60dock_object_id = get_object_id(ObjIdIds.P60DOCK_HANDLER_ID)
|
p60dock_object_id = P60_DOCK_HANDLER
|
||||||
return pack_pdu2_test_into(pdu2_object_id, p60dock_object_id, service_queue)
|
return pack_pdu2_test_into(
|
||||||
|
pdu2_object_id=pdu2_object_id, p60dock_object_id=p60dock_object_id, tc_queue=service_queue
|
||||||
|
)
|
||||||
if service == CustomServiceList.ACU.value:
|
if service == CustomServiceList.ACU.value:
|
||||||
object_id = get_object_id(ObjIdIds.ACU_HANDLER_ID)
|
object_id = ACU_HANDLER_ID
|
||||||
return pack_acu_test_into(object_id, service_queue)
|
return pack_acu_test_into(object_id=object_id, tc_queue=service_queue)
|
||||||
if service == CustomServiceList.TMP1075_1.value:
|
if service == CustomServiceList.TMP1075_1.value:
|
||||||
object_id = get_object_id(ObjIdIds.TMP1075_1_HANDLER_ID)
|
object_id = TMP_1075_1_HANDLER_ID
|
||||||
return pack_tmp1075_test_into(object_id, service_queue)
|
return pack_tmp1075_test_into(object_id=object_id, tc_queue=service_queue, op_code=op_code)
|
||||||
if service == CustomServiceList.TMP1075_2.value:
|
if service == CustomServiceList.TMP1075_2.value:
|
||||||
object_id = get_object_id(ObjIdIds.TMP1075_2_HANDLER_ID)
|
object_id = TMP_1075_2_HANDLER_ID
|
||||||
return pack_tmp1075_test_into(object_id, service_queue)
|
return pack_tmp1075_test_into(object_id=object_id, tc_queue=service_queue, op_code=op_code)
|
||||||
if service == CustomServiceList.HEATER.value:
|
if service == CustomServiceList.HEATER.value:
|
||||||
object_id = get_object_id(ObjIdIds.HEATER)
|
object_id = HEATER_ID
|
||||||
return pack_heater_test_into(object_id, service_queue)
|
return pack_heater_test_into(object_id=object_id, tc_queue=service_queue)
|
||||||
|
if service == CustomServiceList.IMTQ.value:
|
||||||
|
object_id = IMTQ_HANDLER_ID
|
||||||
|
return pack_imtq_test_into(object_id=object_id, tc_queue=service_queue, op_code=op_code)
|
||||||
|
if service == CustomServiceList.PLOC.value:
|
||||||
|
object_id = PLOC_ID
|
||||||
|
return pack_ploc_test_into(object_id=object_id, tc_queue=service_queue)
|
||||||
|
|
||||||
LOGGER.warning("Invalid Service !")
|
LOGGER.warning("Invalid Service !")
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
@file tmtcc_tc_tmp1075.py
|
@file tmp1075.py
|
||||||
@brief TMP1075 tests
|
@brief TMP1075 tests
|
||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 06.01.2021
|
@date 06.01.2021
|
||||||
"""
|
"""
|
||||||
from tmtccmd.core.definitions import QueueCommands
|
from tmtccmd.config.definitions import QueueCommands
|
||||||
|
|
||||||
from tmtccmd.pus_tc.packer import TcQueueT
|
from tmtccmd.pus_tc.packer import TcQueueT
|
||||||
from tmtccmd.ecss.tc import PusTelecommand
|
from tmtccmd.ecss.tc import PusTelecommand
|
||||||
@ -30,7 +30,7 @@ class Tmp1075ActionIds:
|
|||||||
start_adc_conversion = bytearray([0x0, 0x0, 0x0, 0x02])
|
start_adc_conversion = bytearray([0x0, 0x0, 0x0, 0x02])
|
||||||
|
|
||||||
|
|
||||||
def pack_tmp1075_test_into(object_id: bytearray, tc_queue: TcQueueT) -> TcQueueT:
|
def pack_tmp1075_test_into(object_id: bytearray, op_code: str, tc_queue: TcQueueT) -> TcQueueT:
|
||||||
tc_queue.appendleft(
|
tc_queue.appendleft(
|
||||||
(QueueCommands.PRINT,
|
(QueueCommands.PRINT,
|
||||||
"Testing Tmp1075 Temperature Sensor Handler with object id: 0x" + object_id.hex())
|
"Testing Tmp1075 Temperature Sensor Handler with object id: 0x" + object_id.hex())
|
||||||
|
@ -5,28 +5,38 @@
|
|||||||
"""
|
"""
|
||||||
from tmtccmd.pus_tm.service_8_functional_cmd import Service8TM
|
from tmtccmd.pus_tm.service_8_functional_cmd import Service8TM
|
||||||
from tmtccmd.ecss.tm import PusTelemetry
|
from tmtccmd.ecss.tm import PusTelemetry
|
||||||
from tmtccmd.utility.tmtcc_logger import get_logger
|
from tmtccmd.utility.logger import get_logger
|
||||||
|
|
||||||
from tmtccmd.pus_tm.service_1_verification import Service1TM
|
from tmtccmd.pus_tm.service_1_verification import Service1TM
|
||||||
from tmtccmd.pus_tm.service_3_base import Service3Base
|
from tmtccmd.pus_tm.service_3_housekeeping import Service3TM
|
||||||
from tmtccmd.pus_tm.service_5_event import Service5TM
|
from tmtccmd.pus_tm.service_5_event import Service5TM
|
||||||
from tmtccmd.pus_tm.service_17_test import Service17TM
|
from tmtccmd.pus_tm.service_17_test import Service17TM
|
||||||
|
from tmtccmd.utility.tmtc_printer import TmTcPrinter
|
||||||
|
|
||||||
|
from config.definitions import PUS_APID
|
||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
|
||||||
|
|
||||||
def tm_user_factory_hook(raw_tm_packet: bytearray) -> PusTelemetry:
|
def ccsds_tm_handler(apid: int, raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter) -> None:
|
||||||
|
if apid == PUS_APID:
|
||||||
|
pus_factory_hook(raw_tm_packet=raw_tm_packet, tmtc_printer=tmtc_printer)
|
||||||
|
|
||||||
|
|
||||||
|
def pus_factory_hook(raw_tm_packet: bytearray, tmtc_printer: TmTcPrinter):
|
||||||
service_type = raw_tm_packet[7]
|
service_type = raw_tm_packet[7]
|
||||||
|
tm_packet = None
|
||||||
if service_type == 1:
|
if service_type == 1:
|
||||||
return Service1TM(raw_tm_packet)
|
tm_packet = Service1TM(raw_tm_packet)
|
||||||
if service_type == 3:
|
if service_type == 3:
|
||||||
return Service3Base(raw_tm_packet)
|
tm_packet = Service3TM(raw_tm_packet)
|
||||||
if service_type == 5:
|
if service_type == 5:
|
||||||
return Service5TM(raw_tm_packet)
|
tm_packet = Service5TM(raw_tm_packet)
|
||||||
if service_type == 8:
|
if service_type == 8:
|
||||||
service_8_tm = Service8TM(raw_tm_packet)
|
tm_packet = Service8TM(raw_tm_packet)
|
||||||
return Service8TM(raw_tm_packet)
|
|
||||||
if service_type == 17:
|
if service_type == 17:
|
||||||
return Service17TM(raw_tm_packet)
|
tm_packet = Service17TM(raw_tm_packet)
|
||||||
LOGGER.info("The service " + str(service_type) + " is not implemented in Telemetry Factory")
|
if tm_packet is None:
|
||||||
return PusTelemetry(raw_tm_packet)
|
LOGGER.info(f'The service {service_type} is not implemented in Telemetry Factory')
|
||||||
|
tm_packet = PusTelemetry(raw_tm_packet)
|
||||||
|
tmtc_printer.print_telemetry(packet=tm_packet)
|
||||||
|
@ -4,19 +4,29 @@
|
|||||||
@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 struct
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
from tmtccmd.pus_tm.service_3_base import Service3Base
|
from tmtccmd.pus_tm.service_3_housekeeping import Service3Base
|
||||||
from tmtccmd.utility.tmtcc_logger import get_logger
|
from tmtccmd.utility.logger import get_logger
|
||||||
|
from pus_tc.syrlinks_hk_handler import SetIds
|
||||||
|
from pus_tc.imtq import ImtqSetIds
|
||||||
|
from config.object_ids import SYRLINKS_HANDLER, IMTQ_HANDLER_ID
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
|
||||||
|
|
||||||
def handle_user_hk_packet(object_id: int, set_id: int, hk_data: bytearray,
|
def handle_user_hk_packet(object_id: bytes, set_id: int, hk_data: bytearray,
|
||||||
service3_packet: Service3Base) -> Tuple[list, list, bytearray, int]:
|
service3_packet: Service3Base) -> Tuple[list, list, bytearray, int]:
|
||||||
"""
|
"""
|
||||||
This function is called when a Service 3 Housekeeping packet is received.
|
This function is called when a Service 3 Housekeeping packet is received.
|
||||||
|
|
||||||
|
Please note that the object IDs should be compared by value because direct comparison of
|
||||||
|
enumerations does not work in Python. For example use:
|
||||||
|
|
||||||
|
if object_id.value == ObjectIds.TEST_OBJECT.value
|
||||||
|
|
||||||
|
to test equality based on the object ID list.
|
||||||
|
|
||||||
@param object_id:
|
@param object_id:
|
||||||
@param set_id:
|
@param set_id:
|
||||||
@param hk_data:
|
@param hk_data:
|
||||||
@ -26,5 +36,122 @@ def handle_user_hk_packet(object_id: int, set_id: int, hk_data: bytearray,
|
|||||||
the corresponding values. The bytearray is the validity buffer, which is usually appended
|
the corresponding values. The bytearray is the validity buffer, which is usually appended
|
||||||
at the end of the housekeeping packet. The last value is the number of parameters.
|
at the end of the housekeeping packet. The last value is the number of parameters.
|
||||||
"""
|
"""
|
||||||
LOGGER.info("Service3TM: Parsing for this SID has not been implemented.")
|
if object_id == SYRLINKS_HANDLER:
|
||||||
return [], [], bytearray(), 0
|
if set_id == SetIds.RX_REGISTERS_DATASET:
|
||||||
|
return handle_syrlinks_rx_registers_dataset(hk_data)
|
||||||
|
elif set_id == SetIds.TX_REGISTERS_DATASET:
|
||||||
|
return handle_syrlinks_tx_registers_dataset(hk_data)
|
||||||
|
else:
|
||||||
|
LOGGER.info("Serive 3 TM: Syrlinks handler reply with unknown set id")
|
||||||
|
return [], [], bytearray(), 0
|
||||||
|
elif object_id == IMTQ_HANDLER_ID:
|
||||||
|
if (set_id >= ImtqSetIds.POSITIVE_X_TEST) and (set_id <= ImtqSetIds.NEGATIVE_Z_TEST):
|
||||||
|
return handle_self_test_data(hk_data)
|
||||||
|
else:
|
||||||
|
LOGGER.info("Serive 3 TM: Syrlinks handler reply with unknown set id")
|
||||||
|
return [], [], bytearray(), 0
|
||||||
|
else:
|
||||||
|
LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.")
|
||||||
|
return [], [], bytearray(), 0
|
||||||
|
|
||||||
|
|
||||||
|
def handle_syrlinks_rx_registers_dataset(hk_data: bytearray) -> Tuple[list, list, bytearray, int]:
|
||||||
|
hk_header = []
|
||||||
|
hk_content = []
|
||||||
|
validity_buffer = bytearray()
|
||||||
|
hk_header = ["RX Status", "RX Sensitivity", "RX Frequency Shift", "RX IQ Power", "RX AGC Value", "RX Demod Eb",
|
||||||
|
"RX Demod N0", "RX Datarate"]
|
||||||
|
rx_status = hk_data[0]
|
||||||
|
rx_sensitivity = struct.unpack('!I', hk_data[1:5])
|
||||||
|
rx_frequency_shift = struct.unpack('!I', hk_data[5:9])
|
||||||
|
rx_iq_power = struct.unpack('!H', hk_data[9:11])
|
||||||
|
rx_agc_value = struct.unpack('!H', hk_data[11:13])
|
||||||
|
rx_demod_eb = struct.unpack('!I', hk_data[13:17])
|
||||||
|
rx_demod_n0 = struct.unpack('!I', hk_data[17:21])
|
||||||
|
rx_data_rate = hk_data[21]
|
||||||
|
hk_content = [rx_status, rx_sensitivity, rx_frequency_shift, rx_iq_power, rx_agc_value, rx_demod_eb, rx_demod_n0,
|
||||||
|
rx_data_rate]
|
||||||
|
return hk_header, hk_content, validity_buffer, 8
|
||||||
|
|
||||||
|
|
||||||
|
def handle_syrlinks_tx_registers_dataset(hk_data: bytearray) -> Tuple[list, list, bytearray, int]:
|
||||||
|
hk_header = []
|
||||||
|
hk_content = []
|
||||||
|
validity_buffer = bytearray()
|
||||||
|
hk_header = ["TX Status", "TX Waveform", "TX AGC value"]
|
||||||
|
tx_status = hk_data[0]
|
||||||
|
tx_waveform = hk_data[1]
|
||||||
|
tx_agc_value = struct.unpack('!H', hk_data[2:4])
|
||||||
|
hk_content = [tx_status, tx_waveform, tx_agc_value]
|
||||||
|
return hk_header, hk_content, validity_buffer, 3
|
||||||
|
|
||||||
|
|
||||||
|
def handle_self_test_data(hk_data: bytearray) -> Tuple[list, list, bytearray, int]:
|
||||||
|
hk_header = []
|
||||||
|
hk_content = []
|
||||||
|
validity_buffer = bytearray()
|
||||||
|
hk_header = ["Init Err", "Init Raw Mag X [nT]", "Init Raw Mag Y [nT]", "Init Raw Mag Z [nT]", "Init Cal Mag X [nT]",
|
||||||
|
"Init Cal Mag Y [nT]", "Init Cal Mag Z [nT]", "Init Coil X Current [mA]", "Init Coil Y Current [mA]",
|
||||||
|
"Init Coil Z Current [mA]", "Init Coil X Temperature [°C]", "Init Coil Y Temperature [°C]",
|
||||||
|
"Init Coil Z Temperature [°C]", "Err", "Raw Mag X [nT]", "Raw Mag Y [nT]", "Raw Mag Z [nT]",
|
||||||
|
"Cal Mag X [nT]", "Cal Mag Y [nT]", "Cal Mag Z [nT]", "Coil X Current [mA]", "Coil Y Current [mA]",
|
||||||
|
"Coil Z Current [mA]", "Coil X Temperature [°C]", "Coil Y Temperature [°C]", "Coil Z Temperature [°C]",
|
||||||
|
"Fina Err", "Fina Raw Mag X [nT]", "Fina Raw Mag Y [nT]", "Fina Raw Mag Z [nT]", "Fina Cal Mag X [nT]",
|
||||||
|
"Fina Cal Mag Y [nT]", "Fina Cal Mag Z [nT]", "Fina Coil X Current [mA]", "Fina Coil Y Current [mA]",
|
||||||
|
"Fina Coil Z Current [mA]", "Fina Coil X Temperature [°C]", "Fina Coil Y Temperature [°C]",
|
||||||
|
"Fina Coil Z Temperature [°C]"]
|
||||||
|
# INIT step (no coil actuation)
|
||||||
|
init_err = hk_data[0]
|
||||||
|
init_raw_mag_x = struct.unpack('!f', hk_data[1:5])[0]
|
||||||
|
init_raw_mag_y = struct.unpack('!f', hk_data[5:9])[0]
|
||||||
|
init_raw_mag_z = struct.unpack('!f', hk_data[9:13])[0]
|
||||||
|
init_cal_mag_x = struct.unpack('!f', hk_data[13:17])[0]
|
||||||
|
init_cal_mag_y = struct.unpack('!f', hk_data[17:21])[0]
|
||||||
|
init_cal_mag_z = struct.unpack('!f', hk_data[21:25])[0]
|
||||||
|
init_coil_x_current = struct.unpack('!f', hk_data[25:29])[0]
|
||||||
|
init_coil_y_current = struct.unpack('!f', hk_data[29:33])[0]
|
||||||
|
init_coil_z_current = struct.unpack('!f', hk_data[33:37])[0]
|
||||||
|
init_coil_x_temperature = struct.unpack('!H', hk_data[37:39])[0]
|
||||||
|
init_coil_y_temperature = struct.unpack('!H', hk_data[39:41])[0]
|
||||||
|
init_coil_z_temperature = struct.unpack('!H', hk_data[41:43])[0]
|
||||||
|
|
||||||
|
# Actuation step
|
||||||
|
err = hk_data[43]
|
||||||
|
raw_mag_x = struct.unpack('!f', hk_data[44:48])[0]
|
||||||
|
raw_mag_y = struct.unpack('!f', hk_data[48:52])[0]
|
||||||
|
raw_mag_z = struct.unpack('!f', hk_data[52:56])[0]
|
||||||
|
cal_mag_x = struct.unpack('!f', hk_data[56:60])[0]
|
||||||
|
cal_mag_y = struct.unpack('!f', hk_data[60:64])[0]
|
||||||
|
cal_mag_z = struct.unpack('!f', hk_data[64:68])[0]
|
||||||
|
coil_x_current = struct.unpack('!f', hk_data[68:72])[0]
|
||||||
|
coil_y_current = struct.unpack('!f', hk_data[72:76])[0]
|
||||||
|
coil_z_current = struct.unpack('!f', hk_data[76:80])[0]
|
||||||
|
coil_x_temperature = struct.unpack('!H', hk_data[80:82])[0]
|
||||||
|
coil_y_temperature = struct.unpack('!H', hk_data[82:84])[0]
|
||||||
|
coil_z_temperature = struct.unpack('!H', hk_data[84:86])[0]
|
||||||
|
|
||||||
|
# FINA step (no coil actuation)
|
||||||
|
fina_err = hk_data[86]
|
||||||
|
fina_raw_mag_x = struct.unpack('!f', hk_data[87:91])[0]
|
||||||
|
fina_raw_mag_y = struct.unpack('!f', hk_data[91:95])[0]
|
||||||
|
fina_raw_mag_z = struct.unpack('!f', hk_data[95:99])[0]
|
||||||
|
fina_cal_mag_x = struct.unpack('!f', hk_data[99:103])[0]
|
||||||
|
fina_cal_mag_y = struct.unpack('!f', hk_data[103:107])[0]
|
||||||
|
fina_cal_mag_z = struct.unpack('!f', hk_data[107:111])[0]
|
||||||
|
fina_coil_x_current = struct.unpack('!f', hk_data[111:115])[0]
|
||||||
|
fina_coil_y_current = struct.unpack('!f', hk_data[115:119])[0]
|
||||||
|
fina_coil_z_current = struct.unpack('!f', hk_data[119:123])[0]
|
||||||
|
fina_coil_x_temperature = struct.unpack('!H', hk_data[123:125])[0]
|
||||||
|
fina_coil_y_temperature = struct.unpack('!H', hk_data[125:127])[0]
|
||||||
|
fina_coil_z_temperature = struct.unpack('!H', hk_data[127:129])[0]
|
||||||
|
|
||||||
|
hk_content = [init_err, init_raw_mag_x, init_raw_mag_y, init_raw_mag_z, init_cal_mag_x, init_cal_mag_y,
|
||||||
|
init_cal_mag_z, init_coil_x_current, init_coil_y_current, init_coil_z_current,
|
||||||
|
init_coil_x_temperature, init_coil_y_temperature, init_coil_z_temperature, err, raw_mag_x,
|
||||||
|
init_raw_mag_y, raw_mag_z, cal_mag_x, cal_mag_y, cal_mag_z, coil_x_current, coil_y_current,
|
||||||
|
coil_z_current, coil_x_temperature, coil_y_temperature, coil_z_temperature, fina_err, fina_raw_mag_x,
|
||||||
|
fina_raw_mag_y, fina_raw_mag_z, fina_cal_mag_x, fina_cal_mag_y, fina_cal_mag_z, fina_coil_x_current,
|
||||||
|
fina_coil_y_current, fina_coil_z_current, fina_coil_x_temperature, fina_coil_y_temperature,
|
||||||
|
fina_coil_z_temperature]
|
||||||
|
|
||||||
|
return hk_header, hk_content, validity_buffer, len(hk_header)
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
|
import struct
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
from config.object_ids import ObjIdIds
|
from config.object_ids import *
|
||||||
|
from pus_tc.imtq import ImtqActionIds
|
||||||
|
from pus_tc.ploc import PlocReplyIds
|
||||||
|
|
||||||
|
|
||||||
def user_analyze_service_8_data(
|
def user_analyze_service_8_data(
|
||||||
object_id: int, action_id: int, custom_data: bytearray) -> Tuple[list, list]:
|
object_id: bytes, action_id: int, custom_data: bytearray) -> Tuple[list, list]:
|
||||||
"""
|
"""
|
||||||
This function is called by the TMTC core if a Service 8 data reply (subservice 130)
|
This function is called by the TMTC core if a Service 8 data reply (subservice 130)
|
||||||
is received. The user can return a tuple of two lists, where the first list
|
is received. The user can return a tuple of two lists, where the first list
|
||||||
@ -15,7 +18,7 @@ def user_analyze_service_8_data(
|
|||||||
@param custom_data:
|
@param custom_data:
|
||||||
@return:
|
@return:
|
||||||
"""
|
"""
|
||||||
if object_id == ObjIdIds.PDU2_HANDLER_ID.value:
|
if object_id == PDU_2_HANDLER_ID:
|
||||||
header_list = ['PDU2 Service 8 Reply']
|
header_list = ['PDU2 Service 8 Reply']
|
||||||
|
|
||||||
data_string = str()
|
data_string = str()
|
||||||
@ -25,7 +28,31 @@ def user_analyze_service_8_data(
|
|||||||
data_string = data_string.rstrip(',')
|
data_string = data_string.rstrip(',')
|
||||||
data_string = data_string.rstrip()
|
data_string = data_string.rstrip()
|
||||||
content_list = [data_string]
|
content_list = [data_string]
|
||||||
|
elif object_id == IMTQ_HANDLER_ID:
|
||||||
|
return handle_imtq_replies(action_id, custom_data)
|
||||||
|
elif object_id == PLOC_ID:
|
||||||
|
return handle_ploc_replies(action_id, custom_data)
|
||||||
else:
|
else:
|
||||||
header_list = []
|
header_list = []
|
||||||
content_list = []
|
content_list = []
|
||||||
return header_list, content_list
|
return header_list, content_list
|
||||||
|
|
||||||
|
|
||||||
|
def handle_imtq_replies(action_id: int, custom_data: bytearray) -> Tuple[list, list]:
|
||||||
|
header_list = []
|
||||||
|
content_list = []
|
||||||
|
if action_id == struct.unpack('!I', ImtqActionIds.get_commanded_dipole)[0]:
|
||||||
|
header_list = ['Commanded X-Dipole', 'Commanded Y-Dipole', 'Commanded Z-Dipole']
|
||||||
|
x_dipole = struct.unpack('!H', custom_data[:2])
|
||||||
|
y_dipole = struct.unpack('!H', custom_data[2:4])
|
||||||
|
z_dipole = struct.unpack('!H', custom_data[4:6])
|
||||||
|
content_list = [x_dipole[0], y_dipole[0], z_dipole[0]]
|
||||||
|
|
||||||
|
|
||||||
|
def handle_ploc_replies(action_id: int, custom_data: bytearray) -> Tuple[list, list]:
|
||||||
|
header_list = []
|
||||||
|
content_list = []
|
||||||
|
if action_id == PlocReplyIds.tm_mem_read_report:
|
||||||
|
header_list = ['PLOC Memory Address', 'PLOC Mem Len', 'PLOC Read Memory Data']
|
||||||
|
content_list = [custom_data[:4], custom_data[4:6], custom_data[6:10]]
|
||||||
|
return header_list, content_list
|
||||||
|
@ -1,81 +0,0 @@
|
|||||||
"""
|
|
||||||
@brief This file transfers control of housekeeping handling (PUS service 3) to the
|
|
||||||
developer
|
|
||||||
@details Template configuration file. Copy this folder to the TMTC commander root and adapt
|
|
||||||
it to your needs.
|
|
||||||
"""
|
|
||||||
import struct
|
|
||||||
from typing import Tuple
|
|
||||||
|
|
||||||
from config.tmtcc_object_ids import ObjectIds
|
|
||||||
from tmtc_core.pus_tm.tmtcc_tm_service3_base import Service3Base
|
|
||||||
from tmtc_core.utility.tmtcc_logger import get_logger
|
|
||||||
from config.tmtcc_object_ids import ObjectIds
|
|
||||||
from pus_tc.tmtcc_tc_syrlinks_hk_handler import SetIds
|
|
||||||
|
|
||||||
LOGGER = get_logger()
|
|
||||||
|
|
||||||
|
|
||||||
def handle_user_hk_packet(object_id: ObjectIds, set_id: int, hk_data: bytearray,
|
|
||||||
service3_packet: Service3Base) -> Tuple[list, list, bytearray, int]:
|
|
||||||
"""
|
|
||||||
This function is called when a Service 3 Housekeeping packet is received.
|
|
||||||
|
|
||||||
Please note that the object IDs should be compared by value because direct comparison of
|
|
||||||
enumerations does not work in Python. For example use:
|
|
||||||
|
|
||||||
if object_id.value == ObjectIds.TEST_OBJECT.value
|
|
||||||
|
|
||||||
to test equality based on the object ID list.
|
|
||||||
|
|
||||||
@param object_id:
|
|
||||||
@param set_id:
|
|
||||||
@param hk_data:
|
|
||||||
@param service3_packet:
|
|
||||||
@return: Expects a tuple, consisting of two lists, a bytearray and an integer
|
|
||||||
The first list contains the header columns, the second list the list with
|
|
||||||
the corresponding values. The bytearray is the validity buffer, which is usually appended
|
|
||||||
at the end of the housekeeping packet. The last value is the number of parameters.
|
|
||||||
"""
|
|
||||||
if object_id == ObjectIds.SYRLINKS_HK_HANDLER:
|
|
||||||
if set_id == SetIds.RX_REGISTERS_DATASET:
|
|
||||||
return handle_syrlinks_rx_registers_dataset(hk_data)
|
|
||||||
elif set_id == SetIds.TX_REGISTERS_DATASET:
|
|
||||||
return handle_syrlinks_tx_registers_dataset(hk_data)
|
|
||||||
else:
|
|
||||||
LOGGER.info("Serive 3 TM: Syrlinks handler reply with unknown set id")
|
|
||||||
return [], [], bytearray(), 0
|
|
||||||
else:
|
|
||||||
LOGGER.info("Service 3 TM: Parsing for this SID has not been implemented.")
|
|
||||||
return [], [], bytearray(), 0
|
|
||||||
|
|
||||||
|
|
||||||
def handle_syrlinks_rx_registers_dataset(hk_data: bytearray) -> Tuple[list, list, bytearray, int]:
|
|
||||||
hk_header = []
|
|
||||||
hk_content = []
|
|
||||||
validity_buffer = bytearray()
|
|
||||||
hk_header = ["RX Status", "RX Sensitivity", "RX Frequency Shift", "RX IQ Power", "RX AGC Value", "RX Demod Eb",
|
|
||||||
"RX Demod N0", "RX Datarate"]
|
|
||||||
rx_status = hk_data[0]
|
|
||||||
rx_sensitivity = struct.unpack('!I', hk_data[1:5])
|
|
||||||
rx_frequency_shift = struct.unpack('!I', hk_data[5:9])
|
|
||||||
rx_iq_power = struct.unpack('!H', hk_data[9:11])
|
|
||||||
rx_agc_value = struct.unpack('!H', hk_data[11:13])
|
|
||||||
rx_demod_eb = struct.unpack('!I', hk_data[13:17])
|
|
||||||
rx_demod_n0 = struct.unpack('!I', hk_data[17:21])
|
|
||||||
rx_data_rate = hk_data[21]
|
|
||||||
hk_content = [rx_status, rx_sensitivity, rx_frequency_shift, rx_iq_power, rx_agc_value, rx_demod_eb, rx_demod_n0,
|
|
||||||
rx_data_rate]
|
|
||||||
return hk_header, hk_content, validity_buffer, 8
|
|
||||||
|
|
||||||
|
|
||||||
def handle_syrlinks_tx_registers_dataset(hk_data: bytearray) -> Tuple[list, list, bytearray, int]:
|
|
||||||
hk_header = []
|
|
||||||
hk_content = []
|
|
||||||
validity_buffer = bytearray()
|
|
||||||
hk_header = ["TX Status", "TX Waveform", "TX AGC value"]
|
|
||||||
tx_status = hk_data[0]
|
|
||||||
tx_waveform = hk_data[1]
|
|
||||||
tx_agc_value = struct.unpack('!H', hk_data[2:4])
|
|
||||||
hk_content = [tx_status, tx_waveform, tx_agc_value]
|
|
||||||
return hk_header, hk_content, validity_buffer, 3
|
|
@ -26,13 +26,29 @@ limitations under the License.
|
|||||||
|
|
||||||
@author R. Mueller
|
@author R. Mueller
|
||||||
"""
|
"""
|
||||||
from tmtccmd.runner import initialize_tmtc_commander, run_tmtc_commander
|
import sys
|
||||||
|
|
||||||
from config.hook_implementations import EiveHookObject
|
from config.hook_implementations import EiveHookObject
|
||||||
|
from config.definitions import PUS_APID
|
||||||
|
from pus_tm.factory_hook import ccsds_tm_handler
|
||||||
|
try:
|
||||||
|
from tmtccmd.runner import initialize_tmtc_commander, run_tmtc_commander, add_ccsds_handler
|
||||||
|
from tmtccmd.ccsds.handler import CcsdsTmHandler
|
||||||
|
except ImportError as error:
|
||||||
|
run_tmtc_commander = None
|
||||||
|
initialize_tmtc_commander = None
|
||||||
|
print(error)
|
||||||
|
print("Python tmtccmd submodule could not be imported")
|
||||||
|
print("Install with \"cd tmtccmd && python3 -m pip install -e .\" for interactive installation")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
hook_obj = EiveHookObject()
|
hook_obj = EiveHookObject()
|
||||||
initialize_tmtc_commander(hook_object=hook_obj)
|
initialize_tmtc_commander(hook_object=hook_obj)
|
||||||
|
ccsds_handler = CcsdsTmHandler()
|
||||||
|
ccsds_handler.add_tm_handler(apid=PUS_APID, pus_tm_handler=ccsds_tm_handler, max_queue_len=50)
|
||||||
|
add_ccsds_handler(ccsds_handler)
|
||||||
run_tmtc_commander(False)
|
run_tmtc_commander(False)
|
||||||
|
|
||||||
|
|
||||||
|
2
tmtccmd
2
tmtccmd
Submodule tmtccmd updated: 1773f62856...b4358a15fd
@ -5,6 +5,7 @@ def parse_input_arguments_user(print_known_args: bool = False, print_unknown_arg
|
|||||||
This function by default will build the default argument parser. A custom CLI parser can be
|
This function by default will build the default argument parser. A custom CLI parser can be
|
||||||
built in this function if required.
|
built in this function if required.
|
||||||
"""
|
"""
|
||||||
from tmtccmd.defaults.args_parser import parse_default_input_arguments
|
from tmtccmd.config.args import parse_default_input_arguments
|
||||||
parse_default_input_arguments(print_known_args=print_known_args,
|
parse_default_input_arguments(
|
||||||
print_unknown_args=print_unknown_args)
|
print_known_args=print_known_args, print_unknown_args=print_unknown_args
|
||||||
|
)
|
||||||
|
Reference in New Issue
Block a user