Compare commits
1199 Commits
Author | SHA1 | Date | |
---|---|---|---|
6e85b1add8 | |||
73a7c6ec14 | |||
28161059ca | |||
52d434630b | |||
55a357b52c | |||
2d6e9f826c | |||
20489a02d2 | |||
652f3bf66f | |||
8419a4edd7 | |||
673c8b2cf2 | |||
e23b39e652 | |||
9a55686a26 | |||
067a016040 | |||
dccbf89da1 | |||
5cf76c07e9 | |||
bc53f7e81a | |||
d6b879da67 | |||
9a06c64dfa | |||
cc7837a55b | |||
9cc4fa702c | |||
ada099cab1 | |||
376f94b167 | |||
86a68e25f7 | |||
5e1b12fa52 | |||
de34952df5 | |||
5da55c3c99 | |||
3b903e5639 | |||
da35c7fdf1 | |||
8c7cbd1bd6 | |||
ba0a3e35d2 | |||
fc2667c150 | |||
f9041f215a | |||
a59aceda75 | |||
c50f8c2ce2 | |||
dfa45dbdba | |||
36d9323b57 | |||
e04b5bf9d7 | |||
3c0ac91227 | |||
f61c485979 | |||
2ebbf750bd | |||
847fccbe66 | |||
c8292f4ee1 | |||
3700769e46 | |||
69fda96d7a | |||
0c51cad813 | |||
05d5955236 | |||
18860ec2c6 | |||
fc5fb0eed3 | |||
d5bb6fe6c5 | |||
37eafb722b | |||
1cafdc817f | |||
5967dede97 | |||
a8d0143b1e | |||
a0ad5f8948 | |||
20ecef5838 | |||
6d97841cbf | |||
512f0e4530 | |||
e2f0221681 | |||
e9eb45c088 | |||
ea72087d87 | |||
d48c029b85 | |||
b5f4f2ddab | |||
64dd19bd12 | |||
102821fc71 | |||
24f3abdd5a | |||
a880db5655 | |||
4e0cbb1034 | |||
96636d59e9 | |||
7dfdd40963 | |||
6282686f2f | |||
b160f079b1 | |||
11d7ad0f8d | |||
5af69eb14e | |||
5a0edbefa8 | |||
5bdba2dbad | |||
3ae6ccfb77 | |||
de84bf112b | |||
d182a9d5ec | |||
c72a04b262 | |||
492d364246 | |||
33cf7b1613 | |||
d8c49aed80 | |||
97afd24e52 | |||
4704616ca7 | |||
92c0172b59 | |||
344f16099e | |||
49b55f01e3 | |||
f87095bf68 | |||
928759d1bc | |||
dc17919108 | |||
5f71f27f0e | |||
f8d63e56cb | |||
c843356c8a | |||
49a614db10 | |||
c90dd92162 | |||
bcb6a8b34e | |||
ed15bcaf35 | |||
89202f2cfe | |||
40c2a4b1f3 | |||
811786fd78 | |||
baf1b44d23 | |||
73a4260f33 | |||
3358de3e3e | |||
211e79c83e | |||
7f10e5c777 | |||
aab35c26c2 | |||
6ade001d3d | |||
098bdcf82b | |||
b131415ea7 | |||
b1dd5aa7d0 | |||
0201eb27c4 | |||
c070f18c5d | |||
00876ed0e0 | |||
68ea889d0f | |||
771199e542 | |||
588d7a8079 | |||
83aff8bea5 | |||
1d982785e6 | |||
d062a22a7a | |||
f8c3172e7a | |||
7a56c604a6 | |||
bbde4b5b20 | |||
85fc106a9b | |||
d35bc01397 | |||
d811735b8d | |||
265077a758 | |||
1cd566a94c | |||
9aa891ef78 | |||
329aa76fbf | |||
4633e0cb13 | |||
a5ebac6266 | |||
f3c6b509ec | |||
5aefa436f4 | |||
b0b8118dd5 | |||
db384f8e9c | |||
e5fe0ab95a | |||
248df1d4df | |||
f93f713b0e | |||
c6b2edf688 | |||
5e3b60b3af | |||
d69d16c3af | |||
6376585c4e | |||
5b4a789c4b | |||
d33013ed58 | |||
7e39a481bd | |||
4744de8a54 | |||
916ce92bdc | |||
bb765ac8a0 | |||
84f0f42783 | |||
ee2dade270 | |||
4f26c34c60 | |||
b5ae7c5f38 | |||
813f92f3d4 | |||
f3eecfa8ac | |||
b94c20dab1 | |||
84aeaa4b65 | |||
caaf937003 | |||
bcdd12caf0 | |||
6440048235 | |||
c5dcc0b77d | |||
ebd9792fb9 | |||
9f1d61c3ef | |||
38eb43cf8d | |||
3d007c32a3 | |||
202a824d31 | |||
79b3c269e6 | |||
839da7a224 | |||
3a6abe1b62 | |||
db70b33bd6 | |||
d53e9d61b0 | |||
bac4473aa7 | |||
1831ea8b7a | |||
747ad34eec | |||
2789453d57 | |||
5456d79965 | |||
342a3bbcc9 | |||
4c54aa7586 | |||
1a132684a6 | |||
f63a834d9a | |||
58def42281 | |||
ee955e96fb | |||
97fb8a166f | |||
d477242881 | |||
451c2c07ee | |||
8de88127c3 | |||
e7e97ff2d3 | |||
35e3f8b572 | |||
77010937b8 | |||
c1f4a3f59d | |||
74e55b16dc | |||
f1f4a1e9a0 | |||
7c3a72f85b | |||
4e25e2e6ca | |||
eb302e5cf1 | |||
3da1c2c262 | |||
1660e27ec1 | |||
40aa648e6b | |||
098843a74f | |||
6f86e72042 | |||
507c3e3ff3 | |||
bca2deae61 | |||
1ea255d3e8 | |||
b1caaff672 | |||
3b047094e6 | |||
56ebfb1000 | |||
a41dc9b691 | |||
1d121c40b2 | |||
0a417a89e9 | |||
35e25bf6d0 | |||
d4147d8402 | |||
3cf312073a | |||
76fee820e9 | |||
d2fc53c1fa | |||
7abce63a56 | |||
af24a95475 | |||
6ea3312b62 | |||
d7e61f1395 | |||
51227100af | |||
fc243b76cf | |||
62b16028e6 | |||
4ae659cb4e | |||
228065bf3b | |||
947bcf57f5 | |||
77c2c91539 | |||
756944cae3 | |||
2bb917eab7 | |||
f756df43a2 | |||
688602e486 | |||
21a38ae76a | |||
af02c106b9 | |||
ae239031ed | |||
d640d547bd | |||
02d9d6adfc | |||
ba24faefa9 | |||
b3920524ab | |||
1508acb7ae | |||
2642a772ad | |||
7c94ab3404 | |||
38b3166b3f | |||
e285ac1c47 | |||
534d0dc1af | |||
7cb5766a7a | |||
6e87a0249c | |||
c0ab3351c9 | |||
2259d269dd | |||
57a225f926 | |||
d9e4ff6973 | |||
07b13c153d | |||
02dc6174bf | |||
ce363e3785 | |||
b3c3363591 | |||
aad725a4e5 | |||
fd714a118d | |||
4446e471d9 | |||
3fe51b08a6 | |||
6a8f48c493 | |||
0f6e7eb159 | |||
c4bd355146 | |||
92fe9d92de | |||
99c6c8bbd0 | |||
26552ebeca | |||
76e80c259c | |||
f59c2b9a9e | |||
bf3565f497 | |||
7f119f36d2 | |||
18728731ed | |||
14334dae92 | |||
0aaf63215b | |||
72460fdb49 | |||
b08f9d9af6 | |||
66c1895cd0 | |||
4e56bd172e | |||
ff73746935 | |||
5821c60eb4 | |||
2ca7bc5a70 | |||
d9530271c3 | |||
97b529318d | |||
c4598ff058 | |||
b3d903115e | |||
6420bd162a | |||
9680066d0a | |||
d5e923233b | |||
d0b857dfb7 | |||
0c4ab25421 | |||
84f50bab83 | |||
43d6b98695 | |||
4b7debacc6 | |||
97f99415d6 | |||
c195d03b2e | |||
8f8bcde90e | |||
d38fc53701 | |||
e4bc424093 | |||
5a87a17fa2 | |||
9567146ff8 | |||
b45b0b2271 | |||
d900a689da | |||
70c3f9dcaa | |||
9a1a686b9e | |||
e18ec86eca | |||
f52f4b1ce2 | |||
ad530925d5 | |||
c12dfd06d8 | |||
728b7c647c | |||
a5e38a6856 | |||
f400dea799 | |||
6bd94cc167 | |||
7a664eeab8 | |||
dbfe1dc0d5 | |||
0747b6aa72 | |||
d388676678 | |||
4b6887e304 | |||
60f7ae5453 | |||
10e163be75 | |||
84df438e9d | |||
e249f147bc | |||
d5118f0f98 | |||
39e6a04889 | |||
eb697befe3 | |||
0bce6a506c | |||
dcae930895 | |||
28716209a3 | |||
012e9b148e | |||
34a3a67ac7 | |||
aba369f11f | |||
1123c4d4df | |||
7cd1b0070a | |||
ec8febf623 | |||
c10a926b9f | |||
9711dd9242 | |||
d82cecbe6e | |||
14820d63ac | |||
3d27711abb | |||
1d5db0951e | |||
d67987745d | |||
bde03fc9c0 | |||
be1ac09515 | |||
f0860a785d | |||
ead9c20888 | |||
d1fde6f1e5 | |||
caa843fb1a | |||
11f7ed8436 | |||
88b0c33632 | |||
0c4762712b | |||
dd74f6c3ca | |||
783bdd297a | |||
bf399c3d91 | |||
06a058fc4d | |||
b464182df7 | |||
a30bccc995 | |||
980242404a | |||
a8545211e8 | |||
fe439b4d3c | |||
f63f4b9193 | |||
8d28b321d4 | |||
8b45dd8bff | |||
b20abc5bfb | |||
af1474f10c | |||
66db12796b | |||
2d08fc0bfa | |||
9edc819a97 | |||
d23cc6834a | |||
33cff5e2d2 | |||
acbcbbe98f | |||
c3b0470aa6 | |||
1860b754ce | |||
68138c6e79 | |||
e56f8732be | |||
af5e81158c | |||
baa1d20556 | |||
1faecb09de | |||
1ad621e630 | |||
5fc3d8de99 | |||
224328cc85 | |||
d285b1caec | |||
1f49f0c70d | |||
649deac81b | |||
7fa1196633 | |||
1b0a7aeabd | |||
412d67494d | |||
25377ccfa2 | |||
6657bf072c | |||
7f79ef6c12 | |||
d72b7d9d66 | |||
c687b1411c | |||
c2bed714dc | |||
f9f8f9481f | |||
8d6ca602f2 | |||
c0bd5f572c | |||
25c7decb1e | |||
cc7b1d3331 | |||
948f3a1a41 | |||
8743f59b56 | |||
2cc4a18c1e | |||
b1fbad39e3 | |||
de57b9da5b | |||
55624f0447 | |||
9841076699 | |||
f1876681fd | |||
14b558b7f7 | |||
54a7c3566f | |||
011be9837e | |||
88161ed125 | |||
f02230804d | |||
8ddcc37c74 | |||
b50c75c13c | |||
36799ef51d | |||
772ef5b323 | |||
2f8bed4581 | |||
72def77d40 | |||
bc1a1774a6 | |||
4b08f5dd5b | |||
b0562ea9c7 | |||
f76cd94535 | |||
8a1e5b7b99 | |||
0e208629b0 | |||
403657110b | |||
23f21b40eb | |||
a6b3ccb4cc | |||
d7b494a950 | |||
73bc043538 | |||
02e7e809de | |||
d6f6aff139 | |||
d39a49bd4c | |||
f42318bc57 | |||
fd3a799019 | |||
1664e6adb5 | |||
8042f3607d | |||
59278447fd | |||
b58977fd65 | |||
beae6b3f05 | |||
12c60ac310 | |||
1acbb8bb43 | |||
051e9e6ffb | |||
6d88746ec3 | |||
5571a6852e | |||
1ddb93410e | |||
b0b186ac1f | |||
f95331742b | |||
c91ad9e08b | |||
fcabaa5b09 | |||
bf9ab7edf7 | |||
957d756d1e | |||
4b054b7628 | |||
9001a28545 | |||
6b2fbc6917 | |||
ab770a0057 | |||
0cbf28f25c | |||
cbcc06ede7 | |||
a55aa4a667 | |||
d2324dace9 | |||
1e4e524f95 | |||
39d6ec73c2 | |||
74cfa2949a | |||
ffdb4451f6 | |||
15716c988b | |||
f5ec50b674 | |||
02b70ee203 | |||
95b6954175 | |||
a82cbff5a8 | |||
87b766dfb8 | |||
09b7a01ff6 | |||
fd6b76bfdd | |||
40c086086b | |||
83e8fe0587 | |||
6cffae4397 | |||
d73ef3a314 | |||
0b8bd61e80 | |||
380a02ee94 | |||
c6e2e2de49 | |||
6479aeda63 | |||
26cf112121 | |||
62bd535622 | |||
eea7683581 | |||
df6aa80169 | |||
2fd1a46e66 | |||
2153aa2842 | |||
1f2f2aac13 | |||
9be81f1725 | |||
601adfc9c2 | |||
ac84ac2c3e | |||
7ed18bd570 | |||
e27ad147d4 | |||
ba47757b50 | |||
7e9c626ec8 | |||
8d6dd97d85 | |||
2fae5613ce | |||
fdb14cbdc5 | |||
0cef3fa924 | |||
37a35c4446 | |||
15d25b4c5b | |||
069f84d220 | |||
627a16d51a | |||
fcfae1f67f | |||
01ebd356ba | |||
5785bbd0cc | |||
d3e6101447 | |||
6d5bde40db | |||
c48f04eed5 | |||
18304c31fa | |||
8caa408cbd | |||
4a983958bf | |||
03ec5bdc39 | |||
9c5d6a15db | |||
ddc80071e0 | |||
deb0275bb5 | |||
ec0ebc3653 | |||
c9f4a8070d | |||
b917358b9f | |||
5db9f383a6 | |||
fe3accb9ad | |||
68d74a4748 | |||
b6ec7da7fa | |||
c7df13fa68 | |||
daceb6bc1d | |||
8239e610cc | |||
b28d938468 | |||
e0457831d7 | |||
96fab88a55 | |||
50f2eb42f3 | |||
1bb8bea8d9 | |||
0a05873f4e | |||
80d231586e | |||
5f44cb96be | |||
96136106c7 | |||
65a2d40614 | |||
7e5539ee05 | |||
698cdb3e1d | |||
91ea3669af | |||
dcf1483c47 | |||
0ad0dc391d | |||
774a291f8c | |||
f27333fa0d | |||
5083c9390c | |||
bb4cc59049 | |||
23e38990a3 | |||
8bbd37cf76 | |||
95511e484e | |||
276862fa6e | |||
4a5c2cdd4f | |||
be09b3475d | |||
8927949c4b | |||
acc58ebef1 | |||
7bc344755f | |||
bde17600af | |||
0b1aff220c | |||
cfbff77da8 | |||
673af7f097 | |||
6f5e70dce2 | |||
9b337d3077 | |||
b333ffe707 | |||
736c12a2f8 | |||
773cf59632 | |||
a3d6fa36e9 | |||
4043e30d34 | |||
0276d3dab4 | |||
1c59ff41c1 | |||
1c1af2c7c7 | |||
d74c3fc241 | |||
2b26f1b106 | |||
9e87142324 | |||
5c903d5b02 | |||
92b0b4189c | |||
8b99fbdc81 | |||
74f090833e | |||
a89ecbf6d7 | |||
5d17a1c2b3 | |||
c7a7ca9f79 | |||
3b34d70c23 | |||
45bd838a13 | |||
ba1bead5ad | |||
dbbd22960e | |||
4603329cf7 | |||
9374e9eaab | |||
b6a88ef08e | |||
fbe54e1a2b | |||
4083a3090f | |||
0c6a9677e1 | |||
7eaf6557eb | |||
3bb0a08e95 | |||
d623e83be8 | |||
5a49c4a6ce | |||
bb463aa05c | |||
77e90328a1 | |||
37bb164cc4 | |||
bebde054f4 | |||
d00e4247f6 | |||
a07f21329a | |||
4157b05288 | |||
e9b8d2658d | |||
07ff920e99 | |||
1f06ea4590 | |||
63c584e061 | |||
183cd85907 | |||
f57342602d | |||
f8da9cff7c | |||
005e15b21b | |||
8993ccdf66 | |||
c9c0b3e6ff | |||
33fd280e51 | |||
a5178e2bb0 | |||
01b3a894e6 | |||
f075d28905 | |||
83f6a22a75 | |||
a38bae16cd | |||
53666bdeda | |||
00281fdc5e | |||
43b530cdb7 | |||
92ce64cd39 | |||
268c9e3f0b | |||
9edbdf1a8d | |||
004b561b7d | |||
98a9601dd7 | |||
91a8a2e895 | |||
e503450dda | |||
ad08276079 | |||
7e5fa2e61a | |||
dcf7d0af71 | |||
50668ca7a7 | |||
6975fae511 | |||
ce155e7629 | |||
1fb50d84c6 | |||
71bc121deb | |||
0202c93252 | |||
de1188c1bb | |||
5f87092465 | |||
fb7b273485 | |||
8a69507d05 | |||
6c367aab32 | |||
f899d169b2 | |||
2b2d920540 | |||
d7e1a69e75 | |||
b72dad49a9 | |||
cef8d623c9 | |||
0f2daf94df | |||
a49ab379af | |||
bc85ccd8ef | |||
523dd9b759 | |||
ce5ae8a713 | |||
5b613f98ee | |||
aab50dce5a | |||
c8282453f4 | |||
1f491a72a3 | |||
e8ccb4700a | |||
1d01d27b17 | |||
c3486c26b8 | |||
63fda2f970 | |||
de4de87667 | |||
e0a31cb992 | |||
6b406b8e9a | |||
4508b5dd54 | |||
f2897fa606 | |||
1ecc34800c | |||
3f3523465a | |||
cd75d35229 | |||
b7ab257ae5 | |||
333faaa5f7 | |||
3c25af39c6 | |||
40b2973d9e | |||
f6fcb2fb28 | |||
4b5c4fecc7 | |||
be7b3f54c7 | |||
7fe45d51dd | |||
3d25a30a11 | |||
3a60266774 | |||
536fd81bf8 | |||
c636c5c3e3 | |||
0bd87497d2 | |||
9bb9a43d45 | |||
5074e9d674 | |||
68cfa92c6a | |||
c2100c2f09 | |||
5e0d33c9a8 | |||
93ad3ada7d | |||
64539a2193 | |||
2e34d5c46f | |||
8115a39d66 | |||
b17c413e8f | |||
996d102a39 | |||
9f17661f52 | |||
67d3cebed8 | |||
d71f043704 | |||
2263938b8b | |||
c171654d2b | |||
47a5dd4523 | |||
e612e086ab | |||
c5b8831b43 | |||
7af0349a87 | |||
934a147caa | |||
c9b269b01a | |||
7296344730 | |||
b32a9273ae | |||
e5a09e148b | |||
d3f9a83af8 | |||
350e5d77b8 | |||
a93381494a | |||
9b56a3ce06 | |||
a3bdfe8b04 | |||
9b503678c9 | |||
298ecba373 | |||
45aa63b4ab | |||
5245cbfdd0 | |||
a54e5a8e14 | |||
4f48c25bf7 | |||
d45c6bce97 | |||
5692d70de1 | |||
3974d4134a | |||
f0c14e21e4 | |||
fe6390fab3 | |||
5e17ea9bf0 | |||
e9bf90e366 | |||
99d2c0e0ca | |||
362be2288f | |||
98617b5ce5 | |||
0efd9ca9c6 | |||
f21ee37a01 | |||
d8367f7e62 | |||
e862df4d06 | |||
fb851b93a0 | |||
5337ac4517 | |||
0ebb237787 | |||
de0ecb44e4 | |||
|
42c34b310e | ||
c274615aac | |||
|
e3e74c3f20 | ||
10362f7d30 | |||
21a3813643 | |||
ae2fd8bb37 | |||
ca5b2238bc | |||
d520a0e2f2 | |||
c99a0701d2 | |||
2c7ad5385e | |||
a40c881b9f | |||
432a642422 | |||
abfe923b05 | |||
65ada579d3 | |||
fce0c4400b | |||
f4e9091484 | |||
e334521e6d | |||
cd0fd4d5a7 | |||
4686550eb9 | |||
26cd265e19 | |||
a4984c34c2 | |||
948ad4ef7f | |||
e32a6ded66 | |||
0add5c6ac5 | |||
9f905524b6 | |||
d5685adb48 | |||
4acae93206 | |||
05429d2048 | |||
a249d71840 | |||
|
a5cc03d8a0 | ||
fd692c901d | |||
b0f51072b2 | |||
|
be5cf32dc8 | ||
cbbb335254 | |||
42434cbe7e | |||
bf158bee2d | |||
80539cf897 | |||
ffd2eb11f8 | |||
ed5cb87cad | |||
4386b18049 | |||
a3e03350fa | |||
d758a1f11a | |||
af17e30676 | |||
5652305ee1 | |||
a3f5c92654 | |||
2e21087c6d | |||
e74e751142 | |||
d43badaddf | |||
26b292f05a | |||
6f397289ca | |||
3d4ef7003c | |||
bf31810f25 | |||
9462a6e245 | |||
208d328683 | |||
90ea903c0a | |||
2aa1ecd3a7 | |||
f18a7f49cf | |||
7f872c92c4 | |||
82352bc5fa | |||
a5bfee076a | |||
0c17203825 | |||
beb8e61e2c | |||
e9d10dae1b | |||
b959f60f0a | |||
3e666d76b7 | |||
7eafefc93b | |||
09c694cf9c | |||
94ae2d16e2 | |||
68a4764a56 | |||
a9e59ae42b | |||
3522405e8a | |||
783d5a8ed5 | |||
fc9b4efecf | |||
2468998dbd | |||
74e6d6fe5f | |||
cd393a1596 | |||
8747333880 | |||
77fbcede10 | |||
ba87c01f66 | |||
68c46a299f | |||
2dd850f072 | |||
c83e17bba3 | |||
e5eb2e479c | |||
d2bc142b50 | |||
9115f2519b | |||
54c78d4441 | |||
e46f685607 | |||
b0294e2764 | |||
350ffda6c6 | |||
9219f5863c | |||
4dcac73755 | |||
481e57be59 | |||
039eed1e16 | |||
001270a1e5 | |||
b443867512 | |||
9867ee873a | |||
|
56630b05c2 | ||
|
64d0ca491a | ||
aa427151f5 | |||
0ce32521f4 | |||
649c019eb8 | |||
fa5c24df6b | |||
a13454851b | |||
78b55f919c | |||
3259cf0807 | |||
8919f5c8e9 | |||
736bc23fc5 | |||
02797ffc5b | |||
6a30f6d0ac | |||
11454f6015 | |||
9720fcddec | |||
47fef53ac1 | |||
13014eb250 | |||
d47e9039a5 | |||
60c88fd21c | |||
fd649ff1bb | |||
3f71475860 | |||
7120f14601 | |||
7a82a77876 | |||
23aeb8bcf9 | |||
bc9f13f296 | |||
09dbc6b14d | |||
31d51e3660 | |||
da960b5344 | |||
24f0d8e1a6 | |||
86c1fc96d1 | |||
fda044c2ff | |||
75a8712f91 | |||
0bb1f57599 | |||
|
446e38ed57 | ||
a04bd8aa73 | |||
|
e47eb577fa | ||
7e06043df7 | |||
cf342fb14c | |||
ddf1900376 | |||
ed640dbbb1 | |||
4eb470c724 | |||
1dd667ae25 | |||
be032ab925 | |||
|
24e9c25ba4 | ||
336ed58272 | |||
|
679df9ebe1 | ||
|
6228181357 | ||
|
a06f703d6f | ||
fb676dc90f | |||
4917ddbbe4 | |||
f409d694aa | |||
a470484b9e | |||
4ced2d0b18 | |||
0f5401a2db | |||
9686701c2e | |||
d87361ae75 | |||
5f082cd9fc | |||
d1f96cb83d | |||
8f5f7064e9 | |||
6a6d9c0a7a | |||
db1dbe9661 | |||
1bc38ea4b5 | |||
37fcdb9a60 | |||
6e22e3528a | |||
a57511e725 | |||
887e76baf8 | |||
335d901451 | |||
a2d04b28fd | |||
802757ba72 | |||
af4ceec4f4 | |||
4cf131e9c1 | |||
1989a37e1e | |||
fbf507b2a8 | |||
b19d1e8869 | |||
201e08afe1 | |||
9f8ab3e235 | |||
676f851659 | |||
ab9f2ca05d | |||
e51b55811c | |||
c9f35c3e5c | |||
d97eb7334b | |||
aabfcf83ac | |||
2ef56ae8c4 | |||
7433982f6f | |||
57f2143d79 | |||
556060a3f3 | |||
d9945d4054 | |||
1947ebcb1f | |||
cf2b7443d4 | |||
49521e1661 | |||
08c315fbf9 | |||
1e143ea6fa | |||
8b677041e2 | |||
ff787f4497 | |||
7e90d6183c | |||
20e107c7ae | |||
4f9c728e51 | |||
bd3b666f8c | |||
483ebe87ad | |||
|
8d036bcd4f | ||
9b7471e909 | |||
09cf960350 | |||
d47da4c314 | |||
2d79f6f484 | |||
d99adf55a1 | |||
6db34aacaa | |||
654a5a2e13 | |||
8ec086f778 | |||
8d23f29f94 | |||
9178251ed7 | |||
d7c30ba406 | |||
5fa9727375 | |||
71f2f31fc5 | |||
d65480dfed | |||
0ae3ae294c | |||
841780593e | |||
669e9559b9 | |||
4a13be1beb | |||
1d73bcce00 | |||
aadd6f59b5 | |||
e5bb7f395f | |||
33da498ea8 | |||
94a82b84e8 | |||
d0c8e20d4f | |||
9955295dfe | |||
4086e7947b | |||
ca04b6018b | |||
dedfe1c977 | |||
ef42b1a179 | |||
5d3de069a6 | |||
f16e27b79b | |||
78c3b7dd93 | |||
8a96e21d1a | |||
eed6b82353 | |||
2bd6caa3c2 | |||
2766a5de7b | |||
895987ebf3 | |||
d6445d38a8 | |||
8aec6c48a0 | |||
cab0aa027a | |||
457ccf1ca0 | |||
fbb078784f | |||
f50aac689f | |||
66867ad9d2 | |||
e617faa4df | |||
fc5e3c88ff | |||
b474841d69 | |||
5e27a22a85 | |||
04f5a76962 | |||
5ed3cec20b | |||
c3c58b95ad | |||
5b309e4013 | |||
a39e94279b | |||
b9f58e0612 | |||
d9c202c68e | |||
28c367c6fb | |||
15adb9bf2e | |||
b4e4228040 | |||
26ebe9ab67 | |||
a680bf28f0 | |||
|
a3a3aaa883 | ||
17486fdca7 | |||
c633893df4 | |||
bf16fa14ad | |||
d7c66e4ac3 | |||
2cb923314b | |||
ee38f83ec1 | |||
0399b478f3 | |||
4fa333977a | |||
e4ec0689b5 | |||
fa23e05971 | |||
bf06dd70f4 | |||
c8ea75b2ad | |||
6b657b5623 | |||
6c663b473c | |||
7b5df331ef | |||
c6478f05fd | |||
b95204ef9e | |||
f082f05886 | |||
28b3e4bec7 | |||
dbd2e5d9fc | |||
3eeb58182b | |||
48675efe3f | |||
b98fc2f56d | |||
3c20d2ea24 | |||
2793b354a6 | |||
72fee20d65 | |||
98af6a7907 | |||
a7f11b3159 | |||
98ba66dba2 | |||
28fda7cdbd | |||
619bd6b71b | |||
ece20bf177 | |||
63d7f577b1 | |||
6f783441be | |||
db70b4bd44 | |||
a4a4a6b666 | |||
f99a3ab74a | |||
a9c23a4453 | |||
407163397d | |||
65839f5aec | |||
14ed2415a4 | |||
fb6d5eeb80 | |||
39a9497494 | |||
f4702eb701 | |||
b7e6a79704 | |||
b8376c6f48 | |||
8b6039e15d | |||
e4963fb712 | |||
feacfeaf65 | |||
47480a7959 | |||
67c6b86baf | |||
df1bbe9ded | |||
39dfac2520 | |||
b8a8f4b5a3 | |||
733fc19d78 | |||
83f10ed253 | |||
c4329558c9 | |||
72c577e991 | |||
0fe6cec54c | |||
2ac182e753 | |||
ffdc6a68bb | |||
99d5ed014b | |||
05f22ae4ce | |||
69e2b82c8e | |||
8a5e779e23 | |||
c36c7ca5bb | |||
8a7880bc35 | |||
cac68dba7f | |||
4323b0659d | |||
55cecdf81c | |||
82c6b60af2 | |||
35a485d79e | |||
49ccb4be8d | |||
8341ccc99d | |||
5998aa12a4 | |||
5a05eb4825 | |||
f8299b91cd | |||
45253bc9b8 | |||
7537388f6e | |||
fe19284a8e | |||
49f27c9923 | |||
0010ac581a | |||
0a7feff169 | |||
9b30d290a7 | |||
d23201466c | |||
8bcee7c094 | |||
033c8927c0 | |||
220cb5e9f4 | |||
7387ae3583 | |||
2f33a43937 | |||
a2cd9245a2 | |||
5a0feff284 | |||
912728474a | |||
2b5ad32fdd | |||
b3b98eb2d2 | |||
7d068d85c8 | |||
d6c35262bf | |||
1317441c03 | |||
cd8fdc4865 | |||
3a60fd2d6d | |||
d77ccbf8e9 | |||
f3c0b7567a | |||
485f0015d7 | |||
a3eb34a73d | |||
dfa5cad8a6 | |||
1cab6dc065 | |||
a5337b5293 | |||
|
887312371b | ||
c2f43c90fb | |||
b9b1769bc5 | |||
118b439272 | |||
612383ade1 | |||
2e40e31c15 | |||
aba0dd8ebb | |||
c9790911ef | |||
8001156a02 | |||
db0cbf620e | |||
43e6f0cefa | |||
0c67ce5b08 | |||
9cccefc938 | |||
404082c38d | |||
5021a88112 | |||
15fbfd0f95 | |||
4a02e284b3 | |||
bd9c134729 | |||
44f15eced7 | |||
ff72c02508 | |||
f14bb81c9b | |||
136aaecb77 | |||
32db4fabdc | |||
484deb0f97 | |||
ead4c91769 | |||
e5e19a8c04 | |||
92ef500f42 | |||
43ca7de786 | |||
4839ab4365 | |||
7bc49f1ff7 | |||
74a439955f | |||
aff3ced2c2 | |||
e1cd0e9b5c | |||
a42cdcdfba | |||
9d835e5705 | |||
e7609f02b9 | |||
87f5bf83d1 | |||
0e9f7e6444 | |||
cae971e90b | |||
d294649916 | |||
d652c4663b | |||
677a0d70cc | |||
0390995773 | |||
bb66d15d1f | |||
1be338b272 | |||
5f3180dbc8 | |||
b018784a11 | |||
7c5f21e83c | |||
9d42005816 | |||
ecae444ee3 | |||
a994e87f8a | |||
87607aa681 | |||
7d2c639f01 | |||
d48e86f5fe | |||
efa778c0e8 | |||
1de02aab77 | |||
b032defa7c | |||
ef6a1bb263 | |||
40831064d6 | |||
dcd881bc14 | |||
ee2c4bb4c3 | |||
c4dbf3d8be | |||
a7326b95c4 | |||
24f6a59cf9 | |||
5c675560ea | |||
825a1972c4 | |||
20c2f61555 | |||
9016d3d992 | |||
00991b92f1 | |||
6385a4a7db | |||
383b32141c | |||
486b203534 | |||
e060b40b4b | |||
f02a2d402c | |||
178b624784 | |||
a3b77d2366 | |||
724abca8f1 | |||
30cf47365f | |||
83e5b9ebeb | |||
a55572db28 | |||
febf29e8a7 | |||
96e27e7163 | |||
21b57ab171 | |||
8c959a0b7f | |||
faf34fa6a3 | |||
20d72a40a7 | |||
5745973d3d | |||
622dfde84e | |||
4bf3e2e5e2 | |||
ab42ec65ff | |||
d67d4b07a2 | |||
9e68425058 | |||
50db0eb28d | |||
eee3168712 | |||
c4a444b319 | |||
c256da5b07 | |||
72230c613b | |||
56d0f26cbf | |||
56d163f710 | |||
15f7b23ac2 | |||
742a8a6ae4 | |||
c761262112 | |||
a1cc1aef94 | |||
d9fc58abed | |||
6e15281870 | |||
6308bbb3f0 | |||
24a4fcdeaf | |||
30216bcd1b | |||
8a600f9d2b | |||
68e3203540 | |||
16e4853582 | |||
140c827ce7 | |||
c421f3f5d7 | |||
4cfd2d684a |
5
.gitignore
vendored
5
.gitignore
vendored
@ -6,6 +6,7 @@ log
|
||||
/gps_log.txt
|
||||
/config/*.json
|
||||
|
||||
/.tmtc-history.txt
|
||||
/scex_conf.json
|
||||
/tmtc_conf.json
|
||||
/seqcnt*.txt
|
||||
@ -27,3 +28,7 @@ log
|
||||
/.installed.cfg
|
||||
/*.egg
|
||||
/MANIFEST
|
||||
|
||||
# Telemetry database.
|
||||
/tm.db
|
||||
|
||||
|
7
.gitmodules
vendored
7
.gitmodules
vendored
@ -1,7 +0,0 @@
|
||||
[submodule "tmtccmd"]
|
||||
path = deps/tmtccmd
|
||||
url = https://github.com/robamu-org/tmtccmd.git
|
||||
|
||||
[submodule "spacepackets"]
|
||||
path = deps/spacepackets
|
||||
url = https://github.com/robamu-org/py-spacepackets.git
|
24
.run/CFDP Downlink Test Large.run.xml
Normal file
24
.run/CFDP Downlink Test Large.run.xml
Normal 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>
|
24
.run/CFDP Downlink Test Larger.run.xml
Normal file
24
.run/CFDP Downlink Test Larger.run.xml
Normal 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>
|
24
.run/CFDP Downlink Test.run.xml
Normal file
24
.run/CFDP Downlink Test.run.xml
Normal 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>
|
@ -13,7 +13,7 @@
|
||||
<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 filetest/obsw_update.bin /tmp/obsw_update.bin -d 0.3" />
|
||||
<option name="PARAMETERS" value="cfdp filetest/obsw_update.bin /tmp/obsw_update.bin -d 0.1" />
|
||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||
<option name="EMULATE_TERMINAL" value="false" />
|
||||
<option name="MODULE_MODE" value="false" />
|
||||
|
24
.run/CFDP Test File Small Closure.run.xml
Normal file
24
.run/CFDP Test File Small Closure.run.xml
Normal file
@ -0,0 +1,24 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="CFDP Test File Small Closure" 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 filetest/cfdp_test.txt /tmp/cfdp_test.txt -d 0.2" />
|
||||
<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>
|
@ -1,5 +1,5 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="PLOC MPSoC" type="PythonConfigurationType" factoryName="Python" folderName="PLOC">
|
||||
<configuration default="false" name="PLOC MPSoC with Listener" type="PythonConfigurationType" factoryName="Python" folderName="PLOC">
|
||||
<module name="tmtc" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="PARENT_ENVS" value="true" />
|
||||
@ -13,7 +13,7 @@
|
||||
<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="-s ploc_mpsoc -d 6" />
|
||||
<option name="PARAMETERS" value="-s ploc_mpsoc -l" />
|
||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||
<option name="EMULATE_TERMINAL" value="true" />
|
||||
<option name="MODULE_MODE" value="false" />
|
@ -1,7 +1,7 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="tmtccli" type="PythonConfigurationType" factoryName="Python">
|
||||
<module name="tmtc" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="INTERPRETER_OPTIONS" value="-X dev" />
|
||||
<option name="PARENT_ENVS" value="true" />
|
||||
<envs>
|
||||
<env name="PYTHONUNBUFFERED" value="1" />
|
||||
|
688
CHANGELOG.md
688
CHANGELOG.md
@ -8,14 +8,694 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
|
||||
The [milestone](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/milestones)
|
||||
list yields a list of all related PRs for each release.
|
||||
|
||||
# [v2.0.0] 29.11.2022
|
||||
# [unreleased]
|
||||
|
||||
# [v7.1.0] 2025-01-17
|
||||
|
||||
- Bumped `tmtccmd` to v8.1.0
|
||||
|
||||
## Fixed
|
||||
|
||||
- Use new mode TM API.
|
||||
|
||||
# [v7.0.0] 2024-05-06
|
||||
|
||||
- Reworked PLOC MPSoC commanding to be inline with OBSW update.
|
||||
|
||||
## Fixed
|
||||
|
||||
- GNSS commands working again (again).
|
||||
|
||||
## Added
|
||||
|
||||
- Added handling for new clock events.
|
||||
|
||||
# [v6.2.0] 2024-04-10
|
||||
|
||||
## Added
|
||||
|
||||
- Added version set for STR.
|
||||
- Command for relative timeshift.
|
||||
- Health commands for payload components.
|
||||
|
||||
## Fixed
|
||||
|
||||
- EPS power commands working again.
|
||||
- GNSS commands working again.
|
||||
|
||||
## Changed
|
||||
|
||||
- Fixed PLOC commanding
|
||||
|
||||
# [v6.1.1] 2024-03-06
|
||||
|
||||
## Added
|
||||
|
||||
- Added Core Ctrl cmd to update leap seconds.
|
||||
|
||||
# [v6.1.0] 2024-02-29
|
||||
|
||||
## Added
|
||||
|
||||
- Added commands to unlock and use STR secondary firmware slot.
|
||||
- STR BlobStats TM handling
|
||||
- New ACS CTRL commands.
|
||||
|
||||
## Fixed
|
||||
|
||||
- RW commanding
|
||||
|
||||
# [v6.0.0] 2024-02-08
|
||||
|
||||
## Changed
|
||||
|
||||
- Bumped `tmccmd` to `v8.0.0rc1` to introduce new command tree handling.
|
||||
- Added new PLOC SUPV commands to test sets, cleaned up PLOC SUPV commanding.
|
||||
|
||||
# [v5.13.0] 2024-01-30
|
||||
|
||||
## Added
|
||||
|
||||
- First variant of TM handling with a DB which might serve as a foundation for better TM
|
||||
handling with an ORM in the future.
|
||||
- Added new parameter commands for PLOC MPSoC to skip SUPV commanding.
|
||||
|
||||
# [v5.12.1] 2023-12-13
|
||||
|
||||
## Added
|
||||
|
||||
- A few new commands to test the TC scheduler.
|
||||
|
||||
# [v5.12.0] 2023-12-06
|
||||
|
||||
## Added
|
||||
|
||||
- New ACS controller commands.
|
||||
|
||||
# [v5.11.0] 2023-11-30
|
||||
|
||||
## Added
|
||||
|
||||
- Added new commands to disable channel order checks partially for the payload PCDU normal modes.
|
||||
- Core controller auto switch enable and disable command.
|
||||
- Star Tracker JSON reload command. Reboot still required.
|
||||
- PLOC SUPV ADC and Counters report TM handling.
|
||||
|
||||
# [v5.10.1] 2023-10-27
|
||||
|
||||
- Minor improvements, update event translation.
|
||||
|
||||
# [v5.10.0] 2023-10-27
|
||||
|
||||
- Added new STR commands to allow more debugging.
|
||||
|
||||
# [v5.9.0] 2023-10-24
|
||||
|
||||
## Added
|
||||
|
||||
- Added command to update PL PCDU I and V parameter bounds commands.
|
||||
|
||||
# [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
|
||||
|
||||
- COM `Submode` enum moved from subsystem module to separate definitions module and renamed
|
||||
to `Mode`. Added re-imports with the name `ComMode` in the subsystem and syrlinks module.
|
||||
- Convert various enums to proper `IntEnum`s
|
||||
- Updates for some enumerations.
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/178
|
||||
|
||||
## Fixed
|
||||
|
||||
- Eb to N0 calculation: Improve robustness against division by zero.
|
||||
- Some fixes for PCDU commands: Wrongfully packed command to switch devices off instead of on.
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/180.
|
||||
|
||||
## Added
|
||||
|
||||
- Added `PcduSwitches` enum.
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/179
|
||||
|
||||
# [v2.19.4] 2023-03-24
|
||||
|
||||
## Fixed
|
||||
|
||||
- Correction for Syrlinks submodes
|
||||
- Update generated files
|
||||
|
||||
# [v2.19.3] 2023-03-21
|
||||
|
||||
- Update generated files
|
||||
- Improve STR commanding a bit
|
||||
|
||||
# [v2.19.2] 2023-03-17
|
||||
|
||||
- Update generated files
|
||||
|
||||
## Added
|
||||
|
||||
- Add a little bit of first time stamp extraction for HK packet handling.
|
||||
|
||||
# [v2.19.1] 2023-03-14
|
||||
|
||||
## Added
|
||||
|
||||
- New `subsystems.csv` file with all subsystem IDs
|
||||
- Update `events.csv` and `returnvalues.csv`
|
||||
|
||||
# [v2.19.0] 2023-03-14
|
||||
|
||||
## Added
|
||||
|
||||
- Added RTD ID enum and Set ID enumeration in the RTD module.
|
||||
- STR Temperature Set
|
||||
- Added some more MPSoC commands
|
||||
- RTD HK set
|
||||
|
||||
## Fixed
|
||||
|
||||
- Import error for STR code
|
||||
- STR HK bugfixes and length check
|
||||
|
||||
# [v2.18.1] 2023-03-11
|
||||
|
||||
## Fixed
|
||||
|
||||
- Missing heater location fix.
|
||||
|
||||
## Added
|
||||
|
||||
- Request to announce reboot counts in core controller commands
|
||||
|
||||
# [v2.18.0] 2023-03-11
|
||||
|
||||
## Added
|
||||
|
||||
- Added GPS Altitude for GPS Processed Data Dataset
|
||||
|
||||
## Changed
|
||||
|
||||
- Updated CSVs.
|
||||
- ACS mode changes: The ACS CTRL submodes are now modes. DETUBMLE is now submode of SAFE mode.
|
||||
|
||||
# [v2.17.3] 2023-03-09
|
||||
|
||||
## Fixed
|
||||
|
||||
- Fixed the heater object ID names completely. Also,
|
||||
the HPA heater is now the Syrlinks heater.
|
||||
|
||||
# [v2.17.2] 2023-03-07
|
||||
|
||||
- Updated CSVs
|
||||
- New events for core controller
|
||||
|
||||
# [v2.17.1] 2023-03-07
|
||||
|
||||
## Added
|
||||
|
||||
- `MGT_ASSEMBLY` object ID
|
||||
|
||||
# [v2.17.0] 2023-03-07
|
||||
|
||||
## Added
|
||||
|
||||
- Health set and health announce commands
|
||||
- Camera Switcher, Syrlinks Assembly, IMTQ assembly and Star Tracker assembly object IDs added
|
||||
|
||||
## Changed
|
||||
|
||||
- Breaking typo fix in TMP1075 `SetId`
|
||||
|
||||
# [v2.16.4] 2023-03-04
|
||||
|
||||
## Added
|
||||
|
||||
- Some more IMTQ commands
|
||||
|
||||
# [v2.16.3] 2023-03-03
|
||||
|
||||
## Added
|
||||
|
||||
- Syrlinks ASSY object ID
|
||||
|
||||
# [v2.16.2] 2023-03-01
|
||||
|
||||
## Added
|
||||
|
||||
- Added ACS action cmds
|
||||
- Added new ACS hk values
|
||||
- Added ACS set parameter cmds
|
||||
|
||||
## Fixed
|
||||
|
||||
- Correction for ACS CTRL raw data requests HK type
|
||||
- Fixed diag related ACS hk cmds
|
||||
|
||||
## Added
|
||||
|
||||
- Basic MGM commanding (modes)
|
||||
|
||||
# [v2.16.1] 2023-02-24
|
||||
|
||||
- Updated CSVs for new persistent TM store
|
||||
|
||||
# [v2.16.0] 2023-02-23
|
||||
|
||||
## Added
|
||||
|
||||
- PDEC parameter commands to change size of positive and negative window of AD frames.
|
||||
|
||||
## Fixed
|
||||
|
||||
- Added missing skip directive for private resultcode.
|
||||
|
||||
# [v2.15.2] 2023-02-23
|
||||
|
||||
- Update of generated returnvalue and event files.
|
||||
|
||||
# [v2.15.1] 2023-02-23
|
||||
|
||||
- Actually use `tmtccmd` 4.1 in requirements.
|
||||
- Remove `setup.cfg` completely
|
||||
|
||||
# [v2.15.0] 2023-02-23
|
||||
|
||||
tmtccmd version v4.1.1
|
||||
|
||||
## Changed
|
||||
|
||||
- Moved to `pyproject.toml` package file
|
||||
|
||||
## Fixed
|
||||
|
||||
- Correction in `tmtccmd` dependency, added missing function
|
||||
|
||||
# [v2.14.0] 2023-02-22
|
||||
|
||||
## Changed
|
||||
|
||||
- Generated CSV files for PDEC handler
|
||||
|
||||
# [v2.13.0] 2023-02-21
|
||||
|
||||
tmtccmd version 4.0.0
|
||||
|
||||
Added `python-dateutil` dependency for time prompts.
|
||||
|
||||
## Added
|
||||
|
||||
- Basic persistent TM store commanding
|
||||
- System and TCS system announce mode commands
|
||||
|
||||
## Changed
|
||||
|
||||
- IMTQ set IDs.
|
||||
- Significantly improved IMTQ module and also updated it to refactored OBSW IMTQ handlers.
|
||||
- Update of generated CSVs: Explicit no description strings
|
||||
|
||||
# [v2.12.7] 2023-02-17
|
||||
|
||||
- Re-run generators
|
||||
- Small fix for HK parsing, faulty printout
|
||||
|
||||
# [v2.12.6] 2023-02-14
|
||||
|
||||
## Fixed
|
||||
|
||||
- Fixed GPS processed set output
|
||||
|
||||
## Added
|
||||
|
||||
- Added command to request switcher set from PCDU handler.
|
||||
|
||||
# [v2.12.5] 2023-02-13
|
||||
|
||||
## Added
|
||||
|
||||
- EIVE system commands
|
||||
|
||||
# [v2.12.4] 2023-02-12
|
||||
|
||||
## Fixed
|
||||
|
||||
- `tmtccmd` bumped to v4.0.0rc2, package discovery was broken.
|
||||
|
||||
## Added
|
||||
|
||||
- Syrlinks temperatur set readout
|
||||
|
||||
# [v2.12.3] 2023-02-10
|
||||
|
||||
tmtccmd v4.0.0rc1
|
||||
|
||||
## Fixed
|
||||
|
||||
- Fixed SUS processed data printout format.
|
||||
- Fixed other ACS processed data printout format.
|
||||
- Fixed ACS submode: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/132
|
||||
|
||||
# [v2.12.2] 2023-02-08
|
||||
|
||||
- Use specific `tmtccmd` rev with new mode helper method.
|
||||
|
||||
# [v2.12.1] 2023-02-08
|
||||
|
||||
## Added
|
||||
|
||||
- Added version announce and current image announce commands.
|
||||
- Added persistent TM store object IDs
|
||||
- GPS enable and disable HK commands
|
||||
- All mode commands for the COM subsystem.
|
||||
|
||||
# [v2.12.0] 2023-02-06
|
||||
|
||||
## Changed
|
||||
|
||||
- Updated the subsystem IDs to avoid value clashes with regular device handler mode IDs.
|
||||
|
||||
# [v2.11.0] 2023-02-06
|
||||
|
||||
## Fixed
|
||||
|
||||
- TMP1075 comands: Implement proper prompt for device select.
|
||||
- TMP1075 commands: Add OFF, ON, NORMAL, and HK command
|
||||
|
||||
# [v2.10.0] 2023-02-03
|
||||
|
||||
tmtccmd v4.0.0rc0
|
||||
|
||||
## Changed
|
||||
|
||||
- Updated ACS SS commands for OBSW ACS SS update.
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/130
|
||||
|
||||
## Fixed
|
||||
|
||||
- Fixed parsing of processed GPS data
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/129
|
||||
|
||||
# [v2.9.0] 2023-02-01
|
||||
|
||||
## Fixed
|
||||
|
||||
- Create proper application root logger now.
|
||||
- Generated files update.
|
||||
|
||||
## Added
|
||||
|
||||
- Dedicated handling for health events.
|
||||
- Add time dump command.
|
||||
- Time event handling.
|
||||
|
||||
# [v2.8.0] 2023-02-01
|
||||
|
||||
- Move all device modules inside `pus_tc` and `pus_tm` to `tmtc` module and respective
|
||||
subsystem submodules.
|
||||
- Move low level ACS board device modules `gyros.py` and `mgms.py`
|
||||
to the `tmtc.acs` module.
|
||||
- Bump tmtccmd to include more pythonic log usage. All related changes.
|
||||
It is recommended to use `logging.getLogger(__name__)` for module level loggers now.
|
||||
- Moved TCS components to `tmtc` module
|
||||
- Renamed `HEATER_ID` to `HEATER_CONTROLLER_ID`
|
||||
|
||||
# [v2.7.0] 2023-01-31
|
||||
|
||||
- tmtccmd v4.0.0a3
|
||||
|
||||
# [v2.6.0 and v2.6.1] 2023-01-28
|
||||
|
||||
## Changed
|
||||
|
||||
- Reworked and improved PUS 20 parameter reply handling
|
||||
|
||||
## Added
|
||||
|
||||
- COM subsystem commanding. Default datarate parameter commanding
|
||||
was moved to the subsystem as well.
|
||||
|
||||
# [v2.5.0] 2023-01-26
|
||||
|
||||
## Fixed
|
||||
|
||||
- Bugfix for CCSDS handler commanding: Pass correct object ID
|
||||
- Processed MGM set TM handling fix
|
||||
|
||||
## Added
|
||||
|
||||
- Star Tracker: Add commands to update default datarate.
|
||||
|
||||
## Changed
|
||||
|
||||
- Move Star Tracker module to `tmtc` folder and add some set IDs. Rename `SetIds` to `SetId`.
|
||||
- Move `syrlinks_hk_handler` and `ccsds_handler` module to `tmtc` module.
|
||||
Rename `syrlinks_hk_handler` to `syrlinks_handler`.
|
||||
- Move `star_tracker` module into `tmtc.acs`
|
||||
- CCSDS Handler: Switch from action commands to mode commands for ON/OFF handling.
|
||||
- Star Tracker: Switch from actions commands to mode commands for RX/TX/Modulation commanding.
|
||||
|
||||
# [v2.4.0] and [v2.4.1] 2023-01-23
|
||||
|
||||
- Pin `tmtccmd` to v4.0.0a2
|
||||
- Unify and move Syrlinks module, some bugfixes
|
||||
- Add/Re-enable handling for SUS temp packets
|
||||
- Update SA deployment commands for OBSW https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/347
|
||||
- Extend, fix and improve Syrlinks TMTC handling a bit
|
||||
|
||||
# [v2.3.0] and [v2.3.1] 2023-01-18
|
||||
|
||||
- Bumped `tmtccmd` version to new alpha release, use some new features
|
||||
and fix the breaking changes
|
||||
|
||||
# [v2.2.0] 2023-01-16
|
||||
|
||||
- A lot of consistency renaming: Single name for enums which are not flag enums,
|
||||
e.g `ActionId` instead of `ActionIds`
|
||||
- Updated required Python version to 3.10
|
||||
|
||||
# [v2.1.1] 2023-01-12
|
||||
|
||||
- Typo in `setup.cfg`, missing version prefix `v` for `tmtccmd`
|
||||
|
||||
# [v2.1.0] 2023-01-12
|
||||
|
||||
- Various refactoring and tweaks to allow easier integration into `eive-mib`.
|
||||
- Handle ACS CTRL HK sets.
|
||||
- Add reboot commands for PCDU modules.
|
||||
- Extend MPSoC commands.
|
||||
- Starting from now, more regular releases, especially on breaking changes. This is because
|
||||
this is now also a library with dependents.
|
||||
|
||||
# [v2.0.2] 2022-01-12
|
||||
|
||||
- Bumped dependencies, small fix to allow working script if PyQt is not installed
|
||||
|
||||
# [v2.0.1] 2022-11-29
|
||||
|
||||
- Minor bugfix
|
||||
|
||||
# [v2.0.0] 2022-11-29
|
||||
|
||||
- The tmtc program is installable now, which allow re-using it in other Python applications
|
||||
- Bugfixes for IMTQ TM handling
|
||||
- Updates S/A deployment command
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/118
|
||||
|
||||
# [v1.13.0] 13.10.2022
|
||||
# [v1.13.0] 2022-10-13
|
||||
|
||||
- CFDP integration
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/113
|
||||
@ -28,7 +708,7 @@ list yields a list of all related PRs for each release.
|
||||
- Update PLOC supervisor commands
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/107
|
||||
|
||||
# [v1.12.0] 05.07.2022
|
||||
# [v1.12.0] 2022-07-05
|
||||
|
||||
- Update GPS HK Parsing
|
||||
PR: https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/pulls/86
|
||||
@ -68,4 +748,4 @@ list yields a list of all related PRs for each release.
|
||||
- Extended heater commands for more informative output which component is heated
|
||||
|
||||
See [milestones](https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/milestones)
|
||||
and [releases](https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/releases)
|
||||
and [releases](https://egit.irs.uni-stuttgart.de/eive/eive-tmtc/releases)
|
||||
|
1
MANIFEST.in
Normal file
1
MANIFEST.in
Normal file
@ -0,0 +1 @@
|
||||
recursive-include eive_tmtc/config *.csv
|
55
README.md
55
README.md
@ -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
|
||||
@ -19,13 +19,13 @@ were installed properly.
|
||||
Run CLI mode
|
||||
|
||||
```sh
|
||||
./tmtccli.py
|
||||
./tmtcc.py
|
||||
```
|
||||
|
||||
Run GUI mode
|
||||
|
||||
```sh
|
||||
./tmtcgui.py
|
||||
./tmtcc.py -g
|
||||
```
|
||||
|
||||
# <a id="venv"></a> Set up virtual environment
|
||||
@ -61,50 +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 tmtccmd
|
||||
pip install -e .[gui]
|
||||
```
|
||||
```sh
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
2. You can also install the `spacepackets` package locally/interactively
|
||||
Normally, it will be installed as a `tmtccmd` dependency.
|
||||
|
||||
```sh
|
||||
cd spacepackets
|
||||
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
9
automation/Dockerfile
Normal 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
14
automation/Jenkinsfile
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
pipeline {
|
||||
agent {
|
||||
docker {
|
||||
image 'eive-tmtc-ci:d2'
|
||||
}
|
||||
}
|
||||
stages {
|
||||
stage('Package') {
|
||||
steps {
|
||||
sh 'pip install .'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
4
deps/.gitignore
vendored
Normal file
4
deps/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/*
|
||||
!/*.sh
|
||||
!/.gitignore
|
||||
|
3
deps/install_spacepackets.sh
vendored
Executable file
3
deps/install_spacepackets.sh
vendored
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
git clone https://github.com/us-irs/spacepackets-py.git
|
3
deps/install_tmtccmd.sh
vendored
Executable file
3
deps/install_tmtccmd.sh
vendored
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
git clone https://github.com/robamu-org/tmtccmd.git
|
1
deps/spacepackets
vendored
1
deps/spacepackets
vendored
@ -1 +0,0 @@
|
||||
Subproject commit 84f1af27d4b15dde47b9944e0e533dff6fd8b1a4
|
1
deps/tmtccmd
vendored
1
deps/tmtccmd
vendored
@ -1 +0,0 @@
|
||||
Subproject commit ad8f049d6605b0e63afde774d3cadd80b2392051
|
@ -1,6 +1,7 @@
|
||||
SW_NAME = "eive-tmtc"
|
||||
VERSION_MAJOR = 2
|
||||
VERSION_MINOR = 0
|
||||
VERSION_SUBMINOR = 0
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
__version__ = "2.0.0"
|
||||
EIVE_TMTC_ROOT = Path(__file__).parent
|
||||
PACKAGE_ROOT = EIVE_TMTC_ROOT.parent
|
||||
|
||||
APP_LOGGER = logging.getLogger()
|
||||
|
28
eive_tmtc/cfdp/fault_handler.py
Normal file
28
eive_tmtc/cfdp/fault_handler.py
Normal file
@ -0,0 +1,28 @@
|
||||
import logging
|
||||
|
||||
from spacepackets.cfdp import ConditionCode, TransactionId
|
||||
from cfdppy.mib import DefaultFaultHandlerBase
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class EiveCfdpFaultHandler(DefaultFaultHandlerBase):
|
||||
def notice_of_suspension_cb(
|
||||
self, transaction_id: TransactionId, cond: ConditionCode, progress: int
|
||||
):
|
||||
_LOGGER.info(f"Received notice of suspension: {cond!r}")
|
||||
|
||||
def notice_of_cancellation_cb(
|
||||
self, transaction_id: TransactionId, cond: ConditionCode, progress: int
|
||||
):
|
||||
_LOGGER.info(f"Received notice of cancellation: {cond!r}")
|
||||
|
||||
def abandoned_cb(
|
||||
self, transaction_id: TransactionId, cond: ConditionCode, progress: int
|
||||
):
|
||||
_LOGGER.info(f"Abandoned transaction: {cond!r}")
|
||||
|
||||
def ignore_cb(
|
||||
self, transaction_id: TransactionId, cond: ConditionCode, progress: int
|
||||
):
|
||||
_LOGGER.info(f"Ignored transaction: {cond!r}")
|
253
eive_tmtc/cfdp/handler.py
Normal file
253
eive_tmtc/cfdp/handler.py
Normal file
@ -0,0 +1,253 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional, Tuple
|
||||
|
||||
import deprecation
|
||||
from spacepackets import PacketType, SpacePacket, SpacePacketHeader
|
||||
from spacepackets.cfdp import GenericPduPacket, PduFactory
|
||||
from spacepackets.cfdp.pdu import PduHolder
|
||||
from cfdppy import (
|
||||
CfdpUserBase,
|
||||
LocalEntityCfg,
|
||||
RemoteEntityCfgTable,
|
||||
)
|
||||
from cfdppy.defs import CfdpState
|
||||
from cfdppy.handler import (
|
||||
DestHandler,
|
||||
DestStateWrapper,
|
||||
SourceHandler,
|
||||
SourceStateWrapper,
|
||||
)
|
||||
from cfdppy.handler.common import PacketDestination, get_packet_destination
|
||||
from cfdppy.mib import CheckTimerProvider
|
||||
from cfdppy.request import PutRequest
|
||||
from spacepackets.seqcount import ProvidesSeqCount
|
||||
from tmtccmd.version import get_version
|
||||
|
||||
|
||||
@dataclass
|
||||
class StateWrapper:
|
||||
source_handler_state = SourceStateWrapper()
|
||||
dest_handler_state = DestStateWrapper()
|
||||
|
||||
|
||||
class CfdpHandler:
|
||||
"""Wrapper class which wraps both the :py:class:`tmtccmd.cfdp.handler.source.SourceHandler` and
|
||||
:py:class:`tmtccmd.cfdp.handler.dest.DestHandler` in a sensible way.
|
||||
|
||||
If you have special requirements, for example you want to spawn a new destination handler
|
||||
for each file copy transfer to allow multiple consecutive file transfers, it might be a good
|
||||
idea to write a custom wrapper."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
cfg: LocalEntityCfg,
|
||||
user: CfdpUserBase,
|
||||
seq_cnt_provider: ProvidesSeqCount,
|
||||
remote_cfg_table: RemoteEntityCfgTable,
|
||||
check_timer_provider: CheckTimerProvider,
|
||||
):
|
||||
self.remote_cfg_table = remote_cfg_table
|
||||
self.dest_handler = DestHandler(
|
||||
cfg=cfg,
|
||||
user=user,
|
||||
remote_cfg_table=remote_cfg_table,
|
||||
check_timer_provider=check_timer_provider,
|
||||
)
|
||||
self.source_handler = SourceHandler(
|
||||
cfg=cfg,
|
||||
seq_num_provider=seq_cnt_provider,
|
||||
user=user,
|
||||
remote_cfg_table=remote_cfg_table,
|
||||
check_timer_provider=check_timer_provider,
|
||||
)
|
||||
|
||||
def put_request(self, request: PutRequest):
|
||||
self.source_handler.put_request(request)
|
||||
|
||||
def pull_next_source_packet(self) -> Optional[PduHolder]:
|
||||
res = self.source_handler.state_machine()
|
||||
if res.states.num_packets_ready:
|
||||
return self.source_handler.get_next_packet()
|
||||
return None
|
||||
|
||||
def pull_next_dest_packet(self) -> Optional[PduHolder]:
|
||||
res = self.dest_handler.state_machine()
|
||||
if res.states.packets_ready:
|
||||
return self.dest_handler.get_next_packet()
|
||||
return None
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(self) -> Tuple[Optional[PduHolder], Optional[PduHolder]]:
|
||||
"""The iterator for this class will returns a tuple of optional PDUs wrapped b a
|
||||
:py:class:`PduHolder`.
|
||||
|
||||
:return: Can be a tuple where the first entry can hold a source packet and the second entry
|
||||
can be a destination packet. If both packets are None, a StopIteration will be raised.
|
||||
"""
|
||||
next_source_packet = self.pull_next_source_packet()
|
||||
next_dest_packet = self.pull_next_dest_packet()
|
||||
if not next_dest_packet and not next_source_packet:
|
||||
raise StopIteration
|
||||
return next_source_packet, next_dest_packet
|
||||
|
||||
def put_request_pending(self) -> bool:
|
||||
return self.source_handler.states.state != CfdpState.IDLE
|
||||
|
||||
@deprecation.deprecated(
|
||||
deprecated_in="6.0.0rc0",
|
||||
current_version=get_version(),
|
||||
details="Use insert_packet instead",
|
||||
)
|
||||
def pass_packet(self, packet: GenericPduPacket):
|
||||
self.insert_packet(packet)
|
||||
|
||||
def insert_packet(self, packet: GenericPduPacket):
|
||||
"""This function routes the packets based on PDU type and directive type if applicable.
|
||||
|
||||
The routing is based on section 4.5 of the CFDP standard which specifies the PDU forwarding
|
||||
procedure."""
|
||||
if get_packet_destination(packet) == PacketDestination.DEST_HANDLER:
|
||||
self.dest_handler.insert_packet(packet)
|
||||
elif get_packet_destination(packet) == PacketDestination.SOURCE_HANDLER:
|
||||
self.source_handler.insert_packet(packet) # type: ignore
|
||||
|
||||
|
||||
class CfdpInCcsdsHandler:
|
||||
"""Wrapper helper type used to wrap PDU packets into CCSDS packets and to extract PDU
|
||||
packets from CCSDS packets.
|
||||
|
||||
:param cfg: Local CFDP entity configuration.
|
||||
:param user: User wrapper. This contains the indication callback implementations and the
|
||||
virtual filestore implementation.
|
||||
:param cfdp_seq_cnt_provider: Every CFDP file transfer has a transaction sequence number.
|
||||
This provider is used to retrieve that sequence number.
|
||||
:param ccsds_seq_cnt_provider: Each CFDP PDU is wrapped into a CCSDS space packet, and each
|
||||
space packet has a dedicated sequence count. This provider is used to retrieve the
|
||||
sequence count.
|
||||
:param ccsds_apid: APID to use for the CCSDS space packet header wrapped around each PDU.
|
||||
This is important so that the OBSW can distinguish between regular PUS packets and
|
||||
CFDP packets."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
cfg: LocalEntityCfg,
|
||||
user: CfdpUserBase,
|
||||
remote_cfg_table: RemoteEntityCfgTable,
|
||||
ccsds_apid: int,
|
||||
cfdp_seq_cnt_provider: ProvidesSeqCount,
|
||||
ccsds_seq_cnt_provider: ProvidesSeqCount,
|
||||
check_timer_provider: CheckTimerProvider,
|
||||
):
|
||||
self.cfdp_handler = CfdpHandler(
|
||||
cfg=cfg,
|
||||
user=user,
|
||||
seq_cnt_provider=cfdp_seq_cnt_provider,
|
||||
remote_cfg_table=remote_cfg_table,
|
||||
check_timer_provider=check_timer_provider,
|
||||
)
|
||||
self.ccsds_seq_cnt_provider = ccsds_seq_cnt_provider
|
||||
self.ccsds_apid = ccsds_apid
|
||||
|
||||
def put_request_pending(self):
|
||||
return self.cfdp_handler.put_request_pending()
|
||||
|
||||
def state_machine(self):
|
||||
self.source_handler.state_machine()
|
||||
self.dest_handler.state_machine()
|
||||
|
||||
@deprecation.deprecated(
|
||||
deprecated_in="6.0.0rc1",
|
||||
current_version=get_version(),
|
||||
details="Use state_machine instead",
|
||||
)
|
||||
def fsm(self):
|
||||
self.state_machine()
|
||||
|
||||
@property
|
||||
def source_handler(self):
|
||||
return self.cfdp_handler.source_handler
|
||||
|
||||
@property
|
||||
def dest_handler(self):
|
||||
return self.cfdp_handler.dest_handler
|
||||
|
||||
def pull_next_source_packet(self) -> Optional[Tuple[PduHolder, SpacePacket]]:
|
||||
"""Retrieves the next PDU to send and wraps it into a space packet"""
|
||||
next_packet = self.cfdp_handler.pull_next_source_packet()
|
||||
if next_packet is None:
|
||||
return next_packet
|
||||
sp_header = SpacePacketHeader(
|
||||
packet_type=PacketType.TC,
|
||||
apid=self.ccsds_apid,
|
||||
seq_count=self.ccsds_seq_cnt_provider.get_and_increment(),
|
||||
data_len=next_packet.packet_len - 1,
|
||||
)
|
||||
return next_packet, SpacePacket(sp_header, None, next_packet.pack())
|
||||
|
||||
def pull_next_dest_packet(self) -> Optional[Tuple[PduHolder, SpacePacket]]:
|
||||
"""Retrieves the next PDU to send and wraps it into a space packet"""
|
||||
next_packet = self.cfdp_handler.pull_next_dest_packet()
|
||||
if next_packet is None:
|
||||
return next_packet
|
||||
sp_header = SpacePacketHeader(
|
||||
packet_type=PacketType.TC,
|
||||
apid=self.ccsds_apid,
|
||||
seq_count=self.ccsds_seq_cnt_provider.get_and_increment(),
|
||||
data_len=next_packet.packet_len - 1,
|
||||
)
|
||||
return next_packet, SpacePacket(sp_header, None, next_packet.pack())
|
||||
|
||||
@deprecation.deprecated(
|
||||
deprecated_in="6.0.0rc1",
|
||||
current_version=get_version(),
|
||||
details="Use insert_space_packet instead",
|
||||
)
|
||||
def pass_space_packet(self, space_packet: SpacePacket):
|
||||
self.insert_space_packet(space_packet)
|
||||
|
||||
def insert_space_packet(self, space_packet: SpacePacket) -> bool:
|
||||
if space_packet.user_data is None:
|
||||
raise ValueError(
|
||||
"space packet is empty, expected packet containing a CFDP PDU"
|
||||
)
|
||||
# Unwrap the user data and pass it to the handler
|
||||
pdu_raw = space_packet.user_data
|
||||
pdu_base = PduFactory.from_raw(pdu_raw)
|
||||
if pdu_base:
|
||||
self.insert_pdu_packet(pdu_base)
|
||||
return True
|
||||
return False
|
||||
|
||||
def insert_pdu_packet(self, pdu: GenericPduPacket):
|
||||
self.cfdp_handler.insert_packet(pdu)
|
||||
|
||||
@deprecation.deprecated(
|
||||
deprecated_in="6.0.0rc1",
|
||||
current_version=get_version(),
|
||||
details="Use insert_pdu_packet instead",
|
||||
)
|
||||
def pass_pdu_packet(self, pdu_base: GenericPduPacket):
|
||||
self.insert_pdu_packet(pdu_base)
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(
|
||||
self,
|
||||
) -> Tuple[
|
||||
Optional[Tuple[PduHolder, SpacePacket]],
|
||||
Optional[Tuple[PduHolder, SpacePacket]],
|
||||
]:
|
||||
"""The iterator for this class will returns a tuple of optional PDUs wrapped b a
|
||||
:py:class:`PduHolder`.
|
||||
|
||||
:return: Can be a tuple where the first entry can hold a source packet and the second entry
|
||||
can be a destination packet. If both packets are None, a StopIteration will be raised.
|
||||
"""
|
||||
next_source_tuple = self.pull_next_source_packet()
|
||||
next_dest_tuple = self.pull_next_dest_packet()
|
||||
if not next_source_tuple and not next_dest_tuple:
|
||||
raise StopIteration
|
||||
return next_source_tuple, next_dest_tuple
|
29
eive_tmtc/cfdp/tm.py
Normal file
29
eive_tmtc/cfdp/tm.py
Normal file
@ -0,0 +1,29 @@
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
from eive_tmtc.config.definitions import CFDP_APID
|
||||
from spacepackets.ccsds import SPACE_PACKET_HEADER_SIZE
|
||||
from spacepackets.cfdp import PduFactory, PduType
|
||||
from eive_tmtc.cfdp.handler import CfdpInCcsdsHandler
|
||||
from tmtccmd.tmtc import SpecificApidHandlerBase
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class CfdpInCcsdsWrapper(SpecificApidHandlerBase):
|
||||
def __init__(self, cfdp_in_ccsds_handler: CfdpInCcsdsHandler):
|
||||
self.handler = cfdp_in_ccsds_handler
|
||||
super().__init__(CFDP_APID, None)
|
||||
|
||||
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:]
|
||||
generic_pdu = PduFactory.from_raw(pdu)
|
||||
assert generic_pdu is not None
|
||||
if generic_pdu.pdu_type == PduType.FILE_DATA:
|
||||
_LOGGER.info("Received File Data PDU")
|
||||
else:
|
||||
directive_type = PduFactory.pdu_directive_type(pdu)
|
||||
_LOGGER.info(f"Received File Directive PDU with type {directive_type!r}")
|
||||
self.handler.insert_pdu_packet(generic_pdu)
|
77
eive_tmtc/cfdp/user.py
Normal file
77
eive_tmtc/cfdp/user.py
Normal file
@ -0,0 +1,77 @@
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
from spacepackets.cfdp import ConditionCode
|
||||
from spacepackets.util import UnsignedByteField
|
||||
from cfdppy import CfdpUserBase, TransactionId
|
||||
from cfdppy.mib import CheckTimerProvider, Countdown, EntityType
|
||||
from cfdppy.user import (
|
||||
TransactionFinishedParams,
|
||||
MetadataRecvParams,
|
||||
FileSegmentRecvdParams,
|
||||
TransactionParams,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class EiveCheckTimerProvider(CheckTimerProvider):
|
||||
def provide_check_timer(
|
||||
self,
|
||||
local_entity_id: UnsignedByteField,
|
||||
remote_entity_id: UnsignedByteField,
|
||||
entity_type: EntityType,
|
||||
) -> Countdown:
|
||||
return Countdown(timedelta(seconds=5.0))
|
||||
|
||||
|
||||
class EiveCfdpUser(CfdpUserBase):
|
||||
def transaction_indication(
|
||||
self,
|
||||
transaction_indication_params: TransactionParams,
|
||||
):
|
||||
_LOGGER.info(
|
||||
f"CFDP User: Start of File {transaction_indication_params.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.finished_params.delivery_code!r}")
|
||||
_LOGGER.info(f"Condition code: {params.finished_params.condition_code!r}")
|
||||
_LOGGER.info(f"File delivery status: {params.finished_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}")
|
@ -0,0 +1 @@
|
||||
from .definitions import * # noqa
|
@ -3,6 +3,7 @@
|
||||
@details Template configuration file. Copy this folder to the TMTC commander root and adapt
|
||||
it to your needs.
|
||||
"""
|
||||
|
||||
import enum
|
||||
|
||||
from tmtccmd import CcsdsTmtcBackend
|
||||
|
@ -10,13 +10,23 @@ from spacepackets import PacketType
|
||||
from spacepackets.ccsds import PacketId
|
||||
from spacepackets.util import UnsignedByteField
|
||||
|
||||
|
||||
TM_DB_PATH = "tm.db"
|
||||
# Separate DB or not? Not sure..
|
||||
# RAW_TM_PATH = "raw_tm.db"
|
||||
|
||||
# TODO: The cleanest way would be to load those from the config file..
|
||||
PRINT_RAW_HK_B64_STR = False
|
||||
PRINT_RAW_ACTION_DATA_REPLY_B64_STR = True
|
||||
PRINT_RAW_EVENTS_B64_STR = False
|
||||
|
||||
PUS_APID = 0x65
|
||||
CFDP_APID = 0x66
|
||||
PUS_PACKET_ID = PacketId(PacketType.TM, True, PUS_APID)
|
||||
CFDP_PACKET_ID = PacketId(PacketType.TM, False, CFDP_APID)
|
||||
SPACE_PACKET_IDS = (
|
||||
PUS_PACKET_ID.raw(),
|
||||
CFDP_PACKET_ID.raw(),
|
||||
PUS_PACKET_ID,
|
||||
CFDP_PACKET_ID,
|
||||
)
|
||||
|
||||
CFDP_LOCAL_ENTITY_ID = UnsignedByteField(byte_len=2, val=1)
|
||||
@ -27,15 +37,17 @@ class CustomServiceList(str, enum.Enum):
|
||||
value: str
|
||||
|
||||
TEST_DEVICE = "test"
|
||||
HEALTH = "health"
|
||||
P60DOCK = "p60dock"
|
||||
PDU1 = "pdu1"
|
||||
PDU2 = "pdu2"
|
||||
POWER = "power"
|
||||
ACU = "acu"
|
||||
ACS = "acs"
|
||||
GYRO = "gyro"
|
||||
MGMS = "mgms"
|
||||
COM_SS = "com"
|
||||
BPX_BATTERY = "bpx"
|
||||
TMP1075_1 = "tmp1075_1"
|
||||
TMP1075_2 = "tmp1075_2"
|
||||
HEATER = "heater"
|
||||
IMTQ = "imtq"
|
||||
PLOC_SUPV = "ploc_supv"
|
||||
@ -49,7 +61,7 @@ class CustomServiceList(str, enum.Enum):
|
||||
REACTION_WHEEL_4 = "rw_4"
|
||||
RW_ASSEMBLY = "rw_ass"
|
||||
RAD_SENSOR = "rad_sensor"
|
||||
GPS_CTRL = "gnss-ctrl"
|
||||
GPS_CTRL = "gps"
|
||||
PLOC_MEMORY_DUMPER = "ploc_memory_dumper"
|
||||
CORE = "core"
|
||||
STAR_TRACKER = "star_tracker"
|
||||
@ -62,11 +74,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 = "tmp1075"
|
||||
TVTTESTPROCEDURE = "tvtestproc"
|
||||
CONTROLLERS = "controllers"
|
||||
SCEX = "scex"
|
||||
TM_STORE = "tm_store"
|
||||
SYSTEM = "system"
|
||||
PWR_CTRL = "pwr_ctrl"
|
||||
EPS_SS = "eps_subsystem"
|
||||
XIPHOS_WDT = "xiphos_wdt"
|
||||
|
@ -1,240 +1,326 @@
|
||||
Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
||||
2200;0x0898;STORE_SEND_WRITE_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2201;0x0899;STORE_WRITE_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2202;0x089a;STORE_SEND_READ_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2203;0x089b;STORE_READ_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2204;0x089c;UNEXPECTED_MSG;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2205;0x089d;STORING_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2206;0x089e;TM_DUMP_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2207;0x089f;STORE_INIT_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2208;0x08a0;STORE_INIT_EMPTY;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2209;0x08a1;STORE_CONTENT_CORRUPTED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2210;0x08a2;STORE_INITIALIZE;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2211;0x08a3;INIT_DONE;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2212;0x08a4;DUMP_FINISHED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2213;0x08a5;DELETION_FINISHED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2214;0x08a6;DELETION_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2215;0x08a7;AUTO_CATALOGS_SENDING_FAILED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2600;0x0a28;GET_DATA_FAILED;LOW;;fsfw/src/fsfw/storagemanager/StorageManagerIF.h
|
||||
2601;0x0a29;STORE_DATA_FAILED;LOW;;fsfw/src/fsfw/storagemanager/StorageManagerIF.h
|
||||
2800;0x0af0;DEVICE_BUILDING_COMMAND_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2801;0x0af1;DEVICE_SENDING_COMMAND_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2802;0x0af2;DEVICE_REQUESTING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2803;0x0af3;DEVICE_READING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2804;0x0af4;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2805;0x0af5;DEVICE_MISSED_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2806;0x0af6;DEVICE_UNKNOWN_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2807;0x0af7;DEVICE_UNREQUESTED_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2200;0x0898;STORE_SEND_WRITE_FAILED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2201;0x0899;STORE_WRITE_FAILED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2202;0x089a;STORE_SEND_READ_FAILED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2203;0x089b;STORE_READ_FAILED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2204;0x089c;UNEXPECTED_MSG;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2205;0x089d;STORING_FAILED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2206;0x089e;TM_DUMP_FAILED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2207;0x089f;STORE_INIT_FAILED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2208;0x08a0;STORE_INIT_EMPTY;INFO;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2209;0x08a1;STORE_CONTENT_CORRUPTED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2210;0x08a2;STORE_INITIALIZE;INFO;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2211;0x08a3;INIT_DONE;INFO;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2212;0x08a4;DUMP_FINISHED;INFO;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2213;0x08a5;DELETION_FINISHED;INFO;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2214;0x08a6;DELETION_FAILED;LOW;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2215;0x08a7;AUTO_CATALOGS_SENDING_FAILED;INFO;No description;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
||||
2600;0x0a28;GET_DATA_FAILED;LOW;No description;fsfw/src/fsfw/storagemanager/StorageManagerIF.h
|
||||
2601;0x0a29;STORE_DATA_FAILED;LOW;No description;fsfw/src/fsfw/storagemanager/StorageManagerIF.h
|
||||
2800;0x0af0;DEVICE_BUILDING_COMMAND_FAILED;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2801;0x0af1;DEVICE_SENDING_COMMAND_FAILED;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2802;0x0af2;DEVICE_REQUESTING_REPLY_FAILED;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2803;0x0af3;DEVICE_READING_REPLY_FAILED;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2804;0x0af4;DEVICE_INTERPRETING_REPLY_FAILED;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2805;0x0af5;DEVICE_MISSED_REPLY;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2806;0x0af6;DEVICE_UNKNOWN_REPLY;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2807;0x0af7;DEVICE_UNREQUESTED_REPLY;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2808;0x0af8;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2809;0x0af9;MONITORING_LIMIT_EXCEEDED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2810;0x0afa;MONITORING_AMBIGUOUS;HIGH;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2811;0x0afb;DEVICE_WANTS_HARD_REBOOT;HIGH;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
4201;0x1069;FUSE_CURRENT_HIGH;LOW;;fsfw/src/fsfw/power/Fuse.h
|
||||
4202;0x106a;FUSE_WENT_OFF;LOW;;fsfw/src/fsfw/power/Fuse.h
|
||||
4204;0x106c;POWER_ABOVE_HIGH_LIMIT;LOW;;fsfw/src/fsfw/power/Fuse.h
|
||||
4205;0x106d;POWER_BELOW_LOW_LIMIT;LOW;;fsfw/src/fsfw/power/Fuse.h
|
||||
4300;0x10cc;SWITCH_WENT_OFF;LOW;;fsfw/src/fsfw/power/PowerSwitchIF.h
|
||||
5000;0x1388;HEATER_ON;INFO;;fsfw/src/fsfw/thermal/Heater.h
|
||||
5001;0x1389;HEATER_OFF;INFO;;fsfw/src/fsfw/thermal/Heater.h
|
||||
5002;0x138a;HEATER_TIMEOUT;LOW;;fsfw/src/fsfw/thermal/Heater.h
|
||||
5003;0x138b;HEATER_STAYED_ON;LOW;;fsfw/src/fsfw/thermal/Heater.h
|
||||
5004;0x138c;HEATER_STAYED_OFF;LOW;;fsfw/src/fsfw/thermal/Heater.h
|
||||
5200;0x1450;TEMP_SENSOR_HIGH;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
||||
5201;0x1451;TEMP_SENSOR_LOW;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
||||
5202;0x1452;TEMP_SENSOR_GRADIENT;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
||||
5901;0x170d;COMPONENT_TEMP_LOW;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
5902;0x170e;COMPONENT_TEMP_HIGH;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
5903;0x170f;COMPONENT_TEMP_OOL_LOW;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
5904;0x1710;COMPONENT_TEMP_OOL_HIGH;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
5905;0x1711;TEMP_NOT_IN_OP_RANGE;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
7101;0x1bbd;FDIR_CHANGED_STATE;INFO;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
||||
7102;0x1bbe;FDIR_STARTS_RECOVERY;MEDIUM;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
||||
7103;0x1bbf;FDIR_TURNS_OFF_DEVICE;MEDIUM;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
||||
7201;0x1c21;MONITOR_CHANGED_STATE;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
||||
7202;0x1c22;VALUE_BELOW_LOW_LIMIT;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
||||
7203;0x1c23;VALUE_ABOVE_HIGH_LIMIT;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
||||
7204;0x1c24;VALUE_OUT_OF_RANGE;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
||||
7400;0x1ce8;CHANGING_MODE;INFO;;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7401;0x1ce9;MODE_INFO;INFO;;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7402;0x1cea;FALLBACK_FAILED;HIGH;;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7403;0x1ceb;MODE_TRANSITION_FAILED;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7404;0x1cec;CANT_KEEP_MODE;HIGH;;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7405;0x1ced;OBJECT_IN_INVALID_MODE;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7406;0x1cee;FORCING_MODE;MEDIUM;;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7407;0x1cef;MODE_CMD_REJECTED;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7506;0x1d52;HEALTH_INFO;INFO;;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7507;0x1d53;CHILD_CHANGED_HEALTH;INFO;;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7508;0x1d54;CHILD_PROBLEMS;LOW;;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7509;0x1d55;OVERWRITING_HEALTH;LOW;;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7510;0x1d56;TRYING_RECOVERY;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7511;0x1d57;RECOVERY_STEP;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7512;0x1d58;RECOVERY_DONE;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7600;0x1db0;HANDLE_PACKET_FAILED;LOW;;fsfw/src/fsfw/tcdistribution/definitions.h
|
||||
2809;0x0af9;MONITORING_LIMIT_EXCEEDED;LOW;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2810;0x0afa;MONITORING_AMBIGUOUS;HIGH;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
2811;0x0afb;DEVICE_WANTS_HARD_REBOOT;HIGH;No description;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
||||
4300;0x10cc;SWITCH_WENT_OFF;LOW;No description;fsfw/src/fsfw/power/PowerSwitchIF.h
|
||||
4301;0x10cd;FUSE_CURRENT_HIGH;LOW;No description;fsfw/src/fsfw/power/Fuse.h
|
||||
4302;0x10ce;FUSE_WENT_OFF;LOW;No description;fsfw/src/fsfw/power/Fuse.h
|
||||
4304;0x10d0;POWER_ABOVE_HIGH_LIMIT;LOW;No description;fsfw/src/fsfw/power/Fuse.h
|
||||
4305;0x10d1;POWER_BELOW_LOW_LIMIT;LOW;No description;fsfw/src/fsfw/power/Fuse.h
|
||||
5000;0x1388;HEATER_ON;INFO;No description;fsfw/src/fsfw/thermal/Heater.h
|
||||
5001;0x1389;HEATER_OFF;INFO;No description;fsfw/src/fsfw/thermal/Heater.h
|
||||
5002;0x138a;HEATER_TIMEOUT;LOW;No description;fsfw/src/fsfw/thermal/Heater.h
|
||||
5003;0x138b;HEATER_STAYED_ON;LOW;No description;fsfw/src/fsfw/thermal/Heater.h
|
||||
5004;0x138c;HEATER_STAYED_OFF;LOW;No description;fsfw/src/fsfw/thermal/Heater.h
|
||||
5200;0x1450;TEMP_SENSOR_HIGH;LOW;No description;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
||||
5201;0x1451;TEMP_SENSOR_LOW;LOW;No description;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
||||
5202;0x1452;TEMP_SENSOR_GRADIENT;LOW;No description;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
||||
5901;0x170d;COMPONENT_TEMP_LOW;LOW;No description;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
5902;0x170e;COMPONENT_TEMP_HIGH;LOW;No description;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
5903;0x170f;COMPONENT_TEMP_OOL_LOW;LOW;No description;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
5904;0x1710;COMPONENT_TEMP_OOL_HIGH;LOW;No description;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
5905;0x1711;TEMP_NOT_IN_OP_RANGE;LOW;No description;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
||||
7101;0x1bbd;FDIR_CHANGED_STATE;INFO;No description;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
||||
7102;0x1bbe;FDIR_STARTS_RECOVERY;MEDIUM;No description;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
||||
7103;0x1bbf;FDIR_TURNS_OFF_DEVICE;MEDIUM;No description;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
||||
7201;0x1c21;MONITOR_CHANGED_STATE;LOW;No description;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
||||
7202;0x1c22;VALUE_BELOW_LOW_LIMIT;LOW;No description;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
||||
7203;0x1c23;VALUE_ABOVE_HIGH_LIMIT;LOW;No description;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
||||
7204;0x1c24;VALUE_OUT_OF_RANGE;LOW;No description;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
||||
7400;0x1ce8;CHANGING_MODE;INFO;No description;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7401;0x1ce9;MODE_INFO;INFO;No description;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7402;0x1cea;FALLBACK_FAILED;HIGH;No description;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7403;0x1ceb;MODE_TRANSITION_FAILED;LOW;No description;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7404;0x1cec;CANT_KEEP_MODE;HIGH;No description;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7405;0x1ced;OBJECT_IN_INVALID_MODE;LOW;No description;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7406;0x1cee;FORCING_MODE;MEDIUM;No description;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7407;0x1cef;MODE_CMD_REJECTED;LOW;No description;fsfw/src/fsfw/modes/HasModesIF.h
|
||||
7506;0x1d52;HEALTH_INFO;INFO;No description;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7507;0x1d53;CHILD_CHANGED_HEALTH;INFO;No description;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7508;0x1d54;CHILD_PROBLEMS;LOW;No description;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7509;0x1d55;OVERWRITING_HEALTH;LOW;No description;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7510;0x1d56;TRYING_RECOVERY;MEDIUM;No description;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7511;0x1d57;RECOVERY_STEP;MEDIUM;No description;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7512;0x1d58;RECOVERY_DONE;MEDIUM;No description;fsfw/src/fsfw/health/HasHealthIF.h
|
||||
7600;0x1db0;HANDLE_PACKET_FAILED;LOW;No description;fsfw/src/fsfw/tcdistribution/definitions.h
|
||||
7900;0x1edc;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
||||
7901;0x1edd;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
||||
7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
||||
7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
||||
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
||||
8900;0x22c4;CLOCK_SET;INFO;;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||
8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||
8900;0x22c4;CLOCK_SET;INFO;Clock has been set. P1: old timeval seconds. P2: new timeval seconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||
8901;0x22c5;CLOCK_DUMP_LEGACY;INFO;Clock dump event. P1: timeval seconds P2: timeval milliseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||
8902;0x22c6;CLOCK_SET_FAILURE;LOW;Clock could not be set. P1: Returncode.;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||
8903;0x22c7;CLOCK_DUMP;INFO;Clock dump event. P1: timeval seconds P2: timeval microseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||
8904;0x22c8;CLOCK_DUMP_BEFORE_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||
8905;0x22c9;CLOCK_DUMP_AFTER_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
||||
9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h
|
||||
9700;0x25e4;TEST;INFO;;fsfw/src/fsfw/pus/Service17Test.h
|
||||
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
|
||||
10800;0x2a30;STORE_ERROR;LOW;;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||
10801;0x2a31;MSG_QUEUE_ERROR;LOW;;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||
10802;0x2a32;SERIALIZATION_ERROR;LOW;;fsfw/src/fsfw/cfdp/handler/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/devices/devicedefinitions/powerDefinitions.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/devices/devicedefinitions/powerDefinitions.h
|
||||
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
|
||||
11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
|
||||
11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission/devices/HeaterHandler.h
|
||||
11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;;mission/devices/HeaterHandler.h
|
||||
11402;0x2c8a;HEATER_WENT_ON;INFO;;mission/devices/HeaterHandler.h
|
||||
11403;0x2c8b;HEATER_WENT_OFF;INFO;;mission/devices/HeaterHandler.h
|
||||
11404;0x2c8c;SWITCH_ALREADY_ON;LOW;;mission/devices/HeaterHandler.h
|
||||
11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;;mission/devices/HeaterHandler.h
|
||||
11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;;mission/devices/HeaterHandler.h
|
||||
11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;;mission/devices/HeaterHandler.h
|
||||
11500;0x2cec;BURN_PHASE_START;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11501;0x2ced;BURN_PHASE_DONE;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11502;0x2cee;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11503;0x2cef;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11504;0x2cf0;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11505;0x2cf1;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;;mission/devices/SolarArrayDeploymentHandler.h
|
||||
11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/devices/ploc/PlocMPSoCHandler.h
|
||||
11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h
|
||||
11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h
|
||||
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/devices/ploc/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/devices/ploc/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/devices/ploc/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/devices/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/devices/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/devices/ImtqHandler.h
|
||||
11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. 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/devices/ImtqHandler.h
|
||||
11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system 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/devices/ImtqHandler.h
|
||||
11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. 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/devices/ImtqHandler.h
|
||||
11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range 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/devices/ImtqHandler.h
|
||||
11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/ImtqHandler.h
|
||||
11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/RwDefinitions.h
|
||||
11802;0x2e1a;RESET_OCCURED;LOW;;mission/devices/devicedefinitions/RwDefinitions.h
|
||||
11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
|
||||
11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
|
||||
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h
|
||||
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/devices/ploc/PlocSupervisorHandler.h
|
||||
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;;linux/devices/ploc/PlocSupervisorHandler.h
|
||||
12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/devices/ploc/PlocSupervisorHandler.h
|
||||
12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/devices/ploc/PlocSupervisorHandler.h
|
||||
12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/devices/ploc/PlocSupervisorHandler.h
|
||||
12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/devices/ploc/PlocSupervisorHandler.h
|
||||
12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/devices/ploc/PlocSupervisorHandler.h
|
||||
12100;0x2f44;SANITIZATION_FAILED;LOW;;bsp_q7s/fs/SdCardManager.h
|
||||
12101;0x2f45;MOUNTED_SD_CARD;INFO;;bsp_q7s/fs/SdCardManager.h
|
||||
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/devices/ploc/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/devices/ploc/PlocMemoryDumper.h
|
||||
12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/devices/ploc/PlocMemoryDumper.h
|
||||
12401;0x3071;INVALID_TC_FRAME;HIGH;;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;POLL_ERROR_PDEC;MEDIUM;;linux/ipcore/PdecHandler.h
|
||||
12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h
|
||||
12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h
|
||||
12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h
|
||||
12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/devices/startracker/StrHelper.h
|
||||
12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/devices/startracker/StrHelper.h
|
||||
12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/devices/startracker/StrHelper.h
|
||||
12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/devices/startracker/StrHelper.h
|
||||
12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/devices/startracker/StrHelper.h
|
||||
12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/devices/startracker/StrHelper.h
|
||||
12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
|
||||
12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
|
||||
12511;0x30df;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux/devices/startracker/StrHelper.h
|
||||
12512;0x30e0;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/devices/startracker/StrHelper.h
|
||||
12513;0x30e1;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/devices/startracker/StrHelper.h
|
||||
12514;0x30e2;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/devices/startracker/StrHelper.h
|
||||
12515;0x30e3;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux/devices/startracker/StrHelper.h
|
||||
12516;0x30e4;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux/devices/startracker/StrHelper.h
|
||||
12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/devices/ploc/PlocMPSoCHelper.h
|
||||
12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/devices/ploc/PlocMPSoCHelper.h
|
||||
12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;;linux/devices/ploc/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/devices/ploc/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/devices/ploc/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/devices/ploc/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/devices/ploc/PlocMPSoCHelper.h
|
||||
12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
|
||||
12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/devices/ploc/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/devices/ploc/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/devices/ploc/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/devices/ploc/PlocMPSoCHelper.h
|
||||
12612;0x3144;MPSOC_TM_SIZE_ERROR;LOW;;linux/devices/ploc/PlocMPSoCHelper.h
|
||||
12613;0x3145;MPSOC_TM_CRC_MISSMATCH;LOW;;linux/devices/ploc/PlocMPSoCHelper.h
|
||||
12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/devices/PayloadPcduHandler.h
|
||||
12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h
|
||||
12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission/system/objects/AcsBoardAssembly.h
|
||||
12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/objects/AcsBoardAssembly.h
|
||||
12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/objects/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/objects/AcsBoardAssembly.h
|
||||
12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission/system/objects/SusAssembly.h
|
||||
12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission/system/objects/SusAssembly.h
|
||||
12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission/system/objects/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/objects/SusAssembly.h
|
||||
13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;;mission/system/objects/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/devices/devicedefinitions/GPSDefinitions.h
|
||||
13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/devices/P60DockHandler.h
|
||||
13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/devices/P60DockHandler.h
|
||||
13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/devices/P60DockHandler.h
|
||||
13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13602;0x3522;SUPV_CONTINUE_UPDATE_FAILED;LOW;Continue update command failed;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13603;0x3523;SUPV_CONTINUE_UPDATE_SUCCESSFUL;LOW;Continue update command successful;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13604;0x3524;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13606;0x3526;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13607;0x3527;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13608;0x3528;SUPV_MEM_CHECK_OK;INFO;;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13609;0x3529;SUPV_MEM_CHECK_FAIL;INFO;;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13616;0x3530;SUPV_SENDING_COMMAND_FAILED;LOW;;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13617;0x3531;SUPV_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 supervisor helper;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13618;0x3532;SUPV_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 supervisor helper;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13619;0x3533;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13620;0x3534;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13621;0x3535;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13622;0x3536;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13623;0x3537;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13624;0x3538;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13625;0x3539;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13626;0x353a;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13627;0x353b;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13628;0x353c;SUPV_REPLY_SIZE_MISSMATCH;LOW;;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13629;0x353d;SUPV_REPLY_CRC_MISSMATCH;LOW;;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13630;0x353e;SUPV_UPDATE_PROGRESS;INFO;Will be triggered every 5 percent of the update progress. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13631;0x353f;HDLC_FRAME_REMOVAL_ERROR;INFO;;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13632;0x3540;HDLC_CRC_ERROR;INFO;;linux/devices/ploc/PlocSupvUartMan.h
|
||||
13700;0x3584;ALLOC_FAILURE;MEDIUM;;bsp_q7s/core/CoreController.h
|
||||
13701;0x3585;REBOOT_SW;MEDIUM; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h
|
||||
13702;0x3586;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
|
||||
13703;0x3587;REBOOT_HW;MEDIUM;;bsp_q7s/core/CoreController.h
|
||||
13704;0x3588;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
|
||||
13800;0x35e8;MISSING_PACKET;LOW;;mission/devices/devicedefinitions/ScexDefinitions.h
|
||||
13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;;mission/devices/devicedefinitions/ScexDefinitions.h
|
||||
13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;;mission/devices/devicedefinitions/ScexDefinitions.h
|
||||
13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;;mission/utility/GlobalConfigHandler.h
|
||||
13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;;mission/utility/GlobalConfigHandler.h
|
||||
13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;;mission/utility/GlobalConfigHandler.h
|
||||
13904;0x3650;WRITE_CONFIGFILE_FAILED;MEDIUM;;mission/utility/GlobalConfigHandler.h
|
||||
13905;0x3651;READ_CONFIGFILE_FAILED;MEDIUM;;mission/utility/GlobalConfigHandler.h
|
||||
9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h
|
||||
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
|
||||
10800;0x2a30;STORE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||
10801;0x2a31;MSG_QUEUE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||
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
|
||||
10805;0x2a35;HANDLING_CFDP_REQUEST_FAILED;LOW;CFDP request handling failed. P2: Returncode.;fsfw/src/fsfw/cfdp/handler/defs.h
|
||||
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acs/defs.h
|
||||
11201;0x2bc1;RATE_RECOVERY;MEDIUM;The system has recovered from a 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;PTG_CTRL_NO_ATTITUDE_INFORMATION;HIGH;For a prolonged time, no attitude information was available for the Pointing Controller. Falling back to Safe Mode.;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
|
||||
11209;0x2bc9;TLE_FILE_READ_FAILED;LOW;The TLE could not be read from the filesystem.;mission/acs/defs.h
|
||||
11210;0x2bca;PTG_RATE_VIOLATION;MEDIUM;The limits for the rotation in pointing mode were violated.;mission/acs/defs.h
|
||||
11211;0x2bcb;DETUMBLE_TRANSITION_FAILED;HIGH;The detumble transition has failed. //! P1: Last detumble state before failure.;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;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
|
||||
11501;0x2ced;BURN_PHASE_DONE;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/SolarArrayDeploymentHandler.h
|
||||
11502;0x2cee;MAIN_SWITCH_ON_TIMEOUT;LOW;No description;mission/SolarArrayDeploymentHandler.h
|
||||
11503;0x2cef;MAIN_SWITCH_OFF_TIMEOUT;LOW;No description;mission/SolarArrayDeploymentHandler.h
|
||||
11504;0x2cf0;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
|
||||
11505;0x2cf1;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
|
||||
11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
|
||||
11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h
|
||||
11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/SolarArrayDeploymentHandler.h
|
||||
11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/plocMpsocHelpers.h
|
||||
11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/plocMpsocHelpers.h
|
||||
11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/plocMpsocHelpers.h
|
||||
11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/plocMpsocHelpers.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/plocMpsocHelpers.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/plocMpsocHelpers.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/plocMpsocHelpers.h
|
||||
11608;0x2d58;SUPV_REPLY_TIMEOUT;LOW;SUPV reply timeout.;linux/payload/plocMpsocHelpers.h
|
||||
11609;0x2d59;CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE;LOW;Camera must be commanded on first.;linux/payload/plocMpsocHelpers.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
|
||||
11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. 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
|
||||
11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system 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
|
||||
11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. 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
|
||||
11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range 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
|
||||
11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/acs/ImtqHandler.h
|
||||
11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/acs/rwHelpers.h
|
||||
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/plocSupvDefs.h
|
||||
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/plocSupvDefs.h
|
||||
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/plocSupvDefs.h
|
||||
12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/payload/plocSupvDefs.h
|
||||
12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/payload/plocSupvDefs.h
|
||||
12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/payload/plocSupvDefs.h
|
||||
12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/payload/plocSupvDefs.h
|
||||
12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/payload/plocSupvDefs.h
|
||||
12009;0x2ee9;SUPV_ACK_UNKNOWN_COMMAND;LOW;Received ACK, but no related command is unknown or has not been sent by this software instance. P1: Module APID. P2: Service ID.;linux/payload/plocSupvDefs.h
|
||||
12010;0x2eea;SUPV_EXE_ACK_UNKNOWN_COMMAND;LOW;Received ACK EXE, but no related command is unknown or has not been sent by this software instance. P1: Module APID. P2: Service ID.;linux/payload/plocSupvDefs.h
|
||||
12100;0x2f44;SANITIZATION_FAILED;LOW;No description;bsp_q7s/fs/SdCardManager.h
|
||||
12101;0x2f45;MOUNTED_SD_CARD;INFO;No description;bsp_q7s/fs/SdCardManager.h
|
||||
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/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
|
||||
12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/acs/StrComHandler.h
|
||||
12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/acs/StrComHandler.h
|
||||
12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/acs/StrComHandler.h
|
||||
12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/acs/StrComHandler.h
|
||||
12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/acs/StrComHandler.h
|
||||
12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/acs/StrComHandler.h
|
||||
12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/acs/StrComHandler.h
|
||||
12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/acs/StrComHandler.h
|
||||
12511;0x30df;STR_COM_REPLY_TIMEOUT;LOW;Star tracker did not send a valid reply for a certain timeout. P1: Position of upload or download packet for which the packet wa sent. P2: Timeout;linux/acs/StrComHandler.h
|
||||
12513;0x30e1;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/acs/StrComHandler.h
|
||||
12514;0x30e2;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/acs/StrComHandler.h
|
||||
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/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
|
||||
12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h
|
||||
12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/acs/AcsBoardAssembly.h
|
||||
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/tcs/TcsBoardAssembly.h
|
||||
13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: New fix. P2: Missed fix changes 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;linux/acs/GPSDefinitions.h
|
||||
13101;0x332d;CANT_GET_FIX;MEDIUM;Could not get fix in maximum allowed time. Trying to reset both GNSS devices. P1: Maximum allowed time to get a fix after the GPS was switched on.;linux/acs/GPSDefinitions.h
|
||||
13102;0x332e;RESET_FAIL;HIGH;Failed to reset an GNNS Device. P1: Board-Side.;linux/acs/GPSDefinitions.h
|
||||
13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h
|
||||
13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/power/P60DockHandler.h
|
||||
13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/power/P60DockHandler.h
|
||||
13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux/payload/PlocSupvUartMan.h
|
||||
13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux/payload/PlocSupvUartMan.h
|
||||
13602;0x3522;SUPV_CONTINUE_UPDATE_FAILED;LOW;Continue update command failed;linux/payload/PlocSupvUartMan.h
|
||||
13603;0x3523;SUPV_CONTINUE_UPDATE_SUCCESSFUL;LOW;Continue update command successful;linux/payload/PlocSupvUartMan.h
|
||||
13604;0x3524;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux/payload/PlocSupvUartMan.h
|
||||
13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux/payload/PlocSupvUartMan.h
|
||||
13606;0x3526;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux/payload/PlocSupvUartMan.h
|
||||
13607;0x3527;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux/payload/PlocSupvUartMan.h
|
||||
13608;0x3528;SUPV_MEM_CHECK_OK;INFO;No description;linux/payload/PlocSupvUartMan.h
|
||||
13609;0x3529;SUPV_MEM_CHECK_FAIL;INFO;No description;linux/payload/PlocSupvUartMan.h
|
||||
13616;0x3530;SUPV_SENDING_COMMAND_FAILED;LOW;No description;linux/payload/PlocSupvUartMan.h
|
||||
13617;0x3531;SUPV_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 supervisor helper;linux/payload/PlocSupvUartMan.h
|
||||
13618;0x3532;SUPV_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 supervisor helper;linux/payload/PlocSupvUartMan.h
|
||||
13619;0x3533;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocSupvUartMan.h
|
||||
13620;0x3534;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h
|
||||
13621;0x3535;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h
|
||||
13622;0x3536;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux/payload/PlocSupvUartMan.h
|
||||
13623;0x3537;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h
|
||||
13624;0x3538;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h
|
||||
13625;0x3539;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux/payload/PlocSupvUartMan.h
|
||||
13626;0x353a;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux/payload/PlocSupvUartMan.h
|
||||
13627;0x353b;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/payload/PlocSupvUartMan.h
|
||||
13628;0x353c;SUPV_REPLY_SIZE_MISSMATCH;LOW;No description;linux/payload/PlocSupvUartMan.h
|
||||
13629;0x353d;SUPV_REPLY_CRC_MISSMATCH;LOW;No description;linux/payload/PlocSupvUartMan.h
|
||||
13630;0x353e;SUPV_UPDATE_PROGRESS;INFO;Will be triggered every 5 percent of the update progress. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/payload/PlocSupvUartMan.h
|
||||
13631;0x353f;HDLC_FRAME_REMOVAL_ERROR;INFO;No description;linux/payload/PlocSupvUartMan.h
|
||||
13632;0x3540;HDLC_CRC_ERROR;INFO;No description;linux/payload/PlocSupvUartMan.h
|
||||
13701;0x3585;TX_ON;INFO;Transmitter is on now. P1: Submode, P2: Current default datarate.;mission/com/syrlinksDefs.h
|
||||
13702;0x3586;TX_OFF;INFO;Transmitter is off now.;mission/com/syrlinksDefs.h
|
||||
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;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
|
||||
14301;0x37dd;FILE_TOO_LARGE;LOW;File in store too large. P1: Detected file size P2: Allowed file size;mission/persistentTmStoreDefs.h
|
||||
14302;0x37de;BUSY_DUMPING_EVENT;INFO;No description;mission/persistentTmStoreDefs.h
|
||||
14305;0x37e1;DUMP_OK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14306;0x37e2;DUMP_NOK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14307;0x37e3;DUMP_MISC_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14308;0x37e4;DUMP_HK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14309;0x37e5;DUMP_CFDP_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14310;0x37e6;DUMP_OK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
14311;0x37e7;DUMP_NOK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h
|
||||
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 for a prolonged time again, resetting all counters. P1: Number of periods with invalid messages. P2: Maximum invalid message counter.;mission/acs/SusHandler.h
|
||||
14600;0x3908;FAULT_HANDLER_TRIGGERED;LOW;P1: CFDP fault handler code. P2: CFDP condition code.;mission/cfdp/defs.h
|
||||
|
|
22
eive_tmtc/config/events.py
Normal file
22
eive_tmtc/config/events.py
Normal file
@ -0,0 +1,22 @@
|
||||
import logging
|
||||
import os
|
||||
|
||||
from eive_tmtc import EIVE_TMTC_ROOT
|
||||
from tmtccmd.fsfw import parse_fsfw_events_csv
|
||||
from tmtccmd.pus.s5_fsfw_event import EventDictT
|
||||
|
||||
DEFAULT_EVENTS_CSV_PATH = EIVE_TMTC_ROOT / "config/events.csv"
|
||||
__EVENT_DICT = None
|
||||
|
||||
|
||||
def get_event_dict() -> EventDictT:
|
||||
global __EVENT_DICT
|
||||
if __EVENT_DICT is None:
|
||||
if os.path.exists(DEFAULT_EVENTS_CSV_PATH):
|
||||
__EVENT_DICT = parse_fsfw_events_csv(DEFAULT_EVENTS_CSV_PATH)
|
||||
else:
|
||||
logging.getLogger(__name__).warning(
|
||||
f"No Event CSV file found at {DEFAULT_EVENTS_CSV_PATH}"
|
||||
)
|
||||
__EVENT_DICT = dict()
|
||||
return __EVENT_DICT
|
@ -1,33 +0,0 @@
|
||||
"""
|
||||
@brief This file transfers definitions of global variables to the user.
|
||||
@details Template configuration file. Copy this folder to the TMTC commander root and adapt
|
||||
it to your needs.
|
||||
"""
|
||||
|
||||
import enum
|
||||
import argparse
|
||||
|
||||
|
||||
# All globals can be added here and will be part of a globals dictionary.
|
||||
from config.definitions import CustomServiceList, PUS_APID
|
||||
from config.custom_mode_op import CustomModeList
|
||||
from tmtccmd.config.definitions import CoreComInterfaces
|
||||
from tmtccmd.config.globals import set_default_globals_pre_args_parsing
|
||||
from tmtccmd.logging import get_console_logger
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
class CustomGlobalIds(enum.Enum):
|
||||
from enum import auto
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def set_globals_pre_args_parsing(gui: bool = False):
|
||||
set_default_globals_pre_args_parsing(
|
||||
gui=gui,
|
||||
tc_apid=PUS_APID,
|
||||
tm_apid=PUS_APID,
|
||||
com_if_id=CoreComInterfaces.TCPIP_UDP.value,
|
||||
)
|
@ -1,33 +1,147 @@
|
||||
from typing import Optional
|
||||
|
||||
from eive_tmtc.config.definitions import SPACE_PACKET_IDS
|
||||
from tmtccmd import TmTcCfgHookBase, CcsdsTmtcBackend
|
||||
from tmtccmd.com_if import ComInterface
|
||||
from tmtccmd.config import TmtcDefinitionWrapper
|
||||
|
||||
from eive_tmtc.config.retvals import get_retval_dict
|
||||
from eive_tmtc.pus_tc.cmd_definitions import get_eive_service_op_code_dict
|
||||
from prompt_toolkit.history import FileHistory
|
||||
from tmtccmd import CcsdsTmtcBackend, HookBase
|
||||
from tmtccmd.com import ComInterface
|
||||
from tmtccmd.config import CmdTreeNode
|
||||
from tmtccmd.config.hook import History
|
||||
from tmtccmd.util import ObjectIdDictT, RetvalDictT
|
||||
|
||||
from eive_tmtc.config.definitions import SPACE_PACKET_IDS
|
||||
from eive_tmtc.config.retvals import get_retval_dict
|
||||
from eive_tmtc.tmtc.acs.acs_board import create_acs_board_node
|
||||
from eive_tmtc.tmtc.acs.acs_ctrl import create_acs_ctrl_node
|
||||
from eive_tmtc.tmtc.acs.gps import create_gnss_node
|
||||
from eive_tmtc.tmtc.acs.gyros import create_gyros_node
|
||||
from eive_tmtc.tmtc.acs.imtq import create_mgt_node
|
||||
from eive_tmtc.tmtc.acs.mgms import create_mgms_node
|
||||
from eive_tmtc.tmtc.acs.reaction_wheels import (
|
||||
create_reaction_wheel_assembly_node,
|
||||
create_reaction_wheels_nodes,
|
||||
)
|
||||
from eive_tmtc.tmtc.acs.star_tracker import create_str_node
|
||||
from eive_tmtc.tmtc.acs.subsystem import create_acs_subsystem_node
|
||||
from eive_tmtc.tmtc.com.ccsds_handler import create_ccsds_node
|
||||
from eive_tmtc.tmtc.com.subsystem import create_com_subsystem_node
|
||||
from eive_tmtc.tmtc.com.syrlinks_handler import create_syrlinks_node
|
||||
from eive_tmtc.tmtc.core import create_core_node
|
||||
from eive_tmtc.tmtc.health import create_global_health_node
|
||||
from eive_tmtc.tmtc.payload.ploc_mpsoc import create_ploc_mpsoc_node
|
||||
from eive_tmtc.tmtc.payload.ploc_supervisor import create_ploc_supv_node
|
||||
from eive_tmtc.tmtc.payload.plpcdu import create_pl_pcdu_node
|
||||
from eive_tmtc.tmtc.payload.scex import create_scex_node
|
||||
from eive_tmtc.tmtc.payload.subsystem import create_payload_subsystem_node
|
||||
from eive_tmtc.tmtc.power.acu import create_acu_node
|
||||
from eive_tmtc.tmtc.power.bpx_batt import create_bpx_batt_node
|
||||
from eive_tmtc.tmtc.power.p60dock import create_p60_dock_node
|
||||
from eive_tmtc.tmtc.power.pdu1 import create_pdu1_node
|
||||
from eive_tmtc.tmtc.power.pdu2 import create_pdu2_node
|
||||
from eive_tmtc.tmtc.power.power import create_power_node
|
||||
from eive_tmtc.tmtc.power.pwr_ctrl import create_pwr_ctrl_node
|
||||
from eive_tmtc.tmtc.power.subsystem import create_eps_subsystem_node
|
||||
from eive_tmtc.tmtc.system import create_system_node
|
||||
from eive_tmtc.tmtc.tcs.ctrl import create_tcs_ctrl_node
|
||||
from eive_tmtc.tmtc.tcs.heater import create_heater_node
|
||||
from eive_tmtc.tmtc.tcs.rtd import create_rtd_node
|
||||
from eive_tmtc.tmtc.tcs.tmp1075 import create_tmp_sens_node
|
||||
from eive_tmtc.tmtc.test import create_test_node
|
||||
from eive_tmtc.tmtc.time import create_time_node
|
||||
from eive_tmtc.tmtc.tm_store import create_persistent_tm_store_node
|
||||
from eive_tmtc.tmtc.wdt import create_wdt_node
|
||||
|
||||
class EiveHookObject(TmTcCfgHookBase):
|
||||
|
||||
class EiveHookObject(HookBase):
|
||||
def __init__(self, json_cfg_path: str):
|
||||
super().__init__(json_cfg_path=json_cfg_path)
|
||||
super().__init__(json_cfg_path)
|
||||
|
||||
def get_tmtc_definitions(self) -> TmtcDefinitionWrapper:
|
||||
return get_eive_service_op_code_dict()
|
||||
|
||||
def assign_communication_interface(self, com_if_key: str) -> Optional[ComInterface]:
|
||||
from tmtccmd.config.com_if import (
|
||||
create_com_interface_default,
|
||||
create_com_interface_cfg_default,
|
||||
def get_command_definitions(self) -> CmdTreeNode:
|
||||
root_node = CmdTreeNode.root_node()
|
||||
acs_node = create_acs_subsystem_node()
|
||||
acs_brd_assy_node = create_acs_board_node()
|
||||
acs_brd_assy_node.add_child(create_mgms_node())
|
||||
acs_brd_assy_node.add_child(create_gyros_node())
|
||||
acs_ctrl = create_acs_ctrl_node()
|
||||
rw_list = create_reaction_wheels_nodes()
|
||||
rws = CmdTreeNode("rws", "Reaction Wheel Devices")
|
||||
for rw in rw_list:
|
||||
rws.add_child(rw)
|
||||
rws.add_child(create_reaction_wheel_assembly_node())
|
||||
star_tracker = create_str_node()
|
||||
star_tracker_img_helper = CmdTreeNode(
|
||||
"str_img_helper", "Star Tracker Image Helper"
|
||||
)
|
||||
star_tracker.add_child(star_tracker_img_helper)
|
||||
gnss_devs = create_gnss_node()
|
||||
|
||||
acs_node.add_child(acs_brd_assy_node)
|
||||
acs_node.add_child(acs_ctrl)
|
||||
acs_node.add_child(rws)
|
||||
acs_node.add_child(create_mgt_node())
|
||||
acs_node.add_child(star_tracker)
|
||||
acs_node.add_child(gnss_devs)
|
||||
|
||||
tcs_node = CmdTreeNode("tcs", "TCS Subsystem")
|
||||
tmp_1075_node = create_tmp_sens_node()
|
||||
rtds_node = create_rtd_node()
|
||||
heaters_node = create_heater_node()
|
||||
tcs_ctrl = create_tcs_ctrl_node()
|
||||
tcs_node.add_child(rtds_node)
|
||||
tcs_node.add_child(tmp_1075_node)
|
||||
tcs_node.add_child(tcs_ctrl)
|
||||
tcs_node.add_child(heaters_node)
|
||||
tcs_brd_assy = CmdTreeNode("tcs_brd_assy", "TCS Board Assembly")
|
||||
tcs_node.add_child(tcs_brd_assy)
|
||||
|
||||
com_node = create_com_subsystem_node()
|
||||
com_node.add_child(create_syrlinks_node())
|
||||
com_node.add_child(create_ccsds_node())
|
||||
|
||||
eps_node = create_eps_subsystem_node()
|
||||
eps_node.add_child(create_pwr_ctrl_node())
|
||||
eps_node.add_child(create_power_node())
|
||||
eps_node.add_child(create_acu_node())
|
||||
eps_node.add_child(create_pdu1_node())
|
||||
eps_node.add_child(create_pdu2_node())
|
||||
eps_node.add_child(create_p60_dock_node())
|
||||
eps_node.add_child(create_bpx_batt_node())
|
||||
|
||||
payload_node = create_payload_subsystem_node()
|
||||
payload_node.add_child(create_pl_pcdu_node())
|
||||
payload_node.add_child(create_scex_node())
|
||||
payload_node.add_child(create_ploc_mpsoc_node())
|
||||
payload_node.add_child(create_ploc_supv_node())
|
||||
|
||||
obdh_node = CmdTreeNode("obdh", "OBDH Subsystem")
|
||||
obdh_node.add_child(create_wdt_node())
|
||||
obdh_node.add_child(create_core_node())
|
||||
obdh_node.add_child(create_time_node())
|
||||
obdh_node.add_child(create_persistent_tm_store_node())
|
||||
|
||||
root_node.add_child(create_test_node())
|
||||
root_node.add_child(create_system_node())
|
||||
root_node.add_child(create_global_health_node())
|
||||
root_node.add_child(acs_node)
|
||||
root_node.add_child(tcs_node)
|
||||
root_node.add_child(com_node)
|
||||
root_node.add_child(eps_node)
|
||||
root_node.add_child(payload_node)
|
||||
root_node.add_child(obdh_node)
|
||||
return root_node
|
||||
|
||||
def get_communication_interface(self, com_if_key: str) -> Optional[ComInterface]:
|
||||
from tmtccmd.config.com import (
|
||||
create_com_interface_cfg_default,
|
||||
create_com_interface_default,
|
||||
)
|
||||
|
||||
assert self.cfg_path is not None
|
||||
|
||||
cfg = create_com_interface_cfg_default(
|
||||
com_if_key=com_if_key,
|
||||
json_cfg_path=self.cfg_path,
|
||||
space_packet_ids=SPACE_PACKET_IDS,
|
||||
)
|
||||
assert cfg is not None
|
||||
return create_com_interface_default(cfg)
|
||||
|
||||
def perform_mode_operation(self, tmtc_backend: CcsdsTmtcBackend, mode: int):
|
||||
@ -42,3 +156,6 @@ class EiveHookObject(TmTcCfgHookBase):
|
||||
|
||||
def get_retval_dict(self) -> RetvalDictT:
|
||||
return get_retval_dict()
|
||||
|
||||
def get_cmd_history(self) -> Optional[History]:
|
||||
return FileHistory(".tmtc-history.txt")
|
||||
|
@ -3,19 +3,23 @@
|
||||
@details Template configuration file. Copy this folder to the TMTC commander root and adapt
|
||||
it to your needs.
|
||||
"""
|
||||
|
||||
import logging
|
||||
import os.path
|
||||
from tmtccmd.util.obj_id import ObjectIdDictT
|
||||
from typing import Dict
|
||||
|
||||
from eive_tmtc import EIVE_TMTC_ROOT
|
||||
from tmtccmd.util.obj_id import ObjectIdU32
|
||||
from tmtccmd.fsfw import parse_fsfw_objects_csv
|
||||
from tmtccmd.logging import get_console_logger
|
||||
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
DEFAULT_OBJECTS_CSV_PATH = "config/objects.csv"
|
||||
DEFAULT_OBJECTS_CSV_PATH = EIVE_TMTC_ROOT / "config/objects.csv"
|
||||
__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])
|
||||
@ -28,9 +32,12 @@ SCEX_HANDLER_ID = bytes([0x44, 0x33, 0x00, 0x32])
|
||||
|
||||
# Thermal Object IDs
|
||||
THERMAL_CONTROLLER_ID = bytes([0x43, 0x40, 0x00, 0x01])
|
||||
HEATER_ID = bytes([0x44, 0x41, 0x00, 0xA4])
|
||||
TMP_1075_1_HANDLER_ID = bytes([0x44, 0x42, 0x00, 0x04])
|
||||
TMP_1075_2_HANDLER_ID = bytes([0x44, 0x42, 0x00, 0x05])
|
||||
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
|
||||
SYRLINKS_HANDLER_ID = bytes([0x44, 0x53, 0x00, 0xA3])
|
||||
@ -45,6 +52,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])
|
||||
@ -67,14 +77,14 @@ PLOC_MPSOC_ID = bytes([0x44, 0x33, 0x00, 0x15])
|
||||
PL_PCDU_ID = bytes([0x44, 0x30, 0x00, 0x00])
|
||||
|
||||
# Other
|
||||
HEATER_0_OBC_BRD = bytes([0x60, 0x00, 0x00, 0x00])
|
||||
HEATER_1_PLOC_PROC_BRD = bytes([0x60, 0x00, 0x00, 0x01])
|
||||
HEATER_0_PLOC_PROC_BRD = bytes([0x60, 0x00, 0x00, 0x00])
|
||||
HEATER_1_PCDU_BRD = bytes([0x60, 0x00, 0x00, 0x01])
|
||||
HEATER_2_ACS_BRD = bytes([0x60, 0x00, 0x00, 0x02])
|
||||
HEATER_3_PCDU_BRD = bytes([0x60, 0x00, 0x00, 0x03])
|
||||
HEATER_3_OBC_BRD = bytes([0x60, 0x00, 0x00, 0x03])
|
||||
HEATER_4_CAMERA = bytes([0x60, 0x00, 0x00, 0x04])
|
||||
HEATER_5_STR = bytes([0x60, 0x00, 0x00, 0x05])
|
||||
HEATER_6_DRO = bytes([0x60, 0x00, 0x00, 0x06])
|
||||
HEATER_7_HPA = bytes([0x60, 0x00, 0x00, 0x07])
|
||||
HEATER_7_SYRLINKS = bytes([0x60, 0x00, 0x00, 0x07])
|
||||
|
||||
# RTDs
|
||||
RTD_0_PLOC_HSPD = bytes([0x44, 0x42, 0x00, 0x16])
|
||||
@ -122,23 +132,54 @@ SUS_5_N_LOC_XFYMZB_PT_ZB = bytes([0x44, 0x12, 0x00, 0x37])
|
||||
SUS_11_R_LOC_XBYMZB_PT_ZB = bytes([0x44, 0x12, 0x00, 0x43])
|
||||
|
||||
# System and Assembly Objects
|
||||
EIVE_SYSTEM_ID = bytes([0x73, 0x01, 0x00, 0x00])
|
||||
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])
|
||||
SUS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x02])
|
||||
TCS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x03])
|
||||
SUS_BOARD_ASS_ID = bytes([0x73, 0x00, 0x00, 0x02])
|
||||
IMTQ_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x08])
|
||||
|
||||
ACS_BOARD_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x01])
|
||||
SUS_BOARD_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x02])
|
||||
TCS_BOARD_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x03])
|
||||
RW_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x04])
|
||||
CAM_SWITCHER = bytes([0x73, 0x00, 0x00, 0x06])
|
||||
SYRLINKS_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x07])
|
||||
# To be removed soon..
|
||||
MGT_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x08])
|
||||
STR_ASSEMBLY = bytes([0x73, 0x00, 0x00, 0x09])
|
||||
|
||||
# Controllers
|
||||
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])
|
||||
NOT_OK_TM_STORE = bytes([0x73, 0x02, 0x00, 0x03])
|
||||
HK_TM_STORE = bytes([0x73, 0x02, 0x00, 0x04])
|
||||
CFDP_TM_STORE = bytes([0x73, 0x03, 0x00, 0x00])
|
||||
|
||||
|
||||
def get_object_ids() -> ObjectIdDictT:
|
||||
SUPV_FILTER_SET = [PLOC_SUPV_ID, PDU_2_HANDLER_ID, PDU_1_HANDLER_ID]
|
||||
|
||||
ObjectIdDict = Dict[bytes, ObjectIdU32]
|
||||
|
||||
|
||||
def get_object_ids() -> ObjectIdDict:
|
||||
global __OBJECT_ID_DICT
|
||||
if not os.path.exists(DEFAULT_OBJECTS_CSV_PATH):
|
||||
LOGGER.warning(f"No Objects CSV file found at {DEFAULT_OBJECTS_CSV_PATH}")
|
||||
logging.getLogger(__name__).warning(
|
||||
f"No Objects CSV file found at {DEFAULT_OBJECTS_CSV_PATH}"
|
||||
)
|
||||
if __OBJECT_ID_DICT is None:
|
||||
if os.path.exists(DEFAULT_OBJECTS_CSV_PATH):
|
||||
__OBJECT_ID_DICT = parse_fsfw_objects_csv(csv_file=DEFAULT_OBJECTS_CSV_PATH)
|
||||
|
@ -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,9 @@
|
||||
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
|
||||
0x44250000;P60DOCK_HANDLER
|
||||
@ -40,13 +45,18 @@
|
||||
0x443200A5;RAD_SENSOR
|
||||
0x44330000;PLOC_UPDATER
|
||||
0x44330001;PLOC_MEMORY_DUMPER
|
||||
0x44330002;STR_HELPER
|
||||
0x44330002;STR_COM_IF
|
||||
0x44330003;PLOC_MPSOC_HELPER
|
||||
0x44330004;AXI_PTME_CONFIG
|
||||
0x44330005;PTME_CONFIG
|
||||
0x44330006;PTME_VC0_LIVE_TM
|
||||
0x44330007;PTME_VC1_LOG_TM
|
||||
0x44330008;PTME_VC2_HK_TM
|
||||
0x44330009;PTME_VC3_CFDP_TM
|
||||
0x44330015;PLOC_MPSOC_HANDLER
|
||||
0x44330016;PLOC_SUPERVISOR_HANDLER
|
||||
0x44330017;PLOC_SUPERVISOR_HELPER
|
||||
0x44330018;PLOC_MPSOC_COMMUNICATION
|
||||
0x44330032;SCEX
|
||||
0x444100A2;SOLAR_ARRAY_DEPL_HANDLER
|
||||
0x444100A4;HEATER_HANDLER
|
||||
@ -55,7 +65,6 @@
|
||||
0x44420006;TMP1075_HANDLER_PLPCDU_0
|
||||
0x44420007;TMP1075_HANDLER_PLPCDU_1
|
||||
0x44420008;TMP1075_HANDLER_IF_BOARD
|
||||
0x44420009;TMP1075_HANDLER_OBC_IF_BOARD
|
||||
0x44420016;RTD_0_IC3_PLOC_HEATSPREADER
|
||||
0x44420017;RTD_1_IC4_PLOC_MISSIONBOARD
|
||||
0x44420018;RTD_2_IC5_4K_CAMERA
|
||||
@ -72,20 +81,25 @@
|
||||
0x44420029;RTD_13_IC16_PLPCDU_HEATSPREADER
|
||||
0x44420030;RTD_14_IC17_TCS_BOARD
|
||||
0x44420031;RTD_15_IC18_IMTQ
|
||||
0x445300A3;SYRLINKS_HK_HANDLER
|
||||
0x445300A3;SYRLINKS_HANDLER
|
||||
0x445300A4;SYRLINKS_COM_HANDLER
|
||||
0x49000000;ARDUINO_COM_IF
|
||||
0x49010005;GPIO_IF
|
||||
0x49010006;SCEX_UART_READER
|
||||
0x49020004;SPI_MAIN_COM_IF
|
||||
0x49020005;SPI_RW_COM_IF
|
||||
0x49020006;SPI_RTD_COM_IF
|
||||
0x49030003;UART_COM_IF
|
||||
0x49040002;I2C_COM_IF
|
||||
0x49050001;CSP_COM_IF
|
||||
0x49060004;ACS_BOARD_POLLING_TASK
|
||||
0x49060005;RW_POLLING_TASK
|
||||
0x49060006;SPI_RTD_COM_IF
|
||||
0x49060007;SUS_POLLING_TASK
|
||||
0x50000100;CCSDS_PACKET_DISTRIBUTOR
|
||||
0x50000200;PUS_PACKET_DISTRIBUTOR
|
||||
0x50000300;TMTC_BRIDGE
|
||||
0x50000400;TMTC_POLLING_TASK
|
||||
0x50000300;TCP_TMTC_SERVER
|
||||
0x50000301;UDP_TMTC_SERVER
|
||||
0x50000400;TCP_TMTC_POLLING_TASK
|
||||
0x50000401;UDP_TMTC_POLLING_TASK
|
||||
0x50000500;FILE_SYSTEM_HANDLER
|
||||
0x50000550;SDC_MANAGER
|
||||
0x50000600;PTME
|
||||
@ -100,6 +114,7 @@
|
||||
0x53000008;PUS_SERVICE_8_FUNCTION_MGMT
|
||||
0x53000009;PUS_SERVICE_9_TIME_MGMT
|
||||
0x53000011;PUS_SERVICE_11_TC_SCHEDULER
|
||||
0x53000015;PUS_SERVICE_15_TM_STORAGE
|
||||
0x53000017;PUS_SERVICE_17_TEST
|
||||
0x53000020;PUS_SERVICE_20_PARAMETERS
|
||||
0x53000200;PUS_SERVICE_200_MODE_MGMT
|
||||
@ -130,19 +145,36 @@
|
||||
0x60000004;HEATER_4_CAMERA
|
||||
0x60000005;HEATER_5_STR
|
||||
0x60000006;HEATER_6_DRO
|
||||
0x60000007;HEATER_7_HPA
|
||||
0x60000007;HEATER_7_SYRLINKS
|
||||
0x73000001;ACS_BOARD_ASS
|
||||
0x73000002;SUS_BOARD_ASS
|
||||
0x73000003;TCS_BOARD_ASS
|
||||
0x73000004;RW_ASS
|
||||
0x73000004;RW_ASSY
|
||||
0x73000006;CAM_SWITCHER
|
||||
0x73000007;SYRLINKS_ASSY
|
||||
0x73000008;IMTQ_ASSY
|
||||
0x73000009;STR_ASSY
|
||||
0x73000100;TM_FUNNEL
|
||||
0x73000101;PUS_TM_FUNNEL
|
||||
0x73000102;CFDP_TM_FUNNEL
|
||||
0x73000205;CFDP_HANDLER
|
||||
0x73000206;CFDP_DISTRIBUTOR
|
||||
0x73000207;CFDP_FAULT_HANDLER
|
||||
0x73010000;EIVE_SYSTEM
|
||||
0x73010001;ACS_SUBSYSTEM
|
||||
0x73010002;PL_SUBSYSTEM
|
||||
0x73500000;CCSDS_IP_CORE_BRIDGE
|
||||
0x73010003;TCS_SUBSYSTEM
|
||||
0x73010004;COM_SUBSYSTEM
|
||||
0x73010005;EPS_SUBSYSTEM
|
||||
0x73020001;MISC_TM_STORE
|
||||
0x73020002;OK_TM_STORE
|
||||
0x73020003;NOT_OK_TM_STORE
|
||||
0x73020004;HK_TM_STORE
|
||||
0x73030000;CFDP_TM_STORE
|
||||
0x73040000;LIVE_TM_TASK
|
||||
0x73040001;LOG_STORE_AND_TM_TASK
|
||||
0x73040002;HK_STORE_AND_TM_TASK
|
||||
0x73040003;CFDP_STORE_AND_TM_TASK
|
||||
0x73040004;DOWNLINK_RAM_STORE
|
||||
0x90000003;THERMAL_TEMP_INSERTER
|
||||
0xFFFFFFFF;NO_OBJECT
|
||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,10 +1,11 @@
|
||||
import os
|
||||
from tmtccmd.fsfw import parse_fsfw_returnvalues_csv, RetvalDictT
|
||||
from tmtccmd.logging import get_console_logger
|
||||
import logging
|
||||
|
||||
DEFAULT_RETVAL_CSV_NAME = "config/returnvalues.csv"
|
||||
from eive_tmtc import EIVE_TMTC_ROOT
|
||||
from tmtccmd.fsfw import parse_fsfw_returnvalues_csv, RetvalDictT
|
||||
|
||||
DEFAULT_RETVAL_CSV_NAME = EIVE_TMTC_ROOT / "config/returnvalues.csv"
|
||||
__RETVAL_DICT = None
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
def get_retval_dict() -> RetvalDictT:
|
||||
@ -15,7 +16,7 @@ def get_retval_dict() -> RetvalDictT:
|
||||
csv_file=DEFAULT_RETVAL_CSV_NAME
|
||||
)
|
||||
else:
|
||||
LOGGER.warning(
|
||||
logging.getLogger(__name__).warning(
|
||||
f"No Return Value CSV file found at {DEFAULT_RETVAL_CSV_NAME}"
|
||||
)
|
||||
__RETVAL_DICT = dict()
|
||||
|
64
eive_tmtc/config/subsystems.csv
Normal file
64
eive_tmtc/config/subsystems.csv
Normal file
@ -0,0 +1,64 @@
|
||||
22;MEMORY
|
||||
26;OBSW
|
||||
28;CDH
|
||||
59;TCS_1
|
||||
42;PCDU_1
|
||||
43;POWER_SWITCH_IF
|
||||
50;HEATER
|
||||
52;T_SENSORS
|
||||
70;FDIR
|
||||
71;FDIR_1
|
||||
72;FDIR_2
|
||||
73;HK
|
||||
74;SYSTEM_MANAGER
|
||||
75;SYSTEM_MANAGER_1
|
||||
76;TMTC_DISTRIBUTION
|
||||
79;SYSTEM_1
|
||||
80;PUS_SERVICE_1
|
||||
82;PUS_SERVICE_2
|
||||
83;PUS_SERVICE_3
|
||||
85;PUS_SERVICE_5
|
||||
86;PUS_SERVICE_6
|
||||
88;PUS_SERVICE_8
|
||||
89;PUS_SERVICE_9
|
||||
91;PUS_SERVICE_11
|
||||
97;PUS_SERVICE_17
|
||||
103;PUS_SERVICE_23
|
||||
106;MGM_LIS3MDL
|
||||
107;MGM_RM3100
|
||||
108;CFDP
|
||||
112;ACS_SUBSYSTEM
|
||||
113;PCDU_HANDLER
|
||||
114;HEATER_HANDLER
|
||||
115;SA_DEPL_HANDLER
|
||||
116;PLOC_MPSOC_HANDLER
|
||||
117;IMTQ_HANDLER
|
||||
118;RW_HANDLER
|
||||
119;STR_HANDLER
|
||||
120;PLOC_SUPERVISOR_HANDLER
|
||||
121;FILE_SYSTEM
|
||||
122;PLOC_UPDATER
|
||||
123;PLOC_MEMORY_DUMPER
|
||||
124;PDEC_HANDLER
|
||||
125;STR_HELPER
|
||||
126;PLOC_MPSOC_HELPER
|
||||
127;PL_PCDU_HANDLER
|
||||
128;ACS_BOARD_ASS
|
||||
129;SUS_BOARD_ASS
|
||||
130;TCS_BOARD_ASS
|
||||
131;GPS_HANDLER
|
||||
132;P60_DOCK_HANDLER
|
||||
133;PDU1_HANDLER
|
||||
134;PDU2_HANDLER
|
||||
135;ACU_HANDLER
|
||||
136;PLOC_SUPV_HELPER
|
||||
137;SYRLINKS
|
||||
138;SCEX_HANDLER
|
||||
139;CONFIGHANDLER
|
||||
140;CORE
|
||||
141;TCS_CONTROLLER
|
||||
142;COM_SUBSYSTEM
|
||||
143;PERSISTENT_TM_STORE
|
||||
144;SYRLINKS_COM
|
||||
145;SUS_HANDLER
|
||||
146;CFDP_APP
|
|
@ -11,12 +11,12 @@ import struct
|
||||
from typing import Union
|
||||
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_8_funccmd import make_fsfw_action_cmd
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||
from tmtccmd.util import ObjectIdU32, ObjectIdBase
|
||||
|
||||
|
||||
class GomspaceDeviceActionIds(enum.IntEnum):
|
||||
class GomspaceDeviceActionId(enum.IntEnum):
|
||||
PING = 1
|
||||
REBOOT = 4
|
||||
PARAM_GET = 0
|
||||
@ -63,8 +63,8 @@ class Channel:
|
||||
|
||||
|
||||
def pack_request_config_command(object_id: bytes) -> PusTelecommand:
|
||||
return make_fsfw_action_cmd(
|
||||
object_id=object_id, action_id=GomspaceDeviceActionIds.REQUEST_CONFIG_TABLE
|
||||
return create_action_cmd(
|
||||
object_id=object_id, action_id=GomspaceDeviceActionId.REQUEST_CONFIG_TABLE
|
||||
)
|
||||
|
||||
|
||||
@ -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.
|
||||
@ -88,9 +90,9 @@ def pack_get_param_command(
|
||||
else:
|
||||
app_data += memory_address
|
||||
app_data += struct.pack("!B", parameter_size)
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id,
|
||||
action_id=GomspaceDeviceActionIds.PARAM_GET,
|
||||
action_id=GomspaceDeviceActionId.PARAM_GET,
|
||||
user_data=app_data,
|
||||
)
|
||||
|
||||
@ -98,12 +100,12 @@ def pack_get_param_command(
|
||||
def pack_set_float_param_command(
|
||||
object_id: bytes, memory_address: bytes, parameter: float
|
||||
) -> PusTelecommand:
|
||||
action_id = GomspaceDeviceActionIds.PARAM_SET
|
||||
action_id = GomspaceDeviceActionId.PARAM_SET
|
||||
app_data = bytearray()
|
||||
app_data += memory_address
|
||||
app_data.append(4)
|
||||
app_data += struct.pack("!f", parameter)
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id, action_id=action_id, user_data=app_data
|
||||
)
|
||||
|
||||
@ -111,12 +113,12 @@ def pack_set_float_param_command(
|
||||
def pack_set_u8_param_command(
|
||||
object_id: bytes, memory_address: bytes, parameter: int
|
||||
) -> PusTelecommand:
|
||||
action_id = GomspaceDeviceActionIds.PARAM_SET
|
||||
action_id = GomspaceDeviceActionId.PARAM_SET
|
||||
app_data = bytearray()
|
||||
app_data += memory_address
|
||||
app_data.append(1)
|
||||
app_data.append(parameter)
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id, action_id=action_id, user_data=app_data
|
||||
)
|
||||
|
||||
@ -124,12 +126,12 @@ def pack_set_u8_param_command(
|
||||
def pack_set_i8_param_command(
|
||||
object_id: bytes, memory_address: bytes, parameter: int
|
||||
) -> PusTelecommand:
|
||||
action_id = GomspaceDeviceActionIds.PARAM_SET
|
||||
action_id = GomspaceDeviceActionId.PARAM_SET
|
||||
app_data = bytearray()
|
||||
app_data += memory_address
|
||||
app_data.append(1)
|
||||
app_data += struct.pack("!b", parameter)
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id, action_id=action_id, user_data=app_data
|
||||
)
|
||||
|
||||
@ -137,12 +139,12 @@ def pack_set_i8_param_command(
|
||||
def pack_set_u16_param_command(
|
||||
object_id: bytes, memory_address: bytes, parameter: int
|
||||
) -> PusTelecommand:
|
||||
action_id = GomspaceDeviceActionIds.PARAM_SET
|
||||
action_id = GomspaceDeviceActionId.PARAM_SET
|
||||
app_data = bytearray()
|
||||
app_data += memory_address
|
||||
app_data.append(2)
|
||||
app_data += struct.pack("!H", parameter)
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id, action_id=action_id, user_data=app_data
|
||||
)
|
||||
|
||||
@ -150,34 +152,34 @@ def pack_set_u16_param_command(
|
||||
def pack_set_i16_param_command(
|
||||
object_id: bytes, memory_address: bytes, parameter: int
|
||||
) -> PusTelecommand:
|
||||
action_id = GomspaceDeviceActionIds.PARAM_SET
|
||||
action_id = GomspaceDeviceActionId.PARAM_SET
|
||||
app_data = bytearray()
|
||||
app_data += memory_address
|
||||
app_data.append(2)
|
||||
app_data += struct.pack("!h", parameter)
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id, action_id=action_id, user_data=app_data
|
||||
)
|
||||
|
||||
|
||||
def pack_set_u32_param_command(object_id: bytes, memory_address: bytes, parameter: int):
|
||||
action_id = GomspaceDeviceActionIds.PARAM_SET
|
||||
action_id = GomspaceDeviceActionId.PARAM_SET
|
||||
app_data = bytearray()
|
||||
app_data += memory_address
|
||||
app_data.append(4)
|
||||
app_data += struct.pack("!I", parameter)
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id, action_id=action_id, user_data=app_data
|
||||
)
|
||||
|
||||
|
||||
def pack_set_i32_param_command(object_id: bytes, memory_address: bytes, parameter: int):
|
||||
action_id = GomspaceDeviceActionIds.PARAM_SET
|
||||
action_id = GomspaceDeviceActionId.PARAM_SET
|
||||
app_data = bytearray()
|
||||
app_data += memory_address
|
||||
app_data.append(4)
|
||||
app_data += struct.pack("!i", parameter)
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id, action_id=action_id, user_data=app_data
|
||||
)
|
||||
|
||||
@ -218,15 +220,15 @@ 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.
|
||||
"""
|
||||
return make_fsfw_action_cmd(
|
||||
return create_action_cmd(
|
||||
object_id=object_id.as_bytes,
|
||||
action_id=GomspaceDeviceActionIds.PING,
|
||||
action_id=GomspaceDeviceActionId.PING,
|
||||
user_data=data,
|
||||
)
|
||||
|
||||
@ -235,8 +237,8 @@ def pack_gnd_wdt_reset_command(object_id: ObjectIdBase) -> PusTelecommand:
|
||||
""" " Function to generate the command to reset the watchdog of a gomspace device.
|
||||
@param object_id Object Id of the gomspace device handler.
|
||||
"""
|
||||
return make_fsfw_action_cmd(
|
||||
object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.WDT_RESET
|
||||
return create_action_cmd(
|
||||
object_id=object_id.as_bytes, action_id=GomspaceDeviceActionId.WDT_RESET
|
||||
)
|
||||
|
||||
|
||||
@ -244,8 +246,8 @@ def pack_reboot_command(object_id: ObjectIdU32) -> PusTelecommand:
|
||||
"""Function to generate the command which triggers a reboot of a gomspace device
|
||||
@param object_id The object id of the gomspace device handler.
|
||||
"""
|
||||
return make_fsfw_action_cmd(
|
||||
object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.REBOOT
|
||||
return create_action_cmd(
|
||||
object_id=object_id.as_bytes, action_id=GomspaceDeviceActionId.REBOOT
|
||||
)
|
||||
|
||||
|
||||
@ -254,6 +256,6 @@ def pack_request_full_hk_table_command(object_id: ObjectIdU32) -> PusTelecommand
|
||||
device.
|
||||
@param object_id The object id of the gomspace device handler.
|
||||
"""
|
||||
return make_fsfw_action_cmd(
|
||||
object_id=object_id.as_bytes, action_id=GomspaceDeviceActionIds.REQUEST_HK_TABLE
|
||||
return create_action_cmd(
|
||||
object_id=object_id.as_bytes, action_id=GomspaceDeviceActionId.REQUEST_HK_TABLE
|
||||
)
|
||||
|
@ -1,174 +0,0 @@
|
||||
from eive_tmtc.pus_tc.devs.bpx_batt import BpxOpCodes
|
||||
|
||||
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
|
||||
|
||||
|
||||
def get_eive_service_op_code_dict() -> TmtcDefinitionWrapper:
|
||||
"""Call all registered TMTC definition providers. They were registered using
|
||||
the :py:func:`tmtc_definitions_provider` decorator.
|
||||
"""
|
||||
def_wrapper = get_default_tmtc_defs()
|
||||
srv_5 = OpCodeEntry()
|
||||
srv_5.add("0", "Event Test")
|
||||
def_wrapper.add_service(
|
||||
name=CoreServiceList.SERVICE_5.value,
|
||||
info="PUS Service 5 Event",
|
||||
op_code_entry=srv_5,
|
||||
)
|
||||
call_all_definitions_providers(def_wrapper)
|
||||
return def_wrapper
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_tmp_sens_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add("0", "TMP1075 Tests")
|
||||
defs.add_service(CustomServiceList.TMP1075_1.value, "TMP1075 1", oce)
|
||||
defs.add_service(CustomServiceList.TMP1075_2.value, "TMP1075 2", oce)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_pdec_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add("0", "PDEC Handler: Print CLCW")
|
||||
oce.add("1", "PDEC Handler: Print PDEC monitor")
|
||||
defs.add_service(CustomServiceList.PDEC_HANDLER.value, "PDEC Handler", oce)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_ccsds_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add("0", "CCSDS Handler: Set low rate")
|
||||
oce.add("1", "CCSDS Handler: Set high rate")
|
||||
oce.add("2", "CCSDS Handler: Enable transmitter")
|
||||
oce.add("3", "CCSDS Handler: Disable transmitter")
|
||||
oce.add("4", "CCSDS Handler: Set arbitrary bitrate")
|
||||
oce.add("5", "CCSDS Handler: Enable tx clock manipulator")
|
||||
oce.add("6", "CCSDS Handler: Disable tx clock manipulator")
|
||||
oce.add("7", "CCSDS Handler: Update tx data on rising edge")
|
||||
oce.add("8", "CCSDS Handler: Update tx data on falling edge")
|
||||
defs.add_service(CustomServiceList.CCSDS_HANDLER.value, "CCSDS Handler", oce)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_str_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add("0", "Star Tracker: Mode On, Submode Bootloader")
|
||||
oce.add("1", "Star Tracker: Mode On, Submode Firmware")
|
||||
oce.add("2", "Star Tracker: Mode Normal")
|
||||
oce.add("3", "Star Tracker: Mode Off")
|
||||
oce.add("4", "Star Tracker: Mode Raw")
|
||||
oce.add("5", "Star Tracker: Ping")
|
||||
oce.add("6", "Star Tracker: Switch to bootloader program")
|
||||
oce.add("7", "Star Tracker: Request temperature")
|
||||
oce.add("8", "Star Tracker: Request version")
|
||||
oce.add("9", "Star Tracker: Request interface")
|
||||
oce.add("10", "Star Tracker: Request power")
|
||||
oce.add("11", "Star Tracker: Set subscription parameters")
|
||||
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")
|
||||
oce.add("18", "Star Tracker: Set tracking parameters")
|
||||
oce.add("19", "Star Tracker: Set mounting parameters")
|
||||
oce.add("20", "Star Tracker: Set camera parameters")
|
||||
oce.add("22", "Star Tracker: Set centroiding parameters")
|
||||
oce.add("23", "Star Tracker: Set LISA parameters")
|
||||
oce.add("24", "Star Tracker: Set matching parameters")
|
||||
oce.add("25", "Star Tracker: Set validation parameters")
|
||||
oce.add("26", "Star Tracker: Set algo parameters")
|
||||
oce.add("27", "Star Tracker: Take image")
|
||||
oce.add("28", "Star Tracker: Stop str helper")
|
||||
oce.add("30", "Star Tracker: Set name of download image")
|
||||
oce.add("31", "Star Tracker: Request histogram")
|
||||
oce.add("32", "Star Tracker: Request contrast")
|
||||
oce.add("33", "Star Tracker: Set json filename")
|
||||
oce.add("35", "Star Tracker: Flash read")
|
||||
oce.add("36", "Star Tracker: Set flash read filename")
|
||||
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")
|
||||
oce.add("55", "Star Tracker: Request mounting parameters")
|
||||
oce.add("56", "Star Tracker: Request image processor parameters")
|
||||
oce.add("57", "Star Tracker: Request centroiding parameters")
|
||||
oce.add("58", "Star Tracker: Request lisa parameters")
|
||||
oce.add("59", "Star Tracker: Request matching parameters")
|
||||
oce.add("60", "Star Tracker: Request tracking parameters")
|
||||
oce.add("61", "Star Tracker: Request validation parameters")
|
||||
oce.add("62", "Star Tracker: Request algo parameters")
|
||||
oce.add("63", "Star Tracker: Request subscription parameters")
|
||||
oce.add("64", "Star Tracker: Request log subscription parameters")
|
||||
oce.add("65", "Star Tracker: Request debug camera parameters")
|
||||
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("70", "Star Tracker: Disable timestamp generation")
|
||||
oce.add("71", "Star Tracker: Enable timestamp generation")
|
||||
defs.add_service(CustomServiceList.STAR_TRACKER.value, "Star Tracker", oce)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_bpx_cmd_definitions(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(keys=BpxOpCodes.HK, info="Request BPX HK")
|
||||
oce.add(keys=BpxOpCodes.RST_BOOT_CNT, info="Reset Boot Count")
|
||||
oce.add(keys=BpxOpCodes.REQUEST_CFG, info="Request Configuration Struct (Step 1)")
|
||||
oce.add(
|
||||
keys=BpxOpCodes.REQUEST_CFG_HK, info="Request Configuration Struct HK (Step 2)"
|
||||
)
|
||||
oce.add(keys=BpxOpCodes.REBOOT, info="Reboot Command")
|
||||
defs.add_service(
|
||||
name=CustomServiceList.BPX_BATTERY.value,
|
||||
info="BPX Battery Handler",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_time_cmds(defs: TmtcDefinitionWrapper):
|
||||
from eive_tmtc.pus_tc.system.time import OpCodes, Info
|
||||
|
||||
oce = OpCodeEntry()
|
||||
oce.add(
|
||||
keys=OpCodes.SET_CURRENT_TIME,
|
||||
info=Info.SET_CURRENT_TIME,
|
||||
)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.TIME.value,
|
||||
info="Time Service",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_system_cmds(defs: TmtcDefinitionWrapper):
|
||||
import eive_tmtc.pus_tc.system.controllers as controllers
|
||||
|
||||
oce = OpCodeEntry()
|
||||
oce.add(
|
||||
keys=controllers.OpCodes.THERMAL_CONTROLLER,
|
||||
info=controllers.Info.THERMAL_CONTROLLER,
|
||||
)
|
||||
oce.add(
|
||||
keys=controllers.OpCodes.CORE_CONTROLLER,
|
||||
info=controllers.Info.CORE_CONTROLLER,
|
||||
)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.CONTROLLERS.value,
|
||||
info="Controllers",
|
||||
op_code_entry=oce,
|
||||
)
|
309
eive_tmtc/pus_tc/cmd_demux.py
Normal file
309
eive_tmtc/pus_tc/cmd_demux.py
Normal file
@ -0,0 +1,309 @@
|
||||
"""Hook function which packs telecommands based on service and operation code string
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import List, cast
|
||||
|
||||
from tmtccmd import TreeCommandingProcedure
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
import eive_tmtc.config.object_ids as oids
|
||||
from eive_tmtc.config.object_ids import (
|
||||
ACU_HANDLER_ID,
|
||||
CCSDS_HANDLER_ID,
|
||||
HEATER_CONTROLLER_ID,
|
||||
IMTQ_HANDLER_ID,
|
||||
P60_DOCK_HANDLER,
|
||||
PDEC_HANDLER_ID,
|
||||
PDU_1_HANDLER_ID,
|
||||
PDU_2_HANDLER_ID,
|
||||
RAD_SENSOR_ID,
|
||||
RW1_ID,
|
||||
RW2_ID,
|
||||
RW3_ID,
|
||||
RW4_ID,
|
||||
RW_ASSEMBLY,
|
||||
STAR_TRACKER_ID,
|
||||
STR_IMG_HELPER_ID,
|
||||
SYRLINKS_HANDLER_ID,
|
||||
TMP1075_HANDLER_IF_BRD_ID,
|
||||
TMP1075_HANDLER_PLPCDU_0_ID,
|
||||
TMP1075_HANDLER_TCS_BRD_0_ID,
|
||||
TMP1075_HANDLER_TCS_BRD_1_ID,
|
||||
get_object_ids,
|
||||
)
|
||||
from eive_tmtc.tmtc.acs.acs_board import pack_acs_board_command
|
||||
from eive_tmtc.tmtc.acs.acs_ctrl import pack_acs_ctrl_command
|
||||
from eive_tmtc.tmtc.acs.gps import pack_gps_command
|
||||
from eive_tmtc.tmtc.acs.gyros import handle_gyr_cmd
|
||||
from eive_tmtc.tmtc.acs.imtq import create_imtq_command
|
||||
from eive_tmtc.tmtc.acs.mgms import handle_mgm_cmd
|
||||
from eive_tmtc.tmtc.acs.reaction_wheels import (
|
||||
create_single_rw_cmd,
|
||||
pack_rw_ass_cmds,
|
||||
)
|
||||
from eive_tmtc.tmtc.acs.star_tracker import pack_star_tracker_commands
|
||||
from eive_tmtc.tmtc.acs.str_img_helper import pack_str_img_helper_command
|
||||
from eive_tmtc.tmtc.acs.subsystem import build_acs_subsystem_cmd
|
||||
from eive_tmtc.tmtc.com.ccsds_handler import pack_ccsds_handler_command
|
||||
from eive_tmtc.tmtc.com.pdec_handler import pack_pdec_handler_commands
|
||||
from eive_tmtc.tmtc.com.subsystem import build_com_subsystem_procedure
|
||||
from eive_tmtc.tmtc.com.syrlinks_handler import pack_syrlinks_command
|
||||
from eive_tmtc.tmtc.core import pack_core_commands
|
||||
from eive_tmtc.tmtc.health import build_health_cmds
|
||||
from eive_tmtc.tmtc.payload.subsystem import create_payload_subsystem_cmd
|
||||
from eive_tmtc.tmtc.payload.ploc_mpsoc import pack_ploc_mpsoc_commands
|
||||
from eive_tmtc.tmtc.payload.ploc_supervisor import pack_ploc_supv_commands
|
||||
from eive_tmtc.tmtc.payload.plpcdu import pack_pl_pcdu_commands
|
||||
from eive_tmtc.tmtc.payload.rad_sensor import create_rad_sensor_cmd
|
||||
from eive_tmtc.tmtc.payload.scex import pack_scex_cmds
|
||||
from eive_tmtc.tmtc.power.acu import pack_acu_commands
|
||||
from eive_tmtc.tmtc.power.p60dock import pack_p60dock_cmds
|
||||
from eive_tmtc.tmtc.power.pdu1 import pack_pdu1_commands
|
||||
from eive_tmtc.tmtc.power.pdu2 import pack_pdu2_commands
|
||||
from eive_tmtc.tmtc.power.power import pack_power_commands
|
||||
from eive_tmtc.tmtc.power.pwr_ctrl import pack_power_ctrl_command
|
||||
from eive_tmtc.tmtc.system import build_system_cmds
|
||||
from eive_tmtc.tmtc.tcs.ctrl import pack_tcs_ctrl_commands
|
||||
from eive_tmtc.tmtc.tcs.heater import pack_heater_cmds
|
||||
from eive_tmtc.tmtc.tcs.rtd import pack_rtd_commands
|
||||
from eive_tmtc.tmtc.tcs.subsystem import pack_tcs_sys_commands
|
||||
from eive_tmtc.tmtc.tcs.tmp1075 import pack_tmp1075_test_into
|
||||
from eive_tmtc.tmtc.test import build_test_commands
|
||||
from eive_tmtc.tmtc.time import pack_time_management_cmd
|
||||
from eive_tmtc.tmtc.tm_store import pack_tm_store_commands
|
||||
from eive_tmtc.tmtc.wdt import pack_wdt_commands
|
||||
from eive_tmtc.utility.input_helper import InputHelper
|
||||
|
||||
|
||||
def handle_pus_procedure(
|
||||
info: TreeCommandingProcedure,
|
||||
queue_helper: DefaultPusQueueHelper,
|
||||
):
|
||||
cmd_path = info.cmd_path
|
||||
assert cmd_path is not None
|
||||
cmd_path_list = cmd_path.split("/")
|
||||
if cmd_path_list[0] == "":
|
||||
cmd_path_list = cmd_path_list[1:]
|
||||
if len(cmd_path_list) == 0:
|
||||
raise ValueError(
|
||||
"command path list empty. Full command path {cmd_path} might have invalid format"
|
||||
)
|
||||
if cmd_path_list[0] == "system":
|
||||
assert len(cmd_path_list) >= 1
|
||||
return build_system_cmds(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "health":
|
||||
assert len(cmd_path_list) >= 1
|
||||
return build_health_cmds(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "eps":
|
||||
return handle_eps_procedure(queue_helper, cmd_path_list[1:])
|
||||
if cmd_path_list[0] == "tcs":
|
||||
return handle_tcs_procedure(queue_helper, cmd_path_list[1:])
|
||||
if cmd_path_list[0] == "acs":
|
||||
return handle_acs_procedure(queue_helper, cmd_path_list[1:])
|
||||
if cmd_path_list[0] == "payload":
|
||||
return handle_payload_procedure(queue_helper, cmd_path_list[1:])
|
||||
if cmd_path_list[0] == "obdh":
|
||||
return handle_obdh_procedure(queue_helper, cmd_path_list[1:])
|
||||
if cmd_path_list[0] == "test":
|
||||
assert len(cmd_path_list) >= 1
|
||||
return build_test_commands(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "com":
|
||||
return handle_com_procedure(queue_helper, cmd_path_list[1:])
|
||||
logging.getLogger(__name__).warning(
|
||||
f"invalid or unimplemented command path {cmd_path}"
|
||||
)
|
||||
|
||||
|
||||
def handle_eps_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
|
||||
obj_id_man = get_object_ids()
|
||||
assert len(cmd_path_list) >= 1
|
||||
if cmd_path_list[0] == "power":
|
||||
return pack_power_commands(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "pwr_ctrl":
|
||||
return pack_power_ctrl_command(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "p60_dock":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(P60_DOCK_HANDLER))
|
||||
return pack_p60dock_cmds(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "pdu1":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(PDU_1_HANDLER_ID))
|
||||
return pack_pdu1_commands(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "pdu2":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(PDU_2_HANDLER_ID))
|
||||
return pack_pdu2_commands(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "acu":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(ACU_HANDLER_ID))
|
||||
return pack_acu_commands(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
|
||||
|
||||
def handle_tcs_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
|
||||
obj_id_man = get_object_ids()
|
||||
if len(cmd_path_list) == 1:
|
||||
return pack_tcs_sys_commands(q=queue_helper, cmd_str=cmd_path_list[0])
|
||||
assert len(cmd_path_list) >= 2
|
||||
if cmd_path_list[0] == "tcs_brd_assy":
|
||||
return pack_tcs_sys_commands(q=queue_helper, cmd_str=cmd_path_list[1])
|
||||
if cmd_path_list[0] == "rtd_devs":
|
||||
assert len(cmd_path_list) >= 2
|
||||
return pack_rtd_commands(
|
||||
object_id=None, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "tcs_ctrl":
|
||||
assert len(cmd_path_list) >= 2
|
||||
return pack_tcs_ctrl_commands(q=queue_helper, cmd_str=cmd_path_list[2])
|
||||
if cmd_path_list[0] == "tmp1075_devs":
|
||||
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)
|
||||
tmp_select = input_helper.get_key()
|
||||
assert len(cmd_path_list) >= 2
|
||||
object_id = obj_id_man.get(menu_dict[tmp_select][1])
|
||||
assert object_id is not None
|
||||
return pack_tmp1075_test_into(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "heaters":
|
||||
object_id = HEATER_CONTROLLER_ID
|
||||
return pack_heater_cmds(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
|
||||
|
||||
def handle_acs_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
|
||||
obj_id_man = get_object_ids()
|
||||
if len(cmd_path_list) == 1:
|
||||
return build_acs_subsystem_cmd(queue_helper, cmd_path_list[0])
|
||||
assert len(cmd_path_list) >= 2
|
||||
if cmd_path_list[0] == "mgt":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(IMTQ_HANDLER_ID))
|
||||
return create_imtq_command(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "str":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(STAR_TRACKER_ID))
|
||||
return pack_star_tracker_commands(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
|
||||
if cmd_path_list[0] == "rws":
|
||||
assert len(cmd_path_list) >= 2
|
||||
if cmd_path_list[1] == "rw_assy":
|
||||
assert len(cmd_path_list) >= 3
|
||||
return pack_rw_ass_cmds(
|
||||
q=queue_helper, object_id=RW_ASSEMBLY, cmd_str=cmd_path_list[2]
|
||||
)
|
||||
if cmd_path_list[1] == "rw_1":
|
||||
assert len(cmd_path_list) >= 3
|
||||
return create_single_rw_cmd(
|
||||
object_id=RW1_ID, rw_idx=1, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||
)
|
||||
if cmd_path_list[1] == "rw_2":
|
||||
assert len(cmd_path_list) >= 3
|
||||
return create_single_rw_cmd(
|
||||
object_id=RW2_ID, rw_idx=2, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||
)
|
||||
if cmd_path_list[1] == "rw_3":
|
||||
assert len(cmd_path_list) >= 3
|
||||
return create_single_rw_cmd(
|
||||
object_id=RW3_ID, rw_idx=3, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||
)
|
||||
if cmd_path_list[1] == "rw_4":
|
||||
assert len(cmd_path_list) >= 3
|
||||
return create_single_rw_cmd(
|
||||
object_id=RW4_ID, rw_idx=4, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||
)
|
||||
|
||||
if cmd_path_list[0] == "gnss_ctrl":
|
||||
return pack_gps_command(
|
||||
object_id=oids.GPS_CONTROLLER, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "acs_brd_assy":
|
||||
if len(cmd_path_list) == 2:
|
||||
return pack_acs_board_command(q=queue_helper, cmd_str=cmd_path_list[1])
|
||||
else:
|
||||
if cmd_path_list[1] == "mgm_devs":
|
||||
return handle_mgm_cmd(q=queue_helper, cmd_str=cmd_path_list[2])
|
||||
if cmd_path_list[1] == "gyro_devs":
|
||||
assert len(cmd_path_list) >= 3
|
||||
return handle_gyr_cmd(q=queue_helper, cmd_str=cmd_path_list[2])
|
||||
if cmd_path_list[0] == "str_img_helper":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(STR_IMG_HELPER_ID))
|
||||
return pack_str_img_helper_command(
|
||||
object_id=object_id, q=queue_helper, op_code=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "acs_ctrl":
|
||||
return pack_acs_ctrl_command(queue_helper, cmd_path_list[1])
|
||||
|
||||
|
||||
def handle_payload_procedure(
|
||||
queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]
|
||||
):
|
||||
obj_id_man = get_object_ids()
|
||||
if cmd_path_list[0] == "subsystem":
|
||||
return create_payload_subsystem_cmd(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "ploc_mpsoc":
|
||||
return pack_ploc_mpsoc_commands(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "ploc_supv":
|
||||
return pack_ploc_supv_commands(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "rad_sensor":
|
||||
assert len(cmd_path_list) >= 3
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(RAD_SENSOR_ID))
|
||||
return create_rad_sensor_cmd(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[1]
|
||||
)
|
||||
if cmd_path_list[0] == "pl_pcdu":
|
||||
return pack_pl_pcdu_commands(q=queue_helper, cmd_str=cmd_path_list[1])
|
||||
if cmd_path_list[0] == "scex":
|
||||
return pack_scex_cmds(
|
||||
cmd_str=cmd_path_list[1],
|
||||
q=queue_helper,
|
||||
)
|
||||
|
||||
|
||||
def handle_obdh_procedure(
|
||||
queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]
|
||||
):
|
||||
assert len(cmd_path_list) >= 2
|
||||
if cmd_path_list[0] == "core":
|
||||
return pack_core_commands(q=queue_helper, cmd_str=cmd_path_list[1])
|
||||
if cmd_path_list[0] == "xiphos_wdt":
|
||||
return pack_wdt_commands(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "time":
|
||||
return pack_time_management_cmd(queue_helper, cmd_path_list[1])
|
||||
if cmd_path_list[0] == "tm_store":
|
||||
return pack_tm_store_commands(queue_helper, cmd_path_list[1])
|
||||
|
||||
|
||||
def handle_com_procedure(queue_helper: DefaultPusQueueHelper, cmd_path_list: List[str]):
|
||||
obj_id_man = get_object_ids()
|
||||
if len(cmd_path_list) == 1:
|
||||
return build_com_subsystem_procedure(queue_helper, cmd_path_list[0])
|
||||
assert len(cmd_path_list) >= 2
|
||||
if cmd_path_list[0] == "ccsds":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(CCSDS_HANDLER_ID))
|
||||
return pack_ccsds_handler_command(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||
)
|
||||
if cmd_path_list[0] == "pdec":
|
||||
return pack_pdec_handler_commands(
|
||||
object_id=PDEC_HANDLER_ID, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||
)
|
||||
if cmd_path_list[0] == "syrlinks":
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(SYRLINKS_HANDLER_ID))
|
||||
return pack_syrlinks_command(
|
||||
object_id=object_id, q=queue_helper, cmd_str=cmd_path_list[2]
|
||||
)
|
@ -1 +0,0 @@
|
||||
|
@ -1,61 +0,0 @@
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.config.object_ids import BPX_HANDLER_ID
|
||||
from tmtccmd.tc import service_provider
|
||||
from tmtccmd.tc.decorator import ServiceProviderParams
|
||||
from tmtccmd.tc.pus_8_funccmd import make_fsfw_action_cmd
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import generate_one_hk_command, make_sid
|
||||
|
||||
|
||||
class BpxSetIds:
|
||||
GET_HK_SET = 0
|
||||
GET_CFG_SET = 5
|
||||
|
||||
|
||||
class BpxActionIds:
|
||||
REBOOT = 2
|
||||
RESET_COUNTERS = 3
|
||||
SET_CFG = 4
|
||||
GET_CFG = 5
|
||||
|
||||
|
||||
class BpxOpCodes:
|
||||
HK = ["0", "hk"]
|
||||
RST_BOOT_CNT = ["1", "rst_boot_cnt"]
|
||||
REQUEST_CFG = ["2", "cfg"]
|
||||
REQUEST_CFG_HK = ["3", "cfg_hk"]
|
||||
REBOOT = ["4", "reboot"]
|
||||
|
||||
|
||||
@service_provider(CustomServiceList.BPX_BATTERY.value)
|
||||
def pack_bpx_commands(p: ServiceProviderParams):
|
||||
op_code = p.op_code
|
||||
q = p.queue_helper
|
||||
if op_code in BpxOpCodes.HK:
|
||||
q.add_log_cmd("Requesting BPX battery HK set")
|
||||
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetIds.GET_HK_SET)
|
||||
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
||||
if op_code in BpxOpCodes.RST_BOOT_CNT:
|
||||
q.add_log_cmd("Resetting reboot counters")
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=BPX_HANDLER_ID, action_id=BpxActionIds.RESET_COUNTERS
|
||||
)
|
||||
)
|
||||
if op_code in BpxOpCodes.REQUEST_CFG:
|
||||
q.add_log_cmd("Requesting configuration struct")
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=BPX_HANDLER_ID, action_id=BpxActionIds.GET_CFG
|
||||
)
|
||||
)
|
||||
if op_code in BpxOpCodes.REQUEST_CFG_HK:
|
||||
q.add_log_cmd("Requesting configuration struct HK")
|
||||
sid = make_sid(object_id=BPX_HANDLER_ID, set_id=BpxSetIds.GET_CFG_SET)
|
||||
q.add_pus_tc(generate_one_hk_command(sid=sid))
|
||||
if op_code in BpxOpCodes.REBOOT:
|
||||
q.add_log_cmd("Rebooting BPX battery")
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=BPX_HANDLER_ID, action_id=BpxActionIds.REBOOT
|
||||
)
|
||||
)
|
@ -1,80 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
@file ccsds_handler.py
|
||||
@brief Test commanding of CCSDS Handler
|
||||
@author J. Meier
|
||||
@date 20.11.2021
|
||||
"""
|
||||
import struct
|
||||
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
|
||||
class CommandIds:
|
||||
# Configures input rate of syrlinks to 400 Khz (results in downlink rate of 200 kbps)
|
||||
SET_LOW_RATE = 0
|
||||
# Configures input rate of syrlinks to 2000 Khz (results in downlink rate of 1000 kbps)
|
||||
SET_HIGH_RATE = 1
|
||||
# Enables the syrlinks transmitter (by using RS485 enables lines)
|
||||
EN_TRANSMITTER = 2
|
||||
# Disables the syrlinks transmitter (by using RS485 enables lines)
|
||||
DIS_TRANSMITTER = 3
|
||||
# Sets an arbitrary bitrate. Normally only set low and set high rate commands should be
|
||||
# required
|
||||
ARBITRARY_BITRATE = 4
|
||||
ENABLE_TX_CLK_MANIPULATOR = 5
|
||||
DISABLE_TX_CLK_MANIPULATOR = 6
|
||||
# Tx data will be updated on rising edge of tx clock
|
||||
UPDATE_ON_RISING_EDGE = 7
|
||||
# Tx data will be updated on falling edge of tx clock
|
||||
UPDATE_ON_FALLING_EDGE = 8
|
||||
|
||||
|
||||
def pack_ccsds_handler_test(
|
||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
||||
):
|
||||
obyt = object_id.as_bytes
|
||||
q.add_log_cmd(f"Testing CCSDS handler with object id: {object_id.as_hex_string}")
|
||||
if op_code == "0":
|
||||
q.add_log_cmd("CCSDS Handler: Set low rate")
|
||||
command = obyt + struct.pack("!I", CommandIds.SET_LOW_RATE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "1":
|
||||
q.add_log_cmd("CCSDS Handler: Set high rate")
|
||||
command = obyt + struct.pack("!I", CommandIds.SET_HIGH_RATE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "2":
|
||||
q.add_log_cmd("CCSDS Handler: Enables the transmitter")
|
||||
command = obyt + struct.pack("!I", CommandIds.EN_TRANSMITTER)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "3":
|
||||
q.add_log_cmd("CCSDS Handler: Disables the transmitter")
|
||||
command = obyt + struct.pack("!I", CommandIds.DIS_TRANSMITTER)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "4":
|
||||
q.add_log_cmd("CCSDS Handler: Set arbitrary bitrate")
|
||||
bitrate = int(input("Specify bit rate (bps): "))
|
||||
command = (
|
||||
obyt
|
||||
+ struct.pack("!I", CommandIds.ARBITRARY_BITRATE)
|
||||
+ struct.pack("!I", bitrate)
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "5":
|
||||
q.add_log_cmd("CCSDS Handler: Enable tx clock manipulator")
|
||||
command = obyt + struct.pack("!I", CommandIds.ENABLE_TX_CLK_MANIPULATOR)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "6":
|
||||
q.add_log_cmd("CCSDS Handler: Disable tx clock manipulator")
|
||||
command = obyt + struct.pack("!I", CommandIds.DISABLE_TX_CLK_MANIPULATOR)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "7":
|
||||
q.add_log_cmd("CCSDS Handler: Update tx data on rising edge of tx clock")
|
||||
command = obyt + struct.pack("!I", CommandIds.UPDATE_ON_RISING_EDGE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "8":
|
||||
q.add_log_cmd("CCSDS Handler: Update tx data on falling edge of tx clock")
|
||||
command = obyt + struct.pack("!I", CommandIds.UPDATE_ON_FALLING_EDGE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
@ -1,48 +0,0 @@
|
||||
import enum
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command
|
||||
from tmtccmd.logging import get_console_logger
|
||||
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
class OpCodes:
|
||||
REQ_OS_HK = ["0", "hk-os"]
|
||||
RESET_GNSS = ["5", "reset"]
|
||||
|
||||
|
||||
class Info:
|
||||
REQ_OS_HK = "Request One-Shot HK"
|
||||
RESET_GNSS = "Reset GNSS using reset pin"
|
||||
|
||||
|
||||
class SetIds:
|
||||
HK = 0
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_gps_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(keys=OpCodes.RESET_GNSS, info=Info.RESET_GNSS)
|
||||
oce.add(keys=OpCodes.REQ_OS_HK, info=Info.REQ_OS_HK)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.GPS_CTRL.value,
|
||||
info="GPS/GNSS Controller",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
|
||||
|
||||
def pack_gps_command(object_id: bytes, q: DefaultPusQueueHelper, op_code: str):
|
||||
if op_code in OpCodes.RESET_GNSS:
|
||||
# TODO: This needs to be re-implemented
|
||||
LOGGER.warning("Reset pin handling needs to be re-implemented")
|
||||
if op_code in OpCodes.REQ_OS_HK:
|
||||
q.add_log_cmd(f"GMSS: {Info.REQ_OS_HK}")
|
||||
q.add_pus_tc(
|
||||
generate_one_hk_command(sid=make_sid(object_id=object_id, set_id=SetIds.HK))
|
||||
)
|
@ -1,10 +0,0 @@
|
||||
import enum
|
||||
|
||||
|
||||
class AdisGyroSetIds(enum.IntEnum):
|
||||
CORE_HK = 0
|
||||
CFG_HK = 1
|
||||
|
||||
|
||||
class L3gGyroSetIds(enum.IntEnum):
|
||||
CORE_HK = 0
|
@ -1,9 +0,0 @@
|
||||
import enum
|
||||
|
||||
|
||||
class MgmLis3SetIds(enum.IntEnum):
|
||||
CORE_HK = 0
|
||||
|
||||
|
||||
class MgmRm3100SetIds(enum.IntEnum):
|
||||
CORE_HK = 0
|
@ -1,30 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
@file pdec_handler.py
|
||||
@brief Test commanding of PDEC Handler
|
||||
@author J. Meier
|
||||
@date 22.11.2021
|
||||
"""
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
|
||||
|
||||
class CommandIds:
|
||||
# prints the clcw to the console. Useful for debugging
|
||||
PRINT_CLCW = bytearray([0x0, 0x0, 0x0, 0x0])
|
||||
# Print PDEC monitor register
|
||||
PRINT_PDEC_MON = bytearray([0x0, 0x0, 0x0, 0x1])
|
||||
|
||||
|
||||
def pack_pdec_handler_test(
|
||||
object_id: bytearray, q: DefaultPusQueueHelper, op_code: str
|
||||
):
|
||||
q.add_log_cmd(f"Testing PDEC handler with object id: {object_id.hex()}")
|
||||
if op_code == "0":
|
||||
q.add_log_cmd("PDEC Handler: Print CLCW")
|
||||
command = object_id + CommandIds.PRINT_CLCW
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "1":
|
||||
q.add_log_cmd("PDEC Handler: Print PDEC monitor register")
|
||||
command = object_id + CommandIds.PRINT_PDEC_MON
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
@ -1,450 +0,0 @@
|
||||
import enum
|
||||
import struct
|
||||
import time
|
||||
from typing import Optional
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from tmtccmd.config import TmtcDefinitionWrapper
|
||||
|
||||
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import (
|
||||
make_sid,
|
||||
generate_one_diag_command,
|
||||
enable_periodic_hk_command_with_interval,
|
||||
disable_periodic_hk_command,
|
||||
)
|
||||
from tmtccmd.tc.pus_11_tc_sched import (
|
||||
generate_enable_tc_sched_cmd,
|
||||
generate_time_tagged_cmd,
|
||||
)
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes, Subservices
|
||||
from tmtccmd.tc.pus_20_params import (
|
||||
pack_scalar_double_param_app_data,
|
||||
pack_fsfw_load_param_cmd,
|
||||
pack_boolean_parameter_app_data,
|
||||
)
|
||||
from tmtccmd.logging import get_console_logger
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from eive_tmtc.config.object_ids import PL_PCDU_ID
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
class OpCodes:
|
||||
SWITCH_HPA_ON_PROC = ["0", "proc_hpa"]
|
||||
SWITCH_ON = ["2", "on"]
|
||||
SWITCH_OFF = ["3", "off"]
|
||||
NORMAL_SSR = ["4", "nml_ssr"]
|
||||
NORMAL_DRO = ["5", "nml_dro"]
|
||||
NORMAL_X8 = ["6", "nml_x8"]
|
||||
NORMAL_TX = ["7", "nml_tx"]
|
||||
NORMAL_MPA = ["8", "nml_mpa"]
|
||||
NORMAL_HPA = ["9", "nml_hpa"]
|
||||
|
||||
ENABLE_HK = ["enable_hk"]
|
||||
DISABLE_HK = ["disable_hk"]
|
||||
REQ_OS_HK = ["hk_os"]
|
||||
|
||||
INJECT_SSR_TO_DRO_FAILURE = ["10", "inject_ssr_dro_fault"]
|
||||
INJECT_DRO_TO_X8_FAILURE = ["11", "inject_dro_x8_fault"]
|
||||
INJECT_X8_TO_TX_FAILURE = ["12", "inject_x8_tx_fault"]
|
||||
INJECT_TX_TO_MPA_FAILURE = ["13", "inject_tx_mpa_fault"]
|
||||
INJECT_MPA_TO_HPA_FAILURE = ["14", "inject_mpa_hpa_fault"]
|
||||
INJECT_ALL_ON_FAILURE = ["15", "inject_all_on_fault"]
|
||||
|
||||
|
||||
class Info:
|
||||
NORMAL = "ADC modules normal"
|
||||
SWITCH_ON = "Switching on"
|
||||
SWITCH_OFF = "Switching off"
|
||||
NORMAL_SSR = f"{NORMAL}, SSR on"
|
||||
NORMAL_DRO = f"{NORMAL},DRO on"
|
||||
NORMAL_X8 = f"{NORMAL}, X8 on"
|
||||
NORMAL_TX = f"{NORMAL}, TX on"
|
||||
NORMAL_MPA = f"{NORMAL}, MPA on"
|
||||
NORMAL_HPA = f"{NORMAL}, HPA on"
|
||||
REQ_OS_HK = "Request One Shot HK"
|
||||
SWITCH_HPA_ON_PROC = "Switch HPA on procedure"
|
||||
ENABLE_HK = "Enable HK"
|
||||
DISABLE_HK = "Disable HK"
|
||||
|
||||
|
||||
class SetIds(enum.IntEnum):
|
||||
ADC = 0
|
||||
|
||||
|
||||
class NormalSubmodesMask(enum.IntEnum):
|
||||
SOLID_STATE_RELAYS_ADC_ON = 0
|
||||
DRO_ON = 1
|
||||
X8_ON = 2
|
||||
TX_ON = 3
|
||||
MPA_ON = 4
|
||||
HPA_ON = 5
|
||||
|
||||
|
||||
class ParamIds(enum.IntEnum):
|
||||
NEG_V_LOWER_BOUND = 0
|
||||
NEG_V_UPPER_BOUND = 1
|
||||
|
||||
DRO_U_LOWER_BOUND = 2
|
||||
DRO_U_UPPER_BOUND = 3
|
||||
DRO_I_UPPER_BOUND = 4
|
||||
|
||||
X8_U_LOWER_BOUND = 5
|
||||
X8_U_UPPER_BOUND = 6
|
||||
X8_I_UPPER_BOUND = 7
|
||||
|
||||
TX_U_LOWER_BOUND = 8
|
||||
TX_U_UPPER_BOUND = 9
|
||||
TX_I_UPPER_BOUND = 10
|
||||
|
||||
MPA_U_LOWER_BOUND = 11
|
||||
MPA_U_UPPER_BOUND = 12
|
||||
MPA_I_UPPER_BOUND = 13
|
||||
|
||||
HPA_U_LOWER_BOUND = 14
|
||||
HPA_U_UPPER_BOUND = 15
|
||||
HPA_I_UPPER_BOUND = 16
|
||||
|
||||
SSR_TO_DRO_WAIT_TIME = 17
|
||||
DRO_TO_X8_WAIT_TIME = 18
|
||||
X8_TO_TX_WAIT_TIME = 19
|
||||
TX_TO_MPA_WAIT_TIME = 20
|
||||
MPA_TO_HPA_WAIT_TIME = 21
|
||||
|
||||
INJECT_SSR_TO_DRO_FAILURE = 30
|
||||
INJECT_DRO_TO_X8_FAILURE = 31
|
||||
INJECT_X8_TO_TX_FAILURE = 32
|
||||
INJECT_TX_TO_MPA_FAILURE = 33
|
||||
INJECT_MPA_TO_HPA_FAILURE = 34
|
||||
INJECT_ALL_ON_FAILURE = 35
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_pl_pcdu_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(keys=OpCodes.SWITCH_HPA_ON_PROC, info=Info.SWITCH_HPA_ON_PROC)
|
||||
oce.add(keys=OpCodes.SWITCH_ON, info=Info.SWITCH_ON)
|
||||
oce.add(keys=OpCodes.SWITCH_OFF, info=Info.SWITCH_OFF)
|
||||
oce.add(keys=OpCodes.NORMAL_SSR, info=Info.NORMAL_SSR)
|
||||
oce.add(keys=OpCodes.NORMAL_DRO, info=Info.NORMAL_DRO)
|
||||
oce.add(keys=OpCodes.NORMAL_X8, info=Info.NORMAL_X8)
|
||||
oce.add(keys=OpCodes.NORMAL_TX, info=Info.NORMAL_TX)
|
||||
oce.add(keys=OpCodes.NORMAL_MPA, info=Info.NORMAL_MPA)
|
||||
oce.add(keys=OpCodes.NORMAL_HPA, info=Info.NORMAL_HPA)
|
||||
oce.add(keys=OpCodes.REQ_OS_HK, info=Info.REQ_OS_HK)
|
||||
oce.add(keys=OpCodes.ENABLE_HK, info=Info.ENABLE_HK)
|
||||
oce.add(
|
||||
keys=OpCodes.INJECT_SSR_TO_DRO_FAILURE,
|
||||
info="Inject failure SSR to DRO transition",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.INJECT_DRO_TO_X8_FAILURE,
|
||||
info="Inject failure in DRO to X8 transition",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.INJECT_X8_TO_TX_FAILURE,
|
||||
info="Inject failure in X8 to TX transition",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.INJECT_TX_TO_MPA_FAILURE,
|
||||
info="Inject failure in TX to MPA transition",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.INJECT_MPA_TO_HPA_FAILURE,
|
||||
info="Inject failure in MPA to HPA transition",
|
||||
)
|
||||
oce.add(keys=OpCodes.INJECT_ALL_ON_FAILURE, info="Inject failure in all on mode")
|
||||
defs.add_service(CustomServiceList.PL_PCDU.value, "PL PCDU", oce)
|
||||
|
||||
|
||||
def pack_pl_pcdu_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
if op_code in OpCodes.SWITCH_ON:
|
||||
pack_pl_pcdu_mode_cmd(q=q, info=Info.SWITCH_ON, mode=Modes.ON, submode=0)
|
||||
if op_code in OpCodes.SWITCH_OFF:
|
||||
pack_pl_pcdu_mode_cmd(q=q, info=Info.SWITCH_OFF, mode=Modes.OFF, submode=0)
|
||||
if op_code in OpCodes.ENABLE_HK:
|
||||
interval = float(
|
||||
input("Please enter HK collection interval in floating point seconds: ")
|
||||
)
|
||||
cmds = enable_periodic_hk_command_with_interval(
|
||||
diag=True, sid=make_sid(PL_PCDU_ID, SetIds.ADC), interval_seconds=interval
|
||||
)
|
||||
q.add_log_cmd(f"Enable PL PCDU HK with interval of {interval} seconds")
|
||||
for cmd in cmds:
|
||||
q.add_pus_tc(cmd)
|
||||
if op_code in OpCodes.DISABLE_HK:
|
||||
cmd = disable_periodic_hk_command(
|
||||
diag=True, sid=make_sid(PL_PCDU_ID, SetIds.ADC)
|
||||
)
|
||||
q.add_log_cmd("Disabling PL PCDU HK")
|
||||
q.add_pus_tc(cmd)
|
||||
if op_code in OpCodes.NORMAL_SSR:
|
||||
pack_pl_pcdu_mode_cmd(
|
||||
q=q,
|
||||
info=Info.NORMAL_SSR,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(
|
||||
NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
||||
),
|
||||
)
|
||||
if op_code in OpCodes.NORMAL_DRO:
|
||||
pack_pl_pcdu_mode_cmd(
|
||||
q=q,
|
||||
info=Info.NORMAL_DRO,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON),
|
||||
)
|
||||
if op_code in OpCodes.NORMAL_X8:
|
||||
pack_pl_pcdu_mode_cmd(
|
||||
q=q,
|
||||
info=Info.NORMAL_X8,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON),
|
||||
)
|
||||
if op_code in OpCodes.NORMAL_TX:
|
||||
pack_pl_pcdu_mode_cmd(
|
||||
q=q,
|
||||
info=Info.NORMAL_TX,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON),
|
||||
)
|
||||
if op_code in OpCodes.NORMAL_MPA:
|
||||
pack_pl_pcdu_mode_cmd(
|
||||
q=q,
|
||||
info=Info.NORMAL_MPA,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON),
|
||||
)
|
||||
if op_code in OpCodes.NORMAL_HPA:
|
||||
pack_pl_pcdu_mode_cmd(
|
||||
q=q,
|
||||
info=Info.NORMAL_HPA,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON),
|
||||
)
|
||||
if op_code in OpCodes.REQ_OS_HK:
|
||||
q.add_log_cmd(f"PL PCDU: {Info.REQ_OS_HK}")
|
||||
q.add_pus_tc(
|
||||
generate_one_diag_command(
|
||||
sid=make_sid(object_id=PL_PCDU_ID, set_id=SetIds.ADC)
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.SWITCH_HPA_ON_PROC:
|
||||
hpa_on_procedure(q)
|
||||
if op_code in OpCodes.INJECT_ALL_ON_FAILURE:
|
||||
pack_failure_injection_cmd(
|
||||
q=q,
|
||||
param_id=ParamIds.INJECT_ALL_ON_FAILURE,
|
||||
print_str="All On",
|
||||
)
|
||||
|
||||
|
||||
def hpa_on_procedure(q: DefaultPusQueueHelper):
|
||||
delay_dro_to_x8 = request_wait_time()
|
||||
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 "
|
||||
f"delay of {delay_dro_to_x8} seconds"
|
||||
)
|
||||
pl_pcdu_on = PusTelecommand(
|
||||
service=200,
|
||||
subservice=Subservices.TC_MODE_COMMAND,
|
||||
app_data=pack_mode_data(object_id=PL_PCDU_ID, mode=Modes.ON, submode=0),
|
||||
)
|
||||
ssr_on = PusTelecommand(
|
||||
service=200,
|
||||
subservice=Subservices.TC_MODE_COMMAND,
|
||||
app_data=pack_mode_data(
|
||||
object_id=PL_PCDU_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(
|
||||
NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
||||
),
|
||||
),
|
||||
)
|
||||
dro_on = PusTelecommand(
|
||||
service=200,
|
||||
subservice=Subservices.TC_MODE_COMMAND,
|
||||
app_data=pack_mode_data(
|
||||
object_id=PL_PCDU_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.DRO_ON),
|
||||
),
|
||||
)
|
||||
x8_on = PusTelecommand(
|
||||
service=200,
|
||||
subservice=Subservices.TC_MODE_COMMAND,
|
||||
app_data=pack_mode_data(
|
||||
object_id=PL_PCDU_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.X8_ON),
|
||||
),
|
||||
)
|
||||
tx_on = PusTelecommand(
|
||||
service=200,
|
||||
subservice=Subservices.TC_MODE_COMMAND,
|
||||
app_data=pack_mode_data(
|
||||
object_id=PL_PCDU_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.TX_ON),
|
||||
),
|
||||
)
|
||||
mpa_on = PusTelecommand(
|
||||
service=200,
|
||||
subservice=Subservices.TC_MODE_COMMAND,
|
||||
app_data=pack_mode_data(
|
||||
object_id=PL_PCDU_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.MPA_ON),
|
||||
),
|
||||
)
|
||||
hpa_on = PusTelecommand(
|
||||
service=200,
|
||||
subservice=Subservices.TC_MODE_COMMAND,
|
||||
app_data=pack_mode_data(
|
||||
object_id=PL_PCDU_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=submode_mask_to_submode(NormalSubmodesMask.HPA_ON),
|
||||
),
|
||||
)
|
||||
current_time = time.time()
|
||||
|
||||
enb_sched = generate_enable_tc_sched_cmd()
|
||||
|
||||
sched_time = int(round(current_time + 10))
|
||||
q.add_pus_tc(enb_sched)
|
||||
tagged_on_cmd = generate_time_tagged_cmd(
|
||||
release_time=struct.pack("!I", sched_time),
|
||||
tc_to_insert=pl_pcdu_on,
|
||||
)
|
||||
q.add_pus_tc(tagged_on_cmd)
|
||||
|
||||
sched_time += 5
|
||||
tagged_ssr_cmd = generate_time_tagged_cmd(
|
||||
release_time=struct.pack("!I", sched_time),
|
||||
tc_to_insert=ssr_on,
|
||||
)
|
||||
q.add_pus_tc(tagged_ssr_cmd)
|
||||
|
||||
sched_time += 5
|
||||
tagged_dro_cmd = generate_time_tagged_cmd(
|
||||
release_time=struct.pack("!I", sched_time), tc_to_insert=dro_on
|
||||
)
|
||||
q.add_pus_tc(tagged_dro_cmd)
|
||||
|
||||
sched_time += delay_dro_to_x8
|
||||
sched_time = int(round(sched_time))
|
||||
tagged_x8_cmd = generate_time_tagged_cmd(
|
||||
release_time=struct.pack("!I", sched_time), tc_to_insert=x8_on
|
||||
)
|
||||
q.add_pus_tc(tagged_x8_cmd)
|
||||
|
||||
sched_time += 5
|
||||
tagged_tx_cmd = generate_time_tagged_cmd(
|
||||
release_time=struct.pack("!I", sched_time), tc_to_insert=tx_on
|
||||
)
|
||||
q.add_pus_tc(tagged_tx_cmd)
|
||||
|
||||
sched_time += 5
|
||||
tagged_mpa_cmd = generate_time_tagged_cmd(
|
||||
release_time=struct.pack("!I", sched_time), tc_to_insert=mpa_on
|
||||
)
|
||||
q.add_pus_tc(tagged_mpa_cmd)
|
||||
|
||||
sched_time += 5
|
||||
tagged_hpa_cmd = generate_time_tagged_cmd(
|
||||
release_time=struct.pack("!I", sched_time), tc_to_insert=hpa_on
|
||||
)
|
||||
q.add_pus_tc(tagged_hpa_cmd)
|
||||
|
||||
|
||||
def request_wait_time() -> Optional[float]:
|
||||
while True:
|
||||
wait_time = input("Please enter DRO to X8 wait time in seconds, x to cancel: ")
|
||||
if wait_time.lower() == "x":
|
||||
return None
|
||||
try:
|
||||
wait_time = float(wait_time)
|
||||
except ValueError:
|
||||
LOGGER.warning("Invalid input")
|
||||
continue
|
||||
if wait_time <= 0:
|
||||
LOGGER.warning("Invalid input")
|
||||
else:
|
||||
return wait_time
|
||||
|
||||
|
||||
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
|
||||
if on_tgt == NormalSubmodesMask.DRO_ON:
|
||||
return 1 << NormalSubmodesMask.DRO_ON | (
|
||||
1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON
|
||||
)
|
||||
if on_tgt == NormalSubmodesMask.X8_ON:
|
||||
return (
|
||||
1 << NormalSubmodesMask.DRO_ON
|
||||
| (1 << NormalSubmodesMask.SOLID_STATE_RELAYS_ADC_ON)
|
||||
| (1 << NormalSubmodesMask.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)
|
||||
)
|
||||
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)
|
||||
)
|
||||
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)
|
||||
)
|
||||
|
||||
|
||||
def pack_wait_time_cmd(q: DefaultPusQueueHelper, param_id: int, print_str: str):
|
||||
wait_time = request_wait_time()
|
||||
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(
|
||||
object_id=PL_PCDU_ID,
|
||||
domain_id=0,
|
||||
unique_id=param_id,
|
||||
parameter=wait_time,
|
||||
)
|
||||
q.add_pus_tc(pack_fsfw_load_param_cmd(app_data=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(
|
||||
object_id=PL_PCDU_ID, domain_id=0, unique_id=param_id, parameter=True
|
||||
)
|
||||
q.add_pus_tc(pack_fsfw_load_param_cmd(app_data=param_data))
|
||||
|
||||
|
||||
def pack_pl_pcdu_mode_cmd(
|
||||
q: DefaultPusQueueHelper, info: str, mode: Modes, submode: int
|
||||
):
|
||||
q.add_log_cmd(info)
|
||||
mode_data = pack_mode_data(object_id=PL_PCDU_ID, mode=mode, submode=submode)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=mode_data
|
||||
)
|
||||
)
|
@ -1,99 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
@file rad_sensor.py
|
||||
@brief Tests for the radiation sensor handler
|
||||
@author J. Meier
|
||||
@date 01.07.2021
|
||||
"""
|
||||
import struct
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from eive_tmtc.pus_tc.service_200_mode import pack_mode_data, Modes
|
||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import generate_one_hk_command, make_sid
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
|
||||
class SetIds:
|
||||
HK = 3
|
||||
|
||||
|
||||
class OpCodes:
|
||||
ON = ["0", "on"]
|
||||
NORMAL = ["1", "normal"]
|
||||
OFF = ["2", "off"]
|
||||
REQ_HK_ONCE = ["3", "hk-os"]
|
||||
DEBUG_ON = ["10", "dbg-on"]
|
||||
DEBUG_OFF = ["11", "dbg-off"]
|
||||
|
||||
|
||||
class Info:
|
||||
ON = "Switch Rad Sensor on"
|
||||
NORMAL = "Switch Rad Sensor normal"
|
||||
OFF = "Switch Rad sensor off"
|
||||
REQ_OS_HK = "Request one-shot HK"
|
||||
DEBUG_ON = "Switch debug output on"
|
||||
DEBUG_OFF = "Switch debug output off"
|
||||
|
||||
|
||||
class CommandIds:
|
||||
START_CONVERSIONS = 2
|
||||
READ_CONVERSIONS = 3
|
||||
ENABLE_DEBUG_OUTPUT = 4
|
||||
DISABLE_DEBUG_OUTPUT = 5
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_rad_sens_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(info=Info.ON, keys=OpCodes.ON)
|
||||
oce.add(info=Info.OFF, keys=OpCodes.OFF)
|
||||
oce.add(info=Info.NORMAL, keys=OpCodes.NORMAL)
|
||||
oce.add(info=Info.REQ_OS_HK, keys=OpCodes.REQ_HK_ONCE)
|
||||
oce.add(info=Info.DEBUG_ON, keys=OpCodes.DEBUG_ON)
|
||||
oce.add(info=Info.DEBUG_OFF, keys=OpCodes.DEBUG_OFF)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.RAD_SENSOR.value,
|
||||
info="Radiation Sensor",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
|
||||
|
||||
def pack_rad_sensor_test_into(
|
||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
||||
):
|
||||
q.add_log_cmd(f"Commanding Radiation sensor handler {object_id}")
|
||||
|
||||
if op_code in OpCodes.ON:
|
||||
rad_sensor_mode_cmd(object_id, Modes.ON, Info.ON, q)
|
||||
if op_code in OpCodes.NORMAL:
|
||||
rad_sensor_mode_cmd(object_id, Modes.NORMAL, Info.NORMAL, q)
|
||||
if op_code in OpCodes.OFF:
|
||||
rad_sensor_mode_cmd(object_id, Modes.OFF, Info.OFF, q)
|
||||
if op_code in OpCodes.REQ_HK_ONCE:
|
||||
q.add_log_cmd(f"Rad sensor: {Info.REQ_OS_HK}")
|
||||
q.add_pus_tc(
|
||||
generate_one_hk_command(sid=make_sid(object_id.as_bytes, set_id=SetIds.HK))
|
||||
)
|
||||
if op_code in OpCodes.DEBUG_ON:
|
||||
q.add_log_cmd(f"Rad sensor: {Info.DEBUG_ON}")
|
||||
command = object_id.as_bytes + struct.pack("!I", CommandIds.ENABLE_DEBUG_OUTPUT)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code in OpCodes.DEBUG_OFF:
|
||||
q.add_log_cmd(f"Rad sensor: {Info.DEBUG_OFF}")
|
||||
command = object_id.as_bytes + struct.pack(
|
||||
"!I", CommandIds.DISABLE_DEBUG_OUTPUT
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
|
||||
def rad_sensor_mode_cmd(
|
||||
object_id: ObjectIdU32, mode: Modes, info: str, q: DefaultPusQueueHelper
|
||||
):
|
||||
q.add_log_cmd(f"Rad sensor: {info}")
|
||||
mode_data = pack_mode_data(object_id.as_bytes, mode, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
@ -1,112 +0,0 @@
|
||||
from typing import Optional
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.pus_tc.devs.pdec_handler import CommandIds
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import Modes, pack_mode_data, Subservices
|
||||
import eive_tmtc.config.object_ids as oids
|
||||
from eive_tmtc.config.object_ids import get_object_ids
|
||||
|
||||
RTD_IDS = [
|
||||
oids.RTD_0_PLOC_HSPD,
|
||||
oids.RTD_1_PLOC_MISSIONBRD,
|
||||
oids.RTD_2_4K_CAM,
|
||||
oids.RTD_3_DAC_HSPD,
|
||||
oids.RTD_4_STR,
|
||||
oids.RTD_5_RW1_MX_MY,
|
||||
oids.RTD_6_DRO,
|
||||
oids.RTD_7_SCEX,
|
||||
oids.RTD_8_X8,
|
||||
oids.RTD_9_HPA,
|
||||
oids.RTD_10_PL_TX,
|
||||
oids.RTD_11_MPA,
|
||||
oids.RTD_12_ACU,
|
||||
oids.RTD_13_PLPCDU_HSPD,
|
||||
oids.RTD_14_TCS_BRD,
|
||||
oids.RTD_15_IMTQ,
|
||||
]
|
||||
|
||||
|
||||
class OpCodes:
|
||||
ON = ["0", "on"]
|
||||
OFF = ["1", "off"]
|
||||
NORMAL = ["2", "normal"]
|
||||
CONFIG_CMD = ["3", "Write config"]
|
||||
|
||||
|
||||
class Info:
|
||||
ON = "Switch handler on"
|
||||
OFF = "Switch handler off"
|
||||
NORMAL = "Switch handler normal"
|
||||
WIRTE_CONFIG = "Write config"
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def specify_rtd_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(keys=OpCodes.ON, info=Info.ON)
|
||||
oce.add(keys=OpCodes.NORMAL, info=Info.NORMAL)
|
||||
oce.add(keys=OpCodes.OFF, info=Info.OFF)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.RTD.value, info="RTD commands", op_code_entry=oce
|
||||
)
|
||||
|
||||
|
||||
def pack_rtd_commands(
|
||||
op_code: str, object_id: Optional[ObjectIdU32], q: DefaultPusQueueHelper
|
||||
):
|
||||
if object_id is not None and object_id not in RTD_IDS:
|
||||
print("Specified object ID not a valid RTD ID")
|
||||
object_id = None
|
||||
if object_id is None:
|
||||
tgt_rtd_idx = prompt_rtd_idx()
|
||||
object_id_dict = get_object_ids()
|
||||
object_id = object_id_dict.get(RTD_IDS[tgt_rtd_idx])
|
||||
if op_code in OpCodes.ON:
|
||||
app_data = pack_mode_data(
|
||||
object_id=object_id.as_bytes, mode=Modes.ON, submode=0
|
||||
)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.NORMAL:
|
||||
app_data = pack_mode_data(
|
||||
object_id=object_id.as_bytes, mode=Modes.NORMAL, submode=0
|
||||
)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.OFF:
|
||||
app_data = pack_mode_data(
|
||||
object_id=object_id.as_bytes, mode=Modes.OFF, submode=0
|
||||
)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=app_data
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.CONFIG_CMD:
|
||||
command = object_id.as_bytes + CommandIds.PRINT_CLCW
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
|
||||
def prompt_rtd_idx():
|
||||
while True:
|
||||
rtd_idx = input("Please specify RTD index [0-15]: ")
|
||||
if not rtd_idx.isdigit():
|
||||
print("Invalid input")
|
||||
continue
|
||||
rtd_idx = int(rtd_idx)
|
||||
if rtd_idx < 0 or rtd_idx > 15:
|
||||
print("Invalid device index")
|
||||
continue
|
||||
return rtd_idx
|
@ -1,659 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
@file star_tracker.py
|
||||
@brief Star tracker commanding
|
||||
@author J. Meier
|
||||
@date 14.08.2021
|
||||
"""
|
||||
import struct
|
||||
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes
|
||||
from tmtccmd.logging import get_console_logger
|
||||
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
from eive_tmtc.utility.input_helper import InputHelper
|
||||
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
class StarTrackerActionIds:
|
||||
PING = 0
|
||||
BOOT = 1
|
||||
REQ_VERSION = 2
|
||||
REQ_INTERFACE = 3
|
||||
REQ_TIME = 4
|
||||
UNLOCK = 6
|
||||
SWITCH_TO_BOOTLOADER_PROGRAM = 7
|
||||
REQ_POWER = 11
|
||||
TAKE_IMAGE = 15
|
||||
DOWNLOAD_IMAGE = 9
|
||||
UPLOAD_IMAGE = 10
|
||||
DOWNLOAD_CENTROID = 16
|
||||
UPLOAD_CENTROID = 17
|
||||
SUBSCRIPTION = 18
|
||||
IMAGE_PROCESSOR = 19
|
||||
REQ_SOLUTION = 24
|
||||
REQ_TEMPERATURE = 25
|
||||
REQ_HISTOGRAM = 28
|
||||
REQ_CONTRAST = 29
|
||||
LIMITS = 40
|
||||
MOUNTING = 41
|
||||
CAMERA = 42
|
||||
BLOB = 43
|
||||
CENTROIDING = 44
|
||||
LISA = 45
|
||||
MATCHING = 46
|
||||
TRACKING = 47
|
||||
VALIDATION = 48
|
||||
ALGO = 49
|
||||
CHECKSUM = 50
|
||||
FLASH_READ = 51
|
||||
FLASH_WRITE = 52
|
||||
DOWNLOAD_MATCHED_STAR = 53
|
||||
STOP_STR_HELPER = 55
|
||||
RESET_ERROR = 56
|
||||
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
|
||||
CHANGE_FPGA_DOWNLOAD_FILE = 64
|
||||
UPLOAD_FPGA_IMAGE = 65
|
||||
FPGA_ACTION = 66
|
||||
REQ_CAMERA_PARAMS = 67
|
||||
REQ_LIMITS = 68
|
||||
REQ_LOG_LEVEL = 69
|
||||
REQ_MOUNTING = 70
|
||||
REQ_IMAGE_PROCESSOR = 71
|
||||
REQ_CENTROIDING = 72
|
||||
REQ_LISA = 73
|
||||
REQ_MATCHING = 74
|
||||
REQ_TRACKING = 75
|
||||
REQ_VALIDATION = 76
|
||||
REQ_ALGO = 77
|
||||
REQ_SUBSCRIPTION = 78
|
||||
REQ_LOG_SUBSCRIPTION = 79
|
||||
REQ_DEBUG_CAMERA = 80
|
||||
LOGLEVEL = 81
|
||||
LOG_SUBSCRIPTION = 82
|
||||
DEBUG_CAMERA = 83
|
||||
FIRMWARE_UPDATE = 84
|
||||
|
||||
|
||||
class OpCodes:
|
||||
NORMAL = ["2", "nml"]
|
||||
|
||||
|
||||
class SetIds:
|
||||
TEMPERATURE = 25
|
||||
|
||||
|
||||
class FileDefs:
|
||||
download_path = "/mnt/sd0/startracker"
|
||||
json_file = "/mnt/sd0/startracker/full.json"
|
||||
egse_ground_config = "/home/pi/arcsec/json/ground-config.json"
|
||||
egse_flight_config = "/home/pi/arcsec/json/flight-config.json"
|
||||
egse_solution_upload_img_config = "/home/pi/arcsec/json/upload-image-solution.json"
|
||||
egse_histogram_upload_img_config = (
|
||||
"/home/pi/arcsec/json/upload-image-histogram.json"
|
||||
)
|
||||
q7s_ground_config = "/mnt/sd0/startracker/json/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"
|
||||
|
||||
|
||||
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": [
|
||||
"EGSE get solution, upload image config",
|
||||
FileDefs.egse_solution_upload_img_config,
|
||||
],
|
||||
"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],
|
||||
}
|
||||
|
||||
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"],
|
||||
}
|
||||
|
||||
|
||||
class StartRegion:
|
||||
# Definition according to datasheet (which turned out to be partially faulty)
|
||||
BOOTLOADER = 0
|
||||
STAR_TRACKER_FIRMWARE = 1
|
||||
|
||||
|
||||
class PartitionSize:
|
||||
# Size of most recent firmware image
|
||||
STAR_TRACKER_FIRMWARE = 464572
|
||||
|
||||
|
||||
class Submode:
|
||||
BOOTLOADER = 1
|
||||
FIRMWARE = 2
|
||||
|
||||
|
||||
def pack_star_tracker_commands(
|
||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
||||
):
|
||||
q.add_log_cmd(
|
||||
f"Generate command for star tracker with object id: {object_id.as_hex_string}"
|
||||
)
|
||||
obyt = object_id.as_bytes
|
||||
if op_code == "0":
|
||||
q.add_log_cmd("Star tracker: Mode On, Submode Bootloader")
|
||||
data = pack_mode_data(obyt, Modes.ON, Submode.BOOTLOADER)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == "1":
|
||||
q.add_log_cmd("Star tracker: Mode On, Submode Firmware")
|
||||
data = pack_mode_data(obyt, Modes.ON, Submode.FIRMWARE)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == "2":
|
||||
q.add_log_cmd("Star tracker: Mode Normal")
|
||||
data = pack_mode_data(obyt, Modes.NORMAL, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == "3":
|
||||
q.add_log_cmd("Star tracker: Mode Off")
|
||||
data = pack_mode_data(obyt, Modes.OFF, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == "4":
|
||||
q.add_log_cmd("Star tracker: Mode Raw")
|
||||
data = pack_mode_data(obyt, Modes.RAW, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == "5":
|
||||
q.add_log_cmd("Star tracker: Ping")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.PING)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "6":
|
||||
q.add_log_cmd("Star tracker: Switch to bootloader program")
|
||||
data = obyt + struct.pack(
|
||||
"!I", StarTrackerActionIds.SWITCH_TO_BOOTLOADER_PROGRAM
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "7":
|
||||
q.add_log_cmd("Star tracker: Temperature request")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_TEMPERATURE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "8":
|
||||
q.add_log_cmd("Star tracker: Request version")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_VERSION)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "9":
|
||||
q.add_log_cmd("Star tracker: Request interface")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_INTERFACE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "10":
|
||||
q.add_log_cmd("Star tracker: Request power")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_POWER)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "11":
|
||||
q.add_log_cmd("Star tracker: Set subscription parameters")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.SUBSCRIPTION)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "12":
|
||||
q.add_log_cmd("Star tracker: Boot")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.BOOT)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "13":
|
||||
q.add_log_cmd("Star tracker: Request time")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.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", StarTrackerActionIds.REQ_SOLUTION)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "15":
|
||||
q.add_log_cmd("Star tracker: Upload image")
|
||||
image = get_upload_image()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.UPLOAD_IMAGE)
|
||||
+ bytearray(image, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "16":
|
||||
q.add_log_cmd("Star tracker: Download image")
|
||||
path = input("Specify storage location (default - /mnt/sd0/startracker): ")
|
||||
if not path:
|
||||
path = FileDefs.download_path
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.DOWNLOAD_IMAGE)
|
||||
+ bytearray(path, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "17":
|
||||
q.add_log_cmd("Star tracker: Set limits")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.LIMITS)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "18":
|
||||
q.add_log_cmd("Star tracker: Set tracking parameters")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.TRACKING)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "19":
|
||||
q.add_log_cmd("Star tracker: Mounting")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.MOUNTING)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "20":
|
||||
q.add_log_cmd("Star tracker: Camera")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.CAMERA)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "22":
|
||||
q.add_log_cmd("Star tracker: Centroiding")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.CENTROIDING)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "23":
|
||||
q.add_log_cmd("Star tracker: LISA")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.LISA)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "24":
|
||||
q.add_log_cmd("Star tracker: Matching")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.MATCHING)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "25":
|
||||
q.add_log_cmd("Star tracker: Validation")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.VALIDATION)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "26":
|
||||
q.add_log_cmd("Star tracker: Algo")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.ALGO)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "27":
|
||||
q.add_log_cmd("Star tracker: Take image")
|
||||
actionid = int(input("Specify parameter ID (take image - 4): "))
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.TAKE_IMAGE)
|
||||
+ struct.pack("!B", actionid)
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "28":
|
||||
q.add_log_cmd("Star tracker: Stop str helper")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.STOP_STR_HELPER)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "30":
|
||||
q.add_log_cmd("Star tracker: Set name of download image")
|
||||
filename = input("Specify download image name: ")
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.CHANGE_DOWNLOAD_IMAGE)
|
||||
+ bytearray(filename, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "31":
|
||||
q.add_log_cmd("Star tracker: Request histogram")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_HISTOGRAM)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "32":
|
||||
q.add_log_cmd("Star tracker: Request contrast")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_CONTRAST)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "33":
|
||||
q.add_log_cmd("Star tracker: Set json filename")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.SET_JSON_FILE_NAME)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "35":
|
||||
q.add_log_cmd("Star tracker: Flash read")
|
||||
data = pack_read_command(obyt)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "36":
|
||||
q.add_log_cmd("Star tracker: Set flash read filename")
|
||||
filename = input("Specify filename: ")
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.SET_FLASH_READ_FILENAME)
|
||||
+ bytearray(filename, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "37":
|
||||
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", StarTrackerActionIds.SET_TIME)
|
||||
+ struct.pack("!Q", unix_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")
|
||||
id = 0
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.DOWNLOAD_CENTROID)
|
||||
+ struct.pack("!B", id)
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "41":
|
||||
q.add_log_cmd("Star tracker: Download matched star")
|
||||
id = 0
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.DOWNLOAD_MATCHED_STAR)
|
||||
+ struct.pack("!B", id)
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "42":
|
||||
q.add_log_cmd("Star tracker: Download DB Image")
|
||||
id = 0
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.DOWNLOAD_DBIMAGE)
|
||||
+ struct.pack("!B", id)
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "43":
|
||||
q.add_log_cmd("Star tracker: Download Blob Pixel")
|
||||
id = 0
|
||||
type = 1 # 0 - normal, 1 - fast
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.DOWNLOAD_BLOBPIXEL)
|
||||
+ struct.pack("!B", id)
|
||||
+ 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", StarTrackerActionIds.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", StarTrackerActionIds.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", StarTrackerActionIds.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
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.FPGA_ACTION)
|
||||
+ struct.pack("!B", id)
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "48":
|
||||
q.add_log_cmd("Star tracker: Unlock")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.UNLOCK)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "49":
|
||||
q.add_log_cmd("Star tracker: Request camera parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_CAMERA_PARAMS)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "50":
|
||||
q.add_log_cmd("Star tracker: Request limits")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.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")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.IMAGE_PROCESSOR)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "52":
|
||||
q.add_log_cmd("Star tracker: EGSE load ground config camera parameters")
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.CAMERA)
|
||||
+ bytearray(FileDefs.egse_ground_config, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "53":
|
||||
q.add_log_cmd("Star tracker: EGSE load flight config camera parameters")
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.CAMERA)
|
||||
+ bytearray(FileDefs.egse_flight_config, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "54":
|
||||
q.add_log_cmd("Star tracker: Request log level parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_LOG_LEVEL)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "55":
|
||||
q.add_log_cmd("Star tracker: Request mounting parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_MOUNTING)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "56":
|
||||
q.add_log_cmd("Star tracker: Request image processor parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_IMAGE_PROCESSOR)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "57":
|
||||
q.add_log_cmd("Star tracker: Request centroiding parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_CENTROIDING)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "58":
|
||||
q.add_log_cmd("Star tracker: Request lisa parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_LISA)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "59":
|
||||
q.add_log_cmd("Star tracker: Request matching parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_MATCHING)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "60":
|
||||
q.add_log_cmd("Star tracker: Request tracking parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_TRACKING)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "61":
|
||||
q.add_log_cmd("Star tracker: Request validation parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_VALIDATION)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "62":
|
||||
q.add_log_cmd("Star tracker: Request algo parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_ALGO)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "63":
|
||||
q.add_log_cmd("Star tracker: Request subscription parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_SUBSCRIPTION)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "64":
|
||||
q.add_log_cmd("Star tracker: Request log subscription parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_LOG_SUBSCRIPTION)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "65":
|
||||
q.add_log_cmd("Star tracker: Request debug camera parameters")
|
||||
data = obyt + struct.pack("!I", StarTrackerActionIds.REQ_DEBUG_CAMERA)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "66":
|
||||
q.add_log_cmd("Star tracker: Set log level parameters")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.LOGLEVEL)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "67":
|
||||
q.add_log_cmd("Star tracker: Set log subscription parameters")
|
||||
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.LOG_SUBSCRIPTION)
|
||||
+ bytearray(json_file, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "68":
|
||||
q.add_log_cmd("Star tracker: Set debug camera parameters")
|
||||
json_file = get_config_file()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.DEBUG_CAMERA)
|
||||
+ 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")
|
||||
firmware = get_firmware()
|
||||
data = (
|
||||
obyt
|
||||
+ struct.pack("!I", StarTrackerActionIds.FIRMWARE_UPDATE)
|
||||
+ bytearray(firmware, "utf-8")
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "70":
|
||||
q.add_log_cmd("Star tracker: Disable timestamp generation")
|
||||
command = obyt + struct.pack(
|
||||
"!I", StarTrackerActionIds.DISBALE_TIMESTAMP_GENERATION
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "71":
|
||||
q.add_log_cmd("Star tracker: Enable timestamp generation")
|
||||
command = obyt + struct.pack(
|
||||
"!I", StarTrackerActionIds.ENABLE_TIMESTAMP_GENERATION
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
|
||||
def pack_read_command(object_id: bytes) -> bytearray:
|
||||
start_region = StartRegion.STAR_TRACKER_FIRMWARE
|
||||
size = PartitionSize.STAR_TRACKER_FIRMWARE
|
||||
path = input("Specify storage location (default - /mnt/sd0/startracker): ")
|
||||
if not path:
|
||||
path = FileDefs.download_path
|
||||
data = (
|
||||
object_id
|
||||
+ struct.pack("!I", StarTrackerActionIds.FLASH_READ)
|
||||
+ struct.pack("!B", start_region)
|
||||
+ struct.pack("!I", size)
|
||||
+ bytearray(path, "utf-8")
|
||||
)
|
||||
return bytearray(data)
|
||||
|
||||
|
||||
def pack_checksum_command(object_id: bytes) -> bytearray:
|
||||
start_region = StartRegion.STAR_TRACKER_FIRMWARE
|
||||
address = 0
|
||||
size = PartitionSize.STAR_TRACKER_FIRMWARE
|
||||
data = (
|
||||
object_id
|
||||
+ struct.pack("!I", StarTrackerActionIds.CHECKSUM)
|
||||
+ struct.pack("!B", start_region)
|
||||
+ struct.pack("!I", address)
|
||||
+ struct.pack("!I", size)
|
||||
)
|
||||
return bytearray(data)
|
||||
|
||||
|
||||
def get_config_file() -> str:
|
||||
LOGGER.info("Specify json file")
|
||||
input_helper = InputHelper(json_dict)
|
||||
key = input_helper.get_key()
|
||||
json_file = json_dict[key][1]
|
||||
return json_file
|
||||
|
||||
|
||||
def get_firmware() -> str:
|
||||
LOGGER.info("Specify firmware file")
|
||||
input_helper = InputHelper(firmware_dict)
|
||||
key = input_helper.get_key()
|
||||
firmware = firmware_dict[key][1]
|
||||
return firmware
|
||||
|
||||
|
||||
def get_upload_image() -> str:
|
||||
LOGGER.info("Specify image to upload")
|
||||
input_helper = InputHelper(upload_image_dict)
|
||||
key = input_helper.get_key()
|
||||
image = upload_image_dict[key][1]
|
||||
return image
|
@ -1,2 +0,0 @@
|
||||
class SetIds:
|
||||
HK = 3
|
@ -1,162 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
@file syrlinks_hk_handler.py
|
||||
@brief Syrlinks Hk Handler tests
|
||||
@author J. Meier
|
||||
@date 13.12.2020
|
||||
"""
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
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
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes
|
||||
import struct
|
||||
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
|
||||
class SetIds:
|
||||
RX_REGISTERS_DATASET = 1
|
||||
TX_REGISTERS_DATASET = 2
|
||||
|
||||
|
||||
class OpCodes:
|
||||
OFF = "off"
|
||||
ON = "on"
|
||||
NORMAL = "nml"
|
||||
STANDBY = "standby"
|
||||
MODULATION = "modulation"
|
||||
|
||||
|
||||
class CommandIds:
|
||||
READ_RX_STATUS_REGISTERS = 2
|
||||
SET_TX_MODE_STANDBY = 3
|
||||
SET_TX_MODE_MODULATION = 4
|
||||
SET_TX_MODE_CW = 5
|
||||
READ_TX_STATUS = 7
|
||||
READ_TX_WAVEFORM = 8
|
||||
READ_TX_AGC_VALUE_HIGH_BYTE = 9
|
||||
READ_TX_AGC_VALUE_LOW_BYTE = 10
|
||||
WRITE_LCL_CONFIG = 11
|
||||
READ_LCL_CONFIG_REGISTER = 12
|
||||
SET_WAVEFORM_OQPSK = 17
|
||||
SET_WAVEFORM_BPSK = 18
|
||||
SET_SECOND_CONFIG = 19
|
||||
ENABLE_DEBUG = 20
|
||||
DISABLE_DEBUG = 21
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_syrlinks_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(OpCodes.OFF, "Syrlinks Handler: Set mode off")
|
||||
oce.add(OpCodes.ON, "Syrlinks Handler: Set mode on")
|
||||
oce.add(OpCodes.NORMAL, "Syrlinks Handler: Set mode normal")
|
||||
oce.add(OpCodes.STANDBY, "Syrlinks Handler: Set TX standby")
|
||||
oce.add(OpCodes.MODULATION, "Syrlinks Handler: Set TX modulation")
|
||||
oce.add("5", "Syrlinks Handler: Set TX carrier wave")
|
||||
oce.add("6", "Syrlinks Handler: Read TX status")
|
||||
oce.add("7", "Syrlinks Handler: Read TX waveform")
|
||||
oce.add("8", "Syrlinks Handler: Read TX AGC value high byte")
|
||||
oce.add("9", "Syrlinks Handler: Read TX AGC value low byte")
|
||||
oce.add("12", "Syrlinks Handler: Write LCL config")
|
||||
oce.add("13", "Syrlinks Handler: Read RX status registers")
|
||||
oce.add("14", "Syrlinks Handler: Read LCL config register")
|
||||
oce.add("15", "Syrlinks Handler: Set waveform OQPSK")
|
||||
oce.add("16", "Syrlinks Handler: Set waveform BPSK")
|
||||
oce.add("17", "Syrlinks Handler: Set second config")
|
||||
oce.add("18", "Syrlinks Handler: Enable debug output")
|
||||
oce.add("19", "Syrlinks Handler: Disable debug output")
|
||||
defs.add_service(CustomServiceList.SYRLINKS.value, "Syrlinks Handler", oce)
|
||||
|
||||
|
||||
def pack_syrlinks_command(
|
||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str
|
||||
):
|
||||
obyt = object_id.as_bytes
|
||||
q.add_log_cmd(f"Testing Syrlinks with object id: {object_id.as_hex_string}")
|
||||
if op_code == OpCodes.OFF:
|
||||
q.add_log_cmd("Syrlinks: Set mode off")
|
||||
data = pack_mode_data(obyt, Modes.OFF, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == OpCodes.ON:
|
||||
q.add_log_cmd("Syrlinks: Set mode on")
|
||||
data = pack_mode_data(obyt, Modes.ON, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == OpCodes.NORMAL:
|
||||
q.add_log_cmd("Syrlinks: Mode Normal")
|
||||
data = pack_mode_data(obyt, Modes.NORMAL, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=data))
|
||||
if op_code == OpCodes.STANDBY:
|
||||
q.add_log_cmd("syrlinks: Set TX mode standby")
|
||||
data = obyt + struct.pack("!I", CommandIds.SET_TX_MODE_STANDBY)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == OpCodes.MODULATION:
|
||||
q.add_log_cmd("syrlinks: Set TX mode modulation")
|
||||
data = obyt + struct.pack("!I", CommandIds.SET_TX_MODE_MODULATION)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "5":
|
||||
q.add_log_cmd("syrlinks: Set TX mode CW")
|
||||
data = obyt + struct.pack("!I", CommandIds.SET_TX_MODE_CW)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=data))
|
||||
if op_code == "6":
|
||||
q.add_log_cmd("Syrlinks: Get RX Registers")
|
||||
sid = make_sid(obyt, SetIds.RX_REGISTERS_DATASET)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
if op_code == "7":
|
||||
q.add_log_cmd("Syrlinks: Get TX Registers")
|
||||
sid = make_sid(obyt, SetIds.TX_REGISTERS_DATASET)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
if op_code == "8":
|
||||
q.add_log_cmd("Syrlinks: Read TX status")
|
||||
command = obyt + struct.pack("!I", CommandIds.READ_TX_STATUS)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "9":
|
||||
q.add_log_cmd("Syrlinks: Read TX waveform")
|
||||
command = obyt + struct.pack("!I", CommandIds.READ_TX_WAVEFORM)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "10":
|
||||
q.add_log_cmd("Syrlinks: Read TX AGC value high byte")
|
||||
command = obyt + struct.pack("!I", CommandIds.READ_TX_AGC_VALUE_HIGH_BYTE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "11":
|
||||
q.add_log_cmd("Syrlinks: Read TX AGC value low byte")
|
||||
command = obyt + struct.pack("!I", CommandIds.READ_TX_AGC_VALUE_LOW_BYTE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "12":
|
||||
q.add_log_cmd("Syrlinks: Write LCL config")
|
||||
command = obyt + struct.pack("!I", CommandIds.WRITE_LCL_CONFIG)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "13":
|
||||
q.add_log_cmd("Syrlinks: Read RX status registers")
|
||||
command = obyt + struct.pack("!I", CommandIds.READ_RX_STATUS_REGISTERS)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "14":
|
||||
q.add_log_cmd("Syrlinks: Read LCL config register")
|
||||
command = obyt + struct.pack("!I", CommandIds.READ_LCL_CONFIG_REGISTER)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "15":
|
||||
q.add_log_cmd("Syrlinks: Set waveform OQPSK")
|
||||
command = obyt + struct.pack("!I", CommandIds.SET_WAVEFORM_OQPSK)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "16":
|
||||
q.add_log_cmd("Syrlinks: Set waveform BPSK")
|
||||
command = obyt + struct.pack("!I", CommandIds.SET_WAVEFORM_BPSK)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "17":
|
||||
q.add_log_cmd("Syrlinks: Set second config")
|
||||
command = obyt + struct.pack("!I", CommandIds.SET_SECOND_CONFIG)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "18":
|
||||
q.add_log_cmd("Syrlinks: Enable debug printout")
|
||||
command = obyt + struct.pack("!I", CommandIds.ENABLE_DEBUG)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if op_code == "19":
|
||||
q.add_log_cmd("Syrlinks: Disable debug printout")
|
||||
command = obyt + struct.pack("!I", CommandIds.DISABLE_DEBUG)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
@ -1,62 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
@file tmp1075.py
|
||||
@brief TMP1075 tests
|
||||
@author J. Meier
|
||||
@date 06.01.2021
|
||||
"""
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from eive_tmtc.pus_tc.service_200_mode import pack_mode_data
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import Modes
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
|
||||
class Tmp1075TestProcedure:
|
||||
"""
|
||||
@brief Use this class to define the tests to perform for the Tmp1075.
|
||||
@details Setting all to True will run all tests.
|
||||
Setting all to False will only run the tests set to True.
|
||||
"""
|
||||
|
||||
all = False
|
||||
start_adc_conversion = False
|
||||
get_temp = False
|
||||
set_mode_normal = (
|
||||
True # Setting mode to normal starts continuous temperature reading
|
||||
)
|
||||
set_mode_on = False # If mode is MODE_ON, temperature will only be read on command
|
||||
|
||||
|
||||
class Tmp1075ActionIds:
|
||||
get_temp = bytearray([0x0, 0x0, 0x0, 0x01])
|
||||
start_adc_conversion = bytearray([0x0, 0x0, 0x0, 0x02])
|
||||
|
||||
|
||||
def pack_tmp1075_test_into(
|
||||
object_id: ObjectIdU32, op_code: str, q: DefaultPusQueueHelper
|
||||
):
|
||||
q.add_log_cmd(
|
||||
f"Testing Tmp1075 Temperature Sensor Handler with object id: {object_id.as_hex_string}"
|
||||
)
|
||||
obyt = object_id.as_bytes
|
||||
if Tmp1075TestProcedure.all or Tmp1075TestProcedure.start_adc_conversion:
|
||||
q.add_log_cmd("TMP1075: Starting new temperature conversion")
|
||||
command = obyt + Tmp1075ActionIds.start_adc_conversion
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if Tmp1075TestProcedure.all or Tmp1075TestProcedure.get_temp:
|
||||
q.add_log_cmd("TMP1075: Read temperature")
|
||||
command = obyt + Tmp1075ActionIds.get_temp
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
if Tmp1075TestProcedure.set_mode_normal:
|
||||
q.add_log_cmd("TMP1075: Set Mode Normal")
|
||||
mode_data = pack_mode_data(obyt, Modes.NORMAL, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||
|
||||
if Tmp1075TestProcedure.set_mode_on:
|
||||
q.add_log_cmd("TMP1075: Set Mode On")
|
||||
mode_data = pack_mode_data(obyt, Modes.ON, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=mode_data))
|
||||
|
||||
return q
|
@ -1,218 +0,0 @@
|
||||
"""Hook function which packs telecommands based on service and operation code string
|
||||
"""
|
||||
from typing import cast
|
||||
|
||||
from eive_tmtc.tmtc.power.power import pack_power_commands
|
||||
from eive_tmtc.pus_tc.devs.rtd import pack_rtd_commands
|
||||
from eive_tmtc.pus_tc.devs.scex import pack_scex_cmds
|
||||
from eive_tmtc.pus_tc.system.controllers import (
|
||||
pack_cmd_ctrl_to_prompted_mode,
|
||||
get_object_from_op_code,
|
||||
)
|
||||
from tmtccmd import DefaultProcedureInfo, TcHandlerBase
|
||||
from tmtccmd.config import CoreServiceList
|
||||
from tmtccmd.logging import get_console_logger
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.decorator import (
|
||||
route_to_registered_service_handlers,
|
||||
ServiceProviderParams,
|
||||
)
|
||||
from tmtccmd.tc.pus_5_event import (
|
||||
pack_generic_service_5_test_into,
|
||||
)
|
||||
from tmtccmd.pus.pus_17_test import pack_service_17_ping_command
|
||||
|
||||
from eive_tmtc.pus_tc.service_200_mode import pack_service_200_test_into
|
||||
from eive_tmtc.tmtc.power.p60dock import pack_p60dock_cmds
|
||||
from eive_tmtc.tmtc.power.pdu2 import pack_pdu2_commands
|
||||
from eive_tmtc.tmtc.power.pdu1 import pack_pdu1_commands
|
||||
from eive_tmtc.tmtc.power.acu import pack_acu_commands
|
||||
from eive_tmtc.tmtc.acs.imtq import pack_imtq_test_into
|
||||
from eive_tmtc.pus_tc.devs.tmp1075 import pack_tmp1075_test_into
|
||||
from eive_tmtc.pus_tc.devs.heater import pack_heater_cmds
|
||||
from eive_tmtc.tmtc.acs.reaction_wheels import (
|
||||
pack_single_rw_test_into,
|
||||
pack_rw_ass_cmds,
|
||||
)
|
||||
from eive_tmtc.pus_tc.devs.rad_sensor import pack_rad_sensor_test_into
|
||||
from eive_tmtc.tmtc.payload.ploc_memory_dumper import pack_ploc_memory_dumper_cmd
|
||||
from eive_tmtc.pus_tc.devs.ccsds_handler import pack_ccsds_handler_test
|
||||
from eive_tmtc.pus_tc.system.core import pack_core_commands
|
||||
from eive_tmtc.pus_tc.devs.star_tracker import pack_star_tracker_commands
|
||||
from eive_tmtc.pus_tc.devs.syrlinks_hk_handler import pack_syrlinks_command
|
||||
from eive_tmtc.pus_tc.devs.gps import pack_gps_command
|
||||
from eive_tmtc.tmtc.acs.acs_board import pack_acs_command
|
||||
from eive_tmtc.tmtc.acs.sus_board import pack_sus_cmds
|
||||
from eive_tmtc.pus_tc.devs.plpcdu import pack_pl_pcdu_commands
|
||||
from eive_tmtc.pus_tc.devs.str_img_helper import pack_str_img_helper_command
|
||||
from eive_tmtc.pus_tc.system.tcs import pack_tcs_sys_commands
|
||||
from eive_tmtc.pus_tc.system.proc import pack_proc_commands
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.config.object_ids import (
|
||||
P60_DOCK_HANDLER,
|
||||
PDU_1_HANDLER_ID,
|
||||
PDU_2_HANDLER_ID,
|
||||
ACU_HANDLER_ID,
|
||||
TMP_1075_1_HANDLER_ID,
|
||||
TMP_1075_2_HANDLER_ID,
|
||||
HEATER_ID,
|
||||
IMTQ_HANDLER_ID,
|
||||
RW1_ID,
|
||||
RW2_ID,
|
||||
RW3_ID,
|
||||
RW4_ID,
|
||||
RAD_SENSOR_ID,
|
||||
STAR_TRACKER_ID,
|
||||
PLOC_MEMORY_DUMPER_ID,
|
||||
CCSDS_HANDLER_ID,
|
||||
PDEC_HANDLER_ID,
|
||||
STR_IMG_HELPER_ID,
|
||||
SYRLINKS_HANDLER_ID,
|
||||
RW_ASSEMBLY,
|
||||
get_object_ids,
|
||||
)
|
||||
import eive_tmtc.config.object_ids as oids
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
def handle_default_procedure(
|
||||
tc_base: TcHandlerBase,
|
||||
info: DefaultProcedureInfo,
|
||||
queue_helper: DefaultPusQueueHelper,
|
||||
):
|
||||
service = info.service
|
||||
op_code = info.op_code
|
||||
obj_id_man = get_object_ids()
|
||||
if service == CoreServiceList.SERVICE_5.value:
|
||||
return pack_generic_service_5_test_into(q=queue_helper)
|
||||
if service == CoreServiceList.SERVICE_200.value:
|
||||
return pack_service_200_test_into(q=queue_helper)
|
||||
if service == CustomServiceList.P60DOCK.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(P60_DOCK_HANDLER))
|
||||
return pack_p60dock_cmds(object_id=object_id, q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.RTD.value:
|
||||
return pack_rtd_commands(object_id=None, q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.PDU1.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(PDU_1_HANDLER_ID))
|
||||
return pack_pdu1_commands(object_id=object_id, q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.PDU2.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(PDU_2_HANDLER_ID))
|
||||
return pack_pdu2_commands(object_id=object_id, q=queue_helper, op_code=op_code)
|
||||
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:
|
||||
return pack_tcs_sys_commands(q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.TMP1075_1.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(TMP_1075_1_HANDLER_ID))
|
||||
return pack_tmp1075_test_into(
|
||||
object_id=object_id, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.TMP1075_2.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(TMP_1075_2_HANDLER_ID))
|
||||
return pack_tmp1075_test_into(
|
||||
object_id=object_id, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.HEATER.value:
|
||||
object_id = HEATER_ID
|
||||
return pack_heater_cmds(object_id=object_id, q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.IMTQ.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(IMTQ_HANDLER_ID))
|
||||
return pack_imtq_test_into(object_id=object_id, q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.REACTION_WHEEL_1.value:
|
||||
return pack_single_rw_test_into(
|
||||
object_id=RW1_ID, rw_idx=1, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.REACTION_WHEEL_2.value:
|
||||
return pack_single_rw_test_into(
|
||||
object_id=RW2_ID, rw_idx=2, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.REACTION_WHEEL_3.value:
|
||||
return pack_single_rw_test_into(
|
||||
object_id=RW3_ID, rw_idx=3, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.REACTION_WHEEL_4.value:
|
||||
return pack_single_rw_test_into(
|
||||
object_id=RW4_ID, rw_idx=4, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.RAD_SENSOR.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(RAD_SENSOR_ID))
|
||||
return pack_rad_sensor_test_into(
|
||||
object_id=object_id, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.STAR_TRACKER.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(STAR_TRACKER_ID))
|
||||
return pack_star_tracker_commands(
|
||||
object_id=object_id, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.STR_IMG_HELPER.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(STR_IMG_HELPER_ID))
|
||||
return pack_str_img_helper_command(
|
||||
object_id=object_id, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.CORE.value:
|
||||
return pack_core_commands(q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.PLOC_MEMORY_DUMPER.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(PLOC_MEMORY_DUMPER_ID))
|
||||
return pack_ploc_memory_dumper_cmd(
|
||||
object_id=object_id, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.POWER.value:
|
||||
return pack_power_commands(queue_helper, op_code)
|
||||
if service == CustomServiceList.ACS.value:
|
||||
return pack_acs_command(q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.GPS_CTRL.value:
|
||||
return pack_gps_command(
|
||||
object_id=oids.GPS_CONTROLLER, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.CCSDS_HANDLER.value:
|
||||
return pack_ccsds_handler_test(
|
||||
object_id=CCSDS_HANDLER_ID, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.PDEC_HANDLER.value:
|
||||
return pack_ccsds_handler_test(
|
||||
object_id=PDEC_HANDLER_ID, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.SYRLINKS.value:
|
||||
object_id = cast(ObjectIdU32, obj_id_man.get(SYRLINKS_HANDLER_ID))
|
||||
return pack_syrlinks_command(
|
||||
object_id=object_id, q=queue_helper, op_code=op_code
|
||||
)
|
||||
if service == CustomServiceList.PROCEDURE.value:
|
||||
return pack_proc_commands(q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.PL_PCDU.value:
|
||||
return pack_pl_pcdu_commands(q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.TCS_ASS.value:
|
||||
return pack_tcs_sys_commands(q=queue_helper, op_code=op_code)
|
||||
if service == CustomServiceList.RW_ASSEMBLY.value:
|
||||
return pack_rw_ass_cmds(q=queue_helper, object_id=RW_ASSEMBLY, op_code=op_code)
|
||||
if service == CustomServiceList.CONTROLLERS.value:
|
||||
from tmtcc import TcHandler
|
||||
|
||||
tc_handler = cast(TcHandler, tc_base)
|
||||
return pack_cmd_ctrl_to_prompted_mode(
|
||||
q=queue_helper,
|
||||
object_id=get_object_from_op_code(op_code),
|
||||
gui=tc_handler.gui,
|
||||
)
|
||||
if service == CustomServiceList.SCEX.value:
|
||||
return pack_scex_cmds(
|
||||
ServiceProviderParams(
|
||||
handler_base=tc_base,
|
||||
op_code=op_code,
|
||||
info=info,
|
||||
queue_helper=queue_helper,
|
||||
)
|
||||
)
|
||||
if not route_to_registered_service_handlers(
|
||||
service,
|
||||
ServiceProviderParams(
|
||||
handler_base=tc_base,
|
||||
op_code=op_code,
|
||||
info=info,
|
||||
queue_helper=queue_helper,
|
||||
),
|
||||
):
|
||||
LOGGER.warning(f"Invalid Service {service}")
|
@ -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:
|
||||
|
@ -1 +0,0 @@
|
||||
|
@ -1,19 +1,14 @@
|
||||
from typing import Union
|
||||
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import Modes
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.s200_fsfw_mode import Mode
|
||||
from tmtccmd.util import ObjectIdU32, ObjectIdBase
|
||||
|
||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||
import eive_tmtc.config.object_ids as obj_ids
|
||||
|
||||
from eive_tmtc.pus_tc.prompt_parameters import (
|
||||
prompt_parameters_cli,
|
||||
prompt_parameters_gui,
|
||||
)
|
||||
|
||||
|
||||
class OpCodes:
|
||||
class OpCode:
|
||||
THERMAL_CONTROLLER = [obj_ids.THERMAL_CONTROLLER_ID.hex(), "ctrl-th"]
|
||||
CORE_CONTROLLER = [obj_ids.CORE_CONTROLLER_ID.hex(), "ctrl-core"]
|
||||
|
||||
@ -26,11 +21,17 @@ class Info:
|
||||
def pack_cmd_ctrl_to_prompted_mode(
|
||||
q: DefaultPusQueueHelper, object_id: ObjectIdU32, gui: bool
|
||||
):
|
||||
from eive_tmtc.pus_tc.prompt_parameters import (
|
||||
prompt_parameters_cli,
|
||||
)
|
||||
|
||||
param_list = [
|
||||
{"name": "Mode", "defaultValue": "2"},
|
||||
{"name": "Submode", "defaultValue": "0"},
|
||||
]
|
||||
if gui:
|
||||
from eive_tmtc.pus_tc.prompt_parameters import prompt_parameters_gui
|
||||
|
||||
parameters = prompt_parameters_gui(param_list)
|
||||
else:
|
||||
parameters = prompt_parameters_cli(param_list)
|
||||
@ -53,7 +54,7 @@ def pack_cmd_ctrl_to_off(
|
||||
):
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=object_id.as_bytes,
|
||||
mode=Modes.OFF,
|
||||
mode=Mode.OFF,
|
||||
submode=0,
|
||||
q=q,
|
||||
info=f"Commanding {object_id} OFF",
|
||||
@ -63,7 +64,7 @@ def pack_cmd_ctrl_to_off(
|
||||
def pack_cmd_ctrl_to_on(q: DefaultPusQueueHelper, object_id: ObjectIdU32):
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=object_id.as_bytes,
|
||||
mode=Modes.ON,
|
||||
mode=Mode.ON,
|
||||
submode=0,
|
||||
q=q,
|
||||
info=f"Commanding {object_id} ON",
|
||||
@ -75,7 +76,7 @@ def pack_cmd_ctrl_to_nml(
|
||||
):
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=object_id.as_bytes,
|
||||
mode=Modes.NORMAL,
|
||||
mode=Mode.NORMAL,
|
||||
submode=0,
|
||||
q=q,
|
||||
info=f"Commanding {object_id} NORMAL",
|
||||
@ -85,10 +86,9 @@ 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 OpCodes.THERMAL_CONTROLLER:
|
||||
if op_code in OpCode.THERMAL_CONTROLLER:
|
||||
return obj_ids.THERMAL_CONTROLLER_ID
|
||||
if op_code in OpCodes.CORE_CONTROLLER:
|
||||
if op_code in OpCode.CORE_CONTROLLER:
|
||||
return obj_ids.CORE_CONTROLLER_ID
|
||||
|
@ -1,332 +0,0 @@
|
||||
import enum
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from tmtccmd.config import TmtcDefinitionWrapper
|
||||
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_8_funccmd import make_fsfw_action_cmd
|
||||
from tmtccmd.logging import get_console_logger
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import make_sid, generate_one_hk_command
|
||||
from tmtccmd.config.tmtc import OpCodeEntry, tmtc_definitions_provider
|
||||
from eive_tmtc.config.object_ids import CORE_CONTROLLER_ID
|
||||
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
class ActionIds(enum.IntEnum):
|
||||
LIST_DIR_INTO_FILE = 0
|
||||
SWITCH_REBOOT_FILE_HANDLING = 5
|
||||
RESET_REBOOT_COUNTER = 6
|
||||
SWITCH_IMG_LOCK = 7
|
||||
SET_MAX_REBOOT_CNT = 8
|
||||
UPDATE_OBSW_FROM_SD_0 = 10
|
||||
UPDATE_OBSW_FROM_SD_1 = 11
|
||||
UPDATE_OBSW_FROM_TMP = 12
|
||||
SWITCH_TO_SD_0 = 16
|
||||
SWITCH_TO_SD_1 = 17
|
||||
SWITCH_TO_BOTH_SD_CARDS = 18
|
||||
XSC_REBOOT = 32
|
||||
FULL_REBOOT = 34
|
||||
|
||||
|
||||
class SetIds(enum.IntEnum):
|
||||
HK = 5
|
||||
|
||||
|
||||
class OpCodes:
|
||||
REBOOT_XSC = ["0", "reboot_xsc"]
|
||||
XSC_REBOOT_SELF = ["1", "reboot_self"]
|
||||
XSC_REBOOT_0_0 = ["2", "reboot_00"]
|
||||
XSC_REBOOT_0_1 = ["3", "reboot_01"]
|
||||
XSC_REBOOT_1_0 = ["4", "reboot_10"]
|
||||
XSC_REBOOT_1_1 = ["5", "reboot_11"]
|
||||
REBOOT_FULL = ["6", "reboot_regular"]
|
||||
GET_HK = ["7", "get_hk"]
|
||||
OBSW_UPDATE_FROM_SD_0 = ["obsw_update_sd0"]
|
||||
OBSW_UPDATE_FROM_SD_1 = ["obsw_update_sd1"]
|
||||
OBSW_UPDATE_FROM_TMP = ["obsw_update_tmp"]
|
||||
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 = ["32", "rbh_off"]
|
||||
DISABLE_REBOOT_FILE_HANDLING = ["33", "rbh_on"]
|
||||
RESET_ALL_REBOOT_COUNTERS = ["34", "rbh_reset_a"]
|
||||
RESET_REBOOT_COUNTER_00 = ["35", "rbh_reset_00"]
|
||||
RESET_REBOOT_COUNTER_01 = ["36", "rbh_reset_01"]
|
||||
RESET_REBOOT_COUNTER_10 = ["37", "rbh_reset_10"]
|
||||
RESET_REBOOT_COUNTER_11 = ["38", "rbh_reset_11"]
|
||||
SET_MAX_REBOOT_CNT = ["39", "rbh_max_cnt"]
|
||||
|
||||
|
||||
class Info:
|
||||
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"
|
||||
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"
|
||||
|
||||
|
||||
class Chip(enum.IntEnum):
|
||||
CHIP_0 = 0
|
||||
CHIP_1 = 1
|
||||
NONE = 2
|
||||
|
||||
|
||||
class Copy(enum.IntEnum):
|
||||
COPY_0_NOM = 0
|
||||
COPY_1_GOLD = 1
|
||||
NONE = 2
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_core_controller_definitions(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(keys=OpCodes.REBOOT_XSC, info=Info.REBOOT_XSC)
|
||||
oce.add(keys=OpCodes.REBOOT_XSC, info=Info.REBOOT_XSC)
|
||||
oce.add(keys=OpCodes.REBOOT_FULL, info=Info.REBOOT_FULL)
|
||||
oce.add(keys=OpCodes.XSC_REBOOT_SELF, info="Reboot Self")
|
||||
oce.add(keys=OpCodes.XSC_REBOOT_0_0, info="Reboot 0 0")
|
||||
oce.add(keys=OpCodes.XSC_REBOOT_0_1, info="Reboot 0 1")
|
||||
oce.add(keys=OpCodes.XSC_REBOOT_1_0, info="Reboot 1 0")
|
||||
oce.add(keys=OpCodes.XSC_REBOOT_1_1, info="Reboot 1 1")
|
||||
oce.add(
|
||||
keys=OpCodes.GET_HK,
|
||||
info="Request housekeeping set",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.ENABLE_REBOOT_FILE_HANDLING,
|
||||
info="Enable reboot file handling",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.DISABLE_REBOOT_FILE_HANDLING,
|
||||
info="Disable reboot file handling",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.RESET_ALL_REBOOT_COUNTERS,
|
||||
info="Reset all reboot counters",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.RESET_REBOOT_COUNTER_00,
|
||||
info="Reset reboot counter 0 0",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.RESET_REBOOT_COUNTER_01,
|
||||
info="Reset reboot counter 0 1",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.RESET_REBOOT_COUNTER_10,
|
||||
info="Reset reboot counter 1 0",
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.RESET_REBOOT_COUNTER_11,
|
||||
info="Reset reboot counter 1 1",
|
||||
)
|
||||
oce.add(keys=OpCodes.OBSW_UPDATE_FROM_SD_0, info=Info.OBSW_UPDATE_FROM_SD_0)
|
||||
oce.add(keys=OpCodes.OBSW_UPDATE_FROM_SD_1, info=Info.OBSW_UPDATE_FROM_SD_1)
|
||||
oce.add(keys=OpCodes.OBSW_UPDATE_FROM_TMP, info=Info.OBSW_UPDATE_FROM_TMP)
|
||||
oce.add(keys=OpCodes.SWITCH_TO_SD_0, info=Info.SWITCH_TO_SD_0)
|
||||
oce.add(keys=OpCodes.SWITCH_TO_SD_1, info=Info.SWITCH_TO_SD_1)
|
||||
oce.add(keys=OpCodes.SWITCH_TO_BOTH_SD_CARDS, info=Info.SWITCH_TO_BOTH_SD_CARDS)
|
||||
defs.add_service(CustomServiceList.CORE.value, "Core Controller", oce)
|
||||
|
||||
|
||||
def pack_core_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
if op_code in OpCodes.REBOOT_XSC:
|
||||
reboot_self, chip_select, copy_select = determine_reboot_params()
|
||||
perform_reboot_cmd(
|
||||
q=q,
|
||||
reboot_self=reboot_self,
|
||||
chip=chip_select,
|
||||
copy=copy_select,
|
||||
)
|
||||
if op_code in OpCodes.REBOOT_FULL:
|
||||
q.add_log_cmd(f"Core Command: {Info.REBOOT_FULL}")
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID, action_id=ActionIds.FULL_REBOOT
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.XSC_REBOOT_SELF:
|
||||
perform_reboot_cmd(q=q, reboot_self=True)
|
||||
if op_code in OpCodes.XSC_REBOOT_0_0:
|
||||
perform_reboot_cmd(
|
||||
q=q, reboot_self=False, chip=Chip.CHIP_0, copy=Copy.COPY_0_NOM
|
||||
)
|
||||
if op_code in OpCodes.XSC_REBOOT_0_1:
|
||||
perform_reboot_cmd(
|
||||
q=q,
|
||||
reboot_self=False,
|
||||
chip=Chip.CHIP_0,
|
||||
copy=Copy.COPY_1_GOLD,
|
||||
)
|
||||
if op_code in OpCodes.XSC_REBOOT_1_0:
|
||||
perform_reboot_cmd(
|
||||
q=q, reboot_self=False, chip=Chip.CHIP_1, copy=Copy.COPY_0_NOM
|
||||
)
|
||||
if op_code in OpCodes.XSC_REBOOT_1_1:
|
||||
perform_reboot_cmd(
|
||||
q=q,
|
||||
reboot_self=False,
|
||||
chip=Chip.CHIP_1,
|
||||
copy=Copy.COPY_1_GOLD,
|
||||
)
|
||||
if op_code in OpCodes.DISABLE_REBOOT_FILE_HANDLING:
|
||||
q.add_log_cmd("Disabling reboot file handling")
|
||||
user_data = bytearray([0])
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING,
|
||||
user_data=user_data,
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.ENABLE_REBOOT_FILE_HANDLING:
|
||||
q.add_log_cmd("Enabling reboot file handling")
|
||||
user_data = bytearray([1])
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionIds.SWITCH_REBOOT_FILE_HANDLING,
|
||||
user_data=user_data,
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.RESET_ALL_REBOOT_COUNTERS:
|
||||
q.add_log_cmd("Resetting all reboot counters")
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionIds.RESET_REBOOT_COUNTER,
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.RESET_REBOOT_COUNTER_00:
|
||||
reset_specific_boot_counter(q, 0, 0)
|
||||
if op_code in OpCodes.RESET_REBOOT_COUNTER_01:
|
||||
reset_specific_boot_counter(q, 0, 1)
|
||||
if op_code in OpCodes.RESET_REBOOT_COUNTER_10:
|
||||
reset_specific_boot_counter(q, 1, 0)
|
||||
if op_code in OpCodes.RESET_REBOOT_COUNTER_11:
|
||||
reset_specific_boot_counter(q, 1, 1)
|
||||
if op_code in OpCodes.OBSW_UPDATE_FROM_SD_0:
|
||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_0)
|
||||
q.add_pus_tc(pack_obsw_update_cmd(ActionIds.UPDATE_OBSW_FROM_SD_0))
|
||||
if op_code in OpCodes.OBSW_UPDATE_FROM_SD_1:
|
||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_SD_1)
|
||||
q.add_pus_tc(pack_obsw_update_cmd(ActionIds.UPDATE_OBSW_FROM_SD_1))
|
||||
if op_code in OpCodes.OBSW_UPDATE_FROM_TMP:
|
||||
q.add_log_cmd(Info.OBSW_UPDATE_FROM_TMP)
|
||||
q.add_pus_tc(pack_obsw_update_cmd(ActionIds.UPDATE_OBSW_FROM_TMP))
|
||||
if op_code in OpCodes.SWITCH_TO_SD_0:
|
||||
q.add_log_cmd(Info.SWITCH_TO_SD_0)
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID, action_id=ActionIds.SWITCH_TO_SD_0
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.SWITCH_TO_SD_1:
|
||||
q.add_log_cmd(Info.SWITCH_TO_SD_1)
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID, action_id=ActionIds.SWITCH_TO_SD_1
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.SWITCH_TO_BOTH_SD_CARDS:
|
||||
while True:
|
||||
active_sd_card = int(input("Please specify active SD cqrd [0/1]: "))
|
||||
if active_sd_card not in [0, 1]:
|
||||
LOGGER.warning("Invalid SD card specified. Try again")
|
||||
break
|
||||
q.add_log_cmd(Info.SWITCH_TO_BOTH_SD_CARDS)
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionIds.SWITCH_TO_BOTH_SD_CARDS,
|
||||
user_data=bytes([active_sd_card]),
|
||||
)
|
||||
)
|
||||
if op_code in OpCodes.GET_HK:
|
||||
q.add_log_cmd("Requesting housekeeping set")
|
||||
sid = make_sid(object_id=CORE_CONTROLLER_ID, set_id=SetIds.HK)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
|
||||
|
||||
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(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionIds.RESET_REBOOT_COUNTER,
|
||||
user_data=bytes([chip, copy]),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def determine_reboot_params() -> (bool, Chip, Copy):
|
||||
chip_select = -1
|
||||
copy_select = -1
|
||||
reboot_self = input("Reboot self? [y/n]: ")
|
||||
if reboot_self in ["y", "yes", "1"]:
|
||||
LOGGER.info("Rebooting currently running image")
|
||||
return True, chip_select, copy_select
|
||||
LOGGER.info("Rebooting image specified by chip and copy")
|
||||
return False, determine_chip_and_copy()
|
||||
|
||||
|
||||
def determine_chip_and_copy() -> (int, int):
|
||||
while True:
|
||||
chip_select = input("Chip select [0/1]: ")
|
||||
if chip_select in ["0", "1"]:
|
||||
if chip_select == "0":
|
||||
chip_select = Chip.CHIP_0
|
||||
else:
|
||||
chip_select = Chip.CHIP_1
|
||||
break
|
||||
else:
|
||||
LOGGER.warning("Invalid chip select value. Try again")
|
||||
while True:
|
||||
copy_select = input("Copy select [0/1]: ")
|
||||
if copy_select in ["0", "1"]:
|
||||
if copy_select == "0":
|
||||
copy_select = Copy.COPY_0_NOM
|
||||
else:
|
||||
copy_select = Copy.COPY_1_GOLD
|
||||
break
|
||||
else:
|
||||
LOGGER.warning("Invalid copy select value. Try again")
|
||||
return chip_select, copy_select
|
||||
|
||||
|
||||
def pack_obsw_update_cmd(action_id: int) -> PusTelecommand:
|
||||
chip, copy = determine_chip_and_copy()
|
||||
user_data = bytes([chip, copy])
|
||||
return make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID, action_id=action_id, user_data=user_data
|
||||
)
|
||||
|
||||
|
||||
def perform_reboot_cmd(
|
||||
q: DefaultPusQueueHelper,
|
||||
reboot_self: bool,
|
||||
chip: Chip = Chip.NONE,
|
||||
copy: Copy = Copy.NONE,
|
||||
):
|
||||
tc_data = bytearray()
|
||||
if reboot_self:
|
||||
q.add_log_cmd("Packing reboot command for current image")
|
||||
tc_data.append(True)
|
||||
else:
|
||||
tc_data.append(False)
|
||||
tc_data.append(chip)
|
||||
tc_data.append(copy)
|
||||
q.add_log_cmd(f"Packing reboot command for chip {chip} and copy {copy}")
|
||||
q.add_pus_tc(
|
||||
make_fsfw_action_cmd(
|
||||
object_id=CORE_CONTROLLER_ID,
|
||||
action_id=ActionIds.XSC_REBOOT,
|
||||
user_data=tc_data,
|
||||
)
|
||||
)
|
@ -1,50 +1,63 @@
|
||||
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 eive_tmtc.pus_tc.system.tcs import pack_tcs_sys_commands
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_11_tc_sched import (
|
||||
generate_time_tagged_cmd,
|
||||
generate_enable_tc_sched_cmd,
|
||||
generate_reset_tc_sched_cmd,
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.s11_tc_sched import (
|
||||
create_time_tagged_cmd,
|
||||
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.pus_tc.system.tcs import OpCodes as TcsOpCodes
|
||||
from eive_tmtc.pus_tc.devs.bpx_batt import BpxSetIds
|
||||
from eive_tmtc.pus_tc.system.core import SetIds as CoreSetIds
|
||||
from eive_tmtc.tmtc.power.common_power import SetIds as GsSetIds
|
||||
from eive_tmtc.pus_tc.devs.rad_sensor import SetIds as RadSetIds
|
||||
from eive_tmtc.pus_tc.devs.mgms import MgmLis3SetIds as MgmLis3SetIds_0_2
|
||||
from eive_tmtc.pus_tc.devs.mgms import MgmRm3100SetIds as MgmRm3100SetIds_1_3
|
||||
from eive_tmtc.pus_tc.devs.gyros import AdisGyroSetIds as AdisGyroSetIds_0_2
|
||||
from eive_tmtc.pus_tc.devs.gyros import L3gGyroSetIds as L3gGyroSetIds_1_3
|
||||
from eive_tmtc.pus_tc.devs.syrlinks_hk_handler import SetIds as SyrlinksSetIds
|
||||
from eive_tmtc.pus_tc.devs.gps import SetIds as GpsSetIds
|
||||
from eive_tmtc.tmtc.acs.imtq import ImtqSetIds
|
||||
from eive_tmtc.pus_tc.devs.sus import SetIds
|
||||
from eive_tmtc.pus_tc.devs.star_tracker import SetIds as StrSetIds
|
||||
from eive_tmtc.tmtc.acs.reaction_wheels import RwSetIds, rw_speed_up_cmd_consec
|
||||
from eive_tmtc.tmtc.tcs.brd_assy import OpCodeAssy as TcsOpCodes
|
||||
from eive_tmtc.tmtc.tcs.subsystem import pack_tcs_sys_commands
|
||||
from eive_tmtc.tmtc.core import SetId as CoreSetIds
|
||||
from eive_tmtc.tmtc.power.common_power import SetId as GsSetIds
|
||||
from eive_tmtc.tmtc.com.syrlinks_handler import SetId as SyrlinksSetIds
|
||||
from eive_tmtc.tmtc.acs.imtq import ImtqSetId
|
||||
from eive_tmtc.tmtc.acs.star_tracker import SetId as StrSetIds
|
||||
from eive_tmtc.tmtc.acs.reaction_wheels import (
|
||||
RwSetId,
|
||||
rw_speed_up_cmd_consec,
|
||||
rw_speed_down_cmd_consec,
|
||||
)
|
||||
from eive_tmtc.pus_tc.system.controllers import (
|
||||
pack_cmd_ctrl_to_off,
|
||||
pack_cmd_ctrl_to_nml,
|
||||
)
|
||||
from eive_tmtc.tmtc.acs.acs_board import pack_acs_command
|
||||
from eive_tmtc.tmtc.acs.acs_board import pack_acs_board_command
|
||||
from eive_tmtc.tmtc.acs.sus_board import pack_sus_cmds
|
||||
from eive_tmtc.tmtc.acs.imtq import pack_imtq_test_into, pack_dipole_command
|
||||
from eive_tmtc.pus_tc.devs.star_tracker import pack_star_tracker_commands
|
||||
from eive_tmtc.tmtc.acs.imtq import create_imtq_command, pack_dipole_command
|
||||
from eive_tmtc.tmtc.acs.star_tracker import pack_star_tracker_commands
|
||||
from eive_tmtc.tmtc.acs.reaction_wheels import pack_rw_ass_cmds, pack_set_speed_command
|
||||
|
||||
from eive_tmtc.tmtc.acs.sus import SetId
|
||||
from eive_tmtc.tmtc.power.bpx_batt import BpxSetId
|
||||
from eive_tmtc.tmtc.payload.rad_sensor import SetId as RadSetIds
|
||||
from eive_tmtc.tmtc.acs.mgms import MgmLis3SetId as MgmLis3SetIds_0_2
|
||||
from eive_tmtc.tmtc.acs.mgms import MgmRm3100SetId as MgmRm3100SetIds_1_3
|
||||
from eive_tmtc.tmtc.acs.gyros import (
|
||||
AdisGyroSetId as AdisGyroSetIds_0_2,
|
||||
L3gGyroSetId as L3gGyroSetIds_1_3,
|
||||
)
|
||||
from eive_tmtc.tmtc.acs.gps import SetId as GpsSetIds
|
||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||
make_sid,
|
||||
disable_periodic_hk_command,
|
||||
create_enable_periodic_hk_command_with_interval,
|
||||
)
|
||||
|
||||
class OpCodes:
|
||||
|
||||
class OpCode:
|
||||
"""FT: Functional Test"""
|
||||
|
||||
TV_SETUP_TCS_FT_ON = ["s", "tcs-ft-on"]
|
||||
@ -88,34 +101,34 @@ KAI = KeyAndInfo
|
||||
|
||||
PROC_INFO_DICT = {
|
||||
KAI.TV_SETUP_TCS_FT_ON[0]: [
|
||||
OpCodes.TV_SETUP_TCS_FT_ON,
|
||||
OpCode.TV_SETUP_TCS_FT_ON,
|
||||
KAI.TV_SETUP_TCS_FT_ON[1],
|
||||
120.0,
|
||||
10.0,
|
||||
],
|
||||
KAI.TV_TEARDOWN_TCS_FT_OFF[0]: [
|
||||
OpCodes.TV_TEARDOWN_TCS_FT_OFF,
|
||||
OpCode.TV_TEARDOWN_TCS_FT_OFF,
|
||||
KAI.TV_TEARDOWN_TCS_FT_OFF[1],
|
||||
120.0,
|
||||
10.0,
|
||||
],
|
||||
KAI.BAT_FT[0]: [OpCodes.BAT_FT, KAI.BAT_FT[1], 120.0, 10.0],
|
||||
KAI.CORE_FT[0]: [OpCodes.CORE_FT, KAI.CORE_FT[1], 120.0, 10.0],
|
||||
KAI.PCDU_FT[0]: [OpCodes.PCDU_FT, KAI.PCDU_FT[1], 120.0, 10.0],
|
||||
KAI.RAD_SEN_FT[0]: [OpCodes.RAD_SEN_FT, KAI.RAD_SEN_FT[1], 120.0, 10.0],
|
||||
KAI.ACS_FT[0]: [OpCodes.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0],
|
||||
KAI.MGT_FT[0]: [OpCodes.MGT_FT, KAI.MGT_FT[1], 120.0, 10.0],
|
||||
KAI.BAT_FT[0]: [OpCode.BAT_FT, KAI.BAT_FT[1], 120.0, 10.0],
|
||||
KAI.CORE_FT[0]: [OpCode.CORE_FT, KAI.CORE_FT[1], 120.0, 10.0],
|
||||
KAI.PCDU_FT[0]: [OpCode.PCDU_FT, KAI.PCDU_FT[1], 120.0, 10.0],
|
||||
KAI.RAD_SEN_FT[0]: [OpCode.RAD_SEN_FT, KAI.RAD_SEN_FT[1], 120.0, 10.0],
|
||||
KAI.ACS_FT[0]: [OpCode.ACS_FT, KAI.ACS_FT[1], 120.0, 10.0],
|
||||
KAI.MGT_FT[0]: [OpCode.MGT_FT, KAI.MGT_FT[1], 120.0, 10.0],
|
||||
# collection_time for KAI.MGT_FT_DP maybe be reduced as a full 120
|
||||
# seconds is not needed after MGTs are tested
|
||||
KAI.MGT_FT_DP[0]: [OpCodes.MGT_FT_DP, KAI.MGT_FT_DP[1], 10.0, 10.0],
|
||||
KAI.SUS_FT[0]: [OpCodes.SUS_FT, KAI.SUS_FT[1], 120.0, 10.0],
|
||||
KAI.STR_FT[0]: [OpCodes.STR_FT, KAI.STR_FT[1], 120.0, 10.0],
|
||||
KAI.MGT_FT_DP[0]: [OpCode.MGT_FT_DP, KAI.MGT_FT_DP[1], 10.0, 10.0],
|
||||
KAI.SUS_FT[0]: [OpCode.SUS_FT, KAI.SUS_FT[1], 120.0, 10.0],
|
||||
KAI.STR_FT[0]: [OpCode.STR_FT, KAI.STR_FT[1], 120.0, 10.0],
|
||||
# collection_time for KAI.RW_FT_ONE_RW maybe be reduced as a full 120
|
||||
# seconds is not needed after RWs are tested
|
||||
KAI.RW_FT_ONE_RW[0]: [OpCodes.RW_FT_ONE_RW, KAI.RW_FT_ONE_RW[1], 10.0, 1.0],
|
||||
KAI.RW_FT_ONE_RW[0]: [OpCode.RW_FT_ONE_RW, KAI.RW_FT_ONE_RW[1], 10.0, 1.0],
|
||||
# collection_time for KAI.RW_FT_ONE_RW maybe be reduced as a full 120
|
||||
# seconds is not needed after RWs are tested
|
||||
KAI.RW_FT_TWO_RWS[0]: [OpCodes.RW_FT_TWO_RWS, KAI.RW_FT_TWO_RWS[1], 10.0, 1.0],
|
||||
KAI.RW_FT_TWO_RWS[0]: [OpCode.RW_FT_TWO_RWS, KAI.RW_FT_TWO_RWS[1], 10.0, 1.0],
|
||||
}
|
||||
|
||||
|
||||
@ -147,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],
|
||||
@ -204,7 +217,7 @@ def pack_generic_hk_listening_cmds(
|
||||
else:
|
||||
for cmd in disable_cmd_list:
|
||||
q.add_pus_tc(
|
||||
generate_time_tagged_cmd(
|
||||
create_time_tagged_cmd(
|
||||
release_time=struct.pack("!I", int(current_time)), tc_to_insert=cmd
|
||||
)
|
||||
)
|
||||
@ -215,15 +228,17 @@ 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 OpCodes.RESET_SCHED:
|
||||
if op_code in OpCode.RESET_SCHED:
|
||||
q.add_log_cmd("Resetting/Clearing TC schedule")
|
||||
q.add_pus_tc(generate_reset_tc_sched_cmd())
|
||||
if op_code in OpCodes.BAT_FT:
|
||||
q.add_pus_tc(create_reset_tc_sched_cmd())
|
||||
if op_code in OpCode.BAT_FT:
|
||||
key = KAI.BAT_FT[0]
|
||||
sid_list.append(make_sid(oids.BPX_HANDLER_ID, BpxSetIds.GET_HK_SET))
|
||||
sid_list.append(make_sid(oids.BPX_HANDLER_ID, BpxSetId.GET_HK_SET))
|
||||
diag_list = [False]
|
||||
pack_generic_hk_listening_cmds(
|
||||
q=q,
|
||||
@ -233,7 +248,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
if op_code in OpCodes.CORE_FT:
|
||||
if op_code in OpCode.CORE_FT:
|
||||
key = KAI.CORE_FT[0]
|
||||
sid_list.append(make_sid(oids.CORE_CONTROLLER_ID, CoreSetIds.HK))
|
||||
diag_list = [False]
|
||||
@ -245,7 +260,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
if op_code in OpCodes.PCDU_FT:
|
||||
if op_code in OpCode.PCDU_FT:
|
||||
key = KAI.PCDU_FT[0]
|
||||
pcdu_pairs = [
|
||||
(oids.P60_DOCK_HANDLER, GsSetIds.CORE),
|
||||
@ -281,7 +296,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
if op_code in OpCodes.RAD_SEN_FT:
|
||||
if op_code in OpCode.RAD_SEN_FT:
|
||||
key = KAI.RAD_SEN_FT[0]
|
||||
sid_list.append(make_sid(oids.RAD_SENSOR_ID, RadSetIds.HK))
|
||||
diag_list = [False]
|
||||
@ -293,18 +308,18 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
if op_code in OpCodes.TV_SETUP_TCS_FT_ON:
|
||||
if op_code in OpCode.TV_SETUP_TCS_FT_ON:
|
||||
# Enable scheduling
|
||||
q.add_pus_tc(generate_enable_tc_sched_cmd())
|
||||
q.add_pus_tc(create_enable_tc_sched_cmd())
|
||||
# check whether tcs_assembly also has to be commanded to NORMAL Mode
|
||||
pack_tcs_sys_commands(q=q, op_code=TcsOpCodes.TCS_BOARD_ASS_NORMAL[0])
|
||||
pack_tcs_sys_commands(q=q, cmd_str=TcsOpCodes.TCS_BOARD_ASS_NORMAL[0])
|
||||
pack_cmd_ctrl_to_nml(q=q, object_id=obj_id_dict.get(oids.THERMAL_CONTROLLER_ID))
|
||||
|
||||
if op_code in OpCodes.TV_TEARDOWN_TCS_FT_OFF:
|
||||
if op_code in OpCode.TV_TEARDOWN_TCS_FT_OFF:
|
||||
# TCS board should always be on anyway, do not command it off here
|
||||
pack_cmd_ctrl_to_off(q=q, object_id=obj_id_dict.get(oids.THERMAL_CONTROLLER_ID))
|
||||
|
||||
if op_code in OpCodes.ACS_FT:
|
||||
if op_code in OpCode.ACS_FT:
|
||||
key = KAI.ACS_FT[0]
|
||||
a_side_pairs = [
|
||||
(oids.MGM_0_LIS3_HANDLER_ID, MgmLis3SetIds_0_2.CORE_HK),
|
||||
@ -322,7 +337,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
]
|
||||
d_side_pairs = a_side_pairs + b_side_pairs
|
||||
diag_list = [False, False, True, False, False]
|
||||
pack_acs_command(q=q, op_code="acs-a")
|
||||
pack_acs_board_command(q=q, cmd_str="acs-a")
|
||||
|
||||
for a_side_dev in a_side_pairs:
|
||||
oid = a_side_dev[0]
|
||||
@ -336,9 +351,9 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
pack_acs_command(q=q, op_code="acs-off")
|
||||
pack_acs_board_command(q=q, cmd_str="acs-off")
|
||||
q.add_wait_seconds(5.0)
|
||||
pack_acs_command(q=q, op_code="acs-b")
|
||||
pack_acs_board_command(q=q, cmd_str="acs-b")
|
||||
|
||||
sid_list.clear()
|
||||
diag_list = [False, False, True, False, False]
|
||||
@ -355,9 +370,9 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
pack_acs_command(q=q, op_code="acs-off")
|
||||
pack_acs_board_command(q=q, cmd_str="acs-off")
|
||||
q.add_wait_seconds(5.0)
|
||||
pack_acs_command(q=q, op_code="acs-d")
|
||||
pack_acs_board_command(q=q, cmd_str="acs-d")
|
||||
|
||||
sid_list.clear()
|
||||
|
||||
@ -385,14 +400,14 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
pack_acs_command(q=q, op_code="acs-off")
|
||||
pack_acs_board_command(q=q, cmd_str="acs-off")
|
||||
|
||||
if op_code in OpCodes.MGT_FT:
|
||||
if op_code in OpCode.MGT_FT:
|
||||
key = KAI.MGT_FT[0]
|
||||
imtq_pairs = [
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetId.ENG_HK_NO_TORQUE),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetId.CAL_MTM_SET),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetId.RAW_MTM_NO_TORQUE),
|
||||
]
|
||||
diag_list = [
|
||||
True,
|
||||
@ -401,10 +416,10 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
]
|
||||
|
||||
# Command MGT to mode on
|
||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="1")
|
||||
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="1")
|
||||
q.add_wait_seconds(5.0)
|
||||
# Command MGT to normal mode
|
||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="2")
|
||||
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="2")
|
||||
|
||||
for imtq_dev in imtq_pairs:
|
||||
oid = imtq_dev[0]
|
||||
@ -418,9 +433,9 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="0")
|
||||
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="0")
|
||||
|
||||
if op_code in OpCodes.MGT_FT_DP:
|
||||
if op_code in OpCode.MGT_FT_DP:
|
||||
key = KAI.MGT_FT_DP[0]
|
||||
a_side_pairs = [
|
||||
(oids.MGM_0_LIS3_HANDLER_ID, MgmLis3SetIds_0_2.CORE_HK),
|
||||
@ -437,9 +452,9 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
(oids.GPS_CONTROLLER, GpsSetIds.HK),
|
||||
]
|
||||
imtq_pairs = [
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetIds.ENG_HK_SET),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetIds.CAL_MTM_SET),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetIds.RAW_MTM_SET),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetId.ENG_HK_NO_TORQUE),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetId.CAL_MTM_SET),
|
||||
(oids.IMTQ_HANDLER_ID, ImtqSetId.RAW_MTM_NO_TORQUE),
|
||||
]
|
||||
d_side_and_imtq_pairs = a_side_pairs + b_side_pairs + imtq_pairs
|
||||
diag_list = [
|
||||
@ -457,12 +472,12 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
True,
|
||||
True,
|
||||
]
|
||||
pack_acs_command(q=q, op_code="acs-d")
|
||||
pack_acs_board_command(q=q, cmd_str="acs-d")
|
||||
# Command MGT to mode on
|
||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="1")
|
||||
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="1")
|
||||
q.add_wait_seconds(20.0)
|
||||
# Command MGT to normal mode
|
||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="2")
|
||||
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="2")
|
||||
|
||||
for d_side_and_imtq_dev in d_side_and_imtq_pairs:
|
||||
oid = d_side_and_imtq_dev[0]
|
||||
@ -479,10 +494,10 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=cfg,
|
||||
)
|
||||
|
||||
pack_imtq_test_into(oids.IMTQ_HANDLER_ID, q=q, op_code="0")
|
||||
pack_acs_command(q=q, op_code="acs-off")
|
||||
create_imtq_command(oids.IMTQ_HANDLER_ID, q=q, cmd_str="0")
|
||||
pack_acs_board_command(q=q, cmd_str="acs-off")
|
||||
|
||||
if op_code in OpCodes.SUS_FT:
|
||||
if op_code in OpCode.SUS_FT:
|
||||
key = KAI.SUS_FT[0]
|
||||
|
||||
pack_sus_cmds(q=q, op_code="sus-nom")
|
||||
@ -514,7 +529,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
|
||||
# SUSs
|
||||
for nom_sus in sus_n_ids:
|
||||
sid_list.append(make_sid(nom_sus, SetIds.HK))
|
||||
sid_list.append(make_sid(nom_sus, SetId.HK))
|
||||
pack_generic_hk_listening_cmds(
|
||||
q=q,
|
||||
proc_key=key,
|
||||
@ -523,7 +538,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
pack_acs_command(q=q, op_code="sus-off")
|
||||
pack_acs_board_command(q=q, cmd_str="sus-off")
|
||||
q.add_wait_seconds(5.0)
|
||||
pack_sus_cmds(q=q, op_code="sus-red")
|
||||
|
||||
@ -538,7 +553,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
|
||||
# SUSs
|
||||
for red_sus in sus_r_ids:
|
||||
sid_list.append(make_sid(red_sus, SetIds.HK))
|
||||
sid_list.append(make_sid(red_sus, SetId.HK))
|
||||
pack_generic_hk_listening_cmds(
|
||||
q=q,
|
||||
proc_key=key,
|
||||
@ -547,15 +562,15 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
pack_acs_command(q=q, op_code="sus-off")
|
||||
pack_acs_board_command(q=q, cmd_str="sus-off")
|
||||
q.add_wait_seconds(5.0)
|
||||
pack_sus_cmds(q=q, op_code="sus-d")
|
||||
|
||||
# SUSs
|
||||
for nom_sus in sus_n_ids:
|
||||
sid_list.append(make_sid(nom_sus, SetIds.HK))
|
||||
sid_list.append(make_sid(nom_sus, SetId.HK))
|
||||
for red_sus in sus_r_ids:
|
||||
sid_list.append(make_sid(red_sus, SetIds.HK))
|
||||
sid_list.append(make_sid(red_sus, SetId.HK))
|
||||
diag_list = [
|
||||
True,
|
||||
True,
|
||||
@ -578,9 +593,9 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
pack_acs_command(q=q, op_code="sus-off")
|
||||
pack_acs_board_command(q=q, cmd_str="sus-off")
|
||||
|
||||
if op_code in OpCodes.SYRLINKS_FT:
|
||||
if op_code in OpCode.SYRLINKS_FT:
|
||||
key = KAI.SYRLINKS_FT[0]
|
||||
sid_list = [
|
||||
make_sid(oids.SYRLINKS_HANDLER_ID, SyrlinksSetIds.RX_REGISTERS_DATASET),
|
||||
@ -594,10 +609,10 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
diag_list=[False],
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
if op_code in OpCodes.STR_FT:
|
||||
if op_code in OpCode.STR_FT:
|
||||
key = KAI.STR_FT[0]
|
||||
|
||||
pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, q=q, op_code="2")
|
||||
pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, q=q, cmd_str="2")
|
||||
|
||||
# STR
|
||||
sid_list.append(make_sid(oids.STAR_TRACKER_ID, StrSetIds.TEMPERATURE))
|
||||
@ -610,23 +625,23 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg.default(),
|
||||
)
|
||||
|
||||
pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, q=q, op_code="3")
|
||||
pack_star_tracker_commands(object_id=oids.STAR_TRACKER_ID, q=q, cmd_str="3")
|
||||
|
||||
if op_code in OpCodes.RW_FT_ONE_RW:
|
||||
if op_code in OpCode.RW_FT_ONE_RW:
|
||||
key = KAI.RW_FT_ONE_RW[0]
|
||||
rw_pairs = [
|
||||
(oids.RW1_ID, RwSetIds.STATUS_SET_ID),
|
||||
(oids.RW1_ID, RwSetIds.LAST_RESET),
|
||||
(oids.RW1_ID, RwSetIds.TM_SET),
|
||||
(oids.RW2_ID, RwSetIds.STATUS_SET_ID),
|
||||
(oids.RW2_ID, RwSetIds.LAST_RESET),
|
||||
(oids.RW2_ID, RwSetIds.TM_SET),
|
||||
(oids.RW3_ID, RwSetIds.STATUS_SET_ID),
|
||||
(oids.RW3_ID, RwSetIds.LAST_RESET),
|
||||
(oids.RW3_ID, RwSetIds.TM_SET),
|
||||
(oids.RW4_ID, RwSetIds.STATUS_SET_ID),
|
||||
(oids.RW4_ID, RwSetIds.LAST_RESET),
|
||||
(oids.RW4_ID, RwSetIds.TM_SET),
|
||||
(oids.RW1_ID, RwSetId.STATUS_SET_ID),
|
||||
(oids.RW1_ID, RwSetId.LAST_RESET),
|
||||
(oids.RW1_ID, RwSetId.TM_SET),
|
||||
(oids.RW2_ID, RwSetId.STATUS_SET_ID),
|
||||
(oids.RW2_ID, RwSetId.LAST_RESET),
|
||||
(oids.RW2_ID, RwSetId.TM_SET),
|
||||
(oids.RW3_ID, RwSetId.STATUS_SET_ID),
|
||||
(oids.RW3_ID, RwSetId.LAST_RESET),
|
||||
(oids.RW3_ID, RwSetId.TM_SET),
|
||||
(oids.RW4_ID, RwSetId.STATUS_SET_ID),
|
||||
(oids.RW4_ID, RwSetId.LAST_RESET),
|
||||
(oids.RW4_ID, RwSetId.TM_SET),
|
||||
]
|
||||
diag_list = [
|
||||
True,
|
||||
@ -643,7 +658,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
False,
|
||||
]
|
||||
# RW NORMAL
|
||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, op_code="nml")
|
||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, cmd_str="nml")
|
||||
|
||||
# RW HK für alle RWs nur einzeln
|
||||
for rw_dev in rw_pairs:
|
||||
@ -658,28 +673,28 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg(mgt=False, one_rw=True, two_rws=False),
|
||||
)
|
||||
# RW OFF
|
||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, op_code="off")
|
||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, cmd_str="off")
|
||||
|
||||
# ass command with 2 rws to speed
|
||||
if op_code in OpCodes.RW_FT_TWO_RWS:
|
||||
if op_code in OpCode.RW_FT_TWO_RWS:
|
||||
key = KAI.RW_FT_TWO_RWS[0]
|
||||
rw_pairs = [
|
||||
(oids.RW1_ID, RwSetIds.STATUS_SET_ID),
|
||||
(oids.RW1_ID, RwSetIds.TEMPERATURE_SET_ID),
|
||||
(oids.RW1_ID, RwSetIds.LAST_RESET),
|
||||
(oids.RW1_ID, RwSetIds.TM_SET),
|
||||
(oids.RW2_ID, RwSetIds.STATUS_SET_ID),
|
||||
(oids.RW2_ID, RwSetIds.TEMPERATURE_SET_ID),
|
||||
(oids.RW2_ID, RwSetIds.LAST_RESET),
|
||||
(oids.RW2_ID, RwSetIds.TM_SET),
|
||||
(oids.RW3_ID, RwSetIds.STATUS_SET_ID),
|
||||
(oids.RW3_ID, RwSetIds.TEMPERATURE_SET_ID),
|
||||
(oids.RW3_ID, RwSetIds.LAST_RESET),
|
||||
(oids.RW3_ID, RwSetIds.TM_SET),
|
||||
(oids.RW4_ID, RwSetIds.STATUS_SET_ID),
|
||||
(oids.RW4_ID, RwSetIds.TEMPERATURE_SET_ID),
|
||||
(oids.RW4_ID, RwSetIds.LAST_RESET),
|
||||
(oids.RW4_ID, RwSetIds.TM_SET),
|
||||
(oids.RW1_ID, RwSetId.STATUS_SET_ID),
|
||||
(oids.RW1_ID, RwSetId.TEMPERATURE_SET_ID),
|
||||
(oids.RW1_ID, RwSetId.LAST_RESET),
|
||||
(oids.RW1_ID, RwSetId.TM_SET),
|
||||
(oids.RW2_ID, RwSetId.STATUS_SET_ID),
|
||||
(oids.RW2_ID, RwSetId.TEMPERATURE_SET_ID),
|
||||
(oids.RW2_ID, RwSetId.LAST_RESET),
|
||||
(oids.RW2_ID, RwSetId.TM_SET),
|
||||
(oids.RW3_ID, RwSetId.STATUS_SET_ID),
|
||||
(oids.RW3_ID, RwSetId.TEMPERATURE_SET_ID),
|
||||
(oids.RW3_ID, RwSetId.LAST_RESET),
|
||||
(oids.RW3_ID, RwSetId.TM_SET),
|
||||
(oids.RW4_ID, RwSetId.STATUS_SET_ID),
|
||||
(oids.RW4_ID, RwSetId.TEMPERATURE_SET_ID),
|
||||
(oids.RW4_ID, RwSetId.LAST_RESET),
|
||||
(oids.RW4_ID, RwSetId.TM_SET),
|
||||
]
|
||||
diag_list = [
|
||||
False,
|
||||
@ -700,7 +715,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
False,
|
||||
]
|
||||
# RW NORMAL
|
||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, op_code="nml")
|
||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, cmd_str="nml")
|
||||
|
||||
# RW
|
||||
for rw_dev in rw_pairs:
|
||||
@ -715,7 +730,7 @@ def pack_proc_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
cfg=GenericHkListeningCfg(mgt=False, one_rw=False, two_rws=True),
|
||||
)
|
||||
# RW OFF
|
||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, op_code="off")
|
||||
pack_rw_ass_cmds(object_id=oids.RW_ASSEMBLY, q=q, cmd_str="off")
|
||||
|
||||
|
||||
def enable_listen_to_hk_for_x_seconds(
|
||||
@ -726,12 +741,12 @@ 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:
|
||||
q.add_pus_tc(cmd)
|
||||
generate_time_tagged_cmd(
|
||||
create_time_tagged_cmd(
|
||||
struct.pack("!I", int(round(time.time() + interval_seconds))),
|
||||
gen_disable_listen_to_hk_for_x_seconds(q, diag, device, sid),
|
||||
)
|
||||
@ -750,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,
|
||||
|
@ -1,78 +0,0 @@
|
||||
import enum
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import Modes
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import (
|
||||
make_sid,
|
||||
generate_one_hk_command,
|
||||
)
|
||||
|
||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||
from eive_tmtc.config.object_ids import TCS_BOARD_ASS_ID, TCS_CONTROLLER
|
||||
|
||||
|
||||
class OpCodes:
|
||||
TCS_BOARD_ASS_NORMAL = ["0", "normal"]
|
||||
TCS_BOARD_ASS_OFF = ["1", "off"]
|
||||
REQUEST_SENSOR_TEMP_SET = ["2", "temps"]
|
||||
|
||||
|
||||
class Info:
|
||||
REQUEST_SENSOR_TEMP_SET = "Request HK set of primary sensor temperatures"
|
||||
TCS_BOARD_ASS_NORMAL = "Switching TCS board assembly on"
|
||||
TCS_BOARD_ASS_OFF = "Switching TCS board assembly off"
|
||||
|
||||
|
||||
class SetIds(enum.IntEnum):
|
||||
PRIMARY_SENSORS = 0
|
||||
DEVICE_SENSORS = 1
|
||||
SUS_TEMP_SENSORS = 2
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_tcs_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(
|
||||
keys=OpCodes.TCS_BOARD_ASS_NORMAL,
|
||||
info=Info.TCS_BOARD_ASS_NORMAL,
|
||||
)
|
||||
oce.add(
|
||||
keys=OpCodes.TCS_BOARD_ASS_OFF,
|
||||
info=Info.TCS_BOARD_ASS_OFF,
|
||||
)
|
||||
oce.add(keys=OpCodes.REQUEST_SENSOR_TEMP_SET, info=Info.REQUEST_SENSOR_TEMP_SET)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.TCS.value,
|
||||
info="TCS Board Assembly",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
|
||||
|
||||
def pack_tcs_sys_commands(q: DefaultPusQueueHelper, op_code: str):
|
||||
if op_code in OpCodes.REQUEST_SENSOR_TEMP_SET:
|
||||
sensor_set_sid = make_sid(TCS_CONTROLLER, SetIds.PRIMARY_SENSORS)
|
||||
q.add_log_cmd(Info.REQUEST_SENSOR_TEMP_SET)
|
||||
q.add_pus_tc(generate_one_hk_command(sensor_set_sid))
|
||||
pack_tcs_ass_cmds(q, op_code)
|
||||
|
||||
|
||||
def pack_tcs_ass_cmds(q: DefaultPusQueueHelper, op_code: str):
|
||||
if op_code in OpCodes.TCS_BOARD_ASS_NORMAL:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=TCS_BOARD_ASS_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=0,
|
||||
q=q,
|
||||
info=Info.TCS_BOARD_ASS_NORMAL,
|
||||
)
|
||||
if op_code in OpCodes.TCS_BOARD_ASS_OFF:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=TCS_BOARD_ASS_ID,
|
||||
mode=Modes.OFF,
|
||||
submode=0,
|
||||
q=q,
|
||||
info=Info.TCS_BOARD_ASS_OFF,
|
||||
)
|
@ -1,29 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from tmtccmd import DefaultProcedureInfo, TcHandlerBase
|
||||
|
||||
from tmtccmd.logging import get_console_logger
|
||||
from tmtccmd.tc import DefaultPusQueueHelper, service_provider
|
||||
from tmtccmd.tc.decorator import ServiceProviderParams
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
class OpCodes:
|
||||
SET_CURRENT_TIME = ["0", "set-curr-time"]
|
||||
|
||||
|
||||
class Info:
|
||||
SET_CURRENT_TIME = "Setting current time in ASCII format"
|
||||
|
||||
|
||||
@service_provider(CustomServiceList.TIME.value)
|
||||
def pack_set_current_time_ascii_command(p: ServiceProviderParams):
|
||||
q = p.queue_helper
|
||||
time_test_current_time = datetime.utcnow().isoformat() + "Z" + "\0"
|
||||
current_time_ascii = time_test_current_time.encode("ascii")
|
||||
LOGGER.info(f"Current time in ASCII format: {current_time_ascii}")
|
||||
q.add_log_cmd(Info.SET_CURRENT_TIME)
|
||||
q.add_pus_tc(PusTelecommand(service=9, subservice=128, app_data=current_time_ascii))
|
161
eive_tmtc/pus_tc/tc_handler.py
Normal file
161
eive_tmtc/pus_tc/tc_handler.py
Normal file
@ -0,0 +1,161 @@
|
||||
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.cmd_demux import handle_pus_procedure
|
||||
from eive_tmtc.cfdp.handler import CfdpInCcsdsHandler
|
||||
from tmtccmd import TcHandlerBase, ProcedureWrapper
|
||||
from cfdppy.defs import CfdpRequestType
|
||||
from tmtccmd.logging import get_current_time_string
|
||||
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
|
||||
from tmtccmd.tmtc import (
|
||||
DefaultPusQueueHelper,
|
||||
QueueWrapper,
|
||||
FeedWrapper,
|
||||
TcProcedureType,
|
||||
SendCbParams,
|
||||
TcQueueEntryType,
|
||||
)
|
||||
from tmtccmd.config.cfdp import generic_cfdp_params_to_put_request
|
||||
from spacepackets.ecss import PusVerificator
|
||||
from spacepackets.seqcount 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.TREE_COMMANDING:
|
||||
handle_pus_procedure(info.to_tree_commanding_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}"
|
||||
)
|
||||
assert put_req is not None
|
||||
self.cfdp_in_ccsds_handler.cfdp_handler.put_request(put_req)
|
||||
self.cfdp_handler_started = True
|
||||
|
||||
for source_pair, _ in self.cfdp_in_ccsds_handler:
|
||||
if source_pair is not None:
|
||||
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.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_tree_commanding_procedure()
|
||||
_LOGGER.info(f"Finished queue for command {def_proc.cmd_path}")
|
||||
elif info.proc_type == TcProcedureType.CFDP:
|
||||
_LOGGER.info("Finished CFDP queue")
|
@ -1,58 +1,101 @@
|
||||
import base64
|
||||
import logging
|
||||
import struct
|
||||
from eive_tmtc.config.object_ids import *
|
||||
from eive_tmtc.tmtc.acs.imtq import ImtqActionIds
|
||||
|
||||
from spacepackets.ecss import PusTm
|
||||
from tmtccmd.pus.s8_fsfw_action_defs import CustomSubservice
|
||||
from eive_tmtc.config.definitions import PRINT_RAW_ACTION_DATA_REPLY_B64_STR
|
||||
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,
|
||||
ACS_CONTROLLER,
|
||||
)
|
||||
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.payload.ploc_supervisor import SupvActionIds
|
||||
from eive_tmtc.pus_tc.devs.star_tracker import StarTrackerActionIds
|
||||
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 handle_star_tracker_action_replies
|
||||
from eive_tmtc.tmtc.acs.acs_ctrl import handle_acs_ctrl_action_replies
|
||||
from eive_tmtc.tmtc.power.tm import handle_get_param_data_reply
|
||||
from tmtccmd.logging import get_console_logger
|
||||
from tmtccmd.tm import Service8FsfwTm
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
from spacepackets.ccsds.time import CdsShortTimestamp
|
||||
from tmtccmd.util import ObjectIdBase, ObjectIdDictT, ObjectIdU32
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def handle_action_reply(
|
||||
raw_tm: bytes, printer: FsfwTmTcPrinter, obj_id_dict: ObjectIdDictT
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def handle_action_service_tm(
|
||||
raw_tm: bytes, pw: PrintWrapper, obj_id_dict: ObjectIdDictT
|
||||
):
|
||||
"""Core Action reply handler
|
||||
:return:
|
||||
"""
|
||||
tm_packet = Service8FsfwTm.unpack(raw_telemetry=raw_tm)
|
||||
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)
|
||||
custom_data = tm_packet.custom_data
|
||||
action_id = tm_packet.action_id
|
||||
generic_print_str = printer.generic_action_packet_tm_print(
|
||||
packet=tm_packet, obj_id=object_id
|
||||
)
|
||||
pw.dlog(generic_print_str)
|
||||
if object_id.as_bytes == IMTQ_HANDLER_ID:
|
||||
return handle_imtq_replies(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes == PLOC_MPSOC_ID:
|
||||
return handle_ploc_replies(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes == PLOC_SUPV_ID:
|
||||
return handle_supervisor_replies(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes == STAR_TRACKER_ID:
|
||||
return handle_startracker_replies(action_id, printer, custom_data)
|
||||
elif object_id.as_bytes in [
|
||||
ACU_HANDLER_ID,
|
||||
PDU_1_HANDLER_ID,
|
||||
PDU_2_HANDLER_ID,
|
||||
P60_DOCK_HANDLER,
|
||||
]:
|
||||
return handle_get_param_data_reply(object_id, action_id, pw, custom_data)
|
||||
tm_packet = PusTm.unpack(raw_tm, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE)
|
||||
if len(tm_packet.source_data) < 8:
|
||||
_LOGGER.warning(
|
||||
"received action service reply with source data smaller than 8 bytes"
|
||||
)
|
||||
return
|
||||
object_id_raw = struct.unpack("!I", tm_packet.source_data[0:4])[0]
|
||||
action_id = struct.unpack("!I", tm_packet.source_data[4:8])[0]
|
||||
object_id = obj_id_dict.get(object_id_raw)
|
||||
custom_data = tm_packet.source_data[8:]
|
||||
if object_id is None:
|
||||
object_id = ObjectIdU32(object_id_raw, "Unknown ID")
|
||||
if tm_packet.subservice == CustomSubservice.TM_DATA_REPLY:
|
||||
if PRINT_RAW_ACTION_DATA_REPLY_B64_STR:
|
||||
print(f"PUS TM Base64: {base64.b64encode(raw_tm)}")
|
||||
if object_id.as_bytes == IMTQ_HANDLER_ID:
|
||||
return handle_imtq_replies(action_id, pw, custom_data)
|
||||
elif object_id.as_bytes == PLOC_MPSOC_ID:
|
||||
return handle_mpsoc_data_reply(action_id, pw, custom_data)
|
||||
elif object_id.as_bytes == PLOC_SUPV_ID:
|
||||
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_star_tracker_action_replies(action_id, pw, custom_data)
|
||||
elif object_id.as_bytes == ACS_CONTROLLER:
|
||||
return handle_acs_ctrl_action_replies(action_id, pw, custom_data)
|
||||
elif object_id.as_bytes in [
|
||||
ACU_HANDLER_ID,
|
||||
PDU_1_HANDLER_ID,
|
||||
PDU_2_HANDLER_ID,
|
||||
P60_DOCK_HANDLER,
|
||||
]:
|
||||
return handle_get_param_data_reply(object_id, action_id, pw, custom_data)
|
||||
else:
|
||||
# TODO: Could add a handler here depending on action ID and object ID.
|
||||
handle_action_data_reply(tm_packet, object_id, action_id, pw)
|
||||
else:
|
||||
pw.dlog(f"No dedicated action reply handler found for reply from {object_id}")
|
||||
pw.dlog(f"Raw Data: {tm_packet.custom_data.hex(sep=',')}")
|
||||
pw.dlog(
|
||||
f"service 8 packet from {object_id} with action ID {action_id} "
|
||||
f"and unknown subservice {tm_packet.subservice}"
|
||||
)
|
||||
|
||||
|
||||
def handle_imtq_replies(
|
||||
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
|
||||
def handle_action_data_reply(
|
||||
tm_packet: PusTm, named_obj_id: ObjectIdBase, action_id: int, printer: PrintWrapper
|
||||
):
|
||||
if action_id == struct.unpack("!I", ImtqActionIds.get_commanded_dipole)[0]:
|
||||
print_string = (
|
||||
f"service 8 data reply from {named_obj_id} with action ID {action_id} "
|
||||
f"and data size {len(tm_packet.tm_data[8:])}"
|
||||
)
|
||||
printer.dlog(print_string)
|
||||
|
||||
|
||||
def handle_imtq_replies(action_id: int, pw: PrintWrapper, custom_data: bytes):
|
||||
if action_id == struct.unpack("!I", ImtqActionId.get_commanded_dipole)[0]:
|
||||
header_list = [
|
||||
"Commanded X-Dipole",
|
||||
"Commanded Y-Dipole",
|
||||
@ -60,75 +103,18 @@ 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
|
||||
):
|
||||
if action_id == SupvActionIds.DUMP_MRAM:
|
||||
def handle_supervisor_replies(action_id: int, pw: PrintWrapper, custom_data: bytes):
|
||||
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)
|
||||
elif action_id == SupvActionIds.READ_GPIO:
|
||||
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)
|
||||
|
||||
|
||||
def handle_startracker_replies(
|
||||
action_id: int, printer: FsfwTmTcPrinter, custom_data: bytearray
|
||||
):
|
||||
if action_id == StarTrackerActionIds.CHECKSUM:
|
||||
if len(custom_data) != 5:
|
||||
LOGGER.warning(
|
||||
"Star tracker reply has invalid length {0}".format(len(custom_data))
|
||||
)
|
||||
return
|
||||
header_list = ["Checksum", "Checksum valid"]
|
||||
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}")
|
||||
|
@ -1,13 +1,27 @@
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
import logging
|
||||
from typing import Optional
|
||||
|
||||
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)
|
||||
if self.file_logger:
|
||||
self.file_logger.info(string)
|
||||
|
||||
|
||||
def log_to_both(printer: FsfwTmTcPrinter, string: str):
|
||||
|
@ -1,66 +0,0 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tc.devs.bpx_batt import BpxSetIds
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
|
||||
|
||||
def handle_bpx_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
|
||||
pw = PrintWrapper(printer)
|
||||
if set_id == BpxSetIds.GET_HK_SET:
|
||||
fmt_str = "!HHHHhhhhIB"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(
|
||||
charge_current,
|
||||
discharge_current,
|
||||
heater_current,
|
||||
batt_voltage,
|
||||
batt_temp_1,
|
||||
batt_temp_2,
|
||||
batt_temp_3,
|
||||
batt_temp_4,
|
||||
reboot_cntr,
|
||||
boot_cause,
|
||||
) = struct.unpack(fmt_str, hk_data[0:inc_len])
|
||||
header_list = [
|
||||
"Charge Current",
|
||||
"Discharge Current",
|
||||
"Heater Current",
|
||||
"Battery Voltage",
|
||||
"Batt Temp 1",
|
||||
"Batt Temp 2",
|
||||
"Batt Temp 3",
|
||||
"Batt Temp 4",
|
||||
"Reboot Counter",
|
||||
"Boot Cause",
|
||||
]
|
||||
content_list = [
|
||||
charge_current,
|
||||
discharge_current,
|
||||
heater_current,
|
||||
batt_voltage,
|
||||
batt_temp_1,
|
||||
batt_temp_2,
|
||||
batt_temp_3,
|
||||
batt_temp_4,
|
||||
reboot_cntr,
|
||||
boot_cause,
|
||||
]
|
||||
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)
|
||||
elif set_id == BpxSetIds.GET_CFG_SET:
|
||||
battheat_mode = hk_data[0]
|
||||
battheat_low = struct.unpack("!b", hk_data[1:2])[0]
|
||||
battheat_high = struct.unpack("!b", hk_data[2:3])[0]
|
||||
header_list = [
|
||||
"Battery Heater Mode",
|
||||
"Battery Heater Low Limit",
|
||||
"Battery Heater High Limit",
|
||||
]
|
||||
content_list = [battheat_mode, battheat_low, battheat_high]
|
||||
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)
|
@ -1,39 +0,0 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
|
||||
|
||||
def handle_gps_data(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
pw = PrintWrapper(printer)
|
||||
pw.dlog(f"Received GPS data, HK data length {len(hk_data)}")
|
||||
current_idx = 0
|
||||
fmt_str = "!ddddBBBHBBBBBI"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(
|
||||
lat,
|
||||
long,
|
||||
alt,
|
||||
speed,
|
||||
fix,
|
||||
sats_in_use,
|
||||
sats_in_view,
|
||||
year,
|
||||
month,
|
||||
day,
|
||||
hours,
|
||||
minutes,
|
||||
seconds,
|
||||
unix_seconds,
|
||||
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
||||
current_idx += inc_len
|
||||
date_string = f"{day}.{month}.{year} {hours}:{minutes}:{seconds}"
|
||||
pw.dlog(f"Lat: {lat} deg")
|
||||
pw.dlog(f"Long: {long} deg")
|
||||
pw.dlog(f"Altitude: {alt} m | Speed: {speed} m/s")
|
||||
pw.dlog(
|
||||
f"Fix Type: {fix} | Sats in View {sats_in_view} | Sats in Use {sats_in_use}"
|
||||
)
|
||||
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)
|
@ -1,75 +0,0 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
|
||||
from eive_tmtc.pus_tc.devs.gyros import L3gGyroSetIds, AdisGyroSetIds
|
||||
import eive_tmtc.config.object_ids as obj_ids
|
||||
|
||||
|
||||
def handle_gyros_hk_data(
|
||||
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, 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
|
||||
)
|
||||
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
|
||||
)
|
||||
|
||||
|
||||
def handle_adis_gyro_hk(
|
||||
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
|
||||
):
|
||||
if set_id == AdisGyroSetIds.CORE_HK:
|
||||
pw = PrintWrapper(printer)
|
||||
fmt_str = "!ddddddf"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(angVelocX, angVelocY, angVelocZ, accelX, accelY, accelZ, temp) = struct.unpack(
|
||||
fmt_str, hk_data[0 : 0 + inc_len]
|
||||
)
|
||||
pw.dlog(f"Received ADIS1650X Gyro HK data from object {object_id}")
|
||||
pw.dlog(
|
||||
f"Angular Velocities (degrees per second): X {angVelocX} | "
|
||||
f"Y {angVelocY} | Z {angVelocZ}"
|
||||
)
|
||||
pw.dlog(f"Acceleration (m/s^2): X {accelX} | Y {accelY} | Z {accelZ}")
|
||||
pw.dlog(f"Temperature {temp} C")
|
||||
if set_id == AdisGyroSetIds.CFG_HK:
|
||||
pw = PrintWrapper(printer)
|
||||
fmt_str = "!HBHH"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(diag_stat_reg, filter_setting, msc_ctrl_reg, dec_rate_reg) = struct.unpack(
|
||||
fmt_str, hk_data[0 : 0 + inc_len]
|
||||
)
|
||||
pw.dlog(f"Diagnostic Status Register {diag_stat_reg:#018b}")
|
||||
pw.dlog(f"Filter Settings {filter_setting:#010b}")
|
||||
pw.dlog(f"Miscellaneous Control Register {msc_ctrl_reg:#018b}")
|
||||
pw.dlog(f"Decimation Rate {dec_rate_reg:#06x}")
|
||||
|
||||
|
||||
def handle_l3g_gyro_hk(
|
||||
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
|
||||
):
|
||||
if set_id == L3gGyroSetIds.CORE_HK:
|
||||
pw = PrintWrapper(printer)
|
||||
fmt_str = "!ffff"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(angVelocX, angVelocY, angVelocZ, temp) = struct.unpack(
|
||||
fmt_str, hk_data[0 : 0 + inc_len]
|
||||
)
|
||||
pw.dlog(f"Received L3GD20H Gyro HK data from object {object_id}")
|
||||
pw.dlog(
|
||||
f"Angular Velocities (degrees per second): X {angVelocX} | "
|
||||
f"Y {angVelocY} | Z {angVelocZ}"
|
||||
)
|
||||
pw.dlog(f"Temperature {temp} °C")
|
@ -1,54 +0,0 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from eive_tmtc.pus_tc.devs.mgms import MgmRm3100SetIds, MgmLis3SetIds
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
import eive_tmtc.config.object_ids as obj_ids
|
||||
|
||||
|
||||
def handle_mgm_hk_data(
|
||||
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, 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)
|
||||
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)
|
||||
pass
|
||||
|
||||
|
||||
def handle_mgm_lis3_hk_data(
|
||||
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
|
||||
):
|
||||
if set_id == MgmLis3SetIds.CORE_HK:
|
||||
pw = PrintWrapper(printer)
|
||||
fmt_str = "!ffff"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(field_x, field_y, field_z, temp) = struct.unpack(
|
||||
fmt_str, hk_data[0 : 0 + inc_len]
|
||||
)
|
||||
pw.dlog(f"Received MGM LIS3 from object {object_id}")
|
||||
pw.dlog(
|
||||
f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}"
|
||||
)
|
||||
pw.dlog(f"Temperature {temp} C")
|
||||
|
||||
|
||||
def handle_mgm_rm3100_hk_data(
|
||||
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
|
||||
):
|
||||
if set_id == MgmRm3100SetIds.CORE_HK:
|
||||
pw = PrintWrapper(printer)
|
||||
fmt_str = f"!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 LIS3 from object {object_id}")
|
||||
pw.dlog(
|
||||
f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}"
|
||||
)
|
@ -1,52 +0,0 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
from eive_tmtc.pus_tc.devs.plpcdu import SetIds
|
||||
|
||||
|
||||
ADC_CHANNELS_NAMED = [
|
||||
"U BAT DIV 6",
|
||||
"U NEG V FB",
|
||||
"I HPA",
|
||||
"U HPA DIV 6",
|
||||
"I MPA",
|
||||
"U MPA DIV 6",
|
||||
"I TX",
|
||||
"U TX DIV 6",
|
||||
"I X8",
|
||||
"U X8 DIV 6",
|
||||
"I DRO",
|
||||
"U DRO DIV 6",
|
||||
]
|
||||
|
||||
|
||||
def handle_plpcdu_hk(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
|
||||
if set_id == SetIds.ADC:
|
||||
pw = PrintWrapper(printer)
|
||||
current_idx = 0
|
||||
pw.dlog("Received PL PCDU ADC HK data")
|
||||
channels = []
|
||||
ch_print = "Channels Raw (hex): ["
|
||||
for i in range(12):
|
||||
channels.append(
|
||||
struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
|
||||
)
|
||||
if i < 11:
|
||||
ch_print += f"{channels[i]:06x},"
|
||||
else:
|
||||
ch_print += f"{channels[i]:06x}]"
|
||||
current_idx += 2
|
||||
processed_vals = []
|
||||
for i in range(12):
|
||||
processed_vals.append(
|
||||
struct.unpack("!f", hk_data[current_idx : current_idx + 4])[0]
|
||||
)
|
||||
current_idx += 4
|
||||
temp = struct.unpack("!f", hk_data[current_idx : current_idx + 4])[0]
|
||||
current_idx += 4
|
||||
pw.dlog(f"Temperature: {temp} C")
|
||||
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)
|
@ -1,24 +0,0 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
from eive_tmtc.pus_tc.devs.rad_sensor import SetIds
|
||||
|
||||
|
||||
def handle_rad_sensor_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
|
||||
if set_id == SetIds.HK:
|
||||
pw = PrintWrapper(printer)
|
||||
current_idx = 0
|
||||
pw.dlog("Received Radiation Sensor HK data")
|
||||
fmt_str = "!fHHHHHH"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(temp, ain0, ain1, ain4, ain5, ain6, ain7) = struct.unpack(
|
||||
fmt_str, hk_data[current_idx : current_idx + inc_len]
|
||||
)
|
||||
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)")
|
||||
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)
|
@ -1,67 +0,0 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from eive_tmtc.pus_tc.devs.syrlinks_hk_handler import SetIds
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
|
||||
|
||||
def handle_syrlinks_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
|
||||
if set_id == SetIds.RX_REGISTERS_DATASET:
|
||||
return handle_syrlinks_rx_registers_dataset(printer, hk_data)
|
||||
elif set_id == SetIds.TX_REGISTERS_DATASET:
|
||||
return handle_syrlinks_tx_registers_dataset(printer, hk_data)
|
||||
else:
|
||||
pw = PrintWrapper(printer)
|
||||
pw.dlog(f"Service 3 TM: Syrlinks handler reply with unknown set ID {set_id}")
|
||||
|
||||
|
||||
def handle_syrlinks_rx_registers_dataset(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
pw = PrintWrapper(printer)
|
||||
header_list = [
|
||||
"RX Status",
|
||||
"RX Sensitivity",
|
||||
"RX Frequency Shift",
|
||||
"RX IQ Power",
|
||||
"RX AGC Value",
|
||||
"RX Demod Eb",
|
||||
"RX Demod N0",
|
||||
"RX Datarate",
|
||||
]
|
||||
rx_status = hk_data[0]
|
||||
rx_sensitivity = struct.unpack("!I", hk_data[1:5])
|
||||
rx_frequency_shift = struct.unpack("!I", hk_data[5:9])
|
||||
rx_iq_power = struct.unpack("!H", hk_data[9:11])
|
||||
rx_agc_value = struct.unpack("!H", hk_data[11:13])
|
||||
rx_demod_eb = struct.unpack("!I", hk_data[13:17])
|
||||
rx_demod_n0 = struct.unpack("!I", hk_data[17:21])
|
||||
rx_data_rate = hk_data[21]
|
||||
content_list = [
|
||||
rx_status,
|
||||
rx_sensitivity,
|
||||
rx_frequency_shift,
|
||||
rx_iq_power,
|
||||
rx_agc_value,
|
||||
rx_demod_eb,
|
||||
rx_demod_n0,
|
||||
rx_data_rate,
|
||||
]
|
||||
validity_buffer = hk_data[22:]
|
||||
pw.dlog(str(header_list))
|
||||
pw.dlog(str(content_list))
|
||||
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=8)
|
||||
|
||||
|
||||
def handle_syrlinks_tx_registers_dataset(
|
||||
printer: FsfwTmTcPrinter,
|
||||
hk_data: bytes,
|
||||
):
|
||||
pw = PrintWrapper(printer)
|
||||
header_list = ["TX Status", "TX Waveform", "TX AGC value"]
|
||||
tx_status = hk_data[0]
|
||||
tx_waveform = hk_data[1]
|
||||
tx_agc_value = struct.unpack("!H", hk_data[2:4])
|
||||
content_list = [tx_status, tx_waveform, tx_agc_value]
|
||||
validity_buffer = hk_data[4:]
|
||||
pw.dlog(str(header_list))
|
||||
pw.dlog(str(content_list))
|
||||
printer.print_validity_buffer(validity_buffer=validity_buffer, num_vars=3)
|
@ -1,101 +1,177 @@
|
||||
import logging
|
||||
import os.path
|
||||
from datetime import datetime
|
||||
import datetime
|
||||
import sys
|
||||
import base64
|
||||
|
||||
from eive_tmtc.config.definitions import PRINT_RAW_EVENTS_B64_STR
|
||||
from eive_tmtc.config.events import get_event_dict
|
||||
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.acs_subsystem import AcsModes
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import Modes
|
||||
from eive_tmtc.tmtc.acs.subsystem import AcsMode
|
||||
from eive_tmtc.tmtc.core import SdState, SdCardSelect
|
||||
from tmtccmd.pus.s200_fsfw_mode import Mode
|
||||
from tmtccmd.pus.s201_fsfw_health import FsfwHealth
|
||||
|
||||
from tmtccmd.tm import Service5Tm
|
||||
from tmtccmd.logging import get_console_logger
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
from tmtccmd.fsfw import parse_fsfw_events_csv, EventDictT, EventInfo
|
||||
from tmtccmd.pus.s5_fsfw_event import Service5Tm
|
||||
from tmtccmd.fsfw import EventInfo
|
||||
from spacepackets.ccsds.time import CdsShortTimestamp
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
DEFAULT_EVENTS_CSV_PATH = "config/events.csv"
|
||||
__EVENT_DICT = None
|
||||
|
||||
|
||||
def get_event_dict() -> EventDictT:
|
||||
global __EVENT_DICT
|
||||
if __EVENT_DICT is None:
|
||||
if os.path.exists(DEFAULT_EVENTS_CSV_PATH):
|
||||
__EVENT_DICT = parse_fsfw_events_csv(DEFAULT_EVENTS_CSV_PATH)
|
||||
else:
|
||||
LOGGER.warning(f"No Event CSV file found at {DEFAULT_EVENTS_CSV_PATH}")
|
||||
__EVENT_DICT = dict()
|
||||
return __EVENT_DICT
|
||||
|
||||
|
||||
def handle_event_packet(raw_tm: bytes, printer: FsfwTmTcPrinter):
|
||||
pw = PrintWrapper(printer)
|
||||
tm = Service5Tm.unpack(raw_telemetry=raw_tm)
|
||||
def handle_event_packet( # noqa C901: Complexity okay here
|
||||
raw_tm: bytes, pw: PrintWrapper
|
||||
): # noqa C901: Complexity okay here
|
||||
if PRINT_RAW_EVENTS_B64_STR:
|
||||
print(f"PUS Event TM Base64: {base64.b64encode(raw_tm)}")
|
||||
tm = Service5Tm.unpack(data=raw_tm, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE)
|
||||
event_dict = get_event_dict()
|
||||
info = event_dict.get(tm.event_id)
|
||||
event_def = tm.event_definition
|
||||
info = event_dict.get(event_def.event_id)
|
||||
if info is None:
|
||||
LOGGER.warning(f"Event ID {tm.event_id} has no information")
|
||||
_LOGGER.warning(f"Event ID {event_def.event_id} has no information")
|
||||
info = EventInfo()
|
||||
info.name = "Unknown event"
|
||||
obj_ids = get_object_ids()
|
||||
obj_id_obj = obj_ids.get(tm.reporter_id.as_bytes)
|
||||
obj_id_obj = obj_ids.get(event_def.reporter_id)
|
||||
if obj_id_obj is None:
|
||||
LOGGER.warning(f"Object ID 0x{tm.reporter_id.as_hex_string} has no name")
|
||||
obj_name = tm.reporter_id.as_hex_string
|
||||
_LOGGER.warning(f"Object ID 0x{event_def.reporter_id.hex(sep=',')} has no name")
|
||||
obj_name = event_def.reporter_id.hex(sep=",")
|
||||
else:
|
||||
obj_name = obj_id_obj.name
|
||||
timestamp = CdsShortTimestamp.unpack(tm.timestamp)
|
||||
generic_event_string = (
|
||||
f"Object {obj_name} generated Event {tm.event_id} | {info.name}"
|
||||
f"Object {obj_name} generated Event {info.name} (ID: {event_def.event_id:#04x})"
|
||||
f" at {timestamp.as_date_time()}"
|
||||
)
|
||||
pw.printer.file_logger.info(
|
||||
f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}: {generic_event_string}"
|
||||
_LOGGER.info(generic_event_string)
|
||||
pw.file_logger.info(
|
||||
f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}:"
|
||||
f" {generic_event_string}"
|
||||
)
|
||||
LOGGER.info(generic_event_string)
|
||||
specific_handler = True
|
||||
specific_handler = False
|
||||
if info.name == "MODE_TRANSITION_FAILED":
|
||||
reason = generic_retval_printout(tm.param_1)
|
||||
reason = generic_retval_printout(event_def.param1)
|
||||
for string in reason:
|
||||
pw.dlog(f"Reason from event parameter 1: {string}")
|
||||
pw.dlog(f"Mode, sequence or table: {tm.param_2:#08x}")
|
||||
pw.dlog(f"Mode, sequence or table: {event_def.param2:#08x}")
|
||||
specific_handler = True
|
||||
if info.name == "SUPV_UPDATE_PROGRESS" or info.name == "WRITE_MEMORY_FAILED":
|
||||
additional_event_info = f"Additional info: {info.info}"
|
||||
context = (
|
||||
f"Progress Percent: {tm.param_1 >> 24 & 0xff} | Sequence Count: {tm.param_1 & 0xffff} "
|
||||
f"| Bytes Written: {tm.param_2}"
|
||||
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)
|
||||
specific_handler = True
|
||||
if info.name == "MODE_INFO":
|
||||
specific_handler = True
|
||||
mode_name = "Unknown"
|
||||
if obj_name == "ACS_SUBSYSTEM":
|
||||
if tm.param_1 == Modes.OFF:
|
||||
mode_name = "Off"
|
||||
elif tm.param_1 == AcsModes.IDLE:
|
||||
mode_name = "Idle"
|
||||
elif tm.param_1 == AcsModes.DETUMBLE:
|
||||
mode_name = "Detumble"
|
||||
elif tm.param_1 == AcsModes.SAFE:
|
||||
mode_name = "Safe"
|
||||
elif tm.param_1 == AcsModes.TARGET_PT:
|
||||
mode_name = "Target Pointing"
|
||||
acs_mode = AcsMode(event_def.param1)
|
||||
pw.dlog(f"ACS Mode: {acs_mode!r}")
|
||||
elif obj_name == "ACS_CONTROLLER_ID":
|
||||
mode_name = Mode(event_def.param1)
|
||||
submode = AcsMode(event_def.param2)
|
||||
pw.dlog(f"Mode: {mode_name!r}")
|
||||
pw.dlog(f"ACS Mode: {submode!r}")
|
||||
else:
|
||||
if tm.param_1 == Modes.OFF:
|
||||
if event_def.param1 == Mode.OFF:
|
||||
mode_name = "Off"
|
||||
elif tm.param_1 == Modes.ON:
|
||||
elif event_def.param1 == Mode.ON:
|
||||
mode_name = "On"
|
||||
elif tm.param_1 == Modes.NORMAL:
|
||||
elif event_def.param1 == Mode.NORMAL:
|
||||
mode_name = "Normal"
|
||||
elif tm.param_1 == Modes.RAW:
|
||||
elif event_def.param1 == Mode.RAW:
|
||||
mode_name = "Raw"
|
||||
pw.dlog(f"Mode Number {tm.param_1}, Mode Name {mode_name}")
|
||||
pw.dlog(f"Submode: {tm.param_2}")
|
||||
else:
|
||||
specific_handler = False
|
||||
if info.info != "":
|
||||
additional_event_info = (
|
||||
f"Additional info: {info.info} | P1: {tm.param_1} | P2: {tm.param_2}"
|
||||
pw.dlog(
|
||||
f"Mode Number {event_def.param1}, Mode Name {mode_name}, "
|
||||
f"Submode: {event_def.param2}"
|
||||
)
|
||||
pw.dlog(additional_event_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
|
||||
ver_rev = (event_def.param1 >> 8) & 0xFF
|
||||
has_git_sha = bool(event_def.param1 & 0xFF)
|
||||
git_sha = ""
|
||||
if has_git_sha:
|
||||
p2_as_bytes = event_def.param2.to_bytes(4, sys.byteorder)
|
||||
git_sha = p2_as_bytes.decode("ascii")
|
||||
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":
|
||||
specific_handler = True
|
||||
old_time = event_def.param1
|
||||
new_time = event_def.param2
|
||||
old_time_dt = datetime.datetime.fromtimestamp(old_time, datetime.timezone.utc)
|
||||
new_time_dt = datetime.datetime.fromtimestamp(new_time, datetime.timezone.utc)
|
||||
pw.dlog(f"Old time (UTC): {old_time_dt}")
|
||||
pw.dlog(f"New time (UTC): {new_time_dt}")
|
||||
if info.name == "CLOCK_DUMP_LEGACY":
|
||||
specific_handler = True
|
||||
# param 1 is timeval seconds, param 2 is timeval subsecond milliseconds
|
||||
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 == "CLOCK_DUMP"
|
||||
or info.name == "CLOCK_DUMP_BEFORE_SETTING_TIME"
|
||||
or info.name == "CLOCK_DUMP_AFTER_SETTING_TIME"
|
||||
):
|
||||
specific_handler = True
|
||||
# param 1 is timeval seconds, param 2 is timeval subsecond microseconds
|
||||
time = event_def.param1 + event_def.param2 / 1000000.0
|
||||
time_dt = datetime.datetime.fromtimestamp(time, datetime.timezone.utc)
|
||||
pw.dlog(f"Clock dump event {info.name}. 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)
|
||||
pw.dlog(f"{obj_name}: {health!r}")
|
||||
if info.name == "CHANGING_MODE":
|
||||
mode = event_def.param1
|
||||
submode = event_def.param2
|
||||
pw.dlog(f"Mode Number {mode}, Submode: {submode}")
|
||||
if not specific_handler:
|
||||
printer.handle_long_tm_print(packet_if=tm, info_if=tm)
|
||||
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)
|
||||
pass
|
||||
|
@ -1,77 +0,0 @@
|
||||
"""Core EIVE TM handler module
|
||||
"""
|
||||
from eive_tmtc.config.object_ids import get_object_ids
|
||||
from spacepackets.ecss import PusTelemetry
|
||||
from spacepackets.ecss.pus_17_test import Service17Tm
|
||||
from spacepackets.util import PrintFormats
|
||||
from tmtccmd import get_console_logger
|
||||
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
|
||||
from tmtccmd.pus import VerificationWrapper
|
||||
from tmtccmd.tm import Service20FsfwTm, Service200FsfwTm
|
||||
from tmtccmd.tm.pus_200_fsfw_modes import Subservices as ModeSubservices
|
||||
from tmtccmd.util.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 .action_reply_handler import handle_action_reply
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
def pus_factory_hook(
|
||||
packet: bytes,
|
||||
verif_wrapper: VerificationWrapper,
|
||||
printer: FsfwTmTcPrinter,
|
||||
raw_logger: RawTmtcTimedLogWrapper,
|
||||
):
|
||||
if len(packet) < 8:
|
||||
LOGGER.warning("Detected packet shorter than 8 bytes!")
|
||||
return
|
||||
try:
|
||||
tm_packet = PusTelemetry.unpack(packet)
|
||||
except ValueError:
|
||||
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)
|
||||
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)
|
||||
elif service == 5:
|
||||
handle_event_packet(raw_tm=packet, printer=printer)
|
||||
elif service == 8:
|
||||
handle_action_reply(raw_tm=packet, printer=printer, obj_id_dict=obj_id_dict)
|
||||
elif service == 17:
|
||||
tm_packet = Service17Tm.unpack(raw_telemetry=packet)
|
||||
if tm_packet.subservice == 2:
|
||||
verif_wrapper.dlog("Received Ping Reply TM[17,2]")
|
||||
dedicated_handler = True
|
||||
elif service == 20:
|
||||
tm_packet = Service20FsfwTm.unpack(raw_telemetry=packet)
|
||||
dedicated_handler = False
|
||||
elif service == 200:
|
||||
tm_packet = Service200FsfwTm.unpack(raw_telemetry=packet)
|
||||
if tm_packet.subservice == ModeSubservices.TM_CANT_REACH_MODE:
|
||||
obj_id = tm_packet.object_id
|
||||
obj_id_obj = obj_id_dict.get(obj_id)
|
||||
retval = tm_packet.return_value
|
||||
string_list = generic_retval_printout(retval)
|
||||
pw.dlog(f"Received Mode Reply from {obj_id_obj}: Can't reach mode.")
|
||||
for string in string_list:
|
||||
pw.dlog(f"Reason: {string}")
|
||||
dedicated_handler = True
|
||||
else:
|
||||
dedicated_handler = False
|
||||
else:
|
||||
LOGGER.info(f"The service {service} is not implemented in Telemetry Factory")
|
||||
tm_packet.print_source_data(PrintFormats.HEX)
|
||||
dedicated_handler = True
|
||||
if not dedicated_handler and tm_packet is not None:
|
||||
printer.handle_long_tm_print(packet_if=tm_packet, info_if=tm_packet)
|
||||
raw_logger.log_tm(tm_packet)
|
18
eive_tmtc/pus_tm/hk.py
Normal file
18
eive_tmtc/pus_tm/hk.py
Normal file
@ -0,0 +1,18 @@
|
||||
import uuid
|
||||
import dataclasses
|
||||
import datetime
|
||||
import sqlite3
|
||||
from spacepackets.ecss.tm import CdsShortTimestamp, PusTm
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class HkTmInfo:
|
||||
packet_uuid: uuid.UUID
|
||||
hk_packet: PusTm
|
||||
set_id: int
|
||||
db_con: sqlite3.Connection
|
||||
hk_data: bytes
|
||||
|
||||
@property
|
||||
def packet_datetime(self) -> datetime.datetime:
|
||||
return CdsShortTimestamp.unpack(self.hk_packet.timestamp).as_datetime()
|
254
eive_tmtc/pus_tm/hk_handler.py
Normal file
254
eive_tmtc/pus_tm/hk_handler.py
Normal file
@ -0,0 +1,254 @@
|
||||
"""HK Handling for EIVE OBSW"""
|
||||
|
||||
import dataclasses
|
||||
import logging
|
||||
import base64
|
||||
import sqlite3
|
||||
import struct
|
||||
from typing import List, cast
|
||||
from uuid import UUID
|
||||
|
||||
from spacepackets.ccsds.time import CdsShortTimestamp
|
||||
from spacepackets.ecss import PusTm
|
||||
from eive_tmtc.config.definitions import PRINT_RAW_HK_B64_STR
|
||||
from eive_tmtc.pus_tm.hk import HkTmInfo
|
||||
|
||||
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.payload.plpcdu import handle_plpcdu_hk
|
||||
from eive_tmtc.tmtc.payload.rad_sensor import handle_rad_sensor_data
|
||||
from eive_tmtc.tmtc.acs.sus import handle_sus_hk
|
||||
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.power.pwr_ctrl import handle_pwr_ctrl_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 tmtccmd.pus.tm.s3_hk_base import HkContentType
|
||||
from tmtccmd.util.obj_id import ObjectIdU32, ObjectIdDictT
|
||||
|
||||
from eive_tmtc.tmtc.power.bpx_batt import handle_bpx_hk_data
|
||||
from eive_tmtc.tmtc.acs.gps import handle_gps_data
|
||||
from eive_tmtc.tmtc.acs.gyros import handle_gyros_hk_data
|
||||
from eive_tmtc.tmtc.power.tm import (
|
||||
handle_pdu_data,
|
||||
handle_p60_hk_data,
|
||||
handle_acu_hk_data,
|
||||
handle_pcdu_hk,
|
||||
)
|
||||
from eive_tmtc.tmtc.acs.imtq import (
|
||||
handle_imtq_hk,
|
||||
)
|
||||
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
|
||||
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
FORWARD_SENSOR_TEMPS = False
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class HkFilter:
|
||||
object_ids: List[bytes]
|
||||
set_ids: List[int]
|
||||
|
||||
|
||||
def handle_hk_packet(
|
||||
raw_tm: bytes,
|
||||
packet_uuid: UUID,
|
||||
obj_id_dict: ObjectIdDictT,
|
||||
printer: FsfwTmTcPrinter,
|
||||
hk_filter: HkFilter,
|
||||
hk_level: int,
|
||||
db_con: sqlite3.Connection,
|
||||
):
|
||||
tm_packet = PusTm.unpack(raw_tm, CdsShortTimestamp.TIMESTAMP_SIZE)
|
||||
obj_id_raw = struct.unpack("!I", tm_packet.tm_data[0:4])[0]
|
||||
named_obj_id = cast(ObjectIdU32, obj_id_dict.get(obj_id_raw))
|
||||
if named_obj_id is None:
|
||||
named_obj_id = ObjectIdU32(obj_id_raw, "Unknown ID")
|
||||
if tm_packet.subservice == 25 or tm_packet.subservice == 26:
|
||||
set_id = struct.unpack("!I", tm_packet.tm_data[4:8])[0]
|
||||
hk_data = tm_packet.tm_data[8:]
|
||||
if named_obj_id.as_bytes in hk_filter.object_ids:
|
||||
if PRINT_RAW_HK_B64_STR:
|
||||
print(f"PUS TM Base64: {base64.b64encode(raw_tm)}")
|
||||
handle_regular_hk_print(
|
||||
printer=printer,
|
||||
set_id=set_id,
|
||||
packet_uuid=packet_uuid,
|
||||
object_id=named_obj_id,
|
||||
hk_packet=tm_packet,
|
||||
hk_data=hk_data,
|
||||
db=db_con,
|
||||
)
|
||||
return
|
||||
try:
|
||||
if hk_level >= 1:
|
||||
printer.generic_hk_tm_print(
|
||||
HkContentType.HK, named_obj_id, set_id, hk_data
|
||||
)
|
||||
if hk_level >= 1:
|
||||
handle_regular_hk_print(
|
||||
printer=printer,
|
||||
set_id=set_id,
|
||||
packet_uuid=packet_uuid,
|
||||
object_id=named_obj_id,
|
||||
hk_packet=tm_packet,
|
||||
hk_data=hk_data,
|
||||
db=db_con,
|
||||
)
|
||||
except ValueError as e:
|
||||
_LOGGER.exception(
|
||||
f"{e} error when parsing HK data coming from {named_obj_id}"
|
||||
)
|
||||
if tm_packet.subservice == 10 or tm_packet.subservice == 12:
|
||||
_LOGGER.warning("HK definitions printout not implemented yet")
|
||||
|
||||
|
||||
def handle_regular_hk_print( # noqa C901: Complexity okay here
|
||||
hk_packet: PusTm,
|
||||
set_id: int,
|
||||
packet_uuid: UUID,
|
||||
hk_data: bytes,
|
||||
db: sqlite3.Connection,
|
||||
object_id: ObjectIdU32,
|
||||
printer: FsfwTmTcPrinter,
|
||||
):
|
||||
objb = object_id.as_bytes
|
||||
hk_info = HkTmInfo(
|
||||
packet_uuid=packet_uuid,
|
||||
hk_packet=hk_packet,
|
||||
db_con=db,
|
||||
hk_data=hk_data,
|
||||
set_id=set_id,
|
||||
)
|
||||
timestamp = CdsShortTimestamp.unpack(hk_packet.timestamp)
|
||||
packet_dt = timestamp.as_datetime()
|
||||
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(pw, object_id, set_id, hk_data)
|
||||
elif objb == obj_ids.SYRLINKS_HANDLER_ID:
|
||||
return handle_syrlinks_hk_data(
|
||||
hk_info=hk_info,
|
||||
pw=pw,
|
||||
)
|
||||
elif objb == obj_ids.IMTQ_HANDLER_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(
|
||||
pw=pw,
|
||||
set_id=set_id,
|
||||
hk_data=hk_data,
|
||||
packet_time=timestamp.as_datetime(),
|
||||
)
|
||||
elif objb == obj_ids.PCDU_HANDLER_ID:
|
||||
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, pw=pw)
|
||||
elif objb == obj_ids.CORE_CONTROLLER_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(
|
||||
hk_info=hk_info,
|
||||
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(
|
||||
hk_info=hk_info,
|
||||
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(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(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(
|
||||
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,
|
||||
obj_ids.SUS_1_N_LOC_XBYFZM_PT_XB,
|
||||
obj_ids.SUS_2_N_LOC_XFYBZB_PT_YB,
|
||||
obj_ids.SUS_3_N_LOC_XFYBZF_PT_YF,
|
||||
obj_ids.SUS_4_N_LOC_XMYFZF_PT_ZF,
|
||||
obj_ids.SUS_5_N_LOC_XFYMZB_PT_ZB,
|
||||
obj_ids.SUS_6_R_LOC_XFYBZM_PT_XF,
|
||||
obj_ids.SUS_7_R_LOC_XBYBZM_PT_XB,
|
||||
obj_ids.SUS_8_R_LOC_XBYBZB_PT_YB,
|
||||
obj_ids.SUS_9_R_LOC_XBYBZB_PT_YF,
|
||||
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, pw=pw, set_id=set_id)
|
||||
elif objb in RTD_NAMES.keys():
|
||||
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(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,
|
||||
obj_ids.GYRO_2_ADIS_HANDLER_ID,
|
||||
obj_ids.GYRO_3_L3G_HANDLER_ID,
|
||||
]:
|
||||
return handle_gyros_hk_data(
|
||||
object_id=object_id, hk_data=hk_data, pw=pw, set_id=set_id
|
||||
)
|
||||
elif objb in [
|
||||
obj_ids.MGM_0_LIS3_HANDLER_ID,
|
||||
obj_ids.MGM_1_RM3100_HANDLER_ID,
|
||||
obj_ids.MGM_2_LIS3_HANDLER_ID,
|
||||
obj_ids.MGM_3_RM3100_HANDLER_ID,
|
||||
]:
|
||||
return handle_mgm_hk_data(
|
||||
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, pw=pw)
|
||||
elif objb == obj_ids.THERMAL_CONTROLLER_ID:
|
||||
return handle_thermal_controller_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, pw=pw)
|
||||
elif objb == obj_ids.PLOC_SUPV_ID:
|
||||
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(
|
||||
pw=pw, set_id=set_id, hk_data=hk_data, packet_time=packet_dt
|
||||
)
|
||||
elif objb == obj_ids.PWR_CONTROLLER:
|
||||
return handle_pwr_ctrl_hk_data(
|
||||
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} "
|
||||
"has not been implemented."
|
||||
)
|
@ -1,183 +0,0 @@
|
||||
"""HK Handling for EIVE OBSW"""
|
||||
# from pus_tm.tcp_server_objects import TCP_SEVER_SENSOR_TEMPERATURES
|
||||
from eive_tmtc.tmtc.acs.acs_ctrl import handle_acs_ctrl_mgm_data
|
||||
from eive_tmtc.pus_tm.devs.plpcdu import handle_plpcdu_hk
|
||||
from eive_tmtc.pus_tm.devs.rad_sensor import handle_rad_sensor_data
|
||||
from eive_tmtc.pus_tm.devs.sus import handle_sus_hk
|
||||
from eive_tmtc.pus_tm.system.tcs import handle_thermal_controller_hk_data
|
||||
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 tmtccmd.tm.pus_3_fsfw_hk import (
|
||||
Service3Base,
|
||||
HkContentType,
|
||||
Service3FsfwTm,
|
||||
)
|
||||
from tmtccmd.util.obj_id import ObjectIdU32, ObjectIdDictT
|
||||
from tmtccmd.logging import get_console_logger
|
||||
|
||||
from eive_tmtc.pus_tm.devs.bpx_bat import handle_bpx_hk_data
|
||||
from eive_tmtc.pus_tm.devs.gps import handle_gps_data
|
||||
from eive_tmtc.pus_tm.devs.gyros import handle_gyros_hk_data
|
||||
from eive_tmtc.tmtc.power.tm import (
|
||||
handle_pdu_data,
|
||||
handle_p60_hk_data,
|
||||
handle_acu_hk_data,
|
||||
)
|
||||
from eive_tmtc.pus_tm.devs.syrlinks import handle_syrlinks_hk_data
|
||||
from eive_tmtc.tmtc.acs.imtq import (
|
||||
ImtqSetIds,
|
||||
handle_self_test_data,
|
||||
handle_eng_set,
|
||||
handle_calibrated_mtm_measurement,
|
||||
handle_raw_mtm_measurement,
|
||||
)
|
||||
from eive_tmtc.pus_tm.defs import FsfwTmTcPrinter
|
||||
from eive_tmtc.pus_tm.system.core import handle_core_hk_data
|
||||
from eive_tmtc.pus_tm.devs.mgms import handle_mgm_hk_data
|
||||
import eive_tmtc.config.object_ids as obj_ids
|
||||
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
|
||||
|
||||
FORWARD_SENSOR_TEMPS = False
|
||||
|
||||
|
||||
def handle_hk_packet(
|
||||
raw_tm: bytes,
|
||||
obj_id_dict: ObjectIdDictT,
|
||||
printer: FsfwTmTcPrinter,
|
||||
):
|
||||
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)
|
||||
if named_obj_id is None:
|
||||
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,
|
||||
hk_data=hk_data,
|
||||
)
|
||||
except ValueError as e:
|
||||
LOGGER.exception(
|
||||
f"{e} error when parsing HK data coming from {named_obj_id}"
|
||||
)
|
||||
if tm_packet.subservice == 10 or tm_packet.subservice == 12:
|
||||
LOGGER.warning("HK definitions printout not implemented yet")
|
||||
|
||||
|
||||
def handle_regular_hk_print(
|
||||
printer: FsfwTmTcPrinter,
|
||||
object_id: ObjectIdU32,
|
||||
hk_packet: Service3Base,
|
||||
hk_data: bytes,
|
||||
):
|
||||
objb = object_id.as_bytes
|
||||
set_id = hk_packet.set_id
|
||||
"""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]:
|
||||
handle_rw_hk_data(printer, object_id, set_id, hk_data)
|
||||
elif objb == obj_ids.SYRLINKS_HANDLER_ID:
|
||||
handle_syrlinks_hk_data(printer=printer, hk_data=hk_data, set_id=set_id)
|
||||
elif objb == obj_ids.IMTQ_HANDLER_ID:
|
||||
if (set_id >= ImtqSetIds.POSITIVE_X_TEST) and (
|
||||
set_id <= ImtqSetIds.NEGATIVE_Z_TEST
|
||||
):
|
||||
return handle_self_test_data(printer, hk_data)
|
||||
elif set_id == ImtqSetIds.ENG_HK_SET:
|
||||
return handle_eng_set(printer, hk_data)
|
||||
elif set_id == ImtqSetIds.CAL_MTM_SET:
|
||||
return handle_calibrated_mtm_measurement(printer, hk_data)
|
||||
elif set_id == ImtqSetIds.RAW_MTM_SET:
|
||||
return handle_raw_mtm_measurement(printer, hk_data)
|
||||
else:
|
||||
LOGGER.info("Service 3 TM: IMTQ handler reply with unknown set id")
|
||||
elif objb == obj_ids.GPS_CONTROLLER:
|
||||
return handle_gps_data(printer=printer, hk_data=hk_data)
|
||||
elif objb == obj_ids.BPX_HANDLER_ID:
|
||||
handle_bpx_hk_data(hk_data=hk_data, set_id=set_id, printer=printer)
|
||||
elif objb == obj_ids.CORE_CONTROLLER_ID:
|
||||
return handle_core_hk_data(printer=printer, 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
|
||||
)
|
||||
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
|
||||
)
|
||||
elif objb == obj_ids.ACU_HANDLER_ID:
|
||||
return handle_acu_hk_data(printer=printer, 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)
|
||||
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
|
||||
)
|
||||
if objb in [
|
||||
obj_ids.SUS_0_N_LOC_XFYFZM_PT_XF,
|
||||
obj_ids.SUS_1_N_LOC_XBYFZM_PT_XB,
|
||||
obj_ids.SUS_2_N_LOC_XFYBZB_PT_YB,
|
||||
obj_ids.SUS_3_N_LOC_XFYBZF_PT_YF,
|
||||
obj_ids.SUS_4_N_LOC_XMYFZF_PT_ZF,
|
||||
obj_ids.SUS_5_N_LOC_XFYMZB_PT_ZB,
|
||||
obj_ids.SUS_6_R_LOC_XFYBZM_PT_XF,
|
||||
obj_ids.SUS_7_R_LOC_XBYBZM_PT_XB,
|
||||
obj_ids.SUS_8_R_LOC_XBYBZB_PT_YB,
|
||||
obj_ids.SUS_9_R_LOC_XBYBZB_PT_YF,
|
||||
obj_ids.SUS_10_R_LOC_XMYBZF_PT_ZF,
|
||||
obj_ids.SUS_11_R_LOC_XBYMZB_PT_ZB,
|
||||
]:
|
||||
handle_sus_hk(
|
||||
object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
|
||||
)
|
||||
elif objb == obj_ids.P60_DOCK_HANDLER:
|
||||
handle_p60_hk_data(printer=printer, 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,
|
||||
obj_ids.GYRO_2_ADIS_HANDLER_ID,
|
||||
obj_ids.GYRO_3_L3G_HANDLER_ID,
|
||||
]:
|
||||
handle_gyros_hk_data(
|
||||
object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
|
||||
)
|
||||
elif objb in [
|
||||
obj_ids.MGM_0_LIS3_HANDLER_ID,
|
||||
obj_ids.MGM_1_RM3100_HANDLER_ID,
|
||||
obj_ids.MGM_2_LIS3_HANDLER_ID,
|
||||
obj_ids.MGM_3_RM3100_HANDLER_ID,
|
||||
]:
|
||||
handle_mgm_hk_data(
|
||||
object_id=object_id, hk_data=hk_data, printer=printer, set_id=set_id
|
||||
)
|
||||
elif objb == obj_ids.PL_PCDU_ID:
|
||||
handle_plpcdu_hk(set_id=set_id, hk_data=hk_data, printer=printer)
|
||||
elif objb == obj_ids.THERMAL_CONTROLLER_ID:
|
||||
handle_thermal_controller_hk_data(
|
||||
object_id=object_id, printer=printer, set_id=set_id, hk_data=hk_data
|
||||
)
|
||||
elif objb == obj_ids.PLOC_SUPV_ID:
|
||||
handle_supv_hk_data(set_id=set_id, hk_data=hk_data, printer=printer)
|
||||
elif objb == obj_ids.ACS_CONTROLLER:
|
||||
handle_acs_ctrl_mgm_data(printer, hk_data)
|
||||
else:
|
||||
LOGGER.info(
|
||||
f"Service 3 TM: Parsing for object {object_id} and set ID {set_id} "
|
||||
f"has not been implemented."
|
||||
)
|
218
eive_tmtc/pus_tm/pus_handler.py
Normal file
218
eive_tmtc/pus_tm/pus_handler.py
Normal file
@ -0,0 +1,218 @@
|
||||
"""Core EIVE TM handler module
|
||||
"""
|
||||
|
||||
import logging
|
||||
import sqlite3
|
||||
import uuid
|
||||
from typing import Any
|
||||
|
||||
from spacepackets.ccsds.time import CdsShortTimestamp
|
||||
from spacepackets.ecss import PusTelemetry
|
||||
from spacepackets.ecss.pus_17_test import Service17Tm
|
||||
from spacepackets.util import PrintFormats
|
||||
from tmtccmd.fsfw.tmtc_printer import FsfwTmTcPrinter
|
||||
from tmtccmd.logging.pus import RawTmtcTimedLogWrapper
|
||||
from tmtccmd.pus import VerificationWrapper
|
||||
from tmtccmd.pus.s20_fsfw_param import Service20FsfwTm, Service20ParamDumpWrapper
|
||||
from tmtccmd.pus.s20_fsfw_param_defs import CustomSubservice as ParamSubservice
|
||||
from tmtccmd.pus.s200_fsfw_mode import Service200FsfwReader, Service200FsfwTm
|
||||
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservice
|
||||
from tmtccmd.tmtc import GenericApidHandlerBase, SpecificApidHandlerBase
|
||||
from eive_tmtc.config.definitions import TM_DB_PATH, PUS_APID
|
||||
|
||||
from eive_tmtc.config.object_ids import get_object_ids
|
||||
|
||||
from .action_reply_handler import handle_action_service_tm
|
||||
from .defs import PrintWrapper
|
||||
from .event_handler import handle_event_packet
|
||||
from .hk_handler import HkFilter, handle_hk_packet
|
||||
from .verification_handler import generic_retval_printout, handle_service_1_fsfw_packet
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
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
|
||||
self.these_objs_hk_only = []
|
||||
self.hk_filter = HkFilter(object_ids=self.these_objs_hk_only, set_ids=[])
|
||||
self.obj_id_dict = get_object_ids()
|
||||
self.pw = PrintWrapper(printer.file_logger)
|
||||
|
||||
def handle_tm(self, packet: bytes, _user_args: Any):
|
||||
self.pus_handler(
|
||||
packet,
|
||||
)
|
||||
|
||||
def pus_handler( # noqa C901 : Complexity okay here
|
||||
self,
|
||||
packet: bytes,
|
||||
):
|
||||
packet_uuid = uuid.uuid4()
|
||||
if len(packet) < 8:
|
||||
_LOGGER.warning("Detected packet shorter than 8 bytes!")
|
||||
return
|
||||
try:
|
||||
tm_packet = PusTelemetry.unpack(packet, CdsShortTimestamp.TIMESTAMP_SIZE)
|
||||
# _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
|
||||
timestamp = CdsShortTimestamp.unpack(tm_packet.timestamp)
|
||||
db_con = sqlite3.connect(TM_DB_PATH)
|
||||
self._store_packet_in_db(
|
||||
db_con=db_con,
|
||||
packet=packet,
|
||||
tm_packet=tm_packet,
|
||||
timestamp=timestamp,
|
||||
packet_uuid=packet_uuid,
|
||||
)
|
||||
service = tm_packet.service
|
||||
dedicated_handler = True
|
||||
if service == 1:
|
||||
handle_service_1_fsfw_packet(wrapper=self.verif_wrapper, raw_tm=packet)
|
||||
elif service == 3:
|
||||
handle_hk_packet(
|
||||
db_con=db_con,
|
||||
packet_uuid=packet_uuid,
|
||||
printer=self.printer,
|
||||
raw_tm=packet,
|
||||
obj_id_dict=self.obj_id_dict,
|
||||
hk_level=self.hk_level,
|
||||
hk_filter=self.hk_filter,
|
||||
)
|
||||
elif service == 5:
|
||||
handle_event_packet(raw_tm=packet, pw=self.pw)
|
||||
elif service == 8:
|
||||
handle_action_service_tm(
|
||||
raw_tm=packet, pw=self.pw, obj_id_dict=self.obj_id_dict
|
||||
)
|
||||
elif service == 17:
|
||||
pus17_tm = Service17Tm.unpack(
|
||||
data=packet, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE
|
||||
)
|
||||
if pus17_tm.subservice == 2:
|
||||
self.verif_wrapper.dlog("Received Ping Reply TM[17,2]")
|
||||
dedicated_handler = True
|
||||
elif service == 20:
|
||||
self._handle_param_packet(packet, tm_packet)
|
||||
elif service == 200:
|
||||
dedicated_handler = self._handle_mode_packet(tm_packet)
|
||||
else:
|
||||
_LOGGER.info(
|
||||
f"The service {service} is not implemented in Telemetry Factory"
|
||||
)
|
||||
tm_packet.print_source_data(PrintFormats.HEX)
|
||||
dedicated_handler = True
|
||||
if not dedicated_handler and tm_packet is not None:
|
||||
_LOGGER.info(
|
||||
f"TM [{service},{tm_packet.subservice}] does not have a dedicated handler"
|
||||
)
|
||||
self.raw_logger.log_tm(tm_packet)
|
||||
|
||||
def _store_packet_in_db(
|
||||
self,
|
||||
db_con: sqlite3.Connection,
|
||||
packet: bytes,
|
||||
timestamp: CdsShortTimestamp,
|
||||
tm_packet: PusTelemetry,
|
||||
packet_uuid: uuid.UUID,
|
||||
):
|
||||
cursor = db_con.cursor()
|
||||
cursor.execute(
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS pus_tm(
|
||||
packet_uuid TEXT PRIMARY KEY,
|
||||
generation_time TEXT,
|
||||
service NUM,
|
||||
subservice NUM,
|
||||
data_len NUM,
|
||||
raw_data BLOB
|
||||
)"""
|
||||
)
|
||||
cursor.execute(
|
||||
"INSERT INTO pus_tm VALUES(?, ?, ?, ?, ?, ?)",
|
||||
(
|
||||
str(packet_uuid),
|
||||
timestamp.as_datetime(),
|
||||
tm_packet.service,
|
||||
tm_packet.subservice,
|
||||
len(packet),
|
||||
packet,
|
||||
),
|
||||
)
|
||||
db_con.commit()
|
||||
|
||||
def _handle_param_packet(self, raw_data: bytes, tm_packet: PusTelemetry):
|
||||
param_packet = Service20FsfwTm.unpack(
|
||||
raw_telemetry=raw_data, timestamp_len=CdsShortTimestamp.TIMESTAMP_SIZE
|
||||
)
|
||||
if tm_packet.subservice == ParamSubservice.TM_DUMP_REPLY:
|
||||
param_wrapper = Service20ParamDumpWrapper(param_tm=param_packet)
|
||||
try:
|
||||
param = param_wrapper.get_param()
|
||||
obj = self.obj_id_dict.get(param_wrapper.param_tm.object_id)
|
||||
self.pw.dlog(f"Received parameter dump TM from {obj}")
|
||||
self.pw.dlog(f"Parameter: {param}")
|
||||
if param.rows == 1 and param.columns == 1:
|
||||
try:
|
||||
scalar_param = param.parse_scalar_param()
|
||||
if isinstance(scalar_param, int):
|
||||
self.pw.dlog(f"Scalar integer parameter: {scalar_param}")
|
||||
elif isinstance(scalar_param, float):
|
||||
self.pw.dlog(
|
||||
f"Scalar floating point parameter: {scalar_param}"
|
||||
)
|
||||
except ValueError as e:
|
||||
self.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
|
||||
self.pw.dlog(
|
||||
"Received vector or matrix data:"
|
||||
f" {param.param_raw.hex(sep=',')}"
|
||||
)
|
||||
except ValueError as e:
|
||||
self.pw.dlog(f"received {e} when trying to parse parameters")
|
||||
except NotImplementedError as e:
|
||||
self.pw.dlog(f"received {e} when trying to parse parameters")
|
||||
else:
|
||||
self.pw.dlog(
|
||||
f"unknown subservice {tm_packet.subservice} for parameter service"
|
||||
)
|
||||
|
||||
def _handle_mode_packet(self, pus_tm: PusTelemetry) -> bool:
|
||||
tm_packet = Service200FsfwReader(pus_tm)
|
||||
if tm_packet.tm.subservice == ModeSubservice.TM_CANT_REACH_MODE:
|
||||
obj_id = tm_packet.object_id
|
||||
obj_id_obj = self.obj_id_dict.get(obj_id)
|
||||
retval = tm_packet.return_value
|
||||
assert retval is not None
|
||||
string_list = generic_retval_printout(retval)
|
||||
self.pw.dlog(f"Received Mode Reply from {obj_id_obj}: Can't reach mode.")
|
||||
for string in string_list:
|
||||
self.pw.dlog(f"Reason: {string}")
|
||||
return True
|
||||
if tm_packet.tm.subservice == ModeSubservice.TM_WRONG_MODE_REPLY:
|
||||
self.pw.dlog(f"Received Mode TM wrong mode reply, mode: {tm_packet.mode}")
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
class UnknownApidHandler(GenericApidHandlerBase):
|
||||
def handle_tm(self, apid: int, packet: bytes, _user_args: Any):
|
||||
_LOGGER.warning(
|
||||
f"Packet with unknown APID {apid} detected: {packet.hex(sep=',')}"
|
||||
)
|
@ -1,21 +0,0 @@
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from eive_tmtc.pus_tc.system.core import SetIds
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
|
||||
|
||||
def handle_core_hk_data(printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes):
|
||||
if set_id == SetIds.HK:
|
||||
pw = PrintWrapper(printer)
|
||||
fmt_str = "!fff"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(temperature, ps_voltage, pl_voltage) = struct.unpack(
|
||||
fmt_str, hk_data[0 : 0 + inc_len]
|
||||
)
|
||||
printout = (
|
||||
f"Chip Temperature [°C] {temperature} | PS Voltage [mV] {ps_voltage} | "
|
||||
f"PL Voltage [mV] {pl_voltage}"
|
||||
)
|
||||
pw.dlog(printout)
|
||||
printer.print_validity_buffer(validity_buffer=hk_data[inc_len:], num_vars=3)
|
@ -1,120 +0,0 @@
|
||||
import enum
|
||||
import pprint
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
|
||||
|
||||
class SetIds(enum.IntEnum):
|
||||
SENSOR_TEMPERATURE_SET = 0
|
||||
DEVICE_TEMPERATURE_SET = 1
|
||||
SUS_TEMPERATURE_SET = 2
|
||||
|
||||
|
||||
def handle_thermal_controller_hk_data(
|
||||
object_id: ObjectIdU32, printer: FsfwTmTcPrinter, set_id: int, hk_data: bytes
|
||||
):
|
||||
# need a better solutuon for this is this is used again..
|
||||
"""
|
||||
if TCP_TEMP_SENS_SERVER is None:
|
||||
TCP_TEMP_SENS_SERVER = TmTcpServer("localhost", 7305)
|
||||
if TCP_TEMP_DEV_SERVER:
|
||||
TCP_TEMP_DEV_SERVER = TmTcpServer("localhost", 7306)
|
||||
"""
|
||||
if set_id == SetIds.SENSOR_TEMPERATURE_SET:
|
||||
pw = PrintWrapper(printer)
|
||||
pw.dlog("Received sensor temperature data")
|
||||
|
||||
# get all the floats
|
||||
tm_data = struct.unpack("!ffffffffffffffffff", hk_data[: 18 * 4])
|
||||
parsed_data = {
|
||||
"SENSOR_PLOC_HEATSPREADER": tm_data[0],
|
||||
"SENSOR_PLOC_MISSIONBOARD": tm_data[1],
|
||||
"SENSOR_4K_CAMERA": tm_data[2],
|
||||
"SENSOR_DAC_HEATSPREADER": tm_data[3],
|
||||
"SENSOR_STARTRACKER": tm_data[4],
|
||||
"SENSOR_RW1": tm_data[5],
|
||||
"SENSOR_DRO": tm_data[6],
|
||||
"SENSOR_SCEX": tm_data[7],
|
||||
"SENSOR_X8": tm_data[8],
|
||||
"SENSOR_HPA": tm_data[9],
|
||||
"SENSOR_TX_MODUL": tm_data[10],
|
||||
"SENSOR_MPA": tm_data[11],
|
||||
"SENSOR_ACU": tm_data[12],
|
||||
"SENSOR_PLPCDU_HEATSPREADER": tm_data[13],
|
||||
"SENSOR_TCS_BOARD": tm_data[14],
|
||||
"SENSOR_MAGNETTORQUER": tm_data[15],
|
||||
"TMP1075 1": tm_data[16],
|
||||
"TMP1075 2": tm_data[17],
|
||||
}
|
||||
printer.file_logger.info(str(parsed_data))
|
||||
pp = pprint.PrettyPrinter(depth=4)
|
||||
pp.pprint(parsed_data)
|
||||
# tcp_server_sensor_temperatures.report_parsed_hk_data(
|
||||
# object_id, set_id, parsed_data
|
||||
# )
|
||||
elif set_id == SetIds.DEVICE_TEMPERATURE_SET:
|
||||
pw = PrintWrapper(printer)
|
||||
pw.dlog("Received device temperature data")
|
||||
fmt_str = "!fhhhhiiiifffhffffffffffffff"
|
||||
tm_data = struct.unpack(fmt_str, hk_data[:98])
|
||||
parsed_data = {
|
||||
"Q7S_TEMPERATURE": tm_data[0],
|
||||
"BATTERY_TEMPERATURE_1": tm_data[1],
|
||||
"BATTERY_TEMPERATURE_2": tm_data[2],
|
||||
"BATTERY_TEMPERATURE_3": tm_data[3],
|
||||
"BATTERY_TEMPERATURE_4": tm_data[4],
|
||||
"RW_1_TEMPERATURE": tm_data[5],
|
||||
"RW_2_TEMPERATURE": tm_data[6],
|
||||
"RW_3_TEMPERATURE": tm_data[7],
|
||||
"RW_4_TEMPERATURE": tm_data[8],
|
||||
"STARTRACKER_TEMPERATURE": tm_data[9],
|
||||
"SYRLINKS_POWER_AMPLIFIER_TEMPERATURE": tm_data[10],
|
||||
"SYRLINKS_BASEBAND_BOARD_TEMPERATURE": tm_data[11],
|
||||
"MGT_TEMPERATURE": tm_data[12],
|
||||
"ACU_TEMPERATURE_1": tm_data[13],
|
||||
"ACU_TEMPERATURE_2": tm_data[14],
|
||||
"ACU_TEMPERATURE_3": tm_data[15],
|
||||
"PDU1_TEMPERATURE": tm_data[16],
|
||||
"PDU2_TEMPERATURE": tm_data[17],
|
||||
"P60DOCK_TEMPERATURE_1": tm_data[18],
|
||||
"P60DOCK_TEMPERATURE_2": tm_data[19],
|
||||
"GYRO_0_TEMPERATURE": tm_data[20],
|
||||
"GYRO_1_TEMPERATURE": tm_data[21],
|
||||
"GYRO_2_TEMPERATURE": tm_data[22],
|
||||
"GYRO_3_TEMPERATURE": tm_data[23],
|
||||
"MGM_0_TEMPERATURE": tm_data[24],
|
||||
"MGM_1_TEMPERATURE": tm_data[25],
|
||||
"ADC_PL_PCDU_TEMPERATURE": tm_data[26],
|
||||
}
|
||||
printer.file_logger.info(str(parsed_data))
|
||||
pp = pprint.PrettyPrinter(depth=4)
|
||||
pp.pprint(parsed_data)
|
||||
# print(parsed_data)
|
||||
# tcp_server_device_temperatures.report_parsed_hk_data(
|
||||
# object_id, set_id, parsed_data
|
||||
# )
|
||||
elif set_id == SetIds.SUS_TEMPERATURE_SET:
|
||||
pass
|
||||
# pw = PrintWrapper(printer)
|
||||
# pw.dlog("Received SUS temperature data")
|
||||
# fmt_str = "!ffffffffffffffffff"
|
||||
# tm_data = struct.unpack(fmt_str, hk_data[:4 * 18])
|
||||
# parsed_data = {
|
||||
# "SUS_0": tm_data[0],
|
||||
# "SUS_1": tm_data[1],
|
||||
# "SUS_2": tm_data[2],
|
||||
# "SUS_3": tm_data[3],
|
||||
# "SUS_4": tm_data[4],
|
||||
# "SUS_5": tm_data[5],
|
||||
# "SUS_6": tm_data[6],
|
||||
# "SUS_7": tm_data[7],
|
||||
# "SUS_8": tm_data[8],
|
||||
# "SUS_9": tm_data[9],
|
||||
# "SUS_10": tm_data[10],
|
||||
# "SUS_11": tm_data[11],
|
||||
# }
|
||||
# print(parsed_data)
|
||||
# TODO: Forward data to space simulator
|
@ -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",
|
||||
|
@ -1,12 +1,13 @@
|
||||
import logging
|
||||
from typing import List, Optional
|
||||
|
||||
from spacepackets.ccsds import CdsShortTimestamp
|
||||
from spacepackets.ecss.pus_1_verification import UnpackParams, Service1Tm
|
||||
from tmtccmd.logging import get_console_logger
|
||||
from tmtccmd.pus import VerificationWrapper
|
||||
from tmtccmd.tm.pus_1_verification import Service1FsfwWrapper
|
||||
from tmtccmd.pus.s1_verification import Service1FsfwWrapper
|
||||
from eive_tmtc.config.retvals import get_retval_dict
|
||||
|
||||
LOGGER = get_console_logger()
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def handle_service_1_fsfw_packet(wrapper: VerificationWrapper, raw_tm: bytes):
|
||||
@ -15,15 +16,17 @@ def handle_service_1_fsfw_packet(wrapper: VerificationWrapper, raw_tm: bytes):
|
||||
"Console logger or file logger not valid. Please set a valid one"
|
||||
)
|
||||
# Error code with length 2 is FSFW specific
|
||||
tm_packet = Service1Tm.unpack(data=raw_tm, params=UnpackParams(1, 2))
|
||||
tm_packet = Service1Tm.unpack(
|
||||
data=raw_tm, params=UnpackParams(CdsShortTimestamp.TIMESTAMP_SIZE, 1, 2)
|
||||
)
|
||||
fsfw_wrapper = Service1FsfwWrapper(tm_packet)
|
||||
res = wrapper.verificator.add_tm(tm_packet)
|
||||
if res is None:
|
||||
LOGGER.info(
|
||||
_LOGGER.info(
|
||||
f"Received Verification TM[{tm_packet.service}, {tm_packet.subservice}] "
|
||||
f"with Request ID {tm_packet.tc_req_id.as_u32():#08x}"
|
||||
)
|
||||
LOGGER.warning(f"No matching telecommand found for {tm_packet.tc_req_id}")
|
||||
_LOGGER.warning(f"No matching telecommand found for {tm_packet.tc_req_id}")
|
||||
else:
|
||||
wrapper.log_to_console(tm_packet, res)
|
||||
wrapper.log_to_file(tm_packet, res)
|
||||
@ -45,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:
|
||||
@ -55,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
|
||||
|
@ -1,2 +1,4 @@
|
||||
from .payload.pl_subsystem import add_payload_subsystem_cmds
|
||||
from .test import add_test_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
|
||||
|
@ -0,0 +1 @@
|
||||
from .gyros import add_gyr_cmd_defs
|
@ -1,16 +1,16 @@
|
||||
import enum
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from tmtccmd.config.tmtc import (
|
||||
tmtc_definitions_provider,
|
||||
TmtcDefinitionWrapper,
|
||||
CmdTreeNode,
|
||||
OpCodeEntry,
|
||||
TmtcDefinitionWrapper,
|
||||
tmtc_definitions_provider,
|
||||
)
|
||||
from tmtccmd.tc import service_provider
|
||||
from tmtccmd.tc.decorator import ServiceProviderParams
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import Modes
|
||||
from eive_tmtc.config.object_ids import ACS_BOARD_ASS_ID
|
||||
from tmtccmd.pus.s200_fsfw_mode import Mode
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.config.object_ids import ACS_BOARD_ASS_ID
|
||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||
|
||||
|
||||
@ -24,74 +24,118 @@ class AcsOpCodes:
|
||||
ACS_ASS_DUAL_ON = ["6", "do"]
|
||||
|
||||
|
||||
class DualSideSubmodes(enum.IntEnum):
|
||||
class DualSideSubmode(enum.IntEnum):
|
||||
A_SIDE = 0
|
||||
B_SIDE = 1
|
||||
DUAL_SIDE = 2
|
||||
|
||||
|
||||
@service_provider(CustomServiceList.ACS_BRD_ASS)
|
||||
def pack_acs_command(p: ServiceProviderParams):
|
||||
op_code = p.op_code
|
||||
q = p.queue_helper
|
||||
if op_code in AcsOpCodes.ACS_ASS_A_SIDE:
|
||||
def pack_acs_board_command(q: DefaultPusQueueHelper, cmd_str: str):
|
||||
if cmd_str in AcsOpCodes.ACS_ASS_A_SIDE:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_BOARD_ASS_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=DualSideSubmodes.A_SIDE,
|
||||
mode=Mode.NORMAL,
|
||||
submode=DualSideSubmode.A_SIDE,
|
||||
q=q,
|
||||
info="Switching to ACS board assembly A side",
|
||||
)
|
||||
if op_code in AcsOpCodes.ACS_ASS_B_SIDE:
|
||||
if cmd_str in AcsOpCodes.ACS_ASS_B_SIDE:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_BOARD_ASS_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=DualSideSubmodes.B_SIDE,
|
||||
mode=Mode.NORMAL,
|
||||
submode=DualSideSubmode.B_SIDE,
|
||||
q=q,
|
||||
info="Switching to ACS board assembly B side",
|
||||
)
|
||||
if op_code in AcsOpCodes.ACS_ASS_DUAL_MODE:
|
||||
if cmd_str in AcsOpCodes.ACS_ASS_DUAL_MODE:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_BOARD_ASS_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=DualSideSubmodes.DUAL_SIDE,
|
||||
mode=Mode.NORMAL,
|
||||
submode=DualSideSubmode.DUAL_SIDE,
|
||||
q=q,
|
||||
info="Switching to ACS board assembly dual mode",
|
||||
)
|
||||
if op_code in AcsOpCodes.ACS_ASS_A_ON:
|
||||
if cmd_str in AcsOpCodes.ACS_ASS_A_ON:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_BOARD_ASS_ID,
|
||||
mode=Modes.ON,
|
||||
submode=DualSideSubmodes.A_SIDE,
|
||||
mode=Mode.ON,
|
||||
submode=DualSideSubmode.A_SIDE,
|
||||
q=q,
|
||||
info="Switching ACS board assembly A side on",
|
||||
)
|
||||
if op_code in AcsOpCodes.ACS_ASS_B_ON:
|
||||
if cmd_str in AcsOpCodes.ACS_ASS_B_ON:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_BOARD_ASS_ID,
|
||||
mode=Modes.ON,
|
||||
submode=DualSideSubmodes.B_SIDE,
|
||||
mode=Mode.ON,
|
||||
submode=DualSideSubmode.B_SIDE,
|
||||
q=q,
|
||||
info="Switching ACS board assembly B side on",
|
||||
)
|
||||
if op_code in AcsOpCodes.ACS_ASS_DUAL_ON:
|
||||
if cmd_str in AcsOpCodes.ACS_ASS_DUAL_ON:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_BOARD_ASS_ID,
|
||||
mode=Modes.ON,
|
||||
submode=DualSideSubmodes.B_SIDE,
|
||||
mode=Mode.ON,
|
||||
submode=DualSideSubmode.B_SIDE,
|
||||
q=q,
|
||||
info="Switching ACS board assembly dual side on",
|
||||
)
|
||||
if op_code in AcsOpCodes.ACS_ASS_OFF:
|
||||
if cmd_str in AcsOpCodes.ACS_ASS_OFF:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_BOARD_ASS_ID,
|
||||
mode=Modes.OFF,
|
||||
mode=Mode.OFF,
|
||||
submode=0,
|
||||
q=q,
|
||||
info="Switching to ACS board assembly off",
|
||||
)
|
||||
|
||||
|
||||
def create_acs_board_node() -> CmdTreeNode:
|
||||
node = CmdTreeNode("acs_brd", "ACS Board", hide_children_which_are_leaves=True)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
AcsOpCodes.ACS_ASS_A_SIDE[1],
|
||||
"Switch to ACS board A side",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
AcsOpCodes.ACS_ASS_B_SIDE[1],
|
||||
"Switch to ACS board B side",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
AcsOpCodes.ACS_ASS_DUAL_MODE[1],
|
||||
"Switch to ACS board dual mode",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
AcsOpCodes.ACS_ASS_A_ON[1],
|
||||
"Switch ACS board A side on",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
AcsOpCodes.ACS_ASS_B_ON[1],
|
||||
"Switch ACS board B side on",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
AcsOpCodes.ACS_ASS_DUAL_ON[1],
|
||||
"Switch ACS board dual mode on",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
AcsOpCodes.ACS_ASS_OFF[1],
|
||||
"Switch off ACS board",
|
||||
)
|
||||
)
|
||||
return node
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_acs_board_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,85 +0,0 @@
|
||||
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 ACS_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_modes import Subservices as ModeSubservices
|
||||
from tmtccmd.tc import service_provider
|
||||
from tmtccmd.tc.decorator import ServiceProviderParams
|
||||
|
||||
|
||||
class OpCodes(str, enum.Enum):
|
||||
OFF = "off"
|
||||
SAFE = "safe"
|
||||
DETUMBLE = "detumble"
|
||||
IDLE = "idle"
|
||||
TARGET_PT = "target"
|
||||
REPORT_ALL_MODES = "all_modes"
|
||||
|
||||
|
||||
class AcsModes(enum.IntEnum):
|
||||
OFF = 0
|
||||
SAFE = 1 << 24
|
||||
DETUMBLE = 2 << 24
|
||||
IDLE = 3 << 24
|
||||
TARGET_PT = 4 << 24
|
||||
|
||||
|
||||
class Info(str, enum.Enum):
|
||||
OFF = "Off Command"
|
||||
SAFE = "Safe Mode Command"
|
||||
DETUMBLE = "Detumble Mode Command"
|
||||
IDLE = "Idle Mode Command"
|
||||
TARGET_PT = "Target Pointing Mode Command"
|
||||
REPORT_ALL_MODES = "Report All Modes Recursively"
|
||||
|
||||
|
||||
HANDLER_LIST: Dict[str, Tuple[int, str]] = {
|
||||
OpCodes.OFF: (AcsModes.OFF, Info.OFF),
|
||||
OpCodes.IDLE: (AcsModes.IDLE, Info.IDLE),
|
||||
OpCodes.SAFE: (AcsModes.SAFE, Info.SAFE),
|
||||
OpCodes.DETUMBLE: (AcsModes.DETUMBLE, Info.DETUMBLE),
|
||||
}
|
||||
|
||||
|
||||
@service_provider(CustomServiceList.ACS_SS.value)
|
||||
def build_acs_subsystem_cmd(p: ServiceProviderParams):
|
||||
op_code = p.op_code
|
||||
q = p.queue_helper
|
||||
info_prefix = "ACS Subsystem"
|
||||
if op_code in OpCodes.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=ACS_SUBSYSTEM_ID,
|
||||
)
|
||||
)
|
||||
mode_info_tup = HANDLER_LIST.get(op_code)
|
||||
if mode_info_tup is None:
|
||||
return
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_SUBSYSTEM_ID,
|
||||
info=f"{info_prefix}: {mode_info_tup[1]}",
|
||||
submode=0,
|
||||
mode=mode_info_tup[0],
|
||||
q=q,
|
||||
)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_acs_subsystem_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(OpCodes.OFF, Info.OFF)
|
||||
oce.add(OpCodes.SAFE, Info.SAFE)
|
||||
oce.add(OpCodes.IDLE, Info.IDLE)
|
||||
oce.add(OpCodes.REPORT_ALL_MODES, Info.REPORT_ALL_MODES)
|
||||
defs.add_service(CustomServiceList.ACS_SS, "ACS Subsystem", oce)
|
16
eive_tmtc/tmtc/acs/defs.py
Normal file
16
eive_tmtc/tmtc/acs/defs.py
Normal file
@ -0,0 +1,16 @@
|
||||
import enum
|
||||
|
||||
|
||||
class AcsMode(enum.IntEnum):
|
||||
OFF = 0
|
||||
SAFE = 10
|
||||
IDLE = 11
|
||||
PTG_NADIR = 12
|
||||
PTG_TARGET = 13
|
||||
PTG_TARGET_GS = 14
|
||||
PTG_INERTIAL = 15
|
||||
|
||||
|
||||
class SafeSubmode(enum.IntEnum):
|
||||
DEFAULT = 0
|
||||
DETUMBLE = 1
|
266
eive_tmtc/tmtc/acs/gps.py
Normal file
266
eive_tmtc/tmtc/acs/gps.py
Normal file
@ -0,0 +1,266 @@
|
||||
import datetime
|
||||
import enum
|
||||
import logging
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.config import CmdTreeNode
|
||||
from tmtccmd.pus.s200_fsfw_mode import create_mode_command, Mode
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||
make_sid,
|
||||
create_request_one_hk_command,
|
||||
create_enable_periodic_hk_command_with_interval_with_diag,
|
||||
create_disable_periodic_hk_command_with_diag,
|
||||
)
|
||||
from tmtccmd.pus.tc.s8_fsfw_action import create_action_cmd
|
||||
from tmtccmd.fsfw.tmtc_printer import get_validity_buffer_str
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class GpsInfo:
|
||||
MAX_SATELLITES = 30
|
||||
|
||||
|
||||
class ActIds:
|
||||
RESET_GNSS = 5
|
||||
|
||||
|
||||
class AcsBoardSides(enum.IntEnum):
|
||||
A_SIDE = 0
|
||||
B_SIDE = 1
|
||||
|
||||
|
||||
class OpCode:
|
||||
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_gnss"
|
||||
|
||||
|
||||
class Info:
|
||||
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):
|
||||
CORE_HK = 0
|
||||
SKYVIEW_HK = 1
|
||||
|
||||
|
||||
def create_gnss_node() -> CmdTreeNode:
|
||||
op_code_strs = [
|
||||
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||
]
|
||||
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||
node = CmdTreeNode("gnss_ctrl", "GNSS Ctrl", hide_children_for_print=True)
|
||||
for op_code, info in combined_dict.items():
|
||||
node.add_child(CmdTreeNode(op_code, info))
|
||||
return node
|
||||
|
||||
|
||||
def pack_gps_command( # noqa: C901
|
||||
object_id: bytes, q: DefaultPusQueueHelper, cmd_str: str
|
||||
): # noqa: C901:
|
||||
if cmd_str == OpCode.RESET_GNSS:
|
||||
for val in AcsBoardSides:
|
||||
print("{:<2}: {:<20}".format(val, val.name))
|
||||
board_side = int(input("Select Board Side \n" ""))
|
||||
q.add_log_cmd(f"GPS: {Info.RESET_GNSS}")
|
||||
q.add_pus_tc(
|
||||
create_action_cmd(
|
||||
object_id=object_id,
|
||||
action_id=ActIds.RESET_GNSS,
|
||||
user_data=bytearray([board_side]),
|
||||
)
|
||||
)
|
||||
if cmd_str == 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_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 cmd_str == 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 cmd_str == 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 cmd_str == 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 cmd_str == 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 cmd_str == 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 cmd_str == OpCode.ON:
|
||||
q.add_log_cmd(f"GPS: {Info.ON}")
|
||||
q.add_pus_tc(create_mode_command(object_id, Mode.ON, 0))
|
||||
if cmd_str == 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(
|
||||
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)
|
||||
(
|
||||
lat,
|
||||
long,
|
||||
alt,
|
||||
speed,
|
||||
fix,
|
||||
sats_in_use,
|
||||
sats_in_view,
|
||||
year,
|
||||
month,
|
||||
day,
|
||||
hours,
|
||||
minutes,
|
||||
seconds,
|
||||
unix_seconds,
|
||||
) = struct.unpack(fmt_str, hk_data[current_idx : current_idx + inc_len])
|
||||
current_idx += inc_len
|
||||
if year == 0:
|
||||
date_string = "No date string, year is 0"
|
||||
else:
|
||||
date_string = datetime.datetime(
|
||||
year=year, month=month, day=day, hour=hours, minute=minutes, second=seconds
|
||||
)
|
||||
pw.dlog(f"Lat: {lat} deg")
|
||||
pw.dlog(f"Long: {long} deg")
|
||||
pw.dlog(f"Altitude: {alt} m | Speed: {speed} m/s")
|
||||
pw.dlog(
|
||||
f"Fix Type: {fix} | Sats in View {sats_in_view} | Sats in Use {sats_in_use}"
|
||||
)
|
||||
pw.dlog(f"GNSS Date: {date_string}")
|
||||
pw.dlog(f"Unix seconds {unix_seconds}")
|
||||
pw.dlog(get_validity_buffer_str(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],
|
||||
)
|
||||
)
|
||||
pw.dlog(get_validity_buffer_str(validity_buffer=hk_data[current_idx:], num_vars=6))
|
199
eive_tmtc/tmtc/acs/gyros.py
Normal file
199
eive_tmtc/tmtc/acs/gyros.py
Normal file
@ -0,0 +1,199 @@
|
||||
import enum
|
||||
import logging
|
||||
import struct
|
||||
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from tmtccmd.config import CmdTreeNode
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.s201_fsfw_health import pack_set_health_cmd_data, FsfwHealth
|
||||
from tmtccmd.pus.s201_fsfw_health import Subservice
|
||||
|
||||
import eive_tmtc.config.object_ids as obj_ids
|
||||
from tmtccmd.pus.s200_fsfw_mode import create_mode_command, Mode
|
||||
from tmtccmd.pus.tc.s3_fsfw_hk import create_request_one_hk_command, make_sid
|
||||
from tmtccmd.config.tmtc import (
|
||||
tmtc_definitions_provider,
|
||||
OpCodeEntry,
|
||||
TmtcDefinitionWrapper,
|
||||
)
|
||||
from eive_tmtc.config.object_ids import (
|
||||
GYRO_0_ADIS_HANDLER_ID,
|
||||
GYRO_1_L3G_HANDLER_ID,
|
||||
GYRO_2_ADIS_HANDLER_ID,
|
||||
GYRO_3_L3G_HANDLER_ID,
|
||||
)
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
|
||||
class OpCode:
|
||||
NML = "normal"
|
||||
OFF = "off"
|
||||
CORE_HK = "core_hk"
|
||||
CFG_HK = "cfg_hk"
|
||||
SET_FAULTY = "set_faulty"
|
||||
|
||||
|
||||
class AdisGyroSetId(enum.IntEnum):
|
||||
CORE_HK = 0
|
||||
CFG_HK = 1
|
||||
|
||||
|
||||
class L3gGyroSetId(enum.IntEnum):
|
||||
CORE_HK = 0
|
||||
|
||||
|
||||
class GyrSel(enum.IntEnum):
|
||||
GYR_0_ADIS = 0
|
||||
GYR_1_L3G = 1
|
||||
GYR_2_ADIS = 2
|
||||
GYR_3_L3G = 3
|
||||
|
||||
|
||||
GYR_SEL_DICT = {
|
||||
GyrSel.GYR_0_ADIS: ("GYRO_0_ADIS", GYRO_0_ADIS_HANDLER_ID),
|
||||
GyrSel.GYR_1_L3G: ("GYRO_1_L3G", GYRO_1_L3G_HANDLER_ID),
|
||||
GyrSel.GYR_2_ADIS: ("GYRO_2_ADIS", GYRO_2_ADIS_HANDLER_ID),
|
||||
GyrSel.GYR_3_L3G: ("GYRO_3_L3G", GYRO_3_L3G_HANDLER_ID),
|
||||
}
|
||||
|
||||
|
||||
def handle_gyr_cmd(q: DefaultPusQueueHelper, cmd_str: str):
|
||||
print("Please select the Gyro Device")
|
||||
for k, v in GYR_SEL_DICT.items():
|
||||
print(f"{k}: {v[0]}")
|
||||
sel_idx = int(input("Select gyro device by index: "))
|
||||
gyr_info = GYR_SEL_DICT[GyrSel(sel_idx)]
|
||||
gyr_obj_id = gyr_info[1]
|
||||
is_adis = False
|
||||
if sel_idx == GyrSel.GYR_0_ADIS or sel_idx == GyrSel.GYR_2_ADIS:
|
||||
is_adis = True
|
||||
core_hk_id = AdisGyroSetId.CORE_HK
|
||||
else:
|
||||
core_hk_id = L3gGyroSetId.CORE_HK
|
||||
if cmd_str == OpCode.NML:
|
||||
q.add_log_cmd(f"Gyro {gyr_info[0]} NORMAL mode")
|
||||
q.add_pus_tc(create_mode_command(gyr_obj_id, Mode.NORMAL, 0))
|
||||
if cmd_str == OpCode.OFF:
|
||||
q.add_log_cmd(f"Gyro {gyr_info[0]} OFF mode")
|
||||
q.add_pus_tc(create_mode_command(gyr_obj_id, Mode.OFF, 0))
|
||||
elif cmd_str == OpCode.CORE_HK:
|
||||
q.add_log_cmd(f"Gyro {gyr_info[0]} Core HK")
|
||||
q.add_pus_tc(create_request_one_hk_command(make_sid(gyr_obj_id, core_hk_id)))
|
||||
elif cmd_str == OpCode.CFG_HK:
|
||||
if not is_adis:
|
||||
raise ValueError("No config HK for L3 device")
|
||||
q.add_log_cmd(f"Gyro {gyr_info[0]} CFG HK")
|
||||
q.add_pus_tc(
|
||||
create_request_one_hk_command(make_sid(gyr_obj_id, AdisGyroSetId.CFG_HK))
|
||||
)
|
||||
elif cmd_str == OpCode.SET_FAULTY:
|
||||
q.add_log_cmd(f"Gyro {gyr_info[0]} set faulty")
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=201,
|
||||
subservice=Subservice.TC_SET_HEALTH,
|
||||
app_data=pack_set_health_cmd_data(
|
||||
object_id=gyr_obj_id, health=FsfwHealth.FAULTY
|
||||
),
|
||||
)
|
||||
)
|
||||
else:
|
||||
logging.getLogger(__name__).warning(
|
||||
f"invalid op code {cmd_str} for gyro command"
|
||||
)
|
||||
|
||||
|
||||
def handle_gyros_hk_data(
|
||||
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, 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, pw=pw, set_id=set_id, hk_data=hk_data)
|
||||
|
||||
|
||||
def handle_adis_gyro_hk(
|
||||
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
|
||||
):
|
||||
if set_id == AdisGyroSetId.CORE_HK:
|
||||
fmt_str = "!ddddddf"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(
|
||||
ang_veloc_x,
|
||||
ang_veloc_y,
|
||||
ang_veloc_z,
|
||||
accel_x,
|
||||
accel_y,
|
||||
accel_z,
|
||||
temp,
|
||||
) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len])
|
||||
pw.dlog(f"Received ADIS1650X Gyro HK data from object {object_id}")
|
||||
pw.dlog(
|
||||
f"Angular Velocities (degrees per second): X {ang_veloc_x} | "
|
||||
f"Y {ang_veloc_y} | Z {ang_veloc_z}"
|
||||
)
|
||||
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:
|
||||
fmt_str = "!HBHHH"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
print(len(hk_data))
|
||||
(
|
||||
diag_stat_reg,
|
||||
filter_setting,
|
||||
range_mdl,
|
||||
msc_ctrl_reg,
|
||||
dec_rate_reg,
|
||||
) = struct.unpack(fmt_str, hk_data[0 : 0 + inc_len])
|
||||
pw.dlog(f"Diagnostic Status Register {diag_stat_reg:#018b}")
|
||||
pw.dlog(f"Range MDL {range_mdl}")
|
||||
pw.dlog(f"Filter Settings {filter_setting:#010b}")
|
||||
pw.dlog(f"Miscellaneous Control Register {msc_ctrl_reg:#018b}")
|
||||
pw.dlog(f"Decimation Rate {dec_rate_reg:#06x}")
|
||||
|
||||
|
||||
def handle_l3g_gyro_hk(
|
||||
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
|
||||
):
|
||||
if set_id == L3gGyroSetId.CORE_HK:
|
||||
fmt_str = "!ffff"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(angVelocX, angVelocY, angVelocZ, temp) = struct.unpack(
|
||||
fmt_str, hk_data[0 : 0 + inc_len]
|
||||
)
|
||||
pw.dlog(f"Received L3GD20H Gyro HK data from object {object_id}")
|
||||
pw.dlog(
|
||||
f"Angular Velocities (degrees per second): X {angVelocX} | "
|
||||
f"Y {angVelocY} | Z {angVelocZ}"
|
||||
)
|
||||
pw.dlog(f"Temperature {temp} °C")
|
||||
|
||||
|
||||
def create_gyros_node() -> CmdTreeNode:
|
||||
node = CmdTreeNode("gyros", "Gyroscope devices")
|
||||
node.add_child(CmdTreeNode(OpCode.CORE_HK, "Request Core HK"))
|
||||
node.add_child(CmdTreeNode(OpCode.CFG_HK, "Request CFG HK"))
|
||||
node.add_child(CmdTreeNode(OpCode.NML, "Normal Mode"))
|
||||
node.add_child(CmdTreeNode(OpCode.OFF, "Off Mode"))
|
||||
node.add_child(CmdTreeNode(OpCode.SET_FAULTY, "Set Faulty"))
|
||||
return node
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_gyr_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(keys=OpCode.CORE_HK, info="Request Core HK")
|
||||
oce.add(keys=OpCode.CFG_HK, info="Request CFG HK")
|
||||
oce.add(keys=OpCode.NML, info="Normal Mode")
|
||||
oce.add(keys=OpCode.OFF, info="Off Mode")
|
||||
oce.add(keys=OpCode.SET_FAULTY, info="Set Faulty")
|
||||
defs.add_service(CustomServiceList.GYRO, info="Gyro", op_code_entry=oce)
|
@ -5,7 +5,12 @@
|
||||
@author J. Meier
|
||||
@date 25.03.2021
|
||||
"""
|
||||
import enum
|
||||
import logging
|
||||
import struct
|
||||
from typing import List
|
||||
|
||||
from tmtccmd.config import CmdTreeNode
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
@ -15,37 +20,66 @@ from tmtccmd.config.tmtc import (
|
||||
OpCodeEntry,
|
||||
TmtcDefinitionWrapper,
|
||||
)
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import (
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||
make_sid,
|
||||
generate_one_diag_command,
|
||||
generate_one_hk_command,
|
||||
create_request_one_diag_command,
|
||||
create_enable_periodic_hk_command_with_interval_with_diag,
|
||||
create_disable_periodic_hk_command_with_diag,
|
||||
)
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes
|
||||
from tmtccmd.pus.s200_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 get_validity_buffer_str
|
||||
|
||||
|
||||
class OpCodes:
|
||||
ON = ["on"]
|
||||
NORMAL = ["normal"]
|
||||
OFF = ["off"]
|
||||
SET_DIPOLE = ["set_dipole"]
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ImtqSetIds:
|
||||
ENG_HK_SET = 1
|
||||
CAL_MTM_SET = 2
|
||||
RAW_MTM_SET = 3
|
||||
POSITIVE_X_TEST = 4
|
||||
NEGATIVE_X_TEST = 5
|
||||
POSITIVE_Y_TEST = 6
|
||||
NEGATIVE_Y_TEST = 7
|
||||
POSITIVE_Z_TEST = 8
|
||||
NEGATIVE_Z_TEST = 9
|
||||
class OpCode:
|
||||
ON = "on"
|
||||
NORMAL = "normal"
|
||||
OFF = "off"
|
||||
SET_DIPOLE = "set_dipole"
|
||||
REQUEST_ENG_HK_NO_TORQUE = "hk_os_eng_hk_no_torque"
|
||||
REQUEST_ENG_HK_WITH_TORQUE = "hk_os_eng_hk_with_torque"
|
||||
REQUEST_MGM_RAW_NO_TORQUE = "hk_os_mgm_raw_no_torque"
|
||||
ENABLE_MGM_RAW_NO_TORQUE = "enb_mgm_raw_no_torque"
|
||||
DISABLE_MGM_RAW_NO_TORQUE = "dis_mgm_raw_no_torque"
|
||||
REQUEST_MGM_RAW_WITH_TORQUE = "hk_os_mgm_raw_with_torque"
|
||||
ENABLE_MGM_RAW_WITH_TORQUE = "enb_mgm_raw_with_torque"
|
||||
DISABLE_MGM_RAW_WITH_TORQUE = "dis_mgm_raw_with_torque"
|
||||
ENABLE_ENG_HK_NO_TORQUE = "enb_eng_hk_no_torque"
|
||||
DISABLE_ENG_HK_NO_TORQUE = "dis_eng_hk_no_torque"
|
||||
ENABLE_ENG_HK_WITH_TORQUE = "enb_eng_hk_with_torque"
|
||||
DISABLE_ENG_HK_WITH_TORQUE = "dis_eng_hk_with_torque"
|
||||
POS_X_SELF_TEST = "self_test_pos_x"
|
||||
NEG_X_SELF_TEST = "self_test_neg_x"
|
||||
POS_Y_SELF_TEST = "self_test_pos_y"
|
||||
NEG_Y_SELF_TEST = "self_test_neg_y"
|
||||
POS_Z_SELF_TEST = "self_test_pos_z"
|
||||
NEG_Z_SELF_TEST = "self_test_neg_z"
|
||||
|
||||
|
||||
class ImtqActionIds:
|
||||
class ImtqSetId(enum.IntEnum):
|
||||
ENG_HK_NO_TORQUE = 1
|
||||
RAW_MTM_NO_TORQUE = 2
|
||||
ENG_HK_SET_WITH_TORQUE = 3
|
||||
RAW_MTM_WITH_TORQUE = 4
|
||||
STATUS_SET = 5
|
||||
DIPOLES = 6
|
||||
|
||||
CAL_MTM_SET = 9
|
||||
POSITIVE_X_TEST = 10
|
||||
NEGATIVE_X_TEST = 11
|
||||
POSITIVE_Y_TEST = 12
|
||||
NEGATIVE_Y_TEST = 13
|
||||
POSITIVE_Z_TEST = 14
|
||||
NEGATIVE_Z_TEST = 15
|
||||
|
||||
|
||||
class ImtqActionId:
|
||||
start_actuation_dipole = bytearray([0x0, 0x0, 0x0, 0x02])
|
||||
get_commanded_dipole = bytearray([0x0, 0x0, 0x0, 0x03])
|
||||
perform_positive_x_test = bytearray([0x0, 0x0, 0x0, 0x07])
|
||||
@ -59,129 +93,217 @@ class ImtqActionIds:
|
||||
read_self_test_results = bytearray([0x0, 0x0, 0x0, 0x0D])
|
||||
|
||||
|
||||
CTN = CmdTreeNode
|
||||
|
||||
|
||||
def create_mgt_node() -> CmdTreeNode:
|
||||
node = CmdTreeNode(
|
||||
"mgt", "iMTQ MGT device node", hide_children_which_are_leaves=True
|
||||
)
|
||||
node.add_child(CmdTreeNode(OpCode.OFF, "Mode OFF"))
|
||||
node.add_child(CmdTreeNode(OpCode.ON, "Mode ON"))
|
||||
node.add_child(CmdTreeNode(OpCode.NORMAL, "Mode Normal"))
|
||||
node.add_child(CmdTreeNode(OpCode.OFF, "Mode OFF"))
|
||||
node.add_child(
|
||||
CmdTreeNode(OpCode.REQUEST_ENG_HK_NO_TORQUE, "Request Engineering HK One Shot")
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
OpCode.REQUEST_ENG_HK_WITH_TORQUE,
|
||||
"Request Engineering HK One Shot during Torque",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(OpCode.ENABLE_ENG_HK_NO_TORQUE, "Enable ENG HK not torque")
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(OpCode.ENABLE_ENG_HK_WITH_TORQUE, "Enable ENG HK with torque")
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(OpCode.DISABLE_ENG_HK_NO_TORQUE, "Disable ENG HK not torque")
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(OpCode.DISABLE_ENG_HK_WITH_TORQUE, "Disable ENG HK with torque")
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
OpCode.REQUEST_MGM_RAW_NO_TORQUE,
|
||||
"Request MGM Raw Without Torque HK One Shot",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(OpCode.ENABLE_MGM_RAW_NO_TORQUE, "Enable MGM Raw Without Torque HK")
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
OpCode.DISABLE_MGM_RAW_NO_TORQUE, "Disable MGM Raw Without Torque HK"
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(
|
||||
OpCode.REQUEST_MGM_RAW_WITH_TORQUE,
|
||||
"Request MGM Raw With Torque HK One Shot",
|
||||
)
|
||||
)
|
||||
node.add_child(
|
||||
CmdTreeNode(OpCode.ENABLE_MGM_RAW_WITH_TORQUE, "Enable MGM Raw With Torque HK")
|
||||
)
|
||||
node.add_child(
|
||||
CTN(OpCode.DISABLE_MGM_RAW_WITH_TORQUE, "Disable MGM Raw With Torque HK")
|
||||
)
|
||||
node.add_child(CTN(OpCode.POS_X_SELF_TEST, "IMTQ perform pos X self test"))
|
||||
node.add_child(CTN(OpCode.NEG_X_SELF_TEST, "IMTQ perform neg X self test"))
|
||||
node.add_child(CTN(OpCode.POS_Y_SELF_TEST, "IMTQ perform pos Y self test"))
|
||||
node.add_child(CTN(OpCode.NEG_Y_SELF_TEST, "IMTQ perform neg Y self test"))
|
||||
node.add_child(CTN(OpCode.POS_Z_SELF_TEST, "IMTQ perform pos Z self test"))
|
||||
node.add_child(CTN(OpCode.NEG_Z_SELF_TEST, "IMTQ perform neg Z self test"))
|
||||
node.add_child(CTN(OpCode.SET_DIPOLE, "IMTQ command dipole"))
|
||||
return node
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_imtq_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(OpCodes.OFF, "Mode Off")
|
||||
oce.add(OpCodes.ON, "Mode On")
|
||||
oce.add(OpCodes.NORMAL, "Mode Normal")
|
||||
oce.add("3", "IMTQ perform pos X self test")
|
||||
oce.add("4", "IMTQ perform neg X self test")
|
||||
oce.add("5", "IMTQ perform pos Y self test")
|
||||
oce.add("6", "IMTQ perform neg Y self test")
|
||||
oce.add("7", "IMTQ perform pos Z self test")
|
||||
oce.add("8", "IMTQ perform neg Z self test")
|
||||
oce.add(OpCodes.SET_DIPOLE, "IMTQ command dipole")
|
||||
oce.add(OpCode.OFF, "Mode Off")
|
||||
oce.add(OpCode.ON, "Mode On")
|
||||
oce.add(OpCode.NORMAL, "Mode Normal")
|
||||
oce.add(OpCode.REQUEST_ENG_HK_NO_TORQUE, "Request Engineering HK One Shot")
|
||||
oce.add(
|
||||
OpCode.REQUEST_ENG_HK_WITH_TORQUE,
|
||||
"Request Engineering HK One Shot during Torque",
|
||||
)
|
||||
oce.add(OpCode.ENABLE_ENG_HK_NO_TORQUE, "Enable ENG HK not torque")
|
||||
oce.add(OpCode.ENABLE_ENG_HK_WITH_TORQUE, "Enable ENG HK with torque")
|
||||
oce.add(OpCode.DISABLE_ENG_HK_NO_TORQUE, "Disable ENG HK not torque")
|
||||
oce.add(OpCode.DISABLE_ENG_HK_WITH_TORQUE, "Disable ENG HK with torque")
|
||||
oce.add(
|
||||
OpCode.REQUEST_MGM_RAW_NO_TORQUE, "Request MGM Raw Without Torque HK One Shot"
|
||||
)
|
||||
oce.add(OpCode.ENABLE_MGM_RAW_NO_TORQUE, "Enable MGM Raw Without Torque HK")
|
||||
oce.add(OpCode.DISABLE_MGM_RAW_NO_TORQUE, "Disable MGM Raw Without Torque HK")
|
||||
oce.add(
|
||||
OpCode.REQUEST_MGM_RAW_WITH_TORQUE, "Request MGM Raw With Torque HK One Shot"
|
||||
)
|
||||
oce.add(OpCode.ENABLE_MGM_RAW_WITH_TORQUE, "Enable MGM Raw With Torque HK")
|
||||
oce.add(OpCode.DISABLE_MGM_RAW_WITH_TORQUE, "Disable MGM Raw With Torque HK")
|
||||
oce.add(OpCode.POS_X_SELF_TEST, "IMTQ perform pos X self test")
|
||||
oce.add(OpCode.NEG_X_SELF_TEST, "IMTQ perform neg X self test")
|
||||
oce.add(OpCode.POS_Y_SELF_TEST, "IMTQ perform pos Y self test")
|
||||
oce.add(OpCode.NEG_Y_SELF_TEST, "IMTQ perform neg Y self test")
|
||||
oce.add(OpCode.POS_Z_SELF_TEST, "IMTQ perform pos Z self test")
|
||||
oce.add(OpCode.NEG_Z_SELF_TEST, "IMTQ perform neg Z self test")
|
||||
oce.add(OpCode.SET_DIPOLE, "IMTQ command dipole")
|
||||
oce.add("10", "IMTQ get commanded dipole")
|
||||
oce.add("11", "IMTQ get engineering hk set")
|
||||
oce.add("12", "IMTQ get calibrated MTM measurement one shot")
|
||||
oce.add("13", "IMTQ get raw MTM measurement one shot")
|
||||
defs.add_service(CustomServiceList.IMTQ.value, "IMQT Device", oce)
|
||||
|
||||
|
||||
def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_code: str):
|
||||
def create_imtq_command( # noqa C901
|
||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str
|
||||
):
|
||||
q.add_log_cmd(
|
||||
f"Testing ISIS IMTQ handler with object id: {object_id.as_hex_string}"
|
||||
)
|
||||
|
||||
if op_code in OpCodes.OFF:
|
||||
if cmd_str == OpCode.OFF:
|
||||
q.add_log_cmd("IMTQ: Set mode off")
|
||||
command = pack_mode_data(object_id.as_bytes, Modes.OFF, 0)
|
||||
command = pack_mode_data(object_id.as_bytes, Mode.OFF, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||
if op_code in OpCodes.ON:
|
||||
if cmd_str == OpCode.ON:
|
||||
q.add_log_cmd("IMTQ: Set mode on")
|
||||
command = pack_mode_data(object_id.as_bytes, Modes.ON, 0)
|
||||
command = pack_mode_data(object_id.as_bytes, Mode.ON, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||
if op_code in OpCodes.NORMAL:
|
||||
if cmd_str == OpCode.NORMAL:
|
||||
q.add_log_cmd("IMTQ: Mode Normal")
|
||||
command = pack_mode_data(object_id.as_bytes, Modes.NORMAL, 0)
|
||||
command = pack_mode_data(object_id.as_bytes, Mode.NORMAL, 0)
|
||||
q.add_pus_tc(PusTelecommand(service=200, subservice=1, app_data=command))
|
||||
if op_code == "3":
|
||||
if cmd_str == OpCode.POS_X_SELF_TEST:
|
||||
q.add_log_cmd("IMTQ: Perform positive x self test")
|
||||
command = object_id.as_bytes + ImtqActionIds.perform_positive_x_test
|
||||
command = object_id.as_bytes + ImtqActionId.perform_positive_x_test
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
q.add_log_cmd("IMTQ: Initiate reading of positive x self test results")
|
||||
command = object_id.as_bytes + ImtqActionIds.read_self_test_results
|
||||
command = object_id.as_bytes + ImtqActionId.read_self_test_results
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
q.add_log_cmd("IMTQ: Request dataset with positive x self test results")
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetIds.POSITIVE_X_TEST)
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_X_TEST)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
|
||||
if op_code == "4":
|
||||
if cmd_str == OpCode.NEG_X_SELF_TEST:
|
||||
q.add_log_cmd("IMTQ: Perform negative x self test")
|
||||
command = object_id.as_bytes + ImtqActionIds.perform_negative_x_test
|
||||
command = object_id.as_bytes + ImtqActionId.perform_negative_x_test
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
q.add_log_cmd("IMTQ: Initiate reading of negative x self test results")
|
||||
command = object_id.as_bytes + ImtqActionIds.read_self_test_results
|
||||
command = object_id.as_bytes + ImtqActionId.read_self_test_results
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
q.add_log_cmd("IMTQ: Request dataset with negative x self test results")
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetIds.NEGATIVE_X_TEST)
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_X_TEST)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
|
||||
if op_code == "5":
|
||||
if cmd_str == OpCode.POS_Y_SELF_TEST:
|
||||
q.add_log_cmd("IMTQ: Perform positive y self test")
|
||||
command = object_id.as_bytes + ImtqActionIds.perform_positive_y_test
|
||||
command = object_id.as_bytes + ImtqActionId.perform_positive_y_test
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
q.add_log_cmd("IMTQ: Initiate reading of positive y self test results")
|
||||
command = object_id.as_bytes + ImtqActionIds.read_self_test_results
|
||||
command = object_id.as_bytes + ImtqActionId.read_self_test_results
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
q.add_log_cmd("IMTQ: Request dataset with positive y self test results")
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetIds.POSITIVE_Y_TEST)
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_Y_TEST)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
|
||||
if op_code == "6":
|
||||
if cmd_str == OpCode.NEG_Y_SELF_TEST:
|
||||
q.add_log_cmd("IMTQ: Perform negative y self test")
|
||||
command = object_id.as_bytes + ImtqActionIds.perform_negative_y_test
|
||||
command = object_id.as_bytes + ImtqActionId.perform_negative_y_test
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
q.add_log_cmd("IMTQ: Initiate reading of negative y self test results")
|
||||
command = object_id.as_bytes + ImtqActionIds.read_self_test_results
|
||||
command = object_id.as_bytes + ImtqActionId.read_self_test_results
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
q.add_log_cmd("IMTQ: Request dataset with negative y self test results")
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetIds.NEGATIVE_Y_TEST)
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_Y_TEST)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
|
||||
if op_code == "7":
|
||||
if cmd_str == OpCode.POS_Z_SELF_TEST:
|
||||
q.add_log_cmd("IMTQ: Perform positive z self test")
|
||||
command = object_id.as_bytes + ImtqActionIds.perform_positive_z_test
|
||||
command = object_id.as_bytes + ImtqActionId.perform_positive_z_test
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
q.add_log_cmd("IMTQ: Initiate reading of positive z self test results")
|
||||
command = object_id.as_bytes + ImtqActionIds.read_self_test_results
|
||||
command = object_id.as_bytes + ImtqActionId.read_self_test_results
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
q.add_log_cmd("IMTQ: Request dataset with positive z self test results")
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetIds.POSITIVE_Y_TEST)
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetId.POSITIVE_Y_TEST)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
|
||||
if op_code == "8":
|
||||
if cmd_str == OpCode.NEG_Z_SELF_TEST:
|
||||
q.add_log_cmd("IMTQ: Perform negative z self test")
|
||||
command = object_id.as_bytes + ImtqActionIds.perform_negative_z_test
|
||||
command = object_id.as_bytes + ImtqActionId.perform_negative_z_test
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
q.add_log_cmd("IMTQ: Initiate reading of negative z self test results")
|
||||
command = object_id.as_bytes + ImtqActionIds.read_self_test_results
|
||||
command = object_id.as_bytes + ImtqActionId.read_self_test_results
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
q.add_log_cmd("IMTQ: Request dataset with negative z self test results")
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetIds.NEGATIVE_Z_TEST)
|
||||
sid = make_sid(object_id.as_bytes, ImtqSetId.NEGATIVE_Z_TEST)
|
||||
q.add_pus_tc(generate_one_hk_command(sid))
|
||||
|
||||
if op_code in OpCodes.SET_DIPOLE:
|
||||
if cmd_str in OpCode.SET_DIPOLE:
|
||||
x_dipole = int(input("Specify X dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
||||
y_dipole = int(input("Specify Y dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
||||
z_dipole = int(input("Specify Z dipole [range [0, 2000] * 10^-4 * Am^2]: "))
|
||||
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(
|
||||
@ -189,38 +311,126 @@ def pack_imtq_test_into(object_id: ObjectIdU32, q: DefaultPusQueueHelper, op_cod
|
||||
)
|
||||
)
|
||||
|
||||
if op_code == "10":
|
||||
if cmd_str == "10": # doesnt seem to work anymore
|
||||
q.add_log_cmd("IMTQ: Get commanded dipole")
|
||||
command = object_id.as_bytes + ImtqActionIds.get_commanded_dipole
|
||||
command = object_id.as_bytes + ImtqActionId.get_commanded_dipole
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
if op_code == "11":
|
||||
q.add_log_cmd("IMTQ: Get engineering hk set")
|
||||
if cmd_str == 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_with_diag(
|
||||
diag=True,
|
||||
sid=make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE),
|
||||
interval_seconds=interval,
|
||||
)
|
||||
for cmd in cmds:
|
||||
q.add_pus_tc(cmd)
|
||||
if cmd_str == 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_with_diag(
|
||||
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_NO_TORQUE)
|
||||
)
|
||||
)
|
||||
if cmd_str == OpCode.REQUEST_ENG_HK_WITH_TORQUE:
|
||||
q.add_log_cmd("IMTQ: Get engineering hk set with torque")
|
||||
q.add_pus_tc(
|
||||
create_request_one_diag_command(
|
||||
sid=make_sid(
|
||||
object_id=object_id.as_bytes,
|
||||
set_id=ImtqSetId.ENG_HK_SET_WITH_TORQUE,
|
||||
)
|
||||
)
|
||||
)
|
||||
if cmd_str == 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_with_diag(
|
||||
diag=True,
|
||||
sid=make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE),
|
||||
interval_seconds=interval,
|
||||
)
|
||||
for cmd in cmds:
|
||||
q.add_pus_tc(cmd)
|
||||
if cmd_str == 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_with_diag(
|
||||
True, make_sid(object_id.as_bytes, ImtqSetId.ENG_HK_SET_WITH_TORQUE)
|
||||
)
|
||||
)
|
||||
if cmd_str == OpCode.REQUEST_ENG_HK_NO_TORQUE:
|
||||
q.add_log_cmd("IMTQ: Get engineering hk set (no torque)")
|
||||
q.add_pus_tc(
|
||||
generate_one_diag_command(
|
||||
sid=make_sid(object_id=object_id.as_bytes, set_id=ImtqSetIds.ENG_HK_SET)
|
||||
sid=make_sid(
|
||||
object_id=object_id.as_bytes, set_id=ImtqSetId.ENG_HK_NO_TORQUE
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
if op_code == "12":
|
||||
if cmd_str == "12":
|
||||
q.add_log_cmd("IMTQ: Get calibrated MTM hk set")
|
||||
q.add_pus_tc(
|
||||
generate_one_diag_command(
|
||||
create_request_one_diag_command(
|
||||
sid=make_sid(object_id=object_id.as_bytes, set_id=ImtqSetId.CAL_MTM_SET)
|
||||
)
|
||||
)
|
||||
|
||||
if cmd_str == OpCode.REQUEST_MGM_RAW_NO_TORQUE:
|
||||
q.add_log_cmd("IMTQ: Get raw MTM hk set")
|
||||
q.add_pus_tc(
|
||||
create_request_one_diag_command(
|
||||
sid=make_sid(
|
||||
object_id=object_id.as_bytes, set_id=ImtqSetIds.CAL_MTM_SET
|
||||
object_id=object_id.as_bytes, set_id=ImtqSetId.RAW_MTM_NO_TORQUE
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
if op_code == "13":
|
||||
if cmd_str == 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_with_diag(
|
||||
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE)
|
||||
)
|
||||
)
|
||||
if cmd_str == 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_with_diag(
|
||||
diag=True,
|
||||
sid=make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_NO_TORQUE),
|
||||
interval_seconds=interval,
|
||||
)
|
||||
for cmd in cmds:
|
||||
q.add_pus_tc(cmd)
|
||||
if cmd_str == OpCode.REQUEST_MGM_RAW_WITH_TORQUE:
|
||||
q.add_log_cmd("IMTQ: Get raw MTM hk set")
|
||||
q.add_pus_tc(
|
||||
generate_one_diag_command(
|
||||
create_request_one_diag_command(
|
||||
sid=make_sid(
|
||||
object_id=object_id.as_bytes, set_id=ImtqSetIds.RAW_MTM_SET
|
||||
object_id=object_id.as_bytes, set_id=ImtqSetId.RAW_MTM_WITH_TORQUE
|
||||
)
|
||||
)
|
||||
)
|
||||
if cmd_str == 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_with_diag(
|
||||
diag=True,
|
||||
sid=make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_WITH_TORQUE),
|
||||
interval_seconds=interval,
|
||||
)
|
||||
for cmd in cmds:
|
||||
q.add_pus_tc(cmd)
|
||||
if cmd_str == 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_with_diag(
|
||||
True, make_sid(object_id.as_bytes, ImtqSetId.RAW_MTM_WITH_TORQUE)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def pack_dipole_command(
|
||||
@ -235,7 +445,7 @@ def pack_dipole_command(
|
||||
When set to 0, the dipole will be generated until a new dipole actuation
|
||||
command is sent.
|
||||
"""
|
||||
action_id = ImtqActionIds.start_actuation_dipole
|
||||
action_id = ImtqActionId.start_actuation_dipole
|
||||
command = object_id + action_id
|
||||
x_dipole = int(round(x_dipole))
|
||||
y_dipole = int(round(y_dipole))
|
||||
@ -249,7 +459,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)
|
||||
@ -261,25 +472,81 @@ 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"
|
||||
)
|
||||
|
||||
|
||||
def handle_eng_set(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
pw = PrintWrapper(printer)
|
||||
header_list = [
|
||||
"Digital Voltage [mV]",
|
||||
"Analog Voltage [mV]",
|
||||
"Digital Current [mA]",
|
||||
"Analog Current [mA]",
|
||||
"Coil Current X [mA]",
|
||||
"Coil Current Y [mA]",
|
||||
"Coil Current Z [mA]",
|
||||
"Coil X Temperature [°C]",
|
||||
"Coil Y Temperature [°C]",
|
||||
"Coil Z Temperature [°C]",
|
||||
"MCU Temperature [°C]",
|
||||
]
|
||||
STATUS_HEADERS = [
|
||||
"Status Byte Mode",
|
||||
"Status Byte Error",
|
||||
"Status Byte Config",
|
||||
"Status Byte Uptime [s]",
|
||||
]
|
||||
|
||||
|
||||
ENG_HK_HEADERS = [
|
||||
"Digital Voltage [mV]",
|
||||
"Analog Voltage [mV]",
|
||||
"Digital Current [mA]",
|
||||
"Analog Current [mA]",
|
||||
"Coil Current X [mA]",
|
||||
"Coil Current Y [mA]",
|
||||
"Coil Current Z [mA]",
|
||||
"Coil X Temperature [°C]",
|
||||
"Coil Y Temperature [°C]",
|
||||
"Coil Z Temperature [°C]",
|
||||
"MCU Temperature [°C]",
|
||||
]
|
||||
|
||||
|
||||
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(pw, hk_data)
|
||||
elif set_id == ImtqSetId.ENG_HK_NO_TORQUE:
|
||||
return handle_eng_set(pw, hk_data, False)
|
||||
elif set_id == ImtqSetId.ENG_HK_SET_WITH_TORQUE:
|
||||
return handle_eng_set(pw, hk_data, True)
|
||||
elif set_id == ImtqSetId.CAL_MTM_SET:
|
||||
return handle_calibrated_mtm_measurement(pw, hk_data)
|
||||
elif set_id == ImtqSetId.RAW_MTM_NO_TORQUE:
|
||||
return handle_raw_mtm_measurement(pw, hk_data, False)
|
||||
elif set_id == ImtqSetId.RAW_MTM_WITH_TORQUE:
|
||||
return handle_raw_mtm_measurement(pw, hk_data, True)
|
||||
elif set_id == ImtqSetId.DIPOLES:
|
||||
return handle_dipole_set(pw, hk_data)
|
||||
elif set_id == ImtqSetId.STATUS_SET:
|
||||
return handle_status_set(pw, hk_data)
|
||||
else:
|
||||
pw.wlog(
|
||||
_LOGGER,
|
||||
f"IMTQ handler HK reply with unknown or unimplemented set id {set_id}",
|
||||
)
|
||||
|
||||
|
||||
def unpack_status_set(hk_data: bytes) -> List:
|
||||
status_mode = hk_data[0]
|
||||
status_error = hk_data[1]
|
||||
status_conf = hk_data[2]
|
||||
status_uptime = struct.unpack("!I", hk_data[3:7])[0]
|
||||
return [status_mode, status_error, status_conf, status_uptime]
|
||||
|
||||
|
||||
def handle_dipole_set(pw: PrintWrapper, hk_data: bytes):
|
||||
pw.dlog("Received iMTQ dipole set")
|
||||
fmt_str = "!hhhH"
|
||||
fmt_len = struct.calcsize(fmt_str)
|
||||
(dipole_x, dipole_y, dipole_z, current_torque_duration) = struct.unpack(
|
||||
fmt_str, hk_data[0:8]
|
||||
)
|
||||
pw.dlog(f"Dipole X: {dipole_x}")
|
||||
pw.dlog(f"Dipole Y: {dipole_y}")
|
||||
pw.dlog(f"Dipole Z: {dipole_z}")
|
||||
pw.dlog(f"Current torque duration: {current_torque_duration}")
|
||||
pw.dlog(get_validity_buffer_str(hk_data[fmt_len:], 2))
|
||||
|
||||
|
||||
def unpack_eng_hk(hk_data: bytes) -> List:
|
||||
digital_voltage = struct.unpack("!H", hk_data[0:2])[0]
|
||||
analog_voltage = struct.unpack("!H", hk_data[2:4])[0]
|
||||
digital_current = struct.unpack("!f", hk_data[4:8])[0]
|
||||
@ -291,8 +558,6 @@ def handle_eng_set(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
coil_y_temperature = struct.unpack("!h", hk_data[26:28])[0]
|
||||
coil_z_temperature = struct.unpack("!h", hk_data[28:30])[0]
|
||||
mcu_temperature = struct.unpack("!h", hk_data[30:32])[0]
|
||||
|
||||
validity_buffer = hk_data[32:]
|
||||
content_list = [
|
||||
digital_voltage,
|
||||
analog_voltage,
|
||||
@ -306,14 +571,35 @@ def handle_eng_set(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
coil_z_temperature,
|
||||
mcu_temperature,
|
||||
]
|
||||
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)
|
||||
return content_list
|
||||
|
||||
|
||||
def handle_calibrated_mtm_measurement(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
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:]
|
||||
|
||||
num_of_vars = len(ENG_HK_HEADERS)
|
||||
for k, v in zip(ENG_HK_HEADERS, content_list):
|
||||
pw.dlog(f"{k.ljust(30)}: {v}")
|
||||
pw.dlog(
|
||||
get_validity_buffer_str(validity_buffer=validity_buffer, num_vars=num_of_vars)
|
||||
)
|
||||
|
||||
|
||||
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}")
|
||||
pw.dlog(
|
||||
get_validity_buffer_str(validity_buffer=validity_buffer, num_vars=num_of_vars)
|
||||
)
|
||||
|
||||
|
||||
def handle_calibrated_mtm_measurement(pw: PrintWrapper, hk_data: bytes):
|
||||
header_list = [
|
||||
"Calibrated MTM X [nT]",
|
||||
"Calibrated MTM Y [nT]",
|
||||
@ -329,11 +615,13 @@ 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(
|
||||
get_validity_buffer_str(validity_buffer=validity_buffer, num_vars=num_of_vars)
|
||||
)
|
||||
|
||||
|
||||
def handle_raw_mtm_measurement(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
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]",
|
||||
"Raw MTM Y [nT]",
|
||||
@ -349,11 +637,12 @@ def handle_raw_mtm_measurement(printer: FsfwTmTcPrinter, hk_data: bytes):
|
||||
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(
|
||||
get_validity_buffer_str(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]",
|
||||
@ -457,7 +746,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,
|
||||
@ -485,4 +774,6 @@ 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(
|
||||
get_validity_buffer_str(validity_buffer=validity_buffer, num_vars=num_of_vars)
|
||||
)
|
||||
|
122
eive_tmtc/tmtc/acs/mgms.py
Normal file
122
eive_tmtc/tmtc/acs/mgms.py
Normal file
@ -0,0 +1,122 @@
|
||||
import enum
|
||||
import struct
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from tmtccmd.config import CmdTreeNode, OpCodeEntry
|
||||
|
||||
import eive_tmtc.config.object_ids as obj_ids
|
||||
from eive_tmtc.config.object_ids import (
|
||||
MGM_0_LIS3_HANDLER_ID,
|
||||
MGM_1_RM3100_HANDLER_ID,
|
||||
MGM_2_LIS3_HANDLER_ID,
|
||||
MGM_3_RM3100_HANDLER_ID,
|
||||
)
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from tmtccmd.config.tmtc import tmtc_definitions_provider, TmtcDefinitionWrapper
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.s200_fsfw_mode import create_mode_command, Mode
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
|
||||
class OpCode:
|
||||
NORMAL = "normal"
|
||||
OFF = "off"
|
||||
|
||||
|
||||
class MgmLis3SetId(enum.IntEnum):
|
||||
CORE_HK = 0
|
||||
|
||||
|
||||
class MgmRm3100SetId(enum.IntEnum):
|
||||
CORE_HK = 0
|
||||
|
||||
|
||||
class MgmSel(enum.IntEnum):
|
||||
MGM_0_LIS3 = 0
|
||||
MGM_1_RM3100 = 1
|
||||
MGM_2_LIS3 = 2
|
||||
MGM_3_RM3100 = 3
|
||||
|
||||
|
||||
MGM_SEL_DICT = {
|
||||
MgmSel.MGM_0_LIS3: ("MGM_0_LIS3", MGM_0_LIS3_HANDLER_ID),
|
||||
MgmSel.MGM_1_RM3100: ("MGM_1_RM3100", MGM_1_RM3100_HANDLER_ID),
|
||||
MgmSel.MGM_2_LIS3: ("MGM_2_LIS3", MGM_2_LIS3_HANDLER_ID),
|
||||
MgmSel.MGM_3_RM3100: ("MGM_3_RM3100", MGM_3_RM3100_HANDLER_ID),
|
||||
}
|
||||
|
||||
|
||||
def handle_mgm_cmd(q: DefaultPusQueueHelper, cmd_str: str):
|
||||
print("Please select the MGM Device")
|
||||
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)]
|
||||
mgm_obj_id = mgm_info[1]
|
||||
if cmd_str == OpCode.NORMAL:
|
||||
q.add_log_cmd(f"Gyro {mgm_info[0]} NORMAL mode")
|
||||
q.add_pus_tc(create_mode_command(mgm_obj_id, Mode.NORMAL, 0))
|
||||
if cmd_str == OpCode.OFF:
|
||||
q.add_log_cmd(f"Gyro {mgm_info[0]} OFF mode")
|
||||
q.add_pus_tc(create_mode_command(mgm_obj_id, Mode.OFF, 0))
|
||||
|
||||
|
||||
def handle_mgm_hk_data(
|
||||
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, 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, pw, set_id, hk_data)
|
||||
pass
|
||||
|
||||
|
||||
def handle_mgm_lis3_hk_data(
|
||||
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
|
||||
):
|
||||
if set_id == MgmLis3SetId.CORE_HK:
|
||||
fmt_str = "!ffff"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
(field_x, field_y, field_z, temp) = struct.unpack(
|
||||
fmt_str, hk_data[0 : 0 + inc_len]
|
||||
)
|
||||
pw.dlog(f"Received MGM LIS3 from object {object_id}")
|
||||
pw.dlog(
|
||||
f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}"
|
||||
)
|
||||
pw.dlog(f"Temperature {temp} C")
|
||||
|
||||
|
||||
def handle_mgm_rm3100_hk_data(
|
||||
object_id: ObjectIdU32, pw: PrintWrapper, set_id: int, hk_data: bytes
|
||||
):
|
||||
if set_id == MgmRm3100SetId.CORE_HK:
|
||||
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}")
|
||||
pw.dlog(
|
||||
f"Field strengths in micro Tesla X {field_x} | Y {field_y} | Z {field_z}"
|
||||
)
|
||||
|
||||
|
||||
def create_mgms_node() -> CmdTreeNode:
|
||||
node = CmdTreeNode("mgms", "Magnetometer devices")
|
||||
node.add_child(CmdTreeNode(OpCode.NORMAL, "Normal Mode"))
|
||||
node.add_child(CmdTreeNode(OpCode.OFF, "Off Mode"))
|
||||
return node
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_mgm_cmd_defs(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(keys=OpCode.NORMAL, info="Normal Mode")
|
||||
oce.add(keys=OpCode.OFF, info="Off Mode")
|
||||
defs.add_service(CustomServiceList.MGMS, info="MGMs", op_code_entry=oce)
|
@ -4,56 +4,62 @@
|
||||
@author J. Meier
|
||||
@date 20.06.2021
|
||||
"""
|
||||
import enum
|
||||
import struct
|
||||
from typing import List
|
||||
from typing import List, Tuple
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from eive_tmtc.config.object_ids import RW1_ID, RW2_ID, RW3_ID, RW4_ID
|
||||
from tmtccmd.config import TmtcDefinitionWrapper, OpCodeEntry
|
||||
from tmtccmd.config.tmtc import tmtc_definitions_provider
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tc.pus_3_fsfw_hk import (
|
||||
from tmtccmd.config import CmdTreeNode
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.tc.s3_fsfw_hk import (
|
||||
generate_one_hk_command,
|
||||
generate_one_diag_command,
|
||||
make_sid,
|
||||
enable_periodic_hk_command_with_interval,
|
||||
disable_periodic_hk_command,
|
||||
)
|
||||
from tmtccmd.pus.s8_fsfw_action import create_action_cmd
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import pack_mode_data, Modes, Subservices
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from tmtccmd.pus.s200_fsfw_mode import pack_mode_data, Mode, Subservice
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
from tmtccmd.fsfw.tmtc_printer import get_validity_buffer_str
|
||||
|
||||
|
||||
class OpCodesDevs:
|
||||
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"]
|
||||
class OpCodesDev:
|
||||
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 InfoDevs:
|
||||
class InfoDev:
|
||||
SPEED = "Set speed"
|
||||
ON = "Set On"
|
||||
NML = "Set Normal"
|
||||
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"
|
||||
|
||||
|
||||
class OpCodesAss:
|
||||
ON = ["0", "on"]
|
||||
NML = ["1", "nml"]
|
||||
OFF = ["2", "off"]
|
||||
ALL_SPEED_UP = ["3", "speed_up"]
|
||||
ALL_SPEED_OFF = ["4", "speed_off"]
|
||||
ON = "on"
|
||||
NML = "nml"
|
||||
OFF = "off"
|
||||
ALL_SPEED_UP = "speed_up"
|
||||
ALL_SPEED_OFF = "speed_off"
|
||||
|
||||
|
||||
class ActionId:
|
||||
REQUEST_TM = 9
|
||||
|
||||
|
||||
class InfoAss:
|
||||
@ -64,14 +70,14 @@ class InfoAss:
|
||||
ALL_SPEED_OFF = "Speed down to 0"
|
||||
|
||||
|
||||
class RwSetIds:
|
||||
class RwSetId(enum.IntEnum):
|
||||
STATUS_SET_ID = 4
|
||||
TEMPERATURE_SET_ID = 8
|
||||
LAST_RESET = 2
|
||||
TM_SET = 9
|
||||
|
||||
|
||||
class RwCommandIds:
|
||||
class RwCommandId:
|
||||
RESET_MCU = bytearray([0x0, 0x0, 0x0, 0x01])
|
||||
# Reads status information from reaction wheel into dataset with id 4
|
||||
GET_RW_STATUS = bytearray([0x0, 0x0, 0x0, 0x04])
|
||||
@ -91,139 +97,135 @@ class RampTime:
|
||||
MS_1000 = 1000
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_rw_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(info=InfoDevs.SPEED, keys=OpCodesDevs.SPEED)
|
||||
oce.add(info=InfoDevs.ON, keys=OpCodesDevs.ON)
|
||||
oce.add(info=InfoDevs.OFF, keys=OpCodesDevs.OFF)
|
||||
oce.add(info=InfoDevs.NML, keys=OpCodesDevs.NML)
|
||||
oce.add(info=InfoDevs.GET_STATUS, keys=OpCodesDevs.GET_STATUS)
|
||||
oce.add(info=InfoDevs.GET_TM, keys=OpCodesDevs.GET_TM)
|
||||
oce.add(info=InfoDevs.ENABLE_STATUS_HK, keys=OpCodesDevs.ENABLE_STATUS_HK)
|
||||
oce.add(info=InfoDevs.DISABLE_STATUS_HK, keys=OpCodesDevs.DISABLE_STATUS_HK)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.REACTION_WHEEL_1.value,
|
||||
info="Reaction Wheel 1",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.REACTION_WHEEL_2.value,
|
||||
info="Reaction Wheel 2",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.REACTION_WHEEL_3.value,
|
||||
info="Reaction Wheel 3",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.REACTION_WHEEL_4.value,
|
||||
info="Reaction Wheel 4",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
oce = OpCodeEntry()
|
||||
oce.add(info=InfoAss.ON, keys=OpCodesAss.ON)
|
||||
oce.add(info=InfoAss.NML, keys=OpCodesAss.NML)
|
||||
oce.add(info=InfoAss.OFF, keys=OpCodesAss.OFF)
|
||||
oce.add(info=InfoAss.ALL_SPEED_UP, keys=OpCodesAss.ALL_SPEED_UP)
|
||||
oce.add(info=InfoAss.ALL_SPEED_OFF, keys=OpCodesAss.ALL_SPEED_OFF)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.RW_ASSEMBLY.value,
|
||||
info="Reaction Wheel Assembly",
|
||||
op_code_entry=oce,
|
||||
)
|
||||
def create_reaction_wheels_nodes() -> List[CmdTreeNode]:
|
||||
nodes = []
|
||||
for i in range(4):
|
||||
next_node = CmdTreeNode(
|
||||
f"rw_{i}", f"Reaction Wheel {i}", hide_children_which_are_leaves=True
|
||||
)
|
||||
next_node.add_child(CmdTreeNode(InfoDev.SPEED, OpCodesDev.SPEED))
|
||||
next_node.add_child(CmdTreeNode(InfoDev.ON, OpCodesDev.ON))
|
||||
next_node.add_child(CmdTreeNode(InfoDev.OFF, OpCodesDev.OFF))
|
||||
next_node.add_child(CmdTreeNode(InfoDev.NML, OpCodesDev.NML))
|
||||
next_node.add_child(CmdTreeNode(InfoDev.REQ_TM, OpCodesDev.REQ_TM))
|
||||
next_node.add_child(CmdTreeNode(InfoDev.GET_STATUS, OpCodesDev.GET_STATUS))
|
||||
next_node.add_child(CmdTreeNode(InfoDev.GET_TM, OpCodesDev.GET_TM))
|
||||
next_node.add_child(
|
||||
CmdTreeNode(InfoDev.ENABLE_STATUS_HK, OpCodesDev.ENABLE_STATUS_HK)
|
||||
)
|
||||
next_node.add_child(
|
||||
CmdTreeNode(InfoDev.DISABLE_STATUS_HK, OpCodesDev.DISABLE_STATUS_HK)
|
||||
)
|
||||
nodes.append(next_node)
|
||||
return nodes
|
||||
|
||||
|
||||
def pack_single_rw_test_into(
|
||||
object_id: bytes, rw_idx: int, q: DefaultPusQueueHelper, op_code: str
|
||||
def create_reaction_wheel_assembly_node() -> CmdTreeNode:
|
||||
node = CmdTreeNode(
|
||||
"rw_assy", "Reaction Wheels Assembly", hide_children_which_are_leaves=True
|
||||
)
|
||||
node.add_child(CmdTreeNode(OpCodesAss.ON, InfoAss.ON))
|
||||
node.add_child(CmdTreeNode(OpCodesAss.NML, InfoAss.NML))
|
||||
node.add_child(CmdTreeNode(OpCodesAss.OFF, InfoAss.OFF))
|
||||
node.add_child(CmdTreeNode(OpCodesAss.ALL_SPEED_UP, InfoAss.ALL_SPEED_UP))
|
||||
node.add_child(CmdTreeNode(OpCodesAss.ALL_SPEED_OFF, InfoAss.ALL_SPEED_OFF))
|
||||
return node
|
||||
|
||||
|
||||
def create_single_rw_cmd( # noqa C901: Complexity is okay here.
|
||||
object_id: bytes, rw_idx: int, q: DefaultPusQueueHelper, cmd_str: str
|
||||
):
|
||||
if op_code in OpCodesDevs.SPEED:
|
||||
if cmd_str == OpCodesDev.SPEED:
|
||||
speed, ramp_time = prompt_speed_ramp_time()
|
||||
q.add_log_cmd(
|
||||
f"RW {rw_idx}: {InfoDevs.SPEED} with target "
|
||||
f"RW {rw_idx}: {InfoDev.SPEED} with target "
|
||||
f"speed {speed / 10.0} RPM and {ramp_time} ms ramp time"
|
||||
)
|
||||
q.add_pus_tc(pack_set_speed_command(object_id, speed, ramp_time))
|
||||
|
||||
if op_code in OpCodesDevs.ON:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDevs.ON}")
|
||||
mode_data = pack_mode_data(object_id, Modes.ON, 0)
|
||||
if cmd_str == 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 OpCodesDevs.NML:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDevs.NML}")
|
||||
mode_data = pack_mode_data(object_id, Modes.NORMAL, 0)
|
||||
if cmd_str == 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 OpCodesDevs.OFF:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDevs.OFF}")
|
||||
mode_data = pack_mode_data(object_id, Modes.OFF, 0)
|
||||
if cmd_str == 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 OpCodesDevs.GET_TM:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDevs.GET_TM}")
|
||||
if cmd_str == 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=RwSetIds.TM_SET)
|
||||
sid=make_sid(object_id=object_id, set_id=RwSetId.TM_SET)
|
||||
)
|
||||
)
|
||||
if op_code in OpCodesDevs.GET_STATUS:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDevs.GET_STATUS}")
|
||||
if cmd_str == 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 cmd_str == OpCodesDev.GET_STATUS:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.GET_STATUS}")
|
||||
q.add_pus_tc(
|
||||
generate_one_diag_command(
|
||||
sid=make_sid(object_id=object_id, set_id=RwSetIds.STATUS_SET_ID)
|
||||
sid=make_sid(object_id=object_id, set_id=RwSetId.STATUS_SET_ID)
|
||||
)
|
||||
)
|
||||
if op_code in OpCodesDevs.ENABLE_STATUS_HK:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDevs.ENABLE_STATUS_HK}")
|
||||
if cmd_str == OpCodesDev.ENABLE_STATUS_HK:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.ENABLE_STATUS_HK}")
|
||||
interval = float(input("Please enter HK interval in floating point seconds: "))
|
||||
cmds = enable_periodic_hk_command_with_interval(
|
||||
True, make_sid(object_id, RwSetIds.STATUS_SET_ID), interval
|
||||
True, make_sid(object_id, RwSetId.STATUS_SET_ID), interval
|
||||
)
|
||||
for cmd in cmds:
|
||||
q.add_pus_tc(cmd)
|
||||
if op_code in OpCodesDevs.DISABLE_STATUS_HK:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDevs.DISABLE_STATUS_HK}")
|
||||
if cmd_str == OpCodesDev.DISABLE_STATUS_HK:
|
||||
q.add_log_cmd(f"RW {rw_idx}: {InfoDev.DISABLE_STATUS_HK}")
|
||||
q.add_pus_tc(
|
||||
disable_periodic_hk_command(
|
||||
True, make_sid(object_id, RwSetIds.STATUS_SET_ID)
|
||||
True, make_sid(object_id, RwSetId.STATUS_SET_ID)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def pack_rw_ass_cmds(q: DefaultPusQueueHelper, object_id: bytes, op_code: str):
|
||||
if op_code in OpCodesAss.OFF:
|
||||
data = pack_mode_data(object_id=object_id, mode=Modes.OFF, submode=0)
|
||||
def pack_rw_ass_cmds(q: DefaultPusQueueHelper, object_id: bytes, cmd_str: str):
|
||||
if cmd_str in OpCodesAss.OFF:
|
||||
data = pack_mode_data(object_id=object_id, mode=Mode.OFF, submode=0)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=data
|
||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
||||
)
|
||||
)
|
||||
if op_code in OpCodesAss.ON:
|
||||
data = pack_mode_data(object_id=object_id, mode=Modes.ON, submode=0)
|
||||
if cmd_str in OpCodesAss.ON:
|
||||
data = pack_mode_data(object_id=object_id, mode=Mode.ON, submode=0)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=data
|
||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
||||
)
|
||||
)
|
||||
if op_code in OpCodesAss.NML:
|
||||
data = pack_mode_data(object_id=object_id, mode=Modes.NORMAL, submode=0)
|
||||
if cmd_str in OpCodesAss.NML:
|
||||
data = pack_mode_data(object_id=object_id, mode=Mode.NORMAL, submode=0)
|
||||
q.add_pus_tc(
|
||||
PusTelecommand(
|
||||
service=200, subservice=Subservices.TC_MODE_COMMAND, app_data=data
|
||||
service=200, subservice=Subservice.TC_MODE_COMMAND, app_data=data
|
||||
)
|
||||
)
|
||||
if op_code in OpCodesAss.ALL_SPEED_UP:
|
||||
if cmd_str in OpCodesAss.ALL_SPEED_UP:
|
||||
speed, ramp_time = prompt_speed_ramp_time()
|
||||
rw_speed_up_cmd_consec(q, [RW1_ID, RW2_ID, RW3_ID, RW4_ID], speed, ramp_time)
|
||||
if op_code in OpCodesAss.ALL_SPEED_OFF:
|
||||
if cmd_str in OpCodesAss.ALL_SPEED_OFF:
|
||||
rw_speed_down_cmd_consec(
|
||||
q, [RW1_ID, RW2_ID, RW3_ID, RW4_ID], prompt_ramp_time()
|
||||
)
|
||||
|
||||
|
||||
def prompt_speed_ramp_time() -> (int, int):
|
||||
def prompt_speed_ramp_time() -> Tuple[int, int]:
|
||||
speed = int(
|
||||
input("Specify speed [0.1 RPM, 0 or range [-65000, -1000] and [1000, 65000]: ")
|
||||
)
|
||||
@ -247,14 +249,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
|
||||
@ -264,7 +264,7 @@ def pack_set_speed_command(
|
||||
ramp_time_ms > 0 and (ramp_time_ms > 20000 or ramp_time_ms < 10)
|
||||
):
|
||||
raise ValueError("Invalid Ramp Speed time. Allowed range is [10-20000] ms")
|
||||
command_id = RwCommandIds.SET_SPEED
|
||||
command_id = RwCommandId.SET_SPEED
|
||||
command = bytearray()
|
||||
command += object_id + command_id
|
||||
command = command + struct.pack("!i", speed)
|
||||
@ -274,12 +274,10 @@ 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 == RwSetIds.STATUS_SET_ID:
|
||||
if set_id == RwSetId.STATUS_SET_ID:
|
||||
pw.dlog(
|
||||
f"Received Status HK (ID {set_id}) from Reaction Wheel {object_id.name}"
|
||||
)
|
||||
@ -292,18 +290,19 @@ 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)
|
||||
if set_id == RwSetIds.LAST_RESET:
|
||||
pw.dlog(get_validity_buffer_str(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}"
|
||||
)
|
||||
@ -317,7 +316,7 @@ def handle_rw_hk_data(
|
||||
f"Last Non-Cleared (Cached) Reset Status {last_not_cleared_reset_status} | "
|
||||
f"Current Reset Status {current_reset_status}"
|
||||
)
|
||||
if set_id == RwSetIds.TM_SET:
|
||||
if set_id == RwSetId.TM_SET:
|
||||
pw.dlog(f"Received TM HK (ID {set_id}) from Reaction Wheel {object_id.name}")
|
||||
fmt_str = "!BiffBBiiIIIIIIIIIIIIIIII"
|
||||
inc_len = struct.calcsize(fmt_str)
|
||||
@ -349,22 +348,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} | "
|
||||
@ -372,23 +373,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(
|
||||
get_validity_buffer_str(
|
||||
validity_buffer=hk_data[current_idx:], num_vars=27
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
|
1297
eive_tmtc/tmtc/acs/star_tracker.py
Normal file
1297
eive_tmtc/tmtc/acs/star_tracker.py
Normal file
File diff suppressed because it is too large
Load Diff
@ -4,14 +4,15 @@
|
||||
@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
|
||||
"""
|
||||
import struct
|
||||
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.tc import DefaultPusQueueHelper
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
|
80
eive_tmtc/tmtc/acs/subsystem.py
Normal file
80
eive_tmtc/tmtc/acs/subsystem.py
Normal file
@ -0,0 +1,80 @@
|
||||
import enum
|
||||
from typing import Dict, Tuple
|
||||
|
||||
from spacepackets.ecss import PusTelecommand
|
||||
from tmtccmd.config.tmtc import (
|
||||
CmdTreeNode,
|
||||
)
|
||||
from tmtccmd.pus.s200_fsfw_mode import Subservice as ModeSubservices
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
|
||||
from eive_tmtc.config.object_ids import ACS_SUBSYSTEM_ID
|
||||
from eive_tmtc.tmtc.acs.defs import AcsMode, SafeSubmode
|
||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||
|
||||
|
||||
class CmdStr(str, enum.Enum):
|
||||
OFF = "off"
|
||||
SAFE = "safe"
|
||||
DETUMBLE = "detumble"
|
||||
IDLE = "idle"
|
||||
PTG_TARGET = "ptg_target"
|
||||
PTG_TARGET_NADIR = "ptg_nadir"
|
||||
PTG_TARGET_GS = "ptg_target_gs"
|
||||
PTG_TARGET_INERTIAL = "ptg_inertial"
|
||||
REPORT_ALL_MODES = "all_modes"
|
||||
|
||||
|
||||
class Info(str, enum.Enum):
|
||||
OFF = "Off Command"
|
||||
SAFE = "Safe Mode Command"
|
||||
DETUMBLE = "Detumble Mode Command"
|
||||
IDLE = "Idle Mode Command"
|
||||
PTG_TARGET_NADIR = "Target Pointing Nadir"
|
||||
PTG_TARGET = "Target Pointing"
|
||||
PTG_TARGET_GS = "Target Pointing Ground Station"
|
||||
PTG_TARGET_INERTIAL = "Target Pointing Inertial"
|
||||
REPORT_ALL_MODES = "Report All Modes Recursively"
|
||||
|
||||
|
||||
HANDLER_LIST: Dict[str, Tuple[int, int, str]] = {
|
||||
CmdStr.OFF: (AcsMode.OFF, 0, Info.OFF),
|
||||
CmdStr.SAFE: (AcsMode.SAFE, SafeSubmode.DEFAULT, Info.SAFE),
|
||||
CmdStr.DETUMBLE: (AcsMode.SAFE, SafeSubmode.DETUMBLE, Info.DETUMBLE),
|
||||
CmdStr.IDLE: (AcsMode.IDLE, 0, Info.IDLE),
|
||||
CmdStr.PTG_TARGET: (AcsMode.PTG_TARGET, 0, Info.PTG_TARGET),
|
||||
CmdStr.PTG_TARGET_GS: (AcsMode.PTG_TARGET_GS, 0, Info.PTG_TARGET_GS),
|
||||
CmdStr.PTG_TARGET_NADIR: (AcsMode.PTG_NADIR, 0, Info.PTG_TARGET_NADIR),
|
||||
CmdStr.PTG_TARGET_INERTIAL: (AcsMode.PTG_INERTIAL, 0, Info.PTG_TARGET_INERTIAL),
|
||||
}
|
||||
|
||||
|
||||
def build_acs_subsystem_cmd(q: DefaultPusQueueHelper, cmd_path: str):
|
||||
info_prefix = "ACS Subsystem"
|
||||
if cmd_path in CmdStr.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=ACS_SUBSYSTEM_ID,
|
||||
)
|
||||
)
|
||||
mode_info_tup = HANDLER_LIST.get(cmd_path)
|
||||
if mode_info_tup is None:
|
||||
return
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=ACS_SUBSYSTEM_ID,
|
||||
info=f"{info_prefix}: {mode_info_tup[2]}",
|
||||
mode=mode_info_tup[0],
|
||||
submode=mode_info_tup[1],
|
||||
q=q,
|
||||
)
|
||||
|
||||
|
||||
def create_acs_subsystem_node() -> CmdTreeNode:
|
||||
node = CmdTreeNode("acs", "ACS Subsystem", hide_children_which_are_leaves=True)
|
||||
for cmd_str, (_, _, info) in HANDLER_LIST.items():
|
||||
node.add_child(CmdTreeNode(cmd_str, info))
|
||||
node.add_child(CmdTreeNode(CmdStr.REPORT_ALL_MODES, Info.REPORT_ALL_MODES))
|
||||
return node
|
@ -1,17 +1,20 @@
|
||||
import enum
|
||||
import struct
|
||||
|
||||
from eive_tmtc.pus_tm.defs import PrintWrapper
|
||||
from eive_tmtc.pus_tc.devs.sus import SetIds
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
from tmtccmd.util.tmtc_printer import FsfwTmTcPrinter
|
||||
from tmtccmd.fsfw.tmtc_printer import get_validity_buffer_str
|
||||
|
||||
|
||||
class SetId(enum.IntEnum):
|
||||
HK = 3
|
||||
|
||||
|
||||
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 == SetIds.HK:
|
||||
if set_id == SetId.HK:
|
||||
current_idx = 0
|
||||
temperature = struct.unpack("!f", hk_data[current_idx : current_idx + 4])[0]
|
||||
current_idx += 4
|
||||
@ -20,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)
|
||||
pw.dlog(
|
||||
get_validity_buffer_str(validity_buffer=hk_data[current_idx:], num_vars=7)
|
||||
)
|
@ -1,83 +1,66 @@
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from eive_tmtc.config.object_ids import SUS_BOARD_ASS_ID
|
||||
from eive_tmtc.tmtc.acs.acs_board import DualSideSubmodes
|
||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||
from tmtccmd.config.tmtc import (
|
||||
tmtc_definitions_provider,
|
||||
TmtcDefinitionWrapper,
|
||||
OpCodeEntry,
|
||||
CmdTreeNode,
|
||||
)
|
||||
from tmtccmd.tc import service_provider
|
||||
from tmtccmd.tc.decorator import ServiceProviderParams
|
||||
from tmtccmd.tc.pus_200_fsfw_modes import Modes
|
||||
from tmtccmd.pus.s200_fsfw_mode import Mode
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
|
||||
from eive_tmtc.config.object_ids import SUS_BOARD_ASS_ID
|
||||
from eive_tmtc.tmtc.acs.acs_board import DualSideSubmode
|
||||
from eive_tmtc.tmtc.common import pack_mode_cmd_with_info
|
||||
|
||||
|
||||
class SusOpCodes:
|
||||
SUS_ASS_NOM_SIDE = ["0", "nom"]
|
||||
SUS_ASS_RED_SIDE = ["1", "red"]
|
||||
SUS_ASS_DUAL_MODE = ["2", "dual"]
|
||||
SUS_ASS_OFF = ["3", "off"]
|
||||
class SusOpCode:
|
||||
SUS_ASS_NOM_SIDE = "nom"
|
||||
SUS_ASS_RED_SIDE = "red"
|
||||
SUS_ASS_DUAL_MODE = "dual"
|
||||
SUS_ASS_OFF = "off"
|
||||
|
||||
|
||||
@service_provider(CustomServiceList.SUS_BRD_ASS)
|
||||
def pack_sus_cmds(p: ServiceProviderParams):
|
||||
op_code = p.op_code
|
||||
q = p.queue_helper
|
||||
if op_code in SusOpCodes.SUS_ASS_NOM_SIDE:
|
||||
def pack_sus_cmds(q: DefaultPusQueueHelper, op_code: str):
|
||||
if op_code in SusOpCode.SUS_ASS_NOM_SIDE:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=SUS_BOARD_ASS_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=DualSideSubmodes.A_SIDE,
|
||||
mode=Mode.NORMAL,
|
||||
submode=DualSideSubmode.A_SIDE,
|
||||
q=q,
|
||||
info="Switching to SUS board to nominal side",
|
||||
)
|
||||
if op_code in SusOpCodes.SUS_ASS_RED_SIDE:
|
||||
if op_code in SusOpCode.SUS_ASS_RED_SIDE:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=SUS_BOARD_ASS_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=DualSideSubmodes.B_SIDE,
|
||||
mode=Mode.NORMAL,
|
||||
submode=DualSideSubmode.B_SIDE,
|
||||
q=q,
|
||||
info="Switching to SUS board to redundant side",
|
||||
)
|
||||
if op_code in SusOpCodes.SUS_ASS_OFF:
|
||||
if op_code in SusOpCode.SUS_ASS_OFF:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=SUS_BOARD_ASS_ID,
|
||||
mode=Modes.OFF,
|
||||
mode=Mode.OFF,
|
||||
submode=0,
|
||||
q=q,
|
||||
info="Switching SUS board off",
|
||||
)
|
||||
if op_code in SusOpCodes.SUS_ASS_DUAL_MODE:
|
||||
if op_code in SusOpCode.SUS_ASS_DUAL_MODE:
|
||||
pack_mode_cmd_with_info(
|
||||
object_id=SUS_BOARD_ASS_ID,
|
||||
mode=Modes.NORMAL,
|
||||
submode=DualSideSubmodes.DUAL_SIDE,
|
||||
mode=Mode.NORMAL,
|
||||
submode=DualSideSubmode.DUAL_SIDE,
|
||||
q=q,
|
||||
info="Switching to SUS board to dual side",
|
||||
)
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_sus_board_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(
|
||||
keys=SusOpCodes.SUS_ASS_NOM_SIDE,
|
||||
info="Switch SUS board to nominal side",
|
||||
def create_sus_board_node() -> CmdTreeNode:
|
||||
node = CmdTreeNode("sus_brd_assy", "SUS board assembly")
|
||||
node.add_child(
|
||||
CmdTreeNode(SusOpCode.SUS_ASS_RED_SIDE, "Switch SUS board to nominal side")
|
||||
)
|
||||
oce.add(
|
||||
keys=SusOpCodes.SUS_ASS_RED_SIDE,
|
||||
info="Switch SUS board to redundant side",
|
||||
node.add_child(
|
||||
CmdTreeNode(SusOpCode.SUS_ASS_RED_SIDE, "Switch SUS board to redundant side")
|
||||
)
|
||||
oce.add(
|
||||
keys=SusOpCodes.SUS_ASS_OFF,
|
||||
info="Switch off SUS board",
|
||||
)
|
||||
oce.add(
|
||||
keys=SusOpCodes.SUS_ASS_DUAL_MODE,
|
||||
info="Switch SUS board to dual mode",
|
||||
)
|
||||
defs.add_service(
|
||||
name=CustomServiceList.SUS_BRD_ASS.value,
|
||||
info="SUS Board Assembly",
|
||||
op_code_entry=oce,
|
||||
node.add_child(CmdTreeNode(SusOpCode.SUS_ASS_OFF, "Switch SUS board off"))
|
||||
node.add_child(
|
||||
CmdTreeNode(SusOpCode.SUS_ASS_DUAL_MODE, "Switch SUS board to dual mode")
|
||||
)
|
||||
return node
|
||||
|
0
eive_tmtc/tmtc/com/__init__.py
Normal file
0
eive_tmtc/tmtc/com/__init__.py
Normal file
146
eive_tmtc/tmtc/com/ccsds_handler.py
Normal file
146
eive_tmtc/tmtc/com/ccsds_handler.py
Normal file
@ -0,0 +1,146 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
@file ccsds_handler.py
|
||||
@brief Test commanding of CCSDS Handler
|
||||
@author J. Meier
|
||||
@date 20.11.2021
|
||||
"""
|
||||
import enum
|
||||
import struct
|
||||
|
||||
from tmtccmd.config import CmdTreeNode
|
||||
|
||||
from eive_tmtc.config.definitions import CustomServiceList
|
||||
from spacepackets.ecss.tc import PusTelecommand
|
||||
from tmtccmd.config.tmtc import (
|
||||
tmtc_definitions_provider,
|
||||
OpCodeEntry,
|
||||
TmtcDefinitionWrapper,
|
||||
)
|
||||
from tmtccmd.tmtc import DefaultPusQueueHelper
|
||||
from tmtccmd.pus.s200_fsfw_mode import create_mode_command, Mode
|
||||
from tmtccmd.util import ObjectIdU32
|
||||
|
||||
|
||||
class ActionId(enum.IntEnum):
|
||||
# Configures input rate of syrlinks to 400 Khz (results in downlink rate of 200 kbps)
|
||||
# SET_LOW_RATE = 0
|
||||
# Configures input rate of syrlinks to 2000 Khz (results in downlink rate of 1000 kbps)
|
||||
# SET_HIGH_RATE = 1
|
||||
# Enables the syrlinks transmitter (by using RS485 enables lines). Please note that this
|
||||
# is a legacy command. It is recommended to use mode commands instead
|
||||
EN_TRANSMITTER = 2
|
||||
# Disables the syrlinks transmitter (by using RS485 enables lines). Please note that this is
|
||||
# a legacy command. It is recommended to use mode commands instead.
|
||||
DIS_TRANSMITTER = 3
|
||||
# Sets an arbitrary bitrate. Normally only set low and set high rate commands should be
|
||||
# required
|
||||
ARBITRARY_BITRATE = 4
|
||||
ENABLE_TX_CLK_MANIPULATOR = 5
|
||||
DISABLE_TX_CLK_MANIPULATOR = 6
|
||||
# Tx data will be updated on rising edge of tx clock
|
||||
UPDATE_ON_RISING_EDGE = 7
|
||||
# Tx data will be updated on falling edge of tx clock
|
||||
UPDATE_ON_FALLING_EDGE = 8
|
||||
|
||||
|
||||
class Submode(enum.IntEnum):
|
||||
# Informative, do not command this.
|
||||
UNSET = 0
|
||||
DATARATE_LOW = 1
|
||||
DATARATE_HIGH = 2
|
||||
DATARATE_DEFAULT = 3
|
||||
|
||||
|
||||
class OpCode:
|
||||
ENABLE_WITH_LOW_DATARATE = "enable_low_datarate"
|
||||
ENABLE_WITH_HIGH_DATARATE = "enable_high_datarate"
|
||||
DISABLE = "disable"
|
||||
ENABLE_ACTION = "legacy_enable_tx"
|
||||
DISABLE_ACTION = "legacy_disable_tx"
|
||||
|
||||
|
||||
class Info:
|
||||
ENABLE_WITH_LOW_DATARATE = "Enable TX with low datarate"
|
||||
ENABLE_WITH_HIGH_DATARATE = "Enable TX with high datarate"
|
||||
DISABLE = "Disable TX"
|
||||
ENABLE_ACTION = "Enable TX (legacy)"
|
||||
DISABLE_ACTION = "Disable TX (legacy)"
|
||||
|
||||
|
||||
def pack_ccsds_handler_command( # noqa C901
|
||||
object_id: ObjectIdU32, q: DefaultPusQueueHelper, cmd_str: str
|
||||
):
|
||||
obyt = object_id.as_bytes
|
||||
prefix = "CCSDS Handler"
|
||||
q.add_log_cmd(f"Testing CCSDS handler with object id: {object_id.as_hex_string}")
|
||||
if cmd_str in OpCode.ENABLE_WITH_LOW_DATARATE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_WITH_LOW_DATARATE}")
|
||||
q.add_pus_tc(create_mode_command(obyt, Mode.ON, Submode.DATARATE_LOW))
|
||||
if cmd_str in OpCode.ENABLE_WITH_HIGH_DATARATE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_WITH_HIGH_DATARATE}")
|
||||
q.add_pus_tc(create_mode_command(obyt, Mode.ON, Submode.DATARATE_HIGH))
|
||||
if cmd_str in OpCode.DISABLE:
|
||||
q.add_log_cmd(f"{prefix}: {Info.DISABLE}")
|
||||
q.add_pus_tc(create_mode_command(obyt, Mode.OFF, 0))
|
||||
if cmd_str in OpCode.ENABLE_ACTION:
|
||||
q.add_log_cmd(f"{prefix}: {Info.ENABLE_ACTION}")
|
||||
command = obyt + struct.pack("!I", ActionId.EN_TRANSMITTER)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str in OpCode.DISABLE_ACTION:
|
||||
q.add_log_cmd(f"{prefix}: {Info.DISABLE_ACTION}")
|
||||
command = obyt + struct.pack("!I", ActionId.DIS_TRANSMITTER)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str == "4":
|
||||
q.add_log_cmd("CCSDS Handler: Set arbitrary bitrate")
|
||||
bitrate = int(input("Specify bit rate (bps): "))
|
||||
command = (
|
||||
obyt
|
||||
+ struct.pack("!I", ActionId.ARBITRARY_BITRATE)
|
||||
+ struct.pack("!I", bitrate)
|
||||
)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str == "5":
|
||||
q.add_log_cmd("CCSDS Handler: Enable tx clock manipulator")
|
||||
command = obyt + struct.pack("!I", ActionId.ENABLE_TX_CLK_MANIPULATOR)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str == "6":
|
||||
q.add_log_cmd("CCSDS Handler: Disable tx clock manipulator")
|
||||
command = obyt + struct.pack("!I", ActionId.DISABLE_TX_CLK_MANIPULATOR)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str == "7":
|
||||
q.add_log_cmd("CCSDS Handler: Update tx data on rising edge of tx clock")
|
||||
command = obyt + struct.pack("!I", ActionId.UPDATE_ON_RISING_EDGE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
if cmd_str == "8":
|
||||
q.add_log_cmd("CCSDS Handler: Update tx data on falling edge of tx clock")
|
||||
command = obyt + struct.pack("!I", ActionId.UPDATE_ON_FALLING_EDGE)
|
||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||
|
||||
|
||||
def create_ccsds_node() -> CmdTreeNode:
|
||||
op_code_strs = [
|
||||
getattr(OpCode, key) for key in dir(OpCode) if not key.startswith("__")
|
||||
]
|
||||
info_strs = [getattr(Info, key) for key in dir(OpCode) if not key.startswith("__")]
|
||||
combined_dict = dict(zip(op_code_strs, info_strs))
|
||||
node = CmdTreeNode("ccsds", "CCSDS Handler", hide_children_for_print=True)
|
||||
for op_code, info in combined_dict.items():
|
||||
node.add_child(CmdTreeNode(op_code, info))
|
||||
return node
|
||||
|
||||
|
||||
@tmtc_definitions_provider
|
||||
def add_ccsds_cmds(defs: TmtcDefinitionWrapper):
|
||||
oce = OpCodeEntry()
|
||||
oce.add(OpCode.ENABLE_WITH_LOW_DATARATE, Info.ENABLE_WITH_LOW_DATARATE)
|
||||
oce.add(OpCode.ENABLE_WITH_HIGH_DATARATE, Info.ENABLE_WITH_HIGH_DATARATE)
|
||||
oce.add(OpCode.DISABLE, Info.DISABLE)
|
||||
oce.add(OpCode.ENABLE_ACTION, Info.ENABLE_ACTION)
|
||||
oce.add(OpCode.DISABLE_ACTION, Info.DISABLE_ACTION)
|
||||
oce.add("4", "CCSDS Handler: Set arbitrary bitrate")
|
||||
oce.add("5", "CCSDS Handler: Enable tx clock manipulator")
|
||||
oce.add("6", "CCSDS Handler: Disable tx clock manipulator")
|
||||
oce.add("7", "CCSDS Handler: Update tx data on rising edge")
|
||||
oce.add("8", "CCSDS Handler: Update tx data on falling edge")
|
||||
defs.add_service(CustomServiceList.CCSDS_HANDLER.value, "CCSDS Handler", oce)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user