From fae2e90a656b949dd525edc3c0a20d4b88f47dde Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 19 Apr 2024 18:04:27 +0200 Subject: [PATCH 1/4] add some docs --- README.md | 8 ++ docs/networking-structure.graphml | 193 ++++++++++++++++++++++++++++++ docs/networking-structure.png | Bin 0 -> 67288 bytes 3 files changed, 201 insertions(+) create mode 100644 docs/networking-structure.graphml create mode 100644 docs/networking-structure.png diff --git a/README.md b/README.md index 34a8e69..79ad2a9 100644 --- a/README.md +++ b/README.md @@ -28,3 +28,11 @@ cross build ```sh cross build --release ``` + +## Commanding Infrastructure + +Commanding of the `ops-sat-rs` application is possible by different means. + +![Networking and Commanding Structure](docs/networking-structure.png "Networking and Commanding Structure") + +### Using the `pyclient` and `pyserver` applications diff --git a/docs/networking-structure.graphml b/docs/networking-structure.graphml new file mode 100644 index 0000000..1c85eef --- /dev/null +++ b/docs/networking-structure.graphml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + ops-sat-rs on satellite + + + + + + + + + + + + TCP SPP +Client + + + + + + + + + + + + pyserver +daemon + + + + + + + + + + + + OPS-SAT +Server +Port 4096 + + + + + + + + + + + + TMTC +Server +Port 4097 + + + + + + + + + + + + pyclient + + + + + + + + + + + + TCP +Server +Port 7301 + + + + + + + + + + + + UDP +Server +Port 7301 + + + + + + + + + + + + TMTC +Queue + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/networking-structure.png b/docs/networking-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..06c2c7021a1ed85f92cfdcd0a6b3eaf74ac3799d GIT binary patch literal 67288 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 ZY&aPRF=91)4{uJWc3V?9`_`XN{vVexTl4?` literal 0 HcmV?d00001 -- 2.43.0 From 0573d81e577d582ac52501a2ac719ecec205f352 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 19 Apr 2024 18:09:52 +0200 Subject: [PATCH 2/4] docs --- README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 79ad2a9..eb34f5d 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,26 @@ cross build --release Commanding of the `ops-sat-rs` application is possible by different means. -![Networking and Commanding Structure](docs/networking-structure.png "Networking and Commanding Structure") +Networking and Commanding Structure ### Using the `pyclient` and `pyserver` applications + +You can find both commanding application inside the `pytmtc` folder. +You can also find a `requirements.txt` file there to install all required Python dependencies. + +If you want to command the satellite using the OPS-SAT infrastrucute, start the `pyserver.py` +as a background application first, for example by simply running `pyserver.py` inside a +new terminal window. + +After that, you can run `pyclient.py -p /test/ping -l` to send a ping telecommand and then +go into listener mode using the following `tmtc_conf.json` file: + +```json +{ + "com_if": "tcp", + "tcpip_tcp_ip_addr": "127.0.0.1", + "tcpip_tcp_port": 4097 +} +``` + +You can run `pyclient.py -T` or `pyclient.py -h` for more information on the client application. -- 2.43.0 From dd831fb1b60a00ebf8c7d470861bdc2537b8ef22 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 19 Apr 2024 18:10:17 +0200 Subject: [PATCH 3/4] larger img --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eb34f5d..3f69492 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ cross build --release Commanding of the `ops-sat-rs` application is possible by different means. -Networking and Commanding Structure +Networking and Commanding Structure ### Using the `pyclient` and `pyserver` applications -- 2.43.0 From 1501e5a421ea3c24b83e11f2e710c892d4277457 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 20 Apr 2024 00:31:53 +0200 Subject: [PATCH 4/4] fnish README update --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 3f69492..ae2cbf8 100644 --- a/README.md +++ b/README.md @@ -55,4 +55,15 @@ go into listener mode using the following `tmtc_conf.json` file: } ``` +You can command the TCP server in the OPS-SAT software directly by running the commands with +the following configuration: + +```json +{ + "com_if": "tcp", + "tcpip_tcp_ip_addr": "127.0.0.1", + "tcpip_tcp_port": 7031 +} +``` + You can run `pyclient.py -T` or `pyclient.py -h` for more information on the client application. -- 2.43.0