Compare commits

...

332 Commits

Author SHA1 Message Date
e249f147bc Merge pull request 'Add Xiphos WDT commands' (#241) from add-xiphos-wdt-handling into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #241
2023-10-11 19:34:48 +02:00
d5118f0f98 Merge remote-tracking branch 'origin/main' into add-xiphos-wdt-handling
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-10-11 19:33:15 +02:00
39e6a04889 prep v5.7.1
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-10-11 18:14:19 +02:00
eb697befe3 changelog
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-10-11 15:05:40 +02:00
0bce6a506c Merge branch 'main' into add-xiphos-wdt-handling
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-10-11 15:05:05 +02:00
dcae930895 disable works
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-10-11 14:59:56 +02:00
aba369f11f added WDT enable and disable command
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-10-11 11:38:45 +02:00
1123c4d4df WDT
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-10-11 11:37:48 +02:00
7cd1b0070a add WDT module 2023-10-11 11:35:57 +02:00
ec8febf623 add new obj ID 2023-10-11 10:55:08 +02:00
c10a926b9f Merge pull request 'normal mode for SCEX' (#240) from scex-normal-mode into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #240
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-10-11 10:51:49 +02:00
9711dd9242 normal mode for SCEX
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-10-10 18:29:07 +02:00
d82cecbe6e Merge pull request 'prep v5.7.0' (#239) from prep_v5.7.0 into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #239
2023-10-10 14:33:29 +02:00
14820d63ac ruff fixes
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-10-10 14:32:04 +02:00
3d27711abb prep 5.7.0
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-10-10 14:29:21 +02:00
1d5db0951e changelog 2023-10-10 14:29:06 +02:00
d67987745d Merge pull request 'Power Controller' (#238) from pwr-ctrl into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #238
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2023-10-10 13:54:20 +02:00
bde03fc9c0 gens
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
EIVE/-/pipeline/head This commit looks good
2023-10-10 13:51:35 +02:00
be1ac09515 gens
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-10-10 12:08:55 +02:00
d1fde6f1e5 not sure why this is here
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-10-09 15:43:16 +02:00
caa843fb1a fixes and subsystem 2023-10-09 15:43:03 +02:00
11f7ed8436 pwr ctrl init 2023-10-09 11:10:39 +02:00
88b0c33632 id defs 2023-10-09 11:10:20 +02:00
dd74f6c3ca ran gens
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
2023-09-29 09:58:21 +02:00
783bdd297a do not use deprecated API
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-09-25 17:41:45 +02:00
bf399c3d91 Merge pull request 'prep v5.6.0' (#237) from prep_v5.6.0 into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #237
2023-09-14 12:21:37 +02:00
06a058fc4d README
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-14 12:20:35 +02:00
b464182df7 README 2023-09-14 12:18:21 +02:00
a30bccc995 move logo
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-14 12:12:58 +02:00
980242404a switch to ruff
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-09-14 12:09:50 +02:00
a8545211e8 prep next version
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-09-14 12:07:25 +02:00
fe439b4d3c Merge pull request 'CFDP file downlink' (#233) from cfdp-file-downlink into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #233
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-09-14 11:44:22 +02:00
f63f4b9193 bump tmtccmd dependency
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-14 11:26:57 +02:00
8d28b321d4 update CFDP source code
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-13 13:37:10 +02:00
8b45dd8bff Merge remote-tracking branch 'origin/main' into cfdp-file-downlink
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-12 14:17:39 +02:00
b20abc5bfb Merge pull request 'eive-tmtc-bugfixes' (#236) from eive-tmtc-bugfixes into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #236
2023-09-12 13:50:25 +02:00
af1474f10c bump patch version
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-12 13:49:27 +02:00
66db12796b black preview mode, flake8
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-09-12 13:48:38 +02:00
2d08fc0bfa that appears to be all
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-09-12 13:47:27 +02:00
9edc819a97 eive-tmtc bugfixes 2023-09-12 13:35:26 +02:00
d23cc6834a Merge pull request 'Prepare v5.5.0' (#235) from prep_next_release into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #235
2023-09-12 13:06:18 +02:00
33cff5e2d2 changelog
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-09-12 13:05:18 +02:00
acbcbbe98f some fixes for new version
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-09-12 13:03:54 +02:00
c3b0470aa6 prep next release 2023-09-12 13:01:40 +02:00
1860b754ce Merge remote-tracking branch 'origin/main' into cfdp-file-downlink
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-12 10:52:40 +02:00
68138c6e79 update generates files
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-12 10:51:35 +02:00
e56f8732be Merge pull request 'Relax SUS FDIR' (#205) from relax-sus-fdir-2 into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #205
2023-09-12 10:07:12 +02:00
af5e81158c update events and retvals
Some checks are pending
EIVE/-/pipeline/pr-main Build started...
2023-09-12 10:06:26 +02:00
baa1d20556 Merge branch 'cfdp-file-downlink' of https://egit.irs.uni-stuttgart.de/eive/eive-tmtc into cfdp-file-downlink
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-08 17:50:25 +02:00
1faecb09de some more useful printout 2023-09-08 17:49:59 +02:00
1ad621e630 use tmtccmd main branch til next release
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-07 16:23:28 +02:00
5fc3d8de99 run them yet again
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-07 16:13:00 +02:00
224328cc85 re-run generators 2023-09-07 16:12:37 +02:00
d285b1caec Merge remote-tracking branch 'origin/main' into relax-sus-fdir-2
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-07 16:03:17 +02:00
1f49f0c70d new events 2023-09-07 16:03:12 +02:00
649deac81b shorter delay for proxy operations
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-06 11:45:32 +02:00
7fa1196633 run configs
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-06 10:44:25 +02:00
1b0a7aeabd changelog
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-04 16:13:20 +02:00
412d67494d bump pyproject.toml 2023-09-04 16:12:42 +02:00
25377ccfa2 update retvals
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-04 11:20:08 +02:00
6657bf072c looking good
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-09-04 11:17:25 +02:00
7f79ef6c12 need absolute paths..
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-31 15:19:38 +02:00
d72b7d9d66 smaller tweaks, generator updates
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-31 15:10:07 +02:00
c687b1411c adapt run file for file downlink
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-31 09:25:57 +02:00
c2bed714dc call correct conversion function
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-30 11:37:17 +02:00
f9f8f9481f hmm
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-30 11:04:05 +02:00
8d6ca602f2 this finally looks correct
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-29 23:28:57 +02:00
c0bd5f572c small fix 2023-08-29 22:56:26 +02:00
25c7decb1e add local entity as remote entity cfg 2023-08-29 22:34:57 +02:00
cc7b1d3331 this is annoying.. 2023-08-29 21:57:10 +02:00
948f3a1a41 improve architecture a bit 2023-08-29 21:41:29 +02:00
8743f59b56 fix for HK level parsing 2023-08-29 21:31:27 +02:00
2cc4a18c1e Merge remote-tracking branch 'origin/main' into cfdp-file-downlink 2023-08-29 21:31:14 +02:00
b1fbad39e3 Merge pull request 'Prep OBSW v6.4.1' (#234) from prep-obsw-v6.4.1 into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #234
2023-08-21 18:45:25 +02:00
de57b9da5b events (wherever these changes come from?)
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-21 15:59:55 +02:00
55624f0447 Merge branch 'cfdp-file-downlink' of https://egit.irs.uni-stuttgart.de/eive/eive-tmtc into cfdp-file-downlink
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-17 16:44:41 +02:00
9841076699 maybe this works better 2023-08-17 16:44:34 +02:00
f1876681fd Merge branch 'main' into cfdp-file-downlink
Some checks failed
EIVE/-/pipeline/pr-main There was a failure building this commit
2023-08-17 16:44:00 +02:00
14b558b7f7 prepare file downlink
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-08-17 16:42:53 +02:00
54a7c3566f added missing stuff
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-17 11:34:54 +02:00
011be9837e remove more unused includes
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-17 11:34:34 +02:00
88161ed125 more cleaning up, new cfdp module
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-17 11:33:42 +02:00
f02230804d Merge pull request 'mini fixes' (#232) from mini-fixes into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #232
2023-08-16 14:04:03 +02:00
8ddcc37c74 mini fixes
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-16 13:25:29 +02:00
b50c75c13c Merge pull request 'PLOC SUPV HK parsing' (#231) from parse-ploc-supv-hk into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #231
2023-08-15 14:39:09 +02:00
36799ef51d v5.4.3
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-15 14:38:28 +02:00
772ef5b323 changelog
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-15 14:35:45 +02:00
2f8bed4581 works
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-15 14:31:49 +02:00
72def77d40 parse ploc supv HK
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-15 14:15:06 +02:00
bc1a1774a6 Merge pull request 'added none entry for new enum' (#230) from submode-enum-none-entry into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #230
2023-08-15 13:58:07 +02:00
4b08f5dd5b prep v5.4.2
Some checks are pending
EIVE/-/pipeline/pr-main Build queued...
2023-08-15 13:57:43 +02:00
b0562ea9c7 added none entry for new enum
Some checks are pending
EIVE/-/pipeline/head Build queued...
2023-08-15 13:54:18 +02:00
f76cd94535 prep v5.4.1
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-15 13:28:54 +02:00
8a1e5b7b99 changelog
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-15 13:21:10 +02:00
0e208629b0 subsystem enum is int enum now 2023-08-15 13:20:43 +02:00
403657110b prep v5.4.0
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-15 13:13:06 +02:00
23f21b40eb Merge pull request 'PL PCDU enum' (#229) from new-pl-pcdu-enum into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #229
2023-08-15 13:07:40 +02:00
a6b3ccb4cc more better names
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-15 11:51:41 +02:00
d7b494a950 better name 2023-08-15 11:51:12 +02:00
73bc043538 move enum
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-15 11:50:39 +02:00
02e7e809de PL PCDU enum
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-15 11:47:07 +02:00
d6f6aff139 Merge pull request 'SGP4 Propagator Prep' (#227) from spg4-propagator into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #227
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2023-08-15 10:46:27 +02:00
d39a49bd4c Merge branch 'main' into spg4-propagator
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-15 09:31:15 +02:00
f42318bc57 deprecated import
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-14 15:58:44 +02:00
fd3a799019 Merge pull request 'new pdec event' (#228) from pdec-config-readback into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #228
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-08-14 15:47:07 +02:00
1664e6adb5 Merge branch 'main' into pdec-config-readback
Some checks are pending
EIVE/-/pipeline/pr-main Build queued...
2023-08-14 15:46:57 +02:00
8042f3607d new pdec event
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-14 15:09:34 +02:00
59278447fd Merge branch 'main' into spg4-propagator
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-14 14:13:03 +02:00
b58977fd65 naming
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-14 12:50:50 +02:00
beae6b3f05 Merge pull request 'More GPS TM' (#226) from more-gps-tm into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #226
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2023-08-14 10:38:16 +02:00
12c60ac310 goddamnit
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-09 14:58:28 +02:00
1acbb8bb43 less copy-pasta helps sometimes
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-08 13:39:36 +02:00
051e9e6ffb lets be clean about this
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-08 10:01:50 +02:00
6d88746ec3 fix
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-08 09:40:37 +02:00
5571a6852e init 2023-08-07 14:21:58 +02:00
1ddb93410e wörks
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-04 16:24:16 +02:00
b0b186ac1f we need this sed_id thingy
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-04 15:39:40 +02:00
f95331742b fix
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-04 15:38:32 +02:00
c91ad9e08b bump
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-04 15:01:34 +02:00
fcabaa5b09 rework gps data handling
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-04 14:51:55 +02:00
bf9ab7edf7 this was the fun part
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-08-04 14:35:09 +02:00
957d756d1e Merge remote-tracking branch 'origin/main' into relax-sus-fdir-2
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-08-03 13:36:27 +02:00
4b054b7628 Merge pull request 'new scex event' (#225) from scex-event into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #225
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-08-02 09:46:09 +02:00
9001a28545 new scex event
Some checks are pending
EIVE/-/pipeline/head Build queued...
2023-08-02 09:41:19 +02:00
6b2fbc6917 Merge pull request 'SCEX code improvements' (#224) from scex-code-improvements into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #224
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-27 11:21:38 +02:00
ab770a0057 Merge remote-tracking branch 'origin/main' into scex-code-improvements
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-27 09:59:49 +02:00
0cbf28f25c scex code improvenemtns
Some checks are pending
EIVE/-/pipeline/head Build queued...
2023-07-27 09:59:34 +02:00
cbcc06ede7 Merge pull request 'ACS downwards compatibility' (#223) from acs-downwards-compat into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #223
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-26 13:17:35 +02:00
a55aa4a667 added comments
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-26 13:15:08 +02:00
d2324dace9 changelog and init
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-26 13:13:41 +02:00
1e4e524f95 update CTRL STATE enum and make it global 2023-07-26 13:12:12 +02:00
39d6ec73c2 Merge pull request 'prep v5.3.0' (#222) from prep-v5.3.0 into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #222
2023-07-26 12:56:18 +02:00
74cfa2949a flake8 and black
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-26 12:54:13 +02:00
ffdb4451f6 prep v5.3.0
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-26 12:51:56 +02:00
15716c988b Merge pull request 'new safe mode' (#221) from new-safe into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #221
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2023-07-26 09:51:26 +02:00
f5ec50b674 guess i added PTG strats in june ...
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
2023-07-24 09:47:52 +02:00
02b70ee203 Merge branch 'main' into new-safe
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-24 09:25:22 +02:00
95b6954175 Merge pull request 'new event' (#220) from active-sd-info-event into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #220
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-21 11:49:59 +02:00
a82cbff5a8 works well
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-21 11:47:37 +02:00
87b766dfb8 active SD info
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-21 11:36:01 +02:00
09b7a01ff6 init
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-21 11:20:20 +02:00
fd6b76bfdd update events.csv
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-21 11:04:32 +02:00
40c086086b new event
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-21 10:26:37 +02:00
83e8fe0587 Merge pull request 'TMTC improvements' (#219) from tmtc-improvements into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #219
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-19 14:46:51 +02:00
6cffae4397 the name is okay..
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-19 14:42:02 +02:00
d73ef3a314 better name for HK module
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-19 14:41:19 +02:00
0b8bd61e80 Merge pull request 'Update STR Commands' (#218) from update-str-cmds into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #218
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-14 12:24:50 +02:00
380a02ee94 add new STR COM error event
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-13 21:09:14 +02:00
c6e2e2de49 Merge branch 'main' into update-str-cmds
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-13 18:28:15 +02:00
6479aeda63 Merge pull request 'STR: time conversion bugfix' (#217) from str-time-conversion-fix into main
Some checks reported errors
EIVE/-/pipeline/head Something is wrong with the build of this commit
Reviewed-on: #217
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-13 14:59:58 +02:00
26cf112121 Merge branch 'str-time-conversion-fix' into update-str-cmds
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-13 14:59:03 +02:00
62bd535622 time conversion bugfix
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-13 14:49:03 +02:00
eea7683581 Merge pull request 'prep v5.2.0' (#216) from prep_v5.2.0 into main
Some checks reported errors
EIVE/-/pipeline/head Something is wrong with the build of this commit
Reviewed-on: #216
2023-07-13 11:55:26 +02:00
df6aa80169 changelog
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-13 11:47:47 +02:00
2fd1a46e66 bump tmtccmd to v5.0.0 2023-07-13 11:46:38 +02:00
2153aa2842 prep v5.2.0
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-13 11:30:43 +02:00
1f2f2aac13 update STR commands
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-13 10:53:42 +02:00
9be81f1725 Merge pull request 'max burn time event' (#213) from tcs-heater-upper-limit into main
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
Reviewed-on: #213
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-11 10:15:55 +02:00
601adfc9c2 Merge branch 'main' into tcs-heater-upper-limit
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-11 09:45:37 +02:00
ac84ac2c3e Merge pull request 'TCS CTRL Info Set' (#215) from tcs-ctrl-info-set into main
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
Reviewed-on: #215
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-11 09:31:49 +02:00
7ed18bd570 Merge pull request 'HK level is a CLI argument now' (#214) from hk-level-as-cli-arg into main
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
Reviewed-on: #214
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-07-11 09:21:39 +02:00
e27ad147d4 done
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
2023-07-10 18:29:24 +02:00
ba47757b50 added way to request new HK set
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-10 16:29:54 +02:00
7e9c626ec8 add command demultiplexing for tcs ctrl 2023-07-10 16:25:44 +02:00
8d6dd97d85 Merge branch 'hk-level-as-cli-arg' into tcs-ctrl-info-set
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-10 16:11:18 +02:00
2fae5613ce fix
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-10 16:09:42 +02:00
fdb14cbdc5 HK level is a CLI argument now
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-07-10 16:07:01 +02:00
0cef3fa924 and now it works
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-07-10 16:04:36 +02:00
37a35c4446 cli argument
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-07-10 16:03:08 +02:00
15d25b4c5b max burn time event
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
2023-07-07 12:06:27 +02:00
069f84d220 Merge pull request 'Add TCS CTRL heater events' (#212) from add-tcs-ctrl-heater-events into main
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
Reviewed-on: #212
2023-07-07 10:53:32 +02:00
627a16d51a Merge branch 'main' into add-tcs-ctrl-heater-events
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-07-06 19:03:27 +02:00
fcfae1f67f Merge pull request 'add cmd to set max reboot watchdog count' (#210) from rwd-improvements into main
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
Reviewed-on: #210
2023-07-06 19:03:05 +02:00
01ebd356ba Merge branch 'main' into rwd-improvements 2023-07-06 19:02:58 +02:00
5785bbd0cc changelog
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-07-06 19:01:15 +02:00
d3e6101447 add new events 2023-07-06 19:00:39 +02:00
6d5bde40db add back TMP1075 health commands
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-07-06 16:00:10 +02:00
c48f04eed5 add TCS submode
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-07-06 14:15:28 +02:00
18304c31fa prep v5.1.0
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-06-28 13:39:20 +02:00
8caa408cbd Merge pull request 'Internal error reporter' (#211) from internal-error-reporter into main
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
Reviewed-on: #211
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-06-28 13:16:37 +02:00
4a983958bf changelog
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-06-28 13:15:01 +02:00
03ec5bdc39 changelog
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-06-28 13:14:07 +02:00
9c5d6a15db APP logger should be root logger
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-06-28 13:10:10 +02:00
ddc80071e0 changelogge
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-06-28 10:43:11 +02:00
deb0275bb5 add cmd to set max reboot watchdog count
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
2023-06-24 18:36:33 +02:00
ec0ebc3653 handle FW info event
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-06-23 02:05:04 +02:00
c9f4a8070d Merge pull request 'v5.0.0' (#209) from v5.0.0-dev into main
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
Reviewed-on: #209
2023-06-22 17:33:52 +02:00
b917358b9f prep v5.0.0
Some checks are pending
EIVE/-/pipeline/head Build started...
2023-06-22 17:33:20 +02:00
5db9f383a6 Merge pull request 'CP Helper force flag' (#208) from cp-helper-force-flag into v5.0.0-dev
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #208
2023-06-22 16:37:22 +02:00
fe3accb9ad Merge branch 'main' into cp-helper-force-flag
Some checks are pending
EIVE/-/pipeline/pr-main Build queued...
2023-06-22 16:27:44 +02:00
68d74a4748 fix
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-06-22 16:26:47 +02:00
b6ec7da7fa force flag cp helper 2023-06-22 16:26:33 +02:00
c7df13fa68 Merge pull request 'Core Controller Extension' (#207) from core-ctrl-extension into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #207
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-06-22 16:25:31 +02:00
daceb6bc1d remove pass
Some checks are pending
EIVE/-/pipeline/pr-main Build queued...
2023-06-22 16:18:52 +02:00
8239e610cc works
All checks were successful
EIVE/-/pipeline/head This commit looks good
2023-06-22 14:52:28 +02:00
b28d938468 core controller extension 2023-06-22 14:40:46 +02:00
e0457831d7 Merge pull request 'fw info event' (#206) from new-fw-info-event into main
All checks were successful
EIVE/-/pipeline/head This commit looks good
Reviewed-on: #206
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-06-22 09:19:31 +02:00
96fab88a55 Merge branch 'main' into new-fw-info-event
All checks were successful
EIVE/-/pipeline/pr-main This commit looks good
2023-06-21 20:26:31 +02:00
50f2eb42f3 Merge pull request 'Additions for I2C' (#204) from additions-for-i2c-2 into main
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
Reviewed-on: #204
Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
2023-06-21 19:14:15 +02:00
1bb8bea8d9 fw info event
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
2023-06-21 19:01:19 +02:00
0a05873f4e Squashed commit of the following:
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
commit 2b2ad0a23a
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Tue Jun 13 07:54:41 2023 +0200

    docs for events

commit 00205f0e75
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Tue Jun 13 07:43:12 2023 +0200

    new sus event

commit eae0120643
Merge: 4a990e7 fc3cf48
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 13:36:27 2023 +0200

    Merge pull request 'switched to prebuilt docker image' (#198) from mohr/docker into main

    Reviewed-on: #198

commit fc3cf480dc
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 12:14:52 2023 +0200

    bump docker version

commit acca981260
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 12:12:47 2023 +0200

    jenkins user in docker

commit 822eaa4c89
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 12:01:26 2023 +0200

    removed empty `environment` block in Jenkinsfile which Jenkins does not like

    diva....

commit 252d140b8e
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 11:56:39 2023 +0200

    switched to prebuilt docker image

commit 4a990e704b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 10 14:58:15 2023 +0200

    added basic automation file

commit 522f273c99
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 10 14:48:02 2023 +0200

    add date in changelog

commit 1724a90a26
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 10 14:46:00 2023 +0200

    add release checklist

commit 7b21070363
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 10 14:42:28 2023 +0200

    linter fixes, version bump

commit d390168829
Merge: 238bbd5 a969481
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Sat Jun 10 14:10:42 2023 +0200

    Merge pull request 'v4.0.0-dev' (#197) from v4.0.0-dev into main

    Reviewed-on: #197

commit a969481698
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 18:53:11 2023 +0200

    imtq parsing fixes

commit 8bdba71dc3
Merge: 8804a4e e3800ac
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri Jun 9 12:44:00 2023 +0200

    Merge pull request 'Rework logging handling' (#194) from rework_logging_handling into v4.0.0-dev

    Reviewed-on: #194

commit e3800ac0c9
Merge: 1548278 8804a4e
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri Jun 9 12:43:21 2023 +0200

    Merge branch 'v4.0.0-dev' into rework_logging_handling

commit 8804a4e8e9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:43:08 2023 +0200

    bump tmtccmd to v5.0.0rc0

commit 1548278ad6
Merge: 148a52a ac140ae
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:42:26 2023 +0200

    Merge remote-tracking branch 'origin/v4.0.0-dev' into rework_logging_handling

commit 148a52a69a
Merge: e45072c 238bbd5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:42:16 2023 +0200

    Merge remote-tracking branch 'origin/main' into rework_logging_handling

commit ac140aeb2c
Merge: c6c4b9a a5a30d3
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri Jun 9 12:41:55 2023 +0200

    Merge pull request 'moved 2 parameters' (#196) from move-pdu-datavar into v4.0.0-dev

    Reviewed-on: #196

commit a5a30d37eb
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:41:49 2023 +0200

    tweak changelog

commit d9194207a4
Merge: 14d14f1 c6c4b9a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:39:38 2023 +0200

    Merge remote-tracking branch 'origin/v4.0.0-dev' into move-pdu-datavar

commit 14d14f12c0
Merge: 17dd9de 238bbd5
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 7 17:27:52 2023 +0200

    Merge branch 'v3.2.0-dev' into move-pdu-datavar

commit 17dd9de51e
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 7 17:25:51 2023 +0200

    moved 2 parameters

commit 238bbd5843
Merge: 6182369 de02d81
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 7 17:16:37 2023 +0200

    Merge pull request 'better exception handling' (#195) from better-exception-handling into v3.2.0-dev

    Reviewed-on: #195

commit de02d81e1d
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 7 16:56:43 2023 +0200

    better exception handling

commit e45072c38d
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Thu May 25 11:31:06 2023 +0200

    import replacement

commit fe96f115d5
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed May 24 13:50:37 2023 +0200

    that should be all

commit e9e43f03d2
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed May 24 13:44:45 2023 +0200

    more stuff

commit aab093cc0a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 23 09:54:51 2023 +0200

    rework it

commit c6c4b9a995
Merge: 280c724 5f379bf
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Mon May 22 10:42:49 2023 +0200

    Merge pull request 'Bugfix CFDP' (#191) from bugfix-cfdp into v4.0.0-dev

    Reviewed-on: #191

commit 6182369e4f
Merge: d23c0c2 620360c
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Mon May 22 10:41:54 2023 +0200

    Merge pull request 'generic systemctl' (#193) from generic_systemctl into main

    Reviewed-on: #193
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit 620360c8e8
Merge: 49dde29 d23c0c2
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri May 19 11:02:35 2023 +0200

    Merge branch 'main' into generic_systemctl

commit 49dde29847
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Fri May 19 11:01:06 2023 +0200

    generic systemctl

commit d23c0c20fc
Merge: 280c724 ef1da1e
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Fri May 19 10:44:01 2023 +0200

    Merge pull request 'new MPSoC events and retvals' (#192) from mpsoc_new_events_retvals into main

    Reviewed-on: #192
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit ef1da1e882
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 17 19:00:17 2023 +0200

    changelog

commit 6ec0ce20fa
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 17 17:15:43 2023 +0200

    new event

commit 5f379bf2bb
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 16:43:40 2023 +0200

    changelog

commit 7c1e7226e0
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 16:42:56 2023 +0200

    bugfix CFDP: bump tmtccmd

commit b8e1c7afe9
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 15:20:56 2023 +0200

    new MPSoC events and retvals

commit 280c72439e
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 14:18:18 2023 +0200

    bugfix MPSoC command

commit 14c42a91ff
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 13:43:26 2023 +0200

    rework read and write prompts for MPSoC

commit dd3e4c649b
Merge: 3b16717 0c1bfc6
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Mon May 15 09:10:41 2023 +0200

    Merge pull request 'MPSoC flash content reporter' (#190) from mpsoc_action_reply_handler into main

    Reviewed-on: #190
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit 3b16717ce2
Merge: 377e98b f1a0334
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri May 12 16:27:39 2023 +0200

    Merge pull request 'fixfixfix' (#189) from ploc_pwr_switching_fix into main

    Reviewed-on: #189

commit f1a0334d3d
Merge: f090c3a 377e98b
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri May 12 16:27:33 2023 +0200

    Merge branch 'main' into ploc_pwr_switching_fix

commit 0c1bfc6fd3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 16:27:16 2023 +0200

    bump changelog

commit 04bbe057e7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 16:24:45 2023 +0200

    flash c ontent report works now

commit e05a54b076
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 16:08:57 2023 +0200

    somethings wrong with the format

commit ef0adef04a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 15:51:17 2023 +0200

    start adding action reply handler for MPSoC

commit 377e98b5c2
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 13:22:58 2023 +0200

    bugfix MPSoC HK parsing

commit 87e5abe8eb
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 11:51:47 2023 +0200

    add missing command list of PLOC MPSoC commands

commit f090c3af66
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Thu May 11 17:55:15 2023 +0200

    fixfixfix

commit 13fd9a7d84
Merge: 4d921e0 bbcc0f9
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Thu May 4 15:30:49 2023 +0200

    Merge pull request 'impl MPSoC HK parsing' (#188) from mpsoc_commands into main

    Reviewed-on: #188
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit bbcc0f9de7
Merge: a0aa652 1ab8710
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 15:17:12 2023 +0200

    Merge branch 'mpsoc_commands' of https://egit.irs.uni-stuttgart.de/eive/eive-tmtc into mpsoc_commands

commit a0aa6525e4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 15:17:00 2023 +0200

    fix

commit 1ab8710040
Merge: f480d86 4d921e0
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Thu May 4 14:51:13 2023 +0200

    Merge branch 'main' into mpsoc_commands

commit f480d86fbd
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 14:50:38 2023 +0200

    impl MPSoC HK parsing

commit 4d921e01af
Merge: e85d1a1 b505524
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Thu May 4 12:01:43 2023 +0200

    Merge pull request 'MPSoC module update' (#187) from mpsoc_commands into main

    Reviewed-on: #187
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit b505524e0b
Merge: e0e9a31 e85d1a1
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Thu May 4 12:01:33 2023 +0200

    Merge branch 'main' into mpsoc_commands

commit e0e9a310b9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 11:51:50 2023 +0200

    add command to get flash dir content

commit 0e9ebefc87
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 11:27:12 2023 +0200

    new mpsoc commands

commit e85d1a1966
Merge: 60fba8b 4ff50b6
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Wed May 3 13:36:31 2023 +0200

    Merge pull request 'most important bugfix' (#186) from most-important-bugfix into main

    Reviewed-on: #186

commit 4ff50b6559
Author: meggert <eggertm@irs.uni-stuttgart.de>
Date:   Wed May 3 13:34:14 2023 +0200

    bub

commit 60fba8b6d9
Merge: 5fbd19b 1707f24
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri Apr 28 10:25:35 2023 +0200

    Merge pull request 'more system modes' (#185) from more-system-modes into main

    Reviewed-on: #185

commit 1707f24612
Author: meggert <eggertm@irs.uni-stuttgart.de>
Date:   Wed Apr 19 15:10:44 2023 +0200

    more system modes

commit 5fbd19bb6c
Merge: 4083a30 0c6a967
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 17 18:41:08 2023 +0200

    Merge branch 'main' of https://egit.irs.uni-stuttgart.de/eive/eive-tmtc
2023-06-19 18:03:45 +02:00
80d231586e Squashed commit of the following:
All checks were successful
EIVE/-/pipeline/head This commit looks good
EIVE/-/pipeline/pr-main This commit looks good
commit 79060acfb6
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Sun Jun 18 16:19:00 2023 +0200

    add enable HK set cmd

commit b9038f1c86
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Sun Jun 18 13:37:21 2023 +0200

    add back PL PCDU 1

commit fd20a9fe3c
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Sun Jun 18 13:30:45 2023 +0200

    add TMP1075 HK handling

commit 936dcdf334
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Thu Jun 15 05:15:05 2023 +0200

    remove sw update, add fake test files

commit 29fc7a5fca
Merge: e106e0b 2202c95
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 07:46:34 2023 +0200

    Merge pull request 'Some minor tweaks for BPX commands' (#202) from add-bpx-man-heater-cmds into main

    Reviewed-on: #202

commit 2202c95c4c
Merge: b38da20 e106e0b
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 07:46:23 2023 +0200

    Merge branch 'main' into add-bpx-man-heater-cmds

commit b38da20953
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 07:46:00 2023 +0200

    some better doc

commit f9a61fa485
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 07:45:03 2023 +0200

    clean up batt cmds a bit

commit e106e0bc63
Merge: 970c899 d1bd8f1
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 07:43:19 2023 +0200

    Merge pull request 'added BPX manual heater commands' (#201) from add-bpx-man-heater-cmds into main

    Reviewed-on: #201

commit d1bd8f15d9
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 07:42:12 2023 +0200

    added BPX manual heater commands

commit 970c8998f0
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 06:16:17 2023 +0200

    prep v4.1.0

commit 8a87d83653
Merge: eae0120 cf55b36
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 06:06:58 2023 +0200

    Merge pull request 'Add more heater commands' (#200) from add-heater-cmd-ids into main

    Reviewed-on: #200

commit cf55b3630c
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 05:16:21 2023 +0200

    add set cfg and rst cfg

commit 656e75052b
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 02:59:20 2023 +0200

    fix broken IDs

commit e91bf01daf
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 14 02:03:20 2023 +0200

    add heater cmd IDs

commit eae0120643
Merge: 4a990e7 fc3cf48
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 13:36:27 2023 +0200

    Merge pull request 'switched to prebuilt docker image' (#198) from mohr/docker into main

    Reviewed-on: #198

commit fc3cf480dc
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 12:14:52 2023 +0200

    bump docker version

commit acca981260
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 12:12:47 2023 +0200

    jenkins user in docker

commit 822eaa4c89
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 12:01:26 2023 +0200

    removed empty `environment` block in Jenkinsfile which Jenkins does not like

    diva....

commit 252d140b8e
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Sun Jun 11 11:56:39 2023 +0200

    switched to prebuilt docker image

commit 4a990e704b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 10 14:58:15 2023 +0200

    added basic automation file

commit 522f273c99
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 10 14:48:02 2023 +0200

    add date in changelog

commit 1724a90a26
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 10 14:46:00 2023 +0200

    add release checklist

commit 7b21070363
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 10 14:42:28 2023 +0200

    linter fixes, version bump

commit d390168829
Merge: 238bbd5 a969481
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Sat Jun 10 14:10:42 2023 +0200

    Merge pull request 'v4.0.0-dev' (#197) from v4.0.0-dev into main

    Reviewed-on: #197

commit a969481698
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 18:53:11 2023 +0200

    imtq parsing fixes

commit 8bdba71dc3
Merge: 8804a4e e3800ac
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri Jun 9 12:44:00 2023 +0200

    Merge pull request 'Rework logging handling' (#194) from rework_logging_handling into v4.0.0-dev

    Reviewed-on: #194

commit e3800ac0c9
Merge: 1548278 8804a4e
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri Jun 9 12:43:21 2023 +0200

    Merge branch 'v4.0.0-dev' into rework_logging_handling

commit 8804a4e8e9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:43:08 2023 +0200

    bump tmtccmd to v5.0.0rc0

commit 1548278ad6
Merge: 148a52a ac140ae
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:42:26 2023 +0200

    Merge remote-tracking branch 'origin/v4.0.0-dev' into rework_logging_handling

commit 148a52a69a
Merge: e45072c 238bbd5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:42:16 2023 +0200

    Merge remote-tracking branch 'origin/main' into rework_logging_handling

commit ac140aeb2c
Merge: c6c4b9a a5a30d3
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri Jun 9 12:41:55 2023 +0200

    Merge pull request 'moved 2 parameters' (#196) from move-pdu-datavar into v4.0.0-dev

    Reviewed-on: #196

commit a5a30d37eb
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:41:49 2023 +0200

    tweak changelog

commit d9194207a4
Merge: 14d14f1 c6c4b9a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 9 12:39:38 2023 +0200

    Merge remote-tracking branch 'origin/v4.0.0-dev' into move-pdu-datavar

commit 14d14f12c0
Merge: 17dd9de 238bbd5
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 7 17:27:52 2023 +0200

    Merge branch 'v3.2.0-dev' into move-pdu-datavar

commit 17dd9de51e
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 7 17:25:51 2023 +0200

    moved 2 parameters

commit 238bbd5843
Merge: 6182369 de02d81
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 7 17:16:37 2023 +0200

    Merge pull request 'better exception handling' (#195) from better-exception-handling into v3.2.0-dev

    Reviewed-on: #195

commit de02d81e1d
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed Jun 7 16:56:43 2023 +0200

    better exception handling

commit e45072c38d
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Thu May 25 11:31:06 2023 +0200

    import replacement

commit fe96f115d5
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed May 24 13:50:37 2023 +0200

    that should be all

commit e9e43f03d2
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Wed May 24 13:44:45 2023 +0200

    more stuff

commit aab093cc0a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 23 09:54:51 2023 +0200

    rework it

commit c6c4b9a995
Merge: 280c724 5f379bf
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Mon May 22 10:42:49 2023 +0200

    Merge pull request 'Bugfix CFDP' (#191) from bugfix-cfdp into v4.0.0-dev

    Reviewed-on: #191

commit 6182369e4f
Merge: d23c0c2 620360c
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Mon May 22 10:41:54 2023 +0200

    Merge pull request 'generic systemctl' (#193) from generic_systemctl into main

    Reviewed-on: #193
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit 620360c8e8
Merge: 49dde29 d23c0c2
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri May 19 11:02:35 2023 +0200

    Merge branch 'main' into generic_systemctl

commit 49dde29847
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Fri May 19 11:01:06 2023 +0200

    generic systemctl

commit d23c0c20fc
Merge: 280c724 ef1da1e
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Fri May 19 10:44:01 2023 +0200

    Merge pull request 'new MPSoC events and retvals' (#192) from mpsoc_new_events_retvals into main

    Reviewed-on: #192
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit ef1da1e882
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 17 19:00:17 2023 +0200

    changelog

commit 6ec0ce20fa
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 17 17:15:43 2023 +0200

    new event

commit 5f379bf2bb
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 16:43:40 2023 +0200

    changelog

commit 7c1e7226e0
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 16:42:56 2023 +0200

    bugfix CFDP: bump tmtccmd

commit b8e1c7afe9
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 15:20:56 2023 +0200

    new MPSoC events and retvals

commit 280c72439e
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 14:18:18 2023 +0200

    bugfix MPSoC command

commit 14c42a91ff
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Mon May 15 13:43:26 2023 +0200

    rework read and write prompts for MPSoC

commit dd3e4c649b
Merge: 3b16717 0c1bfc6
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Mon May 15 09:10:41 2023 +0200

    Merge pull request 'MPSoC flash content reporter' (#190) from mpsoc_action_reply_handler into main

    Reviewed-on: #190
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit 3b16717ce2
Merge: 377e98b f1a0334
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri May 12 16:27:39 2023 +0200

    Merge pull request 'fixfixfix' (#189) from ploc_pwr_switching_fix into main

    Reviewed-on: #189

commit f1a0334d3d
Merge: f090c3a 377e98b
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri May 12 16:27:33 2023 +0200

    Merge branch 'main' into ploc_pwr_switching_fix

commit 0c1bfc6fd3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 16:27:16 2023 +0200

    bump changelog

commit 04bbe057e7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 16:24:45 2023 +0200

    flash c ontent report works now

commit e05a54b076
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 16:08:57 2023 +0200

    somethings wrong with the format

commit ef0adef04a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 15:51:17 2023 +0200

    start adding action reply handler for MPSoC

commit 377e98b5c2
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 13:22:58 2023 +0200

    bugfix MPSoC HK parsing

commit 87e5abe8eb
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 12 11:51:47 2023 +0200

    add missing command list of PLOC MPSoC commands

commit f090c3af66
Author: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date:   Thu May 11 17:55:15 2023 +0200

    fixfixfix

commit 13fd9a7d84
Merge: 4d921e0 bbcc0f9
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Thu May 4 15:30:49 2023 +0200

    Merge pull request 'impl MPSoC HK parsing' (#188) from mpsoc_commands into main

    Reviewed-on: #188
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit bbcc0f9de7
Merge: a0aa652 1ab8710
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 15:17:12 2023 +0200

    Merge branch 'mpsoc_commands' of https://egit.irs.uni-stuttgart.de/eive/eive-tmtc into mpsoc_commands

commit a0aa6525e4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 15:17:00 2023 +0200

    fix

commit 1ab8710040
Merge: f480d86 4d921e0
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Thu May 4 14:51:13 2023 +0200

    Merge branch 'main' into mpsoc_commands

commit f480d86fbd
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 14:50:38 2023 +0200

    impl MPSoC HK parsing

commit 4d921e01af
Merge: e85d1a1 b505524
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Thu May 4 12:01:43 2023 +0200

    Merge pull request 'MPSoC module update' (#187) from mpsoc_commands into main

    Reviewed-on: #187
    Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>

commit b505524e0b
Merge: e0e9a31 e85d1a1
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Thu May 4 12:01:33 2023 +0200

    Merge branch 'main' into mpsoc_commands

commit e0e9a310b9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 11:51:50 2023 +0200

    add command to get flash dir content

commit 0e9ebefc87
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 4 11:27:12 2023 +0200

    new mpsoc commands

commit e85d1a1966
Merge: 60fba8b 4ff50b6
Author: Marius Eggert <eggertm@irs.uni-stuttgart.de>
Date:   Wed May 3 13:36:31 2023 +0200

    Merge pull request 'most important bugfix' (#186) from most-important-bugfix into main

    Reviewed-on: #186

commit 4ff50b6559
Author: meggert <eggertm@irs.uni-stuttgart.de>
Date:   Wed May 3 13:34:14 2023 +0200

    bub

commit 60fba8b6d9
Merge: 5fbd19b 1707f24
Author: Robin Müller <muellerr@irs.uni-stuttgart.de>
Date:   Fri Apr 28 10:25:35 2023 +0200

    Merge pull request 'more system modes' (#185) from more-system-modes into main

    Reviewed-on: #185

commit 1707f24612
Author: meggert <eggertm@irs.uni-stuttgart.de>
Date:   Wed Apr 19 15:10:44 2023 +0200

    more system modes

commit 5fbd19bb6c
Merge: 4083a30 0c6a967
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 17 18:41:08 2023 +0200

    Merge branch 'main' of https://egit.irs.uni-stuttgart.de/eive/eive-tmtc
2023-06-19 17:59:14 +02:00
5f44cb96be add back PL PCDU 1
Some checks failed
EIVE/-/pipeline/head There was a failure building this commit
2023-06-19 17:16:23 +02:00
96136106c7 add TMP1075 HK handling 2023-06-19 17:16:23 +02:00
65a2d40614 remove sw update, add fake test files 2023-06-19 17:16:23 +02:00
7e5539ee05 some better doc 2023-06-19 17:16:23 +02:00
698cdb3e1d clean up batt cmds a bit 2023-06-19 17:16:23 +02:00
91ea3669af added BPX manual heater commands 2023-06-19 17:16:23 +02:00
dcf1483c47 prep v4.1.0 2023-06-19 17:16:23 +02:00
0ad0dc391d add set cfg and rst cfg 2023-06-19 17:16:23 +02:00
774a291f8c fix broken IDs 2023-06-19 17:16:23 +02:00
f27333fa0d add heater cmd IDs 2023-06-19 17:16:23 +02:00
5083c9390c bump docker version 2023-06-19 17:16:23 +02:00
bb4cc59049 jenkins user in docker 2023-06-19 17:16:23 +02:00
23e38990a3 removed empty environment block in Jenkinsfile which Jenkins does not like
diva....
2023-06-19 17:16:23 +02:00
8bbd37cf76 switched to prebuilt docker image 2023-06-19 17:16:23 +02:00
95511e484e added basic automation file 2023-06-19 17:16:23 +02:00
276862fa6e add date in changelog 2023-06-19 17:16:19 +02:00
4a5c2cdd4f add release checklist 2023-06-19 17:16:05 +02:00
be09b3475d linter fixes, version bump 2023-06-19 17:16:00 +02:00
8927949c4b imtq parsing fixes 2023-06-19 17:15:30 +02:00
acc58ebef1 bump tmtccmd to v5.0.0rc0 2023-06-19 17:15:30 +02:00
7bc344755f changelog 2023-06-19 17:14:51 +02:00
bde17600af bugfix CFDP: bump tmtccmd 2023-06-19 17:14:30 +02:00
0b1aff220c moved 2 parameters 2023-06-19 17:14:08 +02:00
cfbff77da8 better exception handling 2023-06-19 17:14:08 +02:00
673af7f097 import replacement 2023-06-19 17:14:08 +02:00
6f5e70dce2 that should be all 2023-06-19 17:14:08 +02:00
9b337d3077 more stuff 2023-06-19 17:14:08 +02:00
b333ffe707 rework it 2023-06-19 17:14:08 +02:00
736c12a2f8 changelog 2023-06-19 17:14:03 +02:00
773cf59632 new event 2023-06-19 17:13:32 +02:00
a3d6fa36e9 new MPSoC events and retvals 2023-06-19 17:13:32 +02:00
4043e30d34 bugfix MPSoC command 2023-06-19 17:13:32 +02:00
0276d3dab4 rework read and write prompts for MPSoC 2023-06-19 17:13:32 +02:00
1c59ff41c1 bump changelog 2023-06-19 17:13:32 +02:00
1c1af2c7c7 flash c ontent report works now 2023-06-19 17:13:32 +02:00
d74c3fc241 somethings wrong with the format 2023-06-19 17:13:32 +02:00
2b26f1b106 start adding action reply handler for MPSoC 2023-06-19 17:13:32 +02:00
9e87142324 bugfix MPSoC HK parsing 2023-06-19 17:13:32 +02:00
5c903d5b02 add missing command list of PLOC MPSoC commands 2023-06-19 17:13:32 +02:00
92b0b4189c fixfixfix 2023-06-19 17:13:32 +02:00
8b99fbdc81 fix 2023-06-19 17:13:32 +02:00
74f090833e impl MPSoC HK parsing 2023-06-19 17:13:32 +02:00
a89ecbf6d7 add command to get flash dir content 2023-06-19 17:13:32 +02:00
5d17a1c2b3 new mpsoc commands 2023-06-19 17:13:32 +02:00
c7a7ca9f79 generic systemctl 2023-06-19 17:13:32 +02:00
3b34d70c23 bub 2023-06-19 17:13:32 +02:00
45bd838a13 more system modes 2023-06-19 17:13:32 +02:00
ba1bead5ad move add section 2023-06-19 17:13:19 +02:00
dbbd22960e Merge branch 'v3.1.2-patch' into HEAD 2023-06-19 17:12:34 +02:00
4603329cf7 bump patch revision 2023-06-19 17:11:14 +02:00
9374e9eaab update generated event file 2023-06-19 17:11:00 +02:00
b6a88ef08e changelog 2023-06-19 17:07:37 +02:00
fbe54e1a2b prep v3.1.2 patch 2023-06-19 17:06:49 +02:00
4083a3090f added event handler for reboot events 2023-04-17 18:40:27 +02:00
0c6a9677e1 bump patch revision 2023-04-17 11:43:43 +02:00
7eaf6557eb update generated event file 2023-04-17 11:34:56 +02:00
3bb0a08e95 bump tmtc to v3.1.0 2023-04-16 11:53:06 +02:00
d623e83be8 done 2023-04-16 02:56:14 +02:00
5a49c4a6ce that should do the job 2023-04-16 02:00:50 +02:00
bb463aa05c changelog 2023-04-15 23:12:57 +02:00
77e90328a1 some fixes 2023-04-15 21:53:11 +02:00
37bb164cc4 add missing return statement 2023-04-15 20:51:19 +02:00
bebde054f4 add new action commands 2023-04-15 20:51:08 +02:00
d00e4247f6 v3.0.0 2023-04-14 20:29:26 +02:00
a07f21329a Merge pull request 'strat' (#184) from acs-updt into main
Reviewed-on: #184
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2023-04-14 20:25:30 +02:00
4157b05288 Merge branch 'main' into acs-updt 2023-04-14 20:24:37 +02:00
e9b8d2658d strat 2023-04-14 20:24:21 +02:00
07ff920e99 re-run generators 2023-04-14 20:24:13 +02:00
1f06ea4590 re-generate files 2023-04-14 20:07:20 +02:00
63c584e061 Add new PDEC commands 2023-04-14 19:21:51 +02:00
183cd85907 update events.csv 2023-04-14 19:02:03 +02:00
f57342602d STR bugfixes 2023-04-14 17:42:09 +02:00
f8da9cff7c add to exposed commands 2023-04-14 00:28:40 +02:00
005e15b21b blocking and non-blocking shell cmd exec 2023-04-14 00:21:01 +02:00
8993ccdf66 this is missing 2023-04-14 00:08:28 +02:00
c9c0b3e6ff add new core commands 2023-04-14 00:06:22 +02:00
33fd280e51 extend STR fw update cmds 2023-04-13 12:08:00 +02:00
a5178e2bb0 add command to set preferred SD card 2023-04-12 18:51:38 +02:00
01b3a894e6 prep v2.22.1 2023-04-12 13:24:29 +02:00
f075d28905 Merge branch 'main' of https://egit.irs.uni-stuttgart.de/eive/eive-tmtc 2023-04-11 22:08:10 +02:00
83f6a22a75 bugfixes 2023-04-11 22:08:05 +02:00
a38bae16cd Merge pull request 'NONE CANNER' (#183) from kranz_none_because_i_can into main
lit
Reviewed-on: #183
2023-04-11 21:10:08 +02:00
53666bdeda NONE CANNER 2023-04-11 21:04:09 +02:00
00281fdc5e add TCS obj prompt 2023-04-11 20:43:39 +02:00
43b530cdb7 typo 2023-04-08 13:23:06 +02:00
92ce64cd39 update changelog 2023-04-08 11:40:06 +02:00
268c9e3f0b add prompts for custom file name 2023-04-08 11:39:41 +02:00
9edbdf1a8d bump minor version 2023-04-07 18:11:45 +02:00
004b561b7d new retvals 2023-04-07 17:43:10 +02:00
98a9601dd7 add command to test RW TM set retrieval 2023-04-07 17:01:30 +02:00
91a8a2e895 missing event definition 2023-04-07 11:06:24 +02:00
e503450dda re-run generators 2023-04-07 11:03:35 +02:00
ad08276079 add i2c reboot cmd 2023-04-06 22:25:38 +02:00
7e5fa2e61a add RW health cmds 2023-04-06 19:08:04 +02:00
dcf7d0af71 add SUS0/6 to obj prompt 2023-04-05 14:41:17 +02:00
50668ca7a7 fix for syrlinks on cmd 2023-04-04 17:48:39 +02:00
6975fae511 re-generate retvals 2023-04-04 13:36:21 +02:00
ce155e7629 prep v2.21.0 2023-04-04 13:29:43 +02:00
1fb50d84c6 Merge branch 'main' of https://egit.irs.uni-stuttgart.de/eive/eive-tmtc 2023-04-04 11:19:43 +02:00
71bc121deb Merge pull request 'Feature: 3V3 stack power switching' (#182) from feature_3v3_stack_switching into main
Reviewed-on: #182
2023-04-04 11:17:37 +02:00
0202c93252 add STR assy cmds 2023-04-04 01:24:33 +02:00
de1188c1bb Merge remote-tracking branch 'origin/main' into feature_3v3_stack_switching 2023-04-03 19:58:29 +02:00
5f87092465 add health cmd for gps health dev 2023-04-03 18:54:12 +02:00
fb7b273485 other small fix 2023-04-03 16:57:58 +02:00
8a69507d05 changelog 2023-04-03 16:57:05 +02:00
6c367aab32 add handling for 3v3 stack HK 2023-04-03 16:55:22 +02:00
f899d169b2 missing submode 2023-04-03 15:54:37 +02:00
2b2d920540 changelog 2023-04-03 15:54:16 +02:00
d7e1a69e75 add boot mode command for system 2023-04-03 15:53:51 +02:00
b72dad49a9 Merge pull request 'update events and retvals' (#170) from thermal_controller into main
Reviewed-on: #170
2023-04-03 15:12:04 +02:00
cef8d623c9 Merge remote-tracking branch 'origin/main' into thermal_controller 2023-04-01 15:59:56 +02:00
0f2daf94df update retvals 2023-04-01 15:27:09 +02:00
a49ab379af prep v2.20.1 2023-04-01 15:25:29 +02:00
bc85ccd8ef ACS CTRL fix for MEKF HK handling 2023-04-01 11:48:22 +02:00
523dd9b759 event 2023-03-31 19:17:56 +02:00
ce5ae8a713 Merge remote-tracking branch 'origin/main' into thermal_controller 2023-03-31 19:17:41 +02:00
5b613f98ee update and clean up star tracker commands 2023-03-31 18:43:02 +02:00
aab50dce5a add object IDs 2023-03-30 17:22:05 +02:00
c8282453f4 FDIR updates 2023-03-30 17:19:42 +02:00
1f491a72a3 add commands to set gps on or off 2023-03-30 15:12:33 +02:00
be7b3f54c7 re-gen events 2023-03-26 16:47:40 +02:00
7fe45d51dd Merge remote-tracking branch 'origin/main' into thermal_controller 2023-03-26 16:46:06 +02:00
536fd81bf8 Merge remote-tracking branch 'origin/main' into thermal_controller 2023-03-24 21:14:56 +01:00
e612e086ab Merge remote-tracking branch 'origin/main' into thermal_controller 2023-03-21 23:43:13 +01:00
7296344730 Merge remote-tracking branch 'origin/main' into thermal_controller 2023-03-21 14:18:20 +01:00
d3f9a83af8 Merge remote-tracking branch 'origin/main' into thermal_controller 2023-03-16 17:47:29 +01:00
a54e5a8e14 Merge remote-tracking branch 'origin/main' into thermal_controller 2023-03-14 18:50:22 +01:00
5e17ea9bf0 bump retval, ordered now 2023-03-14 15:34:06 +01:00
99d2c0e0ca update events/retvals again 2023-03-14 14:25:21 +01:00
98617b5ce5 update events and retvals 2023-03-14 14:16:44 +01:00
94 changed files with 3490 additions and 1434 deletions

17
.flake8
View File

@ -1,17 +0,0 @@
[flake8]
max-line-length = 100
ignore = D203, W503
per-file-ignores =
*/__init__.py: F401
exclude =
.git,
__pycache__,
docs/conf.py,
old,
build,
dist,
venv
max-complexity = 10
extend-ignore =
# See https://github.com/PyCQA/pycodestyle/issues/373
E203,

View File

@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="CFDP Downlink Test Large" type="PythonConfigurationType" factoryName="Python" folderName="CFDP">
<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$/tmtcc.py" />
<option name="PARAMETERS" value="cfdp -p /tmp/obsw_update.bin /tmp/obsw_update_copy.bin -d 0.1" />
<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>

View File

@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="CFDP Downlink Test Larger" type="PythonConfigurationType" factoryName="Python" folderName="CFDP">
<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$/tmtcc.py" />
<option name="PARAMETERS" value="cfdp -p /tmp/fake_5kb.bin /tmp/fake_5kb_copy.bin -d 0.1" />
<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>

View File

@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="CFDP Downlink Test" type="PythonConfigurationType" factoryName="Python" folderName="CFDP">
<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$/tmtcc.py" />
<option name="PARAMETERS" value="cfdp -p /tmp/hello.txt /tmp/hello2.txt -d 0.1" />
<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>

View File

@ -10,6 +10,200 @@ list yields a list of all related PRs for each release.
# [unreleased]
# [v5.8.0] 2023-10-11
## Added
- Xiphos WDT enable and disable command.
# [v5.7.1] 2023-10-11
## Added
- SCEX normal command
# [v5.7.0] 2023-10-10
- `tmtccmd` v6.0.0
- `spacepackets` v18.0.0
## Added
- Power controller commands.
# [v5.6.0] 2023-09-14
- `tmtccmd` v6.0.0
- `spacepackets` v18.0.0
## Added
- CFDP file downlink support.
# [v5.5.1] 2023-09-12
## Fixed
- Some API usage fixes related to `tmtccmd` update.
# [v5.5.0] 2023-09-12
- Version is not specfied dynamically anymore and can be updated in `pyproject.toml`
- New events and returnvalues
- Bump `tmtccmd` to v6.0.0rc0
# [v5.4.3] 2023-08-15
## Added
- PLOC SUPV HK parsing.
# [v5.4.2] 2023-08-15
## Added
- New NONE entry for PL PCDU submode enum.
# [v5.4.1] 2023-08-15
## Added
- New event TLE_TOO_OLD
## Changed
- PL Subsystem mode ID is int enum now.
# [v5.4.0] 2023-08-15
## Added
- New enumeration for PL PCDU commanding.
- Some new events
# [v5.3.1] 2023-07-26
## Changed
- Adaptions for ACS CTRL strategy enum to make it compatible to software. Also make it re-usable
by putting it in global scope.
# [v5.3.0] 2023-07-26
## Added
- Dataset handling for new ACS fused rot rate dataset.
# [v5.2.0] 2023-07-13
- `tmtccmd` v5.0.0
## Added
- New TCS controller events
## Changed
- HK level can be specified as CLI argument now.
# [v5.1.0] 2023-06-28
## Added
- Internal error reporter dataset handling.
## Fixed
- `APP_LOGGER` is the root logger now.
## Changed
- HK is only displayed in brief format per default now. This will soon be adaptable by CLI
argument.
# [v5.0.0] 2023-06-22
## Changed
- Force flag for copy helper.
# [v4.1.0] 2023-06-14
## Added
- Some BPX battery commands
# [v4.0.0] 2023-06-10
`tmtccmd` version: v5.0.0rc0
## Added
- Event handling for reboot counter events.
- Start adding new MPSoC commands, improve MPSoC commanding module a bit.
- Handling for PLOC MPSoC flash content report.
## Fixed
- Fix for PLOC power switching.
- Bump `tmtccmd` to v5.0.0rc0 for important bugfix in CFDP header.
# [v3.1.2] 2023-06-19
## Fixed
- Pin `tmtccmd` to v4.1.3 to enforce correct `spacepackets` version on install
# [v3.1.1] 2023-04-17
## Added
- Update generated event file.
# [v3.1.0] 2023-04-16
## Added
- New core controller file system helper commands.
# [v3.0.0] 2023-04-14
## Fixed
- Bugfix for STR solution set format.
- Update for STR commands.
## Added
- Added core commands to execute `systemctl` commands and to execute arbitrary Linux commands.
# [v2.22.1] 2023-04-12
## Added
- Prompts to specify custom filename for OBSW update
# [v2.22.0] 2023-04-07
- Various smaller and helper commands added for tests
- Update generated files
# [v2.21.0] 2023-04-04
## Added
- Add boot mode command for EIVE system.
## Changed
- PCDU switcher set now includes the 3V3 stack switcher state.
# [v2.20.1] 2023-04-01
## Fixed
- MEKF: Handle NOT_FINITE status (key 5)
# [v2.20.0] 2023-03-28
## Changed

View File

@ -4,7 +4,7 @@ This application can be used to test the EIVE On-Board Software. Furthermore, it
also be used to retrieve all sorts of telemetry data like housekeeping data.
It is recommended to use this application with a virtual environment.
The [virtual environemnt](#venv) chapter describes how to set one up. The [requirements](#reqs)
The [virtual environment](#venv) chapter describes how to set one up. The [requirements](#reqs)
describes how to install all required packages.
The configuration file can currently be found at `tmtc_conf.json`. It caches settings
@ -61,42 +61,57 @@ Run GUI mode
# <a id="reqs"></a> Install requirements
There are two ways to install the requirements. One is to install the primary dependency
`tmtccmd` interactively. This is the recommended way
`tmtccmd` interactively.
Assuming you are running in a virtual environment:
## Installing via PyPI
1. Install `tmtccmd` for virtual environment. `-e` for interactive installation.
It is recommended to install `eive-tmtc` itself interactively, which also installs
all required dependencies.
```sh
cd deps/tmtccmd
pip install -e .[gui]
```
```sh
pip install -e .
```
Alternatively you can also install the packages from PyPI completely, but the risk of
incompatibilities will be high there
If you only want to install all dependencies:
```sh
pip install -r requirements.txt
```
## Install interactively
Clone the dependency first inside the `deps` folder
```sh
cd deps
./install_tmtccmd.sh
```
Then you can install `tmtccmd` interactively
```sh
cd tmtccmd
pip install -e .
```
# Run Linter
Can be used to quickly check validity of script. Install `flake8` first
```sh
python3 -m pip install flake8
python3 -m pip install ruff
```
or on Windows
```sh
py -m pip install flake8
py -m pip install ruff
```
and then run the `lint.py` script
and then run it
```sh
./lint.py
ruff .
```
# Run Auto-Formatter

9
automation/Dockerfile Normal file
View File

@ -0,0 +1,9 @@
FROM python:3
RUN apt-get update
RUN apt-get --yes upgrade
#tzdata is a dependency, won't install otherwise
ARG DEBIAN_FRONTEND=noninteractive
#pip needs a valid user to work
RUN adduser --uid 114 jenkins

14
automation/Jenkinsfile vendored Normal file
View File

@ -0,0 +1,14 @@
pipeline {
agent {
docker {
image 'eive-tmtc-ci:d2'
}
}
stages {
stage('Package') {
steps {
sh 'pip install .'
}
}
}
}

View File

@ -1,14 +1,7 @@
__version__ = "2.20.0"
import logging
from pathlib import Path
SW_NAME = "eive-tmtc"
VERSION_MAJOR = 2
VERSION_MINOR = 20
VERSION_REVISION = 0
EIVE_TMTC_ROOT = Path(__file__).parent
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
APP_LOGGER = logging.getLogger(__name__)
APP_LOGGER = logging.getLogger()

View File

View File

@ -0,0 +1,20 @@
import logging
from spacepackets.cfdp import ConditionCode
from tmtccmd.cfdp.mib import DefaultFaultHandlerBase
_LOGGER = logging.getLogger(__name__)
class EiveCfdpFaultHandler(DefaultFaultHandlerBase):
def notice_of_suspension_cb(self, cond: ConditionCode):
_LOGGER.info(f"Received notice of suspension: {cond!r}")
def notice_of_cancellation_cb(self, cond: ConditionCode):
_LOGGER.info(f"Received notice of cancellation: {cond!r}")
def abandoned_cb(self, cond: ConditionCode):
_LOGGER.info(f"Abandoned transaction: {cond!r}")
def ignore_cb(self, cond: ConditionCode):
_LOGGER.info(f"Ignored transaction: {cond!r}")

27
eive_tmtc/cfdp/tm.py Normal file
View File

@ -0,0 +1,27 @@
import logging
from eive_tmtc.config.definitions import CFDP_APID
from spacepackets.ccsds import SPACE_PACKET_HEADER_SIZE
from spacepackets.cfdp import PduFactory, PduType, DirectiveType
from tmtccmd.cfdp.handler import CfdpInCcsdsHandler
from tmtccmd.tm import SpecificApidHandlerBase
_LOGGER = logging.getLogger(__name__)
class CfdpInCcsdsWrapper(SpecificApidHandlerBase):
def __init__(self, cfdp_in_ccsds_handler: CfdpInCcsdsHandler):
super().__init__(CFDP_APID, None)
self.handler = cfdp_in_ccsds_handler
def handle_tm(self, packet: bytes, _user_args: any):
# Ignore the space packet header. Its only purpose is to use the same protocol and
# have a seaprate APID for space packets. If this function is called, the APID is correct.
pdu = packet[SPACE_PACKET_HEADER_SIZE:]
pdu_base = PduFactory.from_raw(pdu)
if pdu_base.pdu_type == PduType.FILE_DATA:
_LOGGER.info("Received File Data PDU")
else:
directive_type = DirectiveType(pdu_base.directive_type)
_LOGGER.info(f"Received File Directive PDU with type {directive_type!r}")
self.handler.insert_pdu_packet(pdu_base)

58
eive_tmtc/cfdp/user.py Normal file
View File

@ -0,0 +1,58 @@
import logging
from spacepackets.cfdp import ConditionCode
from tmtccmd.cfdp import CfdpUserBase, TransactionId
from tmtccmd.cfdp.user import (
TransactionFinishedParams,
MetadataRecvParams,
FileSegmentRecvdParams,
)
_LOGGER = logging.getLogger(__name__)
class EiveCfdpUser(CfdpUserBase):
def transaction_indication(self, transaction_id: TransactionId):
_LOGGER.info(f"CFDP User: Start of File {transaction_id}")
def eof_sent_indication(self, transaction_id: TransactionId):
_LOGGER.info(f"CFDP User: EOF sent for {transaction_id}")
def transaction_finished_indication(self, params: TransactionFinishedParams):
_LOGGER.info(f"CFDP User: {params.transaction_id} finished")
_LOGGER.info(f"Delivery Code: {params.delivery_code!r}")
_LOGGER.info(f"Condition code: {params.condition_code!r}")
_LOGGER.info(f"File delivery status: {params.delivery_code!r}")
def metadata_recv_indication(self, params: MetadataRecvParams):
pass
def file_segment_recv_indication(self, params: FileSegmentRecvdParams):
_LOGGER.info(
f"CFDP User: Received File Data PDU for {params.transaction_id} | Offset:"
f" {params.offset} | Segment Length: {params.length}"
)
def report_indication(self, transaction_id: TransactionId, status_report: any):
pass
def suspended_indication(
self, transaction_id: TransactionId, cond_code: ConditionCode
):
pass
def resumed_indication(self, transaction_id: TransactionId, progress: int):
pass
def fault_indication(
self, transaction_id: TransactionId, cond_code: ConditionCode, progress: int
):
pass
def abandoned_indication(
self, transaction_id: TransactionId, cond_code: ConditionCode, progress: int
):
pass
def eof_recv_indication(self, transaction_id: TransactionId):
_LOGGER.info(f"CFDP User: EOF received for {transaction_id}")

View File

@ -9,7 +9,6 @@ import enum
from spacepackets import PacketType
from spacepackets.ccsds import PacketId
from spacepackets.util import UnsignedByteField
from pathlib import Path
PUS_APID = 0x65
@ -66,13 +65,17 @@ class CustomServiceList(str, enum.Enum):
PL_SS = "pl_subsystem"
ACS_BRD_ASS = "acs_brd_ass"
SUS_BRD_ASS = "sus_brd_ass"
TCS = "tcs"
TCS_SS = "tcs_subsystem"
TCS_CTRL = "tcs_ctrl"
TCS_ASS = "tcs_ass"
TIME = "time"
PROCEDURE = "proc"
RTD = "rtd"
TMP1075 = "tcs_tmp"
TMP1075 = "tmp1075"
TVTTESTPROCEDURE = "tvtestproc"
SCEX = "scex"
TM_STORE = "tm_store"
SYSTEM = "system"
PWR_CTRL = "pwr_ctrl"
EPS_SS = "eps_subsystem"
XIPHOS_WDT = "xiphos_wdt"

View File

@ -86,23 +86,30 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
10802;0x2a32;SERIALIZATION_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
10803;0x2a33;FILESTORE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acs/defs.h
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acs/defs.h
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acs/defs.h
11203;0x2bc3;MEKF_INVALID_INFO;INFO;No description;mission/acs/defs.h
11204;0x2bc4;MEKF_RECOVERY;INFO;No description;mission/acs/defs.h
11205;0x2bc5;MEKF_INVALID_MODE_VIOLATION;HIGH;No description;mission/acs/defs.h
11206;0x2bc6;SAFE_MODE_CONTROLLER_FAILURE;HIGH;No description;mission/acs/defs.h
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acs/defs.h
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;The system has recovered from a safe rate rotation violation.;mission/acs/defs.h
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained.;mission/acs/defs.h
11203;0x2bc3;MEKF_INVALID_INFO;INFO;MEKF was not able to compute a solution. P1: MEKF state on exit;mission/acs/defs.h
11204;0x2bc4;MEKF_RECOVERY;INFO;MEKF is able to compute a solution again.;mission/acs/defs.h
11205;0x2bc5;MEKF_AUTOMATIC_RESET;INFO;MEKF performed an automatic reset after detection of nonfinite values.;mission/acs/defs.h
11206;0x2bc6;MEKF_INVALID_MODE_VIOLATION;HIGH;MEKF was not able to compute a solution during any pointing ACS mode for a prolonged time.;mission/acs/defs.h
11207;0x2bc7;SAFE_MODE_CONTROLLER_FAILURE;HIGH;The ACS safe mode controller was not able to compute a solution and has failed. P1: Missing information about magnetic field, P2: Missing information about rotational rate;mission/acs/defs.h
11208;0x2bc8;TLE_TOO_OLD;INFO;The TLE for the SGP4 Propagator has become too old.;mission/acs/defs.h
11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/power/defs.h
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/power/defs.h
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/power/defs.h
11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;No description;mission/power/defs.h
11304;0x2c28;DATASET_READ_FAILED;INFO;The dataset read for the inputs of the Power Controller has failed.;mission/power/defs.h
11305;0x2c29;VOLTAGE_OUT_OF_BOUNDS;HIGH;No description;mission/power/defs.h
11306;0x2c2a;TIMEDELTA_OUT_OF_BOUNDS;LOW;Time difference for Coulomb Counter was too large. P1: time in s * 10;mission/power/defs.h
11307;0x2c2b;POWER_LEVEL_LOW;HIGH;The State of Charge is below the limit for payload use. Setting Payload to faulty.;mission/power/defs.h
11308;0x2c2c;POWER_LEVEL_CRITICAL;HIGH;The State of Charge is below the limit for higher modes. Setting Reaction Wheels to faulty.;mission/power/defs.h
11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;No description;mission/tcs/HeaterHandler.h
11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;No description;mission/tcs/HeaterHandler.h
11402;0x2c8a;HEATER_WENT_ON;INFO;No description;mission/tcs/HeaterHandler.h
11403;0x2c8b;HEATER_WENT_OFF;INFO;No description;mission/tcs/HeaterHandler.h
11404;0x2c8c;SWITCH_ALREADY_ON;LOW;No description;mission/tcs/HeaterHandler.h
11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;No description;mission/tcs/HeaterHandler.h
11404;0x2c8c;SWITCH_ALREADY_ON;INFO;No description;mission/tcs/HeaterHandler.h
11405;0x2c8d;SWITCH_ALREADY_OFF;INFO;No description;mission/tcs/HeaterHandler.h
11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;No description;mission/tcs/HeaterHandler.h
11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;No description;mission/tcs/HeaterHandler.h
11500;0x2cec;BURN_PHASE_START;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/SolarArrayDeploymentHandler.h
@ -120,6 +127,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/PlocMpsocHandler.h
11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHandler.h
11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/payload/PlocMpsocHandler.h
11607;0x2d57;SUPV_NOT_ON;LOW;SUPV not on for boot or shutdown process. P1: 0 for OFF transition, 1 for ON transition.;linux/payload/PlocMpsocHandler.h
11608;0x2d58;SUPV_REPLY_TIMEOUT;LOW;No description;linux/payload/PlocMpsocHandler.h
11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h
@ -132,6 +141,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
11802;0x2e1a;RESET_OCCURED;LOW;No description;mission/acs/rwHelpers.h
11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;mission/acs/str/StarTrackerHandler.h
11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;mission/acs/str/StarTrackerHandler.h
11903;0x2e7f;COM_ERROR_REPLY_RECEIVED;LOW;Received COM error. P1: Communication Error ID (datasheet p32);mission/acs/str/StarTrackerHandler.h
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/PlocSupervisorHandler.h
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/PlocSupervisorHandler.h
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/PlocSupervisorHandler.h
@ -145,17 +155,21 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/payload/PlocMemoryDumper.h
12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/payload/PlocMemoryDumper.h
12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/payload/PlocMemoryDumper.h
12401;0x3071;INVALID_TC_FRAME;HIGH;No description;linux/ipcore/PdecHandler.h
12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/ipcore/PdecHandler.h
12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/ipcore/PdecHandler.h
12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/ipcore/PdecHandler.h
12405;0x3075;LOST_CARRIER_LOCK_PDEC;INFO;Lost carrier lock;linux/ipcore/PdecHandler.h
12406;0x3076;LOST_BIT_LOCK_PDEC;INFO;Lost bit lock;linux/ipcore/PdecHandler.h
12407;0x3077;TOO_MANY_IRQS;MEDIUM;Too many IRQs over the time window of one second. P1: Allowed TCs;linux/ipcore/PdecHandler.h
12408;0x3078;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/PdecHandler.h
12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;HIGH;No description;linux/ipcore/PdecHandler.h
12410;0x307a;PDEC_RESET_FAILED;HIGH;Failed to pull PDEC reset to low;linux/ipcore/PdecHandler.h
12411;0x307b;OPEN_IRQ_FILE_FAILED;HIGH;Failed to open the IRQ uio file;linux/ipcore/PdecHandler.h
12401;0x3071;INVALID_TC_FRAME;HIGH;No description;linux/ipcore/pdec.h
12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/ipcore/pdec.h
12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/ipcore/pdec.h
12404;0x3074;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/ipcore/pdec.h
12405;0x3075;LOST_CARRIER_LOCK_PDEC;INFO;Lost carrier lock;linux/ipcore/pdec.h
12406;0x3076;LOST_BIT_LOCK_PDEC;INFO;Lost bit lock;linux/ipcore/pdec.h
12407;0x3077;TOO_MANY_IRQS;MEDIUM;Too many IRQs over the time window of one second. P1: Allowed TCs;linux/ipcore/pdec.h
12408;0x3078;POLL_SYSCALL_ERROR_PDEC;MEDIUM;No description;linux/ipcore/pdec.h
12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;HIGH;No description;linux/ipcore/pdec.h
12410;0x307a;PDEC_TRYING_RESET_WITH_INIT;LOW;Trying a PDEC reset with complete re-initialization;linux/ipcore/pdec.h
12411;0x307b;PDEC_TRYING_RESET_NO_INIT;LOW;Trying a PDEC reset without re-initialization.;linux/ipcore/pdec.h
12412;0x307c;PDEC_RESET_FAILED;HIGH;Failed to pull PDEC reset to low;linux/ipcore/pdec.h
12413;0x307d;OPEN_IRQ_FILE_FAILED;HIGH;Failed to open the IRQ uio file;linux/ipcore/pdec.h
12414;0x307e;PDEC_INIT_FAILED;HIGH;PDEC initialization failed. This might also be due to the persistent confiuration never becoming available, for example due to SD card issues.;linux/ipcore/pdec.h
12415;0x307f;PDEC_CONFIG_CORRUPTED;HIGH;The PDEC configuration area has been corrupted P1: The first configuration word P2: The second configuration word;linux/ipcore/pdec.h
12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/acs/StrComHandler.h
12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/acs/StrComHandler.h
12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/acs/StrComHandler.h
@ -173,20 +187,24 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
12515;0x30e3;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/acs/StrComHandler.h
12516;0x30e4;STR_HELPER_SENDING_PACKET_FAILED;LOW;No description;linux/acs/StrComHandler.h
12517;0x30e5;STR_HELPER_REQUESTING_MSG_FAILED;LOW;No description;linux/acs/StrComHandler.h
12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/payload/PlocMpsocHelper.h
12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/payload/PlocMpsocHelper.h
12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;No description;linux/payload/PlocMpsocHelper.h
12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h
12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h
12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h
12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h
12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h
12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h
12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h
12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h
12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHelper.h
12612;0x3144;MPSOC_TM_SIZE_ERROR;LOW;No description;linux/payload/PlocMpsocHelper.h
12613;0x3145;MPSOC_TM_CRC_MISSMATCH;LOW;No description;linux/payload/PlocMpsocHelper.h
12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/payload/PlocMpsocSpecialComHelper.h
12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;INFO;Flash write successful;linux/payload/PlocMpsocSpecialComHelper.h
12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;No description;linux/payload/PlocMpsocSpecialComHelper.h
12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/payload/PlocMpsocSpecialComHelper.h
12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/payload/PlocMpsocSpecialComHelper.h
12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocMpsocSpecialComHelper.h
12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocMpsocSpecialComHelper.h
12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/payload/PlocMpsocSpecialComHelper.h
12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/payload/PlocMpsocSpecialComHelper.h
12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/payload/PlocMpsocSpecialComHelper.h
12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/payload/PlocMpsocSpecialComHelper.h
12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocSpecialComHelper.h
12612;0x3144;MPSOC_TM_SIZE_ERROR;LOW;No description;linux/payload/PlocMpsocSpecialComHelper.h
12613;0x3145;MPSOC_TM_CRC_MISSMATCH;LOW;No description;linux/payload/PlocMpsocSpecialComHelper.h
12614;0x3146;MPSOC_FLASH_READ_PACKET_ERROR;LOW;No description;linux/payload/PlocMpsocSpecialComHelper.h
12615;0x3147;MPSOC_FLASH_READ_FAILED;LOW;No description;linux/payload/PlocMpsocSpecialComHelper.h
12616;0x3148;MPSOC_FLASH_READ_SUCCESSFUL;INFO;No description;linux/payload/PlocMpsocSpecialComHelper.h
12617;0x3149;MPSOC_READ_TIMEOUT;LOW;No description;linux/payload/PlocMpsocSpecialComHelper.h
12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/payload/PayloadPcduHandler.h
12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
@ -203,11 +221,12 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/acs/AcsBoardAssembly.h
12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/AcsBoardAssembly.h
12803;0x3203;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/acs/AcsBoardAssembly.h
12804;0x3204;DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY;MEDIUM;This is triggered when the assembly would have normally switched the board side, but the GPS device of the other side was marked faulty. P1: Current submode.;mission/system/acs/AcsBoardAssembly.h
12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/acs/SusAssembly.h
12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/acs/SusAssembly.h
12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/SusAssembly.h
12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/acs/SusAssembly.h
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/objects/TcsBoardAssembly.h
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/tcs/TcsBoardAssembly.h
13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/acs/archive/GPSDefinitions.h
13101;0x332d;CANT_GET_FIX;LOW;Could not get fix in maximum allowed time. P1: Maximum allowed time to get a fix after the GPS was switched on.;mission/acs/archive/GPSDefinitions.h
13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h
@ -245,28 +264,37 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h
13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h
13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h
13803;0x35eb;FS_UNUSABLE;LOW;No description;mission/payload/scexHelpers.h
13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
13904;0x3650;WRITE_CONFIGFILE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
13905;0x3651;READ_CONFIGFILE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h
14000;0x36b0;ALLOC_FAILURE;MEDIUM;No description;bsp_q7s/core/CoreController.h
14001;0x36b1;REBOOT_SW;LOW; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
14002;0x36b2;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s/core/CoreController.h
14003;0x36b3;REBOOT_HW;MEDIUM;No description;bsp_q7s/core/CoreController.h
14004;0x36b4;NO_SD_CARD_ACTIVE;HIGH;No SD card was active. Core controller will attempt to re-initialize a SD card.;bsp_q7s/core/CoreController.h
14005;0x36b5;VERSION_INFO;INFO;P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;bsp_q7s/core/CoreController.h
14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;bsp_q7s/core/CoreController.h
14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;bsp_q7s/core/CoreController.h
14010;0x36ba;I2C_UNAVAILABLE_REBOOT;MEDIUM;No description;bsp_q7s/core/CoreController.h
14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/ThermalController.h
14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/ThermalController.h
14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
14103;0x3717;PLOC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
14104;0x3718;OBC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
14105;0x3719;HPA_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
14106;0x371a;PLPCDU_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h
14000;0x36b0;ALLOC_FAILURE;MEDIUM;No description;mission/sysDefs.h
14001;0x36b1;REBOOT_SW;LOW; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;mission/sysDefs.h
14002;0x36b2;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;mission/sysDefs.h
14003;0x36b3;REBOOT_HW;MEDIUM;No description;mission/sysDefs.h
14004;0x36b4;NO_SD_CARD_ACTIVE;HIGH;No SD card was active. Core controller will attempt to re-initialize a SD card.;mission/sysDefs.h
14005;0x36b5;VERSION_INFO;INFO;P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;mission/sysDefs.h
14006;0x36b6;CURRENT_IMAGE_INFO;INFO;P1: Current Chip, P2: Current Copy;mission/sysDefs.h
14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;mission/sysDefs.h
14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;mission/sysDefs.h
14010;0x36ba;TRYING_I2C_RECOVERY;HIGH;I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C devices.;mission/sysDefs.h
14011;0x36bb;I2C_REBOOT;HIGH;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h
14012;0x36bc;PDEC_REBOOT;HIGH;PDEC recovery through reset was not possible, performing full reboot.;mission/sysDefs.h
14013;0x36bd;FIRMWARE_INFO;INFO;Version information of the firmware (not OBSW). P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;mission/sysDefs.h
14014;0x36be;ACTIVE_SD_INFO;INFO;Active SD card info. SD States: 0: OFF, 1: ON, 2: MOUNTED. P1: Active SD Card Index, 0 if none is active P2: First two bytes: SD state of SD card 0, last two bytes SD state of SD card 1;mission/sysDefs.h
14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h
14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h
14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
14104;0x3718;OBC_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
14105;0x3719;CAMERA_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
14106;0x371a;PCDU_SYSTEM_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
14107;0x371b;HEATER_NOT_OFF_FOR_OFF_MODE;MEDIUM;No description;mission/controller/tcsDefs.h
14108;0x371c;MGT_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
14109;0x371d;TCS_SWITCHING_HEATER_ON;INFO;P1: Module index. P2: Heater index;mission/controller/tcsDefs.h
14110;0x371e;TCS_SWITCHING_HEATER_OFF;INFO;P1: Module index. P2: Heater index;mission/controller/tcsDefs.h
14111;0x371f;TCS_HEATER_MAX_BURN_TIME_REACHED;MEDIUM;P1: Heater index. P2: Maximum burn time for heater.;mission/controller/tcsDefs.h
14201;0x3779;TX_TIMER_EXPIRED;INFO;The transmit timer to protect the Syrlinks expired P1: The current timer value;mission/system/com/ComSubsystem.h
14202;0x377a;BIT_LOCK_TX_ON;INFO;Transmitter will be turned on due to detection of bitlock;mission/system/com/ComSubsystem.h
14300;0x37dc;POSSIBLE_FILE_CORRUPTION;LOW;P1: Result code of TM packet parser. P2: Timestamp of possibly corrupt file as a unix timestamp.;mission/persistentTmStoreDefs.h
@ -282,3 +310,5 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
14312;0x37e8;DUMP_MISC_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
14313;0x37e9;DUMP_HK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
14314;0x37ea;DUMP_CFDP_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
14500;0x38a4;TEMPERATURE_ALL_ONES_START;MEDIUM;Detected invalid values, starting invalid message counting;mission/acs/SusHandler.h
14501;0x38a5;TEMPERATURE_ALL_ONES_RECOVERY;INFO;Detected valid values again, resetting invalid message counter. P1: Invalid message counter.;mission/acs/SusHandler.h

1 Event ID (dec) Event ID (hex) Name Severity Description File Path
86 10802 0x2a32 SERIALIZATION_ERROR LOW No description fsfw/src/fsfw/cfdp/handler/defs.h
87 10803 0x2a33 FILESTORE_ERROR LOW No description fsfw/src/fsfw/cfdp/handler/defs.h
88 10804 0x2a34 FILENAME_TOO_LARGE_ERROR LOW P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name fsfw/src/fsfw/cfdp/handler/defs.h
89 11200 0x2bc0 SAFE_RATE_VIOLATION MEDIUM No description The limits for the rotation in safe mode were violated. mission/acs/defs.h
90 11201 0x2bc1 SAFE_RATE_RECOVERY MEDIUM No description The system has recovered from a safe rate rotation violation. mission/acs/defs.h
91 11202 0x2bc2 MULTIPLE_RW_INVALID HIGH No description Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained. mission/acs/defs.h
92 11203 0x2bc3 MEKF_INVALID_INFO INFO No description MEKF was not able to compute a solution. P1: MEKF state on exit mission/acs/defs.h
93 11204 0x2bc4 MEKF_RECOVERY INFO No description MEKF is able to compute a solution again. mission/acs/defs.h
94 11205 0x2bc5 MEKF_INVALID_MODE_VIOLATION MEKF_AUTOMATIC_RESET HIGH INFO No description MEKF performed an automatic reset after detection of nonfinite values. mission/acs/defs.h
95 11206 0x2bc6 SAFE_MODE_CONTROLLER_FAILURE MEKF_INVALID_MODE_VIOLATION HIGH No description MEKF was not able to compute a solution during any pointing ACS mode for a prolonged time. mission/acs/defs.h
96 11207 0x2bc7 SAFE_MODE_CONTROLLER_FAILURE HIGH The ACS safe mode controller was not able to compute a solution and has failed. P1: Missing information about magnetic field, P2: Missing information about rotational rate mission/acs/defs.h
97 11208 0x2bc8 TLE_TOO_OLD INFO The TLE for the SGP4 Propagator has become too old. mission/acs/defs.h
98 11300 0x2c24 SWITCH_CMD_SENT INFO Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index mission/power/defs.h
99 11301 0x2c25 SWITCH_HAS_CHANGED INFO Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index mission/power/defs.h
100 11302 0x2c26 SWITCHING_Q7S_DENIED MEDIUM No description mission/power/defs.h
101 11303 0x2c27 FDIR_REACTION_IGNORED MEDIUM No description mission/power/defs.h
102 11304 0x2c28 DATASET_READ_FAILED INFO The dataset read for the inputs of the Power Controller has failed. mission/power/defs.h
103 11305 0x2c29 VOLTAGE_OUT_OF_BOUNDS HIGH No description mission/power/defs.h
104 11306 0x2c2a TIMEDELTA_OUT_OF_BOUNDS LOW Time difference for Coulomb Counter was too large. P1: time in s * 10 mission/power/defs.h
105 11307 0x2c2b POWER_LEVEL_LOW HIGH The State of Charge is below the limit for payload use. Setting Payload to faulty. mission/power/defs.h
106 11308 0x2c2c POWER_LEVEL_CRITICAL HIGH The State of Charge is below the limit for higher modes. Setting Reaction Wheels to faulty. mission/power/defs.h
107 11400 0x2c88 GPIO_PULL_HIGH_FAILED LOW No description mission/tcs/HeaterHandler.h
108 11401 0x2c89 GPIO_PULL_LOW_FAILED LOW No description mission/tcs/HeaterHandler.h
109 11402 0x2c8a HEATER_WENT_ON INFO No description mission/tcs/HeaterHandler.h
110 11403 0x2c8b HEATER_WENT_OFF INFO No description mission/tcs/HeaterHandler.h
111 11404 0x2c8c SWITCH_ALREADY_ON LOW INFO No description mission/tcs/HeaterHandler.h
112 11405 0x2c8d SWITCH_ALREADY_OFF LOW INFO No description mission/tcs/HeaterHandler.h
113 11406 0x2c8e MAIN_SWITCH_TIMEOUT MEDIUM No description mission/tcs/HeaterHandler.h
114 11407 0x2c8f FAULTY_HEATER_WAS_ON LOW No description mission/tcs/HeaterHandler.h
115 11500 0x2cec BURN_PHASE_START INFO P1: Burn duration in milliseconds, P2: Dry run flag mission/SolarArrayDeploymentHandler.h
127 11604 0x2d54 MPSOC_HANDLER_CRC_FAILURE LOW PLOC reply has invalid crc linux/payload/PlocMpsocHandler.h
128 11605 0x2d55 MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH LOW Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count linux/payload/PlocMpsocHandler.h
129 11606 0x2d56 MPSOC_SHUTDOWN_FAILED HIGH Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor. linux/payload/PlocMpsocHandler.h
130 11607 0x2d57 SUPV_NOT_ON LOW SUPV not on for boot or shutdown process. P1: 0 for OFF transition, 1 for ON transition. linux/payload/PlocMpsocHandler.h
131 11608 0x2d58 SUPV_REPLY_TIMEOUT LOW No description linux/payload/PlocMpsocHandler.h
132 11701 0x2db5 SELF_TEST_I2C_FAILURE LOW Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA mission/acs/ImtqHandler.h
133 11702 0x2db6 SELF_TEST_SPI_FAILURE LOW Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA mission/acs/ImtqHandler.h
134 11703 0x2db7 SELF_TEST_ADC_FAILURE LOW Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA mission/acs/ImtqHandler.h
141 11802 0x2e1a RESET_OCCURED LOW No description mission/acs/rwHelpers.h
142 11901 0x2e7d BOOTING_FIRMWARE_FAILED_EVENT LOW Failed to boot firmware mission/acs/str/StarTrackerHandler.h
143 11902 0x2e7e BOOTING_BOOTLOADER_FAILED_EVENT LOW Failed to boot star tracker into bootloader mode mission/acs/str/StarTrackerHandler.h
144 11903 0x2e7f COM_ERROR_REPLY_RECEIVED LOW Received COM error. P1: Communication Error ID (datasheet p32) mission/acs/str/StarTrackerHandler.h
145 12001 0x2ee1 SUPV_MEMORY_READ_RPT_CRC_FAILURE LOW PLOC supervisor crc failure in telemetry packet linux/payload/PlocSupervisorHandler.h
146 12002 0x2ee2 SUPV_UNKNOWN_TM LOW Unhandled event. P1: APID, P2: Service ID linux/payload/PlocSupervisorHandler.h
147 12003 0x2ee3 SUPV_UNINIMPLEMENTED_TM LOW No description linux/payload/PlocSupervisorHandler.h
155 12300 0x300c SEND_MRAM_DUMP_FAILED LOW Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command linux/payload/PlocMemoryDumper.h
156 12301 0x300d MRAM_DUMP_FAILED LOW Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command linux/payload/PlocMemoryDumper.h
157 12302 0x300e MRAM_DUMP_FINISHED LOW MRAM dump finished successfully linux/payload/PlocMemoryDumper.h
158 12401 0x3071 INVALID_TC_FRAME HIGH No description linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
159 12402 0x3072 INVALID_FAR HIGH Read invalid FAR from PDEC after startup linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
160 12403 0x3073 CARRIER_LOCK INFO Carrier lock detected linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
161 12404 0x3074 BIT_LOCK_PDEC INFO Bit lock detected (data valid) linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
162 12405 0x3075 LOST_CARRIER_LOCK_PDEC INFO Lost carrier lock linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
163 12406 0x3076 LOST_BIT_LOCK_PDEC INFO Lost bit lock linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
164 12407 0x3077 TOO_MANY_IRQS MEDIUM Too many IRQs over the time window of one second. P1: Allowed TCs linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
165 12408 0x3078 POLL_SYSCALL_ERROR_PDEC MEDIUM No description linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
166 12409 0x3079 WRITE_SYSCALL_ERROR_PDEC HIGH No description linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
167 12410 0x307a PDEC_RESET_FAILED PDEC_TRYING_RESET_WITH_INIT HIGH LOW Failed to pull PDEC reset to low Trying a PDEC reset with complete re-initialization linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
168 12411 0x307b OPEN_IRQ_FILE_FAILED PDEC_TRYING_RESET_NO_INIT HIGH LOW Failed to open the IRQ uio file Trying a PDEC reset without re-initialization. linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
169 12412 0x307c PDEC_RESET_FAILED HIGH Failed to pull PDEC reset to low linux/ipcore/pdec.h
170 12413 0x307d OPEN_IRQ_FILE_FAILED HIGH Failed to open the IRQ uio file linux/ipcore/pdec.h
171 12414 0x307e PDEC_INIT_FAILED HIGH PDEC initialization failed. This might also be due to the persistent confiuration never becoming available, for example due to SD card issues. linux/ipcore/pdec.h
172 12415 0x307f PDEC_CONFIG_CORRUPTED HIGH The PDEC configuration area has been corrupted P1: The first configuration word P2: The second configuration word linux/ipcore/pdec.h
173 12500 0x30d4 IMAGE_UPLOAD_FAILED LOW Image upload failed linux/acs/StrComHandler.h
174 12501 0x30d5 IMAGE_DOWNLOAD_FAILED LOW Image download failed linux/acs/StrComHandler.h
175 12502 0x30d6 IMAGE_UPLOAD_SUCCESSFUL LOW Uploading image to star tracker was successfulop linux/acs/StrComHandler.h
187 12515 0x30e3 STR_HELPER_FILE_NOT_EXISTS LOW Specified file does not exist P1: Internal state of str helper linux/acs/StrComHandler.h
188 12516 0x30e4 STR_HELPER_SENDING_PACKET_FAILED LOW No description linux/acs/StrComHandler.h
189 12517 0x30e5 STR_HELPER_REQUESTING_MSG_FAILED LOW No description linux/acs/StrComHandler.h
190 12600 0x3138 MPSOC_FLASH_WRITE_FAILED LOW Flash write fails linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
191 12601 0x3139 MPSOC_FLASH_WRITE_SUCCESSFUL LOW INFO Flash write successful linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
192 12602 0x313a MPSOC_SENDING_COMMAND_FAILED LOW No description linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
193 12603 0x313b MPSOC_HELPER_REQUESTING_REPLY_FAILED LOW Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
194 12604 0x313c MPSOC_HELPER_READING_REPLY_FAILED LOW Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
195 12605 0x313d MPSOC_MISSING_ACK LOW Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
196 12606 0x313e MPSOC_MISSING_EXE LOW Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
197 12607 0x313f MPSOC_ACK_FAILURE_REPORT LOW Received acknowledgment failure report P1: Internal state of MPSoC linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
198 12608 0x3140 MPSOC_EXE_FAILURE_REPORT LOW Received execution failure report P1: Internal state of MPSoC linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
199 12609 0x3141 MPSOC_ACK_INVALID_APID LOW Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
200 12610 0x3142 MPSOC_EXE_INVALID_APID LOW Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
201 12611 0x3143 MPSOC_HELPER_SEQ_CNT_MISMATCH LOW Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
202 12612 0x3144 MPSOC_TM_SIZE_ERROR LOW No description linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
203 12613 0x3145 MPSOC_TM_CRC_MISSMATCH LOW No description linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
204 12614 0x3146 MPSOC_FLASH_READ_PACKET_ERROR LOW No description linux/payload/PlocMpsocSpecialComHelper.h
205 12615 0x3147 MPSOC_FLASH_READ_FAILED LOW No description linux/payload/PlocMpsocSpecialComHelper.h
206 12616 0x3148 MPSOC_FLASH_READ_SUCCESSFUL INFO No description linux/payload/PlocMpsocSpecialComHelper.h
207 12617 0x3149 MPSOC_READ_TIMEOUT LOW No description linux/payload/PlocMpsocSpecialComHelper.h
208 12700 0x319c TRANSITION_BACK_TO_OFF MEDIUM Could not transition properly and went back to ALL OFF mission/payload/PayloadPcduHandler.h
209 12701 0x319d NEG_V_OUT_OF_BOUNDS MEDIUM P1: 0 -> too low, 1 -> too high P2: Float value mission/payload/PayloadPcduHandler.h
210 12702 0x319e U_DRO_OUT_OF_BOUNDS MEDIUM P1: 0 -> too low, 1 -> too high P2: Float value mission/payload/PayloadPcduHandler.h
221 12801 0x3201 NOT_ENOUGH_DEVICES_DUAL_MODE HIGH No description mission/system/acs/AcsBoardAssembly.h
222 12802 0x3202 POWER_STATE_MACHINE_TIMEOUT MEDIUM No description mission/system/acs/AcsBoardAssembly.h
223 12803 0x3203 SIDE_SWITCH_TRANSITION_NOT_ALLOWED LOW Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination mission/system/acs/AcsBoardAssembly.h
224 12804 0x3204 DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY MEDIUM This is triggered when the assembly would have normally switched the board side, but the GPS device of the other side was marked faulty. P1: Current submode. mission/system/acs/AcsBoardAssembly.h
225 12900 0x3264 TRANSITION_OTHER_SIDE_FAILED HIGH No description mission/system/acs/SusAssembly.h
226 12901 0x3265 NOT_ENOUGH_DEVICES_DUAL_MODE HIGH No description mission/system/acs/SusAssembly.h
227 12902 0x3266 POWER_STATE_MACHINE_TIMEOUT MEDIUM No description mission/system/acs/SusAssembly.h
228 12903 0x3267 SIDE_SWITCH_TRANSITION_NOT_ALLOWED LOW Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination mission/system/acs/SusAssembly.h
229 13000 0x32c8 CHILDREN_LOST_MODE MEDIUM No description mission/system/objects/TcsBoardAssembly.h mission/system/tcs/TcsBoardAssembly.h
230 13100 0x332c GPS_FIX_CHANGE INFO Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix mission/acs/archive/GPSDefinitions.h
231 13101 0x332d CANT_GET_FIX LOW Could not get fix in maximum allowed time. P1: Maximum allowed time to get a fix after the GPS was switched on. mission/acs/archive/GPSDefinitions.h
232 13200 0x3390 P60_BOOT_COUNT INFO P60 boot count is broadcasted once at SW startup. P1: Boot count mission/power/P60DockHandler.h
264 13800 0x35e8 MISSING_PACKET LOW No description mission/payload/scexHelpers.h
265 13801 0x35e9 EXPERIMENT_TIMEDOUT LOW No description mission/payload/scexHelpers.h
266 13802 0x35ea MULTI_PACKET_COMMAND_DONE INFO No description mission/payload/scexHelpers.h
267 13803 0x35eb FS_UNUSABLE LOW No description mission/payload/scexHelpers.h
268 13901 0x364d SET_CONFIGFILEVALUE_FAILED MEDIUM No description mission/utility/GlobalConfigHandler.h
269 13902 0x364e GET_CONFIGFILEVALUE_FAILED MEDIUM No description mission/utility/GlobalConfigHandler.h
270 13903 0x364f INSERT_CONFIGFILEVALUE_FAILED MEDIUM No description mission/utility/GlobalConfigHandler.h
271 13904 0x3650 WRITE_CONFIGFILE_FAILED MEDIUM No description mission/utility/GlobalConfigHandler.h
272 13905 0x3651 READ_CONFIGFILE_FAILED MEDIUM No description mission/utility/GlobalConfigHandler.h
273 14000 0x36b0 ALLOC_FAILURE MEDIUM No description bsp_q7s/core/CoreController.h mission/sysDefs.h
274 14001 0x36b1 REBOOT_SW LOW Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy bsp_q7s/core/CoreController.h mission/sysDefs.h
275 14002 0x36b2 REBOOT_MECHANISM_TRIGGERED MEDIUM The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots bsp_q7s/core/CoreController.h mission/sysDefs.h
276 14003 0x36b3 REBOOT_HW MEDIUM No description bsp_q7s/core/CoreController.h mission/sysDefs.h
277 14004 0x36b4 NO_SD_CARD_ACTIVE HIGH No SD card was active. Core controller will attempt to re-initialize a SD card. bsp_q7s/core/CoreController.h mission/sysDefs.h
278 14005 0x36b5 VERSION_INFO INFO P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set. bsp_q7s/core/CoreController.h mission/sysDefs.h
279 14006 0x36b6 CURRENT_IMAGE_INFO INFO P1: Current Chip, P2: Current Copy bsp_q7s/core/CoreController.h mission/sysDefs.h
280 14007 0x36b7 REBOOT_COUNTER INFO Total reboot counter, which is the sum of the boot count of all individual images. bsp_q7s/core/CoreController.h mission/sysDefs.h
281 14008 0x36b8 INDIVIDUAL_BOOT_COUNTS INFO Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1. bsp_q7s/core/CoreController.h mission/sysDefs.h
282 14010 0x36ba I2C_UNAVAILABLE_REBOOT TRYING_I2C_RECOVERY MEDIUM HIGH No description I2C is unavailable. Trying recovery of I2C bus by power cycling all I2C devices. bsp_q7s/core/CoreController.h mission/sysDefs.h
283 14100 14011 0x3714 0x36bb NO_VALID_SENSOR_TEMPERATURE I2C_REBOOT MEDIUM HIGH No description I2C is unavailable. Recovery did not work, performing full reboot. mission/controller/ThermalController.h mission/sysDefs.h
284 14101 14012 0x3715 0x36bc NO_HEALTHY_HEATER_AVAILABLE PDEC_REBOOT MEDIUM HIGH No description PDEC recovery through reset was not possible, performing full reboot. mission/controller/ThermalController.h mission/sysDefs.h
285 14102 14013 0x3716 0x36bd SYRLINKS_OVERHEATING FIRMWARE_INFO HIGH INFO No description Version information of the firmware (not OBSW). P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set. mission/controller/ThermalController.h mission/sysDefs.h
286 14103 14014 0x3717 0x36be PLOC_OVERHEATING ACTIVE_SD_INFO HIGH INFO No description Active SD card info. SD States: 0: OFF, 1: ON, 2: MOUNTED. P1: Active SD Card Index, 0 if none is active P2: First two bytes: SD state of SD card 0, last two bytes SD state of SD card 1 mission/controller/ThermalController.h mission/sysDefs.h
287 14104 14100 0x3718 0x3714 OBC_OVERHEATING NO_VALID_SENSOR_TEMPERATURE HIGH MEDIUM No description mission/controller/ThermalController.h mission/controller/tcsDefs.h
288 14105 14101 0x3719 0x3715 HPA_OVERHEATING NO_HEALTHY_HEATER_AVAILABLE HIGH MEDIUM No description mission/controller/ThermalController.h mission/controller/tcsDefs.h
289 14106 14102 0x371a 0x3716 PLPCDU_OVERHEATING SYRLINKS_OVERHEATING HIGH No description mission/controller/ThermalController.h mission/controller/tcsDefs.h
290 14104 0x3718 OBC_OVERHEATING HIGH No description mission/controller/tcsDefs.h
291 14105 0x3719 CAMERA_OVERHEATING HIGH No description mission/controller/tcsDefs.h
292 14106 0x371a PCDU_SYSTEM_OVERHEATING HIGH No description mission/controller/tcsDefs.h
293 14107 0x371b HEATER_NOT_OFF_FOR_OFF_MODE MEDIUM No description mission/controller/tcsDefs.h
294 14108 0x371c MGT_OVERHEATING HIGH No description mission/controller/tcsDefs.h
295 14109 0x371d TCS_SWITCHING_HEATER_ON INFO P1: Module index. P2: Heater index mission/controller/tcsDefs.h
296 14110 0x371e TCS_SWITCHING_HEATER_OFF INFO P1: Module index. P2: Heater index mission/controller/tcsDefs.h
297 14111 0x371f TCS_HEATER_MAX_BURN_TIME_REACHED MEDIUM P1: Heater index. P2: Maximum burn time for heater. mission/controller/tcsDefs.h
298 14201 0x3779 TX_TIMER_EXPIRED INFO The transmit timer to protect the Syrlinks expired P1: The current timer value mission/system/com/ComSubsystem.h
299 14202 0x377a BIT_LOCK_TX_ON INFO Transmitter will be turned on due to detection of bitlock mission/system/com/ComSubsystem.h
300 14300 0x37dc POSSIBLE_FILE_CORRUPTION LOW P1: Result code of TM packet parser. P2: Timestamp of possibly corrupt file as a unix timestamp. mission/persistentTmStoreDefs.h
310 14312 0x37e8 DUMP_MISC_CANCELLED LOW P1: Number of dumped packets. P2: Total dumped bytes. mission/persistentTmStoreDefs.h
311 14313 0x37e9 DUMP_HK_CANCELLED LOW P1: Number of dumped packets. P2: Total dumped bytes. mission/persistentTmStoreDefs.h
312 14314 0x37ea DUMP_CFDP_CANCELLED LOW P1: Number of dumped packets. P2: Total dumped bytes. mission/persistentTmStoreDefs.h
313 14500 0x38a4 TEMPERATURE_ALL_ONES_START MEDIUM Detected invalid values, starting invalid message counting mission/acs/SusHandler.h
314 14501 0x38a5 TEMPERATURE_ALL_ONES_RECOVERY INFO Detected valid values again, resetting invalid message counter. P1: Invalid message counter. mission/acs/SusHandler.h

View File

@ -8,7 +8,7 @@ import os.path
from typing import Dict
from eive_tmtc import EIVE_TMTC_ROOT
from tmtccmd.util.obj_id import ObjectIdDictT, ObjectIdU32
from tmtccmd.util.obj_id import ObjectIdU32
from tmtccmd.fsfw import parse_fsfw_objects_csv
@ -18,6 +18,7 @@ __OBJECT_ID_DICT = None
# Core Object IDs
SOLAR_ARRAY_DEPLOYMENT_ID = bytes([0x44, 0x41, 0x00, 0xA2])
INTERNAL_ERROR_REPORTER_ID = bytes([0x53, 0x04, 0x00, 0x00])
# Power Object IDs
PCDU_HANDLER_ID = bytes([0x44, 0x20, 0x00, 0xA1])
@ -34,6 +35,7 @@ HEATER_CONTROLLER_ID = bytes([0x44, 0x41, 0x00, 0xA4])
TMP1075_HANDLER_TCS_BRD_0_ID = bytes([0x44, 0x42, 0x00, 0x04])
TMP1075_HANDLER_TCS_BRD_1_ID = bytes([0x44, 0x42, 0x00, 0x05])
TMP1075_HANDLER_PLPCDU_0_ID = bytes([0x44, 0x42, 0x00, 0x06])
TMP1075_HANDLER_PLPCDU_1_ID = bytes([0x44, 0x42, 0x00, 0x07])
TMP1075_HANDLER_IF_BRD_ID = bytes([0x44, 0x42, 0x00, 0x08])
# Communication Object IDs
@ -49,6 +51,9 @@ GYRO_1_L3G_HANDLER_ID = bytes([0x44, 0x12, 0x01, 0x11])
GYRO_2_ADIS_HANDLER_ID = bytes([0x44, 0x12, 0x02, 0x12])
GYRO_3_L3G_HANDLER_ID = bytes([0x44, 0x12, 0x03, 0x13])
GPS_CONTROLLER = bytes([0x44, 0x13, 0x00, 0x45])
GPS_0_HEALTH_DEV = bytes([0x44, 0x13, 0x00, 0x46])
GPS_1_HEALTH_DEV = bytes([0x44, 0x13, 0x00, 0x47])
RW1_ID = bytes([0x44, 0x12, 0x00, 0x47])
RW2_ID = bytes([0x44, 0x12, 0x01, 0x48])
RW3_ID = bytes([0x44, 0x12, 0x02, 0x49])
@ -131,6 +136,7 @@ ACS_SUBSYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x01])
PL_SUBSYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x02])
TCS_SUBSYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x03])
COM_SUBSYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x04])
EPS_SUBSYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x05])
# Legacy names, kept for backwards compatibility
ACS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x01])
@ -152,6 +158,8 @@ STR_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x09])
TCS_CONTROLLER = bytes([0x43, 0x40, 0x00, 0x01])
ACS_CONTROLLER = bytes([0x43, 0x00, 0x00, 0x02])
CORE_CONTROLLER_ID = bytes([0x43, 0x00, 0x00, 0x03])
PWR_CONTROLLER = bytes([0x43, 0x00, 0x00, 0x04])
XIPHOS_WDT_ID = bytes([0x43, 0x00, 0x00, 0x07])
MISC_TM_STORE = bytes([0x73, 0x02, 0x00, 0x01])
OK_TM_STORE = bytes([0x73, 0x02, 0x00, 0x02])

View File

@ -1,7 +1,9 @@
0x00005060;P60DOCK_TEST_TASK
0x43000002;ACS_CONTROLLER
0x43000003;CORE_CONTROLLER
0x43000004;POWER_CONTROLLER
0x43000006;GLOBAL_JSON_CFG
0x43000007;XIPHOS_WDT
0x43400001;THERMAL_CONTROLLER
0x44120006;MGM_0_LIS3_HANDLER
0x44120010;GYRO_0_ADIS_HANDLER
@ -29,6 +31,8 @@
0x44120350;RW4
0x44130001;STAR_TRACKER
0x44130045;GPS_CONTROLLER
0x44130046;GPS_0_HEALTH_DEV
0x44130047;GPS_1_HEALTH_DEV
0x44140013;IMTQ_POLLING
0x44140014;IMTQ_HANDLER
0x442000A1;PCDU_HANDLER
@ -159,6 +163,7 @@
0x73010002;PL_SUBSYSTEM
0x73010003;TCS_SUBSYSTEM
0x73010004;COM_SUBSYSTEM
0x73010005;EPS_SUBSYSTEM
0x73020001;MISC_TM_STORE
0x73020002;OK_TM_STORE
0x73020003;NOT_OK_TM_STORE

1 0x00005060 P60DOCK_TEST_TASK
2 0x43000002 ACS_CONTROLLER
3 0x43000003 CORE_CONTROLLER
4 0x43000004 POWER_CONTROLLER
5 0x43000006 GLOBAL_JSON_CFG
6 0x43000007 XIPHOS_WDT
7 0x43400001 THERMAL_CONTROLLER
8 0x44120006 MGM_0_LIS3_HANDLER
9 0x44120010 GYRO_0_ADIS_HANDLER
31 0x44120350 RW4
32 0x44130001 STAR_TRACKER
33 0x44130045 GPS_CONTROLLER
34 0x44130046 GPS_0_HEALTH_DEV
35 0x44130047 GPS_1_HEALTH_DEV
36 0x44140013 IMTQ_POLLING
37 0x44140014 IMTQ_HANDLER
38 0x442000A1 PCDU_HANDLER
163 0x73010002 PL_SUBSYSTEM
164 0x73010003 TCS_SUBSYSTEM
165 0x73010004 COM_SUBSYSTEM
166 0x73010005 EPS_SUBSYSTEM
167 0x73020001 MISC_TM_STORE
168 0x73020002 OK_TM_STORE
169 0x73020003 NOT_OK_TM_STORE

View File

@ -210,6 +210,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x27a8;DHI_NoReplyExpected;No description;168;DEVICE_HANDLER_IF;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
0x27a9;DHI_NonOpTemperature;No description;169;DEVICE_HANDLER_IF;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
0x27aa;DHI_CommandNotImplemented;No description;170;DEVICE_HANDLER_IF;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
0x27ab;DHI_NonOpStateOfCharge;No description;171;DEVICE_HANDLER_IF;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
0x27b0;DHI_ChecksumError;No description;176;DEVICE_HANDLER_IF;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
0x27b1;DHI_LengthMissmatch;No description;177;DEVICE_HANDLER_IF;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
0x27b2;DHI_InvalidData;No description;178;DEVICE_HANDLER_IF;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
@ -371,8 +372,8 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x3e03;HKM_PeriodicHelperInvalid;No description;3;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h
0x3e04;HKM_PoolobjectNotFound;No description;4;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h
0x3e05;HKM_DatasetNotFound;No description;5;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h
0x3f01;DLEE_NoPacketFound;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h
0x3f02;DLEE_PossiblePacketLoss;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h
0x3f01;DLEE_StreamTooShort;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h
0x3f02;DLEE_DecodingError;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleEncoder.h
0x4201;PUS11_InvalidTypeTimeWindow;No description;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
0x4202;PUS11_InvalidTimeWindow;No description;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
0x4203;PUS11_TimeshiftingNotPossible;No description;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
@ -402,9 +403,12 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x4403;UXOS_CommandError;Command execution failed;3;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h
0x4404;UXOS_NoCommandLoadedOrPending;;4;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h
0x4406;UXOS_PcloseCallError;No description;6;LINUX_OSAL;fsfw/src/fsfw_hal/linux/CommandExecutor.h
0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h
0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h
0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h
0x4503;HSPI_Timeout;No description;3;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h
0x4504;HSPI_Busy;No description;4;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h
0x4505;HSPI_GenericError;No description;5;HAL_SPI;fsfw/src/fsfw_hal/common/spi/spiCommon.h
0x4601;HURT_UartReadFailure;No description;1;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h
0x4602;HURT_UartReadSizeMissmatch;No description;2;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h
0x4603;HURT_UartRxBufferTooSmall;No description;3;HAL_UART;fsfw/src/fsfw_hal/linux/serial/SerialComIF.h
@ -440,7 +444,8 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x5106;IMTQ_InternalProcessingError;No description;6;IMTQ_HANDLER;mission/acs/imtqHelpers.h
0x5107;IMTQ_RejectedWithoutReason;No description;7;IMTQ_HANDLER;mission/acs/imtqHelpers.h
0x5108;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/acs/imtqHelpers.h
0x51a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;167;IMTQ_HANDLER;mission/acs/imtqHelpers.h
0x5109;IMTQ_StartupCfgError;No description;9;IMTQ_HANDLER;mission/acs/imtqHelpers.h
0x510a;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;10;IMTQ_HANDLER;mission/acs/imtqHelpers.h
0x52b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/acs/rwHelpers.h
0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/acs/rwHelpers.h
0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/acs/rwHelpers.h
@ -474,8 +479,8 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x53b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;182;STR_HANDLER;mission/acs/str/StarTrackerHandler.h
0x53b7;STRH_StartrackerNotRunningFirmware;Star tracker must be in firmware mode to run this command;183;STR_HANDLER;mission/acs/str/StarTrackerHandler.h
0x53b8;STRH_StartrackerNotRunningBootloader;Star tracker must be in bootloader mode to run this command;184;STR_HANDLER;mission/acs/str/StarTrackerHandler.h
0x54e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);224;DWLPWRON_CMD;linux/payload/plocMpscoDefs.h
0x54e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);225;DWLPWRON_CMD;linux/payload/plocMpscoDefs.h
0x54e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);224;DWLPWRON_CMD;linux/payload/plocMpsocHelpers.h
0x54e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);225;DWLPWRON_CMD;linux/payload/plocMpsocHelpers.h
0x5700;PLSPVhLP_RequestDone;No description;0;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
0x5701;PLSPVhLP_NoPacketFound;No description;1;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
0x5702;PLSPVhLP_DecodeBufTooSmall;No description;2;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h
@ -492,8 +497,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x58a3;SUSS_ExecutionFailed;Command execution failed;163;SUS_HANDLER;mission/acs/RwHandler.h
0x58a4;SUSS_CrcError;Reaction wheel reply has invalid crc;164;SUS_HANDLER;mission/acs/RwHandler.h
0x58a5;SUSS_ValueNotRead;No description;165;SUS_HANDLER;mission/acs/RwHandler.h
0x5900;IPCI_NoReplyAvailable;No description;0;CCSDS_IP_CORE_BRIDGE;linux/acs/ImtqPollingTask.h
0x5901;IPCI_NoPacketFound;No description;1;CCSDS_IP_CORE_BRIDGE;linux/com/SyrlinksComHandler.h
0x59a0;IPCI_PapbBusy;No description;160;CCSDS_IP_CORE_BRIDGE;linux/ipcore/PapbVcInterface.h
0x5aa0;PTME_UnknownVcId;No description;160;PTME;linux/ipcore/Ptme.h
0x5c01;STRHLP_SdNotMounted;SD card specified in path string not mounted;1;STR_HELPER;linux/acs/StrComHandler.h
@ -515,21 +518,21 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x5d05;GOMS_UnknownReplyId;No description;5;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h
0x5ea0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;160;PLOC_MEMORY_DUMPER;linux/payload/PlocMemoryDumper.h
0x5ea1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;161;PLOC_MEMORY_DUMPER;linux/payload/PlocMemoryDumper.h
0x5fa0;PDEC_AbandonedCltuRetval;No description;160;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa1;PDEC_FrameDirtyRetval;No description;161;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa2;PDEC_FrameIllegalMultipleReasons;No description;162;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa3;PDEC_AdDiscardedLockoutRetval;No description;163;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa4;PDEC_AdDiscardedWaitRetval;No description;164;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa5;PDEC_AdDiscardedNsVs;No description;165;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa6;PDEC_NoReportRetval;No description;166;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa7;PDEC_ErrorVersionNumberRetval;No description;167;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa8;PDEC_IllegalCombinationRetval;No description;168;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa9;PDEC_InvalidScIdRetval;No description;169;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5faa;PDEC_InvalidVcIdMsbRetval;No description;170;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fab;PDEC_InvalidVcIdLsbRetval;No description;171;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fac;PDEC_NsNotZeroRetval;No description;172;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fae;PDEC_InvalidBcCc;No description;174;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fb0;PDEC_CommandNotImplemented;Received action message with unknown action id;176;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa0;PDEC_AbandonedCltuRetval;No description;160;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa1;PDEC_FrameDirtyRetval;No description;161;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa2;PDEC_FrameIllegalMultipleReasons;No description;162;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa3;PDEC_AdDiscardedLockoutRetval;No description;163;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa4;PDEC_AdDiscardedWaitRetval;No description;164;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa5;PDEC_AdDiscardedNsVs;No description;165;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa6;PDEC_NoReportRetval;No description;166;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa7;PDEC_ErrorVersionNumberRetval;No description;167;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa8;PDEC_IllegalCombinationRetval;No description;168;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fa9;PDEC_InvalidScIdRetval;No description;169;PDEC_HANDLER;linux/ipcore/pdec.h
0x5faa;PDEC_InvalidVcIdMsbRetval;No description;170;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fab;PDEC_InvalidVcIdLsbRetval;No description;171;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fac;PDEC_NsNotZeroRetval;No description;172;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fae;PDEC_InvalidBcCc;No description;174;PDEC_HANDLER;linux/ipcore/pdec.h
0x5fb0;PDEC_CommandNotImplemented;Received action message with unknown action id;176;PDEC_HANDLER;linux/ipcore/pdec.h
0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/com/CcsdsIpCoreHandler.h
0x61a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;160;RATE_SETTER;linux/ipcore/PtmeConfig.h
0x61a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);161;RATE_SETTER;linux/ipcore/PtmeConfig.h
@ -541,8 +544,8 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x63a0;NVMB_KeyNotExists;Specified key does not exist in json file;160;NVM_PARAM_BASE;mission/memory/NvmParameterBase.h
0x64a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;160;FILE_SYSTEM_HELPER;bsp_q7s/fs/FilesystemHelper.h
0x64a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;161;FILE_SYSTEM_HELPER;bsp_q7s/fs/FilesystemHelper.h
0x6502;PLMPHLP_InvalidCrc;No description;2;PLOC_MPSOC_HELPER;linux/payload/ScexHelper.h
0x65a0;PLMPHLP_FileClosedAccidentally;File accidentally close;160;PLOC_MPSOC_HELPER;linux/payload/PlocMpsocHelper.h
0x65a0;PLMPHLP_FileWriteError;File error occured for file transfers from OBC to the MPSoC.;160;PLOC_MPSOC_HELPER;linux/payload/PlocMpsocSpecialComHelper.h
0x65a1;PLMPHLP_FileReadError;File error occured for file transfers from MPSoC to OBC.;161;PLOC_MPSOC_HELPER;linux/payload/PlocMpsocSpecialComHelper.h
0x66a0;SADPL_CommandNotSupported;No description;160;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
0x66a1;SADPL_DeploymentAlreadyExecuting;No description;161;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
0x66a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h
@ -582,7 +585,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x68b5;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);181;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
0x68c0;SPVRTVIF_BufTooSmall;No description;192;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
0x68c1;SPVRTVIF_NoReplyTimeout;No description;193;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h
0x6900;ACSCTRL_FileDeletionFailed;No description;0;ACS_CTRL;mission/controller/AcsController.h
0x6900;ACSCTRL_FileDeletionFailed;File deletion failed and at least one file is still existent.;0;ACS_CTRL;mission/controller/AcsController.h
0x6a02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
0x6a03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
0x6a04;ACSMEKF_MekfNoModelVectors;No description;4;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
@ -591,21 +594,18 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x6a07;ACSMEKF_MekfNotFinite;No description;7;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
0x6a08;ACSMEKF_MekfInitialized;No description;8;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
0x6a09;ACSMEKF_MekfRunning;No description;9;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h
0x6b01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h
0x6c01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h
0x6d01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h
0x6e00;SDMA_OpOngoing;No description;0;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e01;SDMA_AlreadyOn;No description;1;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e02;SDMA_AlreadyMounted;No description;2;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e03;SDMA_AlreadyOff;No description;3;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e0a;SDMA_StatusFileNexists;No description;10;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e0b;SDMA_StatusFileFormatInvalid;No description;11;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e0c;SDMA_MountError;No description;12;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e0d;SDMA_UnmountError;No description;13;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e0e;SDMA_SystemCallError;No description;14;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6e0f;SDMA_PopenCallError;No description;15;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6f00;LPH_SdNotReady;No description;0;LOCAL_PARAM_HANDLER;bsp_q7s/memory/LocalParameterHandler.h
0x7000;PTM_DumpDone;No description;0;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h
0x7001;PTM_BusyDumping;No description;1;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h
0x7100;TMS_IsBusy;No description;0;TM_SINK;mission/tmtc/DirectTmSinkIF.h
0x7300;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h
0x6b00;SDMA_OpOngoing;No description;0;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b01;SDMA_AlreadyOn;No description;1;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b02;SDMA_AlreadyMounted;No description;2;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b03;SDMA_AlreadyOff;No description;3;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b0a;SDMA_StatusFileNexists;No description;10;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b0b;SDMA_StatusFileFormatInvalid;No description;11;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b0c;SDMA_MountError;No description;12;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b0d;SDMA_UnmountError;No description;13;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b0e;SDMA_SystemCallError;No description;14;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6b0f;SDMA_PopenCallError;No description;15;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h
0x6c00;LPH_SdNotReady;No description;0;LOCAL_PARAM_HANDLER;bsp_q7s/memory/LocalParameterHandler.h
0x6d00;PTM_DumpDone;No description;0;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h
0x6d01;PTM_BusyDumping;No description;1;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h
0x6e00;TMS_IsBusy;No description;0;TM_SINK;mission/tmtc/DirectTmSinkIF.h
0x7000;SCBU_KeyNotFound;No description;0;SCRATCH_BUFFER;bsp_q7s/memory/scratchApi.h

1 Full ID (hex) Name Description Unique ID Subsytem Name File Path
210 0x27a8 DHI_NoReplyExpected No description 168 DEVICE_HANDLER_IF fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
211 0x27a9 DHI_NonOpTemperature No description 169 DEVICE_HANDLER_IF fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
212 0x27aa DHI_CommandNotImplemented No description 170 DEVICE_HANDLER_IF fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
213 0x27ab DHI_NonOpStateOfCharge No description 171 DEVICE_HANDLER_IF fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
214 0x27b0 DHI_ChecksumError No description 176 DEVICE_HANDLER_IF fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
215 0x27b1 DHI_LengthMissmatch No description 177 DEVICE_HANDLER_IF fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
216 0x27b2 DHI_InvalidData No description 178 DEVICE_HANDLER_IF fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
372 0x3e03 HKM_PeriodicHelperInvalid No description 3 HOUSEKEEPING_MANAGER fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h
373 0x3e04 HKM_PoolobjectNotFound No description 4 HOUSEKEEPING_MANAGER fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h
374 0x3e05 HKM_DatasetNotFound No description 5 HOUSEKEEPING_MANAGER fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h
375 0x3f01 DLEE_NoPacketFound DLEE_StreamTooShort No description 1 DLE_ENCODER fsfw/src/fsfw/globalfunctions/DleParser.h fsfw/src/fsfw/globalfunctions/DleEncoder.h
376 0x3f02 DLEE_PossiblePacketLoss DLEE_DecodingError No description 2 DLE_ENCODER fsfw/src/fsfw/globalfunctions/DleParser.h fsfw/src/fsfw/globalfunctions/DleEncoder.h
377 0x4201 PUS11_InvalidTypeTimeWindow No description 1 PUS_SERVICE_11 fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
378 0x4202 PUS11_InvalidTimeWindow No description 2 PUS_SERVICE_11 fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
379 0x4203 PUS11_TimeshiftingNotPossible No description 3 PUS_SERVICE_11 fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
403 0x4403 UXOS_CommandError Command execution failed 3 LINUX_OSAL fsfw/src/fsfw_hal/linux/CommandExecutor.h
404 0x4404 UXOS_NoCommandLoadedOrPending 4 LINUX_OSAL fsfw/src/fsfw_hal/linux/CommandExecutor.h
405 0x4406 UXOS_PcloseCallError No description 6 LINUX_OSAL fsfw/src/fsfw_hal/linux/CommandExecutor.h
406 0x4500 HSPI_OpeningFileFailed No description 0 HAL_SPI fsfw/src/fsfw_hal/linux/spi/SpiComIF.h fsfw/src/fsfw_hal/common/spi/spiCommon.h
407 0x4501 HSPI_FullDuplexTransferFailed No description 1 HAL_SPI fsfw/src/fsfw_hal/linux/spi/SpiComIF.h fsfw/src/fsfw_hal/common/spi/spiCommon.h
408 0x4502 HSPI_HalfDuplexTransferFailed No description 2 HAL_SPI fsfw/src/fsfw_hal/linux/spi/SpiComIF.h fsfw/src/fsfw_hal/common/spi/spiCommon.h
409 0x4503 HSPI_Timeout No description 3 HAL_SPI fsfw/src/fsfw_hal/common/spi/spiCommon.h
410 0x4504 HSPI_Busy No description 4 HAL_SPI fsfw/src/fsfw_hal/common/spi/spiCommon.h
411 0x4505 HSPI_GenericError No description 5 HAL_SPI fsfw/src/fsfw_hal/common/spi/spiCommon.h
412 0x4601 HURT_UartReadFailure No description 1 HAL_UART fsfw/src/fsfw_hal/linux/serial/SerialComIF.h
413 0x4602 HURT_UartReadSizeMissmatch No description 2 HAL_UART fsfw/src/fsfw_hal/linux/serial/SerialComIF.h
414 0x4603 HURT_UartRxBufferTooSmall No description 3 HAL_UART fsfw/src/fsfw_hal/linux/serial/SerialComIF.h
444 0x5106 IMTQ_InternalProcessingError No description 6 IMTQ_HANDLER mission/acs/imtqHelpers.h
445 0x5107 IMTQ_RejectedWithoutReason No description 7 IMTQ_HANDLER mission/acs/imtqHelpers.h
446 0x5108 IMTQ_CmdErrUnknown No description 8 IMTQ_HANDLER mission/acs/imtqHelpers.h
447 0x51a7 0x5109 IMTQ_UnexpectedSelfTestReply IMTQ_StartupCfgError The status reply to a self test command was received but no self test command has been sent. This should normally never happen. No description 167 9 IMTQ_HANDLER mission/acs/imtqHelpers.h
448 0x510a IMTQ_UnexpectedSelfTestReply The status reply to a self test command was received but no self test command has been sent. This should normally never happen. 10 IMTQ_HANDLER mission/acs/imtqHelpers.h
449 0x52b0 RWHA_SpiWriteFailure No description 176 RW_HANDLER mission/acs/rwHelpers.h
450 0x52b1 RWHA_SpiReadFailure Used by the spi send function to tell a failing read call 177 RW_HANDLER mission/acs/rwHelpers.h
451 0x52b2 RWHA_MissingStartSign Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E 178 RW_HANDLER mission/acs/rwHelpers.h
479 0x53b6 STRH_StartrackerAlreadyBooted Star tracker is already in firmware mode 182 STR_HANDLER mission/acs/str/StarTrackerHandler.h
480 0x53b7 STRH_StartrackerNotRunningFirmware Star tracker must be in firmware mode to run this command 183 STR_HANDLER mission/acs/str/StarTrackerHandler.h
481 0x53b8 STRH_StartrackerNotRunningBootloader Star tracker must be in bootloader mode to run this command 184 STR_HANDLER mission/acs/str/StarTrackerHandler.h
482 0x54e0 DWLPWRON_InvalidMode Received command has invalid JESD mode (valid modes are 0 - 5) 224 DWLPWRON_CMD linux/payload/plocMpscoDefs.h linux/payload/plocMpsocHelpers.h
483 0x54e1 DWLPWRON_InvalidLaneRate Received command has invalid lane rate (valid lane rate are 0 - 9) 225 DWLPWRON_CMD linux/payload/plocMpscoDefs.h linux/payload/plocMpsocHelpers.h
484 0x5700 PLSPVhLP_RequestDone No description 0 PLOC_SUPV_HELPER linux/payload/PlocSupvUartMan.h
485 0x5701 PLSPVhLP_NoPacketFound No description 1 PLOC_SUPV_HELPER linux/payload/PlocSupvUartMan.h
486 0x5702 PLSPVhLP_DecodeBufTooSmall No description 2 PLOC_SUPV_HELPER linux/payload/PlocSupvUartMan.h
497 0x58a3 SUSS_ExecutionFailed Command execution failed 163 SUS_HANDLER mission/acs/RwHandler.h
498 0x58a4 SUSS_CrcError Reaction wheel reply has invalid crc 164 SUS_HANDLER mission/acs/RwHandler.h
499 0x58a5 SUSS_ValueNotRead No description 165 SUS_HANDLER mission/acs/RwHandler.h
0x5900 IPCI_NoReplyAvailable No description 0 CCSDS_IP_CORE_BRIDGE linux/acs/ImtqPollingTask.h
0x5901 IPCI_NoPacketFound No description 1 CCSDS_IP_CORE_BRIDGE linux/com/SyrlinksComHandler.h
500 0x59a0 IPCI_PapbBusy No description 160 CCSDS_IP_CORE_BRIDGE linux/ipcore/PapbVcInterface.h
501 0x5aa0 PTME_UnknownVcId No description 160 PTME linux/ipcore/Ptme.h
502 0x5c01 STRHLP_SdNotMounted SD card specified in path string not mounted 1 STR_HELPER linux/acs/StrComHandler.h
518 0x5d05 GOMS_UnknownReplyId No description 5 GOM_SPACE_HANDLER mission/power/GomspaceDeviceHandler.h
519 0x5ea0 PLMEMDUMP_MramAddressTooHigh The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000. 160 PLOC_MEMORY_DUMPER linux/payload/PlocMemoryDumper.h
520 0x5ea1 PLMEMDUMP_MramInvalidAddressCombination The specified end address is lower than the start address 161 PLOC_MEMORY_DUMPER linux/payload/PlocMemoryDumper.h
521 0x5fa0 PDEC_AbandonedCltuRetval No description 160 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
522 0x5fa1 PDEC_FrameDirtyRetval No description 161 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
523 0x5fa2 PDEC_FrameIllegalMultipleReasons No description 162 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
524 0x5fa3 PDEC_AdDiscardedLockoutRetval No description 163 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
525 0x5fa4 PDEC_AdDiscardedWaitRetval No description 164 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
526 0x5fa5 PDEC_AdDiscardedNsVs No description 165 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
527 0x5fa6 PDEC_NoReportRetval No description 166 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
528 0x5fa7 PDEC_ErrorVersionNumberRetval No description 167 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
529 0x5fa8 PDEC_IllegalCombinationRetval No description 168 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
530 0x5fa9 PDEC_InvalidScIdRetval No description 169 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
531 0x5faa PDEC_InvalidVcIdMsbRetval No description 170 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
532 0x5fab PDEC_InvalidVcIdLsbRetval No description 171 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
533 0x5fac PDEC_NsNotZeroRetval No description 172 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
534 0x5fae PDEC_InvalidBcCc No description 174 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
535 0x5fb0 PDEC_CommandNotImplemented Received action message with unknown action id 176 PDEC_HANDLER linux/ipcore/PdecHandler.h linux/ipcore/pdec.h
536 0x60a0 CCSDS_CommandNotImplemented Received action message with unknown action id 160 CCSDS_HANDLER mission/com/CcsdsIpCoreHandler.h
537 0x61a0 RS_RateNotSupported The commanded rate is not supported by the current FPGA design 160 RATE_SETTER linux/ipcore/PtmeConfig.h
538 0x61a1 RS_BadBitRate Bad bitrate has been commanded (e.g. 0) 161 RATE_SETTER linux/ipcore/PtmeConfig.h
544 0x63a0 NVMB_KeyNotExists Specified key does not exist in json file 160 NVM_PARAM_BASE mission/memory/NvmParameterBase.h
545 0x64a0 FSHLP_SdNotMounted SD card specified with path string not mounted 160 FILE_SYSTEM_HELPER bsp_q7s/fs/FilesystemHelper.h
546 0x64a1 FSHLP_FileNotExists Specified file does not exist on filesystem 161 FILE_SYSTEM_HELPER bsp_q7s/fs/FilesystemHelper.h
547 0x6502 0x65a0 PLMPHLP_InvalidCrc PLMPHLP_FileWriteError No description File error occured for file transfers from OBC to the MPSoC. 2 160 PLOC_MPSOC_HELPER linux/payload/ScexHelper.h linux/payload/PlocMpsocSpecialComHelper.h
548 0x65a0 0x65a1 PLMPHLP_FileClosedAccidentally PLMPHLP_FileReadError File accidentally close File error occured for file transfers from MPSoC to OBC. 160 161 PLOC_MPSOC_HELPER linux/payload/PlocMpsocHelper.h linux/payload/PlocMpsocSpecialComHelper.h
549 0x66a0 SADPL_CommandNotSupported No description 160 SA_DEPL_HANDLER mission/SolarArrayDeploymentHandler.h
550 0x66a1 SADPL_DeploymentAlreadyExecuting No description 161 SA_DEPL_HANDLER mission/SolarArrayDeploymentHandler.h
551 0x66a2 SADPL_MainSwitchTimeoutFailure No description 162 SA_DEPL_HANDLER mission/SolarArrayDeploymentHandler.h
585 0x68b5 SPVRTVIF_SupvHelperExecuting Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command) 181 SUPV_RETURN_VALUES_IF linux/payload/plocSupvDefs.h
586 0x68c0 SPVRTVIF_BufTooSmall No description 192 SUPV_RETURN_VALUES_IF linux/payload/plocSupvDefs.h
587 0x68c1 SPVRTVIF_NoReplyTimeout No description 193 SUPV_RETURN_VALUES_IF linux/payload/plocSupvDefs.h
588 0x6900 ACSCTRL_FileDeletionFailed No description File deletion failed and at least one file is still existent. 0 ACS_CTRL mission/controller/AcsController.h
589 0x6a02 ACSMEKF_MekfUninitialized No description 2 ACS_MEKF mission/controller/acs/MultiplicativeKalmanFilter.h
590 0x6a03 ACSMEKF_MekfNoGyrData No description 3 ACS_MEKF mission/controller/acs/MultiplicativeKalmanFilter.h
591 0x6a04 ACSMEKF_MekfNoModelVectors No description 4 ACS_MEKF mission/controller/acs/MultiplicativeKalmanFilter.h
594 0x6a07 ACSMEKF_MekfNotFinite No description 7 ACS_MEKF mission/controller/acs/MultiplicativeKalmanFilter.h
595 0x6a08 ACSMEKF_MekfInitialized No description 8 ACS_MEKF mission/controller/acs/MultiplicativeKalmanFilter.h
596 0x6a09 ACSMEKF_MekfRunning No description 9 ACS_MEKF mission/controller/acs/MultiplicativeKalmanFilter.h
597 0x6b01 0x6b00 ACSSAF_SafectrlMekfInputInvalid SDMA_OpOngoing No description 1 0 ACS_SAFE SD_CARD_MANAGER mission/controller/acs/control/SafeCtrl.h bsp_q7s/fs/SdCardManager.h
598 0x6c01 0x6b01 ACSPTG_PtgctrlMekfInputInvalid SDMA_AlreadyOn No description 1 ACS_PTG SD_CARD_MANAGER mission/controller/acs/control/PtgCtrl.h bsp_q7s/fs/SdCardManager.h
599 0x6d01 0x6b02 ACSDTB_DetumbleNoSensordata SDMA_AlreadyMounted No description 1 2 ACS_DETUMBLE SD_CARD_MANAGER mission/controller/acs/control/Detumble.h bsp_q7s/fs/SdCardManager.h
600 0x6e00 0x6b03 SDMA_OpOngoing SDMA_AlreadyOff No description 0 3 SD_CARD_MANAGER bsp_q7s/fs/SdCardManager.h
601 0x6e01 0x6b0a SDMA_AlreadyOn SDMA_StatusFileNexists No description 1 10 SD_CARD_MANAGER bsp_q7s/fs/SdCardManager.h
602 0x6e02 0x6b0b SDMA_AlreadyMounted SDMA_StatusFileFormatInvalid No description 2 11 SD_CARD_MANAGER bsp_q7s/fs/SdCardManager.h
603 0x6e03 0x6b0c SDMA_AlreadyOff SDMA_MountError No description 3 12 SD_CARD_MANAGER bsp_q7s/fs/SdCardManager.h
604 0x6e0a 0x6b0d SDMA_StatusFileNexists SDMA_UnmountError No description 10 13 SD_CARD_MANAGER bsp_q7s/fs/SdCardManager.h
605 0x6e0b 0x6b0e SDMA_StatusFileFormatInvalid SDMA_SystemCallError No description 11 14 SD_CARD_MANAGER bsp_q7s/fs/SdCardManager.h
606 0x6e0c 0x6b0f SDMA_MountError SDMA_PopenCallError No description 12 15 SD_CARD_MANAGER bsp_q7s/fs/SdCardManager.h
607 0x6e0d 0x6c00 SDMA_UnmountError LPH_SdNotReady No description 13 0 SD_CARD_MANAGER LOCAL_PARAM_HANDLER bsp_q7s/fs/SdCardManager.h bsp_q7s/memory/LocalParameterHandler.h
608 0x6e0e 0x6d00 SDMA_SystemCallError PTM_DumpDone No description 14 0 SD_CARD_MANAGER PERSISTENT_TM_STORE bsp_q7s/fs/SdCardManager.h mission/tmtc/PersistentTmStore.h
609 0x6e0f 0x6d01 SDMA_PopenCallError PTM_BusyDumping No description 15 1 SD_CARD_MANAGER PERSISTENT_TM_STORE bsp_q7s/fs/SdCardManager.h mission/tmtc/PersistentTmStore.h
610 0x6f00 0x6e00 LPH_SdNotReady TMS_IsBusy No description 0 LOCAL_PARAM_HANDLER TM_SINK bsp_q7s/memory/LocalParameterHandler.h mission/tmtc/DirectTmSinkIF.h
611 0x7000 PTM_DumpDone SCBU_KeyNotFound No description 0 PERSISTENT_TM_STORE SCRATCH_BUFFER mission/tmtc/PersistentTmStore.h bsp_q7s/memory/scratchApi.h
0x7001 PTM_BusyDumping No description 1 PERSISTENT_TM_STORE mission/tmtc/PersistentTmStore.h
0x7100 TMS_IsBusy No description 0 TM_SINK mission/tmtc/DirectTmSinkIF.h
0x7300 SCBU_KeyNotFound No description 0 SCRATCH_BUFFER bsp_q7s/memory/scratchApi.h

View File

@ -60,3 +60,4 @@
142;COM_SUBSYSTEM
143;PERSISTENT_TM_STORE
144;SYRLINKS_COM
145;SUS_HANDLER

1 22 MEMORY
60 142 COM_SUBSYSTEM
61 143 PERSISTENT_TM_STORE
62 144 SYRLINKS_COM
63 145 SUS_HANDLER

View File

@ -74,7 +74,9 @@ def pack_get_param_command(
memory_address: Union[int, bytes],
parameter_size: int,
) -> PusTelecommand:
"""Function to generate a command to retrieve parameters like the temperature from a gomspace device.
"""Function to generate a command to retrieve parameters like the temperature from a
gomspace device.
@param object_id: The object id of the gomspace device handler.
@param table_id: The table id of the gomspace device
@param memory_address: Address offset within table of the value to read.
@ -218,9 +220,9 @@ def prompt_and_pack_set_integer_param_command(
def pack_ping_command(object_id: ObjectIdU32, data: bytearray) -> PusTelecommand:
""" " Function to generate the command to ping a gomspace device
@param object_id Object Id of the gomspace device handler.
@param data Bytearray containing the bytes to send to the gomspace device. For now the on board software
supports only the handling of up to 33 bytes.
:param object_id: Object Id of the gomspace device handler.
:param data: Bytearray containing the bytes to send to the gomspace device. For now the on board
software supports only the handling of up to 33 bytes.
@note The ping request sends the specified data to a gompsace device. These
data are simply copied by the device and then sent back.
"""

View File

@ -1,7 +1,5 @@
from eive_tmtc.config.definitions import CustomServiceList
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry, CoreServiceList
from tmtccmd.config.tmtc import (
tmtc_definitions_provider,
call_all_definitions_providers,
)
from tmtccmd.config.globals import get_default_tmtc_defs

View File

@ -6,6 +6,7 @@ from typing import cast
from eive_tmtc.tmtc.acs.gyros import handle_gyr_cmd
from eive_tmtc.tmtc.acs.mgms import handle_mgm_cmd
from eive_tmtc.tmtc.power.power import pack_power_commands
from eive_tmtc.tmtc.tcs.ctrl import pack_tcs_ctrl_commands
from eive_tmtc.tmtc.tcs.rtd import pack_rtd_commands
from eive_tmtc.tmtc.payload.scex import pack_scex_cmds
from eive_tmtc.tmtc.tcs.subsystem import pack_tcs_sys_commands
@ -29,11 +30,12 @@ from eive_tmtc.tmtc.acs.reaction_wheels import (
pack_rw_ass_cmds,
)
from eive_tmtc.tmtc.payload.ploc_memory_dumper import pack_ploc_memory_dumper_cmd
from eive_tmtc.tmtc.com.ccsds_handler import pack_ccsds_handler_test
from eive_tmtc.tmtc.com.ccsds_handler import pack_ccsds_handler_command
from eive_tmtc.tmtc.core import pack_core_commands
from eive_tmtc.tmtc.acs.star_tracker import pack_star_tracker_commands
from eive_tmtc.tmtc.com.syrlinks_handler import pack_syrlinks_command
from eive_tmtc.tmtc.com.pdec_handler import pack_pdec_handler_test
from eive_tmtc.tmtc.wdt import pack_wdt_commands
from eive_tmtc.tmtc.acs.acs_board import pack_acs_command
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import (
@ -75,7 +77,7 @@ from tmtccmd.util import ObjectIdU32
from eive_tmtc.utility.input_helper import InputHelper
def handle_default_procedure(
def handle_default_procedure( # noqa C901: Complexity okay here.
tc_base: TcHandlerBase,
info: DefaultProcedureInfo,
queue_helper: DefaultPusQueueHelper,
@ -99,13 +101,16 @@ def handle_default_procedure(
if service == CustomServiceList.ACU.value:
object_id = cast(ObjectIdU32, obj_id_man.get(ACU_HANDLER_ID))
return pack_acu_commands(object_id=object_id, q=queue_helper, op_code=op_code)
if service == CustomServiceList.TCS.value:
if service == CustomServiceList.TCS_SS.value:
return pack_tcs_sys_commands(q=queue_helper, op_code=op_code)
if service == CustomServiceList.TCS_CTRL.value:
return pack_tcs_ctrl_commands(q=queue_helper, op_code=op_code)
if service == CustomServiceList.TMP1075.value:
menu_dict = {
"0": ("TMP1075 TCS Board 0", TMP1075_HANDLER_TCS_BRD_0_ID),
"1": ("TMP1075 TCS Board 1", TMP1075_HANDLER_TCS_BRD_1_ID),
"2": ("TMP1075 PL PCDU 0", TMP1075_HANDLER_PLPCDU_0_ID),
"3": ("TMP1075 PL PCDU 1", oids.TMP1075_HANDLER_PLPCDU_1_ID),
"4": ("TMP1075 IF Board", TMP1075_HANDLER_IF_BRD_ID),
}
input_helper = InputHelper(menu_dict)
@ -170,7 +175,7 @@ def handle_default_procedure(
)
if service == CustomServiceList.CCSDS_HANDLER.value:
object_id = cast(ObjectIdU32, obj_id_man.get(CCSDS_HANDLER_ID))
return pack_ccsds_handler_test(
return pack_ccsds_handler_command(
object_id=object_id, q=queue_helper, op_code=op_code
)
if service == CustomServiceList.PDEC_HANDLER.value:
@ -201,6 +206,8 @@ def handle_default_procedure(
queue_helper=queue_helper,
)
)
if service == CustomServiceList.XIPHOS_WDT.value:
return pack_wdt_commands(queue_helper, op_code)
if not route_to_registered_service_handlers(
service,
ServiceProviderParams(

View File

@ -10,14 +10,11 @@ from PyQt5.QtWidgets import (
from PyQt5 import QtCore
from tmtccmd.config import CoreModeList
from tmtccmd.core.globals_manager import get_global
class Parameter:
def __init__(self, name: str, defaultValue: str, widget: QLineEdit):
def __init__(self, name: str, default_value: str, widget: QLineEdit):
self.name = name
self.defaultValue = defaultValue
self.defaultValue = default_value
self.widget = widget
self.value = self.defaultValue
self.widget.setPlaceholderText(self.defaultValue)
@ -34,9 +31,9 @@ class ParameterDialog(QDialog):
self.setWindowTitle("Enter Parameters")
Buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Reset
buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Reset
self.buttonBox = QDialogButtonBox(Buttons)
self.buttonBox = QDialogButtonBox(buttons)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
self.buttonBox.button(QDialogButtonBox.Reset).clicked.connect(self._reset)
@ -54,14 +51,14 @@ class ParameterDialog(QDialog):
self.parameters = {}
def addParameter(self, name: str, defaultValue: str):
def add_parameter(self, name: str, default_value: str):
row = self.groupLayout.rowCount() + 1
description = QLabel(name)
self.groupLayout.addWidget(description, row, 0)
valueWidget = QLineEdit()
self.groupLayout.addWidget(valueWidget, row, 1)
value_widget = QLineEdit()
self.groupLayout.addWidget(value_widget, row, 1)
parameter = Parameter(name, defaultValue, valueWidget)
parameter = Parameter(name, default_value, value_widget)
self.parameters[name] = parameter
@ -69,10 +66,10 @@ class ParameterDialog(QDialog):
for value in self.parameters.values():
value.reset()
def getParameters(self):
def get_parameters(self):
output = {}
for key, parameter in self.parameters.items():
if parameter.widget != None:
if parameter.widget is not None:
if parameter.widget.text() != "":
parameter.value = parameter.widget.text()
output[key] = parameter.value
@ -103,9 +100,9 @@ def prompt_parameters_cli(param_list) -> dict:
def _gui_prompt(param_list) -> dict:
dialog = ParameterDialog()
for parameter in param_list:
dialog.addParameter(parameter["name"], parameter["defaultValue"])
dialog.add_parameter(parameter["name"], parameter["defaultValue"])
dialog.exec_()
return dialog.getParameters()
return dialog.get_parameters()
def _cli_prompt(param_list) -> dict:

View File

@ -1 +0,0 @@

View File

@ -86,9 +86,8 @@ def pack_cmd_ctrl_to_nml(
def get_object_from_op_code(op_code: str):
try:
return bytes.fromhex(op_code)
except:
except ValueError:
pass
if op_code in OpCode.THERMAL_CONTROLLER:
return obj_ids.THERMAL_CONTROLLER_ID
if op_code in OpCode.CORE_CONTROLLER:

View File

@ -1,10 +1,12 @@
from __future__ import annotations
import struct
import time
from datetime import timedelta
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import get_object_ids
from spacepackets.ecss import PusTelecommand
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
from tmtccmd.config.tmtc import tmtc_definitions_provider
@ -14,7 +16,6 @@ from tmtccmd.pus.s11_tc_sched import (
create_enable_tc_sched_cmd,
create_reset_tc_sched_cmd,
)
from tmtccmd.tc.pus_3_fsfw_hk import *
import eive_tmtc.config.object_ids as oids
from eive_tmtc.tmtc.tcs.brd_assy import OpCodeAssy as TcsOpCodes
@ -49,6 +50,11 @@ from eive_tmtc.tmtc.acs.gyros import (
L3gGyroSetId as L3gGyroSetIds_1_3,
)
from eive_tmtc.tmtc.acs.gps import SetId as GpsSetIds
from tmtccmd.tc.pus_3_fsfw_hk import (
make_sid,
disable_periodic_hk_command,
create_enable_periodic_hk_command_with_interval,
)
class OpCode:
@ -154,7 +160,7 @@ def add_proc_cmds(defs: TmtcDefinitionWrapper):
)
def pack_generic_hk_listening_cmds(
def pack_generic_hk_listening_cmds( # noqa C901: Complexity okay here.
q: DefaultPusQueueHelper,
proc_key: str,
sid_list: list[bytearray],
@ -222,7 +228,9 @@ def pack_generic_hk_listening_cmds(
diag_list.clear()
def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
def pack_proc_commands( # noqa C901: Complexity is okay here.
q: DefaultPusQueueHelper, op_code: str
): # noqa C901: Complexity okay here.
sid_list = []
obj_id_dict = get_object_ids()
if op_code in OpCode.RESET_SCHED:
@ -733,7 +741,7 @@ def enable_listen_to_hk_for_x_seconds(
interval_seconds: float,
):
q.add_log_cmd(f"Enabling periodic HK for {device}")
cmd_tuple = enable_periodic_hk_command_with_interval(
cmd_tuple = create_enable_periodic_hk_command_with_interval(
diag=diag, sid=sid, interval_seconds=interval_seconds
)
for cmd in cmd_tuple:
@ -757,7 +765,6 @@ def gen_disable_listen_to_hk_for_x_seconds(
def activate_mgts_alternately(
q: DefaultPusQueueHelper,
):
q.add_pus_tc(
pack_dipole_command(
object_id=oids.IMTQ_HANDLER_ID,

View File

@ -0,0 +1,163 @@
import logging
from typing import cast
from eive_tmtc.config.definitions import (
CFDP_REMOTE_ENTITY_ID,
PUS_APID,
CFDP_LOCAL_ENTITY_ID,
)
from eive_tmtc.pus_tc.procedure_packer import handle_default_procedure
from tmtccmd import TcHandlerBase, ProcedureWrapper
from tmtccmd.cfdp.defs import CfdpRequestType
from tmtccmd.cfdp.handler import CfdpInCcsdsHandler
from tmtccmd.logging import get_current_time_string
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
from tmtccmd.tc import (
DefaultPusQueueHelper,
QueueWrapper,
FeedWrapper,
TcProcedureType,
SendCbParams,
TcQueueEntryType,
)
from tmtccmd.config.cfdp import generic_cfdp_params_to_put_request
from spacepackets.ecss import PusVerificator
from tmtccmd.util import FileSeqCountProvider
from spacepackets.cfdp import PduHolder, DirectiveType
_LOGGER = logging.getLogger(__name__)
class TcHandler(TcHandlerBase):
def __init__(
self,
seq_count_provider: FileSeqCountProvider,
cfdp_in_ccsds_handler: CfdpInCcsdsHandler,
pus_verificator: PusVerificator,
high_level_file_logger: logging.Logger,
raw_pus_logger: RawTmtcTimedLogWrapper,
gui: bool,
):
super().__init__()
self.cfdp_handler_started = False
self.seq_count_provider = seq_count_provider
self.pus_verificator = pus_verificator
self.high_level_file_logger = high_level_file_logger
self.pus_raw_logger = raw_pus_logger
self.gui = gui
self.proxy_op = True
self.queue_helper = DefaultPusQueueHelper(
queue_wrapper=QueueWrapper.empty(),
default_pus_apid=PUS_APID,
seq_cnt_provider=seq_count_provider,
pus_verificator=pus_verificator,
tc_sched_timestamp_len=4,
)
self.cfdp_in_ccsds_handler = cfdp_in_ccsds_handler
def cfdp_done(self) -> bool:
if self.cfdp_handler_started:
if (
not self.cfdp_in_ccsds_handler.put_request_pending()
and not self.proxy_op
):
self.cfdp_handler_started = False
return True
return False
def feed_cb(self, info: ProcedureWrapper, wrapper: FeedWrapper):
self.queue_helper.queue_wrapper = wrapper.queue_wrapper
if info.proc_type == TcProcedureType.DEFAULT:
handle_default_procedure(self, info.to_def_procedure(), self.queue_helper)
elif info.proc_type == TcProcedureType.CFDP:
self.handle_cfdp_procedure(info)
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()
# pus_tc_wrapper.pus_tc.apid = PUS_APID
raw_tc = pus_tc_wrapper.pus_tc.pack()
self.pus_raw_logger.log_tc(pus_tc_wrapper.pus_tc)
tc_info_string = f"Sent {pus_tc_wrapper.pus_tc}"
_LOGGER.info(tc_info_string)
self.high_level_file_logger.info(
f"{get_current_time_string(True)}: {tc_info_string}"
)
# with open("tc.bin", "wb") as of:
# of.write(raw_tc)
send_params.com_if.send(raw_tc)
elif entry_helper.entry_type == TcQueueEntryType.CCSDS_TC:
cfdp_packet_in_ccsds = entry_helper.to_space_packet_entry()
send_params.com_if.send(cfdp_packet_in_ccsds.space_packet.pack())
# TODO: Log raw CFDP packets similarly to how PUS packets are logged.
# - Log full raw format including space packet wrapper
# - Log context information: Transaction ID, and PDU type and directive
# Could re-use file logger. Should probably do that
# print(f"sending packet: [{cfdp_packet_in_ccsds.space_packet.pack()}]")
# with open(f"cfdp_packet_{self.cfdp_counter}", "wb") as of:
# of.write(cfdp_packet_in_ccsds.space_packet.pack())
# self.cfdp_counter += 1
elif entry_helper.entry_type == TcQueueEntryType.LOG:
log_entry = entry_helper.to_log_entry()
_LOGGER.info(log_entry.log_str)
self.high_level_file_logger.info(log_entry.log_str)
def handle_cfdp_procedure(self, info: ProcedureWrapper):
cfdp_procedure = info.to_cfdp_procedure()
if cfdp_procedure.cfdp_request_type == CfdpRequestType.PUT:
if (
not self.cfdp_in_ccsds_handler.put_request_pending()
and not self.cfdp_handler_started
):
put_req_cfg_wrapper = cfdp_procedure.request_wrapper.to_put_request()
if put_req_cfg_wrapper.cfg.proxy_op:
self.proxy_op = True
put_req = generic_cfdp_params_to_put_request(
params=put_req_cfg_wrapper.cfg,
local_id=CFDP_LOCAL_ENTITY_ID,
remote_id=CFDP_REMOTE_ENTITY_ID,
dest_id_proxy_put_req=CFDP_LOCAL_ENTITY_ID,
)
_LOGGER.info(
f"CFDP: Starting file put request with parameters:\n{put_req}"
)
self.cfdp_in_ccsds_handler.cfdp_handler.put_request(put_req)
self.cfdp_handler_started = True
for source_pair, dest_pair in self.cfdp_in_ccsds_handler:
pdu, sp = source_pair
pdu = cast(PduHolder, pdu)
if pdu.is_file_directive:
if pdu.pdu_directive_type == DirectiveType.METADATA_PDU:
metadata = pdu.to_metadata_pdu()
self.queue_helper.add_log_cmd(
"CFDP Source: Sending Metadata PDU for file with size "
f"{metadata.file_size}"
)
elif pdu.pdu_directive_type == DirectiveType.EOF_PDU:
self.queue_helper.add_log_cmd(
"CFDP Source: Sending EOF PDU"
)
else:
fd_pdu = pdu.to_file_data_pdu()
self.queue_helper.add_log_cmd(
"CFDP Source: Sending File Data PDU for segment at offset "
f"{fd_pdu.offset} with length {len(fd_pdu.file_data)}"
)
self.queue_helper.add_ccsds_tc(sp)
self.cfdp_in_ccsds_handler.confirm_source_packet_sent()
self.cfdp_in_ccsds_handler.source_handler.state_machine()
def queue_finished_cb(self, info: ProcedureWrapper):
if info is not None:
if info.proc_type == TcQueueEntryType.PUS_TC:
def_proc = info.to_def_procedure()
_LOGGER.info(
f"Finished queue for service {def_proc.service} and op code"
f" {def_proc.op_code}"
)
elif info.proc_type == TcProcedureType.CFDP:
_LOGGER.info("Finished CFDP queue")

View File

@ -1,14 +1,27 @@
import logging
import struct
from eive_tmtc.config.object_ids import *
from eive_tmtc.config.object_ids import (
ACU_HANDLER_ID,
PDU_1_HANDLER_ID,
PDU_2_HANDLER_ID,
IMTQ_HANDLER_ID,
PLOC_MPSOC_ID,
PLOC_SUPV_ID,
CORE_CONTROLLER_ID,
STAR_TRACKER_ID,
P60_DOCK_HANDLER,
)
from eive_tmtc.tmtc.acs.imtq import ImtqActionId
from eive_tmtc.pus_tm.defs import PrintWrapper
from eive_tmtc.tmtc.payload.ploc_mpsoc import PlocReplyIds
from eive_tmtc.tmtc.core import handle_core_ctrl_action_replies
from eive_tmtc.tmtc.payload.ploc_mpsoc import handle_mpsoc_data_reply
from eive_tmtc.tmtc.payload.ploc_supervisor import SupvActionId
from eive_tmtc.tmtc.acs.star_tracker import StarTrackerActionId
from eive_tmtc.tmtc.power.tm import handle_get_param_data_reply
from tmtccmd.tm import Service8FsfwTm
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from spacepackets.ccsds.time import CdsShortTimestamp
from tmtccmd.util import ObjectIdDictT
_LOGGER = logging.getLogger(__name__)
@ -22,9 +35,8 @@ def handle_action_reply(
tm_packet = Service8FsfwTm.unpack(
raw_telemetry=raw_tm, time_reader=CdsShortTimestamp.empty()
)
printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
object_id = obj_id_dict.get(tm_packet.source_object_id_as_bytes)
pw = PrintWrapper(printer)
pw = PrintWrapper(printer.file_logger)
custom_data = tm_packet.custom_data
action_id = tm_packet.action_id
generic_print_str = printer.generic_action_packet_tm_print(
@ -32,13 +44,15 @@ def handle_action_reply(
)
pw.dlog(generic_print_str)
if object_id.as_bytes == IMTQ_HANDLER_ID:
return handle_imtq_replies(action_id, printer, custom_data)
return handle_imtq_replies(action_id, pw, custom_data)
elif object_id.as_bytes == PLOC_MPSOC_ID:
return handle_ploc_replies(action_id, printer, custom_data)
return handle_mpsoc_data_reply(action_id, pw, custom_data)
elif object_id.as_bytes == PLOC_SUPV_ID:
return handle_supervisor_replies(action_id, printer, custom_data)
return handle_supervisor_replies(action_id, pw, custom_data)
elif object_id.as_bytes == CORE_CONTROLLER_ID:
return handle_core_ctrl_action_replies(action_id, pw, custom_data)
elif object_id.as_bytes == STAR_TRACKER_ID:
return handle_startracker_replies(action_id, printer, custom_data)
return handle_startracker_replies(action_id, pw, custom_data)
elif object_id.as_bytes in [
ACU_HANDLER_ID,
PDU_1_HANDLER_ID,
@ -51,9 +65,7 @@ def handle_action_reply(
pw.dlog(f"Raw Data: {tm_packet.custom_data.hex(sep=',')}")
def handle_imtq_replies(
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
):
def handle_imtq_replies(action_id: int, pw: PrintWrapper, custom_data: bytearray):
if action_id == struct.unpack("!I", ImtqActionId.get_commanded_dipole)[0]:
header_list = [
"Commanded X-Dipole",
@ -62,63 +74,25 @@ def handle_imtq_replies(
]
[x_dipole, y_dipole, z_dipole] = struct.unpack("!HHH", custom_data[0:6])
content_list = [x_dipole, y_dipole, z_dipole]
print(header_list)
print(content_list)
printer.file_logger.info(header_list)
printer.file_logger.info(content_list)
pw.dlog(f"{header_list}")
pw.dlog(f"{content_list}")
def handle_ploc_replies(
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
):
if action_id == PlocReplyIds.TM_MEM_READ_RPT:
header_list = [
"PLOC Memory Address",
"PLOC Mem Len",
"PLOC Read Memory Data",
]
content_list = [
"0x" + custom_data[:4].hex(),
struct.unpack("!H", custom_data[4:6])[0],
"0x" + custom_data[6:10].hex(),
]
print(header_list)
print(content_list)
printer.file_logger.info(header_list)
printer.file_logger.info(content_list)
elif action_id == PlocReplyIds.TM_CAM_CMD_RPT:
header_list = ["Camera reply string", "ACK"]
content_list = [
custom_data[: len(custom_data) - 1].decode("utf-8"),
hex(custom_data[-1]),
]
print(header_list)
print(content_list)
printer.file_logger.info(header_list)
printer.file_logger.info(content_list)
def handle_supervisor_replies(
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
):
def handle_supervisor_replies(action_id: int, pw: PrintWrapper, custom_data: bytearray):
if action_id == SupvActionId.DUMP_MRAM:
header_list = ["MRAM Dump"]
content_list = [custom_data[: len(custom_data)]]
print(header_list)
print(content_list)
printer.file_logger.info(header_list)
printer.file_logger.info(content_list)
pw.dlog(f"{header_list}")
pw.dlog(f"{content_list}")
elif action_id == SupvActionId.READ_GPIO:
header_list = ["GPIO state"]
content_list = [struct.unpack("!H", custom_data[:2])[0]]
print(header_list)
print(content_list)
printer.file_logger.info(header_list)
printer.file_logger.info(content_list)
pw.dlog(f"{header_list}")
pw.dlog(f"{content_list}")
def handle_startracker_replies(
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
action_id: int, pw: PrintWrapper, custom_data: bytearray
):
if action_id == StarTrackerActionId.CHECKSUM:
if len(custom_data) != 5:
@ -130,7 +104,5 @@ def handle_startracker_replies(
print(custom_data[4])
checksum_valid_flag = custom_data[4] >> 8
content_list = ["0x" + custom_data[:4].hex(), checksum_valid_flag]
print(header_list)
print(content_list)
printer.file_logger.info(header_list)
printer.file_logger.info(content_list)
pw.dlog(f"{header_list}")
pw.dlog(f"{content_list}")

View File

@ -1,19 +1,27 @@
import logging
from typing import Optional
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
class PrintWrapper:
def __init__(self, printer: FsfwTmTcPrinter):
self.printer = printer
def __init__(self, file_logger: Optional[logging.Logger]):
self.file_logger = file_logger
def dlog(self, string: str):
print(string)
self.printer.file_logger.info(string)
if self.file_logger:
self.file_logger.info(string)
def wlog(self, logger: logging.Logger, string: str):
logger.warning(string)
if self.file_logger:
self.file_logger.warning(string)
def ilog(self, logger: logging.Logger, string: str):
logger.info(string)
self.printer.file_logger.info(string)
if self.file_logger:
self.file_logger.info(string)
def log_to_both(printer: FsfwTmTcPrinter, string: str):

View File

@ -1,6 +1,5 @@
import logging
import datetime
import struct
import sys
from eive_tmtc.config.events import get_event_dict
@ -8,19 +7,20 @@ from eive_tmtc.config.object_ids import get_object_ids
from eive_tmtc.pus_tm.defs import PrintWrapper
from eive_tmtc.pus_tm.verification_handler import generic_retval_printout
from eive_tmtc.tmtc.acs.subsystem import AcsMode
from eive_tmtc.tmtc.core import SdState, SdCardSelect
from tmtccmd.tc.pus_200_fsfw_mode import Mode
from tmtccmd.tc.pus_201_fsfw_health import FsfwHealth
from tmtccmd.tm import Service5Tm
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw import EventInfo
from spacepackets.ccsds.time import CdsShortTimestamp
_LOGGER = logging.getLogger(__name__)
def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
pw = PrintWrapper(printer)
def handle_event_packet( # noqa C901: Complexity okay here
raw_tm: bytes, pw: PrintWrapper
): # noqa C901: Complexity okay here
tm = Service5Tm.unpack(data=raw_tm, time_reader=CdsShortTimestamp.empty())
event_dict = get_event_dict()
event_def = tm.event_definition
@ -36,10 +36,14 @@ def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
obj_name = event_def.reporter_id.hex(sep=",")
else:
obj_name = obj_id_obj.name
generic_event_string = f"Object {obj_name} generated Event {info.name} (ID: {event_def.event_id:#04x}) at {tm.time_provider.as_date_time()}"
generic_event_string = (
f"Object {obj_name} generated Event {info.name} (ID: {event_def.event_id:#04x})"
f" at {tm.time_provider.as_date_time()}"
)
_LOGGER.info(generic_event_string)
pw.printer.file_logger.info(
f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: {generic_event_string}"
pw.file_logger.info(
f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}:"
f" {generic_event_string}"
)
specific_handler = False
if info.name == "MODE_TRANSITION_FAILED":
@ -51,8 +55,8 @@ def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
if info.name == "SUPV_UPDATE_PROGRESS" or info.name == "WRITE_MEMORY_FAILED":
additional_event_info = f"Additional info: {info.info}"
context = (
f"Progress Percent: {event_def.param1 >> 24 & 0xff} | Sequence Count: {event_def.param1 & 0xffff} "
f"| Bytes Written: {event_def.param2}"
f"Progress Percent: {event_def.param1 >> 24 & 0xff} | Sequence Count:"
f" {event_def.param1 & 0xffff} | Bytes Written: {event_def.param2}"
)
pw.dlog(additional_event_info)
pw.dlog(context)
@ -78,9 +82,22 @@ def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
elif event_def.param1 == Mode.RAW:
mode_name = "Raw"
pw.dlog(
f"Mode Number {event_def.param1}, Mode Name {mode_name}, Submode: {event_def.param2}"
f"Mode Number {event_def.param1}, Mode Name {mode_name}, "
f"Submode: {event_def.param2}"
)
if info.name == "VERSION_INFO":
if info.name == "INDIVIDUAL_BOOT_COUNTS":
boot_count_00 = (event_def.param1 >> 16) & 0xFFFF
boot_count_01 = event_def.param1 & 0xFFFF
boot_count_10 = (event_def.param2 >> 16) & 0xFFFF
boot_count_11 = event_def.param2 & 0xFFFF
pw.dlog(f"Boot count 0 0: {boot_count_00}")
pw.dlog(f"Boot count 0 1: {boot_count_01}")
pw.dlog(f"Boot count 1 0: {boot_count_10}")
pw.dlog(f"Boot count 1 1: {boot_count_11}")
if info.name == "REBOOT_COUNTER":
boot_count = (event_def.param1 << 32) | event_def.param2
pw.dlog(f"Total boot count: {boot_count}")
if info.name == "VERSION_INFO" or info.name == "FIRMWARE_INFO":
specific_handler = True
ver_major = (event_def.param1 >> 24) & 0xFF
ver_minor = (event_def.param1 >> 16) & 0xFF
@ -90,8 +107,11 @@ def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
if has_git_sha:
p2_as_bytes = event_def.param2.to_bytes(4, sys.byteorder)
git_sha = p2_as_bytes.decode("ascii")
version_string = f"v{ver_major}.{ver_minor}.{ver_rev}"
pw.dlog(f"Version {version_string}")
if info.name == "VERSION_INFO":
name = "OBSW version: "
else:
name = "Firmware version: "
pw.dlog(f"{name} v{ver_major}.{ver_minor}.{ver_rev}")
if has_git_sha:
pw.dlog(f"Git SHA first four letters: {git_sha}")
if info.name == "CLOCK_SET":
@ -108,6 +128,21 @@ def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
time = event_def.param1 + event_def.param2 / 1000.0
time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc)
pw.dlog(f"Current time: {time_dt}")
if info.name == "ACTIVE_SD_INFO":
sd_0_state = (event_def.param2 >> 16) & 0xFFFF
sd_1_state = event_def.param2 & 0xFFFF
active_sd = event_def.param1
try:
active_sd = SdCardSelect(event_def.param1)
sd_0_state = SdState((event_def.param2 >> 16) & 0xFFFF)
sd_1_state = SdState(event_def.param2 & 0xFFFF)
except IndexError:
_LOGGER.error(f"Received invalid event fields for event {event_def}")
finally:
pw.dlog(
f"Active SD card {active_sd!r} | SD 0 State {sd_0_state!r} | SD 1 "
f"State {sd_1_state!r}"
)
if info.name == "HEALTH_INFO":
specific_handler = True
health = FsfwHealth(event_def.param1)
@ -117,7 +152,10 @@ def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
submode = event_def.param2
pw.dlog(f"Mode Number {mode}, Submode: {submode}")
if not specific_handler:
additional_event_info = f"Additional info: {info.info} | P1: {event_def.param1} | P2: {event_def.param2}"
additional_event_info = (
f"Additional info: {info.info} | P1: {event_def.param1} | "
f"P2: {event_def.param2}"
)
pw.dlog(additional_event_info)
if not specific_handler:
# printer.handle_long_tm_print(packet_if=tm.pus_tm, info_if=tm.pus_tm)

View File

@ -1,9 +1,9 @@
"""HK Handling for EIVE OBSW"""
import datetime
import logging
# from pus_tm.tcp_server_objects import TCP_SEVER_SENSOR_TEMPERATURES
from eive_tmtc.tmtc.acs.acs_ctrl import handle_acs_ctrl_hk_data
from eive_tmtc.tmtc.internal_err_reporter import handle_ier_hk_data
from eive_tmtc.tmtc.payload.ploc_mpsoc import handle_ploc_mpsoc_hk_data
from eive_tmtc.tmtc.tcs.rtd import RTD_NAMES, handle_rtd_hk
from eive_tmtc.tmtc.acs.star_tracker import handle_str_hk_data
from eive_tmtc.tmtc.power.plpcdu import handle_plpcdu_hk
@ -13,6 +13,7 @@ from eive_tmtc.tmtc.payload.ploc_supervisor import handle_supv_hk_data
from eive_tmtc.tmtc.acs.reaction_wheels import handle_rw_hk_data
from eive_tmtc.tmtc.com.syrlinks_handler import handle_syrlinks_hk_data
from eive_tmtc.tmtc.tcs import handle_thermal_controller_hk_data
from eive_tmtc.tmtc.tcs.tmp1075 import handle_tmp_1075_hk_data
from spacepackets.ecss import PusTelemetry
from tmtccmd.tm.pus_3_fsfw_hk import (
Service3Base,
@ -33,7 +34,7 @@ from eive_tmtc.tmtc.power.tm import (
from eive_tmtc.tmtc.acs.imtq import (
handle_imtq_hk,
)
from eive_tmtc.pus_tm.defs import FsfwTmTcPrinter
from eive_tmtc.pus_tm.defs import FsfwTmTcPrinter, PrintWrapper
from eive_tmtc.tmtc.core import handle_core_hk_data
from eive_tmtc.tmtc.acs.mgms import handle_mgm_hk_data
import eive_tmtc.config.object_ids as obj_ids
@ -46,9 +47,7 @@ FORWARD_SENSOR_TEMPS = False
def handle_hk_packet(
raw_tm: bytes,
obj_id_dict: ObjectIdDictT,
printer: FsfwTmTcPrinter,
raw_tm: bytes, obj_id_dict: ObjectIdDictT, printer: FsfwTmTcPrinter, hk_level: int
):
tm_packet = Service3FsfwTm.unpack(raw_telemetry=raw_tm, custom_hk_handling=False)
named_obj_id = obj_id_dict.get(tm_packet.object_id.as_bytes)
@ -56,26 +55,25 @@ def handle_hk_packet(
named_obj_id = tm_packet.object_id
if tm_packet.subservice == 25 or tm_packet.subservice == 26:
hk_data = tm_packet.tm_data[8:]
if FORWARD_SENSOR_TEMPS:
# TODO: Maybe use singleton?
# TCP_SEVER_SENSOR_TEMPERATURES.report_raw_hk_data(
# object_id=named_obj_id, set_id=tm_packet.set_id, hk_data=hk_data
# )
pass
printer.generic_hk_tm_print(
content_type=HkContentType.HK,
object_id=named_obj_id,
set_id=tm_packet.set_id,
hk_data=hk_data,
)
try:
handle_regular_hk_print(
printer=printer,
object_id=named_obj_id,
hk_packet=tm_packet,
tm=tm_packet.pus_tm,
hk_data=hk_data,
)
if hk_level == 1:
pass
elif hk_level > 1:
handle_regular_hk_print(
printer=printer,
object_id=named_obj_id,
hk_packet=tm_packet,
tm=tm_packet.pus_tm,
hk_data=hk_data,
)
except ValueError as e:
_LOGGER.exception(
f"{e} error when parsing HK data coming from {named_obj_id}"
@ -84,7 +82,7 @@ def handle_hk_packet(
_LOGGER.warning("HK definitions printout not implemented yet")
def handle_regular_hk_print(
def handle_regular_hk_print( # noqa C901: Complexity okay here
printer: FsfwTmTcPrinter,
object_id: ObjectIdU32,
hk_packet: Service3Base,
@ -94,36 +92,39 @@ def handle_regular_hk_print(
objb = object_id.as_bytes
set_id = hk_packet.set_id
packet_dt = tm.time_provider.as_date_time()
pw = PrintWrapper(printer.file_logger)
"""This function is called when a Service 3 Housekeeping packet is received."""
if objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
return handle_rw_hk_data(printer, object_id, set_id, hk_data)
return handle_rw_hk_data(pw, object_id, set_id, hk_data)
elif objb == obj_ids.SYRLINKS_HANDLER_ID:
return handle_syrlinks_hk_data(printer=printer, hk_data=hk_data, set_id=set_id)
return handle_syrlinks_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
elif objb == obj_ids.IMTQ_HANDLER_ID:
return handle_imtq_hk(printer=printer, hk_data=hk_data, set_id=set_id)
return handle_imtq_hk(pw=pw, hk_data=hk_data, set_id=set_id)
elif objb == obj_ids.GPS_CONTROLLER:
return handle_gps_data(printer=printer, hk_data=hk_data)
return handle_gps_data(
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
)
elif objb == obj_ids.PCDU_HANDLER_ID:
return handle_pcdu_hk(printer=printer, set_id=set_id, hk_data=hk_data)
return handle_pcdu_hk(pw=pw, set_id=set_id, hk_data=hk_data)
elif objb == obj_ids.BPX_HANDLER_ID:
return handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer)
return handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, pw=pw)
elif objb == obj_ids.CORE_CONTROLLER_ID:
return handle_core_hk_data(printer=printer, hk_data=hk_data, set_id=set_id)
return handle_core_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
elif objb == obj_ids.PDU_1_HANDLER_ID:
return handle_pdu_data(
printer=printer, pdu_idx=1, set_id=set_id, hk_data=hk_data
)
return handle_pdu_data(pw=pw, pdu_idx=1, set_id=set_id, hk_data=hk_data)
elif objb == obj_ids.PDU_2_HANDLER_ID:
return handle_pdu_data(
printer=printer, pdu_idx=2, set_id=set_id, hk_data=hk_data
)
return handle_pdu_data(pw=pw, pdu_idx=2, set_id=set_id, hk_data=hk_data)
elif objb == obj_ids.PLOC_MPSOC_ID:
return handle_ploc_mpsoc_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
elif objb == obj_ids.ACU_HANDLER_ID:
return handle_acu_hk_data(printer=printer, hk_data=hk_data, set_id=set_id)
return handle_acu_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
elif objb == obj_ids.INTERNAL_ERROR_REPORTER_ID:
return handle_ier_hk_data(pw=pw, hk_data=hk_data, set_id=set_id)
elif objb == obj_ids.RAD_SENSOR_ID:
return handle_rad_sensor_data(printer=printer, hk_data=hk_data, set_id=set_id)
return handle_rad_sensor_data(pw=pw, hk_data=hk_data, set_id=set_id)
elif objb in [obj_ids.RW1_ID, obj_ids.RW2_ID, obj_ids.RW3_ID, obj_ids.RW4_ID]:
return handle_rw_hk_data(
printer=printer, object_id=object_id, set_id=set_id, hk_data=hk_data
pw=pw, object_id=object_id, set_id=set_id, hk_data=hk_data
)
if objb in [
obj_ids.SUS_0_N_LOC_XFYFZM_PT_XF,
@ -139,13 +140,11 @@ def handle_regular_hk_print(
obj_ids.SUS_10_R_LOC_XMYBZF_PT_ZF,
obj_ids.SUS_11_R_LOC_XBYMZB_PT_ZB,
]:
return handle_sus_hk(
object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
)
return handle_sus_hk(object_id=object_id, hk_data=hk_data, pw=pw, set_id=set_id)
elif objb in RTD_NAMES.keys():
return handle_rtd_hk(object_id=objb, hk_data=hk_data, printer=printer)
return handle_rtd_hk(object_id=objb, hk_data=hk_data, pw=pw)
elif objb == obj_ids.P60_DOCK_HANDLER:
return handle_p60_hk_data(printer=printer, set_id=set_id, hk_data=hk_data)
return handle_p60_hk_data(pw=pw, set_id=set_id, hk_data=hk_data)
elif objb in [
obj_ids.GYRO_0_ADIS_HANDLER_ID,
obj_ids.GYRO_1_L3G_HANDLER_ID,
@ -153,7 +152,7 @@ def handle_regular_hk_print(
obj_ids.GYRO_3_L3G_HANDLER_ID,
]:
return handle_gyros_hk_data(
object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
object_id=object_id, hk_data=hk_data, pw=pw, set_id=set_id
)
elif objb in [
obj_ids.MGM_0_LIS3_HANDLER_ID,
@ -162,24 +161,32 @@ def handle_regular_hk_print(
obj_ids.MGM_3_RM3100_HANDLER_ID,
]:
return handle_mgm_hk_data(
object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
object_id=object_id, hk_data=hk_data, pw=pw, set_id=set_id
)
elif objb == obj_ids.PL_PCDU_ID:
return handle_plpcdu_hk(set_id=set_id, hk_data=hk_data, printer=printer)
return handle_plpcdu_hk(set_id=set_id, hk_data=hk_data, pw=pw)
elif objb == obj_ids.THERMAL_CONTROLLER_ID:
return handle_thermal_controller_hk_data(
object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data
object_id=object_id, pw=pw, set_id=set_id, hk_data=hk_data
)
elif objb == obj_ids.STAR_TRACKER_ID:
return handle_str_hk_data(set_id=set_id, hk_data=hk_data, printer=printer)
return handle_str_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
elif objb == obj_ids.PLOC_SUPV_ID:
return handle_supv_hk_data(set_id=set_id, hk_data=hk_data, printer=printer)
return handle_supv_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
elif objb in [
obj_ids.TMP1075_HANDLER_TCS_BRD_0_ID,
obj_ids.TMP1075_HANDLER_TCS_BRD_1_ID,
obj_ids.TMP1075_HANDLER_IF_BRD_ID,
obj_ids.TMP1075_HANDLER_PLPCDU_0_ID,
obj_ids.TMP1075_HANDLER_PLPCDU_1_ID,
]:
return handle_tmp_1075_hk_data(set_id=set_id, hk_data=hk_data, pw=pw)
elif objb == obj_ids.ACS_CONTROLLER:
return handle_acs_ctrl_hk_data(
printer=printer, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
)
else:
_LOGGER.info(
f"Service 3 TM: Parsing for object {object_id} and set ID {set_id} "
f"has not been implemented."
"has not been implemented."
)

View File

@ -13,42 +13,47 @@ from tmtccmd.tm import Service20FsfwTm, Service200FsfwTm
from tmtccmd.tm.pus_20_fsfw_param import Service20ParamDumpWrapper
from tmtccmd.pus.s20_fsfw_param_defs import CustomSubservice as ParamSubservice
from tmtccmd.tm.pus_200_fsfw_mode import Subservice as ModeSubservice
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from .defs import PrintWrapper
from .event_handler import handle_event_packet
from .verification_handler import handle_service_1_fsfw_packet, generic_retval_printout
from .hk_handling import handle_hk_packet
from .hk_handler import handle_hk_packet
from .action_reply_handler import handle_action_reply
_LOGGER = logging.getLogger(__name__)
def pus_factory_hook(
def pus_factory_hook( # noqa C901 : Complexity okay here
packet: bytes,
verif_wrapper: VerificationWrapper,
printer: FsfwTmTcPrinter,
raw_logger: RawTmtcTimedLogWrapper,
hk_level: int,
):
if len(packet) < 8:
_LOGGER.warning("Detected packet shorter than 8 bytes!")
return
try:
tm_packet = PusTelemetry.unpack(packet, CdsShortTimestamp.empty())
except ValueError:
# _LOGGER.info(f"Sequence count: {tm_packet.seq_count}")
except ValueError as value_error:
_LOGGER.warning(f"{value_error}")
_LOGGER.warning("Could not generate PUS TM object from raw data")
_LOGGER.warning(f"Raw Packet: [{packet.hex(sep=',')}], REPR: {packet!r}")
return
service = tm_packet.service
obj_id_dict = get_object_ids()
pw = PrintWrapper(printer)
pw = PrintWrapper(printer.file_logger)
dedicated_handler = True
if service == 1:
handle_service_1_fsfw_packet(wrapper=verif_wrapper, raw_tm=packet)
elif service == 3:
handle_hk_packet(printer=printer, raw_tm=packet, obj_id_dict=obj_id_dict)
handle_hk_packet(
printer=printer, raw_tm=packet, obj_id_dict=obj_id_dict, hk_level=hk_level
)
elif service == 5:
handle_event_packet(raw_tm=packet, printer=printer)
handle_event_packet(raw_tm=packet, pw=pw)
elif service == 8:
handle_action_reply(raw_tm=packet, printer=printer, obj_id_dict=obj_id_dict)
elif service == 17:
@ -77,12 +82,13 @@ def pus_factory_hook(
elif isinstance(scalar_param, float):
pw.dlog(f"Scalar floating point parameter: {scalar_param}")
except ValueError as e:
pw.dlog("received {e} trying to parse scalar parameter")
pw.dlog(f"received {e} trying to parse scalar parameter")
else:
# TODO: Could improve display further by actually displaying a matrix as a
# matrix using row and column information
pw.dlog(
f"Received vector or matrix data: {param.param_raw.hex(sep=',')}"
"Received vector or matrix data:"
f" {param.param_raw.hex(sep=',')}"
)
except ValueError as e:
pw.dlog(f"received {e} when trying to parse parameters")

View File

@ -1,18 +1,17 @@
import logging
import socket
from typing import Optional
import json
import base64
from tmtccmd.logging import get_console_logger
from tmtccmd.util.obj_id import ObjectIdU32
from dle_encoder import DleEncoder
LOGGER = get_console_logger()
_LOGGER = logging.getLogger(__name__)
class TmTcpServer:
def __init__(self, ip_address: str, port: int):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((ip_address, port))
@ -29,8 +28,8 @@ class TmTcpServer:
def __del__(self):
try:
self.close()
except:
LOGGER.warning("Could not close sockets!")
except IOError:
_LOGGER.warning("Could not close sockets!")
def close(self):
self.server_socket.close()
@ -45,8 +44,7 @@ class TmTcpServer:
(self.client_connection, _) = self.server_socket.accept()
self.client_connection.setblocking(False)
print("Client connected")
except:
# no client waiting
except IOError:
return
data_json_bytes = json.dumps(dictionary).encode()
@ -57,7 +55,7 @@ class TmTcpServer:
try:
sent_length = self.client_connection.send(data_json_bytes)
except:
except IOError:
self.client_connection = None
return
if sent_length == 0:
@ -65,7 +63,6 @@ class TmTcpServer:
self.client_connection = None
def report_raw_hk_data(self, object_id: ObjectIdU32, set_id: int, hk_data: bytes):
data_dict = {
"type": "TM",
"tmType": "Raw HK",

View File

@ -48,7 +48,7 @@ def generic_retval_printout(
if retval_info is None:
raw_err = retval
return [
f"No returnvalue information found for error code with "
"No returnvalue information found for error code with "
f"subsystem ID {(raw_err >> 8) & 0xff} and unique ID {raw_err & 0xff}"
]
else:
@ -58,9 +58,9 @@ def generic_retval_printout(
)
string_list = [retval_string]
if p1:
error_param_1_str = f"Error Parameter 1: hex {p1:#010x} " f"dec {p1} "
error_param_1_str = f"Error Parameter 1: hex {p1:#010x} dec {p1} "
string_list.append(error_param_1_str)
if p2:
error_param_2_str = f"Error Parameter 2: hex {p2:#010x} " f"dec {p2}"
error_param_2_str = f"Error Parameter 2: hex {p2:#010x} dec {p2}"
string_list.append(error_param_2_str)
return string_list

View File

@ -5,3 +5,5 @@ from .time import add_time_cmds
from .health import add_health_cmd_defs
from .system import add_system_cmd_defs
from .tm_store import add_persistent_tm_store_cmd_defs
from .tcs import add_tmp_sens_cmds
from .wdt import add_xiphos_wdt_defs

View File

@ -28,7 +28,7 @@ from tmtccmd.tc.pus_3_fsfw_hk import (
create_request_one_diag_command,
)
from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.tc.pus_20_fsfw_param import create_load_param_cmd
@ -59,12 +59,44 @@ class SetId(enum.IntEnum):
MEKF_DATA = 7
CTRL_VAL_DATA = 8
ACTUATOR_CMD_DATA = 9
FUSED_ROT_RATE_DATA = 10
class ActionId(enum.IntEnum):
SOLAR_ARRAY_DEPLOYMENT_SUCCESSFUL = 0
RESET_MEKF = 1
RESTORE_MEKF_NONFINITE_RECOVERY = 2
UPDATE_TLE = 3
CTRL_STRAT_DICT = {
0: "OFF",
1: "NO_MAG_FIELD_FOR_CONTROL",
2: "NO_SENSORS_FOR_CONTROL",
# OBSW <= v6.1.0
10: "LEGACY_SAFE_MEKF",
11: "LEGACY_WITHOUT_MEKF",
12: "LEGACY_ECLIPSE_DAMPING",
13: "LEGACY_ECLIPSE_IDELING",
# Added in OBSW v6.2.0
14: "SAFE_MEKF",
15: "SAFE_GYR",
16: "SAFE_SUSMGM",
17: "SAFE_ECLIPSE_DAMPING_GYR",
18: "SAFE_ECLIPSE_DAMPING_SUSMGM",
19: "SAFE_ECLIPSE_IDELING",
20: "DETUMBLE_FULL",
21: "DETUMBLE_DETERIORATED",
30: "PTG_MEKF",
31: "PTG_RAW",
}
GPS_COURCE_DICT = {
0: "NONE",
1: "GPS",
2: "GPS_EXTRAPOLATED",
3: "SGP4",
}
class OpCodes:
@ -79,6 +111,7 @@ class OpCodes:
SAFE_PTG = ["confirm_deployment"]
RESET_MEKF = ["reset_mekf"]
RESTORE_MEKF_NONFINITE_RECOVERY = ["restore_mekf_nonfinite_recovery"]
UPDATE_TLE = ["update_tle"]
SET_PARAMETER_SCALAR = ["set_scalar_param"]
SET_PARAMETER_VECTOR = ["set_vector_param"]
SET_PARAMETER_MATRIX = ["set_matrix_param"]
@ -112,6 +145,9 @@ class OpCodes:
REQUEST_ACT_CMD_HK = ["act_cmd_hk"]
ENABLE_ACT_CMD_HK = ["act_cmd_enable_hk"]
DISABLE_ACT_CMD_HK = ["act_cmd_disable_hk"]
REQUEST_FUSED_ROT_RATE_HK = ["f_rot_rate_hk"]
ENABLE_FUSED_ROT_RATE_HK = ["f_rot_rate_enable_hk"]
DISABLE_FUSED_ROT_RATE_HK = ["f_rot_rate_disable_hk"]
class Info:
@ -126,6 +162,7 @@ class Info:
SAFE_PTG = "Confirm deployment of both solar arrays"
RESET_MEKF = "Reset the MEKF"
RESTORE_MEKF_NONFINITE_RECOVERY = "Restore MEKF non-finite recovery"
UPDATE_TLE = "Update TLE"
SET_PARAMETER_SCALAR = "Set Scalar Parameter"
SET_PARAMETER_VECTOR = "Set Vector Parameter"
SET_PARAMETER_MATRIX = "Set Matrix Parameter"
@ -159,6 +196,9 @@ class Info:
REQUEST_ACT_CMD_HK = "Request Actuator Commands HK"
ENABLE_ACT_CMD_HK = "Enable Actuator Commands HK data generation"
DISABLE_ACT_CMD_HK = "Disable Actuator Commands HK data generation"
REQUEST_FUSED_ROT_RATE_HK = "Request Fused Rotational Rates HK"
ENABLE_FUSED_ROT_RATE_HK = "Enable Fused Rotational Rates HK data generation"
DISABLE_FUSED_ROT_RATE_HK = "Disable Fused Rotational Rates HK data generation"
PERFORM_MGM_CALIBRATION = False
@ -190,6 +230,7 @@ def acs_cmd_defs(defs: TmtcDefinitionWrapper):
keys=OpCodes.RESTORE_MEKF_NONFINITE_RECOVERY,
info=Info.RESTORE_MEKF_NONFINITE_RECOVERY,
)
oce.add(keys=OpCodes.UPDATE_TLE, info=Info.UPDATE_TLE)
oce.add(keys=OpCodes.SET_PARAMETER_SCALAR, info=Info.SET_PARAMETER_SCALAR)
oce.add(keys=OpCodes.SET_PARAMETER_VECTOR, info=Info.SET_PARAMETER_VECTOR)
oce.add(keys=OpCodes.SET_PARAMETER_MATRIX, info=Info.SET_PARAMETER_MATRIX)
@ -223,13 +264,16 @@ def acs_cmd_defs(defs: TmtcDefinitionWrapper):
oce.add(keys=OpCodes.REQUEST_ACT_CMD_HK, info=Info.REQUEST_ACT_CMD_HK)
oce.add(keys=OpCodes.ENABLE_ACT_CMD_HK, info=Info.ENABLE_ACT_CMD_HK)
oce.add(keys=OpCodes.DISABLE_ACT_CMD_HK, info=Info.DISABLE_ACT_CMD_HK)
oce.add(keys=OpCodes.REQUEST_FUSED_ROT_RATE_HK, info=Info.REQUEST_FUSED_ROT_RATE_HK)
oce.add(keys=OpCodes.ENABLE_FUSED_ROT_RATE_HK, info=Info.ENABLE_FUSED_ROT_RATE_HK)
oce.add(keys=OpCodes.DISABLE_FUSED_ROT_RATE_HK, info=Info.DISABLE_FUSED_ROT_RATE_HK)
defs.add_service(
name=CustomServiceList.ACS_CTRL.value, info="ACS Controller", op_code_entry=oce
)
@service_provider(CustomServiceList.ACS_CTRL.value)
def pack_acs_ctrl_command(p: ServiceProviderParams):
def pack_acs_ctrl_command(p: ServiceProviderParams): # noqa C901
op_code = p.op_code
q = p.queue_helper
if op_code in OpCodes.OFF:
@ -275,6 +319,22 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
q.add_pus_tc(
create_action_cmd(ACS_CONTROLLER, ActionId.RESTORE_MEKF_NONFINITE_RECOVERY)
)
elif op_code in OpCodes.UPDATE_TLE:
q.add_log_cmd(f"{Info.UPDATE_TLE}")
while True:
line1 = input("Please input the first line of the TLE: ")
if len(line1) == 69:
break
else:
print("The line does not have the required length of 69 characters")
while True:
line2 = input("Please input the second line of the TLE: ")
if len(line2) == 69:
break
else:
print("The line does not have the required length of 69 characters")
tle = line1.encode() + line2.encode()
q.add_pus_tc(create_action_cmd(ACS_CONTROLLER, ActionId.UPDATE_TLE, tle))
elif op_code in OpCodes.SET_PARAMETER_SCALAR:
q.add_log_cmd(f"{Info.SET_PARAMETER_SCALAR}")
set_acs_ctrl_param_scalar(q)
@ -484,6 +544,26 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
False, make_sid(ACS_CONTROLLER, SetId.ACTUATOR_CMD_DATA)
)
)
elif op_code in OpCodes.REQUEST_FUSED_ROT_RATE_HK:
q.add_log_cmd(Info.REQUEST_FUSED_ROT_RATE_HK)
q.add_pus_tc(
generate_one_hk_command(make_sid(ACS_CONTROLLER, SetId.FUSED_ROT_RATE_DATA))
)
elif op_code in OpCodes.ENABLE_FUSED_ROT_RATE_HK:
interval = float(input("Please specify interval in floating point seconds: "))
q.add_log_cmd(Info.ENABLE_FUSED_ROT_RATE_HK)
cmd_tuple = enable_periodic_hk_command_with_interval(
False, make_sid(ACS_CONTROLLER, SetId.FUSED_ROT_RATE_DATA), interval
)
q.add_pus_tc(cmd_tuple[0])
q.add_pus_tc(cmd_tuple[1])
elif op_code in OpCodes.DISABLE_FUSED_ROT_RATE_HK:
q.add_log_cmd(Info.DISABLE_FUSED_ROT_RATE_HK)
q.add_pus_tc(
disable_periodic_hk_command(
False, make_sid(ACS_CONTROLLER, SetId.FUSED_ROT_RATE_DATA)
)
)
else:
logging.getLogger(__name__).info(f"Unknown op code {op_code}")
@ -491,8 +571,8 @@ def pack_acs_ctrl_command(p: ServiceProviderParams):
def set_acs_ctrl_param_scalar(q: DefaultPusQueueHelper):
pt = int(
input(
'Specify parameter type to set {0: "uint8", 1: "uint16", 2: "int32", 3: "float", '
'4: "double"}: '
'Specify parameter type to set {0: "uint8", 1: "uint16", 2: "int32", 3:'
' "float", 4: "double"}: '
)
)
sid = int(input("Specify parameter struct ID to set: "))
@ -507,7 +587,7 @@ def set_acs_ctrl_param_scalar(q: DefaultPusQueueHelper):
domain_id=sid,
unique_id=pid,
parameter=param,
).pack()
)
)
)
case 1:
@ -519,7 +599,7 @@ def set_acs_ctrl_param_scalar(q: DefaultPusQueueHelper):
domain_id=sid,
unique_id=pid,
parameter=param,
).pack()
)
)
)
case 2:
@ -531,7 +611,7 @@ def set_acs_ctrl_param_scalar(q: DefaultPusQueueHelper):
domain_id=sid,
unique_id=pid,
parameter=param,
).pack()
)
)
)
case 3:
@ -543,7 +623,7 @@ def set_acs_ctrl_param_scalar(q: DefaultPusQueueHelper):
domain_id=sid,
unique_id=pid,
parameter=param,
).pack()
)
)
)
case 4:
@ -555,7 +635,7 @@ def set_acs_ctrl_param_scalar(q: DefaultPusQueueHelper):
domain_id=sid,
unique_id=pid,
parameter=param,
).pack()
)
)
)
@ -603,7 +683,7 @@ def set_acs_ctrl_param_vector(q: DefaultPusQueueHelper):
domain_id=sid,
unique_id=pid,
parameters=param,
).pack()
)
)
)
else:
@ -636,7 +716,7 @@ def set_acs_ctrl_param_matrix(q: DefaultPusQueueHelper):
domain_id=sid,
unique_id=pid,
parameters=param,
).pack()
)
)
)
else:
@ -663,7 +743,7 @@ def set_acs_ctrl_param_matrix(q: DefaultPusQueueHelper):
domain_id=sid,
unique_id=pid,
parameters=param,
).pack()
)
)
)
else:
@ -672,12 +752,11 @@ def set_acs_ctrl_param_matrix(q: DefaultPusQueueHelper):
def handle_acs_ctrl_hk_data(
printer: FsfwTmTcPrinter,
pw: PrintWrapper,
set_id: int,
hk_data: bytes,
packet_time: datetime.datetime,
):
pw = PrintWrapper(printer)
pw.ilog(_LOGGER, f"Received ACS CTRL HK with packet time {packet_time}")
match set_id:
case SetId.MGM_RAW_SET:
@ -700,6 +779,8 @@ def handle_acs_ctrl_hk_data(
handle_ctrl_val_data(pw, hk_data)
case SetId.ACTUATOR_CMD_DATA:
handle_act_cmd_data(pw, hk_data)
case SetId.FUSED_ROT_RATE_DATA:
handle_fused_rot_rate_data(pw, hk_data)
def handle_acs_ctrl_sus_raw_data(pw: PrintWrapper, hk_data: bytes):
@ -721,14 +802,14 @@ def handle_acs_ctrl_sus_raw_data(pw: PrintWrapper, hk_data: bytes):
sus_list_formatted = vec_fmt.format(*sus_list)
current_idx += length
pw.dlog(f"SUS {idx} RAW: {sus_list_formatted}")
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=12)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=12)
def handle_acs_ctrl_sus_processed_data(pw: PrintWrapper, hk_data: bytes):
if len(hk_data) < 3 * 4 * 12 + 3 * 8 * 3:
pw.dlog(
f"SUS Processed dataset with size {len(hk_data)} does not have expected size"
f" of {3 * 4 * 12 + 3 * 8 * 3} bytes"
f"SUS Processed dataset with size {len(hk_data)} does not have expected"
f" size of {3 * 4 * 12 + 3 * 8 * 3} bytes"
)
return
current_idx = 0
@ -757,7 +838,7 @@ def handle_acs_ctrl_sus_processed_data(pw: PrintWrapper, hk_data: bytes):
sun_ijk_model = vec_fmt.format(*sun_ijk_model)
current_idx += inc_len
pw.dlog(f"{'SUS ijk Model'.ljust(25)}: {sun_ijk_model}")
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=15)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=15)
def handle_raw_mgm_data(pw: PrintWrapper, hk_data: bytes):
@ -765,7 +846,8 @@ def handle_raw_mgm_data(pw: PrintWrapper, hk_data: bytes):
if len(hk_data) < 61:
pw.dlog(
f"ACS CTRL HK: MGM HK data with length {len(hk_data)} shorter than expected 61 bytes"
f"ACS CTRL HK: MGM HK data with length {len(hk_data)} shorter than expected"
" 61 bytes"
)
pw.dlog(f"Raw Data: {hk_data.hex(sep=',')}")
return
@ -812,7 +894,7 @@ def handle_raw_mgm_data(pw: PrintWrapper, hk_data: bytes):
pw.dlog(f"{entry[0].ljust(28)}: {entry[1]}")
current_idx += 1
assert current_idx == 61
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=6)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=6)
def handle_mgm_data_processed(pw: PrintWrapper, hk_data: bytes):
@ -866,7 +948,7 @@ def handle_mgm_data_processed(pw: PrintWrapper, hk_data: bytes):
current_idx += inc_len
if PERFORM_MGM_CALIBRATION:
perform_mgm_calibration(pw, mgm_3)
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=8)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=8)
def handle_gyr_data_raw(pw: PrintWrapper, hk_data: bytes):
@ -900,7 +982,7 @@ def handle_gyr_data_raw(pw: PrintWrapper, hk_data: bytes):
pw.dlog(f"{'GYR 1 L3'.ljust(15)}: {float_str_fmt.format(*gyr_1_l3)}")
pw.dlog(f"{'GYR 2 ADIS'.ljust(15)}: {float_str_fmt.format(*gyr_2_adis)}")
pw.dlog(f"{'GYR 3 L3'.ljust(15)}: {float_str_fmt.format(*gyr_3_l3)}")
pw.printer.print_validity_buffer(hk_data[current_idx:], 4)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 4)
GYR_NAMES = ["GYR 0 ADIS", "GYR 1 L3", "GYR 2 ADIS", "GYR 3 L3"]
@ -926,16 +1008,18 @@ def handle_gyr_data_processed(pw: PrintWrapper, hk_data: bytes):
]
pw.dlog(f"GYR Vec Total: {gyr_vec_tot}")
current_idx += inc_len
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=5)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=5)
def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes):
pw.dlog("Received GPS Processed Set")
fmt_source = "!B"
fmt_scalar = "!d"
fmt_vec = "!ddd"
inc_len_source = struct.calcsize(fmt_source)
inc_len_scalar = struct.calcsize(fmt_scalar)
inc_len_vec = struct.calcsize(fmt_vec)
if len(hk_data) < 2 * inc_len_scalar + 2 * inc_len_vec:
if len(hk_data) < 3 * inc_len_scalar + 2 * inc_len_vec + inc_len_source:
pw.dlog("Received HK set too small")
return
current_idx = 0
@ -974,12 +1058,20 @@ def handle_gps_data_processed(pw: PrintWrapper, hk_data: bytes):
)
]
current_idx += inc_len_vec
source = struct.unpack(
fmt_source, hk_data[current_idx : current_idx + inc_len_source]
)[0]
current_idx += inc_len_source
if GPS_COURCE_DICT.get(source) is not None:
pw.dlog(f"GPS Source: {GPS_COURCE_DICT[source]}")
else:
pw.dlog(f"'GPS Source (key unknown)': {source}")
pw.dlog(f"GPS Latitude: {lat} [deg]")
pw.dlog(f"GPS Longitude: {long} [deg]")
pw.dlog(f"GPS Altitude: {alt} [m]")
pw.dlog(f"GPS Position: {pos} [m]")
pw.dlog(f"GPS Velocity: {velo} [m/s]")
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=4)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=6)
def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
@ -989,6 +1081,7 @@ def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
2: "NO_MODEL_VECTORS",
3: "NO_SUS_MGM_STR_DATA",
4: "COVARIANCE_INVERSION_FAILED",
5: "NOT_FINITE",
10: "INITIALIZED",
11: "RUNNING",
}
@ -1016,24 +1109,33 @@ def handle_mekf_data(pw: PrintWrapper, hk_data: bytes):
current_idx += inc_len_vec
status = struct.unpack(fmt_sts, hk_data[current_idx : current_idx + inc_len_sts])[0]
current_idx += inc_len_sts
pw.dlog(f"{'MEKF Status'.ljust(25)}: {mekf_status[status]}")
if mekf_status.get(status) is not None:
pw.dlog(f"{'MEKF Status'.ljust(25)}: {mekf_status[status]}")
else:
pw.dlog(f"{'MEKF Raw Status (key unknown)'.ljust(25)}: {status}")
pw.dlog(f"{'MEKF Quaternion'.ljust(25)}: {fmt_str_4.format(*quat)}")
pw.dlog(f"{'MEKF Rotational Rate'.ljust(25)}: {fmt_str_3.format(*rates)}")
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=3)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=3)
def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
pw.dlog("Received CTRL Values Set")
fmt_strat = "!B"
fmt_quat = "!dddd"
fmt_scalar = "!d"
fmt_vec = "!ddd"
inc_len_strat = struct.calcsize(fmt_strat)
inc_len_quat = struct.calcsize(fmt_quat)
inc_len_scalar = struct.calcsize(fmt_scalar)
inc_len_vec = struct.calcsize(fmt_vec)
if len(hk_data) < 2 * inc_len_quat + inc_len_scalar + inc_len_vec:
if len(hk_data) < inc_len_strat + 2 * inc_len_quat + inc_len_scalar + inc_len_vec:
pw.dlog("Received HK set too small")
return
current_idx = 0
strat = struct.unpack(
fmt_strat, hk_data[current_idx : current_idx + inc_len_strat]
)[0]
current_idx += inc_len_strat
tgt_quat = [
f"{val:8.3f}"
for val in struct.unpack(
@ -1062,11 +1164,15 @@ def handle_ctrl_val_data(pw: PrintWrapper, hk_data: bytes):
)
]
current_idx += inc_len_vec
if CTRL_STRAT_DICT.get(strat) is not None:
pw.dlog(f"{'Safe Ctrl Strategy'.ljust(25)}: {CTRL_STRAT_DICT[strat]}")
else:
pw.dlog(f"{'Safe Ctrl Strategy (key unknown)'.ljust(25)}: {strat}")
pw.dlog(f"Control Values Target Quaternion: {tgt_quat}")
pw.dlog(f"Control Values Error Quaternion: {err_quat}")
pw.dlog(f"Control Values Error Angle: {err_ang} [deg]")
pw.dlog(f"Control Values Target Rotational Rate: {tgt_rot} [deg/s]")
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=4)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=5)
def handle_act_cmd_data(pw: PrintWrapper, hk_data: bytes):
@ -1105,10 +1211,47 @@ def handle_act_cmd_data(pw: PrintWrapper, hk_data: bytes):
pw.dlog(f"Actuator Commands RW Target Torque: {rw_tgt_torque}")
pw.dlog(f"Actuator Commands RW Target Speed: {rw_tgt_speed}")
pw.dlog(f"Actuator Commands MTQ Target Dipole: {mtq_tgt_dipole}")
pw.printer.print_validity_buffer(hk_data[current_idx:], num_vars=3)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=3)
def perform_mgm_calibration(pw: PrintWrapper, mgm_tuple: Tuple):
def handle_fused_rot_rate_data(pw: PrintWrapper, hk_data: bytes):
pw.dlog("Received Fused Rotation Rates Data Set")
fmt_vec3_double = "!ddd"
inc_len_vec3_double = struct.calcsize(fmt_vec3_double)
if len(hk_data) < 3 * inc_len_vec3_double:
pw.dlog("Received HK set too small")
return
current_idx = 0
rot_rate_orthogonal = [
f"{val*180/math.pi:8.3f}"
for val in struct.unpack(
fmt_vec3_double, hk_data[current_idx : current_idx + inc_len_vec3_double]
)
]
current_idx += inc_len_vec3_double
rot_rate_parallel = [
f"{val*180/math.pi:8.3f}"
for val in struct.unpack(
fmt_vec3_double, hk_data[current_idx : current_idx + inc_len_vec3_double]
)
]
current_idx += inc_len_vec3_double
rot_rate_total = [
f"{val*180/math.pi:8.3f}"
for val in struct.unpack(
fmt_vec3_double, hk_data[current_idx : current_idx + inc_len_vec3_double]
)
]
current_idx += inc_len_vec3_double
pw.dlog(f"Fused Rotational Rate Orthogonal: {rot_rate_orthogonal} [deg/s]")
pw.dlog(f"Fused Rotational Rate Parallel: {rot_rate_parallel} [deg/s]")
pw.dlog(f"Fused Rotational Rate Total: {rot_rate_total} [deg/s]")
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=3)
def perform_mgm_calibration( # noqa C901: Complexity okay
pw: PrintWrapper, mgm_tuple: Tuple
): # noqa C901: Complexity okay
global CALIBR_SOCKET, CALIBRATION_ADDR
try:
declare_api_cmd = "declare_api_version 2"
@ -1122,7 +1265,7 @@ def perform_mgm_calibration(pw: PrintWrapper, mgm_tuple: Tuple):
return
else:
if str(reply[0]) == "0":
pw.dlog(f"MGM calibration: API version 2 was not accepted")
pw.dlog("MGM calibration: API version 2 was not accepted")
return
if len(mgm_tuple) != 3:
pw.dlog(f"MGM tuple has invalid length {len(mgm_tuple)}")
@ -1134,13 +1277,13 @@ def perform_mgm_calibration(pw: PrintWrapper, mgm_tuple: Tuple):
reply = CALIBR_SOCKET.recv(1024)
if len(reply) != 2:
pw.dlog(
f"MGM calibration: Reply received command magnetometer_field has invalid "
f"length {len(reply)}"
"MGM calibration: Reply received command magnetometer_field has"
f" invalid length {len(reply)}"
)
return
else:
if str(reply[0]) == "0":
pw.dlog(f"MGM calibration: magnetmeter field format was not accepted")
pw.dlog("MGM calibration: magnetmeter field format was not accepted")
return
pw.dlog(f"Sent data {mgm_list} to Helmholtz Testbench successfully")
except socket.timeout:
@ -1148,6 +1291,6 @@ def perform_mgm_calibration(pw: PrintWrapper, mgm_tuple: Tuple):
except BlockingIOError as e:
pw.dlog(f"Error {e}")
except ConnectionResetError as e:
pw.dlog("Socket was closed")
pw.dlog(f"Socket was closed: {e}")
except ConnectionRefusedError or OSError:
pw.dlog("Connecting to Calibration Socket on addrss {} failed")

View File

@ -7,43 +7,64 @@ from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.pus_tm.defs import PrintWrapper
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
from tmtccmd.config.tmtc import tmtc_definitions_provider
from tmtccmd.tc.pus_200_fsfw_mode import create_mode_command, Mode
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_3_fsfw_hk import (
make_sid,
create_request_one_hk_command,
create_enable_periodic_hk_command_with_interval,
create_disable_periodic_hk_command,
create_enable_periodic_hk_command_with_interval_with_diag,
create_disable_periodic_hk_command_with_diag,
)
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
_LOGGER = logging.getLogger(__name__)
class GpsInfo:
MAX_SATELLITES = 30
class OpCode:
REQ_OS_HK = ["hk"]
ENABLE_HK = ["enable_hk"]
DISABLE_HK = ["disable_hk"]
OFF = "off"
ON = "on"
REQ_CORE_HK = ["core_hk_request"]
ENABLE_CORE_HK = ["core_hk_enable"]
DISABLE_CORE_HK = ["core_hk_disable"]
REQ_SKYVIEW_HK = ["skyview_hk_request"]
ENABLE_SKYVIEW_HK = ["skyview_hk_enable"]
DISABLE_SKYVIEW_HK = ["skyview_hk_disable"]
RESET_GNSS = ["reset"]
class Info:
REQ_OS_HK = "Request One-Shot HK"
ENABLE_HK = "Enable HK"
DISABLE_HK = "Disable HK"
OFF = "Off"
ON = "On"
REQ_CORE_HK = "Request Core HK"
ENABLE_CORE_HK = "Enable Core HK"
DISABLE_CORE_HK = "Disable Core HK"
REQ_SKYVIEW_HK = "Request Skyview HK"
ENABLE_SKYVIEW_HK = "Enable Skyview HK"
DISABLE_SKYVIEW_HK = "Disable Skyview HK"
RESET_GNSS = "Reset GNSS using reset pin"
class SetId(enum.IntEnum):
HK = 0
CORE_HK = 0
SKYVIEW_HK = 1
@tmtc_definitions_provider
def add_gps_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCode.OFF, info=Info.OFF)
oce.add(keys=OpCode.ON, info=Info.ON)
oce.add(keys=OpCode.RESET_GNSS, info=Info.RESET_GNSS)
oce.add(keys=OpCode.REQ_OS_HK, info=Info.REQ_OS_HK)
oce.add(keys=OpCode.ENABLE_HK, info=Info.ENABLE_HK)
oce.add(keys=OpCode.DISABLE_HK, info=Info.DISABLE_HK)
oce.add(keys=OpCode.REQ_CORE_HK, info=Info.REQ_CORE_HK)
oce.add(keys=OpCode.ENABLE_CORE_HK, info=Info.ENABLE_CORE_HK)
oce.add(keys=OpCode.DISABLE_CORE_HK, info=Info.DISABLE_CORE_HK)
oce.add(keys=OpCode.REQ_SKYVIEW_HK, info=Info.REQ_SKYVIEW_HK)
oce.add(keys=OpCode.ENABLE_SKYVIEW_HK, info=Info.ENABLE_SKYVIEW_HK)
oce.add(keys=OpCode.DISABLE_SKYVIEW_HK, info=Info.DISABLE_SKYVIEW_HK)
defs.add_service(
name=CustomServiceList.GPS_CTRL.value,
info="GPS/GNSS Controller",
@ -51,32 +72,93 @@ def add_gps_cmds(defs: TmtcDefinitionWrapper):
)
def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str):
sid = make_sid(object_id=object_id, set_id=SetId.HK)
def pack_gps_command( # noqa: C901
object_id: bytes, q: DefaultPusQueueHelper, op_code: str
): # noqa: C901:
if op_code in OpCode.RESET_GNSS:
# TODO: This needs to be re-implemented
_LOGGER.warning("Reset pin handling needs to be re-implemented")
if op_code in OpCode.ENABLE_HK:
if op_code in OpCode.ENABLE_CORE_HK:
interval = float(input("Please specify interval in floating point seconds: "))
if interval <= 0:
raise ValueError("invalid interval")
q.add_log_cmd(f"GPS: {Info.ENABLE_HK}")
cmds = create_enable_periodic_hk_command_with_interval(
diag=False, sid=sid, interval_seconds=interval
q.add_log_cmd(f"GPS: {Info.ENABLE_CORE_HK}")
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
diag=False,
sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK),
interval_seconds=interval,
)
for cmd in cmds:
q.add_pus_tc(cmd)
if op_code in OpCode.DISABLE_HK:
q.add_log_cmd(f"gps: {Info.DISABLE_HK}")
q.add_pus_tc(create_disable_periodic_hk_command(diag=False, sid=sid))
if op_code in OpCode.REQ_OS_HK:
q.add_log_cmd(f"GPS: {Info.REQ_OS_HK}")
q.add_pus_tc(create_request_one_hk_command(sid=sid))
if op_code in OpCode.DISABLE_CORE_HK:
q.add_log_cmd(f"gps: {Info.DISABLE_CORE_HK}")
q.add_pus_tc(
create_disable_periodic_hk_command_with_diag(
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK)
)
)
if op_code in OpCode.REQ_CORE_HK:
q.add_log_cmd(f"GPS: {Info.REQ_CORE_HK}")
q.add_pus_tc(
create_request_one_hk_command(
sid=make_sid(object_id=object_id, set_id=SetId.CORE_HK)
)
)
if op_code in OpCode.ENABLE_SKYVIEW_HK:
interval = float(input("Please specify interval in floating point seconds: "))
if interval <= 0:
raise ValueError("invalid interval")
q.add_log_cmd(f"GPS: {Info.ENABLE_SKYVIEW_HK}")
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
diag=False,
sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK),
interval_seconds=interval,
)
for cmd in cmds:
q.add_pus_tc(cmd)
if op_code in OpCode.DISABLE_SKYVIEW_HK:
q.add_log_cmd(f"gps: {Info.DISABLE_SKYVIEW_HK}")
q.add_pus_tc(
create_disable_periodic_hk_command_with_diag(
diag=False, sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK)
)
)
if op_code in OpCode.REQ_SKYVIEW_HK:
q.add_log_cmd(f"GPS: {Info.REQ_SKYVIEW_HK}")
q.add_pus_tc(
create_request_one_hk_command(
sid=make_sid(object_id=object_id, set_id=SetId.SKYVIEW_HK)
)
)
if op_code in OpCode.ON:
q.add_log_cmd(f"GPS: {Info.ON}")
q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0))
if op_code in OpCode.OFF:
q.add_log_cmd(f"GPS: {Info.OFF}")
q.add_pus_tc(create_mode_command(object_id, Mode.OFF, 0))
def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes):
pw = PrintWrapper(printer)
pw.dlog(f"Received GPS data, HK data length {len(hk_data)}")
def handle_gps_data(
pw: PrintWrapper,
set_id: int,
hk_data: bytes,
packet_time: datetime.datetime,
):
pw.ilog(_LOGGER, f"Received GPS CTRL HK with packet time {packet_time}")
match set_id:
case SetId.CORE_HK:
handle_core_data(pw, hk_data)
case SetId.SKYVIEW_HK:
handle_skyview_data(pw, hk_data)
def handle_core_data(pw: PrintWrapper, hk_data: bytes):
if len(hk_data) < 4 * 8 + 4 + 2 + 8:
pw.dlog(
f"GPS Core dataset with size {len(hk_data)} does not have expected size"
f" of {4*8+4+2+8} bytes"
)
return
current_idx = 0
fmt_str = "!ddddBBBHBBBBBI"
inc_len = struct.calcsize(fmt_str)
@ -111,4 +193,68 @@ def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes):
)
pw.dlog(f"GNSS Date: {date_string}")
pw.dlog(f"Unix seconds {unix_seconds}")
printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=14)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=14
)
def handle_skyview_data(pw: PrintWrapper, hk_data: bytes):
data_length = 8 + GpsInfo.MAX_SATELLITES * (8 + 3 * 2 + 1)
if len(hk_data) < data_length:
pw.dlog(
f"GPS Skyview dataset with size {len(hk_data)} does not have expected size"
f" of {data_length} bytes"
)
return
current_idx = 0
fmt_str_unix = "!d"
fmt_str_int16 = "!" + "h" * GpsInfo.MAX_SATELLITES
fmt_str_double = "!" + "d" * GpsInfo.MAX_SATELLITES
fmt_str_uint8 = "!" + "B" * GpsInfo.MAX_SATELLITES
inc_len_unix = struct.calcsize(fmt_str_unix)
inc_len_int16 = struct.calcsize(fmt_str_int16)
inc_len_double = struct.calcsize(fmt_str_double)
inc_len_uint8 = struct.calcsize(fmt_str_uint8)
unix = struct.unpack(
fmt_str_unix, hk_data[current_idx : current_idx + inc_len_unix]
)[0]
current_idx += inc_len_unix
prn_id = struct.unpack(
fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16]
)
current_idx += inc_len_int16
azimuth = struct.unpack(
fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16]
)
current_idx += inc_len_int16
elevation = struct.unpack(
fmt_str_int16, hk_data[current_idx : current_idx + inc_len_int16]
)
current_idx += inc_len_int16
signal_to_noise = struct.unpack(
fmt_str_double, hk_data[current_idx : current_idx + inc_len_double]
)
current_idx += inc_len_double
used = struct.unpack(
fmt_str_uint8, hk_data[current_idx : current_idx + inc_len_uint8]
)
current_idx += inc_len_uint8
pw.dlog(f"Skyview Time: {unix} unix-sec")
pw.dlog(
"{:<8} {:<8} {:<8} {:<8} {:<8}".format(
"PRN_ID", "AZ [°]", "EL [°]", "S2N [dBHz]", "USED"
)
)
for idx in range(GpsInfo.MAX_SATELLITES):
pw.dlog(
"{:<8} {:<8} {:<8} {:<8} {:<8}".format(
prn_id[idx],
azimuth[idx],
elevation[idx],
signal_to_noise[idx],
used[idx],
)
)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=6
)

View File

@ -25,7 +25,6 @@ from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.pus_tm.defs import PrintWrapper
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
class OpCode:
@ -62,7 +61,7 @@ GYR_SEL_DICT = {
def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
print("Please select the Gyro Device")
for (k, v) in GYR_SEL_DICT.items():
for k, v in GYR_SEL_DICT.items():
print(f"{k}: {v[0]}")
sel_idx = int(input("Select gyro device by index: "))
gyr_info = GYR_SEL_DICT[GyrSel(sel_idx)]
@ -107,29 +106,24 @@ def handle_gyr_cmd(q: DefaultPusQueueHelper, op_code: str):
def handle_gyros_hk_data(
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
):
if object_id.as_bytes in [
obj_ids.GYRO_0_ADIS_HANDLER_ID,
obj_ids.GYRO_2_ADIS_HANDLER_ID,
]:
handle_adis_gyro_hk(
object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data
)
handle_adis_gyro_hk(object_id=object_id, pw=pw, set_id=set_id, hk_data=hk_data)
elif object_id.as_bytes in [
obj_ids.GYRO_1_L3G_HANDLER_ID,
obj_ids.GYRO_3_L3G_HANDLER_ID,
]:
handle_l3g_gyro_hk(
object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data
)
handle_l3g_gyro_hk(object_id=object_id, pw=pw, set_id=set_id, hk_data=hk_data)
def handle_adis_gyro_hk(
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
):
if set_id == AdisGyroSetId.CORE_HK:
pw = PrintWrapper(printer)
fmt_str = "!ddddddf"
inc_len = struct.calcsize(fmt_str)
(
@ -149,7 +143,6 @@ def handle_adis_gyro_hk(
pw.dlog(f"Acceleration (m/s^2): X {accel_x} | Y {accel_y} | Z {accel_z}")
pw.dlog(f"Temperature {temp} C")
if set_id == AdisGyroSetId.CFG_HK:
pw = PrintWrapper(printer)
fmt_str = "!HBHHH"
inc_len = struct.calcsize(fmt_str)
print(len(hk_data))
@ -168,10 +161,9 @@ def handle_adis_gyro_hk(
def handle_l3g_gyro_hk(
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
):
if set_id == L3gGyroSetId.CORE_HK:
pw = PrintWrapper(printer)
fmt_str = "!ffff"
inc_len = struct.calcsize(fmt_str)
(angVelocX, angVelocY, angVelocZ, temp) = struct.unpack(

View File

@ -24,13 +24,12 @@ from tmtccmd.tc.pus_3_fsfw_hk import (
generate_one_diag_command,
generate_one_hk_command,
create_request_one_diag_command,
create_enable_periodic_hk_command,
create_disable_periodic_hk_command,
create_enable_periodic_hk_command_with_interval,
create_enable_periodic_hk_command_with_interval_with_diag,
create_disable_periodic_hk_command_with_diag,
)
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
_LOGGER = logging.getLogger(__name__)
@ -129,7 +128,9 @@ def add_imtq_cmds(defs: TmtcDefinitionWrapper):
defs.add_service(CustomServiceList.IMTQ.value, "IMQT Device", oce)
def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str):
def pack_imtq_test_into( # noqa C901
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
):
q.add_log_cmd(
f"Testing ISIS IMTQ handler with object id: {object_id.as_hex_string}"
)
@ -226,12 +227,13 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
duration = int(
input(
f"Specify torque duration [range [0, {pow(2, 16) - 1}, "
f"0 for continuous generation until update]: "
"0 for continuous generation until update]: "
)
)
dur_str = "infinite" if duration == 0 else str(duration)
q.add_log_cmd(
f"IMTQ: Commanding dipole X={x_dipole}, Y={y_dipole}, Z={y_dipole}, duration={dur_str}"
f"IMTQ: Commanding dipole X={x_dipole}, Y={y_dipole}, Z={y_dipole},"
f" duration={dur_str}"
)
q.add_pus_tc(
pack_dipole_command(
@ -247,7 +249,7 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
if op_code == OpCode.ENABLE_ENG_HK_NO_TORQUE:
q.add_log_cmd("IMTQ: Enable ENG HK")
interval = float(input("Please enter collection interval in seconds: "))
cmds = create_enable_periodic_hk_command_with_interval(
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
diag=True,
sid=make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE),
interval_seconds=interval,
@ -257,7 +259,7 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
if op_code == OpCode.DISABLE_ENG_HK_NO_TORQUE:
q.add_log_cmd("IMTQ: Disable ENG HK (No Torque)")
q.add_pus_tc(
create_disable_periodic_hk_command(
create_disable_periodic_hk_command_with_diag(
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE)
)
)
@ -274,7 +276,7 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
if op_code == OpCode.ENABLE_ENG_HK_WITH_TORQUE:
q.add_log_cmd("IMTQ: Enable ENG HK with torque")
interval = float(input("Please enter collection interval in seconds: "))
cmds = create_enable_periodic_hk_command_with_interval(
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
diag=True,
sid=make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE),
interval_seconds=interval,
@ -284,7 +286,7 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
if op_code == OpCode.DISABLE_ENG_HK_WITH_TORQUE:
q.add_log_cmd("IMTQ: Disable ENG HK with Torque")
q.add_pus_tc(
create_disable_periodic_hk_command(
create_disable_periodic_hk_command_with_diag(
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE)
)
)
@ -319,14 +321,14 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
if op_code == OpCode.DISABLE_MGM_RAW_NO_TORQUE:
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
q.add_pus_tc(
create_disable_periodic_hk_command(
create_disable_periodic_hk_command_with_diag(
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE)
)
)
if op_code == OpCode.ENABLE_MGM_RAW_NO_TORQUE:
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
interval = float(input("Please enter collection interval in seconds: "))
cmds = create_enable_periodic_hk_command_with_interval(
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
diag=True,
sid=make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE),
interval_seconds=interval,
@ -345,7 +347,7 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
if op_code == OpCode.ENABLE_MGM_RAW_WITH_TORQUE:
q.add_log_cmd("IMTQ: Enable MGM RAW HK (No Torque)")
interval = float(input("Please enter collection interval in seconds: "))
cmds = create_enable_periodic_hk_command_with_interval(
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
diag=True,
sid=make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_WITH_TORQUE),
interval_seconds=interval,
@ -355,7 +357,7 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
if op_code == OpCode.DISABLE_MGM_RAW_WITH_TORQUE:
q.add_log_cmd("IMTQ: Disable MGM RAW HK (No Torque)")
q.add_pus_tc(
create_disable_periodic_hk_command(
create_disable_periodic_hk_command_with_diag(
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_WITH_TORQUE)
)
)
@ -387,7 +389,8 @@ def pack_dipole_command(
duration = int(round(duration))
if duration < 0 or duration > pow(2, 16) - 1:
raise ValueError(
f"Duration in ms of {duration} smaller than 0 or larger than allowed {pow(2, 16) - 1}"
f"Duration in ms of {duration} smaller than 0 or larger than allowed"
f" {pow(2, 16) - 1}"
)
command += struct.pack("!h", x_dipole)
command += struct.pack("!h", y_dipole)
@ -399,7 +402,8 @@ def pack_dipole_command(
def raise_dipole_error(dipole_str: str, value: int):
raise ValueError(
f"{dipole_str} {value} negative or larger than maximum allowed 2000 * 10^-4*Am^2"
f"{dipole_str} {value} negative or larger than maximum allowed 2000 *"
" 10^-4*Am^2"
)
@ -426,26 +430,27 @@ ENG_HK_HEADERS = [
]
def handle_imtq_hk(printer: FsfwTmTcPrinter, hk_data: bytes, set_id: int):
def handle_imtq_hk(pw: PrintWrapper, hk_data: bytes, set_id: int):
if (set_id >= ImtqSetId.POSITIVE_X_TEST) and (set_id <= ImtqSetId.NEGATIVE_Z_TEST):
return handle_self_test_data(printer, hk_data)
return handle_self_test_data(pw, hk_data)
elif set_id == ImtqSetId.ENG_HK_NO_TORQUE:
return handle_eng_set(printer, hk_data, False)
return handle_eng_set(pw, hk_data, False)
elif set_id == ImtqSetId.ENG_HK_SET_WITH_TORQUE:
return handle_eng_set(printer, hk_data, True)
return handle_eng_set(pw, hk_data, True)
elif set_id == ImtqSetId.CAL_MTM_SET:
return handle_calibrated_mtm_measurement(printer, hk_data)
return handle_calibrated_mtm_measurement(pw, hk_data)
elif set_id == ImtqSetId.RAW_MTM_NO_TORQUE:
return handle_raw_mtm_measurement(printer, hk_data, False)
return handle_raw_mtm_measurement(pw, hk_data, False)
elif set_id == ImtqSetId.RAW_MTM_WITH_TORQUE:
return handle_raw_mtm_measurement(printer, hk_data, True)
return handle_raw_mtm_measurement(pw, hk_data, True)
elif set_id == ImtqSetId.DIPOLES:
return handle_dipole_set(printer, hk_data)
return handle_dipole_set(pw, hk_data)
elif set_id == ImtqSetId.STATUS_SET:
return handle_status_set(printer, hk_data)
return handle_status_set(pw, hk_data)
else:
_LOGGER.warning(
f"IMTQ handler HK reply with unknown or unimplemented set id {set_id}"
pw.wlog(
_LOGGER,
f"IMTQ handler HK reply with unknown or unimplemented set id {set_id}",
)
@ -457,8 +462,7 @@ def unpack_status_set(hk_data: bytes) -> List:
return [status_mode, status_error, status_conf, status_uptime]
def handle_dipole_set(printer: FsfwTmTcPrinter, hk_data: bytes):
pw = PrintWrapper(printer)
def handle_dipole_set(pw: PrintWrapper, hk_data: bytes):
pw.dlog("Received iMTQ dipole set")
fmt_str = "!hhhH"
fmt_len = struct.calcsize(fmt_str)
@ -469,7 +473,7 @@ def handle_dipole_set(printer: FsfwTmTcPrinter, hk_data: bytes):
pw.dlog(f"Dipole Y: {dipole_y}")
pw.dlog(f"Dipole Z: {dipole_z}")
pw.dlog(f"Current torque duration: {current_torque_duration}")
pw.printer.print_validity_buffer(hk_data[fmt_len:], 2)
FsfwTmTcPrinter.get_validity_buffer(hk_data[fmt_len:], 2)
def unpack_eng_hk(hk_data: bytes) -> List:
@ -500,8 +504,7 @@ def unpack_eng_hk(hk_data: bytes) -> List:
return content_list
def handle_eng_set(printer: FsfwTmTcPrinter, hk_data: bytes, torque_on: bool):
pw = PrintWrapper(printer)
def handle_eng_set(pw: PrintWrapper, hk_data: bytes, torque_on: bool):
pw.dlog(f"Found engineering HK. Torque Status: {torque_on}")
content_list = unpack_eng_hk(hk_data)
validity_buffer = hk_data[32:]
@ -509,22 +512,28 @@ def handle_eng_set(printer: FsfwTmTcPrinter, hk_data: bytes, torque_on: bool):
num_of_vars = len(ENG_HK_HEADERS)
for k, v in zip(ENG_HK_HEADERS, content_list):
pw.dlog(f"{k.ljust(30)}: {v}")
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
pw.dlog(
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=validity_buffer, num_vars=num_of_vars
)
)
def handle_status_set(printer: FsfwTmTcPrinter, hk_data: bytes):
pw = PrintWrapper(printer)
def handle_status_set(pw: PrintWrapper, hk_data: bytes):
content_list = unpack_status_set(hk_data)
validity_buffer = hk_data[7:]
num_of_vars = 4
for k, v in zip(STATUS_HEADERS, content_list):
pw.dlog(f"{k.ljust(30)}: {v}")
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
pw.dlog(
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=validity_buffer, num_vars=num_of_vars
)
)
def handle_calibrated_mtm_measurement(printer: FsfwTmTcPrinter, hk_data: bytes):
pw = PrintWrapper(printer)
def handle_calibrated_mtm_measurement(pw: PrintWrapper, hk_data: bytes):
header_list = [
"Calibrated MTM X [nT]",
"Calibrated MTM Y [nT]",
@ -540,13 +549,14 @@ def handle_calibrated_mtm_measurement(printer: FsfwTmTcPrinter, hk_data: bytes):
num_of_vars = len(header_list)
pw.dlog(str(header_list))
pw.dlog(str(content_list))
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
pw.dlog(
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=validity_buffer, num_vars=num_of_vars
)
)
def handle_raw_mtm_measurement(
printer: FsfwTmTcPrinter, hk_data: bytes, torque_status: bool
):
pw = PrintWrapper(printer)
def handle_raw_mtm_measurement(pw: PrintWrapper, hk_data: bytes, torque_status: bool):
pw.dlog(f"Found raw MTM measurement. Torque Status: {torque_status}")
header_list = [
"Raw MTM X [nT]",
@ -563,11 +573,14 @@ def handle_raw_mtm_measurement(
num_of_vars = 2
pw.dlog(str(header_list))
pw.dlog(str(content_list))
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
pw.dlog(
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=validity_buffer, num_vars=num_of_vars
)
)
def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes):
pw = PrintWrapper(printer)
def handle_self_test_data(pw: PrintWrapper, hk_data: bytes):
header_list = [
"Init Err",
"Init Raw Mag X [nT]",
@ -671,7 +684,7 @@ def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes):
init_coil_z_temperature,
err,
raw_mag_x,
init_raw_mag_y,
raw_mag_y,
raw_mag_z,
cal_mag_x,
cal_mag_y,
@ -699,4 +712,8 @@ def handle_self_test_data(printer: FsfwTmTcPrinter, hk_data: bytes):
num_of_vars = len(header_list)
pw.dlog(str(header_list))
pw.dlog(str(content_list))
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=num_of_vars)
pw.dlog(
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=validity_buffer, num_vars=num_of_vars
)
)

View File

@ -17,7 +17,6 @@ from tmtccmd.config.tmtc import tmtc_definitions_provider, TmtcDefinitionWrapper
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import create_mode_command, Mode
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
class OpCode:
@ -50,7 +49,7 @@ MGM_SEL_DICT = {
def handle_mgm_cmd(q: DefaultPusQueueHelper, op_code: str):
print("Please select the MGM Device")
for (k, v) in MGM_SEL_DICT.items():
for k, v in MGM_SEL_DICT.items():
print(f"{k}: {v[0]}")
sel_idx = int(input("Select MGM device by index: "))
mgm_info = MGM_SEL_DICT[MgmSel(sel_idx)]
@ -64,26 +63,25 @@ def handle_mgm_cmd(q: DefaultPusQueueHelper, op_code: str):
def handle_mgm_hk_data(
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
):
if object_id.as_bytes in [
obj_ids.MGM_0_LIS3_HANDLER_ID,
obj_ids.MGM_2_LIS3_HANDLER_ID,
]:
handle_mgm_lis3_hk_data(object_id, printer, set_id, hk_data)
handle_mgm_lis3_hk_data(object_id, pw, set_id, hk_data)
elif object_id.as_bytes in [
obj_ids.MGM_1_RM3100_HANDLER_ID,
obj_ids.MGM_3_RM3100_HANDLER_ID,
]:
handle_mgm_rm3100_hk_data(object_id, printer, set_id, hk_data)
handle_mgm_rm3100_hk_data(object_id, pw, set_id, hk_data)
pass
def handle_mgm_lis3_hk_data(
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
):
if set_id == MgmLis3SetId.CORE_HK:
pw = PrintWrapper(printer)
fmt_str = "!ffff"
inc_len = struct.calcsize(fmt_str)
(field_x, field_y, field_z, temp) = struct.unpack(
@ -97,11 +95,10 @@ def handle_mgm_lis3_hk_data(
def handle_mgm_rm3100_hk_data(
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
):
if set_id == MgmRm3100SetId.CORE_HK:
pw = PrintWrapper(printer)
fmt_str = f"!fff"
fmt_str = "!fff"
inc_len = struct.calcsize(fmt_str)
(field_x, field_y, field_z) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len])
pw.dlog(f"Received MGM RM3100 from object {object_id}")

View File

@ -20,22 +20,24 @@ from tmtccmd.tc.pus_3_fsfw_hk import (
enable_periodic_hk_command_with_interval,
disable_periodic_hk_command,
)
from tmtccmd.tc.pus_8_fsfw_funccmd import create_action_cmd
from spacepackets.ecss.tc import PusTelecommand
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode, Subservice
from eive_tmtc.config.definitions import CustomServiceList
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
class OpCodesDev:
SPEED = ["0", "speed"]
ON = ["1", "on"]
NML = ["2", "nml"]
OFF = ["3", "off"]
GET_STATUS = ["4", "status"]
GET_TM = ["5", "tm"]
ENABLE_STATUS_HK = ["6", "enable_status_hk"]
DISABLE_STATUS_HK = ["7", "disable_status_hk"]
SPEED = "speed"
ON = "on"
NML = "nml"
OFF = "off"
GET_STATUS = "status"
GET_TM = "get_tm_set"
REQ_TM = "req_tm_set"
ENABLE_STATUS_HK = "enable_status_hk"
DISABLE_STATUS_HK = "disable_status_hk"
class InfoDev:
@ -45,6 +47,7 @@ class InfoDev:
OFF = "Set Off"
GET_STATUS = "Get Status HK"
GET_TM = "Get TM HK"
REQ_TM = "Request TM HK"
ENABLE_STATUS_HK = "Enable Status HK"
DISABLE_STATUS_HK = "Disable Status HK"
@ -57,6 +60,10 @@ class OpCodesAss:
ALL_SPEED_OFF = ["4", "speed_off"]
class ActionId:
REQUEST_TM = 9
class InfoAss:
ON = "Mode On: 3/4 RWs min. on"
NML = "Mode Normal: 3/4 RWs min. normal"
@ -99,6 +106,7 @@ def add_rw_cmds(defs: TmtcDefinitionWrapper):
oce.add(info=InfoDev.ON, keys=OpCodesDev.ON)
oce.add(info=InfoDev.OFF, keys=OpCodesDev.OFF)
oce.add(info=InfoDev.NML, keys=OpCodesDev.NML)
oce.add(info=InfoDev.REQ_TM, keys=OpCodesDev.REQ_TM)
oce.add(info=InfoDev.GET_STATUS, keys=OpCodesDev.GET_STATUS)
oce.add(info=InfoDev.GET_TM, keys=OpCodesDev.GET_TM)
oce.add(info=InfoDev.ENABLE_STATUS_HK, keys=OpCodesDev.ENABLE_STATUS_HK)
@ -136,10 +144,10 @@ def add_rw_cmds(defs: TmtcDefinitionWrapper):
)
def pack_single_rw_test_into(
def pack_single_rw_test_into( # noqa C901: Complexity is okay here.
object_id: bytes, rw_idx: int, q: DefaultPusQueueHelper, op_code: str
):
if op_code in OpCodesDev.SPEED:
if op_code == OpCodesDev.SPEED:
speed, ramp_time = prompt_speed_ramp_time()
q.add_log_cmd(
f"RW {rw_idx}: {InfoDev.SPEED} with target "
@ -147,28 +155,33 @@ def pack_single_rw_test_into(
)
q.add_pus_tc(pack_set_speed_command(object_id, speed, ramp_time))
if op_code in OpCodesDev.ON:
if op_code == OpCodesDev.ON:
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.ON}")
mode_data = pack_mode_data(object_id, Mode.ON, 0)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
if op_code in OpCodesDev.NML:
if op_code == OpCodesDev.NML:
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.NML}")
mode_data = pack_mode_data(object_id, Mode.NORMAL, 0)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
if op_code in OpCodesDev.OFF:
if op_code == OpCodesDev.OFF:
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.OFF}")
mode_data = pack_mode_data(object_id, Mode.OFF, 0)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
if op_code in OpCodesDev.GET_TM:
if op_code == OpCodesDev.GET_TM:
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.GET_TM}")
q.add_pus_tc(
generate_one_hk_command(
sid=make_sid(object_id=object_id, set_id=RwSetId.TM_SET)
)
)
if op_code == OpCodesDev.REQ_TM:
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.REQ_TM}")
q.add_pus_tc(
create_action_cmd(object_id=object_id, action_id=ActionId.REQUEST_TM)
)
if op_code in OpCodesDev.GET_STATUS:
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.GET_STATUS}")
q.add_pus_tc(
@ -248,14 +261,12 @@ def pack_set_speed_command(
if speed > 0:
if speed < 1000 or speed > 65000:
raise ValueError(
"Invalid RW speed specified. "
"Allowed range is [1000, 65000] 0.1 * RPM"
"Invalid RW speed specified. Allowed range is [1000, 65000] 0.1 * RPM"
)
elif speed < 0:
if speed < -65000 or speed > -1000:
raise ValueError(
"Invalid RW speed specified. "
"Allowed range is [-65000, -1000] 0.1 * RPM"
"Invalid RW speed specified. Allowed range is [-65000, -1000] 0.1 * RPM"
)
else:
# Speed is 0
@ -275,10 +286,8 @@ def pack_set_speed_command(
def handle_rw_hk_data(
printer: FsfwTmTcPrinter, object_id: ObjectIdU32, set_id: int, hk_data: bytes
pw: PrintWrapper, object_id: ObjectIdU32, set_id: int, hk_data: bytes
):
pw = PrintWrapper(printer)
current_idx = 0
if set_id == RwSetId.STATUS_SET_ID:
pw.dlog(
@ -293,17 +302,18 @@ def handle_rw_hk_data(
speed_rpm = speed / 10.0
ref_speed_rpm = ref_speed / 10.0
pw.dlog(
f"Temperature {temp} C | Speed {speed_rpm} rpm | Reference Speed {ref_speed_rpm} rpm"
f"Temperature {temp} C | Speed {speed_rpm} rpm | Reference Speed"
f" {ref_speed_rpm} rpm"
)
pw.dlog(
f"State {state}. 0: Error, 1: Idle, 2: Coasting, 3: Running, speed stable, "
f"4: Running, speed changing"
"4: Running, speed changing"
)
pw.dlog(
f"Current Limit Control mode {clc_mode}. 0: Low Current Mode (0.3 A), "
f"1: High Current Mode (0.6 A)"
"1: High Current Mode (0.6 A)"
)
printer.print_validity_buffer(hk_data[current_idx:], 5)
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 5))
if set_id == RwSetId.LAST_RESET:
pw.dlog(
f"Received Last Reset HK (ID {set_id}) from Reaction Wheel {object_id.name}"
@ -350,22 +360,24 @@ def handle_rw_hk_data(
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
pw.dlog(
f"MCU Temperature {mcu_temp} | Pressure Sensore Temperature {pressure_sens_temp} C"
f"MCU Temperature {mcu_temp} | Pressure Sensore Temperature"
f" {pressure_sens_temp} C"
)
pw.dlog(f"Last Reset Status {last_reset_status}")
pw.dlog(
f"Current Limit Control mode {clc_mode}. 0: Low Current Mode (0.3 A), "
f"1: High Current Mode (0.6 A)"
"1: High Current Mode (0.6 A)"
)
pw.dlog(f"Speed {current_speed} rpm | Reference Speed {ref_speed} rpm")
pw.dlog(
f"State {state}. 0: Error, 1: Idle, 2: Coasting, 3: Running, speed stable, "
f"4: Running, speed changing"
"4: Running, speed changing"
)
pw.dlog(f"Number Of Invalid Packets:")
pw.dlog("Number Of Invalid Packets:")
pw.dlog("CRC | Length | CMD")
pw.dlog(
f"{num_invalid_crc_packets} | {num_invalid_len_packets} | {num_invalid_cmd_packets}"
f"{num_invalid_crc_packets} | {num_invalid_len_packets} |"
f" {num_invalid_cmd_packets}"
)
pw.dlog(
f"Num Of CMD Executed Requests {num_of_cmd_executed_requests} | "
@ -373,23 +385,26 @@ def handle_rw_hk_data(
)
pw.dlog("UART COM information:")
pw.dlog(
f"NumBytesWritten | NumBytesRead | ParityErrs | NoiseErrs | FrameErrs | "
f"RegOverrunErrs | TotalErrs"
"NumBytesWritten | NumBytesRead | ParityErrs | NoiseErrs | FrameErrs | "
"RegOverrunErrs | TotalErrs"
)
pw.dlog(
f"{uart_num_of_bytes_written} | {uart_num_of_bytes_read} | {uart_num_parity_errors} | "
f"{uart_num_noise_errors} | {uart_num_frame_errors} | {uart_num_reg_overrun_errors} | "
f"{uart_total_num_errors}"
f"{uart_num_of_bytes_written} | {uart_num_of_bytes_read} |"
f" {uart_num_parity_errors} | {uart_num_noise_errors} |"
f" {uart_num_frame_errors} | {uart_num_reg_overrun_errors} |"
f" {uart_total_num_errors}"
)
pw.dlog("SPI COM Info:")
pw.dlog(f"NumBytesWritten | NumBytesRead | RegOverrunErrs | TotalErrs")
pw.dlog("NumBytesWritten | NumBytesRead | RegOverrunErrs | TotalErrs")
pw.dlog(
f"{spi_num_bytes_written} | {spi_num_bytes_read} | {spi_num_reg_overrun_errors} | "
f"{spi_total_num_errors}"
f"{spi_num_bytes_written} | {spi_num_bytes_read} |"
f" {spi_num_reg_overrun_errors} | {spi_total_num_errors}"
)
if current_idx > 0:
printer.print_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=27
pw.dlog(
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=27
)
)

View File

@ -20,7 +20,8 @@ from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_diag_command, make_sid
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from eive_tmtc.config.object_ids import STR_ASSEMBLY, STAR_TRACKER_ID
_LOGGER = logging.getLogger(__name__)
@ -64,7 +65,6 @@ class StarTrackerActionId(enum.IntEnum):
CHANGE_DOWNLOAD_IMAGE = 57
SET_JSON_FILE_NAME = 58
SET_FLASH_READ_FILENAME = 59
SET_TIME = 60
DOWNLOAD_DBIMAGE = 61
DOWNLOAD_BLOBPIXEL = 62
DOWNLOAD_FPGA_IMAGE = 63
@ -89,6 +89,7 @@ class StarTrackerActionId(enum.IntEnum):
LOG_SUBSCRIPTION = 82
DEBUG_CAMERA = 83
FIRMWARE_UPDATE = 84
SET_TIME_FROM_SYS_TIME = 87
class OpCodes:
@ -97,12 +98,23 @@ class OpCodes:
NORMAL = "nml"
OFF = "off"
PING = "ping"
REQUEST_SOLUTION_SET = "request_sol_set"
REQUEST_SOLUTION_SET_HK = "hk_req_sol"
REQUEST_SOLUTION_SET_ACTION = "action_req_sol"
TAKE_IMAGE = "take_image"
UPLOAD_IMAGE = "upload_image"
SET_IMG_PROCESSOR_MODE = "set_img_proc_mode"
FW_UPDATE = "fw_update"
SET_TIME_FROM_SYS_TIME = "set_time"
class Info:
REQUEST_SOLUTION_SET = "Request Solution Set HK once"
REQUEST_SOLUTION_SET_HK = "Request Solution Set HK once"
REQUEST_SOLUTION_SET_ACTION = "Request Solution Set Action"
UPLOAD_IMAGE = "Upload Image"
TAKE_IMAGE = "Take Image"
SET_IMG_PROCESSOR_MODE = "Set Image Processor Mode"
FW_UPDATE = "Firmware Update"
SET_TIME_FROM_SYS_TIME = "Set time from system time"
class SetId(enum.IntEnum):
@ -128,39 +140,42 @@ class FileDefs:
egse_histogram_upload_img_config = (
"/home/pi/arcsec/json/upload-image-histogram.json"
)
q7s_ground_config = "/mnt/sd0/startracker/json/ground-config.json"
q7s_ground_config = "/mnt/sd0/startracker/ground-config.json"
q7s_flight_config = "/mnt/sd0/startracker/flight-config.json"
firmware2_1 = "/home/pi/arcsec/firmware/sagitta-2-1.bin"
firmware22_1 = "/home/pi/arcsec/firmware/sagitta-22-1.bin"
firmware_origin = "/home/pi/arcsec/firmware/sagitta-origin.bin"
FW_SLOT_Q7S = "/mnt/sd0/startracker/updates/sagitta-update.bin"
json_dict = {
"1": ["Q7S flight config", FileDefs.q7s_flight_config],
"2": ["Q7S ground config", FileDefs.q7s_ground_config],
"3": ["EGSE flight config", FileDefs.egse_flight_config],
"4": ["EGSE ground config", FileDefs.egse_ground_config],
"5": [
"1": ("Q7S flight config", FileDefs.q7s_flight_config),
"2": ("Q7S ground config", FileDefs.q7s_ground_config),
"3": ("EGSE flight config", FileDefs.egse_flight_config),
"4": ("EGSE ground config", FileDefs.egse_ground_config),
"5": (
"EGSE get solution, upload image config",
FileDefs.egse_solution_upload_img_config,
],
"6": [
),
"6": (
"EGSE get histogram, upload image config",
FileDefs.egse_solution_upload_img_config,
],
),
}
firmware_dict = {
"1": ["Firmware Major = 2, Minor = 1", FileDefs.firmware2_1],
"2": ["Firmware Major = 22, Minor = 1", FileDefs.firmware22_1],
"3": ["Firmware Origin", FileDefs.firmware_origin],
FW_DICT = {
"0": ("Firmware Update Q7S", FileDefs.FW_SLOT_Q7S),
"1": ("Firmware Major = 2, Minor = 1", FileDefs.firmware2_1),
"2": ("Firmware Major = 22, Minor = 1", FileDefs.firmware22_1),
"3": ("Firmware Origin", FileDefs.firmware_origin),
}
upload_image_dict = {
"1": ["q7s gemma", "/mnt/sd0/startracker/gemma.bin"],
"2": ["egse gemma", "/home/pi/arcsec/star-images/gemma.bin"],
"3": ["q7s polaris", "/mnt/sd0/startracker/polaris.bin"],
"4": ["egse polaris", "/home/pi/arcsec/star-images/polaris.bin"],
UPLOAD_IMAGE_DICT = {
"0": ("custom path", "Custom Path"),
"1": ("q7s gemma", "/mnt/sd0/startracker/gemma.bin"),
"2": ("egse gemma", "/home/pi/arcsec/star-images/gemma.bin"),
"3": ("q7s polaris", "/mnt/sd0/startracker/polaris.bin"),
"4": ("egse polaris", "/home/pi/arcsec/star-images/polaris.bin"),
}
@ -181,7 +196,15 @@ class Submode(enum.IntEnum):
FIRMWARE = 2
def pack_star_tracker_commands(
def prompt_object_id_mode_cmd() -> bytes:
cmd_assy = input("Command Assembly (0) or Device Handler (1) ?: ")
if cmd_assy == "0":
return STR_ASSEMBLY
else:
return STAR_TRACKER_ID
def pack_star_tracker_commands( # noqa C901
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
):
q.add_log_cmd(
@ -190,23 +213,27 @@ def pack_star_tracker_commands(
obyt = object_id.as_bytes
if op_code == OpCodes.ON_BOOTLOADER:
q.add_log_cmd("Star tracker: Mode On, Submode Bootloader")
data = pack_mode_data(obyt, Mode.ON, Submode.BOOTLOADER)
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.ON, Submode.BOOTLOADER)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
if op_code == OpCodes.ON_FIRMWARE:
q.add_log_cmd("Star tracker: Mode On, Submode Firmware")
data = pack_mode_data(obyt, Mode.ON, Submode.FIRMWARE)
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.ON, Submode.FIRMWARE)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
if op_code == OpCodes.NORMAL:
q.add_log_cmd("Star tracker: Mode Normal")
data = pack_mode_data(obyt, Mode.NORMAL, 0)
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.NORMAL, 0)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
if op_code == OpCodes.OFF:
q.add_log_cmd("Star tracker: Mode Off")
data = pack_mode_data(obyt, Mode.OFF, 0)
data = pack_mode_data(prompt_object_id_mode_cmd(), Mode.OFF, 0)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
if op_code == OpCodes.REQUEST_SOLUTION_SET:
q.add_log_cmd(Info.REQUEST_SOLUTION_SET)
if op_code == OpCodes.REQUEST_SOLUTION_SET_HK:
q.add_log_cmd(Info.REQUEST_SOLUTION_SET_HK)
q.add_pus_tc(create_request_one_diag_command(make_sid(obyt, SetId.SOLUTION)))
if op_code == OpCodes.REQUEST_SOLUTION_SET_ACTION:
q.add_log_cmd("Star tracker: Request solution")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_SOLUTION)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "4":
q.add_log_cmd("Star tracker: Mode Raw")
data = pack_mode_data(obyt, Mode.RAW, 0)
@ -254,11 +281,7 @@ def pack_star_tracker_commands(
q.add_log_cmd("Star tracker: Request time")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_TIME)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "14":
q.add_log_cmd("Star tracker: Request solution")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_SOLUTION)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "15":
if op_code == OpCodes.UPLOAD_IMAGE:
q.add_log_cmd("Star tracker: Upload image")
image = get_upload_image()
data = (
@ -361,7 +384,9 @@ def pack_star_tracker_commands(
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == OpCodes.TAKE_IMAGE:
q.add_log_cmd("Star tracker: Take image")
actionid = int(input("Specify parameter ID (take image - 4): "))
actionid = int(
input("Specify parameter ID (4: take image, 7: get histogram): ")
)
data = (
obyt
+ struct.pack("!I", StarTrackerActionId.TAKE_IMAGE)
@ -415,14 +440,9 @@ def pack_star_tracker_commands(
q.add_log_cmd("Star tracker: Get checksum")
data = pack_checksum_command(obyt)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "38":
q.add_log_cmd("Star tracker: Set time")
unix_time = 1640783543
data = (
obyt
+ struct.pack("!I", StarTrackerActionId.SET_TIME)
+ struct.pack("!Q", unix_time)
)
if op_code == OpCodes.SET_TIME_FROM_SYS_TIME:
q.add_log_cmd(Info.SET_TIME_FROM_SYS_TIME)
data = obyt + struct.pack("!I", StarTrackerActionId.SET_TIME_FROM_SYS_TIME)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "39":
q.add_log_cmd("Star tracker: Download Centroid")
@ -462,34 +482,6 @@ def pack_star_tracker_commands(
+ struct.pack("!B", type)
)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "44":
q.add_log_cmd("Star tracker: Download FPGA Image")
position = int(input("Start position: "))
length = int(input("Size to download: "))
data = (
obyt
+ struct.pack("!I", StarTrackerActionId.DOWNLOAD_FPGA_IMAGE)
+ struct.pack("!I", position)
+ struct.pack("!I", length)
+ bytearray(FileDefs.downloadFpgaImagePath, "utf-8")
)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "45":
q.add_log_cmd("Star tracker: Change donwload FPGA image file name")
data = (
obyt
+ struct.pack("!I", StarTrackerActionId.CHANGE_FPGA_DOWNLOAD_FILE)
+ bytearray(FileDefs.downloadFpgaImageName, "utf-8")
)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "46":
q.add_log_cmd("Star tracker: Upload FPGA image")
data = (
obyt
+ struct.pack("!I", StarTrackerActionId.UPLOAD_FPGA_IMAGE)
+ bytearray(FileDefs.uploadFpgaImageName, "utf-8")
)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "47":
q.add_log_cmd("Star tracker: FPGA action")
id = 3
@ -511,8 +503,8 @@ def pack_star_tracker_commands(
q.add_log_cmd("Star tracker: Request limits")
data = obyt + struct.pack("!I", StarTrackerActionId.REQ_LIMITS)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "51":
q.add_log_cmd("Star tracker: Set image processor parameters")
if op_code == OpCodes.SET_IMG_PROCESSOR_MODE:
q.add_log_cmd(Info.SET_IMG_PROCESSOR_MODE)
json_file = get_config_file()
data = (
obyt
@ -612,13 +604,13 @@ def pack_star_tracker_commands(
+ bytearray(json_file, "utf-8")
)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "69":
q.add_log_cmd("Star tracker: Firmware update")
if op_code == OpCodes.FW_UPDATE:
q.add_log_cmd(Info.FW_UPDATE)
firmware = get_firmware()
data = (
obyt
+ struct.pack("!I", StarTrackerActionId.FIRMWARE_UPDATE)
+ bytearray(firmware, "utf-8")
+ firmware.encode()
)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
@ -663,22 +655,28 @@ def get_config_file() -> str:
def get_firmware() -> str:
_LOGGER.info("Specify firmware file")
input_helper = InputHelper(firmware_dict)
key = input_helper.get_key()
firmware = firmware_dict[key][1]
bin_select = int(input("Use hardcoded paths (0) or specify path manually (1) ?: "))
if bin_select == 0:
input_helper = InputHelper(FW_DICT)
key = input_helper.get_key()
firmware = FW_DICT[key][1]
else:
firmware = input("Specify absolute path of the firmware update file: ")
return firmware
def get_upload_image() -> str:
_LOGGER.info("Specify image to upload")
input_helper = InputHelper(upload_image_dict)
input_helper = InputHelper(UPLOAD_IMAGE_DICT)
key = input_helper.get_key()
image = upload_image_dict[key][1]
if UPLOAD_IMAGE_DICT[key][0] == "custom path":
image = input("Please specify custom absolute path: ")
else:
image = UPLOAD_IMAGE_DICT[key][1]
return image
def handle_str_hk_data(set_id: int, hk_data: bytes, printer: FsfwTmTcPrinter):
pw = PrintWrapper(printer)
def handle_str_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
pw.dlog(f"Received STR HK set with set ID {set_id}")
if set_id == SetId.SOLUTION:
handle_solution_set(hk_data, pw)
@ -695,7 +693,7 @@ def unpack_time_hk(hk_data: bytes, current_idx: int, pw: PrintWrapper) -> int:
ticks_time_fmt, hk_data[current_idx : current_idx + fmt_len]
)
unix_as_dt = datetime.datetime.fromtimestamp(
int(round(unix_time / 10e6)), tz=datetime.timezone.utc
int(round(unix_time / 1e6)), tz=datetime.timezone.utc
)
pw.dlog(f"Ticks: {ticks} | UNIX time: {unix_time}")
pw.dlog(f"UNIX as datetime: {unix_as_dt}")
@ -717,7 +715,7 @@ def handle_temperature_set(hk_data: bytes, pw: PrintWrapper):
pw.dlog(f"CMOS Temperature: {cmos_temp}")
pw.dlog(f"FPGA Temperature: {fpga_temp}")
current_idx += fmt_len
pw.printer.print_validity_buffer(hk_data[current_idx:], 5)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 5)
def handle_solution_set(hk_data: bytes, pw: PrintWrapper):
@ -779,8 +777,11 @@ def handle_solution_set(hk_data: bytes, pw: PrintWrapper):
)
pw.dlog(f"Number of close stars in LISA solution: {lisa_number_close_stars}")
current_idx += fmt_len
is_trusworthy = hk_data[current_idx]
pw.dlog(f"Trustworthy solution: {is_trusworthy}")
str_mode = hk_data[current_idx]
pw.dlog(f"STR mode: {str_mode}")
current_idx += 1
is_trustworthy = hk_data[current_idx]
pw.dlog(f"Trustworthy solution: {is_trustworthy}")
current_idx += 1
stable_count = struct.unpack("!I", hk_data[current_idx : current_idx + 4])[0]
pw.dlog(f"Stable count: {stable_count}")
@ -788,7 +789,7 @@ def handle_solution_set(hk_data: bytes, pw: PrintWrapper):
solution_strategy = hk_data[current_idx]
pw.dlog(f"Solution strategy: {solution_strategy}")
current_idx += 1
pw.printer.print_validity_buffer(hk_data[current_idx:], 23)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 23)
@tmtc_definitions_provider
@ -798,10 +799,13 @@ def add_str_cmds(defs: TmtcDefinitionWrapper):
oce.add(OpCodes.ON_FIRMWARE, "Mode On, Submode Firmware")
oce.add(OpCodes.NORMAL, "Mode Normal")
oce.add(OpCodes.OFF, "Mode Off")
oce.add("4", "Star Tracker: Mode Raw")
# oce.add("4", "Star Tracker: Mode Raw")
oce.add(OpCodes.PING, "Star Tracker: Ping")
oce.add(OpCodes.TAKE_IMAGE, "Take Image")
oce.add(OpCodes.REQUEST_SOLUTION_SET, "Request Solution Set HK")
oce.add(OpCodes.REQUEST_SOLUTION_SET_HK, Info.REQUEST_SOLUTION_SET_HK)
oce.add(OpCodes.REQUEST_SOLUTION_SET_ACTION, Info.REQUEST_SOLUTION_SET_ACTION)
oce.add(OpCodes.UPLOAD_IMAGE, Info.UPLOAD_IMAGE)
oce.add(OpCodes.SET_IMG_PROCESSOR_MODE, Info.SET_IMG_PROCESSOR_MODE)
oce.add("6", "Star Tracker: Switch to bootloader program")
oce.add("7", "Star Tracker: Request temperature")
oce.add("8", "Star Tracker: Request version")
@ -811,7 +815,6 @@ def add_str_cmds(defs: TmtcDefinitionWrapper):
oce.add("12", "Star Tracker: Boot image (requires bootloader mode)")
oce.add("13", "Star Tracker: Request time")
oce.add("14", "Star Tracker: Request solution")
oce.add("15", "Star Tracker: Upload image")
oce.add("16", "Star Tracker: Download image")
oce.add("17", "Star Tracker: Set limit parameters")
oce.add("17", "Star Tracker: Set limit parameters")
@ -833,7 +836,6 @@ def add_str_cmds(defs: TmtcDefinitionWrapper):
oce.add("37", "Star Tracker: Get checksum")
oce.add("49", "Star Tracker: Request camera parameter")
oce.add("50", "Star Tracker: Request limits")
oce.add("51", "Star Tracker: Set image processor parameters")
oce.add("52", "Star Tracker: (EGSE only) Load camera ground config")
oce.add("53", "Star Tracker: (EGSE only) Load camera flight config")
oce.add("54", "Star Tracker: Request log level parameters")
@ -851,7 +853,8 @@ def add_str_cmds(defs: TmtcDefinitionWrapper):
oce.add("66", "Star Tracker: Set log level parameters")
oce.add("67", "Star Tracker: Set log subscription parameters")
oce.add("68", "Star Tracker: Set debug camera parameters")
oce.add("69", "Star Tracker: Firmware update")
oce.add(OpCodes.FW_UPDATE, Info.FW_UPDATE)
oce.add("70", "Star Tracker: Disable timestamp generation")
oce.add("71", "Star Tracker: Enable timestamp generation")
oce.add(OpCodes.SET_TIME_FROM_SYS_TIME, Info.SET_TIME_FROM_SYS_TIME)
defs.add_service(CustomServiceList.STAR_TRACKER.value, "Star Tracker", oce)

View File

@ -4,7 +4,8 @@
@brief Commanding of the star tracker image helper object which is responsible for uploading
and downloading images to/from the star tracker.
@details Images to uplaod must be previously transferred to the OBC with the CFDP protocol.
Also downloaded images will be stored on the filesystem of the OBC and can be transferred via CFDP.
Also downloaded images will be stored on the filesystem of the OBC and can be
transferred via CFDP.
@author J. Meier
@date 29.11.2021
"""

View File

@ -3,7 +3,7 @@ import struct
from eive_tmtc.pus_tm.defs import PrintWrapper
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
class SetId(enum.IntEnum):
@ -11,9 +11,8 @@ class SetId(enum.IntEnum):
def handle_sus_hk(
object_id: ObjectIdU32, hk_data: bytes, printer: FsfwTmTcPrinter, set_id: int
object_id: ObjectIdU32, hk_data: bytes, pw: PrintWrapper, set_id: int
):
pw = PrintWrapper(printer)
pw.dlog(f"Received SUS HK data from {object_id}")
if set_id == SetId.HK:
current_idx = 0
@ -24,7 +23,9 @@ def handle_sus_hk(
channels.append(struct.unpack("!H", hk_data[current_idx : current_idx + 2]))
current_idx += 2
pw.dlog(f"Temperature: {temperature} C")
pw.dlog(f"AIN Channel | Raw Value (hex) | Raw Value (dec)")
pw.dlog("AIN Channel | Raw Value (hex) | Raw Value (dec)")
for idx, val in enumerate(channels):
pw.dlog(f"{idx} | {val[0]:#06x} |" + str(val[0]).ljust(5))
printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=7)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=7
)

View File

@ -18,7 +18,6 @@ from tmtccmd.config.tmtc import (
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import create_mode_command, Mode
from tmtccmd.util import ObjectIdU32
from eive_tmtc.config.object_ids import CCSDS_HANDLER_ID
class ActionId(enum.IntEnum):
@ -67,7 +66,7 @@ class Info:
DISABLE_ACTION = "Disable TX (legacy)"
def pack_ccsds_handler_test(
def pack_ccsds_handler_command( # noqa C901
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
):
obyt = object_id.as_bytes

View File

@ -2,6 +2,7 @@ import enum
class Mode(enum.IntEnum):
NONE = 0
RX_ONLY = 10
RX_AND_TX_DEF_DATARATE = 11
RX_AND_TX_LOW_DATARATE = 12

View File

@ -5,11 +5,13 @@
@author J. Meier
@date 22.11.2021
"""
import enum
from spacepackets.ecss.tc import PusTelecommand
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_20_fsfw_param import create_load_param_cmd
from tmtccmd.tc.pus_8_fsfw_funccmd import create_action_cmd
from tmtccmd.pus.s20_fsfw_param_defs import create_scalar_u8_parameter
from tmtccmd.config.tmtc import (
@ -28,16 +30,23 @@ class CommandId:
PRINT_PDEC_MON = bytearray([0x0, 0x0, 0x0, 0x1])
class ParameterId:
class ParameterId(enum.IntEnum):
POSITIVE_WINDOW = 0
NEGATIVE_WINDOW = 1
class ActionId(enum.IntEnum):
RESET_NO_INIT = 2
RESET_WITH_INIT = 3
class OpCode:
PRINT_CLCW = "print_clcw"
PRINT_MON_REG = "print_mon_reg"
POSITIVE_WINDOW = "positive_window"
NEGATIVE_WINDOW = "negative_window"
RESET_WITH_INIT = "reset_with_init"
RESET_NO_INIT = "reset_no_init"
class Info:
@ -47,6 +56,8 @@ class Info:
)
POSITIVE_WINDOW = "Change positive window parameter for AD frames"
NEGATIVE_WINDOW = "Change negative window parameter for AD frames"
RESET_WITH_INIT = "Reset with full initialization"
RESET_NO_INIT = "Reset with mandatory initialization"
def pack_pdec_handler_test(
@ -72,7 +83,7 @@ def pack_pdec_handler_test(
0,
ParameterId.POSITIVE_WINDOW,
pw,
).pack()
)
)
)
if op_code == OpCode.NEGATIVE_WINDOW:
@ -85,9 +96,19 @@ def pack_pdec_handler_test(
0,
ParameterId.NEGATIVE_WINDOW,
nw,
).pack()
)
)
)
if op_code == OpCode.RESET_NO_INIT:
q.add_log_cmd(f"{prefix}: {Info.RESET_NO_INIT}")
q.add_pus_tc(
create_action_cmd(object_id=object_id, action_id=ActionId.RESET_NO_INIT)
)
if op_code == OpCode.RESET_WITH_INIT:
q.add_log_cmd(f"{prefix}: {Info.RESET_WITH_INIT}")
q.add_pus_tc(
create_action_cmd(object_id=object_id, action_id=ActionId.RESET_WITH_INIT)
)
@tmtc_definitions_provider
@ -97,4 +118,6 @@ def add_pdec_cmds(defs: TmtcDefinitionWrapper):
oce.add(OpCode.PRINT_MON_REG, Info.PRINT_MON_REG)
oce.add(OpCode.POSITIVE_WINDOW, Info.POSITIVE_WINDOW)
oce.add(OpCode.NEGATIVE_WINDOW, Info.NEGATIVE_WINDOW)
oce.add(OpCode.RESET_WITH_INIT, Info.RESET_WITH_INIT)
oce.add(OpCode.RESET_NO_INIT, Info.RESET_NO_INIT)
defs.add_service(CustomServiceList.PDEC_HANDLER.value, "PDEC Handler", oce)

View File

@ -3,6 +3,7 @@ import enum
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import COM_SUBSYSTEM_ID
from eive_tmtc.tmtc.com.syrlinks_handler import Datarate
from tmtccmd.pus.s20_fsfw_param_defs import create_scalar_u8_parameter
from .defs import Mode as ComMode
@ -21,7 +22,6 @@ from tmtccmd.tc.pus_200_fsfw_mode import (
)
from tmtccmd.tc.pus_20_fsfw_param import (
create_load_param_cmd,
pack_scalar_u8_parameter_app_data,
)
from tmtccmd.pus.s20_fsfw_param import create_scalar_u32_parameter
@ -61,7 +61,7 @@ class Info:
@service_provider(CustomServiceList.COM_SS)
def build_com_subsystem_cmd(p: ServiceProviderParams):
def build_com_subsystem_cmd(p: ServiceProviderParams): # noqa C901
q = p.queue_helper
o = p.op_code
prefix = "COM Subsystem"
@ -87,7 +87,7 @@ def build_com_subsystem_cmd(p: ServiceProviderParams):
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_LOW}")
q.add_pus_tc(
create_load_param_cmd(
pack_scalar_u8_parameter_app_data(
create_scalar_u8_parameter(
COM_SUBSYSTEM_ID,
0,
ParameterId.DATARATE,
@ -99,7 +99,7 @@ def build_com_subsystem_cmd(p: ServiceProviderParams):
q.add_log_cmd(f"{prefix}: {Info.UPDATE_DEFAULT_DATARATE_HIGH}")
q.add_pus_tc(
create_load_param_cmd(
pack_scalar_u8_parameter_app_data(
create_scalar_u8_parameter(
COM_SUBSYSTEM_ID,
0,
ParameterId.DATARATE,
@ -122,7 +122,7 @@ def build_com_subsystem_cmd(p: ServiceProviderParams):
0,
ParameterId.TRANSMITTER_TIMEOUT,
timeout,
).pack()
)
)
)
elif o == OpCode.READ_MODE:

View File

@ -21,9 +21,9 @@ from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_3_fsfw_hk import (
make_sid,
create_request_one_diag_command,
create_enable_periodic_hk_command_with_interval,
create_disable_periodic_hk_command,
create_request_one_hk_command,
create_enable_periodic_hk_command_with_interval_with_diag,
create_disable_periodic_hk_command_with_diag,
)
from spacepackets.ecss.tc import PusTelecommand
from tmtccmd.tc.pus_200_fsfw_mode import Mode, create_mode_command
@ -31,7 +31,7 @@ from eive_tmtc.config.object_ids import SYRLINKS_HANDLER_ID
import struct
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
class SetId(enum.IntEnum):
@ -142,7 +142,7 @@ def normal_mode_cmd(q: DefaultPusQueueHelper, info: str, submode: int):
q.add_pus_tc(create_mode_command(SYRLINKS_HANDLER_ID, Mode.NORMAL, submode))
def pack_syrlinks_command(
def pack_syrlinks_command( # noqa C901: Complexity okay here.
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
):
obyt = object_id.as_bytes
@ -153,7 +153,7 @@ def pack_syrlinks_command(
q.add_pus_tc(create_mode_command(obyt, Mode.OFF, 0))
if op_code == OpCode.ON:
q.add_log_cmd(f"{prefix}: {Info.ON}")
q.add_pus_tc(create_mode_command(obyt, Mode.ON, 0))
q.add_pus_tc(create_mode_command(obyt, Mode.ON, ComMode.RX_ONLY))
if op_code == OpCode.NORMAL_RX_ONLY:
normal_mode_cmd(q, Info.NORMAL_RX_ONLY, ComMode.RX_ONLY)
if op_code == OpCode.NORMAL_RX_AND_TX_LOW_DATARATE:
@ -182,24 +182,28 @@ def pack_syrlinks_command(
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_RX_REGS}")
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
interval = float(input("HK interval in floating point seconds"))
cmds = create_enable_periodic_hk_command_with_interval(True, sid, interval)
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
True, sid, interval
)
for cmd in cmds:
q.add_pus_tc(cmd)
if op_code in OpCode.DISABLE_HK_RX_REGS:
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_RX_REGS}")
sid = make_sid(obyt, SetId.RX_REGISTERS_DATASET)
q.add_pus_tc(create_disable_periodic_hk_command(True, sid))
q.add_pus_tc(create_disable_periodic_hk_command_with_diag(True, sid))
if op_code in OpCode.ENABLE_HK_TX_REGS:
q.add_log_cmd(f"{prefix}: {Info.ENABLE_HK_TX_REGS}")
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
interval = float(input("HK interval in floating point seconds"))
cmds = create_enable_periodic_hk_command_with_interval(True, sid, interval)
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
True, sid, interval
)
for cmd in cmds:
q.add_pus_tc(cmd)
if op_code in OpCode.DISABLE_HK_TX_REGS:
q.add_log_cmd(f"{prefix}: {Info.DISABLE_HK_TX_REGS}")
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
q.add_pus_tc(create_disable_periodic_hk_command(True, sid))
q.add_pus_tc(create_disable_periodic_hk_command_with_diag(True, sid))
if op_code in OpCode.HK_TX_REGS:
q.add_log_cmd(f"{prefix}: {Info.HK_TX_REGS}")
sid = make_sid(obyt, SetId.TX_REGISTERS_DATASET)
@ -254,31 +258,28 @@ def pack_syrlinks_command(
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
def handle_syrlinks_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
def handle_syrlinks_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
if set_id == SetId.RX_REGISTERS_DATASET:
return handle_syrlinks_rx_registers_dataset(printer, hk_data)
return handle_syrlinks_rx_registers_dataset(pw, hk_data)
elif set_id == SetId.TX_REGISTERS_DATASET:
return handle_syrlinks_tx_registers_dataset(printer, hk_data)
return handle_syrlinks_tx_registers_dataset(pw, hk_data)
elif set_id == SetId.TEMPERATURE_SET_ID:
return handle_syrlinks_temp_dataset(printer, hk_data)
return handle_syrlinks_temp_dataset(pw, hk_data)
else:
pw = PrintWrapper(printer)
pw.dlog(f"Service 3 TM: Syrlinks handler reply with unknown set ID {set_id}")
def handle_syrlinks_temp_dataset(printer: FsfwTmTcPrinter, hk_data: bytes):
pw = PrintWrapper(printer)
def handle_syrlinks_temp_dataset(pw: PrintWrapper, hk_data: bytes):
if len(hk_data) < 8:
raise ValueError("expected at least 8 bytes of HK data")
temp_power_amplifier = struct.unpack("!f", hk_data[0:4])[0]
temp_baseband_board = struct.unpack("!f", hk_data[4:8])[0]
pw.dlog(f"Temperatur Power Amplifier [C]: {temp_power_amplifier}")
pw.dlog(f"Temperatur Baseband Board [C]: {temp_baseband_board}")
printer.print_validity_buffer(hk_data[8:], 2)
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[8:], 2))
def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: bytes):
pw = PrintWrapper(printer)
def handle_syrlinks_rx_registers_dataset(pw: PrintWrapper, hk_data: bytes):
header_list = [
"RX Status",
"RX Sensitivity",
@ -307,7 +308,9 @@ def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: byte
if rx_demod_n0 > 0:
eb_to_n0 = 20 * math.log10(rx_demod_eb / rx_demod_n0) - 3
else:
logging.getLogger(__name__).warning("RX Demod N0 is 0, can not calculate Eb to N0")
logging.getLogger(__name__).warning(
"RX Demod N0 is 0, can not calculate Eb to N0"
)
eb_to_n0 = 0
rx_data_rate_raw = hk_data[21]
rx_data_rate = -1
@ -336,7 +339,9 @@ def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: byte
validity_buffer = hk_data[22:]
for header, content in zip(header_list, content_list):
pw.dlog(f"{header}: {content}")
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8)
pw.dlog(
FsfwTmTcPrinter.get_validity_buffer(validity_buffer=validity_buffer, num_vars=8)
)
pw.dlog(f"Carrier Detect: {carrier_detect}")
pw.dlog(f"Carrier Lock: {carrier_lock}")
pw.dlog(f"Data Lock (data clock recovery loop lock status): {data_lock}")
@ -370,10 +375,9 @@ WAVEFORM_STRINGS = ["OFF", "CW", "QPSK", "0QPSK", "PCM/PM", "PSK/PM", "BPSK"]
def handle_syrlinks_tx_registers_dataset(
printer: FsfwTmTcPrinter,
pw: PrintWrapper,
hk_data: bytes,
):
pw = PrintWrapper(printer)
header_list = ["TX Status Raw", "TX Waveform", "TX AGC value"]
tx_status = hk_data[0]
"""
@ -410,7 +414,9 @@ def handle_syrlinks_tx_registers_dataset(
validity_buffer = hk_data[4:]
for header, content in zip(header_list, content_list):
pw.dlog(f"{header}: {content}")
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3)
pw.dlog(
FsfwTmTcPrinter.get_validity_buffer(validity_buffer=validity_buffer, num_vars=3)
)
# pw.dlog(f"TX CONV: {tx_conv!r}")
# pw.dlog(f"TX DIFF (differential encoder enable): {tx_diff_encoder_enable}")
pw.dlog(f"TX Status: {tx_status_status!r}")

View File

@ -1,6 +1,8 @@
import enum
import logging
import os
import struct
from pathlib import Path
from eive_tmtc.pus_tm.defs import PrintWrapper
@ -11,15 +13,31 @@ from tmtccmd.config import TmtcDefinitionWrapper
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command
from tmtccmd.tc.pus_20_fsfw_param import (
create_scalar_u8_parameter,
create_load_param_cmd,
)
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
_LOGGER = logging.getLogger(__name__)
class SdState(enum.IntEnum):
OFF = 0
ON = 1
MOUNTED = 2
class SdCardSelect(enum.IntEnum):
SD_0 = 0
SD_1 = 1
BOTH = 2
NONE = 3
class ActionId(enum.IntEnum):
LIST_DIR_INTO_FILE = 0
ANNOUNCE_VERSION = 1
ANNOUNCE_CURRENT_IMAGE = 2
ANNOUNCE_BOOT_COUNTS = 3
@ -27,6 +45,7 @@ class ActionId(enum.IntEnum):
RESET_REBOOT_COUNTER = 6
SWITCH_IMG_LOCK = 7
SET_MAX_REBOOT_CNT = 8
READ_REBOOT_MECHANISM_INFO = 9
UPDATE_OBSW_FROM_SD_0 = 10
UPDATE_OBSW_FROM_SD_1 = 11
UPDATE_OBSW_FROM_TMP = 12
@ -35,6 +54,19 @@ class ActionId(enum.IntEnum):
SWITCH_TO_BOTH_SD_CARDS = 18
XSC_REBOOT = 32
FULL_REBOOT = 34
EXECUTE_SHELL_CMD_BLOCKING = 40
EXECUTE_SHELL_CMD_NON_BLOCKING = 41
SYSTEMCTL_CMD_EXECUTOR = 42
LIST_DIR_INTO_FILE = 50
LIST_DIR_DUMP_DIRECTLY = 51
CP_HELPER = 52
MV_HELPER = 53
RM_HELPER = 54
MKDIR_HELPER = 55
class ParamId(enum.IntEnum):
PREF_SD = 0
class SetId(enum.IntEnum):
@ -45,6 +77,16 @@ class OpCode:
ANNOUNCE_VERSION = "announce_version"
ANNOUNCE_CURRENT_IMAGE = "announce_current_image"
ANNOUNCE_BOOT_COUNTS = "announce_boot_counts"
EXECUTE_SHELL_CMD_BLOCKING = "exec_cmd_blocking"
EXECUTE_SHELL_CMD_NON_BLOCKING = "exec_cmd_non_blocking"
SYSTEMCTL_CMD_EXECUTOR = "systemctl_cmd"
LIST_DIR_INTO_FILE = "list_dir_into_file"
LIST_DIR_DUMP_DIRECTLY = "list_dir_dump_directly"
CP_HELPER = "cp_helper"
MV_HELPER = "mv_helper"
RM_HELPER = "rm_helper"
MKDIR_HELPER = "mkdir_helper"
SET_PREF_SD = "set_pref_sd"
REBOOT_XSC = ["reboot_xsc"]
XSC_REBOOT_SELF = ["reboot_self"]
XSC_REBOOT_0_0 = ["reboot_00"]
@ -59,28 +101,40 @@ class OpCode:
SWITCH_TO_SD_0 = ["switch_to_sd_0"]
SWITCH_TO_SD_1 = ["switch_to_sd_1"]
SWITCH_TO_BOTH_SD_CARDS = ["switch_to_both_sd_cards"]
ENABLE_REBOOT_FILE_HANDLING = ["rbh_off"]
DISABLE_REBOOT_FILE_HANDLING = ["rbh_on"]
RESET_ALL_REBOOT_COUNTERS = ["rbh_reset_a"]
RESET_REBOOT_COUNTER_00 = ["rbh_reset_00"]
RESET_REBOOT_COUNTER_01 = ["rbh_reset_01"]
RESET_REBOOT_COUNTER_10 = ["rbh_reset_10"]
RESET_REBOOT_COUNTER_11 = ["rbh_reset_11"]
SET_MAX_REBOOT_CNT = ["rbh_max_cnt"]
READ_REBOOT_MECHANISM_INFO = "rbh_info"
ENABLE_REBOOT_FILE_HANDLING = "rwd_on"
DISABLE_REBOOT_FILE_HANDLING = "rwd_off"
RESET_ALL_REBOOT_COUNTERS = "rwd_reset_a"
RWD_RESET_REBOOT_COUNTER_00 = "rwd_reset_00"
RWD_RESET_REBOOT_COUNTER_01 = "rwd_reset_01"
RWD_RESET_REBOOT_COUNTER_10 = "rwd_reset_10"
RWD_RESET_REBOOT_COUNTER_11 = "rwd_reset_11"
RWD_SET_MAX_REBOOT_CNT = "rwd_max_cnt"
class Info:
ANNOUNCE_VERSION = "Announce version"
ANNOUNCE_CURRENT_IMAGE = "Announce current image"
ANNOUNCE_BOOT_COUNTS = "Announce boot counts"
SYSTEMCTL_CMD_EXECUTOR = "Perform systemctl command"
EXECUTE_SHELL_CMD_BLOCKING = "Execute shell command blocking"
EXECUTE_SHELL_CMD_NON_BLOCKING = "Execute shell command non-blocking"
SET_PREF_SD = "Set preferred SD card"
REBOOT_XSC = "XSC reboot with prompt"
REBOOT_FULL = "Full regular reboot"
OBSW_UPDATE_FROM_SD_0 = "Update OBSW from SD Card 0"
OBSW_UPDATE_FROM_SD_1 = "Update OBSW from SD Card 1"
OBSW_UPDATE_FROM_TMP = "Update OBSW from tmp folder"
READ_REBOOT_MECHANISM_INFO = "Read reboot mechansm information"
SWITCH_TO_SD_0 = "Switch to SD card 0"
SWITCH_TO_SD_1 = "Switch to SD card 1"
SWITCH_TO_BOTH_SD_CARDS = "Switch to both SD cards with specified active card"
LIST_DIR_INTO_FILE = "List directory, dump output into file"
LIST_DIR_DUMP_DIRECTLY = "List directory, dump content directly"
CP_HELPER = "Filesystem Copy Helper"
MV_HELPER = "Filesystem Move Helper"
RM_HELPER = "Filesystem Removal Helper"
MKDIR_HELPER = "Filesystem Directory Creation Helper"
class Chip(enum.IntEnum):
@ -95,6 +149,12 @@ class Copy(enum.IntEnum):
NONE = 2
class SystemctlCmd(enum.IntEnum):
START = 0
STOP = 1
RESTART = 2
@tmtc_definitions_provider
def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
@ -109,9 +169,21 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
oce.add(keys=OpCode.XSC_REBOOT_0_1, info="Reboot 0 1")
oce.add(keys=OpCode.XSC_REBOOT_1_0, info="Reboot 1 0")
oce.add(keys=OpCode.XSC_REBOOT_1_1, info="Reboot 1 1")
oce.add(keys=OpCode.SET_PREF_SD, info=Info.SET_PREF_SD)
oce.add(
keys=OpCode.READ_REBOOT_MECHANISM_INFO, info=Info.READ_REBOOT_MECHANISM_INFO
)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
oce.add(keys=OpCode.SYSTEMCTL_CMD_EXECUTOR, info=Info.SYSTEMCTL_CMD_EXECUTOR)
oce.add(
keys=OpCode.EXECUTE_SHELL_CMD_BLOCKING, info=Info.EXECUTE_SHELL_CMD_BLOCKING
)
oce.add(
keys=OpCode.EXECUTE_SHELL_CMD_NON_BLOCKING,
info=Info.EXECUTE_SHELL_CMD_NON_BLOCKING,
)
oce.add(
keys=OpCode.GET_HK,
info="Request housekeeping set",
@ -129,31 +201,43 @@ def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
info="Reset all reboot counters",
)
oce.add(
keys=OpCode.RESET_REBOOT_COUNTER_00,
keys=OpCode.RWD_RESET_REBOOT_COUNTER_00,
info="Reset reboot counter 0 0",
)
oce.add(
keys=OpCode.RESET_REBOOT_COUNTER_01,
keys=OpCode.RWD_RESET_REBOOT_COUNTER_01,
info="Reset reboot counter 0 1",
)
oce.add(
keys=OpCode.RESET_REBOOT_COUNTER_10,
keys=OpCode.RWD_RESET_REBOOT_COUNTER_10,
info="Reset reboot counter 1 0",
)
oce.add(
keys=OpCode.RESET_REBOOT_COUNTER_11,
keys=OpCode.RWD_RESET_REBOOT_COUNTER_11,
info="Reset reboot counter 1 1",
)
oce.add(
keys=OpCode.RWD_SET_MAX_REBOOT_CNT,
info="Reset max reboot count for reboot watchdog",
)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
oce.add(keys=OpCode.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
oce.add(keys=OpCode.SWITCH_TO_SD_0, info=Info.SWITCH_TO_SD_0)
oce.add(keys=OpCode.SWITCH_TO_SD_1, info=Info.SWITCH_TO_SD_1)
oce.add(keys=OpCode.SWITCH_TO_BOTH_SD_CARDS, info=Info.SWITCH_TO_BOTH_SD_CARDS)
oce.add(keys=OpCode.LIST_DIR_INTO_FILE, info=Info.LIST_DIR_INTO_FILE)
oce.add(keys=OpCode.LIST_DIR_DUMP_DIRECTLY, info=Info.LIST_DIR_DUMP_DIRECTLY)
oce.add(keys=OpCode.MV_HELPER, info=Info.MV_HELPER)
oce.add(keys=OpCode.CP_HELPER, info=Info.CP_HELPER)
oce.add(keys=OpCode.RM_HELPER, info=Info.RM_HELPER)
oce.add(keys=OpCode.MKDIR_HELPER, info=Info.MKDIR_HELPER)
defs.add_service(CustomServiceList.CORE.value, "Core Controller", oce)
def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
def pack_core_commands( # noqa C901
q: DefaultPusQueueHelper, op_code: str
): # noqa: C901 , complexity okay here
if op_code == OpCode.ANNOUNCE_VERSION:
q.add_log_cmd(f"{Info.ANNOUNCE_VERSION}")
q.add_pus_tc(create_action_cmd(CORE_CONTROLLER_ID, ActionId.ANNOUNCE_VERSION))
@ -184,6 +268,33 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
)
elif op_code in OpCode.XSC_REBOOT_SELF:
add_xsc_reboot_cmd(q=q, reboot_self=True)
elif op_code == OpCode.SYSTEMCTL_CMD_EXECUTOR:
print("systemctl command types: ")
for entry in SystemctlCmd:
print(f"{entry}: {entry.name}")
systemctl_cmd = SystemctlCmd(
int(input("Specify systemctl command type by key: "))
)
unit_name = input("Specify unit name: ")
q.add_pus_tc(create_systemctl_cmd(systemctl_cmd, unit_name))
elif op_code == OpCode.EXECUTE_SHELL_CMD_BLOCKING:
custom_cmd = input("Please specify command to execute: ")
q.add_pus_tc(
create_action_cmd(
object_id=CORE_CONTROLLER_ID,
action_id=ActionId.EXECUTE_SHELL_CMD_BLOCKING,
user_data=custom_cmd.encode(),
)
)
elif op_code == OpCode.EXECUTE_SHELL_CMD_NON_BLOCKING:
custom_cmd = input("Please specify command to execute: ")
q.add_pus_tc(
create_action_cmd(
object_id=CORE_CONTROLLER_ID,
action_id=ActionId.EXECUTE_SHELL_CMD_NON_BLOCKING,
user_data=custom_cmd.encode(),
)
)
elif op_code in OpCode.XSC_REBOOT_0_0:
add_xsc_reboot_cmd(
q=q, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM
@ -206,7 +317,15 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
chip=Chip.CHIP_1,
copy=Copy.COPY_1_GOLD,
)
elif op_code in OpCode.DISABLE_REBOOT_FILE_HANDLING:
elif op_code == OpCode.READ_REBOOT_MECHANISM_INFO:
q.add_log_cmd(Info.READ_REBOOT_MECHANISM_INFO)
q.add_pus_tc(
create_action_cmd(
object_id=CORE_CONTROLLER_ID,
action_id=ActionId.READ_REBOOT_MECHANISM_INFO,
)
)
elif op_code == OpCode.DISABLE_REBOOT_FILE_HANDLING:
q.add_log_cmd("Disabling reboot file handling")
user_data = bytearray([0])
q.add_pus_tc(
@ -216,7 +335,7 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
user_data=user_data,
)
)
elif op_code in OpCode.ENABLE_REBOOT_FILE_HANDLING:
elif op_code == OpCode.ENABLE_REBOOT_FILE_HANDLING:
q.add_log_cmd("Enabling reboot file handling")
user_data = bytearray([1])
q.add_pus_tc(
@ -226,7 +345,7 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
user_data=user_data,
)
)
elif op_code in OpCode.RESET_ALL_REBOOT_COUNTERS:
elif op_code == OpCode.RESET_ALL_REBOOT_COUNTERS:
q.add_log_cmd("Resetting all reboot counters")
q.add_pus_tc(
create_action_cmd(
@ -234,14 +353,25 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
action_id=ActionId.RESET_REBOOT_COUNTER,
)
)
elif op_code in OpCode.RESET_REBOOT_COUNTER_00:
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_00:
reset_specific_boot_counter(q, 0, 0)
elif op_code in OpCode.RESET_REBOOT_COUNTER_01:
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_01:
reset_specific_boot_counter(q, 0, 1)
elif op_code in OpCode.RESET_REBOOT_COUNTER_10:
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_10:
reset_specific_boot_counter(q, 1, 0)
elif op_code in OpCode.RESET_REBOOT_COUNTER_11:
elif op_code == OpCode.RWD_RESET_REBOOT_COUNTER_11:
reset_specific_boot_counter(q, 1, 1)
elif op_code == OpCode.RWD_SET_MAX_REBOOT_CNT:
max_count = int(input("Set new maximum reboot threshold [1, 50]: "))
if max_count < 1 or max_count > 50:
raise ValueError("Invalid value, must be in range 1 to 50")
q.add_pus_tc(
create_action_cmd(
CORE_CONTROLLER_ID,
ActionId.SET_MAX_REBOOT_CNT,
user_data=bytes([max_count]),
)
)
elif op_code in OpCode.OBSW_UPDATE_FROM_SD_0:
q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_0)
q.add_pus_tc(pack_obsw_update_cmd(ActionId.UPDATE_OBSW_FROM_SD_0))
@ -267,7 +397,7 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
)
elif op_code in OpCode.SWITCH_TO_BOTH_SD_CARDS:
while True:
active_sd_card = int(input("Please specify active SD cqrd [0/1]: "))
active_sd_card = int(input("Please specify active SD card [0/1]: "))
if active_sd_card not in [0, 1]:
_LOGGER.warning("Invalid SD card specified. Try again")
break
@ -283,12 +413,127 @@ def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
q.add_log_cmd("Requesting housekeeping set")
sid = make_sid(object_id=CORE_CONTROLLER_ID, set_id=SetId.HK)
q.add_pus_tc(generate_one_hk_command(sid))
elif op_code in OpCode.SET_PREF_SD:
q.add_log_cmd("Set preferred SD card")
pref_sd = int(
input("Specify which SD card to set as the preferred one (0/1): ")
)
if pref_sd not in [0, 1]:
raise ValueError("Only 0 or 1 allowed for preferred SD card")
q.add_pus_tc(
create_load_param_cmd(
create_scalar_u8_parameter(
object_id=CORE_CONTROLLER_ID,
domain_id=0,
unique_id=ParamId.PREF_SD,
parameter=pref_sd,
)
)
)
elif op_code == OpCode.CP_HELPER:
cp_recursive = int(input("Copy recursively (0/1) ?: "))
if cp_recursive not in [0, 1]:
raise ValueError("Invalid value, only 0 or 1 allowed")
cp_force = int(input("Copy with force option(0/1) ?: "))
if cp_force not in [0, 1]:
raise ValueError("Invalid value, only 0 or 1 allowed")
user_data = bytearray([cp_recursive, cp_force])
user_data.extend(packet_source_dest_path("Copy"))
q.add_log_cmd(Info.CP_HELPER)
q.add_pus_tc(
create_action_cmd(CORE_CONTROLLER_ID, ActionId.CP_HELPER, user_data)
)
elif op_code == OpCode.MV_HELPER:
user_data = packet_source_dest_path("Move")
q.add_log_cmd(Info.MV_HELPER)
q.add_pus_tc(
create_action_cmd(CORE_CONTROLLER_ID, ActionId.MV_HELPER, user_data)
)
elif op_code == OpCode.RM_HELPER:
rm_recursive = int(input("Remove with recursive (-r) option (0/1) ?: "))
if rm_recursive not in [0, 1]:
raise ValueError("Invalid value, only 0 or 1 allowed")
rm_force = int(input("Remove with force (-f) option (0/1) ?: "))
if rm_force not in [0, 1]:
raise ValueError("Invalid value, only 0 or 1 allowed")
user_data = bytearray([rm_recursive, rm_force])
removed_file_or_dir = input("Specify absolute path to be removed: ")
user_data.extend(removed_file_or_dir.encode())
user_data.append(0)
q.add_log_cmd(Info.RM_HELPER)
q.add_pus_tc(
create_action_cmd(CORE_CONTROLLER_ID, ActionId.RM_HELPER, user_data)
)
elif op_code == OpCode.LIST_DIR_INTO_FILE:
q.add_log_cmd(Info.LIST_DIR_INTO_FILE)
user_data = list_directory_base_user_data()
dest_file_path = input("Destination file path: ")
user_data.extend(dest_file_path.encode())
user_data.append(0)
q.add_pus_tc(
create_action_cmd(
CORE_CONTROLLER_ID, ActionId.LIST_DIR_INTO_FILE, user_data
)
)
elif op_code == OpCode.LIST_DIR_DUMP_DIRECTLY:
q.add_log_cmd(Info.LIST_DIR_DUMP_DIRECTLY)
user_data = list_directory_base_user_data()
q.add_pus_tc(
create_action_cmd(
CORE_CONTROLLER_ID, ActionId.LIST_DIR_DUMP_DIRECTLY, user_data
)
)
elif op_code == OpCode.MKDIR_HELPER:
q.add_log_cmd(Info.MKDIR_HELPER)
user_data = input("Specify absolute path of newly created directory: ")
user_data = bytearray(user_data.encode())
user_data.append(0)
q.add_pus_tc(
create_action_cmd(CORE_CONTROLLER_ID, ActionId.MKDIR_HELPER, user_data)
)
else:
_LOGGER.warning(
f"Unknown operation code {op_code} for core controller commands"
)
def create_systemctl_cmd(systemctl_cmd: SystemctlCmd, unit_name: str):
cmd_data = bytearray([systemctl_cmd])
cmd_data.extend(unit_name.encode())
return create_action_cmd(
object_id=CORE_CONTROLLER_ID,
action_id=ActionId.SYSTEMCTL_CMD_EXECUTOR,
user_data=cmd_data,
)
def list_directory_base_user_data() -> bytearray:
all_opt = int(input("Use all (-a) option (0/1) ?: "))
if all_opt not in [0, 1]:
raise ValueError("Invalid value, only 0 or 1 allowed")
recursive_opt = int(input("Use recursive (-R) option (0/1) ?: "))
if recursive_opt not in [0, 1]:
raise ValueError("Invalid value, only 0 or 1 allowed")
compression_opt = int(input("Compress target file (0/1) ?: "))
if compression_opt not in [0, 1]:
raise ValueError("Invalid value, only 0 or 1 allowed")
listing_path = input("Specify listing path (absolute path): ")
user_data = bytearray([all_opt, recursive_opt, compression_opt])
user_data.extend(listing_path.encode())
user_data.append(0)
return user_data
def packet_source_dest_path(context: str) -> bytes:
source = input(f"Specify {context} source file: ")
dest = input(f"Specify {context} destination file: ")
raw_src_dest = bytearray(source.encode())
raw_src_dest.append(0)
raw_src_dest.extend(dest.encode())
raw_src_dest.append(0)
return raw_src_dest
def reset_specific_boot_counter(q: DefaultPusQueueHelper, chip: int, copy: int):
q.add_log_cmd(f"Resetting boot counter {chip} {copy}")
q.add_pus_tc(
@ -343,7 +588,11 @@ def determine_chip_and_copy() -> (int, int):
def pack_obsw_update_cmd(action_id: int) -> PusTelecommand:
chip, copy = determine_chip_and_copy()
user_data = bytes([chip, copy])
user_data = bytearray([chip, copy])
custom_file_name = input("Use custom filename [y/n] ?: ")
if custom_file_name.lower() in ["y", "yes", "1"]:
custom_file_name = input("Specify custom filename: ")
user_data.extend(custom_file_name.encode())
return create_action_cmd(
object_id=CORE_CONTROLLER_ID, action_id=action_id, user_data=user_data
)
@ -379,9 +628,8 @@ def create_xsc_reboot_cmds(
)
def handle_core_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
def handle_core_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
if set_id == SetId.HK:
pw = PrintWrapper(printer)
fmt_str = "!fff"
inc_len = struct.calcsize(fmt_str)
(temperature, ps_voltage, pl_voltage) = struct.unpack(
@ -392,4 +640,93 @@ def handle_core_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
f"PL Voltage [mV] {pl_voltage}"
)
pw.dlog(printout)
printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=3)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[inc_len:], num_vars=3
)
def handle_core_ctrl_action_replies(
action_id: int, pw: PrintWrapper, custom_data: bytes
):
if action_id == ActionId.READ_REBOOT_MECHANISM_INFO:
handle_reboot_mechanism_info_reply(pw, custom_data)
elif action_id == ActionId.LIST_DIR_DUMP_DIRECTLY:
handle_list_dir_dump_reply(pw, custom_data)
def handle_reboot_mechanism_info_reply(pw: PrintWrapper, custom_data: bytes):
pw.dlog("Received reboot mechansm information")
fmt_str = "!BIIIIIBBBBBBBB"
inc_len = struct.calcsize(fmt_str)
if len(custom_data) < inc_len:
raise ValueError(f"Received custom data shorter than expected {inc_len}")
(
enabled,
max_count,
img00_count,
img01_count,
img10_count,
img11_count,
img00_lock,
img01_lock,
img10_lock,
img11_lock,
last_chip,
last_copy,
next_chip,
next_copy,
) = struct.unpack(fmt_str, custom_data[:inc_len])
pw.dlog(f"Enabled: {enabled}")
pw.dlog(f"Max Count: {max_count}")
pw.dlog(f"Count 00: {img00_count}")
pw.dlog(f"Count 01: {img01_count}")
pw.dlog(f"Count 10: {img10_count}")
pw.dlog(f"Count 11: {img11_count}")
pw.dlog(f"Lock 00: {img00_lock}")
pw.dlog(f"Lock 01: {img01_lock}")
pw.dlog(f"Lock 10: {img10_lock}")
pw.dlog(f"Lock 11: {img11_lock}")
pw.dlog(f"Last Chip: {last_chip}")
pw.dlog(f"Last Copy: {last_copy}")
pw.dlog(f"Next Chip: {next_chip}")
pw.dlog(f"Next Copy: {next_copy}")
def handle_list_dir_dump_reply(pw: PrintWrapper, custom_data: bytes):
if len(custom_data) < 4:
_LOGGER.warning("Data unexpectedly small")
return
seq_idx = struct.unpack("!I", custom_data[0:4])[0]
total_chunks = struct.unpack("!I", custom_data[4:8])[0]
compressed = custom_data[8]
ls_cmd = custom_data[9:].split(b"\x00")[0].decode()
# Include length of NULL termination
file_data_offset = 9 + len(ls_cmd) + 1
pw.dlog(
f"Received directory listing dump for ls command {ls_cmd}. "
f"Chunk {seq_idx + 1}/{total_chunks}"
)
def remove_if_exists_and_new(seq_idx_: int, path_: Path):
if seq_idx_ == 0 and path_.exists():
os.remove(path_)
if compressed:
path = Path("dir_listing.txt.gz")
remove_if_exists_and_new(seq_idx, path)
pw.dlog(
f"Compression option: {compressed}. Dumping file into dir_listing.txt.gz"
)
with open(path, "ab") as listing_file:
listing_file.write(custom_data[file_data_offset:])
else:
path = Path("dir_listing.txt")
remove_if_exists_and_new(seq_idx, path)
pw.dlog(f"Compression option: {compressed}. Dumping file into dir_listing.txt")
with open(path, "a") as listing_file:
listing_file_str = custom_data[file_data_offset:].decode()
listing_file.write(listing_file_str)
if seq_idx + 1 == total_chunks:
pw.dlog("Full directory listing: ")
with open("dir_listing.txt", "r") as listing_file:
print(listing_file.read())

View File

@ -1,5 +1,3 @@
import struct
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.tmtc.obj_prompt import prompt_object
from spacepackets.ecss import PusTelecommand

View File

@ -0,0 +1,24 @@
import enum
import struct
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from eive_tmtc.pus_tm.defs import PrintWrapper
class SetId(enum.IntEnum):
ERROR_ID = 0
def handle_ier_hk_data(pw: PrintWrapper, hk_data: bytes, set_id: int):
pw.dlog(f"Received internal error reporter HK data with set ID {set_id}")
if set_id == SetId.ERROR_ID:
fmt_str = "!III"
inc_len = struct.calcsize(fmt_str)
(tm_errors, queue_errors, store_hits) = struct.unpack(
fmt_str, hk_data[:inc_len]
)
pw.dlog(f"TM Errors: {tm_errors}")
pw.dlog(f"Queue Errors: {queue_errors}")
pw.dlog(f"Store Errors: {store_hits}")
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[inc_len:], 3))

View File

@ -1,7 +1,7 @@
from eive_tmtc.config.object_ids import (
ACS_SUBSYSTEM_ID,
ACS_CONTROLLER,
IMTQ_HANDLER_ID,
GPS_0_HEALTH_DEV,
GYRO_0_ADIS_HANDLER_ID,
GYRO_1_L3G_HANDLER_ID,
ACS_BOARD_ASS_ID,
@ -9,6 +9,18 @@ from eive_tmtc.config.object_ids import (
SUS_BOARD_ASS_ID,
MGM_0_LIS3_HANDLER_ID,
MGM_1_RM3100_HANDLER_ID,
SUS_0_N_LOC_XFYFZM_PT_XF,
SUS_6_R_LOC_XFYBZM_PT_XF,
RW1_ID,
RW2_ID,
RTD_0_PLOC_HSPD,
TMP1075_HANDLER_TCS_BRD_1_ID,
TMP1075_HANDLER_TCS_BRD_0_ID,
TMP1075_HANDLER_PLPCDU_0_ID,
TMP1075_HANDLER_PLPCDU_1_ID,
TMP1075_HANDLER_IF_BRD_ID,
STR_ASSEMBLY,
STAR_TRACKER_ID,
)
SUBSYSTEM_DICT = {
@ -22,13 +34,39 @@ ACS_OBJ_DICT = {
1: ("SUS Assembly", SUS_BOARD_ASS_ID),
2: ("ACS Board Assembly", ACS_BOARD_ASS_ID),
3: ("RW Assembly", RW_ASSEMBLY),
4: ("iMTQ MGT", IMTQ_HANDLER_ID),
5: ("GYR 0 ADIS", GYRO_0_ADIS_HANDLER_ID),
6: ("GYR 1 L3G", GYRO_1_L3G_HANDLER_ID),
7: ("MGM 0 LIS3", MGM_0_LIS3_HANDLER_ID),
8: ("MGM 1 RM3100", MGM_1_RM3100_HANDLER_ID),
4: ("STR Assembly", STR_ASSEMBLY),
5: ("iMTQ MGT", IMTQ_HANDLER_ID),
6: ("GYR 0 ADIS", GYRO_0_ADIS_HANDLER_ID),
7: ("GYR 1 L3G", GYRO_1_L3G_HANDLER_ID),
8: ("MGM 0 LIS3", MGM_0_LIS3_HANDLER_ID),
9: ("MGM 1 RM3100", MGM_1_RM3100_HANDLER_ID),
10: ("GPS 0 Health Device", GPS_0_HEALTH_DEV),
11: ("SUS 0", SUS_0_N_LOC_XFYFZM_PT_XF),
12: ("SUS 6", SUS_6_R_LOC_XFYBZM_PT_XF),
13: ("RW 1", RW1_ID),
14: ("RW 2", RW2_ID),
15: ("STR", STAR_TRACKER_ID),
}
TCS_OBJ_DICT = {
0: ("RTD 0", RTD_0_PLOC_HSPD),
1: ("TMP1075 PL PCDU 0", TMP1075_HANDLER_PLPCDU_0_ID),
2: ("TMP1075 PL PCDU 1", TMP1075_HANDLER_PLPCDU_1_ID),
3: ("TMP1075 TCS 0", TMP1075_HANDLER_TCS_BRD_0_ID),
4: ("TMP1075 TCS 1", TMP1075_HANDLER_TCS_BRD_1_ID),
5: ("TMP1075 IF BOARD", TMP1075_HANDLER_IF_BRD_ID),
}
def get_obj_if_from_dict(lut: dict) -> bytes:
for k, v in lut.items():
print(f"{k}: {v[0]}")
obj_key = int(input("Please specify target object by key: "))
name_and_obj_id = lut[obj_key]
if name_and_obj_id is None:
raise ValueError("invalid key")
return name_and_obj_id[1]
def prompt_object() -> bytes:
for k, v in SUBSYSTEM_DICT.items():
@ -38,10 +76,9 @@ def prompt_object() -> bytes:
if subsystem is None:
raise ValueError("invalid key")
if subsystem == "acs":
for k, v in ACS_OBJ_DICT.items():
print(f"{k}: {v[0]}")
obj_key = int(input("Please specify target object by key: "))
acs_obj = ACS_OBJ_DICT[obj_key]
if acs_obj is None:
raise ValueError("invalid key")
return acs_obj[1]
return get_obj_if_from_dict(ACS_OBJ_DICT)
elif subsystem == "tcs":
return get_obj_if_from_dict(TCS_OBJ_DICT)
else:
print(f"No object for subsystem {subsystem}")
return bytes()

View File

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
"""
@file ploc_memory_dumper.py
@brief This file implements the command to dump memory sectors of the PLOC. Memories of the PLOC which can be dumped
are one MRAM, two flash memories and the SRAM.
@brief This file implements the command to dump memory sectors of the PLOC. Memories of the PLOC
which can be dumped are one MRAM, two flash memories and the SRAM.
@author J. Meier
@date 31.08.2021
"""

View File

@ -6,12 +6,14 @@
@author J. Meier
@date 06.03.2021
"""
import dataclasses
import logging
import struct
import enum
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import get_object_ids, PLOC_MPSOC_ID
from eive_tmtc.pus_tm.defs import PrintWrapper
from tmtccmd.config.tmtc import (
tmtc_definitions_provider,
OpCodeEntry,
@ -22,38 +24,53 @@ from tmtccmd.tc import service_provider
from tmtccmd.tc.decorator import ServiceProviderParams
from eive_tmtc.utility.input_helper import InputHelper
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
from tmtccmd.tc.pus_8_fsfw_funccmd import create_action_cmd
_LOGGER = logging.getLogger(__name__)
MANUAL_INPUT = "1"
flash_write_file_dict = {
MANUAL_INPUT: ["manual input", ""],
"2": ["/mnt/sd0/ploc/mpsoc/flash_write.bin", "/mnt/sd0/ploc/mpsoc/flash_write.bin"],
OBC_WRITE_FILE_DICT = {
MANUAL_INPUT: ("manual input", ""),
"2": ("/mnt/sd0/ploc/mpsoc/flash_write.bin", "/mnt/sd0/ploc/mpsoc/flash_write.bin"),
}
mpsoc_file_dict = {
MANUAL_INPUT: ["manual input", ""],
"2": ["0:/flash", "0:/flash"],
OBC_READ_FILE_DICT = {
MANUAL_INPUT: ("manual input", ""),
"2": ("/mnt/sd0/ploc/mpsoc/flash_read.bin", "/mnt/sd0/ploc/mpsoc/flash_read.bin"),
}
MPSOC_WRITE_FILE_DICT = {
MANUAL_INPUT: ("manual input", ""),
"2": ("0:/", "0:/"),
}
MPSOC_READ_FILE_DICT = {
MANUAL_INPUT: ("manual input", ""),
"2": ("0:/PICA", "0:/PICA"),
}
SEQ_FILE_NAMES = ["0:/EM16/231", "0:/EQ04/E-75", "0:/EQ01/E130"]
SEQ_FILE_DICT = {
MANUAL_INPUT: ["manual input", ""],
"2": [f"16QRM On Carrier 200 MBd ({SEQ_FILE_NAMES[0]})", f"{SEQ_FILE_NAMES[0]}"],
"3": [f"QPSK On Carrier 780 MBd ({SEQ_FILE_NAMES[1]})", f"{SEQ_FILE_NAMES[1]}"],
"4": [f"Maximum Bandwidth QPSK ({SEQ_FILE_NAMES[2]})", f"{SEQ_FILE_NAMES[2]}"],
MANUAL_INPUT: ("manual input", ""),
"2": (f"16QRM On Carrier 200 MBd ({SEQ_FILE_NAMES[0]})", f"{SEQ_FILE_NAMES[0]}"),
"3": (f"QPSK On Carrier 780 MBd ({SEQ_FILE_NAMES[1]})", f"{SEQ_FILE_NAMES[1]}"),
"4": (f"Maximum Bandwidth QPSK ({SEQ_FILE_NAMES[2]})", f"{SEQ_FILE_NAMES[2]}"),
}
CARRIAGE_RETURN = 0xD
class CommandId(enum.IntEnum):
class SetId(enum.IntEnum):
HK_ID = 0
class ActionId(enum.IntEnum):
TC_MEM_WRITE = 1
TC_MEM_READ = 2
FLASH_WRITE = 9
TM_MEM_READ_RPT = 6
TC_FLASH_WRITE_FULL_FILE = 9
TC_FLASH_DELETE = 10
TC_REPLAY_START = 11
TC_REPLAY_STOP = 12
@ -64,28 +81,40 @@ class CommandId(enum.IntEnum):
TC_MODE_REPLAY = 16
TC_CAM_CMD_SEND = 17
TC_MODE_IDLE = 18
TM_CAM_CMD_RPT = 19
SET_UART_TX_TRISTATE = 20
RELEASE_UART_TX = 21
TC_CAM_TAKE_PIC = 22
TC_SIMPLEX_SEND_FILE = 23
TC_DOWNLINK_DATA_MODULATE = 24
TC_MODE_SNAPSHOT = 25
TC_FLASH_DIR_GET_CONTENT = 28
TM_FLASH_DIRECTORY_CONTENT = 29
TC_FLASH_READ_FULL_FILE = 30
class OpCode:
ON = ["on"]
OFF = ["off"]
NORMAL = ["normal"]
VERIFY_BOOT = ["verify_boot"]
MODE_REPLAY = ["mode_replay"]
MODE_IDLE = ["mode_idle"]
REPLAY_WRITE_SEQ = ["replay_write"]
DOWNLINK_PWR_ON = ["downlink_pwr_on"]
REPLAY_START = ["replay_start"]
CAM_TAKE_PIC = ["cam_take_pic"]
SIMPLEX_SEND_FILE = ["simplex_send_file"]
DOWNLINK_DATA_MODULATE = ["downlink_data_modulate"]
MODE_SNAPSHOT = ["mode_snapshot"]
ON = "on"
OFF = "off"
NORMAL = "normal"
VERIFY_BOOT = "verify_boot"
MODE_REPLAY = "mode_replay"
MODE_IDLE = "mode_idle"
REPLAY_WRITE_SEQ = "replay_write"
DOWNLINK_PWR_ON = "downlink_pwr_on"
MEM_WRITE = "memory_write"
MEM_READ = "memory_read"
DOWNLINK_PWR_OFF = "downlink_pwr_off"
FLASH_WRITE_FILE = "flash_write_file"
FLASH_READ_FILE = "flash_read_file"
FLASH_DELETE_FILE = "flash_delete_file"
FLASH_GET_DIR_CONTENT = "flash_get_dir_content"
REPLAY_STOP = "replay_stop"
REPLAY_START = "replay_start"
CAM_TAKE_PIC = "cam_take_pic"
SIMPLEX_SEND_FILE = "simplex_send_file"
DOWNLINK_DATA_MODULATE = "downlink_data_modulate"
MODE_SNAPSHOT = "mode_snapshot"
class Info:
@ -94,12 +123,18 @@ class Info:
NORMAL = "Normal"
VERIFY_BOOT = "Verify boot by reading 0xdeadbeef from DEADBEEF address"
MODE_REPLAY = "Switch to REPLAY mode"
REPLAY_STOP = "Stop Replay"
MODE_IDLE = "Switch to IDLE mode"
REPLAY_WRITE_SEQ = "Replay write sequence"
DOWNLINK_PWR_ON = "Downlink Power On"
DOWNLINK_PWR_OFF = "Downlink Power Off"
REPLAY_START = "Replay Start"
CAM_TAKE_PIC = "Cam Take Picture"
SIMPLEX_SEND_FILE = "Simplex Send File"
FLASH_READ_FILE = "Copy file from MPSoC to OBC"
FLASH_WRITE_FILE = "Copy file from OBC to MPSoC"
FLASH_DELETE_FILE = "Delete file on MPSoC"
FLASH_GET_DIR_CONTENT = "Get flash directory content on MPSoC"
DOWNLINK_DATA_MODULATE = "Downlink data modulate"
MODE_SNAPSHOT = "Mode Snapshot"
@ -108,28 +143,25 @@ class MemAddresses(enum.IntEnum):
DEADBEEF = 0x40000004
class PlocReplyIds(enum.IntEnum):
TM_MEM_READ_RPT = 6
TM_CAM_CMD_RPT = 19
@tmtc_definitions_provider
def add_ploc_mpsoc_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(OpCode.OFF, Info.OFF)
oce.add(OpCode.ON, Info.ON)
oce.add(OpCode.NORMAL, Info.NORMAL)
oce.add("3", "Ploc MPSoC: Memory write")
oce.add("4", "Ploc MPSoC: Memory read")
oce.add("5", "Ploc MPSoC: Flash write")
oce.add("6", "Ploc MPSoC: Flash delete")
oce.add(OpCode.MEM_WRITE, "Ploc MPSoC: Memory write")
oce.add(OpCode.MEM_READ, "Ploc MPSoC: Memory read")
oce.add(OpCode.FLASH_WRITE_FILE, Info.FLASH_WRITE_FILE)
oce.add(OpCode.FLASH_READ_FILE, Info.FLASH_READ_FILE)
oce.add(OpCode.FLASH_DELETE_FILE, Info.FLASH_DELETE_FILE)
oce.add(OpCode.FLASH_GET_DIR_CONTENT, Info.FLASH_GET_DIR_CONTENT)
oce.add(OpCode.REPLAY_START, Info.REPLAY_START)
oce.add("8", "Ploc MPSoC: Replay stop")
oce.add(OpCode.REPLAY_STOP, Info.REPLAY_STOP)
oce.add(OpCode.DOWNLINK_PWR_ON, Info.DOWNLINK_PWR_ON)
oce.add("10", "Ploc MPSoC: Downlink pwr off")
oce.add(OpCode.DOWNLINK_PWR_OFF, Info.DOWNLINK_PWR_OFF)
oce.add(OpCode.REPLAY_WRITE_SEQ, Info.REPLAY_WRITE_SEQ)
oce.add("12", "Ploc MPSoC: OBSW reset sequence count")
oce.add(OpCode.VERIFY_BOOT, "Ploc MPSoC: Read DEADBEEF address")
oce.add(OpCode.VERIFY_BOOT, Info.VERIFY_BOOT)
oce.add(OpCode.MODE_REPLAY, Info.MODE_REPLAY)
oce.add(OpCode.MODE_IDLE, Info.MODE_IDLE)
oce.add("16", "Ploc MPSoC: Tc cam command send")
@ -143,7 +175,9 @@ def add_ploc_mpsoc_cmds(defs: TmtcDefinitionWrapper):
@service_provider(CustomServiceList.PLOC_MPSOC)
def pack_ploc_mpsoc_commands(p: ServiceProviderParams):
def pack_ploc_mpsoc_commands( # noqa C901
p: ServiceProviderParams,
): # noqa C901: Complexity okay here.
object_id = get_object_ids().get(PLOC_MPSOC_ID)
q = p.queue_helper
prefix = "PLOC MPSoC"
@ -152,19 +186,19 @@ def pack_ploc_mpsoc_commands(p: ServiceProviderParams):
f"Generate command for PLOC MPSoC with object id: {object_id.as_hex_string}"
)
obyt = object_id.as_bytes
if op_code in OpCode.OFF:
if op_code == OpCode.OFF:
q.add_log_cmd(f"{prefix}: {Info.OFF}")
command = pack_mode_data(obyt, Mode.OFF, 0)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
if op_code in OpCode.ON:
if op_code == OpCode.ON:
q.add_log_cmd(f"{prefix}: {Info.ON}")
data = pack_mode_data(obyt, Mode.ON, 0)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
if op_code in OpCode.NORMAL:
if op_code == OpCode.NORMAL:
q.add_log_cmd(f"{prefix}: {Info.NORMAL}")
data = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
if op_code == "3":
if op_code == OpCode.MEM_WRITE:
q.add_log_cmd("PLOC MPSoC: TC mem write test")
memory_address = int(
input("PLOC MPSoC: Tc Mem Write: Type memory address: 0x"), 16
@ -180,11 +214,15 @@ def pack_ploc_mpsoc_commands(p: ServiceProviderParams):
q.add_log_cmd("PLOC MPSoC: TC mem read test")
data = prepare_mem_read_command(object_id=object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "5":
q.add_log_cmd("PLOC MPSoC: Flash write")
if op_code == OpCode.FLASH_WRITE_FILE:
q.add_log_cmd(f"{prefix}: {Info.FLASH_WRITE_FILE}")
data = prepare_flash_write_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "6":
if op_code == OpCode.FLASH_READ_FILE:
q.add_log_cmd(f"{prefix}: {Info.FLASH_READ_FILE}")
data = prepare_flash_read_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == OpCode.FLASH_DELETE_FILE:
q.add_log_cmd("PLOC MPSoC: Flash delete")
data = prepare_flash_delete_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
@ -192,76 +230,88 @@ def pack_ploc_mpsoc_commands(p: ServiceProviderParams):
q.add_log_cmd(f"{prefix}: {Info.REPLAY_START}")
data = prepare_replay_start_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "8":
if op_code == OpCode.REPLAY_STOP:
q.add_log_cmd("PLOC MPSoC: Replay stop")
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_REPLAY_STOP)
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_REPLAY_STOP)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.DOWNLINK_PWR_ON:
if op_code == OpCode.DOWNLINK_PWR_ON:
q.add_log_cmd(f"{prefix}: {OpCode.DOWNLINK_PWR_ON}")
data = prepare_downlink_pwr_on_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "10":
if op_code == OpCode.DOWNLINK_PWR_OFF:
q.add_log_cmd("PLOC MPSoC: Downlink pwr off")
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_DOWNLINK_PWR_OFF)
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_DOWNLINK_PWR_OFF)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.REPLAY_WRITE_SEQ:
if op_code == OpCode.FLASH_GET_DIR_CONTENT:
q.add_log_cmd(f"{prefix}: {Info.FLASH_GET_DIR_CONTENT}")
dir_name = input("Please specify MPSoC directory name to get information for: ")
dir_name = bytearray(dir_name.encode("utf-8"))
dir_name.append(0)
q.add_pus_tc(
create_action_cmd(
object_id=object_id.as_bytes,
action_id=ActionId.TC_FLASH_DIR_GET_CONTENT,
user_data=dir_name,
)
)
if op_code == OpCode.REPLAY_WRITE_SEQ:
q.add_log_cmd(f"{prefix}: {Info.REPLAY_WRITE_SEQ}")
data = prepare_replay_write_sequence_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "12":
q.add_log_cmd("PLOC MPSoC: Reset OBSW sequence count")
data = object_id.as_bytes + struct.pack("!I", CommandId.OBSW_RESET_SEQ_COUNT)
data = object_id.as_bytes + struct.pack("!I", ActionId.OBSW_RESET_SEQ_COUNT)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.VERIFY_BOOT:
if op_code == OpCode.VERIFY_BOOT:
num_words = 1
q.add_log_cmd(f"{prefix} {Info.VERIFY_BOOT}")
data = (
object_id.as_bytes
+ struct.pack("!I", CommandId.TC_MEM_READ)
+ struct.pack("!I", ActionId.TC_MEM_READ)
+ struct.pack("!I", MemAddresses.DEADBEEF)
+ struct.pack("!H", num_words)
)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.MODE_REPLAY:
if op_code == OpCode.MODE_REPLAY:
q.add_log_cmd("PLOC MPSoC: Tc mode replay")
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_MODE_REPLAY)
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_REPLAY)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.MODE_IDLE:
if op_code == OpCode.MODE_IDLE:
q.add_log_cmd("PLOC MPSoC: Tc mode idle")
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_MODE_IDLE)
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_IDLE)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "16":
q.add_log_cmd("PLOC MPSoC: Tc cam command send")
cam_cmd = input("Specify cam command string: ")
data = (
object_id.as_bytes
+ struct.pack("!I", CommandId.TC_CAM_CMD_SEND)
+ struct.pack("!I", ActionId.TC_CAM_CMD_SEND)
+ bytearray(cam_cmd, "utf-8")
)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "17":
q.add_log_cmd("PLOC MPSoC: Set UART TX tristate")
data = object_id.as_bytes + struct.pack("!I", CommandId.SET_UART_TX_TRISTATE)
data = object_id.as_bytes + struct.pack("!I", ActionId.SET_UART_TX_TRISTATE)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code == "18":
q.add_log_cmd("PLOC MPSoC: Release UART TX")
data = object_id.as_bytes + struct.pack("!I", CommandId.RELEASE_UART_TX)
data = object_id.as_bytes + struct.pack("!I", ActionId.RELEASE_UART_TX)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.CAM_TAKE_PIC:
if op_code == OpCode.CAM_TAKE_PIC:
q.add_log_cmd("PLOC MPSoC: Cam take picture")
data = prepare_cam_take_pic_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.SIMPLEX_SEND_FILE:
if op_code == OpCode.SIMPLEX_SEND_FILE:
q.add_log_cmd("PLOC MPSoC: Simplex send file")
data = prepare_simplex_send_file_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.DOWNLINK_DATA_MODULATE:
if op_code == OpCode.DOWNLINK_DATA_MODULATE:
q.add_log_cmd("PLOC MPSoC: Downlink data modulate")
data = prepare_downlink_data_modulate_cmd(object_id.as_bytes)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
if op_code in OpCode.MODE_SNAPSHOT:
if op_code == OpCode.MODE_SNAPSHOT:
q.add_log_cmd("PLOC MPSoC: Mode snapshot")
data = object_id.as_bytes + struct.pack("!I", CommandId.TC_MODE_SNAPSHOT)
data = object_id.as_bytes + struct.pack("!I", ActionId.TC_MODE_SNAPSHOT)
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
@ -278,7 +328,7 @@ def generate_write_mem_command(
"""
command = (
object_id
+ struct.pack("!I", CommandId.TC_MEM_WRITE)
+ struct.pack("!I", ActionId.TC_MEM_WRITE)
+ struct.pack("!I", memory_address)
+ struct.pack("!H", mem_len)
+ struct.pack("!I", memory_data)
@ -291,31 +341,48 @@ def prepare_mem_read_command(object_id: bytes) -> bytearray:
num_words = int(input("PLOC MPSoC specify number of words (32-bit) to read: "))
command = (
object_id
+ struct.pack("!I", CommandId.TC_MEM_READ)
+ struct.pack("!I", ActionId.TC_MEM_READ)
+ struct.pack("!I", memory_address)
+ struct.pack("!H", num_words)
)
return bytearray(command)
def prepare_flash_base_cmd(
obc_filename: str, mpsoc_filename: str, action_id: int, object_id: bytes
) -> bytearray:
command = bytearray(object_id)
command.extend(struct.pack("!I", action_id))
command.extend(obc_filename.encode("utf-8"))
command.append(0)
command.extend(mpsoc_filename.encode("utf-8"))
command.append(0)
return command
def prepare_flash_write_cmd(object_id: bytes) -> bytearray:
obc_file = get_obc_file()
mpsoc_file = get_mpsoc_file()
command = (
object_id
+ struct.pack("!I", CommandId.FLASH_WRITE)
+ bytearray(obc_file, "utf-8")
+ bytearray(mpsoc_file, "utf-8")
obc_file = get_obc_file(OBC_WRITE_FILE_DICT)
mpsoc_file = get_mpsoc_file(MPSOC_WRITE_FILE_DICT)
return prepare_flash_base_cmd(
obc_file, mpsoc_file, ActionId.TC_FLASH_WRITE_FULL_FILE, object_id
)
return bytearray(command)
def prepare_flash_read_cmd(object_id: bytes) -> bytearray:
mpsoc_file = get_mpsoc_file(MPSOC_READ_FILE_DICT)
obc_file = get_obc_file(OBC_READ_FILE_DICT)
cmd = prepare_flash_base_cmd(
obc_file, mpsoc_file, ActionId.TC_FLASH_READ_FULL_FILE, object_id
)
file_size = get_mpsoc_file_size()
cmd.extend(struct.pack("!I", file_size))
return cmd
def prepare_flash_delete_cmd(object_id: bytes) -> bytearray:
file = get_mpsoc_file()
file = get_mpsoc_file(MPSOC_READ_FILE_DICT)
command = (
object_id
+ struct.pack("!I", CommandId.TC_FLASH_DELETE)
+ bytearray(file, "utf-8")
object_id + struct.pack("!I", ActionId.TC_FLASH_DELETE) + file.encode("utf-8")
)
return bytearray(command)
@ -324,7 +391,7 @@ def prepare_replay_start_cmd(object_id: bytes) -> bytearray:
replay = int(input("Specify replay mode (0 - once, 1 - repeated): "))
command = (
object_id
+ struct.pack("!I", CommandId.TC_REPLAY_START)
+ struct.pack("!I", ActionId.TC_REPLAY_START)
+ struct.pack("!B", replay)
)
return bytearray(command)
@ -335,7 +402,7 @@ def prepare_downlink_pwr_on_cmd(object_id: bytes) -> bytearray:
lane_rate = int(input("Specify lane rate (0 - 9): "))
command = (
object_id
+ struct.pack("!I", CommandId.TC_DOWNLINK_PWR_ON)
+ struct.pack("!I", ActionId.TC_DOWNLINK_PWR_ON)
+ struct.pack("!B", mode)
+ struct.pack("!B", lane_rate)
)
@ -347,7 +414,7 @@ def prepare_replay_write_sequence_cmd(object_id: bytes) -> bytearray:
file = get_sequence_file()
command = (
object_id
+ struct.pack("!I", CommandId.TC_REPLAY_WRITE_SEQUENCE)
+ struct.pack("!I", ActionId.TC_REPLAY_WRITE_SEQUENCE)
+ struct.pack("!B", use_decoding)
+ bytearray(file, "utf-8")
# + bytes([0])
@ -357,7 +424,7 @@ def prepare_replay_write_sequence_cmd(object_id: bytes) -> bytearray:
def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
selection = input("Use default parameter? (Y/N): ")
if selection is "Y" or selection is "y":
if selection.lower() in ["y", "1", "yes"]:
filename = "0:/test"
encoder_setting_y = 7
quantization_y = 0
@ -377,7 +444,7 @@ def prepare_cam_take_pic_cmd(object_id: bytes) -> bytearray:
bypass_compressor = int(input("Specify bypassCompressor: "))
command = (
object_id
+ struct.pack("!I", CommandId.TC_CAM_TAKE_PIC)
+ struct.pack("!I", ActionId.TC_CAM_TAKE_PIC)
+ bytearray(filename, "utf-8")
+ bytes([0])
+ struct.pack("!B", encoder_setting_y)
@ -395,7 +462,7 @@ def prepare_simplex_send_file_cmd(object_id: bytes) -> bytearray:
filename = input("Specify filename: ")
command = (
object_id
+ struct.pack("!I", CommandId.TC_SIMPLEX_SEND_FILE)
+ struct.pack("!I", ActionId.TC_SIMPLEX_SEND_FILE)
+ bytearray(filename, "utf-8")
+ bytes([0])
)
@ -409,7 +476,7 @@ def prepare_downlink_data_modulate_cmd(object_id: bytes) -> bytearray:
dest_mem_addr = int(input("Specify destMemAddr: "))
command = (
object_id
+ struct.pack("!I", CommandId.TC_DOWNLINK_DATA_MODULATE)
+ struct.pack("!I", ActionId.TC_DOWNLINK_DATA_MODULATE)
+ struct.pack("!B", format)
+ struct.pack("!I", src_mem_addr)
+ struct.pack("!H", src_mem_len)
@ -418,28 +485,35 @@ def prepare_downlink_data_modulate_cmd(object_id: bytes) -> bytearray:
return bytearray(command)
def get_obc_file() -> str:
_LOGGER.info("Specify OBC file ")
input_helper = InputHelper(flash_write_file_dict)
def get_obc_file(input_dict: dict) -> str:
_LOGGER.info("Specify OBC filename")
input_helper = InputHelper(input_dict)
key = input_helper.get_key()
if key == MANUAL_INPUT:
file = input("Ploc MPSoC: Specify absolute name of flash file: ")
else:
file = flash_write_file_dict[key][1]
file = input_dict[key][1]
return file
def get_mpsoc_file() -> str:
_LOGGER.info("Specify MPSoC file")
input_helper = InputHelper(mpsoc_file_dict)
def get_mpsoc_file(input_dict: dict) -> str:
_LOGGER.info("Specify MPSoC filename")
input_helper = InputHelper(input_dict)
key = input_helper.get_key()
if key == MANUAL_INPUT:
file = input("Ploc MPSoC: Specify absolute name file: ")
else:
file = mpsoc_file_dict[key][1]
file = input_dict[key][1]
return file
def get_mpsoc_file_size() -> int:
file_size = int(input("Specify MPSoC file size: "))
if file_size <= 0:
raise ValueError("Invalid file size")
return file_size
def get_sequence_file() -> str:
_LOGGER.info("Specify sequence file")
input_helper = InputHelper(SEQ_FILE_DICT)
@ -449,3 +523,185 @@ def get_sequence_file() -> str:
else:
file = SEQ_FILE_DICT[key][1]
return file
def handle_ploc_mpsoc_hk_data(pw: PrintWrapper, hk_data: bytes, set_id: int):
if set_id == SetId.HK_ID:
fmt_str = "!IBBBBBBB"
current_idx = 0
inc_len = struct.calcsize(fmt_str)
(
status,
mode,
downlink_pwr_on,
downlink_reply_active,
downlink_jesd_sync_status,
downlink_dac_status,
cam_status,
cam_sdi_status,
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
current_idx += inc_len
pw.ilog(_LOGGER, "Received MPSoC HK")
pw.dlog(f"Status: {status}")
pw.dlog(f"Mode: {mode}")
pw.dlog(f"Downlink Power On: {downlink_pwr_on}")
pw.dlog(f"Downlink Reply Active: {downlink_reply_active}")
pw.dlog(f"Downlink JESD Sync Status: {downlink_jesd_sync_status}")
pw.dlog(f"Downlink DAC Status: {downlink_dac_status}")
pw.dlog(f"CAM Status: {cam_status}")
pw.dlog(f"CAM SDI Status: {cam_sdi_status}")
fmt_str = "!fffffffff"
inc_len = struct.calcsize(fmt_str)
(
cam_fpga_temp,
cam_soc_temp,
sysmon_temp,
sysmon_vcc_int,
sysmon_vcc_aux,
sysmon_vcc_bram,
sysmon_vcc_paux,
sysmon_vcc_pint,
sysmon_vcc_pdro,
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
current_idx += inc_len
pw.dlog(f"CAM FPGA Temperature: {cam_fpga_temp}")
pw.dlog(f"CAM SoC Temperature: {cam_soc_temp}")
pw.dlog(f"System Monitor Temperature: {sysmon_temp}")
pw.dlog(
f"SYSMON VCC INT {sysmon_vcc_int:.3f} | SYSMON VCC AUX"
f" {sysmon_vcc_aux:.3f} | SYSMON VCC BRAM {sysmon_vcc_bram:.3f}"
)
pw.dlog(
f"SYSMON VCC PAUX {sysmon_vcc_paux:.3f} | SYSMON VCC PINT"
f" {sysmon_vcc_pint:.3f} | SYSMON VCC PDRO {sysmon_vcc_pdro:.3f}"
)
fmt_str = "!fffffffffffff"
inc_len = struct.calcsize(fmt_str)
(
sysmon_mb_12v,
sysmon_mb_3v3,
sysmon_mb_1v8,
sysmon_vcc_12v,
sysmon_vcc_5v,
sysmon_vcc_3v3,
sysmon_vcc_3v3va,
sysmon_vcc_2v5ddr,
sysmon_vcc_1v2ddr,
sysmon_vcc_0v9,
sysmon_vcc_0v6vtt,
sysmon_safe_cotr_cur,
sysmon_nvm4_xo_cur,
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
current_idx += inc_len
pw.dlog(
f"SYSMON MB 12V {sysmon_mb_12v:.3f} | SYSMON MB 3V3 {sysmon_mb_3v3:.3f} | "
f"SYSMON MBA 1V8 {sysmon_mb_1v8:.3f}"
)
pw.dlog(
f"SYSMON VCC 12V {sysmon_vcc_12v:.3f} | SYSMON VCC 5V {sysmon_vcc_5v:.3f} |"
f" SYSMON VCC 3V3 {sysmon_vcc_3v3:.3f} | SYSMON VCC 3V3VA"
f" {sysmon_vcc_3v3va}"
)
pw.dlog(
f"SYSMON VCC 2V5DDR {sysmon_vcc_2v5ddr:.3f} | "
f"SYSMON VCC 1V2DDR {sysmon_vcc_1v2ddr:.3f} | "
f"SYSMON VCC 0V9 {sysmon_vcc_0v9:.3f} | "
f"SYSMON VCC 0V6VTT {sysmon_vcc_0v6vtt}"
)
pw.dlog(
f"SYSMON SAFE COTS CURR: {sysmon_safe_cotr_cur} | "
f"SYSMON NVM4XO CURR {sysmon_nvm4_xo_cur}"
)
fmt_str = "!HHBB"
inc_len = struct.calcsize(fmt_str)
(
sem_uncorrectable_errs,
sem_correctable_errs,
sem_status,
reboot_mpsoc_required,
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
pw.dlog(f"SEM IP Uncorrectable Errors: {sem_uncorrectable_errs}")
pw.dlog(f"SEM IP Correctable Errors: {sem_correctable_errs}")
pw.dlog(f"SEM IP Status: {sem_status}")
pw.dlog(f"Reboot MPSoC required: {reboot_mpsoc_required}")
else:
_LOGGER.warning(f"Unknown set ID {set_id} for MPSoC HK")
pass
@dataclasses.dataclass
class DirElement:
name: str
attr: int
size: int
def handle_mpsoc_data_reply(action_id: int, pw: PrintWrapper, custom_data: bytearray):
if action_id == ActionId.TM_MEM_READ_RPT:
header_list = [
"PLOC Memory Address",
"PLOC Mem Len",
"PLOC Read Memory Data",
]
content_list = [
"0x" + custom_data[:4].hex(),
struct.unpack("!H", custom_data[4:6])[0],
"0x" + custom_data[6:10].hex(),
]
pw.dlog(f"{header_list}")
pw.dlog(f"{content_list}")
elif action_id == ActionId.TM_CAM_CMD_RPT:
header_list = ["Camera reply string", "ACK"]
content_list = [
custom_data[: len(custom_data) - 1].decode("utf-8"),
hex(custom_data[-1]),
]
pw.dlog(f"{header_list}")
pw.dlog(f"{content_list}")
elif action_id == ActionId.TM_FLASH_DIRECTORY_CONTENT:
if len(custom_data) < 16:
_LOGGER.warning(
"PLOC MPSoC flash directory data shorter than minimum 16 bytes"
)
current_idx = 0
dir_name_short = custom_data[current_idx : current_idx + 12].decode("utf-8")
current_idx += 12
num_elements = struct.unpack("!I", custom_data[current_idx : current_idx + 4])[
0
]
current_idx += 4
elem_names = []
elem_attrs = []
elem_sizes = []
expected_size = 16 + num_elements * 17
if len(custom_data) < expected_size:
_LOGGER.warning(
f"PLOC MPSoC flash directory data shorter than expected {expected_size}"
)
pw.dlog(
f"Received PLOC MPSoC flash directory content for path {dir_name_short} "
f"with {num_elements} elements"
)
# It is as weird as it looks..
for _ in range(num_elements):
end_of_str = custom_data[current_idx : current_idx + 12].index(b"\x00")
elem_name = custom_data[current_idx : current_idx + end_of_str].decode(
"utf-8"
)
current_idx += 12
elem_names.append(elem_name)
for _ in range(num_elements):
elem_attrs.append(custom_data[current_idx])
current_idx += 1
for _ in range(num_elements):
elem_sizes.append(
struct.unpack("!I", custom_data[current_idx : current_idx + 4])[0]
)
current_idx += 4
for i in range(num_elements):
pw.dlog(f"{DirElement(elem_names[i], elem_attrs[i], elem_sizes[i])}")

View File

@ -21,7 +21,7 @@ from tmtccmd.tc import service_provider
from tmtccmd.tc.decorator import ServiceProviderParams
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode
from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from eive_tmtc.utility.input_helper import InputHelper
_LOGGER = logging.getLogger(__name__)
@ -172,7 +172,6 @@ class Info(str, enum.Enum):
@tmtc_definitions_provider
def add_ploc_supv_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(OpCodes.OFF, Info.OFF)
oce.add(OpCodes.ON, Info.ON)
@ -223,7 +222,7 @@ def add_ploc_supv_cmds(defs: TmtcDefinitionWrapper):
@service_provider(CustomServiceList.PLOC_SUPV)
def pack_ploc_supv_commands(p: ServiceProviderParams):
def pack_ploc_supv_commands(p: ServiceProviderParams): # noqa C901
q = p.queue_helper
op_code = p.op_code
object_id = get_object_ids().get(PLOC_SUPV_ID)
@ -472,8 +471,8 @@ def pack_ploc_supv_commands(p: ServiceProviderParams):
custom_data.extend(struct.pack("!B", memory_id))
custom_data.extend(struct.pack("!I", start_address))
q.add_log_cmd(
f"{prefix}: {Info.MEM_CHECK} for file {update_file} at memory ID {memory_id} at start "
f"address {start_address}"
f"{prefix}: {Info.MEM_CHECK} for file {update_file} at memory ID"
f" {memory_id} at start address {start_address}"
)
command = create_action_cmd(
object_id.as_bytes, SupvActionId.MEM_CHECK, custom_data
@ -484,7 +483,9 @@ def pack_ploc_supv_commands(p: ServiceProviderParams):
def pack_sel_boot_image_cmd(
object_id: bytes, mem: int, bp0: int, bp1: int, bp2: int
) -> bytearray:
"""This function can be used to generate the command to select the image from which the MPSoC will boot
"""This function can be used to generate the command to select the image from which the MPSoC
will boot.
@param object_id The object id of the PLOC supervisor handler.
@param mem The memory from which the MPSoC shall boot (NVM0 - 0, NVM1 - 1)
@param bp0 Partition pin 0
@ -721,11 +722,42 @@ def get_event_buffer_path() -> str:
return file
def handle_supv_hk_data(set_id: int, hk_data: bytes, printer: FsfwTmTcPrinter):
pw = PrintWrapper(printer)
class SocState(enum.IntEnum):
OFF = 0
BOOTING = 1
OPERATIONAL = 2
SHUTDOWN = 3
def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
current_idx = 0
if set_id == SetIds.HK_REPORT:
pass
fmt_str = "!IIIQIIIIIBBBB"
inc_len = struct.calcsize(fmt_str)
(
temp_ps,
temp_pl,
temp_sup,
uptime,
cpu_load,
avail_heap,
num_tcs,
num_tms,
soc_state,
nvm_0_1_state,
nvm_3_state,
mission_io_state,
fmc_state,
) = struct.unpack(fmt_str, hk_data[:inc_len])
pw.dlog(f"Temp PS {temp_ps} C | Temp PL {temp_pl} C | Temp SUP {temp_sup} C")
pw.dlog(f"Uptime {uptime} | CPU Load {cpu_load} | Avail Heap {avail_heap}")
pw.dlog(f"Number TCs {num_tcs} | Number TMs {num_tms}")
pw.dlog(f"SOC state {SocState(soc_state)}")
pw.dlog(f"NVM 01 State {nvm_0_1_state}")
pw.dlog(f"NVM 3 State {nvm_3_state}")
pw.dlog(f"Mission IO state {mission_io_state}")
pw.dlog(f"FMC state {fmc_state}")
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[inc_len:], 13))
elif set_id == SetIds.BOOT_STATUS_REPORT:
fmt_str = "!BBIIBBBBBB"
inc_len = struct.calcsize(fmt_str)
@ -743,7 +775,8 @@ def handle_supv_hk_data(set_id: int, hk_data: bytes, printer: FsfwTmTcPrinter):
) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len])
current_idx += inc_len
pw.dlog(
f"SoC state (0:off, 1:booting, 2:update, 3:operating, 4:shutdown, 5:reset): {soc_state}"
"SoC state (0:off, 1:booting, 2:update, 3:operating, 4:shutdown, 5:reset):"
f" {soc_state}"
)
pw.dlog(f"Power Cycles {power_cycles}")
pw.dlog(f"Boot after {boot_after_ms} ms | Boot timeout {boot_timeout_ms} ms")
@ -752,7 +785,7 @@ def handle_supv_hk_data(set_id: int, hk_data: bytes, printer: FsfwTmTcPrinter):
f"BP0 State {bp_0_state} | BP1 State {bp_1_state} | BP2 State {bp_2_state}"
)
pw.dlog(f"Boot State {boot_state} | Boot Cycles {boot_cycles}")
pw.printer.print_validity_buffer(hk_data[current_idx:], 10)
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 10)
else:
pw.dlog(f"PLOC SUPV: HK handling not implemented for set ID {set_id}")
pw.dlog(f"Raw Data: 0x[{hk_data.hex(sep=',')}]")

View File

@ -18,7 +18,7 @@ from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_data
from tmtccmd.tc.pus_3_fsfw_hk import generate_one_hk_command, make_sid
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
class SetId(enum.IntEnum):
@ -100,9 +100,8 @@ def rad_sensor_mode_cmd(
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
def handle_rad_sensor_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
def handle_rad_sensor_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
if set_id == SetId.HK:
pw = PrintWrapper(printer)
current_idx = 0
pw.dlog("Received Radiation Sensor HK data")
fmt_str = "!fHHHHHH"
@ -112,8 +111,10 @@ def handle_rad_sensor_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
)
ain_dict = {0: ain0, 1: ain1, 4: ain4, 5: ain5, 6: ain6, 7: ain7}
pw.dlog(f"Temperature: {temp} C")
pw.dlog(f"AIN Channel | Raw Value (hex) | Raw Value (dec)")
pw.dlog("AIN Channel | Raw Value (hex) | Raw Value (dec)")
for idx, val in ain_dict.items():
pw.dlog(f"{idx} | {val:#06x} | {str(val).ljust(5)}")
current_idx += inc_len
printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=7)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=7
)

View File

@ -17,17 +17,20 @@ USE_SCEX_CONF_FILE = True
class OpCode:
PING = ["0", "ping"]
ION_CMD = ["1", "ion"]
TEMP_CMD = ["2", "temp"]
EXP_STATUS_CMD = ["3", "expstatus"]
PING = "ping"
ION_CMD = "ion"
TEMP_CMD = "temp"
EXP_STATUS_CMD = "expstatus"
ONE_CELLS_CMD = ["4", "onecell"]
ALL_CELLS_CMD = ["5", "allcells"]
FRAM = ["6", "fram"]
ONE_CELLS_CMD = "onecell"
ALL_CELLS_CMD = "allcells"
FRAM = "fram"
SWITCH_ON = ["7", "on"]
SWITCH_OFF = ["8", "off"]
ON = "on"
SWITCH_ON = "on"
OFF = "off"
SWITCH_OFF = OFF
NORMAL = "normal"
class ActionId(enum.IntEnum):
@ -53,6 +56,7 @@ class Info:
SWITCH_ON = "Switch Scex on"
SWITCH_OFF = "Switch Scex off"
NORMAL = "Switch SCEX to normal mode"
@tmtc_definitions_provider
@ -66,8 +70,9 @@ def add_scex_cmds(defs: TmtcDefinitionWrapper):
oce.add(keys=OpCode.ALL_CELLS_CMD, info=Info.ALL_CELLS_CMD)
oce.add(keys=OpCode.FRAM, info=Info.FRAM)
oce.add(keys=OpCode.SWITCH_ON, info=Info.SWITCH_ON)
oce.add(keys=OpCode.SWITCH_OFF, info=Info.SWITCH_OFF)
oce.add(keys=OpCode.ON, info=Info.SWITCH_ON)
oce.add(keys=OpCode.OFF, info=Info.SWITCH_OFF)
oce.add(keys=OpCode.NORMAL, info=Info.NORMAL)
defs.add_service(
name=CustomServiceList.SCEX.value, info="SCEX Device", op_code_entry=oce
@ -75,10 +80,10 @@ def add_scex_cmds(defs: TmtcDefinitionWrapper):
@service_provider(CustomServiceList.SCEX.value)
def pack_scex_cmds(p: ServiceProviderParams):
def pack_scex_cmds(p: ServiceProviderParams): # noqa C901
op_code = p.op_code
q = p.queue_helper
if op_code in OpCode.SWITCH_ON:
if op_code == OpCode.ON:
q.add_log_cmd(Info.SWITCH_ON)
q.add_pus_tc(
PusTelecommand(
@ -87,7 +92,16 @@ def pack_scex_cmds(p: ServiceProviderParams):
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.ON, 0),
)
)
if op_code in OpCode.SWITCH_OFF:
if op_code == OpCode.NORMAL:
q.add_log_cmd(Info.NORMAL)
q.add_pus_tc(
PusTelecommand(
service=200,
subservice=Subservice.TC_MODE_COMMAND,
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.NORMAL, 0),
)
)
if op_code == OpCode.OFF:
q.add_log_cmd(Info.SWITCH_OFF)
q.add_pus_tc(
PusTelecommand(
@ -96,20 +110,20 @@ def pack_scex_cmds(p: ServiceProviderParams):
app_data=pack_mode_data(SCEX_HANDLER_ID, Mode.OFF, 0),
)
)
if op_code in OpCode.PING:
if op_code == OpCode.PING:
q.add_log_cmd(Info.PING)
app_data = bytes([0])
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.PING, app_data))
if op_code in OpCode.ION_CMD:
if op_code == OpCode.ION_CMD:
q.add_log_cmd(Info.ION_CMD)
app_data = bytes([0])
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.ION_CMD, app_data))
if op_code in OpCode.TEMP_CMD:
if op_code == OpCode.TEMP_CMD:
q.add_log_cmd(Info.TEMP_CMD)
app_data = bytes([0])
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.TEMP_CMD, app_data))
if op_code in OpCode.EXP_STATUS_CMD:
if op_code == OpCode.EXP_STATUS_CMD:
q.add_log_cmd(Info.EXP_STATUS_CMD)
app_data = bytes([0])
q.add_pus_tc(
@ -117,7 +131,7 @@ def pack_scex_cmds(p: ServiceProviderParams):
)
# one cell
if op_code in OpCode.ONE_CELLS_CMD:
if op_code == OpCode.ONE_CELLS_CMD:
q.add_log_cmd(Info.ONE_CELLS_CMD)
app_data = bytearray([0])
@ -131,8 +145,7 @@ def pack_scex_cmds(p: ServiceProviderParams):
cell_select = int(cell_select)
if cell_select < 1 or cell_select > 10:
print(
f"Invalid cell number {cell_select}, "
f"Please enter a valid number: "
f"Invalid cell number {cell_select}, Please enter a valid number: "
)
continue
cn = cell_select - 1
@ -165,7 +178,7 @@ def pack_scex_cmds(p: ServiceProviderParams):
create_action_cmd(SCEX_HANDLER_ID, ActionId.ONE_CELLS_CMD, app_data)
)
if op_code in OpCode.ALL_CELLS_CMD:
if op_code == OpCode.ALL_CELLS_CMD:
q.add_log_cmd(Info.ALL_CELLS_CMD)
app_data = bytearray([0])
@ -197,7 +210,7 @@ def pack_scex_cmds(p: ServiceProviderParams):
create_action_cmd(SCEX_HANDLER_ID, ActionId.ALL_CELLS_CMD, app_data)
)
if op_code in OpCode.FRAM:
if op_code == OpCode.FRAM:
q.add_log_cmd(Info.FRAM)
app_data = bytes([0])
q.add_pus_tc(create_action_cmd(SCEX_HANDLER_ID, ActionId.FRAM, app_data))

View File

@ -12,7 +12,7 @@ from tmtccmd.tc.decorator import ServiceProviderParams
from tmtccmd.tc.pus_200_fsfw_mode import Subservice as ModeSubservice
class ModeId:
class ModeId(enum.IntEnum):
OFF = 0
SUPV_ONLY = 10
MPSOC_STREAM = 11

View File

@ -0,0 +1 @@
from .subsystem import add_eps_subsystem_cmds

View File

@ -17,7 +17,7 @@ from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
from tmtccmd.tc.pus_3_fsfw_hk import generate_one_hk_command, make_sid
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode
from tmtccmd.tc.pus_200_fsfw_mode import Subservice as ModeSubservices
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
class BpxSetId(enum.IntEnum):
@ -28,18 +28,30 @@ class BpxSetId(enum.IntEnum):
class BpxActionId:
REBOOT = 2
RESET_COUNTERS = 3
SET_CFG = 4
CONFIG_CMD = 4
GET_CFG = 5
SET_CFG = 6
MAN_HEATER_ON = 10
MAN_HEATER_OFF = 11
class BpxHeaterModeSelect(enum.IntEnum):
OFF = 0
AUTO = 1
class BpxOpCode:
HK = ["0", "hk"]
OFF = ["off"]
ON = ["on"]
RST_BOOT_CNT = ["1", "rst_boot_cnt"]
REQUEST_CFG = ["2", "cfg"]
REQUEST_CFG_HK = ["3", "cfg_hk"]
REBOOT = ["4", "reboot"]
HK = "hk"
OFF = "off"
ON = "on"
RST_CFG = "reset_cfg"
SET_CFG = "set_cfg"
MAN_HEATER_ON = "man_heater_on"
MAN_HEATER_OFF = "man_heater_off"
RST_BOOT_CNT = "rst_boot_cnt"
REQUEST_CFG = "cfg"
REQUEST_CFG_HK = "cfg_hk"
REBOOT = "reboot"
@tmtc_definitions_provider
@ -49,6 +61,10 @@ def add_bpx_cmd_definitions(defs: TmtcDefinitionWrapper):
oce.add(keys=BpxOpCode.OFF, info="Off command")
oce.add(keys=BpxOpCode.HK, info="Request BPX HK")
oce.add(keys=BpxOpCode.RST_BOOT_CNT, info="Reset Boot Count")
oce.add(keys=BpxOpCode.RST_CFG, info="Reset Config to stored default settings")
oce.add(keys=BpxOpCode.SET_CFG, info="Set BPX configuration")
oce.add(keys=BpxOpCode.MAN_HEATER_ON, info="Manual heater on")
oce.add(keys=BpxOpCode.MAN_HEATER_OFF, info="Manual heater off")
oce.add(keys=BpxOpCode.REQUEST_CFG, info="Request Configuration Struct (Step 1)")
oce.add(
keys=BpxOpCode.REQUEST_CFG_HK, info="Request Configuration Struct HK (Step 2)"
@ -62,14 +78,14 @@ def add_bpx_cmd_definitions(defs: TmtcDefinitionWrapper):
@service_provider(CustomServiceList.BPX_BATTERY.value)
def pack_bpx_commands(p: ServiceProviderParams):
def pack_bpx_commands(p: ServiceProviderParams): # noqa C901: Complexity is okay here.
op_code = p.op_code
q = p.queue_helper
if op_code in BpxOpCode.HK:
if op_code == BpxOpCode.HK:
q.add_log_cmd("Requesting BPX battery HK set")
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_HK_SET)
q.add_pus_tc(generate_one_hk_command(sid=sid))
if op_code in BpxOpCode.OFF:
if op_code == BpxOpCode.OFF:
q.add_log_cmd("Off mode")
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.OFF, 0)
q.add_pus_tc(
@ -79,7 +95,7 @@ def pack_bpx_commands(p: ServiceProviderParams):
app_data=mode_cmd,
)
)
if op_code in BpxOpCode.ON:
if op_code == BpxOpCode.ON:
q.add_log_cmd("On mode")
mode_cmd = pack_mode_data(BPX_HANDLER_ID, Mode.ON, 0)
q.add_pus_tc(
@ -89,27 +105,71 @@ def pack_bpx_commands(p: ServiceProviderParams):
app_data=mode_cmd,
)
)
if op_code in BpxOpCode.RST_BOOT_CNT:
if op_code == BpxOpCode.RST_BOOT_CNT:
q.add_log_cmd("Resetting reboot counters")
q.add_pus_tc(
create_action_cmd(
object_id=BPX_HANDLER_ID, action_id=BpxActionId.RESET_COUNTERS
)
)
if op_code in BpxOpCode.REQUEST_CFG:
if op_code == BpxOpCode.RST_CFG:
q.add_log_cmd("Reset BPX configuration")
q.add_pus_tc(
create_action_cmd(
object_id=BPX_HANDLER_ID, action_id=BpxActionId.CONFIG_CMD
)
)
if op_code == BpxOpCode.SET_CFG:
q.add_log_cmd("Setting BPX configuration")
user_data = bytearray()
batt_mode = BpxHeaterModeSelect(
int(input("BPX heater mode select, 0 for OFF 1 for AUTO: "))
)
user_data.append(batt_mode)
lower_limit = int(input("Lower heater limit (-2 default): "))
user_data.append(struct.pack("!b", lower_limit)[0])
upper_limit = int(input("Upper heater limit (3 default): "))
user_data.append(struct.pack("!b", upper_limit)[0])
q.add_pus_tc(
create_action_cmd(
object_id=BPX_HANDLER_ID,
action_id=BpxActionId.SET_CFG,
user_data=user_data,
)
)
if op_code == BpxOpCode.REQUEST_CFG:
q.add_log_cmd("Requesting configuration struct")
q.add_pus_tc(
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.GET_CFG)
)
if op_code in BpxOpCode.REQUEST_CFG_HK:
if op_code == BpxOpCode.REQUEST_CFG_HK:
q.add_log_cmd("Requesting configuration struct HK")
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetId.GET_CFG_SET)
q.add_pus_tc(generate_one_hk_command(sid=sid))
if op_code in BpxOpCode.REBOOT:
if op_code == BpxOpCode.REBOOT:
q.add_log_cmd("Rebooting BPX battery")
q.add_pus_tc(
create_action_cmd(object_id=BPX_HANDLER_ID, action_id=BpxActionId.REBOOT)
)
if op_code == BpxOpCode.MAN_HEATER_ON:
q.add_log_cmd("BPX manual heater on with seconds burntime")
burn_time = int(input("BPX heater burn time in seconds [1-65535]: "))
if burn_time < 1 or burn_time > 65535:
raise ValueError("Invalid burntime, smaller than 0 or larger than 65535")
q.add_pus_tc(
create_action_cmd(
object_id=BPX_HANDLER_ID,
action_id=BpxActionId.MAN_HEATER_ON,
user_data=struct.pack("!H", burn_time),
)
)
if op_code == BpxOpCode.MAN_HEATER_OFF:
q.add_log_cmd("BPX manual heater off")
q.add_pus_tc(
create_action_cmd(
object_id=BPX_HANDLER_ID, action_id=BpxActionId.MAN_HEATER_OFF
)
)
HEADER_LIST = [
@ -126,8 +186,7 @@ HEADER_LIST = [
]
def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
pw = PrintWrapper(printer)
def handle_bpx_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
if set_id == BpxSetId.GET_HK_SET:
fmt_str = "!HHHHhhhhIB"
inc_len = struct.calcsize(fmt_str)
@ -158,7 +217,9 @@ def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
validity_buffer = hk_data[inc_len:]
pw.dlog(str(HEADER_LIST))
pw.dlog(str(content_list))
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=validity_buffer, num_vars=10
)
elif set_id == BpxSetId.GET_CFG_SET:
battheat_mode = hk_data[0]
battheat_low = struct.unpack("!b", hk_data[1:2])[0]
@ -172,4 +233,6 @@ def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
validity_buffer = hk_data[3:]
pw.dlog(str(header_list))
pw.dlog(str(content_list))
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=10)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=validity_buffer, num_vars=10
)

View File

@ -140,7 +140,7 @@ def pack_common_power_cmds(
q.add_pus_tc(disable_periodic_hk_command(True, make_sid(objb, SetId.CORE)))
def pack_common_gomspace_cmds(
def pack_common_gomspace_cmds( # noqa C901: Complexity is okay here.
prefix: str, object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
):
objb = object_id.as_bytes
@ -200,7 +200,8 @@ def pack_common_gomspace_cmds(
if op_code in GomspaceOpCode.SAVE_TABLE_DEFAULT:
source_table = int(
input(
"Source table [0: Board Config, 1: Module Config, 2: Calibration Parameter]: "
"Source table [0: Board Config, 1: Module Config, 2: Calibration"
" Parameter]: "
)
)
if source_table not in [0, 1, 2]:
@ -215,8 +216,8 @@ def pack_common_gomspace_cmds(
if op_code in GomspaceOpCode.LOAD_TABLE:
target_table = int(
input(
"Target table ID [0: Board Config, 1: Module Config, 2: Calibration Parameter, "
"4: HK TM]: "
"Target table ID [0: Board Config, 1: Module Config, 2: Calibration"
" Parameter, 4: HK TM]: "
)
)
if target_table not in [0, 1, 2, 4]:
@ -224,8 +225,8 @@ def pack_common_gomspace_cmds(
if target_table != 4:
source_table = int(
input(
"Source table (file or default) [0: Board Config, 1: Module Config, "
"2: Calibration Parameter, value + 4 for default table]: "
"Source table (file or default) [0: Board Config, 1: Module Config,"
" 2: Calibration Parameter, value + 4 for default table]: "
)
)
if source_table not in [0, 1, 2, 4, 5, 6]:

View File

@ -98,7 +98,9 @@ class P60DockHkTable:
wdt_gnd_left = TableEntry(bytearray([0x00, 0xA8]), TableEntry.uint32_size)
def pack_p60dock_cmds(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str):
def pack_p60dock_cmds( # noqa C901: Complexity okay here.
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
):
objb = object_id.as_bytes
pack_common_power_cmds("P60 Dock", object_id, q, op_code)
pack_common_gomspace_cmds("P60 Dock", object_id, q, op_code)

View File

@ -3,8 +3,16 @@
@author J. Meier
@date 17.12.2020
"""
import enum
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import PDU_1_HANDLER_ID
from eive_tmtc.gomspace.gomspace_common import (
pack_ping_command,
TableIds,
pack_get_param_command,
)
from eive_tmtc.gomspace.gomspace_pdu_definitions import PduHkTable
from eive_tmtc.tmtc.power.common_power import (
pack_common_gomspace_cmds,
req_hk_cmds,
@ -17,15 +25,15 @@ from eive_tmtc.tmtc.power.common_power import (
pack_common_power_cmds,
GomspaceOpCode,
GsInfo,
PowerInfo,
add_common_power_defs,
SetId,
)
from spacepackets.ecss import PusTelecommand
from eive_tmtc.gomspace.gomspace_common import *
from eive_tmtc.gomspace.gomspace_pdu_definitions import *
from tmtccmd.config import OpCodeEntry, TmtcDefinitionWrapper
from tmtccmd.config.tmtc import tmtc_definitions_provider
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.util import ObjectIdU32
class Pdu1InfoBase:
@ -102,7 +110,9 @@ def info_off_pdu1(base: str) -> str:
return "PDU1: " + base + " off"
def pdu1_switch_cmds(q: DefaultPusQueueHelper, op_code: str):
def pdu1_switch_cmds( # noqa C901: Complexity is okay here.
q: DefaultPusQueueHelper, op_code: str
): # noqa C901: Complexity okay here
if op_code in PowerOpCodes.TCS_ON:
tcs_on_cmd(q)
elif op_code in PowerOpCodes.TCS_OFF:
@ -181,6 +191,7 @@ PDU1_DICT = {
Pdu1ChIndex.SYRLINKS: Pdu1InfoBase.SYRLINKS,
Pdu1ChIndex.MGT: Pdu1InfoBase.MGT,
Pdu1ChIndex.SCEX: Pdu1InfoBase.SCEX,
Pdu1ChIndex.PLOC: Pdu1InfoBase.PLOC,
Pdu1ChIndex.ACS_A: Pdu1InfoBase.ACS_A,
Pdu1ChIndex.SUS_N: Pdu1InfoBase.SUS_N,
}

View File

@ -6,7 +6,18 @@
@author J. Meier
@date 17.12.2020
"""
import enum
from eive_tmtc.config.object_ids import PDU_2_HANDLER_ID
from eive_tmtc.gomspace.gomspace_common import (
pack_reboot_command,
pack_ping_command,
pack_gnd_wdt_reset_command,
pack_get_param_command,
TableIds,
pack_request_full_hk_table_command,
)
from eive_tmtc.gomspace.gomspace_pdu_definitions import PduHkTable, PduConfigTable
from eive_tmtc.tmtc.power.common_power import (
pack_common_gomspace_cmds,
req_hk_cmds,
@ -20,10 +31,11 @@ from eive_tmtc.tmtc.power.common_power import (
SetId,
add_common_power_defs,
)
from eive_tmtc.gomspace.gomspace_common import *
from eive_tmtc.gomspace.gomspace_pdu_definitions import *
from spacepackets.ecss import PusTelecommand
from tmtccmd.config import OpCodeEntry, TmtcDefinitionWrapper
from tmtccmd.config.tmtc import tmtc_definitions_provider
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.util import ObjectIdU32
class Pdu2InfoBase:
@ -159,7 +171,7 @@ def add_pdu2_cmds(defs: TmtcDefinitionWrapper):
)
def pdu2_switch_cmds(q: DefaultPusQueueHelper, op_code: str):
def pdu2_switch_cmds(q: DefaultPusQueueHelper, op_code: str): # noqa C901
if op_code in PowerOpCodes.PL_PCDU_VBAT_NOM_ON:
pl_pcdu_bat_nom_on_cmd(q)
elif op_code in PowerOpCodes.PL_PCDU_VBAT_NOM_OFF:

View File

@ -22,13 +22,13 @@ from tmtccmd.tc.pus_11_tc_sched import (
)
from tmtccmd.tc.pus_200_fsfw_mode import pack_mode_data, Mode, Subservice
from tmtccmd.tc.pus_20_fsfw_param import (
pack_scalar_double_param_app_data,
create_scalar_double_parameter,
create_load_param_cmd,
pack_boolean_parameter_app_data,
create_scalar_boolean_parameter,
)
from spacepackets.ecss.tc import PusTelecommand
from eive_tmtc.config.object_ids import PL_PCDU_ID
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
_LOGGER = logging.getLogger(__name__)
@ -85,6 +85,40 @@ class NormalSubmodesMask(enum.IntEnum):
HPA_ON = 5
class SubmodeForNormalMode(enum.IntEnum):
NONE = 0
SSR_ON = 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
DRO_ON = 1 << NormalSubmodesMask.DRO_ON | (
1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
)
X8_ON = (
1 << NormalSubmodesMask.DRO_ON
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
| (1 << NormalSubmodesMask.X8_ON)
)
TX_ON = (
1 << NormalSubmodesMask.DRO_ON
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
| (1 << NormalSubmodesMask.X8_ON)
| (1 << NormalSubmodesMask.TX_ON)
)
MPA_ON = (
1 << NormalSubmodesMask.DRO_ON
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
| (1 << NormalSubmodesMask.X8_ON)
| (1 << NormalSubmodesMask.TX_ON)
| (1 << NormalSubmodesMask.MPA_ON)
)
HPA_ON = (
1 << NormalSubmodesMask.DRO_ON
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
| (1 << NormalSubmodesMask.X8_ON)
| (1 << NormalSubmodesMask.TX_ON)
| (1 << NormalSubmodesMask.MPA_ON)
| (1 << NormalSubmodesMask.HPA_ON)
)
class ParamIds(enum.IntEnum):
NEG_V_LOWER_BOUND = 0
NEG_V_UPPER_BOUND = 1
@ -161,7 +195,9 @@ def add_pl_pcdu_cmds(defs: TmtcDefinitionWrapper):
defs.add_service(CustomServiceList.PL_PCDU.value, "PL PCDU", oce)
def pack_pl_pcdu_commands(q: DefaultPusQueueHelper, op_code: str):
def pack_pl_pcdu_commands( # noqa C901: Complexity is okay here.
q: DefaultPusQueueHelper, op_code: str
): # noqa C901: Complexity is okay here.
if op_code in OpCode.SWITCH_ON:
pack_pl_pcdu_mode_cmd(q=q, info=Info.SWITCH_ON, mode=Mode.ON, submode=0)
if op_code in OpCode.SWITCH_OFF:
@ -248,7 +284,7 @@ def hpa_on_procedure(q: DefaultPusQueueHelper):
if delay_dro_to_x8 is None:
delay_dro_to_x8 = 900
q.add_log_cmd(
f"Starting procedure to switch on PL PCDU HPA with DRO to X8 "
"Starting procedure to switch on PL PCDU HPA with DRO to X8 "
f"delay of {delay_dro_to_x8} seconds"
)
pl_pcdu_on = PusTelecommand(
@ -381,41 +417,17 @@ def request_wait_time() -> Optional[float]:
def submode_mask_to_submode(on_tgt: NormalSubmodesMask) -> int:
if on_tgt == NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON:
return 1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
return SubmodeForNormalMode.SSR_ON
if on_tgt == NormalSubmodesMask.DRO_ON:
return 1 << NormalSubmodesMask.DRO_ON | (
1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
)
return SubmodeForNormalMode.DRO_ON
if on_tgt == NormalSubmodesMask.X8_ON:
return (
1 << NormalSubmodesMask.DRO_ON
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
| (1 << NormalSubmodesMask.X8_ON)
)
return SubmodeForNormalMode.X8_ON
if on_tgt == NormalSubmodesMask.TX_ON:
return (
1 << NormalSubmodesMask.DRO_ON
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
| (1 << NormalSubmodesMask.X8_ON)
| (1 << NormalSubmodesMask.TX_ON)
)
return SubmodeForNormalMode.TX_ON
if on_tgt == NormalSubmodesMask.MPA_ON:
return (
1 << NormalSubmodesMask.DRO_ON
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
| (1 << NormalSubmodesMask.X8_ON)
| (1 << NormalSubmodesMask.TX_ON)
| (1 << NormalSubmodesMask.MPA_ON)
)
return SubmodeForNormalMode.MPA_ON
if on_tgt == NormalSubmodesMask.HPA_ON:
return (
1 << NormalSubmodesMask.DRO_ON
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
| (1 << NormalSubmodesMask.X8_ON)
| (1 << NormalSubmodesMask.TX_ON)
| (1 << NormalSubmodesMask.MPA_ON)
| (1 << NormalSubmodesMask.HPA_ON)
)
return SubmodeForNormalMode.HPA_ON
def pack_wait_time_cmd(q: DefaultPusQueueHelper, param_id: int, print_str: str):
@ -423,21 +435,21 @@ def pack_wait_time_cmd(q: DefaultPusQueueHelper, param_id: int, print_str: str):
q.add_log_cmd(f"Updating {print_str} wait time to {wait_time}")
if wait_time is None:
return
param_data = pack_scalar_double_param_app_data(
param_data = create_scalar_double_parameter(
object_id=PL_PCDU_ID,
domain_id=0,
unique_id=param_id,
parameter=wait_time,
)
q.add_pus_tc(create_load_param_cmd(app_data=param_data))
q.add_pus_tc(create_load_param_cmd(param_data))
def pack_failure_injection_cmd(q: DefaultPusQueueHelper, param_id: int, print_str: str):
q.add_log_cmd(f"Inserting {print_str} error")
param_data = pack_boolean_parameter_app_data(
param_data = create_scalar_boolean_parameter(
object_id=PL_PCDU_ID, domain_id=0, unique_id=param_id, parameter=True
)
q.add_pus_tc(create_load_param_cmd(app_data=param_data))
q.add_pus_tc(create_load_param_cmd(param_data))
def pack_pl_pcdu_mode_cmd(
@ -468,9 +480,8 @@ ADC_CHANNELS_NAMED = [
]
def handle_plpcdu_hk(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
def handle_plpcdu_hk(pw: PrintWrapper, set_id: int, hk_data: bytes):
if set_id == SetId.ADC:
pw = PrintWrapper(printer)
current_idx = 0
pw.dlog("Received PL PCDU ADC HK data")
channels = []
@ -496,4 +507,6 @@ def handle_plpcdu_hk(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
pw.dlog(ch_print)
for i in range(12):
pw.dlog(f"{ADC_CHANNELS_NAMED[i].ljust(24)} | {processed_vals[i]}")
printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=3)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=3
)

View File

@ -35,7 +35,6 @@ from eive_tmtc.tmtc.power.acu import add_acu_cmds, acu_req_hk_cmds
from tmtccmd.tc.pus_3_fsfw_hk import (
create_request_one_diag_command,
make_sid,
create_request_one_hk_command,
)
from tmtccmd.config.tmtc import tmtc_definitions_provider
from tmtccmd.tc import DefaultPusQueueHelper
@ -71,6 +70,7 @@ class PcduSwitches(enum.IntEnum):
PDU2_CH8_PAYLOAD_CAMERA = 17
P60_DOCK_5V_STACK = 18
P60_DOCK_3V3_STACK = 19
def pack_power_commands(q: DefaultPusQueueHelper, op_code: str):

View File

@ -0,0 +1,302 @@
import datetime
import enum
import logging
import struct
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import PWR_CONTROLLER
from eive_tmtc.pus_tm.defs import PrintWrapper
from tmtccmd.config.tmtc import (
tmtc_definitions_provider,
TmtcDefinitionWrapper,
OpCodeEntry,
)
from tmtccmd.tc import service_provider
from tmtccmd.tc.queue import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_command
from tmtccmd.tc.decorator import ServiceProviderParams
from tmtccmd.tc.pus_3_fsfw_hk import (
generate_one_hk_command,
make_sid,
enable_periodic_hk_command_with_interval,
disable_periodic_hk_command,
)
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.tc.pus_20_fsfw_param import create_load_param_cmd
from tmtccmd.pus.s20_fsfw_param_defs import (
create_scalar_float_parameter,
create_scalar_double_parameter,
)
_LOGGER = logging.getLogger(__name__)
class SetId(enum.IntEnum):
CORE_HK_SET = 0
ENABLE_PL_SET = 1
# class ActionId(enum.IntEnum):
class ParamId(enum.IntEnum):
BATTERY_INTERNAL_RESISTANCE = 0
BATTERY_MAXIMUM_CAPACITY = 1
COULOMB_COUNTER_VOLTAGE_UPPER_THRESHOLD = 2
MAX_ALLOWED_TIME_DIFF = 3
PAYLOAD_OP_LIMIT_ON = 4
PAYLOAD_OP_LIMIT_LOW = 5
HIGHER_MODES_LIMIT = 6
class OpCodes:
OFF = ["mode_off"]
ON = ["mode_on"]
NML = ["mode_normal"]
SET_PARAMETER = ["set_parameter"]
REQUEST_CORE_HK = ["core_hk"]
ENABLE_CORE_HK = ["core_enable_hk"]
DISABLE_CORE_HK = ["core_disable_hk"]
REQUEST_ENABLE_PL_HK = ["enable_pl_hk"]
ENABLE_ENABLE_PL_HK = ["enable_pl_enable_hk"]
DISABLE_ENABLE_PL_HK = ["enable_pl_disable_hk"]
class Info:
OFF = "PWR Ctrl Mode to OFF"
ON = "PWR Ctrl Mode to ON"
NML = "PWR Ctrl Mode to NORMAL"
SET_PARAMETER = "Set Parameter"
REQUEST_CORE_HK = "Request Core HK once"
ENABLE_CORE_HK = "Enable Core HK Data Generation"
DISABLE_CORE_HK = "Disable Core HK Data Generation"
REQUEST_ENABLE_PL_HK = "Request Enable PL HK once"
ENABLE_ENABLE_PL_HK = "Enable Enable PL HK Data Generation"
DISABLE_ENABLE_PL_HK = "Disable Enable PL HK Data Generation"
@tmtc_definitions_provider
def acs_cmd_defs(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCodes.OFF, info=Info.OFF)
oce.add(keys=OpCodes.ON, info=Info.ON)
oce.add(keys=OpCodes.NML, info=Info.NML)
oce.add(keys=OpCodes.SET_PARAMETER, info=Info.SET_PARAMETER)
oce.add(keys=OpCodes.REQUEST_CORE_HK, info=Info.REQUEST_CORE_HK)
oce.add(keys=OpCodes.ENABLE_CORE_HK, info=Info.ENABLE_CORE_HK)
oce.add(keys=OpCodes.DISABLE_CORE_HK, info=Info.DISABLE_CORE_HK)
oce.add(keys=OpCodes.REQUEST_ENABLE_PL_HK, info=Info.REQUEST_ENABLE_PL_HK)
oce.add(keys=OpCodes.ENABLE_ENABLE_PL_HK, info=Info.ENABLE_ENABLE_PL_HK)
oce.add(keys=OpCodes.DISABLE_ENABLE_PL_HK, info=Info.DISABLE_ENABLE_PL_HK)
defs.add_service(
name=CustomServiceList.PWR_CTRL.value, info="PWR Controller", op_code_entry=oce
)
@service_provider(CustomServiceList.PWR_CTRL.value)
def pack_acs_ctrl_command(p: ServiceProviderParams):
op_code = p.op_code
q = p.queue_helper
if op_code in OpCodes.OFF:
q.add_log_cmd(f"{Info.OFF}")
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.OFF, 0))
elif op_code in OpCodes.ON:
q.add_log_cmd(f"{Info.ON}")
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.ON, 0))
elif op_code in OpCodes.NML:
q.add_log_cmd(f"{Info.NML}")
q.add_pus_tc(pack_mode_command(PWR_CONTROLLER, Mode.NORMAL, 0))
elif op_code in OpCodes.SET_PARAMETER:
q.add_log_cmd(f"{Info.SET_PARAMETER}")
set_pwr_ctrl_param(q)
elif op_code in OpCodes.REQUEST_CORE_HK:
q.add_log_cmd(Info.REQUEST_CORE_HK)
q.add_pus_tc(
generate_one_hk_command(make_sid(PWR_CONTROLLER, SetId.CORE_HK_SET))
)
elif op_code in OpCodes.ENABLE_CORE_HK:
interval = float(input("Please specify interval in floating point seconds: "))
q.add_log_cmd(Info.ENABLE_CORE_HK)
cmd_tuple = enable_periodic_hk_command_with_interval(
False, make_sid(PWR_CONTROLLER, SetId.CORE_HK_SET), interval
)
q.add_pus_tc(cmd_tuple[0])
q.add_pus_tc(cmd_tuple[1])
elif op_code in OpCodes.DISABLE_CORE_HK:
q.add_log_cmd(Info.DISABLE_CORE_HK)
q.add_pus_tc(
disable_periodic_hk_command(
False, make_sid(PWR_CONTROLLER, SetId.CORE_HK_SET)
)
)
elif op_code in OpCodes.REQUEST_ENABLE_PL_HK:
q.add_log_cmd(Info.REQUEST_ENABLE_PL_HK)
q.add_pus_tc(
generate_one_hk_command(make_sid(PWR_CONTROLLER, SetId.ENABLE_PL_SET))
)
elif op_code in OpCodes.ENABLE_ENABLE_PL_HK:
interval = float(input("Please specify interval in floating point seconds: "))
q.add_log_cmd(Info.ENABLE_ENABLE_PL_HK)
cmd_tuple = enable_periodic_hk_command_with_interval(
False, make_sid(PWR_CONTROLLER, SetId.ENABLE_PL_SET), interval
)
q.add_pus_tc(cmd_tuple[0])
q.add_pus_tc(cmd_tuple[1])
elif op_code in OpCodes.DISABLE_ENABLE_PL_HK:
q.add_log_cmd(Info.DISABLE_ENABLE_PL_HK)
q.add_pus_tc(
disable_periodic_hk_command(
False, make_sid(PWR_CONTROLLER, SetId.ENABLE_PL_SET)
)
)
def set_pwr_ctrl_param(q: DefaultPusQueueHelper):
for val in ParamId:
print("{:<2}: {:<20}".format(val, val.name))
param = int(input("Specify parameter to set \n" ""))
match param:
case ParamId.BATTERY_INTERNAL_RESISTANCE:
value = float(input("Specify parameter value to set [Ohm]: "))
q.add_pus_tc(
create_load_param_cmd(
create_scalar_float_parameter(
object_id=PWR_CONTROLLER,
domain_id=0,
unique_id=ParamId.BATTERY_INTERNAL_RESISTANCE,
parameter=value,
)
)
)
case ParamId.BATTERY_MAXIMUM_CAPACITY:
value = float(input("Specify parameter value to set [Ah]: "))
q.add_pus_tc(
create_load_param_cmd(
create_scalar_float_parameter(
object_id=PWR_CONTROLLER,
domain_id=0,
unique_id=ParamId.BATTERY_MAXIMUM_CAPACITY,
parameter=value,
)
)
)
case ParamId.COULOMB_COUNTER_VOLTAGE_UPPER_THRESHOLD:
value = float(input("Specify parameter value to set [V]: "))
q.add_pus_tc(
create_load_param_cmd(
create_scalar_float_parameter(
object_id=PWR_CONTROLLER,
domain_id=0,
unique_id=ParamId.COULOMB_COUNTER_VOLTAGE_UPPER_THRESHOLD,
parameter=value,
)
)
)
case ParamId.MAX_ALLOWED_TIME_DIFF:
value = float(input("Specify parameter value to set [s]: "))
q.add_pus_tc(
create_load_param_cmd(
create_scalar_double_parameter(
object_id=PWR_CONTROLLER,
domain_id=0,
unique_id=ParamId.MAX_ALLOWED_TIME_DIFF,
parameter=value,
)
)
)
case ParamId.PAYLOAD_OP_LIMIT_ON:
value = float(input("Specify parameter value to set [1]: "))
q.add_pus_tc(
create_load_param_cmd(
create_scalar_float_parameter(
object_id=PWR_CONTROLLER,
domain_id=0,
unique_id=ParamId.PAYLOAD_OP_LIMIT_ON,
parameter=value,
)
)
)
case ParamId.PAYLOAD_OP_LIMIT_LOW:
value = float(input("Specify parameter value to set [1]: "))
q.add_pus_tc(
create_load_param_cmd(
create_scalar_float_parameter(
object_id=PWR_CONTROLLER,
domain_id=0,
unique_id=ParamId.PAYLOAD_OP_LIMIT_LOW,
parameter=value,
)
)
)
case ParamId.HIGHER_MODES_LIMIT:
value = float(input("Specify parameter value to set [1]: "))
q.add_pus_tc(
create_load_param_cmd(
create_scalar_float_parameter(
object_id=PWR_CONTROLLER,
domain_id=0,
unique_id=ParamId.HIGHER_MODES_LIMIT,
parameter=value,
)
)
)
def handle_pwr_ctrl_hk_data(
pw: PrintWrapper,
set_id: int,
hk_data: bytes,
packet_time: datetime.datetime,
):
pw.ilog(_LOGGER, f"Received PWR CTRL HK with packet time {packet_time}")
match set_id:
case SetId.CORE_HK_SET:
handle_core_hk_data(pw, hk_data)
case SetId.ENABLE_PL_SET:
handle_enable_pl_data(pw, hk_data)
def handle_core_hk_data(pw: PrintWrapper, hk_data: bytes):
pw.dlog("Received Core HK Set")
fmt_int16 = "!h"
fmt_float = "!f"
inc_len_int16 = struct.calcsize(fmt_int16)
inc_len_float = struct.calcsize(fmt_float)
if len(hk_data) < inc_len_int16 + 2 * inc_len_float:
pw.dlog("Received HK set too small")
return
current_idx = 0
total_battery_current = struct.unpack(
fmt_int16, hk_data[current_idx : current_idx + inc_len_int16]
)[0]
current_idx += inc_len_int16
open_circuit_voltage_charge = struct.unpack(
fmt_float, hk_data[current_idx : current_idx + inc_len_float]
)[0]
current_idx += inc_len_float
coulomb_counter_charge = struct.unpack(
fmt_float, hk_data[current_idx : current_idx + inc_len_float]
)[0]
current_idx += inc_len_float
pw.dlog(f"Total Battery Current: {total_battery_current} [mA]")
pw.dlog(f"Open Circuit Voltage Charge: {open_circuit_voltage_charge*100:8.3f} [%]")
pw.dlog(f"Coulomb Counter Charge: {coulomb_counter_charge*100:8.3f} [%]")
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=3)
def handle_enable_pl_data(pw: PrintWrapper, hk_data: bytes):
pw.dlog("Received Enable PL HK Set")
fmt_uint16 = "!B"
inc_len_uint16 = struct.calcsize(fmt_uint16)
if len(hk_data) < inc_len_uint16:
pw.dlog("Received HK set too small")
return
current_idx = 0
pl_use_allowed = struct.unpack(
fmt_uint16, hk_data[current_idx : current_idx + inc_len_uint16]
)[0]
current_idx += inc_len_uint16
pw.dlog(f"PL Use Allowed: {pl_use_allowed}")
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], num_vars=1)

View File

@ -0,0 +1,68 @@
import enum
from typing import Tuple, Dict
from spacepackets.ecss import PusTelecommand
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
from eive_tmtc.config.object_ids import EPS_SUBSYSTEM_ID
from eive_tmtc.config.definitions import CustomServiceList
from tmtccmd.config.tmtc import (
tmtc_definitions_provider,
TmtcDefinitionWrapper,
OpCodeEntry,
)
from tmtccmd.tc.pus_200_fsfw_mode import Subservice as ModeSubservices, Mode
from tmtccmd.tc import service_provider
from tmtccmd.tc.decorator import ServiceProviderParams
class OpCode(str, enum.Enum):
OFF = "off"
NML = "normal"
REPORT_ALL_MODES = "all_modes"
class Info(str, enum.Enum):
OFF = "Off Mode Command"
NML = "Normal Mode Command"
REPORT_ALL_MODES = "Report All Modes Recursively"
HANDLER_LIST: Dict[str, Tuple[int, int, str]] = {
OpCode.OFF: (Mode.OFF, 0, Info.OFF),
OpCode.NML: (Mode.NORMAL, 0, Info.NML),
}
@service_provider(CustomServiceList.EPS_SS.value)
def build_eps_subsystem_cmd(p: ServiceProviderParams):
op_code = p.op_code
q = p.queue_helper
info_prefix = "EPS Subsystem"
if op_code in OpCode.REPORT_ALL_MODES:
q.add_log_cmd(f"{info_prefix}: {Info.REPORT_ALL_MODES}")
q.add_pus_tc(
PusTelecommand(
service=200,
subservice=ModeSubservices.TC_MODE_ANNOUNCE_RECURSIVE,
app_data=EPS_SUBSYSTEM_ID,
)
)
mode_info_tup = HANDLER_LIST.get(op_code)
if mode_info_tup is None:
return
pack_mode_cmd_with_info(
object_id=EPS_SUBSYSTEM_ID,
info=f"{info_prefix}: {mode_info_tup[2]}",
mode=mode_info_tup[0],
submode=mode_info_tup[1],
q=q,
)
@tmtc_definitions_provider
def add_eps_subsystem_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
for op_code, (_, _, info) in HANDLER_LIST.items():
oce.add(op_code, info)
oce.add(OpCode.REPORT_ALL_MODES, Info.REPORT_ALL_MODES)
defs.add_service(CustomServiceList.EPS_SS, "EPS Subsystem", oce)

View File

@ -9,7 +9,7 @@ from eive_tmtc.tmtc.power.common_power import (
)
from eive_tmtc.tmtc.power.power import PcduSetIds
from tmtccmd.util import ObjectIdBase
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from eive_tmtc.pus_tm.defs import PrintWrapper
from eive_tmtc.gomspace.gomspace_common import GomspaceDeviceActionId
from eive_tmtc.config.object_ids import (
@ -75,8 +75,8 @@ class WdtInfo:
self.pw.dlog(wdt_info)
for idx in range(len(self.wdt_reboots_list)):
self.pw.dlog(
f"{WDT_LIST[idx].ljust(5)} | "
f"{self.wdt_reboots_list[idx]:010} | {self.time_pings_left_list[idx]:010}",
f"{WDT_LIST[idx].ljust(5)} | {self.wdt_reboots_list[idx]:010} |"
f" {self.time_pings_left_list[idx]:010}",
)
def parse(self, wdt_data: bytes, current_idx: int) -> int:
@ -119,7 +119,7 @@ class DevicesInfoParser:
return current_idx
def print(self, pw: PrintWrapper):
pw.dlog(f"Device Type | Device State (0:None | 1:OK | 3:ERROR | 4:NOT FOUND)")
pw.dlog("Device Type | Device State (0:None | 1:OK | 3:ERROR | 4:NOT FOUND)")
for i in range(len(self.dev_types)):
pw.dlog(
f"{self.map_idx_to_type(self.dev_types[i])} | {self.dev_statuses[i]}"
@ -146,18 +146,13 @@ class DevicesInfoParser:
return "Unknown Type"
def handle_pdu_data(
printer: FsfwTmTcPrinter, pdu_idx: int, set_id: int, hk_data: bytes
):
pw = PrintWrapper(printer=printer)
def handle_pdu_data(pw: PrintWrapper, pdu_idx: int, set_id: int, hk_data: bytes):
current_idx = 0
priv_idx = pdu_idx - 1
if set_id == SetId.AUX or set_id == SetId.AUX:
fmt_str = "!hhBBBIIH"
fmt_str = "!BBBIIH"
inc_len = struct.calcsize(fmt_str)
(
vcc,
vbat,
conv_enb_0,
conv_enb_1,
conv_enb_2,
@ -165,7 +160,6 @@ def handle_pdu_data(
uptime,
reset_cause,
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
pw.dlog(f"VCC {vcc} mV | VBAT {vbat} mV")
pw.dlog(f"Converter Enables [{conv_enb_0},{conv_enb_1},{conv_enb_2}]")
pw.dlog(
f"Boot Cause {boot_cause} | Uptime {uptime} | Reset Cause {reset_cause}",
@ -187,7 +181,7 @@ def handle_pdu_data(
wdt = WdtInfo(pw=pw)
current_idx = wdt.parse(wdt_data=hk_data[current_idx:], current_idx=current_idx)
wdt.print()
pw.dlog(f"PDU Device Types: 0:FRAM|1:ADC|2:ADC|3:TempSens|4,5,6,7:Reserved")
pw.dlog("PDU Device Types: 0:FRAM|1:ADC|2:ADC|3:TempSens|4,5,6,7:Reserved")
dev_parser.print(pw=pw)
if set_id == SetId.CORE or set_id == SetId.CORE:
pw.dlog(f"Received PDU HK from PDU {pdu_idx}")
@ -216,20 +210,19 @@ def handle_pdu_data(
f"{voltage_list[idx]:05} | {current_list[idx]:04}"
)
pw.dlog(content_line)
fmt_str = "!IBf"
fmt_str = "!IBfhh"
inc_len = struct.calcsize(fmt_str)
(boot_count, batt_mode, temperature) = struct.unpack(
(boot_count, batt_mode, temperature, vcc, vbat) = struct.unpack(
fmt_str, hk_data[current_idx : current_idx + inc_len]
)
info = (
f"Boot Count {boot_count} | Battery Mode {batt_mode} | "
f"Temperature {temperature}"
f"Temperature {temperature} | VCC {vcc} | VBAT {vbat}"
)
pw.dlog(info)
def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
pw = PrintWrapper(printer=printer)
def handle_p60_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
if set_id == SetId.CORE:
pw.dlog("Received P60 Core HK. Voltages in mV, currents in mA")
current_idx = 0
@ -276,7 +269,9 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
temps = f"In C: Temp 0 {temp_0} | Temp 1 {temp_1} | "
pw.dlog(temps)
pw.dlog(batt_info)
printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=9)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=9
)
if set_id == SetId.AUX:
pw.dlog("Received P60 AUX HK. Voltages in mV, currents in mA")
current_idx = 0
@ -332,8 +327,9 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
)
pw.dlog(misc_info)
batt_info = (
f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} | "
f"Charge Current {batt_charge_current} | Discharge Current {batt_discharge_current}"
f"Batt Temp 0 {batt_temp_0 / 10.0} | Batt Temp 1 {batt_temp_1 / 10.0} |"
f" Charge Current {batt_charge_current} | Discharge Current"
f" {batt_discharge_current}"
)
pw.dlog(batt_info)
pw.dlog(
@ -341,7 +337,7 @@ def handle_p60_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
"6:TempSens(BatPack)|7:TempSens(BatPack)"
)
dev_parser.print(pw=pw)
printer.print_validity_buffer(
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=27
)
@ -354,8 +350,7 @@ def gen_six_entry_u16_list(hk_data: bytes, current_idx: int) -> Tuple[int, List[
return current_idx, u16_list
def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
pw = PrintWrapper(printer=printer)
def handle_acu_hk_data(pw: PrintWrapper, set_id: int, hk_data: bytes):
if set_id == SetId.CORE:
mppt_mode = hk_data[0]
current_idx = 1
@ -383,9 +378,7 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
current_idx += inc_len
pw.dlog("Received ACU Core HK. Voltages in mV, currents in mA")
pw.dlog(f"VCC {vcc} mV | VBAT {vbat} mV | MPPT Mode {mppt_mode}")
header_str = (
f"Channel | Input U [mV] | Input I [mA] | U Boost [mV] | Power [mW]"
)
header_str = "Channel | Input U [mV] | Input I [mA] | U Boost [mV] | Power [mW]"
pw.dlog(header_str)
for i in range(6):
pw.dlog(
@ -397,7 +390,7 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
f"Boot Count {bootcnt} | Uptime {uptime} sec | "
f"MPPT Time {mppt_time} msec | MPPT Period {mppt_period} msec"
)
printer.print_validity_buffer(
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=12
)
if set_id == SetId.AUX:
@ -422,19 +415,22 @@ def handle_acu_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
pw.dlog("Received ACU Aux HK. Voltages in mV, currents in mA")
pw.dlog(
f"DAC Enable States: DAC 0 {dac_enb_str[0]} | DAC 1 {dac_enb_str[1]} | DAC 2 {dac_enb_str[2]}"
f"DAC Enable States: DAC 0 {dac_enb_str[0]} | DAC 1 {dac_enb_str[1]} | "
f"DAC 2 {dac_enb_str[2]}"
)
pw.dlog(f"Boot Cause {boot_cause} | Reset Cause {reset_cause}")
pw.dlog(
f"Ground WDT: Reboot Count {wdt_cnt_gnd} | Time Left {wdt_gnd_time_left} sec"
f"Ground WDT: Reboot Count {wdt_cnt_gnd} | Time Left"
f" {wdt_gnd_time_left} sec"
)
pw.dlog(
f"ACU Dev Types: 0:FRAM|1:ADC|2:ADC|3:DAC|4:DAC|"
f"5:DAC|6:TempSens|7:Reserved"
"ACU Dev Types: 0:FRAM|1:ADC|2:ADC|3:DAC|4:DAC|5:DAC|6:TempSens|7:Reserved"
)
dev_parser.print(pw=pw)
printer.print_validity_buffer(validity_buffer=hk_data[current_idx:], num_vars=8)
FsfwTmTcPrinter.get_validity_buffer(
validity_buffer=hk_data[current_idx:], num_vars=8
)
def handle_get_param_data_reply(
@ -479,7 +475,8 @@ def pdu_config_table_handler(
pw.dlog("[tcs, syrlinks, str, mgt, sus-n, scex, ploc, acs-a, unused]")
elif obj_id.as_bytes == PDU_2_HANDLER_ID:
pw.dlog(
"[obc, pl-pcdu-bat-nom, rw, heaters, sus-r, sa-depl, pl-pcdu-bat-red, acs-b, pl-cam]"
"[obc, pl-pcdu-bat-nom, rw, heaters, sus-r, sa-depl, pl-pcdu-bat-red,"
" acs-b, pl-cam]"
)
out_on_cnt = unpack_array_in_data(custom_data, 0x52, 2, 9, "H")
out_off_cnt = unpack_array_in_data(custom_data, 0x64, 2, 9, "H")
@ -557,8 +554,7 @@ def parse_name_list(data: bytes, name_len: int):
return ch_list
def handle_pcdu_hk(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
pw = PrintWrapper(printer)
def handle_pcdu_hk(pw: PrintWrapper, set_id: int, hk_data: bytes):
pw.dlog("Received PCDU HK")
if set_id == PcduSetIds.SWITCHER_SET:
current_idx = 0
@ -566,7 +562,9 @@ def handle_pcdu_hk(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
current_idx += len(PDU1_CHANNELS_NAMES)
pdu2_vals = [hk_data[i + current_idx] for i in range(len(PDU2_CHANNELS_NAMES))]
current_idx += len(PDU2_CHANNELS_NAMES)
p60_stack_val = hk_data[current_idx]
p60_stack_5v_val = hk_data[current_idx]
current_idx += 1
p60_stack_3v3_val = hk_data[current_idx]
current_idx += 1
pw.dlog("PDU1 Switcher States")
for name, val in zip(PDU1_CHANNELS_NAMES, pdu1_vals):
@ -574,5 +572,6 @@ def handle_pcdu_hk(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
pw.dlog("PDU2 Switcher States")
for name, val in zip(PDU2_CHANNELS_NAMES, pdu2_vals):
pw.dlog(f"{name.ljust(25)}: {val}")
pw.dlog(f"{'P60 Dock 5V Stack'.ljust(25)}: {p60_stack_val}")
pw.printer.print_validity_buffer(hk_data[current_idx:], 3)
pw.dlog(f"{'P60 Dock 5V Stack'.ljust(25)}: {p60_stack_5v_val}")
pw.dlog(f"{'P60 Dock 3V3 Stack'.ljust(25)}: {p60_stack_3v3_val}")
FsfwTmTcPrinter.get_validity_buffer(hk_data[current_idx:], 4)

View File

@ -1,7 +1,8 @@
# -*- coding: utf-8 -*-
"""
@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
@date 15.02.2021
"""

View File

@ -1,3 +1,5 @@
import enum
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.tmtc.acs.subsystem import AcsMode
from tmtccmd.config.tmtc import (
@ -9,22 +11,48 @@ from tmtccmd.tc import service_provider
from eive_tmtc.config.object_ids import EIVE_SYSTEM_ID
from tmtccmd.tc.pus_200_fsfw_mode import (
create_mode_command,
Mode,
create_announce_mode_recursive_command,
)
from tmtccmd.tc.pus_8_fsfw_funccmd import create_action_cmd
from tmtccmd.tc.decorator import ServiceProviderParams
class SystemMode:
BOOT = 5
SAFE = AcsMode.SAFE
IDLE = AcsMode.IDLE
PTG_NADIR = AcsMode.PTG_NADIR
PTG_TARGET = AcsMode.PTG_TARGET
PTG_TARGET_GS = AcsMode.PTG_TARGET_GS
PTG_INERTIAL = AcsMode.PTG_INERTIAL
class ActionId(enum.IntEnum):
EXECUTE_I2C_REBOOT = 10
class OpCode:
BOOT_MODE = "boot"
SAFE_MODE = "safe"
IDLE_MODE = "idle"
NADIR_MODE = "nadir"
TARGET_MODE = "ptg_target"
TARGET_GS_MODE = "ptg_target_gs"
INERTIAL_MODE = "ptg_inertial"
ANNOUNCE_MODES = "announce_modes"
REBOOT_I2C = "reboot_i2c"
class Info:
BOOT_MODE = "Command System into Boot Mode"
SAFE_MODE = "Command System into Safe Mode"
IDLE_MODE = "Command System into Idle Pointing Mode"
NADIR_MODE = "Command System into Nadir Pointing Mode"
TARGET_MODE = "Command System into Target Pointing Mode"
TARGET_GS_MODE = "Command System into Target Groundstation Pointing Mode"
INERTIAL_MODE = "Command System into Inertial Pointing Mode"
ANNOUNCE_MODES = "Announce mode recursively"
REBOOT_I2C = "Reboot I2C bus"
@service_provider(CustomServiceList.SYSTEM.value)
@ -34,21 +62,45 @@ def build_system_cmds(p: ServiceProviderParams):
prefix = "EIVE System"
if o == OpCode.SAFE_MODE:
q.add_log_cmd(f"{prefix}: {Info.SAFE_MODE}")
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, AcsMode.SAFE, 0))
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.SAFE, 0))
elif o == OpCode.IDLE_MODE:
q.add_log_cmd(f"{prefix}: {Info.IDLE_MODE}")
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, AcsMode.IDLE, 0))
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.IDLE, 0))
elif o == OpCode.NADIR_MODE:
q.add_log_cmd(f"{prefix}: {Info.NADIR_MODE}")
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_NADIR, 0))
elif o == OpCode.TARGET_MODE:
q.add_log_cmd(f"{prefix}: {Info.TARGET_MODE}")
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_TARGET, 0))
elif o == OpCode.TARGET_GS_MODE:
q.add_log_cmd(f"{prefix}: {Info.TARGET_GS_MODE}")
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_TARGET_GS, 0))
elif o == OpCode.INERTIAL_MODE:
q.add_log_cmd(f"{prefix}: {Info.INERTIAL_MODE}")
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.PTG_INERTIAL, 0))
elif o == OpCode.ANNOUNCE_MODES:
q.add_log_cmd(f"{prefix}: {Info.ANNOUNCE_MODES}")
q.add_pus_tc(create_announce_mode_recursive_command(EIVE_SYSTEM_ID))
elif o == OpCode.BOOT_MODE:
q.add_log_cmd(f"{prefix}: {Info.BOOT_MODE}")
q.add_pus_tc(create_mode_command(EIVE_SYSTEM_ID, SystemMode.BOOT, 0))
elif o == OpCode.REBOOT_I2C:
q.add_log_cmd(f"{prefix}: {Info.REBOOT_I2C}")
q.add_pus_tc(create_action_cmd(EIVE_SYSTEM_ID, ActionId.EXECUTE_I2C_REBOOT))
@tmtc_definitions_provider
def add_system_cmd_defs(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCode.BOOT_MODE, info=Info.BOOT_MODE)
oce.add(keys=OpCode.SAFE_MODE, info=Info.SAFE_MODE)
oce.add(keys=OpCode.IDLE_MODE, info=Info.IDLE_MODE)
oce.add(keys=OpCode.NADIR_MODE, info=Info.NADIR_MODE)
oce.add(keys=OpCode.TARGET_MODE, info=Info.TARGET_MODE)
oce.add(keys=OpCode.TARGET_GS_MODE, info=Info.TARGET_GS_MODE)
oce.add(keys=OpCode.INERTIAL_MODE, info=Info.INERTIAL_MODE)
oce.add(keys=OpCode.ANNOUNCE_MODES, info=Info.ANNOUNCE_MODES)
oce.add(keys=OpCode.REBOOT_I2C, info=Info.REBOOT_I2C)
defs.add_service(
name=CustomServiceList.SYSTEM.value,
info="EIVE system commands",

View File

@ -1 +1,2 @@
from .tm import * # noqa
from .tmp1075 import add_tmp_sens_cmds

View File

@ -0,0 +1,92 @@
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import TCS_CONTROLLER
from eive_tmtc.tmtc.tcs import CtrlSetId
from eive_tmtc.tmtc.tcs.brd_assy import pack_tcs_ass_cmds
from tmtccmd.config.tmtc import (
tmtc_definitions_provider,
TmtcDefinitionWrapper,
OpCodeEntry,
)
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_3_fsfw_hk import (
make_sid,
generate_one_hk_command,
create_request_one_diag_command,
create_request_one_hk_command,
create_enable_periodic_hk_command_with_interval_with_diag,
)
class OpCode:
REQUEST_PRIMARY_TEMP_SET = "temp"
ENABLE_TEMP_SET = "enable_temp_set"
REQUEST_DEVICE_TEMP_SET = "temp_devs"
REQUEST_DEVICE_SUS_SET = "temp_sus"
REQUEST_HEATER_INFO = "heater_info"
REQUEST_TCS_CTRL_INFO = "tcs_ctrl_info"
class Info:
ENABLE_TEMP_SET = "Enable Primary Temperature Set"
REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
REQUEST_DEVICE_SUS_SET = "Request HK set of the SUS temperatures"
REQUEST_HEATER_INFO = "Request heater information"
REQUEST_TCS_CTRL_INFO = "Request TCS controller information"
def pack_tcs_ctrl_commands(q: DefaultPusQueueHelper, op_code: str):
if op_code == OpCode.REQUEST_PRIMARY_TEMP_SET:
sensor_set_sid = make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS)
q.add_log_cmd(Info.REQUEST_PRIMARY_TEMP_SET)
q.add_pus_tc(generate_one_hk_command(sensor_set_sid))
if op_code == OpCode.REQUEST_DEVICE_TEMP_SET:
q.add_log_cmd(Info.REQUEST_DEVICE_TEMP_SET)
q.add_pus_tc(
generate_one_hk_command(make_sid(TCS_CONTROLLER, CtrlSetId.DEVICE_SENSORS))
)
if op_code == OpCode.REQUEST_DEVICE_SUS_SET:
q.add_log_cmd(Info.REQUEST_DEVICE_SUS_SET)
q.add_pus_tc(
generate_one_hk_command(
make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS)
)
)
if op_code == OpCode.REQUEST_HEATER_INFO:
q.add_log_cmd(Info.REQUEST_HEATER_INFO)
q.add_pus_tc(
create_request_one_diag_command(
make_sid(TCS_CONTROLLER, CtrlSetId.HEATER_INFO)
)
)
if op_code == OpCode.REQUEST_TCS_CTRL_INFO:
q.add_log_cmd(Info.REQUEST_TCS_CTRL_INFO)
q.add_pus_tc(
create_request_one_hk_command(
make_sid(TCS_CONTROLLER, CtrlSetId.TCS_CTRL_INFO)
)
)
if op_code == OpCode.ENABLE_TEMP_SET:
interval_seconds = float(input("Please specify interval in seconds: "))
cmds = create_enable_periodic_hk_command_with_interval_with_diag(
False, make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS), interval_seconds
)
for cmd in cmds:
q.add_pus_tc(cmd)
pack_tcs_ass_cmds(q, op_code)
@tmtc_definitions_provider
def add_tcs_ctrl_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCode.ENABLE_TEMP_SET, info=Info.ENABLE_TEMP_SET)
oce.add(keys=OpCode.REQUEST_PRIMARY_TEMP_SET, info=Info.REQUEST_PRIMARY_TEMP_SET)
oce.add(keys=OpCode.REQUEST_DEVICE_TEMP_SET, info=Info.REQUEST_DEVICE_TEMP_SET)
oce.add(keys=OpCode.REQUEST_DEVICE_SUS_SET, info=Info.REQUEST_DEVICE_SUS_SET)
oce.add(keys=OpCode.REQUEST_HEATER_INFO, info=Info.REQUEST_HEATER_INFO)
oce.add(keys=OpCode.REQUEST_TCS_CTRL_INFO, info=Info.REQUEST_TCS_CTRL_INFO)
defs.add_service(
name=CustomServiceList.TCS_CTRL,
info="TCS controller",
op_code_entry=oce,
)

View File

@ -6,3 +6,22 @@ class CtrlSetId(enum.IntEnum):
DEVICE_SENSORS = 1
SUS_TEMP_SENSORS = 2
HEATER_INFO = 4
TCS_CTRL_INFO = 5
class TcsSubmode(enum.IntEnum):
DEFAULT = 0
NO_HEATER_CTRL = 1
class Heater(enum.IntEnum):
HEATER_0_PLOC_PROC_BRD = 0
HEATER_1_PCDU_BRD = 1
HEATER_2_ACS_BRD = 2
HEATER_3_OBC_BRD = 3
HEATER_4_CAMERA = 4
HEATER_5_STR = 5
HEATER_6_DRO = 6
HEATER_7_SYRLINKS = 7
NUMBER_OF_SWITCHES = 8
NONE = 0xFF

View File

@ -7,6 +7,7 @@ import enum
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import get_object_ids
from eive_tmtc.tmtc.tcs.defs import Heater
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
from tmtccmd.config.tmtc import tmtc_definitions_provider
from tmtccmd.tc import DefaultPusQueueHelper
@ -20,18 +21,6 @@ from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
from spacepackets.ecss.tc import PusTelecommand
class Heater(enum.IntEnum):
HEATER_0_PLOC_PROC_BRD = 0
HEATER_1_PCDU_BRD = 1
HEATER_2_ACS_BRD = 2
HEATER_3_OBC_BRD = 3
HEATER_4_CAMERA = 4
HEATER_5_STR = 5
HEATER_6_DRO = 6
HEATER_7_SYRLINKS = 7
NUMBER_OF_SWITCHES = 8
HEATER_LOCATION = [
"PLOC Processing Board",
"PCDU PDU",

View File

@ -13,7 +13,7 @@ from tmtccmd.util import ObjectIdU32
from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_data, Subservice
import eive_tmtc.config.object_ids as oids
from eive_tmtc.config.object_ids import get_object_ids
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
RTD_IDS = [
oids.RTD_0_PLOC_HSPD,
@ -147,8 +147,7 @@ def pack_rtd_commands(
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
def handle_rtd_hk(object_id: bytes, hk_data: bytes, printer: FsfwTmTcPrinter):
pw = PrintWrapper(printer)
def handle_rtd_hk(object_id: bytes, hk_data: bytes, pw: PrintWrapper):
rtd_name = RTD_NAMES.get(object_id)
if rtd_name is None:
rtd_name = "unknown RTD device"
@ -162,7 +161,7 @@ def handle_rtd_hk(object_id: bytes, hk_data: bytes, printer: FsfwTmTcPrinter):
pw.dlog(f"RTD Value: {rtd_val}")
pw.dlog(f"Error Byte: {error_byte}")
pw.dlog(f"Last Error Byte: {last_err_byte}")
pw.printer.print_validity_buffer(hk_data[fmt_len:], 4)
FsfwTmTcPrinter.get_validity_buffer(hk_data[fmt_len:], 4)
def prompt_rtd_idx():

View File

@ -1,6 +1,5 @@
from .defs import CtrlSetId
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import TCS_CONTROLLER, TCS_SUBSYSTEM_ID
from eive_tmtc.config.object_ids import TCS_SUBSYSTEM_ID
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
from eive_tmtc.tmtc.tcs.brd_assy import pack_tcs_ass_cmds
from tmtccmd.config.tmtc import (
@ -10,64 +9,28 @@ from tmtccmd.config.tmtc import (
)
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import Mode, create_announce_mode_recursive_command
from tmtccmd.tc.pus_3_fsfw_hk import (
make_sid,
generate_one_hk_command,
create_request_one_diag_command,
)
class OpCodeSys:
OFF = ["off"]
NML = ["nml"]
REQUEST_PRIMARY_TEMP_SET = ["temp"]
REQUEST_DEVICE_TEMP_SET = ["temp_devs"]
REQUEST_DEVICE_SUS_SET = ["temp_sus"]
REQUEST_HEATER_INFO = "heater_info"
class OpCode:
OFF = "off"
NML = "nml"
ANNOUNCE_MODES = "announce_modes"
class InfoSys:
OFF = "Switch TCS subsystem OFF"
NML = "Switch TCS subsystem NORMAL (nominal)"
REQUEST_PRIMARY_TEMP_SET = "Request HK set of primary sensor temperatures"
REQUEST_DEVICE_TEMP_SET = "Request HK set of device sensor temperatures"
REQUEST_DEVICE_SUS_SET = "Request HK set of the SUS temperatures"
REQUEST_HEATER_INFO = "Request heater information"
ANNOUNCE_MODES = "Announce Modes recursively"
def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
if op_code in OpCodeSys.REQUEST_PRIMARY_TEMP_SET:
sensor_set_sid = make_sid(TCS_CONTROLLER, CtrlSetId.PRIMARY_SENSORS)
q.add_log_cmd(InfoSys.REQUEST_PRIMARY_TEMP_SET)
q.add_pus_tc(generate_one_hk_command(sensor_set_sid))
if op_code in OpCodeSys.REQUEST_DEVICE_TEMP_SET:
q.add_log_cmd(InfoSys.REQUEST_DEVICE_TEMP_SET)
q.add_pus_tc(
generate_one_hk_command(make_sid(TCS_CONTROLLER, CtrlSetId.DEVICE_SENSORS))
)
if op_code in OpCodeSys.REQUEST_DEVICE_SUS_SET:
q.add_log_cmd(InfoSys.REQUEST_DEVICE_SUS_SET)
q.add_pus_tc(
generate_one_hk_command(
make_sid(TCS_CONTROLLER, CtrlSetId.SUS_TEMP_SENSORS)
)
)
if op_code == OpCodeSys.REQUEST_HEATER_INFO:
q.add_log_cmd(InfoSys.REQUEST_HEATER_INFO)
q.add_pus_tc(
create_request_one_diag_command(
make_sid(TCS_CONTROLLER, CtrlSetId.HEATER_INFO)
)
)
if op_code in OpCodeSys.OFF:
if op_code == OpCode.OFF:
q.add_log_cmd(InfoSys.OFF)
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.OFF, 0, q, InfoSys.OFF)
if op_code in OpCodeSys.NML:
if op_code == OpCode.NML:
q.add_log_cmd(InfoSys.NML)
pack_mode_cmd_with_info(TCS_SUBSYSTEM_ID, Mode.NORMAL, 0, q, InfoSys.OFF)
if op_code == OpCodeSys.ANNOUNCE_MODES:
if op_code == OpCode.ANNOUNCE_MODES:
q.add_log_cmd(InfoSys.ANNOUNCE_MODES)
q.add_pus_tc(create_announce_mode_recursive_command(TCS_SUBSYSTEM_ID))
pack_tcs_ass_cmds(q, op_code)
@ -76,19 +39,11 @@ def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
@tmtc_definitions_provider
def add_tcs_subsystem_cmds(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCodeSys.OFF, info=InfoSys.OFF)
oce.add(keys=OpCodeSys.NML, info=InfoSys.NML)
oce.add(
keys=OpCodeSys.REQUEST_PRIMARY_TEMP_SET, info=InfoSys.REQUEST_PRIMARY_TEMP_SET
)
oce.add(
keys=OpCodeSys.REQUEST_DEVICE_TEMP_SET, info=InfoSys.REQUEST_DEVICE_TEMP_SET
)
oce.add(keys=OpCodeSys.REQUEST_DEVICE_SUS_SET, info=InfoSys.REQUEST_DEVICE_SUS_SET)
oce.add(keys=OpCodeSys.REQUEST_HEATER_INFO, info=InfoSys.REQUEST_HEATER_INFO)
oce.add(keys=OpCodeSys.ANNOUNCE_MODES, info=InfoSys.ANNOUNCE_MODES)
oce.add(keys=OpCode.OFF, info=InfoSys.OFF)
oce.add(keys=OpCode.NML, info=InfoSys.NML)
oce.add(keys=OpCode.ANNOUNCE_MODES, info=InfoSys.ANNOUNCE_MODES)
defs.add_service(
name=CustomServiceList.TCS,
info="TCS Board",
name=CustomServiceList.TCS_SS,
info="TCS subsystem",
op_code_entry=oce,
)

View File

@ -1,11 +1,13 @@
import dataclasses
import datetime
import enum
import logging
import pprint
import struct
from eive_tmtc.pus_tm.defs import PrintWrapper
from eive_tmtc.tmtc.tcs.defs import Heater
from tmtccmd.fsfw import validity_buffer_list
from tmtccmd.util import ObjectIdU32
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from .defs import CtrlSetId
from .heater import HEATER_LOCATION
@ -13,8 +15,47 @@ from .heater import HEATER_LOCATION
_LOGGER = logging.getLogger(__name__)
def handle_thermal_controller_hk_data(
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
class ThermalComponent(enum.IntEnum):
NONE = 0
ACS_BOARD = 1
MGT = 2
RW = 3
STR = 4
IF_BOARD = 5
TCS_BOARD = 6
OBC = 7
LEGACY_OBCIF_BOARD = 8
SBAND_TRANSCEIVER = 9
PCDUP60_BOARD = 10
PCDUACU = 11
PCDUPDU = 12
PLPCDU_BOARD = 13
PLOCMISSION_BOARD = 14
PLOCPROCESSING_BOARD = 15
DAC = 16
CAMERA = 17
DRO = 18
X8 = 19
HPA = 20
TX = 21
MPA = 22
SCEX_BOARD = 23
NUM_ENTRIES = 24
@dataclasses.dataclass
class TcsCtrlComponentInfo:
component: ThermalComponent
# Heater on or off?
state: bool
used_sensor_idx: int
used_heater: Heater
start_time: datetime.datetime
end_time: datetime.datetime
def handle_thermal_controller_hk_data( # noqa C901: complexity is okay.
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
):
# need a better solutuon for this is this is used again..
"""
@ -24,7 +65,6 @@ def handle_thermal_controller_hk_data(
TCP_TEMP_DEV_SERVER = TmTcpServer("localhost", 7306)
"""
if set_id == CtrlSetId.PRIMARY_SENSORS:
pw = PrintWrapper(printer)
pw.dlog("Received sensor temperature data")
# get all the floats
@ -58,7 +98,6 @@ def handle_thermal_controller_hk_data(
for idx, (k, v) in enumerate(parsed_data.items()):
print(f"{str(k).ljust(30)}: Valid: {valid_list[idx]}, Value: {v}")
elif set_id == CtrlSetId.DEVICE_SENSORS:
pw = PrintWrapper(printer)
pw.dlog("Received device temperature data")
fmt_str = "!fhhhhiiiifffhffffffffffffff"
fmt_len = struct.calcsize(fmt_str)
@ -94,7 +133,6 @@ def handle_thermal_controller_hk_data(
for idx, (k, v) in enumerate(parsed_data.items()):
print(f"{str(k).ljust(30)}: Valid: {valid_list[idx]}, Value: {v}")
elif set_id == CtrlSetId.SUS_TEMP_SENSORS:
pw = PrintWrapper(printer)
pw.dlog("Received SUS temperature data")
fmt_str = "!ffffffffffff"
fmt_len = struct.calcsize(fmt_str)
@ -124,5 +162,50 @@ def handle_thermal_controller_hk_data(
)
current_draw = struct.unpack("!H", hk_data[8:10])[0]
print(f"Heater Power Channel Current Draw: {current_draw} mA")
elif set_id == CtrlSetId.TCS_CTRL_INFO:
pw.dlog("Received TCS CTRL information set")
current_idx = 0
heater_states = hk_data[0 : ThermalComponent.NUM_ENTRIES]
current_idx += ThermalComponent.NUM_ENTRIES
used_sensor_idx = hk_data[
current_idx : current_idx + ThermalComponent.NUM_ENTRIES
]
current_idx += ThermalComponent.NUM_ENTRIES
used_heater_idx = hk_data[
current_idx : current_idx + ThermalComponent.NUM_ENTRIES
]
current_idx += ThermalComponent.NUM_ENTRIES
start_and_end_time_fmt_str = "!IIIIIIIIIIIIIIIIIIIIIIII"
data_len = struct.calcsize(start_and_end_time_fmt_str)
start_times = struct.unpack(
start_and_end_time_fmt_str, hk_data[current_idx : current_idx + data_len]
)
current_idx += data_len
end_times = struct.unpack(
start_and_end_time_fmt_str, hk_data[current_idx : current_idx + data_len]
)
current_idx += data_len
component_list = []
for i in range(ThermalComponent.NUM_ENTRIES):
info = TcsCtrlComponentInfo(
component=ThermalComponent(i),
state=bool(heater_states[i]),
used_sensor_idx=used_sensor_idx[i],
used_heater=Heater(used_heater_idx[i]),
start_time=datetime.datetime.fromtimestamp(
start_times[i], datetime.timezone.utc
),
end_time=datetime.datetime.fromtimestamp(
end_times[i], datetime.timezone.utc
),
)
component_str = f"{info.component!r}".ljust(46)
state_str = "ON" if info.state else "OFF"
pw.dlog(
f"{component_str}: {state_str.ljust(4)} | Sensor Index "
f"{info.used_sensor_idx} | {info.used_heater!r} | Start "
f"{info.start_time} | End {info.end_time}"
)
component_list.append(info)
else:
_LOGGER.warning(f"Unimplemented set ID {set_id}")

View File

@ -6,14 +6,17 @@
@date 06.01.2021
"""
import enum
import struct
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.pus_tm.defs import PrintWrapper
from spacepackets.ecss.tc import PusTelecommand
from tmtccmd.config.tmtc import (
tmtc_definitions_provider,
TmtcDefinitionWrapper,
OpCodeEntry,
)
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.tc import DefaultPusQueueHelper
from tmtccmd.tc.pus_200_fsfw_mode import Mode, pack_mode_data
from tmtccmd.tc.pus_3_fsfw_hk import create_request_one_hk_command, make_sid
@ -76,3 +79,10 @@ def add_tmp_sens_cmds(defs: TmtcDefinitionWrapper):
oce.add(OpCode.NML, Info.NML)
oce.add(OpCode.HK, Info.HK)
defs.add_service(CustomServiceList.TMP1075.value, "TMP1075 Temperature Sensor", oce)
def handle_tmp_1075_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
if set_id == SetId.TEMPERATURE:
temp = struct.unpack("!f", hk_data[0:4])[0]
pw.dlog(f"TMP1075 Temperature: {temp}")
pw.dlog(FsfwTmTcPrinter.get_validity_buffer(hk_data[4:], 1))

View File

@ -148,7 +148,8 @@ def time_prompt_offset_from_now() -> datetime.datetime:
seconds_offset = math.floor(
float(
input(
"Please enter the time as a offset from now in seconds. Negative offset is allowed: "
"Please enter the time as a offset from now in seconds. Negative offset"
" is allowed: "
)
)
)

43
eive_tmtc/tmtc/wdt.py Normal file
View File

@ -0,0 +1,43 @@
import enum
from tmtccmd.config.tmtc import (
OpCodeEntry,
TmtcDefinitionWrapper,
tmtc_definitions_provider,
)
from tmtccmd.pus.s8_fsfw_funccmd import create_action_cmd
from tmtccmd.tc import DefaultPusQueueHelper
from eive_tmtc.config.definitions import CustomServiceList
from eive_tmtc.config.object_ids import XIPHOS_WDT_ID
class OpCode:
ENABLE = "enable"
DISABLE = "disable"
class Info:
ENABLE = "Enable WDT"
DISABLE = "Disable WDT"
class ActionId(enum.IntEnum):
ENABLE = 0
DISABLE = 1
def pack_wdt_commands(q: DefaultPusQueueHelper, op_code: str):
if op_code == OpCode.ENABLE:
q.add_pus_tc(create_action_cmd(XIPHOS_WDT_ID, ActionId.ENABLE))
if op_code == OpCode.DISABLE:
q.add_pus_tc(create_action_cmd(XIPHOS_WDT_ID, ActionId.DISABLE))
@tmtc_definitions_provider
def add_xiphos_wdt_defs(defs: TmtcDefinitionWrapper):
oce = OpCodeEntry()
oce.add(keys=OpCode.ENABLE, info=Info.ENABLE)
oce.add(keys=OpCode.DISABLE, info=Info.DISABLE)
defs.add_service(
CustomServiceList.XIPHOS_WDT, info="Xiphos Watchdog Timer", op_code_entry=oce
)

View File

@ -1,7 +1,8 @@
# -*- coding: utf-8 -*-
"""
@file input_helper.py
@brief This class can be used to get user input. A dictionary must be provided which describes the input options.
@brief This class can be used to get user input. A dictionary must be provided which describes the
input options.
@author J. Meier
@date 13.02.2021
"""

Binary file not shown.

BIN
filetest/fake_10kb.bin Normal file

Binary file not shown.

BIN
filetest/fake_20kb.bin Normal file

Binary file not shown.

BIN
filetest/fake_2_5kb.bin Normal file

Binary file not shown.

42
lint.py
View File

@ -1,42 +0,0 @@
#!/usr/bin/env python3
import os
import sys
def main():
exclude_dirs_flag = ""
if not os.path.exists("setup.cfg"):
exclude_dirs_flag = (
"--exclude .git,__pycache__,docs/conf.py,old,build,dist,venv"
)
additional_flags_both_steps = "--count --statistics"
additional_flags_first_step = "--select=E9,F63,F7,F82 --show-source"
python_exe = ""
if os.name == "nt":
python_exe = "py -m"
flake8_first_step_cmd = (
f"{python_exe} flake8 . {additional_flags_both_steps} "
f"{additional_flags_first_step} {exclude_dirs_flag}"
)
status = os.system(flake8_first_step_cmd)
if os.name == "nt":
if status != 0:
print(f"Flake8 linter errors with status {status}")
else:
if os.WEXITSTATUS(status) != 0:
print(f"Flake8 linter errors with status {status}")
sys.exit(0)
additional_flags_second_step = (
'--exit-zero --max-complexity=10 --per-file-ignores="__init__.py:F401"'
)
if not os.path.exists("setup.cfg"):
additional_flags_second_step += " --max-line-length=100"
flake8_second_step_cmd = (
f"{python_exe} flake8 . {additional_flags_both_steps} {additional_flags_second_step}"
f" {exclude_dirs_flag}"
)
os.system(flake8_second_step_cmd)
if __name__ == "__main__":
main()

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
name = "eive-tmtc"
description = "TMTC Commander EIVE"
readme = "README.md"
dynamic = ["version"]
version = "5.8.0"
requires-python = ">=3.10"
license = {text = "Apache-2.0"}
authors = [
@ -29,9 +29,9 @@ classifiers = [
"Topic :: Scientific/Engineering"
]
dependencies = [
"tmtccmd ~= 4.1",
"tmtccmd ~= 6.0",
"python-dateutil ~= 2.8",
# tmtccmd @ git+https://github.com/robamu-org/tmtccmd@<gitRev>#egg=tmtccmd
# "tmtccmd @ git+https://github.com/robamu-org/tmtccmd@main"
]
[project.urls]
@ -40,9 +40,11 @@ dependencies = [
[tool.setuptools]
include-package-data = true
[tool.setuptools.dynamic]
version = {attr = "eive_tmtc.__version__"}
# Auto-Discovery is problematic for some reason, so use custom-discovery
[tool.setuptools.packages]
find = {}
[tool.ruff]
ignore = ["E501"]
[tool.ruff.extend-per-file-ignores]
"__init__.py" = ["F401"]

15
release-checklist.md Normal file
View File

@ -0,0 +1,15 @@
Checklist for new releases
========
# Pre-Release
1. Bump version inside the `pyproject.toml` file.
2. Update `CHANGELOG.md`: Convert `unreleased` section into version section
with date and new `unreleased`section.
3. Run auto-formatter with `black .`
4. Run linter with `ruff .`
# Post-Release
1. Create new release on `EGit` based on the release branch. This also creates
a tag.

View File

@ -1,12 +0,0 @@
#!/usr/bin/env python3
"""
We do the package handling in the static setup.cfg but include an empty setup.py
to allow editable installs https://packaging.python.org/tutorials/packaging-projects/
and provide extensibility
"""
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
setup()

317
tmtcc.py
View File

@ -2,61 +2,30 @@
import logging
import sys
import time
import traceback
from pathlib import Path
from typing import cast
from spacepackets.ccsds import SPACE_PACKET_HEADER_SIZE
import tmtccmd
from eive_tmtc.cfdp.fault_handler import EiveCfdpFaultHandler
from eive_tmtc.cfdp.tm import CfdpInCcsdsWrapper
from eive_tmtc.cfdp.user import EiveCfdpUser
from spacepackets.ecss import PusVerificator
from spacepackets.version import get_version as get_sp_version
from spacepackets.cfdp import (
ConditionCode,
ChecksumType,
TransmissionMode,
PduHolder,
DirectiveType,
PduFactory,
PduType,
)
from eive_tmtc.pus_tc.tc_handler import TcHandler
from tmtccmd.logging import add_colorlog_console_logger
from tmtccmd.cfdp import CfdpUserBase, TransactionId
from tmtccmd.cfdp.defs import CfdpRequestType
from tmtccmd.cfdp.handler import CfdpInCcsdsHandler
from tmtccmd.cfdp.mib import (
DefaultFaultHandlerBase,
LocalEntityCfg,
IndicationCfg,
RemoteEntityCfg,
)
from tmtccmd.cfdp.user import (
TransactionFinishedParams,
MetadataRecvParams,
FileSegmentRecvdParams,
)
from tmtccmd.tc.handler import SendCbParams
try:
import spacepackets
except ImportError as error:
print(error)
print("Python spacepackets module could not be imported")
print(
'Install with "cd spacepackets && python3 -m pip intall -e ." for interative installation'
)
sys.exit(1)
try:
import tmtccmd
except ImportError as error:
run_tmtc_commander = None
initialize_tmtc_commander = None
tb = traceback.format_exc()
print(tb)
print("Python tmtccmd submodule could not be imported")
sys.exit(1)
from spacepackets.ecss import PusVerificator
from tmtccmd import TcHandlerBase, BackendBase
from tmtccmd import BackendBase
from tmtccmd.util import FileSeqCountProvider, PusFileSeqCountProvider
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
from tmtccmd.logging.pus import (
RawTmtcTimedLogWrapper,
@ -66,15 +35,6 @@ from tmtccmd.logging.pus import (
from tmtccmd.pus import VerificationWrapper
from tmtccmd.tm import SpecificApidHandlerBase, GenericApidHandlerBase, CcsdsTmHandler
from tmtccmd.core import BackendRequest
from tmtccmd.logging import get_current_time_string
from tmtccmd.tc import (
ProcedureWrapper,
FeedWrapper,
TcProcedureType,
TcQueueEntryType,
DefaultPusQueueHelper,
QueueWrapper,
)
from tmtccmd.config import (
default_json_path,
SetupWrapper,
@ -86,7 +46,7 @@ from tmtccmd.config.args import (
ProcedureParamsWrapper,
)
from eive_tmtc import APP_LOGGER
from eive_tmtc import __version__
from importlib.metadata import version
from eive_tmtc.config.definitions import (
PUS_APID,
CFDP_APID,
@ -94,8 +54,7 @@ from eive_tmtc.config.definitions import (
CFDP_REMOTE_ENTITY_ID,
)
from eive_tmtc.config.hook import EiveHookObject
from eive_tmtc.pus_tm.factory_hook import pus_factory_hook
from eive_tmtc.pus_tc.procedure_packer import handle_default_procedure
from eive_tmtc.pus_tm.pus_demux import pus_factory_hook
_LOGGER = APP_LOGGER
_LOG_LEVEL = logging.INFO
@ -105,77 +64,26 @@ ROTATING_TIMED_LOGGER_INTERVAL_WHEN = TimedLogWhen.PER_MINUTE
ROTATING_TIMED_LOGGER_INTERVAL = 30
class EiveCfdpFaultHandler(DefaultFaultHandlerBase):
def notice_of_suspension_cb(self, cond: ConditionCode):
pass
def notice_of_cancellation_cb(self, cond: ConditionCode):
pass
def abandoned_cb(self, cond: ConditionCode):
pass
def ignore_cb(self, cond: ConditionCode):
pass
class EiveCfdpUser(CfdpUserBase):
def transaction_indication(self, transaction_id: TransactionId):
_LOGGER.info(f"CFDP User: Start of File {transaction_id}")
def eof_sent_indication(self, transaction_id: TransactionId):
_LOGGER.info(f"CFDP User: EOF sent for {transaction_id}")
def transaction_finished_indication(self, params: TransactionFinishedParams):
_LOGGER.info(f"CFDP User: {params.transaction_id} finished")
def metadata_recv_indication(self, params: MetadataRecvParams):
pass
def file_segment_recv_indication(self, params: FileSegmentRecvdParams):
pass
def report_indication(self, transaction_id: TransactionId, status_report: any):
pass
def suspended_indication(
self, transaction_id: TransactionId, cond_code: ConditionCode
):
pass
def resumed_indication(self, transaction_id: TransactionId, progress: int):
pass
def fault_indication(
self, transaction_id: TransactionId, cond_code: ConditionCode, progress: int
):
pass
def abandoned_indication(
self, transaction_id: TransactionId, cond_code: ConditionCode, progress: int
):
pass
def eof_recv_indication(self, transaction_id: TransactionId):
pass
class PusHandler(SpecificApidHandlerBase):
def __init__(
self,
wrapper: VerificationWrapper,
printer: FsfwTmTcPrinter,
raw_logger: RawTmtcTimedLogWrapper,
hk_level: int,
):
super().__init__(PUS_APID, None)
self.printer = printer
self.verif_wrapper = wrapper
self.raw_logger = raw_logger
self.hk_level = hk_level
def handle_tm(self, packet: bytes, _user_args: any):
# with open("tc.bin", "wb") as of:
# of.write(packet)
pus_factory_hook(packet, self.verif_wrapper, self.printer, self.raw_logger)
pus_factory_hook(
packet, self.verif_wrapper, self.printer, self.raw_logger, self.hk_level
)
class UnknownApidHandler(GenericApidHandlerBase):
@ -190,158 +98,18 @@ class CustomCcsdsTmHandler(CcsdsTmHandler):
_LOGGER.debug(f"Received packet {packet.hex(sep=',')} with APID {apid}")
class CfdpInCcsdsWrapper(SpecificApidHandlerBase):
def __init__(self, cfdp_in_ccsds_handler: CfdpInCcsdsHandler):
super().__init__(CFDP_APID, None)
self.handler = cfdp_in_ccsds_handler
def handle_tm(self, packet: bytes, _user_args: any):
# Ignore the space packet header. Its only purpose is to use the same protocol and
# have a seaprate APID for space packets. If this function is called, the APID is correct.
pdu = packet[SPACE_PACKET_HEADER_SIZE:]
pdu_base = PduFactory.from_raw(pdu)
if pdu_base.pdu_type == PduType.FILE_DATA:
_LOGGER.info("Received File Data PDU TM")
else:
if pdu_base.directive_type == DirectiveType.FINISHED_PDU:
_LOGGER.info(f"Received Finished PDU TM")
else:
_LOGGER.info(
f"Received File Directive PDU with type {pdu_base.directive_type!r} TM"
)
self.handler.pass_pdu_packet(pdu_base)
class TcHandler(TcHandlerBase):
def __init__(
self,
seq_count_provider: FileSeqCountProvider,
cfdp_in_ccsds_wrapper: CfdpInCcsdsWrapper,
pus_verificator: PusVerificator,
high_level_file_logger: logging.Logger,
raw_pus_logger: RawTmtcTimedLogWrapper,
gui: bool,
):
super().__init__()
self.cfdp_handler_started = False
self.cfdp_dest_id = CFDP_REMOTE_ENTITY_ID
self.seq_count_provider = seq_count_provider
self.pus_verificator = pus_verificator
self.high_level_file_logger = high_level_file_logger
self.pus_raw_logger = raw_pus_logger
self.gui = gui
self.queue_helper = DefaultPusQueueHelper(
queue_wrapper=QueueWrapper.empty(),
default_pus_apid=PUS_APID,
seq_cnt_provider=seq_count_provider,
pus_verificator=pus_verificator,
tc_sched_timestamp_len=4,
)
self.cfdp_in_ccsds_wrapper = cfdp_in_ccsds_wrapper
def cfdp_done(self) -> bool:
if self.cfdp_handler_started:
if not self.cfdp_in_ccsds_wrapper.handler.put_request_pending():
self.cfdp_handler_started = False
return True
return False
def feed_cb(self, info: ProcedureWrapper, wrapper: FeedWrapper):
self.queue_helper.queue_wrapper = wrapper.queue_wrapper
if info.proc_type == TcProcedureType.DEFAULT:
handle_default_procedure(self, info.to_def_procedure(), self.queue_helper)
elif info.proc_type == TcProcedureType.CFDP:
self.handle_cfdp_procedure(info)
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()
# pus_tc_wrapper.pus_tc.apid = PUS_APID
raw_tc = pus_tc_wrapper.pus_tc.pack()
self.pus_raw_logger.log_tc(pus_tc_wrapper.pus_tc)
tc_info_string = f"Sent {pus_tc_wrapper.pus_tc}"
_LOGGER.info(tc_info_string)
self.high_level_file_logger.info(
f"{get_current_time_string(True)}: {tc_info_string}"
)
# with open("tc.bin", "wb") as of:
# of.write(raw_tc)
send_params.com_if.send(raw_tc)
elif entry_helper.entry_type == TcQueueEntryType.CCSDS_TC:
cfdp_packet_in_ccsds = entry_helper.to_space_packet_entry()
send_params.com_if.send(cfdp_packet_in_ccsds.space_packet.pack())
# TODO: Log raw CFDP packets similarly to how PUS packets are logged.
# - Log full raw format including space packet wrapper
# - Log context information: Transaction ID, and PDU type and directive
# Could re-use file logger. Should probably do that
# print(f"sending packet: [{cfdp_packet_in_ccsds.space_packet.pack()}]")
# with open(f"cfdp_packet_{self.cfdp_counter}", "wb") as of:
# of.write(cfdp_packet_in_ccsds.space_packet.pack())
# self.cfdp_counter += 1
elif entry_helper.entry_type == TcQueueEntryType.LOG:
log_entry = entry_helper.to_log_entry()
_LOGGER.info(log_entry.log_str)
self.high_level_file_logger.info(log_entry.log_str)
def handle_cfdp_procedure(self, info: ProcedureWrapper):
cfdp_procedure = info.to_cfdp_procedure()
if cfdp_procedure.cfdp_request_type == CfdpRequestType.PUT:
if (
not self.cfdp_in_ccsds_wrapper.handler.put_request_pending()
and not self.cfdp_handler_started
):
put_req = cfdp_procedure.request_wrapper.to_put_request()
put_req.cfg.destination_id = self.cfdp_dest_id
_LOGGER.info(
f"CFDP: Starting file put request with parameters:\n{put_req}"
)
self.cfdp_in_ccsds_wrapper.handler.cfdp_handler.put_request(put_req)
self.cfdp_handler_started = True
for source_pair, dest_pair in self.cfdp_in_ccsds_wrapper.handler:
pdu, sp = source_pair
pdu = cast(PduHolder, pdu)
if pdu.is_file_directive:
if pdu.pdu_directive_type == DirectiveType.METADATA_PDU:
metadata = pdu.to_metadata_pdu()
self.queue_helper.add_log_cmd(
f"CFDP Source: Sending Metadata PDU for file with size "
f"{metadata.file_size}"
)
elif pdu.pdu_directive_type == DirectiveType.EOF_PDU:
self.queue_helper.add_log_cmd(
f"CFDP Source: Sending EOF PDU"
)
else:
fd_pdu = pdu.to_file_data_pdu()
self.queue_helper.add_log_cmd(
f"CFDP Source: Sending File Data PDU for segment at offset "
f"{fd_pdu.offset} with length {len(fd_pdu.file_data)}"
)
self.queue_helper.add_ccsds_tc(sp)
self.cfdp_in_ccsds_wrapper.handler.confirm_source_packet_sent()
self.cfdp_in_ccsds_wrapper.handler.source_handler.state_machine()
def queue_finished_cb(self, info: ProcedureWrapper):
if info is not None:
if info.proc_type == TcQueueEntryType.PUS_TC:
def_proc = info.to_def_procedure()
_LOGGER.info(
f"Finished queue for service {def_proc.service} and op code {def_proc.op_code}"
)
elif info.proc_type == TcProcedureType.CFDP:
_LOGGER.info(f"Finished CFDP queue")
def setup_params() -> SetupWrapper:
def setup_params() -> (SetupWrapper, int):
hook_obj = EiveHookObject(default_json_path())
params = SetupParams()
parser_wrapper = PreArgsParsingWrapper()
parser_wrapper.create_default_parent_parser()
parser_wrapper.create_default_parser()
parser_wrapper.add_def_proc_and_cfdp_as_subparsers()
tmtc_parser, cfdp_parser = parser_wrapper.add_def_proc_and_cfdp_as_subparsers()
tmtc_parser.add_argument(
"--hk",
help="HK output level",
default=2,
)
post_arg_parsing_wrapper = parser_wrapper.parse(
setup_params=params, hook_obj=hook_obj
)
@ -352,13 +120,17 @@ def setup_params() -> SetupWrapper:
post_arg_parsing_wrapper.set_params_with_prompts(proc_param_wrapper)
else:
post_arg_parsing_wrapper.set_params_without_prompts(proc_param_wrapper)
if hasattr(post_arg_parsing_wrapper.args_raw, "hk"):
hk_level = int(post_arg_parsing_wrapper.args_raw.hk)
else:
hk_level = 0
params.apid = PUS_APID
if params.com_if is None:
raise ValueError("could not determine a COM interface.")
setup_wrapper = SetupWrapper(
hook_obj=hook_obj, setup_params=params, proc_param_wrapper=proc_param_wrapper
)
return setup_wrapper
return setup_wrapper, hk_level
def setup_cfdp_handler() -> CfdpInCcsdsWrapper:
@ -368,6 +140,15 @@ def setup_cfdp_handler() -> CfdpInCcsdsWrapper:
indication_cfg=IndicationCfg(),
default_fault_handlers=fh_base,
)
self_as_remote = RemoteEntityCfg(
closure_requested=False,
entity_id=CFDP_LOCAL_ENTITY_ID,
max_file_segment_len=990,
check_limit=None,
crc_on_transmission=False,
crc_type=ChecksumType.CRC_32,
default_transmission_mode=TransmissionMode.UNACKNOWLEDGED,
)
remote_cfg = RemoteEntityCfg(
closure_requested=False,
entity_id=CFDP_REMOTE_ENTITY_ID,
@ -386,7 +167,7 @@ def setup_cfdp_handler() -> CfdpInCcsdsWrapper:
cfdp_user = EiveCfdpUser()
cfdp_in_ccsds_handler = CfdpInCcsdsHandler(
cfg=cfdp_cfg,
remote_cfgs=[remote_cfg],
remote_cfgs=[remote_cfg, self_as_remote],
ccsds_apid=CFDP_APID,
ccsds_seq_cnt_provider=cfdp_ccsds_seq_count_provider,
cfdp_seq_cnt_provider=cfdp_seq_count_provider,
@ -400,12 +181,13 @@ def setup_tmtc_handlers(
printer: FsfwTmTcPrinter,
raw_logger: RawTmtcTimedLogWrapper,
gui: bool,
hk_level: int,
) -> (CcsdsTmHandler, TcHandler):
cfdp_in_ccsds_wrapper = setup_cfdp_handler()
verification_wrapper = VerificationWrapper(
verificator, _LOGGER, printer.file_logger
)
pus_handler = PusHandler(verification_wrapper, printer, raw_logger)
pus_handler = PusHandler(verification_wrapper, printer, raw_logger, hk_level)
ccsds_handler = CustomCcsdsTmHandler(generic_handler=UnknownApidHandler(None))
ccsds_handler.add_apid_handler(pus_handler)
ccsds_handler.add_apid_handler(cfdp_in_ccsds_wrapper)
@ -416,7 +198,7 @@ def setup_tmtc_handlers(
high_level_file_logger=printer.file_logger,
raw_pus_logger=raw_logger,
gui=gui,
cfdp_in_ccsds_wrapper=cfdp_in_ccsds_wrapper,
cfdp_in_ccsds_handler=cfdp_in_ccsds_wrapper.handler,
)
return ccsds_handler, tc_handler
@ -437,14 +219,14 @@ def setup_backend(
return tmtc_backend
def main():
print(f"-- eive tmtc v{__version__} --")
print(f"-- spacepackets v{spacepackets.__version__} --")
def main(): # noqa C901: Complexity okay here.
print(f"-- eive tmtc v{version('eive-tmtc')} --")
print(f"-- spacepackets v{get_sp_version()} --")
add_colorlog_console_logger(_LOGGER)
# TODO: -V CLI argument to enable this?
_LOGGER.setLevel(_LOG_LEVEL)
try:
setup_wrapper = setup_params()
setup_wrapper, hk_level = setup_params()
except KeyboardInterrupt as e:
_LOGGER.info(f"{e}. Exiting")
sys.exit(0)
@ -457,7 +239,7 @@ def main():
)
pus_verificator = PusVerificator()
ccsds_handler, tc_handler = setup_tmtc_handlers(
pus_verificator, printer, raw_logger, setup_wrapper.params.use_gui
pus_verificator, printer, raw_logger, setup_wrapper.params.use_gui, hk_level
)
tmtccmd.setup(setup_wrapper)
@ -467,13 +249,16 @@ def main():
try:
while True:
state = tmtc_backend.periodic_op(None)
tc_handler.cfdp_in_ccsds_wrapper.handler.fsm()
tc_handler.cfdp_in_ccsds_handler.state_machine()
if state.request == BackendRequest.TERMINATION_NO_ERROR:
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:
if tc_handler.proxy_op:
time.sleep(0.1)
continue
if tc_handler.cfdp_done():
_LOGGER.info("CFDP transaction done, closing client")
sys.exit(0)

View File

@ -1,87 +0,0 @@
#!/usr/bin/env python3
"""EIVE TMTC Commander"""
import sys
import traceback
try:
import tmtccmd.runner as tmtccmd
from tmtccmd.config import default_json_path, SetupArgs, CoreGlobalIds
from tmtccmd.config.definitions import CoreModeList
from tmtccmd.config.args import (
create_default_args_parser,
add_default_tmtccmd_args,
parse_default_input_arguments,
handle_unspecified_args,
)
from tmtccmd.ccsds.handler import CcsdsTmHandler, ApidHandler
from tmtccmd.logging import get_console_logger
from tmtccmd.logging.pus import create_tmtc_logger
except ImportError as error:
run_tmtc_commander = None
initialize_tmtc_commander = None
tb = traceback.format_exc()
print(tb)
print("Python tmtccmd submodule could not be imported")
sys.exit(1)
try:
import spacepackets
except ImportError as error:
print(error)
print("Python spacepackets module could not be imported")
print(
'Install with "cd spacepackets && python3 -m pip intall -e ." for interative installation'
)
sys.exit(1)
from config.definitions import PUS_APID
from pus_tc.procedure_packer import pre_tc_send_cb
from pus_tm.factory_hook import ccsds_tm_handler
from tmtcc import tmtcc_pre_args
def main():
hook_obj = tmtcc_pre_args()
arg_parser = create_default_args_parser()
add_default_tmtccmd_args(arg_parser)
args = parse_default_input_arguments(arg_parser, hook_obj)
setup_args = SetupArgs(
hook_obj=hook_obj, use_gui=False, apid=PUS_APID, cli_args=args
)
apid_handler = ApidHandler(cb=ccsds_tm_handler, queue_len=50, user_args=None)
ccsds_handler = CcsdsTmHandler()
ccsds_handler.add_tm_handler(apid=PUS_APID, handler=apid_handler)
tmtccmd.setup(setup_args=setup_args)
tmtccmd.add_ccsds_handler(ccsds_handler)
tmtc_backend = tmtccmd.create_default_tmtc_backend(
setup_args=setup_args,
tm_handler=ccsds_handler,
)
tmtc_file_logger = create_tmtc_logger()
tmtc_backend.usr_send_wrapper = (pre_tc_send_cb, tmtc_file_logger)
tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE)
# get_console_logger().info("Disabling console logger for continuous operation")
# get_console_logger().setLevel("ERROR")
tmtccmd.init_and_start_daemons(tmtc_backend=tmtc_backend)
tmtc_backend.perform_operation()
# remove cmdline args so that we can reuse code
sys.argv = sys.argv[:1]
while True:
args.service = None
args.op_code = None
handle_unspecified_args(args, hook_obj.get_service_op_code_dictionary())
tmtc_backend.set_service(args.service)
tmtc_backend.set_opcode(args.op_code)
tmtc_backend.set_mode(CoreModeList.CONTINUOUS_MODE)
tmtc_backend.perform_operation()
if __name__ == "__main__":
main()