Compare commits
1801 Commits
Author | SHA1 | Date | |
---|---|---|---|
0eb6b7cccb | |||
74ee291983 | |||
a146c34140 | |||
61ced11766 | |||
468fb096c9 | |||
4a2dd19a73 | |||
2658cabc9d | |||
dc83061f80 | |||
00da51b6a2 | |||
f846a18b33 | |||
ab588b4844 | |||
d12dca183d | |||
701ecbd182 | |||
bdd2b23ec3 | |||
d70245b56a | |||
9097a3f3c7 | |||
e05d9d4b2a | |||
07572ab3a0 | |||
304aabc336 | |||
07e8f95a31 | |||
babea226ab | |||
8c24a7310d | |||
8f5982fd72 | |||
611a2c0b45 | |||
61e6b09704 | |||
a9a0266a84 | |||
b7e6315be7 | |||
740275f57a | |||
58dd53def8 | |||
ddbe30f832 | |||
680d496b28 | |||
9c163419b2 | |||
f4fedd20c9 | |||
016fab105e | |||
767a0eda30 | |||
f2c71d962a | |||
7bf880a29f | |||
0185691dba | |||
9997aa5470 | |||
c1ccfe66eb | |||
ae9f43c707 | |||
143002de48 | |||
d439aedee7 | |||
b8d010cd39 | |||
22370e3e1e | |||
b98f91f6c1 | |||
b47bda8ed1 | |||
078a04b317 | |||
d24a983985 | |||
b964b03b2d | |||
f0d55f9e5b | |||
aa54dbbd10 | |||
1a62a13d97 | |||
500b3b6fc6 | |||
fa746f910d | |||
602c635967 | |||
84db92f75e | |||
4de71062af | |||
a4c8319cec | |||
379fd6046e | |||
aa800c4524 | |||
7f1fe3a2d8 | |||
e023220be4 | |||
8cf9dd9136 | |||
62d18826f1 | |||
41f762c6ff | |||
644a768778 | |||
756ea6d90d | |||
2d19d94d09 | |||
09a2ba7843 | |||
716f2b2832 | |||
6934721a42 | |||
fc8a8ce5a9 | |||
5e53795cbe | |||
2f2d1c7c7a | |||
f7be454dae | |||
ca30fed4c3 | |||
54f742bf19 | |||
4bfd675073 | |||
36420a6855 | |||
b0a2b5886f | |||
33d60ccf7f | |||
c8472f222c | |||
e68ac9cc2d | |||
a306b2a0af | |||
f112c28391 | |||
4693407b68 | |||
4e6b3ec9ed | |||
38b9a9b34e | |||
7c67648b8e | |||
9b1d4de9c5 | |||
998f93e3fa | |||
b5e1e0c31b | |||
9a65a9f20b | |||
b2a52b0bfc | |||
46862825ec | |||
dc1e51891e | |||
213dba1e75 | |||
4e686b4ad0 | |||
1e521f0575 | |||
53cccc3c13 | |||
a7c227f8ea | |||
bc6531f7a5 | |||
e17b8d2ec4 | |||
f645b97ba3 | |||
e79e13416e | |||
33773179a7 | |||
c5b26eade4 | |||
28eaf8461a | |||
6f67bd500b | |||
af354bd9fb | |||
aa746276ae | |||
3e3ac9f5be | |||
ae66820b52 | |||
93013d18ff | |||
7f3f99c6aa | |||
600d0c580d | |||
2722e471ef | |||
d8089489c4 | |||
cebe6e1423 | |||
906aedc911 | |||
97df53554e | |||
a81e939e70 | |||
b5f4b6cf7b | |||
f14677ec4e | |||
29dc684455 | |||
3ff8c6a481 | |||
f7bc052070 | |||
9861772c38 | |||
d4080fe5cb | |||
6b976f1046 | |||
673826b131 | |||
ae729337a2 | |||
a09cc86336 | |||
8620bd0283 | |||
ea606ce217 | |||
99305846f8 | |||
dd211cdf54 | |||
2262a15e35 | |||
94431cfdb8 | |||
41ec6dc0f2 | |||
836ce9a6cd | |||
ae80eac9a2 | |||
e063a7148a | |||
2808079444 | |||
3ba81d19a7 | |||
0e6f222ef1 | |||
90ca65f9a9 | |||
f4c156479a | |||
d9e38d97ee | |||
67e94e1ee7 | |||
b20e38a2bc | |||
d71031f2e4 | |||
98d1da428a | |||
df7236cfee | |||
c9cc1d4cfe | |||
128bd7d41a | |||
061cd0468c | |||
2bb0f530fe | |||
b3f5e74609 | |||
ff28b628a4 | |||
5925de94e7 | |||
7c36660000 | |||
ae8f80bb54 | |||
776a53b243 | |||
8ad68aca3a | |||
b1bd7e0215 | |||
d42b6798e0 | |||
fa94c67e99 | |||
4e9a074e82 | |||
b82f19ea50 | |||
271830422a | |||
7869289abc | |||
0a84eab0ef | |||
b816b386cf | |||
8d9755c17f | |||
d552b51c0d | |||
52620f3dda | |||
d7eaceb0fc | |||
e01fe19d53 | |||
af1d0759e1 | |||
af9f346698 | |||
b6ba2f291a | |||
c66799b24f | |||
18be21a310 | |||
abef9da9f9 | |||
4afddad503 | |||
cc39acd436 | |||
2df556c5be | |||
aa43912279 | |||
ece053e5c3 | |||
1c0fbace4d | |||
2fb7ac7b4b | |||
c89e332843 | |||
10f552f56a | |||
310f8f5f3c | |||
584b6e3038 | |||
a81b24b67f | |||
6b671cfa65 | |||
3408624056 | |||
146767b04f | |||
f4951385fd | |||
f259face36 | |||
8482416ac5 | |||
a419589a7f | |||
ebcd0cdfa1 | |||
9960fc8ce7 | |||
353b9bd322 | |||
014ac8b8c2 | |||
cd8bbaf1f9 | |||
d98873c9a6 | |||
aacd4dc088 | |||
d5d43e8d44 | |||
55dd4b28ee | |||
f9ed42f8a5 | |||
e9fc0c453d | |||
ca44b541b1 | |||
2968856d71 | |||
e4530544c2 | |||
103800e40c | |||
aa78d744b4 | |||
54c29e893d | |||
b9d0e4bdd9 | |||
cdcadf3c18 | |||
5243f304af | |||
a8d19b0ff9 | |||
5bdb7414bf | |||
77b8c6eb3e | |||
db669c44f6 | |||
bfb91f1baa | |||
3c33d01089 | |||
6156cc0b88 | |||
bd8389e0c9 | |||
58aef99bbc | |||
9020014245 | |||
e523c2fe25 | |||
3bd434bbc3 | |||
4acf66a020 | |||
2af1735cfd | |||
13844bce65 | |||
d7dc3f34c7 | |||
086dbcc19e | |||
7a53ada4b4 | |||
c5e18957f5 | |||
64b4db98ba | |||
3a236a1a3b | |||
19006e79b1 | |||
44325ee176 | |||
397e23f1da | |||
3d48f4d046 | |||
0d7fe0ff74 | |||
543d147b37 | |||
34dde2640e | |||
205a672680 | |||
57b01a5d2c | |||
4624d5a2a6 | |||
518f9d73f6 | |||
d8ec121131 | |||
3e54bc9c3f | |||
65dd0f313b | |||
4ca45f348c | |||
34a0288987 | |||
f031c46cb5 | |||
dbf627cc12 | |||
b06db0a0fc | |||
0a68b50ad7 | |||
b11ed219a2 | |||
67082a6559 | |||
39b2a3420c | |||
36d5f8fd31 | |||
cdba7985ea | |||
38b7593900 | |||
78cc0fc52d | |||
4ed112d019 | |||
7549a24f6f | |||
ce7da9f513 | |||
d53fdf9078 | |||
67988dad64 | |||
56c5838d15 | |||
2950876ce4 | |||
a875bf55b8 | |||
a28ba4ec66 | |||
c65b402361 | |||
f5e47c6114 | |||
600921e3a0 | |||
3c38410643 | |||
2e0a685507 | |||
0ade2ae0ee | |||
b050047d9a | |||
65c231e92d | |||
5e93282662 | |||
7a7d0e650f | |||
4ca8c38c98 | |||
0cabe3a9ea | |||
845548ed25 | |||
858c6c301e | |||
9825a8583f | |||
babc4f80a8 | |||
3299260653 | |||
a0e531445a | |||
5e854668b5 | |||
52c69f05e6 | |||
5dd2638241 | |||
c835b31e7f | |||
57b41701ce | |||
69bbe4ea39 | |||
f2a2c73984 | |||
85cf95d6bb | |||
08d83c158a | |||
b0e65867ee | |||
106cb1ab35 | |||
a06d90daad | |||
3cc48a4cea | |||
04178b8831 | |||
28882cc359 | |||
c9bd922711 | |||
94c736d143 | |||
c4516f53b8 | |||
f39981deca | |||
fd8317acd7 | |||
7df3308717 | |||
a76074acf5 | |||
697dcab345 | |||
104a8cab33 | |||
8d4b980c32 | |||
677457bbe7 | |||
908927ed9f | |||
4a287344f4 | |||
ae0413f7f6 | |||
01081cbb29 | |||
1d82977ca2 | |||
bc7bdfe1fe | |||
38a0c14940 | |||
3941770378 | |||
e10359077c | |||
8d1db69e0d | |||
8a2137d5d3 | |||
e47ba65550 | |||
143fb44037 | |||
18994f5e65 | |||
39a3b4aa6f | |||
2b18ab1504 | |||
83e0627548 | |||
152a3c20cf | |||
9e8880c2c5 | |||
ed8623259e | |||
69a3cb20be | |||
01b98ca091 | |||
0cd246182d | |||
9270165bf8 | |||
9aedc36e4d | |||
f5588e9c62 | |||
afbab6d3f2 | |||
6d0bd88cd9 | |||
23af9685d6 | |||
a26d71f745 | |||
8404ce237b | |||
1610bdecf9 | |||
53c88f85d5 | |||
ac514d9c19 | |||
e6f0695e1e | |||
6b37d292c6 | |||
e3677f89fe | |||
5267bfcd82 | |||
99eae0df51 | |||
73e2508025 | |||
1b2dd12e61 | |||
8585114041 | |||
c4f62842ab | |||
800ab7e87f | |||
11d9871c0a | |||
958abadd65 | |||
fba856a9a9 | |||
bc582abcb3 | |||
ba7a2c3ece | |||
a8a0299b46 | |||
f4b47a24c0 | |||
e9c5bfe324 | |||
5dcafa1de0 | |||
7522eac9eb | |||
847e3bb51d | |||
020dfa8278 | |||
389b77a092 | |||
a31f8c934a | |||
685a4caace | |||
9360dad028 | |||
8eac0b5ebd | |||
703eaaa9aa | |||
cab55c79dc | |||
62952b89b1 | |||
b205fb5269 | |||
959f37f25a | |||
789b0ff7ae | |||
601318d7eb | |||
87d622c82c | |||
fc43627abb | |||
0878f3882a | |||
6a8ddf96b8 | |||
6a2f569fc3 | |||
d2f11b1860 | |||
cf8dc9ed7d | |||
f65cf23391 | |||
b4c6965d9e | |||
78d39a3760 | |||
b58fc90879 | |||
2386944ed8 | |||
409631fb0a | |||
13b8f9b1ec | |||
d0f641abe0 | |||
9b5fc8995c | |||
23a4b08709 | |||
d1775a52aa | |||
ff6ad60eed | |||
95d220c304 | |||
65989261b0 | |||
e365e03c2a | |||
da36160f6e | |||
3f8603967c | |||
013692cc41 | |||
2f9de8c36e | |||
fcf3437410 | |||
f51656a813 | |||
bb7a616283 | |||
028f94a2f7 | |||
62ba7a1f80 | |||
9d42bb87d9 | |||
6c8eeeab31 | |||
f16d92c1b1 | |||
55a22c840c | |||
caa7c20adf | |||
6ee3fe2eef | |||
76ea3f7979 | |||
3871c8b8de | |||
e0f94039b4 | |||
a1380a6e3a | |||
795486ae6c | |||
4b1221ab99 | |||
f6f4db525c | |||
a6e24485e2 | |||
74a38dc76b | |||
5f6f85a778 | |||
6426142039 | |||
1541376701 | |||
27370fcd44 | |||
770fee0097 | |||
5903b3ef60 | |||
0bf4527e94 | |||
f695115102 | |||
a72805d137 | |||
b7c17fdf0f | |||
d4ae19ba8e | |||
e2b36313c1 | |||
0c3c61c686 | |||
3f72837134 | |||
0764dbb662 | |||
4336b8c14f | |||
9c743eb0d9 | |||
c35d824fcd | |||
3e58e4a8a4 | |||
8988905050 | |||
f29163e8a9 | |||
9cfee12774 | |||
eafc47f7a1 | |||
4c57e48399 | |||
7a8df782cc | |||
4d1fbbcabd | |||
053cfed093 | |||
d09b53f6df | |||
c474d6ed1d | |||
def7eca2f2 | |||
520b41c53b | |||
28d7dcf177 | |||
36d7852c1d | |||
6a37503154 | |||
12c7ed2cb5 | |||
33babebb6f | |||
5c97020087 | |||
0adfb0cd3c | |||
0bba9b53ba | |||
1f6c986a0c | |||
746254a838 | |||
437288de1e | |||
534945cfec | |||
9613d4aa51 | |||
bc72f59abb | |||
00214dc378 | |||
fb324516bb | |||
7023fe5c42 | |||
1727168ee5 | |||
f1774fe80f | |||
fcb5613aa8 | |||
363fc89209 | |||
1a0e632d2f | |||
6dbb9b5e37 | |||
31e2205e71 | |||
c83afa4e10 | |||
e10768386d | |||
be41d4f819 | |||
5adde9c1c4 | |||
8dfdc62125 | |||
c53c052876 | |||
f8ff9c355c | |||
e0f5d049e3 | |||
4c85b5d951 | |||
80ad923181 | |||
ec95792bc3 | |||
53c839e389 | |||
68bc7f7682 | |||
efa3c11c7a | |||
19723e88d3 | |||
b469455b9b | |||
861bee8083 | |||
bb8d4fbc57 | |||
dc92770c01 | |||
935f49094f | |||
11acfbbc91 | |||
3e7901f060 | |||
58c343b8de | |||
0ef3104e2e | |||
b92924881b | |||
63b50e6101 | |||
e7eaaa9295 | |||
7c700a9e19 | |||
9af7b6a39b | |||
079da3b0e4 | |||
cb2fe300b2 | |||
e9901f3c85 | |||
c37f26021c | |||
58e427d51d | |||
3d93431278 | |||
b301cbc750 | |||
e69812b48b | |||
0301c18af2 | |||
f71972609c | |||
61c26fe53a | |||
40c000b183 | |||
bee8838010 | |||
ff25f6ff3f | |||
dd28767d68 | |||
13f269e6aa | |||
6331aef987 | |||
59d40a6794 | |||
29ba7b87b7 | |||
87e1746d71 | |||
da386edd05 | |||
c40a192c48 | |||
58058bd402 | |||
2fa5024236 | |||
3135bb923e | |||
6f368ef01a | |||
d6409b6112 | |||
72598e2ae6 | |||
9dc0c5bde0 | |||
ec40044b6e | |||
bea0c31a12 | |||
04e5c212d7 | |||
fe1fb9425e | |||
96bd188e57 | |||
90db9785ea | |||
506c8a3fa6 | |||
8fa5777634 | |||
613d7738a8 | |||
b32e0ef4fb | |||
150595b7f7 | |||
07f482a98b | |||
c759e118fa | |||
82a9dbd632 | |||
7e35a0a481 | |||
330e26b2ba | |||
7dc587e2df | |||
41215c9ae9 | |||
dce6323090 | |||
906413e800 | |||
ad72301ea0 | |||
44d0f1c533 | |||
1e1d41270b | |||
15b3144760 | |||
d9284478c4 | |||
74603f9969 | |||
69bb3922d3 | |||
52c439c501 | |||
f273eaccfb | |||
5ec001652f | |||
cbbac0d7a9 | |||
267f900545 | |||
012e173487 | |||
91b83d477b | |||
349332c1e1 | |||
d226726a27 | |||
9d8dfdfd4f | |||
1f4c171576 | |||
21159107d7 | |||
e8e01cf198 | |||
fd235488f7 | |||
d85fb18112 | |||
a9efedfc86 | |||
175c0f9961 | |||
fd61a3f243 | |||
cc4ef09e9f | |||
0bced7eca5 | |||
abf689872d | |||
7f36bd365f | |||
0bb6c15b97 | |||
e68918e978 | |||
45054cc863 | |||
e6813efb88 | |||
8597e04eaf | |||
493f89e0cb | |||
f622e1afe4 | |||
7af2b5ddf9 | |||
dda8261fc3 | |||
f61c448a24 | |||
884462e793 | |||
7a0641b98c | |||
7bca418db8 | |||
32bab161ef | |||
9c735e36b8 | |||
b5d5dc5ad8 | |||
b6e08f369a | |||
9b088a22b4 | |||
cf2fb54cc1 | |||
f749866818 | |||
7e675ba35d | |||
16441678c9 | |||
f271da3b04 | |||
13defc5053 | |||
6f7cde69e5 | |||
b8a58edf5a | |||
9e393f61a1 | |||
d824f8ba9e | |||
d6331aab0b | |||
56642a11f7 | |||
f6a0954315 | |||
57f5a22b04 | |||
2dc22a7d8f | |||
c611bc824b | |||
481b0361f9 | |||
60cb56769d | |||
140fd9f4f5 | |||
7b3265ea91 | |||
a94e7ed17c | |||
e5f06fe19f | |||
ddad5e30a4 | |||
7d29da1263 | |||
dec13c7d13 | |||
9c8fc84053 | |||
577e45fec3 | |||
8611144a70 | |||
25de385766 | |||
9e719d455a | |||
fabb643026 | |||
0256824e37 | |||
24fb8e34f2 | |||
b9cf144c1f | |||
bb0c4ac03e | |||
ce04532759 | |||
d00cfc420c | |||
2153294e6f | |||
17b9086974 | |||
0fdc79df5e | |||
0e5a3a2f6c | |||
4277a98c16 | |||
34cd92840f | |||
3f94bf7855 | |||
1b05f45e24 | |||
be4a6b2434 | |||
f68f4066be | |||
3f1f3fa916 | |||
b81618344e | |||
d85ddcdbff | |||
092e9fa508 | |||
379c868abb | |||
c9ec0f67bd | |||
9003eea07b | |||
8464dd1eae | |||
6a07471c3a | |||
beb80e7a0b | |||
eee829919b | |||
3150261e3e | |||
fe01d3d4b5 | |||
bc6b492976 | |||
11ccd1f535 | |||
b891198bee | |||
da831ff789 | |||
078299a07c | |||
2f5ec84237 | |||
9c22e4cab2 | |||
2694f0cbc8 | |||
6e4d27a454 | |||
ab74382c12 | |||
2be5cdabb0 | |||
11e1222a7c | |||
573ff334b8 | |||
19dd7a0964 | |||
a92f664770 | |||
bb27700cc2 | |||
3e3355a926 | |||
55d32a2bb0 | |||
68e68afdd6 | |||
fede1fc4b3 | |||
394f0498c5 | |||
809e1ecf88 | |||
a75b4fd951 | |||
2f990d8bbc | |||
8482d56fd0 | |||
e349504b41 | |||
0bb5f08d23 | |||
0dbe6b9854 | |||
043a458f42 | |||
c682d75aff | |||
aea4313b7d | |||
11c54e270f | |||
881a03fbed | |||
f9e04ed9a2 | |||
d8f84ed00d | |||
b516f12a61 | |||
de4bf6dd55 | |||
159da20ef2 | |||
22f8d256dd | |||
7cf3247cbd | |||
8843a0d8c5 | |||
ec18cb7007 | |||
74bb27e61f | |||
5890e639fe | |||
ba9cf5d79d | |||
7c2755db26 | |||
0b81a92941 | |||
f39d03afc2 | |||
b54ced65f6 | |||
ff8ebfe67a | |||
99e6ea6000 | |||
4871479ed5 | |||
a196ab136e | |||
ba1cc420c4 | |||
1dfbb9474c | |||
0e8859c278 | |||
eb46841237 | |||
d44142ac26 | |||
a8af3a8447 | |||
97a947f5aa | |||
5d63160c57 | |||
a4ba52e76d | |||
a5318b430b | |||
9cec20a550 | |||
024da6ceef | |||
d544792e29 | |||
9a5901235c | |||
e16ee5d6a5 | |||
596b6eb46d | |||
5b84808d7c | |||
ce59e66c05 | |||
af85c883fa | |||
1fd5d065b6 | |||
509d144117 | |||
f7be8ea63c | |||
3c6eb265c7 | |||
b1d2f73b01 | |||
eda1f7e212 | |||
56a4378a63 | |||
a16671762d | |||
6da3d6f06a | |||
2f0aed97dc | |||
350ed59033 | |||
52ab77eded | |||
4ff1548cf2 | |||
f6d1a41cb9 | |||
1623dd1c80 | |||
94ae33a554 | |||
e3c41dd807 | |||
096253a9a3 | |||
11e5866f31 | |||
9b8092fb09 | |||
f546df50a1 | |||
2f263c6aa6 | |||
8201a4140a | |||
364342855d | |||
c688a51838 | |||
8c83ec78fd | |||
715a69db89 | |||
dc44af5b29 | |||
27f29eda40 | |||
50a62b9243 | |||
da7c450e06 | |||
a92fa31cb5 | |||
d273621419 | |||
f229ebb141 | |||
64ec76bfb7 | |||
a2f2e1b84e | |||
19753c43f1 | |||
69525b6fd1 | |||
c1d8eda2c7 | |||
7ab01687ce | |||
22076ea25e | |||
7c54e920ef | |||
be848ea5e4 | |||
8dd22b6ea0 | |||
53c38d9c05 | |||
d894479f75 | |||
37e128041f | |||
bab0bbf82d | |||
7d9be35cb4 | |||
95a4d88ed4 | |||
102228100e | |||
c4fe772fe7 | |||
ccf1fcaa79 | |||
4fdb2de510 | |||
5e2f7fa3ed | |||
7ddfdc0978 | |||
bb895c9e12 | |||
8b11302028 | |||
c1b4a1c164 | |||
58212d7081 | |||
a6e6ee053d | |||
3eb5fc7f47 | |||
533aaa207c | |||
005d5a5223 | |||
e82777479b | |||
2b12cc4fa2 | |||
ec2db69236 | |||
263f4eb25f | |||
13c7ef373d | |||
adcc68e0fa | |||
11106cf755 | |||
f966b517a4 | |||
3e5937db67 | |||
d322096573 | |||
a392e31f99 | |||
719ffcad2b | |||
59ee375fc1 | |||
bbb8dd7a8a | |||
8fa2d0be0b | |||
af1d03f53f | |||
8a6d292a48 | |||
017171f221 | |||
f2210010de | |||
52ec5093bc | |||
77e39f3a92 | |||
af59a4e5d5 | |||
dc1047b7f9 | |||
e27b0875e0 | |||
0d46349caa | |||
1d935d46e7 | |||
8dd350e8dd | |||
07394ddfc9 | |||
a51a680396 | |||
551a4fe00f | |||
306fe7a2d9 | |||
9c300298b7 | |||
dcbf1502a2 | |||
f8c9ddbc3c | |||
74fa81d8f6 | |||
d3bf70243b | |||
4429dd1be9 | |||
d15db7668d | |||
66b38fa294 | |||
4392598a67 | |||
7ce881debc | |||
90d00b44ee | |||
7d6c6f03ef | |||
b7abab1114 | |||
fe9c8c50f2 | |||
9af43cb93b | |||
6e049f3ee1 | |||
157e7d2b4d | |||
882fb02600 | |||
6688499128 | |||
038a529b06 | |||
70806cffff | |||
e03e35ab77 | |||
ee08adb525 | |||
c9e16642c5 | |||
143d787f60 | |||
4664a9f4e7 | |||
3a56297a83 | |||
1f9935cf22 | |||
b43e1ef4e9 | |||
a83adb148e | |||
4a386ae641 | |||
b59a84b3d5 | |||
a0fda428bf | |||
870cc1da10 | |||
cd5061fe0f | |||
1981c4f70a | |||
192c7c6f31 | |||
a1f6143b92 | |||
ee3926fe2a | |||
853215e0dd | |||
e7811ebd0c | |||
b4b6363337 | |||
090ef88030 | |||
26a9dce0a0 | |||
f358719778 | |||
4d74c8ec43 | |||
e77766ae59 | |||
9d1d62aee0 | |||
bf2d97bd60 | |||
79bd349ac7 | |||
63f45ec27e | |||
9cdc932ad8 | |||
721a01409e | |||
a0d6552781 | |||
c709b2a526 | |||
5793d73ff6 | |||
977235df87 | |||
84adbeda38 | |||
f5b5fcd7ff | |||
ace01e2742 | |||
b14038e29c | |||
f115e6ca33 | |||
bfd2ed5b6e | |||
fde644cdbf | |||
f71fe274f4 | |||
b1fa3fd016 | |||
eb66d7585c | |||
f62b312d3c | |||
a83136515c | |||
569fdfef6e | |||
eb861c9f01 | |||
7fd2fbc481 | |||
58a5ede270 | |||
08ca196c74 | |||
16ea033fd2 | |||
a4e6d877ff | |||
baf69fac44 | |||
0f7fd39d72 | |||
9892938601 | |||
97698a08d5 | |||
b603554a80 | |||
bbd27eca76 | |||
f9c03af538 | |||
68ed3fa232 | |||
8c450596f6 | |||
5ea2767662 | |||
b4129950cf | |||
939d7fd98e | |||
c47a7338db | |||
1048456a5b | |||
2a84ebba57 | |||
9413f723cf | |||
4257e1d918 | |||
127a8e6124 | |||
5f9e0bf80a | |||
976235a79f | |||
b6d18ef4d2 | |||
7b3393c5b2 | |||
3c0b8f9e8b | |||
4e8e85f450 | |||
342ff62837 | |||
bce8df376a | |||
97b4db10bf | |||
e0024e738e | |||
879bce4f76 | |||
49d060d20e | |||
2e6962c29c | |||
afd704650f | |||
bc0f1cad7b | |||
04541b4a19 | |||
4a386ad3d1 | |||
6452242f2f | |||
79abd05820 | |||
793d6feaaa | |||
8b6a03a3ab | |||
b6fc9d65b7 | |||
2e431668dd | |||
37a32bb6e9 | |||
2f4f7f088e | |||
0b09816b4a | |||
c85c2cf4b6 | |||
c80426309d | |||
ba0bc1b98b | |||
170976566b | |||
b1c4241b03 | |||
555e0ce49d | |||
cb8a49775d | |||
ac6031364e | |||
98ba4a0449 | |||
68c728cbdb | |||
340b600599 | |||
3caa9dea75 | |||
86e48eea6d | |||
cca8734908 | |||
a9b514ddc8 | |||
9a30ae5175 | |||
75a80b55ec | |||
e4efd42234 | |||
0dbd6b703d | |||
b6477e099d | |||
f3c3e8a443 | |||
357c01343c | |||
677a3f95bd | |||
64fd7fb37d | |||
fae83a0fca | |||
8b26d13070 | |||
55bd87abb6 | |||
c8fe1b1359 | |||
38907fc0f5 | |||
f8d432f6eb | |||
dd8b6ced8f | |||
9cb7cefb85 | |||
2374dea493 | |||
00e04e8b77 | |||
df3fa17017 | |||
cb71b8cfb2 | |||
fd943a99b6 | |||
d50cbe9e5b | |||
e6aa582fcb | |||
245116403a | |||
3ebcbaa44f | |||
1dee29aabd | |||
9d5f846658 | |||
b2fd2f5d83 | |||
96865c1dd2 | |||
42779e6ace | |||
c63b13fc40 | |||
9f9b1e440a | |||
ac2c4c7abc | |||
224a3af6f8 | |||
eb61996f91 | |||
49e3002abc | |||
e5636f0b6c | |||
131c508cae | |||
21899d663e | |||
c1b43bb504 | |||
087db386d7 | |||
2f5f47a02c | |||
8821cc1079 | |||
14cea6369a | |||
0a37db617b | |||
101117cebe | |||
4863dad1cd | |||
1154c0e887 | |||
c6289e27ae | |||
6538005a30 | |||
fa5883bdf3 | |||
b261a4ecfa | |||
a6dfe02128 | |||
bcd31c9248 | |||
bf73f2ff04 | |||
7a62624687 | |||
b2a8c5d7ec | |||
2dd97a55f8 | |||
ccf03b131b | |||
337717d271 | |||
c48268ffa9 | |||
97a78fc4c9 | |||
0bdc6d3d7c | |||
66583e8009 | |||
c0f01a75e4 | |||
6a15aa14a2 | |||
11e9d71775 | |||
d30bab7bc0 | |||
a366ef0960 | |||
930f7a5233 | |||
68f4323d14 | |||
01e97c8381 | |||
1b73e7de7d | |||
8759f86889 | |||
a2d5138c71 | |||
f5c4e2b788 | |||
af1c18e8cf | |||
c562c4a240 | |||
45e1e7250b | |||
70e2a3f5f8 | |||
e6a5847e9c | |||
72ae6aee94 | |||
25e5f8d2a4 | |||
0f25f95307 | |||
af5d4e12c5 | |||
fd62efcae2 | |||
1b00029202 | |||
72174c76cd | |||
7476f33905 | |||
e48d080673 | |||
888ade0bfb | |||
a2fd590280 | |||
23c9e8eed7 | |||
1f8f62457d | |||
cb43688f38 | |||
f84e7e42d6 | |||
51317782c3 | |||
97bb255d53 | |||
97888953ec | |||
112cfa3ee7 | |||
5de7653600 | |||
bf7e4b4b8c | |||
5b0db43e0f | |||
72ab4b1a24 | |||
1cc39bb6d7 | |||
e3389c32a7 | |||
fd405e61a4 | |||
903c0c8258 | |||
82966eed31 | |||
fd436dbe8b | |||
d8a07312f2 | |||
58db0d7184 | |||
5218202824 | |||
bd295d5b52 | |||
faf4937e76 | |||
ba0e07b5c6 | |||
37673a2782 | |||
c169229107 | |||
d2daa89d89 | |||
ca7fbcf6a9 | |||
db2905c834 | |||
2ccd2a832c | |||
892d2f5939 | |||
cee56f6d02 | |||
3016683db3 | |||
f66777a23c | |||
e38b39b3b2 | |||
4e9646fe10 | |||
ca6556c000 | |||
6aae94823e | |||
0dc26ec8b2 | |||
3b5ecb43cc | |||
e7a1c9f402 | |||
ff9a5fc1bf | |||
2fcba4028c | |||
85d0ac92da | |||
b3a14e9a9b | |||
bf61724374 | |||
8c9424f02b | |||
350b892bb7 | |||
586f04e488 | |||
1f7ab7c2ce | |||
9d8991491a | |||
b64cc8f404 | |||
acae88c67c | |||
4fa5aa6b84 | |||
b48a6e2318 | |||
193ed01bce | |||
d18a0e98a5 | |||
6e10ccd2d6 | |||
3b61697615 | |||
f82cc2aeda | |||
0b2aff56e5 | |||
7f141aa1e8 | |||
c8d09debf7 | |||
9c77703ada | |||
718d067b40 | |||
37b540fd48 | |||
1938addaa8 | |||
e6b5ee65f3 | |||
4d6ccaeb4b | |||
3003a4c4d1 | |||
f96fbf707d | |||
80115640ba | |||
4c1b79fd66 | |||
c8a2395d61 | |||
f6f3f17505 | |||
300f3230d1 | |||
c71a1a29f3 | |||
cfbc53792d | |||
5b5489c8da | |||
773e1c9ecc | |||
f041655378 | |||
206c29bb25 | |||
e8da0885eb | |||
f209ac6b2d | |||
b20266f153 | |||
e6b0b4048c | |||
982db82ddb | |||
0d175951ec | |||
3b383b98df | |||
41f1eaec44 | |||
05be170890 | |||
1e4766ddfc | |||
8720dacb7f | |||
39bf9f9b5b | |||
2165f34a28 | |||
70e1d41a08 | |||
3b0490835c | |||
6c7d1e674c | |||
cc3bcdfaeb | |||
26f9c499d8 | |||
59e165be4f | |||
53133573e1 | |||
7a7f25a638 | |||
ec2ec32af4 | |||
fcba76b7f1 | |||
60afb573a0 | |||
ff50203fbb | |||
da72b3a96a | |||
1cf3fbaabe | |||
245b5dfcc6 | |||
04e3d2486d | |||
c4ef164f41 | |||
39bb90eb61 | |||
7a4a42c692 | |||
21ed43614e | |||
7288a5edbd | |||
d55daebabf | |||
ca22904d32 | |||
4ec362d849 | |||
00834de1b7 | |||
3ade660132 | |||
3e2338f3a4 | |||
79d27ff9e3 | |||
d13e593f89 | |||
35caddbfc4 | |||
196aca241e | |||
6530ad8f1a | |||
34807c94ba | |||
0919acf2d5 | |||
69ea16c36d | |||
e2cb88da0e | |||
f2ffb12219 | |||
25dfb54be0 | |||
f43a93842e | |||
ad4ab98356 | |||
7b571bc007 | |||
dfb1e88f55 | |||
7b539e2fa5 | |||
4b37a19644 | |||
718a440442 | |||
7e33ec16e4 | |||
26d8e852dc | |||
0fc17624f3 | |||
74ffbf1dcd | |||
b5049fa8d0 | |||
652326443b | |||
d4b7c6493a | |||
4aa6ed4de4 | |||
9067c4180e | |||
0056ebcb62 | |||
a2485a2195 | |||
eaa0fc6cbe | |||
14188a4f3b | |||
eee92baa6e | |||
6104bf7adb | |||
e52c909580 | |||
5f17b1f6e8 | |||
90175e5c9d | |||
7a8816e49a | |||
c4cd6332f8 | |||
8ff70462cb | |||
2e9de68e17 | |||
8ad1daa11f | |||
4a820fba55 | |||
36f820a07a | |||
73c594a930 | |||
d045498761 | |||
0a7eb6f6bc | |||
3784cf688f | |||
f646566228 | |||
58527dacf6 | |||
03cf5891b0 | |||
1b79bfc02a | |||
3c6c990b8f | |||
1252897a1c | |||
22b2f137b4 | |||
c347b6d1d4 | |||
24b939c50b | |||
ef5bc9731d | |||
67128b398c | |||
c251d93305 | |||
26aeb88d84 | |||
6004233c67 | |||
88db78fed9 | |||
11f476878d | |||
809626b6e3 | |||
db90c59557 | |||
2c6ea8dc9f | |||
543568be39 | |||
a8e886200f | |||
0fabe3adb6 | |||
f2598b5c4c | |||
f7573b4902 | |||
7b0657bb55 | |||
d59daa2485 | |||
9556ce6d9f | |||
6f1a2952d5 | |||
c09d94f003 | |||
10807d577f | |||
6e6dff56f2 | |||
959adcafb1 | |||
737d5ecb53 | |||
84643020da | |||
04a561b9a0 | |||
d86b9d55da | |||
90b4b7c0f4 | |||
48d9a65f09 | |||
251dddc42d | |||
1129836112 | |||
d4923ac3e8 | |||
8e5adae8ef | |||
26369039da | |||
5c30adb9bb | |||
309358f447 | |||
7bf72e3c18 | |||
12ac8f7c70 | |||
92f5a8bf89 | |||
fd4be08796 | |||
afb9303dcb | |||
17a1a5a655 | |||
22558a2f39 | |||
e9514b1c97 | |||
c06dd15303 | |||
89ba9f7009 | |||
0df5070fa6 | |||
20edbf6213 | |||
d7ebc4dbe2 | |||
316971c6bc | |||
c7bed10bdf | |||
cc4c3182a0 | |||
71a2ecc2ea | |||
2f9cdefc96 | |||
ea993ad2e9 | |||
972012e549 | |||
a6af6174f4 | |||
9ae43d83f9 | |||
828b6adf77 | |||
9b4026a1c9 | |||
72753aa43a | |||
cf42ca7835 | |||
e41f8901c5 | |||
c99b9f5afa | |||
a245966793 | |||
746f288f1e | |||
9501d0802f | |||
be3c778fee | |||
13f2f39325 | |||
66b4fc6294 | |||
aae4d019e7 | |||
cbb6a45407 | |||
95ce2c79b9 | |||
8810ad3d60 | |||
66a1e690e0 | |||
1744f1aff0 | |||
0206115abb | |||
6e8fc83aed | |||
f02bc6b345 | |||
d662cdba34 | |||
dd5373a728 | |||
d2e3f14b72 | |||
6d148307ae | |||
d671de7efb | |||
862f8b3da3 | |||
5f3bd5c754 | |||
63275df3f0 | |||
e349bb8a7f | |||
cb1a98ccff | |||
95e20e70ff | |||
f765707886 | |||
fd6be806ed | |||
22bac9e7c0 | |||
36fe0921de | |||
acd4c5da6d | |||
cb869fef0c | |||
d3fc9a4491 | |||
7af7eff316 | |||
7392012a00 | |||
89518a035a | |||
89230b60d7 | |||
104d9647fe | |||
eb2a0604e9 | |||
0cb7446297 | |||
f789380343 | |||
e33a0fd60b | |||
b4ce9d2a22 | |||
5984bb52f2 | |||
9b6c3964c6 | |||
089d04646a | |||
ed992e495b | |||
8da373542e | |||
ee974d0e2d | |||
0907e8f5e5 | |||
59b80807ba | |||
80e12fb194 | |||
7c3031de78 | |||
f160dfa56d | |||
bf16d6d86a | |||
43a2993f4d | |||
d6f537da5f | |||
e19c03f0d7 | |||
33d552693f | |||
152a9b2dce | |||
91af3ac497 | |||
ee4db78a95 | |||
89f6314a18 | |||
5db1f71854 | |||
0ee7bdad0a | |||
481e546e6d | |||
1e45bff0cc | |||
419864e5da | |||
cd88e8948d | |||
ca743ccd6c | |||
9fc6386ac5 | |||
513dcf9be1 | |||
b60891ddd1 | |||
cd988753ae | |||
d37770422b | |||
12539ba415 | |||
0726b9d730 | |||
66d3b06f9e | |||
bd60255220 | |||
ba9268aae6 | |||
9f83a49690 | |||
5d9ed222f5 | |||
5205c5b78a | |||
3b17af9d07 | |||
205bd4648e | |||
29f1dd0f8e | |||
9a7779cffb | |||
0254fb9fd2 | |||
eee3da50f2 | |||
d32ce3c563 | |||
a190d99f6d | |||
0fa1bab94d | |||
5357de8da8 | |||
9614a76acf | |||
0466622a16 | |||
90c1d45f20 | |||
29179bde0c | |||
b9a6425078 | |||
8873ecae48 | |||
e13636167f | |||
5ad2fa5e93 | |||
2c4a47f302 | |||
0d8cb295d9 | |||
2a91105124 | |||
eaceb32359 | |||
01d8eccdd2 | |||
28f3b07c5c | |||
9633359db3 | |||
ee811371c5 | |||
5f6f806b88 | |||
721d38f758 | |||
19d04c0023 | |||
67a14ca6f6 | |||
83b81e1ba8 | |||
5f275778de | |||
ce72e4308e | |||
8b45786e5d | |||
e915f6cc90 | |||
c9f16b223a | |||
2ee70d53d9 | |||
6c16238cc7 | |||
1803b2c650 | |||
3137ebb86e | |||
fd1c090141 | |||
82d428440b | |||
018f93cfbe | |||
c64a490324 | |||
62cadd16ab | |||
a1cb4fb549 | |||
e416d94224 | |||
411b2595fa | |||
9b849d10e9 | |||
2c3a7791e1 | |||
f19729e11d | |||
019cc29c24 | |||
d1402587dc | |||
793e6f4119 | |||
0ec0d551a3 | |||
2a9c1aab7f | |||
41adaf36bf | |||
7dae81c122 | |||
243088252c | |||
9be00603f4 | |||
f3fe65080b | |||
d9ef0f9a9d | |||
7aa977efdf | |||
adda32854d | |||
01ac2f4aff | |||
b01b9d3b99 | |||
a2a822c118 | |||
1bdfd5f8ea | |||
0f5e65e5ce | |||
62e7e23512 | |||
b6558acdbc | |||
257efd4974 | |||
6ca210ac31 | |||
b3b736a7bd | |||
b3dd2ec57a | |||
262e6d0b39 | |||
7bda0dfb97 | |||
eefdc8ff5b | |||
1a8f9ab4a2 | |||
0d7b77e5d1 | |||
6ea22b63df | |||
a91e6b7dfe | |||
1d5856b4d4 | |||
35ad0a40d3 | |||
5349fb45e3 | |||
b5b80cef97 | |||
582c8e8eff | |||
3ffdcf3885 | |||
80f8df3ee4 | |||
ef24aba750 | |||
586966bebe | |||
a864d51ddf | |||
6104b94268 | |||
682b528004 | |||
124e08e80b | |||
030d3272d3 | |||
03fbc6b23d | |||
c149f3871a | |||
328fd149e5 | |||
d0613727ba | |||
7af4a777ae | |||
c98b3f6aa4 | |||
532add94d0 | |||
e3d9614fae | |||
9ce065adb2 | |||
d38b5346a2 | |||
fb0ff922a8 | |||
cac634503d | |||
56cdd1173e | |||
ea6b13d189 | |||
60b07035b1 | |||
94262a9d04 | |||
bcce945cce | |||
803c0b1a3e | |||
9285e13ce5 | |||
6b80daab0a | |||
82c97656f1 | |||
3ad6c8a56c | |||
7275454f8a | |||
57054c46ab | |||
40446b1fea | |||
1eb26240b1 | |||
81a4112c45 | |||
48b0ee8662 | |||
67e9dc9090 | |||
a7d3f2c3f8 | |||
2c8cfa3874 | |||
6016063add | |||
04e1cb52ac | |||
a3f2219f9b | |||
fd0da7379a | |||
4c079b7d33 | |||
7d8cf0cbfe | |||
6b931dce7f | |||
6074e9246e | |||
a918d61f2b | |||
4fe14b464a | |||
03470284a4 | |||
700d7ced64 | |||
2b38fe19af | |||
2bacf1efa0 | |||
641c069664 | |||
9a9574369a | |||
4b6e0addf1 | |||
01fbb2d9fd | |||
f945252d3c | |||
ffebe00f93 | |||
6523634b2a | |||
8f3ea62632 | |||
612c9967b4 | |||
cd9b0cb4f4 | |||
98bf2d592c | |||
7cbc3fe06c | |||
8d68d80eb2 | |||
27420b0c4e | |||
4de18cbaa4 | |||
f36c2e9587 | |||
b1d56eb299 | |||
a2cb348ee3 | |||
953d7f1db4 | |||
263b62e6d0 | |||
a0f4b031be | |||
cab2d00530 | |||
8f5a454771 | |||
bf65d13849 | |||
de4e28fcec | |||
0c78037fb8 | |||
10a18ba6af | |||
5abecd065c | |||
6f4c81117b | |||
da898a3f16 | |||
ec8c5b7a5c | |||
b3cdb05214 | |||
e9104b7479 | |||
0dae3b04be | |||
0d32bc0c0a | |||
6352b65f46 | |||
f12fa77644 | |||
f0d77125e1 | |||
d9708c6175 | |||
d709e190e2 | |||
eb6a0c410f | |||
da78f00f82 | |||
2f07f2b75e | |||
1d541dcca5 | |||
c1598f8808 | |||
378120416a | |||
fdc37ad381 | |||
8e7c4b5da2 | |||
7fa8a497f2 | |||
8fbb058322 | |||
54d48feb2d | |||
2bfc9bc565 | |||
706e3c8882 | |||
fdebddb965 | |||
cb6a98b0d2 | |||
47e97ff1be | |||
7f74cca11f | |||
2f7abb2da8 | |||
1e0c94246d | |||
12c5a10662 | |||
d233dc9f82 | |||
e1703be49b | |||
1518fba6bd | |||
537b8282c3 | |||
03941472a8 | |||
f41cf14df5 | |||
e99819449a | |||
123db49c78 | |||
f54945de12 | |||
7ee9bf6edf | |||
75ade4d8f8 | |||
08f36954ad | |||
29e031f0df | |||
7ff63930d4 | |||
0968d91fb5 | |||
c6c92e1140 | |||
9d59f960a4 | |||
fb3359b44f | |||
cfad85c6c5 | |||
c29d7e6f3e | |||
8b1d6cf07d | |||
feb59d321c | |||
6be54a9485 | |||
97f7f7c973 | |||
a026f5e2d0 | |||
bc2a0d875f | |||
39f83937c5 | |||
d831110127 | |||
e5271a9ca5 | |||
4b8f5992b5 | |||
efe63b394c | |||
9fdb41506b | |||
655e01c2d1 | |||
8c001b6443 | |||
8b0eceb072 | |||
f784d4f248 | |||
7c68de26d2 | |||
e7123a4bb1 | |||
a13ae7abcc | |||
9ddcc8dc14 | |||
177b573cd4 | |||
1553900145 | |||
166fd77f7b | |||
075bba242b | |||
29e78a7ae3 | |||
11e06f6b21 | |||
a893618f60 | |||
918cd7b237 | |||
d506b515fc | |||
a26924fa04 | |||
6f84099c5e | |||
024e06a3d3 | |||
35b9c7a4df | |||
fd9503ed3b | |||
0bf1df81cd | |||
0654001945 | |||
a0d09e7f23 | |||
14d70950f8 | |||
bf70e8ece4 | |||
e07492c855 | |||
92b3f740d5 | |||
16eab6b266 | |||
58f29e16c5 | |||
6d428859f2 | |||
650f24d0ff | |||
1de832509a | |||
ef09cdabc2 | |||
3da5f1d6cc | |||
e0c33b21e9 | |||
2d4c881d3a | |||
56840deb9b | |||
ecb22bdd85 | |||
9b2398888d | |||
a57384f6c4 | |||
2aac3c67ee | |||
66d20dc118 | |||
a75e035cc5 | |||
3c5a2568ef | |||
131fff6847 | |||
d9acbe3207 | |||
4ba0d36800 | |||
6a1d4bd52f | |||
4cccafbe01 | |||
f5092b27ba | |||
17fa9a6e82 | |||
2813d229bb | |||
6c0234149e | |||
99913594fd | |||
f864d73253 | |||
af8caca3f6 | |||
e2f8ca752f | |||
efbb5d69c7 | |||
ebc32d1cc2 | |||
b4d9ea6c19 | |||
97a001a1da | |||
0bc7ddf38e | |||
59a0a74032 | |||
60c99fdbfb | |||
068b31a3d6 | |||
1d20c3b472 | |||
14c43c49dc | |||
53f31ca5a4 | |||
b5e096abcb | |||
f4f6d1ed81 | |||
ac22a00e09 | |||
35172185f9 | |||
fc5196f8da | |||
285bd7116b | |||
08df102f36 | |||
33684f2ef7 | |||
77b7433caf | |||
bc4c6c3a54 | |||
109560feb2 | |||
ea32d87c25 | |||
01d6060111 | |||
c2079dcbba | |||
9041a3376c | |||
9dfd8491d2 | |||
51629da4a0 | |||
a3eaace4a5 | |||
5a5d00e4e5 | |||
c496271a0e | |||
3159574cfa | |||
fa62f07dce | |||
a4d551e420 | |||
d82810d5e7 | |||
94fee2d429 | |||
650bfd1ad3 | |||
568954e9e0 | |||
305f8aa561 | |||
3a69bc705a | |||
c0f936b757 | |||
1ad30f33a5 | |||
fc1dedeb7a | |||
bb18525ed9 | |||
430e535fe9 | |||
d0a7d2892e | |||
485ee2f8e0 | |||
a0ad48d169 | |||
a761b3f83c | |||
25c59aa187 | |||
d14d7ae66d | |||
29fd2653f1 | |||
d9453c3b83 | |||
b9753dc5ba | |||
c4c1f09f2e | |||
74f116f2fa | |||
bbf0def3ff | |||
b6522c9fb3 | |||
62b3e16ac4 | |||
5431dfc9bd | |||
4d473315fe | |||
ec02332615 | |||
5d67b896aa | |||
ff9bcd6b14 | |||
58d6b59b7c | |||
9cea0c50c3 | |||
8ee6a23229 | |||
2d72942d47 | |||
9c217ad91e | |||
d37f48336b | |||
3e17de0127 | |||
8858084f6e | |||
283b897ae7 | |||
8c10cbe37b | |||
130a3ce727 | |||
33ac72de83 | |||
fcc9858b66 | |||
828d791da5 | |||
3965c08bfb | |||
eddc620307 | |||
04b04ed859 | |||
e62c527d05 | |||
1f381d9477 | |||
ed603f4e48 | |||
293082a7e8 | |||
a9699ad969 | |||
279697b326 | |||
6f1f92c9d1 | |||
c493273a21 | |||
fba820a1c0 | |||
578b4a4408 | |||
577e96bc95 | |||
93b7bbc43e | |||
0a9173559d | |||
da98cd77e8 | |||
e3730a9b94 | |||
666c7bc77f | |||
c599714aea | |||
f60a80f308 | |||
8d0c6ebc57 | |||
608632fde3 | |||
4ca892e9f3 | |||
08c225a633 | |||
31093c0d13 | |||
d5867f104f | |||
46a756b1ee | |||
ed76062904 | |||
e897fb63d8 | |||
098741ffe6 |
7
.gitignore
vendored
7
.gitignore
vendored
@ -12,8 +12,13 @@
|
|||||||
#vscode
|
#vscode
|
||||||
/.vscode
|
/.vscode
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
/.idea/*
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
__pycache__
|
__pycache__
|
||||||
.idea
|
|
||||||
|
# CLion
|
||||||
|
!/.idea/cmake.xml
|
||||||
|
|
||||||
generators/*.db
|
generators/*.db
|
||||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -10,9 +10,6 @@
|
|||||||
[submodule "thirdparty/lwgps"]
|
[submodule "thirdparty/lwgps"]
|
||||||
path = thirdparty/lwgps
|
path = thirdparty/lwgps
|
||||||
url = https://github.com/rmspacefish/lwgps.git
|
url = https://github.com/rmspacefish/lwgps.git
|
||||||
[submodule "thirdparty/arcsec_star_tracker"]
|
|
||||||
path = thirdparty/arcsec_star_tracker
|
|
||||||
url = https://egit.irs.uni-stuttgart.de/eive/arcsec_star_tracker.git
|
|
||||||
[submodule "thirdparty/json"]
|
[submodule "thirdparty/json"]
|
||||||
path = thirdparty/json
|
path = thirdparty/json
|
||||||
url = https://github.com/nlohmann/json.git
|
url = https://github.com/nlohmann/json.git
|
||||||
@ -22,3 +19,6 @@
|
|||||||
[submodule "thirdparty/gomspace-sw"]
|
[submodule "thirdparty/gomspace-sw"]
|
||||||
path = thirdparty/gomspace-sw
|
path = thirdparty/gomspace-sw
|
||||||
url = https://egit.irs.uni-stuttgart.de/eive/gomspace-sw.git
|
url = https://egit.irs.uni-stuttgart.de/eive/gomspace-sw.git
|
||||||
|
[submodule "thirdparty/sagittactl"]
|
||||||
|
path = thirdparty/sagittactl
|
||||||
|
url = https://egit.irs.uni-stuttgart.de/eive/sagittactl.git
|
||||||
|
15
.idea/cmake.xml
generated
Normal file
15
.idea/cmake.xml
generated
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CMakeSharedSettings">
|
||||||
|
<configurations>
|
||||||
|
<configuration PROFILE_NAME="Debug Q7S" ENABLED="true" CONFIG_NAME="Debug" TOOLCHAIN_NAME="Q7S" GENERATION_OPTIONS="-DTGT_BSP="arm/q7s"" NO_GENERATOR="true">
|
||||||
|
<ADDITIONAL_GENERATION_ENVIRONMENT>
|
||||||
|
<envs>
|
||||||
|
<env name="ZYNQ_7020_ROOTFS" value="/opt/xiphos/sdk/ark/sysroots/cortexa9hf-neon-xiphos-linux-gnueabi" />
|
||||||
|
<env name="CROSS_COMPILE" value="/opt/q7s-gcc/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf" />
|
||||||
|
</envs>
|
||||||
|
</ADDITIONAL_GENERATION_ENVIRONMENT>
|
||||||
|
</configuration>
|
||||||
|
</configurations>
|
||||||
|
</component>
|
||||||
|
</project>
|
10
.run/Q7S FM.run.xml
Normal file
10
.run/Q7S FM.run.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="Q7S FM" type="com.jetbrains.cidr.remote.gdbserver.type" factoryName="com.jetbrains.cidr.remote.gdbserver.factory" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="eive-obsw" TARGET_NAME="eive-obsw" CONFIG_NAME="Debug" version="1" RUN_TARGET_PROJECT_NAME="eive-obsw" RUN_TARGET_NAME="eive-obsw">
|
||||||
|
<custom-gdb-server version="1" gdb-connect="localhost:1234" executable="" warmup-ms="0" download-type="NONE" sshConfigName="Q7S FM" uploadFile="/tmp/eive-obsw" defaultGdbServerArgs=":1234 /tmp/eive-obsw">
|
||||||
|
<debugger kind="GDB" isBundled="true" />
|
||||||
|
</custom-gdb-server>
|
||||||
|
<method v="2">
|
||||||
|
<option name="CLION.COMPOUND.BUILD" enabled="true" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
</component>
|
879
CHANGELOG.md
879
CHANGELOG.md
@ -8,15 +8,885 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
|
|||||||
The [milestone](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/milestones)
|
The [milestone](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/milestones)
|
||||||
list yields a list of all related PRs for each release.
|
list yields a list of all related PRs for each release.
|
||||||
|
|
||||||
Starting at v2.0.0, the following changes will consitute of a breaking
|
Starting at v2.0.0, this project will adhere to semantic versioning and the the following changes
|
||||||
change warranting a new major release:
|
will consitute of a breaking change warranting a new major release:
|
||||||
|
|
||||||
- The TMTC interface changes in any shape of form.
|
- The TMTC interface changes in any shape of form.
|
||||||
- The behavour of the OBSW changes in a major shape or form relevant
|
- The behaviour of the OBSW changes in a major shape or form relevant for operations
|
||||||
for operations
|
|
||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
# [v2.0.3] 2023-04-17
|
||||||
|
|
||||||
|
- eive-tmtc: v3.1.1
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Fixed shadowing within the `SafeCtrl`, which prevented actuator commands to be calculated during
|
||||||
|
eclipse phase.
|
||||||
|
- EM build idle mode fixes for RW dummy.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Add `MGT_OVERHEATING` event and fallback to system SAFE mode if the MGT is overheating for
|
||||||
|
whatever reason.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Low-pass filters can no longer be executed if no actual data is available.
|
||||||
|
|
||||||
|
# [v2.0.2] 2023-04-16
|
||||||
|
|
||||||
|
- Bump patch version to 2.
|
||||||
|
|
||||||
|
# [v2.0.1] 2023-04-16
|
||||||
|
|
||||||
|
- eive-tmtc: v3.1.0
|
||||||
|
|
||||||
|
# [v2.0.0] 2023-04-16
|
||||||
|
|
||||||
|
This is the version which will fly on the satellite for the initial launch phase.
|
||||||
|
|
||||||
|
- q7s-package: v2.5.0
|
||||||
|
- eive-tmtc: v3.0.0
|
||||||
|
- `wire` library is now on version v10.7 as well.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added `mv`, `cp` and `rm` action helpers for the core controller for common filesystem operations.
|
||||||
|
- Extended directory listing helpers. There is now a directory listing helper which dumps the
|
||||||
|
directory listing as an action data reply immediately. For smaller directory listings, this
|
||||||
|
allows a listing without requiring a separate file downlink (which also has not been implemented
|
||||||
|
yet)
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- The directory listing action commands now allow compressing of either the target output file
|
||||||
|
for the directory listing into file action command, or compression in the helper which dumps
|
||||||
|
the directory listing directly.
|
||||||
|
|
||||||
|
# [v1.45.0] 2023-04-14
|
||||||
|
|
||||||
|
- q7s-package: v2.5.0
|
||||||
|
- eive-tmtc: v3.0.0
|
||||||
|
- STR firmware was updated to v10.7. `wire` library still needs to be updated.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Small fix for `install-obsw-yocto.sh` script
|
||||||
|
- Bugfix for STR firmware update procedure where the last remaining
|
||||||
|
bytes were not written properly.
|
||||||
|
- Bugfix for STR where an invalid reply was received for special requests
|
||||||
|
like firmware updates.
|
||||||
|
- Bugfix for shell command executors in command controller which lead to a crash.
|
||||||
|
- Important bugfix for STR solution set. Missing STR mode u8 parameter.
|
||||||
|
- Fix for STR image download.
|
||||||
|
- Possible fix for STR image upload.
|
||||||
|
- Fixed regression where the reply result for ACS board and SUS board devices was set to FAILED
|
||||||
|
even when going to OFF mode. In that case, it has to be set to OK so the device handler can
|
||||||
|
complete the OFF transition.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- STR `wire` library updated to v10.3. Submodule renamed to `sagittactl`.
|
||||||
|
- Custom FDIR for TMP1075 sensors. The device handlers reject `NEEDS_RECOVERY` health commands
|
||||||
|
anyway, so it does not really make sense to use the default FDIR.
|
||||||
|
- Reject `NEEDS_RECOVERY` health commands for the heater health devices.
|
||||||
|
- Adapted some queue sizes so that EM startup works without queue errors
|
||||||
|
- Event Manager: 120 -> 160
|
||||||
|
- UDP TMTC Bridge: 50 -> 120
|
||||||
|
- TCP TMTC Bridge: 50 -> 120
|
||||||
|
- Service 5: 120 -> 160, number of events handled in one cycle increased to 80
|
||||||
|
- EM: PCDU dummy is not a device handler anymore, but a custom power switcher object. This avoids
|
||||||
|
some issues where the event manager could not send an event message to the PCDU dummy because
|
||||||
|
the FDIR event queue was too small.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Add a way for the MAX31865 RTD handlers to recognize faulty/broken/off sensor devices.
|
||||||
|
- Add parameter interface for core controller
|
||||||
|
- Allow setting the preferred SD card via the new parameter interface of the core controller
|
||||||
|
with domain ID 0 and unque ID 0.
|
||||||
|
- Added action commands to reset the PDEC. Also added autonomous reset handling for the PDEC,
|
||||||
|
because there is no way so send TCs with a faulty PDEC.
|
||||||
|
- Added `I2C_REBOOT` and `PDEC_REBOOT` events for EIVE system component to ensure ground gets
|
||||||
|
informed.
|
||||||
|
|
||||||
|
## ACS
|
||||||
|
|
||||||
|
- Commanding from ACS Controller is now enabled.
|
||||||
|
- Safe Controller was reverted to FLP Design. This also introduces safe mode strategies.
|
||||||
|
They contain what the controller does and which data it uses. The controller will
|
||||||
|
automatically based on the available data decide on which strategy to use. If a strategy
|
||||||
|
is undesirable (e.g. the MEKF should not be used) this can be handeld via setting parameters.
|
||||||
|
|
||||||
|
# [v1.44.1] 2023-04-12
|
||||||
|
|
||||||
|
- eive-tmtc: v2.22.1
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Bugfixes and improvements for SDC state machine. Internal state was not updated correctly due
|
||||||
|
to a regression, so commanding the SDC state machine externally lead to confusing results.
|
||||||
|
- Heater states array in TCS controller was too small.
|
||||||
|
- Fixed a bug in persistent TM store, where the active file was not reset of SD card switches.
|
||||||
|
SD card switch from 0 to 1 and vice-versa works without errors from persistent TM stores now.
|
||||||
|
- Add a way for the SUS polling to detect broken or off devices by checking the retrieved
|
||||||
|
temperature for the all-ones value (0x0fff).
|
||||||
|
- Better reply result handling for the ACS board devices.
|
||||||
|
- ADIS1650X initial timeout handling now performed in device handler.
|
||||||
|
- The RW assembly and TCS board assembly now perform proper power switch handling for their
|
||||||
|
recovery handling.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Added additional logic for SDC state machine so that the SD cards are marked unusable when
|
||||||
|
the active SD card is switched or there is a transition from hot redundant to cold redundant mode.
|
||||||
|
This gives other tasks some time to register the SD cards being unusable, and therefore provides
|
||||||
|
a way for them to perform any re-initialization tasks necessary after SD card switches.
|
||||||
|
- TCS controller now only has an OFF mode and an ON mode
|
||||||
|
- The TCS controller pauses operations related to the TCS board assembly (reading sensors and
|
||||||
|
the primary control loop) while a TCS board recovery is on-going.
|
||||||
|
- Allow specifying custom OBSW update filename. This allowed keeping a cleaner file structure
|
||||||
|
where each update has a name including the version
|
||||||
|
- The files extracted during an update process are deleted after the update was performed to keep
|
||||||
|
the update directory cleaner.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- TCS controller: SUBMODE_NO_HEATER_CTRL (1) added for ON mode. If this submode is
|
||||||
|
commanded, all heaters will be switched off and then no further heater
|
||||||
|
commanding will be done.
|
||||||
|
- Fixed a bug in persistent TM store, where the active file was not reset of SD card switches.
|
||||||
|
SD card switch from 0 to 1 and vice-versa works without errors from persistent TM stores now.
|
||||||
|
|
||||||
|
# [v1.44.0] 2023-04-07
|
||||||
|
|
||||||
|
- eive-tmtc: v2.22.0
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Special I2C recovery handling. If the I2C bus is unavailable for whatever reason, the EIVE
|
||||||
|
system component will power-cycle all I2C devices by first going to the OFF/BOOT mode, then
|
||||||
|
power-cycling the 3V3 stack and rebooting the battery, and finally going back to safe mode.
|
||||||
|
If this does not restore the bus, a full reboot will be performed. This special sequence can
|
||||||
|
be commanded as well.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- RW Assembly: Correctly transition back to off when more than 1 devices is OFF. Also do this
|
||||||
|
when this was due to two devices being marked faulty.
|
||||||
|
- RW dummy and STR dummy components: Set/Update modes correctly.
|
||||||
|
- RW handlers: Bugfix for TM set retrieval and special request handling in general where the CRC
|
||||||
|
check always failed for special request. Also removed an unnecessary delay for special requests.
|
||||||
|
- RW handlers: Polling is now disabled for RWs which are off.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- RW shutdown now waits for the speed to be near 0 or for a OFF transition countdown to be expired
|
||||||
|
before going to off.
|
||||||
|
|
||||||
|
# [v1.43.2] 2023-04-05
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Adapted HK data rates to new table for LEOP SAFE mode.
|
||||||
|
- GPS controller HK is now generated periodically as well.
|
||||||
|
- Better mode combination checks for assembly components. This includes:
|
||||||
|
- IMTQ assembly
|
||||||
|
- Syrlinks assembly
|
||||||
|
- Dual Lane Assembly
|
||||||
|
- RWs are no longer commanded by the ACS Controller during safe mode. Instead the RW speed command
|
||||||
|
is set to 0 as part or the `doShutDown` of the RW handler.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Dual lane assemblies: Fix handling when health states are overwritten. Also add better handling
|
||||||
|
when some devices are permanent faulty and some are only faulty. In that case, only the faulty
|
||||||
|
devices will be restored.
|
||||||
|
- ACS dual lane assembly: Gyro 3 helper mode was assigned to the Gyro 2 mode.
|
||||||
|
|
||||||
|
# [v1.43.1] 2023-04-04
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Generic HK handling: Bug where HKs were generated a lot more often than required. This is the case
|
||||||
|
if a device handler `PERFORM_OPERATION` step is performed more than once per PST cycle.
|
||||||
|
- Syrlinks now goes to `_MODE_TO_ON` when finishing the `doStartUp` transition.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Doubled GS PST interval instead of scheduling everything twice.
|
||||||
|
- Syrlinks now only has one `PERFORM_OPERATION` step, but still has two communication steps.
|
||||||
|
- PCDU components only allow setting `NEEDS_RECOVERY`, `HEALTHY` and `EXTERNAL_CONTROL` health
|
||||||
|
states now. TMP sensor components only allow `HEALTHY` , `EXTERNAL_CONTROL`, `FAULTY` and
|
||||||
|
`PERMANENT_FAULTY`.
|
||||||
|
- TCS controller now does a sanity check on the temperature values: Values below -80 C or above
|
||||||
|
160 C are ignored.
|
||||||
|
|
||||||
|
# [v1.43.0] 2023-04-04
|
||||||
|
|
||||||
|
- q7s-package: v2.4.0
|
||||||
|
- eive-tmtc: v2.21.0
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Version of thermal controller which performs basic control tasks.
|
||||||
|
- PCDU handler can now command switch of the 3V3 stack (switch ID 19)
|
||||||
|
- Set STR dev to OFF in assembly when it is faulty.
|
||||||
|
- STR: Reset data link layer and flush RX for regular commands and before performing special
|
||||||
|
commands to ensure consistent start state
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- PTME was not reset after configuration changes.
|
||||||
|
- GPS health devices: ACS board assembly not reacts to health changes.
|
||||||
|
- STR COM helper: Reset reply size after returning a reply
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Poll threshold configuration of the PTME IP core is now configurable via a parameter command
|
||||||
|
and is set to 0b010 (4 polls) instead of 0b001 (1 poll) per default.
|
||||||
|
- EIVE system fallback and COM system fallback: Perform general subsystem handling first, then
|
||||||
|
event reception, and finally any new transition handling.
|
||||||
|
- IMTQ MGM integration time lowered to 6 ms. This relaxes scheduling requirements a bit.
|
||||||
|
- PCDU handler switcher HK set now has additional 3V3 switcher state HK.
|
||||||
|
|
||||||
|
# [v1.42.0] 2023-04-01
|
||||||
|
|
||||||
|
- eive-tmtc: v2.20.1
|
||||||
|
- q7s-package: v2.3.0
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- SCEX filename updates. Also use T as the file ID / date separator between date and time.
|
||||||
|
- COM TM store and dump handling: Introduce modes for all 4 TM VC/store tasks. The OFF mode can be
|
||||||
|
used to disable ongoing dumps or to prevent writes to the PTME VC. This allows cleaner reset
|
||||||
|
handling of the PTME. All 4 VC/store tasks were attached to the COM mode tree and are commanded
|
||||||
|
as part of the COM sequence as well to ensure consistent state with the CCSDS IP core handler.
|
||||||
|
- Added `PTME_LOCKED` boolean lock which is used to lock the PTME so it is not used by the VC tasks
|
||||||
|
anymore. This lock will be controlled by the CCSDS IP core handler and is locked when the PTME
|
||||||
|
needs to be reset. Examples for this are datarate changes.
|
||||||
|
- Simulate real PCDU in PCDU dummy by remembering commandes switch change and triggering appropriate
|
||||||
|
events. Switch feedback is still immediate.
|
||||||
|
- GomSpace devices are polled with a doubled frequency. This speeds up power switch commanding.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Bugfix for side lane transitions of the dual lane assemblies, which only worked when the
|
||||||
|
assembly was directly commanded.
|
||||||
|
- Syrlinks Handler: Bugfix so transition command is only sent once.
|
||||||
|
- SCEX file name bug: Create file name time stamp with `strftime` similarly to how it's done
|
||||||
|
for the persistent TM store.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added GPS0 and GPS1 health device which are used by the ACS board assembly when deciding whether
|
||||||
|
to change to the other side or to go to dual side directly. Setting the health devices to faulty
|
||||||
|
should also trigger a side switch or a switch to dual mode.
|
||||||
|
|
||||||
|
# [v1.41.0] 2023-03-28
|
||||||
|
|
||||||
|
- eive-tmtc: v2.20.0
|
||||||
|
- q7s-package: v2.2.0
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Proper Faulty/External Control handling for the dual lane assemblies.
|
||||||
|
- ACS board devices: Go to ON mode instead of going to NORMAL mode directly.
|
||||||
|
- SUS device handlers: Go to ON mode on startup instead of NORMAL mode.
|
||||||
|
- Tweaks for the delay handling for the persistent TM stores. This allows pushing the full
|
||||||
|
high datarate when dumping telemetry. The most important and interesting fix is that
|
||||||
|
there needs to be a small delay between the polling of the GPIO. Polling the GPIO
|
||||||
|
without any delay consecutively can lead to scheduling issues.
|
||||||
|
- Bump FSFW for fix of `ControllerBase` class `startTransition` implementation.
|
||||||
|
- Bump FSFW for possible fix of `PowerSwitcherComponent`: Initial mode `MODE_UNDEFINED`.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Enabled periodic hosuekeeping generation for release images.
|
||||||
|
- Project structure (linux and mission folder) is subsystem centric now.
|
||||||
|
|
||||||
|
# [v1.40.0] 2023-03-24
|
||||||
|
|
||||||
|
- eive-tmtc: v2.19.4
|
||||||
|
- q7s-packasge: v2.1.0
|
||||||
|
- Bumped fsfwgen for bugfix: Event translation can deal with duplicate event names now.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- PAPB busy polling now implemented properly with an upper bound of how often the PAPB is allowed
|
||||||
|
to be busy before returning the BUSY returnvalue. Also propagate and check for that case properly.
|
||||||
|
Ideally, this will never be an issue and the PAPB VC interface should never block for a longer
|
||||||
|
period.
|
||||||
|
- The `mekfInvalidCounter` now resets on setting the STR to faulty.
|
||||||
|
- Improve the SD lock handling. The file handling does not need to be locked as it
|
||||||
|
is only handled by one thread.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- The event `MEKF_RECOVERY` will be triggered in case the `MEKF` does manage to recover itself.
|
||||||
|
- The persistent TM stores now have low priorities and behave like background threads now. This
|
||||||
|
should prevent them from blocking or slowing down the system even during dumps
|
||||||
|
(at least in theory).
|
||||||
|
- STR: Fix weird issues on datalink layer data reception which sometimes occur.
|
||||||
|
- Syrlinks FDIR: Fully allow FDIR to do more recoveries. Assembly should take care of preventing
|
||||||
|
the switch to go off.
|
||||||
|
- Allow dual lane assembly side switches.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Rework FSFW OSALs to properly support regular scheduling (NICE priorities) and real-time
|
||||||
|
scheduling.
|
||||||
|
- STR: Move datalink layer to `StrComHandler` completely. DLL is now completely hidden from
|
||||||
|
device handler.
|
||||||
|
- STR: Is now scheduled twice in ACS PST.
|
||||||
|
- `StrHelper` renamed to `StrComHandler`, is now a `DeviceHandlerIF` directly and does not wrap
|
||||||
|
a separate UART COM interface anymore.
|
||||||
|
- TCS: Local pool variables are members now.
|
||||||
|
- Syrlinks: Create dedicated COM helper which uses a ring buffer to parse the Syrlinks datalinklayer
|
||||||
|
and should make communication more reliable even on high CPU loads.
|
||||||
|
- Syrlinks: Two communication cycles per PST.
|
||||||
|
- Fine-tuning of various task priorities.
|
||||||
|
- The CSP router now is scheduled with the `SCHED_RR` policy and the same priority as the PCDU
|
||||||
|
handlers as well.
|
||||||
|
- Change project structure to be more subsystem centric for ACS and COM.
|
||||||
|
|
||||||
|
# [v1.39.1] 2023-03-22
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Bugfix for STR: Some action commands wrongfully declined.
|
||||||
|
- STR: No normal command handling while a special request like an image upload is active.
|
||||||
|
- RS485 data line was not enabled when the transmitter was switched on.
|
||||||
|
|
||||||
|
# [v1.39.0] 2023-03-21
|
||||||
|
|
||||||
|
Requires firmware update for new FPGA design where reset line is routed into the software.
|
||||||
|
2 relevant PRs:
|
||||||
|
- https://egit.irs.uni-stuttgart.de/eive/q7s-vivado/pulls/53
|
||||||
|
- https://egit.irs.uni-stuttgart.de/eive/q7s-vivado/pulls/54
|
||||||
|
|
||||||
|
eive-tmtc: v2.19.3
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added NaN and Inf check for the `MEKF`. If these are detected, the `AcsController` will reset
|
||||||
|
the `MEKF` on its own once. This way, there will not be an event spam and operators will have
|
||||||
|
to look into the reason of wrong outputs. To restore the reset ability, an action command has
|
||||||
|
been added.
|
||||||
|
- Contingency handling for non-working I2C bus bug. Reboot the system if the I2C is not working.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Fixed transition for dual power lane assemblies: When going from dual side submode to single side
|
||||||
|
submode, perform logical commanding first, similarly to when going to OFF mode.
|
||||||
|
- GPS time is only set to valid if at least one satellite is in view.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Bugfixes for STR mode transitions: Booting to mode ON with submode FIRMWARE now works properly.
|
||||||
|
Furthermore, the submode in the NORMAL mode now should be 0 instead of some ON mode submode.
|
||||||
|
- Updated GYR bias values to newest measurements. This also corrects the ADIS values to always
|
||||||
|
consit of just one digit.
|
||||||
|
- The CCSDS IP core handler now exposes a parameter to enable the priority select mode
|
||||||
|
for the PTME core. This mode prioritizes virtual channels with a lower index, so for example
|
||||||
|
the virtual channel (VC0) will have the highest priority, while VC3 will have the lowestg
|
||||||
|
priority. This mode will be enabled by default for now, but can be set via the parameter IF with
|
||||||
|
the unique parameter ID 0. The update of this mode requires a PTME reset. Therefore, it will only
|
||||||
|
be performed when the transmitter is off to avoid weird bugs.
|
||||||
|
- Connect and handle reset line for the PTME core in the software now.
|
||||||
|
- Safe mode controller failure event now only triggers once per minute.
|
||||||
|
|
||||||
|
# [v1.38.0] 2023-03-17
|
||||||
|
|
||||||
|
eive-tmtc: v2.19.2
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- SA deployment file handling: Use exceptionless API.
|
||||||
|
- Fix deadlock in SD card manager constructor: Double lock of preferred SD card lock.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Failure of Safe Mode Ctrl will now trigger an event. As this can only be caused by sensors not
|
||||||
|
being in the correct mode, the assemblies should take care that this will never happen and no
|
||||||
|
additional FDIR is needed.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Telemetry relevant datasets for the RWs are now set invalid and partially reset on shotdown.
|
||||||
|
- I2C PST now has a polling frequency of 0.4 seconds instead of 0.2 seconds.
|
||||||
|
- GS PST now has a polling frequency of 0.5 seconds instead of 1 second.
|
||||||
|
- Bump FSFW: merged upstream.
|
||||||
|
- Move BPX battery scheduling to ACS PST to avoid clashes with IMTQ scheduling / polling
|
||||||
|
|
||||||
|
# [v1.37.2] 2023-03-14
|
||||||
|
|
||||||
|
- Changed `PoolManager` bugfix implementation in the FSFW.
|
||||||
|
- Some tweaks for IPC and TM store configuration
|
||||||
|
|
||||||
|
# [v1.37.1] 2023-03-14
|
||||||
|
|
||||||
|
This version works on the EM as well.
|
||||||
|
|
||||||
|
eive-tmtc: v2.19.1
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added `EXECUTE_SHELL_CMD` action command for `CoreController` to execute arbitrary Linux commands.
|
||||||
|
- Added some missing PLOC commands.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/462
|
||||||
|
- Add `PcduHandlerDummy` component.
|
||||||
|
- Added parameter for timeout until `MEKF_INVALID_MODE_VIOLATION` event is triggered.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Pointing control of the `AcsController` was still expecting submodes instead of modes.
|
||||||
|
- Limitation of RW speeds was done before converting them to the correct unit scale.
|
||||||
|
- The Syrlinks task now has a proper name instead of `MAIN_SPI`.
|
||||||
|
- Make whole EIVE system initial transition work for the EM. This was also made possible by
|
||||||
|
always scheduling most EIVE components instead of tying the scheduling to preprocessor defines.
|
||||||
|
- Store more TCP und UDP packets.
|
||||||
|
- Bump fsfw for small tweak in local datapool manager: Re-enable or re-disabling dataset
|
||||||
|
generation will not fail anymore.
|
||||||
|
- Bump FSFW to simplify HK helpers: Was previously buggy and did not allow to use
|
||||||
|
minmum sampling frequency. Now both diagnostics and HK can use minimum
|
||||||
|
sampling frequency for requesting HK
|
||||||
|
- Bump FSFW to allow the TC/TM/IPC pools to spill to higher pools/pool pages.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Set `OBSW_ADD_TCS_CTRL` to 1. Always add TCS controller now for both EM and FM.
|
||||||
|
- generators module: Bump `fsfwgen` dependency to v0.3.1. The returnvalue CSV files are now sorted.
|
||||||
|
- generators module: Always generate subsystem ID CSV files now.
|
||||||
|
- The COM subsystem is now not commanded by the EIVE system anymore. Instead,
|
||||||
|
a separate RX_ONLY mode command will be sent at OBSW boot. After that,
|
||||||
|
commanding is done autonomously by the COM subsystem internally or by the operator. This prevents
|
||||||
|
the transmitter from going off during fallbacks to the SAFE mode, which might not always be
|
||||||
|
desired.
|
||||||
|
- Initialize switch states to a special `SWITCH_STATE_UNKNOWN` (2) variable. Return
|
||||||
|
`PowerSwitchIF::SWITCH_UNKNOWN` in switch state getter if this is the state.
|
||||||
|
- Wait 1 second before commanding SAFE mode. This ensures or at least increases the chance that
|
||||||
|
the switch states were initialized.
|
||||||
|
- Dual Lane Assemblies: The returnvalues of the dual lane power state machine FSM are not ignored
|
||||||
|
anymore.
|
||||||
|
|
||||||
|
# [v1.37.0] 2023-03-11
|
||||||
|
|
||||||
|
eive-tmtc: v2.18.1
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- `SensorProcessing` now includes an FDIR for GPS altitude. If the measured GPS altitude is out
|
||||||
|
of bounds of the range defined in the `AcsParameters`, the altitude defaults to an altitude
|
||||||
|
set in the `AcsParameters`.
|
||||||
|
- `AcsController` will now never command a RW speed larger than the maximum allowed speed.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- `PAPB_EMPTY_SIGNAL_VC1` GPIO was not set up properly.
|
||||||
|
- Fix for heater names: HPA heater (index 7) is now the Syrlinks heater.
|
||||||
|
- `AcsParameters` setter were previously all for scalar parameters. Now vector and matrix
|
||||||
|
parameters use their respective setters.
|
||||||
|
- Several `AcsController` components had their own implementation of `AcsParameters`. This resulted
|
||||||
|
in those parameters not being updated, while the actual ones were updated. All instances of
|
||||||
|
`AcsParameters` not belonging to `AcsController` are eiter removed or replaced by pointer
|
||||||
|
instances.
|
||||||
|
- Instead of updating the `gsTargetModeControllerParameters`, the `targetModeControllerParameters`
|
||||||
|
were updated.
|
||||||
|
- Instead of updating the `idleModeControllerParameters`, the `targetModeControllerParameters`
|
||||||
|
were updated.
|
||||||
|
- Fixed Idle Mode Controller never calling `ptgLaw` and therefore never calculating control
|
||||||
|
values.
|
||||||
|
- Fixed wrong check on wether file used for persistant boolean flag on successful still existed.
|
||||||
|
- Scaling of MTQ Cmds now scales the current values to command with the current values and not
|
||||||
|
the values of the last step, which would result in undefined behaviour.
|
||||||
|
- Solved naming collision between file used for solar array deployment and confirmation for
|
||||||
|
ACS for solar array deployment.
|
||||||
|
- Fixed that scaling of RW torque would result in a zero vector unless the maximum value was exceeded.
|
||||||
|
- Bias for the GYR data was substracted within the wrong rf (sensor rf vs body rf).
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Refactored TM pipeline to optimize usage of the PTME and communication downlink bandwidth.
|
||||||
|
This was done by moving the dumping of TMs to the VCs into separate threads with permanent loops.
|
||||||
|
These threads are then able to process high TM loads on demand. The PUS TM funnel will route
|
||||||
|
PUS packets to the approrpiate persisten TM stores and then demultiplex the TM to all registered
|
||||||
|
TM destinations as before.
|
||||||
|
- Service 5 now handles 40 events per cycle instead of 15
|
||||||
|
- Remove periodic SD card check. The file system is not mounted read-only anymore when using an
|
||||||
|
ext4 filesystem
|
||||||
|
- The `detumbleCounter` now does not get hard reset anymore, if the critical rate does not get
|
||||||
|
violated anymore. Instead it is incrementally reset.
|
||||||
|
- The RW antistiction now only takes the RW speeds in account.
|
||||||
|
- ACS CTRL transition to DETUBMLE is now done in CTRL internally. No
|
||||||
|
system level handling necessary anymore.
|
||||||
|
- More fixes and improvements for SD card handling. Extend SD card setup in core controller to
|
||||||
|
create full initial state for SD card manager are core controller as early as possible, turn
|
||||||
|
execution of setup file update blocking. This might solve the issue with the SD card manager
|
||||||
|
sometimes blocking for a long time.
|
||||||
|
- Request raw MTM measurement twice for IMTQ, might reduce number of times measurement could not
|
||||||
|
be retrieved.
|
||||||
|
- Event manager and event service have larger queues now: 45 -> 120 for Service 5, 80 -> 120 for
|
||||||
|
event manager
|
||||||
|
- ACS mode changes: The ACS CTRL submodes are now modes. DETUBMLE is now submode of SAFE mode.
|
||||||
|
- EIVE system now tracks the mode of the ACS subsyste in SAFE mode.
|
||||||
|
|
||||||
|
# [v1.36.0] 2023-03-08
|
||||||
|
|
||||||
|
eive-tmtc: v2.17.2
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Star Tracker Assembly
|
||||||
|
- New `REBOOT_COUNTER` and `INDIVIDUAL_BOOT_COUNTS` events. The first contains the total boot count
|
||||||
|
as a u64, the second one contains the individual boot counts as 4 u16. Add new core controller
|
||||||
|
action command `ANNOUNCE_BOOT_COUNTS` with action ID 3 which triggers both events. These events
|
||||||
|
will also be triggered on each reboot.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Persistent TM stores will now create new files on each reboot.
|
||||||
|
- Fast ACS subsystem commanding: Command SUS board consecutively with other devices now
|
||||||
|
- Star Tracker: Use ground confguration for EM and flight config for FM by default.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Command TCS controller off first for TCS subsystem transition to off.
|
||||||
|
- Health handling for TCS board assembly
|
||||||
|
- Mode fallback from IDLE mode to SAFE mode due to ACS errors/events now works properly for
|
||||||
|
the ACS subsystem
|
||||||
|
- Bugfix in IDLE transition for system.
|
||||||
|
- `std::filesystem` API usages: Avoid exceptions by using variants which return an error code
|
||||||
|
instead of throwing exceptions.
|
||||||
|
- GPS fix loss was not reported if mode is unset.
|
||||||
|
- Star Tracker: OFF to NORMAL transition now posssible. Requires FSFW bump which sets
|
||||||
|
transition source modes properly for those transitions.
|
||||||
|
FSFW PR: https://egit.irs.uni-stuttgart.de/eive/fsfw/pulls/131
|
||||||
|
- Star Tracker JSON initialization is now done during object initization instead of redoing it
|
||||||
|
when building a command. This avoids missed deadlines issues in the ACS PST.
|
||||||
|
- Allow arbitrary submodes for dual lane boards to avoid FDIR reactions of subsystem components.
|
||||||
|
Bump FSFW to allow this.
|
||||||
|
- PUS 15 was not scheduled
|
||||||
|
- Transmitter timeout set to 2 minutes instead of 15 minutes. This will prevent to discharge the
|
||||||
|
battery in case the syrlinks starts transmitting due to detection of unintentional bitlock. This
|
||||||
|
happened e.g. on ground when the uplink to the flying latop was established.
|
||||||
|
- ACS system components are now always scheduled (EM specific)
|
||||||
|
|
||||||
|
# [v1.35.1] 2023-03-04
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- ACS Board Assembly FDIR: Prevent permanent SAFE mode fallbacks by introducing special health
|
||||||
|
handling.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/418/files
|
||||||
|
- Watchdog fixes
|
||||||
|
- IMTQ timing fixes
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Add IMTQ assembly
|
||||||
|
|
||||||
|
# [v1.35.0] 2023-03-04
|
||||||
|
|
||||||
|
eive-tmtc: v2.16.4
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Improved the OBSW watchdog by adding a watch functionality. The watch functionality is optional
|
||||||
|
and has to be enabled specifically by the application being watched by the watchdog when
|
||||||
|
starting the watchdog. If the watch functionality is enabled and the OBSW has not pinged
|
||||||
|
the watchdog via the FIFO for 2 minutes, the watchdog will restart the OBSW service via systemd.
|
||||||
|
The primary OBSW will only activate the watch functionality if it is the OBSW inside the
|
||||||
|
`/usr/bin` directory. This allows debugging the system by leaving flashed or manually copied
|
||||||
|
debugging images 2 minutes to start the watchdog without the watch functionality.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Bumped FSFW: `Countdown` and `Stopwatch` use new monotonic clock API now.
|
||||||
|
- IMTQ: Various fixes, most notably missing buffer time after starting MGM measurement
|
||||||
|
and corrections for actuator commanding.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/430
|
||||||
|
|
||||||
|
# [v1.34.0] 2023-03-03
|
||||||
|
|
||||||
|
eive-tmtc: v2.16.3
|
||||||
|
|
||||||
|
This might include the fix for the race condition where CPU usage jumped to 200 %. The race
|
||||||
|
condition was traced to the `Countdown` class, more specifically to the `getUptime` function where
|
||||||
|
the `/proc/uptime` file is read.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- The SD card prefix is now set earlier inside the `CoreController` constructor
|
||||||
|
- The watchdog handling was moved outside the `CoreController` into the main loop.
|
||||||
|
- Moved polling of all SPI parts to the same PST.
|
||||||
|
- Allow quicker transition for the EIVE system component by allowing consecutive TCS and ACS
|
||||||
|
component commanding again.
|
||||||
|
- Changed a lot of lock guards to use timeouts
|
||||||
|
- Queue sizes of TCP/UDP servers increased from 20 to 50
|
||||||
|
- Significantly simplified and improved lock guard handling in TCS and ACS board polling
|
||||||
|
tasks.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- IMTQ: Sets were filled with wrong data, e.g. Raw MTM was filled with calibrated MTM measurements.
|
||||||
|
- Set RM3100 dataset to valid.
|
||||||
|
- Fixed units in calculation of ACS control laws safe and detumble.
|
||||||
|
- Bump FSFW for change in Countdown: Use system clock instead of reading uptime from file
|
||||||
|
to prevent possible race condition.
|
||||||
|
- GPS: No fix considered a fault now after 30 minutes instead of 5 hours.
|
||||||
|
- SUS Assembly FDIR: Prevent permanent SAFE mode fallbacks by introducing special health
|
||||||
|
handling.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/418/files
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added Syrlinks Assembly object to allow recovery handling and to fix faulty FDIR behaviour.
|
||||||
|
|
||||||
|
# [v1.33.0] 2023-03-01
|
||||||
|
|
||||||
|
eive-tmtc: v2.16.2
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Move ACS board polling to separate worker thread.
|
||||||
|
- Move SUS board polling to separate worker thread.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Linux GPS handler now checks the individual `*_SET` flags when analysing the `gpsd` struct.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/400
|
||||||
|
|
||||||
|
# [v1.32.0] 2023-02-24
|
||||||
|
|
||||||
|
eive-tmtc: v2.16.1
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- ADIS1650X: Added missing MDL_RANG pool entry for configuration set
|
||||||
|
- Bumped FSFW for bugfix in health service: No execution complete for targeted health announce
|
||||||
|
command.
|
||||||
|
- Removed matrix determinant calculation as part of the `MEKF`, which would take about
|
||||||
|
300ms of runtime
|
||||||
|
- Resetting the `MEKF` now also actually resets its stored state
|
||||||
|
- Bumped FSFW for bugfix in destination handler: Better error handling and able to process
|
||||||
|
destination folder path.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Added basic persistent TM store for PUS telemetry and basic interface to dump and delete
|
||||||
|
telemetry. Implementation is based on a timed rotating files, with the addition that files
|
||||||
|
might be generated more often if the maximum file size of 8192 bytes is exceeded.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/320/files
|
||||||
|
- Commented out commanding of actuators as part of the `AcsController`
|
||||||
|
- Collection sets of the `AcsController` now get updated before running the actual ACS
|
||||||
|
algorithm
|
||||||
|
- `GpsController` now always gets scheduled
|
||||||
|
- The `CoreController` now initializes the initial clock from the time file as early as possible
|
||||||
|
(in the constructor) if possible, which should usually be the case.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added basic persistent TM store for PUS telemetry and basic interface to dump and delete
|
||||||
|
telemetry.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/320/files
|
||||||
|
- `ExecutableComIfDummy` class to have a dummy for classes like the RTD polling class.
|
||||||
|
- Added `AcsController` action command to confirm solar array deployment, which then deletes
|
||||||
|
two files
|
||||||
|
- Added `AcsController` action command to reset `MEKF`
|
||||||
|
- `GpsCtrlDummy` now initializes the `gpsSet`
|
||||||
|
- `RwDummy` now initializes with a non faulty state
|
||||||
|
|
||||||
|
|
||||||
|
# [v1.31.1] 2023-02-23
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- ADIS1650X configuration set was empty because the local pool variables were not registered.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/402
|
||||||
|
- ACS Controller: Correction for size of MEKF dataset and some optimization and fixes
|
||||||
|
for actuator control which lead to a crash.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/403
|
||||||
|
|
||||||
|
# [v1.31.0] 2023-02-23
|
||||||
|
|
||||||
|
eive-tmtc: v2.16.0
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Usage of floats as iterators and using them to calculate a uint8_t index in `SusConverter`
|
||||||
|
- Removed unused variables in the `AcsController`
|
||||||
|
- Remove shadowing variables inside ACS assembly classes.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/385
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
COM PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/364
|
||||||
|
|
||||||
|
* Moved transmitter timer and handling of carrier and bitlock event from CCSDS handler to COM
|
||||||
|
subsystem
|
||||||
|
* Added parameter command to be able to change the transmitter timeout
|
||||||
|
* Solves [#362](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/362)
|
||||||
|
* Solves [#360](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/360)
|
||||||
|
* Solves [#361](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/361)
|
||||||
|
* Solves [#386](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/386)
|
||||||
|
- All `targetQuat` functions in `Guidance` now return the target quaternion (target
|
||||||
|
in ECI frame), which is passed on to `CtrlValData`.
|
||||||
|
- Moved polling sequence table definitions and source code to `mission/core` folder.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/395
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- `MEKF` now returns an unique returnvalue depending on why the function terminates. These
|
||||||
|
returnvalues are used in the `AcsController` to determine on how to procede with its
|
||||||
|
perform functions. In case the `MEKF` did terminate before estimating the quaternion
|
||||||
|
and rotational rate, an info event will be triggered. Another info event can only be
|
||||||
|
triggered after the `MEKF` has run successfully again. If the `AcsController` tries to
|
||||||
|
perform any pointing mode and the `MEKF` fails, the `performPointingCtrl` function will
|
||||||
|
set the RWs to the last RW speeds and set a zero dipole vector. If the `MEKF` does not
|
||||||
|
recover within 5 cycles (2 mins) the `AcsController` triggers another event, resulting in
|
||||||
|
the `AcsSubsystem` being commanded to `SAFE`.
|
||||||
|
- `MekfData` now includes `mekfStatus`
|
||||||
|
- `CtrlValData` now includes `tgtRotRate`
|
||||||
|
|
||||||
|
# [v1.30.0] 2023-02-22
|
||||||
|
|
||||||
|
eive-tmtc: v2.14.0
|
||||||
|
|
||||||
|
Event IDs for PDEC handler have changed in a breaking manner.
|
||||||
|
|
||||||
|
## Added and Fixed
|
||||||
|
|
||||||
|
- PDEC: Added basic FDIR to limit the number of allowed TC interrupts and to allow complete task
|
||||||
|
lockups in the case an IRQ is immediately re-raised by the PDEC module. This is done by only
|
||||||
|
allowing a certain number of handled IRQs (whether they yield a valid TC or not) during
|
||||||
|
time windows of one second. Right now, 800 IRQs/TCs are allowed per time window.
|
||||||
|
This time window is reset if a TC reception timeout after 500ms occurs. TBD whether the maximum
|
||||||
|
allowed number will be a configurable parameter. If the number of occured IRQs is exceeded,
|
||||||
|
an event is triggered and the task is delayed for 400 ms.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/393
|
||||||
|
|
||||||
|
# [v1.29.1] 2023-02-21
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Limit number of handled messages for core TM handlers:
|
||||||
|
- https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/391
|
||||||
|
- https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/390
|
||||||
|
- https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/389
|
||||||
|
- HeaterHandler better handling for faulty message reception
|
||||||
|
Issue: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/388
|
||||||
|
- Disable stopwatch in MAX31865 polling task
|
||||||
|
|
||||||
|
# [v1.29.0] 2023-02-21
|
||||||
|
|
||||||
|
eive-tmtc: v2.13.0
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Refactored IMTQ handlers to also perform low level I2C communication tasks in separate thread.
|
||||||
|
This avoids the various delays needed for I2C communication with that device inside the ACS PST.
|
||||||
|
(e.g. 1 ms delay between each transfer, or 10 ms integration delay for MGM measurements).
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Added new heater info set for the TCS controller. This set contains the heater switch states
|
||||||
|
and the current draw.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/351
|
||||||
|
- The HeaterHandler now exposes a mode which reflects whether the heater power
|
||||||
|
is on or off. It also triggers mode events for its heater children objects
|
||||||
|
which show whether the specific heaters are on or off. The heater handler
|
||||||
|
will be part of the TCS tree.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/351
|
||||||
|
|
||||||
|
# [v1.28.1] 2023-02-21
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Patch version which compiles for EM
|
||||||
|
- CFDP Funnel bugfix: CCSDS wrapping was buggy and works properly now.
|
||||||
|
- PDEC: Some adaptions to prevent task lockups on invalid FAR states.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/393
|
||||||
|
- CMakeLists.txt fix which broke CI/CD builds when server could not retrieve full git SHA.
|
||||||
|
- Possible regression in the MAX31865 polling task: Using a `ManualCsLockGuard` for reconfiguring
|
||||||
|
and then polling the sensor is problematic, invalid sensor values will be read.
|
||||||
|
CS probably needs to be de-asserted or some other HW/SPI specific issue. Letting the SPI ComIF
|
||||||
|
do the locking does the job.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Add `-Wshadow=local` shadowing warnings and fixed all of them
|
||||||
|
- Updated generated CSV files: Support for skip directive and explicit
|
||||||
|
"No description" info string
|
||||||
|
- The polling threads for actuator polling now have a slightly higher priority than the ACS PST
|
||||||
|
to ensure timing requirements are met.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- git post checkout hook which initializes and updates the submodules
|
||||||
|
automatically.
|
||||||
|
|
||||||
|
# [v1.28.0] 2023-02-17
|
||||||
|
|
||||||
|
eive-tmtc: v2.12.7
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- In case the ACS Controller does recognize more than one RW to be invalid and therefore not
|
||||||
|
available, it does not perform pointing control but aborts shortly after `sensorProcessing`. If the
|
||||||
|
problem persits for 5 ACS cycles, the `MULTIPLE_RW_INVALID` event is triggered, which invokes the
|
||||||
|
transition of the `AcsSubsystem` to safe mode.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Igrf13 model vector now outputs as uT instead of nT
|
||||||
|
- Changed timings for `AcsPst`, more time for sun sensors.
|
||||||
|
- Added values for MGM sensor fusion
|
||||||
|
- Refactored RW Software: Polling runs in separate thread, all RWs are now polled in under 60 ms.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/381
|
||||||
|
- Bumped FSFW to allow initializing child modes in `SubsystemBase` derived objects.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Fixed values for GYR sensor fusion
|
||||||
|
- Fixed speed types for `rwHandlingParameter`
|
||||||
|
- Pseudo inverse used for allocating torque to RWs and RW antistiction now actually consider the
|
||||||
|
state of the RWs
|
||||||
|
|
||||||
|
# [v1.27.2] 2023-02-14
|
||||||
|
|
||||||
|
Reaction Wheel handling was determined to be (quasi) broken and needs to be fixed in future release
|
||||||
|
to be usable by ACS controller.
|
||||||
|
|
||||||
|
eive-tmtc: v2.12.6
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- Function for the ACS controller to command MTQ and RWs called by all subroutines
|
||||||
|
- RwHandler now handles commanding of RW speeds via RwSpeedActuationSet
|
||||||
|
- Tracing supports which allows checking whether threads are running as usual.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Remove 2 TCS threads.
|
||||||
|
- Move low level polling into ACS PST, move high level device handlers into TCS system task.
|
||||||
|
- ActCmds now returns command vectors as integers as required by the actuators
|
||||||
|
and scales them to the appropriate range
|
||||||
|
- All RwHandler are now polled five times per ACS cycle
|
||||||
|
- Remove 2 TCS threads. Move low level polling into ACS PST, move high level device handlers into
|
||||||
|
TCS system task.
|
||||||
|
- Further reduce number of threads:
|
||||||
|
1. Remove PUS low priority task, move assigned threads to the generic system task
|
||||||
|
2. Group events and verification tasks into PUS high priority task
|
||||||
|
3. Group all other components into PUS medium priority task
|
||||||
|
4. Add SCEX device handler to PL task, remove dedicated thread
|
||||||
|
|
||||||
|
## Removed
|
||||||
|
|
||||||
|
- lwgps dependency not compiled anymore, is not used
|
||||||
|
|
||||||
# [v1.27.1] 2023-02-13
|
# [v1.27.1] 2023-02-13
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
@ -82,6 +952,7 @@ eive-tmtc: v2.12.2
|
|||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
- Reworked dummy handling for the TCS controller.
|
- Reworked dummy handling for the TCS controller.
|
||||||
|
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/325
|
||||||
- Generator scripts now generate files for hosted and for Q7S build.
|
- Generator scripts now generate files for hosted and for Q7S build.
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
@ -9,9 +9,9 @@
|
|||||||
# ##############################################################################
|
# ##############################################################################
|
||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
|
||||||
set(OBSW_VERSION_MAJOR 1)
|
set(OBSW_VERSION_MAJOR 2)
|
||||||
set(OBSW_VERSION_MINOR 27)
|
set(OBSW_VERSION_MINOR 0)
|
||||||
set(OBSW_VERSION_REVISION 1)
|
set(OBSW_VERSION_REVISION 3)
|
||||||
|
|
||||||
# set(CMAKE_VERBOSE TRUE)
|
# set(CMAKE_VERBOSE TRUE)
|
||||||
|
|
||||||
@ -71,11 +71,13 @@ if(EIVE_Q7S_EM)
|
|||||||
1
|
1
|
||||||
CACHE STRING "Q7S EM configuration")
|
CACHE STRING "Q7S EM configuration")
|
||||||
set(INIT_VAL 0)
|
set(INIT_VAL 0)
|
||||||
|
set(OBSW_STAR_TRACKER_GROUND_CONFIG 1)
|
||||||
else()
|
else()
|
||||||
set(OBSW_Q7S_EM
|
set(OBSW_Q7S_EM
|
||||||
0
|
0
|
||||||
CACHE STRING "Q7S EM configuration")
|
CACHE STRING "Q7S EM configuration")
|
||||||
set(INIT_VAL 1)
|
set(INIT_VAL 1)
|
||||||
|
set(OBSW_STAR_TRACKER_GROUND_CONFIG 0)
|
||||||
endif()
|
endif()
|
||||||
set(OBSW_ADD_MGT
|
set(OBSW_ADD_MGT
|
||||||
${INIT_VAL}
|
${INIT_VAL}
|
||||||
@ -92,6 +94,9 @@ set(OBSW_ADD_SUN_SENSORS
|
|||||||
set(OBSW_ADD_SUS_BOARD_ASS
|
set(OBSW_ADD_SUS_BOARD_ASS
|
||||||
${INIT_VAL}
|
${INIT_VAL}
|
||||||
CACHE STRING "Add sun sensor board assembly")
|
CACHE STRING "Add sun sensor board assembly")
|
||||||
|
set(OBSW_ADD_THERMAL_TEMP_INSERTER
|
||||||
|
${OBSW_Q7S_EM}
|
||||||
|
CACHE STRING "Add thermal sensor temperature inserter")
|
||||||
set(OBSW_ADD_ACS_BOARD
|
set(OBSW_ADD_ACS_BOARD
|
||||||
${INIT_VAL}
|
${INIT_VAL}
|
||||||
CACHE STRING "Add ACS board module")
|
CACHE STRING "Add ACS board module")
|
||||||
@ -108,10 +113,10 @@ set(OBSW_TC_FROM_PDEC
|
|||||||
1
|
1
|
||||||
CACHE STRING "Poll telecommand from PDEC IP core")
|
CACHE STRING "Poll telecommand from PDEC IP core")
|
||||||
set(OBSW_ADD_TCS_CTRL
|
set(OBSW_ADD_TCS_CTRL
|
||||||
${INIT_VAL}
|
1
|
||||||
CACHE STRING "Add TCS controllers")
|
CACHE STRING "Add TCS controllers")
|
||||||
set(OBSW_ADD_HEATERS
|
set(OBSW_ADD_HEATERS
|
||||||
${INIT_VAL}
|
1
|
||||||
CACHE STRING "Add TCS heaters")
|
CACHE STRING "Add TCS heaters")
|
||||||
set(OBSW_ADD_PLOC_SUPERVISOR
|
set(OBSW_ADD_PLOC_SUPERVISOR
|
||||||
${INIT_VAL}
|
${INIT_VAL}
|
||||||
@ -175,25 +180,11 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
|
|||||||
if(LIST_LEN GREATER 4)
|
if(LIST_LEN GREATER 4)
|
||||||
list(GET GIT_INFO 4 OBSW_VERSION_CST_GIT_SHA1)
|
list(GET GIT_INFO 4 OBSW_VERSION_CST_GIT_SHA1)
|
||||||
endif()
|
endif()
|
||||||
if(NOT OBSW_VERSION_MAJOR)
|
|
||||||
set(OBSW_VERSION_MAJOR ${OBSW_VERSION_MAJOR_IF_GIT_FAILS})
|
|
||||||
endif()
|
|
||||||
if(NOT OBSW_VERSION_MINOR)
|
|
||||||
set(FSFW_SUBVERSION ${OBSW_VERSION_MINOR_IF_GIT_FAILS})
|
|
||||||
endif()
|
|
||||||
if(NOT OBSW_VERSION_REVISION)
|
|
||||||
set(FSFW_REVISION ${OBSW_VERSION_REVISION_IF_GIT_FAILS})
|
|
||||||
endif()
|
|
||||||
set(GIT_VER_HANDLING_OK TRUE)
|
set(GIT_VER_HANDLING_OK TRUE)
|
||||||
else()
|
else()
|
||||||
set(GIT_VER_HANDLING_OK FALSE)
|
set(GIT_VER_HANDLING_OK FALSE)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
if(NOT GIT_VER_HANDLING_OK)
|
|
||||||
set(OBSW_VERSION_MAJOR ${OBSW_VERSION_MAJOR_IF_GIT_FAILS})
|
|
||||||
set(OBSW_VERSION_MINOR ${OBSW_VERSION_MINOR_IF_GIT_FAILS})
|
|
||||||
set(OBSW_VERSION_REVISION ${OBSW_VERSION_REVISION_IF_GIT_FAILS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set names and variables
|
# Set names and variables
|
||||||
set(OBSW_NAME ${CMAKE_PROJECT_NAME})
|
set(OBSW_NAME ${CMAKE_PROJECT_NAME})
|
||||||
@ -232,11 +223,12 @@ set(LIB_EIVE_MISSION_PATH mission)
|
|||||||
set(LIB_ETL_PATH ${THIRD_PARTY_FOLDER}/etl)
|
set(LIB_ETL_PATH ${THIRD_PARTY_FOLDER}/etl)
|
||||||
set(LIB_CATCH2_PATH ${THIRD_PARTY_FOLDER}/Catch2)
|
set(LIB_CATCH2_PATH ${THIRD_PARTY_FOLDER}/Catch2)
|
||||||
set(LIB_LWGPS_PATH ${THIRD_PARTY_FOLDER}/lwgps)
|
set(LIB_LWGPS_PATH ${THIRD_PARTY_FOLDER}/lwgps)
|
||||||
set(LIB_ARCSEC_PATH ${THIRD_PARTY_FOLDER}/arcsec_star_tracker)
|
set(LIB_ARCSEC_PATH ${THIRD_PARTY_FOLDER}/sagittactl)
|
||||||
set(LIB_JSON_PATH ${THIRD_PARTY_FOLDER}/json)
|
set(LIB_JSON_PATH ${THIRD_PARTY_FOLDER}/json)
|
||||||
|
|
||||||
set(FSFW_WARNING_SHADOW_LOCAL_GCC OFF)
|
set(FSFW_WARNING_SHADOW_LOCAL_GCC OFF)
|
||||||
set(EIVE_ADD_LINUX_FILES OFF)
|
set(EIVE_ADD_LINUX_FILES OFF)
|
||||||
|
set(FSFW_ADD_TMSTORAGE ON)
|
||||||
|
|
||||||
# Analyse different OS and architecture/target options, determine BSP_PATH,
|
# Analyse different OS and architecture/target options, determine BSP_PATH,
|
||||||
# display information about compiler etc.
|
# display information about compiler etc.
|
||||||
@ -308,8 +300,12 @@ include(BuildType)
|
|||||||
set_build_type()
|
set_build_type()
|
||||||
|
|
||||||
set(FSFW_DEBUG_INFO 0)
|
set(FSFW_DEBUG_INFO 0)
|
||||||
|
set(OBSW_ENABLE_PERIODIC_HK 1)
|
||||||
|
set(Q7S_CHECK_FOR_ALREADY_RUNNING_IMG 0)
|
||||||
if(RELEASE_BUILD MATCHES 0)
|
if(RELEASE_BUILD MATCHES 0)
|
||||||
set(FSFW_DEBUG_INFO 1)
|
set(FSFW_DEBUG_INFO 1)
|
||||||
|
set(OBSW_ENABLE_PERIODIC_HK 0)
|
||||||
|
set(Q7S_CHECK_FOR_ALREADY_RUNNING_IMG 1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Configuration files
|
# Configuration files
|
||||||
@ -358,6 +354,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|||||||
"-Wimplicit-fallthrough=1"
|
"-Wimplicit-fallthrough=1"
|
||||||
"-Wno-unused-parameter"
|
"-Wno-unused-parameter"
|
||||||
"-Wno-psabi"
|
"-Wno-psabi"
|
||||||
|
"-Wshadow=local"
|
||||||
"-Wduplicated-cond" # check for duplicate conditions
|
"-Wduplicated-cond" # check for duplicate conditions
|
||||||
"-Wduplicated-branches" # check for duplicate branches
|
"-Wduplicated-branches" # check for duplicate branches
|
||||||
"-Wlogical-op" # Search for bitwise operations instead of logical
|
"-Wlogical-op" # Search for bitwise operations instead of logical
|
||||||
@ -415,7 +412,6 @@ add_subdirectory(thirdparty)
|
|||||||
if(EIVE_ADD_LINUX_FILES)
|
if(EIVE_ADD_LINUX_FILES)
|
||||||
if(TGT_BSP MATCHES "arm/q7s")
|
if(TGT_BSP MATCHES "arm/q7s")
|
||||||
add_subdirectory(${LIB_GOMSPACE_PATH})
|
add_subdirectory(${LIB_GOMSPACE_PATH})
|
||||||
add_subdirectory(${LIB_ARCSEC_PATH})
|
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(${LINUX_PATH})
|
add_subdirectory(${LINUX_PATH})
|
||||||
endif()
|
endif()
|
||||||
@ -424,7 +420,6 @@ add_subdirectory(${BSP_PATH})
|
|||||||
add_subdirectory(${COMMON_PATH})
|
add_subdirectory(${COMMON_PATH})
|
||||||
add_subdirectory(${DUMMY_PATH})
|
add_subdirectory(${DUMMY_PATH})
|
||||||
|
|
||||||
add_subdirectory(${LIB_LWGPS_PATH})
|
|
||||||
add_subdirectory(${FSFW_PATH})
|
add_subdirectory(${FSFW_PATH})
|
||||||
add_subdirectory(${LIB_EIVE_MISSION_PATH})
|
add_subdirectory(${LIB_EIVE_MISSION_PATH})
|
||||||
add_subdirectory(${TEST_PATH})
|
add_subdirectory(${TEST_PATH})
|
||||||
@ -491,10 +486,11 @@ endif()
|
|||||||
# ##############################################################################
|
# ##############################################################################
|
||||||
|
|
||||||
# Add libraries
|
# Add libraries
|
||||||
target_link_libraries(${LIB_EIVE_MISSION}
|
target_link_libraries(${LIB_EIVE_MISSION} PUBLIC ${LIB_FSFW_NAME}
|
||||||
PUBLIC ${LIB_FSFW_NAME} ${LIB_LWGPS_NAME} ${LIB_OS_NAME})
|
${LIB_OS_NAME})
|
||||||
|
|
||||||
target_link_libraries(${LIB_DUMMIES} PUBLIC ${LIB_FSFW_NAME} ${LIB_JSON_NAME})
|
target_link_libraries(${LIB_DUMMIES} PUBLIC ${LIB_EIVE_MISSION}
|
||||||
|
${LIB_FSFW_NAME} ${LIB_JSON_NAME})
|
||||||
|
|
||||||
target_link_libraries(${OBSW_NAME} PRIVATE ${LIB_EIVE_MISSION} ${LIB_DUMMIES})
|
target_link_libraries(${OBSW_NAME} PRIVATE ${LIB_EIVE_MISSION} ${LIB_DUMMIES})
|
||||||
|
|
||||||
|
17
README.md
17
README.md
@ -18,6 +18,7 @@
|
|||||||
11. [Q7S OBC](#q7s)
|
11. [Q7S OBC](#q7s)
|
||||||
12. [Static Code Analysis](#static-code-analysis)
|
12. [Static Code Analysis](#static-code-analysis)
|
||||||
13. [Eclipse](#eclipse)
|
13. [Eclipse](#eclipse)
|
||||||
|
14. [CLion](#clion)
|
||||||
14. [Running the OBSW on a Raspberry Pi](#rpi)
|
14. [Running the OBSW on a Raspberry Pi](#rpi)
|
||||||
15. [Running OBSW on EGSE](#egse)
|
15. [Running OBSW on EGSE](#egse)
|
||||||
16. [Manually preparing sysroots to compile gpsd](#gpsd)
|
16. [Manually preparing sysroots to compile gpsd](#gpsd)
|
||||||
@ -1229,6 +1230,22 @@ Finally, you can convert the generated `.xml` file to HTML with the following co
|
|||||||
cppcheck-htmlreport --file=report.xml --report-dir=cppcheck --source-dir=..
|
cppcheck-htmlreport --file=report.xml --report-dir=cppcheck --source-dir=..
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# <a id="CLion"></a> CLion
|
||||||
|
|
||||||
|
CLion is the recommended IDE for the development of the hosted version of EIVE.
|
||||||
|
You can also set up CLion for cross-compilation of the primary OBSW.
|
||||||
|
|
||||||
|
There is a shared `.idea/cmake.xml` file to get started with this.
|
||||||
|
To make cross-compilation work, two special environment variables
|
||||||
|
need to be set:
|
||||||
|
|
||||||
|
- `ZYNQ_7020_ROOTFS` pointing to the root filesystem
|
||||||
|
- `CROSS_COMPILE` pointing to the the full path of the cross-compiler
|
||||||
|
without the specific tool suffix. For example, if the the cross-compiler
|
||||||
|
tools are located at `/opt/q7s-gcc/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin`,
|
||||||
|
this variable would be set
|
||||||
|
to `/opt/q7s-gcc/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf`
|
||||||
|
|
||||||
# <a id="eclipse"></a> Eclipse
|
# <a id="eclipse"></a> Eclipse
|
||||||
|
|
||||||
When using Eclipse, there are two special build variables in the project properties
|
When using Eclipse, there are two special build variables in the project properties
|
||||||
|
20
automation/Jenkinsfile
vendored
20
automation/Jenkinsfile
vendored
@ -1,6 +1,7 @@
|
|||||||
pipeline {
|
pipeline {
|
||||||
environment {
|
environment {
|
||||||
BUILDDIR_Q7 = 'build_q7'
|
BUILDDIR_Q7S = 'build_q7s_fm'
|
||||||
|
BUILDDIR_Q7S_EM = 'build_q7s_em'
|
||||||
BUILDDIR_LINUX = 'build_linux'
|
BUILDDIR_LINUX = 'build_linux'
|
||||||
}
|
}
|
||||||
agent {
|
agent {
|
||||||
@ -12,15 +13,24 @@ pipeline {
|
|||||||
stages {
|
stages {
|
||||||
stage('Clean') {
|
stage('Clean') {
|
||||||
steps {
|
steps {
|
||||||
sh 'rm -rf $BUILDDIR_Q7'
|
sh 'rm -rf $BUILDDIR_Q7S'
|
||||||
|
sh 'rm -rf $BUILDDIR_Q7S_EM'
|
||||||
sh 'rm -rf $BUILDDIR_LINUX'
|
sh 'rm -rf $BUILDDIR_LINUX'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Build Q7S') {
|
stage('Build Q7S') {
|
||||||
steps {
|
steps {
|
||||||
dir(BUILDDIR_Q7) {
|
dir(BUILDDIR_Q7S) {
|
||||||
sh 'cmake -DTGT_BSP="arm/q7s" -DCMAKE_BUILD_TYPE=Debug ..'
|
sh 'cmake -DTGT_BSP="arm/q7s" -DCMAKE_BUILD_TYPE=Debug ..'
|
||||||
sh 'cmake --build . -j4'
|
sh 'cmake --build . -j8'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Build Q7S EM') {
|
||||||
|
steps {
|
||||||
|
dir(BUILDDIR_Q7S_EM) {
|
||||||
|
sh 'cmake -DTGT_BSP="arm/q7s" -DEIVE_Q7S_EM=ON -DCMAKE_BUILD_TYPE=Debug ..'
|
||||||
|
sh 'cmake --build . -j8'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -28,7 +38,7 @@ pipeline {
|
|||||||
steps {
|
steps {
|
||||||
dir(BUILDDIR_LINUX) {
|
dir(BUILDDIR_LINUX) {
|
||||||
sh 'cmake ..'
|
sh 'cmake ..'
|
||||||
sh 'cmake --build . -j4'
|
sh 'cmake --build . -j8'
|
||||||
sh './eive-unittest'
|
sh './eive-unittest'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,12 +4,14 @@
|
|||||||
#include <fsfw/tmtcservices/CommandingServiceBase.h>
|
#include <fsfw/tmtcservices/CommandingServiceBase.h>
|
||||||
#include <fsfw/tmtcservices/PusServiceBase.h>
|
#include <fsfw/tmtcservices/PusServiceBase.h>
|
||||||
#include <mission/controller/ThermalController.h>
|
#include <mission/controller/ThermalController.h>
|
||||||
#include <mission/core/GenericFactory.h>
|
#include <mission/genericFactory.h>
|
||||||
#include <mission/tmtc/TmFunnelHandler.h>
|
#include <mission/tmtc/TmFunnelHandler.h>
|
||||||
#include <objects/systemObjectList.h>
|
#include <objects/systemObjectList.h>
|
||||||
|
|
||||||
|
#include "../mission/utility/DummySdCardManager.h"
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "fsfw/platform.h"
|
#include "fsfw/platform.h"
|
||||||
|
#include "fsfw/power/PowerSwitchIF.h"
|
||||||
#include "fsfw_tests/integration/task/TestTask.h"
|
#include "fsfw_tests/integration/task/TestTask.h"
|
||||||
|
|
||||||
#if OBSW_ADD_TMTC_UDP_SERVER == 1
|
#if OBSW_ADD_TMTC_UDP_SERVER == 1
|
||||||
@ -28,8 +30,7 @@
|
|||||||
#include <dummies/AcuDummy.h>
|
#include <dummies/AcuDummy.h>
|
||||||
#include <dummies/CoreControllerDummy.h>
|
#include <dummies/CoreControllerDummy.h>
|
||||||
|
|
||||||
#include "dummies/helpers.h"
|
#include "dummies/helperFactory.h"
|
||||||
#include "mission/utility/GlobalConfigHandler.h"
|
|
||||||
|
|
||||||
#ifdef PLATFORM_UNIX
|
#ifdef PLATFORM_UNIX
|
||||||
#include <fsfw_hal/linux/serial/SerialComIF.h>
|
#include <fsfw_hal/linux/serial/SerialComIF.h>
|
||||||
@ -37,10 +38,10 @@
|
|||||||
|
|
||||||
#include "devices/gpioIds.h"
|
#include "devices/gpioIds.h"
|
||||||
#include "fsfw_hal/linux/gpio/Gpio.h"
|
#include "fsfw_hal/linux/gpio/Gpio.h"
|
||||||
#include "linux/devices/ploc/PlocMPSoCHandler.h"
|
#include "linux/payload/PlocMpsocHandler.h"
|
||||||
#include "linux/devices/ploc/PlocMPSoCHelper.h"
|
#include "linux/payload/PlocMpsocHelper.h"
|
||||||
#include "linux/devices/ploc/PlocSupervisorHandler.h"
|
#include "linux/payload/PlocSupervisorHandler.h"
|
||||||
#include "linux/devices/ploc/PlocSupvUartMan.h"
|
#include "linux/payload/PlocSupvUartMan.h"
|
||||||
#include "test/gpio/DummyGpioIF.h"
|
#include "test/gpio/DummyGpioIF.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -58,11 +59,21 @@ void ObjectFactory::produce(void* args) {
|
|||||||
Factory::setStaticFrameworkObjectIds();
|
Factory::setStaticFrameworkObjectIds();
|
||||||
PusTmFunnel* pusFunnel;
|
PusTmFunnel* pusFunnel;
|
||||||
CfdpTmFunnel* cfdpFunnel;
|
CfdpTmFunnel* cfdpFunnel;
|
||||||
ObjectFactory::produceGenericObjects(nullptr, &pusFunnel, &cfdpFunnel);
|
StorageManagerIF* tmStore;
|
||||||
|
StorageManagerIF* ipcStore;
|
||||||
|
PersistentTmStores persistentStores;
|
||||||
|
auto sdcMan = new DummySdCardManager("/tmp");
|
||||||
|
ObjectFactory::produceGenericObjects(nullptr, &pusFunnel, &cfdpFunnel, *sdcMan, &ipcStore,
|
||||||
|
&tmStore, persistentStores);
|
||||||
|
|
||||||
auto* dummyGpioIF = new DummyGpioIF();
|
auto* dummyGpioIF = new DummyGpioIF();
|
||||||
auto* dummySwitcher = new DummyPowerSwitcher(objects::PCDU_HANDLER, 18, 0);
|
auto* dummySwitcher = new DummyPowerSwitcher(objects::PCDU_HANDLER, 18, 0);
|
||||||
static_cast<void>(dummyGpioIF);
|
std::vector<ReturnValue_t> switcherList;
|
||||||
|
auto initVal = PowerSwitchIF::SWITCH_OFF;
|
||||||
|
for (unsigned i = 0; i < 18; i++) {
|
||||||
|
switcherList.emplace_back(initVal);
|
||||||
|
}
|
||||||
|
dummySwitcher->setInitialSwitcherList(switcherList);
|
||||||
#ifdef PLATFORM_UNIX
|
#ifdef PLATFORM_UNIX
|
||||||
new SerialComIF(objects::UART_COM_IF);
|
new SerialComIF(objects::UART_COM_IF);
|
||||||
#if OBSW_ADD_PLOC_MPSOC == 1
|
#if OBSW_ADD_PLOC_MPSOC == 1
|
||||||
@ -89,7 +100,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
dummy::DummyCfg cfg;
|
dummy::DummyCfg cfg;
|
||||||
dummy::createDummies(cfg, *dummySwitcher);
|
dummy::createDummies(cfg, *dummySwitcher, dummyGpioIF);
|
||||||
|
|
||||||
HeaterHandler* heaterHandler = nullptr;
|
HeaterHandler* heaterHandler = nullptr;
|
||||||
// new ThermalController(objects::THERMAL_CONTROLLER);
|
// new ThermalController(objects::THERMAL_CONTROLLER);
|
||||||
|
@ -50,6 +50,8 @@
|
|||||||
//! If set to 1 the binary needs "cap_sys_nice=eip" privileges to run
|
//! If set to 1 the binary needs "cap_sys_nice=eip" privileges to run
|
||||||
#define FSFW_USE_REALTIME_FOR_LINUX 0
|
#define FSFW_USE_REALTIME_FOR_LINUX 0
|
||||||
|
|
||||||
|
#define FSFW_UDP_SEND_WIRETAPPING_ENABLED 0
|
||||||
|
|
||||||
namespace fsfwconfig {
|
namespace fsfwconfig {
|
||||||
|
|
||||||
//! Default timestamp size. The default timestamp will be an seven byte CDC short timestamp.
|
//! Default timestamp size. The default timestamp will be an seven byte CDC short timestamp.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 256 translations.
|
* @brief Auto-generated event translation file. Contains 291 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2023-02-13 10:07:30
|
* Generated on: 2023-04-17 11:34:19
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -35,11 +35,11 @@ const char *INVALID_DEVICE_COMMAND_STRING = "INVALID_DEVICE_COMMAND";
|
|||||||
const char *MONITORING_LIMIT_EXCEEDED_STRING = "MONITORING_LIMIT_EXCEEDED";
|
const char *MONITORING_LIMIT_EXCEEDED_STRING = "MONITORING_LIMIT_EXCEEDED";
|
||||||
const char *MONITORING_AMBIGUOUS_STRING = "MONITORING_AMBIGUOUS";
|
const char *MONITORING_AMBIGUOUS_STRING = "MONITORING_AMBIGUOUS";
|
||||||
const char *DEVICE_WANTS_HARD_REBOOT_STRING = "DEVICE_WANTS_HARD_REBOOT";
|
const char *DEVICE_WANTS_HARD_REBOOT_STRING = "DEVICE_WANTS_HARD_REBOOT";
|
||||||
|
const char *SWITCH_WENT_OFF_STRING = "SWITCH_WENT_OFF";
|
||||||
const char *FUSE_CURRENT_HIGH_STRING = "FUSE_CURRENT_HIGH";
|
const char *FUSE_CURRENT_HIGH_STRING = "FUSE_CURRENT_HIGH";
|
||||||
const char *FUSE_WENT_OFF_STRING = "FUSE_WENT_OFF";
|
const char *FUSE_WENT_OFF_STRING = "FUSE_WENT_OFF";
|
||||||
const char *POWER_ABOVE_HIGH_LIMIT_STRING = "POWER_ABOVE_HIGH_LIMIT";
|
const char *POWER_ABOVE_HIGH_LIMIT_STRING = "POWER_ABOVE_HIGH_LIMIT";
|
||||||
const char *POWER_BELOW_LOW_LIMIT_STRING = "POWER_BELOW_LOW_LIMIT";
|
const char *POWER_BELOW_LOW_LIMIT_STRING = "POWER_BELOW_LOW_LIMIT";
|
||||||
const char *SWITCH_WENT_OFF_STRING = "SWITCH_WENT_OFF";
|
|
||||||
const char *HEATER_ON_STRING = "HEATER_ON";
|
const char *HEATER_ON_STRING = "HEATER_ON";
|
||||||
const char *HEATER_OFF_STRING = "HEATER_OFF";
|
const char *HEATER_OFF_STRING = "HEATER_OFF";
|
||||||
const char *HEATER_TIMEOUT_STRING = "HEATER_TIMEOUT";
|
const char *HEATER_TIMEOUT_STRING = "HEATER_TIMEOUT";
|
||||||
@ -90,8 +90,16 @@ const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER";
|
|||||||
const char *STORE_ERROR_STRING = "STORE_ERROR";
|
const char *STORE_ERROR_STRING = "STORE_ERROR";
|
||||||
const char *MSG_QUEUE_ERROR_STRING = "MSG_QUEUE_ERROR";
|
const char *MSG_QUEUE_ERROR_STRING = "MSG_QUEUE_ERROR";
|
||||||
const char *SERIALIZATION_ERROR_STRING = "SERIALIZATION_ERROR";
|
const char *SERIALIZATION_ERROR_STRING = "SERIALIZATION_ERROR";
|
||||||
|
const char *FILESTORE_ERROR_STRING = "FILESTORE_ERROR";
|
||||||
|
const char *FILENAME_TOO_LARGE_ERROR_STRING = "FILENAME_TOO_LARGE_ERROR";
|
||||||
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
|
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
|
||||||
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
|
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
|
||||||
|
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
|
||||||
|
const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO";
|
||||||
|
const char *MEKF_RECOVERY_STRING = "MEKF_RECOVERY";
|
||||||
|
const char *MEKF_AUTOMATIC_RESET_STRING = "MEKF_AUTOMATIC_RESET";
|
||||||
|
const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION";
|
||||||
|
const char *SAFE_MODE_CONTROLLER_FAILURE_STRING = "SAFE_MODE_CONTROLLER_FAILURE";
|
||||||
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
|
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
|
||||||
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
|
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
|
||||||
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
|
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
|
||||||
@ -129,8 +137,8 @@ const char *SELF_TEST_COIL_CURRENT_FAILURE_STRING = "SELF_TEST_COIL_CURRENT_FAIL
|
|||||||
const char *INVALID_ERROR_BYTE_STRING = "INVALID_ERROR_BYTE";
|
const char *INVALID_ERROR_BYTE_STRING = "INVALID_ERROR_BYTE";
|
||||||
const char *ERROR_STATE_STRING = "ERROR_STATE";
|
const char *ERROR_STATE_STRING = "ERROR_STATE";
|
||||||
const char *RESET_OCCURED_STRING = "RESET_OCCURED";
|
const char *RESET_OCCURED_STRING = "RESET_OCCURED";
|
||||||
const char *BOOTING_FIRMWARE_FAILED_STRING = "BOOTING_FIRMWARE_FAILED";
|
const char *BOOTING_FIRMWARE_FAILED_EVENT_STRING = "BOOTING_FIRMWARE_FAILED_EVENT";
|
||||||
const char *BOOTING_BOOTLOADER_FAILED_STRING = "BOOTING_BOOTLOADER_FAILED";
|
const char *BOOTING_BOOTLOADER_FAILED_EVENT_STRING = "BOOTING_BOOTLOADER_FAILED_EVENT";
|
||||||
const char *SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING = "SUPV_MEMORY_READ_RPT_CRC_FAILURE";
|
const char *SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING = "SUPV_MEMORY_READ_RPT_CRC_FAILURE";
|
||||||
const char *SUPV_UNKNOWN_TM_STRING = "SUPV_UNKNOWN_TM";
|
const char *SUPV_UNKNOWN_TM_STRING = "SUPV_UNKNOWN_TM";
|
||||||
const char *SUPV_UNINIMPLEMENTED_TM_STRING = "SUPV_UNINIMPLEMENTED_TM";
|
const char *SUPV_UNINIMPLEMENTED_TM_STRING = "SUPV_UNINIMPLEMENTED_TM";
|
||||||
@ -150,8 +158,14 @@ const char *CARRIER_LOCK_STRING = "CARRIER_LOCK";
|
|||||||
const char *BIT_LOCK_PDEC_STRING = "BIT_LOCK_PDEC";
|
const char *BIT_LOCK_PDEC_STRING = "BIT_LOCK_PDEC";
|
||||||
const char *LOST_CARRIER_LOCK_PDEC_STRING = "LOST_CARRIER_LOCK_PDEC";
|
const char *LOST_CARRIER_LOCK_PDEC_STRING = "LOST_CARRIER_LOCK_PDEC";
|
||||||
const char *LOST_BIT_LOCK_PDEC_STRING = "LOST_BIT_LOCK_PDEC";
|
const char *LOST_BIT_LOCK_PDEC_STRING = "LOST_BIT_LOCK_PDEC";
|
||||||
|
const char *TOO_MANY_IRQS_STRING = "TOO_MANY_IRQS";
|
||||||
const char *POLL_SYSCALL_ERROR_PDEC_STRING = "POLL_SYSCALL_ERROR_PDEC";
|
const char *POLL_SYSCALL_ERROR_PDEC_STRING = "POLL_SYSCALL_ERROR_PDEC";
|
||||||
const char *WRITE_SYSCALL_ERROR_PDEC_STRING = "WRITE_SYSCALL_ERROR_PDEC";
|
const char *WRITE_SYSCALL_ERROR_PDEC_STRING = "WRITE_SYSCALL_ERROR_PDEC";
|
||||||
|
const char *PDEC_TRYING_RESET_WITH_INIT_STRING = "PDEC_TRYING_RESET_WITH_INIT";
|
||||||
|
const char *PDEC_TRYING_RESET_NO_INIT_STRING = "PDEC_TRYING_RESET_NO_INIT";
|
||||||
|
const char *PDEC_RESET_FAILED_STRING = "PDEC_RESET_FAILED";
|
||||||
|
const char *OPEN_IRQ_FILE_FAILED_STRING = "OPEN_IRQ_FILE_FAILED";
|
||||||
|
const char *PDEC_INIT_FAILED_STRING = "PDEC_INIT_FAILED";
|
||||||
const char *IMAGE_UPLOAD_FAILED_STRING = "IMAGE_UPLOAD_FAILED";
|
const char *IMAGE_UPLOAD_FAILED_STRING = "IMAGE_UPLOAD_FAILED";
|
||||||
const char *IMAGE_DOWNLOAD_FAILED_STRING = "IMAGE_DOWNLOAD_FAILED";
|
const char *IMAGE_DOWNLOAD_FAILED_STRING = "IMAGE_DOWNLOAD_FAILED";
|
||||||
const char *IMAGE_UPLOAD_SUCCESSFUL_STRING = "IMAGE_UPLOAD_SUCCESSFUL";
|
const char *IMAGE_UPLOAD_SUCCESSFUL_STRING = "IMAGE_UPLOAD_SUCCESSFUL";
|
||||||
@ -163,7 +177,7 @@ const char *FIRMWARE_UPDATE_SUCCESSFUL_STRING = "FIRMWARE_UPDATE_SUCCESSFUL";
|
|||||||
const char *FIRMWARE_UPDATE_FAILED_STRING = "FIRMWARE_UPDATE_FAILED";
|
const char *FIRMWARE_UPDATE_FAILED_STRING = "FIRMWARE_UPDATE_FAILED";
|
||||||
const char *STR_HELPER_READING_REPLY_FAILED_STRING = "STR_HELPER_READING_REPLY_FAILED";
|
const char *STR_HELPER_READING_REPLY_FAILED_STRING = "STR_HELPER_READING_REPLY_FAILED";
|
||||||
const char *STR_HELPER_COM_ERROR_STRING = "STR_HELPER_COM_ERROR";
|
const char *STR_HELPER_COM_ERROR_STRING = "STR_HELPER_COM_ERROR";
|
||||||
const char *STR_HELPER_NO_REPLY_STRING = "STR_HELPER_NO_REPLY";
|
const char *STR_COM_REPLY_TIMEOUT_STRING = "STR_COM_REPLY_TIMEOUT";
|
||||||
const char *STR_HELPER_DEC_ERROR_STRING = "STR_HELPER_DEC_ERROR";
|
const char *STR_HELPER_DEC_ERROR_STRING = "STR_HELPER_DEC_ERROR";
|
||||||
const char *POSITION_MISMATCH_STRING = "POSITION_MISMATCH";
|
const char *POSITION_MISMATCH_STRING = "POSITION_MISMATCH";
|
||||||
const char *STR_HELPER_FILE_NOT_EXISTS_STRING = "STR_HELPER_FILE_NOT_EXISTS";
|
const char *STR_HELPER_FILE_NOT_EXISTS_STRING = "STR_HELPER_FILE_NOT_EXISTS";
|
||||||
@ -199,6 +213,11 @@ const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED"
|
|||||||
const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE";
|
const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE";
|
||||||
const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT";
|
const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT";
|
||||||
const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED";
|
const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED";
|
||||||
|
const char *DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY_STRING = "DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY";
|
||||||
|
const char *TRANSITION_OTHER_SIDE_FAILED_12900_STRING = "TRANSITION_OTHER_SIDE_FAILED_12900";
|
||||||
|
const char *NOT_ENOUGH_DEVICES_DUAL_MODE_12901_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE_12901";
|
||||||
|
const char *POWER_STATE_MACHINE_TIMEOUT_12902_STRING = "POWER_STATE_MACHINE_TIMEOUT_12902";
|
||||||
|
const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903";
|
||||||
const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE";
|
const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE";
|
||||||
const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE";
|
const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE";
|
||||||
const char *CANT_GET_FIX_STRING = "CANT_GET_FIX";
|
const char *CANT_GET_FIX_STRING = "CANT_GET_FIX";
|
||||||
@ -249,13 +268,34 @@ const char *REBOOT_HW_STRING = "REBOOT_HW";
|
|||||||
const char *NO_SD_CARD_ACTIVE_STRING = "NO_SD_CARD_ACTIVE";
|
const char *NO_SD_CARD_ACTIVE_STRING = "NO_SD_CARD_ACTIVE";
|
||||||
const char *VERSION_INFO_STRING = "VERSION_INFO";
|
const char *VERSION_INFO_STRING = "VERSION_INFO";
|
||||||
const char *CURRENT_IMAGE_INFO_STRING = "CURRENT_IMAGE_INFO";
|
const char *CURRENT_IMAGE_INFO_STRING = "CURRENT_IMAGE_INFO";
|
||||||
|
const char *REBOOT_COUNTER_STRING = "REBOOT_COUNTER";
|
||||||
|
const char *INDIVIDUAL_BOOT_COUNTS_STRING = "INDIVIDUAL_BOOT_COUNTS";
|
||||||
|
const char *TRYING_I2C_RECOVERY_STRING = "TRYING_I2C_RECOVERY";
|
||||||
|
const char *I2C_REBOOT_STRING = "I2C_REBOOT";
|
||||||
|
const char *PDEC_REBOOT_STRING = "PDEC_REBOOT";
|
||||||
const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE";
|
const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE";
|
||||||
const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE";
|
const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE";
|
||||||
const char *SYRLINKS_OVERHEATING_STRING = "SYRLINKS_OVERHEATING";
|
const char *SYRLINKS_OVERHEATING_STRING = "SYRLINKS_OVERHEATING";
|
||||||
const char *PLOC_OVERHEATING_STRING = "PLOC_OVERHEATING";
|
|
||||||
const char *OBC_OVERHEATING_STRING = "OBC_OVERHEATING";
|
const char *OBC_OVERHEATING_STRING = "OBC_OVERHEATING";
|
||||||
const char *HPA_OVERHEATING_STRING = "HPA_OVERHEATING";
|
const char *CAMERA_OVERHEATING_STRING = "CAMERA_OVERHEATING";
|
||||||
const char *PLPCDU_OVERHEATING_STRING = "PLPCDU_OVERHEATING";
|
const char *PCDU_SYSTEM_OVERHEATING_STRING = "PCDU_SYSTEM_OVERHEATING";
|
||||||
|
const char *HEATER_NOT_OFF_FOR_OFF_MODE_STRING = "HEATER_NOT_OFF_FOR_OFF_MODE";
|
||||||
|
const char *MGT_OVERHEATING_STRING = "MGT_OVERHEATING";
|
||||||
|
const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED";
|
||||||
|
const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON";
|
||||||
|
const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION";
|
||||||
|
const char *FILE_TOO_LARGE_STRING = "FILE_TOO_LARGE";
|
||||||
|
const char *BUSY_DUMPING_EVENT_STRING = "BUSY_DUMPING_EVENT";
|
||||||
|
const char *DUMP_OK_STORE_DONE_STRING = "DUMP_OK_STORE_DONE";
|
||||||
|
const char *DUMP_NOK_STORE_DONE_STRING = "DUMP_NOK_STORE_DONE";
|
||||||
|
const char *DUMP_MISC_STORE_DONE_STRING = "DUMP_MISC_STORE_DONE";
|
||||||
|
const char *DUMP_HK_STORE_DONE_STRING = "DUMP_HK_STORE_DONE";
|
||||||
|
const char *DUMP_CFDP_STORE_DONE_STRING = "DUMP_CFDP_STORE_DONE";
|
||||||
|
const char *DUMP_OK_CANCELLED_STRING = "DUMP_OK_CANCELLED";
|
||||||
|
const char *DUMP_NOK_CANCELLED_STRING = "DUMP_NOK_CANCELLED";
|
||||||
|
const char *DUMP_MISC_CANCELLED_STRING = "DUMP_MISC_CANCELLED";
|
||||||
|
const char *DUMP_HK_CANCELLED_STRING = "DUMP_HK_CANCELLED";
|
||||||
|
const char *DUMP_CFDP_CANCELLED_STRING = "DUMP_CFDP_CANCELLED";
|
||||||
|
|
||||||
const char *translateEvents(Event event) {
|
const char *translateEvents(Event event) {
|
||||||
switch ((event & 0xFFFF)) {
|
switch ((event & 0xFFFF)) {
|
||||||
@ -319,16 +359,16 @@ const char *translateEvents(Event event) {
|
|||||||
return MONITORING_AMBIGUOUS_STRING;
|
return MONITORING_AMBIGUOUS_STRING;
|
||||||
case (2811):
|
case (2811):
|
||||||
return DEVICE_WANTS_HARD_REBOOT_STRING;
|
return DEVICE_WANTS_HARD_REBOOT_STRING;
|
||||||
case (4201):
|
|
||||||
return FUSE_CURRENT_HIGH_STRING;
|
|
||||||
case (4202):
|
|
||||||
return FUSE_WENT_OFF_STRING;
|
|
||||||
case (4204):
|
|
||||||
return POWER_ABOVE_HIGH_LIMIT_STRING;
|
|
||||||
case (4205):
|
|
||||||
return POWER_BELOW_LOW_LIMIT_STRING;
|
|
||||||
case (4300):
|
case (4300):
|
||||||
return SWITCH_WENT_OFF_STRING;
|
return SWITCH_WENT_OFF_STRING;
|
||||||
|
case (4301):
|
||||||
|
return FUSE_CURRENT_HIGH_STRING;
|
||||||
|
case (4302):
|
||||||
|
return FUSE_WENT_OFF_STRING;
|
||||||
|
case (4304):
|
||||||
|
return POWER_ABOVE_HIGH_LIMIT_STRING;
|
||||||
|
case (4305):
|
||||||
|
return POWER_BELOW_LOW_LIMIT_STRING;
|
||||||
case (5000):
|
case (5000):
|
||||||
return HEATER_ON_STRING;
|
return HEATER_ON_STRING;
|
||||||
case (5001):
|
case (5001):
|
||||||
@ -429,10 +469,26 @@ const char *translateEvents(Event event) {
|
|||||||
return MSG_QUEUE_ERROR_STRING;
|
return MSG_QUEUE_ERROR_STRING;
|
||||||
case (10802):
|
case (10802):
|
||||||
return SERIALIZATION_ERROR_STRING;
|
return SERIALIZATION_ERROR_STRING;
|
||||||
|
case (10803):
|
||||||
|
return FILESTORE_ERROR_STRING;
|
||||||
|
case (10804):
|
||||||
|
return FILENAME_TOO_LARGE_ERROR_STRING;
|
||||||
case (11200):
|
case (11200):
|
||||||
return SAFE_RATE_VIOLATION_STRING;
|
return SAFE_RATE_VIOLATION_STRING;
|
||||||
case (11201):
|
case (11201):
|
||||||
return SAFE_RATE_RECOVERY_STRING;
|
return SAFE_RATE_RECOVERY_STRING;
|
||||||
|
case (11202):
|
||||||
|
return MULTIPLE_RW_INVALID_STRING;
|
||||||
|
case (11203):
|
||||||
|
return MEKF_INVALID_INFO_STRING;
|
||||||
|
case (11204):
|
||||||
|
return MEKF_RECOVERY_STRING;
|
||||||
|
case (11205):
|
||||||
|
return MEKF_AUTOMATIC_RESET_STRING;
|
||||||
|
case (11206):
|
||||||
|
return MEKF_INVALID_MODE_VIOLATION_STRING;
|
||||||
|
case (11207):
|
||||||
|
return SAFE_MODE_CONTROLLER_FAILURE_STRING;
|
||||||
case (11300):
|
case (11300):
|
||||||
return SWITCH_CMD_SENT_STRING;
|
return SWITCH_CMD_SENT_STRING;
|
||||||
case (11301):
|
case (11301):
|
||||||
@ -508,9 +564,9 @@ const char *translateEvents(Event event) {
|
|||||||
case (11802):
|
case (11802):
|
||||||
return RESET_OCCURED_STRING;
|
return RESET_OCCURED_STRING;
|
||||||
case (11901):
|
case (11901):
|
||||||
return BOOTING_FIRMWARE_FAILED_STRING;
|
return BOOTING_FIRMWARE_FAILED_EVENT_STRING;
|
||||||
case (11902):
|
case (11902):
|
||||||
return BOOTING_BOOTLOADER_FAILED_STRING;
|
return BOOTING_BOOTLOADER_FAILED_EVENT_STRING;
|
||||||
case (12001):
|
case (12001):
|
||||||
return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
|
return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
|
||||||
case (12002):
|
case (12002):
|
||||||
@ -550,9 +606,21 @@ const char *translateEvents(Event event) {
|
|||||||
case (12406):
|
case (12406):
|
||||||
return LOST_BIT_LOCK_PDEC_STRING;
|
return LOST_BIT_LOCK_PDEC_STRING;
|
||||||
case (12407):
|
case (12407):
|
||||||
return POLL_SYSCALL_ERROR_PDEC_STRING;
|
return TOO_MANY_IRQS_STRING;
|
||||||
case (12408):
|
case (12408):
|
||||||
|
return POLL_SYSCALL_ERROR_PDEC_STRING;
|
||||||
|
case (12409):
|
||||||
return WRITE_SYSCALL_ERROR_PDEC_STRING;
|
return WRITE_SYSCALL_ERROR_PDEC_STRING;
|
||||||
|
case (12410):
|
||||||
|
return PDEC_TRYING_RESET_WITH_INIT_STRING;
|
||||||
|
case (12411):
|
||||||
|
return PDEC_TRYING_RESET_NO_INIT_STRING;
|
||||||
|
case (12412):
|
||||||
|
return PDEC_RESET_FAILED_STRING;
|
||||||
|
case (12413):
|
||||||
|
return OPEN_IRQ_FILE_FAILED_STRING;
|
||||||
|
case (12414):
|
||||||
|
return PDEC_INIT_FAILED_STRING;
|
||||||
case (12500):
|
case (12500):
|
||||||
return IMAGE_UPLOAD_FAILED_STRING;
|
return IMAGE_UPLOAD_FAILED_STRING;
|
||||||
case (12501):
|
case (12501):
|
||||||
@ -576,16 +644,16 @@ const char *translateEvents(Event event) {
|
|||||||
case (12510):
|
case (12510):
|
||||||
return STR_HELPER_COM_ERROR_STRING;
|
return STR_HELPER_COM_ERROR_STRING;
|
||||||
case (12511):
|
case (12511):
|
||||||
return STR_HELPER_NO_REPLY_STRING;
|
return STR_COM_REPLY_TIMEOUT_STRING;
|
||||||
case (12512):
|
|
||||||
return STR_HELPER_DEC_ERROR_STRING;
|
|
||||||
case (12513):
|
case (12513):
|
||||||
return POSITION_MISMATCH_STRING;
|
return STR_HELPER_DEC_ERROR_STRING;
|
||||||
case (12514):
|
case (12514):
|
||||||
return STR_HELPER_FILE_NOT_EXISTS_STRING;
|
return POSITION_MISMATCH_STRING;
|
||||||
case (12515):
|
case (12515):
|
||||||
return STR_HELPER_SENDING_PACKET_FAILED_STRING;
|
return STR_HELPER_FILE_NOT_EXISTS_STRING;
|
||||||
case (12516):
|
case (12516):
|
||||||
|
return STR_HELPER_SENDING_PACKET_FAILED_STRING;
|
||||||
|
case (12517):
|
||||||
return STR_HELPER_REQUESTING_MSG_FAILED_STRING;
|
return STR_HELPER_REQUESTING_MSG_FAILED_STRING;
|
||||||
case (12600):
|
case (12600):
|
||||||
return MPSOC_FLASH_WRITE_FAILED_STRING;
|
return MPSOC_FLASH_WRITE_FAILED_STRING;
|
||||||
@ -647,6 +715,16 @@ const char *translateEvents(Event event) {
|
|||||||
return POWER_STATE_MACHINE_TIMEOUT_STRING;
|
return POWER_STATE_MACHINE_TIMEOUT_STRING;
|
||||||
case (12803):
|
case (12803):
|
||||||
return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING;
|
return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING;
|
||||||
|
case (12804):
|
||||||
|
return DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY_STRING;
|
||||||
|
case (12900):
|
||||||
|
return TRANSITION_OTHER_SIDE_FAILED_12900_STRING;
|
||||||
|
case (12901):
|
||||||
|
return NOT_ENOUGH_DEVICES_DUAL_MODE_12901_STRING;
|
||||||
|
case (12902):
|
||||||
|
return POWER_STATE_MACHINE_TIMEOUT_12902_STRING;
|
||||||
|
case (12903):
|
||||||
|
return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING;
|
||||||
case (13000):
|
case (13000):
|
||||||
return CHILDREN_LOST_MODE_STRING;
|
return CHILDREN_LOST_MODE_STRING;
|
||||||
case (13100):
|
case (13100):
|
||||||
@ -747,20 +825,62 @@ const char *translateEvents(Event event) {
|
|||||||
return VERSION_INFO_STRING;
|
return VERSION_INFO_STRING;
|
||||||
case (14006):
|
case (14006):
|
||||||
return CURRENT_IMAGE_INFO_STRING;
|
return CURRENT_IMAGE_INFO_STRING;
|
||||||
|
case (14007):
|
||||||
|
return REBOOT_COUNTER_STRING;
|
||||||
|
case (14008):
|
||||||
|
return INDIVIDUAL_BOOT_COUNTS_STRING;
|
||||||
|
case (14010):
|
||||||
|
return TRYING_I2C_RECOVERY_STRING;
|
||||||
|
case (14011):
|
||||||
|
return I2C_REBOOT_STRING;
|
||||||
|
case (14012):
|
||||||
|
return PDEC_REBOOT_STRING;
|
||||||
case (14100):
|
case (14100):
|
||||||
return NO_VALID_SENSOR_TEMPERATURE_STRING;
|
return NO_VALID_SENSOR_TEMPERATURE_STRING;
|
||||||
case (14101):
|
case (14101):
|
||||||
return NO_HEALTHY_HEATER_AVAILABLE_STRING;
|
return NO_HEALTHY_HEATER_AVAILABLE_STRING;
|
||||||
case (14102):
|
case (14102):
|
||||||
return SYRLINKS_OVERHEATING_STRING;
|
return SYRLINKS_OVERHEATING_STRING;
|
||||||
case (14103):
|
|
||||||
return PLOC_OVERHEATING_STRING;
|
|
||||||
case (14104):
|
case (14104):
|
||||||
return OBC_OVERHEATING_STRING;
|
return OBC_OVERHEATING_STRING;
|
||||||
case (14105):
|
case (14105):
|
||||||
return HPA_OVERHEATING_STRING;
|
return CAMERA_OVERHEATING_STRING;
|
||||||
case (14106):
|
case (14106):
|
||||||
return PLPCDU_OVERHEATING_STRING;
|
return PCDU_SYSTEM_OVERHEATING_STRING;
|
||||||
|
case (14107):
|
||||||
|
return HEATER_NOT_OFF_FOR_OFF_MODE_STRING;
|
||||||
|
case (14108):
|
||||||
|
return MGT_OVERHEATING_STRING;
|
||||||
|
case (14201):
|
||||||
|
return TX_TIMER_EXPIRED_STRING;
|
||||||
|
case (14202):
|
||||||
|
return BIT_LOCK_TX_ON_STRING;
|
||||||
|
case (14300):
|
||||||
|
return POSSIBLE_FILE_CORRUPTION_STRING;
|
||||||
|
case (14301):
|
||||||
|
return FILE_TOO_LARGE_STRING;
|
||||||
|
case (14302):
|
||||||
|
return BUSY_DUMPING_EVENT_STRING;
|
||||||
|
case (14305):
|
||||||
|
return DUMP_OK_STORE_DONE_STRING;
|
||||||
|
case (14306):
|
||||||
|
return DUMP_NOK_STORE_DONE_STRING;
|
||||||
|
case (14307):
|
||||||
|
return DUMP_MISC_STORE_DONE_STRING;
|
||||||
|
case (14308):
|
||||||
|
return DUMP_HK_STORE_DONE_STRING;
|
||||||
|
case (14309):
|
||||||
|
return DUMP_CFDP_STORE_DONE_STRING;
|
||||||
|
case (14310):
|
||||||
|
return DUMP_OK_CANCELLED_STRING;
|
||||||
|
case (14311):
|
||||||
|
return DUMP_NOK_CANCELLED_STRING;
|
||||||
|
case (14312):
|
||||||
|
return DUMP_MISC_CANCELLED_STRING;
|
||||||
|
case (14313):
|
||||||
|
return DUMP_HK_CANCELLED_STRING;
|
||||||
|
case (14314):
|
||||||
|
return DUMP_CFDP_CANCELLED_STRING;
|
||||||
default:
|
default:
|
||||||
return "UNKNOWN_EVENT";
|
return "UNKNOWN_EVENT";
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 147 translations.
|
* Contains 171 translations.
|
||||||
* Generated on: 2023-02-13 10:07:30
|
* Generated on: 2023-04-17 11:34:19
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
@ -38,6 +38,9 @@ const char *GYRO_3_L3G_HANDLER_STRING = "GYRO_3_L3G_HANDLER";
|
|||||||
const char *RW4_STRING = "RW4";
|
const char *RW4_STRING = "RW4";
|
||||||
const char *STAR_TRACKER_STRING = "STAR_TRACKER";
|
const char *STAR_TRACKER_STRING = "STAR_TRACKER";
|
||||||
const char *GPS_CONTROLLER_STRING = "GPS_CONTROLLER";
|
const char *GPS_CONTROLLER_STRING = "GPS_CONTROLLER";
|
||||||
|
const char *GPS_0_HEALTH_DEV_STRING = "GPS_0_HEALTH_DEV";
|
||||||
|
const char *GPS_1_HEALTH_DEV_STRING = "GPS_1_HEALTH_DEV";
|
||||||
|
const char *IMTQ_POLLING_STRING = "IMTQ_POLLING";
|
||||||
const char *IMTQ_HANDLER_STRING = "IMTQ_HANDLER";
|
const char *IMTQ_HANDLER_STRING = "IMTQ_HANDLER";
|
||||||
const char *PCDU_HANDLER_STRING = "PCDU_HANDLER";
|
const char *PCDU_HANDLER_STRING = "PCDU_HANDLER";
|
||||||
const char *P60DOCK_HANDLER_STRING = "P60DOCK_HANDLER";
|
const char *P60DOCK_HANDLER_STRING = "P60DOCK_HANDLER";
|
||||||
@ -49,10 +52,14 @@ const char *PLPCDU_HANDLER_STRING = "PLPCDU_HANDLER";
|
|||||||
const char *RAD_SENSOR_STRING = "RAD_SENSOR";
|
const char *RAD_SENSOR_STRING = "RAD_SENSOR";
|
||||||
const char *PLOC_UPDATER_STRING = "PLOC_UPDATER";
|
const char *PLOC_UPDATER_STRING = "PLOC_UPDATER";
|
||||||
const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER";
|
const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER";
|
||||||
const char *STR_HELPER_STRING = "STR_HELPER";
|
const char *STR_COM_IF_STRING = "STR_COM_IF";
|
||||||
const char *PLOC_MPSOC_HELPER_STRING = "PLOC_MPSOC_HELPER";
|
const char *PLOC_MPSOC_HELPER_STRING = "PLOC_MPSOC_HELPER";
|
||||||
const char *AXI_PTME_CONFIG_STRING = "AXI_PTME_CONFIG";
|
const char *AXI_PTME_CONFIG_STRING = "AXI_PTME_CONFIG";
|
||||||
const char *PTME_CONFIG_STRING = "PTME_CONFIG";
|
const char *PTME_CONFIG_STRING = "PTME_CONFIG";
|
||||||
|
const char *PTME_VC0_LIVE_TM_STRING = "PTME_VC0_LIVE_TM";
|
||||||
|
const char *PTME_VC1_LOG_TM_STRING = "PTME_VC1_LOG_TM";
|
||||||
|
const char *PTME_VC2_HK_TM_STRING = "PTME_VC2_HK_TM";
|
||||||
|
const char *PTME_VC3_CFDP_TM_STRING = "PTME_VC3_CFDP_TM";
|
||||||
const char *PLOC_MPSOC_HANDLER_STRING = "PLOC_MPSOC_HANDLER";
|
const char *PLOC_MPSOC_HANDLER_STRING = "PLOC_MPSOC_HANDLER";
|
||||||
const char *PLOC_SUPERVISOR_HANDLER_STRING = "PLOC_SUPERVISOR_HANDLER";
|
const char *PLOC_SUPERVISOR_HANDLER_STRING = "PLOC_SUPERVISOR_HANDLER";
|
||||||
const char *PLOC_SUPERVISOR_HELPER_STRING = "PLOC_SUPERVISOR_HELPER";
|
const char *PLOC_SUPERVISOR_HELPER_STRING = "PLOC_SUPERVISOR_HELPER";
|
||||||
@ -81,11 +88,15 @@ const char *RTD_13_IC16_PLPCDU_HEATSPREADER_STRING = "RTD_13_IC16_PLPCDU_HEATSPR
|
|||||||
const char *RTD_14_IC17_TCS_BOARD_STRING = "RTD_14_IC17_TCS_BOARD";
|
const char *RTD_14_IC17_TCS_BOARD_STRING = "RTD_14_IC17_TCS_BOARD";
|
||||||
const char *RTD_15_IC18_IMTQ_STRING = "RTD_15_IC18_IMTQ";
|
const char *RTD_15_IC18_IMTQ_STRING = "RTD_15_IC18_IMTQ";
|
||||||
const char *SYRLINKS_HANDLER_STRING = "SYRLINKS_HANDLER";
|
const char *SYRLINKS_HANDLER_STRING = "SYRLINKS_HANDLER";
|
||||||
|
const char *SYRLINKS_COM_HANDLER_STRING = "SYRLINKS_COM_HANDLER";
|
||||||
const char *ARDUINO_COM_IF_STRING = "ARDUINO_COM_IF";
|
const char *ARDUINO_COM_IF_STRING = "ARDUINO_COM_IF";
|
||||||
const char *DUMMY_COM_IF_STRING = "DUMMY_COM_IF";
|
const char *DUMMY_COM_IF_STRING = "DUMMY_COM_IF";
|
||||||
const char *SCEX_UART_READER_STRING = "SCEX_UART_READER";
|
const char *SCEX_UART_READER_STRING = "SCEX_UART_READER";
|
||||||
const char *SPI_RTD_COM_IF_STRING = "SPI_RTD_COM_IF";
|
|
||||||
const char *UART_COM_IF_STRING = "UART_COM_IF";
|
const char *UART_COM_IF_STRING = "UART_COM_IF";
|
||||||
|
const char *ACS_BOARD_POLLING_TASK_STRING = "ACS_BOARD_POLLING_TASK";
|
||||||
|
const char *RW_POLLING_TASK_STRING = "RW_POLLING_TASK";
|
||||||
|
const char *SPI_RTD_COM_IF_STRING = "SPI_RTD_COM_IF";
|
||||||
|
const char *SUS_POLLING_TASK_STRING = "SUS_POLLING_TASK";
|
||||||
const char *CCSDS_PACKET_DISTRIBUTOR_STRING = "CCSDS_PACKET_DISTRIBUTOR";
|
const char *CCSDS_PACKET_DISTRIBUTOR_STRING = "CCSDS_PACKET_DISTRIBUTOR";
|
||||||
const char *PUS_PACKET_DISTRIBUTOR_STRING = "PUS_PACKET_DISTRIBUTOR";
|
const char *PUS_PACKET_DISTRIBUTOR_STRING = "PUS_PACKET_DISTRIBUTOR";
|
||||||
const char *TCP_TMTC_SERVER_STRING = "TCP_TMTC_SERVER";
|
const char *TCP_TMTC_SERVER_STRING = "TCP_TMTC_SERVER";
|
||||||
@ -111,6 +122,7 @@ const char *PUS_SERVICE_5_EVENT_REPORTING_STRING = "PUS_SERVICE_5_EVENT_REPORTIN
|
|||||||
const char *PUS_SERVICE_8_FUNCTION_MGMT_STRING = "PUS_SERVICE_8_FUNCTION_MGMT";
|
const char *PUS_SERVICE_8_FUNCTION_MGMT_STRING = "PUS_SERVICE_8_FUNCTION_MGMT";
|
||||||
const char *PUS_SERVICE_9_TIME_MGMT_STRING = "PUS_SERVICE_9_TIME_MGMT";
|
const char *PUS_SERVICE_9_TIME_MGMT_STRING = "PUS_SERVICE_9_TIME_MGMT";
|
||||||
const char *PUS_SERVICE_11_TC_SCHEDULER_STRING = "PUS_SERVICE_11_TC_SCHEDULER";
|
const char *PUS_SERVICE_11_TC_SCHEDULER_STRING = "PUS_SERVICE_11_TC_SCHEDULER";
|
||||||
|
const char *PUS_SERVICE_15_TM_STORAGE_STRING = "PUS_SERVICE_15_TM_STORAGE";
|
||||||
const char *PUS_SERVICE_17_TEST_STRING = "PUS_SERVICE_17_TEST";
|
const char *PUS_SERVICE_17_TEST_STRING = "PUS_SERVICE_17_TEST";
|
||||||
const char *PUS_SERVICE_20_PARAMETERS_STRING = "PUS_SERVICE_20_PARAMETERS";
|
const char *PUS_SERVICE_20_PARAMETERS_STRING = "PUS_SERVICE_20_PARAMETERS";
|
||||||
const char *PUS_SERVICE_200_MODE_MGMT_STRING = "PUS_SERVICE_200_MODE_MGMT";
|
const char *PUS_SERVICE_200_MODE_MGMT_STRING = "PUS_SERVICE_200_MODE_MGMT";
|
||||||
@ -133,12 +145,15 @@ const char *HEATER_3_OBC_BRD_STRING = "HEATER_3_OBC_BRD";
|
|||||||
const char *HEATER_4_CAMERA_STRING = "HEATER_4_CAMERA";
|
const char *HEATER_4_CAMERA_STRING = "HEATER_4_CAMERA";
|
||||||
const char *HEATER_5_STR_STRING = "HEATER_5_STR";
|
const char *HEATER_5_STR_STRING = "HEATER_5_STR";
|
||||||
const char *HEATER_6_DRO_STRING = "HEATER_6_DRO";
|
const char *HEATER_6_DRO_STRING = "HEATER_6_DRO";
|
||||||
const char *HEATER_7_HPA_STRING = "HEATER_7_HPA";
|
const char *HEATER_7_SYRLINKS_STRING = "HEATER_7_SYRLINKS";
|
||||||
const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS";
|
const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS";
|
||||||
const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS";
|
const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS";
|
||||||
const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS";
|
const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS";
|
||||||
const char *RW_ASS_STRING = "RW_ASS";
|
const char *RW_ASSY_STRING = "RW_ASSY";
|
||||||
const char *CAM_SWITCHER_STRING = "CAM_SWITCHER";
|
const char *CAM_SWITCHER_STRING = "CAM_SWITCHER";
|
||||||
|
const char *SYRLINKS_ASSY_STRING = "SYRLINKS_ASSY";
|
||||||
|
const char *IMTQ_ASSY_STRING = "IMTQ_ASSY";
|
||||||
|
const char *STR_ASSY_STRING = "STR_ASSY";
|
||||||
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
|
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
|
||||||
const char *PUS_TM_FUNNEL_STRING = "PUS_TM_FUNNEL";
|
const char *PUS_TM_FUNNEL_STRING = "PUS_TM_FUNNEL";
|
||||||
const char *CFDP_TM_FUNNEL_STRING = "CFDP_TM_FUNNEL";
|
const char *CFDP_TM_FUNNEL_STRING = "CFDP_TM_FUNNEL";
|
||||||
@ -149,7 +164,16 @@ const char *ACS_SUBSYSTEM_STRING = "ACS_SUBSYSTEM";
|
|||||||
const char *PL_SUBSYSTEM_STRING = "PL_SUBSYSTEM";
|
const char *PL_SUBSYSTEM_STRING = "PL_SUBSYSTEM";
|
||||||
const char *TCS_SUBSYSTEM_STRING = "TCS_SUBSYSTEM";
|
const char *TCS_SUBSYSTEM_STRING = "TCS_SUBSYSTEM";
|
||||||
const char *COM_SUBSYSTEM_STRING = "COM_SUBSYSTEM";
|
const char *COM_SUBSYSTEM_STRING = "COM_SUBSYSTEM";
|
||||||
const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE";
|
const char *MISC_TM_STORE_STRING = "MISC_TM_STORE";
|
||||||
|
const char *OK_TM_STORE_STRING = "OK_TM_STORE";
|
||||||
|
const char *NOT_OK_TM_STORE_STRING = "NOT_OK_TM_STORE";
|
||||||
|
const char *HK_TM_STORE_STRING = "HK_TM_STORE";
|
||||||
|
const char *CFDP_TM_STORE_STRING = "CFDP_TM_STORE";
|
||||||
|
const char *LIVE_TM_TASK_STRING = "LIVE_TM_TASK";
|
||||||
|
const char *LOG_STORE_AND_TM_TASK_STRING = "LOG_STORE_AND_TM_TASK";
|
||||||
|
const char *HK_STORE_AND_TM_TASK_STRING = "HK_STORE_AND_TM_TASK";
|
||||||
|
const char *CFDP_STORE_AND_TM_TASK_STRING = "CFDP_STORE_AND_TM_TASK";
|
||||||
|
const char *DOWNLINK_RAM_STORE_STRING = "DOWNLINK_RAM_STORE";
|
||||||
const char *THERMAL_TEMP_INSERTER_STRING = "THERMAL_TEMP_INSERTER";
|
const char *THERMAL_TEMP_INSERTER_STRING = "THERMAL_TEMP_INSERTER";
|
||||||
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
|
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
|
||||||
const char *NO_OBJECT_STRING = "NO_OBJECT";
|
const char *NO_OBJECT_STRING = "NO_OBJECT";
|
||||||
@ -220,6 +244,12 @@ const char *translateObject(object_id_t object) {
|
|||||||
return STAR_TRACKER_STRING;
|
return STAR_TRACKER_STRING;
|
||||||
case 0x44130045:
|
case 0x44130045:
|
||||||
return GPS_CONTROLLER_STRING;
|
return GPS_CONTROLLER_STRING;
|
||||||
|
case 0x44130046:
|
||||||
|
return GPS_0_HEALTH_DEV_STRING;
|
||||||
|
case 0x44130047:
|
||||||
|
return GPS_1_HEALTH_DEV_STRING;
|
||||||
|
case 0x44140013:
|
||||||
|
return IMTQ_POLLING_STRING;
|
||||||
case 0x44140014:
|
case 0x44140014:
|
||||||
return IMTQ_HANDLER_STRING;
|
return IMTQ_HANDLER_STRING;
|
||||||
case 0x442000A1:
|
case 0x442000A1:
|
||||||
@ -243,13 +273,21 @@ const char *translateObject(object_id_t object) {
|
|||||||
case 0x44330001:
|
case 0x44330001:
|
||||||
return PLOC_MEMORY_DUMPER_STRING;
|
return PLOC_MEMORY_DUMPER_STRING;
|
||||||
case 0x44330002:
|
case 0x44330002:
|
||||||
return STR_HELPER_STRING;
|
return STR_COM_IF_STRING;
|
||||||
case 0x44330003:
|
case 0x44330003:
|
||||||
return PLOC_MPSOC_HELPER_STRING;
|
return PLOC_MPSOC_HELPER_STRING;
|
||||||
case 0x44330004:
|
case 0x44330004:
|
||||||
return AXI_PTME_CONFIG_STRING;
|
return AXI_PTME_CONFIG_STRING;
|
||||||
case 0x44330005:
|
case 0x44330005:
|
||||||
return PTME_CONFIG_STRING;
|
return PTME_CONFIG_STRING;
|
||||||
|
case 0x44330006:
|
||||||
|
return PTME_VC0_LIVE_TM_STRING;
|
||||||
|
case 0x44330007:
|
||||||
|
return PTME_VC1_LOG_TM_STRING;
|
||||||
|
case 0x44330008:
|
||||||
|
return PTME_VC2_HK_TM_STRING;
|
||||||
|
case 0x44330009:
|
||||||
|
return PTME_VC3_CFDP_TM_STRING;
|
||||||
case 0x44330015:
|
case 0x44330015:
|
||||||
return PLOC_MPSOC_HANDLER_STRING;
|
return PLOC_MPSOC_HANDLER_STRING;
|
||||||
case 0x44330016:
|
case 0x44330016:
|
||||||
@ -306,16 +344,24 @@ const char *translateObject(object_id_t object) {
|
|||||||
return RTD_15_IC18_IMTQ_STRING;
|
return RTD_15_IC18_IMTQ_STRING;
|
||||||
case 0x445300A3:
|
case 0x445300A3:
|
||||||
return SYRLINKS_HANDLER_STRING;
|
return SYRLINKS_HANDLER_STRING;
|
||||||
|
case 0x445300A4:
|
||||||
|
return SYRLINKS_COM_HANDLER_STRING;
|
||||||
case 0x49000001:
|
case 0x49000001:
|
||||||
return ARDUINO_COM_IF_STRING;
|
return ARDUINO_COM_IF_STRING;
|
||||||
case 0x49000002:
|
case 0x49000002:
|
||||||
return DUMMY_COM_IF_STRING;
|
return DUMMY_COM_IF_STRING;
|
||||||
case 0x49010006:
|
case 0x49010006:
|
||||||
return SCEX_UART_READER_STRING;
|
return SCEX_UART_READER_STRING;
|
||||||
case 0x49020006:
|
|
||||||
return SPI_RTD_COM_IF_STRING;
|
|
||||||
case 0x49030003:
|
case 0x49030003:
|
||||||
return UART_COM_IF_STRING;
|
return UART_COM_IF_STRING;
|
||||||
|
case 0x49060004:
|
||||||
|
return ACS_BOARD_POLLING_TASK_STRING;
|
||||||
|
case 0x49060005:
|
||||||
|
return RW_POLLING_TASK_STRING;
|
||||||
|
case 0x49060006:
|
||||||
|
return SPI_RTD_COM_IF_STRING;
|
||||||
|
case 0x49060007:
|
||||||
|
return SUS_POLLING_TASK_STRING;
|
||||||
case 0x50000100:
|
case 0x50000100:
|
||||||
return CCSDS_PACKET_DISTRIBUTOR_STRING;
|
return CCSDS_PACKET_DISTRIBUTOR_STRING;
|
||||||
case 0x50000200:
|
case 0x50000200:
|
||||||
@ -366,6 +412,8 @@ const char *translateObject(object_id_t object) {
|
|||||||
return PUS_SERVICE_9_TIME_MGMT_STRING;
|
return PUS_SERVICE_9_TIME_MGMT_STRING;
|
||||||
case 0x53000011:
|
case 0x53000011:
|
||||||
return PUS_SERVICE_11_TC_SCHEDULER_STRING;
|
return PUS_SERVICE_11_TC_SCHEDULER_STRING;
|
||||||
|
case 0x53000015:
|
||||||
|
return PUS_SERVICE_15_TM_STORAGE_STRING;
|
||||||
case 0x53000017:
|
case 0x53000017:
|
||||||
return PUS_SERVICE_17_TEST_STRING;
|
return PUS_SERVICE_17_TEST_STRING;
|
||||||
case 0x53000020:
|
case 0x53000020:
|
||||||
@ -411,7 +459,7 @@ const char *translateObject(object_id_t object) {
|
|||||||
case 0x60000006:
|
case 0x60000006:
|
||||||
return HEATER_6_DRO_STRING;
|
return HEATER_6_DRO_STRING;
|
||||||
case 0x60000007:
|
case 0x60000007:
|
||||||
return HEATER_7_HPA_STRING;
|
return HEATER_7_SYRLINKS_STRING;
|
||||||
case 0x73000001:
|
case 0x73000001:
|
||||||
return ACS_BOARD_ASS_STRING;
|
return ACS_BOARD_ASS_STRING;
|
||||||
case 0x73000002:
|
case 0x73000002:
|
||||||
@ -419,9 +467,15 @@ const char *translateObject(object_id_t object) {
|
|||||||
case 0x73000003:
|
case 0x73000003:
|
||||||
return TCS_BOARD_ASS_STRING;
|
return TCS_BOARD_ASS_STRING;
|
||||||
case 0x73000004:
|
case 0x73000004:
|
||||||
return RW_ASS_STRING;
|
return RW_ASSY_STRING;
|
||||||
case 0x73000006:
|
case 0x73000006:
|
||||||
return CAM_SWITCHER_STRING;
|
return CAM_SWITCHER_STRING;
|
||||||
|
case 0x73000007:
|
||||||
|
return SYRLINKS_ASSY_STRING;
|
||||||
|
case 0x73000008:
|
||||||
|
return IMTQ_ASSY_STRING;
|
||||||
|
case 0x73000009:
|
||||||
|
return STR_ASSY_STRING;
|
||||||
case 0x73000100:
|
case 0x73000100:
|
||||||
return TM_FUNNEL_STRING;
|
return TM_FUNNEL_STRING;
|
||||||
case 0x73000101:
|
case 0x73000101:
|
||||||
@ -442,8 +496,26 @@ const char *translateObject(object_id_t object) {
|
|||||||
return TCS_SUBSYSTEM_STRING;
|
return TCS_SUBSYSTEM_STRING;
|
||||||
case 0x73010004:
|
case 0x73010004:
|
||||||
return COM_SUBSYSTEM_STRING;
|
return COM_SUBSYSTEM_STRING;
|
||||||
case 0x73500000:
|
case 0x73020001:
|
||||||
return CCSDS_IP_CORE_BRIDGE_STRING;
|
return MISC_TM_STORE_STRING;
|
||||||
|
case 0x73020002:
|
||||||
|
return OK_TM_STORE_STRING;
|
||||||
|
case 0x73020003:
|
||||||
|
return NOT_OK_TM_STORE_STRING;
|
||||||
|
case 0x73020004:
|
||||||
|
return HK_TM_STORE_STRING;
|
||||||
|
case 0x73030000:
|
||||||
|
return CFDP_TM_STORE_STRING;
|
||||||
|
case 0x73040000:
|
||||||
|
return LIVE_TM_TASK_STRING;
|
||||||
|
case 0x73040001:
|
||||||
|
return LOG_STORE_AND_TM_TASK_STRING;
|
||||||
|
case 0x73040002:
|
||||||
|
return HK_STORE_AND_TM_TASK_STRING;
|
||||||
|
case 0x73040003:
|
||||||
|
return CFDP_STORE_AND_TM_TASK_STRING;
|
||||||
|
case 0x73040004:
|
||||||
|
return DOWNLINK_RAM_STORE_STRING;
|
||||||
case 0x90000003:
|
case 0x90000003:
|
||||||
return THERMAL_TEMP_INSERTER_STRING;
|
return THERMAL_TEMP_INSERTER_STRING;
|
||||||
case 0xCAFECAFE:
|
case 0xCAFECAFE:
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "ObjectFactory.h"
|
#include "ObjectFactory.h"
|
||||||
#include "mission/core/scheduling.h"
|
#include "mission/scheduling.h"
|
||||||
#include "scheduling.h"
|
#include "scheduling.h"
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
@ -95,46 +95,43 @@ void scheduling::initTasks() {
|
|||||||
sif::error << "Add component UDP Polling failed" << std::endl;
|
sif::error << "Add component UDP Polling failed" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PUS Services */
|
PeriodicTaskIF* pusHighPrio = factory->createPeriodicTask(
|
||||||
PeriodicTaskIF* pusVerification = factory->createPeriodicTask(
|
"PUS_HIGH_PRIO", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
|
||||||
"PUS_VERIF", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
|
result = pusHighPrio->addComponent(objects::PUS_SERVICE_1_VERIFICATION);
|
||||||
result = pusVerification->addComponent(objects::PUS_SERVICE_1_VERIFICATION);
|
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
sif::error << "Object add component failed" << std::endl;
|
sif::error << "Object add component failed" << std::endl;
|
||||||
}
|
}
|
||||||
|
result = pusHighPrio->addComponent(objects::EVENT_MANAGER);
|
||||||
PeriodicTaskIF* eventHandling = factory->createPeriodicTask(
|
|
||||||
"EVENTS", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
|
|
||||||
result = eventHandling->addComponent(objects::EVENT_MANAGER);
|
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("EVENT_MNGR", objects::EVENT_MANAGER);
|
scheduling::printAddObjectError("EVENT_MGMT", objects::EVENT_MANAGER);
|
||||||
}
|
}
|
||||||
result = eventHandling->addComponent(objects::PUS_SERVICE_5_EVENT_REPORTING);
|
result = pusHighPrio->addComponent(objects::PUS_SERVICE_5_EVENT_REPORTING);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS5", objects::PUS_SERVICE_5_EVENT_REPORTING);
|
scheduling::printAddObjectError("PUS5", objects::PUS_SERVICE_5_EVENT_REPORTING);
|
||||||
}
|
}
|
||||||
|
|
||||||
PeriodicTaskIF* pusHighPrio = factory->createPeriodicTask(
|
|
||||||
"PUS_HIGH_PRIO", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
|
|
||||||
result = pusHighPrio->addComponent(objects::PUS_SERVICE_2_DEVICE_ACCESS);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
scheduling::printAddObjectError("PUS2", objects::PUS_SERVICE_2_DEVICE_ACCESS);
|
|
||||||
}
|
|
||||||
result = pusHighPrio->addComponent(objects::PUS_SERVICE_9_TIME_MGMT);
|
result = pusHighPrio->addComponent(objects::PUS_SERVICE_9_TIME_MGMT);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS9", objects::PUS_SERVICE_9_TIME_MGMT);
|
scheduling::printAddObjectError("PUS9", objects::PUS_SERVICE_9_TIME_MGMT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PeriodicTaskIF* pusMedPrio = factory->createPeriodicTask(
|
||||||
|
"PUS_MED_PRIO", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc);
|
||||||
|
result = pusHighPrio->addComponent(objects::PUS_SERVICE_2_DEVICE_ACCESS);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("PUS2", objects::PUS_SERVICE_2_DEVICE_ACCESS);
|
||||||
|
}
|
||||||
result = pusHighPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING);
|
result = pusHighPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS3", objects::PUS_SERVICE_3_HOUSEKEEPING);
|
scheduling::printAddObjectError("PUS3", objects::PUS_SERVICE_3_HOUSEKEEPING);
|
||||||
}
|
}
|
||||||
|
|
||||||
PeriodicTaskIF* pusMedPrio = factory->createPeriodicTask(
|
|
||||||
"PUS_MED_PRIO", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc);
|
|
||||||
result = pusMedPrio->addComponent(objects::PUS_SERVICE_8_FUNCTION_MGMT);
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_8_FUNCTION_MGMT);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS8", objects::PUS_SERVICE_8_FUNCTION_MGMT);
|
scheduling::printAddObjectError("PUS8", objects::PUS_SERVICE_8_FUNCTION_MGMT);
|
||||||
}
|
}
|
||||||
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_15_TM_STORAGE);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("PUS15", objects::PUS_SERVICE_15_TM_STORAGE);
|
||||||
|
}
|
||||||
result = pusMedPrio->addComponent(objects::PUS_SERVICE_200_MODE_MGMT);
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_200_MODE_MGMT);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS200", objects::PUS_SERVICE_200_MODE_MGMT);
|
scheduling::printAddObjectError("PUS200", objects::PUS_SERVICE_200_MODE_MGMT);
|
||||||
@ -143,10 +140,7 @@ void scheduling::initTasks() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS20", objects::PUS_SERVICE_20_PARAMETERS);
|
scheduling::printAddObjectError("PUS20", objects::PUS_SERVICE_20_PARAMETERS);
|
||||||
}
|
}
|
||||||
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_17_TEST);
|
||||||
PeriodicTaskIF* pusLowPrio = factory->createPeriodicTask(
|
|
||||||
"PUS_LOW_PRIO", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.6, missedDeadlineFunc);
|
|
||||||
result = pusLowPrio->addComponent(objects::PUS_SERVICE_17_TEST);
|
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS17", objects::PUS_SERVICE_17_TEST);
|
scheduling::printAddObjectError("PUS17", objects::PUS_SERVICE_17_TEST);
|
||||||
}
|
}
|
||||||
@ -157,11 +151,14 @@ void scheduling::initTasks() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("Core controller dummy", objects::CORE_CONTROLLER);
|
scheduling::printAddObjectError("Core controller dummy", objects::CORE_CONTROLLER);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = thermalTask->addComponent(objects::THERMAL_CONTROLLER);
|
result = thermalTask->addComponent(objects::THERMAL_CONTROLLER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("THERMAL_CONTROLLER", objects::THERMAL_CONTROLLER);
|
scheduling::printAddObjectError("THERMAL_CONTROLLER", objects::THERMAL_CONTROLLER);
|
||||||
}
|
}
|
||||||
|
result = thermalTask->addComponent(objects::HEATER_HANDLER);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("HEATER_HANDLER", objects::HEATER_HANDLER);
|
||||||
|
}
|
||||||
|
|
||||||
FixedTimeslotTaskIF* pstTask = factory->createFixedTimeslotTask(
|
FixedTimeslotTaskIF* pstTask = factory->createFixedTimeslotTask(
|
||||||
"DUMMY_PST", 75, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc);
|
"DUMMY_PST", 75, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc);
|
||||||
@ -199,7 +196,8 @@ void scheduling::initTasks() {
|
|||||||
#endif /* OBSW_ADD_TEST_CODE == 1 */
|
#endif /* OBSW_ADD_TEST_CODE == 1 */
|
||||||
|
|
||||||
PeriodicTaskIF* dummyTask = factory->createPeriodicTask(
|
PeriodicTaskIF* dummyTask = factory->createPeriodicTask(
|
||||||
"DUMMY_TASK", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc);
|
"DUMMY_TASK", 35, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc);
|
||||||
|
dummyTask->addComponent(objects::THERMAL_TEMP_INSERTER);
|
||||||
scheduling::scheduleTmpTempSensors(dummyTask);
|
scheduling::scheduleTmpTempSensors(dummyTask);
|
||||||
scheduling::scheduleRtdSensors(dummyTask);
|
scheduling::scheduleRtdSensors(dummyTask);
|
||||||
dummyTask->addComponent(objects::SUS_0_N_LOC_XFYFZM_PT_XF);
|
dummyTask->addComponent(objects::SUS_0_N_LOC_XFYFZM_PT_XF);
|
||||||
@ -220,11 +218,8 @@ void scheduling::initTasks() {
|
|||||||
udpPollingTask->startTask();
|
udpPollingTask->startTask();
|
||||||
tcpPollingTask->startTask();
|
tcpPollingTask->startTask();
|
||||||
|
|
||||||
pusVerification->startTask();
|
|
||||||
eventHandling->startTask();
|
|
||||||
pusHighPrio->startTask();
|
pusHighPrio->startTask();
|
||||||
pusMedPrio->startTask();
|
pusMedPrio->startTask();
|
||||||
pusLowPrio->startTask();
|
|
||||||
|
|
||||||
pstTask->startTask();
|
pstTask->startTask();
|
||||||
thermalTask->startTask();
|
thermalTask->startTask();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
target_sources(${OBSW_NAME} PUBLIC InitMission.cpp main.cpp gpioInit.cpp
|
target_sources(${OBSW_NAME} PUBLIC InitMission.cpp main.cpp gpioInit.cpp
|
||||||
ObjectFactory.cpp RPiSdCardManager.cpp)
|
ObjectFactory.cpp)
|
||||||
|
|
||||||
add_subdirectory(boardconfig)
|
add_subdirectory(boardconfig)
|
||||||
add_subdirectory(boardtest)
|
add_subdirectory(boardtest)
|
||||||
|
@ -82,7 +82,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_SCEX_DEVICE == 1
|
#if OBSW_ADD_SCEX_DEVICE == 1
|
||||||
auto* sdcMan = new RPiSdCardManager("/tmp");
|
auto* sdcMan = new DummySdCardManager("/tmp");
|
||||||
createScexComponents(uart::DEV, pwrSwitcher, *sdcMan, true, std::nullopt);
|
createScexComponents(uart::DEV, pwrSwitcher, *sdcMan, true, std::nullopt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
#include "RPiSdCardManager.h"
|
|
||||||
|
|
||||||
RPiSdCardManager::RPiSdCardManager(std::string prefix) : prefix(std::move(prefix)) {}
|
|
||||||
|
|
||||||
const std::string& RPiSdCardManager::getCurrentMountPrefix() const { return prefix; }
|
|
||||||
|
|
||||||
bool RPiSdCardManager::isSdCardUsable(sd::SdCard sdCard) { return true; }
|
|
||||||
|
|
||||||
std::optional<sd::SdCard> RPiSdCardManager::getPreferredSdCard() const { return std::nullopt; }
|
|
||||||
|
|
||||||
void RPiSdCardManager::setActiveSdCard(sd::SdCard sdCard) {}
|
|
||||||
|
|
||||||
std::optional<sd::SdCard> RPiSdCardManager::getActiveSdCard() const { return std::nullopt; }
|
|
@ -12,7 +12,6 @@ target_sources(${OBSW_NAME} PUBLIC main.cpp obsw.cpp)
|
|||||||
add_subdirectory(boardtest)
|
add_subdirectory(boardtest)
|
||||||
|
|
||||||
add_subdirectory(boardconfig)
|
add_subdirectory(boardconfig)
|
||||||
add_subdirectory(comIF)
|
|
||||||
add_subdirectory(core)
|
add_subdirectory(core)
|
||||||
|
|
||||||
if(EIVE_Q7S_EM)
|
if(EIVE_Q7S_EM)
|
||||||
|
@ -13,10 +13,12 @@
|
|||||||
/** All of the following flags should be enabled for mission code */
|
/** All of the following flags should be enabled for mission code */
|
||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
|
|
||||||
#define OBSW_ENABLE_PERIODIC_HK 0
|
// This enables a lot of periodically generated telemetry, so it can make sense to
|
||||||
#define OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT 0
|
// disable this for debugging purposes.
|
||||||
|
#define OBSW_ENABLE_PERIODIC_HK @OBSW_ENABLE_PERIODIC_HK@
|
||||||
|
|
||||||
// This switch will cause the SW to command the EIVE system object to safe mode. This will
|
// This switch will cause the SW to command the EIVE system object to safe mode. This will
|
||||||
// trigger a lot of events, so it can make sense to disable this for debugging purposes
|
// trigger a lot of events, so it can make sense to disable this for debugging purposes.
|
||||||
#define OBSW_COMMAND_SAFE_MODE_AT_STARTUP 1
|
#define OBSW_COMMAND_SAFE_MODE_AT_STARTUP 1
|
||||||
|
|
||||||
#define OBSW_ADD_GOMSPACE_PCDU @OBSW_ADD_GOMSPACE_PCDU@
|
#define OBSW_ADD_GOMSPACE_PCDU @OBSW_ADD_GOMSPACE_PCDU@
|
||||||
@ -29,8 +31,8 @@
|
|||||||
#define OBSW_ADD_SUS_BOARD_ASS @OBSW_ADD_SUS_BOARD_ASS@
|
#define OBSW_ADD_SUS_BOARD_ASS @OBSW_ADD_SUS_BOARD_ASS@
|
||||||
#define OBSW_ADD_ACS_BOARD @OBSW_ADD_ACS_BOARD@
|
#define OBSW_ADD_ACS_BOARD @OBSW_ADD_ACS_BOARD@
|
||||||
#define OBSW_ADD_ACS_CTRL 1
|
#define OBSW_ADD_ACS_CTRL 1
|
||||||
|
#define OBSW_ADD_TCS_CTRL 1
|
||||||
#define OBSW_ADD_GPS_CTRL @OBSW_ADD_GPS_CTRL@
|
#define OBSW_ADD_GPS_CTRL @OBSW_ADD_GPS_CTRL@
|
||||||
#define OBSW_ADD_TCS_CTRL @OBSW_ADD_TCS_CTRL@
|
|
||||||
#define OBSW_ADD_RW @OBSW_ADD_RW@
|
#define OBSW_ADD_RW @OBSW_ADD_RW@
|
||||||
#define OBSW_ADD_RTD_DEVICES @OBSW_ADD_RTD_DEVICES@
|
#define OBSW_ADD_RTD_DEVICES @OBSW_ADD_RTD_DEVICES@
|
||||||
#define OBSW_ADD_SA_DEPL @OBSW_ADD_SA_DEPL@
|
#define OBSW_ADD_SA_DEPL @OBSW_ADD_SA_DEPL@
|
||||||
@ -41,6 +43,9 @@
|
|||||||
#define OBSW_ADD_PL_PCDU @OBSW_ADD_PL_PCDU@
|
#define OBSW_ADD_PL_PCDU @OBSW_ADD_PL_PCDU@
|
||||||
#define OBSW_ADD_SYRLINKS @OBSW_ADD_SYRLINKS@
|
#define OBSW_ADD_SYRLINKS @OBSW_ADD_SYRLINKS@
|
||||||
#define OBSW_ADD_CCSDS_IP_CORES @OBSW_ADD_CCSDS_IP_CORES@
|
#define OBSW_ADD_CCSDS_IP_CORES @OBSW_ADD_CCSDS_IP_CORES@
|
||||||
|
// Only relevant for EM for TCS tests.
|
||||||
|
#define OBSW_ADD_THERMAL_TEMP_INSERTER @OBSW_ADD_THERMAL_TEMP_INSERTER@
|
||||||
|
|
||||||
// Set to 1 if all telemetry should be sent to the PTME IP Core
|
// Set to 1 if all telemetry should be sent to the PTME IP Core
|
||||||
#define OBSW_TM_TO_PTME @OBSW_TM_TO_PTME@
|
#define OBSW_TM_TO_PTME @OBSW_TM_TO_PTME@
|
||||||
// Set to 1 if telecommands are received via the PDEC IP Core
|
// Set to 1 if telecommands are received via the PDEC IP Core
|
||||||
@ -67,7 +72,7 @@
|
|||||||
#define OBSW_PRINT_MISSED_DEADLINES 1
|
#define OBSW_PRINT_MISSED_DEADLINES 1
|
||||||
|
|
||||||
#define OBSW_MPSOC_JTAG_BOOT 0
|
#define OBSW_MPSOC_JTAG_BOOT 0
|
||||||
#define OBSW_STAR_TRACKER_GROUND_CONFIG 1
|
#define OBSW_STAR_TRACKER_GROUND_CONFIG @OBSW_STAR_TRACKER_GROUND_CONFIG@
|
||||||
#define OBSW_SYRLINKS_SIMULATED @OBSW_SYRLINKS_SIMULATED@
|
#define OBSW_SYRLINKS_SIMULATED @OBSW_SYRLINKS_SIMULATED@
|
||||||
#define OBSW_ADD_TEST_CODE 0
|
#define OBSW_ADD_TEST_CODE 0
|
||||||
#define OBSW_ADD_TEST_TASK 0
|
#define OBSW_ADD_TEST_TASK 0
|
||||||
|
@ -28,9 +28,13 @@ static constexpr char UIO_PDEC_IRQ[] = "/dev/uio_pdec_irq";
|
|||||||
static constexpr int MAP_ID_PTME_CONFIG = 3;
|
static constexpr int MAP_ID_PTME_CONFIG = 3;
|
||||||
|
|
||||||
namespace uiomapids {
|
namespace uiomapids {
|
||||||
|
// Live TM
|
||||||
static const int PTME_VC0 = 0;
|
static const int PTME_VC0 = 0;
|
||||||
|
// OK/NOK/MISC Store
|
||||||
static const int PTME_VC1 = 1;
|
static const int PTME_VC1 = 1;
|
||||||
|
// HK store
|
||||||
static const int PTME_VC2 = 2;
|
static const int PTME_VC2 = 2;
|
||||||
|
// CFDP
|
||||||
static const int PTME_VC3 = 3;
|
static const int PTME_VC3 = 3;
|
||||||
static const int PTME_CONFIG = 4;
|
static const int PTME_CONFIG = 4;
|
||||||
} // namespace uiomapids
|
} // namespace uiomapids
|
||||||
@ -86,6 +90,8 @@ static constexpr char PAPB_BUSY_SIGNAL_VC2[] = "papb_busy_signal_vc2";
|
|||||||
static constexpr char PAPB_EMPTY_SIGNAL_VC2[] = "papb_empty_signal_vc2";
|
static constexpr char PAPB_EMPTY_SIGNAL_VC2[] = "papb_empty_signal_vc2";
|
||||||
static constexpr char PAPB_BUSY_SIGNAL_VC3[] = "papb_busy_signal_vc3";
|
static constexpr char PAPB_BUSY_SIGNAL_VC3[] = "papb_busy_signal_vc3";
|
||||||
static constexpr char PAPB_EMPTY_SIGNAL_VC3[] = "papb_empty_signal_vc3";
|
static constexpr char PAPB_EMPTY_SIGNAL_VC3[] = "papb_empty_signal_vc3";
|
||||||
|
static constexpr char PTME_RESETN[] = "ptme_resetn";
|
||||||
|
|
||||||
static constexpr char RS485_EN_TX_CLOCK[] = "tx_clock_enable_ltc2872";
|
static constexpr char RS485_EN_TX_CLOCK[] = "tx_clock_enable_ltc2872";
|
||||||
static constexpr char RS485_EN_TX_DATA[] = "tx_data_enable_ltc2872";
|
static constexpr char RS485_EN_TX_DATA[] = "tx_data_enable_ltc2872";
|
||||||
static constexpr char RS485_EN_RX_CLOCK[] = "rx_clock_enable_ltc2872";
|
static constexpr char RS485_EN_RX_CLOCK[] = "rx_clock_enable_ltc2872";
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
|
|
||||||
// Probably better if this is disabled for mission code. Convenient for development
|
// Probably better if this is disabled for mission code. Convenient for development
|
||||||
#define Q7S_CHECK_FOR_ALREADY_RUNNING_IMG 1
|
#define Q7S_CHECK_FOR_ALREADY_RUNNING_IMG @Q7S_CHECK_FOR_ALREADY_RUNNING_IMG@
|
||||||
|
|
||||||
#define Q7S_SIMPLE_ADD_FILE_SYSTEM_TEST 0
|
#define Q7S_SIMPLE_ADD_FILE_SYSTEM_TEST 0
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#ifndef BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_
|
#ifndef BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_
|
||||||
#define BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_
|
#define BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_
|
||||||
|
|
||||||
#include <cstdint>
|
#include <mission/power/gsDefs.h>
|
||||||
|
|
||||||
#include "mission/devices/devicedefinitions/GomspaceDefinitions.h"
|
#include <cstdint>
|
||||||
|
|
||||||
namespace pcdu {
|
namespace pcdu {
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include "fsfw/serviceinterface/ServiceInterface.h"
|
#include "fsfw/serviceinterface/ServiceInterface.h"
|
||||||
#include "fsfw_hal/linux/UnixFileGuard.h"
|
#include "fsfw_hal/linux/UnixFileGuard.h"
|
||||||
#include "fsfw_hal/linux/spi/SpiCookie.h"
|
#include "fsfw_hal/linux/spi/SpiCookie.h"
|
||||||
#include "mission/devices/RwHandler.h"
|
#include "mission/acs/RwHandler.h"
|
||||||
|
|
||||||
namespace rwSpiCallback {
|
namespace rwSpiCallback {
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast<ssize_t>(writeSize)) {
|
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast<ssize_t>(writeSize)) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
|
||||||
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
||||||
return RwHandler::SPI_WRITE_FAILURE;
|
return rws::SPI_WRITE_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Encoding and sending command */
|
/** Encoding and sending command */
|
||||||
@ -101,7 +101,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast<ssize_t>(writeSize)) {
|
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast<ssize_t>(writeSize)) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
|
||||||
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
||||||
return RwHandler::SPI_WRITE_FAILURE;
|
return rws::SPI_WRITE_FAILURE;
|
||||||
}
|
}
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
@ -113,7 +113,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast<ssize_t>(writeSize)) {
|
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast<ssize_t>(writeSize)) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
|
||||||
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
||||||
return RwHandler::SPI_WRITE_FAILURE;
|
return rws::SPI_WRITE_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* rxBuf = nullptr;
|
uint8_t* rxBuf = nullptr;
|
||||||
@ -128,7 +128,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
// There must be a delay of at least 20 ms after sending the command.
|
// There must be a delay of at least 20 ms after sending the command.
|
||||||
// Delay for 70 ms here and release the SPI bus for that duration.
|
// Delay for 70 ms here and release the SPI bus for that duration.
|
||||||
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
||||||
usleep(RwDefinitions::SPI_REPLY_DELAY);
|
usleep(rws::SPI_REPLY_DELAY);
|
||||||
result = openSpi(dev, O_RDWR, &gpioIF, gpioId, mutex, timeoutType, timeoutMs, fileDescriptor);
|
result = openSpi(dev, O_RDWR, &gpioIF, gpioId, mutex, timeoutType, timeoutMs, fileDescriptor);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
return result;
|
return result;
|
||||||
@ -139,17 +139,17 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
* However, receiving more than 5 empty frames will be interpreted as an error.
|
* However, receiving more than 5 empty frames will be interpreted as an error.
|
||||||
*/
|
*/
|
||||||
uint8_t byteRead = 0;
|
uint8_t byteRead = 0;
|
||||||
for (int idx = 0; idx < 10; idx++) {
|
for (idx = 0; idx < 10; idx++) {
|
||||||
if (read(fileDescriptor, &byteRead, 1) != 1) {
|
if (read(fileDescriptor, &byteRead, 1) != 1) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
|
||||||
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
||||||
return RwHandler::SPI_READ_FAILURE;
|
return rws::SPI_READ_FAILURE;
|
||||||
}
|
}
|
||||||
if (idx == 0) {
|
if (idx == 0) {
|
||||||
if (byteRead != FLAG_BYTE) {
|
if (byteRead != FLAG_BYTE) {
|
||||||
sif::error << "Invalid data, expected start marker" << std::endl;
|
sif::error << "Invalid data, expected start marker" << std::endl;
|
||||||
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
||||||
return RwHandler::NO_START_MARKER;
|
return rws::NO_START_MARKER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
if (idx == 9) {
|
if (idx == 9) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Empty frame timeout" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Empty frame timeout" << std::endl;
|
||||||
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
||||||
return RwHandler::NO_REPLY;
|
return rws::NO_REPLY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
byteRead = 0;
|
byteRead = 0;
|
||||||
if (read(fileDescriptor, &byteRead, 1) != 1) {
|
if (read(fileDescriptor, &byteRead, 1) != 1) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
|
||||||
result = RwHandler::SPI_READ_FAILURE;
|
result = rws::SPI_READ_FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,7 +186,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
} else if (byteRead == 0x7D) {
|
} else if (byteRead == 0x7D) {
|
||||||
if (read(fileDescriptor, &byteRead, 1) != 1) {
|
if (read(fileDescriptor, &byteRead, 1) != 1) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
|
||||||
result = RwHandler::SPI_READ_FAILURE;
|
result = rws::SPI_READ_FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (byteRead == 0x5E) {
|
if (byteRead == 0x5E) {
|
||||||
@ -200,7 +200,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
} else {
|
} else {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Invalid substitute" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Invalid substitute" << std::endl;
|
||||||
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
|
||||||
result = RwHandler::INVALID_SUBSTITUTE;
|
result = rws::INVALID_SUBSTITUTE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -217,14 +217,14 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
|
|||||||
if (decodedFrameLen == replyBufferSize) {
|
if (decodedFrameLen == replyBufferSize) {
|
||||||
if (read(fileDescriptor, &byteRead, 1) != 1) {
|
if (read(fileDescriptor, &byteRead, 1) != 1) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Failed to read last byte" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Failed to read last byte" << std::endl;
|
||||||
result = RwHandler::SPI_READ_FAILURE;
|
result = rws::SPI_READ_FAILURE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (byteRead != FLAG_BYTE) {
|
if (byteRead != FLAG_BYTE) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Missing end sign " << static_cast<int>(FLAG_BYTE)
|
sif::error << "rwSpiCallback::spiCallback: Missing end sign " << static_cast<int>(FLAG_BYTE)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
decodedFrameLen--;
|
decodedFrameLen--;
|
||||||
result = RwHandler::MISSING_END_SIGN;
|
result = rws::MISSING_END_SIGN;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,7 +252,7 @@ ReturnValue_t openSpi(const std::string& devname, int flags, GpioIF* gpioIF, gpi
|
|||||||
fd = open(devname.c_str(), flags);
|
fd = open(devname.c_str(), flags);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
sif::error << "rwSpiCallback::spiCallback: Failed to open device file" << std::endl;
|
sif::error << "rwSpiCallback::spiCallback: Failed to open device file" << std::endl;
|
||||||
return SpiComIF::OPENING_FILE_FAILED;
|
return spi::OPENING_FILE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pull SPI CS low. For now, no support for active high given
|
// Pull SPI CS low. For now, no support for active high given
|
||||||
|
@ -1 +0,0 @@
|
|||||||
target_sources(${OBSW_NAME} PRIVATE)
|
|
@ -1,4 +1,4 @@
|
|||||||
target_sources(${OBSW_NAME} PRIVATE CoreController.cpp scheduling.cpp
|
target_sources(${OBSW_NAME} PRIVATE CoreController.cpp scheduling.cpp
|
||||||
ObjectFactory.cpp)
|
ObjectFactory.cpp WatchdogHandler.cpp)
|
||||||
|
|
||||||
target_sources(${SIMPLE_OBSW_NAME} PRIVATE scheduling.cpp)
|
target_sources(${SIMPLE_OBSW_NAME} PRIVATE scheduling.cpp)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,16 @@
|
|||||||
#ifndef BSP_Q7S_CORE_CORECONTROLLER_H_
|
#ifndef BSP_Q7S_CORE_CORECONTROLLER_H_
|
||||||
#define BSP_Q7S_CORE_CORECONTROLLER_H_
|
#define BSP_Q7S_CORE_CORECONTROLLER_H_
|
||||||
|
|
||||||
|
#include <fsfw/container/DynamicFIFO.h>
|
||||||
|
#include <fsfw/container/SimpleRingBuffer.h>
|
||||||
#include <fsfw/globalfunctions/PeriodicOperationDivider.h>
|
#include <fsfw/globalfunctions/PeriodicOperationDivider.h>
|
||||||
|
#include <fsfw/parameters/ParameterHelper.h>
|
||||||
|
#include <fsfw/parameters/ReceivesParameterMessagesIF.h>
|
||||||
#include <libxiphos.h>
|
#include <libxiphos.h>
|
||||||
|
#include <mission/acs/archive/GPSDefinitions.h>
|
||||||
|
#include <mission/utility/trace.h>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
#include "CoreDefinitions.h"
|
#include "CoreDefinitions.h"
|
||||||
@ -11,18 +18,11 @@
|
|||||||
#include "bsp_q7s/fs/SdCardManager.h"
|
#include "bsp_q7s/fs/SdCardManager.h"
|
||||||
#include "events/subsystemIdRanges.h"
|
#include "events/subsystemIdRanges.h"
|
||||||
#include "fsfw/controller/ExtendedControllerBase.h"
|
#include "fsfw/controller/ExtendedControllerBase.h"
|
||||||
#include "mission/devices/devicedefinitions/GPSDefinitions.h"
|
#include "mission/sysDefs.h"
|
||||||
|
|
||||||
class Timer;
|
class Timer;
|
||||||
class SdCardManager;
|
class SdCardManager;
|
||||||
|
|
||||||
namespace xsc {
|
|
||||||
|
|
||||||
enum Chip : int { CHIP_0, CHIP_1, NO_CHIP, SELF_CHIP, ALL_CHIP };
|
|
||||||
enum Copy : int { COPY_0, COPY_1, NO_COPY, SELF_COPY, ALL_COPY };
|
|
||||||
|
|
||||||
} // namespace xsc
|
|
||||||
|
|
||||||
struct RebootFile {
|
struct RebootFile {
|
||||||
static constexpr uint8_t DEFAULT_MAX_BOOT_CNT = 10;
|
static constexpr uint8_t DEFAULT_MAX_BOOT_CNT = 10;
|
||||||
|
|
||||||
@ -44,8 +44,10 @@ struct RebootFile {
|
|||||||
xsc::Copy mechanismNextCopy = xsc::Copy::NO_COPY;
|
xsc::Copy mechanismNextCopy = xsc::Copy::NO_COPY;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CoreController : public ExtendedControllerBase {
|
class CoreController : public ExtendedControllerBase, public ReceivesParameterMessagesIF {
|
||||||
public:
|
public:
|
||||||
|
enum ParamId : uint8_t { PREF_SD = 0, NUM_IDS };
|
||||||
|
|
||||||
static xsc::Chip CURRENT_CHIP;
|
static xsc::Chip CURRENT_CHIP;
|
||||||
static xsc::Copy CURRENT_COPY;
|
static xsc::Copy CURRENT_COPY;
|
||||||
|
|
||||||
@ -53,72 +55,23 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
static constexpr char CHIP_STATE_FILE[] = "/tmp/chip_prot_status.txt";
|
static constexpr char CHIP_STATE_FILE[] = "/tmp/chip_prot_status.txt";
|
||||||
static constexpr char CURR_COPY_FILE[] = "/tmp/curr_copy.txt";
|
static constexpr char CURR_COPY_FILE[] = "/tmp/curr_copy.txt";
|
||||||
|
|
||||||
static constexpr char CONF_FOLDER[] = "conf";
|
|
||||||
|
|
||||||
static constexpr char VERSION_FILE_NAME[] = "version.txt";
|
|
||||||
static constexpr char REBOOT_FILE_NAME[] = "reboot.txt";
|
|
||||||
static constexpr char TIME_FILE_NAME[] = "time.txt";
|
|
||||||
|
|
||||||
const std::string VERSION_FILE =
|
const std::string VERSION_FILE =
|
||||||
"/" + std::string(CONF_FOLDER) + "/" + std::string(VERSION_FILE_NAME);
|
"/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::VERSION_FILE_NAME);
|
||||||
const std::string REBOOT_FILE =
|
const std::string REBOOT_FILE =
|
||||||
"/" + std::string(CONF_FOLDER) + "/" + std::string(REBOOT_FILE_NAME);
|
"/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::REBOOT_FILE_NAME);
|
||||||
const std::string TIME_FILE = "/" + std::string(CONF_FOLDER) + "/" + std::string(TIME_FILE_NAME);
|
const std::string BACKUP_TIME_FILE =
|
||||||
|
"/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::TIME_FILE_NAME);
|
||||||
|
|
||||||
static constexpr char CHIP_0_COPY_0_MOUNT_DIR[] = "/tmp/mntupdate-xdi-qspi0-nom-rootfs";
|
static constexpr char CHIP_0_COPY_0_MOUNT_DIR[] = "/tmp/mntupdate-xdi-qspi0-nom-rootfs";
|
||||||
static constexpr char CHIP_0_COPY_1_MOUNT_DIR[] = "/tmp/mntupdate-xdi-qspi0-gold-rootfs";
|
static constexpr char CHIP_0_COPY_1_MOUNT_DIR[] = "/tmp/mntupdate-xdi-qspi0-gold-rootfs";
|
||||||
static constexpr char CHIP_1_COPY_0_MOUNT_DIR[] = "/tmp/mntupdate-xdi-qspi1-nom-rootfs";
|
static constexpr char CHIP_1_COPY_0_MOUNT_DIR[] = "/tmp/mntupdate-xdi-qspi1-nom-rootfs";
|
||||||
static constexpr char CHIP_1_COPY_1_MOUNT_DIR[] = "/tmp/mntupdate-xdi-qspi1-gold-rootfs";
|
static constexpr char CHIP_1_COPY_1_MOUNT_DIR[] = "/tmp/mntupdate-xdi-qspi1-gold-rootfs";
|
||||||
|
static constexpr char LIST_DIR_DUMP_WORK_FILE[] = "/tmp/dir_listing.tmp";
|
||||||
|
|
||||||
static constexpr dur_millis_t INIT_SD_CARD_CHECK_TIMEOUT = 5000;
|
static constexpr dur_millis_t INIT_SD_CARD_CHECK_TIMEOUT = 5000;
|
||||||
static constexpr dur_millis_t DEFAULT_SD_CARD_CHECK_TIMEOUT = 60000;
|
static constexpr dur_millis_t DEFAULT_SD_CARD_CHECK_TIMEOUT = 60000;
|
||||||
|
|
||||||
static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0;
|
CoreController(object_id_t objectId, bool enableHkSet);
|
||||||
static constexpr ActionId_t ANNOUNCE_VERSION = 1;
|
|
||||||
static constexpr ActionId_t ANNOUNCE_CURRENT_IMAGE = 2;
|
|
||||||
static constexpr ActionId_t SWITCH_REBOOT_FILE_HANDLING = 5;
|
|
||||||
static constexpr ActionId_t RESET_REBOOT_COUNTERS = 6;
|
|
||||||
static constexpr ActionId_t SWITCH_IMG_LOCK = 7;
|
|
||||||
static constexpr ActionId_t SET_MAX_REBOOT_CNT = 8;
|
|
||||||
|
|
||||||
static constexpr ActionId_t OBSW_UPDATE_FROM_SD_0 = 10;
|
|
||||||
static constexpr ActionId_t OBSW_UPDATE_FROM_SD_1 = 11;
|
|
||||||
static constexpr ActionId_t OBSW_UPDATE_FROM_TMP = 12;
|
|
||||||
|
|
||||||
static constexpr ActionId_t SWITCH_TO_SD_0 = 16;
|
|
||||||
static constexpr ActionId_t SWITCH_TO_SD_1 = 17;
|
|
||||||
static constexpr ActionId_t SWITCH_TO_BOTH_SD_CARDS = 18;
|
|
||||||
|
|
||||||
//! Reboot using the xsc_boot_copy command
|
|
||||||
static constexpr ActionId_t XSC_REBOOT_OBC = 32;
|
|
||||||
static constexpr ActionId_t MOUNT_OTHER_COPY = 33;
|
|
||||||
//! Reboot using the reboot command
|
|
||||||
static constexpr ActionId_t REBOOT_OBC = 34;
|
|
||||||
|
|
||||||
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::CORE;
|
|
||||||
|
|
||||||
static constexpr Event ALLOC_FAILURE = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM);
|
|
||||||
//! [EXPORT] : [COMMENT] Software reboot occurred. Can also be a systemd reboot.
|
|
||||||
//! P1: Current Chip, P2: Current Copy
|
|
||||||
static constexpr Event REBOOT_SW = event::makeEvent(SUBSYSTEM_ID, 1, severity::MEDIUM);
|
|
||||||
//! [EXPORT] : [COMMENT] 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
|
|
||||||
static constexpr Event REBOOT_MECHANISM_TRIGGERED =
|
|
||||||
event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM);
|
|
||||||
//! Trying to find a way how to determine that the reboot came from ProASIC3 or PCDU..
|
|
||||||
static constexpr Event REBOOT_HW = event::makeEvent(SUBSYSTEM_ID, 3, severity::MEDIUM);
|
|
||||||
//! [EXPORT] : [COMMENT] No SD card was active. Core controller will attempt to re-initialize
|
|
||||||
//! a SD card.
|
|
||||||
static constexpr Event NO_SD_CARD_ACTIVE = event::makeEvent(SUBSYSTEM_ID, 4, severity::HIGH);
|
|
||||||
//! [EXPORT] : [COMMENT]
|
|
||||||
//! 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.
|
|
||||||
static constexpr Event VERSION_INFO = event::makeEvent(SUBSYSTEM_ID, 5, severity::INFO);
|
|
||||||
//! [EXPORT] : [COMMENT] P1: Current Chip, P2: Current Copy
|
|
||||||
static constexpr Event CURRENT_IMAGE_INFO = event::makeEvent(SUBSYSTEM_ID, 6, severity::INFO);
|
|
||||||
|
|
||||||
CoreController(object_id_t objectId);
|
|
||||||
virtual ~CoreController();
|
virtual ~CoreController();
|
||||||
|
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
@ -159,19 +112,18 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
bool sdInitFinished() const;
|
bool sdInitFinished() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static constexpr uint32_t BOOT_OFFSET_SECONDS = 15;
|
||||||
static constexpr MutexIF::TimeoutType TIMEOUT_TYPE = MutexIF::TimeoutType::WAITING;
|
static constexpr MutexIF::TimeoutType TIMEOUT_TYPE = MutexIF::TimeoutType::WAITING;
|
||||||
static constexpr uint32_t MUTEX_TIMEOUT = 20;
|
static constexpr uint32_t MUTEX_TIMEOUT = 20;
|
||||||
// Designated value for rechecking FIFO open
|
bool enableHkSet = false;
|
||||||
static constexpr int RETRY_FIFO_OPEN = -2;
|
|
||||||
int watchdogFifoFd = 0;
|
|
||||||
GpsHyperion::FixMode gpsFix = GpsHyperion::FixMode::UNKNOWN;
|
GpsHyperion::FixMode gpsFix = GpsHyperion::FixMode::UNKNOWN;
|
||||||
|
|
||||||
// States for SD state machine, which is used in non-blocking mode
|
// States for SD state machine, which is used in non-blocking mode
|
||||||
enum class SdStates {
|
enum class SdStates {
|
||||||
NONE,
|
NONE,
|
||||||
START,
|
START,
|
||||||
GET_INFO,
|
UPDATE_SD_INFO_START,
|
||||||
SET_STATE_SELF,
|
SKIP_TWO_CYCLES_IF_SD_LOCKED,
|
||||||
MOUNT_SELF,
|
MOUNT_SELF,
|
||||||
// Determine operations for other SD card, depending on redundancy configuration
|
// Determine operations for other SD card, depending on redundancy configuration
|
||||||
DETERMINE_OTHER,
|
DETERMINE_OTHER,
|
||||||
@ -181,7 +133,7 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
// Skip period because the shell command used to generate the info file sometimes is
|
// Skip period because the shell command used to generate the info file sometimes is
|
||||||
// missing the last performed operation if executed too early
|
// missing the last performed operation if executed too early
|
||||||
SKIP_CYCLE_BEFORE_INFO_UPDATE,
|
SKIP_CYCLE_BEFORE_INFO_UPDATE,
|
||||||
UPDATE_INFO,
|
UPDATE_SD_INFO_END,
|
||||||
// SD initialization done
|
// SD initialization done
|
||||||
IDLE
|
IDLE
|
||||||
};
|
};
|
||||||
@ -193,23 +145,30 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
SdCardManager* sdcMan = nullptr;
|
SdCardManager* sdcMan = nullptr;
|
||||||
MessageQueueIF* eventQueue = nullptr;
|
MessageQueueIF* eventQueue = nullptr;
|
||||||
|
|
||||||
|
uint8_t prefSdRaw = sd::SdCard::SLOT_0;
|
||||||
SdStates sdFsmState = SdStates::START;
|
SdStates sdFsmState = SdStates::START;
|
||||||
|
SdStates fsmStateAfterDelay = SdStates::IDLE;
|
||||||
enum SdCfgMode { PASSIVE, COLD_REDUNDANT, HOT_REDUNDANT };
|
enum SdCfgMode { PASSIVE, COLD_REDUNDANT, HOT_REDUNDANT };
|
||||||
|
|
||||||
struct SdFsmParams {
|
struct SdFsmParams {
|
||||||
SdCfgMode cfgMode = SdCfgMode::COLD_REDUNDANT;
|
SdCfgMode cfgMode = SdCfgMode::COLD_REDUNDANT;
|
||||||
sd::SdCard active = sd::SdCard::NONE;
|
sd::SdCard active = sd::SdCard::NONE;
|
||||||
sd::SdCard other = sd::SdCard::NONE;
|
sd::SdCard other = sd::SdCard::NONE;
|
||||||
sd::SdState activeState = sd::SdState::OFF;
|
|
||||||
sd::SdState otherState = sd::SdState::OFF;
|
|
||||||
std::string activeChar = "0";
|
std::string activeChar = "0";
|
||||||
std::string otherChar = "1";
|
std::string otherChar = "1";
|
||||||
|
sd::SdState activeState = sd::SdState::OFF;
|
||||||
|
sd::SdState otherState = sd::SdState::OFF;
|
||||||
std::pair<bool, bool> mountSwitch = {true, true};
|
std::pair<bool, bool> mountSwitch = {true, true};
|
||||||
// Used to track whether a command was executed
|
// This flag denotes that the SD card usage is locked. This is relevant if SD cards go off
|
||||||
bool commandExecuted = true;
|
// to leave appliation using the SD cards some time to detect the SD card is not usable anymore.
|
||||||
|
// This is relevant if the active SD card is being switched. The SD card will also be locked
|
||||||
|
// when going from hot-redundant mode to cold-redundant mode.
|
||||||
|
bool lockSdCardUsage = false;
|
||||||
|
bool commandPending = true;
|
||||||
bool initFinished = false;
|
bool initFinished = false;
|
||||||
SdCardManager::SdStatePair currentState;
|
SdCardManager::SdStatePair currentState;
|
||||||
uint16_t cycleCount = 0;
|
uint16_t cycleCount = 0;
|
||||||
|
uint16_t skippedCyclesCount = 0;
|
||||||
} sdInfo;
|
} sdInfo;
|
||||||
|
|
||||||
struct SdCommanding {
|
struct SdCommanding {
|
||||||
@ -219,9 +178,20 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
} sdCommandingInfo;
|
} sdCommandingInfo;
|
||||||
|
|
||||||
RebootFile rebootFile = {};
|
RebootFile rebootFile = {};
|
||||||
|
|
||||||
|
CommandExecutor cmdExecutor;
|
||||||
|
SimpleRingBuffer cmdReplyBuf;
|
||||||
|
DynamicFIFO<uint16_t> cmdRepliesSizes;
|
||||||
|
bool shellCmdIsExecuting = false;
|
||||||
|
MessageQueueId_t successRecipient = MessageQueueIF::NO_QUEUE;
|
||||||
|
|
||||||
std::string currMntPrefix;
|
std::string currMntPrefix;
|
||||||
|
bool timeFileInitDone = false;
|
||||||
bool performOneShotSdCardOpsSwitch = false;
|
bool performOneShotSdCardOpsSwitch = false;
|
||||||
uint8_t shortSdCardCdCounter = 0;
|
uint8_t shortSdCardCdCounter = 0;
|
||||||
|
#if OBSW_THREAD_TRACING == 1
|
||||||
|
uint32_t opCounter;
|
||||||
|
#endif
|
||||||
Countdown sdCardCheckCd = Countdown(INIT_SD_CARD_CHECK_TIMEOUT);
|
Countdown sdCardCheckCd = Countdown(INIT_SD_CARD_CHECK_TIMEOUT);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -240,10 +210,16 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
|
|
||||||
core::HkSet hkSet;
|
core::HkSet hkSet;
|
||||||
|
|
||||||
|
ParameterHelper paramHelper;
|
||||||
|
|
||||||
#if OBSW_SD_CARD_MUST_BE_ON == 1
|
#if OBSW_SD_CARD_MUST_BE_ON == 1
|
||||||
bool remountAttemptFlag = true;
|
bool remountAttemptFlag = true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
MessageQueueId_t getCommandQueue() const override;
|
||||||
|
ReturnValue_t getParameter(uint8_t domainId, uint8_t uniqueIdentifier,
|
||||||
|
ParameterWrapper* parameterWrapper, const ParameterWrapper* newValues,
|
||||||
|
uint16_t startAtIndex) override;
|
||||||
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
LocalDataPoolManager& poolManager) override;
|
LocalDataPoolManager& poolManager) override;
|
||||||
|
|
||||||
@ -254,16 +230,15 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
|
|
||||||
ReturnValue_t initClockFromTimeFile();
|
ReturnValue_t initClockFromTimeFile();
|
||||||
ReturnValue_t performSdCardCheck();
|
ReturnValue_t performSdCardCheck();
|
||||||
ReturnValue_t timeFileHandler();
|
ReturnValue_t backupTimeFileHandler();
|
||||||
ReturnValue_t initBootCopyFile();
|
ReturnValue_t initBootCopyFile();
|
||||||
ReturnValue_t initWatchdogFifo();
|
|
||||||
ReturnValue_t initSdCardBlocking();
|
ReturnValue_t initSdCardBlocking();
|
||||||
bool startSdStateMachine(sd::SdCard targetActiveSd, SdCfgMode mode, MessageQueueId_t commander,
|
bool startSdStateMachine(sd::SdCard targetActiveSd, SdCfgMode mode, MessageQueueId_t commander,
|
||||||
DeviceCommandId_t actionId);
|
DeviceCommandId_t actionId);
|
||||||
void initPrint();
|
void initPrint();
|
||||||
|
|
||||||
ReturnValue_t sdStateMachine();
|
ReturnValue_t sdStateMachine();
|
||||||
void updateSdInfoOther();
|
void updateInternalSdInfo();
|
||||||
ReturnValue_t sdCardSetup(sd::SdCard sdCard, sd::SdState targetState, std::string sdChar,
|
ReturnValue_t sdCardSetup(sd::SdCard sdCard, sd::SdState targetState, std::string sdChar,
|
||||||
bool printOutput = true);
|
bool printOutput = true);
|
||||||
ReturnValue_t executeSwUpdate(SwUpdateSources sourceDir, const uint8_t* data, size_t size);
|
ReturnValue_t executeSwUpdate(SwUpdateSources sourceDir, const uint8_t* data, size_t size);
|
||||||
@ -276,13 +251,17 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
|
|
||||||
ReturnValue_t actionListDirectoryIntoFile(ActionId_t actionId, MessageQueueId_t commandedBy,
|
ReturnValue_t actionListDirectoryIntoFile(ActionId_t actionId, MessageQueueId_t commandedBy,
|
||||||
const uint8_t* data, size_t size);
|
const uint8_t* data, size_t size);
|
||||||
|
ReturnValue_t actionListDirectoryDumpDirectly(ActionId_t actionId, MessageQueueId_t commandedBy,
|
||||||
|
const uint8_t* data, size_t size);
|
||||||
|
|
||||||
|
ReturnValue_t actionListDirectoryCommonCommandCreator(const uint8_t* data, size_t size,
|
||||||
|
std::ostringstream& oss);
|
||||||
|
|
||||||
ReturnValue_t actionXscReboot(const uint8_t* data, size_t size);
|
ReturnValue_t actionXscReboot(const uint8_t* data, size_t size);
|
||||||
ReturnValue_t actionReboot(const uint8_t* data, size_t size);
|
ReturnValue_t actionReboot(const uint8_t* data, size_t size);
|
||||||
|
|
||||||
ReturnValue_t gracefulShutdownTasks(xsc::Chip chip, xsc::Copy copy, bool& protOpPerformed);
|
ReturnValue_t gracefulShutdownTasks(xsc::Chip chip, xsc::Copy copy, bool& protOpPerformed);
|
||||||
|
|
||||||
void performWatchdogControlOperation();
|
|
||||||
|
|
||||||
ReturnValue_t handleProtInfoUpdateLine(std::string nextLine);
|
ReturnValue_t handleProtInfoUpdateLine(std::string nextLine);
|
||||||
int handleBootCopyProtAtIndex(xsc::Chip targetChip, xsc::Copy targetCopy, bool protect,
|
int handleBootCopyProtAtIndex(xsc::Chip targetChip, xsc::Copy targetCopy, bool protect,
|
||||||
bool& protOperationPerformed, bool selfChip, bool selfCopy,
|
bool& protOperationPerformed, bool selfChip, bool selfCopy,
|
||||||
@ -293,6 +272,7 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
void setRebootMechanismLock(bool lock, xsc::Chip tgtChip, xsc::Copy tgtCopy);
|
void setRebootMechanismLock(bool lock, xsc::Chip tgtChip, xsc::Copy tgtCopy);
|
||||||
bool parseRebootFile(std::string path, RebootFile& file);
|
bool parseRebootFile(std::string path, RebootFile& file);
|
||||||
void rewriteRebootFile(RebootFile file);
|
void rewriteRebootFile(RebootFile file);
|
||||||
|
void announceBootCounts();
|
||||||
void readHkData();
|
void readHkData();
|
||||||
bool isNumber(const std::string& s);
|
bool isNumber(const std::string& s);
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,35 @@
|
|||||||
#include "ObjectFactory.h"
|
#include "ObjectFactory.h"
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/HealthDevice.h>
|
||||||
#include <fsfw/subsystem/Subsystem.h>
|
#include <fsfw/subsystem/Subsystem.h>
|
||||||
|
#include <linux/acs/AcsBoardPolling.h>
|
||||||
|
#include <linux/acs/GpsHyperionLinuxController.h>
|
||||||
|
#include <linux/acs/ImtqPollingTask.h>
|
||||||
|
#include <linux/acs/RwPollingTask.h>
|
||||||
|
#include <linux/acs/StrComHandler.h>
|
||||||
|
#include <linux/com/SyrlinksComHandler.h>
|
||||||
|
#include <linux/payload/PlocMemoryDumper.h>
|
||||||
|
#include <linux/payload/PlocMpsocHandler.h>
|
||||||
|
#include <linux/payload/PlocMpsocHelper.h>
|
||||||
|
#include <linux/payload/PlocSupervisorHandler.h>
|
||||||
|
#include <linux/payload/ScexUartReader.h>
|
||||||
|
#include <linux/payload/plocMpscoDefs.h>
|
||||||
|
#include <linux/power/CspComIF.h>
|
||||||
|
#include <mission/acs/GyrL3gCustomHandler.h>
|
||||||
|
#include <mission/acs/MgmLis3CustomHandler.h>
|
||||||
|
#include <mission/acs/MgmRm3100CustomHandler.h>
|
||||||
|
#include <mission/acs/str/StarTrackerHandler.h>
|
||||||
|
#include <mission/acs/str/strHelpers.h>
|
||||||
|
#include <mission/com/LiveTmTask.h>
|
||||||
|
#include <mission/com/PersistentLogTmStoreTask.h>
|
||||||
|
#include <mission/com/PersistentSingleTmStoreTask.h>
|
||||||
|
#include <mission/power/CspCookie.h>
|
||||||
|
#include <mission/system/acs/ImtqAssembly.h>
|
||||||
|
#include <mission/system/acs/StrAssembly.h>
|
||||||
|
#include <mission/system/acs/StrFdir.h>
|
||||||
|
#include <mission/system/com/SyrlinksAssembly.h>
|
||||||
#include <mission/system/objects/CamSwitcher.h>
|
#include <mission/system/objects/CamSwitcher.h>
|
||||||
|
#include <mission/system/tcs/TmpDevFdir.h>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/boardtest/Q7STestTask.h"
|
#include "bsp_q7s/boardtest/Q7STestTask.h"
|
||||||
@ -22,42 +50,52 @@
|
|||||||
#include "linux/boardtest/SpiTestClass.h"
|
#include "linux/boardtest/SpiTestClass.h"
|
||||||
#include "linux/boardtest/UartTestClass.h"
|
#include "linux/boardtest/UartTestClass.h"
|
||||||
#include "linux/callbacks/gpioCallbacks.h"
|
#include "linux/callbacks/gpioCallbacks.h"
|
||||||
#include "linux/csp/CspComIF.h"
|
|
||||||
#include "linux/devices/GpsHyperionLinuxController.h"
|
|
||||||
#include "linux/devices/ScexUartReader.h"
|
|
||||||
#include "linux/devices/devicedefinitions/PlocMPSoCDefinitions.h"
|
|
||||||
#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
|
|
||||||
#include "linux/devices/ploc/PlocMPSoCHandler.h"
|
|
||||||
#include "linux/devices/ploc/PlocMPSoCHelper.h"
|
|
||||||
#include "linux/devices/ploc/PlocMemoryDumper.h"
|
|
||||||
#include "linux/devices/ploc/PlocSupervisorHandler.h"
|
|
||||||
#include "linux/devices/startracker/StarTrackerHandler.h"
|
|
||||||
#include "linux/devices/startracker/StrHelper.h"
|
|
||||||
#include "linux/ipcore/AxiPtmeConfig.h"
|
#include "linux/ipcore/AxiPtmeConfig.h"
|
||||||
#include "linux/ipcore/PapbVcInterface.h"
|
#include "linux/ipcore/PapbVcInterface.h"
|
||||||
#include "linux/ipcore/PdecHandler.h"
|
#include "linux/ipcore/PdecHandler.h"
|
||||||
#include "linux/ipcore/Ptme.h"
|
#include "linux/ipcore/Ptme.h"
|
||||||
#include "linux/ipcore/PtmeConfig.h"
|
#include "linux/ipcore/PtmeConfig.h"
|
||||||
#include "mission/csp/CspCookie.h"
|
#include "mission/config/configfile.h"
|
||||||
#include "mission/system/fdir/AcsBoardFdir.h"
|
#include "mission/system/acs/AcsBoardFdir.h"
|
||||||
#include "mission/system/fdir/GomspacePowerFdir.h"
|
#include "mission/system/acs/AcsSubsystem.h"
|
||||||
#include "mission/system/fdir/RtdFdir.h"
|
#include "mission/system/acs/RwAssembly.h"
|
||||||
#include "mission/system/fdir/SusFdir.h"
|
#include "mission/system/acs/SusFdir.h"
|
||||||
#include "mission/system/fdir/SyrlinksFdir.h"
|
#include "mission/system/acs/acsModeTree.h"
|
||||||
#include "mission/system/objects/AcsSubsystem.h"
|
#include "mission/system/com/SyrlinksFdir.h"
|
||||||
#include "mission/system/objects/RwAssembly.h"
|
#include "mission/system/com/comModeTree.h"
|
||||||
#include "mission/system/objects/TcsBoardAssembly.h"
|
#include "mission/system/power/GomspacePowerFdir.h"
|
||||||
#include "mission/system/tree/acsModeTree.h"
|
#include "mission/system/tcs/RtdFdir.h"
|
||||||
#include "mission/system/tree/comModeTree.h"
|
#include "mission/system/tcs/TcsBoardAssembly.h"
|
||||||
|
#include "mission/system/tcs/tcsModeTree.h"
|
||||||
#include "mission/system/tree/payloadModeTree.h"
|
#include "mission/system/tree/payloadModeTree.h"
|
||||||
#include "mission/system/tree/tcsModeTree.h"
|
#include "mission/tmtc/tmFilters.h"
|
||||||
|
#include "mission/utility/GlobalConfigHandler.h"
|
||||||
#include "tmtc/pusIds.h"
|
#include "tmtc/pusIds.h"
|
||||||
|
|
||||||
#if OBSW_TEST_LIBGPIOD == 1
|
#if OBSW_TEST_LIBGPIOD == 1
|
||||||
#include "linux/boardtest/LibgpiodTest.h"
|
#include "linux/boardtest/LibgpiodTest.h"
|
||||||
#endif
|
#endif
|
||||||
#include <mission/devices/ImtqHandler.h>
|
#include <mission/SolarArrayDeploymentHandler.h>
|
||||||
#include <mission/devices/PcduHandler.h>
|
#include <mission/acs/GyrAdis1650XHandler.h>
|
||||||
#include <mission/devices/SyrlinksHandler.h>
|
#include <mission/acs/ImtqHandler.h>
|
||||||
|
#include <mission/acs/rwHelpers.h>
|
||||||
|
#include <mission/com/SyrlinksHandler.h>
|
||||||
|
#include <mission/com/VirtualChannelWithQueue.h>
|
||||||
|
#include <mission/payload/PayloadPcduHandler.h>
|
||||||
|
#include <mission/payload/RadiationSensorHandler.h>
|
||||||
|
#include <mission/payload/payloadPcduDefinitions.h>
|
||||||
|
#include <mission/payload/radSensorDefinitions.h>
|
||||||
|
#include <mission/power/AcuHandler.h>
|
||||||
|
#include <mission/power/BpxBatteryHandler.h>
|
||||||
|
#include <mission/power/P60DockHandler.h>
|
||||||
|
#include <mission/power/PcduHandler.h>
|
||||||
|
#include <mission/power/Pdu1Handler.h>
|
||||||
|
#include <mission/power/Pdu2Handler.h>
|
||||||
|
#include <mission/power/gsDefs.h>
|
||||||
|
#include <mission/tcs/HeaterHandler.h>
|
||||||
|
#include <mission/tcs/Max31865Definitions.h>
|
||||||
|
#include <mission/tcs/Max31865PT1000Handler.h>
|
||||||
|
#include <mission/tcs/Tmp1075Handler.h>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
@ -77,32 +115,20 @@
|
|||||||
#include "fsfw_hal/linux/serial/SerialCookie.h"
|
#include "fsfw_hal/linux/serial/SerialCookie.h"
|
||||||
#include "fsfw_hal/linux/spi/SpiComIF.h"
|
#include "fsfw_hal/linux/spi/SpiComIF.h"
|
||||||
#include "fsfw_hal/linux/spi/SpiCookie.h"
|
#include "fsfw_hal/linux/spi/SpiCookie.h"
|
||||||
#include "mission/core/GenericFactory.h"
|
#include "mission/acs/RwHandler.h"
|
||||||
#include "mission/devices/ACUHandler.h"
|
#include "mission/com/CcsdsIpCoreHandler.h"
|
||||||
#include "mission/devices/BpxBatteryHandler.h"
|
#include "mission/com/syrlinksDefs.h"
|
||||||
#include "mission/devices/GyroADIS1650XHandler.h"
|
#include "mission/genericFactory.h"
|
||||||
#include "mission/devices/HeaterHandler.h"
|
#include "mission/system/acs/AcsBoardAssembly.h"
|
||||||
#include "mission/devices/Max31865PT1000Handler.h"
|
|
||||||
#include "mission/devices/P60DockHandler.h"
|
|
||||||
#include "mission/devices/PDU1Handler.h"
|
|
||||||
#include "mission/devices/PDU2Handler.h"
|
|
||||||
#include "mission/devices/PayloadPcduHandler.h"
|
|
||||||
#include "mission/devices/RadiationSensorHandler.h"
|
|
||||||
#include "mission/devices/RwHandler.h"
|
|
||||||
#include "mission/devices/SolarArrayDeploymentHandler.h"
|
|
||||||
#include "mission/devices/Tmp1075Handler.h"
|
|
||||||
#include "mission/devices/devicedefinitions/GomspaceDefinitions.h"
|
|
||||||
#include "mission/devices/devicedefinitions/Max31865Definitions.h"
|
|
||||||
#include "mission/devices/devicedefinitions/RadSensorDefinitions.h"
|
|
||||||
#include "mission/devices/devicedefinitions/RwDefinitions.h"
|
|
||||||
#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h"
|
|
||||||
#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h"
|
|
||||||
#include "mission/system/objects/AcsBoardAssembly.h"
|
|
||||||
#include "mission/tmtc/CcsdsIpCoreHandler.h"
|
|
||||||
#include "mission/tmtc/TmFunnelHandler.h"
|
#include "mission/tmtc/TmFunnelHandler.h"
|
||||||
#include "mission/tmtc/VirtualChannel.h"
|
|
||||||
|
using gpio::Direction;
|
||||||
|
using gpio::Levels;
|
||||||
|
|
||||||
ResetArgs RESET_ARGS_GNSS;
|
ResetArgs RESET_ARGS_GNSS;
|
||||||
|
std::atomic_bool LINK_STATE = CcsdsIpCoreHandler::LINK_DOWN;
|
||||||
|
std::atomic_bool PTME_LOCKED = false;
|
||||||
|
std::atomic_uint16_t I2C_FATAL_ERRORS = 0;
|
||||||
|
|
||||||
void Factory::setStaticFrameworkObjectIds() {
|
void Factory::setStaticFrameworkObjectIds() {
|
||||||
PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_PACKET_DISTRIBUTOR;
|
PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_PACKET_DISTRIBUTOR;
|
||||||
@ -140,6 +166,7 @@ void ObjectFactory::createTmpComponents() {
|
|||||||
new I2cCookie(tmpDevIds[idx].second, TMP1075::MAX_REPLY_LENGTH, q7s::I2C_PS_EIVE));
|
new I2cCookie(tmpDevIds[idx].second, TMP1075::MAX_REPLY_LENGTH, q7s::I2C_PS_EIVE));
|
||||||
auto* tmpDevHandler =
|
auto* tmpDevHandler =
|
||||||
new Tmp1075Handler(tmpDevIds[idx].first, objects::I2C_COM_IF, tmpDevCookies[idx]);
|
new Tmp1075Handler(tmpDevIds[idx].first, objects::I2C_COM_IF, tmpDevCookies[idx]);
|
||||||
|
tmpDevHandler->setCustomFdir(new TmpDevFdir(tmpDevIds[idx].first));
|
||||||
tmpDevHandler->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
tmpDevHandler->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
||||||
// TODO: Remove this after TCS subsystem was added
|
// TODO: Remove this after TCS subsystem was added
|
||||||
// These devices are connected to the 3V3 stack and should be powered permanently. Therefore,
|
// These devices are connected to the 3V3 stack and should be powered permanently. Therefore,
|
||||||
@ -150,44 +177,44 @@ void ObjectFactory::createTmpComponents() {
|
|||||||
|
|
||||||
void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF,
|
void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF,
|
||||||
SerialComIF** uartComIF, SpiComIF** spiMainComIF,
|
SerialComIF** uartComIF, SpiComIF** spiMainComIF,
|
||||||
I2cComIF** i2cComIF, SpiComIF** spiRWComIF) {
|
I2cComIF** i2cComIF) {
|
||||||
if (gpioComIF == nullptr or uartComIF == nullptr or spiMainComIF == nullptr or
|
if (gpioComIF == nullptr or uartComIF == nullptr or spiMainComIF == nullptr) {
|
||||||
spiRWComIF == nullptr) {
|
|
||||||
sif::error << "ObjectFactory::createCommunicationInterfaces: Invalid passed ComIF pointer"
|
sif::error << "ObjectFactory::createCommunicationInterfaces: Invalid passed ComIF pointer"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
*gpioComIF = new LinuxLibgpioIF(objects::GPIO_IF);
|
*gpioComIF = new LinuxLibgpioIF(objects::GPIO_IF);
|
||||||
|
|
||||||
/* Communication interfaces */
|
/* Communication interfaces */
|
||||||
new CspComIF(objects::CSP_COM_IF);
|
new CspComIF(objects::CSP_COM_IF, "CSP_ROUTER", 60);
|
||||||
*i2cComIF = new I2cComIF(objects::I2C_COM_IF);
|
*i2cComIF = new I2cComIF(objects::I2C_COM_IF);
|
||||||
*uartComIF = new SerialComIF(objects::UART_COM_IF);
|
*uartComIF = new SerialComIF(objects::UART_COM_IF);
|
||||||
*spiMainComIF = new SpiComIF(objects::SPI_MAIN_COM_IF, q7s::SPI_DEFAULT_DEV, **gpioComIF);
|
*spiMainComIF = new SpiComIF(objects::SPI_MAIN_COM_IF, q7s::SPI_DEFAULT_DEV, **gpioComIF);
|
||||||
*spiRWComIF = new SpiComIF(objects::SPI_RW_COM_IF, q7s::SPI_RW_DEV, **gpioComIF);
|
//*spiRWComIF = new SpiComIF(objects::SPI_RW_COM_IF, q7s::SPI_RW_DEV, **gpioComIF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher) {
|
void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher,
|
||||||
|
bool enableHkSets) {
|
||||||
CspCookie* p60DockCspCookie = new CspCookie(P60Dock::MAX_REPLY_SIZE, addresses::P60DOCK, 500);
|
CspCookie* p60DockCspCookie = new CspCookie(P60Dock::MAX_REPLY_SIZE, addresses::P60DOCK, 500);
|
||||||
CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_SIZE, addresses::PDU1, 500);
|
CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_SIZE, addresses::PDU1, 500);
|
||||||
CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_SIZE, addresses::PDU2, 500);
|
CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_SIZE, addresses::PDU2, 500);
|
||||||
CspCookie* acuCspCookie = new CspCookie(ACU::MAX_REPLY_SIZE, addresses::ACU, 500);
|
CspCookie* acuCspCookie = new CspCookie(ACU::MAX_REPLY_SIZE, addresses::ACU, 500);
|
||||||
|
|
||||||
auto p60Fdir = new GomspacePowerFdir(objects::P60DOCK_HANDLER);
|
auto p60Fdir = new GomspacePowerFdir(objects::P60DOCK_HANDLER);
|
||||||
P60DockHandler* p60dockhandler =
|
P60DockHandler* p60dockhandler = new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF,
|
||||||
new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF, p60DockCspCookie, p60Fdir);
|
p60DockCspCookie, p60Fdir, enableHkSets);
|
||||||
|
|
||||||
auto pdu1Fdir = new GomspacePowerFdir(objects::PDU1_HANDLER);
|
auto pdu1Fdir = new GomspacePowerFdir(objects::PDU1_HANDLER);
|
||||||
PDU1Handler* pdu1handler =
|
Pdu1Handler* pdu1handler = new Pdu1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF,
|
||||||
new PDU1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF, pdu1CspCookie, pdu1Fdir);
|
pdu1CspCookie, pdu1Fdir, enableHkSets);
|
||||||
|
|
||||||
auto pdu2Fdir = new GomspacePowerFdir(objects::PDU2_HANDLER);
|
auto pdu2Fdir = new GomspacePowerFdir(objects::PDU2_HANDLER);
|
||||||
PDU2Handler* pdu2handler =
|
Pdu2Handler* pdu2handler = new Pdu2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF,
|
||||||
new PDU2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie, pdu2Fdir);
|
pdu2CspCookie, pdu2Fdir, enableHkSets);
|
||||||
|
|
||||||
auto acuFdir = new GomspacePowerFdir(objects::ACU_HANDLER);
|
auto acuFdir = new GomspacePowerFdir(objects::ACU_HANDLER);
|
||||||
ACUHandler* acuhandler =
|
ACUHandler* acuhandler = new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie,
|
||||||
new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie, acuFdir);
|
acuFdir, enableHkSets);
|
||||||
auto pcduHandler = new PCDUHandler(objects::PCDU_HANDLER, 50);
|
auto pcduHandler = new PcduHandler(objects::PCDU_HANDLER, 50);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setting PCDU devices to mode normal immediately after start up because PCDU is always
|
* Setting PCDU devices to mode normal immediately after start up because PCDU is always
|
||||||
@ -238,121 +265,128 @@ ReturnValue_t ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF,
|
|||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialComIF* uartComIF,
|
void ObjectFactory::createAcsBoardGpios(GpioCookie& cookie) {
|
||||||
PowerSwitchIF* pwrSwitcher) {
|
|
||||||
using namespace gpio;
|
|
||||||
GpioCookie* gpioCookieAcsBoard = new GpioCookie();
|
|
||||||
std::vector<std::reference_wrapper<DeviceHandlerBase>> assemblyChildren;
|
|
||||||
|
|
||||||
std::stringstream consumer;
|
std::stringstream consumer;
|
||||||
GpiodRegularByLineName* gpio = nullptr;
|
GpiodRegularByLineName* gpio = nullptr;
|
||||||
consumer << "0x" << std::hex << objects::GYRO_0_ADIS_HANDLER;
|
consumer << "0x" << std::hex << objects::GYRO_0_ADIS_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_0_ADIS_CS, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_0_ADIS_CS, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GYRO_0_ADIS_CS, gpio);
|
cookie.addGpio(gpioIds::GYRO_0_ADIS_CS, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GYRO_1_L3G_HANDLER;
|
consumer << "0x" << std::hex << objects::GYRO_1_L3G_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_1_L3G_CS, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_1_L3G_CS, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GYRO_1_L3G_CS, gpio);
|
cookie.addGpio(gpioIds::GYRO_1_L3G_CS, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GYRO_2_ADIS_HANDLER;
|
consumer << "0x" << std::hex << objects::GYRO_2_ADIS_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_2_ADIS_CS, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_2_ADIS_CS, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GYRO_2_ADIS_CS, gpio);
|
cookie.addGpio(gpioIds::GYRO_2_ADIS_CS, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GYRO_3_L3G_HANDLER;
|
consumer << "0x" << std::hex << objects::GYRO_3_L3G_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_3_L3G_CS, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_3_L3G_CS, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GYRO_3_L3G_CS, gpio);
|
cookie.addGpio(gpioIds::GYRO_3_L3G_CS, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::MGM_0_LIS3_HANDLER;
|
consumer << "0x" << std::hex << objects::MGM_0_LIS3_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_0_CS, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_0_CS, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::MGM_0_LIS3_CS, gpio);
|
cookie.addGpio(gpioIds::MGM_0_LIS3_CS, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::MGM_1_RM3100_HANDLER;
|
consumer << "0x" << std::hex << objects::MGM_1_RM3100_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_1_CS, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_1_CS, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::MGM_1_RM3100_CS, gpio);
|
cookie.addGpio(gpioIds::MGM_1_RM3100_CS, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::MGM_2_LIS3_HANDLER;
|
consumer << "0x" << std::hex << objects::MGM_2_LIS3_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_2_CS, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_2_CS, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::MGM_2_LIS3_CS, gpio);
|
cookie.addGpio(gpioIds::MGM_2_LIS3_CS, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::MGM_3_RM3100_HANDLER;
|
consumer << "0x" << std::hex << objects::MGM_3_RM3100_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_3_CS, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_3_CS, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::MGM_3_RM3100_CS, gpio);
|
cookie.addGpio(gpioIds::MGM_3_RM3100_CS, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
||||||
// GNSS reset pins are active low
|
// GNSS reset pins are active low
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::RESET_GNSS_0, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::RESET_GNSS_0, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_0_NRESET, gpio);
|
cookie.addGpio(gpioIds::GNSS_0_NRESET, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::RESET_GNSS_1, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::RESET_GNSS_1, consumer.str(), Direction::OUT,
|
||||||
Levels::HIGH);
|
Levels::HIGH);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_1_NRESET, gpio);
|
cookie.addGpio(gpioIds::GNSS_1_NRESET, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GYRO_0_ADIS_HANDLER;
|
consumer << "0x" << std::hex << objects::GYRO_0_ADIS_HANDLER;
|
||||||
// Enable pins must be pulled low for regular operations
|
// Enable pins must be pulled low for regular operations
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_0_ENABLE, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_0_ENABLE, consumer.str(), Direction::OUT,
|
||||||
Levels::LOW);
|
Levels::LOW);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GYRO_0_ENABLE, gpio);
|
cookie.addGpio(gpioIds::GYRO_0_ENABLE, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GYRO_2_ADIS_HANDLER;
|
consumer << "0x" << std::hex << objects::GYRO_2_ADIS_HANDLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_2_ENABLE, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_2_ENABLE, consumer.str(), Direction::OUT,
|
||||||
Levels::LOW);
|
Levels::LOW);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GYRO_2_ENABLE, gpio);
|
cookie.addGpio(gpioIds::GYRO_2_ENABLE, gpio);
|
||||||
|
|
||||||
// Enable pins for GNSS
|
// Enable pins for GNSS
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_0_ENABLE, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_0_ENABLE, consumer.str(), Direction::OUT,
|
||||||
Levels::LOW);
|
Levels::LOW);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_0_ENABLE, gpio);
|
cookie.addGpio(gpioIds::GNSS_0_ENABLE, gpio);
|
||||||
|
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_1_ENABLE, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_1_ENABLE, consumer.str(), Direction::OUT,
|
||||||
Levels::LOW);
|
Levels::LOW);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_1_ENABLE, gpio);
|
cookie.addGpio(gpioIds::GNSS_1_ENABLE, gpio);
|
||||||
|
|
||||||
// Select pin. 0 for GPS side A, 1 for GPS side B
|
// Select pin. 0 for GPS side A, 1 for GPS side B
|
||||||
consumer.str("");
|
consumer.str("");
|
||||||
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_SELECT, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_SELECT, consumer.str(), Direction::OUT,
|
||||||
Levels::LOW);
|
Levels::LOW);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_SELECT, gpio);
|
cookie.addGpio(gpioIds::GNSS_SELECT, gpio);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ObjectFactory::createAcsBoardComponents(SpiComIF& spiComIF, LinuxLibgpioIF* gpioComIF,
|
||||||
|
SerialComIF* uartComIF, PowerSwitchIF& pwrSwitcher,
|
||||||
|
bool enableHkSets) {
|
||||||
|
using namespace gpio;
|
||||||
|
GpioCookie* gpioCookieAcsBoard = new GpioCookie();
|
||||||
|
createAcsBoardGpios(*gpioCookieAcsBoard);
|
||||||
gpioChecker(gpioComIF->addGpios(gpioCookieAcsBoard), "ACS Board");
|
gpioChecker(gpioComIF->addGpios(gpioCookieAcsBoard), "ACS Board");
|
||||||
|
|
||||||
AcsBoardFdir* fdir = nullptr;
|
AcsBoardFdir* fdir = nullptr;
|
||||||
static_cast<void>(fdir);
|
static_cast<void>(fdir);
|
||||||
|
|
||||||
#if OBSW_ADD_ACS_BOARD == 1
|
#if OBSW_ADD_ACS_BOARD == 1
|
||||||
|
new AcsBoardPolling(objects::ACS_BOARD_POLLING_TASK, spiComIF, *gpioComIF);
|
||||||
std::string spiDev = q7s::SPI_DEFAULT_DEV;
|
std::string spiDev = q7s::SPI_DEFAULT_DEV;
|
||||||
|
std::array<DeviceHandlerBase*, 8> assemblyChildren;
|
||||||
SpiCookie* spiCookie =
|
SpiCookie* spiCookie =
|
||||||
new SpiCookie(addresses::MGM_0_LIS3, gpioIds::MGM_0_LIS3_CS, MGMLIS3MDL::MAX_BUFFER_SIZE,
|
new SpiCookie(addresses::MGM_0_LIS3, gpioIds::MGM_0_LIS3_CS, mgmLis3::MAX_BUFFER_SIZE,
|
||||||
spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
|
spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
|
||||||
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
||||||
auto mgmLis3Handler0 = new MgmLIS3MDLHandler(
|
auto mgmLis3Handler0 =
|
||||||
objects::MGM_0_LIS3_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie, spi::LIS3_TRANSITION_DELAY);
|
new MgmLis3CustomHandler(objects::MGM_0_LIS3_HANDLER, objects::ACS_BOARD_POLLING_TASK,
|
||||||
|
spiCookie, spi::LIS3_TRANSITION_DELAY);
|
||||||
fdir = new AcsBoardFdir(objects::MGM_0_LIS3_HANDLER);
|
fdir = new AcsBoardFdir(objects::MGM_0_LIS3_HANDLER);
|
||||||
mgmLis3Handler0->setCustomFdir(fdir);
|
mgmLis3Handler0->setCustomFdir(fdir);
|
||||||
assemblyChildren.push_back(*mgmLis3Handler0);
|
assemblyChildren[0] = mgmLis3Handler0;
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
mgmLis3Handler->setStartUpImmediately();
|
mgmLis3Handler->setStartUpImmediately();
|
||||||
mgmLis3Handler->setToGoToNormalMode(true);
|
mgmLis3Handler->setToGoToNormalMode(true);
|
||||||
@ -361,15 +395,15 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialCo
|
|||||||
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
|
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
|
||||||
#endif
|
#endif
|
||||||
spiCookie =
|
spiCookie =
|
||||||
new SpiCookie(addresses::MGM_1_RM3100, gpioIds::MGM_1_RM3100_CS, RM3100::MAX_BUFFER_SIZE,
|
new SpiCookie(addresses::MGM_1_RM3100, gpioIds::MGM_1_RM3100_CS, mgmRm3100::MAX_BUFFER_SIZE,
|
||||||
spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
|
spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
|
||||||
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
||||||
auto mgmRm3100Handler1 =
|
auto mgmRm3100Handler1 =
|
||||||
new MgmRM3100Handler(objects::MGM_1_RM3100_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie,
|
new MgmRm3100CustomHandler(objects::MGM_1_RM3100_HANDLER, objects::ACS_BOARD_POLLING_TASK,
|
||||||
spi::RM3100_TRANSITION_DELAY);
|
spiCookie, spi::RM3100_TRANSITION_DELAY);
|
||||||
fdir = new AcsBoardFdir(objects::MGM_1_RM3100_HANDLER);
|
fdir = new AcsBoardFdir(objects::MGM_1_RM3100_HANDLER);
|
||||||
mgmRm3100Handler1->setCustomFdir(fdir);
|
mgmRm3100Handler1->setCustomFdir(fdir);
|
||||||
assemblyChildren.push_back(*mgmRm3100Handler1);
|
assemblyChildren[1] = mgmRm3100Handler1;
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
mgmRm3100Handler->setStartUpImmediately();
|
mgmRm3100Handler->setStartUpImmediately();
|
||||||
mgmRm3100Handler->setToGoToNormalMode(true);
|
mgmRm3100Handler->setToGoToNormalMode(true);
|
||||||
@ -377,15 +411,15 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialCo
|
|||||||
#if OBSW_DEBUG_ACS == 1
|
#if OBSW_DEBUG_ACS == 1
|
||||||
mgmRm3100Handler->enablePeriodicPrintouts(true, 10);
|
mgmRm3100Handler->enablePeriodicPrintouts(true, 10);
|
||||||
#endif
|
#endif
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::MGM_2_LIS3, gpioIds::MGM_2_LIS3_CS, mgmLis3::MAX_BUFFER_SIZE,
|
||||||
new SpiCookie(addresses::MGM_2_LIS3, gpioIds::MGM_2_LIS3_CS, MGMLIS3MDL::MAX_BUFFER_SIZE,
|
spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
|
||||||
spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
|
|
||||||
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
||||||
auto* mgmLis3Handler2 = new MgmLIS3MDLHandler(
|
auto* mgmLis3Handler2 =
|
||||||
objects::MGM_2_LIS3_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie, spi::LIS3_TRANSITION_DELAY);
|
new MgmLis3CustomHandler(objects::MGM_2_LIS3_HANDLER, objects::ACS_BOARD_POLLING_TASK,
|
||||||
|
spiCookie, spi::LIS3_TRANSITION_DELAY);
|
||||||
fdir = new AcsBoardFdir(objects::MGM_2_LIS3_HANDLER);
|
fdir = new AcsBoardFdir(objects::MGM_2_LIS3_HANDLER);
|
||||||
mgmLis3Handler2->setCustomFdir(fdir);
|
mgmLis3Handler2->setCustomFdir(fdir);
|
||||||
assemblyChildren.push_back(*mgmLis3Handler2);
|
assemblyChildren[2] = mgmLis3Handler2;
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
mgmLis3Handler->setStartUpImmediately();
|
mgmLis3Handler->setStartUpImmediately();
|
||||||
mgmLis3Handler->setToGoToNormalMode(true);
|
mgmLis3Handler->setToGoToNormalMode(true);
|
||||||
@ -394,15 +428,15 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialCo
|
|||||||
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
|
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
|
||||||
#endif
|
#endif
|
||||||
spiCookie =
|
spiCookie =
|
||||||
new SpiCookie(addresses::MGM_3_RM3100, gpioIds::MGM_3_RM3100_CS, RM3100::MAX_BUFFER_SIZE,
|
new SpiCookie(addresses::MGM_3_RM3100, gpioIds::MGM_3_RM3100_CS, mgmRm3100::MAX_BUFFER_SIZE,
|
||||||
spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
|
spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
|
||||||
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
||||||
auto* mgmRm3100Handler3 =
|
auto* mgmRm3100Handler3 =
|
||||||
new MgmRM3100Handler(objects::MGM_3_RM3100_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie,
|
new MgmRm3100CustomHandler(objects::MGM_3_RM3100_HANDLER, objects::ACS_BOARD_POLLING_TASK,
|
||||||
spi::RM3100_TRANSITION_DELAY);
|
spiCookie, spi::RM3100_TRANSITION_DELAY);
|
||||||
fdir = new AcsBoardFdir(objects::MGM_3_RM3100_HANDLER);
|
fdir = new AcsBoardFdir(objects::MGM_3_RM3100_HANDLER);
|
||||||
mgmRm3100Handler3->setCustomFdir(fdir);
|
mgmRm3100Handler3->setCustomFdir(fdir);
|
||||||
assemblyChildren.push_back(*mgmRm3100Handler3);
|
assemblyChildren[3] = mgmRm3100Handler3;
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
mgmRm3100Handler->setStartUpImmediately();
|
mgmRm3100Handler->setStartUpImmediately();
|
||||||
mgmRm3100Handler->setToGoToNormalMode(true);
|
mgmRm3100Handler->setToGoToNormalMode(true);
|
||||||
@ -413,15 +447,15 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialCo
|
|||||||
// Commented until ACS board V2 in in clean room again
|
// Commented until ACS board V2 in in clean room again
|
||||||
// Gyro 0 Side A
|
// Gyro 0 Side A
|
||||||
spiCookie =
|
spiCookie =
|
||||||
new SpiCookie(addresses::GYRO_0_ADIS, gpioIds::GYRO_0_ADIS_CS, ADIS1650X::MAXIMUM_REPLY_SIZE,
|
new SpiCookie(addresses::GYRO_0_ADIS, gpioIds::GYRO_0_ADIS_CS, adis1650x::MAXIMUM_REPLY_SIZE,
|
||||||
spi::DEFAULT_ADIS16507_MODE, spi::DEFAULT_ADIS16507_SPEED);
|
spi::DEFAULT_ADIS16507_MODE, spi::DEFAULT_ADIS16507_SPEED);
|
||||||
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
||||||
auto adisHandler =
|
auto adisHandler =
|
||||||
new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie,
|
new GyrAdis1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::ACS_BOARD_POLLING_TASK,
|
||||||
ADIS1650X::Type::ADIS16505);
|
spiCookie, adis1650x::Type::ADIS16505);
|
||||||
fdir = new AcsBoardFdir(objects::GYRO_0_ADIS_HANDLER);
|
fdir = new AcsBoardFdir(objects::GYRO_0_ADIS_HANDLER);
|
||||||
adisHandler->setCustomFdir(fdir);
|
adisHandler->setCustomFdir(fdir);
|
||||||
assemblyChildren.push_back(*adisHandler);
|
assemblyChildren[4] = adisHandler;
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
adisHandler->setStartUpImmediately();
|
adisHandler->setStartUpImmediately();
|
||||||
adisHandler->setToGoToNormalModeImmediately();
|
adisHandler->setToGoToNormalModeImmediately();
|
||||||
@ -430,14 +464,15 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialCo
|
|||||||
adisHandler->enablePeriodicPrintouts(true, 10);
|
adisHandler->enablePeriodicPrintouts(true, 10);
|
||||||
#endif
|
#endif
|
||||||
// Gyro 1 Side A
|
// Gyro 1 Side A
|
||||||
spiCookie = new SpiCookie(addresses::GYRO_1_L3G, gpioIds::GYRO_1_L3G_CS, L3GD20H::MAX_BUFFER_SIZE,
|
spiCookie = new SpiCookie(addresses::GYRO_1_L3G, gpioIds::GYRO_1_L3G_CS, l3gd20h::MAX_BUFFER_SIZE,
|
||||||
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
|
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
|
||||||
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
||||||
auto gyroL3gHandler1 = new GyroHandlerL3GD20H(
|
auto gyroL3gHandler1 =
|
||||||
objects::GYRO_1_L3G_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie, spi::L3G_TRANSITION_DELAY);
|
new GyrL3gCustomHandler(objects::GYRO_1_L3G_HANDLER, objects::ACS_BOARD_POLLING_TASK,
|
||||||
|
spiCookie, spi::L3G_TRANSITION_DELAY);
|
||||||
fdir = new AcsBoardFdir(objects::GYRO_1_L3G_HANDLER);
|
fdir = new AcsBoardFdir(objects::GYRO_1_L3G_HANDLER);
|
||||||
gyroL3gHandler1->setCustomFdir(fdir);
|
gyroL3gHandler1->setCustomFdir(fdir);
|
||||||
assemblyChildren.push_back(*gyroL3gHandler1);
|
assemblyChildren[5] = gyroL3gHandler1;
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
gyroL3gHandler->setStartUpImmediately();
|
gyroL3gHandler->setStartUpImmediately();
|
||||||
gyroL3gHandler->setToGoToNormalMode(true);
|
gyroL3gHandler->setToGoToNormalMode(true);
|
||||||
@ -447,27 +482,29 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialCo
|
|||||||
#endif
|
#endif
|
||||||
// Gyro 2 Side B
|
// Gyro 2 Side B
|
||||||
spiCookie =
|
spiCookie =
|
||||||
new SpiCookie(addresses::GYRO_2_ADIS, gpioIds::GYRO_2_ADIS_CS, ADIS1650X::MAXIMUM_REPLY_SIZE,
|
new SpiCookie(addresses::GYRO_2_ADIS, gpioIds::GYRO_2_ADIS_CS, adis1650x::MAXIMUM_REPLY_SIZE,
|
||||||
spi::DEFAULT_ADIS16507_MODE, spi::DEFAULT_ADIS16507_SPEED);
|
spi::DEFAULT_ADIS16507_MODE, spi::DEFAULT_ADIS16507_SPEED);
|
||||||
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
||||||
adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_MAIN_COM_IF,
|
adisHandler =
|
||||||
spiCookie, ADIS1650X::Type::ADIS16505);
|
new GyrAdis1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::ACS_BOARD_POLLING_TASK,
|
||||||
|
spiCookie, adis1650x::Type::ADIS16505);
|
||||||
fdir = new AcsBoardFdir(objects::GYRO_2_ADIS_HANDLER);
|
fdir = new AcsBoardFdir(objects::GYRO_2_ADIS_HANDLER);
|
||||||
adisHandler->setCustomFdir(fdir);
|
adisHandler->setCustomFdir(fdir);
|
||||||
assemblyChildren.push_back(*adisHandler);
|
assemblyChildren[6] = adisHandler;
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
adisHandler->setStartUpImmediately();
|
adisHandler->setStartUpImmediately();
|
||||||
adisHandler->setToGoToNormalModeImmediately();
|
adisHandler->setToGoToNormalModeImmediately();
|
||||||
#endif
|
#endif
|
||||||
// Gyro 3 Side B
|
// Gyro 3 Side B
|
||||||
spiCookie = new SpiCookie(addresses::GYRO_3_L3G, gpioIds::GYRO_3_L3G_CS, L3GD20H::MAX_BUFFER_SIZE,
|
spiCookie = new SpiCookie(addresses::GYRO_3_L3G, gpioIds::GYRO_3_L3G_CS, l3gd20h::MAX_BUFFER_SIZE,
|
||||||
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
|
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
|
||||||
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
spiCookie->setMutexParams(MutexIF::TimeoutType::WAITING, spi::ACS_BOARD_CS_TIMEOUT);
|
||||||
auto gyroL3gHandler3 = new GyroHandlerL3GD20H(
|
auto gyroL3gHandler3 =
|
||||||
objects::GYRO_3_L3G_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie, spi::L3G_TRANSITION_DELAY);
|
new GyrL3gCustomHandler(objects::GYRO_3_L3G_HANDLER, objects::ACS_BOARD_POLLING_TASK,
|
||||||
|
spiCookie, spi::L3G_TRANSITION_DELAY);
|
||||||
fdir = new AcsBoardFdir(objects::GYRO_3_L3G_HANDLER);
|
fdir = new AcsBoardFdir(objects::GYRO_3_L3G_HANDLER);
|
||||||
gyroL3gHandler3->setCustomFdir(fdir);
|
gyroL3gHandler3->setCustomFdir(fdir);
|
||||||
assemblyChildren.push_back(*gyroL3gHandler3);
|
assemblyChildren[7] = gyroL3gHandler3;
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
gyroL3gHandler->setStartUpImmediately();
|
gyroL3gHandler->setStartUpImmediately();
|
||||||
gyroL3gHandler->setToGoToNormalMode(true);
|
gyroL3gHandler->setToGoToNormalMode(true);
|
||||||
@ -481,26 +518,11 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialCo
|
|||||||
#endif
|
#endif
|
||||||
RESET_ARGS_GNSS.gpioComIF = gpioComIF;
|
RESET_ARGS_GNSS.gpioComIF = gpioComIF;
|
||||||
RESET_ARGS_GNSS.waitPeriodMs = 100;
|
RESET_ARGS_GNSS.waitPeriodMs = 100;
|
||||||
auto gpsCtrl =
|
auto gpsCtrl = new GpsHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT,
|
||||||
new GpsHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps);
|
enableHkSets, debugGps);
|
||||||
gpsCtrl->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS);
|
gpsCtrl->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS);
|
||||||
|
|
||||||
AcsBoardHelper acsBoardHelper = AcsBoardHelper(
|
ObjectFactory::createAcsBoardAssy(pwrSwitcher, assemblyChildren, gpsCtrl, gpioComIF);
|
||||||
objects::MGM_0_LIS3_HANDLER, objects::MGM_1_RM3100_HANDLER, objects::MGM_2_LIS3_HANDLER,
|
|
||||||
objects::MGM_3_RM3100_HANDLER, objects::GYRO_0_ADIS_HANDLER, objects::GYRO_1_L3G_HANDLER,
|
|
||||||
objects::GYRO_2_ADIS_HANDLER, objects::GYRO_3_L3G_HANDLER, objects::GPS_CONTROLLER);
|
|
||||||
auto acsAss =
|
|
||||||
new AcsBoardAssembly(objects::ACS_BOARD_ASS, pwrSwitcher, acsBoardHelper, gpioComIF);
|
|
||||||
static_cast<void>(acsAss);
|
|
||||||
for (auto& assChild : assemblyChildren) {
|
|
||||||
ReturnValue_t result = assChild.get().connectModeTreeParent(*acsAss);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
sif::error << "Connecting assembly for ACS board component " << assChild.get().getObjectId()
|
|
||||||
<< " failed" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gpsCtrl->connectModeTreeParent(*acsAss);
|
|
||||||
acsAss->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
|
||||||
#endif /* OBSW_ADD_ACS_HANDLERS == 1 */
|
#endif /* OBSW_ADD_ACS_HANDLERS == 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,23 +594,25 @@ void ObjectFactory::createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitc
|
|||||||
}
|
}
|
||||||
|
|
||||||
new SolarArrayDeploymentHandler(objects::SOLAR_ARRAY_DEPL_HANDLER, gpioIF, pwrSwitcher,
|
new SolarArrayDeploymentHandler(objects::SOLAR_ARRAY_DEPL_HANDLER, gpioIF, pwrSwitcher,
|
||||||
pcdu::Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V,
|
power::Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V,
|
||||||
gpioIds::DEPLSA1, gpioIds::DEPLSA2, *SdCardManager::instance());
|
gpioIds::DEPLSA1, gpioIds::DEPLSA2, *SdCardManager::instance());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) {
|
void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) {
|
||||||
auto* syrlinksUartCookie =
|
auto* syrlinksUartCookie =
|
||||||
new SerialCookie(objects::SYRLINKS_HANDLER, q7s::UART_SYRLINKS_DEV, uart::SYRLINKS_BAUD,
|
new SerialCookie(objects::SYRLINKS_HANDLER, q7s::UART_SYRLINKS_DEV, serial::SYRLINKS_BAUD,
|
||||||
syrlinks::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
|
syrlinks::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
|
||||||
syrlinksUartCookie->setParityEven();
|
syrlinksUartCookie->setParityEven();
|
||||||
|
|
||||||
|
new SyrlinksComHandler(objects::SYRLINKS_COM_HANDLER);
|
||||||
|
auto* syrlinksAssy = new SyrlinksAssembly(objects::SYRLINKS_ASSY);
|
||||||
|
syrlinksAssy->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
||||||
auto syrlinksFdir = new SyrlinksFdir(objects::SYRLINKS_HANDLER);
|
auto syrlinksFdir = new SyrlinksFdir(objects::SYRLINKS_HANDLER);
|
||||||
auto syrlinksHandler =
|
auto syrlinksHandler =
|
||||||
new SyrlinksHandler(objects::SYRLINKS_HANDLER, objects::UART_COM_IF, syrlinksUartCookie,
|
new SyrlinksHandler(objects::SYRLINKS_HANDLER, objects::SYRLINKS_COM_HANDLER,
|
||||||
pcdu::PDU1_CH1_SYRLINKS_12V, syrlinksFdir);
|
syrlinksUartCookie, power::PDU1_CH1_SYRLINKS_12V, syrlinksFdir);
|
||||||
syrlinksHandler->setPowerSwitcher(pwrSwitcher);
|
syrlinksHandler->setPowerSwitcher(pwrSwitcher);
|
||||||
syrlinksHandler->setStartUpImmediately();
|
syrlinksHandler->connectModeTreeParent(*syrlinksAssy);
|
||||||
syrlinksHandler->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
|
||||||
#if OBSW_DEBUG_SYRLINKS == 1
|
#if OBSW_DEBUG_SYRLINKS == 1
|
||||||
syrlinksHandler->setDebugMode(true);
|
syrlinksHandler->setDebugMode(true);
|
||||||
#endif
|
#endif
|
||||||
@ -598,8 +622,8 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwit
|
|||||||
using namespace gpio;
|
using namespace gpio;
|
||||||
std::stringstream consumer;
|
std::stringstream consumer;
|
||||||
auto* camSwitcher =
|
auto* camSwitcher =
|
||||||
new CamSwitcher(objects::CAM_SWITCHER, pwrSwitch, pcdu::PDU2_CH8_PAYLOAD_CAMERA);
|
new CamSwitcher(objects::CAM_SWITCHER, pwrSwitch, power::PDU2_CH8_PAYLOAD_CAMERA);
|
||||||
camSwitcher->connectModeTreeParent(satsystem::pl::SUBSYSTEM);
|
camSwitcher->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
#if OBSW_ADD_PLOC_MPSOC == 1
|
#if OBSW_ADD_PLOC_MPSOC == 1
|
||||||
consumer << "0x" << std::hex << objects::PLOC_MPSOC_HANDLER;
|
consumer << "0x" << std::hex << objects::PLOC_MPSOC_HANDLER;
|
||||||
auto gpioConfigMPSoC = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_MPSOC_UART,
|
auto gpioConfigMPSoC = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_MPSOC_UART,
|
||||||
@ -608,14 +632,14 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwit
|
|||||||
mpsocGpioCookie->addGpio(gpioIds::ENABLE_MPSOC_UART, gpioConfigMPSoC);
|
mpsocGpioCookie->addGpio(gpioIds::ENABLE_MPSOC_UART, gpioConfigMPSoC);
|
||||||
gpioChecker(gpioComIF->addGpios(mpsocGpioCookie), "PLOC MPSoC");
|
gpioChecker(gpioComIF->addGpios(mpsocGpioCookie), "PLOC MPSoC");
|
||||||
auto mpsocCookie =
|
auto mpsocCookie =
|
||||||
new SerialCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV, uart::PLOC_MPSOC_BAUD,
|
new SerialCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV,
|
||||||
mpsoc::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
|
serial::PLOC_MPSOC_BAUD, mpsoc::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
|
||||||
mpsocCookie->setNoFixedSizeReply();
|
mpsocCookie->setNoFixedSizeReply();
|
||||||
auto plocMpsocHelper = new PlocMPSoCHelper(objects::PLOC_MPSOC_HELPER);
|
auto plocMpsocHelper = new PlocMPSoCHelper(objects::PLOC_MPSOC_HELPER);
|
||||||
auto* mpsocHandler = new PlocMPSoCHandler(
|
auto* mpsocHandler = new PlocMPSoCHandler(
|
||||||
objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, mpsocCookie, plocMpsocHelper,
|
objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, mpsocCookie, plocMpsocHelper,
|
||||||
Gpio(gpioIds::ENABLE_MPSOC_UART, gpioComIF), objects::PLOC_SUPERVISOR_HANDLER);
|
Gpio(gpioIds::ENABLE_MPSOC_UART, gpioComIF), objects::PLOC_SUPERVISOR_HANDLER);
|
||||||
mpsocHandler->connectModeTreeParent(satsystem::pl::SUBSYSTEM);
|
mpsocHandler->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
#endif /* OBSW_ADD_PLOC_MPSOC == 1 */
|
#endif /* OBSW_ADD_PLOC_MPSOC == 1 */
|
||||||
#if OBSW_ADD_PLOC_SUPERVISOR == 1
|
#if OBSW_ADD_PLOC_SUPERVISOR == 1
|
||||||
consumer << "0x" << std::hex << objects::PLOC_SUPERVISOR_HANDLER;
|
consumer << "0x" << std::hex << objects::PLOC_SUPERVISOR_HANDLER;
|
||||||
@ -624,15 +648,15 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwit
|
|||||||
auto supvGpioCookie = new GpioCookie;
|
auto supvGpioCookie = new GpioCookie;
|
||||||
supvGpioCookie->addGpio(gpioIds::ENABLE_SUPV_UART, gpioConfigSupv);
|
supvGpioCookie->addGpio(gpioIds::ENABLE_SUPV_UART, gpioConfigSupv);
|
||||||
gpioComIF->addGpios(supvGpioCookie);
|
gpioComIF->addGpios(supvGpioCookie);
|
||||||
auto supervisorCookie =
|
auto supervisorCookie = new SerialCookie(objects::PLOC_SUPERVISOR_HANDLER,
|
||||||
new SerialCookie(objects::PLOC_SUPERVISOR_HANDLER, q7s::UART_PLOC_SUPERVSIOR_DEV,
|
q7s::UART_PLOC_SUPERVSIOR_DEV, serial::PLOC_SUPV_BAUD,
|
||||||
uart::PLOC_SUPV_BAUD, supv::MAX_PACKET_SIZE * 20, UartModes::NON_CANONICAL);
|
supv::MAX_PACKET_SIZE * 20, UartModes::NON_CANONICAL);
|
||||||
supervisorCookie->setNoFixedSizeReply();
|
supervisorCookie->setNoFixedSizeReply();
|
||||||
auto supvHelper = new PlocSupvUartManager(objects::PLOC_SUPERVISOR_HELPER);
|
auto supvHelper = new PlocSupvUartManager(objects::PLOC_SUPERVISOR_HELPER);
|
||||||
auto* supvHandler = new PlocSupervisorHandler(objects::PLOC_SUPERVISOR_HANDLER, supervisorCookie,
|
auto* supvHandler = new PlocSupervisorHandler(objects::PLOC_SUPERVISOR_HANDLER, supervisorCookie,
|
||||||
Gpio(gpioIds::ENABLE_SUPV_UART, gpioComIF),
|
Gpio(gpioIds::ENABLE_SUPV_UART, gpioComIF),
|
||||||
pcdu::PDU1_CH6_PLOC_12V, *supvHelper);
|
power::PDU1_CH6_PLOC_12V, *supvHelper);
|
||||||
supvHandler->connectModeTreeParent(satsystem::pl::SUBSYSTEM);
|
supvHandler->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
#endif /* OBSW_ADD_PLOC_SUPERVISOR == 1 */
|
#endif /* OBSW_ADD_PLOC_SUPERVISOR == 1 */
|
||||||
static_cast<void>(consumer);
|
static_cast<void>(consumer);
|
||||||
}
|
}
|
||||||
@ -692,85 +716,65 @@ void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF,
|
|||||||
std::array<object_id_t, 4> rwIds = {objects::RW1, objects::RW2, objects::RW3, objects::RW4};
|
std::array<object_id_t, 4> rwIds = {objects::RW1, objects::RW2, objects::RW3, objects::RW4};
|
||||||
std::array<gpioId_t, 4> rwGpioIds = {gpioIds::EN_RW1, gpioIds::EN_RW2, gpioIds::EN_RW3,
|
std::array<gpioId_t, 4> rwGpioIds = {gpioIds::EN_RW1, gpioIds::EN_RW2, gpioIds::EN_RW3,
|
||||||
gpioIds::EN_RW4};
|
gpioIds::EN_RW4};
|
||||||
std::array<RwHandler*, 4> rws = {};
|
std::array<DeviceHandlerBase*, 4> rws = {};
|
||||||
|
new RwPollingTask(objects::RW_POLLING_TASK, q7s::SPI_RW_DEV, *gpioComIF);
|
||||||
for (uint8_t idx = 0; idx < rwCookies.size(); idx++) {
|
for (uint8_t idx = 0; idx < rwCookies.size(); idx++) {
|
||||||
rwCookies[idx] = new SpiCookie(rwCookieParams[idx].first, rwCookieParams[idx].second,
|
rwCookies[idx] = new RwCookie(idx, rwCookieParams[idx].first, rwCookieParams[idx].second,
|
||||||
RwDefinitions::MAX_REPLY_SIZE, spi::RW_MODE, spi::RW_SPEED,
|
rws::MAX_REPLY_SIZE, spi::RW_MODE, spi::RW_SPEED);
|
||||||
&rwSpiCallback::spiCallback, nullptr);
|
auto* rwHandler = new RwHandler(rwIds[idx], objects::RW_POLLING_TASK, rwCookies[idx], gpioComIF,
|
||||||
rws[idx] = new RwHandler(rwIds[idx], objects::SPI_RW_COM_IF, rwCookies[idx], gpioComIF,
|
rwGpioIds[idx], idx);
|
||||||
rwGpioIds[idx]);
|
|
||||||
rwCookies[idx]->setCallbackArgs(rws[idx]);
|
|
||||||
#if OBSW_TEST_RW == 1
|
#if OBSW_TEST_RW == 1
|
||||||
rws[idx]->setStartUpImmediately();
|
rws[idx]->setStartUpImmediately();
|
||||||
#endif
|
#endif
|
||||||
#if OBSW_DEBUG_RW == 1
|
#if OBSW_DEBUG_RW == 1
|
||||||
rws[idx]->setDebugMode(true);
|
rwHandler->setDebugMode(true);
|
||||||
#endif
|
#endif
|
||||||
|
rws[idx] = rwHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
RwHelper rwHelper(rwIds);
|
createRwAssy(*pwrSwitcher, power::Switches::PDU2_CH2_RW_5V, rws, rwIds);
|
||||||
auto* rwAss =
|
|
||||||
new RwAssembly(objects::RW_ASS, pwrSwitcher, pcdu::Switches::PDU2_CH2_RW_5V, rwHelper);
|
|
||||||
for (uint8_t idx = 0; idx < rws.size(); idx++) {
|
|
||||||
ReturnValue_t result = rws[idx]->connectModeTreeParent(*rwAss);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
sif::error << "Connecting RW " << static_cast<int>(idx) << " to RW assembly failed"
|
|
||||||
<< std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rwAss->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
|
||||||
#endif /* OBSW_ADD_RW == 1 */
|
#endif /* OBSW_ADD_RW == 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF,
|
ReturnValue_t ObjectFactory::createCcsdsComponents(CcsdsComponentArgs& args) {
|
||||||
CcsdsIpCoreHandler** ipCoreHandler) {
|
|
||||||
using namespace gpio;
|
using namespace gpio;
|
||||||
// GPIO definitions of signals connected to the virtual channel interfaces of the PTME IP Core
|
// GPIO definitions of signals connected to the virtual channel interfaces of the PTME IP Core
|
||||||
GpioCookie* gpioCookiePtmeIp = new GpioCookie;
|
GpioCookie* gpioCookiePtmeIp = new GpioCookie;
|
||||||
GpiodRegularByLineName* gpio = nullptr;
|
GpiodRegularByLineName* gpio = nullptr;
|
||||||
std::stringstream consumer;
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC0, "PAPB VC0");
|
||||||
consumer.str("PAPB VC0");
|
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC0, consumer.str());
|
|
||||||
gpioCookiePtmeIp->addGpio(gpioIds::VC0_PAPB_BUSY, gpio);
|
gpioCookiePtmeIp->addGpio(gpioIds::VC0_PAPB_BUSY, gpio);
|
||||||
consumer.str("PAPB VC0");
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC0, "PAPB VC0");
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC0, consumer.str());
|
|
||||||
gpioCookiePtmeIp->addGpio(gpioIds::VC0_PAPB_EMPTY, gpio);
|
gpioCookiePtmeIp->addGpio(gpioIds::VC0_PAPB_EMPTY, gpio);
|
||||||
consumer.str("PAPB VC 1");
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC1, "PAPB VC1");
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC1, consumer.str());
|
|
||||||
gpioCookiePtmeIp->addGpio(gpioIds::VC1_PAPB_BUSY, gpio);
|
gpioCookiePtmeIp->addGpio(gpioIds::VC1_PAPB_BUSY, gpio);
|
||||||
consumer.str("");
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC1, "PAPB VC1");
|
||||||
consumer.str("PAPB VC 1");
|
|
||||||
gpioCookiePtmeIp->addGpio(gpioIds::VC1_PAPB_EMPTY, gpio);
|
gpioCookiePtmeIp->addGpio(gpioIds::VC1_PAPB_EMPTY, gpio);
|
||||||
consumer.str("");
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC2, "PAPB VC2");
|
||||||
consumer.str("PAPB VC 2");
|
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC2, consumer.str());
|
|
||||||
gpioCookiePtmeIp->addGpio(gpioIds::VC2_PAPB_BUSY, gpio);
|
gpioCookiePtmeIp->addGpio(gpioIds::VC2_PAPB_BUSY, gpio);
|
||||||
consumer.str("");
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC2, "PAPB VC2");
|
||||||
consumer.str("PAPB VC 2");
|
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC2, consumer.str());
|
|
||||||
gpioCookiePtmeIp->addGpio(gpioIds::VC2_PAPB_EMPTY, gpio);
|
gpioCookiePtmeIp->addGpio(gpioIds::VC2_PAPB_EMPTY, gpio);
|
||||||
consumer.str("");
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC3, "PAPB VC3");
|
||||||
consumer.str("PAPB VC 3");
|
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC3, consumer.str());
|
|
||||||
gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_BUSY, gpio);
|
gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_BUSY, gpio);
|
||||||
consumer.str("");
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC3, "PAPB VC3");
|
||||||
consumer.str("PAPB VC 3");
|
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC3, consumer.str());
|
|
||||||
gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_EMPTY, gpio);
|
gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_EMPTY, gpio);
|
||||||
gpioChecker(gpioComIF->addGpios(gpioCookiePtmeIp), "PTME PAPB VCs");
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PTME_RESETN, "PTME RESETN",
|
||||||
|
gpio::Direction::OUT, gpio::Levels::HIGH);
|
||||||
|
gpioCookiePtmeIp->addGpio(gpioIds::PTME_RESETN, gpio);
|
||||||
|
gpioChecker(args.gpioComIF.addGpios(gpioCookiePtmeIp), "PTME PAPB VCs");
|
||||||
|
|
||||||
// Creating virtual channel interfaces
|
// Creating virtual channel interfaces
|
||||||
VcInterfaceIF* vc0 =
|
VirtualChannelIF* vc0 =
|
||||||
new PapbVcInterface(gpioComIF, gpioIds::VC0_PAPB_BUSY, gpioIds::VC0_PAPB_EMPTY, q7s::UIO_PTME,
|
new PapbVcInterface(&args.gpioComIF, gpioIds::VC0_PAPB_BUSY, gpioIds::VC0_PAPB_EMPTY,
|
||||||
q7s::uiomapids::PTME_VC0);
|
q7s::UIO_PTME, q7s::uiomapids::PTME_VC0);
|
||||||
VcInterfaceIF* vc1 =
|
VirtualChannelIF* vc1 =
|
||||||
new PapbVcInterface(gpioComIF, gpioIds::VC1_PAPB_BUSY, gpioIds::VC1_PAPB_EMPTY, q7s::UIO_PTME,
|
new PapbVcInterface(&args.gpioComIF, gpioIds::VC1_PAPB_BUSY, gpioIds::VC1_PAPB_EMPTY,
|
||||||
q7s::uiomapids::PTME_VC1);
|
q7s::UIO_PTME, q7s::uiomapids::PTME_VC1);
|
||||||
VcInterfaceIF* vc2 =
|
VirtualChannelIF* vc2 =
|
||||||
new PapbVcInterface(gpioComIF, gpioIds::VC2_PAPB_BUSY, gpioIds::VC2_PAPB_EMPTY, q7s::UIO_PTME,
|
new PapbVcInterface(&args.gpioComIF, gpioIds::VC2_PAPB_BUSY, gpioIds::VC2_PAPB_EMPTY,
|
||||||
q7s::uiomapids::PTME_VC2);
|
q7s::UIO_PTME, q7s::uiomapids::PTME_VC2);
|
||||||
VcInterfaceIF* vc3 =
|
VirtualChannelIF* vc3 =
|
||||||
new PapbVcInterface(gpioComIF, gpioIds::VC3_PAPB_BUSY, gpioIds::VC3_PAPB_EMPTY, q7s::UIO_PTME,
|
new PapbVcInterface(&args.gpioComIF, gpioIds::VC3_PAPB_BUSY, gpioIds::VC3_PAPB_EMPTY,
|
||||||
q7s::uiomapids::PTME_VC3);
|
q7s::UIO_PTME, q7s::uiomapids::PTME_VC3);
|
||||||
// Creating ptme object and adding virtual channel interfaces
|
// Creating ptme object and adding virtual channel interfaces
|
||||||
Ptme* ptme = new Ptme(objects::PTME);
|
Ptme* ptme = new Ptme(objects::PTME);
|
||||||
ptme->addVcInterface(ccsds::VC0, vc0);
|
ptme->addVcInterface(ccsds::VC0, vc0);
|
||||||
@ -780,26 +784,52 @@ ReturnValue_t ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF,
|
|||||||
AxiPtmeConfig* axiPtmeConfig =
|
AxiPtmeConfig* axiPtmeConfig =
|
||||||
new AxiPtmeConfig(objects::AXI_PTME_CONFIG, q7s::UIO_PTME, q7s::uiomapids::PTME_CONFIG);
|
new AxiPtmeConfig(objects::AXI_PTME_CONFIG, q7s::UIO_PTME, q7s::uiomapids::PTME_CONFIG);
|
||||||
PtmeConfig* ptmeConfig = new PtmeConfig(objects::PTME_CONFIG, axiPtmeConfig);
|
PtmeConfig* ptmeConfig = new PtmeConfig(objects::PTME_CONFIG, axiPtmeConfig);
|
||||||
#if OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT == 1
|
|
||||||
// Set to high value when not sending via syrlinks
|
|
||||||
static const uint32_t TRANSMITTER_TIMEOUT = 86400000; // 1 day
|
|
||||||
#else
|
|
||||||
static const uint32_t TRANSMITTER_TIMEOUT = 900000; // 15 minutes
|
|
||||||
#endif
|
|
||||||
*ipCoreHandler = new CcsdsIpCoreHandler(
|
|
||||||
objects::CCSDS_HANDLER, objects::PTME, objects::CCSDS_PACKET_DISTRIBUTOR, ptmeConfig,
|
|
||||||
gpioComIF, gpioIds::RS485_EN_TX_CLOCK, gpioIds::RS485_EN_TX_DATA, TRANSMITTER_TIMEOUT);
|
|
||||||
VirtualChannel* vc = nullptr;
|
|
||||||
vc = new VirtualChannel(ccsds::VC0, config::VC0_QUEUE_SIZE, objects::CCSDS_HANDLER);
|
|
||||||
(*ipCoreHandler)->addVirtualChannel(ccsds::VC0, vc);
|
|
||||||
vc = new VirtualChannel(ccsds::VC1, config::VC1_QUEUE_SIZE, objects::CCSDS_HANDLER);
|
|
||||||
(*ipCoreHandler)->addVirtualChannel(ccsds::VC1, vc);
|
|
||||||
vc = new VirtualChannel(ccsds::VC2, config::VC2_QUEUE_SIZE, objects::CCSDS_HANDLER);
|
|
||||||
(*ipCoreHandler)->addVirtualChannel(ccsds::VC2, vc);
|
|
||||||
vc = new VirtualChannel(ccsds::VC3, config::VC3_QUEUE_SIZE, objects::CCSDS_HANDLER);
|
|
||||||
(*ipCoreHandler)->addVirtualChannel(ccsds::VC3, vc);
|
|
||||||
|
|
||||||
ReturnValue_t result = (*ipCoreHandler)->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
PtmeGpios gpios;
|
||||||
|
gpios.enableTxClock = gpioIds::RS485_EN_TX_CLOCK;
|
||||||
|
gpios.enableTxData = gpioIds::RS485_EN_TX_DATA;
|
||||||
|
gpios.ptmeResetn = gpioIds::PTME_RESETN;
|
||||||
|
|
||||||
|
*args.ipCoreHandler =
|
||||||
|
new CcsdsIpCoreHandler(objects::CCSDS_HANDLER, objects::CCSDS_PACKET_DISTRIBUTOR, *ptmeConfig,
|
||||||
|
LINK_STATE, &args.gpioComIF, gpios, PTME_LOCKED);
|
||||||
|
// This VC will receive all live TM
|
||||||
|
auto* vcWithQueue =
|
||||||
|
new VirtualChannelWithQueue(objects::PTME_VC0_LIVE_TM, ccsds::VC0, "PTME VC0 LIVE TM", *ptme,
|
||||||
|
LINK_STATE, args.tmStore, 500);
|
||||||
|
args.liveDestination = vcWithQueue;
|
||||||
|
auto* liveTask = new LiveTmTask(objects::LIVE_TM_TASK, args.pusFunnel, args.cfdpFunnel,
|
||||||
|
*vcWithQueue, PTME_LOCKED);
|
||||||
|
liveTask->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
||||||
|
|
||||||
|
// Set up log store.
|
||||||
|
auto* vc = new VirtualChannel(objects::PTME_VC1_LOG_TM, ccsds::VC1, "PTME VC1 LOG TM", *ptme,
|
||||||
|
LINK_STATE);
|
||||||
|
LogStores logStores(args.stores);
|
||||||
|
// Core task which handles the LOG store and takes care of dumping it as TM using a VC directly
|
||||||
|
auto* logStore =
|
||||||
|
new PersistentLogTmStoreTask(objects::LOG_STORE_AND_TM_TASK, args.ipcStore, logStores, *vc,
|
||||||
|
*SdCardManager::instance(), PTME_LOCKED);
|
||||||
|
logStore->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
||||||
|
|
||||||
|
vc = new VirtualChannel(objects::PTME_VC2_HK_TM, ccsds::VC2, "PTME VC2 HK TM", *ptme, LINK_STATE);
|
||||||
|
// Core task which handles the HK store and takes care of dumping it as TM using a VC directly
|
||||||
|
auto* hkStore = new PersistentSingleTmStoreTask(
|
||||||
|
objects::HK_STORE_AND_TM_TASK, args.ipcStore, *args.stores.hkStore, *vc,
|
||||||
|
persTmStore::DUMP_HK_STORE_DONE, persTmStore::DUMP_HK_STORE_DONE, *SdCardManager::instance(),
|
||||||
|
PTME_LOCKED);
|
||||||
|
hkStore->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
||||||
|
|
||||||
|
vc = new VirtualChannel(objects::PTME_VC3_CFDP_TM, ccsds::VC3, "PTME VC3 CFDP TM", *ptme,
|
||||||
|
LINK_STATE);
|
||||||
|
// Core task which handles the CFDP store and takes care of dumping it as TM using a VC directly
|
||||||
|
auto* cfdpTask = new PersistentSingleTmStoreTask(
|
||||||
|
objects::CFDP_STORE_AND_TM_TASK, args.ipcStore, *args.stores.cfdpStore, *vc,
|
||||||
|
persTmStore::DUMP_CFDP_STORE_DONE, persTmStore::DUMP_CFDP_CANCELLED,
|
||||||
|
*SdCardManager::instance(), PTME_LOCKED);
|
||||||
|
cfdpTask->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
||||||
|
|
||||||
|
ReturnValue_t result = (*args.ipCoreHandler)->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
sif::error
|
sif::error
|
||||||
<< "ObjectFactory::createCcsdsComponents: Connecting COM subsystem to CCSDS handler failed"
|
<< "ObjectFactory::createCcsdsComponents: Connecting COM subsystem to CCSDS handler failed"
|
||||||
@ -807,20 +837,18 @@ ReturnValue_t ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF,
|
|||||||
}
|
}
|
||||||
|
|
||||||
GpioCookie* gpioCookiePdec = new GpioCookie;
|
GpioCookie* gpioCookiePdec = new GpioCookie;
|
||||||
consumer.str("");
|
|
||||||
consumer << "0x" << std::hex << objects::PDEC_HANDLER;
|
|
||||||
// GPIO also low after linux boot (specified by device-tree)
|
// GPIO also low after linux boot (specified by device-tree)
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::PDEC_RESET, consumer.str(), Direction::OUT,
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::PDEC_RESET, "PDEC Handler", Direction::OUT,
|
||||||
Levels::LOW);
|
Levels::LOW);
|
||||||
gpioCookiePdec->addGpio(gpioIds::PDEC_RESET, gpio);
|
gpioCookiePdec->addGpio(gpioIds::PDEC_RESET, gpio);
|
||||||
gpioChecker(gpioComIF->addGpios(gpioCookiePdec), "PDEC");
|
gpioChecker(args.gpioComIF.addGpios(gpioCookiePdec), "PDEC");
|
||||||
struct UioNames uioNames {};
|
struct UioNames uioNames {};
|
||||||
uioNames.configMemory = q7s::UIO_PDEC_CONFIG_MEMORY;
|
uioNames.configMemory = q7s::UIO_PDEC_CONFIG_MEMORY;
|
||||||
uioNames.ramMemory = q7s::UIO_PDEC_RAM;
|
uioNames.ramMemory = q7s::UIO_PDEC_RAM;
|
||||||
uioNames.registers = q7s::UIO_PDEC_REGISTERS;
|
uioNames.registers = q7s::UIO_PDEC_REGISTERS;
|
||||||
uioNames.irq = q7s::UIO_PDEC_IRQ;
|
uioNames.irq = q7s::UIO_PDEC_IRQ;
|
||||||
new PdecHandler(objects::PDEC_HANDLER, objects::CCSDS_HANDLER, gpioComIF, gpioIds::PDEC_RESET,
|
new PdecHandler(objects::PDEC_HANDLER, objects::CCSDS_HANDLER, &args.gpioComIF,
|
||||||
uioNames);
|
gpioIds::PDEC_RESET, uioNames);
|
||||||
GpioCookie* gpioRS485Chip = new GpioCookie;
|
GpioCookie* gpioRS485Chip = new GpioCookie;
|
||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_TX_CLOCK, "RS485 Transceiver",
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_TX_CLOCK, "RS485 Transceiver",
|
||||||
Direction::OUT, Levels::LOW);
|
Direction::OUT, Levels::LOW);
|
||||||
@ -835,7 +863,7 @@ ReturnValue_t ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF,
|
|||||||
gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_RX_DATA, "RS485 Transceiver",
|
gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_RX_DATA, "RS485 Transceiver",
|
||||||
Direction::OUT, Levels::LOW);
|
Direction::OUT, Levels::LOW);
|
||||||
gpioRS485Chip->addGpio(gpioIds::RS485_EN_RX_DATA, gpio);
|
gpioRS485Chip->addGpio(gpioIds::RS485_EN_RX_DATA, gpio);
|
||||||
gpioChecker(gpioComIF->addGpios(gpioRS485Chip), "RS485 Transceiver");
|
gpioChecker(args.gpioComIF.addGpios(gpioRS485Chip), "RS485 Transceiver");
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -900,7 +928,7 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF*
|
|||||||
plPcduHandler->setToGoToNormalModeImmediately(true);
|
plPcduHandler->setToGoToNormalModeImmediately(true);
|
||||||
plPcduHandler->enablePeriodicPrintout(true, 10);
|
plPcduHandler->enablePeriodicPrintout(true, 10);
|
||||||
#endif
|
#endif
|
||||||
plPcduHandler->connectModeTreeParent(satsystem::pl::SUBSYSTEM);
|
plPcduHandler->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
|
void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
|
||||||
@ -918,25 +946,47 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) {
|
void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) {
|
||||||
|
auto* strAssy = new StrAssembly(objects::STR_ASSY);
|
||||||
|
strAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
||||||
auto* starTrackerCookie =
|
auto* starTrackerCookie =
|
||||||
new SerialCookie(objects::STAR_TRACKER, q7s::UART_STAR_TRACKER_DEV, uart::STAR_TRACKER_BAUD,
|
new SerialCookie(objects::STAR_TRACKER, q7s::UART_STAR_TRACKER_DEV, serial::STAR_TRACKER_BAUD,
|
||||||
startracker::MAX_FRAME_SIZE * 2 + 2, UartModes::NON_CANONICAL);
|
startracker::MAX_FRAME_SIZE * 2 + 2, UartModes::NON_CANONICAL);
|
||||||
starTrackerCookie->setNoFixedSizeReply();
|
starTrackerCookie->setNoFixedSizeReply();
|
||||||
StrHelper* strHelper = new StrHelper(objects::STR_HELPER);
|
StrComHandler* strComIF = new StrComHandler(objects::STR_COM_IF);
|
||||||
|
|
||||||
|
const char* paramJsonFile = nullptr;
|
||||||
|
#ifdef EGSE
|
||||||
|
paramJsonFile = "/home/pi/arcsec/json/flight-config.json";
|
||||||
|
#else
|
||||||
|
#if OBSW_STAR_TRACKER_GROUND_CONFIG == 1
|
||||||
|
paramJsonFile = "/mnt/sd0/startracker/ground-config.json";
|
||||||
|
#else
|
||||||
|
paramJsonFile = "/mnt/sd0/startracker/flight-config.json";
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
if (paramJsonFile == nullptr) {
|
||||||
|
sif::error << "No valid Star Tracker parameter JSON file" << std::endl;
|
||||||
|
}
|
||||||
|
auto strFdir = new StrFdir(objects::STAR_TRACKER);
|
||||||
auto starTracker =
|
auto starTracker =
|
||||||
new StarTrackerHandler(objects::STAR_TRACKER, objects::UART_COM_IF, starTrackerCookie,
|
new StarTrackerHandler(objects::STAR_TRACKER, objects::STR_COM_IF, starTrackerCookie,
|
||||||
strHelper, pcdu::PDU1_CH2_STAR_TRACKER_5V);
|
paramJsonFile, strComIF, power::PDU1_CH2_STAR_TRACKER_5V);
|
||||||
starTracker->setPowerSwitcher(pwrSwitcher);
|
starTracker->setPowerSwitcher(pwrSwitcher);
|
||||||
starTracker->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
starTracker->connectModeTreeParent(*strAssy);
|
||||||
|
starTracker->setCustomFdir(strFdir);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher) {
|
void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets) {
|
||||||
I2cCookie* imtqI2cCookie = new I2cCookie(addresses::IMTQ, IMTQ::MAX_REPLY_SIZE, q7s::I2C_PL_EIVE);
|
auto* imtqAssy = new ImtqAssembly(objects::IMTQ_ASSY);
|
||||||
auto imtqHandler = new ImtqHandler(objects::IMTQ_HANDLER, objects::I2C_COM_IF, imtqI2cCookie,
|
imtqAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
||||||
pcdu::Switches::PDU1_CH3_MGT_5V);
|
|
||||||
|
new ImtqPollingTask(objects::IMTQ_POLLING, I2C_FATAL_ERRORS);
|
||||||
|
I2cCookie* imtqI2cCookie = new I2cCookie(addresses::IMTQ, imtq::MAX_REPLY_SIZE, q7s::I2C_PL_EIVE);
|
||||||
|
auto imtqHandler = new ImtqHandler(objects::IMTQ_HANDLER, objects::IMTQ_POLLING, imtqI2cCookie,
|
||||||
|
power::Switches::PDU1_CH3_MGT_5V, enableHkSets);
|
||||||
imtqHandler->enableThermalModule(ThermalStateCfg());
|
imtqHandler->enableThermalModule(ThermalStateCfg());
|
||||||
imtqHandler->setPowerSwitcher(pwrSwitcher);
|
imtqHandler->setPowerSwitcher(pwrSwitcher);
|
||||||
imtqHandler->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
imtqHandler->connectModeTreeParent(*imtqAssy);
|
||||||
static_cast<void>(imtqHandler);
|
static_cast<void>(imtqHandler);
|
||||||
#if OBSW_TEST_IMTQ == 1
|
#if OBSW_TEST_IMTQ == 1
|
||||||
imtqHandler->setStartUpImmediately();
|
imtqHandler->setStartUpImmediately();
|
||||||
@ -947,10 +997,10 @@ void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createBpxBatteryComponent() {
|
void ObjectFactory::createBpxBatteryComponent(bool enableHkSets) {
|
||||||
I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, q7s::I2C_PL_EIVE);
|
I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, q7s::I2C_PL_EIVE);
|
||||||
BpxBatteryHandler* bpxHandler =
|
BpxBatteryHandler* bpxHandler = new BpxBatteryHandler(
|
||||||
new BpxBatteryHandler(objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie);
|
objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie, enableHkSets);
|
||||||
bpxHandler->setStartUpImmediately();
|
bpxHandler->setStartUpImmediately();
|
||||||
bpxHandler->setToGoToNormalMode(true);
|
bpxHandler->setToGoToNormalMode(true);
|
||||||
#if OBSW_DEBUG_BPX_BATT == 1
|
#if OBSW_DEBUG_BPX_BATT == 1
|
||||||
|
@ -2,12 +2,16 @@
|
|||||||
#define BSP_Q7S_OBJECTFACTORY_H_
|
#define BSP_Q7S_OBJECTFACTORY_H_
|
||||||
|
|
||||||
#include <fsfw/returnvalues/returnvalue.h>
|
#include <fsfw/returnvalues/returnvalue.h>
|
||||||
#include <mission/devices/HeaterHandler.h>
|
#include <fsfw_hal/linux/spi/SpiComIF.h>
|
||||||
|
#include <mission/com/CcsdsIpCoreHandler.h>
|
||||||
|
#include <mission/com/PersistentLogTmStoreTask.h>
|
||||||
|
#include <mission/genericFactory.h>
|
||||||
#include <mission/system/objects/Stack5VHandler.h>
|
#include <mission/system/objects/Stack5VHandler.h>
|
||||||
#include <mission/tmtc/CcsdsIpCoreHandler.h>
|
#include <mission/tcs/HeaterHandler.h>
|
||||||
#include <mission/tmtc/CfdpTmFunnel.h>
|
#include <mission/tmtc/CfdpTmFunnel.h>
|
||||||
#include <mission/tmtc/PusTmFunnel.h>
|
#include <mission/tmtc/PusTmFunnel.h>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class LinuxLibgpioIF;
|
class LinuxLibgpioIF;
|
||||||
@ -19,31 +23,55 @@ class HealthTableIF;
|
|||||||
class AcsBoardAssembly;
|
class AcsBoardAssembly;
|
||||||
class GpioIF;
|
class GpioIF;
|
||||||
|
|
||||||
|
extern std::atomic_bool PTME_LOCKED;
|
||||||
|
|
||||||
namespace ObjectFactory {
|
namespace ObjectFactory {
|
||||||
|
|
||||||
|
struct CcsdsComponentArgs {
|
||||||
|
CcsdsComponentArgs(LinuxLibgpioIF& gpioIF, StorageManagerIF& ipcStore, StorageManagerIF& tmStore,
|
||||||
|
PersistentTmStores& stores, PusTmFunnel& pusFunnel, CfdpTmFunnel& cfdpFunnel,
|
||||||
|
CcsdsIpCoreHandler** ipCoreHandler)
|
||||||
|
: gpioComIF(gpioIF),
|
||||||
|
ipcStore(ipcStore),
|
||||||
|
tmStore(tmStore),
|
||||||
|
stores(stores),
|
||||||
|
pusFunnel(pusFunnel),
|
||||||
|
cfdpFunnel(cfdpFunnel),
|
||||||
|
ipCoreHandler(ipCoreHandler) {}
|
||||||
|
LinuxLibgpioIF& gpioComIF;
|
||||||
|
StorageManagerIF& ipcStore;
|
||||||
|
StorageManagerIF& tmStore;
|
||||||
|
PersistentTmStores& stores;
|
||||||
|
PusTmFunnel& pusFunnel;
|
||||||
|
CfdpTmFunnel& cfdpFunnel;
|
||||||
|
CcsdsIpCoreHandler** ipCoreHandler;
|
||||||
|
AcceptsTelemetryIF* liveDestination = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
void setStatics();
|
void setStatics();
|
||||||
void produce(void* args);
|
void produce(void* args);
|
||||||
|
|
||||||
void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, SerialComIF** uartComIF,
|
void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, SerialComIF** uartComIF,
|
||||||
SpiComIF** spiMainComIF, I2cComIF** i2cComIF,
|
SpiComIF** spiMainComIF, I2cComIF** i2cComIF);
|
||||||
SpiComIF** spiRwComIF);
|
void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher,
|
||||||
void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher);
|
bool enableHkSets);
|
||||||
void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
|
void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
|
||||||
PowerSwitchIF* pwrSwitcher, Stack5VHandler& stackHandler);
|
PowerSwitchIF* pwrSwitcher, Stack5VHandler& stackHandler);
|
||||||
void createTmpComponents();
|
void createTmpComponents();
|
||||||
ReturnValue_t createRadSensorComponent(LinuxLibgpioIF* gpioComIF, Stack5VHandler& handler);
|
ReturnValue_t createRadSensorComponent(LinuxLibgpioIF* gpioComIF, Stack5VHandler& handler);
|
||||||
void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, SerialComIF* uartComIF,
|
void createAcsBoardGpios(GpioCookie& cookie);
|
||||||
PowerSwitchIF* pwrSwitcher);
|
void createAcsBoardComponents(SpiComIF& spiComIF, LinuxLibgpioIF* gpioComIF, SerialComIF* uartComIF,
|
||||||
|
PowerSwitchIF& pwrSwitcher, bool enableHkSets);
|
||||||
void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTableIF* healthTable,
|
void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTableIF* healthTable,
|
||||||
HeaterHandler*& heaterHandler);
|
HeaterHandler*& heaterHandler);
|
||||||
void createImtqComponents(PowerSwitchIF* pwrSwitcher);
|
void createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets);
|
||||||
void createBpxBatteryComponent();
|
void createBpxBatteryComponent(bool enableHkSets);
|
||||||
void createStrComponents(PowerSwitchIF* pwrSwitcher);
|
void createStrComponents(PowerSwitchIF* pwrSwitcher);
|
||||||
void createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitcher, GpioIF& gpioIF);
|
void createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitcher, GpioIF& gpioIF);
|
||||||
void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher);
|
void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher);
|
||||||
void createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitcher);
|
void createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitcher);
|
||||||
void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
|
void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
|
||||||
ReturnValue_t createCcsdsComponents(LinuxLibgpioIF* gpioComIF, CcsdsIpCoreHandler** ipCoreHandler);
|
ReturnValue_t createCcsdsComponents(CcsdsComponentArgs& args);
|
||||||
void createMiscComponents();
|
void createMiscComponents();
|
||||||
|
|
||||||
void createTestComponents(LinuxLibgpioIF* gpioComIF);
|
void createTestComponents(LinuxLibgpioIF* gpioComIF);
|
||||||
|
87
bsp_q7s/core/WatchdogHandler.cpp
Normal file
87
bsp_q7s/core/WatchdogHandler.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#include "WatchdogHandler.h"
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <cerrno>
|
||||||
|
#include <cstring>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
#include "fsfw/serviceinterface.h"
|
||||||
|
#include "watchdog/definitions.h"
|
||||||
|
|
||||||
|
WatchdogHandler::WatchdogHandler() {}
|
||||||
|
|
||||||
|
void WatchdogHandler::periodicOperation() {
|
||||||
|
if (watchdogFifoFd != 0) {
|
||||||
|
if (watchdogFifoFd == RETRY_FIFO_OPEN) {
|
||||||
|
// Open FIFO write only and non-blocking
|
||||||
|
watchdogFifoFd = open(watchdog::FIFO_NAME.c_str(), O_WRONLY | O_NONBLOCK);
|
||||||
|
if (watchdogFifoFd < 0) {
|
||||||
|
if (errno == ENXIO) {
|
||||||
|
watchdogFifoFd = RETRY_FIFO_OPEN;
|
||||||
|
// No printout for now, would be spam
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
sif::error << "Opening pipe " << watchdog::FIFO_NAME << " write-only failed with "
|
||||||
|
<< errno << ": " << strerror(errno) << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sif::info << "Opened " << watchdog::FIFO_NAME << " successfully" << std::endl;
|
||||||
|
performStartHandling();
|
||||||
|
} else if (watchdogFifoFd > 0) {
|
||||||
|
// Write to OBSW watchdog FIFO here
|
||||||
|
const char writeChar = watchdog::first::IDLE_CHAR;
|
||||||
|
ssize_t writtenBytes = write(watchdogFifoFd, &writeChar, 1);
|
||||||
|
if (writtenBytes < 0) {
|
||||||
|
sif::error << "Errors writing to watchdog FIFO, code " << errno << ": " << strerror(errno)
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t WatchdogHandler::initialize(bool enableWatchdogFunction) {
|
||||||
|
using namespace std::filesystem;
|
||||||
|
this->enableWatchFunction = enableWatchdogFunction;
|
||||||
|
std::error_code e;
|
||||||
|
if (not std::filesystem::exists(watchdog::FIFO_NAME, e)) {
|
||||||
|
// Still return returnvalue::OK for now
|
||||||
|
sif::info << "Watchdog FIFO " << watchdog::FIFO_NAME << " does not exist, can't initiate"
|
||||||
|
<< " watchdog" << std::endl;
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
// Open FIFO write only and non-blocking to prevent SW from killing itself.
|
||||||
|
watchdogFifoFd = open(watchdog::FIFO_NAME.c_str(), O_WRONLY | O_NONBLOCK);
|
||||||
|
if (watchdogFifoFd < 0) {
|
||||||
|
if (errno == ENXIO) {
|
||||||
|
watchdogFifoFd = RETRY_FIFO_OPEN;
|
||||||
|
sif::info << "eive-watchdog not running. FIFO can not be opened" << std::endl;
|
||||||
|
} else {
|
||||||
|
sif::error << "Opening pipe " << watchdog::FIFO_NAME << " write-only failed with " << errno
|
||||||
|
<< ": " << strerror(errno) << std::endl;
|
||||||
|
return returnvalue::FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return performStartHandling();
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t WatchdogHandler::performStartHandling() {
|
||||||
|
char startBuf[2];
|
||||||
|
ssize_t writeLen = 1;
|
||||||
|
startBuf[0] = watchdog::first::START_CHAR;
|
||||||
|
if (enableWatchFunction) {
|
||||||
|
writeLen += 1;
|
||||||
|
startBuf[1] = watchdog::second::WATCH_FLAG;
|
||||||
|
}
|
||||||
|
ssize_t writtenBytes = write(watchdogFifoFd, &startBuf, writeLen);
|
||||||
|
if (writtenBytes < 0) {
|
||||||
|
sif::error << "WatchdogHandler: Errors writing to watchdog FIFO, code " << errno << ": "
|
||||||
|
<< strerror(errno) << std::endl;
|
||||||
|
return returnvalue::FAILED;
|
||||||
|
} else if (writtenBytes != writeLen) {
|
||||||
|
sif::warning << "WatchdogHandler: Not all bytes were written, possible error" << std::endl;
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
23
bsp_q7s/core/WatchdogHandler.h
Normal file
23
bsp_q7s/core/WatchdogHandler.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef BSP_Q7S_CORE_WATCHDOGHANDLER_H_
|
||||||
|
#define BSP_Q7S_CORE_WATCHDOGHANDLER_H_
|
||||||
|
|
||||||
|
#include "fsfw/returnvalues/returnvalue.h"
|
||||||
|
|
||||||
|
class WatchdogHandler {
|
||||||
|
public:
|
||||||
|
WatchdogHandler();
|
||||||
|
|
||||||
|
ReturnValue_t initialize(bool enableWatchFunction);
|
||||||
|
void periodicOperation();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Designated value for rechecking FIFO open
|
||||||
|
static constexpr int RETRY_FIFO_OPEN = -2;
|
||||||
|
|
||||||
|
int watchdogFifoFd = 0;
|
||||||
|
bool enableWatchFunction = false;
|
||||||
|
|
||||||
|
ReturnValue_t performStartHandling();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* BSP_Q7S_CORE_WATCHDOGHANDLER_H_ */
|
@ -3,6 +3,7 @@
|
|||||||
#include <fsfw/devicehandlers/DeviceCommunicationIF.h>
|
#include <fsfw/devicehandlers/DeviceCommunicationIF.h>
|
||||||
#include <fsfw/subsystem/Subsystem.h>
|
#include <fsfw/subsystem/Subsystem.h>
|
||||||
#include <linux/scheduling.h>
|
#include <linux/scheduling.h>
|
||||||
|
#include <mission/tcs/Max31865Definitions.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -17,10 +18,9 @@
|
|||||||
#include "fsfw/tasks/FixedTimeslotTaskIF.h"
|
#include "fsfw/tasks/FixedTimeslotTaskIF.h"
|
||||||
#include "fsfw/tasks/PeriodicTaskIF.h"
|
#include "fsfw/tasks/PeriodicTaskIF.h"
|
||||||
#include "fsfw/tasks/TaskFactory.h"
|
#include "fsfw/tasks/TaskFactory.h"
|
||||||
#include "mission/core/scheduling.h"
|
#include "mission/pollingSeqTables.h"
|
||||||
#include "mission/devices/devicedefinitions/Max31865Definitions.h"
|
#include "mission/scheduling.h"
|
||||||
#include "mission/utility/InitMission.h"
|
#include "mission/utility/InitMission.h"
|
||||||
#include "pollingsequence/pollingSequenceFactory.h"
|
|
||||||
|
|
||||||
/* This is configured for linux without CR */
|
/* This is configured for linux without CR */
|
||||||
#ifdef PLATFORM_UNIX
|
#ifdef PLATFORM_UNIX
|
||||||
@ -72,8 +72,9 @@ void scheduling::initTasks() {
|
|||||||
#if OBSW_ADD_SA_DEPL == 1
|
#if OBSW_ADD_SA_DEPL == 1
|
||||||
// Could add this to the core controller but the core controller does so many thing that I would
|
// Could add this to the core controller but the core controller does so many thing that I would
|
||||||
// prefer to have the solar array deployment in a seprate task.
|
// prefer to have the solar array deployment in a seprate task.
|
||||||
PeriodicTaskIF* solarArrayDeplTask = factory->createPeriodicTask(
|
PeriodicTaskIF* solarArrayDeplTask =
|
||||||
"SOLAR_ARRAY_DEPL", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.4, missedDeadlineFunc);
|
factory->createPeriodicTask("SOLAR_ARRAY_DEPL", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.4,
|
||||||
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = solarArrayDeplTask->addComponent(objects::SOLAR_ARRAY_DEPL_HANDLER);
|
result = solarArrayDeplTask->addComponent(objects::SOLAR_ARRAY_DEPL_HANDLER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("SOLAR_ARRAY_DEPL", objects::SOLAR_ARRAY_DEPL_HANDLER);
|
scheduling::printAddObjectError("SOLAR_ARRAY_DEPL", objects::SOLAR_ARRAY_DEPL_HANDLER);
|
||||||
@ -81,7 +82,7 @@ void scheduling::initTasks() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
PeriodicTaskIF* coreCtrlTask = factory->createPeriodicTask(
|
PeriodicTaskIF* coreCtrlTask = factory->createPeriodicTask(
|
||||||
"CORE_CTRL", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.4, missedDeadlineFunc);
|
"CORE_CTRL", 55, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.4, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = coreCtrlTask->addComponent(objects::CORE_CONTROLLER);
|
result = coreCtrlTask->addComponent(objects::CORE_CONTROLLER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("CORE_CTRL", objects::CORE_CONTROLLER);
|
scheduling::printAddObjectError("CORE_CTRL", objects::CORE_CONTROLLER);
|
||||||
@ -89,7 +90,7 @@ void scheduling::initTasks() {
|
|||||||
|
|
||||||
/* TMTC Distribution */
|
/* TMTC Distribution */
|
||||||
PeriodicTaskIF* tmTcDistributor = factory->createPeriodicTask(
|
PeriodicTaskIF* tmTcDistributor = factory->createPeriodicTask(
|
||||||
"DIST", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
|
"TC_DIST", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
#if OBSW_ADD_TCPIP_SERVERS == 1
|
#if OBSW_ADD_TCPIP_SERVERS == 1
|
||||||
#if OBSW_ADD_TMTC_UDP_SERVER == 1
|
#if OBSW_ADD_TMTC_UDP_SERVER == 1
|
||||||
result = tmTcDistributor->addComponent(objects::UDP_TMTC_SERVER);
|
result = tmTcDistributor->addComponent(objects::UDP_TMTC_SERVER);
|
||||||
@ -116,15 +117,11 @@ void scheduling::initTasks() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("CFDP_DISTRIBUTOR", objects::CFDP_DISTRIBUTOR);
|
scheduling::printAddObjectError("CFDP_DISTRIBUTOR", objects::CFDP_DISTRIBUTOR);
|
||||||
}
|
}
|
||||||
result = tmTcDistributor->addComponent(objects::TM_FUNNEL);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
scheduling::printAddObjectError("TM_FUNNEL", objects::TM_FUNNEL);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if OBSW_ADD_TCPIP_SERVERS == 1
|
#if OBSW_ADD_TCPIP_SERVERS == 1
|
||||||
#if OBSW_ADD_TMTC_UDP_SERVER == 1
|
#if OBSW_ADD_TMTC_UDP_SERVER == 1
|
||||||
PeriodicTaskIF* udpPollingTask = factory->createPeriodicTask(
|
PeriodicTaskIF* udpPollingTask = factory->createPeriodicTask(
|
||||||
"UDP_TMTC_POLLING", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc);
|
"UDP_TMTC_POLLING", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc);
|
||||||
result = udpPollingTask->addComponent(objects::UDP_TMTC_POLLING_TASK);
|
result = udpPollingTask->addComponent(objects::UDP_TMTC_POLLING_TASK);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("UDP_POLLING", objects::UDP_TMTC_POLLING_TASK);
|
scheduling::printAddObjectError("UDP_POLLING", objects::UDP_TMTC_POLLING_TASK);
|
||||||
@ -132,7 +129,7 @@ void scheduling::initTasks() {
|
|||||||
#endif
|
#endif
|
||||||
#if OBSW_ADD_TMTC_TCP_SERVER == 1
|
#if OBSW_ADD_TMTC_TCP_SERVER == 1
|
||||||
PeriodicTaskIF* tcpPollingTask = factory->createPeriodicTask(
|
PeriodicTaskIF* tcpPollingTask = factory->createPeriodicTask(
|
||||||
"TCP_TMTC_POLLING", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc);
|
"TCP_TMTC_POLLING", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc);
|
||||||
result = tcpPollingTask->addComponent(objects::TCP_TMTC_POLLING_TASK);
|
result = tcpPollingTask->addComponent(objects::TCP_TMTC_POLLING_TASK);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("UDP_POLLING", objects::TCP_TMTC_POLLING_TASK);
|
scheduling::printAddObjectError("UDP_POLLING", objects::TCP_TMTC_POLLING_TASK);
|
||||||
@ -140,8 +137,9 @@ void scheduling::initTasks() {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PeriodicTaskIF* genericSysTask = factory->createPeriodicTask(
|
PeriodicTaskIF* genericSysTask =
|
||||||
"SYSTEM_TASK", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.5, missedDeadlineFunc);
|
factory->createPeriodicTask("SYSTEM_TASK", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.5,
|
||||||
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = genericSysTask->addComponent(objects::EIVE_SYSTEM);
|
result = genericSysTask->addComponent(objects::EIVE_SYSTEM);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("EIVE_SYSTEM", objects::EIVE_SYSTEM);
|
scheduling::printAddObjectError("EIVE_SYSTEM", objects::EIVE_SYSTEM);
|
||||||
@ -150,10 +148,22 @@ void scheduling::initTasks() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("COM_SUBSYSTEM", objects::COM_SUBSYSTEM);
|
scheduling::printAddObjectError("COM_SUBSYSTEM", objects::COM_SUBSYSTEM);
|
||||||
}
|
}
|
||||||
|
result = genericSysTask->addComponent(objects::SYRLINKS_ASSY);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("SYRLINKS_ASSY", objects::SYRLINKS_ASSY);
|
||||||
|
}
|
||||||
result = genericSysTask->addComponent(objects::PL_SUBSYSTEM);
|
result = genericSysTask->addComponent(objects::PL_SUBSYSTEM);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PL_SUBSYSTEM", objects::PL_SUBSYSTEM);
|
scheduling::printAddObjectError("PL_SUBSYSTEM", objects::PL_SUBSYSTEM);
|
||||||
}
|
}
|
||||||
|
result = genericSysTask->addComponent(objects::INTERNAL_ERROR_REPORTER);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("ERROR_REPORTER", objects::INTERNAL_ERROR_REPORTER);
|
||||||
|
}
|
||||||
|
result = genericSysTask->addComponent(objects::PUS_SERVICE_17_TEST);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("PUS_17", objects::PUS_SERVICE_17_TEST);
|
||||||
|
}
|
||||||
|
|
||||||
#if OBSW_ADD_CCSDS_IP_CORES == 1
|
#if OBSW_ADD_CCSDS_IP_CORES == 1
|
||||||
result = genericSysTask->addComponent(objects::CCSDS_HANDLER);
|
result = genericSysTask->addComponent(objects::CCSDS_HANDLER);
|
||||||
@ -163,116 +173,192 @@ void scheduling::initTasks() {
|
|||||||
|
|
||||||
// Runs in IRQ mode, frequency does not really matter
|
// Runs in IRQ mode, frequency does not really matter
|
||||||
PeriodicTaskIF* pdecHandlerTask = factory->createPeriodicTask(
|
PeriodicTaskIF* pdecHandlerTask = factory->createPeriodicTask(
|
||||||
"PDEC_HANDLER", 75, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc);
|
"PDEC_HANDLER", 75, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, nullptr, &RR_SCHEDULING);
|
||||||
result = pdecHandlerTask->addComponent(objects::PDEC_HANDLER);
|
result = pdecHandlerTask->addComponent(objects::PDEC_HANDLER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PDEC Handler", objects::PDEC_HANDLER);
|
scheduling::printAddObjectError("PDEC Handler", objects::PDEC_HANDLER);
|
||||||
}
|
}
|
||||||
#endif /* OBSW_ADD_CCSDS_IP_CORE == 1 */
|
|
||||||
|
|
||||||
|
#endif /* OBSW_ADD_CCSDS_IP_CORE == 1 */
|
||||||
|
// All the TM store tasks run in permanent loops, frequency does not matter
|
||||||
|
PeriodicTaskIF* liveTmTask = factory->createPeriodicTask(
|
||||||
|
"LIVE_TM", 55, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, nullptr, &RR_SCHEDULING);
|
||||||
|
result = liveTmTask->addComponent(objects::LIVE_TM_TASK);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("LIVE_TM", objects::LIVE_TM_TASK);
|
||||||
|
}
|
||||||
|
PeriodicTaskIF* logTmTask = factory->createPeriodicTask(
|
||||||
|
"LOG_PSTORE", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, nullptr);
|
||||||
|
result = logTmTask->addComponent(objects::LOG_STORE_AND_TM_TASK);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("LOG_STORE_AND_TM", objects::LOG_STORE_AND_TM_TASK);
|
||||||
|
}
|
||||||
|
PeriodicTaskIF* hkTmTask =
|
||||||
|
factory->createPeriodicTask("HK_PSTORE", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, nullptr);
|
||||||
|
result = hkTmTask->addComponent(objects::HK_STORE_AND_TM_TASK);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("HK_STORE_AND_TM", objects::HK_STORE_AND_TM_TASK);
|
||||||
|
}
|
||||||
|
PeriodicTaskIF* cfdpTmTask = factory->createPeriodicTask(
|
||||||
|
"CFDP_PSTORE", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, nullptr);
|
||||||
|
result = cfdpTmTask->addComponent(objects::CFDP_STORE_AND_TM_TASK);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("CFDP_STORE_AND_TM", objects::CFDP_STORE_AND_TM_TASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Use user priorities for this task.
|
||||||
#if OBSW_ADD_CFDP_COMPONENTS == 1
|
#if OBSW_ADD_CFDP_COMPONENTS == 1
|
||||||
PeriodicTaskIF* cfdpTask = factory->createPeriodicTask(
|
PeriodicTaskIF* cfdpTask =
|
||||||
"CFDP Handler", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.4, missedDeadlineFunc);
|
factory->createPeriodicTask("CFDP_HANDLER", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.4,
|
||||||
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = cfdpTask->addComponent(objects::CFDP_HANDLER);
|
result = cfdpTask->addComponent(objects::CFDP_HANDLER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("CFDP Handler", objects::CFDP_HANDLER);
|
scheduling::printAddObjectError("CFDP", objects::CFDP_HANDLER);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_GPS_CTRL == 1
|
PeriodicTaskIF* gpsTask =
|
||||||
PeriodicTaskIF* gpsTask = factory->createPeriodicTask(
|
factory->createPeriodicTask("GPS_TASK", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4,
|
||||||
"GPS_TASK", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = gpsTask->addComponent(objects::GPS_CONTROLLER);
|
result = gpsTask->addComponent(objects::GPS_CONTROLLER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("GPS_CTRL", objects::GPS_CONTROLLER);
|
scheduling::printAddObjectError("GPS_CTRL", objects::GPS_CONTROLLER);
|
||||||
}
|
}
|
||||||
#endif /* OBSW_ADD_GPS_CTRL */
|
|
||||||
|
|
||||||
PeriodicTaskIF* acsSysTask = factory->createPeriodicTask(
|
#if OBSW_ADD_ACS_BOARD == 1
|
||||||
"ACS_SYS_TASK", 55, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
|
PeriodicTaskIF* acsBrdPolling =
|
||||||
static_cast<void>(acsSysTask);
|
factory->createPeriodicTask("ACS_BOARD_POLLING", 85, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2,
|
||||||
|
0.4, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = acsBrdPolling->addComponent(objects::ACS_BOARD_POLLING_TASK);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("ACS_BOARD_POLLING", objects::ACS_BOARD_POLLING_TASK);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if OBSW_ADD_RW == 1
|
||||||
|
PeriodicTaskIF* rwPolling =
|
||||||
|
factory->createPeriodicTask("RW_POLLING_TASK", 75, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2,
|
||||||
|
0.4, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = rwPolling->addComponent(objects::RW_POLLING_TASK);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("RW_POLLING_TASK", objects::RW_POLLING_TASK);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if OBSW_ADD_MGT == 1
|
||||||
|
PeriodicTaskIF* imtqPolling =
|
||||||
|
factory->createPeriodicTask("IMTQ_POLLING_TASK", 85, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2,
|
||||||
|
0.4, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = imtqPolling->addComponent(objects::IMTQ_POLLING);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("IMTQ_POLLING_TASK", objects::IMTQ_POLLING);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if OBSW_ADD_SUN_SENSORS == 1
|
||||||
|
PeriodicTaskIF* susPolling =
|
||||||
|
factory->createPeriodicTask("SUS_POLLING_TASK", 85, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2,
|
||||||
|
0.4, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = susPolling->addComponent(objects::SUS_POLLING_TASK);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("SUS_POLLING_TASK", objects::SUS_POLLING_TASK);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PeriodicTaskIF* acsSysTask =
|
||||||
|
factory->createPeriodicTask("ACS_SYS_TASK", 55, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4,
|
||||||
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = acsSysTask->addComponent(objects::ACS_SUBSYSTEM);
|
result = acsSysTask->addComponent(objects::ACS_SUBSYSTEM);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("ACS_SUBSYSTEM", objects::ACS_SUBSYSTEM);
|
scheduling::printAddObjectError("ACS_SUBSYSTEM", objects::ACS_SUBSYSTEM);
|
||||||
}
|
}
|
||||||
#if OBSW_ADD_ACS_BOARD == 1
|
result = acsSysTask->addComponent(objects::IMTQ_ASSY);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("IMTQ_ASSY", objects::IMTQ_ASSY);
|
||||||
|
}
|
||||||
result = acsSysTask->addComponent(objects::ACS_BOARD_ASS);
|
result = acsSysTask->addComponent(objects::ACS_BOARD_ASS);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("ACS_BOARD_ASS", objects::ACS_BOARD_ASS);
|
scheduling::printAddObjectError("ACS_BOARD_ASS", objects::ACS_BOARD_ASS);
|
||||||
}
|
}
|
||||||
#endif /* OBSW_ADD_ACS_HANDLERS */
|
result = acsSysTask->addComponent(objects::RW_ASSY);
|
||||||
#if OBSW_ADD_RW == 1
|
|
||||||
result = acsSysTask->addComponent(objects::RW_ASS);
|
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("RW_ASS", objects::RW_ASS);
|
scheduling::printAddObjectError("RW_ASS", objects::RW_ASSY);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#if OBSW_ADD_SUS_BOARD_ASS == 1
|
|
||||||
result = acsSysTask->addComponent(objects::SUS_BOARD_ASS);
|
result = acsSysTask->addComponent(objects::SUS_BOARD_ASS);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("SUS_BOARD_ASS", objects::SUS_BOARD_ASS);
|
scheduling::printAddObjectError("SUS_BOARD_ASS", objects::SUS_BOARD_ASS);
|
||||||
}
|
}
|
||||||
#endif
|
result = acsSysTask->addComponent(objects::STR_ASSY);
|
||||||
|
|
||||||
#if OBSW_ADD_RTD_DEVICES == 1
|
|
||||||
PeriodicTaskIF* tcsPollingTask = factory->createPeriodicTask(
|
|
||||||
"TCS_POLLING_TASK", 75, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.5, missedDeadlineFunc);
|
|
||||||
result = tcsPollingTask->addComponent(objects::SPI_RTD_COM_IF);
|
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("SPI_RTD_POLLING", objects::SPI_RTD_COM_IF);
|
scheduling::printAddObjectError("STR_ASSY", objects::STR_ASSY);
|
||||||
|
}
|
||||||
|
result = acsSysTask->addComponent(objects::GPS_0_HEALTH_DEV);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("GPS_0_HEALTH_DEV", objects::GPS_0_HEALTH_DEV);
|
||||||
|
}
|
||||||
|
result = acsSysTask->addComponent(objects::GPS_1_HEALTH_DEV);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("GPS_1_HEALTH_DEV", objects::GPS_1_HEALTH_DEV);
|
||||||
}
|
}
|
||||||
|
|
||||||
PeriodicTaskIF* tcsTask = factory->createPeriodicTask(
|
|
||||||
"TCS_TASK", 55, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc);
|
|
||||||
scheduling::scheduleRtdSensors(tcsTask);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PeriodicTaskIF* tcsSystemTask = factory->createPeriodicTask(
|
PeriodicTaskIF* tcsSystemTask = factory->createPeriodicTask(
|
||||||
"TCS_TASK", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.5, missedDeadlineFunc);
|
"TCS_TASK", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.5, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
#if OBSW_ADD_THERMAL_TEMP_INSERTER == 1
|
||||||
|
tcsSystemTask->addComponent(objects::THERMAL_TEMP_INSERTER);
|
||||||
|
#endif
|
||||||
|
scheduling::scheduleRtdSensors(tcsSystemTask);
|
||||||
result = tcsSystemTask->addComponent(objects::TCS_SUBSYSTEM);
|
result = tcsSystemTask->addComponent(objects::TCS_SUBSYSTEM);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("TCS_SUBSYSTEM", objects::TCS_SUBSYSTEM);
|
scheduling::printAddObjectError("TCS_SUBSYSTEM", objects::TCS_SUBSYSTEM);
|
||||||
}
|
}
|
||||||
#if OBSW_ADD_RTD_DEVICES == 1
|
|
||||||
result = tcsSystemTask->addComponent(objects::TCS_BOARD_ASS);
|
result = tcsSystemTask->addComponent(objects::TCS_BOARD_ASS);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("TCS_BOARD_ASS", objects::TCS_BOARD_ASS);
|
scheduling::printAddObjectError("TCS_BOARD_ASS", objects::TCS_BOARD_ASS);
|
||||||
}
|
}
|
||||||
#endif /* OBSW_ADD_RTD_DEVICES */
|
|
||||||
#if OBSW_ADD_TCS_CTRL == 1
|
#if OBSW_ADD_TCS_CTRL == 1
|
||||||
result = tcsSystemTask->addComponent(objects::THERMAL_CONTROLLER);
|
result = tcsSystemTask->addComponent(objects::THERMAL_CONTROLLER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("THERMAL_CONTROLLER", objects::THERMAL_CONTROLLER);
|
scheduling::printAddObjectError("THERMAL_CONTROLLER", objects::THERMAL_CONTROLLER);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if OBSW_ADD_HEATERS == 1
|
|
||||||
result = tcsSystemTask->addComponent(objects::HEATER_HANDLER);
|
result = tcsSystemTask->addComponent(objects::HEATER_HANDLER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("HEATER_HANDLER", objects::HEATER_HANDLER);
|
scheduling::printAddObjectError("HEATER_HANDLER", objects::HEATER_HANDLER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if OBSW_ADD_SYRLINKS == 1
|
||||||
|
PeriodicTaskIF* syrlinksCom = factory->createPeriodicTask(
|
||||||
|
"SYRLINKS_COM", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc);
|
||||||
|
result = syrlinksCom->addComponent(objects::SYRLINKS_COM_HANDLER);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("SYRLINKS_COM", objects::SYRLINKS_COM_HANDLER);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_STAR_TRACKER == 1
|
#if OBSW_ADD_STAR_TRACKER == 1
|
||||||
PeriodicTaskIF* strHelperTask = factory->createPeriodicTask(
|
// Relatively high priority to make sure STR COM works well.
|
||||||
"STR_HELPER", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
|
PeriodicTaskIF* strHelperTask =
|
||||||
result = strHelperTask->addComponent(objects::STR_HELPER);
|
factory->createPeriodicTask("STR_HELPER", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2,
|
||||||
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = strHelperTask->addComponent(objects::STR_COM_IF);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("STR_HELPER", objects::STR_HELPER);
|
scheduling::printAddObjectError("STR_HELPER", objects::STR_COM_IF);
|
||||||
}
|
}
|
||||||
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
|
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
|
||||||
|
|
||||||
|
// TODO: Use regular scheduler for this task
|
||||||
#if OBSW_ADD_PLOC_MPSOC == 1
|
#if OBSW_ADD_PLOC_MPSOC == 1
|
||||||
PeriodicTaskIF* mpsocHelperTask = factory->createPeriodicTask(
|
PeriodicTaskIF* mpsocHelperTask = factory->createPeriodicTask(
|
||||||
"PLOC_MPSOC_HELPER", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
|
"PLOC_MPSOC_HELPER", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
|
||||||
result = mpsocHelperTask->addComponent(objects::PLOC_MPSOC_HELPER);
|
result = mpsocHelperTask->addComponent(objects::PLOC_MPSOC_HELPER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PLOC_MPSOC_HELPER", objects::PLOC_MPSOC_HELPER);
|
scheduling::printAddObjectError("PLOC_MPSOC_HELPER", objects::PLOC_MPSOC_HELPER);
|
||||||
}
|
}
|
||||||
#endif /* OBSW_ADD_PLOC_MPSOC */
|
#endif /* OBSW_ADD_PLOC_MPSOC */
|
||||||
|
|
||||||
|
// TODO: Use regular scheduler for this task
|
||||||
#if OBSW_ADD_PLOC_SUPERVISOR == 1
|
#if OBSW_ADD_PLOC_SUPERVISOR == 1
|
||||||
PeriodicTaskIF* supvHelperTask = factory->createPeriodicTask(
|
PeriodicTaskIF* supvHelperTask = factory->createPeriodicTask(
|
||||||
"PLOC_SUPV_HELPER", 10, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc);
|
"PLOC_SUPV_HELPER", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc);
|
||||||
result = supvHelperTask->addComponent(objects::PLOC_SUPERVISOR_HELPER);
|
result = supvHelperTask->addComponent(objects::PLOC_SUPERVISOR_HELPER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PLOC_SUPV_HELPER", objects::PLOC_SUPERVISOR_HELPER);
|
scheduling::printAddObjectError("PLOC_SUPV_HELPER", objects::PLOC_SUPERVISOR_HELPER);
|
||||||
@ -280,14 +366,14 @@ void scheduling::initTasks() {
|
|||||||
#endif /* OBSW_ADD_PLOC_SUPERVISOR */
|
#endif /* OBSW_ADD_PLOC_SUPERVISOR */
|
||||||
|
|
||||||
PeriodicTaskIF* plTask = factory->createPeriodicTask(
|
PeriodicTaskIF* plTask = factory->createPeriodicTask(
|
||||||
"PL_TASK", 25, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc);
|
"PL_TASK", 25, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
scheduling::addMpsocSupvHandlers(plTask);
|
|
||||||
plTask->addComponent(objects::CAM_SWITCHER);
|
plTask->addComponent(objects::CAM_SWITCHER);
|
||||||
|
scheduling::addMpsocSupvHandlers(plTask);
|
||||||
|
scheduling::scheduleScexDev(plTask);
|
||||||
|
|
||||||
#if OBSW_ADD_SCEX_DEVICE == 1
|
#if OBSW_ADD_SCEX_DEVICE == 1
|
||||||
PeriodicTaskIF* scexDevHandler;
|
|
||||||
PeriodicTaskIF* scexReaderTask;
|
PeriodicTaskIF* scexReaderTask;
|
||||||
scheduling::schedulingScex(*factory, scexDevHandler, scexReaderTask);
|
scheduling::scheduleScexReader(*factory, scexReaderTask);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::vector<PeriodicTaskIF*> pusTasks;
|
std::vector<PeriodicTaskIF*> pusTasks;
|
||||||
@ -335,16 +421,31 @@ void scheduling::initTasks() {
|
|||||||
#if OBSW_ADD_CCSDS_IP_CORES == 1
|
#if OBSW_ADD_CCSDS_IP_CORES == 1
|
||||||
pdecHandlerTask->startTask();
|
pdecHandlerTask->startTask();
|
||||||
#endif /* OBSW_ADD_CCSDS_IP_CORES == 1 */
|
#endif /* OBSW_ADD_CCSDS_IP_CORES == 1 */
|
||||||
|
liveTmTask->startTask();
|
||||||
|
logTmTask->startTask();
|
||||||
|
hkTmTask->startTask();
|
||||||
|
cfdpTmTask->startTask();
|
||||||
|
|
||||||
coreCtrlTask->startTask();
|
coreCtrlTask->startTask();
|
||||||
#if OBSW_ADD_SA_DEPL == 1
|
#if OBSW_ADD_SA_DEPL == 1
|
||||||
solarArrayDeplTask->startTask();
|
solarArrayDeplTask->startTask();
|
||||||
#endif
|
#endif
|
||||||
|
#if OBSW_ADD_ACS_BOARD == 1
|
||||||
|
acsBrdPolling->startTask();
|
||||||
|
#endif
|
||||||
|
#if OBSW_ADD_SYRLINKS == 1
|
||||||
|
syrlinksCom->startTask();
|
||||||
|
#endif
|
||||||
|
#if OBSW_ADD_MGT == 1
|
||||||
|
imtqPolling->startTask();
|
||||||
|
#endif
|
||||||
|
#if OBSW_ADD_SUN_SENSORS == 1
|
||||||
|
susPolling->startTask();
|
||||||
|
#endif
|
||||||
|
|
||||||
taskStarter(pstTasks, "PST task vector");
|
taskStarter(pstTasks, "PST task vector");
|
||||||
taskStarter(pusTasks, "PUS task vector");
|
taskStarter(pusTasks, "PUS task vector");
|
||||||
#if OBSW_ADD_SCEX_DEVICE == 1
|
#if OBSW_ADD_SCEX_DEVICE == 1
|
||||||
scexDevHandler->startTask();
|
|
||||||
scexReaderTask->startTask();
|
scexReaderTask->startTask();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -360,14 +461,11 @@ void scheduling::initTasks() {
|
|||||||
strHelperTask->startTask();
|
strHelperTask->startTask();
|
||||||
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
|
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
|
||||||
|
|
||||||
#if OBSW_ADD_GPS_CTRL == 1
|
#if OBSW_ADD_RW == 1
|
||||||
gpsTask->startTask();
|
rwPolling->startTask();
|
||||||
#endif
|
#endif
|
||||||
|
gpsTask->startTask();
|
||||||
acsSysTask->startTask();
|
acsSysTask->startTask();
|
||||||
#if OBSW_ADD_RTD_DEVICES == 1
|
|
||||||
tcsPollingTask->startTask();
|
|
||||||
tcsTask->startTask();
|
|
||||||
#endif /* OBSW_ADD_RTD_DEVICES == 1 */
|
|
||||||
if (not tcsSystemTask->isEmpty()) {
|
if (not tcsSystemTask->isEmpty()) {
|
||||||
tcsSystemTask->startTask();
|
tcsSystemTask->startTask();
|
||||||
}
|
}
|
||||||
@ -390,11 +488,12 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
#ifdef RELEASE_BUILD
|
#ifdef RELEASE_BUILD
|
||||||
static constexpr float acsPstPeriod = 0.4;
|
static constexpr float acsPstPeriod = 0.4;
|
||||||
#else
|
#else
|
||||||
static constexpr float acsPstPeriod = 0.8;
|
static constexpr float acsPstPeriod = 0.4;
|
||||||
#endif
|
#endif
|
||||||
FixedTimeslotTaskIF* acsPst = factory.createFixedTimeslotTask(
|
FixedTimeslotTaskIF* acsTcsPst =
|
||||||
"ACS_PST", 85, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, acsPstPeriod, missedDeadlineFunc);
|
factory.createFixedTimeslotTask("ACS_TCS_PST", 85, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2,
|
||||||
result = pst::pstAcs(acsPst, cfg);
|
acsPstPeriod, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = pst::pstTcsAndAcs(acsTcsPst, cfg);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
||||||
sif::warning << "scheduling::initTasks: ACS PST is empty" << std::endl;
|
sif::warning << "scheduling::initTasks: ACS PST is empty" << std::endl;
|
||||||
@ -402,14 +501,15 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
sif::error << "scheduling::initTasks: Creating ACS PST failed!" << std::endl;
|
sif::error << "scheduling::initTasks: Creating ACS PST failed!" << std::endl;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
taskVec.push_back(acsPst);
|
taskVec.push_back(acsTcsPst);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Polling Sequence Table Default */
|
/* Polling Sequence Table Default */
|
||||||
#if OBSW_ADD_SPI_TEST_CODE == 0
|
#if OBSW_ADD_SPI_TEST_CODE == 0
|
||||||
FixedTimeslotTaskIF* spiPst = factory.createFixedTimeslotTask(
|
FixedTimeslotTaskIF* syrlinksPst =
|
||||||
"MAIN_SPI", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc);
|
factory.createFixedTimeslotTask("SYRLINKS", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5,
|
||||||
result = pst::pstSpiAndSyrlinks(spiPst);
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = pst::pstSyrlinks(syrlinksPst);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
||||||
sif::warning << "scheduling::initTasks: SPI PST is empty" << std::endl;
|
sif::warning << "scheduling::initTasks: SPI PST is empty" << std::endl;
|
||||||
@ -417,14 +517,15 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
sif::error << "scheduling::initTasks: Creating SPI PST failed!" << std::endl;
|
sif::error << "scheduling::initTasks: Creating SPI PST failed!" << std::endl;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
taskVec.push_back(spiPst);
|
taskVec.push_back(syrlinksPst);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_I2C_TEST_CODE == 0
|
#if OBSW_ADD_I2C_TEST_CODE == 0
|
||||||
FixedTimeslotTaskIF* i2cPst = factory.createFixedTimeslotTask(
|
FixedTimeslotTaskIF* i2cPst =
|
||||||
"I2C_PST", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
|
factory.createFixedTimeslotTask("I2C_PS_PST", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.6,
|
||||||
result = pst::pstI2c(i2cPst);
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = pst::pstI2cProcessingSystem(i2cPst);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
||||||
sif::warning << "scheduling::initTasks: I2C PST is empty" << std::endl;
|
sif::warning << "scheduling::initTasks: I2C PST is empty" << std::endl;
|
||||||
@ -436,9 +537,9 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_GOMSPACE_PCDU == 1
|
FixedTimeslotTaskIF* gomSpacePstTask =
|
||||||
FixedTimeslotTaskIF* gomSpacePstTask = factory.createFixedTimeslotTask(
|
factory.createFixedTimeslotTask("GS_PST_TASK", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4,
|
||||||
"GS_PST_TASK", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 1.0, missedDeadlineFunc);
|
0.25, missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = pst::pstGompaceCan(gomSpacePstTask);
|
result = pst::pstGompaceCan(gomSpacePstTask);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
if (result != FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
if (result != FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
||||||
@ -446,49 +547,36 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
taskVec.push_back(gomSpacePstTask);
|
taskVec.push_back(gomSpacePstTask);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void scheduling::createPusTasks(TaskFactory& factory, TaskDeadlineMissedFunction missedDeadlineFunc,
|
void scheduling::createPusTasks(TaskFactory& factory, TaskDeadlineMissedFunction missedDeadlineFunc,
|
||||||
std::vector<PeriodicTaskIF*>& taskVec) {
|
std::vector<PeriodicTaskIF*>& taskVec) {
|
||||||
ReturnValue_t result = returnvalue::OK;
|
ReturnValue_t result = returnvalue::OK;
|
||||||
/* PUS Services */
|
/* PUS Services */
|
||||||
PeriodicTaskIF* pusVerification = factory.createPeriodicTask(
|
PeriodicTaskIF* pusHighPrio =
|
||||||
"PUS_VERIF", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
|
factory.createPeriodicTask("PUS_HIGH_PRIO", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2,
|
||||||
result = pusVerification->addComponent(objects::PUS_SERVICE_1_VERIFICATION);
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
|
result = pusHighPrio->addComponent(objects::PUS_SERVICE_1_VERIFICATION);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_VERIF", objects::PUS_SERVICE_1_VERIFICATION);
|
scheduling::printAddObjectError("PUS_VERIF", objects::PUS_SERVICE_1_VERIFICATION);
|
||||||
}
|
}
|
||||||
taskVec.push_back(pusVerification);
|
result = pusHighPrio->addComponent(objects::PUS_SERVICE_5_EVENT_REPORTING);
|
||||||
|
|
||||||
PeriodicTaskIF* pusEvents = factory.createPeriodicTask(
|
|
||||||
"PUS_EVENTS", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.200, missedDeadlineFunc);
|
|
||||||
result = pusEvents->addComponent(objects::PUS_SERVICE_5_EVENT_REPORTING);
|
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_EVENTS", objects::PUS_SERVICE_5_EVENT_REPORTING);
|
scheduling::printAddObjectError("PUS_EVENTS", objects::PUS_SERVICE_5_EVENT_REPORTING);
|
||||||
}
|
}
|
||||||
result = pusEvents->addComponent(objects::EVENT_MANAGER);
|
result = pusHighPrio->addComponent(objects::EVENT_MANAGER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_MGMT", objects::EVENT_MANAGER);
|
scheduling::printAddObjectError("EVENT_MGMT", objects::EVENT_MANAGER);
|
||||||
}
|
|
||||||
taskVec.push_back(pusEvents);
|
|
||||||
|
|
||||||
PeriodicTaskIF* pusHighPrio = factory.createPeriodicTask(
|
|
||||||
"PUS_HIGH_PRIO", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc);
|
|
||||||
result = pusHighPrio->addComponent(objects::PUS_SERVICE_2_DEVICE_ACCESS);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
scheduling::printAddObjectError("PUS_2", objects::PUS_SERVICE_2_DEVICE_ACCESS);
|
|
||||||
}
|
}
|
||||||
result = pusHighPrio->addComponent(objects::PUS_SERVICE_9_TIME_MGMT);
|
result = pusHighPrio->addComponent(objects::PUS_SERVICE_9_TIME_MGMT);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_9", objects::PUS_SERVICE_9_TIME_MGMT);
|
scheduling::printAddObjectError("PUS_TIME", objects::PUS_SERVICE_9_TIME_MGMT);
|
||||||
}
|
}
|
||||||
|
|
||||||
taskVec.push_back(pusHighPrio);
|
taskVec.push_back(pusHighPrio);
|
||||||
|
|
||||||
PeriodicTaskIF* pusMedPrio = factory.createPeriodicTask(
|
PeriodicTaskIF* pusMedPrio =
|
||||||
"PUS_MED_PRIO", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc);
|
factory.createPeriodicTask("PUS_MED_PRIO", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8,
|
||||||
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = pusMedPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING);
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_3", objects::PUS_SERVICE_3_HOUSEKEEPING);
|
scheduling::printAddObjectError("PUS_3", objects::PUS_SERVICE_3_HOUSEKEEPING);
|
||||||
@ -497,6 +585,10 @@ void scheduling::createPusTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_8", objects::PUS_SERVICE_8_FUNCTION_MGMT);
|
scheduling::printAddObjectError("PUS_8", objects::PUS_SERVICE_8_FUNCTION_MGMT);
|
||||||
}
|
}
|
||||||
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_15_TM_STORAGE);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
scheduling::printAddObjectError("PUS_15", objects::PUS_SERVICE_15_TM_STORAGE);
|
||||||
|
}
|
||||||
result = pusMedPrio->addComponent(objects::PUS_SERVICE_11_TC_SCHEDULER);
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_11_TC_SCHEDULER);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_11", objects::PUS_SERVICE_11_TC_SCHEDULER);
|
scheduling::printAddObjectError("PUS_11", objects::PUS_SERVICE_11_TC_SCHEDULER);
|
||||||
@ -513,20 +605,11 @@ void scheduling::createPusTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_201", objects::PUS_SERVICE_201_HEALTH);
|
scheduling::printAddObjectError("PUS_201", objects::PUS_SERVICE_201_HEALTH);
|
||||||
}
|
}
|
||||||
// Used for connection tests, therefore use higher priority
|
result = pusMedPrio->addComponent(objects::PUS_SERVICE_2_DEVICE_ACCESS);
|
||||||
result = pusMedPrio->addComponent(objects::PUS_SERVICE_17_TEST);
|
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
scheduling::printAddObjectError("PUS_17", objects::PUS_SERVICE_17_TEST);
|
scheduling::printAddObjectError("PUS_2", objects::PUS_SERVICE_2_DEVICE_ACCESS);
|
||||||
}
|
}
|
||||||
taskVec.push_back(pusMedPrio);
|
taskVec.push_back(pusMedPrio);
|
||||||
|
|
||||||
PeriodicTaskIF* pusLowPrio = factory.createPeriodicTask(
|
|
||||||
"PUS_LOW_PRIO", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.6, missedDeadlineFunc);
|
|
||||||
result = pusLowPrio->addComponent(objects::INTERNAL_ERROR_REPORTER);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
scheduling::printAddObjectError("ERROR_REPORTER", objects::INTERNAL_ERROR_REPORTER);
|
|
||||||
}
|
|
||||||
taskVec.push_back(pusLowPrio);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void scheduling::createTestTasks(TaskFactory& factory,
|
void scheduling::createTestTasks(TaskFactory& factory,
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
#ifndef BSP_Q7S_INITMISSION_H_
|
#ifndef BSP_Q7S_INITMISSION_H_
|
||||||
#define BSP_Q7S_INITMISSION_H_
|
#define BSP_Q7S_INITMISSION_H_
|
||||||
|
|
||||||
#include <pollingsequence/pollingSequenceFactory.h>
|
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "fsfw/tasks/definitions.h"
|
#include "fsfw/tasks/definitions.h"
|
||||||
|
#include "mission/pollingSeqTables.h"
|
||||||
|
|
||||||
using pst::AcsPstCfg;
|
using pst::AcsPstCfg;
|
||||||
|
|
||||||
|
@ -1,34 +1,48 @@
|
|||||||
#include <bsp_q7s/callbacks/q7sGpioCallbacks.h>
|
#include <bsp_q7s/callbacks/q7sGpioCallbacks.h>
|
||||||
|
#include <dummies/ComCookieDummy.h>
|
||||||
|
#include <dummies/PcduHandlerDummy.h>
|
||||||
#include <fsfw/health/HealthTableIF.h>
|
#include <fsfw/health/HealthTableIF.h>
|
||||||
#include <fsfw/power/DummyPowerSwitcher.h>
|
#include <fsfw/power/DummyPowerSwitcher.h>
|
||||||
#include <mission/devices/devicedefinitions/GomspaceDefinitions.h>
|
#include <fsfw_hal/common/gpio/GpioCookie.h>
|
||||||
|
#include <mission/power/gsDefs.h>
|
||||||
|
#include <mission/system/systemTree.h>
|
||||||
|
#include <mission/utility/DummySdCardManager.h>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/core/CoreController.h"
|
#include "bsp_q7s/core/CoreController.h"
|
||||||
#include "bsp_q7s/core/ObjectFactory.h"
|
#include "bsp_q7s/core/ObjectFactory.h"
|
||||||
#include "busConf.h"
|
#include "busConf.h"
|
||||||
#include "devConf.h"
|
#include "devConf.h"
|
||||||
#include "dummies/helpers.h"
|
#include "dummies/helperFactory.h"
|
||||||
#include "eive/objects.h"
|
#include "eive/objects.h"
|
||||||
#include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h"
|
#include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h"
|
||||||
#include "linux/ObjectFactory.h"
|
#include "linux/ObjectFactory.h"
|
||||||
#include "linux/callbacks/gpioCallbacks.h"
|
#include "linux/callbacks/gpioCallbacks.h"
|
||||||
#include "mission/core/GenericFactory.h"
|
#include "mission/genericFactory.h"
|
||||||
#include "mission/system/tree/comModeTree.h"
|
#include "mission/system/com/comModeTree.h"
|
||||||
|
|
||||||
void ObjectFactory::produce(void* args) {
|
void ObjectFactory::produce(void* args) {
|
||||||
ObjectFactory::setStatics();
|
ObjectFactory::setStatics();
|
||||||
HealthTableIF* healthTable = nullptr;
|
HealthTableIF* healthTable = nullptr;
|
||||||
PusTmFunnel* pusFunnel = nullptr;
|
PusTmFunnel* pusFunnel = nullptr;
|
||||||
CfdpTmFunnel* cfdpFunnel = nullptr;
|
CfdpTmFunnel* cfdpFunnel = nullptr;
|
||||||
ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel);
|
StorageManagerIF* ipcStore = nullptr;
|
||||||
|
StorageManagerIF* tmStore = nullptr;
|
||||||
|
|
||||||
|
bool enableHkSets = false;
|
||||||
|
#if OBSW_ENABLE_PERIODIC_HK == 1
|
||||||
|
enableHkSets = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PersistentTmStores stores;
|
||||||
|
ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel,
|
||||||
|
*SdCardManager::instance(), &ipcStore, &tmStore, stores);
|
||||||
|
|
||||||
LinuxLibgpioIF* gpioComIF = nullptr;
|
LinuxLibgpioIF* gpioComIF = nullptr;
|
||||||
SerialComIF* uartComIF = nullptr;
|
SerialComIF* uartComIF = nullptr;
|
||||||
SpiComIF* spiMainComIF = nullptr;
|
SpiComIF* spiMainComIF = nullptr;
|
||||||
I2cComIF* i2cComIF = nullptr;
|
I2cComIF* i2cComIF = nullptr;
|
||||||
SpiComIF* spiRwComIF = nullptr;
|
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF);
|
||||||
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF, &spiRwComIF);
|
|
||||||
/* Adding gpios for chip select decoding to the gpioComIf */
|
/* Adding gpios for chip select decoding to the gpioComIf */
|
||||||
q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF);
|
q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF);
|
||||||
gpioCallbacks::disableAllDecoder(gpioComIF);
|
gpioCallbacks::disableAllDecoder(gpioComIF);
|
||||||
@ -49,14 +63,15 @@ void ObjectFactory::produce(void* args) {
|
|||||||
|
|
||||||
PowerSwitchIF* pwrSwitcher = nullptr;
|
PowerSwitchIF* pwrSwitcher = nullptr;
|
||||||
#if OBSW_ADD_GOMSPACE_PCDU == 0
|
#if OBSW_ADD_GOMSPACE_PCDU == 0
|
||||||
pwrSwitcher = new DummyPowerSwitcher(objects::PCDU_HANDLER, 18, 0);
|
pwrSwitcher = new PcduHandlerDummy(objects::PCDU_HANDLER);
|
||||||
#else
|
#else
|
||||||
createPcduComponents(gpioComIF, &pwrSwitcher);
|
createPcduComponents(gpioComIF, &pwrSwitcher, enableHkSets);
|
||||||
#endif
|
#endif
|
||||||
|
satsystem::EIVE_SYSTEM.setI2cRecoveryParams(pwrSwitcher);
|
||||||
|
|
||||||
dummy::createDummies(dummyCfg, *pwrSwitcher);
|
dummy::createDummies(dummyCfg, *pwrSwitcher, gpioComIF);
|
||||||
|
|
||||||
new CoreController(objects::CORE_CONTROLLER);
|
new CoreController(objects::CORE_CONTROLLER, enableHkSets);
|
||||||
|
|
||||||
// Regular FM code, does not work for EM if the hardware is not connected
|
// Regular FM code, does not work for EM if the hardware is not connected
|
||||||
// createPcduComponents(gpioComIF, &pwrSwitcher);
|
// createPcduComponents(gpioComIF, &pwrSwitcher);
|
||||||
@ -74,11 +89,16 @@ void ObjectFactory::produce(void* args) {
|
|||||||
// createRadSensorComponent(gpioComIF);
|
// createRadSensorComponent(gpioComIF);
|
||||||
|
|
||||||
#if OBSW_ADD_ACS_BOARD == 1
|
#if OBSW_ADD_ACS_BOARD == 1
|
||||||
createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher);
|
createAcsBoardComponents(*spiMainComIF, gpioComIF, uartComIF, *pwrSwitcher);
|
||||||
|
#else
|
||||||
|
// Still add all GPIOs for EM.
|
||||||
|
GpioCookie* acsBoardGpios = new GpioCookie();
|
||||||
|
createAcsBoardGpios(*acsBoardGpios);
|
||||||
|
gpioChecker(gpioComIF->addGpios(acsBoardGpios), "ACS Board");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_MGT == 1
|
#if OBSW_ADD_MGT == 1
|
||||||
createImtqComponents(pwrSwitcher);
|
createImtqComponents(pwrSwitcher, enableHkSets);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_SYRLINKS == 1
|
#if OBSW_ADD_SYRLINKS == 1
|
||||||
@ -90,17 +110,22 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
|
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
|
||||||
createBpxBatteryComponent();
|
createBpxBatteryComponent(enableHkSets);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_STAR_TRACKER == 1
|
#if OBSW_ADD_STAR_TRACKER == 1
|
||||||
createStrComponents(pwrSwitcher);
|
createStrComponents(pwrSwitcher);
|
||||||
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
|
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
|
||||||
|
|
||||||
#if OBSW_ADD_CCSDS_IP_CORES == 1
|
#if OBSW_ADD_CCSDS_IP_CORES == 1
|
||||||
CcsdsIpCoreHandler* ipCoreHandler = nullptr;
|
CcsdsIpCoreHandler* ipCoreHandler = nullptr;
|
||||||
createCcsdsComponents(gpioComIF, &ipCoreHandler);
|
CcsdsComponentArgs ccsdsArgs(*gpioComIF, *ipcStore, *tmStore, stores, *pusFunnel, *cfdpFunnel,
|
||||||
|
&ipCoreHandler);
|
||||||
|
createCcsdsComponents(ccsdsArgs);
|
||||||
#if OBSW_TM_TO_PTME == 1
|
#if OBSW_TM_TO_PTME == 1
|
||||||
ObjectFactory::addTmtcIpCoresToFunnels(*ipCoreHandler, *pusFunnel, *cfdpFunnel);
|
if (ccsdsArgs.liveDestination != nullptr) {
|
||||||
|
pusFunnel->addLiveDestination("VC0 LIVE TM", *ccsdsArgs.liveDestination, 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* OBSW_ADD_CCSDS_IP_CORES == 1 */
|
#endif /* OBSW_ADD_CCSDS_IP_CORES == 1 */
|
||||||
/* Test Task */
|
/* Test Task */
|
||||||
@ -111,9 +136,9 @@ void ObjectFactory::produce(void* args) {
|
|||||||
createScexComponents(q7s::UART_SCEX_DEV, pwrSwitcher, *SdCardManager::instance(), false,
|
createScexComponents(q7s::UART_SCEX_DEV, pwrSwitcher, *SdCardManager::instance(), false,
|
||||||
pcdu::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V);
|
pcdu::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V);
|
||||||
#endif
|
#endif
|
||||||
createAcsController(true);
|
createAcsController(true, enableHkSets);
|
||||||
HeaterHandler* heaterHandler = nullptr;
|
HeaterHandler* heaterHandler;
|
||||||
ObjectFactory::createGenericHeaterComponents(*gpioComIF, *pwrSwitcher, heaterHandler);
|
createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler);
|
||||||
createThermalController(*heaterHandler);
|
createThermalController(*heaterHandler);
|
||||||
satsystem::com::init();
|
satsystem::init();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#include <bsp_q7s/callbacks/q7sGpioCallbacks.h>
|
#include <bsp_q7s/callbacks/q7sGpioCallbacks.h>
|
||||||
#include <mission/devices/devicedefinitions/GomspaceDefinitions.h>
|
#include <fsfw/storagemanager/LocalPool.h>
|
||||||
|
#include <fsfw/storagemanager/PoolManager.h>
|
||||||
|
#include <mission/power/gsDefs.h>
|
||||||
|
#include <mission/system/EiveSystem.h>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/core/CoreController.h"
|
#include "bsp_q7s/core/CoreController.h"
|
||||||
@ -10,40 +13,52 @@
|
|||||||
#include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h"
|
#include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h"
|
||||||
#include "linux/ObjectFactory.h"
|
#include "linux/ObjectFactory.h"
|
||||||
#include "linux/callbacks/gpioCallbacks.h"
|
#include "linux/callbacks/gpioCallbacks.h"
|
||||||
#include "mission/core/GenericFactory.h"
|
#include "mission/genericFactory.h"
|
||||||
#include "mission/system/tree/system.h"
|
#include "mission/system/systemTree.h"
|
||||||
|
#include "mission/tmtc/tmFilters.h"
|
||||||
|
|
||||||
void ObjectFactory::produce(void* args) {
|
void ObjectFactory::produce(void* args) {
|
||||||
ObjectFactory::setStatics();
|
ObjectFactory::setStatics();
|
||||||
HealthTableIF* healthTable = nullptr;
|
HealthTableIF* healthTable = nullptr;
|
||||||
PusTmFunnel* pusFunnel = nullptr;
|
PusTmFunnel* pusFunnel = nullptr;
|
||||||
CfdpTmFunnel* cfdpFunnel = nullptr;
|
CfdpTmFunnel* cfdpFunnel = nullptr;
|
||||||
ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel);
|
StorageManagerIF* ipcStore = nullptr;
|
||||||
|
StorageManagerIF* tmStore = nullptr;
|
||||||
|
|
||||||
|
bool enableHkSets = false;
|
||||||
|
#if OBSW_ENABLE_PERIODIC_HK == 1
|
||||||
|
enableHkSets = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PersistentTmStores stores;
|
||||||
|
ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel,
|
||||||
|
*SdCardManager::instance(), &ipcStore, &tmStore, stores);
|
||||||
|
|
||||||
LinuxLibgpioIF* gpioComIF = nullptr;
|
LinuxLibgpioIF* gpioComIF = nullptr;
|
||||||
SerialComIF* uartComIF = nullptr;
|
SerialComIF* uartComIF = nullptr;
|
||||||
SpiComIF* spiMainComIF = nullptr;
|
SpiComIF* spiMainComIF = nullptr;
|
||||||
I2cComIF* i2cComIF = nullptr;
|
I2cComIF* i2cComIF = nullptr;
|
||||||
PowerSwitchIF* pwrSwitcher = nullptr;
|
PowerSwitchIF* pwrSwitcher = nullptr;
|
||||||
SpiComIF* spiRwComIF = nullptr;
|
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF);
|
||||||
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF, &spiRwComIF);
|
|
||||||
/* Adding gpios for chip select decoding to the gpioComIf */
|
/* Adding gpios for chip select decoding to the gpioComIf */
|
||||||
q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF);
|
q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF);
|
||||||
gpioCallbacks::disableAllDecoder(gpioComIF);
|
gpioCallbacks::disableAllDecoder(gpioComIF);
|
||||||
|
|
||||||
new CoreController(objects::CORE_CONTROLLER);
|
new CoreController(objects::CORE_CONTROLLER, enableHkSets);
|
||||||
createPcduComponents(gpioComIF, &pwrSwitcher);
|
createPcduComponents(gpioComIF, &pwrSwitcher, enableHkSets);
|
||||||
|
satsystem::EIVE_SYSTEM.setI2cRecoveryParams(pwrSwitcher);
|
||||||
|
|
||||||
auto* stackHandler = new Stack5VHandler(*pwrSwitcher);
|
auto* stackHandler = new Stack5VHandler(*pwrSwitcher);
|
||||||
|
|
||||||
#if OBSW_ADD_RAD_SENSORS == 1
|
#if OBSW_ADD_RAD_SENSORS == 1
|
||||||
createRadSensorComponent(gpioComIF, *stackHandler);
|
createRadSensorComponent(gpioComIF, *stackHandler);
|
||||||
#endif
|
#endif
|
||||||
#if OBSW_ADD_SUN_SENSORS == 1
|
#if OBSW_ADD_SUN_SENSORS == 1
|
||||||
createSunSensorComponents(gpioComIF, spiMainComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV, true);
|
createSunSensorComponents(gpioComIF, spiMainComIF, *pwrSwitcher, q7s::SPI_DEFAULT_DEV, true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_ACS_BOARD == 1
|
#if OBSW_ADD_ACS_BOARD == 1
|
||||||
createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher);
|
createAcsBoardComponents(*spiMainComIF, gpioComIF, uartComIF, *pwrSwitcher, true);
|
||||||
#endif
|
#endif
|
||||||
HeaterHandler* heaterHandler;
|
HeaterHandler* heaterHandler;
|
||||||
createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler);
|
createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler);
|
||||||
@ -59,28 +74,33 @@ void ObjectFactory::produce(void* args) {
|
|||||||
createPayloadComponents(gpioComIF, *pwrSwitcher);
|
createPayloadComponents(gpioComIF, *pwrSwitcher);
|
||||||
|
|
||||||
#if OBSW_ADD_MGT == 1
|
#if OBSW_ADD_MGT == 1
|
||||||
createImtqComponents(pwrSwitcher);
|
createImtqComponents(pwrSwitcher, enableHkSets);
|
||||||
#endif
|
#endif
|
||||||
createReactionWheelComponents(gpioComIF, pwrSwitcher);
|
createReactionWheelComponents(gpioComIF, pwrSwitcher);
|
||||||
|
|
||||||
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
|
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
|
||||||
createBpxBatteryComponent();
|
createBpxBatteryComponent(enableHkSets);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_STAR_TRACKER == 1
|
#if OBSW_ADD_STAR_TRACKER == 1
|
||||||
createStrComponents(pwrSwitcher);
|
createStrComponents(pwrSwitcher);
|
||||||
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
|
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
|
||||||
|
|
||||||
#if OBSW_ADD_CCSDS_IP_CORES == 1
|
#if OBSW_ADD_CCSDS_IP_CORES == 1
|
||||||
CcsdsIpCoreHandler* ipCoreHandler = nullptr;
|
CcsdsIpCoreHandler* ipCoreHandler = nullptr;
|
||||||
createCcsdsComponents(gpioComIF, &ipCoreHandler);
|
CcsdsComponentArgs ccsdsArgs(*gpioComIF, *ipcStore, *tmStore, stores, *pusFunnel, *cfdpFunnel,
|
||||||
|
&ipCoreHandler);
|
||||||
|
createCcsdsComponents(ccsdsArgs);
|
||||||
#if OBSW_TM_TO_PTME == 1
|
#if OBSW_TM_TO_PTME == 1
|
||||||
addTmtcIpCoresToFunnels(*ipCoreHandler, *pusFunnel, *cfdpFunnel);
|
if (ccsdsArgs.liveDestination != nullptr) {
|
||||||
|
pusFunnel->addLiveDestination("VC0 LIVE TM", *ccsdsArgs.liveDestination, 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* OBSW_ADD_CCSDS_IP_CORES == 1 */
|
#endif /* OBSW_ADD_CCSDS_IP_CORES == 1 */
|
||||||
|
|
||||||
#if OBSW_ADD_SCEX_DEVICE == 1
|
#if OBSW_ADD_SCEX_DEVICE == 1
|
||||||
createScexComponents(q7s::UART_SCEX_DEV, pwrSwitcher, *SdCardManager::instance(), false,
|
createScexComponents(q7s::UART_SCEX_DEV, pwrSwitcher, *SdCardManager::instance(), false,
|
||||||
pcdu::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V);
|
power::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V);
|
||||||
#endif
|
#endif
|
||||||
/* Test Task */
|
/* Test Task */
|
||||||
#if OBSW_ADD_TEST_CODE == 1
|
#if OBSW_ADD_TEST_CODE == 1
|
||||||
@ -89,6 +109,6 @@ void ObjectFactory::produce(void* args) {
|
|||||||
|
|
||||||
createMiscComponents();
|
createMiscComponents();
|
||||||
createThermalController(*heaterHandler);
|
createThermalController(*heaterHandler);
|
||||||
createAcsController(true);
|
createAcsController(true, enableHkSets);
|
||||||
satsystem::init();
|
satsystem::init();
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ ReturnValue_t FilesystemHelper::checkPath(std::string path) {
|
|||||||
}
|
}
|
||||||
} else if (path.substr(0, sizeof(config::SD_1_MOUNT_POINT)) ==
|
} else if (path.substr(0, sizeof(config::SD_1_MOUNT_POINT)) ==
|
||||||
std::string(config::SD_1_MOUNT_POINT)) {
|
std::string(config::SD_1_MOUNT_POINT)) {
|
||||||
if (!sdcMan->isSdCardUsable(sd::SLOT_0)) {
|
if (!sdcMan->isSdCardUsable(sd::SLOT_1)) {
|
||||||
sif::warning << "FilesystemHelper::checkPath: SD card 1 not mounted" << std::endl;
|
sif::warning << "FilesystemHelper::checkPath: SD card 1 not mounted" << std::endl;
|
||||||
return SD_NOT_MOUNTED;
|
return SD_NOT_MOUNTED;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <fsfw/ipc/MutexGuard.h>
|
#include <fsfw/ipc/MutexGuard.h>
|
||||||
#include <fsfw/timemanager/Countdown.h>
|
#include <fsfw/timemanager/Countdown.h>
|
||||||
|
#include <fsfw/timemanager/Stopwatch.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
@ -20,31 +21,32 @@
|
|||||||
SdCardManager* SdCardManager::INSTANCE = nullptr;
|
SdCardManager* SdCardManager::INSTANCE = nullptr;
|
||||||
|
|
||||||
SdCardManager::SdCardManager() : SystemObject(objects::SDC_MANAGER), cmdExecutor(256) {
|
SdCardManager::SdCardManager() : SystemObject(objects::SDC_MANAGER), cmdExecutor(256) {
|
||||||
mutex = MutexFactory::instance()->createMutex();
|
sdLock = MutexFactory::instance()->createMutex();
|
||||||
ReturnValue_t result = mutex->lockMutex();
|
prefLock = MutexFactory::instance()->createMutex();
|
||||||
if (result != returnvalue::OK) {
|
defaultLock = MutexFactory::instance()->createMutex();
|
||||||
|
|
||||||
|
MutexGuard mg(prefLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
|
if (mg.getLockResult() != returnvalue::OK) {
|
||||||
sif::error << "SdCardManager::SdCardManager: Mutex lock failed" << std::endl;
|
sif::error << "SdCardManager::SdCardManager: Mutex lock failed" << std::endl;
|
||||||
}
|
}
|
||||||
uint8_t prefSdRaw = 0;
|
uint8_t prefSdRaw = 0;
|
||||||
result = scratch::readNumber(scratch::PREFERED_SDC_KEY, prefSdRaw);
|
ReturnValue_t result = scratch::readNumber(scratch::PREFERED_SDC_KEY, prefSdRaw);
|
||||||
if (mutex->unlockMutex() != returnvalue::OK) {
|
|
||||||
sif::error << "SdCardManager::SdCardManager: Mutex unlock failed" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
if (result == scratch::KEY_NOT_FOUND) {
|
if (result == scratch::KEY_NOT_FOUND) {
|
||||||
sif::warning << "CoreController::sdCardInit: "
|
sif::warning << "CoreController::sdCardInit: "
|
||||||
"Preferred SD card not set. Setting to 0"
|
"Preferred SD card not set. Setting to 0"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
setPreferredSdCard(sd::SdCard::SLOT_0);
|
scratch::writeNumber(scratch::PREFERED_SDC_KEY, static_cast<uint8_t>(sd::SdCard::SLOT_0));
|
||||||
sdInfo.pref = sd::SdCard::SLOT_0;
|
prefSdRaw = sd::SdCard::SLOT_0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Should not happen.
|
// Should not happen.
|
||||||
// TODO: Maybe trigger event?
|
// TODO: Maybe trigger event?
|
||||||
sif::error << "SdCardManager::SdCardManager: Reading preferred SD card from scratch"
|
sif::error << "SdCardManager::SdCardManager: Reading preferred SD card from scratch"
|
||||||
"buffer failed"
|
"buffer failed"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
sdInfo.pref = sd::SdCard::SLOT_0;
|
prefSdRaw = sd::SdCard::SLOT_0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sdInfo.pref = static_cast<sd::SdCard>(prefSdRaw);
|
sdInfo.pref = static_cast<sd::SdCard>(prefSdRaw);
|
||||||
@ -193,28 +195,9 @@ ReturnValue_t SdCardManager::setSdCardState(sd::SdCard sdCard, bool on) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t SdCardManager::getSdCardsStatus(SdStatePair& active) {
|
ReturnValue_t SdCardManager::getSdCardsStatus(SdStatePair& sdStates) {
|
||||||
using namespace std;
|
MutexGuard mg(sdLock, LOCK_TYPE, SD_LOCK_TIMEOUT, LOCK_CTX);
|
||||||
MutexGuard mg(mutex);
|
sdStates = this->sdStates;
|
||||||
if (not filesystem::exists(SD_STATE_FILE)) {
|
|
||||||
return STATUS_FILE_NEXISTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now the file should exist in any case. Still check whether it exists.
|
|
||||||
fstream sdStatus(SD_STATE_FILE);
|
|
||||||
if (not sdStatus.good()) {
|
|
||||||
return STATUS_FILE_NEXISTS;
|
|
||||||
}
|
|
||||||
string line;
|
|
||||||
uint8_t idx = 0;
|
|
||||||
sd::SdCard currentSd = sd::SdCard::SLOT_0;
|
|
||||||
// Process status file line by line
|
|
||||||
while (std::getline(sdStatus, line)) {
|
|
||||||
processSdStatusLine(active, line, idx, currentSd);
|
|
||||||
}
|
|
||||||
if (active.first != sd::SdState::MOUNTED && active.second != sd::SdState::MOUNTED) {
|
|
||||||
sdCardActive = false;
|
|
||||||
}
|
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,7 +220,8 @@ ReturnValue_t SdCardManager::mountSdCard(sd::SdCard sdCard) {
|
|||||||
mountDev = SD_1_DEV_NAME;
|
mountDev = SD_1_DEV_NAME;
|
||||||
mountPoint = config::SD_1_MOUNT_POINT;
|
mountPoint = config::SD_1_MOUNT_POINT;
|
||||||
}
|
}
|
||||||
if (not filesystem::exists(mountDev)) {
|
std::error_code e;
|
||||||
|
if (not filesystem::exists(mountDev, e)) {
|
||||||
sif::warning << "SdCardManager::mountSdCard: Device file does not exists. Make sure to"
|
sif::warning << "SdCardManager::mountSdCard: Device file does not exists. Make sure to"
|
||||||
" turn on the SD card"
|
" turn on the SD card"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
@ -272,7 +256,8 @@ ReturnValue_t SdCardManager::unmountSdCard(sd::SdCard sdCard) {
|
|||||||
} else if (sdCard == sd::SdCard::SLOT_1) {
|
} else if (sdCard == sd::SdCard::SLOT_1) {
|
||||||
mountPoint = config::SD_1_MOUNT_POINT;
|
mountPoint = config::SD_1_MOUNT_POINT;
|
||||||
}
|
}
|
||||||
if (not filesystem::exists(mountPoint)) {
|
std::error_code e;
|
||||||
|
if (not filesystem::exists(mountPoint, e)) {
|
||||||
sif::error << "SdCardManager::unmountSdCard: Default mount point " << mountPoint
|
sif::error << "SdCardManager::unmountSdCard: Default mount point " << mountPoint
|
||||||
<< "does not exist" << std::endl;
|
<< "does not exist" << std::endl;
|
||||||
return UNMOUNT_ERROR;
|
return UNMOUNT_ERROR;
|
||||||
@ -304,10 +289,9 @@ ReturnValue_t SdCardManager::sanitizeState(SdStatePair* statusPair, sd::SdCard p
|
|||||||
resetNonBlockingState = true;
|
resetNonBlockingState = true;
|
||||||
}
|
}
|
||||||
if (statusPair == nullptr) {
|
if (statusPair == nullptr) {
|
||||||
sdStatusPtr = std::make_unique<SdStatePair>();
|
return returnvalue::FAILED;
|
||||||
statusPair = sdStatusPtr.get();
|
|
||||||
getSdCardsStatus(*statusPair);
|
|
||||||
}
|
}
|
||||||
|
getSdCardsStatus(*statusPair);
|
||||||
|
|
||||||
if (statusPair->first == sd::SdState::ON) {
|
if (statusPair->first == sd::SdState::ON) {
|
||||||
result = mountSdCard(prefSdCard);
|
result = mountSdCard(prefSdCard);
|
||||||
@ -325,8 +309,7 @@ void SdCardManager::resetState() {
|
|||||||
currentOp = Operations::IDLE;
|
currentOp = Operations::IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SdCardManager::processSdStatusLine(std::pair<sd::SdState, sd::SdState>& active,
|
void SdCardManager::processSdStatusLine(std::string& line, uint8_t& idx, sd::SdCard& currentSd) {
|
||||||
std::string& line, uint8_t& idx, sd::SdCard& currentSd) {
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
istringstream iss(line);
|
istringstream iss(line);
|
||||||
string word;
|
string word;
|
||||||
@ -347,24 +330,26 @@ void SdCardManager::processSdStatusLine(std::pair<sd::SdState, sd::SdState>& act
|
|||||||
|
|
||||||
if (word == "on") {
|
if (word == "on") {
|
||||||
if (currentSd == sd::SdCard::SLOT_0) {
|
if (currentSd == sd::SdCard::SLOT_0) {
|
||||||
active.first = sd::SdState::ON;
|
sdStates.first = sd::SdState::ON;
|
||||||
} else {
|
} else {
|
||||||
active.second = sd::SdState::ON;
|
sdStates.second = sd::SdState::ON;
|
||||||
}
|
}
|
||||||
} else if (word == "off") {
|
} else if (word == "off") {
|
||||||
|
MutexGuard mg(sdLock, LOCK_TYPE, SD_LOCK_TIMEOUT, LOCK_CTX);
|
||||||
if (currentSd == sd::SdCard::SLOT_0) {
|
if (currentSd == sd::SdCard::SLOT_0) {
|
||||||
active.first = sd::SdState::OFF;
|
sdStates.first = sd::SdState::OFF;
|
||||||
} else {
|
} else {
|
||||||
active.second = sd::SdState::OFF;
|
sdStates.second = sd::SdState::OFF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mountLine) {
|
if (mountLine) {
|
||||||
|
MutexGuard mg(sdLock, LOCK_TYPE, SD_LOCK_TIMEOUT, LOCK_CTX);
|
||||||
if (currentSd == sd::SdCard::SLOT_0) {
|
if (currentSd == sd::SdCard::SLOT_0) {
|
||||||
active.first = sd::SdState::MOUNTED;
|
sdStates.first = sd::SdState::MOUNTED;
|
||||||
} else {
|
} else {
|
||||||
active.second = sd::SdState::MOUNTED;
|
sdStates.second = sd::SdState::MOUNTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,7 +363,7 @@ void SdCardManager::processSdStatusLine(std::pair<sd::SdState, sd::SdState>& act
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::optional<sd::SdCard> SdCardManager::getPreferredSdCard() const {
|
std::optional<sd::SdCard> SdCardManager::getPreferredSdCard() const {
|
||||||
MutexGuard mg(mutex);
|
MutexGuard mg(prefLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
auto res = mg.getLockResult();
|
auto res = mg.getLockResult();
|
||||||
if (res != returnvalue::OK) {
|
if (res != returnvalue::OK) {
|
||||||
sif::error << "SdCardManager::getPreferredSdCard: Lock error" << std::endl;
|
sif::error << "SdCardManager::getPreferredSdCard: Lock error" << std::endl;
|
||||||
@ -387,7 +372,7 @@ std::optional<sd::SdCard> SdCardManager::getPreferredSdCard() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t SdCardManager::setPreferredSdCard(sd::SdCard sdCard) {
|
ReturnValue_t SdCardManager::setPreferredSdCard(sd::SdCard sdCard) {
|
||||||
MutexGuard mg(mutex);
|
MutexGuard mg(prefLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
if (sdCard == sd::SdCard::BOTH) {
|
if (sdCard == sd::SdCard::BOTH) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
@ -396,23 +381,47 @@ ReturnValue_t SdCardManager::setPreferredSdCard(sd::SdCard sdCard) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t SdCardManager::updateSdCardStateFile() {
|
ReturnValue_t SdCardManager::updateSdCardStateFile() {
|
||||||
|
using namespace std;
|
||||||
if (cmdExecutor.getCurrentState() == CommandExecutor::States::PENDING) {
|
if (cmdExecutor.getCurrentState() == CommandExecutor::States::PENDING) {
|
||||||
return CommandExecutor::COMMAND_PENDING;
|
return CommandExecutor::COMMAND_PENDING;
|
||||||
}
|
}
|
||||||
MutexGuard mg(mutex);
|
|
||||||
// Use q7hw utility and pipe the command output into the state file
|
// Use q7hw utility and pipe the command output into the state file
|
||||||
std::string updateCmd = "q7hw sd info all > " + std::string(SD_STATE_FILE);
|
std::string updateCmd = "q7hw sd info all > " + std::string(SD_STATE_FILE);
|
||||||
cmdExecutor.load(updateCmd, blocking, printCmdOutput);
|
cmdExecutor.load(updateCmd, true, printCmdOutput);
|
||||||
ReturnValue_t result = cmdExecutor.execute();
|
ReturnValue_t result = cmdExecutor.execute();
|
||||||
if (blocking and result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
utility::handleSystemError(cmdExecutor.getLastError(), "SdCardManager::mountSdCard");
|
utility::handleSystemError(cmdExecutor.getLastError(), "SdCardManager::mountSdCard");
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
|
std::error_code e;
|
||||||
|
if (not filesystem::exists(SD_STATE_FILE, e)) {
|
||||||
|
return STATUS_FILE_NEXISTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now the file should exist in any case. Still check whether it exists.
|
||||||
|
fstream sdStatus(SD_STATE_FILE);
|
||||||
|
if (not sdStatus.good()) {
|
||||||
|
return STATUS_FILE_NEXISTS;
|
||||||
|
}
|
||||||
|
string line;
|
||||||
|
uint8_t idx = 0;
|
||||||
|
sd::SdCard currentSd = sd::SdCard::SLOT_0;
|
||||||
|
// Process status file line by line
|
||||||
|
while (std::getline(sdStatus, line)) {
|
||||||
|
processSdStatusLine(line, idx, currentSd);
|
||||||
|
}
|
||||||
|
if (sdStates.first != sd::SdState::MOUNTED && sdStates.second != sd::SdState::MOUNTED) {
|
||||||
|
sdCardActive = false;
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& SdCardManager::getCurrentMountPrefix() const {
|
const char* SdCardManager::getCurrentMountPrefix() const {
|
||||||
MutexGuard mg(mutex);
|
MutexGuard mg(defaultLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
return currentPrefix;
|
if (currentPrefix.has_value()) {
|
||||||
|
return currentPrefix.value().c_str();
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
SdCardManager::OpStatus SdCardManager::checkCurrentOp(Operations& currentOp) {
|
SdCardManager::OpStatus SdCardManager::checkCurrentOp(Operations& currentOp) {
|
||||||
@ -461,41 +470,35 @@ void SdCardManager::setPrintCommandOutput(bool print) { this->printCmdOutput = p
|
|||||||
|
|
||||||
bool SdCardManager::isSdCardUsable(std::optional<sd::SdCard> sdCard) {
|
bool SdCardManager::isSdCardUsable(std::optional<sd::SdCard> sdCard) {
|
||||||
{
|
{
|
||||||
MutexGuard mg(mutex);
|
MutexGuard mg(defaultLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
if (markedUnusable) {
|
if (markedUnusable) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SdCardManager::SdStatePair active;
|
MutexGuard mg(sdLock, LOCK_TYPE, SD_LOCK_TIMEOUT, LOCK_CTX);
|
||||||
ReturnValue_t result = this->getSdCardsStatus(active);
|
|
||||||
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
sif::debug << "SdCardManager::isSdCardMounted: Failed to get SD card active state";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (not sdCard) {
|
if (not sdCard) {
|
||||||
if (active.first == sd::MOUNTED or active.second == sd::MOUNTED) {
|
if (sdStates.first == sd::MOUNTED or sdStates.second == sd::MOUNTED) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (sdCard == sd::SLOT_0) {
|
if (sdCard == sd::SLOT_0) {
|
||||||
if (active.first == sd::MOUNTED) {
|
if (sdStates.first == sd::MOUNTED) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sdCard == sd::SLOT_1) {
|
if (sdCard == sd::SLOT_1) {
|
||||||
if (active.second == sd::MOUNTED) {
|
if (sdStates.second == sd::MOUNTED) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sdCard == sd::BOTH) {
|
if (sdCard == sd::BOTH) {
|
||||||
if (active.first == sd::MOUNTED && active.second == sd::MOUNTED) {
|
if (sdStates.first == sd::MOUNTED && sdStates.second == sd::MOUNTED) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -505,9 +508,9 @@ bool SdCardManager::isSdCardUsable(std::optional<sd::SdCard> sdCard) {
|
|||||||
ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& readOnly) {
|
ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& readOnly) {
|
||||||
std::ostringstream command;
|
std::ostringstream command;
|
||||||
if (sdcard == sd::SdCard::SLOT_0) {
|
if (sdcard == sd::SdCard::SLOT_0) {
|
||||||
command << "grep -q '" << config::SD_0_MOUNT_POINT << " ext4 ro,' /proc/mounts";
|
command << "grep -q '" << config::SD_0_MOUNT_POINT << " ext4 rw,' /proc/mounts";
|
||||||
} else if (sdcard == sd::SdCard::SLOT_1) {
|
} else if (sdcard == sd::SdCard::SLOT_1) {
|
||||||
command << "grep -q '" << config::SD_1_MOUNT_POINT << " ext4 ro,' /proc/mounts";
|
command << "grep -q '" << config::SD_1_MOUNT_POINT << " ext4 rw,' /proc/mounts";
|
||||||
} else {
|
} else {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
@ -516,18 +519,9 @@ ReturnValue_t SdCardManager::isSdCardMountedReadOnly(sd::SdCard sdcard, bool& re
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
result = cmdExecutor.execute();
|
result = cmdExecutor.execute();
|
||||||
if (result != returnvalue::OK) {
|
if (result == returnvalue::OK) {
|
||||||
int exitStatus = cmdExecutor.getLastError();
|
|
||||||
if (exitStatus == 1) {
|
|
||||||
readOnly = false;
|
|
||||||
return returnvalue::OK;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
auto& readVec = cmdExecutor.getReadVector();
|
|
||||||
size_t readLen = strnlen(readVec.data(), readVec.size());
|
|
||||||
if (readLen == 0) {
|
|
||||||
readOnly = false;
|
readOnly = false;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
readOnly = true;
|
readOnly = true;
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
@ -566,7 +560,7 @@ ReturnValue_t SdCardManager::performFsck(sd::SdCard sdcard, bool printOutput, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SdCardManager::setActiveSdCard(sd::SdCard sdCard) {
|
void SdCardManager::setActiveSdCard(sd::SdCard sdCard) {
|
||||||
MutexGuard mg(mutex);
|
MutexGuard mg(defaultLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
sdInfo.active = sdCard;
|
sdInfo.active = sdCard;
|
||||||
if (sdInfo.active == sd::SdCard::SLOT_0) {
|
if (sdInfo.active == sd::SdCard::SLOT_0) {
|
||||||
currentPrefix = config::SD_0_MOUNT_POINT;
|
currentPrefix = config::SD_0_MOUNT_POINT;
|
||||||
@ -576,7 +570,7 @@ void SdCardManager::setActiveSdCard(sd::SdCard sdCard) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::optional<sd::SdCard> SdCardManager::getActiveSdCard() const {
|
std::optional<sd::SdCard> SdCardManager::getActiveSdCard() const {
|
||||||
MutexGuard mg(mutex);
|
MutexGuard mg(defaultLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
if (markedUnusable) {
|
if (markedUnusable) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
@ -584,6 +578,11 @@ std::optional<sd::SdCard> SdCardManager::getActiveSdCard() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SdCardManager::markUnusable() {
|
void SdCardManager::markUnusable() {
|
||||||
MutexGuard mg(mutex);
|
MutexGuard mg(defaultLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
markedUnusable = true;
|
markedUnusable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SdCardManager::markUsable() {
|
||||||
|
MutexGuard mg(defaultLock, LOCK_TYPE, OTHER_TIMEOUT, LOCK_CTX);
|
||||||
|
markedUnusable = false;
|
||||||
|
}
|
||||||
|
@ -25,7 +25,7 @@ class MutexIF;
|
|||||||
* state
|
* state
|
||||||
*/
|
*/
|
||||||
class SdCardManager : public SystemObject, public SdCardMountedIF {
|
class SdCardManager : public SystemObject, public SdCardMountedIF {
|
||||||
friend class SdCardAccess;
|
friend class CoreController;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using mountInitCb = ReturnValue_t (*)(void* args);
|
using mountInitCb = ReturnValue_t (*)(void* args);
|
||||||
@ -117,16 +117,6 @@ class SdCardManager : public SystemObject, public SdCardMountedIF {
|
|||||||
ReturnValue_t switchOffSdCard(sd::SdCard sdCard, bool doUnmountSdCard = true,
|
ReturnValue_t switchOffSdCard(sd::SdCard sdCard, bool doUnmountSdCard = true,
|
||||||
SdStatePair* statusPair = nullptr);
|
SdStatePair* statusPair = nullptr);
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the state file or creates one if it does not exist. You need to call this
|
|
||||||
* function before calling #sdCardActive
|
|
||||||
* @return
|
|
||||||
* - returnvalue::OK if the state file was updated successfully
|
|
||||||
* - CommandExecutor::COMMAND_PENDING: Non-blocking command is pending
|
|
||||||
* - returnvalue::FAILED: blocking command failed
|
|
||||||
*/
|
|
||||||
ReturnValue_t updateSdCardStateFile();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the state of the SD cards. If the state file does not exist, this function will
|
* Get the state of the SD cards. If the state file does not exist, this function will
|
||||||
* take care of updating it. If it does not, the function will use the state file to get
|
* take care of updating it. If it does not, the function will use the state file to get
|
||||||
@ -187,7 +177,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF {
|
|||||||
* @param prefSdCardPtr
|
* @param prefSdCardPtr
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
const std::string& getCurrentMountPrefix() const override;
|
const char* getCurrentMountPrefix() const override;
|
||||||
|
|
||||||
OpStatus checkCurrentOp(Operations& currentOp);
|
OpStatus checkCurrentOp(Operations& currentOp);
|
||||||
|
|
||||||
@ -215,24 +205,41 @@ class SdCardManager : public SystemObject, public SdCardMountedIF {
|
|||||||
ReturnValue_t performFsck(sd::SdCard sdcard, bool printOutput, int& linuxError);
|
ReturnValue_t performFsck(sd::SdCard sdcard, bool printOutput, int& linuxError);
|
||||||
|
|
||||||
void markUnusable();
|
void markUnusable();
|
||||||
|
void markUsable();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CommandExecutor cmdExecutor;
|
CommandExecutor cmdExecutor;
|
||||||
|
SdStatePair sdStates;
|
||||||
Operations currentOp = Operations::IDLE;
|
Operations currentOp = Operations::IDLE;
|
||||||
bool blocking = false;
|
bool blocking = false;
|
||||||
bool sdCardActive = true;
|
bool sdCardActive = true;
|
||||||
bool printCmdOutput = true;
|
bool printCmdOutput = true;
|
||||||
bool markedUnusable = false;
|
bool markedUnusable = false;
|
||||||
MutexIF* mutex = nullptr;
|
MutexIF* sdLock = nullptr;
|
||||||
|
MutexIF* prefLock = nullptr;
|
||||||
|
MutexIF* defaultLock = nullptr;
|
||||||
|
static constexpr MutexIF::TimeoutType LOCK_TYPE = MutexIF::TimeoutType::WAITING;
|
||||||
|
static constexpr uint32_t SD_LOCK_TIMEOUT = 100;
|
||||||
|
static constexpr uint32_t OTHER_TIMEOUT = 20;
|
||||||
|
static constexpr char LOCK_CTX[] = "SdCardManager";
|
||||||
|
|
||||||
SdCardManager();
|
SdCardManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the state file or creates one if it does not exist. You need to call this
|
||||||
|
* function before calling #sdCardActive
|
||||||
|
* @return
|
||||||
|
* - returnvalue::OK if the state file was updated successfully
|
||||||
|
* - CommandExecutor::COMMAND_PENDING: Non-blocking command is pending
|
||||||
|
* - returnvalue::FAILED: blocking command failed
|
||||||
|
*/
|
||||||
|
ReturnValue_t updateSdCardStateFile();
|
||||||
|
|
||||||
ReturnValue_t setSdCardState(sd::SdCard sdCard, bool on);
|
ReturnValue_t setSdCardState(sd::SdCard sdCard, bool on);
|
||||||
|
|
||||||
void processSdStatusLine(SdStatePair& active, std::string& line, uint8_t& idx,
|
void processSdStatusLine(std::string& line, uint8_t& idx, sd::SdCard& currentSd);
|
||||||
sd::SdCard& currentSd);
|
|
||||||
|
|
||||||
std::string currentPrefix;
|
std::optional<std::string> currentPrefix;
|
||||||
|
|
||||||
static SdCardManager* INSTANCE;
|
static SdCardManager* INSTANCE;
|
||||||
};
|
};
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
std::filesystem::path fshelpers::getPrefixedPath(SdCardManager &man,
|
std::filesystem::path fshelpers::getPrefixedPath(SdCardManager &man,
|
||||||
std::filesystem::path pathWihtoutPrefix) {
|
std::filesystem::path pathWihtoutPrefix) {
|
||||||
auto prefix = man.getCurrentMountPrefix();
|
auto prefix = man.getCurrentMountPrefix();
|
||||||
|
if (prefix == nullptr) {
|
||||||
|
return pathWihtoutPrefix;
|
||||||
|
}
|
||||||
auto resPath = prefix / pathWihtoutPrefix;
|
auto resPath = prefix / pathWihtoutPrefix;
|
||||||
return resPath;
|
return resPath;
|
||||||
}
|
}
|
||||||
|
@ -12,10 +12,10 @@
|
|||||||
* @brief This is the main program for the target hardware.
|
* @brief This is the main program for the target hardware.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int main(void) {
|
int main(int argc, char* argv[]) {
|
||||||
using namespace std;
|
using namespace std;
|
||||||
#if Q7S_SIMPLE_MODE == 0
|
#if Q7S_SIMPLE_MODE == 0
|
||||||
return obsw::obsw();
|
return obsw::obsw(argc, argv);
|
||||||
#else
|
#else
|
||||||
return simple::simple();
|
return simple::simple();
|
||||||
#endif
|
#endif
|
||||||
|
@ -1 +1 @@
|
|||||||
target_sources(${OBSW_NAME} PRIVATE scratchApi.cpp)
|
target_sources(${OBSW_NAME} PRIVATE scratchApi.cpp LocalParameterHandler.cpp)
|
||||||
|
41
bsp_q7s/memory/LocalParameterHandler.cpp
Normal file
41
bsp_q7s/memory/LocalParameterHandler.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include "LocalParameterHandler.h"
|
||||||
|
|
||||||
|
#include <fsfw/serviceinterface/ServiceInterface.h>
|
||||||
|
|
||||||
|
LocalParameterHandler::LocalParameterHandler(std::string sdRelativeName, SdCardMountedIF* sdcMan)
|
||||||
|
: NVMParameterBase(), sdRelativeName(sdRelativeName), sdcMan(sdcMan) {}
|
||||||
|
|
||||||
|
LocalParameterHandler::~LocalParameterHandler() {}
|
||||||
|
|
||||||
|
ReturnValue_t LocalParameterHandler::initialize() {
|
||||||
|
ReturnValue_t result = updateFullName();
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = readJsonFile();
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t LocalParameterHandler::writeJsonFile() {
|
||||||
|
ReturnValue_t result = updateFullName();
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return NVMParameterBase::writeJsonFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t LocalParameterHandler::updateFullName() {
|
||||||
|
std::string mountPrefix;
|
||||||
|
auto activeSd = sdcMan->getActiveSdCard();
|
||||||
|
if (activeSd and sdcMan->isSdCardUsable(activeSd.value())) {
|
||||||
|
mountPrefix = sdcMan->getCurrentMountPrefix();
|
||||||
|
} else {
|
||||||
|
return SD_NOT_READY;
|
||||||
|
}
|
||||||
|
std::string fullname = mountPrefix + "/" + sdRelativeName;
|
||||||
|
NVMParameterBase::setFullName(fullname);
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
106
bsp_q7s/memory/LocalParameterHandler.h
Normal file
106
bsp_q7s/memory/LocalParameterHandler.h
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#ifndef BSP_Q7S_MEMORY_LOCALPARAMETERHANDLER_H_
|
||||||
|
#define BSP_Q7S_MEMORY_LOCALPARAMETERHANDLER_H_
|
||||||
|
|
||||||
|
#include <mission/memory/NvmParameterBase.h>
|
||||||
|
#include <mission/memory/SdCardMountedIF.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Class to handle persistent parameters
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class LocalParameterHandler : public NVMParameterBase {
|
||||||
|
public:
|
||||||
|
static constexpr uint8_t INTERFACE_ID = CLASS_ID::LOCAL_PARAM_HANDLER;
|
||||||
|
|
||||||
|
static constexpr ReturnValue_t SD_NOT_READY = returnvalue::makeCode(INTERFACE_ID, 0);
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param sdRelativeName Absolute name of json file relative to mount
|
||||||
|
* directory
|
||||||
|
* of SD card. E.g. conf/example.json
|
||||||
|
* @param sdcMan Pointer to SD card manager
|
||||||
|
*/
|
||||||
|
LocalParameterHandler(std::string sdRelativeName, SdCardMountedIF* sdcMan);
|
||||||
|
virtual ~LocalParameterHandler();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Will initialize the local parameter handler
|
||||||
|
*
|
||||||
|
* @return OK if successful, otherwise error return value
|
||||||
|
*/
|
||||||
|
ReturnValue_t initialize();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to add parameter to json file. If the json file does
|
||||||
|
* not yet exist it will be created here.
|
||||||
|
*
|
||||||
|
* @param key The string to identify the parameter
|
||||||
|
* @param value The value to set for this parameter
|
||||||
|
*
|
||||||
|
* @return OK if successful, otherwise error return value
|
||||||
|
*
|
||||||
|
* @details The function will add the parameter only if it is not already
|
||||||
|
* present in the json file
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
ReturnValue_t addParameter(std::string key, T value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function will update a parameter which already exists in the json
|
||||||
|
* file
|
||||||
|
*
|
||||||
|
* @param key The unique string to identify the parameter to update
|
||||||
|
* @param value The new new value to set
|
||||||
|
*
|
||||||
|
* @return OK if successful, otherwise error return value
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
ReturnValue_t updateParameter(std::string key, T value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Name relative to mount point of SD card where parameters will be stored
|
||||||
|
std::string sdRelativeName;
|
||||||
|
|
||||||
|
SdCardMountedIF* sdcMan;
|
||||||
|
|
||||||
|
virtual ReturnValue_t writeJsonFile();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function sets the name of the json file dependent on the
|
||||||
|
* currently active SD card
|
||||||
|
*
|
||||||
|
* @return OK if successful, otherwise error return value
|
||||||
|
*/
|
||||||
|
ReturnValue_t updateFullName();
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline ReturnValue_t LocalParameterHandler::addParameter(std::string key, T value) {
|
||||||
|
ReturnValue_t result = insertValue(key, value);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = writeJsonFile();
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline ReturnValue_t LocalParameterHandler::updateParameter(std::string key, T value) {
|
||||||
|
ReturnValue_t result = setValue(key, value);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = writeJsonFile();
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* BSP_Q7S_MEMORY_LOCALPARAMETERHANDLER_H_ */
|
@ -9,22 +9,27 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
|
#include "bsp_q7s/core/WatchdogHandler.h"
|
||||||
#include "commonConfig.h"
|
#include "commonConfig.h"
|
||||||
#include "core/scheduling.h"
|
#include "core/scheduling.h"
|
||||||
#include "fsfw/tasks/TaskFactory.h"
|
#include "fsfw/tasks/TaskFactory.h"
|
||||||
#include "fsfw/version.h"
|
#include "fsfw/version.h"
|
||||||
#include "mission/acsDefs.h"
|
#include "mission/acs/defs.h"
|
||||||
#include "mission/system/tree/system.h"
|
#include "mission/com/defs.h"
|
||||||
|
#include "mission/system/systemTree.h"
|
||||||
#include "q7sConfig.h"
|
#include "q7sConfig.h"
|
||||||
#include "watchdog/definitions.h"
|
#include "watchdog/definitions.h"
|
||||||
|
|
||||||
static int OBSW_ALREADY_RUNNING = -2;
|
static constexpr int OBSW_ALREADY_RUNNING = -2;
|
||||||
#if OBSW_Q7S_EM == 0
|
#if OBSW_Q7S_EM == 0
|
||||||
static const char* DEV_STRING = "Xiphos Q7S FM";
|
static const char* DEV_STRING = "Xiphos Q7S FM";
|
||||||
#else
|
#else
|
||||||
static const char* DEV_STRING = "Xiphos Q7S EM";
|
static const char* DEV_STRING = "Xiphos Q7S EM";
|
||||||
#endif
|
#endif
|
||||||
int obsw::obsw() {
|
|
||||||
|
WatchdogHandler WATCHDOG_HANDLER;
|
||||||
|
|
||||||
|
int obsw::obsw(int argc, char* argv[]) {
|
||||||
using namespace fsfw;
|
using namespace fsfw;
|
||||||
std::cout << "-- EIVE OBSW --" << std::endl;
|
std::cout << "-- EIVE OBSW --" << std::endl;
|
||||||
std::cout << "-- Compiled for Linux (" << DEV_STRING << ") --" << std::endl;
|
std::cout << "-- Compiled for Linux (" << DEV_STRING << ") --" << std::endl;
|
||||||
@ -33,9 +38,10 @@ int obsw::obsw() {
|
|||||||
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
|
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
|
||||||
|
|
||||||
#if Q7S_CHECK_FOR_ALREADY_RUNNING_IMG == 1
|
#if Q7S_CHECK_FOR_ALREADY_RUNNING_IMG == 1
|
||||||
|
std::error_code e;
|
||||||
// Check special file here. This file is created or deleted by the eive-watchdog application
|
// Check special file here. This file is created or deleted by the eive-watchdog application
|
||||||
// or systemd service!
|
// or systemd service!
|
||||||
if (std::filesystem::exists(watchdog::RUNNING_FILE_NAME)) {
|
if (std::filesystem::exists(watchdog::RUNNING_FILE_NAME, e)) {
|
||||||
sif::warning << "File " << watchdog::RUNNING_FILE_NAME
|
sif::warning << "File " << watchdog::RUNNING_FILE_NAME
|
||||||
<< " exists so the software might "
|
<< " exists so the software might "
|
||||||
"already be running. Check if obsw systemd service has been stopped."
|
"already be running. Check if obsw systemd service has been stopped."
|
||||||
@ -44,14 +50,48 @@ int obsw::obsw() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Delay the boot if applicable.
|
||||||
|
bootDelayHandling();
|
||||||
|
|
||||||
|
bool initWatchFunction = false;
|
||||||
|
std::string fullExecPath = argv[0];
|
||||||
|
if (fullExecPath.find("/usr/bin") != std::string::npos) {
|
||||||
|
initWatchFunction = true;
|
||||||
|
}
|
||||||
|
ReturnValue_t result = WATCHDOG_HANDLER.initialize(initWatchFunction);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
std::cerr << "Initiating EIVE watchdog handler failed" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduling::initMission();
|
||||||
|
|
||||||
|
// Command the EIVE system to safe mode
|
||||||
|
#if OBSW_COMMAND_SAFE_MODE_AT_STARTUP == 1
|
||||||
|
// This ensures that the PCDU switches were updated.
|
||||||
|
TaskFactory::delayTask(1000);
|
||||||
|
commandComSubsystemRxOnly();
|
||||||
|
commandEiveSystemToSafe();
|
||||||
|
#else
|
||||||
|
announceAllModes();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
WATCHDOG_HANDLER.periodicOperation();
|
||||||
|
TaskFactory::delayTask(2000);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void obsw::bootDelayHandling() {
|
||||||
const char* homedir = nullptr;
|
const char* homedir = nullptr;
|
||||||
homedir = getenv("HOME");
|
homedir = getenv("HOME");
|
||||||
if (homedir == nullptr) {
|
if (homedir == nullptr) {
|
||||||
homedir = getpwuid(getuid())->pw_dir;
|
homedir = getpwuid(getuid())->pw_dir;
|
||||||
}
|
}
|
||||||
std::filesystem::path bootDelayFile = std::filesystem::path(homedir) / "boot_delay_secs.txt";
|
std::filesystem::path bootDelayFile = std::filesystem::path(homedir) / "boot_delay_secs.txt";
|
||||||
|
std::error_code e;
|
||||||
// Init delay handling.
|
// Init delay handling.
|
||||||
if (std::filesystem::exists(bootDelayFile)) {
|
if (std::filesystem::exists(bootDelayFile, e)) {
|
||||||
std::ifstream ifile(bootDelayFile);
|
std::ifstream ifile(bootDelayFile);
|
||||||
std::string lineStr;
|
std::string lineStr;
|
||||||
unsigned int bootDelaySecs = 0;
|
unsigned int bootDelaySecs = 0;
|
||||||
@ -71,24 +111,41 @@ int obsw::obsw() {
|
|||||||
std::cout << "Delaying OBSW start for " << bootDelaySecs << " seconds" << std::endl;
|
std::cout << "Delaying OBSW start for " << bootDelaySecs << " seconds" << std::endl;
|
||||||
TaskFactory::delayTask(bootDelaySecs * 1000);
|
TaskFactory::delayTask(bootDelaySecs * 1000);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
scheduling::initMission();
|
void obsw::commandEiveSystemToSafe() {
|
||||||
|
|
||||||
#if OBSW_COMMAND_SAFE_MODE_AT_STARTUP == 1
|
|
||||||
// Command the EIVE system to safe mode
|
|
||||||
auto sysQueueId = satsystem::EIVE_SYSTEM.getCommandQueue();
|
auto sysQueueId = satsystem::EIVE_SYSTEM.getCommandQueue();
|
||||||
CommandMessage msg;
|
CommandMessage msg;
|
||||||
ModeMessage::setCmdModeMessage(msg, acs::AcsMode::SAFE, 0);
|
ModeMessage::setCmdModeMessage(msg, acs::AcsMode::SAFE, 0);
|
||||||
ReturnValue_t result =
|
ReturnValue_t result =
|
||||||
MessageQueueSenderIF::sendMessage(sysQueueId, &msg, MessageQueueIF::NO_QUEUE, false);
|
MessageQueueSenderIF::sendMessage(sysQueueId, &msg, MessageQueueIF::NO_QUEUE, false);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
sif::error << "Sending safe mode command to EIVE system failed" << std::endl;
|
sif::error << "obsw: Sending safe mode command to EIVE system failed" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void obsw::commandComSubsystemRxOnly() {
|
||||||
|
auto* comSs = ObjectManager::instance()->get<HasModesIF>(objects::COM_SUBSYSTEM);
|
||||||
|
if (comSs == nullptr) {
|
||||||
|
sif::error << "obsw: Could not retrieve COM subsystem object" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CommandMessage msg;
|
||||||
|
ModeMessage::setCmdModeMessage(msg, com::RX_ONLY, 0);
|
||||||
|
ReturnValue_t result = MessageQueueSenderIF::sendMessage(comSs->getCommandQueue(), &msg,
|
||||||
|
MessageQueueIF::NO_QUEUE, false);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
sif::error << "obsw: Sending RX_ONLY mode command to COM subsystem failed" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void obsw::announceAllModes() {
|
||||||
|
auto sysQueueId = satsystem::EIVE_SYSTEM.getCommandQueue();
|
||||||
|
CommandMessage msg;
|
||||||
|
ModeMessage::setModeAnnounceMessage(msg, true);
|
||||||
|
ReturnValue_t result =
|
||||||
|
MessageQueueSenderIF::sendMessage(sysQueueId, &msg, MessageQueueIF::NO_QUEUE, false);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
sif::error << "obsw: Sending safe mode command to EIVE system failed" << std::endl;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
/* Suspend main thread by sleeping it. */
|
|
||||||
TaskFactory::delayTask(5000);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,13 @@
|
|||||||
|
|
||||||
namespace obsw {
|
namespace obsw {
|
||||||
|
|
||||||
int obsw();
|
int obsw(int argc, char* argv[]);
|
||||||
|
|
||||||
};
|
void bootDelayHandling();
|
||||||
|
void commandEiveSystemToSafe();
|
||||||
|
void commandComSubsystemRxOnly();
|
||||||
|
void announceAllModes();
|
||||||
|
|
||||||
|
}; // namespace obsw
|
||||||
|
|
||||||
#endif /* BSP_Q7S_CORE_OBSW_H_ */
|
#endif /* BSP_Q7S_CORE_OBSW_H_ */
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
root="$(pwd)"
|
||||||
|
ln -s "$root/hooks" "$root/.git/hooks"
|
||||||
|
|
||||||
git submodule update --init fsfw thirdparty/rapidcsv thirdparty/lwgps thirdparty/json
|
git submodule update --init fsfw thirdparty/rapidcsv thirdparty/lwgps thirdparty/json
|
||||||
|
@ -63,7 +63,7 @@ static constexpr dur_millis_t ACS_BOARD_CS_TIMEOUT = 50 * CS_FACTOR;
|
|||||||
|
|
||||||
} // namespace spi
|
} // namespace spi
|
||||||
|
|
||||||
namespace uart {
|
namespace serial {
|
||||||
|
|
||||||
static constexpr size_t HYPERION_GPS_REPLY_MAX_BUFFER = 1024;
|
static constexpr size_t HYPERION_GPS_REPLY_MAX_BUFFER = 1024;
|
||||||
static constexpr UartBaudRate SYRLINKS_BAUD = UartBaudRate::RATE_38400;
|
static constexpr UartBaudRate SYRLINKS_BAUD = UartBaudRate::RATE_38400;
|
||||||
@ -73,6 +73,6 @@ static constexpr UartBaudRate PLOC_MPSOC_BAUD = UartBaudRate::RATE_115200;
|
|||||||
static constexpr UartBaudRate PLOC_SUPV_BAUD = UartBaudRate::RATE_921600;
|
static constexpr UartBaudRate PLOC_SUPV_BAUD = UartBaudRate::RATE_921600;
|
||||||
static constexpr UartBaudRate STAR_TRACKER_BAUD = UartBaudRate::RATE_921600;
|
static constexpr UartBaudRate STAR_TRACKER_BAUD = UartBaudRate::RATE_921600;
|
||||||
|
|
||||||
} // namespace uart
|
} // namespace serial
|
||||||
|
|
||||||
#endif /* COMMON_CONFIG_DEVCONF_H_ */
|
#endif /* COMMON_CONFIG_DEVCONF_H_ */
|
||||||
|
@ -102,6 +102,7 @@ enum gpioId_t {
|
|||||||
VC2_PAPB_BUSY,
|
VC2_PAPB_BUSY,
|
||||||
VC3_PAPB_EMPTY,
|
VC3_PAPB_EMPTY,
|
||||||
VC3_PAPB_BUSY,
|
VC3_PAPB_BUSY,
|
||||||
|
PTME_RESETN,
|
||||||
|
|
||||||
PDEC_RESET,
|
PDEC_RESET,
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#ifndef FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_
|
#ifndef FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_
|
||||||
#define FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_
|
#define FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_
|
||||||
|
|
||||||
#include "mission/devices/devicedefinitions/GomspaceDefinitions.h"
|
#include <mission/power/gsDefs.h>
|
||||||
|
|
||||||
#endif /* FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ */
|
#endif /* FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ */
|
||||||
|
@ -15,6 +15,9 @@ static constexpr char OBSW_VERSION_FILE_NAME[] = "obsw_version.txt";
|
|||||||
static constexpr char OBSW_PATH[] = "/usr/bin/eive-obsw";
|
static constexpr char OBSW_PATH[] = "/usr/bin/eive-obsw";
|
||||||
static constexpr char OBSW_VERSION_FILE_PATH[] = "/usr/share/eive-obsw/obsw_version.txt";
|
static constexpr char OBSW_VERSION_FILE_PATH[] = "/usr/share/eive-obsw/obsw_version.txt";
|
||||||
|
|
||||||
|
// ISO8601 timestamp.
|
||||||
|
static constexpr char FILE_DATE_FORMAT[] = "%FT%H%M%SZ";
|
||||||
|
|
||||||
static constexpr uint16_t EIVE_PUS_APID = 0x65;
|
static constexpr uint16_t EIVE_PUS_APID = 0x65;
|
||||||
static constexpr uint16_t EIVE_CFDP_APID = 0x66;
|
static constexpr uint16_t EIVE_CFDP_APID = 0x66;
|
||||||
static constexpr uint16_t EIVE_LOCAL_CFDP_ENTITY_ID = EIVE_CFDP_APID;
|
static constexpr uint16_t EIVE_LOCAL_CFDP_ENTITY_ID = EIVE_CFDP_APID;
|
||||||
@ -45,28 +48,50 @@ static constexpr uint32_t SA_DEPL_MAX_BURN_TIME = 180;
|
|||||||
|
|
||||||
static constexpr uint32_t CCSDS_HANDLER_QUEUE_SIZE = 50;
|
static constexpr uint32_t CCSDS_HANDLER_QUEUE_SIZE = 50;
|
||||||
static constexpr uint8_t NUMBER_OF_VIRTUAL_CHANNELS = 4;
|
static constexpr uint8_t NUMBER_OF_VIRTUAL_CHANNELS = 4;
|
||||||
static constexpr uint8_t VC0_QUEUE_SIZE = 80;
|
static constexpr uint32_t VC0_LIVE_TM_QUEUE_SIZE = 300;
|
||||||
static constexpr uint8_t VC1_QUEUE_SIZE = 80;
|
// There are three individual log stores!
|
||||||
static constexpr uint8_t VC2_QUEUE_SIZE = 50;
|
static constexpr uint32_t MISC_STORE_QUEUE_SIZE = 200;
|
||||||
static constexpr uint8_t VC3_QUEUE_SIZE = 50;
|
static constexpr uint32_t OK_STORE_QUEUE_SIZE = 350;
|
||||||
|
static constexpr uint32_t NOK_STORE_QUEUE_SIZE = 350;
|
||||||
|
static constexpr uint32_t HK_STORE_QUEUE_SIZE = 300;
|
||||||
|
static constexpr uint32_t CFDP_STORE_QUEUE_SIZE = 300;
|
||||||
|
|
||||||
static constexpr uint32_t MAX_PUS_FUNNEL_QUEUE_DEPTH = 100;
|
static constexpr uint32_t MAX_PUS_FUNNEL_QUEUE_DEPTH = 100;
|
||||||
|
static constexpr uint32_t MAX_CFDP_FUNNEL_QUEUE_DEPTH = 80;
|
||||||
|
static constexpr uint32_t HK_SERVICE_QUEUE_DEPTH = 60;
|
||||||
|
|
||||||
static constexpr uint32_t MAX_STORED_CMDS_UDP = 120;
|
static constexpr uint32_t MAX_STORED_CMDS_UDP = 150;
|
||||||
static constexpr uint32_t MAX_STORED_CMDS_TCP = 150;
|
static constexpr uint32_t MAX_STORED_CMDS_TCP = 180;
|
||||||
|
|
||||||
namespace acs {
|
namespace spiSched {
|
||||||
|
|
||||||
static constexpr uint32_t SCHED_BLOCK_1_SENSORS_MS = 15;
|
static constexpr uint32_t SCHED_BLOCK_1_SUS_READ_MS = 15;
|
||||||
static constexpr uint32_t SCHED_BLOCK_2_ACS_CTRL_MS = 40;
|
static constexpr uint32_t SCHED_BLOCK_2_SENSOR_READ_MS = 30;
|
||||||
static constexpr uint32_t SCHED_BLOCK_3_ACTUATOR_MS = 45;
|
static constexpr uint32_t SCHED_BLOCK_3_READ_IMTQ_MGM_MS = 43;
|
||||||
|
static constexpr uint32_t SCHED_BLOCK_4_ACS_CTRL_MS = 45;
|
||||||
|
static constexpr uint32_t SCHED_BLOCK_5_ACTUATOR_MS = 55;
|
||||||
|
static constexpr uint32_t SCHED_BLOCK_6_IMTQ_BLOCK_2_MS = 105;
|
||||||
|
static constexpr uint32_t SCHED_BLOCK_RTD = 150;
|
||||||
|
static constexpr uint32_t SCHED_BLOCK_7_RW_READ_MS = 300;
|
||||||
|
static constexpr uint32_t SCHED_BLOCK_8_PLPCDU_MS = 320;
|
||||||
|
static constexpr uint32_t SCHED_BLOCK_9_RAD_SENS_MS = 340;
|
||||||
|
|
||||||
// 15 ms for FM
|
// 15 ms for FM
|
||||||
static constexpr float SCHED_BLOCK_1_PERIOD = static_cast<float>(SCHED_BLOCK_1_SENSORS_MS) / 400.0;
|
static constexpr float SCHED_BLOCK_1_PERIOD = static_cast<float>(SCHED_BLOCK_1_SUS_READ_MS) / 400.0;
|
||||||
static constexpr float SCHED_BLOCK_2_PERIOD = static_cast<float>(SCHED_BLOCK_2_ACS_CTRL_MS) / 400.0;
|
static constexpr float SCHED_BLOCK_2_PERIOD =
|
||||||
static constexpr float SCHED_BLOCK_3_PERIOD = static_cast<float>(SCHED_BLOCK_3_ACTUATOR_MS) / 400.0;
|
static_cast<float>(SCHED_BLOCK_2_SENSOR_READ_MS) / 400.0;
|
||||||
|
static constexpr float SCHED_BLOCK_3_PERIOD =
|
||||||
|
static_cast<float>(SCHED_BLOCK_3_READ_IMTQ_MGM_MS) / 400.0;
|
||||||
|
static constexpr float SCHED_BLOCK_4_PERIOD = static_cast<float>(SCHED_BLOCK_4_ACS_CTRL_MS) / 400.0;
|
||||||
|
static constexpr float SCHED_BLOCK_5_PERIOD = static_cast<float>(SCHED_BLOCK_5_ACTUATOR_MS) / 400.0;
|
||||||
|
static constexpr float SCHED_BLOCK_6_PERIOD =
|
||||||
|
static_cast<float>(SCHED_BLOCK_6_IMTQ_BLOCK_2_MS) / 400.0;
|
||||||
|
static constexpr float SCHED_BLOCK_RTD_PERIOD = static_cast<float>(SCHED_BLOCK_RTD) / 400.0;
|
||||||
|
static constexpr float SCHED_BLOCK_7_PERIOD = static_cast<float>(SCHED_BLOCK_7_RW_READ_MS) / 400.0;
|
||||||
|
static constexpr float SCHED_BLOCK_8_PERIOD = static_cast<float>(SCHED_BLOCK_8_PLPCDU_MS) / 400.0;
|
||||||
|
static constexpr float SCHED_BLOCK_9_PERIOD = static_cast<float>(SCHED_BLOCK_9_RAD_SENS_MS) / 400.0;
|
||||||
|
|
||||||
} // namespace acs
|
} // namespace spiSched
|
||||||
|
|
||||||
} // namespace config
|
} // namespace config
|
||||||
|
|
||||||
|
@ -37,6 +37,9 @@ enum : uint8_t {
|
|||||||
CONFIGHANDLER = 139,
|
CONFIGHANDLER = 139,
|
||||||
CORE = 140,
|
CORE = 140,
|
||||||
TCS_CONTROLLER = 141,
|
TCS_CONTROLLER = 141,
|
||||||
|
COM_SUBSYSTEM = 142,
|
||||||
|
PERSISTENT_TM_STORE = 143,
|
||||||
|
SYRLINKS_COM = 144,
|
||||||
COMMON_SUBSYSTEM_ID_END
|
COMMON_SUBSYSTEM_ID_END
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -43,7 +43,10 @@ enum commonObjects : uint32_t {
|
|||||||
RW4 = 0x44120350,
|
RW4 = 0x44120350,
|
||||||
STAR_TRACKER = 0x44130001,
|
STAR_TRACKER = 0x44130001,
|
||||||
GPS_CONTROLLER = 0x44130045,
|
GPS_CONTROLLER = 0x44130045,
|
||||||
|
GPS_0_HEALTH_DEV = 0x44130046,
|
||||||
|
GPS_1_HEALTH_DEV = 0x44130047,
|
||||||
|
|
||||||
|
IMTQ_POLLING = 0x44140013,
|
||||||
IMTQ_HANDLER = 0x44140014,
|
IMTQ_HANDLER = 0x44140014,
|
||||||
TMP1075_HANDLER_TCS_0 = 0x44420004,
|
TMP1075_HANDLER_TCS_0 = 0x44420004,
|
||||||
TMP1075_HANDLER_TCS_1 = 0x44420005,
|
TMP1075_HANDLER_TCS_1 = 0x44420005,
|
||||||
@ -61,10 +64,14 @@ enum commonObjects : uint32_t {
|
|||||||
RAD_SENSOR = 0x443200A5,
|
RAD_SENSOR = 0x443200A5,
|
||||||
PLOC_UPDATER = 0x44330000,
|
PLOC_UPDATER = 0x44330000,
|
||||||
PLOC_MEMORY_DUMPER = 0x44330001,
|
PLOC_MEMORY_DUMPER = 0x44330001,
|
||||||
STR_HELPER = 0x44330002,
|
STR_COM_IF = 0x44330002,
|
||||||
PLOC_MPSOC_HELPER = 0x44330003,
|
PLOC_MPSOC_HELPER = 0x44330003,
|
||||||
AXI_PTME_CONFIG = 0x44330004,
|
AXI_PTME_CONFIG = 0x44330004,
|
||||||
PTME_CONFIG = 0x44330005,
|
PTME_CONFIG = 0x44330005,
|
||||||
|
PTME_VC0_LIVE_TM = 0x44330006,
|
||||||
|
PTME_VC1_LOG_TM = 0x44330007,
|
||||||
|
PTME_VC2_HK_TM = 0x44330008,
|
||||||
|
PTME_VC3_CFDP_TM = 0x44330009,
|
||||||
PLOC_MPSOC_HANDLER = 0x44330015,
|
PLOC_MPSOC_HANDLER = 0x44330015,
|
||||||
PLOC_SUPERVISOR_HANDLER = 0x44330016,
|
PLOC_SUPERVISOR_HANDLER = 0x44330016,
|
||||||
PLOC_SUPERVISOR_HELPER = 0x44330017,
|
PLOC_SUPERVISOR_HELPER = 0x44330017,
|
||||||
@ -118,11 +125,13 @@ enum commonObjects : uint32_t {
|
|||||||
SUS_11_R_LOC_XBYMZB_PT_ZB = 0x44120043,
|
SUS_11_R_LOC_XBYMZB_PT_ZB = 0x44120043,
|
||||||
|
|
||||||
SYRLINKS_HANDLER = 0x445300A3,
|
SYRLINKS_HANDLER = 0x445300A3,
|
||||||
// might be obsolete, was not used in Q7S FM SW
|
SYRLINKS_COM_HANDLER = 0x445300A4,
|
||||||
// CCSDS_IP_CORE_BRIDGE = 0x73500000,
|
|
||||||
|
|
||||||
/* 0x49 ('I') for Communication Interfaces */
|
/* 0x49 ('I') for Communication Interfaces */
|
||||||
SPI_RTD_COM_IF = 0x49020006,
|
ACS_BOARD_POLLING_TASK = 0x49060004,
|
||||||
|
RW_POLLING_TASK = 0x49060005,
|
||||||
|
SPI_RTD_COM_IF = 0x49060006,
|
||||||
|
SUS_POLLING_TASK = 0x49060007,
|
||||||
|
|
||||||
// 0x60 for other stuff
|
// 0x60 for other stuff
|
||||||
HEATER_0_PLOC_PROC_BRD = 0x60000000,
|
HEATER_0_PLOC_PROC_BRD = 0x60000000,
|
||||||
@ -132,14 +141,17 @@ enum commonObjects : uint32_t {
|
|||||||
HEATER_4_CAMERA = 0x60000004,
|
HEATER_4_CAMERA = 0x60000004,
|
||||||
HEATER_5_STR = 0x60000005,
|
HEATER_5_STR = 0x60000005,
|
||||||
HEATER_6_DRO = 0x60000006,
|
HEATER_6_DRO = 0x60000006,
|
||||||
HEATER_7_HPA = 0x60000007,
|
HEATER_7_SYRLINKS = 0x60000007,
|
||||||
|
|
||||||
// 0x73 ('s') for assemblies and system/subsystem components
|
// 0x73 ('s') for assemblies and system/subsystem components
|
||||||
ACS_BOARD_ASS = 0x73000001,
|
ACS_BOARD_ASS = 0x73000001,
|
||||||
SUS_BOARD_ASS = 0x73000002,
|
SUS_BOARD_ASS = 0x73000002,
|
||||||
TCS_BOARD_ASS = 0x73000003,
|
TCS_BOARD_ASS = 0x73000003,
|
||||||
RW_ASS = 0x73000004,
|
RW_ASSY = 0x73000004,
|
||||||
CAM_SWITCHER = 0x73000006,
|
CAM_SWITCHER = 0x73000006,
|
||||||
|
SYRLINKS_ASSY = 0x73000007,
|
||||||
|
IMTQ_ASSY = 0x73000008,
|
||||||
|
STR_ASSY = 0x73000009,
|
||||||
EIVE_SYSTEM = 0x73010000,
|
EIVE_SYSTEM = 0x73010000,
|
||||||
ACS_SUBSYSTEM = 0x73010001,
|
ACS_SUBSYSTEM = 0x73010001,
|
||||||
PL_SUBSYSTEM = 0x73010002,
|
PL_SUBSYSTEM = 0x73010002,
|
||||||
@ -151,6 +163,17 @@ enum commonObjects : uint32_t {
|
|||||||
CFDP_TM_FUNNEL = 0x73000102,
|
CFDP_TM_FUNNEL = 0x73000102,
|
||||||
CFDP_HANDLER = 0x73000205,
|
CFDP_HANDLER = 0x73000205,
|
||||||
CFDP_DISTRIBUTOR = 0x73000206,
|
CFDP_DISTRIBUTOR = 0x73000206,
|
||||||
|
MISC_TM_STORE = 0x73020001,
|
||||||
|
OK_TM_STORE = 0x73020002,
|
||||||
|
NOT_OK_TM_STORE = 0x73020003,
|
||||||
|
HK_TM_STORE = 0x73020004,
|
||||||
|
CFDP_TM_STORE = 0x73030000,
|
||||||
|
|
||||||
|
LIVE_TM_TASK = 0x73040000,
|
||||||
|
LOG_STORE_AND_TM_TASK = 0x73040001,
|
||||||
|
HK_STORE_AND_TM_TASK = 0x73040002,
|
||||||
|
CFDP_STORE_AND_TM_TASK = 0x73040003,
|
||||||
|
DOWNLINK_RAM_STORE = 0x73040004,
|
||||||
|
|
||||||
// Other stuff
|
// Other stuff
|
||||||
THERMAL_TEMP_INSERTER = 0x90000003,
|
THERMAL_TEMP_INSERTER = 0x90000003,
|
||||||
|
@ -35,14 +35,14 @@ enum commonClassIds : uint8_t {
|
|||||||
SA_DEPL_HANDLER, // SADPL
|
SA_DEPL_HANDLER, // SADPL
|
||||||
MPSOC_RETURN_VALUES_IF, // MPSOCRTVIF
|
MPSOC_RETURN_VALUES_IF, // MPSOCRTVIF
|
||||||
SUPV_RETURN_VALUES_IF, // SPVRTVIF
|
SUPV_RETURN_VALUES_IF, // SPVRTVIF
|
||||||
ACS_KALMAN, // ACSKAL
|
ACS_CTRL, // ACSCTRL
|
||||||
ACS_SAFE, // ACSSAF
|
ACS_MEKF, // ACSMEKF
|
||||||
ACS_PTG, // ACSPTG
|
SD_CARD_MANAGER, // SDMA
|
||||||
ACS_DETUMBLE, // ACSDTB
|
LOCAL_PARAM_HANDLER, // LPH
|
||||||
ACS_MEKF, // ACSMEK
|
PERSISTENT_TM_STORE, // PTM
|
||||||
|
TM_SINK, // TMS
|
||||||
COMMON_CLASS_ID_END // [EXPORT] : [END]
|
COMMON_CLASS_ID_END // [EXPORT] : [END]
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* COMMON_CONFIG_COMMONCLASSIDS_H_ */
|
#endif /* COMMON_CONFIG_COMMONCLASSIDS_H_ */
|
||||||
|
@ -12,6 +12,7 @@ enum Ids {
|
|||||||
PUS_SERVICE_8 = 8,
|
PUS_SERVICE_8 = 8,
|
||||||
PUS_SERVICE_9 = 9,
|
PUS_SERVICE_9 = 9,
|
||||||
PUS_SERVICE_11 = 11,
|
PUS_SERVICE_11 = 11,
|
||||||
|
PUS_SERVICE_15 = 15,
|
||||||
PUS_SERVICE_17 = 17,
|
PUS_SERVICE_17 = 17,
|
||||||
PUS_SERVICE_19 = 19,
|
PUS_SERVICE_19 = 19,
|
||||||
PUS_SERVICE_20 = 20,
|
PUS_SERVICE_20 = 20,
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#include "AcuDummy.h"
|
#include "AcuDummy.h"
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/GomspaceDefinitions.h>
|
#include <mission/power/gsDefs.h>
|
||||||
|
|
||||||
AcuDummy::AcuDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
AcuDummy::AcuDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
AcuDummy::~AcuDummy() {}
|
AcuDummy::~AcuDummy() {}
|
||||||
|
|
||||||
void AcuDummy::doStartUp() {}
|
void AcuDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void AcuDummy::doShutDown() {}
|
void AcuDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t AcuDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
ReturnValue_t AcuDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
||||||
|
|
||||||
@ -37,6 +37,7 @@ uint32_t AcuDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return
|
|||||||
|
|
||||||
ReturnValue_t AcuDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t AcuDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(ACU::pool::ACU_TEMPERATURES, new PoolEntry<float>(3));
|
localDataPoolMap.emplace(ACU::pool::ACU_TEMPERATURES,
|
||||||
|
new PoolEntry<float>({10.0, 10.0, 10.0}, true));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#include "BpxDummy.h"
|
#include "BpxDummy.h"
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/BpxBatteryDefinitions.h>
|
#include <mission/power/bpxBattDefs.h>
|
||||||
|
|
||||||
BpxDummy::BpxDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
BpxDummy::BpxDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
BpxDummy::~BpxDummy() {}
|
BpxDummy::~BpxDummy() {}
|
||||||
|
|
||||||
void BpxDummy::doStartUp() {}
|
void BpxDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void BpxDummy::doShutDown() {}
|
void BpxDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t BpxDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
ReturnValue_t BpxDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
||||||
|
|
||||||
@ -37,19 +37,19 @@ uint32_t BpxDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return
|
|||||||
|
|
||||||
ReturnValue_t BpxDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t BpxDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(BpxBattery::BATT_TEMP_1, &battTemp1);
|
localDataPoolMap.emplace(bpxBat::BATT_TEMP_1, &battTemp1);
|
||||||
localDataPoolMap.emplace(BpxBattery::BATT_TEMP_2, &battTemp2);
|
localDataPoolMap.emplace(bpxBat::BATT_TEMP_2, &battTemp2);
|
||||||
localDataPoolMap.emplace(BpxBattery::BATT_TEMP_3, &battTemp3);
|
localDataPoolMap.emplace(bpxBat::BATT_TEMP_3, &battTemp3);
|
||||||
localDataPoolMap.emplace(BpxBattery::BATT_TEMP_4, &battTemp4);
|
localDataPoolMap.emplace(bpxBat::BATT_TEMP_4, &battTemp4);
|
||||||
localDataPoolMap.emplace(BpxBattery::CHARGE_CURRENT, &chargeCurrent);
|
localDataPoolMap.emplace(bpxBat::CHARGE_CURRENT, &chargeCurrent);
|
||||||
localDataPoolMap.emplace(BpxBattery::DISCHARGE_CURRENT, &dischargeCurrent);
|
localDataPoolMap.emplace(bpxBat::DISCHARGE_CURRENT, &dischargeCurrent);
|
||||||
localDataPoolMap.emplace(BpxBattery::HEATER_CURRENT, &heaterCurrent);
|
localDataPoolMap.emplace(bpxBat::HEATER_CURRENT, &heaterCurrent);
|
||||||
localDataPoolMap.emplace(BpxBattery::BATT_VOLTAGE, &battVolt);
|
localDataPoolMap.emplace(bpxBat::BATT_VOLTAGE, &battVolt);
|
||||||
localDataPoolMap.emplace(BpxBattery::REBOOT_COUNTER, &rebootCounter);
|
localDataPoolMap.emplace(bpxBat::REBOOT_COUNTER, &rebootCounter);
|
||||||
localDataPoolMap.emplace(BpxBattery::BOOTCAUSE, &bootCause);
|
localDataPoolMap.emplace(bpxBat::BOOTCAUSE, &bootCause);
|
||||||
|
|
||||||
localDataPoolMap.emplace(BpxBattery::BATTERY_HEATER_MODE, &battheatMode);
|
localDataPoolMap.emplace(bpxBat::BATTERY_HEATER_MODE, &battheatMode);
|
||||||
localDataPoolMap.emplace(BpxBattery::BATTHEAT_LOW_LIMIT, &battheatLow);
|
localDataPoolMap.emplace(bpxBat::BATTHEAT_LOW_LIMIT, &battheatLow);
|
||||||
localDataPoolMap.emplace(BpxBattery::BATTHEAT_HIGH_LIMIT, &battheatHigh);
|
localDataPoolMap.emplace(bpxBat::BATTHEAT_HIGH_LIMIT, &battheatHigh);
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -34,10 +34,10 @@ class BpxDummy : public DeviceHandlerBase {
|
|||||||
PoolEntry<uint16_t> dischargeCurrent = PoolEntry<uint16_t>({0});
|
PoolEntry<uint16_t> dischargeCurrent = PoolEntry<uint16_t>({0});
|
||||||
PoolEntry<uint16_t> heaterCurrent = PoolEntry<uint16_t>({0});
|
PoolEntry<uint16_t> heaterCurrent = PoolEntry<uint16_t>({0});
|
||||||
PoolEntry<uint16_t> battVolt = PoolEntry<uint16_t>({0});
|
PoolEntry<uint16_t> battVolt = PoolEntry<uint16_t>({0});
|
||||||
PoolEntry<int16_t> battTemp1 = PoolEntry<int16_t>({0});
|
PoolEntry<int16_t> battTemp1 = PoolEntry<int16_t>({10}, true);
|
||||||
PoolEntry<int16_t> battTemp2 = PoolEntry<int16_t>({0});
|
PoolEntry<int16_t> battTemp2 = PoolEntry<int16_t>({10}, true);
|
||||||
PoolEntry<int16_t> battTemp3 = PoolEntry<int16_t>({0});
|
PoolEntry<int16_t> battTemp3 = PoolEntry<int16_t>({10}, true);
|
||||||
PoolEntry<int16_t> battTemp4 = PoolEntry<int16_t>({0});
|
PoolEntry<int16_t> battTemp4 = PoolEntry<int16_t>({10}, true);
|
||||||
PoolEntry<uint32_t> rebootCounter = PoolEntry<uint32_t>({0});
|
PoolEntry<uint32_t> rebootCounter = PoolEntry<uint32_t>({0});
|
||||||
PoolEntry<uint8_t> bootCause = PoolEntry<uint8_t>({0});
|
PoolEntry<uint8_t> bootCause = PoolEntry<uint8_t>({0});
|
||||||
PoolEntry<uint8_t> battheatMode = PoolEntry<uint8_t>({0});
|
PoolEntry<uint8_t> battheatMode = PoolEntry<uint8_t>({0});
|
||||||
|
@ -7,6 +7,7 @@ target_sources(
|
|||||||
ComCookieDummy.cpp
|
ComCookieDummy.cpp
|
||||||
RwDummy.cpp
|
RwDummy.cpp
|
||||||
Max31865Dummy.cpp
|
Max31865Dummy.cpp
|
||||||
|
PcduHandlerDummy.cpp
|
||||||
StarTrackerDummy.cpp
|
StarTrackerDummy.cpp
|
||||||
SyrlinksDummy.cpp
|
SyrlinksDummy.cpp
|
||||||
ImtqDummy.cpp
|
ImtqDummy.cpp
|
||||||
@ -14,12 +15,17 @@ target_sources(
|
|||||||
PduDummy.cpp
|
PduDummy.cpp
|
||||||
P60DockDummy.cpp
|
P60DockDummy.cpp
|
||||||
SaDeploymentDummy.cpp
|
SaDeploymentDummy.cpp
|
||||||
GpsDummy.cpp
|
GpsDhbDummy.cpp
|
||||||
|
GpsCtrlDummy.cpp
|
||||||
GyroAdisDummy.cpp
|
GyroAdisDummy.cpp
|
||||||
GyroL3GD20Dummy.cpp
|
GyroL3GD20Dummy.cpp
|
||||||
MgmLIS3MDLDummy.cpp
|
MgmLIS3MDLDummy.cpp
|
||||||
PlPcduDummy.cpp
|
PlPcduDummy.cpp
|
||||||
|
ExecutableComIfDummy.cpp
|
||||||
|
ScexDummy.cpp
|
||||||
CoreControllerDummy.cpp
|
CoreControllerDummy.cpp
|
||||||
helpers.cpp
|
PlocMpsocDummy.cpp
|
||||||
|
PlocSupervisorDummy.cpp
|
||||||
|
helperFactory.cpp
|
||||||
MgmRm3100Dummy.cpp
|
MgmRm3100Dummy.cpp
|
||||||
Tmp1075Dummy.cpp)
|
Tmp1075Dummy.cpp)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fsfw/controller/ExtendedControllerBase.h>
|
#include <fsfw/controller/ExtendedControllerBase.h>
|
||||||
#include <mission/devices/devicedefinitions/SusDefinitions.h>
|
#include <mission/acs/susMax1227Helpers.h>
|
||||||
|
|
||||||
class CoreControllerDummy : public ExtendedControllerBase {
|
class CoreControllerDummy : public ExtendedControllerBase {
|
||||||
public:
|
public:
|
||||||
|
27
dummies/ExecutableComIfDummy.cpp
Normal file
27
dummies/ExecutableComIfDummy.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include <dummies/ExecutableComIfDummy.h>
|
||||||
|
|
||||||
|
ExecutableComIfDummy::ExecutableComIfDummy(object_id_t objectId) : SystemObject(objectId) {}
|
||||||
|
|
||||||
|
ReturnValue_t ExecutableComIfDummy::initializeInterface(CookieIF *cookie) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t ExecutableComIfDummy::sendMessage(CookieIF *cookie, const uint8_t *sendData,
|
||||||
|
size_t sendLen) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t ExecutableComIfDummy::getSendSuccess(CookieIF *cookie) { return returnvalue::OK; }
|
||||||
|
|
||||||
|
ReturnValue_t ExecutableComIfDummy::requestReceiveMessage(CookieIF *cookie, size_t requestLen) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t ExecutableComIfDummy::performOperation(uint8_t operationCode) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t ExecutableComIfDummy::readReceivedMessage(CookieIF *cookie, uint8_t **buffer,
|
||||||
|
size_t *size) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
21
dummies/ExecutableComIfDummy.h
Normal file
21
dummies/ExecutableComIfDummy.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#ifndef DUMMIES_EXECUTABLECOMIFDUMMY_H_
|
||||||
|
#define DUMMIES_EXECUTABLECOMIFDUMMY_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceCommunicationIF.h>
|
||||||
|
#include <fsfw/objectmanager/SystemObject.h>
|
||||||
|
#include <fsfw/tasks/ExecutableObjectIF.h>
|
||||||
|
|
||||||
|
class ExecutableComIfDummy : public ExecutableObjectIF,
|
||||||
|
public DeviceCommunicationIF,
|
||||||
|
public SystemObject {
|
||||||
|
public:
|
||||||
|
ExecutableComIfDummy(object_id_t objectId);
|
||||||
|
ReturnValue_t performOperation(uint8_t operationCode = 0) override;
|
||||||
|
ReturnValue_t initializeInterface(CookieIF *cookie) override;
|
||||||
|
ReturnValue_t sendMessage(CookieIF *cookie, const uint8_t *sendData, size_t sendLen) override;
|
||||||
|
ReturnValue_t getSendSuccess(CookieIF *cookie) override;
|
||||||
|
ReturnValue_t requestReceiveMessage(CookieIF *cookie, size_t requestLen) override;
|
||||||
|
ReturnValue_t readReceivedMessage(CookieIF *cookie, uint8_t **buffer, size_t *size) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* DUMMIES_EXECUTABLECOMIFDUMMY_H_ */
|
36
dummies/GpsCtrlDummy.cpp
Normal file
36
dummies/GpsCtrlDummy.cpp
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include "GpsCtrlDummy.h"
|
||||||
|
|
||||||
|
GpsCtrlDummy::GpsCtrlDummy(object_id_t objectId)
|
||||||
|
: ExtendedControllerBase(objectId, 20), gpsSet(this) {}
|
||||||
|
|
||||||
|
ReturnValue_t GpsCtrlDummy::handleCommandMessage(CommandMessage* message) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GpsCtrlDummy::performControlOperation() {}
|
||||||
|
|
||||||
|
ReturnValue_t GpsCtrlDummy::checkModeCommand(Mode_t mode, Submode_t submode,
|
||||||
|
uint32_t* msToReachTheMode) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalPoolDataSetBase* GpsCtrlDummy::getDataSetHandle(sid_t sid) { return &gpsSet; }
|
||||||
|
|
||||||
|
ReturnValue_t GpsCtrlDummy::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
|
LocalDataPoolManager& poolManager) {
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::ALTITUDE, new PoolEntry<double>({537222.3469}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::LONGITUDE, new PoolEntry<double>({-8.8579}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::LATITUDE, new PoolEntry<double>({49.5952}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::SPEED, new PoolEntry<double>({0}));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::YEAR, new PoolEntry<uint16_t>({2023}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::MONTH, new PoolEntry<uint8_t>({5}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::DAY, new PoolEntry<uint8_t>({16}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::HOURS, new PoolEntry<uint8_t>({1}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::MINUTES, new PoolEntry<uint8_t>({0}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::SECONDS, new PoolEntry<uint8_t>({0}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::UNIX_SECONDS, new PoolEntry<uint32_t>({1684191600}, true));
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::SATS_IN_USE, new PoolEntry<uint8_t>());
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::SATS_IN_VIEW, new PoolEntry<uint8_t>());
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::FIX_MODE, new PoolEntry<uint8_t>());
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
23
dummies/GpsCtrlDummy.h
Normal file
23
dummies/GpsCtrlDummy.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef DUMMIES_GPSCTRLDUMMY_H_
|
||||||
|
#define DUMMIES_GPSCTRLDUMMY_H_
|
||||||
|
|
||||||
|
#include <fsfw/controller/ExtendedControllerBase.h>
|
||||||
|
#include <mission/acs/archive/GPSDefinitions.h>
|
||||||
|
|
||||||
|
class GpsCtrlDummy : public ExtendedControllerBase {
|
||||||
|
public:
|
||||||
|
GpsCtrlDummy(object_id_t objectId);
|
||||||
|
|
||||||
|
private:
|
||||||
|
GpsPrimaryDataset gpsSet;
|
||||||
|
|
||||||
|
ReturnValue_t handleCommandMessage(CommandMessage* message) override;
|
||||||
|
void performControlOperation() override;
|
||||||
|
ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
|
||||||
|
uint32_t* msToReachTheMode) override;
|
||||||
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
|
LocalDataPoolManager& poolManager) override;
|
||||||
|
LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* DUMMIES_GPSCTRLDUMMY_H_ */
|
@ -1,42 +1,44 @@
|
|||||||
#include "GpsDummy.h"
|
#include <dummies/GpsDhbDummy.h>
|
||||||
|
#include <mission/acs/archive/GPSDefinitions.h>
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/GPSDefinitions.h>
|
GpsDhbDummy::GpsDhbDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
|
|
||||||
GpsDummy::GpsDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
GpsDummy::~GpsDummy() {}
|
GpsDhbDummy::~GpsDhbDummy() {}
|
||||||
|
|
||||||
void GpsDummy::doStartUp() {}
|
void GpsDhbDummy::doStartUp() {}
|
||||||
|
|
||||||
void GpsDummy::doShutDown() {}
|
void GpsDhbDummy::doShutDown() {}
|
||||||
|
|
||||||
ReturnValue_t GpsDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
ReturnValue_t GpsDhbDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
|
|
||||||
ReturnValue_t GpsDummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
|
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t GpsDummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
ReturnValue_t GpsDhbDummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
|
||||||
const uint8_t *commandData, size_t commandDataLen) {
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t GpsDhbDummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||||
|
const uint8_t *commandData,
|
||||||
|
size_t commandDataLen) {
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t GpsDummy::scanForReply(const uint8_t *start, size_t len, DeviceCommandId_t *foundId,
|
ReturnValue_t GpsDhbDummy::scanForReply(const uint8_t *start, size_t len,
|
||||||
size_t *foundLen) {
|
DeviceCommandId_t *foundId, size_t *foundLen) {
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t GpsDummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
ReturnValue_t GpsDhbDummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GpsDummy::fillCommandAndReplyMap() {}
|
void GpsDhbDummy::fillCommandAndReplyMap() {}
|
||||||
|
|
||||||
uint32_t GpsDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 500; }
|
uint32_t GpsDhbDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 500; }
|
||||||
|
|
||||||
ReturnValue_t GpsDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t GpsDhbDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(GpsHyperion::LATITUDE, new PoolEntry<double>({0.0}, 1));
|
localDataPoolMap.emplace(GpsHyperion::LATITUDE, new PoolEntry<double>({0.0}, 1));
|
||||||
localDataPoolMap.emplace(GpsHyperion::LONGITUDE, new PoolEntry<double>({0.0}, 1));
|
localDataPoolMap.emplace(GpsHyperion::LONGITUDE, new PoolEntry<double>({0.0}, 1));
|
||||||
localDataPoolMap.emplace(GpsHyperion::ALTITUDE, new PoolEntry<double>({0.0}));
|
localDataPoolMap.emplace(GpsHyperion::ALTITUDE, new PoolEntry<double>({0.0}));
|
33
dummies/GpsDhbDummy.h
Normal file
33
dummies/GpsDhbDummy.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#ifndef DUMMIES_GPSDHBDUMMY_H_
|
||||||
|
#define DUMMIES_GPSDHBDUMMY_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
|
||||||
|
class GpsDhbDummy : public DeviceHandlerBase {
|
||||||
|
public:
|
||||||
|
static const DeviceCommandId_t SIMPLE_COMMAND = 1;
|
||||||
|
static const DeviceCommandId_t PERIODIC_REPLY = 2;
|
||||||
|
|
||||||
|
static const uint8_t SIMPLE_COMMAND_DATA = 1;
|
||||||
|
static const uint8_t PERIODIC_REPLY_DATA = 2;
|
||||||
|
|
||||||
|
GpsDhbDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
|
||||||
|
virtual ~GpsDhbDummy();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void doStartUp() override;
|
||||||
|
void doShutDown() override;
|
||||||
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t *commandData,
|
||||||
|
size_t commandDataLen) override;
|
||||||
|
ReturnValue_t scanForReply(const uint8_t *start, size_t len, DeviceCommandId_t *foundId,
|
||||||
|
size_t *foundLen) override;
|
||||||
|
ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override;
|
||||||
|
void fillCommandAndReplyMap() override;
|
||||||
|
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
||||||
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
|
LocalDataPoolManager &poolManager) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* DUMMIES_GPSDHBDUMMY_H_ */
|
@ -1,15 +1,15 @@
|
|||||||
#include "GyroAdisDummy.h"
|
#include "GyroAdisDummy.h"
|
||||||
|
|
||||||
#include "mission/devices/devicedefinitions/GyroADIS1650XDefinitions.h"
|
#include <mission/acs/gyroAdisHelpers.h>
|
||||||
|
|
||||||
GyroAdisDummy::GyroAdisDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
GyroAdisDummy::GyroAdisDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie), dataset(this) {}
|
: DeviceHandlerBase(objectId, comif, comCookie), dataset(this) {}
|
||||||
|
|
||||||
GyroAdisDummy::~GyroAdisDummy() {}
|
GyroAdisDummy::~GyroAdisDummy() {}
|
||||||
|
|
||||||
void GyroAdisDummy::doStartUp() {}
|
void GyroAdisDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void GyroAdisDummy::doShutDown() {}
|
void GyroAdisDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t GyroAdisDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t GyroAdisDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
@ -40,13 +40,13 @@ uint32_t GyroAdisDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { r
|
|||||||
|
|
||||||
ReturnValue_t GyroAdisDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t GyroAdisDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(ADIS1650X::ANG_VELOC_X, new PoolEntry<double>({-0.5}, true));
|
localDataPoolMap.emplace(adis1650x::ANG_VELOC_X, new PoolEntry<double>({-0.5}, true));
|
||||||
localDataPoolMap.emplace(ADIS1650X::ANG_VELOC_Y, new PoolEntry<double>({0.2}, true));
|
localDataPoolMap.emplace(adis1650x::ANG_VELOC_Y, new PoolEntry<double>({0.2}, true));
|
||||||
localDataPoolMap.emplace(ADIS1650X::ANG_VELOC_Z, new PoolEntry<double>({-1.2}, true));
|
localDataPoolMap.emplace(adis1650x::ANG_VELOC_Z, new PoolEntry<double>({-1.2}, true));
|
||||||
localDataPoolMap.emplace(ADIS1650X::ACCELERATION_X, new PoolEntry<double>({0.0}));
|
localDataPoolMap.emplace(adis1650x::ACCELERATION_X, new PoolEntry<double>({0.0}));
|
||||||
localDataPoolMap.emplace(ADIS1650X::ACCELERATION_Y, new PoolEntry<double>({0.0}));
|
localDataPoolMap.emplace(adis1650x::ACCELERATION_Y, new PoolEntry<double>({0.0}));
|
||||||
localDataPoolMap.emplace(ADIS1650X::ACCELERATION_Z, new PoolEntry<double>({0.0}));
|
localDataPoolMap.emplace(adis1650x::ACCELERATION_Z, new PoolEntry<double>({0.0}));
|
||||||
localDataPoolMap.emplace(ADIS1650X::TEMPERATURE, new PoolEntry<float>({0.0}));
|
localDataPoolMap.emplace(adis1650x::TEMPERATURE, new PoolEntry<float>({10.0}, true));
|
||||||
|
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
#define DUMMIES_GYROADISDUMMY_H_
|
#define DUMMIES_GYROADISDUMMY_H_
|
||||||
|
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
#include <mission/acs/gyroAdisHelpers.h>
|
||||||
#include "mission/devices/devicedefinitions/GyroADIS1650XDefinitions.h"
|
|
||||||
|
|
||||||
class GyroAdisDummy : public DeviceHandlerBase {
|
class GyroAdisDummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#include "GyroL3GD20Dummy.h"
|
#include "GyroL3GD20Dummy.h"
|
||||||
|
|
||||||
#include "fsfw_hal/devicehandlers/devicedefinitions/GyroL3GD20Definitions.h"
|
#include <fsfw_hal/devicehandlers/devicedefinitions/gyroL3gHelpers.h>
|
||||||
|
|
||||||
GyroL3GD20Dummy::GyroL3GD20Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
GyroL3GD20Dummy::GyroL3GD20Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
GyroL3GD20Dummy::~GyroL3GD20Dummy() {}
|
GyroL3GD20Dummy::~GyroL3GD20Dummy() {}
|
||||||
|
|
||||||
void GyroL3GD20Dummy::doStartUp() {}
|
void GyroL3GD20Dummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void GyroL3GD20Dummy::doShutDown() {}
|
void GyroL3GD20Dummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t GyroL3GD20Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t GyroL3GD20Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
@ -40,9 +40,9 @@ uint32_t GyroL3GD20Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) {
|
|||||||
|
|
||||||
ReturnValue_t GyroL3GD20Dummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t GyroL3GD20Dummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(L3GD20H::ANG_VELOC_X, new PoolEntry<float>({1.2}, true));
|
localDataPoolMap.emplace(l3gd20h::ANG_VELOC_X, new PoolEntry<float>({1.2}, true));
|
||||||
localDataPoolMap.emplace(L3GD20H::ANG_VELOC_Y, new PoolEntry<float>({-0.1}, true));
|
localDataPoolMap.emplace(l3gd20h::ANG_VELOC_Y, new PoolEntry<float>({-0.1}, true));
|
||||||
localDataPoolMap.emplace(L3GD20H::ANG_VELOC_Z, new PoolEntry<float>({0.7}, true));
|
localDataPoolMap.emplace(l3gd20h::ANG_VELOC_Z, new PoolEntry<float>({0.7}, true));
|
||||||
localDataPoolMap.emplace(L3GD20H::TEMPERATURE, new PoolEntry<float>({0.0}));
|
localDataPoolMap.emplace(l3gd20h::TEMPERATURE, new PoolEntry<float>({0.0}));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#include "ImtqDummy.h"
|
#include "ImtqDummy.h"
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/imtqHandlerDefinitions.h>
|
#include <mission/acs/imtqHelpers.h>
|
||||||
|
|
||||||
ImtqDummy::ImtqDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
ImtqDummy::ImtqDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
ImtqDummy::~ImtqDummy() = default;
|
ImtqDummy::~ImtqDummy() = default;
|
||||||
|
|
||||||
void ImtqDummy::doStartUp() {}
|
void ImtqDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void ImtqDummy::doShutDown() {}
|
void ImtqDummy::doShutDown() { setMode(_MODE_POWER_DOWN); }
|
||||||
|
|
||||||
ReturnValue_t ImtqDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
ReturnValue_t ImtqDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
||||||
|
|
||||||
@ -38,10 +38,12 @@ uint32_t ImtqDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { retur
|
|||||||
|
|
||||||
ReturnValue_t ImtqDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t ImtqDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(IMTQ::MCU_TEMPERATURE, new PoolEntry<int16_t>({0}));
|
localDataPoolMap.emplace(imtq::MCU_TEMPERATURE, new PoolEntry<int16_t>({0}));
|
||||||
localDataPoolMap.emplace(IMTQ::MGM_CAL_NT, new PoolEntry<float>({0.0, 0.0, 0.0}));
|
localDataPoolMap.emplace(imtq::MGM_CAL_NT, new PoolEntry<float>({0.0, 0.0, 0.0}));
|
||||||
localDataPoolMap.emplace(IMTQ::ACTUATION_CAL_STATUS, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(imtq::ACTUATION_CAL_STATUS, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(IMTQ::MTM_RAW, new PoolEntry<float>({0.12, 0.76, -0.45}, true));
|
localDataPoolMap.emplace(imtq::MTM_RAW, new PoolEntry<float>({0.12, 0.76, -0.45}, true));
|
||||||
localDataPoolMap.emplace(IMTQ::ACTUATION_RAW_STATUS, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(imtq::ACTUATION_RAW_STATUS, new PoolEntry<uint8_t>({0}));
|
||||||
|
localDataPoolMap.emplace(imtq::DIPOLES_ID, new PoolEntry<int16_t>({0, 0, 0}));
|
||||||
|
localDataPoolMap.emplace(imtq::CURRENT_TORQUE_DURATION, new PoolEntry<uint16_t>({0}));
|
||||||
return DeviceHandlerBase::initializeLocalDataPool(localDataPoolMap, poolManager);
|
return DeviceHandlerBase::initializeLocalDataPool(localDataPoolMap, poolManager);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#include "Max31865Dummy.h"
|
#include "Max31865Dummy.h"
|
||||||
|
|
||||||
|
#include "fsfw/datapool/PoolReadGuard.h"
|
||||||
|
|
||||||
using namespace returnvalue;
|
using namespace returnvalue;
|
||||||
|
|
||||||
Max31865Dummy::Max31865Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
Max31865Dummy::Max31865Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
@ -28,15 +30,20 @@ ReturnValue_t Max31865Dummy::initializeLocalDataPool(localpool::DataPool &localD
|
|||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
using namespace MAX31865;
|
using namespace MAX31865;
|
||||||
localDataPoolMap.emplace(static_cast<lp_id_t>(PoolIds::RTD_VALUE), new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(static_cast<lp_id_t>(PoolIds::RTD_VALUE), new PoolEntry<float>({0}));
|
||||||
localDataPoolMap.emplace(static_cast<lp_id_t>(PoolIds::TEMPERATURE_C), new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(static_cast<lp_id_t>(PoolIds::TEMPERATURE_C),
|
||||||
|
new PoolEntry<float>({10.0}, true));
|
||||||
localDataPoolMap.emplace(static_cast<lp_id_t>(PoolIds::LAST_FAULT_BYTE),
|
localDataPoolMap.emplace(static_cast<lp_id_t>(PoolIds::LAST_FAULT_BYTE),
|
||||||
new PoolEntry<uint8_t>({0}));
|
new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(static_cast<lp_id_t>(PoolIds::FAULT_BYTE), new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(static_cast<lp_id_t>(PoolIds::FAULT_BYTE), new PoolEntry<uint8_t>({0}));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Max31865Dummy::setTemperature(float temperature) {
|
void Max31865Dummy::setTemperature(float temperature, bool valid) {
|
||||||
set.temperatureCelcius.value = temperature;
|
PoolReadGuard pg(&set);
|
||||||
|
if (pg.getReadResult() == returnvalue::OK) {
|
||||||
|
set.temperatureCelcius.value = temperature;
|
||||||
|
set.setValidity(valid, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalPoolDataSetBase *Max31865Dummy::getDataSetHandle(sid_t sid) { return &set; }
|
LocalPoolDataSetBase *Max31865Dummy::getDataSetHandle(sid_t sid) { return &set; }
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
#ifndef EIVE_OBSW_MAX31865DUMMY_H
|
#ifndef EIVE_OBSW_MAX31865DUMMY_H
|
||||||
#define EIVE_OBSW_MAX31865DUMMY_H
|
#define EIVE_OBSW_MAX31865DUMMY_H
|
||||||
|
|
||||||
|
#include <mission/tcs/Max31865Definitions.h>
|
||||||
|
|
||||||
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
|
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
|
||||||
#include "mission/devices/devicedefinitions/Max31865Definitions.h"
|
|
||||||
|
|
||||||
class Max31865Dummy : public DeviceHandlerBase {
|
class Max31865Dummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
Max31865Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
|
Max31865Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
|
||||||
Max31865Dummy(object_id_t objectId, CookieIF *comCookie);
|
Max31865Dummy(object_id_t objectId, CookieIF *comCookie);
|
||||||
|
|
||||||
void setTemperature(float temperature);
|
void setTemperature(float temperature, bool setValid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MAX31865::PrimarySet set;
|
MAX31865::PrimarySet set;
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#include "MgmLIS3MDLDummy.h"
|
#include "MgmLIS3MDLDummy.h"
|
||||||
|
|
||||||
#include "fsfw_hal/devicehandlers/devicedefinitions/MgmLIS3HandlerDefs.h"
|
#include <fsfw_hal/devicehandlers/devicedefinitions/mgmLis3Helpers.h>
|
||||||
|
|
||||||
MgmLIS3MDLDummy::MgmLIS3MDLDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
MgmLIS3MDLDummy::MgmLIS3MDLDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie), dataset(this) {}
|
: DeviceHandlerBase(objectId, comif, comCookie), dataset(this) {}
|
||||||
|
|
||||||
MgmLIS3MDLDummy::~MgmLIS3MDLDummy() {}
|
MgmLIS3MDLDummy::~MgmLIS3MDLDummy() {}
|
||||||
|
|
||||||
void MgmLIS3MDLDummy::doStartUp() {}
|
void MgmLIS3MDLDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void MgmLIS3MDLDummy::doShutDown() {}
|
void MgmLIS3MDLDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t MgmLIS3MDLDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t MgmLIS3MDLDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
@ -40,8 +40,8 @@ uint32_t MgmLIS3MDLDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) {
|
|||||||
|
|
||||||
ReturnValue_t MgmLIS3MDLDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t MgmLIS3MDLDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(MGMLIS3MDL::TEMPERATURE_CELCIUS, new PoolEntry<float>({0.0}));
|
localDataPoolMap.emplace(mgmLis3::TEMPERATURE_CELCIUS, new PoolEntry<float>({10.0}, true));
|
||||||
localDataPoolMap.emplace(MGMLIS3MDL::FIELD_STRENGTHS,
|
localDataPoolMap.emplace(mgmLis3::FIELD_STRENGTHS,
|
||||||
new PoolEntry<float>({1.02, 0.56, -0.78}, true));
|
new PoolEntry<float>({1.02, 0.56, -0.78}, true));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
#define DUMMIES_MGMLIS3MDLDUMMY_H_
|
#define DUMMIES_MGMLIS3MDLDUMMY_H_
|
||||||
|
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
#include <fsfw_hal/devicehandlers/devicedefinitions/mgmLis3Helpers.h>
|
||||||
#include "fsfw_hal/devicehandlers/devicedefinitions/MgmLIS3HandlerDefs.h"
|
|
||||||
|
|
||||||
class MgmLIS3MDLDummy : public DeviceHandlerBase {
|
class MgmLIS3MDLDummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
@ -17,7 +16,7 @@ class MgmLIS3MDLDummy : public DeviceHandlerBase {
|
|||||||
virtual ~MgmLIS3MDLDummy();
|
virtual ~MgmLIS3MDLDummy();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MGMLIS3MDL::MgmPrimaryDataset dataset;
|
mgmLis3::MgmPrimaryDataset dataset;
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
@ -7,18 +7,22 @@ MgmRm3100Dummy::MgmRm3100Dummy(object_id_t objectId, object_id_t comif, CookieIF
|
|||||||
|
|
||||||
MgmRm3100Dummy::~MgmRm3100Dummy() = default;
|
MgmRm3100Dummy::~MgmRm3100Dummy() = default;
|
||||||
|
|
||||||
void MgmRm3100Dummy::doStartUp() {}
|
void MgmRm3100Dummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void MgmRm3100Dummy::doShutDown() {}
|
void MgmRm3100Dummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t MgmRm3100Dummy::buildNormalDeviceCommand(DeviceCommandId_t* id) { return OK; }
|
ReturnValue_t MgmRm3100Dummy::buildNormalDeviceCommand(DeviceCommandId_t* id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t MgmRm3100Dummy::buildTransitionDeviceCommand(DeviceCommandId_t* id) { return OK; }
|
ReturnValue_t MgmRm3100Dummy::buildTransitionDeviceCommand(DeviceCommandId_t* id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t MgmRm3100Dummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
ReturnValue_t MgmRm3100Dummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||||
const uint8_t* commandData,
|
const uint8_t* commandData,
|
||||||
size_t commandDataLen) {
|
size_t commandDataLen) {
|
||||||
return OK;
|
return NOTHING_TO_SEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t MgmRm3100Dummy::scanForReply(const uint8_t* start, size_t len,
|
ReturnValue_t MgmRm3100Dummy::scanForReply(const uint8_t* start, size_t len,
|
||||||
@ -36,7 +40,7 @@ uint32_t MgmRm3100Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) {
|
|||||||
|
|
||||||
ReturnValue_t MgmRm3100Dummy::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
ReturnValue_t MgmRm3100Dummy::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
LocalDataPoolManager& poolManager) {
|
LocalDataPoolManager& poolManager) {
|
||||||
localDataPoolMap.emplace(RM3100::FIELD_STRENGTHS,
|
localDataPoolMap.emplace(mgmRm3100::FIELD_STRENGTHS,
|
||||||
new PoolEntry<float>({0.87, -0.95, 0.11}, true));
|
new PoolEntry<float>({0.87, -0.95, 0.11}, true));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
#ifndef DUMMIES_MGMRM3100DUMMY_H_
|
#ifndef DUMMIES_MGMRM3100DUMMY_H_
|
||||||
#define DUMMIES_MGMRM3100DUMMY_H_
|
#define DUMMIES_MGMRM3100DUMMY_H_
|
||||||
|
|
||||||
|
#include <fsfw_hal/devicehandlers/devicedefinitions/mgmRm3100Helpers.h>
|
||||||
|
|
||||||
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
|
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
|
||||||
#include "fsfw_hal/devicehandlers/devicedefinitions/MgmRM3100HandlerDefs.h"
|
|
||||||
|
|
||||||
class MgmRm3100Dummy : public DeviceHandlerBase {
|
class MgmRm3100Dummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
@ -10,7 +11,7 @@ class MgmRm3100Dummy : public DeviceHandlerBase {
|
|||||||
virtual ~MgmRm3100Dummy();
|
virtual ~MgmRm3100Dummy();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
RM3100::Rm3100PrimaryDataset dataset;
|
mgmRm3100::Rm3100PrimaryDataset dataset;
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
#include "P60DockDummy.h"
|
#include "P60DockDummy.h"
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/GomspaceDefinitions.h>
|
#include <mission/power/gsDefs.h>
|
||||||
|
|
||||||
|
#include "fsfw/datapool/PoolReadGuard.h"
|
||||||
|
|
||||||
P60DockDummy::P60DockDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
P60DockDummy::P60DockDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
P60DockDummy::~P60DockDummy() {}
|
P60DockDummy::~P60DockDummy() {}
|
||||||
|
|
||||||
void P60DockDummy::doStartUp() {}
|
void P60DockDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void P60DockDummy::doShutDown() {}
|
void P60DockDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t P60DockDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t P60DockDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
@ -40,7 +42,9 @@ uint32_t P60DockDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { re
|
|||||||
|
|
||||||
ReturnValue_t P60DockDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t P60DockDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(P60Dock::pool::P60DOCK_TEMPERATURE_1, new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(P60Dock::pool::P60DOCK_TEMPERATURE_1,
|
||||||
localDataPoolMap.emplace(P60Dock::pool::P60DOCK_TEMPERATURE_2, new PoolEntry<float>({0}));
|
new PoolEntry<float>({10.0}, true));
|
||||||
|
localDataPoolMap.emplace(P60Dock::pool::P60DOCK_TEMPERATURE_2,
|
||||||
|
new PoolEntry<float>({10.0}, true));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
|
||||||
|
#include "mission/power/gsDefs.h"
|
||||||
|
|
||||||
class P60DockDummy : public DeviceHandlerBase {
|
class P60DockDummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
static const DeviceCommandId_t SIMPLE_COMMAND = 1;
|
static const DeviceCommandId_t SIMPLE_COMMAND = 1;
|
||||||
@ -15,6 +17,8 @@ class P60DockDummy : public DeviceHandlerBase {
|
|||||||
virtual ~P60DockDummy();
|
virtual ~P60DockDummy();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
lp_var_t<float> temp1 = lp_var_t<float>(this, P60Dock::pool::P60DOCK_TEMPERATURE_1);
|
||||||
|
lp_var_t<float> temp2 = lp_var_t<float>(this, P60Dock::pool::P60DOCK_TEMPERATURE_2);
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
82
dummies/PcduHandlerDummy.cpp
Normal file
82
dummies/PcduHandlerDummy.cpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#include "PcduHandlerDummy.h"
|
||||||
|
|
||||||
|
#include <fsfw/ipc/QueueFactory.h>
|
||||||
|
#include <mission/power/gsDefs.h>
|
||||||
|
|
||||||
|
#include "mission/power/defs.h"
|
||||||
|
|
||||||
|
PcduHandlerDummy::PcduHandlerDummy(object_id_t objectId)
|
||||||
|
: SystemObject(objectId), manager(this, nullptr), dummySwitcher(objectId, 18, 18, false) {
|
||||||
|
switcherLock = MutexFactory::instance()->createMutex();
|
||||||
|
queue = QueueFactory::instance()->createMessageQueue(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
PcduHandlerDummy::~PcduHandlerDummy() {}
|
||||||
|
|
||||||
|
ReturnValue_t PcduHandlerDummy::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
|
LocalDataPoolManager& poolManager) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PcduHandlerDummy::sendSwitchCommand(power::Switch_t switchNr, ReturnValue_t onOff) {
|
||||||
|
if (onOff == SWITCH_ON) {
|
||||||
|
triggerEvent(power::SWITCH_CMD_SENT, true, switchNr);
|
||||||
|
} else {
|
||||||
|
triggerEvent(power::SWITCH_CMD_SENT, false, switchNr);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
MutexGuard mg(switcherLock);
|
||||||
|
// To simulate a real PCDU, remember the switch change to trigger a SWITCH_HAS_CHANGED event
|
||||||
|
// at a later stage.
|
||||||
|
switchChangeArray[switchNr] = true;
|
||||||
|
}
|
||||||
|
return dummySwitcher.sendSwitchCommand(switchNr, onOff);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PcduHandlerDummy::sendFuseOnCommand(uint8_t fuseNr) {
|
||||||
|
return dummySwitcher.sendFuseOnCommand(fuseNr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PcduHandlerDummy::getSwitchState(power::Switch_t switchNr) const {
|
||||||
|
return dummySwitcher.getSwitchState(switchNr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PcduHandlerDummy::getFuseState(uint8_t fuseNr) const {
|
||||||
|
return dummySwitcher.getFuseState(fuseNr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t PcduHandlerDummy::getSwitchDelayMs(void) const { return dummySwitcher.getSwitchDelayMs(); }
|
||||||
|
|
||||||
|
ReturnValue_t PcduHandlerDummy::performOperation(uint8_t opCode) {
|
||||||
|
// TODO: Handle HK messages in queue.
|
||||||
|
SwitcherBoolArray switcherChangeCopy{};
|
||||||
|
{
|
||||||
|
MutexGuard mg(switcherLock);
|
||||||
|
std::memcpy(switcherChangeCopy.data(), switchChangeArray.data(), switchChangeArray.size());
|
||||||
|
}
|
||||||
|
for (uint8_t idx = 0; idx < switcherChangeCopy.size(); idx++) {
|
||||||
|
if (switcherChangeCopy[idx]) {
|
||||||
|
if (dummySwitcher.getSwitchState(idx) == PowerSwitchIF::SWITCH_ON) {
|
||||||
|
triggerEvent(power::SWITCH_HAS_CHANGED, true, idx);
|
||||||
|
} else {
|
||||||
|
triggerEvent(power::SWITCH_HAS_CHANGED, false, idx);
|
||||||
|
}
|
||||||
|
MutexGuard mg(switcherLock);
|
||||||
|
switchChangeArray[idx] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_id_t PcduHandlerDummy::getObjectId() const { return SystemObject::getObjectId(); }
|
||||||
|
|
||||||
|
MessageQueueId_t PcduHandlerDummy::getCommandQueue() const { return queue->getId(); }
|
||||||
|
|
||||||
|
dur_millis_t PcduHandlerDummy::getPeriodicOperationFrequency() const {
|
||||||
|
// TODO: dummy value. Retrieve from intiitalize after task creation..
|
||||||
|
return 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalDataPoolManager* PcduHandlerDummy::getHkManagerHandle() { return &manager; }
|
||||||
|
|
||||||
|
LocalPoolDataSetBase* PcduHandlerDummy::getDataSetHandle(sid_t sid) { return nullptr; }
|
62
dummies/PcduHandlerDummy.h
Normal file
62
dummies/PcduHandlerDummy.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
#include <fsfw/power/DummyPowerSwitcher.h>
|
||||||
|
|
||||||
|
class PcduHandlerDummy : public PowerSwitchIF,
|
||||||
|
public HasLocalDataPoolIF,
|
||||||
|
public SystemObject,
|
||||||
|
public ExecutableObjectIF {
|
||||||
|
public:
|
||||||
|
static const DeviceCommandId_t SIMPLE_COMMAND = 1;
|
||||||
|
static const DeviceCommandId_t PERIODIC_REPLY = 2;
|
||||||
|
|
||||||
|
static const uint8_t SIMPLE_COMMAND_DATA = 1;
|
||||||
|
static const uint8_t PERIODIC_REPLY_DATA = 2;
|
||||||
|
|
||||||
|
PcduHandlerDummy(object_id_t objectId);
|
||||||
|
virtual ~PcduHandlerDummy();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
MessageQueueIF* queue;
|
||||||
|
LocalDataPoolManager manager;
|
||||||
|
MutexIF* switcherLock;
|
||||||
|
DummyPowerSwitcher dummySwitcher;
|
||||||
|
using SwitcherBoolArray = std::array<bool, 18>;
|
||||||
|
|
||||||
|
ReturnValue_t performOperation(uint8_t opCode) override;
|
||||||
|
SwitcherBoolArray switchChangeArray{};
|
||||||
|
|
||||||
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
|
LocalDataPoolManager& poolManager) override;
|
||||||
|
|
||||||
|
ReturnValue_t sendSwitchCommand(power::Switch_t switchNr, ReturnValue_t onOff) override;
|
||||||
|
ReturnValue_t sendFuseOnCommand(uint8_t fuseNr) override;
|
||||||
|
ReturnValue_t getSwitchState(power::Switch_t switchNr) const override;
|
||||||
|
ReturnValue_t getFuseState(uint8_t fuseNr) const override;
|
||||||
|
uint32_t getSwitchDelayMs(void) const override;
|
||||||
|
|
||||||
|
object_id_t getObjectId() const override;
|
||||||
|
|
||||||
|
/** Command queue for housekeeping messages. */
|
||||||
|
MessageQueueId_t getCommandQueue() const override;
|
||||||
|
|
||||||
|
dur_millis_t getPeriodicOperationFrequency() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Every class implementing this interface should have a local data pool manager. This
|
||||||
|
* function will return a reference to the manager.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
LocalDataPoolManager* getHkManagerHandle() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is used by the pool manager to get a valid dataset
|
||||||
|
* from a SID. This function is protected to prevent users from
|
||||||
|
* using raw data set pointers which could not be thread-safe. Users
|
||||||
|
* should use the #ProvidesDataPoolSubscriptionIF.
|
||||||
|
* @param sid Corresponding structure ID
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
|
||||||
|
};
|
@ -1,15 +1,16 @@
|
|||||||
#include "PduDummy.h"
|
#include "PduDummy.h"
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/GomspaceDefinitions.h>
|
#include <mission/power/gsDefs.h>
|
||||||
|
|
||||||
PduDummy::PduDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
PduDummy::PduDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie),
|
||||||
|
coreHk(this, static_cast<uint32_t>(P60System::SetIds::CORE)) {}
|
||||||
|
|
||||||
PduDummy::~PduDummy() {}
|
PduDummy::~PduDummy() {}
|
||||||
|
|
||||||
void PduDummy::doStartUp() {}
|
void PduDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void PduDummy::doShutDown() {}
|
void PduDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t PduDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
ReturnValue_t PduDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
||||||
|
|
||||||
@ -37,6 +38,8 @@ uint32_t PduDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return
|
|||||||
|
|
||||||
ReturnValue_t PduDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t PduDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(PDU::pool::PDU_TEMPERATURE, new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(PDU::pool::PDU_TEMPERATURE, new PoolEntry<float>({10.0}, true));
|
||||||
|
localDataPoolMap.emplace(PDU::pool::PDU_VOLTAGES, &pduVoltages);
|
||||||
|
localDataPoolMap.emplace(PDU::pool::PDU_CURRENTS, &pduCurrents);
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define DUMMIES_PDUDUMMY_H_
|
#define DUMMIES_PDUDUMMY_H_
|
||||||
|
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
#include <mission/power/gsDefs.h>
|
||||||
|
|
||||||
class PduDummy : public DeviceHandlerBase {
|
class PduDummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
@ -15,6 +16,10 @@ class PduDummy : public DeviceHandlerBase {
|
|||||||
virtual ~PduDummy();
|
virtual ~PduDummy();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
PDU::PduCoreHk coreHk;
|
||||||
|
PoolEntry<int16_t> pduVoltages = PoolEntry<int16_t>(9);
|
||||||
|
PoolEntry<int16_t> pduCurrents = PoolEntry<int16_t>(9);
|
||||||
|
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#include "PlPcduDummy.h"
|
#include "PlPcduDummy.h"
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/GomspaceDefinitions.h>
|
#include <mission/power/gsDefs.h>
|
||||||
|
|
||||||
PlPcduDummy::PlPcduDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
PlPcduDummy::PlPcduDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
PlPcduDummy::~PlPcduDummy() {}
|
PlPcduDummy::~PlPcduDummy() {}
|
||||||
|
|
||||||
void PlPcduDummy::doStartUp() {}
|
void PlPcduDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void PlPcduDummy::doShutDown() {}
|
void PlPcduDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t PlPcduDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t PlPcduDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
@ -40,6 +40,6 @@ uint32_t PlPcduDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { ret
|
|||||||
|
|
||||||
ReturnValue_t PlPcduDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t PlPcduDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::TEMP, new PoolEntry<float>({0.0}));
|
localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::TEMP, new PoolEntry<float>({0.0}, true));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define DUMMIES_PLPCDUDUMMY_H_
|
#define DUMMIES_PLPCDUDUMMY_H_
|
||||||
|
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
#include <mission/devices/devicedefinitions/payloadPcduDefinitions.h>
|
#include <mission/payload/payloadPcduDefinitions.h>
|
||||||
|
|
||||||
class PlPcduDummy : public DeviceHandlerBase {
|
class PlPcduDummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
|
42
dummies/PlocMpsocDummy.cpp
Normal file
42
dummies/PlocMpsocDummy.cpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#include "PlocMpsocDummy.h"
|
||||||
|
|
||||||
|
PlocMpsocDummy::PlocMpsocDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
|
PlocMpsocDummy::~PlocMpsocDummy() {}
|
||||||
|
|
||||||
|
void PlocMpsocDummy::doStartUp() { setMode(MODE_ON); }
|
||||||
|
|
||||||
|
void PlocMpsocDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
|
ReturnValue_t PlocMpsocDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocMpsocDummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocMpsocDummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||||
|
const uint8_t *commandData,
|
||||||
|
size_t commandDataLen) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocMpsocDummy::scanForReply(const uint8_t *start, size_t len,
|
||||||
|
DeviceCommandId_t *foundId, size_t *foundLen) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocMpsocDummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlocMpsocDummy::fillCommandAndReplyMap() {}
|
||||||
|
|
||||||
|
uint32_t PlocMpsocDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 500; }
|
||||||
|
|
||||||
|
ReturnValue_t PlocMpsocDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
|
LocalDataPoolManager &poolManager) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
@ -1,9 +1,10 @@
|
|||||||
#ifndef DUMMIES_GPSDUMMY_H_
|
#pragma once
|
||||||
#define DUMMIES_GPSDUMMY_H_
|
|
||||||
|
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
|
||||||
class GpsDummy : public DeviceHandlerBase {
|
#include "mission/power/defs.h"
|
||||||
|
|
||||||
|
class PlocMpsocDummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
static const DeviceCommandId_t SIMPLE_COMMAND = 1;
|
static const DeviceCommandId_t SIMPLE_COMMAND = 1;
|
||||||
static const DeviceCommandId_t PERIODIC_REPLY = 2;
|
static const DeviceCommandId_t PERIODIC_REPLY = 2;
|
||||||
@ -11,8 +12,8 @@ class GpsDummy : public DeviceHandlerBase {
|
|||||||
static const uint8_t SIMPLE_COMMAND_DATA = 1;
|
static const uint8_t SIMPLE_COMMAND_DATA = 1;
|
||||||
static const uint8_t PERIODIC_REPLY_DATA = 2;
|
static const uint8_t PERIODIC_REPLY_DATA = 2;
|
||||||
|
|
||||||
GpsDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
|
PlocMpsocDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
|
||||||
virtual ~GpsDummy();
|
virtual ~PlocMpsocDummy();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
@ -29,5 +30,3 @@ class GpsDummy : public DeviceHandlerBase {
|
|||||||
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) override;
|
LocalDataPoolManager &poolManager) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* DUMMIES_GPSDUMMY_H_ */
|
|
53
dummies/PlocSupervisorDummy.cpp
Normal file
53
dummies/PlocSupervisorDummy.cpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#include "PlocSupervisorDummy.h"
|
||||||
|
|
||||||
|
PlocSupervisorDummy::PlocSupervisorDummy(object_id_t objectId, object_id_t comif,
|
||||||
|
CookieIF *comCookie, PowerSwitchIF &pwrSwitcher)
|
||||||
|
: DeviceHandlerBase(objectId, comif, comCookie) {
|
||||||
|
setPowerSwitcher(&pwrSwitcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
PlocSupervisorDummy::~PlocSupervisorDummy() {}
|
||||||
|
|
||||||
|
void PlocSupervisorDummy::doStartUp() { setMode(MODE_ON); }
|
||||||
|
|
||||||
|
void PlocSupervisorDummy::doShutDown() { setMode(_MODE_POWER_DOWN); }
|
||||||
|
|
||||||
|
ReturnValue_t PlocSupervisorDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocSupervisorDummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocSupervisorDummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||||
|
const uint8_t *commandData,
|
||||||
|
size_t commandDataLen) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocSupervisorDummy::scanForReply(const uint8_t *start, size_t len,
|
||||||
|
DeviceCommandId_t *foundId, size_t *foundLen) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocSupervisorDummy::interpretDeviceReply(DeviceCommandId_t id,
|
||||||
|
const uint8_t *packet) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlocSupervisorDummy::fillCommandAndReplyMap() {}
|
||||||
|
|
||||||
|
uint32_t PlocSupervisorDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 500; }
|
||||||
|
|
||||||
|
ReturnValue_t PlocSupervisorDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
|
LocalDataPoolManager &poolManager) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PlocSupervisorDummy::getSwitches(const uint8_t **switches,
|
||||||
|
uint8_t *numberOfSwitches) {
|
||||||
|
*numberOfSwitches = 1;
|
||||||
|
*switches = reinterpret_cast<const uint8_t *>(&switchId);
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
35
dummies/PlocSupervisorDummy.h
Normal file
35
dummies/PlocSupervisorDummy.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
#include <mission/power/defs.h>
|
||||||
|
|
||||||
|
class PlocSupervisorDummy : public DeviceHandlerBase {
|
||||||
|
public:
|
||||||
|
static const DeviceCommandId_t SIMPLE_COMMAND = 1;
|
||||||
|
static const DeviceCommandId_t PERIODIC_REPLY = 2;
|
||||||
|
|
||||||
|
static const uint8_t SIMPLE_COMMAND_DATA = 1;
|
||||||
|
static const uint8_t PERIODIC_REPLY_DATA = 2;
|
||||||
|
|
||||||
|
PlocSupervisorDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie,
|
||||||
|
PowerSwitchIF &pwrSwitcher);
|
||||||
|
virtual ~PlocSupervisorDummy();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const power::Switches switchId = power::Switches::PDU1_CH6_PLOC_12V;
|
||||||
|
|
||||||
|
void doStartUp() override;
|
||||||
|
void doShutDown() override;
|
||||||
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t *commandData,
|
||||||
|
size_t commandDataLen) override;
|
||||||
|
ReturnValue_t scanForReply(const uint8_t *start, size_t len, DeviceCommandId_t *foundId,
|
||||||
|
size_t *foundLen) override;
|
||||||
|
ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override;
|
||||||
|
void fillCommandAndReplyMap() override;
|
||||||
|
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
||||||
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
|
LocalDataPoolManager &poolManager) override;
|
||||||
|
ReturnValue_t getSwitches(const uint8_t **switches, uint8_t *numberOfSwitches) override;
|
||||||
|
};
|
@ -1,15 +1,15 @@
|
|||||||
#include "RwDummy.h"
|
#include "RwDummy.h"
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/RwDefinitions.h>
|
#include <mission/acs/rwHelpers.h>
|
||||||
|
|
||||||
RwDummy::RwDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
RwDummy::RwDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
RwDummy::~RwDummy() {}
|
RwDummy::~RwDummy() {}
|
||||||
|
|
||||||
void RwDummy::doStartUp() {}
|
void RwDummy::doStartUp() { setMode(MODE_ON); }
|
||||||
|
|
||||||
void RwDummy::doShutDown() {}
|
void RwDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t RwDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
ReturnValue_t RwDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
||||||
|
|
||||||
@ -37,39 +37,42 @@ uint32_t RwDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return
|
|||||||
|
|
||||||
ReturnValue_t RwDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t RwDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(RwDefinitions::TEMPERATURE_C, new PoolEntry<int32_t>({0}));
|
localDataPoolMap.emplace(rws::RW_SPEED, &rwSpeed);
|
||||||
|
localDataPoolMap.emplace(rws::RAMP_TIME, &rampTime);
|
||||||
|
|
||||||
localDataPoolMap.emplace(RwDefinitions::CURR_SPEED, new PoolEntry<int32_t>({0}));
|
localDataPoolMap.emplace(rws::TEMPERATURE_C, new PoolEntry<int32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::REFERENCE_SPEED, new PoolEntry<int32_t>({0}));
|
|
||||||
localDataPoolMap.emplace(RwDefinitions::STATE, new PoolEntry<uint8_t>({0}));
|
|
||||||
localDataPoolMap.emplace(RwDefinitions::CLC_MODE, new PoolEntry<uint8_t>({0}));
|
|
||||||
|
|
||||||
localDataPoolMap.emplace(RwDefinitions::LAST_RESET_STATUS, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(rws::CURR_SPEED, new PoolEntry<int32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::CURRRENT_RESET_STATUS, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(rws::REFERENCE_SPEED, new PoolEntry<int32_t>({0}));
|
||||||
|
localDataPoolMap.emplace(rws::STATE, new PoolEntry<uint8_t>({1}, true));
|
||||||
|
localDataPoolMap.emplace(rws::CLC_MODE, new PoolEntry<uint8_t>({0}));
|
||||||
|
|
||||||
localDataPoolMap.emplace(RwDefinitions::TM_LAST_RESET_STATUS, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(rws::LAST_RESET_STATUS, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::TM_MCU_TEMPERATURE, new PoolEntry<int32_t>({0}));
|
localDataPoolMap.emplace(rws::CURRRENT_RESET_STATUS, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::PRESSURE_SENSOR_TEMPERATURE, new PoolEntry<float>({0}));
|
|
||||||
localDataPoolMap.emplace(RwDefinitions::PRESSURE, new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(rws::TM_LAST_RESET_STATUS, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::TM_RW_STATE, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(rws::TM_MCU_TEMPERATURE, new PoolEntry<int32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::TM_CLC_MODE, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(rws::PRESSURE_SENSOR_TEMPERATURE, new PoolEntry<float>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::TM_RW_CURR_SPEED, new PoolEntry<int32_t>({0}));
|
localDataPoolMap.emplace(rws::PRESSURE, new PoolEntry<float>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::TM_RW_REF_SPEED, new PoolEntry<int32_t>({0}));
|
localDataPoolMap.emplace(rws::TM_RW_STATE, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::INVALID_CRC_PACKETS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::TM_CLC_MODE, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::INVALID_LEN_PACKETS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::TM_RW_CURR_SPEED, new PoolEntry<int32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::INVALID_CMD_PACKETS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::TM_RW_REF_SPEED, new PoolEntry<int32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::EXECUTED_REPLIES, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::INVALID_CRC_PACKETS, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::COMMAND_REPLIES, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::INVALID_LEN_PACKETS, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::UART_BYTES_WRITTEN, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::INVALID_CMD_PACKETS, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::UART_BYTES_READ, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::EXECUTED_REPLIES, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::UART_PARITY_ERRORS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::COMMAND_REPLIES, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::UART_NOISE_ERRORS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::UART_BYTES_WRITTEN, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::UART_FRAME_ERRORS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::UART_BYTES_READ, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::UART_REG_OVERRUN_ERRORS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::UART_PARITY_ERRORS, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::UART_TOTAL_ERRORS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::UART_NOISE_ERRORS, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::SPI_BYTES_WRITTEN, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::UART_FRAME_ERRORS, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::SPI_BYTES_READ, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::UART_REG_OVERRUN_ERRORS, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::SPI_REG_OVERRUN_ERRORS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::UART_TOTAL_ERRORS, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(RwDefinitions::SPI_TOTAL_ERRORS, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(rws::SPI_BYTES_WRITTEN, new PoolEntry<uint32_t>({0}));
|
||||||
|
localDataPoolMap.emplace(rws::SPI_BYTES_READ, new PoolEntry<uint32_t>({0}));
|
||||||
|
localDataPoolMap.emplace(rws::SPI_REG_OVERRUN_ERRORS, new PoolEntry<uint32_t>({0}));
|
||||||
|
localDataPoolMap.emplace(rws::SPI_TOTAL_ERRORS, new PoolEntry<uint32_t>({0}));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,9 @@ class RwDummy : public DeviceHandlerBase {
|
|||||||
virtual ~RwDummy();
|
virtual ~RwDummy();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
PoolEntry<int32_t> rwSpeed = PoolEntry<int32_t>({0});
|
||||||
|
PoolEntry<uint16_t> rampTime = PoolEntry<uint16_t>({10});
|
||||||
|
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
40
dummies/ScexDummy.cpp
Normal file
40
dummies/ScexDummy.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include "ScexDummy.h"
|
||||||
|
|
||||||
|
ScexDummy::ScexDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
|
ScexDummy::~ScexDummy() {}
|
||||||
|
|
||||||
|
void ScexDummy::doStartUp() { setMode(MODE_ON); }
|
||||||
|
|
||||||
|
void ScexDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
|
ReturnValue_t ScexDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
||||||
|
|
||||||
|
ReturnValue_t ScexDummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t ScexDummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||||
|
const uint8_t *commandData,
|
||||||
|
size_t commandDataLen) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t ScexDummy::scanForReply(const uint8_t *start, size_t len, DeviceCommandId_t *foundId,
|
||||||
|
size_t *foundLen) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t ScexDummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScexDummy::fillCommandAndReplyMap() {}
|
||||||
|
|
||||||
|
uint32_t ScexDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 500; }
|
||||||
|
|
||||||
|
ReturnValue_t ScexDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
|
LocalDataPoolManager &poolManager) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
30
dummies/ScexDummy.h
Normal file
30
dummies/ScexDummy.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
|
||||||
|
class ScexDummy : public DeviceHandlerBase {
|
||||||
|
public:
|
||||||
|
static const DeviceCommandId_t SIMPLE_COMMAND = 1;
|
||||||
|
static const DeviceCommandId_t PERIODIC_REPLY = 2;
|
||||||
|
|
||||||
|
static const uint8_t SIMPLE_COMMAND_DATA = 1;
|
||||||
|
static const uint8_t PERIODIC_REPLY_DATA = 2;
|
||||||
|
|
||||||
|
ScexDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
|
||||||
|
virtual ~ScexDummy();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void doStartUp() override;
|
||||||
|
void doShutDown() override;
|
||||||
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t *commandData,
|
||||||
|
size_t commandDataLen) override;
|
||||||
|
ReturnValue_t scanForReply(const uint8_t *start, size_t len, DeviceCommandId_t *foundId,
|
||||||
|
size_t *foundLen) override;
|
||||||
|
ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override;
|
||||||
|
void fillCommandAndReplyMap() override;
|
||||||
|
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
||||||
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
|
LocalDataPoolManager &poolManager) override;
|
||||||
|
};
|
@ -1,15 +1,15 @@
|
|||||||
#include "StarTrackerDummy.h"
|
#include "StarTrackerDummy.h"
|
||||||
|
|
||||||
#include <linux/devices/devicedefinitions/StarTrackerDefinitions.h>
|
#include <mission/acs/str/strHelpers.h>
|
||||||
|
|
||||||
StarTrackerDummy::StarTrackerDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
StarTrackerDummy::StarTrackerDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
|
|
||||||
StarTrackerDummy::~StarTrackerDummy() {}
|
StarTrackerDummy::~StarTrackerDummy() {}
|
||||||
|
|
||||||
void StarTrackerDummy::doStartUp() {}
|
void StarTrackerDummy::doStartUp() { setMode(MODE_ON); }
|
||||||
|
|
||||||
void StarTrackerDummy::doShutDown() {}
|
void StarTrackerDummy::doShutDown() { setMode(_MODE_POWER_DOWN); }
|
||||||
|
|
||||||
ReturnValue_t StarTrackerDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t StarTrackerDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
@ -40,7 +40,7 @@ uint32_t StarTrackerDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo)
|
|||||||
|
|
||||||
ReturnValue_t StarTrackerDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t StarTrackerDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(startracker::MCU_TEMPERATURE, new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(startracker::MCU_TEMPERATURE, new PoolEntry<float>({10.0}, true));
|
||||||
|
|
||||||
localDataPoolMap.emplace(startracker::TICKS_SOLUTION_SET, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(startracker::TICKS_SOLUTION_SET, new PoolEntry<uint32_t>({0}));
|
||||||
localDataPoolMap.emplace(startracker::TIME_SOLUTION_SET, new PoolEntry<uint64_t>({0}));
|
localDataPoolMap.emplace(startracker::TIME_SOLUTION_SET, new PoolEntry<uint64_t>({0}));
|
||||||
@ -64,6 +64,7 @@ ReturnValue_t StarTrackerDummy::initializeLocalDataPool(localpool::DataPool &loc
|
|||||||
localDataPoolMap.emplace(startracker::LISA_NR_CLOSE, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(startracker::LISA_NR_CLOSE, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(startracker::TRUST_WORTHY, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(startracker::TRUST_WORTHY, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(startracker::STABLE_COUNT, new PoolEntry<uint32_t>({0}));
|
localDataPoolMap.emplace(startracker::STABLE_COUNT, new PoolEntry<uint32_t>({0}));
|
||||||
|
localDataPoolMap.emplace(startracker::STR_MODE, new PoolEntry<uint8_t>({0}));
|
||||||
localDataPoolMap.emplace(startracker::SOLUTION_STRATEGY, new PoolEntry<uint8_t>({0}));
|
localDataPoolMap.emplace(startracker::SOLUTION_STRATEGY, new PoolEntry<uint8_t>({0}));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,9 @@ SusDummy::SusDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
|||||||
|
|
||||||
SusDummy::~SusDummy() {}
|
SusDummy::~SusDummy() {}
|
||||||
|
|
||||||
void SusDummy::doStartUp() {}
|
void SusDummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
|
||||||
void SusDummy::doShutDown() {}
|
void SusDummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t SusDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
ReturnValue_t SusDummy::buildNormalDeviceCommand(DeviceCommandId_t *id) { return NOTHING_TO_SEND; }
|
||||||
|
|
||||||
@ -35,9 +35,10 @@ uint32_t SusDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return
|
|||||||
|
|
||||||
ReturnValue_t SusDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t SusDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(SUS::SusPoolIds::TEMPERATURE_C, new PoolEntry<float>({0}, 1, true));
|
localDataPoolMap.emplace(susMax1227::SusPoolIds::TEMPERATURE_C,
|
||||||
localDataPoolMap.emplace(SUS::SusPoolIds::CHANNEL_VEC,
|
new PoolEntry<float>({0}, 1, true));
|
||||||
new PoolEntry<uint16_t>({0, 0, 0, 0, 0, 0}, true));
|
localDataPoolMap.emplace(susMax1227::SusPoolIds::CHANNEL_VEC,
|
||||||
|
new PoolEntry<uint16_t>({2603, 781, 2760, 2048, 4056, 0}, true));
|
||||||
|
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
#define DUMMIES_SUSDUMMY_H_
|
#define DUMMIES_SUSDUMMY_H_
|
||||||
|
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||||
|
#include <mission/acs/susMax1227Helpers.h>
|
||||||
#include "mission/devices/devicedefinitions/SusDefinitions.h"
|
|
||||||
|
|
||||||
class SusDummy : public DeviceHandlerBase {
|
class SusDummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
@ -17,7 +16,7 @@ class SusDummy : public DeviceHandlerBase {
|
|||||||
virtual ~SusDummy();
|
virtual ~SusDummy();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
SUS::SusDataset susSet;
|
susMax1227::SusDataset susSet;
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include "SyrlinksDummy.h"
|
#include "SyrlinksDummy.h"
|
||||||
|
|
||||||
#include <mission/devices/devicedefinitions/SyrlinksDefinitions.h>
|
#include <mission/com/syrlinksDefs.h>
|
||||||
|
|
||||||
SyrlinksDummy::SyrlinksDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
SyrlinksDummy::SyrlinksDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
: DeviceHandlerBase(objectId, comif, comCookie) {}
|
||||||
@ -40,7 +40,7 @@ uint32_t SyrlinksDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { r
|
|||||||
|
|
||||||
ReturnValue_t SyrlinksDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t SyrlinksDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(syrlinks::TEMP_BASEBAND_BOARD, new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(syrlinks::TEMP_BASEBAND_BOARD, new PoolEntry<float>({10}, true));
|
||||||
localDataPoolMap.emplace(syrlinks::TEMP_POWER_AMPLIFIER, new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(syrlinks::TEMP_POWER_AMPLIFIER, new PoolEntry<float>({10}, true));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "TemperatureSensorInserter.h"
|
#include "TemperatureSensorInserter.h"
|
||||||
|
|
||||||
|
#include <fsfw/datapool/PoolReadGuard.h>
|
||||||
#include <objects/systemObjectList.h>
|
#include <objects/systemObjectList.h>
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
@ -9,32 +10,104 @@
|
|||||||
TemperatureSensorInserter::TemperatureSensorInserter(object_id_t objectId,
|
TemperatureSensorInserter::TemperatureSensorInserter(object_id_t objectId,
|
||||||
Max31865DummyMap tempSensorDummies_,
|
Max31865DummyMap tempSensorDummies_,
|
||||||
Tmp1075DummyMap tempTmpSensorDummies_)
|
Tmp1075DummyMap tempTmpSensorDummies_)
|
||||||
: SystemObject(objects::THERMAL_TEMP_INSERTER),
|
: SystemObject(objectId),
|
||||||
max31865DummyMap(std::move(tempSensorDummies_)),
|
max31865DummyMap(std::move(tempSensorDummies_)),
|
||||||
tmp1075DummyMap(std::move(tempTmpSensorDummies_)) {}
|
tmp1075DummyMap(std::move(tempTmpSensorDummies_)) {}
|
||||||
|
|
||||||
ReturnValue_t TemperatureSensorInserter::initialize() {
|
ReturnValue_t TemperatureSensorInserter::initialize() {
|
||||||
if (performTest) {
|
testCase = TestCase::NONE;
|
||||||
if (testCase == TestCase::COOL_SYRLINKS) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t TemperatureSensorInserter::performOperation(uint8_t opCode) {
|
ReturnValue_t TemperatureSensorInserter::performOperation(uint8_t opCode) {
|
||||||
/*
|
// TODO: deviceSensors
|
||||||
ReturnValue_t result = max31865PlocHeatspreaderSet.read();
|
if (not tempsWereInitialized) {
|
||||||
if (result != returnvalue::OK) {
|
for (auto& rtdDummy : max31865DummyMap) {
|
||||||
sif::warning << "Failed to read temperature from MAX31865 dataset" << std::endl;
|
rtdDummy.second->setTemperature(10, true);
|
||||||
|
}
|
||||||
|
for (auto& tmpDummy : tmp1075DummyMap) {
|
||||||
|
tmpDummy.second->setTemperature(10, true);
|
||||||
|
}
|
||||||
|
tempsWereInitialized = true;
|
||||||
}
|
}
|
||||||
max31865PlocHeatspreaderSet.rtdValue = value - 5;
|
|
||||||
max31865PlocHeatspreaderSet.temperatureCelcius = value;
|
switch (testCase) {
|
||||||
if ((iteration % 100) < 20) {
|
case (TestCase::NONE): {
|
||||||
max31865PlocHeatspreaderSet.setValidity(false, true);
|
break;
|
||||||
} else {
|
}
|
||||||
max31865PlocHeatspreaderSet.setValidity(true, true);
|
case (TestCase::COLD_SYRLINKS): {
|
||||||
|
// TODO: How do I insert this?
|
||||||
|
// Does not work on EM, where a real syrlinks device is connected.
|
||||||
|
if (cycles == 15) {
|
||||||
|
lp_var_t<float> tempSyrlinksBasebandBoard =
|
||||||
|
lp_var_t<float>(objects::SYRLINKS_HANDLER, syrlinks::TEMP_BASEBAND_BOARD);
|
||||||
|
PoolReadGuard pg(&tempSyrlinksBasebandBoard);
|
||||||
|
tempSyrlinksBasebandBoard.value = -50;
|
||||||
|
}
|
||||||
|
if (cycles == 30) {
|
||||||
|
lp_var_t<float> tempSyrlinksBasebandBoard =
|
||||||
|
lp_var_t<float>(objects::SYRLINKS_HANDLER, syrlinks::TEMP_BASEBAND_BOARD);
|
||||||
|
PoolReadGuard pg(&tempSyrlinksBasebandBoard);
|
||||||
|
tempSyrlinksBasebandBoard.value = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (TestCase::COLD_HPA): {
|
||||||
|
if (cycles == 15) {
|
||||||
|
sif::debug << "Setting cold HPA temperature" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_9_IC12_HPA]->setTemperature(-60, true);
|
||||||
|
}
|
||||||
|
if (cycles == 30) {
|
||||||
|
sif::debug << "Setting HPA temperature back to normal" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_9_IC12_HPA]->setTemperature(0, true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (TestCase::COLD_MGT): {
|
||||||
|
if (cycles == 15) {
|
||||||
|
sif::debug << "Setting cold MGT temperature" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_15_IC18_IMTQ]->setTemperature(-60, true);
|
||||||
|
}
|
||||||
|
if (cycles == 30) {
|
||||||
|
sif::debug << "Setting MGT temperature back to normal" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_15_IC18_IMTQ]->setTemperature(0, true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (TestCase::COLD_STR):
|
||||||
|
case (TestCase::COLD_STR_CONSECUTIVE): {
|
||||||
|
if (cycles == 15) {
|
||||||
|
sif::debug << "Setting cold STR temperature" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_4_IC7_STARTRACKER]->setTemperature(-40, true);
|
||||||
|
}
|
||||||
|
if (cycles == 30) {
|
||||||
|
sif::debug << "Setting STR temperature back to normal" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_4_IC7_STARTRACKER]->setTemperature(0, true);
|
||||||
|
}
|
||||||
|
if (testCase == TestCase::COLD_STR_CONSECUTIVE) {
|
||||||
|
if (cycles == 45) {
|
||||||
|
sif::debug << "Setting cold STR temperature again" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_4_IC7_STARTRACKER]->setTemperature(-40, true);
|
||||||
|
}
|
||||||
|
if (cycles == 60) {
|
||||||
|
sif::debug << "Setting STR temperature back to normal again" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_4_IC7_STARTRACKER]->setTemperature(0, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (TestCase::COLD_CAMERA): {
|
||||||
|
if (cycles == 15) {
|
||||||
|
sif::debug << "Setting cold CAM temperature" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_2_IC5_4K_CAMERA]->setTemperature(-40, true);
|
||||||
|
}
|
||||||
|
if (cycles == 30) {
|
||||||
|
sif::debug << "Setting CAM temperature back to normal" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_2_IC5_4K_CAMERA]->setTemperature(0, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
max31865PlocHeatspreaderSet.commit();
|
cycles++;
|
||||||
*/
|
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
ReturnValue_t TemperatureSensorInserter::initializeAfterTaskCreation() { return returnvalue::OK; }
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fsfw/controller/ExtendedControllerBase.h>
|
#include <fsfw/controller/ExtendedControllerBase.h>
|
||||||
#include <mission/devices/devicedefinitions/Max31865Definitions.h>
|
#include <mission/com/syrlinksDefs.h>
|
||||||
|
#include <mission/tcs/Max31865Definitions.h>
|
||||||
|
|
||||||
#include "Max31865Dummy.h"
|
#include "Max31865Dummy.h"
|
||||||
#include "Tmp1075Dummy.h"
|
#include "Tmp1075Dummy.h"
|
||||||
@ -14,6 +15,7 @@ class TemperatureSensorInserter : public ExecutableObjectIF, public SystemObject
|
|||||||
Tmp1075DummyMap tempTmpSensorDummies_);
|
Tmp1075DummyMap tempTmpSensorDummies_);
|
||||||
|
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
|
ReturnValue_t initializeAfterTaskCreation() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ReturnValue_t performOperation(uint8_t opCode) override;
|
ReturnValue_t performOperation(uint8_t opCode) override;
|
||||||
@ -21,9 +23,19 @@ class TemperatureSensorInserter : public ExecutableObjectIF, public SystemObject
|
|||||||
private:
|
private:
|
||||||
Max31865DummyMap max31865DummyMap;
|
Max31865DummyMap max31865DummyMap;
|
||||||
Tmp1075DummyMap tmp1075DummyMap;
|
Tmp1075DummyMap tmp1075DummyMap;
|
||||||
enum TestCase { NONE = 0, COOL_SYRLINKS = 1 };
|
|
||||||
|
enum TestCase {
|
||||||
|
NONE = 0,
|
||||||
|
COLD_SYRLINKS = 1,
|
||||||
|
COLD_HPA = 2,
|
||||||
|
COLD_MGT = 3,
|
||||||
|
COLD_STR = 4,
|
||||||
|
COLD_STR_CONSECUTIVE = 5,
|
||||||
|
COLD_CAMERA = 6,
|
||||||
|
};
|
||||||
int iteration = 0;
|
int iteration = 0;
|
||||||
bool performTest = false;
|
uint32_t cycles = 0;
|
||||||
|
bool tempsWereInitialized = false;
|
||||||
TestCase testCase = TestCase::NONE;
|
TestCase testCase = TestCase::NONE;
|
||||||
|
|
||||||
// void noise();
|
// void noise();
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
#include "Tmp1075Dummy.h"
|
#include "Tmp1075Dummy.h"
|
||||||
|
|
||||||
#include "mission/devices/devicedefinitions/Tmp1075Definitions.h"
|
#include <fsfw/datapool/PoolReadGuard.h>
|
||||||
|
#include <mission/tcs/Tmp1075Definitions.h>
|
||||||
|
|
||||||
using namespace returnvalue;
|
using namespace returnvalue;
|
||||||
|
|
||||||
Tmp1075Dummy::Tmp1075Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
Tmp1075Dummy::Tmp1075Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie), set(this) {}
|
: DeviceHandlerBase(objectId, comif, comCookie), set(this) {}
|
||||||
void Tmp1075Dummy::doStartUp() { setMode(MODE_ON); }
|
|
||||||
void Tmp1075Dummy::doShutDown() { setMode(_MODE_POWER_DOWN); }
|
void Tmp1075Dummy::doStartUp() { setMode(MODE_NORMAL); }
|
||||||
|
void Tmp1075Dummy::doShutDown() { setMode(MODE_OFF); }
|
||||||
|
|
||||||
ReturnValue_t Tmp1075Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t Tmp1075Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
}
|
}
|
||||||
@ -24,11 +27,16 @@ ReturnValue_t Tmp1075Dummy::scanForReply(const uint8_t *start, size_t len,
|
|||||||
ReturnValue_t Tmp1075Dummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
ReturnValue_t Tmp1075Dummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
void Tmp1075Dummy::setTemperature(float temperature, bool valid) {
|
||||||
|
PoolReadGuard pg(&set);
|
||||||
|
set.temperatureCelcius.value = temperature;
|
||||||
|
set.setValidity(valid, true);
|
||||||
|
}
|
||||||
void Tmp1075Dummy::fillCommandAndReplyMap() {}
|
void Tmp1075Dummy::fillCommandAndReplyMap() {}
|
||||||
uint32_t Tmp1075Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; }
|
uint32_t Tmp1075Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; }
|
||||||
ReturnValue_t Tmp1075Dummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t Tmp1075Dummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(TMP1075::TEMPERATURE_C_TMP1075, new PoolEntry<float>({0.0}));
|
localDataPoolMap.emplace(TMP1075::TEMPERATURE_C_TMP1075, new PoolEntry<float>({10.0}, true));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
LocalPoolDataSetBase *Tmp1075Dummy::getDataSetHandle(sid_t sid) { return &set; }
|
LocalPoolDataSetBase *Tmp1075Dummy::getDataSetHandle(sid_t sid) { return &set; }
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
#ifndef EIVE_OBSW_TMP1075DUMMY_H
|
#ifndef EIVE_OBSW_TMP1075DUMMY_H
|
||||||
#define EIVE_OBSW_TMP1075DUMMY_H
|
#define EIVE_OBSW_TMP1075DUMMY_H
|
||||||
|
|
||||||
|
#include <mission/tcs/Tmp1075Definitions.h>
|
||||||
|
|
||||||
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
|
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
|
||||||
#include "mission/devices/devicedefinitions/Tmp1075Definitions.h"
|
|
||||||
|
|
||||||
class Tmp1075Dummy : public DeviceHandlerBase {
|
class Tmp1075Dummy : public DeviceHandlerBase {
|
||||||
public:
|
public:
|
||||||
Tmp1075Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
|
Tmp1075Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie);
|
||||||
|
void setTemperature(float temperature, bool setValid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TMP1075::Tmp1075Dataset set;
|
TMP1075::Tmp1075Dataset set;
|
||||||
|
233
dummies/helperFactory.cpp
Normal file
233
dummies/helperFactory.cpp
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
#include "helperFactory.h"
|
||||||
|
|
||||||
|
#include <dummies/AcuDummy.h>
|
||||||
|
#include <dummies/BpxDummy.h>
|
||||||
|
#include <dummies/ComCookieDummy.h>
|
||||||
|
#include <dummies/ComIFDummy.h>
|
||||||
|
#include <dummies/CoreControllerDummy.h>
|
||||||
|
#include <dummies/ExecutableComIfDummy.h>
|
||||||
|
#include <dummies/GpsCtrlDummy.h>
|
||||||
|
#include <dummies/GpsDhbDummy.h>
|
||||||
|
#include <dummies/GyroAdisDummy.h>
|
||||||
|
#include <dummies/GyroL3GD20Dummy.h>
|
||||||
|
#include <dummies/ImtqDummy.h>
|
||||||
|
#include <dummies/MgmLIS3MDLDummy.h>
|
||||||
|
#include <dummies/MgmRm3100Dummy.h>
|
||||||
|
#include <dummies/P60DockDummy.h>
|
||||||
|
#include <dummies/PduDummy.h>
|
||||||
|
#include <dummies/PlPcduDummy.h>
|
||||||
|
#include <dummies/PlocMpsocDummy.h>
|
||||||
|
#include <dummies/PlocSupervisorDummy.h>
|
||||||
|
#include <dummies/RwDummy.h>
|
||||||
|
#include <dummies/SaDeploymentDummy.h>
|
||||||
|
#include <dummies/ScexDummy.h>
|
||||||
|
#include <dummies/StarTrackerDummy.h>
|
||||||
|
#include <dummies/SusDummy.h>
|
||||||
|
#include <dummies/SyrlinksDummy.h>
|
||||||
|
#include <fsfw/devicehandlers/HealthDevice.h>
|
||||||
|
#include <fsfw_hal/common/gpio/GpioIF.h>
|
||||||
|
#include <mission/power/gsDefs.h>
|
||||||
|
#include <mission/system/acs/ImtqAssembly.h>
|
||||||
|
#include <mission/system/acs/StrAssembly.h>
|
||||||
|
#include <mission/system/objects/CamSwitcher.h>
|
||||||
|
#include <mission/system/tcs/TcsBoardAssembly.h>
|
||||||
|
|
||||||
|
#include "TemperatureSensorInserter.h"
|
||||||
|
#include "dummies/Max31865Dummy.h"
|
||||||
|
#include "dummies/Tmp1075Dummy.h"
|
||||||
|
#include "mission/genericFactory.h"
|
||||||
|
#include "mission/system/acs/acsModeTree.h"
|
||||||
|
#include "mission/system/com/comModeTree.h"
|
||||||
|
#include "mission/system/tcs/tcsModeTree.h"
|
||||||
|
#include "mission/system/tree/payloadModeTree.h"
|
||||||
|
#include "mission/tcs/defs.h"
|
||||||
|
|
||||||
|
void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpioIF) {
|
||||||
|
new ComIFDummy(objects::DUMMY_COM_IF);
|
||||||
|
auto* comCookieDummy = new ComCookieDummy();
|
||||||
|
new BpxDummy(objects::BPX_BATT_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
if (cfg.addCoreCtrlCfg) {
|
||||||
|
new CoreControllerDummy(objects::CORE_CONTROLLER);
|
||||||
|
}
|
||||||
|
if (cfg.addRtdComIFDummy) {
|
||||||
|
new ExecutableComIfDummy(objects::SPI_RTD_COM_IF);
|
||||||
|
}
|
||||||
|
std::array<object_id_t, 4> rwIds = {objects::RW1, objects::RW2, objects::RW3, objects::RW4};
|
||||||
|
std::array<DeviceHandlerBase*, 4> rws;
|
||||||
|
rws[0] = new RwDummy(objects::RW1, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
rws[1] = new RwDummy(objects::RW2, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
rws[2] = new RwDummy(objects::RW3, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
rws[3] = new RwDummy(objects::RW4, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
ObjectFactory::createRwAssy(pwrSwitcher, power::Switches::PDU2_CH2_RW_5V, rws, rwIds);
|
||||||
|
new SaDeplDummy(objects::SOLAR_ARRAY_DEPL_HANDLER);
|
||||||
|
auto* strAssy = new StrAssembly(objects::STR_ASSY);
|
||||||
|
strAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
||||||
|
auto* strDummy =
|
||||||
|
new StarTrackerDummy(objects::STAR_TRACKER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
strDummy->connectModeTreeParent(*strAssy);
|
||||||
|
if (cfg.addSyrlinksDummies) {
|
||||||
|
auto* syrlinksDummy =
|
||||||
|
new SyrlinksDummy(objects::SYRLINKS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
syrlinksDummy->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
||||||
|
}
|
||||||
|
auto* imtqAssy = new ImtqAssembly(objects::IMTQ_ASSY);
|
||||||
|
imtqAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
||||||
|
auto* imtqDummy = new ImtqDummy(objects::IMTQ_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
imtqDummy->enableThermalModule(ThermalStateCfg());
|
||||||
|
imtqDummy->connectModeTreeParent(*imtqAssy);
|
||||||
|
if (cfg.addPowerDummies) {
|
||||||
|
new AcuDummy(objects::ACU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
new PduDummy(objects::PDU1_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
new PduDummy(objects::PDU2_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
new P60DockDummy(objects::P60DOCK_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg.addAcsBoardDummies) {
|
||||||
|
std::array<DeviceHandlerBase*, 8> assemblyDhbs;
|
||||||
|
assemblyDhbs[0] =
|
||||||
|
new MgmLIS3MDLDummy(objects::MGM_0_LIS3_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
assemblyDhbs[1] =
|
||||||
|
new MgmLIS3MDLDummy(objects::MGM_2_LIS3_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
assemblyDhbs[2] =
|
||||||
|
new MgmRm3100Dummy(objects::MGM_1_RM3100_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
assemblyDhbs[3] =
|
||||||
|
new MgmRm3100Dummy(objects::MGM_3_RM3100_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
assemblyDhbs[4] =
|
||||||
|
new GyroAdisDummy(objects::GYRO_0_ADIS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
assemblyDhbs[5] =
|
||||||
|
new GyroL3GD20Dummy(objects::GYRO_1_L3G_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
assemblyDhbs[6] =
|
||||||
|
new GyroAdisDummy(objects::GYRO_2_ADIS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
assemblyDhbs[7] =
|
||||||
|
new GyroL3GD20Dummy(objects::GYRO_3_L3G_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
auto* gpsCtrl = new GpsCtrlDummy(objects::GPS_CONTROLLER);
|
||||||
|
ObjectFactory::createAcsBoardAssy(pwrSwitcher, assemblyDhbs, gpsCtrl, gpioIF);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg.addSusDummies) {
|
||||||
|
std::array<DeviceHandlerBase*, 12> suses;
|
||||||
|
suses[0] =
|
||||||
|
new SusDummy(objects::SUS_0_N_LOC_XFYFZM_PT_XF, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[1] =
|
||||||
|
new SusDummy(objects::SUS_1_N_LOC_XBYFZM_PT_XB, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[2] =
|
||||||
|
new SusDummy(objects::SUS_2_N_LOC_XFYBZB_PT_YB, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[3] =
|
||||||
|
new SusDummy(objects::SUS_3_N_LOC_XFYBZF_PT_YF, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[4] =
|
||||||
|
new SusDummy(objects::SUS_4_N_LOC_XMYFZF_PT_ZF, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[5] =
|
||||||
|
new SusDummy(objects::SUS_5_N_LOC_XFYMZB_PT_ZB, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[6] =
|
||||||
|
new SusDummy(objects::SUS_6_R_LOC_XFYBZM_PT_XF, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[7] =
|
||||||
|
new SusDummy(objects::SUS_7_R_LOC_XBYBZM_PT_XB, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[8] =
|
||||||
|
new SusDummy(objects::SUS_8_R_LOC_XBYBZB_PT_YB, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[9] =
|
||||||
|
new SusDummy(objects::SUS_9_R_LOC_XBYBZB_PT_YF, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[10] =
|
||||||
|
new SusDummy(objects::SUS_10_N_LOC_XMYBZF_PT_ZF, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
suses[11] =
|
||||||
|
new SusDummy(objects::SUS_11_R_LOC_XBYMZB_PT_ZB, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
ObjectFactory::createSusAssy(pwrSwitcher, suses);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg.addTempSensorDummies) {
|
||||||
|
std::map<object_id_t, Max31865Dummy*> rtdSensorDummies;
|
||||||
|
rtdSensorDummies.emplace(objects::RTD_0_IC3_PLOC_HEATSPREADER,
|
||||||
|
new Max31865Dummy(objects::RTD_0_IC3_PLOC_HEATSPREADER,
|
||||||
|
objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(objects::RTD_1_IC4_PLOC_MISSIONBOARD,
|
||||||
|
new Max31865Dummy(objects::RTD_1_IC4_PLOC_MISSIONBOARD,
|
||||||
|
objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_2_IC5_4K_CAMERA,
|
||||||
|
new Max31865Dummy(objects::RTD_2_IC5_4K_CAMERA, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(objects::RTD_3_IC6_DAC_HEATSPREADER,
|
||||||
|
new Max31865Dummy(objects::RTD_3_IC6_DAC_HEATSPREADER,
|
||||||
|
objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_4_IC7_STARTRACKER,
|
||||||
|
new Max31865Dummy(objects::RTD_4_IC7_STARTRACKER, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_5_IC8_RW1_MX_MY,
|
||||||
|
new Max31865Dummy(objects::RTD_5_IC8_RW1_MX_MY, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_6_IC9_DRO,
|
||||||
|
new Max31865Dummy(objects::RTD_6_IC9_DRO, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_7_IC10_SCEX,
|
||||||
|
new Max31865Dummy(objects::RTD_7_IC10_SCEX, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_8_IC11_X8,
|
||||||
|
new Max31865Dummy(objects::RTD_8_IC11_X8, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_9_IC12_HPA,
|
||||||
|
new Max31865Dummy(objects::RTD_9_IC12_HPA, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_10_IC13_PL_TX,
|
||||||
|
new Max31865Dummy(objects::RTD_10_IC13_PL_TX, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_11_IC14_MPA,
|
||||||
|
new Max31865Dummy(objects::RTD_11_IC14_MPA, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_12_IC15_ACU,
|
||||||
|
new Max31865Dummy(objects::RTD_12_IC15_ACU, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(objects::RTD_13_IC16_PLPCDU_HEATSPREADER,
|
||||||
|
new Max31865Dummy(objects::RTD_13_IC16_PLPCDU_HEATSPREADER,
|
||||||
|
objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_14_IC17_TCS_BOARD,
|
||||||
|
new Max31865Dummy(objects::RTD_14_IC17_TCS_BOARD, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
rtdSensorDummies.emplace(
|
||||||
|
objects::RTD_15_IC18_IMTQ,
|
||||||
|
new Max31865Dummy(objects::RTD_15_IC18_IMTQ, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
|
||||||
|
std::map<object_id_t, Tmp1075Dummy*> tmpSensorDummies;
|
||||||
|
tmpSensorDummies.emplace(
|
||||||
|
objects::TMP1075_HANDLER_TCS_0,
|
||||||
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_TCS_0, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
tmpSensorDummies.emplace(
|
||||||
|
objects::TMP1075_HANDLER_TCS_1,
|
||||||
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_TCS_1, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
tmpSensorDummies.emplace(
|
||||||
|
objects::TMP1075_HANDLER_PLPCDU_0,
|
||||||
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_PLPCDU_0, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
// damaged.
|
||||||
|
// tmpSensorDummies.emplace(
|
||||||
|
// objects::TMP1075_HANDLER_PLPCDU_1,
|
||||||
|
// new Tmp1075Dummy(objects::TMP1075_HANDLER_PLPCDU_1, objects::DUMMY_COM_IF,
|
||||||
|
// comCookieDummy));
|
||||||
|
tmpSensorDummies.emplace(
|
||||||
|
objects::TMP1075_HANDLER_IF_BOARD,
|
||||||
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_IF_BOARD, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
|
||||||
|
new TemperatureSensorInserter(objects::THERMAL_TEMP_INSERTER, rtdSensorDummies,
|
||||||
|
tmpSensorDummies);
|
||||||
|
TcsBoardAssembly* tcsBoardAssy =
|
||||||
|
ObjectFactory::createTcsBoardAssy(pwrSwitcher, tcs::TCS_BOARD_SHORTLY_UNAVAILABLE);
|
||||||
|
for (auto& rtd : rtdSensorDummies) {
|
||||||
|
rtd.second->connectModeTreeParent(*tcsBoardAssy);
|
||||||
|
}
|
||||||
|
for (auto& tmp : tmpSensorDummies) {
|
||||||
|
tmp.second->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
auto* camSwitcher =
|
||||||
|
new CamSwitcher(objects::CAM_SWITCHER, pwrSwitcher, power::Switches::PDU2_CH8_PAYLOAD_CAMERA);
|
||||||
|
camSwitcher->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
|
auto* scexDummy = new ScexDummy(objects::SCEX, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
scexDummy->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
|
auto* plPcduDummy =
|
||||||
|
new PlPcduDummy(objects::PLPCDU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
plPcduDummy->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
|
if (cfg.addPlocDummies) {
|
||||||
|
auto* plocMpsocDummy =
|
||||||
|
new PlocMpsocDummy(objects::PLOC_MPSOC_HANDLER, objects::DUMMY_COM_IF, comCookieDummy);
|
||||||
|
plocMpsocDummy->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
|
auto* plocSupervisorDummy = new PlocSupervisorDummy(
|
||||||
|
objects::PLOC_SUPERVISOR_HANDLER, objects::DUMMY_COM_IF, comCookieDummy, pwrSwitcher);
|
||||||
|
plocSupervisorDummy->connectModeTreeParent(satsystem::payload::SUBSYSTEM);
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <fsfw/power/PowerSwitchIF.h>
|
#include <fsfw/power/PowerSwitchIF.h>
|
||||||
|
|
||||||
|
class GpioIF;
|
||||||
|
|
||||||
namespace dummy {
|
namespace dummy {
|
||||||
|
|
||||||
struct DummyCfg {
|
struct DummyCfg {
|
||||||
@ -12,8 +14,9 @@ struct DummyCfg {
|
|||||||
bool addSusDummies = true;
|
bool addSusDummies = true;
|
||||||
bool addTempSensorDummies = true;
|
bool addTempSensorDummies = true;
|
||||||
bool addRtdComIFDummy = true;
|
bool addRtdComIFDummy = true;
|
||||||
|
bool addPlocDummies = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
void createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitch);
|
void createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitch, GpioIF* gpioIF);
|
||||||
|
|
||||||
} // namespace dummy
|
} // namespace dummy
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user