From b7989acc1be24d9ae63dad2ce1bf6069017bf80a Mon Sep 17 00:00:00 2001 From: Andy Hinkel Date: Thu, 17 Jul 2025 18:11:16 +0200 Subject: [PATCH 1/3] configured and set up repo (Dependencies updated) and README.md added to send a ping --- .gitignore | 286 +++++++++++++++++------------------ .snapshots/config.json | 300 ++++++++++++++++++------------------- .snapshots/readme.md | 22 +-- .snapshots/sponsors.md | 88 +++++------ README.md | 48 ++++++ example_execution_ping.png | Bin 0 -> 165743 bytes main.py | 206 ++++++++++++------------- pyproject.toml | 55 +++---- pytmtc/acs/__init__.py | 22 +-- pytmtc/acs/mgms.py | 90 +++++------ pytmtc/common.py | 110 +++++++------- pytmtc/config.py | 94 ++++++------ pytmtc/hk.py | 84 +++++------ pytmtc/hk_common.py | 32 ++-- pytmtc/mode.py | 62 ++++---- pytmtc/pus_tc.py | 297 ++++++++++++++++++------------------ pytmtc/pus_tm.py | 186 +++++++++++------------ requirements.txt | 4 +- tests/test_tc_mods.py | 96 ++++++------ 19 files changed, 1072 insertions(+), 1010 deletions(-) create mode 100644 README.md create mode 100644 example_execution_ping.png diff --git a/.gitignore b/.gitignore index 008bdd0..9b48007 100644 --- a/.gitignore +++ b/.gitignore @@ -1,143 +1,143 @@ -/tmtc_conf.json -__pycache__ - -/venv -/log -/.idea/* -!/.idea/runConfigurations - -/seqcnt.txt -/.tmtc-history.txt - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# PyCharm -.idea +/tmtc_conf.json +__pycache__ + +/venv +/log +/.idea/* +!/.idea/runConfigurations + +/seqcnt.txt +/.tmtc-history.txt + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# PyCharm +.idea diff --git a/.snapshots/config.json b/.snapshots/config.json index dfadca2..0919b15 100644 --- a/.snapshots/config.json +++ b/.snapshots/config.json @@ -1,151 +1,151 @@ -{ - "excluded_patterns": [ - ".git", - ".gitignore", - "gradle", - "gradlew", - "gradlew.*", - "node_modules", - ".snapshots", - ".idea", - ".vscode", - "*.log", - "*.tmp", - "target", - "dist", - "build", - ".DS_Store", - "*.bak", - "*.swp", - "*.swo", - "*.lock", - "*.iml", - "coverage", - "*.min.js", - "*.min.css", - "__pycache__", - ".marketing", - ".env", - ".env.*", - "*.jpg", - "*.jpeg", - "*.png", - "*.gif", - "*.bmp", - "*.tiff", - "*.ico", - "*.svg", - "*.webp", - "*.psd", - "*.ai", - "*.eps", - "*.indd", - "*.raw", - "*.cr2", - "*.nef", - "*.mp4", - "*.mov", - "*.avi", - "*.wmv", - "*.flv", - "*.mkv", - "*.webm", - "*.m4v", - "*.wfp", - "*.prproj", - "*.aep", - "*.psb", - "*.xcf", - "*.sketch", - "*.fig", - "*.xd", - "*.db", - "*.sqlite", - "*.sqlite3", - "*.mdb", - "*.accdb", - "*.frm", - "*.myd", - "*.myi", - "*.ibd", - "*.dbf", - "*.rdb", - "*.aof", - "*.pdb", - "*.sdb", - "*.s3db", - "*.ddb", - "*.db-shm", - "*.db-wal", - "*.sqlitedb", - "*.sql.gz", - "*.bak.sql", - "dump.sql", - "dump.rdb", - "*.vsix", - "*.jar", - "*.war", - "*.ear", - "*.zip", - "*.tar", - "*.tar.gz", - "*.tgz", - "*.rar", - "*.7z", - "*.exe", - "*.dll", - "*.so", - "*.dylib", - "*.app", - "*.dmg", - "*.iso", - "*.msi", - "*.deb", - "*.rpm", - "*.apk", - "*.aab", - "*.ipa", - "*.pkg", - "*.nupkg", - "*.snap", - "*.whl", - "*.gem", - "*.pyc", - "*.pyo", - "*.pyd", - "*.class", - "*.o", - "*.obj", - "*.lib", - "*.a", - "*.map", - ".npmrc" - ], - "default": { - "default_prompt": "Enter your prompt here", - "default_include_all_files": false, - "default_include_entire_project_structure": true - }, - "included_patterns": [ - "build.gradle", - "settings.gradle", - "gradle.properties", - "pom.xml", - "Makefile", - "CMakeLists.txt", - "package.json", - "requirements.txt", - "Pipfile", - "Gemfile", - "composer.json", - ".editorconfig", - ".eslintrc.json", - ".eslintrc.js", - ".prettierrc", - ".babelrc", - ".dockerignore", - ".gitattributes", - ".stylelintrc", - ".npmrc" - ] +{ + "excluded_patterns": [ + ".git", + ".gitignore", + "gradle", + "gradlew", + "gradlew.*", + "node_modules", + ".snapshots", + ".idea", + ".vscode", + "*.log", + "*.tmp", + "target", + "dist", + "build", + ".DS_Store", + "*.bak", + "*.swp", + "*.swo", + "*.lock", + "*.iml", + "coverage", + "*.min.js", + "*.min.css", + "__pycache__", + ".marketing", + ".env", + ".env.*", + "*.jpg", + "*.jpeg", + "*.png", + "*.gif", + "*.bmp", + "*.tiff", + "*.ico", + "*.svg", + "*.webp", + "*.psd", + "*.ai", + "*.eps", + "*.indd", + "*.raw", + "*.cr2", + "*.nef", + "*.mp4", + "*.mov", + "*.avi", + "*.wmv", + "*.flv", + "*.mkv", + "*.webm", + "*.m4v", + "*.wfp", + "*.prproj", + "*.aep", + "*.psb", + "*.xcf", + "*.sketch", + "*.fig", + "*.xd", + "*.db", + "*.sqlite", + "*.sqlite3", + "*.mdb", + "*.accdb", + "*.frm", + "*.myd", + "*.myi", + "*.ibd", + "*.dbf", + "*.rdb", + "*.aof", + "*.pdb", + "*.sdb", + "*.s3db", + "*.ddb", + "*.db-shm", + "*.db-wal", + "*.sqlitedb", + "*.sql.gz", + "*.bak.sql", + "dump.sql", + "dump.rdb", + "*.vsix", + "*.jar", + "*.war", + "*.ear", + "*.zip", + "*.tar", + "*.tar.gz", + "*.tgz", + "*.rar", + "*.7z", + "*.exe", + "*.dll", + "*.so", + "*.dylib", + "*.app", + "*.dmg", + "*.iso", + "*.msi", + "*.deb", + "*.rpm", + "*.apk", + "*.aab", + "*.ipa", + "*.pkg", + "*.nupkg", + "*.snap", + "*.whl", + "*.gem", + "*.pyc", + "*.pyo", + "*.pyd", + "*.class", + "*.o", + "*.obj", + "*.lib", + "*.a", + "*.map", + ".npmrc" + ], + "default": { + "default_prompt": "Enter your prompt here", + "default_include_all_files": false, + "default_include_entire_project_structure": true + }, + "included_patterns": [ + "build.gradle", + "settings.gradle", + "gradle.properties", + "pom.xml", + "Makefile", + "CMakeLists.txt", + "package.json", + "requirements.txt", + "Pipfile", + "Gemfile", + "composer.json", + ".editorconfig", + ".eslintrc.json", + ".eslintrc.js", + ".prettierrc", + ".babelrc", + ".dockerignore", + ".gitattributes", + ".stylelintrc", + ".npmrc" + ] } \ No newline at end of file diff --git a/.snapshots/readme.md b/.snapshots/readme.md index 21fa917..aa9c5fd 100644 --- a/.snapshots/readme.md +++ b/.snapshots/readme.md @@ -1,11 +1,11 @@ -# Snapshots Directory - -This directory contains snapshots of your code for AI interactions. Each snapshot is a markdown file that includes relevant code context and project structure information. - -## What's included in snapshots? -- Selected code files and their contents -- Project structure (if enabled) -- Your prompt/question for the AI - -## Configuration -You can customize snapshot behavior in `config.json`. +# Snapshots Directory + +This directory contains snapshots of your code for AI interactions. Each snapshot is a markdown file that includes relevant code context and project structure information. + +## What's included in snapshots? +- Selected code files and their contents +- Project structure (if enabled) +- Your prompt/question for the AI + +## Configuration +You can customize snapshot behavior in `config.json`. diff --git a/.snapshots/sponsors.md b/.snapshots/sponsors.md index 2df337f..a0bdb42 100644 --- a/.snapshots/sponsors.md +++ b/.snapshots/sponsors.md @@ -1,44 +1,44 @@ -# Thank you for using Snapshots for AI - -Thanks for using Snapshots for AI. We hope this tool has helped you solve a problem or two. - -If you would like to support our work, please help us by considering the following offers and requests: - -## Ways to Support - -### Join the GBTI Network!!! 🙏🙏🙏 -The GBTI Network is a community of developers who are passionate about open source and community-driven development. Members enjoy access to exclussive tools, resources, a private MineCraft server, a listing in our members directory, co-op opportunities and more. - -- Support our work by becoming a [GBTI Network member](https://gbti.network/membership/). - -### Try out BugHerd 🐛 -BugHerd is a visual feedback and bug-tracking tool designed to streamline website development by enabling users to pin feedback directly onto web pages. This approach facilitates clear communication among clients, designers, developers, and project managers. - -- Start your free trial with [BugHerd](https://partners.bugherd.com/55z6c8az8rvr) today. - -### Hire Developers from Codeable 👥 -Codeable connects you with top-tier professionals skilled in frameworks and technologies such as Laravel, React, Django, Node, Vue.js, Angular, Ruby on Rails, and Node.js. Don't let the WordPress focus discourage you. Codeable experts do it all. - -- Visit [Codeable](https://www.codeable.io/developers/?ref=z8h3e) to hire your next team member. - -### Lead positive reviews on our marketplace listing ⭐⭐⭐⭐⭐ -- Rate us on [VSCode marketplace](https://marketplace.visualstudio.com/items?itemName=GBTI.snapshots-for-ai) -- Review us on [Cursor marketplace](https://open-vsx.org/extension/GBTI/snapshots-for-ai) - -### Star Our GitHub Repository ⭐ -- Star and watch our [repository](https://github.com/gbti-network/vscode-snapshots-for-ai) - -### 📡 Stay Connected -Follow us on your favorite platforms for updates, news, and community discussions: -- **[Twitter/X](https://twitter.com/gbti_network)** -- **[GitHub](https://github.com/gbti-network)** -- **[YouTube](https://www.youtube.com/channel/UCh4FjB6r4oWQW-QFiwqv-UA)** -- **[Dev.to](https://dev.to/gbti)** -- **[Daily.dev](https://dly.to/zfCriM6JfRF)** -- **[Hashnode](https://gbti.hashnode.dev/)** -- **[Discord Community](https://gbti.network)** -- **[Reddit Community](https://www.reddit.com/r/GBTI_network)** - ---- - -Thank you for supporting open source software! 🙏 +# Thank you for using Snapshots for AI + +Thanks for using Snapshots for AI. We hope this tool has helped you solve a problem or two. + +If you would like to support our work, please help us by considering the following offers and requests: + +## Ways to Support + +### Join the GBTI Network!!! 🙏🙏🙏 +The GBTI Network is a community of developers who are passionate about open source and community-driven development. Members enjoy access to exclussive tools, resources, a private MineCraft server, a listing in our members directory, co-op opportunities and more. + +- Support our work by becoming a [GBTI Network member](https://gbti.network/membership/). + +### Try out BugHerd 🐛 +BugHerd is a visual feedback and bug-tracking tool designed to streamline website development by enabling users to pin feedback directly onto web pages. This approach facilitates clear communication among clients, designers, developers, and project managers. + +- Start your free trial with [BugHerd](https://partners.bugherd.com/55z6c8az8rvr) today. + +### Hire Developers from Codeable 👥 +Codeable connects you with top-tier professionals skilled in frameworks and technologies such as Laravel, React, Django, Node, Vue.js, Angular, Ruby on Rails, and Node.js. Don't let the WordPress focus discourage you. Codeable experts do it all. + +- Visit [Codeable](https://www.codeable.io/developers/?ref=z8h3e) to hire your next team member. + +### Lead positive reviews on our marketplace listing ⭐⭐⭐⭐⭐ +- Rate us on [VSCode marketplace](https://marketplace.visualstudio.com/items?itemName=GBTI.snapshots-for-ai) +- Review us on [Cursor marketplace](https://open-vsx.org/extension/GBTI/snapshots-for-ai) + +### Star Our GitHub Repository ⭐ +- Star and watch our [repository](https://github.com/gbti-network/vscode-snapshots-for-ai) + +### 📡 Stay Connected +Follow us on your favorite platforms for updates, news, and community discussions: +- **[Twitter/X](https://twitter.com/gbti_network)** +- **[GitHub](https://github.com/gbti-network)** +- **[YouTube](https://www.youtube.com/channel/UCh4FjB6r4oWQW-QFiwqv-UA)** +- **[Dev.to](https://dev.to/gbti)** +- **[Daily.dev](https://dly.to/zfCriM6JfRF)** +- **[Hashnode](https://gbti.hashnode.dev/)** +- **[Discord Community](https://gbti.network)** +- **[Reddit Community](https://www.reddit.com/r/GBTI_network)** + +--- + +Thank you for supporting open source software! 🙏 diff --git a/README.md b/README.md new file mode 100644 index 0000000..84613d1 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# TMTC Client +to interface the Host OBSW based on FSFW. + +commands assuming the use of linux: +## Creating a virtual environment + + > :warning: Note that you may have to install python-venv before you can create a virtual environment. For a debian based system that would be `sudo apt install python3-venv` + + > Note that when using the GUI in a virtualenv, you need to initialize the venv with system packages: + ```sh + # Creates the virtual environment venv in the folder venv + # Add the --system-site-packages flag only if you plan on using the GUI + python3 -m venv venv --system-site-packages + # Activate venv + source ./venv/bin/activate + ``` + +2. Install all dependencies + + +## install dependencies +### a: (recommended) installing them as classic python packets +```sh +pip install -r requirements.txt +``` +### b: (not recommended) installing them in editable mode instead +recommended if you actively develop the code in that repo. +```sh +pip install -e . +``` + +# Execute +To run the `tmtc` Command Line Interface (CLI) +```sh +(venv) python main.py +``` +In the program ++ 1 ++ select `localhost`, `port` of your choice e.g. `123` ++ `:p` to print the command tree ++ to execute commands from the `tmtc CLI` you look into the device tree and execute the respective command split by slashes. +```sh +test/ping # example to execute the ping command (PUS 17,1) +``` +see below a screenshot to visualize the steps above. +![sending a PING](example_execution_ping.png) + +In order for all of this to work, you must have your hosted OBSW running in another terminal listening to the correct port! \ No newline at end of file diff --git a/example_execution_ping.png b/example_execution_ping.png new file mode 100644 index 0000000000000000000000000000000000000000..99aae723c72890408122a1b5b712697e1019db34 GIT binary patch literal 165743 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 aRuWd?Y~56lcvA`kSq7v6gK=4vz7^eLYIAX=a%2 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 19da674..60575a9 100755 --- a/main.py +++ b/main.py @@ -1,103 +1,103 @@ -#!/usr/bin/env python3 -"""Example client for the sat-rs example application""" - -import logging -import sys -import time - -import tmtccmd -from spacepackets.ecss import PusVerificator - -from tmtccmd import ProcedureParamsWrapper -from tmtccmd.core.base import BackendRequest -from tmtccmd.pus import VerificationWrapper -from tmtccmd.tmtc import CcsdsTmHandler -from tmtccmd.config import ( - default_json_path, - SetupParams, - params_to_procedure_conversion, -) -from tmtccmd.config import PreArgsParsingWrapper, SetupWrapper -from tmtccmd.logging import add_colorlog_console_logger -from tmtccmd.logging.pus import ( - RegularTmtcLogWrapper, - RawTmtcTimedLogWrapper, - TimedLogWhen, -) -from spacepackets.seqcount import PusFileSeqCountProvider - - -from pytmtc.config import SatrsConfigHook -from pytmtc.pus_tc import TcHandler -from pytmtc.pus_tm import PusHandler - -_LOGGER = logging.getLogger() - - -def main(): - add_colorlog_console_logger(_LOGGER) - tmtccmd.init_printout(False) - hook_obj = SatrsConfigHook(json_cfg_path=default_json_path()) - parser_wrapper = PreArgsParsingWrapper() - parser_wrapper.create_default_parent_parser() - parser_wrapper.create_default_parser() - parser_wrapper.add_def_proc_args() - params = SetupParams() - post_args_wrapper = parser_wrapper.parse(hook_obj, params) - proc_wrapper = ProcedureParamsWrapper() - if post_args_wrapper.use_gui: - post_args_wrapper.set_params_without_prompts(proc_wrapper) - else: - post_args_wrapper.set_params_with_prompts(proc_wrapper) - setup_args = SetupWrapper( - hook_obj=hook_obj, setup_params=params, proc_param_wrapper=proc_wrapper - ) - # Create console logger helper and file loggers - tmtc_logger = RegularTmtcLogWrapper() - file_logger = tmtc_logger.logger - raw_logger = RawTmtcTimedLogWrapper(when=TimedLogWhen.PER_HOUR, interval=1) - verificator = PusVerificator() - verification_wrapper = VerificationWrapper(verificator, _LOGGER, file_logger) - # Create primary TM handler and add it to the CCSDS Packet Handler - tm_handler = PusHandler(file_logger, verification_wrapper, raw_logger) - ccsds_handler = CcsdsTmHandler(generic_handler=tm_handler) - # TODO: We could add the CFDP handler for the CFDP APID at a later stage. - # ccsds_handler.add_apid_handler(tm_handler) - - # Create TC handler - seq_count_provider = PusFileSeqCountProvider() - tc_handler = TcHandler(seq_count_provider, verification_wrapper) - tmtccmd.setup(setup_args=setup_args) - init_proc = params_to_procedure_conversion(setup_args.proc_param_wrapper) - tmtc_backend = tmtccmd.create_default_tmtc_backend( - setup_wrapper=setup_args, - tm_handler=ccsds_handler, - tc_handler=tc_handler, - init_procedure=init_proc, - ) - tmtccmd.start(tmtc_backend=tmtc_backend, hook_obj=hook_obj) - try: - while True: - state = tmtc_backend.periodic_op(None) - if state.request == BackendRequest.TERMINATION_NO_ERROR: - tmtc_backend.close_com_if() - sys.exit(0) - elif state.request == BackendRequest.DELAY_IDLE: - _LOGGER.info("TMTC Client in IDLE mode") - time.sleep(3.0) - elif state.request == BackendRequest.DELAY_LISTENER: - time.sleep(0.8) - elif state.request == BackendRequest.DELAY_CUSTOM: - if state.next_delay.total_seconds() <= 0.4: - time.sleep(state.next_delay.total_seconds()) - else: - time.sleep(0.4) - elif state.request == BackendRequest.CALL_NEXT: - pass - except KeyboardInterrupt: - tmtc_backend.close_com_if() - sys.exit(0) - - -if __name__ == "__main__": - main() +#!/usr/bin/env python3 +"""Example client for the sat-rs example application""" + +import logging +import sys +import time + +import tmtccmd +from spacepackets.ecss import PusVerificator + +from tmtccmd import ProcedureParamsWrapper +from tmtccmd.core.base import BackendRequest +from tmtccmd.pus import VerificationWrapper +from tmtccmd.tmtc import CcsdsTmHandler +from tmtccmd.config import ( + default_json_path, + SetupParams, + params_to_procedure_conversion, +) +from tmtccmd.config import PreArgsParsingWrapper, SetupWrapper +from tmtccmd.logging import add_colorlog_console_logger +from tmtccmd.logging.pus import ( + RegularTmtcLogWrapper, + RawTmtcTimedLogWrapper, + TimedLogWhen, +) +from spacepackets.seqcount import PusFileSeqCountProvider + + +from pytmtc.config import SatrsConfigHook +from pytmtc.pus_tc import TcHandler +from pytmtc.pus_tm import PusHandler + +_LOGGER = logging.getLogger() + + +def main(): + add_colorlog_console_logger(_LOGGER) + tmtccmd.init_printout(False) + hook_obj = SatrsConfigHook(json_cfg_path=default_json_path()) # this is our entry point + parser_wrapper = PreArgsParsingWrapper() + parser_wrapper.create_default_parent_parser() + parser_wrapper.create_default_parser() + parser_wrapper.add_def_proc_args() + params = SetupParams() + post_args_wrapper = parser_wrapper.parse(hook_obj, params) + proc_wrapper = ProcedureParamsWrapper() + if post_args_wrapper.use_gui: + post_args_wrapper.set_params_without_prompts(proc_wrapper) + else: + post_args_wrapper.set_params_with_prompts(proc_wrapper) + setup_args = SetupWrapper( + hook_obj=hook_obj, setup_params=params, proc_param_wrapper=proc_wrapper + ) + # Create console logger helper and file loggers + tmtc_logger = RegularTmtcLogWrapper() + file_logger = tmtc_logger.logger + raw_logger = RawTmtcTimedLogWrapper(when=TimedLogWhen.PER_HOUR, interval=1) + verificator = PusVerificator() + verification_wrapper = VerificationWrapper(verificator, _LOGGER, file_logger) + # Create primary TM handler and add it to the CCSDS Packet Handler + tm_handler = PusHandler(file_logger, verification_wrapper, raw_logger) + ccsds_handler = CcsdsTmHandler(generic_handler=tm_handler) + # TODO: We could add the CFDP handler for the CFDP APID at a later stage. + # ccsds_handler.add_apid_handler(tm_handler) + + # Create TC handler + seq_count_provider = PusFileSeqCountProvider() + tc_handler = TcHandler(seq_count_provider, verification_wrapper) + tmtccmd.setup(setup_args=setup_args) + init_proc = params_to_procedure_conversion(setup_args.proc_param_wrapper) + tmtc_backend = tmtccmd.create_default_tmtc_backend( + setup_wrapper=setup_args, + tm_handler=ccsds_handler, + tc_handler=tc_handler, + init_procedure=init_proc, + ) + tmtccmd.start(tmtc_backend=tmtc_backend, hook_obj=hook_obj) + try: + while True: + state = tmtc_backend.periodic_op(None) + if state.request == BackendRequest.TERMINATION_NO_ERROR: + tmtc_backend.close_com_if() + sys.exit(0) + elif state.request == BackendRequest.DELAY_IDLE: + _LOGGER.info("TMTC Client in IDLE mode") + time.sleep(3.0) + elif state.request == BackendRequest.DELAY_LISTENER: + time.sleep(0.8) + elif state.request == BackendRequest.DELAY_CUSTOM: + if state.next_delay.total_seconds() <= 0.4: + time.sleep(state.next_delay.total_seconds()) + else: + time.sleep(0.4) + elif state.request == BackendRequest.CALL_NEXT: + pass + except KeyboardInterrupt: + tmtc_backend.close_com_if() + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml index bcbb0ab..460c22e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,27 +1,28 @@ -[build-system] -requires = ["setuptools>=61.0"] -build-backend = "setuptools.build_meta" - -[project] -name = "pytmtc" -description = "Python TMTC client for OPS-SAT" -readme = "README.md" -version = "0.1.0" -requires-python = ">=3.8" -authors = [ - {name = "Robin Mueller", email = "robin.mueller.m@gmail.com"}, -] -dependencies = [ - "tmtccmd~=8.1", - "pydantic~=2.7" -] - -[tool.setuptools.packages] -find = {} - -[tool.ruff] -extend-exclude = ["archive"] -[tool.ruff.lint] -ignore = ["E501"] -[tool.ruff.lint.extend-per-file-ignores] -"__init__.py" = ["F401"] +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "pytmtc" +description = "Python TMTC client for Host Build" +readme = "README.md" +version = "0.1.0" +requires-python = ">=3.8" +authors = [ + {name = "Robin Mueller", email = "robin.mueller.m@gmail.com"}, +] +dependencies = [ + "tmtccmd~=8.2", + "spacepackets~=0.28.0", + "pydantic~=2.7" +] + +[tool.setuptools.packages] +find = {} + +[tool.ruff] +extend-exclude = ["archive"] +[tool.ruff.lint] +ignore = ["E501"] +[tool.ruff.lint.extend-per-file-ignores] +"__init__.py" = ["F401"] diff --git a/pytmtc/acs/__init__.py b/pytmtc/acs/__init__.py index 834654d..9bfd44f 100644 --- a/pytmtc/acs/__init__.py +++ b/pytmtc/acs/__init__.py @@ -1,11 +1,11 @@ -from tmtccmd.config import CmdTreeNode - - -def create_acs_node(mode_node: CmdTreeNode, hk_node: CmdTreeNode) -> CmdTreeNode: - acs_node = CmdTreeNode("acs", "ACS Subsystem Node") - mgm_node = CmdTreeNode("mgms", "MGM devices node") - mgm_node.add_child(mode_node) - mgm_node.add_child(hk_node) - - acs_node.add_child(mgm_node) - return acs_node +from tmtccmd.config import CmdTreeNode + + +def create_acs_node(mode_node: CmdTreeNode, hk_node: CmdTreeNode) -> CmdTreeNode: + acs_node = CmdTreeNode("acs", "ACS Subsystem Node") + mgm_node = CmdTreeNode("mgms", "MGM devices node") + mgm_node.add_child(mode_node) + mgm_node.add_child(hk_node) + + acs_node.add_child(mgm_node) + return acs_node diff --git a/pytmtc/acs/mgms.py b/pytmtc/acs/mgms.py index d420b3e..dd88685 100644 --- a/pytmtc/acs/mgms.py +++ b/pytmtc/acs/mgms.py @@ -1,45 +1,45 @@ -import logging -import struct -import enum -from typing import List -from spacepackets.ecss import PusTm -from tmtccmd.tmtc import DefaultPusQueueHelper - -from pytmtc.common import AcsId, Apid -from pytmtc.hk_common import create_request_one_shot_hk_cmd -from pytmtc.mode import handle_set_mode_cmd - - -_LOGGER = logging.getLogger(__name__) - - -class SetId(enum.IntEnum): - SENSOR_SET = 0 - - -def create_mgm_cmds(q: DefaultPusQueueHelper, cmd_path: List[str]): - assert len(cmd_path) >= 3 - if cmd_path[2] == "hk": - if cmd_path[3] == "one_shot_hk": - q.add_log_cmd("Sending HK one shot request") - q.add_pus_tc( - create_request_one_shot_hk_cmd(Apid.ACS, AcsId.MGM_0, SetId.SENSOR_SET) - ) - - if cmd_path[2] == "mode": - if cmd_path[3] == "set_mode": - handle_set_mode_cmd(q, "MGM 0", cmd_path[4], Apid.ACS, AcsId.MGM_0) - - -def handle_mgm_hk_report(pus_tm: PusTm, set_id: int, hk_data: bytes): - if set_id == SetId.SENSOR_SET: - if len(hk_data) != 13: - raise ValueError(f"invalid HK data length, expected 13, got {len(hk_data)}") - data_valid = hk_data[0] - mgm_x = struct.unpack("!f", hk_data[1:5])[0] - mgm_y = struct.unpack("!f", hk_data[5:9])[0] - mgm_z = struct.unpack("!f", hk_data[9:13])[0] - _LOGGER.info( - f"received MGM HK set in uT: Valid {data_valid} X {mgm_x} Y {mgm_y} Z {mgm_z}" - ) - pass +import logging +import struct +import enum +from typing import List +from spacepackets.ecss import PusTm +from tmtccmd.tmtc import DefaultPusQueueHelper + +from pytmtc.common import AcsId, Apid +from pytmtc.hk_common import create_request_one_shot_hk_cmd +from pytmtc.mode import handle_set_mode_cmd + + +_LOGGER = logging.getLogger(__name__) + + +class SetId(enum.IntEnum): + SENSOR_SET = 0 + + +def create_mgm_cmds(q: DefaultPusQueueHelper, cmd_path: List[str]): + assert len(cmd_path) >= 3 + if cmd_path[2] == "hk": + if cmd_path[3] == "one_shot_hk": + q.add_log_cmd("Sending HK one shot request") + q.add_pus_tc( + create_request_one_shot_hk_cmd(Apid.ACS, AcsId.MGM_0, SetId.SENSOR_SET) + ) + + if cmd_path[2] == "mode": + if cmd_path[3] == "set_mode": + handle_set_mode_cmd(q, "MGM 0", cmd_path[4], Apid.ACS, AcsId.MGM_0) + + +def handle_mgm_hk_report(pus_tm: PusTm, set_id: int, hk_data: bytes): + if set_id == SetId.SENSOR_SET: + if len(hk_data) != 13: + raise ValueError(f"invalid HK data length, expected 13, got {len(hk_data)}") + data_valid = hk_data[0] + mgm_x = struct.unpack("!f", hk_data[1:5])[0] + mgm_y = struct.unpack("!f", hk_data[5:9])[0] + mgm_z = struct.unpack("!f", hk_data[9:13])[0] + _LOGGER.info( + f"received MGM HK set in uT: Valid {data_valid} X {mgm_x} Y {mgm_y} Z {mgm_z}" + ) + pass diff --git a/pytmtc/common.py b/pytmtc/common.py index e5a7380..0d7e9b2 100644 --- a/pytmtc/common.py +++ b/pytmtc/common.py @@ -1,55 +1,55 @@ -from __future__ import annotations - -import dataclasses -import enum -import struct - - -class Apid(enum.IntEnum): - SCHED = 1 - GENERIC_PUS = 2 - ACS = 3 - CFDP = 4 - TMTC = 5 - - -class EventSeverity(enum.IntEnum): - INFO = 0 - LOW = 1 - MEDIUM = 2 - HIGH = 3 - - -@dataclasses.dataclass -class EventU32: - severity: EventSeverity - group_id: int - unique_id: int - - @classmethod - def unpack(cls, data: bytes) -> EventU32: - if len(data) < 4: - raise ValueError("passed data too short") - event_raw = struct.unpack("!I", data[0:4])[0] - return cls( - severity=EventSeverity((event_raw >> 30) & 0b11), - group_id=(event_raw >> 16) & 0x3FFF, - unique_id=event_raw & 0xFFFF, - ) - - -class AcsId(enum.IntEnum): - SUBSYSTEM = 1 - MGM_ASSEMBLY = 2 - MGM_0 = 3 - MGM_1 = 4 - - -class AcsHkIds(enum.IntEnum): - MGM_SET = 1 - - -def make_addressable_id(target_id: int, unique_id: int) -> bytes: - byte_string = bytearray(struct.pack("!I", target_id)) - byte_string.extend(struct.pack("!I", unique_id)) - return byte_string +from __future__ import annotations + +import dataclasses +import enum +import struct + + +class Apid(enum.IntEnum): + SCHED = 1 + GENERIC_PUS = 2 + ACS = 3 + CFDP = 4 + TMTC = 5 + + +class EventSeverity(enum.IntEnum): + INFO = 0 + LOW = 1 + MEDIUM = 2 + HIGH = 3 + + +@dataclasses.dataclass +class EventU32: + severity: EventSeverity + group_id: int + unique_id: int + + @classmethod + def unpack(cls, data: bytes) -> EventU32: + if len(data) < 4: + raise ValueError("passed data too short") + event_raw = struct.unpack("!I", data[0:4])[0] + return cls( + severity=EventSeverity((event_raw >> 30) & 0b11), + group_id=(event_raw >> 16) & 0x3FFF, + unique_id=event_raw & 0xFFFF, + ) + + +class AcsId(enum.IntEnum): + SUBSYSTEM = 1 + MGM_ASSEMBLY = 2 + MGM_0 = 3 + MGM_1 = 4 + + +class AcsHkIds(enum.IntEnum): + MGM_SET = 1 + + +def make_addressable_id(target_id: int, unique_id: int) -> bytes: + byte_string = bytearray(struct.pack("!I", target_id)) + byte_string.extend(struct.pack("!I", unique_id)) + return byte_string diff --git a/pytmtc/config.py b/pytmtc/config.py index 150b9c1..3425d44 100644 --- a/pytmtc/config.py +++ b/pytmtc/config.py @@ -1,47 +1,47 @@ -from typing import Optional -from prompt_toolkit.history import FileHistory, History -from spacepackets.ccsds import PacketId, PacketType -from tmtccmd import HookBase -from tmtccmd.com import ComInterface -from tmtccmd.config import CmdTreeNode -from tmtccmd.util.obj_id import ObjectIdDictT - -from pytmtc.common import Apid -from pytmtc.pus_tc import create_cmd_definition_tree - - -class SatrsConfigHook(HookBase): - def __init__(self, json_cfg_path: str): - super().__init__(json_cfg_path) - - def get_communication_interface(self, com_if_key: str) -> Optional[ComInterface]: - from tmtccmd.config.com import ( - create_com_interface_default, - create_com_interface_cfg_default, - ) - - assert self.cfg_path is not None - packet_id_list = [] - for apid in Apid: - packet_id_list.append(PacketId(PacketType.TM, True, apid)) - cfg = create_com_interface_cfg_default( - com_if_key=com_if_key, - json_cfg_path=self.cfg_path, - space_packet_ids=packet_id_list, - ) - assert cfg is not None - return create_com_interface_default(cfg) - - def get_command_definitions(self) -> CmdTreeNode: - """This function should return the root node of the command definition tree.""" - return create_cmd_definition_tree() - - def get_cmd_history(self) -> Optional[History]: - """Optionlly return a history class for the past command paths which will be used - when prompting a command path from the user in CLI mode.""" - return FileHistory(".tmtc-history.txt") - - def get_object_ids(self) -> ObjectIdDictT: - from tmtccmd.config.objects import get_core_object_ids - - return get_core_object_ids() +from typing import Optional +from prompt_toolkit.history import FileHistory, History +from spacepackets.ccsds import PacketId, PacketType +from tmtccmd import HookBase +from tmtccmd.com import ComInterface +from tmtccmd.config import CmdTreeNode +from tmtccmd.util.obj_id import ObjectIdDictT + +from pytmtc.common import Apid +from pytmtc.pus_tc import create_cmd_definition_tree + + +class SatrsConfigHook(HookBase): + def __init__(self, json_cfg_path: str): + super().__init__(json_cfg_path) + + def get_communication_interface(self, com_if_key: str) -> Optional[ComInterface]: + from tmtccmd.config.com import ( + create_com_interface_default, + create_com_interface_cfg_default, + ) + + assert self.cfg_path is not None + packet_id_list = [] + for apid in Apid: + packet_id_list.append(PacketId(PacketType.TM, True, apid)) + cfg = create_com_interface_cfg_default( + com_if_key=com_if_key, + json_cfg_path=self.cfg_path, + space_packet_ids=packet_id_list, + ) + assert cfg is not None + return create_com_interface_default(cfg) + + def get_command_definitions(self) -> CmdTreeNode: + """This function should return the root node of the command definition tree.""" + return create_cmd_definition_tree() # this is the entry point for your TC definition + + def get_cmd_history(self) -> Optional[History]: + """Optionlly return a history class for the past command paths which will be used + when prompting a command path from the user in CLI mode.""" + return FileHistory(".tmtc-history.txt") + + def get_object_ids(self) -> ObjectIdDictT: + from tmtccmd.config.objects import get_core_object_ids + + return get_core_object_ids() diff --git a/pytmtc/hk.py b/pytmtc/hk.py index d50f0f1..6f52301 100644 --- a/pytmtc/hk.py +++ b/pytmtc/hk.py @@ -1,42 +1,42 @@ -import logging -import struct -from spacepackets.ecss.pus_3_hk import Subservice -from spacepackets.ecss import PusTm - -from pytmtc.common import AcsId, Apid -from pytmtc.acs.mgms import handle_mgm_hk_report - - -_LOGGER = logging.getLogger(__name__) - - -def handle_hk_packet(pus_tm: PusTm): - if len(pus_tm.source_data) < 4: - raise ValueError("no unique ID in HK packet") - unique_id = struct.unpack("!I", pus_tm.source_data[:4])[0] - if ( - pus_tm.subservice == Subservice.TM_HK_REPORT - or pus_tm.subservice == Subservice.TM_DIAGNOSTICS_REPORT - ): - if len(pus_tm.source_data) < 8: - raise ValueError("no set ID in HK packet") - set_id = struct.unpack("!I", pus_tm.source_data[4:8])[0] - handle_hk_report(pus_tm, unique_id, set_id) - _LOGGER.warning( - f"handling for HK packet with subservice {pus_tm.subservice} not implemented yet" - ) - - -def handle_hk_report(pus_tm: PusTm, unique_id: int, set_id: int): - hk_data = pus_tm.source_data[8:] - if pus_tm.apid == Apid.ACS: - if unique_id == AcsId.MGM_0: - handle_mgm_hk_report(pus_tm, set_id, hk_data) - else: - _LOGGER.warning( - f"handling for HK report with unique ID {unique_id} not implemented yet" - ) - else: - _LOGGER.warning( - f"handling for HK report with apid {pus_tm.apid} not implemented yet" - ) +import logging +import struct +from spacepackets.ecss.pus_3_hk import Subservice +from spacepackets.ecss import PusTm + +from pytmtc.common import AcsId, Apid +from pytmtc.acs.mgms import handle_mgm_hk_report + + +_LOGGER = logging.getLogger(__name__) + + +def handle_hk_packet(pus_tm: PusTm): + if len(pus_tm.source_data) < 4: + raise ValueError("no unique ID in HK packet") + unique_id = struct.unpack("!I", pus_tm.source_data[:4])[0] + if ( + pus_tm.subservice == Subservice.TM_HK_REPORT + or pus_tm.subservice == Subservice.TM_DIAGNOSTICS_REPORT + ): + if len(pus_tm.source_data) < 8: + raise ValueError("no set ID in HK packet") + set_id = struct.unpack("!I", pus_tm.source_data[4:8])[0] + handle_hk_report(pus_tm, unique_id, set_id) + _LOGGER.warning( + f"handling for HK packet with subservice {pus_tm.subservice} not implemented yet" + ) + + +def handle_hk_report(pus_tm: PusTm, unique_id: int, set_id: int): + hk_data = pus_tm.source_data[8:] + if pus_tm.apid == Apid.ACS: + if unique_id == AcsId.MGM_0: + handle_mgm_hk_report(pus_tm, set_id, hk_data) + else: + _LOGGER.warning( + f"handling for HK report with unique ID {unique_id} not implemented yet" + ) + else: + _LOGGER.warning( + f"handling for HK report with apid {pus_tm.apid} not implemented yet" + ) diff --git a/pytmtc/hk_common.py b/pytmtc/hk_common.py index bb9890a..9023d9e 100644 --- a/pytmtc/hk_common.py +++ b/pytmtc/hk_common.py @@ -1,16 +1,16 @@ -import struct - -from spacepackets.ecss import PusService, PusTc -from spacepackets.ecss.pus_3_hk import Subservice - - -def create_request_one_shot_hk_cmd(apid: int, unique_id: int, set_id: int) -> PusTc: - app_data = bytearray() - app_data.extend(struct.pack("!I", unique_id)) - app_data.extend(struct.pack("!I", set_id)) - return PusTc( - service=PusService.S3_HOUSEKEEPING, - subservice=Subservice.TC_GENERATE_ONE_PARAMETER_REPORT, - apid=apid, - app_data=app_data, - ) +import struct + +from spacepackets.ecss import PusService, PusTc +from spacepackets.ecss.pus_3_hk import Subservice + + +def create_request_one_shot_hk_cmd(apid: int, unique_id: int, set_id: int) -> PusTc: + app_data = bytearray() + app_data.extend(struct.pack("!I", unique_id)) + app_data.extend(struct.pack("!I", set_id)) + return PusTc( + service=PusService.S3_HOUSEKEEPING, + subservice=Subservice.TC_GENERATE_ONE_PARAMETER_REPORT, + apid=apid, + app_data=app_data, + ) diff --git a/pytmtc/mode.py b/pytmtc/mode.py index 918fdb1..3c66309 100644 --- a/pytmtc/mode.py +++ b/pytmtc/mode.py @@ -1,31 +1,31 @@ -import struct -from spacepackets.ecss import PusTc -from tmtccmd.pus.s200_fsfw_mode import Mode, Subservice -from tmtccmd.tmtc import DefaultPusQueueHelper - - -def create_set_mode_cmd(apid: int, unique_id: int, mode: int, submode: int) -> PusTc: - app_data = bytearray() - app_data.extend(struct.pack("!I", unique_id)) - app_data.extend(struct.pack("!I", mode)) - app_data.extend(struct.pack("!H", submode)) - return PusTc( - service=200, - subservice=Subservice.TC_MODE_COMMAND, - apid=apid, - app_data=app_data, - ) - - -def handle_set_mode_cmd( - q: DefaultPusQueueHelper, target_str: str, mode_str: str, apid: int, unique_id: int -): - if mode_str == "off": - q.add_log_cmd(f"Sending Mode OFF to {target_str}") - q.add_pus_tc(create_set_mode_cmd(apid, unique_id, Mode.OFF, 0)) - elif mode_str == "on": - q.add_log_cmd(f"Sending Mode ON to {target_str}") - q.add_pus_tc(create_set_mode_cmd(apid, unique_id, Mode.ON, 0)) - elif mode_str == "normal": - q.add_log_cmd(f"Sending Mode NORMAL to {target_str}") - q.add_pus_tc(create_set_mode_cmd(apid, unique_id, Mode.NORMAL, 0)) +import struct +from spacepackets.ecss import PusTc +from tmtccmd.pus.s200_fsfw_mode import Mode, Subservice +from tmtccmd.tmtc import DefaultPusQueueHelper + + +def create_set_mode_cmd(apid: int, unique_id: int, mode: int, submode: int) -> PusTc: + app_data = bytearray() + app_data.extend(struct.pack("!I", unique_id)) + app_data.extend(struct.pack("!I", mode)) + app_data.extend(struct.pack("!H", submode)) + return PusTc( + service=200, + subservice=Subservice.TC_MODE_COMMAND, + apid=apid, + app_data=app_data, + ) + + +def handle_set_mode_cmd( + q: DefaultPusQueueHelper, target_str: str, mode_str: str, apid: int, unique_id: int +): + if mode_str == "off": + q.add_log_cmd(f"Sending Mode OFF to {target_str}") + q.add_pus_tc(create_set_mode_cmd(apid, unique_id, Mode.OFF, 0)) + elif mode_str == "on": + q.add_log_cmd(f"Sending Mode ON to {target_str}") + q.add_pus_tc(create_set_mode_cmd(apid, unique_id, Mode.ON, 0)) + elif mode_str == "normal": + q.add_log_cmd(f"Sending Mode NORMAL to {target_str}") + q.add_pus_tc(create_set_mode_cmd(apid, unique_id, Mode.NORMAL, 0)) diff --git a/pytmtc/pus_tc.py b/pytmtc/pus_tc.py index f1fe5c5..29d2058 100644 --- a/pytmtc/pus_tc.py +++ b/pytmtc/pus_tc.py @@ -1,143 +1,154 @@ -import datetime -import logging - -from spacepackets.ccsds import CdsShortTimestamp -from spacepackets.ecss import PusTelecommand -from spacepackets.seqcount import FileSeqCountProvider -from tmtccmd import ProcedureWrapper, TcHandlerBase -from tmtccmd.config import CmdTreeNode -from tmtccmd.pus import VerificationWrapper -from tmtccmd.tmtc import ( - DefaultPusQueueHelper, - FeedWrapper, - QueueWrapper, - SendCbParams, - TcProcedureType, - TcQueueEntryType, -) -from tmtccmd.pus.s11_tc_sched import create_time_tagged_cmd - -from pytmtc.acs import create_acs_node -from pytmtc.common import Apid -from pytmtc.acs.mgms import create_mgm_cmds - -_LOGGER = logging.getLogger(__name__) - - -class TcHandler(TcHandlerBase): - def __init__( - self, - seq_count_provider: FileSeqCountProvider, - verif_wrapper: VerificationWrapper, - ): - super(TcHandler, self).__init__() - self.seq_count_provider = seq_count_provider - self.verif_wrapper = verif_wrapper - self.queue_helper = DefaultPusQueueHelper( - queue_wrapper=QueueWrapper.empty(), - tc_sched_timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE, - seq_cnt_provider=seq_count_provider, - pus_verificator=self.verif_wrapper.pus_verificator, - default_pus_apid=None, - ) - - def send_cb(self, send_params: SendCbParams): - entry_helper = send_params.entry - if entry_helper.is_tc: - if entry_helper.entry_type == TcQueueEntryType.PUS_TC: - pus_tc_wrapper = entry_helper.to_pus_tc_entry() - raw_tc = pus_tc_wrapper.pus_tc.pack() - _LOGGER.info(f"Sending {pus_tc_wrapper.pus_tc}") - send_params.com_if.send(raw_tc) - elif entry_helper.entry_type == TcQueueEntryType.LOG: - log_entry = entry_helper.to_log_entry() - _LOGGER.info(log_entry.log_str) - - def queue_finished_cb(self, info: ProcedureWrapper): - if info.proc_type == TcProcedureType.TREE_COMMANDING: - def_proc = info.to_tree_commanding_procedure() - _LOGGER.info(f"Queue handling finished for command {def_proc.cmd_path}") - - def feed_cb(self, info: ProcedureWrapper, wrapper: FeedWrapper): - q = self.queue_helper - q.queue_wrapper = wrapper.queue_wrapper - if info.proc_type == TcProcedureType.TREE_COMMANDING: - def_proc = info.to_tree_commanding_procedure() - assert def_proc.cmd_path is not None - pack_pus_telecommands(q, def_proc.cmd_path) - - -def create_cmd_definition_tree() -> CmdTreeNode: - root_node = CmdTreeNode.root_node() - - hk_node = CmdTreeNode("hk", "Housekeeping Node", hide_children_for_print=True) - hk_node.add_child(CmdTreeNode("one_shot_hk", "Request One Shot HK set")) - hk_node.add_child( - CmdTreeNode("enable", "Enable periodic housekeeping data generation") - ) - hk_node.add_child( - CmdTreeNode("disable", "Disable periodic housekeeping data generation") - ) - - mode_node = CmdTreeNode("mode", "Mode Node", hide_children_for_print=True) - set_mode_node = CmdTreeNode( - "set_mode", "Set Node", hide_children_which_are_leaves=True - ) - set_mode_node.add_child(CmdTreeNode("off", "Set OFF Mode")) - set_mode_node.add_child(CmdTreeNode("on", "Set ON Mode")) - set_mode_node.add_child(CmdTreeNode("normal", "Set NORMAL Mode")) - mode_node.add_child(set_mode_node) - mode_node.add_child(CmdTreeNode("read_mode", "Read Mode")) - - test_node = CmdTreeNode("test", "Test Node") - test_node.add_child(CmdTreeNode("ping", "Send PUS ping TC")) - test_node.add_child(CmdTreeNode("trigger_event", "Send PUS test to trigger event")) - root_node.add_child(test_node) - - scheduler_node = CmdTreeNode("scheduler", "Scheduler Node") - scheduler_node.add_child( - CmdTreeNode( - "schedule_ping_10_secs_ahead", "Schedule Ping to execute in 10 seconds" - ) - ) - root_node.add_child(scheduler_node) - root_node.add_child(create_acs_node(mode_node, hk_node)) - return root_node - - -def pack_pus_telecommands(q: DefaultPusQueueHelper, cmd_path: str): - # It should always be at least the root path "/", so we split of the empty portion left of it. - cmd_path_list = cmd_path.split("/")[1:] - if len(cmd_path_list) == 0: - _LOGGER.warning("empty command path") - return - if cmd_path_list[0] == "test": - assert len(cmd_path_list) >= 2 - if cmd_path_list[1] == "ping": - q.add_log_cmd("Sending PUS ping telecommand") - return q.add_pus_tc( - PusTelecommand(apid=Apid.GENERIC_PUS, service=17, subservice=1) - ) - elif cmd_path_list[1] == "trigger_event": - q.add_log_cmd("Triggering test event") - return q.add_pus_tc( - PusTelecommand(apid=Apid.GENERIC_PUS, service=17, subservice=128) - ) - if cmd_path_list[0] == "scheduler": - assert len(cmd_path_list) >= 2 - if cmd_path_list[1] == "schedule_ping_10_secs_ahead": - q.add_log_cmd("Sending PUS scheduled TC telecommand") - crt_time = CdsShortTimestamp.from_now() - time_stamp = crt_time + datetime.timedelta(seconds=10) - time_stamp = time_stamp.pack() - return q.add_pus_tc( - create_time_tagged_cmd( - time_stamp, - PusTelecommand(service=17, subservice=1), - apid=Apid.SCHED, - ) - ) - if cmd_path_list[0] == "acs": - assert len(cmd_path_list) >= 2 - if cmd_path_list[1] == "mgms": - create_mgm_cmds(q, cmd_path_list) +import datetime +import logging + +from spacepackets.ccsds import CdsShortTimestamp +from spacepackets.ecss import PusTelecommand +from spacepackets.seqcount import FileSeqCountProvider +from tmtccmd import ProcedureWrapper, TcHandlerBase +from tmtccmd.config import CmdTreeNode +from tmtccmd.pus import VerificationWrapper +from tmtccmd.tmtc import ( + DefaultPusQueueHelper, + FeedWrapper, + QueueWrapper, + SendCbParams, + TcProcedureType, + TcQueueEntryType, +) +from tmtccmd.pus.s11_tc_sched import create_time_tagged_cmd + +from pytmtc.acs import create_acs_node +from pytmtc.common import Apid +from pytmtc.acs.mgms import create_mgm_cmds + +_LOGGER = logging.getLogger(__name__) + + +class TcHandler(TcHandlerBase): + def __init__( + self, + seq_count_provider: FileSeqCountProvider, + verif_wrapper: VerificationWrapper, + ): + super(TcHandler, self).__init__() + self.seq_count_provider = seq_count_provider + self.verif_wrapper = verif_wrapper + self.queue_helper = DefaultPusQueueHelper( + queue_wrapper=QueueWrapper.empty(), + tc_sched_timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE, + seq_cnt_provider=seq_count_provider, + pus_verificator=self.verif_wrapper.pus_verificator, + default_pus_apid=None, + ) + + def send_cb(self, send_params: SendCbParams): + entry_helper = send_params.entry + if entry_helper.is_tc: + if entry_helper.entry_type == TcQueueEntryType.PUS_TC: + pus_tc_wrapper = entry_helper.to_pus_tc_entry() + raw_tc = pus_tc_wrapper.pus_tc.pack() + _LOGGER.info(f"Sending {pus_tc_wrapper.pus_tc}") + send_params.com_if.send(raw_tc) + elif entry_helper.entry_type == TcQueueEntryType.LOG: + log_entry = entry_helper.to_log_entry() + _LOGGER.info(log_entry.log_str) + + def queue_finished_cb(self, info: ProcedureWrapper): + if info.proc_type == TcProcedureType.TREE_COMMANDING: + def_proc = info.to_tree_commanding_procedure() + _LOGGER.info(f"Queue handling finished for command {def_proc.cmd_path}") + + def feed_cb(self, info: ProcedureWrapper, wrapper: FeedWrapper): + q = self.queue_helper + q.queue_wrapper = wrapper.queue_wrapper + if info.proc_type == TcProcedureType.TREE_COMMANDING: + def_proc = info.to_tree_commanding_procedure() + assert def_proc.cmd_path is not None + pack_pus_telecommands(q, def_proc.cmd_path) + + +def create_cmd_definition_tree() -> CmdTreeNode: + root_node = CmdTreeNode.root_node() + + # dummy stuff for testing + test_node = CmdTreeNode("test", "Test Node") + test_node.add_child(CmdTreeNode("ping", "Send PUS ping TC")) + test_node.add_child(CmdTreeNode("trigger_event", "Send PUS test to trigger event")) + root_node.add_child(test_node) + + # here we can see the different interfaces + # housekeeping (PUS 3) + hk_node = CmdTreeNode("hk", "Housekeeping Node", hide_children_for_print=True) + hk_node.add_child(CmdTreeNode("one_shot_hk", "Request One Shot HK set")) + hk_node.add_child( + CmdTreeNode("enable", "Enable periodic housekeeping data generation") + ) + hk_node.add_child( + CmdTreeNode("disable", "Disable periodic housekeeping data generation") + ) + + # mode (PUS 200) + mode_node = CmdTreeNode("mode", "Mode Node", hide_children_for_print=True) + # create the command to set any mode + set_mode_node = CmdTreeNode( + "set_mode", "Set Node", hide_children_which_are_leaves=True + ) + # adding the different modes + set_mode_node.add_child(CmdTreeNode("off", "Set OFF Mode")) + set_mode_node.add_child(CmdTreeNode("on", "Set ON Mode")) + set_mode_node.add_child(CmdTreeNode("normal", "Set NORMAL Mode")) + # after all mode children are added, the set_mode_node can be added to the parent: mode_node + mode_node.add_child(set_mode_node) # system mode commands + mode_node.add_child(CmdTreeNode("read_mode", "Read Mode")) # read the current system mode + + + + root_node.add_child(create_acs_node(mode_node, hk_node)) # we need to refer the hk & mode nodes to different subsystems or devices, as we want to use them to control a subsystem or device. + + # misc + scheduler_node = CmdTreeNode("scheduler", "Scheduler Node") + scheduler_node.add_child( + CmdTreeNode( + "schedule_ping_10_secs_ahead", "Schedule Ping to execute in 10 seconds" + ) + ) + root_node.add_child(scheduler_node) + return root_node + + +def pack_pus_telecommands(q: DefaultPusQueueHelper, cmd_path: str): + # It should always be at least the root path "/", so we split of the empty portion left of it. + cmd_path_list = cmd_path.split("/")[1:] + if len(cmd_path_list) == 0: + _LOGGER.warning("empty command path") + return + if cmd_path_list[0] == "test": + assert len(cmd_path_list) >= 2 + if cmd_path_list[1] == "ping": + q.add_log_cmd("Sending PUS ping telecommand") + return q.add_pus_tc( + PusTelecommand(apid=Apid.GENERIC_PUS, service=17, subservice=1) + ) + elif cmd_path_list[1] == "trigger_event": + q.add_log_cmd("Triggering test event") + return q.add_pus_tc( + PusTelecommand(apid=Apid.GENERIC_PUS, service=17, subservice=128) + ) + if cmd_path_list[0] == "scheduler": + assert len(cmd_path_list) >= 2 + if cmd_path_list[1] == "schedule_ping_10_secs_ahead": + q.add_log_cmd("Sending PUS scheduled TC telecommand") + crt_time = CdsShortTimestamp.from_now() + time_stamp = crt_time + datetime.timedelta(seconds=10) + time_stamp = time_stamp.pack() + return q.add_pus_tc( + create_time_tagged_cmd( + time_stamp, + PusTelecommand(service=17, subservice=1), + apid=Apid.SCHED, + ) + ) + if cmd_path_list[0] == "acs": + assert len(cmd_path_list) >= 2 + if cmd_path_list[1] == "mgms": + create_mgm_cmds(q, cmd_path_list) diff --git a/pytmtc/pus_tm.py b/pytmtc/pus_tm.py index ed55212..f29d8d1 100644 --- a/pytmtc/pus_tm.py +++ b/pytmtc/pus_tm.py @@ -1,93 +1,93 @@ -import logging -from typing import Any -from spacepackets.ccsds.time import CdsShortTimestamp -from spacepackets.ecss import PusTm -from spacepackets.ecss.pus_17_test import Service17Tm -from spacepackets.ecss.pus_1_verification import Service1Tm, UnpackParams -from tmtccmd.logging.pus import RawTmtcTimedLogWrapper -from tmtccmd.pus import VerificationWrapper -from tmtccmd.tmtc import GenericApidHandlerBase - -from pytmtc.common import Apid, EventU32 -from pytmtc.hk import handle_hk_packet - - -_LOGGER = logging.getLogger(__name__) - - -class PusHandler(GenericApidHandlerBase): - def __init__( - self, - file_logger: logging.Logger, - verif_wrapper: VerificationWrapper, - raw_logger: RawTmtcTimedLogWrapper, - ): - super().__init__(None) - self.file_logger = file_logger - self.raw_logger = raw_logger - self.verif_wrapper = verif_wrapper - - def handle_tm(self, apid: int, packet: bytes, _user_args: Any): - try: - pus_tm = PusTm.unpack( - packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE - ) - except ValueError as e: - _LOGGER.warning("Could not generate PUS TM object from raw data") - _LOGGER.warning(f"Raw Packet: [{packet.hex(sep=',')}], REPR: {packet!r}") - raise e - service = pus_tm.service - if service == 1: - tm_packet = Service1Tm.unpack( - data=packet, params=UnpackParams(CdsShortTimestamp.TIMESTAMP_SIZE, 1, 2) - ) - res = self.verif_wrapper.add_tm(tm_packet) - if res is None: - _LOGGER.info( - f"Received Verification TM[{tm_packet.service}, {tm_packet.subservice}] " - f"with Request ID {tm_packet.tc_req_id.as_u32():#08x}" - ) - _LOGGER.warning( - f"No matching telecommand found for {tm_packet.tc_req_id}" - ) - else: - self.verif_wrapper.log_to_console(tm_packet, res) - self.verif_wrapper.log_to_file(tm_packet, res) - elif service == 3: - pus_tm = PusTm.unpack( - packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE - ) - handle_hk_packet(pus_tm) - elif service == 5: - tm_packet = PusTm.unpack( - packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE - ) - src_data = tm_packet.source_data - event_u32 = EventU32.unpack(src_data) - _LOGGER.info( - f"Received event packet. Source APID: {Apid(tm_packet.apid)!r}, Event: {event_u32}" - ) - if event_u32.group_id == 0 and event_u32.unique_id == 0: - _LOGGER.info("Received test event") - elif service == 17: - tm_packet = Service17Tm.unpack( - packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE - ) - if tm_packet.subservice == 2: - self.file_logger.info("Received Ping Reply TM[17,2]") - _LOGGER.info("Received Ping Reply TM[17,2]") - else: - self.file_logger.info( - f"Received Test Packet with unknown subservice {tm_packet.subservice}" - ) - _LOGGER.info( - f"Received Test Packet with unknown subservice {tm_packet.subservice}" - ) - else: - _LOGGER.info( - f"The service {service} is not implemented in Telemetry Factory" - ) - tm_packet = PusTm.unpack( - packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE - ) - self.raw_logger.log_tm(pus_tm) +import logging +from typing import Any +from spacepackets.ccsds.time import CdsShortTimestamp +from spacepackets.ecss import PusTm +from spacepackets.ecss.pus_17_test import Service17Tm +from spacepackets.ecss.pus_1_verification import Service1Tm, UnpackParams +from tmtccmd.logging.pus import RawTmtcTimedLogWrapper +from tmtccmd.pus import VerificationWrapper +from tmtccmd.tmtc import GenericApidHandlerBase + +from pytmtc.common import Apid, EventU32 +from pytmtc.hk import handle_hk_packet + + +_LOGGER = logging.getLogger(__name__) + + +class PusHandler(GenericApidHandlerBase): + def __init__( + self, + file_logger: logging.Logger, + verif_wrapper: VerificationWrapper, + raw_logger: RawTmtcTimedLogWrapper, + ): + super().__init__(None) + self.file_logger = file_logger + self.raw_logger = raw_logger + self.verif_wrapper = verif_wrapper + + def handle_tm(self, apid: int, packet: bytes, _user_args: Any): + try: + pus_tm = PusTm.unpack( + packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE + ) + except ValueError as e: + _LOGGER.warning("Could not generate PUS TM object from raw data") + _LOGGER.warning(f"Raw Packet: [{packet.hex(sep=',')}], REPR: {packet!r}") + raise e + service = pus_tm.service + if service == 1: + tm_packet = Service1Tm.unpack( + data=packet, params=UnpackParams(CdsShortTimestamp.TIMESTAMP_SIZE, 1, 2) + ) + res = self.verif_wrapper.add_tm(tm_packet) + if res is None: + _LOGGER.info( + f"Received Verification TM[{tm_packet.service}, {tm_packet.subservice}] " + f"with Request ID {tm_packet.tc_req_id.as_u32():#08x}" + ) + _LOGGER.warning( + f"No matching telecommand found for {tm_packet.tc_req_id}" + ) + else: + self.verif_wrapper.log_to_console(tm_packet, res) + self.verif_wrapper.log_to_file(tm_packet, res) + elif service == 3: + pus_tm = PusTm.unpack( + packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE + ) + handle_hk_packet(pus_tm) + elif service == 5: + tm_packet = PusTm.unpack( + packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE + ) + src_data = tm_packet.source_data + event_u32 = EventU32.unpack(src_data) + _LOGGER.info( + f"Received event packet. Source APID: {Apid(tm_packet.apid)!r}, Event: {event_u32}" + ) + if event_u32.group_id == 0 and event_u32.unique_id == 0: + _LOGGER.info("Received test event") + elif service == 17: + tm_packet = Service17Tm.unpack( + packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE + ) + if tm_packet.subservice == 2: + self.file_logger.info("Received Ping Reply TM[17,2]") + _LOGGER.info("Received Ping Reply TM[17,2]") + else: + self.file_logger.info( + f"Received Test Packet with unknown subservice {tm_packet.subservice}" + ) + _LOGGER.info( + f"Received Test Packet with unknown subservice {tm_packet.subservice}" + ) + else: + _LOGGER.info( + f"The service {service} is not implemented in Telemetry Factory" + ) + tm_packet = PusTm.unpack( + packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE + ) + self.raw_logger.log_tm(pus_tm) diff --git a/requirements.txt b/requirements.txt index 9c558e3..81c6f00 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,3 @@ -. +. +spacepackets~=0.28.0 +tmtccmd~=8.2.0 \ No newline at end of file diff --git a/tests/test_tc_mods.py b/tests/test_tc_mods.py index 0b56bde..bf76c02 100644 --- a/tests/test_tc_mods.py +++ b/tests/test_tc_mods.py @@ -1,48 +1,48 @@ -from unittest import TestCase - -from spacepackets.ccsds import CdsShortTimestamp -from tmtccmd.tmtc import DefaultPusQueueHelper, QueueEntryHelper -from tmtccmd.tmtc.queue import QueueWrapper - -from pytmtc.config import SatrsConfigHook -from pytmtc.pus_tc import pack_pus_telecommands - - -class TestTcModules(TestCase): - def setUp(self): - self.hook = SatrsConfigHook(json_cfg_path="tmtc_conf.json") - self.queue_helper = DefaultPusQueueHelper( - queue_wrapper=QueueWrapper.empty(), - tc_sched_timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE, - seq_cnt_provider=None, - pus_verificator=None, - default_pus_apid=None, - ) - - def test_cmd_tree_creation_works_without_errors(self): - cmd_defs = self.hook.get_command_definitions() - self.assertIsNotNone(cmd_defs) - - def test_ping_cmd_generation(self): - pack_pus_telecommands(self.queue_helper, "/test/ping") - queue_entry = self.queue_helper.queue_wrapper.queue.popleft() - entry_helper = QueueEntryHelper(queue_entry) - log_queue = entry_helper.to_log_entry() - self.assertEqual(log_queue.log_str, "Sending PUS ping telecommand") - queue_entry = self.queue_helper.queue_wrapper.queue.popleft() - entry_helper.entry = queue_entry - pus_tc_entry = entry_helper.to_pus_tc_entry() - self.assertEqual(pus_tc_entry.pus_tc.service, 17) - self.assertEqual(pus_tc_entry.pus_tc.subservice, 1) - - def test_event_trigger_generation(self): - pack_pus_telecommands(self.queue_helper, "/test/trigger_event") - queue_entry = self.queue_helper.queue_wrapper.queue.popleft() - entry_helper = QueueEntryHelper(queue_entry) - log_queue = entry_helper.to_log_entry() - self.assertEqual(log_queue.log_str, "Triggering test event") - queue_entry = self.queue_helper.queue_wrapper.queue.popleft() - entry_helper.entry = queue_entry - pus_tc_entry = entry_helper.to_pus_tc_entry() - self.assertEqual(pus_tc_entry.pus_tc.service, 17) - self.assertEqual(pus_tc_entry.pus_tc.subservice, 128) +from unittest import TestCase + +from spacepackets.ccsds import CdsShortTimestamp +from tmtccmd.tmtc import DefaultPusQueueHelper, QueueEntryHelper +from tmtccmd.tmtc.queue import QueueWrapper + +from pytmtc.config import SatrsConfigHook +from pytmtc.pus_tc import pack_pus_telecommands + + +class TestTcModules(TestCase): + def setUp(self): + self.hook = SatrsConfigHook(json_cfg_path="tmtc_conf.json") + self.queue_helper = DefaultPusQueueHelper( + queue_wrapper=QueueWrapper.empty(), + tc_sched_timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE, + seq_cnt_provider=None, + pus_verificator=None, + default_pus_apid=None, + ) + + def test_cmd_tree_creation_works_without_errors(self): + cmd_defs = self.hook.get_command_definitions() + self.assertIsNotNone(cmd_defs) + + def test_ping_cmd_generation(self): + pack_pus_telecommands(self.queue_helper, "/test/ping") + queue_entry = self.queue_helper.queue_wrapper.queue.popleft() + entry_helper = QueueEntryHelper(queue_entry) + log_queue = entry_helper.to_log_entry() + self.assertEqual(log_queue.log_str, "Sending PUS ping telecommand") + queue_entry = self.queue_helper.queue_wrapper.queue.popleft() + entry_helper.entry = queue_entry + pus_tc_entry = entry_helper.to_pus_tc_entry() + self.assertEqual(pus_tc_entry.pus_tc.service, 17) + self.assertEqual(pus_tc_entry.pus_tc.subservice, 1) + + def test_event_trigger_generation(self): + pack_pus_telecommands(self.queue_helper, "/test/trigger_event") + queue_entry = self.queue_helper.queue_wrapper.queue.popleft() + entry_helper = QueueEntryHelper(queue_entry) + log_queue = entry_helper.to_log_entry() + self.assertEqual(log_queue.log_str, "Triggering test event") + queue_entry = self.queue_helper.queue_wrapper.queue.popleft() + entry_helper.entry = queue_entry + pus_tc_entry = entry_helper.to_pus_tc_entry() + self.assertEqual(pus_tc_entry.pus_tc.service, 17) + self.assertEqual(pus_tc_entry.pus_tc.subservice, 128) -- 2.43.0 From 6d58ae8fc662f8be1beb9f7324cbaf1df22f1da5 Mon Sep 17 00:00:00 2001 From: paul nehlich Date: Fri, 18 Jul 2025 11:44:43 +0200 Subject: [PATCH 2/3] APID for general PUS corrected --- pytmtc/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pytmtc/common.py b/pytmtc/common.py index 0d7e9b2..ce0e601 100644 --- a/pytmtc/common.py +++ b/pytmtc/common.py @@ -7,7 +7,7 @@ import struct class Apid(enum.IntEnum): SCHED = 1 - GENERIC_PUS = 2 + GENERIC_PUS = 0xEF # Test Service 17 ACS = 3 CFDP = 4 TMTC = 5 -- 2.43.0 From de4cc5223e54060139665d63a6101ac715d1e352 Mon Sep 17 00:00:00 2001 From: paul nehlich Date: Fri, 18 Jul 2025 13:03:15 +0200 Subject: [PATCH 3/3] README and Port --- README.md | 3 ++- port.png | Bin 0 -> 35111 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 port.png diff --git a/README.md b/README.md index 84613d1..f7d8cdc 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ To run the `tmtc` Command Line Interface (CLI) ``` In the program + 1 -+ select `localhost`, `port` of your choice e.g. `123` ++ select `localhost`, `port` of your choice e.g. `7301`. After the first run, a tmtc_config.json is present and stores the preset data. The OBSW tells you on which port it is listening when starting up. ![FSFW Port](port.png) + `:p` to print the command tree + to execute commands from the `tmtc CLI` you look into the device tree and execute the respective command split by slashes. ```sh @@ -45,4 +45,5 @@ test/ping # example to execute the ping command (PUS 17,1) see below a screenshot to visualize the steps above. ![sending a PING](example_execution_ping.png) + In order for all of this to work, you must have your hosted OBSW running in another terminal listening to the correct port! \ No newline at end of file diff --git a/port.png b/port.png new file mode 100644 index 0000000000000000000000000000000000000000..1273ab40d3380b0409dc587d5b6f9c3b027d329b GIT binary patch literal 35111 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 Hp7Z<<6HOUu literal 0 HcmV?d00001 -- 2.43.0