Compare commits

...

244 Commits

Author SHA1 Message Date
muellerr dc79b7ba00 delete metadata after processing
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 11:38:46 +02:00
muellerr db84dcd3ce afmt
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 11:12:16 +02:00
muellerr 935f35a40d Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 17:52:17 +02:00
muellerr 348af0124b Merge remote-tracking branch 'origin/development' into mueller/cfdp-routers 2022-09-01 17:52:11 +02:00
muellerr 04bff7a522 test fix
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 17:51:09 +02:00
muellerr 5c20cc804e Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-01 17:48:40 +02:00
mohr eb8e236cd4 Merge pull request 'Bugfix for Space Packet Parser' (#673) from eive/fsfw:mueller/fixes-tmtc-server-sp-parser into development
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #673
2022-09-01 14:12:16 +02:00
mohr 7dec45ccf2 Merge pull request 'Service 11 regression' (#670) from eive/fsfw:mueller/service-11-issues into development
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #670
2022-09-01 11:59:18 +02:00
mohr 2b01e86f9c one small additional precaution
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 11:56:07 +02:00
mohr 60fd3d43c0 Merge pull request 'DHB TM handler alternative API raw buffer' (#671) from mueller/dhb-handle-device-tm-2 into development
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #671
2022-09-01 11:22:17 +02:00
muellerr 67980cb592 Merge branch 'development' into mueller/fixes-tmtc-server-sp-parser
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 11:21:02 +02:00
mohr 3010f2f925 Merge pull request 'DHB set action commander before buildCommandFromCommand' (#672) from eive/fsfw:mueller/dhb-set-action-commander-before-building-cmd into development
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #672
2022-09-01 11:18:32 +02:00
muellerr 01651f0521 more simplfications
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 10:52:48 +02:00
muellerr c7f300671f update header
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 10:45:10 +02:00
muellerr 7d3223d766 add comment blocks 2022-09-01 10:44:57 +02:00
muellerr 7ae82a5cb4 do not cache previous recipient
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 08:58:18 +02:00
muellerr 28ecd0e5c6 bugfix for SP parser
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 08:51:12 +02:00
muellerr 7345c18b04 small fix which allows sending action reply immediately
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-31 16:50:48 +02:00
muellerr 0de7b66218 new retval for permission errors
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-31 13:26:44 +02:00
muellerr 158007fa7f const correct API
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-31 00:02:25 +02:00
muellerr ab719a3e59 alternative solution
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 23:38:55 +02:00
muellerr 64a7fde301 this is annoying
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 15:19:01 +02:00
muellerr 8e6cee7761 Merge branch 'mueller/data-wrapper' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-30 13:46:03 +02:00
muellerr a9277622ce move data wrapper
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 12:04:15 +02:00
muellerr 80e8511a43 Merge branch 'mueller/cfdp-routers' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 11:21:12 +02:00
muellerr 4a06f11582 Merge branch 'mueller/refactor-local-pool-api' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 11:12:59 +02:00
muellerr 32c53b932d Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers 2022-08-30 11:12:53 +02:00
muellerr aea9db75cb better name
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 11:12:06 +02:00
muellerr 9fedd03ed8 use cfg struct for local pool API
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 11:02:21 +02:00
muellerr 10fc4dd89d Merge branch 'mueller/refactor-tmtc-stack' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 10:58:06 +02:00
muellerr 0cc8af5eb0 afmt 2022-08-30 10:57:17 +02:00
muellerr 92d65aa3a5 use old lpm api 2022-08-30 10:57:02 +02:00
muellerr 342a56410c delete commented function 2022-08-30 10:28:55 +02:00
muellerr 2cab73d972 avoid duplicate code
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 20:09:28 +02:00
muellerr 9a9085b9e6 avoid duplicate code 2022-08-29 20:08:59 +02:00
muellerr cb23911ccd default initialization of CDS short struct
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 15:30:45 +02:00
muellerr b499dedd76 remove TODO
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 15:27:53 +02:00
muellerr 1bb487373d Merge branch 'mueller/refactor-tmtc-stack' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 15:20:51 +02:00
muellerr 3bffb4f968 fix for static fw obj setter 2022-08-29 15:20:33 +02:00
Steffen Gaisser 6bcb208968 Merge branch 'development' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 15:11:50 +02:00
muellerr 81a7c21cd1 continued router component
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 17:31:26 +02:00
muellerr 267466be9d pass const references to user handler now
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 15:43:58 +02:00
muellerr 2c730c8632 use const struct ref instead
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 12:11:03 +02:00
muellerr eb29b79467 some more docs
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 08:44:20 +02:00
muellerr 26ea6606bf metadata recvd indication
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-23 20:56:09 +02:00
muellerr b1bd631322 implemented metadata handler
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-23 20:30:41 +02:00
muellerr 9441b4a70e continue dest handler
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-23 19:37:30 +02:00
muellerr 95457b1760 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-22 16:38:41 +02:00
muellerr a46d8c34d9 small changelog update
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-22 16:37:53 +02:00
muellerr d12c59c8ac all retval replacements
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-22 16:35:53 +02:00
muellerr 9e5dddf79c Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-22 16:24:20 +02:00
muellerr ba5c6410d6 tests running again
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-22 16:23:36 +02:00
muellerr 52f8c5038b Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-22 16:21:41 +02:00
muellerr 10f34e5a48 Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack-with-retval-refactoring
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-22 15:57:22 +02:00
muellerr dab1b1d067 apply auto-formatter
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-22 15:02:53 +02:00
muellerr 2a4ab0af7b Merge branch 'mueller/refactor-tmtc-stack' into mueller/refactor-tmtc-stack-with-retval-refactoring
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-22 14:17:24 +02:00
muellerr 3b33b429e6 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-18 11:21:16 +02:00
muellerr ff6de8e378 important bugfix for verif reporter
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-18 11:20:27 +02:00
muellerr 11a699c3ce a list should do the job
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 18:49:51 +02:00
muellerr 6930656d4e added some more basic tests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 17:09:39 +02:00
muellerr 0bb82e0da2 add fs mock feed function
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 16:47:46 +02:00
muellerr 12c452e7ce finished host FS unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 16:10:52 +02:00
muellerr 23f514039a host filesystem continued
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 11:39:15 +02:00
muellerr 2e52d7a31d Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 17:23:52 +02:00
muellerr 239d053562 update changelog
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 17:23:10 +02:00
muellerr 875174c4ad better name for global object
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 17:17:45 +02:00
muellerr 8fd8a37f59 flip verif reporter ctor arguments
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 17:10:48 +02:00
muellerr 1037102349 merge retval refactoring
fsfw/fsfw/pipeline/head This commit looks good
2022-08-16 01:08:26 +02:00
muellerr e76e109bdb Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 19:17:15 +02:00
muellerr 9e064fe800 fix unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 19:16:31 +02:00
muellerr 2339c48756 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-15 19:07:22 +02:00
muellerr d7ec04bf4b Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-15 19:05:50 +02:00
muellerr c12492df03 continued host FS test
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-11 10:19:25 +02:00
muellerr 8aaabc5d73 basic host FS unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-11 10:10:05 +02:00
muellerr e796e025b6 continue host fs unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-11 09:59:14 +02:00
muellerr 20eee2c469 finished host FS impl
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-11 09:32:18 +02:00
muellerr aca8b53a59 start host FS impl
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-10 17:03:23 +02:00
muellerr 3df1161560 this should do the job
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-10 15:03:53 +02:00
muellerr ea6e5d9971 Merge branch 'mueller/cfdp-routers' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-10 13:36:51 +02:00
muellerr 46a4203d00 testLvs fix 2022-08-10 13:36:41 +02:00
muellerr c86adf8e10 Merge branch 'development' into mueller/cfdp-routers
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 13:10:09 +02:00
muellerr a2e0646ed4 fix duplicate naming error
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 13:05:07 +02:00
muellerr 28c8248f26 add FS mock and improve HasFilesystemIF
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 11:09:07 +02:00
muellerr 3e1fd15613 completed all indication parameters
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 10:34:02 +02:00
muellerr e45a99143c added const char* test
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 09:45:24 +02:00
muellerr 96dfe46e25 added string LV tests
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 09:39:57 +02:00
muellerr 507c6ddff1 added some param structs
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 21:03:56 +02:00
muellerr 0cb15e901e new cfdp mock folder, added additional cfdp mocks
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 19:00:47 +02:00
muellerr d45108e3c2 add remote config table provider class
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 18:51:44 +02:00
muellerr 8c059f8f32 new filesystem module
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 16:36:35 +02:00
muellerr 5bea92d2a4 some doc updates
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 16:26:37 +02:00
muellerr bba2d883b6 added some documentation
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 16:18:45 +02:00
muellerr 7a20412305 add user base documentation
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 15:51:01 +02:00
muellerr dce1ebcf65 add CFDP user base
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 15:46:42 +02:00
muellerr 4ee01e395b finished fault handler unit tests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 15:29:22 +02:00
muellerr 7f9401cf63 some bugfixes
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 15:09:43 +02:00
muellerr dba3f9960e add CFDP fault handler mock
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 14:55:08 +02:00
muellerr eccb629ba8 fnished fault handler base
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 14:39:03 +02:00
muellerr 7fb906a0ac add first fault handler base class
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 14:05:43 +02:00
muellerr 9796abfc7d Merge branch 'development' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 13:06:08 +02:00
muellerr 0d26a0f54b fnish CFDP distributor unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 13:04:23 +02:00
muellerr 192956c2c7 use new storage manager mock
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 12:50:50 +02:00
muellerr 22e1555f50 basic storage manager mock
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 12:45:05 +02:00
muellerr bddf5bded1 move some storage manager impl to IF
fsfw/fsfw/pipeline/pr-development This commit looks good
- Add StorageManagerMock
2022-08-09 12:36:29 +02:00
muellerr 1c0b778848 continue CFDP distrib unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 12:13:10 +02:00
muellerr c832bffdb0 clean up header test
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 11:17:57 +02:00
muellerr 2f8020baac move parsing steps into parse function
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 11:03:22 +02:00
muellerr 06bea2f621 test inNull and bool operator
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 10:59:24 +02:00
muellerr 4f1fe39182 fix unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 18:36:10 +02:00
muellerr 904abfba28 clean up CFDP stack a bit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-08 18:29:32 +02:00
muellerr 202d9341d8 add CFDP unit tests
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-08 17:53:42 +02:00
muellerr 37c60d1dd0 add source and dest test stubs
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 12:41:05 +02:00
muellerr 43fb6ef5cb some tag replacements
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 12:35:58 +02:00
muellerr 65a47c7c57 add distributor test stub
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 12:34:54 +02:00
muellerr fdb0cc0e44 tweaks for CFDP distributor
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 12:31:19 +02:00
muellerr 269a3052ca added stubs for source and dest handler
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 18:18:01 +02:00
muellerr c6a7a0fec8 use distributor instead of router
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 18:14:49 +02:00
muellerr acf5c2a56d better names
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 16:00:48 +02:00
muellerr 7fb9e14555 better names for CFDP components
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 15:22:39 +02:00
muellerr b20e8a9679 continue new cfdp router
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 15:12:29 +02:00
muellerr 29bcaee196 some tests for new var len field
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 13:34:49 +02:00
muellerr cc98512caf use tags properly
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 13:23:49 +02:00
muellerr 60ea9a9a7c clean up a few tests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 13:15:49 +02:00
muellerr df690b9628 some re-ordering
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 11:36:56 +02:00
muellerr b0c479cab9 remove some shadowing warnings
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 11:34:30 +02:00
muellerr a426aef7c7 add some more tests for CCSDS distributor
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 11:33:10 +02:00
muellerr 902a4bfa9c unittests for TC and CCSDS distributor
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-01 17:16:37 +02:00
muellerr bf540ebb49 use sanitized include file 2022-08-01 14:23:52 +02:00
muellerr aa978205d8 Merge branch 'mueller/cfdp-routers' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/cfdp-routers
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-01 13:05:56 +02:00
muellerr 4334106ad1 applied auto-formatter
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-01 11:05:46 +02:00
muellerr 458fe460eb TMTC Routing Refactoring
fsfw/fsfw/pipeline/head There was a failure building this commit
1. Make TcDistributor less powerful / more flexible and rename it to TcDistributorBase
2. Require AcceptsTelecommandsIF to have an abstract function returning the name
3. Allows the CCSDS distributor to remove the CCSDS header before rerouting. This is useful
for protocols like CFDP which are CCSDS agnostic.

WIP: Still need to implement the removal of the CCSDS header
2022-08-01 11:00:36 +02:00
muellerr 83d71548ec CCSDS unpacker implementation 2022-07-29 16:32:50 +02:00
muellerr f4beef8c9f run auto-formatter
fsfw/fsfw/pipeline/head This commit looks good
2022-07-29 15:54:17 +02:00
muellerr c7b4dc349a using uint32_t for getIdentifier of AcceptsTcIF 2022-07-29 15:53:39 +02:00
muellerr f75379fceb Merge branch 'mueller/new-object-id-class' into mueller/cfdp-routers
fsfw/fsfw/pipeline/head This commit looks good
2022-07-29 14:27:59 +02:00
muellerr cd4d92b12c Merge branch 'mueller/new-object-id-class' into mueller/cfdp-routers
fsfw/fsfw/pipeline/head This commit looks good
2022-07-29 14:22:52 +02:00
muellerr 6c5bbfa080 some renaming
fsfw/fsfw/pipeline/head This commit looks good
2022-07-29 12:03:14 +02:00
muellerr da106fd96f do not use TC info for failed TC retrieval
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-29 10:23:59 +02:00
muellerr fc3412fa35 set sec header flag and add unit test for it
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-28 15:13:27 +02:00
muellerr 8f6f0e1d45 some more fail tests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-28 13:42:34 +02:00
muellerr 1b5fa2a8fa test no crc generation
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-28 13:37:07 +02:00
muellerr cb118176a0 completed ZcWriter unittests
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-28 13:24:50 +02:00
muellerr 30ba9ab916 some more fixes
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-28 13:00:53 +02:00
muellerr fb4ba487b5 Merge remote-tracking branch 'origin/mueller/expand-retval-if' into mueller/refactor-tmtc-stack 2022-07-28 12:55:42 +02:00
muellerr 72bc5d4d60 add tm zc test 2022-07-28 12:52:20 +02:00
muellerr b485afea57 Simple SerializeIF adaptions
fsfw/fsfw/pipeline/pr-development This commit looks good
- Returns serialized or deserialized size
2022-07-27 21:29:05 +02:00
muellerr 5bb7023ff3 improvements for creator API
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 21:11:12 +02:00
muellerr 85dbef20b0 update serialize IF
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 21:07:34 +02:00
muellerr 93acac02f5 tests running again
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 21:06:23 +02:00
muellerr 7e8afcc12f remove nullptr check
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 20:37:21 +02:00
muellerr f03b7cd660 another bugfix in CSB
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 20:10:15 +02:00
muellerr d641d63531 set queue of tm send helper
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 19:56:11 +02:00
muellerr 4e571e5082 some more minor fixes
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 19:40:54 +02:00
muellerr 356d778743 afmt
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 18:03:17 +02:00
muellerr 0a38d2e22d small bugfix
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 17:56:16 +02:00
muellerr 234ccdf764 send time stampers properly now
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 17:48:59 +02:00
muellerr f591b9793c pass timeReader to Pus ZC writer
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 17:33:39 +02:00
muellerr c5ad9b5fa9 switch off debugging switches
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 17:13:42 +02:00
muellerr 083d08ae2a various bugs and improvements 2022-07-27 17:00:43 +02:00
muellerr 740644f2c8 updates for PusDistributor
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 14:40:51 +02:00
muellerr 059fb10558 add helper methods to disable crc calculation
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 11:41:06 +02:00
muellerr 86692e202d this gets rid of some warnings
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 11:35:35 +02:00
muellerr 064b195c75 some of the deprecation warnings run amok
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 11:33:19 +02:00
muellerr 18ee2ab903 example compiles again
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 11:26:47 +02:00
muellerr 9eb652e585 some printout fixes
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 10:49:49 +02:00
muellerr 681738dcc6 PSB unittests complete
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 19:08:12 +02:00
muellerr 152c01b2ec psb unittests almost complete
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 18:58:36 +02:00
muellerr 8bf0fb9885 test auto-initializers
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 18:46:28 +02:00
muellerr 1954ce0ea4 default PUS receiver set automatically now
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 17:41:10 +02:00
muellerr d98b79cf5e adapt PSB so it can be unittested properly
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-26 16:49:46 +02:00
muellerr f14c812aff removed some obsolete code
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 14:14:00 +02:00
muellerr 146a0e3828 created PSB mock
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 14:10:24 +02:00
muellerr 75c824ec80 add new VerificationReporterIF
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 13:59:09 +02:00
muellerr 332e9dbfd5 add new tests 2022-07-26 11:19:36 +02:00
muellerr f1c37203a4 some more API improvements and replacements
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 11:14:40 +02:00
muellerr 500a5602bd added additional TM store and send helper
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 11:09:57 +02:00
muellerr 4ed028000d Merge branch 'mueller/expand-retval-if' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-26 10:29:51 +02:00
muellerr bdf71d4e66 add new HasReturnvaluesIF features
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-26 10:21:16 +02:00
muellerr e48b6f1432 possible double delete
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 22:36:53 +02:00
muellerr 747243684d more leaks
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 22:29:18 +02:00
muellerr db33f9cc7e maybe this teardown fixes the leak
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 22:22:08 +02:00
muellerr c12669fe50 this should fix the mmeory leak
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 22:10:20 +02:00
muellerr 6d00fc65c0 fix memory leak
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 21:08:04 +02:00
muellerr 7d87274844 add old api but mark it deprecated
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 20:53:18 +02:00
muellerr c83f75c515 some more tests using TM send helper
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 20:41:01 +02:00
muellerr 586993c081 completed send helper tests
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 20:31:06 +02:00
muellerr a88f767cca all tests running again
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 19:49:19 +02:00
muellerr 935e135f1c normal queue sufficient
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 19:42:05 +02:00
muellerr 6d0fa36f8a cleaning up message queue mock and subscription API
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 19:36:56 +02:00
muellerr 5fd5d488ff Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 14:57:28 +02:00
muellerr 9ee6da47e9 improving mocks 2022-07-25 14:31:57 +02:00
muellerr 1a7d7b172b set up new internal error reporter mock
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 14:04:06 +02:00
muellerr 36e3956efb finished tm store helper tests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 13:39:07 +02:00
muellerr ca1e921b94 Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:35:32 +02:00
muellerr e2ad37e3e6 more ref replacements
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:26:45 +02:00
muellerr 973d4ee8a5 some more ref replacements
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:24:13 +02:00
muellerr 899d021e00 using uint32_t as store_address requires explicit cast
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:15:45 +02:00
muellerr 4989bd0f02 fixes for Linux OSAL clock
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:56:19 +02:00
muellerr 832367fb30 replace some API components with references
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:50:52 +02:00
muellerr 63ee88af17 added base for tm store test
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:38:44 +02:00
muellerr 4921527022 replace c include
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:31:49 +02:00
muellerr f0c8fd2688 some renaming
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:24:43 +02:00
muellerr d474c4a7ee store helper 2022-07-23 11:43:48 +02:00
muellerr f629d60aaf Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack 2022-07-23 11:15:20 +02:00
muellerr b66fd63cb4 remove doubly defines 2022-07-23 10:29:19 +02:00
muellerr fd55de9e95 Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack 2022-07-23 10:28:13 +02:00
muellerr 55a238d553 extended serialize if further 2022-07-23 10:24:56 +02:00
muellerr 9ccd9fd775 Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack 2022-07-23 10:07:10 +02:00
muellerr 99aaf7068d some tests 2022-07-23 10:05:57 +02:00
muellerr c9d37e8d62 Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack 2022-07-23 10:05:14 +02:00
muellerr 133894f4ba add basic CCSDS tests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 18:46:58 +02:00
muellerr cb05329dd9 completed baseline PUS TM unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 18:31:00 +02:00
muellerr b350018cad completed basic test set
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 18:22:35 +02:00
muellerr 2dfbce6174 start TM reader unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 17:11:55 +02:00
muellerr cecaec6007 PUS TM creator tests done
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 17:09:44 +02:00
muellerr f28b9ea61b APID getter bugfix
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 16:41:32 +02:00
muellerr 9275ccb79b added some missing implementations
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 16:09:18 +02:00
muellerr 67776241de verify successfull TM serialization
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 16:06:31 +02:00
muellerr bfee4fd90a add empty test files
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-21 19:16:44 +02:00
muellerr 0dfaba81f9 finished basic TC unittests
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-21 19:10:15 +02:00
muellerr affde6bad5 rename namespace
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-21 18:21:10 +02:00
muellerr 0981ee6f7e minor changes, virtual dtors added
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 18:17:37 +02:00
muellerr 61bc867bed delete code which is not used anymore
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 17:57:31 +02:00
muellerr 5af3138e81 fnished PUS TC creator unittests
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 17:48:11 +02:00
muellerr 08e0b0f1a0 added sp reader unittests
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 14:40:00 +02:00
muellerr 23f264096c delete a few old classes
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 14:05:31 +02:00
muellerr e5ee96259d some fixes
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 13:48:58 +02:00
muellerr d8b6cb39ac various bugfixes and improvements
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-21 11:34:11 +02:00
muellerr be35bd53a6 switched to new tmtc stack API
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-20 22:21:15 +02:00
muellerr 9860061fc6 create new TmSendHelper
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-20 11:45:50 +02:00
muellerr d80941514f start refactoring PUS TM handling
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-20 11:43:16 +02:00
muellerr 6c636661b6 a lot of refactoring
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-19 18:13:25 +02:00
muellerr 5fffbd4a90 start PUS TC refactoring
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 18:36:41 +02:00
muellerr 95b476d4bd start ccsds reader unittests 2022-07-18 16:21:00 +02:00
muellerr 3d2af203f2 finished creator unittests
fsfw/fsfw/pipeline/head This commit looks good
2022-07-18 16:18:04 +02:00
muellerr ddf38b65c3 apply auto-formatter
fsfw/fsfw/pipeline/head This commit looks good
2022-07-18 16:07:26 +02:00
muellerr 490a80e49f Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 15:26:31 +02:00
muellerr e4d7182d93 update changelog
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 14:58:47 +02:00
muellerr 7e2fdc06cd hmm this is problematic
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 14:05:43 +02:00
muellerr 3c72a42ce1 added basic sp creator test
fsfw/fsfw/pipeline/head This commit looks good
2022-07-18 13:51:02 +02:00
muellerr 0c5f623780 additional ctor for space packet creator
fsfw/fsfw/pipeline/head This commit looks good
2022-07-18 10:53:55 +02:00
muellerr d7a2eada94 add space packet creator class
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 10:42:56 +02:00
muellerr 546e173cef add new PUS TC IF 2022-07-18 10:29:39 +02:00
muellerr 0a7f2c6646 refactored space packet interface 2022-07-18 10:20:26 +02:00
481 changed files with 11985 additions and 7197 deletions
+11 -5
View File
@@ -8,17 +8,23 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
# [unreleased]
## Changes
- Removed `HasReturnvaluesIF` class in favor of `returnvalue` namespace with `OK` and `FAILED`
constants.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/659
# [v6.0.0]
## Added
- Add new `UnsignedByteField` class
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/660
## Changes
- Removed `HasReturnvaluesIF` class in favor of `returnvalue` namespace with `OK` and `FAILED`
constants.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/659
- Overhaul of the TMTC stack, including various changes and improvements
for other modules
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/655
which also includes a migration guide
# [v5.0.0] 25.07.2022
## Changes
+2 -2
View File
@@ -104,7 +104,8 @@ if(FSFW_GENERATE_SECTIONS)
option(FSFW_REMOVE_UNUSED_CODE "Remove unused code" ON)
endif()
option(FSFW_BUILD_TESTS "Build unittest binary in addition to static library"
option(FSFW_BUILD_TESTS
"Build unittest binary in addition to static library. Requires Catch2"
OFF)
option(FSFW_CICD_BUILD "Build for CI/CD. This can disable problematic test" OFF)
option(FSFW_BUILD_DOCS "Build documentation with Sphinx and Doxygen" OFF)
@@ -115,7 +116,6 @@ endif()
option(FSFW_WARNING_SHADOW_LOCAL_GCC "Enable -Wshadow=local warning in GCC" ON)
# Options to exclude parts of the FSFW from compilation.
option(FSFW_ADD_INTERNAL_TESTS "Add internal unit tests" ON)
option(FSFW_ADD_UNITTESTS "Add regular unittests. Requires Catch2" OFF)
option(FSFW_ADD_HAL "Add Hardware Abstraction Layer" ON)
if(UNIX)
+1 -1
View File
@@ -1,6 +1,6 @@
pipeline {
environment {
BUILDDIR = 'build-tests'
BUILDDIR = 'cmake-build-tests'
}
agent {
docker { image 'fsfw-ci:d3'}
+1
View File
@@ -4,6 +4,7 @@ API
.. toctree::
:maxdepth: 4
api/cfdp
api/objectmanager
api/task
api/ipc
+8
View File
@@ -0,0 +1,8 @@
CFDP API
=================
``UserBase``
-----------------
.. doxygenclass:: cfdp::UserBase
:members:
+8 -6
View File
@@ -7,12 +7,14 @@ Structure
----------
The general structure is driven by the usage of interfaces provided by objects.
The FSFW uses C++11 as baseline. The intention behind this is that this C++ Standard should be
widely available, even with older compilers.
The FSFW uses dynamic allocation during the initialization but provides static containers during runtime.
This simplifies the instantiation of objects and allows the usage of some standard containers.
Dynamic Allocation after initialization is discouraged and different solutions are provided in the
FSFW to achieve that. The fsfw uses run-time type information but exceptions are not allowed.
The FSFW uses C++17 as baseline.
It also uses dynamic allocation during the initialization but provides
static containers during runtime.
This simplifies the instantiation of objects and allows the usage of some
standard containers.
Dynamic Allocation after initialization is discouraged and different solutions
are provided in the FSFW to achieve that. The fsfw uses run-time type
information but will not throw exceptions.
Failure Handling
-----------------
@@ -35,8 +35,8 @@ void Factory::produceFsfwObjects(void) {
}
void Factory::setStaticFrameworkObjectIds() {
PusServiceBase::packetSource = objects::NO_OBJECT;
PusServiceBase::packetDestination = objects::NO_OBJECT;
PusServiceBase::PUS_DISTRIBUTOR = objects::NO_OBJECT;
PusServiceBase::PACKET_DESTINATION = objects::NO_OBJECT;
CommandingServiceBase::defaultPacketSource = objects::NO_OBJECT;
CommandingServiceBase::defaultPacketDestination = objects::NO_OBJECT;
+2 -1
View File
@@ -12,7 +12,8 @@ cmake_fmt="cmake-format"
file_selectors="-iname CMakeLists.txt"
if command -v ${cmake_fmt} &> /dev/null; then
${cmake_fmt} -i CMakeLists.txt
find ./src ${file_selectors} | xargs ${cmake_fmt} -i
find ./src ${file_selectors} | xargs ${cmake_fmt} -i
find ./unittests ${file_selectors} | xargs ${cmake_fmt} -i
else
echo "No ${cmake_fmt} tool found, not formatting CMake files"
fi
+1 -1
View File
@@ -13,7 +13,7 @@ from shutil import which
from typing import List
UNITTEST_FOLDER_NAME = "build-tests"
UNITTEST_FOLDER_NAME = "cmake-build-tests"
DOCS_FOLDER_NAME = "build-docs"
+1
View File
@@ -31,6 +31,7 @@ add_subdirectory(thermal)
add_subdirectory(timemanager)
add_subdirectory(tmtcpacket)
add_subdirectory(tmtcservices)
add_subdirectory(filesystem)
# Optional
+11
View File
@@ -0,0 +1,11 @@
#ifndef FSFW_CFDP_H
#define FSFW_CFDP_H
#include "cfdp/definitions.h"
#include "cfdp/handler/DestHandler.h"
#include "cfdp/handler/FaultHandlerBase.h"
#include "cfdp/tlv/Lv.h"
#include "cfdp/tlv/StringLv.h"
#include "cfdp/tlv/Tlv.h"
#endif // FSFW_CFDP_H
-57
View File
@@ -1,57 +0,0 @@
#include "fsfw/cfdp/CFDPHandler.h"
#include "fsfw/cfdp/CFDPMessage.h"
#include "fsfw/ipc/CommandMessage.h"
#include "fsfw/ipc/QueueFactory.h"
#include "fsfw/objectmanager/ObjectManager.h"
#include "fsfw/storagemanager/storeAddress.h"
#include "fsfw/tmtcservices/AcceptsTelemetryIF.h"
object_id_t CFDPHandler::packetSource = 0;
object_id_t CFDPHandler::packetDestination = 0;
CFDPHandler::CFDPHandler(object_id_t setObjectId, CFDPDistributor* dist)
: SystemObject(setObjectId) {
requestQueue = QueueFactory::instance()->createMessageQueue(CFDP_HANDLER_MAX_RECEPTION);
distributor = dist;
}
CFDPHandler::~CFDPHandler() {}
ReturnValue_t CFDPHandler::initialize() {
ReturnValue_t result = SystemObject::initialize();
if (result != returnvalue::OK) {
return result;
}
this->distributor->registerHandler(this);
return returnvalue::OK;
}
ReturnValue_t CFDPHandler::handleRequest(store_address_t storeId) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::debug << "CFDPHandler::handleRequest" << std::endl;
#else
sif::printDebug("CFDPHandler::handleRequest\n");
#endif /* !FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif
// TODO read out packet from store using storeId
return returnvalue::OK;
}
ReturnValue_t CFDPHandler::performOperation(uint8_t opCode) {
ReturnValue_t status = returnvalue::OK;
CommandMessage currentMessage;
for (status = this->requestQueue->receiveMessage(&currentMessage); status == returnvalue::OK;
status = this->requestQueue->receiveMessage(&currentMessage)) {
store_address_t storeId = CFDPMessage::getStoreId(&currentMessage);
this->handleRequest(storeId);
}
return returnvalue::OK;
}
uint16_t CFDPHandler::getIdentifier() { return 0; }
MessageQueueId_t CFDPHandler::getRequestQueue() { return this->requestQueue->getId(); }
-60
View File
@@ -1,60 +0,0 @@
#ifndef FSFW_CFDP_CFDPHANDLER_H_
#define FSFW_CFDP_CFDPHANDLER_H_
#include "fsfw/ipc/MessageQueueIF.h"
#include "fsfw/objectmanager/SystemObject.h"
#include "fsfw/returnvalues/returnvalue.h"
#include "fsfw/tasks/ExecutableObjectIF.h"
#include "fsfw/tcdistribution/CFDPDistributor.h"
#include "fsfw/tmtcservices/AcceptsTelecommandsIF.h"
namespace Factory {
void setStaticFrameworkObjectIds();
}
class CFDPHandler : public ExecutableObjectIF, public AcceptsTelecommandsIF, public SystemObject {
friend void(Factory::setStaticFrameworkObjectIds)();
public:
CFDPHandler(object_id_t setObjectId, CFDPDistributor* distributor);
/**
* The destructor is empty.
*/
virtual ~CFDPHandler();
virtual ReturnValue_t handleRequest(store_address_t storeId);
virtual ReturnValue_t initialize() override;
virtual uint16_t getIdentifier() override;
MessageQueueId_t getRequestQueue() override;
ReturnValue_t performOperation(uint8_t opCode) override;
protected:
/**
* This is a complete instance of the telecommand reception queue
* of the class. It is initialized on construction of the class.
*/
MessageQueueIF* requestQueue = nullptr;
CFDPDistributor* distributor = nullptr;
/**
* The current CFDP packet to be processed.
* It is deleted after handleRequest was executed.
*/
CFDPPacketStored currentPacket;
static object_id_t packetSource;
static object_id_t packetDestination;
private:
/**
* This constant sets the maximum number of packets accepted per call.
* Remember that one packet must be completely handled in one
* #handleRequest call.
*/
static const uint8_t CFDP_HANDLER_MAX_RECEPTION = 100;
};
#endif /* FSFW_CFDP_CFDPHANDLER_H_ */
-17
View File
@@ -1,17 +0,0 @@
#include "CFDPMessage.h"
CFDPMessage::CFDPMessage() {}
CFDPMessage::~CFDPMessage() {}
void CFDPMessage::setCommand(CommandMessage *message, store_address_t cfdpPacket) {
message->setParameter(cfdpPacket.raw);
}
store_address_t CFDPMessage::getStoreId(const CommandMessage *message) {
store_address_t storeAddressCFDPPacket;
storeAddressCFDPPacket = message->getParameter();
return storeAddressCFDPPacket;
}
void CFDPMessage::clear(CommandMessage *message) {}
+3 -1
View File
@@ -1,4 +1,6 @@
target_sources(${LIB_FSFW_NAME} PRIVATE CFDPHandler.cpp CFDPMessage.cpp)
target_sources(${LIB_FSFW_NAME} PRIVATE CfdpMessage.cpp CfdpDistributor.cpp
VarLenFields.cpp)
add_subdirectory(pdu)
add_subdirectory(tlv)
add_subdirectory(handler)
+54
View File
@@ -0,0 +1,54 @@
#include "CfdpDistributor.h"
#include "fsfw/tcdistribution/definitions.h"
CfdpDistributor::CfdpDistributor(CfdpDistribCfg cfg)
: TcDistributorBase(cfg.objectId, cfg.tcQueue), cfg(cfg) {}
ReturnValue_t CfdpDistributor::registerTcDestination(const cfdp::EntityId& address,
AcceptsTelecommandsIF& tcDest) {
for (const auto& dest : tcDestinations) {
if (dest.id == address) {
return returnvalue::FAILED;
}
}
tcDestinations.emplace_back(address, tcDest.getName(), tcDest.getRequestQueue());
return returnvalue::OK;
}
ReturnValue_t CfdpDistributor::selectDestination(MessageQueueId_t& destId) {
auto accessorPair = cfg.tcStore.getData(currentMessage.getStorageId());
if (accessorPair.first != returnvalue::OK) {
return accessorPair.first;
}
ReturnValue_t result = pduReader.setData(accessorPair.second.data(), accessorPair.second.size());
if (result != returnvalue::OK) {
return result;
}
result = pduReader.parseData();
if (result != returnvalue::OK) {
return result;
}
cfdp::EntityId foundId;
pduReader.getDestId(foundId);
bool destFound = false;
for (const auto& dest : tcDestinations) {
if (dest.id == foundId) {
destId = dest.queueId;
destFound = true;
}
}
if (not destFound) {
// TODO: Warning and event?
return tmtcdistrib::NO_DESTINATION_FOUND;
}
// Packet was forwarded successfully, so do not delete it.
accessorPair.second.release();
return returnvalue::OK;
}
const char* CfdpDistributor::getName() const { return "CFDP Distributor"; }
uint32_t CfdpDistributor::getIdentifier() const { return 0; }
MessageQueueId_t CfdpDistributor::getRequestQueue() const { return tcQueue->getId(); }
+76
View File
@@ -0,0 +1,76 @@
#ifndef FSFW_TCDISTRIBUTION_CFDPDISTRIBUTOR_H_
#define FSFW_TCDISTRIBUTION_CFDPDISTRIBUTOR_H_
#include <utility>
#include <vector>
#include "fsfw/cfdp/pdu/HeaderReader.h"
#include "fsfw/returnvalues/returnvalue.h"
#include "fsfw/tcdistribution/CfdpPacketChecker.h"
#include "fsfw/tcdistribution/TcDistributorBase.h"
#include "fsfw/tmtcpacket/cfdp/CfdpPacketStored.h"
#include "fsfw/tmtcservices/AcceptsTelecommandsIF.h"
#include "fsfw/tmtcservices/VerificationReporter.h"
struct CfdpDistribCfg {
CfdpDistribCfg(object_id_t objectId, StorageManagerIF& tcStore, MessageQueueIF* tcQueue)
: objectId(objectId), tcStore(tcStore), tcQueue(tcQueue) {}
object_id_t objectId;
StorageManagerIF& tcStore;
MessageQueueIF* tcQueue;
};
/**
* This will be the primary component to perform PDU forwading procedures. This includes forwarding
* CFDP TC packets to registered source or destination handlers, and forwarding all telemetry
* generated by them to registered TM sinks.
* @ingroup tc_distribution
*/
class CfdpDistributor : public TcDistributorBase, public AcceptsTelecommandsIF {
public:
/**
* The ctor passes @c set_apid to the checker class and calls the
* TcDistribution ctor with a certain object id.
* @param setApid The APID of this receiving Application.
* @param setObjectId Object ID of the distributor itself
* @param setPacketSource Object ID of the source of TC packets.
* Must implement CcsdsDistributorIF.
*/
explicit CfdpDistributor(CfdpDistribCfg cfg);
[[nodiscard]] const char* getName() const override;
[[nodiscard]] uint32_t getIdentifier() const override;
[[nodiscard]] MessageQueueId_t getRequestQueue() const override;
/**
* Register a new CFDP entity which can receive PDUs.
* @param address
* @param tcDest
* @return
* - @c RETURN_FAILED: Entry already exists for the given address
*/
ReturnValue_t registerTcDestination(const cfdp::EntityId& address, AcceptsTelecommandsIF& tcDest);
protected:
struct EntityInfo {
EntityInfo(cfdp::EntityId id, const char* name, MessageQueueId_t queueId)
: id(std::move(id)), name(name), queueId(queueId) {}
cfdp::EntityId id;
const char* name;
MessageQueueId_t queueId;
};
HeaderReader pduReader;
ReturnValue_t lastTcError = returnvalue::OK;
ReturnValue_t lastTmError = returnvalue::OK;
// I don't think a regular OBSW will have more than 1 or 2 of these destinations, so I think
// it is okay to accept the overhead here
std::vector<EntityInfo> tcDestinations;
CfdpDistribCfg cfg;
ReturnValue_t selectDestination(MessageQueueId_t& destId) override;
private:
};
#endif /* FSFW_TCDISTRIBUTION_CFDPDISTRIBUTOR_H_ */
+54
View File
@@ -0,0 +1,54 @@
//#include "fsfw/cfdp/CfdpHandler.h"
//
//#include "fsfw/cfdp/CfdpMessage.h"
//#include "fsfw/ipc/CommandMessage.h"
//#include "fsfw/ipc/QueueFactory.h"
//#include "fsfw/objectmanager/ObjectManager.h"
//#include "fsfw/storagemanager/storeAddress.h"
//#include "fsfw/tmtcservices/AcceptsTelemetryIF.h"
//
// CfdpHandler::CfdpHandler(object_id_t setObjectId, CfdpHandler* dist)
// : SystemObject(setObjectId) {
// requestQueue = QueueFactory::instance()->createMessageQueue(CFDP_HANDLER_MAX_RECEPTION);
// distributor = dist;
//}
//
// CfdpHandler::~CfdpHandler() = default;
//
// ReturnValue_t CfdpHandler::initialize() {
// ReturnValue_t result = SystemObject::initialize();
// if (result != RETURN_OK) {
// return result;
// }
// this->distributor->registerHandler(this);
// return HasReturnvaluesIF::RETURN_OK;
//}
//
// ReturnValue_t CfdpHandler::handleRequest(store_address_t storeId) {
//#if FSFW_VERBOSE_LEVEL >= 1
//#if FSFW_CPP_OSTREAM_ENABLED == 1
// sif::debug << "CFDPHandler::handleRequest" << std::endl;
//#else
// sif::printDebug("CFDPHandler::handleRequest\n");
//#endif /* !FSFW_CPP_OSTREAM_ENABLED == 1 */
//#endif
//
// // TODO read out packet from store using storeId
//
// return RETURN_OK;
//}
//
// ReturnValue_t CfdpHandler::performOperation(uint8_t opCode) {
// ReturnValue_t status = RETURN_OK;
// CommandMessage currentMessage;
// for (status = this->requestQueue->receiveMessage(&currentMessage); status == RETURN_OK;
// status = this->requestQueue->receiveMessage(&currentMessage)) {
// store_address_t storeId = CfdpMessage::getStoreId(&currentMessage);
// this->handleRequest(storeId);
// }
// return RETURN_OK;
//}
//
// uint32_t CfdpHandler::getIdentifier() const { return 0; }
//
// MessageQueueId_t CfdpHandler::getRequestQueue() const { return this->requestQueue->getId(); }
+63
View File
@@ -0,0 +1,63 @@
//#ifndef FSFW_CFDP_CFDPHANDLER_H_
//#define FSFW_CFDP_CFDPHANDLER_H_
//
//#include "fsfw/ipc/MessageQueueIF.h"
//#include "fsfw/objectmanager/SystemObject.h"
//#include "fsfw/returnvalues/HasReturnvaluesIF.h"
//#include "fsfw/storagemanager/storeAddress.h"
//#include "fsfw/tasks/ExecutableObjectIF.h"
//#include "fsfw/tmtcservices/AcceptsTelecommandsIF.h"
//
// namespace Factory {
// void setStaticFrameworkObjectIds();
//}
//
// class CfdpHandler : public ExecutableObjectIF,
// public AcceptsTelecommandsIF,
// public SystemObject,
// public HasReturnvaluesIF {
// friend void(Factory::setStaticFrameworkObjectIds)();
//
// public:
// CfdpHandler(object_id_t setObjectId, CfdpHandler* distributor);
// /**
// * The destructor is empty.
// */
// virtual ~CfdpHandler();
//
// virtual ReturnValue_t handleRequest(store_address_t storeId);
//
// virtual ReturnValue_t initialize() override;
// virtual uint32_t getIdentifier() const override;
// MessageQueueId_t getRequestQueue() const override;
// ReturnValue_t performOperation(uint8_t opCode) override;
//
// protected:
// /**
// * This is a complete instance of the telecommand reception queue
// * of the class. It is initialized on construction of the class.
// */
// MessageQueueIF* requestQueue = nullptr;
//
// CfdpHandler* distributor = nullptr;
//
// /**
// * The current CFDP packet to be processed.
// * It is deleted after handleRequest was executed.
// */
// CfdpPacketStored currentPacket;
//
// static object_id_t packetSource;
//
// static object_id_t packetDestination;
//
// private:
// /**
// * This constant sets the maximum number of packets accepted per call.
// * Remember that one packet must be completely handled in one
// * #handleRequest call.
// */
// static const uint8_t CFDP_HANDLER_MAX_RECEPTION = 100;
//};
//
//#endif /* FSFW_CFDP_CFDPHANDLER_H_ */
+17
View File
@@ -0,0 +1,17 @@
#include "CfdpMessage.h"
CfdpMessage::CfdpMessage() = default;
CfdpMessage::~CfdpMessage() = default;
void CfdpMessage::setCommand(CommandMessage *message, store_address_t cfdpPacket) {
message->setParameter(cfdpPacket.raw);
}
store_address_t CfdpMessage::getStoreId(const CommandMessage *message) {
store_address_t storeId;
storeId = static_cast<store_address_t>(message->getParameter());
return storeId;
}
void CfdpMessage::clear(CommandMessage *message) {}
@@ -5,14 +5,14 @@
#include "fsfw/objectmanager/ObjectManagerIF.h"
#include "fsfw/storagemanager/StorageManagerIF.h"
class CFDPMessage {
class CfdpMessage {
private:
CFDPMessage();
CfdpMessage();
public:
static const uint8_t MESSAGE_ID = messagetypes::CFDP;
virtual ~CFDPMessage();
virtual ~CfdpMessage();
static void setCommand(CommandMessage* message, store_address_t cfdpPacket);
static store_address_t getStoreId(const CommandMessage* message);
+6 -6
View File
@@ -1,5 +1,5 @@
#ifndef FSFW_SRC_FSFW_CFDP_FILESIZE_H_
#define FSFW_SRC_FSFW_CFDP_FILESIZE_H_
#ifndef FSFW_CFDP_FILESIZE_H_
#define FSFW_CFDP_FILESIZE_H_
#include "fsfw/serialize/SerializeAdapter.h"
#include "fsfw/serialize/SerializeIF.h"
@@ -10,7 +10,7 @@ struct FileSize : public SerializeIF {
public:
FileSize() : largeFile(false){};
FileSize(uint64_t fileSize, bool isLarge = false) { setFileSize(fileSize, isLarge); };
explicit FileSize(uint64_t fileSize, bool isLarge = false) { setFileSize(fileSize, isLarge); };
ReturnValue_t serialize(bool isLarge, uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) {
@@ -27,7 +27,7 @@ struct FileSize : public SerializeIF {
return SerializeAdapter::serialize(&fileSize, buffer, size, maxSize, streamEndianness);
}
size_t getSerializedSize() const override {
[[nodiscard]] size_t getSerializedSize() const override {
if (largeFile) {
return 8;
} else {
@@ -60,7 +60,7 @@ struct FileSize : public SerializeIF {
return returnvalue::OK;
}
bool isLargeFile() const { return largeFile; }
[[nodiscard]] bool isLargeFile() const { return largeFile; }
uint64_t getSize(bool *largeFile = nullptr) const {
if (largeFile != nullptr) {
*largeFile = this->largeFile;
@@ -75,4 +75,4 @@ struct FileSize : public SerializeIF {
} // namespace cfdp
#endif /* FSFW_SRC_FSFW_CFDP_FILESIZE_H_ */
#endif /* FSFW_CFDP_FILESIZE_H_ */
@@ -1,6 +1,5 @@
#include "VarLenField.h"
#include "VarLenFields.h"
#include "fsfw/FSFW.h"
#include "fsfw/serialize/SerializeAdapter.h"
#include "fsfw/serviceinterface.h"
@@ -21,27 +20,27 @@ cfdp::VarLenField::VarLenField() : width(cfdp::WidthInBytes::ONE_BYTE) { value.o
cfdp::WidthInBytes cfdp::VarLenField::getWidth() const { return width; }
ReturnValue_t cfdp::VarLenField::setValue(cfdp::WidthInBytes widthInBytes, size_t value) {
ReturnValue_t cfdp::VarLenField::setValue(cfdp::WidthInBytes widthInBytes, size_t value_) {
switch (widthInBytes) {
case (cfdp::WidthInBytes::ONE_BYTE): {
if (value > UINT8_MAX) {
if (value_ > UINT8_MAX) {
return returnvalue::FAILED;
}
this->value.oneByte = value;
this->value.oneByte = value_;
break;
}
case (cfdp::WidthInBytes::TWO_BYTES): {
if (value > UINT16_MAX) {
if (value_ > UINT16_MAX) {
return returnvalue::FAILED;
}
this->value.twoBytes = value;
this->value.twoBytes = value_;
break;
}
case (cfdp::WidthInBytes::FOUR_BYTES): {
if (value > UINT32_MAX) {
if (value_ > UINT32_MAX) {
return returnvalue::FAILED;
}
this->value.fourBytes = value;
this->value.fourBytes = value_;
break;
}
default: {
@@ -93,9 +92,9 @@ ReturnValue_t cfdp::VarLenField::serialize(uint8_t **buffer, size_t *size, size_
size_t cfdp::VarLenField::getSerializedSize() const { return width; }
ReturnValue_t cfdp::VarLenField::deSerialize(cfdp::WidthInBytes width, const uint8_t **buffer,
ReturnValue_t cfdp::VarLenField::deSerialize(cfdp::WidthInBytes width_, const uint8_t **buffer,
size_t *size, Endianness streamEndianness) {
this->width = width;
this->width = width_;
return deSerialize(buffer, size, streamEndianness);
}
@@ -118,3 +117,17 @@ ReturnValue_t cfdp::VarLenField::deSerialize(const uint8_t **buffer, size_t *siz
}
}
}
bool cfdp::VarLenField::operator<(const cfdp::VarLenField &other) const {
if (getWidth() < other.getWidth()) {
return true;
} else if (getWidth() == other.getWidth()) {
return getValue() < other.getValue();
} else {
return false;
}
}
bool cfdp::VarLenField::operator==(const cfdp::VarLenField &other) const {
return getWidth() == other.getWidth() and getValue() == other.getValue();
}
+91
View File
@@ -0,0 +1,91 @@
#ifndef FSFW_CFDP_PDU_VARLENFIELD_H_
#define FSFW_CFDP_PDU_VARLENFIELD_H_
#include <cstddef>
#include <cstdint>
#include <utility>
#include "fsfw/cfdp/definitions.h"
#include "fsfw/serialize/SerializeIF.h"
#include "fsfw/util/UnsignedByteField.h"
namespace cfdp {
class VarLenField : public SerializeIF {
public:
union LengthFieldLen {
uint8_t oneByte;
uint16_t twoBytes;
uint32_t fourBytes;
uint64_t eightBytes;
};
VarLenField();
template <typename T>
explicit VarLenField(UnsignedByteField<T> byteField);
VarLenField(cfdp::WidthInBytes width, size_t value);
bool operator==(const VarLenField &other) const;
bool operator<(const VarLenField &other) const;
ReturnValue_t setValue(cfdp::WidthInBytes, size_t value);
ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const override;
[[nodiscard]] size_t getSerializedSize() const override;
ReturnValue_t deSerialize(cfdp::WidthInBytes width, const uint8_t **buffer, size_t *size,
Endianness streamEndianness);
[[nodiscard]] cfdp::WidthInBytes getWidth() const;
[[nodiscard]] size_t getValue() const;
private:
ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
Endianness streamEndianness) override;
cfdp::WidthInBytes width;
LengthFieldLen value{};
};
template <typename T>
cfdp::VarLenField::VarLenField(UnsignedByteField<T> byteField)
: width(static_cast<cfdp::WidthInBytes>(sizeof(T))) {
static_assert((sizeof(T) % 2) == 0);
setValue(width, byteField.getValue());
}
struct EntityId : public VarLenField {
public:
EntityId() : VarLenField() {}
template <typename T>
explicit EntityId(UnsignedByteField<T> byteField) : VarLenField(byteField) {}
EntityId(cfdp::WidthInBytes width, size_t entityId) : VarLenField(width, entityId) {}
};
struct TransactionSeqNum : public VarLenField {
public:
TransactionSeqNum() : VarLenField() {}
template <typename T>
explicit TransactionSeqNum(UnsignedByteField<T> byteField) : VarLenField(byteField) {}
TransactionSeqNum(cfdp::WidthInBytes width, size_t seqNum) : VarLenField(width, seqNum) {}
};
struct TransactionId {
TransactionId() = default;
TransactionId(EntityId entityId, TransactionSeqNum seqNum)
: entityId(std::move(entityId)), seqNum(std::move(seqNum)) {}
bool operator==(const TransactionId &other) {
return entityId == other.entityId and seqNum == other.seqNum;
}
EntityId entityId;
TransactionSeqNum seqNum;
};
} // namespace cfdp
#endif /* FSFW_CFDP_PDU_VARLENFIELD_H_ */
+22 -10
View File
@@ -11,7 +11,11 @@
namespace cfdp {
static constexpr uint8_t VERSION_BITS = 0b00100000;
static constexpr char CFDP_VERSION_2_NAME[] = "CCSDS 727.0-B-5";
// Second version of the protocol, only this one is supported here
static constexpr uint8_t CFDP_VERSION_2 = 0b001;
static constexpr uint8_t VERSION_BITS = CFDP_VERSION_2 << 5;
static constexpr uint8_t CFDP_CLASS_ID = CLASS_ID::CFDP;
@@ -45,17 +49,17 @@ enum ChecksumType {
NULL_CHECKSUM = 15
};
enum PduType : bool { FILE_DIRECTIVE = 0, FILE_DATA = 1 };
enum PduType : uint8_t { FILE_DIRECTIVE = 0, FILE_DATA = 1 };
enum TransmissionModes : bool { ACKNOWLEDGED = 0, UNACKNOWLEDGED = 1 };
enum TransmissionModes : uint8_t { ACKNOWLEDGED = 0, UNACKNOWLEDGED = 1 };
enum SegmentMetadataFlag : bool { NOT_PRESENT = 0, PRESENT = 1 };
enum SegmentMetadataFlag : bool { NOT_PRESENT = false, PRESENT = true };
enum Direction : bool { TOWARDS_RECEIVER = 0, TOWARDS_SENDER = 1 };
enum Direction : uint8_t { TOWARDS_RECEIVER = 0, TOWARDS_SENDER = 1 };
enum SegmentationControl : bool {
NO_RECORD_BOUNDARIES_PRESERVATION = 0,
RECORD_BOUNDARIES_PRESERVATION = 1
NO_RECORD_BOUNDARIES_PRESERVATION = false,
RECORD_BOUNDARIES_PRESERVATION = true
};
enum WidthInBytes : uint8_t {
@@ -93,6 +97,14 @@ enum ConditionCode : uint8_t {
CANCEL_REQUEST_RECEIVED = 0b1111
};
enum FaultHandlerCodes {
RESERVED = 0b0000,
NOTICE_OF_CANCELLATION = 0b0001,
NOTICE_OF_SUSPENSION = 0b0010,
IGNORE_ERROR = 0b0011,
ABANDON_TRANSACTION = 0b0100
};
enum AckTransactionStatus {
UNDEFINED = 0b00,
ACTIVE = 0b01,
@@ -100,16 +112,16 @@ enum AckTransactionStatus {
UNRECOGNIZED = 0b11
};
enum FinishedDeliveryCode { DATA_COMPLETE = 0, DATA_INCOMPLETE = 1 };
enum FileDeliveryCode { DATA_COMPLETE = 0, DATA_INCOMPLETE = 1 };
enum FinishedFileStatus {
enum FileDeliveryStatus {
DISCARDED_DELIBERATELY = 0,
DISCARDED_FILESTORE_REJECTION = 1,
RETAINED_IN_FILESTORE = 2,
FILE_STATUS_UNREPORTED = 3
};
enum PromptResponseRequired : bool { PROMPT_NAK = 0, PROMPT_KEEP_ALIVE = 1 };
enum PromptResponseRequired : uint8_t { PROMPT_NAK = 0, PROMPT_KEEP_ALIVE = 1 };
enum TlvTypes : uint8_t {
FILESTORE_REQUEST = 0x00,
+2
View File
@@ -0,0 +1,2 @@
target_sources(${LIB_FSFW_NAME} PRIVATE SourceHandler.cpp DestHandler.cpp
FaultHandlerBase.cpp UserBase.cpp)
+188
View File
@@ -0,0 +1,188 @@
#include "DestHandler.h"
#include <utility>
#include "fsfw/cfdp/pdu/HeaderReader.h"
#include "fsfw/objectmanager.h"
#include "fsfw/serviceinterface.h"
using namespace returnvalue;
cfdp::DestHandler::DestHandler(DestHandlerParams params, FsfwParams fsfwParams)
: tlvVec(params.maxTlvsInOnePdu),
userTlvVec(params.maxTlvsInOnePdu),
dp(std::move(params)),
fp(fsfwParams),
tp(params.maxFilenameLen) {
tp.pduConf.direction = cfdp::Direction::TOWARDS_SENDER;
}
ReturnValue_t cfdp::DestHandler::performStateMachine() {
if (step == TransactionStep::IDLE) {
ReturnValue_t status = returnvalue::OK;
ReturnValue_t result;
for(auto infoIter = dp.packetListRef.begin(); infoIter != dp.packetListRef.end();) {
if (infoIter->pduType == PduType::FILE_DIRECTIVE and
infoIter->directiveType == FileDirectives::METADATA) {
result = handleMetadataPdu(*infoIter);
if (result != OK) {
status = result;
}
fp.tcStore->deleteData(infoIter->storeId);
dp.packetListRef.erase(infoIter++);
}
}
if (step != TransactionStep::IDLE) {
return CALL_FSM_AGAIN;
}
return status;
}
if (cfdpState == CfdpStates::BUSY_CLASS_1_NACKED) {
for (const auto& info : dp.packetListRef) {
if (info.pduType == PduType::FILE_DATA) {
}
}
return returnvalue::OK;
}
if (cfdpState == CfdpStates::BUSY_CLASS_2_ACKED) {
// TODO: Will be implemented at a later stage
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "CFDP state machine for acknowledged mode not implemented yet" << std::endl;
#endif
}
return returnvalue::OK;
}
ReturnValue_t cfdp::DestHandler::passPacket(PacketInfo packet) {
if (dp.packetListRef.full()) {
return returnvalue::FAILED;
}
dp.packetListRef.push_back(packet);
return returnvalue::OK;
}
ReturnValue_t cfdp::DestHandler::initialize() {
if (fp.tmStore == nullptr) {
fp.tmStore = ObjectManager::instance()->get<StorageManagerIF>(objects::TM_STORE);
if (fp.tmStore == nullptr) {
return returnvalue::FAILED;
}
}
if (fp.tcStore == nullptr) {
fp.tcStore = ObjectManager::instance()->get<StorageManagerIF>(objects::TC_STORE);
if (fp.tcStore == nullptr) {
return returnvalue::FAILED;
}
}
return returnvalue::OK;
}
ReturnValue_t cfdp::DestHandler::handleMetadataPdu(const PacketInfo& info) {
// Process metadata PDU
auto constAccessorPair = fp.tcStore->getData(info.storeId);
if (constAccessorPair.first != OK) {
// TODO: This is not a CFDP error. Event and/or warning?
return constAccessorPair.first;
}
cfdp::StringLv sourceFileName;
cfdp::StringLv destFileName;
MetadataInfo metadataInfo(tp.fileSize, sourceFileName, destFileName);
cfdp::Tlv* tlvArrayAsPtr = tlvVec.data();
metadataInfo.setOptionsArray(&tlvArrayAsPtr, std::nullopt, tlvVec.size());
MetadataPduReader reader(constAccessorPair.second.data(), constAccessorPair.second.size(),
metadataInfo);
ReturnValue_t result = reader.parseData();
// TODO: The standard does not really specify what happens if this kind of error happens
// I think it might be a good idea to cache some sort of error code, which
// is translated into a warning and/or event by an upper layer
if (result != OK) {
return handleMetadataParseError(constAccessorPair.second.data(),
constAccessorPair.second.size());
}
return startTransaction(reader, metadataInfo);
}
ReturnValue_t cfdp::DestHandler::handleMetadataParseError(const uint8_t* rawData, size_t maxSize) {
// TODO: try to extract destination ID for error
// TODO: Invalid metadata PDU.
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "Parsing Metadata PDU failed with code " << result << std::endl;
#else
#endif
HeaderReader headerReader(rawData, maxSize);
ReturnValue_t result = headerReader.parseData();
if (result != OK) {
// TODO: Now this really should not happen. Warning or error,
// yield or cache appropriate returnvalue
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "Parsing Header failed" << std::endl;
#else
#endif
// TODO: Trigger appropriate event
return result;
}
cfdp::EntityId destId;
headerReader.getDestId(destId);
RemoteEntityCfg* remoteCfg;
if (not dp.remoteCfgTable.getRemoteCfg(destId, &remoteCfg)) {
// TODO: No remote config for dest ID. I consider this a configuration error.
// Warning or error, yield or cache appropriate returnvalue
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "No remote config exists for destination ID" << std::endl;
#else
#endif
// TODO: Trigger appropriate event
}
// TODO: Appropriate returnvalue?
return returnvalue::FAILED;
}
ReturnValue_t cfdp::DestHandler::startTransaction(MetadataPduReader& reader, MetadataInfo& info) {
if (cfdpState != CfdpStates::IDLE) {
// According to standard, discard metadata PDU if we are busy
return returnvalue::OK;
}
step = TransactionStep::TRANSACTION_START;
if (reader.getTransmissionMode() == TransmissionModes::UNACKNOWLEDGED) {
cfdpState = CfdpStates::BUSY_CLASS_1_NACKED;
} else if (reader.getTransmissionMode() == TransmissionModes::ACKNOWLEDGED) {
cfdpState = CfdpStates::BUSY_CLASS_2_ACKED;
}
tp.checksumType = info.getChecksumType();
tp.closureRequested = info.isClosureRequested();
size_t sourceNameSize = 0;
const uint8_t* sourceNamePtr = info.getSourceFileName().getValue(&sourceNameSize);
if (sourceNameSize > tp.sourceName.size()) {
// TODO: Warning, event etc.
return FAILED;
}
std::memcpy(tp.sourceName.data(), sourceNamePtr, sourceNameSize);
tp.sourceName[sourceNameSize] = '\0';
size_t destNameSize = 0;
const uint8_t* destNamePtr = info.getDestFileName().getValue(&destNameSize);
if (destNameSize > tp.destName.size()) {
// TODO: Warning, event etc.
return FAILED;
}
std::memcpy(tp.destName.data(), destNamePtr, destNameSize);
tp.destName[destNameSize] = '\0';
reader.fillConfig(tp.pduConf);
tp.pduConf.direction = Direction::TOWARDS_SENDER;
tp.transactionId.entityId = tp.pduConf.sourceId;
tp.transactionId.seqNum = tp.pduConf.seqNum;
if (not dp.remoteCfgTable.getRemoteCfg(tp.pduConf.destId, &tp.remoteCfg)) {
// TODO: Warning, event etc.
return FAILED;
}
step = TransactionStep::RECEIVING_FILE_DATA_PDUS;
MetadataRecvdParams params(tp.transactionId, tp.pduConf.sourceId);
params.fileSize = tp.fileSize.getSize();
params.destFileName = tp.destName.data();
params.sourceFileName = tp.sourceName.data();
params.msgsToUserArray = dynamic_cast<MessageToUserTlv*>(userTlvVec.data());
params.msgsToUserLen = info.getOptionsLen();
dp.user.metadataRecvdIndication(params);
return OK;
}
cfdp::CfdpStates cfdp::DestHandler::getCfdpState() const { return cfdpState; }
+120
View File
@@ -0,0 +1,120 @@
#ifndef FSFW_CFDP_CFDPDESTHANDLER_H
#define FSFW_CFDP_CFDPDESTHANDLER_H
#include <etl/list.h>
#include <utility>
#include "RemoteConfigTableIF.h"
#include "UserBase.h"
#include "defs.h"
#include "fsfw/cfdp/handler/mib.h"
#include "fsfw/cfdp/pdu/MetadataPduReader.h"
#include "fsfw/cfdp/pdu/PduConfig.h"
#include "fsfw/container/DynamicFIFO.h"
#include "fsfw/storagemanager/StorageManagerIF.h"
#include "fsfw/storagemanager/storeAddress.h"
#include "fsfw/tmtcservices/AcceptsTelemetryIF.h"
namespace cfdp {
struct PacketInfo {
PacketInfo(PduType type, FileDirectives directive, store_address_t storeId)
: pduType(type), directiveType(directive), storeId(storeId) {}
PduType pduType = PduType::FILE_DATA;
FileDirectives directiveType = FileDirectives::INVALID_DIRECTIVE;
store_address_t storeId = store_address_t::invalid();
PacketInfo() = default;
};
struct DestHandlerParams {
DestHandlerParams(LocalEntityCfg cfg, UserBase& user, RemoteConfigTableIF& remoteCfgTable,
etl::ilist<PacketInfo>& packetList)
: cfg(std::move(cfg)),
user(user),
remoteCfgTable(remoteCfgTable),
packetListRef(packetList) {}
LocalEntityCfg cfg;
UserBase& user;
RemoteConfigTableIF& remoteCfgTable;
etl::ilist<PacketInfo>& packetListRef;
uint8_t maxTlvsInOnePdu = 10;
size_t maxFilenameLen = 255;
};
struct FsfwParams {
FsfwParams(AcceptsTelemetryIF& packetDest, MessageQueueIF& msgQueue,
EventReportingProxyIF& eventReporter)
: packetDest(packetDest), msgQueue(msgQueue), eventReporter(eventReporter) {}
AcceptsTelemetryIF& packetDest;
MessageQueueIF& msgQueue;
EventReportingProxyIF& eventReporter;
StorageManagerIF* tcStore = nullptr;
StorageManagerIF* tmStore = nullptr;
};
class DestHandler {
public:
/**
* Will be returned if it is advisable to call the state machine operation call again
*/
ReturnValue_t CALL_FSM_AGAIN = returnvalue::makeCode(1, 0);
explicit DestHandler(DestHandlerParams handlerParams, FsfwParams fsfwParams);
/**
*
* @return
* - @c returnvalue::OK State machine OK for this execution cycle
* - @c CALL_FSM_AGAIN State machine should be called again.
*/
ReturnValue_t performStateMachine();
ReturnValue_t passPacket(PacketInfo packet);
ReturnValue_t initialize();
ReturnValue_t handleMetadataPdu(const PacketInfo& info);
ReturnValue_t handleMetadataParseError(const uint8_t* rawData, size_t maxSize);
[[nodiscard]] CfdpStates getCfdpState() const;
private:
enum class TransactionStep {
IDLE = 0,
TRANSACTION_START = 1,
RECEIVING_FILE_DATA_PDUS = 2,
SENDING_ACK_PDU = 3,
TRANSFER_COMPLETION = 4,
SENDING_FINISHED_PDU = 5
};
struct TransactionParams {
explicit TransactionParams(size_t maxFileNameLen)
: sourceName(maxFileNameLen), destName(maxFileNameLen) {}
ChecksumType checksumType = ChecksumType::NULL_CHECKSUM;
bool closureRequested{};
std::vector<char> sourceName;
std::vector<char> destName;
cfdp::FileSize fileSize;
TransactionId transactionId;
PduConfig pduConf;
RemoteEntityCfg* remoteCfg = nullptr;
};
TransactionStep step = TransactionStep::IDLE;
CfdpStates cfdpState = CfdpStates::IDLE;
std::vector<cfdp::Tlv> tlvVec;
std::vector<cfdp::Tlv> userTlvVec;
DestHandlerParams dp;
FsfwParams fp;
TransactionParams tp;
ReturnValue_t startTransaction(MetadataPduReader& reader, MetadataInfo& info);
};
} // namespace cfdp
#endif // FSFW_CFDP_CFDPDESTHANDLER_H
@@ -0,0 +1,51 @@
#include "FaultHandlerBase.h"
namespace cfdp {
FaultHandlerBase::FaultHandlerBase() = default;
FaultHandlerBase::~FaultHandlerBase() = default;
bool FaultHandlerBase::getFaultHandler(cfdp::ConditionCode code,
cfdp::FaultHandlerCodes& handler) const {
auto iter = faultHandlerMap.find(code);
if (iter == faultHandlerMap.end()) {
return false;
}
handler = iter->second;
return true;
}
bool FaultHandlerBase::setFaultHandler(cfdp::ConditionCode code, cfdp::FaultHandlerCodes handler) {
if (not faultHandlerMap.contains(code)) {
return false;
}
if (handler != FaultHandlerCodes::NOTICE_OF_SUSPENSION and
handler != FaultHandlerCodes::ABANDON_TRANSACTION and
handler != FaultHandlerCodes::NOTICE_OF_CANCELLATION and
handler != FaultHandlerCodes::IGNORE_ERROR) {
return false;
}
faultHandlerMap[code] = handler;
return true;
}
bool FaultHandlerBase::reportFault(cfdp::ConditionCode code) {
if (not faultHandlerMap.contains(code)) {
return false;
}
cfdp::FaultHandlerCodes fh = faultHandlerMap[code];
if (fh == cfdp::FaultHandlerCodes::IGNORE_ERROR) {
ignoreCb(code);
} else if (fh == cfdp::FaultHandlerCodes::ABANDON_TRANSACTION) {
abandonCb(code);
} else if (fh == cfdp::FaultHandlerCodes::NOTICE_OF_CANCELLATION) {
noticeOfCancellationCb(code);
} else if (fh == cfdp::FaultHandlerCodes::NOTICE_OF_SUSPENSION) {
noticeOfSuspensionCb(code);
} else {
// Should never happen, but use defensive programming
return false;
}
return true;
}
} // namespace cfdp
+76
View File
@@ -0,0 +1,76 @@
#ifndef FSFW_CFDP_FAULTHANDLERBASE_H
#define FSFW_CFDP_FAULTHANDLERBASE_H
#include <etl/flat_map.h>
#include "fsfw/cfdp/definitions.h"
namespace cfdp {
/**
* @brief Provides a way to implement the fault handling procedures as specified
* in chapter 4.8 of the CFDP standard.
*
* @details
* It is passed into the CFDP handlers as part of the local entity configuration and provides
* a way to specify custom user error handlers.
*
* It does so by mapping each applicable CFDP condition code to a fault handler which
* is denoted by the four @cfdp::FaultHandlerCodes. This code is used to dispatch
* to a user-provided callback function:
*
* 1. @FaultHandlerCodes::IGNORE_ERROR -> @ignore_cb
* 2. @FaultHandlerCodes::NOTICE_OF_CANCELLATION` -> @notice_of_cancellation_cb
* 3. @FaultHandlerCodes::NOTICE_OF_SUSPENSION` -> @notice_of_suspension_cb
* 4. @FaultHandlerCodes::ABANDON_TRANSACTION` -> @abandon_transaction_cb
*
* For each error reported by @reportError, the appropriate fault handler callback
* will be called. The user provides the callbacks by providing a custom class which implements
* these base class and all abstract fault handler callbacks.
*/
class FaultHandlerBase {
public:
virtual ~FaultHandlerBase();
FaultHandlerBase();
/**
* Get the fault handler code for the given condition code
* @param code
* @param handler [out] Will be set to the approrpiate handler for the condition code if
* it is valid
* @return
* - true if the condition code is valid
* - false otherwise
*/
bool getFaultHandler(cfdp::ConditionCode code, cfdp::FaultHandlerCodes& handler) const;
bool setFaultHandler(cfdp::ConditionCode code, cfdp::FaultHandlerCodes handler);
bool reportFault(cfdp::ConditionCode code);
virtual void noticeOfSuspensionCb(cfdp::ConditionCode code) = 0;
virtual void noticeOfCancellationCb(cfdp::ConditionCode code) = 0;
virtual void abandonCb(cfdp::ConditionCode code) = 0;
virtual void ignoreCb(cfdp::ConditionCode code) = 0;
private:
etl::flat_map<cfdp::ConditionCode, cfdp::FaultHandlerCodes, 10> faultHandlerMap = {
etl::pair{cfdp::ConditionCode::POSITIVE_ACK_LIMIT_REACHED,
cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::KEEP_ALIVE_LIMIT_REACHED,
cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::INVALID_TRANSMISSION_MODE,
cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::FILE_CHECKSUM_FAILURE, cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::FILE_SIZE_ERROR, cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::NAK_LIMIT_REACHED, cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::INACTIVITY_DETECTED, cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::UNSUPPORTED_CHECKSUM_TYPE,
cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::FILESTORE_REJECTION, cfdp::FaultHandlerCodes::IGNORE_ERROR},
etl::pair{cfdp::ConditionCode::CHECK_LIMIT_REACHED, cfdp::FaultHandlerCodes::IGNORE_ERROR}};
};
} // namespace cfdp
#endif // FSFW_CFDP_FAULTHANDLERBASE_H
@@ -0,0 +1,16 @@
#ifndef FSFW_CFDP_HANDLER_REMOTECONFIGTABLEIF_H
#define FSFW_CFDP_HANDLER_REMOTECONFIGTABLEIF_H
#include "fsfw/cfdp/handler/mib.h"
namespace cfdp {
class RemoteConfigTableIF {
public:
virtual ~RemoteConfigTableIF() = default;
virtual bool getRemoteCfg(const cfdp::EntityId& remoteId, cfdp::RemoteEntityCfg** cfg) = 0;
};
} // namespace cfdp
#endif // FSFW_CFDP_HANDLER_REMOTECONFIGTABLEIF_H
+1
View File
@@ -0,0 +1 @@
#include "SourceHandler.h"
+6
View File
@@ -0,0 +1,6 @@
#ifndef FSFW_CFDP_CFDPSOURCEHANDLER_H
#define FSFW_CFDP_CFDPSOURCEHANDLER_H
class SourceHandler {};
#endif // FSFW_CFDP_CFDPSOURCEHANDLER_H
+12
View File
@@ -0,0 +1,12 @@
#ifndef FSFW_CFDP_HANDLER_STATUSREPORTIF_H
#define FSFW_CFDP_HANDLER_STATUSREPORTIF_H
namespace cfdp {
class StatusReportIF {
virtual ~StatusReportIF() = default;
};
} // namespace cfdp
#endif // FSFW_CFDP_HANDLER_STATUSREPORTIF_H
+3
View File
@@ -0,0 +1,3 @@
#include "UserBase.h"
cfdp::UserBase::UserBase(HasFileSystemIF& vfs) : vfs(vfs) {}
+99
View File
@@ -0,0 +1,99 @@
#ifndef FSFW_CFDP_USERBASE_H
#define FSFW_CFDP_USERBASE_H
#include <optional>
#include <utility>
#include <vector>
#include "StatusReportIF.h"
#include "fsfw/cfdp/VarLenFields.h"
#include "fsfw/cfdp/tlv/FilestoreResponseTlv.h"
#include "fsfw/cfdp/tlv/MessageToUserTlv.h"
#include "fsfw/filesystem/HasFileSystemIF.h"
namespace cfdp {
struct TransactionFinishedParams {
TransactionFinishedParams(TransactionId id, ConditionCode code, FileDeliveryStatus status,
FileDeliveryCode delivCode)
: id(std::move(id)), condCode(code), status(status), deliveryCode(delivCode) {}
TransactionId id;
ConditionCode condCode;
FileDeliveryStatus status;
FileDeliveryCode deliveryCode;
std::vector<FilestoreResponseTlv*> fsResponses;
StatusReportIF* statusReport = nullptr;
};
struct MetadataRecvdParams {
MetadataRecvdParams(const TransactionId& id, const EntityId& sourceId)
: id(id), sourceId(sourceId) {}
const TransactionId& id;
const EntityId& sourceId;
uint64_t fileSize = 0;
const char* sourceFileName = "";
const char* destFileName = "";
size_t msgsToUserLen = 0;
const MessageToUserTlv* msgsToUserArray = nullptr;
};
struct FileSegmentRecvdParams {
TransactionId id;
size_t offset;
size_t length;
std::optional<RecordContinuationState> recContState = std::nullopt;
std::pair<const uint8_t*, size_t> segmentMetadata;
};
/**
* @brief Base class which provides a user interface to interact with CFDP handlers.
*
* @details
* This class is also used to pass the Virtual Filestore (VFS) Implementation to the CFDP
* handlers so the filestore operations can be mapped to the underlying filestore.
*
* It is used by implementing it in a child class and then passing it to the CFDP
* handler objects. The base class provides default implementation for the user indication
* primitives specified in the CFDP standard. The user can override these implementations
* to provide custom indication handlers.
*
* Please note that for all indication callbacks, the passed transaction ID reference will
* become invalid shortly after the function has been executed. If the transaction ID is to be
* cached or used, create an own copy of it.
* @param vfs Virtual Filestore Object. Will be used for all file operations
*/
class UserBase {
public:
explicit UserBase(HasFileSystemIF& vfs);
virtual void transactionIndication(const TransactionId& id) = 0;
virtual void eofSentIndication(const TransactionId& id) = 0;
virtual void transactionFinishedIndication(const TransactionFinishedParams& params) = 0;
/**
* Will be called if metadata was received.
*
* IMPORTANT: The passed struct contains the messages to the user in form of a raw C array.
* The TLVs in these arrays are zero-copy types, which means that they point to the raw data
* inside the metadata packet directly. The metadata packet will be deleted from the TC store
* shortly after it was processed. If some of the data is to be cached and/or used after the
* function call, it needs to be copied into another user-provided buffer.
* @param params
*/
virtual void metadataRecvdIndication(const MetadataRecvdParams& params) = 0;
virtual void fileSegmentRecvdIndication(const FileSegmentRecvdParams& params) = 0;
virtual void reportIndication(const TransactionId& id, StatusReportIF& report) = 0;
virtual void suspendedIndication(const TransactionId& id, ConditionCode code) = 0;
virtual void resumedIndication(const TransactionId& id, size_t progress) = 0;
virtual void faultIndication(const TransactionId& id, ConditionCode code, size_t progress) = 0;
virtual void abandonedIndication(const TransactionId& id, ConditionCode code,
size_t progress) = 0;
virtual void eofRecvIndication(const TransactionId& id) = 0;
private:
HasFileSystemIF& vfs;
};
} // namespace cfdp
#endif // FSFW_CFDP_USERBASE_H
+9
View File
@@ -0,0 +1,9 @@
#ifndef FSFW_CFDP_HANDLER_DEFS_H
#define FSFW_CFDP_HANDLER_DEFS_H
namespace cfdp {
enum class CfdpStates { IDLE, BUSY_CLASS_1_NACKED, BUSY_CLASS_2_ACKED, SUSPENDED };
}
#endif // FSFW_CFDP_HANDLER_DEFS_H
+41
View File
@@ -0,0 +1,41 @@
#ifndef FSFW_CFDP_MIB_H
#define FSFW_CFDP_MIB_H
#include <utility>
#include "FaultHandlerBase.h"
#include "fsfw/cfdp/pdu/PduConfig.h"
namespace cfdp {
struct IndicationCfg {
bool eofSentIndicRequired = true;
bool eofRecvIndicRequired = true;
bool fileSegmentRecvIndicRequired = true;
bool transactionFinishedIndicRequired = true;
bool suspendedIndicRequired = true;
bool resumedIndicRequired = true;
};
struct LocalEntityCfg {
LocalEntityCfg(EntityId localId, IndicationCfg indicationCfg, FaultHandlerBase& fhBase)
: localId(std::move(localId)), indicCfg(indicationCfg), fhBase(fhBase) {}
EntityId localId;
IndicationCfg indicCfg;
FaultHandlerBase& fhBase;
};
struct RemoteEntityCfg {
EntityId remoteId;
size_t maxFileSegmentLen = 2048;
bool closureRequested = false;
bool crcOnTransmission = false;
TransmissionModes defaultTransmissionMode = TransmissionModes::UNACKNOWLEDGED;
ChecksumType defaultChecksum = ChecksumType::NULL_CHECKSUM;
const uint8_t version = CFDP_VERSION_2;
};
} // namespace cfdp
#endif // FSFW_CFDP_MIB_H
+4 -4
View File
@@ -1,18 +1,18 @@
#include "AckPduDeserializer.h"
AckPduDeserializer::AckPduDeserializer(const uint8_t* pduBuf, size_t maxSize, AckInfo& info)
: FileDirectiveDeserializer(pduBuf, maxSize), info(info) {}
: FileDirectiveReader(pduBuf, maxSize), info(info) {}
ReturnValue_t AckPduDeserializer::parseData() {
ReturnValue_t result = FileDirectiveDeserializer::parseData();
ReturnValue_t result = FileDirectiveReader::parseData();
if (result != returnvalue::OK) {
return result;
}
size_t currentIdx = FileDirectiveDeserializer::getHeaderSize();
size_t currentIdx = FileDirectiveReader::getHeaderSize();
if (currentIdx + 2 > this->maxSize) {
return SerializeIF::BUFFER_TOO_SHORT;
}
if (not checkAndSetCodes(rawPtr[currentIdx], rawPtr[currentIdx + 1])) {
if (not checkAndSetCodes(pointers.rawPtr[currentIdx], pointers.rawPtr[currentIdx + 1])) {
return cfdp::INVALID_ACK_DIRECTIVE_FIELDS;
}
return returnvalue::OK;
+2 -2
View File
@@ -2,9 +2,9 @@
#define FSFW_SRC_FSFW_CFDP_PDU_ACKPDUDESERIALIZER_H_
#include "AckInfo.h"
#include "fsfw/cfdp/pdu/FileDirectiveDeserializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveReader.h"
class AckPduDeserializer : public FileDirectiveDeserializer {
class AckPduDeserializer : public FileDirectiveReader {
public:
AckPduDeserializer(const uint8_t* pduBuf, size_t maxSize, AckInfo& info);
+3 -4
View File
@@ -1,16 +1,15 @@
#include "AckPduSerializer.h"
AckPduSerializer::AckPduSerializer(AckInfo &ackInfo, PduConfig &pduConf)
: FileDirectiveSerializer(pduConf, cfdp::FileDirectives::ACK, 2), ackInfo(ackInfo) {}
: FileDirectiveCreator(pduConf, cfdp::FileDirectives::ACK, 2), ackInfo(ackInfo) {}
size_t AckPduSerializer::getSerializedSize() const {
return FileDirectiveSerializer::getWholePduSize();
return FileDirectiveCreator::getWholePduSize();
}
ReturnValue_t AckPduSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result =
FileDirectiveSerializer::serialize(buffer, size, maxSize, streamEndianness);
ReturnValue_t result = FileDirectiveCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
+3 -3
View File
@@ -2,10 +2,10 @@
#define FSFW_SRC_FSFW_CFDP_PDU_ACKPDUSERIALIZER_H_
#include "AckInfo.h"
#include "FileDirectiveDeserializer.h"
#include "FileDirectiveSerializer.h"
#include "FileDirectiveCreator.h"
#include "FileDirectiveReader.h"
class AckPduSerializer : public FileDirectiveSerializer {
class AckPduSerializer : public FileDirectiveCreator {
public:
/**
* @brief Serializer to pack ACK PDUs
+8 -9
View File
@@ -1,11 +1,10 @@
target_sources(
${LIB_FSFW_NAME}
PRIVATE PduConfig.cpp
VarLenField.cpp
HeaderSerializer.cpp
HeaderDeserializer.cpp
FileDirectiveDeserializer.cpp
FileDirectiveSerializer.cpp
HeaderCreator.cpp
HeaderReader.cpp
FileDirectiveReader.cpp
FileDirectiveCreator.cpp
AckInfo.cpp
AckPduSerializer.cpp
AckPduDeserializer.cpp
@@ -19,12 +18,12 @@ target_sources(
FinishedPduSerializer.cpp
FinishedPduDeserializer.cpp
MetadataInfo.cpp
MetadataPduSerializer.cpp
MetadataPduDeserializer.cpp
MetadataPduCreator.cpp
MetadataPduReader.cpp
KeepAlivePduSerializer.cpp
KeepAlivePduDeserializer.cpp
PromptPduSerializer.cpp
PromptPduDeserializer.cpp
FileDataSerializer.cpp
FileDataDeserializer.cpp
FileDataCreator.cpp
FileDataReader.cpp
FileDataInfo.cpp)
+4 -4
View File
@@ -4,20 +4,20 @@
#include "fsfw/serviceinterface.h"
EofPduDeserializer::EofPduDeserializer(const uint8_t* pduBuf, size_t maxSize, EofInfo& eofInfo)
: FileDirectiveDeserializer(pduBuf, maxSize), info(eofInfo) {}
: FileDirectiveReader(pduBuf, maxSize), info(eofInfo) {}
ReturnValue_t EofPduDeserializer::parseData() {
ReturnValue_t result = FileDirectiveDeserializer::parseData();
ReturnValue_t result = FileDirectiveReader::parseData();
if (result != returnvalue::OK) {
return result;
}
const uint8_t* bufPtr = rawPtr;
const uint8_t* bufPtr = pointers.rawPtr;
size_t expectedFileFieldLen = 4;
if (this->getLargeFileFlag()) {
expectedFileFieldLen = 8;
}
size_t currentIdx = FileDirectiveDeserializer::getHeaderSize();
size_t currentIdx = FileDirectiveReader::getHeaderSize();
size_t deserLen = maxSize;
if (maxSize < currentIdx + 5 + expectedFileFieldLen) {
return SerializeIF::STREAM_TOO_SHORT;
+2 -2
View File
@@ -2,9 +2,9 @@
#define FSFW_SRC_FSFW_CFDP_PDU_EOFPDUDESERIALIZER_H_
#include "EofInfo.h"
#include "fsfw/cfdp/pdu/FileDirectiveDeserializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveReader.h"
class EofPduDeserializer : public FileDirectiveDeserializer {
class EofPduDeserializer : public FileDirectiveReader {
public:
EofPduDeserializer(const uint8_t* pduBuf, size_t maxSize, EofInfo& eofInfo);
+3 -4
View File
@@ -4,18 +4,17 @@
#include "fsfw/serviceinterface.h"
EofPduSerializer::EofPduSerializer(PduConfig &conf, EofInfo &info)
: FileDirectiveSerializer(conf, cfdp::FileDirectives::EOF_DIRECTIVE, 9), info(info) {
: FileDirectiveCreator(conf, cfdp::FileDirectives::EOF_DIRECTIVE, 9), info(info) {
setDirectiveDataFieldLen(info.getSerializedSize(getLargeFileFlag()));
}
size_t EofPduSerializer::getSerializedSize() const {
return FileDirectiveSerializer::getWholePduSize();
return FileDirectiveCreator::getWholePduSize();
}
ReturnValue_t EofPduSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result =
FileDirectiveSerializer::serialize(buffer, size, maxSize, streamEndianness);
ReturnValue_t result = FileDirectiveCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
+2 -2
View File
@@ -2,10 +2,10 @@
#define FSFW_SRC_FSFW_CFDP_PDU_EOFPDUSERIALIZER_H_
#include "EofInfo.h"
#include "fsfw/cfdp/pdu/FileDirectiveSerializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveCreator.h"
#include "fsfw/cfdp/tlv/EntityIdTlv.h"
class EofPduSerializer : public FileDirectiveSerializer {
class EofPduSerializer : public FileDirectiveCreator {
public:
EofPduSerializer(PduConfig& conf, EofInfo& info);
@@ -1,22 +1,21 @@
#include "FileDataSerializer.h"
#include "FileDataCreator.h"
#include <cstring>
FileDataSerializer::FileDataSerializer(PduConfig& conf, FileDataInfo& info)
: HeaderSerializer(conf, cfdp::PduType::FILE_DATA, 0, info.getSegmentMetadataFlag()),
info(info) {
FileDataCreator::FileDataCreator(PduConfig& conf, FileDataInfo& info)
: HeaderCreator(conf, cfdp::PduType::FILE_DATA, 0, info.getSegmentMetadataFlag()), info(info) {
update();
}
void FileDataSerializer::update() {
void FileDataCreator::update() {
this->setSegmentMetadataFlag(info.getSegmentMetadataFlag());
this->setSegmentationControl(info.getSegmentationControl());
setPduDataFieldLen(info.getSerializedSize(this->getLargeFileFlag()));
}
ReturnValue_t FileDataSerializer::serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result = HeaderSerializer::serialize(buffer, size, maxSize, streamEndianness);
ReturnValue_t FileDataCreator::serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result = HeaderCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
@@ -50,6 +49,6 @@ ReturnValue_t FileDataSerializer::serialize(uint8_t** buffer, size_t* size, size
return returnvalue::OK;
}
size_t FileDataSerializer::getSerializedSize() const {
return HeaderSerializer::getSerializedSize() + info.getSerializedSize(this->getLargeFileFlag());
size_t FileDataCreator::getSerializedSize() const {
return HeaderCreator::getSerializedSize() + info.getSerializedSize(this->getLargeFileFlag());
}
+23
View File
@@ -0,0 +1,23 @@
#ifndef FSFW_CFDP_PDU_FILEDATASERIALIZER_H_
#define FSFW_CFDP_PDU_FILEDATASERIALIZER_H_
#include "../definitions.h"
#include "FileDataInfo.h"
#include "HeaderCreator.h"
class FileDataCreator : public HeaderCreator {
public:
FileDataCreator(PduConfig& conf, FileDataInfo& info);
void update();
ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const override;
[[nodiscard]] size_t getSerializedSize() const override;
private:
FileDataInfo& info;
};
#endif /* FSFW_CFDP_PDU_FILEDATASERIALIZER_H_ */
@@ -1,17 +1,16 @@
#include "FileDataDeserializer.h"
#include "FileDataReader.h"
FileDataDeserializer::FileDataDeserializer(const uint8_t* pduBuf, size_t maxSize,
FileDataInfo& info)
: HeaderDeserializer(pduBuf, maxSize), info(info) {}
FileDataReader::FileDataReader(const uint8_t* pduBuf, size_t maxSize, FileDataInfo& info)
: HeaderReader(pduBuf, maxSize), info(info) {}
ReturnValue_t FileDataDeserializer::parseData() {
ReturnValue_t result = HeaderDeserializer::parseData();
ReturnValue_t FileDataReader::parseData() {
ReturnValue_t result = HeaderReader::parseData();
if (result != returnvalue::OK) {
return result;
}
size_t currentIdx = HeaderDeserializer::getHeaderSize();
const uint8_t* buf = rawPtr + currentIdx;
size_t remSize = HeaderDeserializer::getWholePduSize() - currentIdx;
size_t currentIdx = HeaderReader::getHeaderSize();
const uint8_t* buf = pointers.rawPtr + currentIdx;
size_t remSize = HeaderReader::getWholePduSize() - currentIdx;
if (remSize < 1) {
return SerializeIF::STREAM_TOO_SHORT;
}
@@ -41,8 +40,8 @@ ReturnValue_t FileDataDeserializer::parseData() {
return returnvalue::OK;
}
SerializeIF::Endianness FileDataDeserializer::getEndianness() const { return endianness; }
SerializeIF::Endianness FileDataReader::getEndianness() const { return endianness; }
void FileDataDeserializer::setEndianness(SerializeIF::Endianness endianness) {
this->endianness = endianness;
void FileDataReader::setEndianness(SerializeIF::Endianness endianness_) {
endianness = endianness_;
}
@@ -3,14 +3,14 @@
#include "../definitions.h"
#include "FileDataInfo.h"
#include "HeaderDeserializer.h"
#include "HeaderReader.h"
class FileDataDeserializer : public HeaderDeserializer {
class FileDataReader : public HeaderReader {
public:
FileDataDeserializer(const uint8_t* pduBuf, size_t maxSize, FileDataInfo& info);
FileDataReader(const uint8_t* pduBuf, size_t maxSize, FileDataInfo& info);
ReturnValue_t parseData();
SerializeIF::Endianness getEndianness() const;
ReturnValue_t parseData() override;
[[nodiscard]] SerializeIF::Endianness getEndianness() const;
void setEndianness(SerializeIF::Endianness endianness = SerializeIF::Endianness::NETWORK);
private:
-23
View File
@@ -1,23 +0,0 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_FILEDATASERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_FILEDATASERIALIZER_H_
#include "../definitions.h"
#include "FileDataInfo.h"
#include "HeaderSerializer.h"
class FileDataSerializer : public HeaderSerializer {
public:
FileDataSerializer(PduConfig& conf, FileDataInfo& info);
void update();
ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const override;
size_t getSerializedSize() const override;
private:
FileDataInfo& info;
};
#endif /* FSFW_SRC_FSFW_CFDP_PDU_FILEDATADESERIALIZER_H_ */
@@ -0,0 +1,37 @@
#include "FileDirectiveCreator.h"
FileDirectiveCreator::FileDirectiveCreator(PduConfig &pduConf, cfdp::FileDirectives directiveCode,
size_t directiveParamFieldLen)
: HeaderCreator(pduConf, cfdp::PduType::FILE_DIRECTIVE, directiveParamFieldLen + 1),
directiveCode(directiveCode) {}
size_t FileDirectiveCreator::getSerializedSize() const {
return HeaderCreator::getSerializedSize() + 1;
}
ReturnValue_t FileDirectiveCreator::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
if (buffer == nullptr or size == nullptr) {
return returnvalue::FAILED;
}
if (FileDirectiveCreator::getWholePduSize() > maxSize) {
return BUFFER_TOO_SHORT;
}
ReturnValue_t result = HeaderCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
if (*size >= maxSize) {
return BUFFER_TOO_SHORT;
}
**buffer = directiveCode;
*buffer += 1;
*size += 1;
return returnvalue::OK;
}
void FileDirectiveCreator::setDirectiveDataFieldLen(size_t len) {
// Set length of data field plus 1 byte for the directive octet
HeaderCreator::setPduDataFieldLen(len + 1);
}
@@ -1,20 +1,20 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_FILEDIRECTIVESERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_FILEDIRECTIVESERIALIZER_H_
#include "fsfw/cfdp/pdu/HeaderSerializer.h"
#include "fsfw/cfdp/pdu/HeaderCreator.h"
class FileDirectiveSerializer : public HeaderSerializer {
class FileDirectiveCreator : public HeaderCreator {
public:
FileDirectiveSerializer(PduConfig& pduConf, cfdp::FileDirectives directiveCode,
size_t directiveParamFieldLen);
FileDirectiveCreator(PduConfig& pduConf, cfdp::FileDirectives directiveCode,
size_t directiveParamFieldLen);
/**
* This only returns the size of the PDU header + 1 for the directive code octet.
* Use FileDirectiveSerializer::getWholePduSize to get the full packet length, assuming
* Use FileDirectiveCreator::getWholePduSize to get the full packet length, assuming
* the length fields was set correctly
* @return
*/
size_t getSerializedSize() const override;
[[nodiscard]] size_t getSerializedSize() const override;
ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const override;
@@ -1,49 +0,0 @@
#include "FileDirectiveDeserializer.h"
FileDirectiveDeserializer::FileDirectiveDeserializer(const uint8_t *pduBuf, size_t maxSize)
: HeaderDeserializer(pduBuf, maxSize) {}
cfdp::FileDirectives FileDirectiveDeserializer::getFileDirective() const { return fileDirective; }
ReturnValue_t FileDirectiveDeserializer::parseData() {
ReturnValue_t result = HeaderDeserializer::parseData();
if (result != returnvalue::OK) {
return result;
}
if (this->getPduDataFieldLen() < 1) {
return cfdp::INVALID_PDU_DATAFIELD_LEN;
}
if (FileDirectiveDeserializer::getWholePduSize() > maxSize) {
return SerializeIF::STREAM_TOO_SHORT;
}
size_t currentIdx = HeaderDeserializer::getHeaderSize();
if (not checkFileDirective(rawPtr[currentIdx])) {
return cfdp::INVALID_DIRECTIVE_FIELDS;
}
setFileDirective(static_cast<cfdp::FileDirectives>(rawPtr[currentIdx]));
return returnvalue::OK;
}
size_t FileDirectiveDeserializer::getHeaderSize() const {
// return size of header plus the directive byte
return HeaderDeserializer::getHeaderSize() + 1;
}
bool FileDirectiveDeserializer::checkFileDirective(uint8_t rawByte) {
if (rawByte < cfdp::FileDirectives::EOF_DIRECTIVE or
(rawByte > cfdp::FileDirectives::PROMPT and rawByte != cfdp::FileDirectives::KEEP_ALIVE)) {
// Invalid directive field. TODO: Custom returnvalue
return false;
}
return true;
}
void FileDirectiveDeserializer::setFileDirective(cfdp::FileDirectives fileDirective) {
this->fileDirective = fileDirective;
}
void FileDirectiveDeserializer::setEndianness(SerializeIF::Endianness endianness) {
this->endianness = endianness;
}
SerializeIF::Endianness FileDirectiveDeserializer::getEndianness() const { return endianness; }
+49
View File
@@ -0,0 +1,49 @@
#include "FileDirectiveReader.h"
FileDirectiveReader::FileDirectiveReader(const uint8_t *pduBuf, size_t maxSize)
: HeaderReader(pduBuf, maxSize) {}
cfdp::FileDirectives FileDirectiveReader::getFileDirective() const { return fileDirective; }
ReturnValue_t FileDirectiveReader::parseData() {
ReturnValue_t result = HeaderReader::parseData();
if (result != returnvalue::OK) {
return result;
}
if (this->getPduDataFieldLen() < 1) {
return cfdp::INVALID_PDU_DATAFIELD_LEN;
}
if (FileDirectiveReader::getWholePduSize() > maxSize) {
return SerializeIF::STREAM_TOO_SHORT;
}
size_t currentIdx = HeaderReader::getHeaderSize();
if (not checkFileDirective(pointers.rawPtr[currentIdx])) {
return cfdp::INVALID_DIRECTIVE_FIELDS;
}
setFileDirective(static_cast<cfdp::FileDirectives>(pointers.rawPtr[currentIdx]));
return returnvalue::OK;
}
size_t FileDirectiveReader::getHeaderSize() const {
// return size of header plus the directive byte
return HeaderReader::getHeaderSize() + 1;
}
bool FileDirectiveReader::checkFileDirective(uint8_t rawByte) {
if (rawByte < cfdp::FileDirectives::EOF_DIRECTIVE or
(rawByte > cfdp::FileDirectives::PROMPT and rawByte != cfdp::FileDirectives::KEEP_ALIVE)) {
// Invalid directive field. TODO: Custom returnvalue
return false;
}
return true;
}
void FileDirectiveReader::setFileDirective(cfdp::FileDirectives fileDirective_) {
fileDirective = fileDirective_;
}
void FileDirectiveReader::setEndianness(SerializeIF::Endianness endianness_) {
endianness = endianness_;
}
SerializeIF::Endianness FileDirectiveReader::getEndianness() const { return endianness; }
@@ -2,7 +2,7 @@
#define FSFW_SRC_FSFW_CFDP_PDU_FILEDIRECTIVEDESERIALIZER_H_
#include "../definitions.h"
#include "fsfw/cfdp/pdu/HeaderDeserializer.h"
#include "fsfw/cfdp/pdu/HeaderReader.h"
/**
* @brief This class is used to deserialize a PDU file directive header from raw memory.
@@ -11,24 +11,24 @@
* This is a zero-copy implementation and #parseData needs to be called to ensure the data is
* valid.
*/
class FileDirectiveDeserializer : public HeaderDeserializer {
class FileDirectiveReader : public HeaderReader {
public:
FileDirectiveDeserializer(const uint8_t* pduBuf, size_t maxSize);
FileDirectiveReader(const uint8_t* pduBuf, size_t maxSize);
/**
* This needs to be called before accessing the PDU fields to avoid segmentation faults.
* @return
*/
virtual ReturnValue_t parseData();
size_t getHeaderSize() const;
ReturnValue_t parseData() override;
[[nodiscard]] size_t getHeaderSize() const override;
cfdp::FileDirectives getFileDirective() const;
[[nodiscard]] cfdp::FileDirectives getFileDirective() const;
void setEndianness(SerializeIF::Endianness endianness);
SerializeIF::Endianness getEndianness() const;
[[nodiscard]] SerializeIF::Endianness getEndianness() const;
protected:
bool checkFileDirective(uint8_t rawByte);
static bool checkFileDirective(uint8_t rawByte);
private:
void setFileDirective(cfdp::FileDirectives fileDirective);
@@ -1,38 +0,0 @@
#include "FileDirectiveSerializer.h"
FileDirectiveSerializer::FileDirectiveSerializer(PduConfig &pduConf,
cfdp::FileDirectives directiveCode,
size_t directiveParamFieldLen)
: HeaderSerializer(pduConf, cfdp::PduType::FILE_DIRECTIVE, directiveParamFieldLen + 1),
directiveCode(directiveCode) {}
size_t FileDirectiveSerializer::getSerializedSize() const {
return HeaderSerializer::getSerializedSize() + 1;
}
ReturnValue_t FileDirectiveSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
if (buffer == nullptr or size == nullptr) {
return returnvalue::FAILED;
}
if (FileDirectiveSerializer::getWholePduSize() > maxSize) {
return BUFFER_TOO_SHORT;
}
ReturnValue_t result = HeaderSerializer::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
if (*size >= maxSize) {
return BUFFER_TOO_SHORT;
}
**buffer = directiveCode;
*buffer += 1;
*size += 1;
return returnvalue::OK;
}
void FileDirectiveSerializer::setDirectiveDataFieldLen(size_t len) {
// Set length of data field plus 1 byte for the directive octet
HeaderSerializer::setPduDataFieldLen(len + 1);
}
+6 -7
View File
@@ -2,9 +2,8 @@
FinishedInfo::FinishedInfo() {}
FinishedInfo::FinishedInfo(cfdp::ConditionCode conditionCode,
cfdp::FinishedDeliveryCode deliveryCode,
cfdp::FinishedFileStatus fileStatus)
FinishedInfo::FinishedInfo(cfdp::ConditionCode conditionCode, cfdp::FileDeliveryCode deliveryCode,
cfdp::FileDeliveryStatus fileStatus)
: conditionCode(conditionCode), deliveryCode(deliveryCode), fileStatus(fileStatus) {}
size_t FinishedInfo::getSerializedSize() const {
@@ -83,13 +82,13 @@ void FinishedInfo::setConditionCode(cfdp::ConditionCode conditionCode) {
this->conditionCode = conditionCode;
}
cfdp::FinishedDeliveryCode FinishedInfo::getDeliveryCode() const { return deliveryCode; }
cfdp::FileDeliveryCode FinishedInfo::getDeliveryCode() const { return deliveryCode; }
void FinishedInfo::setDeliveryCode(cfdp::FinishedDeliveryCode deliveryCode) {
void FinishedInfo::setDeliveryCode(cfdp::FileDeliveryCode deliveryCode) {
this->deliveryCode = deliveryCode;
}
cfdp::FinishedFileStatus FinishedInfo::getFileStatus() const { return fileStatus; }
cfdp::FileDeliveryStatus FinishedInfo::getFileStatus() const { return fileStatus; }
void FinishedInfo::setFilestoreResponsesArrayLen(size_t fsResponsesLen) {
this->fsResponsesLen = fsResponsesLen;
@@ -97,6 +96,6 @@ void FinishedInfo::setFilestoreResponsesArrayLen(size_t fsResponsesLen) {
size_t FinishedInfo::getFsResponsesLen() const { return fsResponsesLen; }
void FinishedInfo::setFileStatus(cfdp::FinishedFileStatus fileStatus) {
void FinishedInfo::setFileStatus(cfdp::FileDeliveryStatus fileStatus) {
this->fileStatus = fileStatus;
}
+13 -13
View File
@@ -8,13 +8,13 @@
class FinishedInfo {
public:
FinishedInfo();
FinishedInfo(cfdp::ConditionCode conditionCode, cfdp::FinishedDeliveryCode deliveryCode,
cfdp::FinishedFileStatus fileStatus);
FinishedInfo(cfdp::ConditionCode conditionCode, cfdp::FileDeliveryCode deliveryCode,
cfdp::FileDeliveryStatus fileStatus);
size_t getSerializedSize() const;
[[nodiscard]] size_t getSerializedSize() const;
bool hasFsResponses() const;
bool canHoldFsResponses() const;
[[nodiscard]] bool hasFsResponses() const;
[[nodiscard]] bool canHoldFsResponses() const;
ReturnValue_t setFilestoreResponsesArray(FilestoreResponseTlv** fsResponses,
size_t* fsResponsesLen, const size_t* maxFsResponseLen);
@@ -22,20 +22,20 @@ class FinishedInfo {
ReturnValue_t getFilestoreResonses(FilestoreResponseTlv*** fsResponses, size_t* fsResponsesLen,
size_t* fsResponsesMaxLen);
size_t getFsResponsesLen() const;
[[nodiscard]] size_t getFsResponsesLen() const;
void setFilestoreResponsesArrayLen(size_t fsResponsesLen);
ReturnValue_t getFaultLocation(EntityIdTlv** entityId);
cfdp::ConditionCode getConditionCode() const;
[[nodiscard]] cfdp::ConditionCode getConditionCode() const;
void setConditionCode(cfdp::ConditionCode conditionCode);
cfdp::FinishedDeliveryCode getDeliveryCode() const;
void setDeliveryCode(cfdp::FinishedDeliveryCode deliveryCode);
cfdp::FinishedFileStatus getFileStatus() const;
void setFileStatus(cfdp::FinishedFileStatus fileStatus);
[[nodiscard]] cfdp::FileDeliveryCode getDeliveryCode() const;
void setDeliveryCode(cfdp::FileDeliveryCode deliveryCode);
[[nodiscard]] cfdp::FileDeliveryStatus getFileStatus() const;
void setFileStatus(cfdp::FileDeliveryStatus fileStatus);
private:
cfdp::ConditionCode conditionCode = cfdp::ConditionCode::NO_CONDITION_FIELD;
cfdp::FinishedDeliveryCode deliveryCode = cfdp::FinishedDeliveryCode::DATA_COMPLETE;
cfdp::FinishedFileStatus fileStatus = cfdp::FinishedFileStatus::DISCARDED_DELIBERATELY;
cfdp::FileDeliveryCode deliveryCode = cfdp::FileDeliveryCode::DATA_COMPLETE;
cfdp::FileDeliveryStatus fileStatus = cfdp::FileDeliveryStatus::DISCARDED_DELIBERATELY;
FilestoreResponseTlv** fsResponses = nullptr;
size_t fsResponsesLen = 0;
size_t fsResponsesMaxLen = 0;
@@ -2,24 +2,24 @@
FinishPduDeserializer::FinishPduDeserializer(const uint8_t* pduBuf, size_t maxSize,
FinishedInfo& info)
: FileDirectiveDeserializer(pduBuf, maxSize), finishedInfo(info) {}
: FileDirectiveReader(pduBuf, maxSize), finishedInfo(info) {}
ReturnValue_t FinishPduDeserializer::parseData() {
ReturnValue_t result = FileDirectiveDeserializer::parseData();
ReturnValue_t result = FileDirectiveReader::parseData();
if (result != returnvalue::OK) {
return result;
}
size_t currentIdx = FileDirectiveDeserializer::getHeaderSize();
const uint8_t* buf = rawPtr + currentIdx;
size_t remSize = FileDirectiveDeserializer::getWholePduSize() - currentIdx;
size_t currentIdx = FileDirectiveReader::getHeaderSize();
const uint8_t* buf = pointers.rawPtr + currentIdx;
size_t remSize = FileDirectiveReader::getWholePduSize() - currentIdx;
if (remSize < 1) {
return SerializeIF::STREAM_TOO_SHORT;
}
uint8_t firstByte = *buf;
cfdp::ConditionCode condCode = static_cast<cfdp::ConditionCode>((firstByte >> 4) & 0x0f);
auto condCode = static_cast<cfdp::ConditionCode>((firstByte >> 4) & 0x0f);
finishedInfo.setConditionCode(condCode);
finishedInfo.setDeliveryCode(static_cast<cfdp::FinishedDeliveryCode>(firstByte >> 2 & 0b1));
finishedInfo.setFileStatus(static_cast<cfdp::FinishedFileStatus>(firstByte & 0b11));
finishedInfo.setDeliveryCode(static_cast<cfdp::FileDeliveryCode>(firstByte >> 2 & 0b1));
finishedInfo.setFileStatus(static_cast<cfdp::FileDeliveryStatus>(firstByte & 0b11));
buf += 1;
remSize -= 1;
currentIdx += 1;
+2 -2
View File
@@ -1,10 +1,10 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_FINISHEDPDUDESERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_FINISHEDPDUDESERIALIZER_H_
#include "fsfw/cfdp/pdu/FileDirectiveDeserializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveReader.h"
#include "fsfw/cfdp/pdu/FinishedInfo.h"
class FinishPduDeserializer : public FileDirectiveDeserializer {
class FinishPduDeserializer : public FileDirectiveReader {
public:
FinishPduDeserializer(const uint8_t* pduBuf, size_t maxSize, FinishedInfo& info);
+2 -3
View File
@@ -1,7 +1,7 @@
#include "FinishedPduSerializer.h"
FinishPduSerializer::FinishPduSerializer(PduConfig &conf, FinishedInfo &finishInfo)
: FileDirectiveSerializer(conf, cfdp::FileDirectives::FINISH, 0), finishInfo(finishInfo) {
: FileDirectiveCreator(conf, cfdp::FileDirectives::FINISH, 0), finishInfo(finishInfo) {
updateDirectiveFieldLen();
}
@@ -15,8 +15,7 @@ void FinishPduSerializer::updateDirectiveFieldLen() {
ReturnValue_t FinishPduSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result =
FileDirectiveSerializer::serialize(buffer, size, maxSize, streamEndianness);
ReturnValue_t result = FileDirectiveCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
+3 -3
View File
@@ -2,10 +2,10 @@
#define FSFW_SRC_FSFW_CFDP_PDU_FINISHEDPDUSERIALIZER_H_
#include "FinishedInfo.h"
#include "fsfw/cfdp/pdu/FileDataSerializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveSerializer.h"
#include "fsfw/cfdp/pdu/FileDataCreator.h"
#include "fsfw/cfdp/pdu/FileDirectiveCreator.h"
class FinishPduSerializer : public FileDirectiveSerializer {
class FinishPduSerializer : public FileDirectiveCreator {
public:
FinishPduSerializer(PduConfig& pduConf, FinishedInfo& finishInfo);
+111
View File
@@ -0,0 +1,111 @@
#include "HeaderCreator.h"
HeaderCreator::HeaderCreator(PduConfig &pduConf, cfdp::PduType pduType, size_t initPduDataFieldLen,
cfdp::SegmentMetadataFlag segmentMetadataFlag,
cfdp::SegmentationControl segCtrl)
: pduType(pduType),
segmentMetadataFlag(segmentMetadataFlag),
segmentationCtrl(segCtrl),
pduDataFieldLen(initPduDataFieldLen),
pduConf(pduConf) {}
ReturnValue_t HeaderCreator::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
if (buffer == nullptr or size == nullptr) {
return returnvalue::FAILED;
}
if (maxSize < this->getSerializedSize()) {
return BUFFER_TOO_SHORT;
}
**buffer = cfdp::VERSION_BITS | this->pduType << 4 | pduConf.direction << 3 | pduConf.mode << 2 |
pduConf.crcFlag << 1 | pduConf.largeFile;
*buffer += 1;
**buffer = (pduDataFieldLen & 0xff00) >> 8;
*buffer += 1;
**buffer = pduDataFieldLen & 0x00ff;
*buffer += 1;
**buffer = segmentationCtrl << 7 | pduConf.sourceId.getWidth() << 4 | segmentMetadataFlag << 3 |
pduConf.seqNum.getWidth();
*buffer += 1;
*size += 4;
ReturnValue_t result = pduConf.sourceId.serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
result = pduConf.seqNum.serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
result = pduConf.destId.serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
return returnvalue::OK;
}
size_t HeaderCreator::getSerializedSize() const {
return pduConf.seqNum.getWidth() + pduConf.sourceId.getWidth() * 2 + 4;
}
ReturnValue_t HeaderCreator::deSerialize(const uint8_t **buffer, size_t *size,
Endianness streamEndianness) {
// We could implement this, but I prefer dedicated classes
return returnvalue::FAILED;
}
size_t HeaderCreator::getWholePduSize() const {
// Return size of header plus the PDU data field length
return pduDataFieldLen + HeaderCreator::getSerializedSize();
}
size_t HeaderCreator::getPduDataFieldLen() const { return pduDataFieldLen; }
void HeaderCreator::setPduDataFieldLen(size_t pduDataFieldLen_) {
pduDataFieldLen = pduDataFieldLen_;
}
void HeaderCreator::setPduType(cfdp::PduType pduType_) { pduType = pduType_; }
void HeaderCreator::setSegmentMetadataFlag(cfdp::SegmentMetadataFlag segmentMetadataFlag_) {
segmentMetadataFlag = segmentMetadataFlag_;
}
cfdp::PduType HeaderCreator::getPduType() const { return pduType; }
cfdp::Direction HeaderCreator::getDirection() const { return pduConf.direction; }
cfdp::TransmissionModes HeaderCreator::getTransmissionMode() const { return pduConf.mode; }
bool HeaderCreator::getCrcFlag() const { return pduConf.crcFlag; }
bool HeaderCreator::getLargeFileFlag() const { return pduConf.largeFile; }
cfdp::SegmentationControl HeaderCreator::getSegmentationControl() const { return segmentationCtrl; }
cfdp::WidthInBytes HeaderCreator::getLenEntityIds() const { return pduConf.sourceId.getWidth(); }
cfdp::WidthInBytes HeaderCreator::getLenSeqNum() const { return pduConf.seqNum.getWidth(); }
cfdp::SegmentMetadataFlag HeaderCreator::getSegmentMetadataFlag() const {
return segmentMetadataFlag;
}
void HeaderCreator::getSourceId(cfdp::EntityId &sourceId) const { sourceId = pduConf.sourceId; }
void HeaderCreator::getDestId(cfdp::EntityId &destId) const { destId = pduConf.destId; }
void HeaderCreator::setSegmentationControl(cfdp::SegmentationControl segmentationControl) {
this->segmentationCtrl = segmentationControl;
}
void HeaderCreator::getTransactionSeqNum(cfdp::TransactionSeqNum &seqNum) const {
seqNum = pduConf.seqNum;
}
bool HeaderCreator::hasSegmentMetadataFlag() const {
if (this->segmentMetadataFlag == cfdp::SegmentMetadataFlag::PRESENT) {
return true;
}
return false;
}
@@ -1,14 +1,14 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_HEADERSERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_HEADERSERIALIZER_H_
#include "../definitions.h"
#include "PduConfig.h"
#include "PduHeaderIF.h"
#include "fsfw/cfdp/definitions.h"
#include "fsfw/serialize/SerializeIF.h"
class HeaderSerializer : public SerializeIF, public PduHeaderIF {
class HeaderCreator : public SerializeIF, public PduHeaderIF {
public:
HeaderSerializer(
HeaderCreator(
PduConfig& pduConf, cfdp::PduType pduType, size_t initPduDataFieldLen,
cfdp::SegmentMetadataFlag segmentMetadataFlag = cfdp::SegmentMetadataFlag::NOT_PRESENT,
cfdp::SegmentationControl segCtrl =
@@ -23,7 +23,7 @@ class HeaderSerializer : public SerializeIF, public PduHeaderIF {
* data field length was not properly.
* @return
*/
size_t getSerializedSize() const override;
[[nodiscard]] size_t getSerializedSize() const override;
ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
Endianness streamEndianness) override;
@@ -32,19 +32,19 @@ class HeaderSerializer : public SerializeIF, public PduHeaderIF {
void setPduType(cfdp::PduType pduType);
void setSegmentMetadataFlag(cfdp::SegmentMetadataFlag);
size_t getPduDataFieldLen() const override;
size_t getWholePduSize() const override;
[[nodiscard]] size_t getPduDataFieldLen() const override;
[[nodiscard]] size_t getWholePduSize() const override;
cfdp::PduType getPduType() const override;
cfdp::Direction getDirection() const override;
cfdp::TransmissionModes getTransmissionMode() const override;
bool getCrcFlag() const override;
bool getLargeFileFlag() const override;
cfdp::SegmentationControl getSegmentationControl() const override;
cfdp::WidthInBytes getLenEntityIds() const override;
cfdp::WidthInBytes getLenSeqNum() const override;
cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const override;
bool hasSegmentMetadataFlag() const override;
[[nodiscard]] cfdp::PduType getPduType() const override;
[[nodiscard]] cfdp::Direction getDirection() const override;
[[nodiscard]] cfdp::TransmissionModes getTransmissionMode() const override;
[[nodiscard]] bool getCrcFlag() const override;
[[nodiscard]] bool getLargeFileFlag() const override;
[[nodiscard]] cfdp::SegmentationControl getSegmentationControl() const override;
[[nodiscard]] cfdp::WidthInBytes getLenEntityIds() const override;
[[nodiscard]] cfdp::WidthInBytes getLenSeqNum() const override;
[[nodiscard]] cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const override;
[[nodiscard]] bool hasSegmentMetadataFlag() const override;
void setSegmentationControl(cfdp::SegmentationControl);
void getSourceId(cfdp::EntityId& sourceId) const override;
-128
View File
@@ -1,128 +0,0 @@
#include "HeaderDeserializer.h"
#include <fsfw/serialize/SerializeAdapter.h>
#include <cstring>
HeaderDeserializer::HeaderDeserializer(const uint8_t *pduBuf, size_t maxSize)
: rawPtr(pduBuf), maxSize(maxSize) {}
ReturnValue_t HeaderDeserializer::parseData() {
if (maxSize < 7) {
return SerializeIF::STREAM_TOO_SHORT;
}
return setData(const_cast<uint8_t *>(rawPtr), maxSize);
}
ReturnValue_t HeaderDeserializer::setData(uint8_t *dataPtr, size_t maxSize, void *args) {
if (dataPtr == nullptr) {
// Allowed for now
this->fixedHeader = nullptr;
return returnvalue::OK;
}
this->fixedHeader = reinterpret_cast<PduHeaderFixedStruct *>(const_cast<uint8_t *>(dataPtr));
sourceIdRaw = static_cast<uint8_t *>(&fixedHeader->variableFieldsStart);
cfdp::WidthInBytes widthEntityIds = getLenEntityIds();
cfdp::WidthInBytes widthSeqNum = getLenSeqNum();
seqNumRaw = static_cast<uint8_t *>(sourceIdRaw) + static_cast<uint8_t>(widthEntityIds);
destIdRaw = static_cast<uint8_t *>(seqNumRaw) + static_cast<uint8_t>(widthSeqNum);
this->maxSize = maxSize;
return returnvalue::OK;
}
size_t HeaderDeserializer::getHeaderSize() const {
if (fixedHeader != nullptr) {
return getLenEntityIds() * 2 + getLenSeqNum() + 4;
}
return 0;
}
size_t HeaderDeserializer::getPduDataFieldLen() const {
uint16_t pduFiedlLen = (fixedHeader->pduDataFieldLenH << 8) | fixedHeader->pduDataFieldLenL;
return pduFiedlLen;
}
size_t HeaderDeserializer::getWholePduSize() const {
return getPduDataFieldLen() + getHeaderSize();
}
cfdp::PduType HeaderDeserializer::getPduType() const {
return static_cast<cfdp::PduType>((fixedHeader->firstByte >> 4) & 0x01);
}
cfdp::Direction HeaderDeserializer::getDirection() const {
return static_cast<cfdp::Direction>((fixedHeader->firstByte >> 3) & 0x01);
}
cfdp::TransmissionModes HeaderDeserializer::getTransmissionMode() const {
return static_cast<cfdp::TransmissionModes>((fixedHeader->firstByte >> 2) & 0x01);
}
bool HeaderDeserializer::getCrcFlag() const { return (fixedHeader->firstByte >> 1) & 0x01; }
bool HeaderDeserializer::getLargeFileFlag() const { return fixedHeader->firstByte & 0x01; }
cfdp::SegmentationControl HeaderDeserializer::getSegmentationControl() const {
return static_cast<cfdp::SegmentationControl>((fixedHeader->fourthByte >> 7) & 0x01);
}
cfdp::WidthInBytes HeaderDeserializer::getLenEntityIds() const {
return static_cast<cfdp::WidthInBytes>((fixedHeader->fourthByte >> 4) & 0x07);
}
cfdp::WidthInBytes HeaderDeserializer::getLenSeqNum() const {
return static_cast<cfdp::WidthInBytes>(fixedHeader->fourthByte & 0x07);
}
cfdp::SegmentMetadataFlag HeaderDeserializer::getSegmentMetadataFlag() const {
return static_cast<cfdp::SegmentMetadataFlag>((fixedHeader->fourthByte >> 3) & 0x01);
}
void HeaderDeserializer::getSourceId(cfdp::EntityId &sourceId) const {
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&sourceId), getLenEntityIds(),
this->sourceIdRaw);
}
void HeaderDeserializer::getDestId(cfdp::EntityId &destId) const {
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&destId), getLenEntityIds(), this->destIdRaw);
}
void HeaderDeserializer::getTransactionSeqNum(cfdp::TransactionSeqNum &seqNum) const {
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&seqNum), getLenSeqNum(), this->seqNumRaw);
}
void HeaderDeserializer::assignVarLenField(cfdp::VarLenField *field, cfdp::WidthInBytes width,
void *sourcePtr) const {
switch (width) {
case (cfdp::WidthInBytes::ONE_BYTE): {
uint8_t *fieldTyped = static_cast<uint8_t *>(sourcePtr);
field->setValue(width, *fieldTyped);
break;
}
case (cfdp::WidthInBytes::TWO_BYTES): {
uint16_t fieldTyped = 0;
size_t deserSize = 0;
SerializeAdapter::deSerialize(&fieldTyped, static_cast<uint8_t *>(sourcePtr), &deserSize,
SerializeIF::Endianness::NETWORK);
field->setValue(width, fieldTyped);
break;
}
case (cfdp::WidthInBytes::FOUR_BYTES): {
uint32_t fieldTyped = 0;
size_t deserSize = 0;
SerializeAdapter::deSerialize(&fieldTyped, static_cast<uint8_t *>(sourcePtr), &deserSize,
SerializeIF::Endianness::NETWORK);
field->setValue(width, fieldTyped);
break;
}
}
}
size_t HeaderDeserializer::getMaxSize() const { return maxSize; }
bool HeaderDeserializer::hasSegmentMetadataFlag() const {
if (this->getSegmentMetadataFlag() == cfdp::SegmentMetadataFlag::PRESENT) {
return true;
}
return false;
}
+151
View File
@@ -0,0 +1,151 @@
#include "HeaderReader.h"
#include <fsfw/serialize/SerializeAdapter.h>
#include <cstring>
HeaderReader::HeaderReader(const uint8_t *pduBuf, size_t maxSize) { setData(pduBuf, maxSize); }
ReturnValue_t HeaderReader::parseData() {
if (pointers.rawPtr == nullptr) {
return returnvalue::FAILED;
}
if (maxSize < 7) {
return SerializeIF::STREAM_TOO_SHORT;
}
pointers.fixedHeader =
reinterpret_cast<PduHeaderFixedStruct *>(const_cast<uint8_t *>(pointers.rawPtr));
sourceIdRaw = static_cast<uint8_t *>(&pointers.fixedHeader->variableFieldsStart);
cfdp::WidthInBytes widthEntityIds = getLenEntityIds();
cfdp::WidthInBytes widthSeqNum = getLenSeqNum();
seqNumRaw = static_cast<uint8_t *>(sourceIdRaw) + static_cast<uint8_t>(widthEntityIds);
destIdRaw = static_cast<uint8_t *>(seqNumRaw) + static_cast<uint8_t>(widthSeqNum);
return returnvalue::OK;
}
ReturnValue_t HeaderReader::setData(uint8_t *dataPtr, size_t maxSize_, void *args) {
if (dataPtr == nullptr) {
return returnvalue::FAILED;
}
if (maxSize_ < 7) {
return SerializeIF::STREAM_TOO_SHORT;
}
pointers.rawPtr = dataPtr;
maxSize = maxSize_;
return returnvalue::OK;
}
size_t HeaderReader::getHeaderSize() const {
if (pointers.fixedHeader != nullptr) {
return getLenEntityIds() * 2 + getLenSeqNum() + 4;
}
return 0;
}
size_t HeaderReader::getPduDataFieldLen() const {
return (pointers.fixedHeader->pduDataFieldLenH << 8) | pointers.fixedHeader->pduDataFieldLenL;
}
size_t HeaderReader::getWholePduSize() const {
return getPduDataFieldLen() + HeaderReader::getHeaderSize();
}
cfdp::PduType HeaderReader::getPduType() const {
return static_cast<cfdp::PduType>((pointers.fixedHeader->firstByte >> 4) & 0x01);
}
cfdp::Direction HeaderReader::getDirection() const {
return static_cast<cfdp::Direction>((pointers.fixedHeader->firstByte >> 3) & 0x01);
}
cfdp::TransmissionModes HeaderReader::getTransmissionMode() const {
return static_cast<cfdp::TransmissionModes>((pointers.fixedHeader->firstByte >> 2) & 0x01);
}
bool HeaderReader::getCrcFlag() const { return (pointers.fixedHeader->firstByte >> 1) & 0x01; }
bool HeaderReader::getLargeFileFlag() const { return pointers.fixedHeader->firstByte & 0x01; }
cfdp::SegmentationControl HeaderReader::getSegmentationControl() const {
return static_cast<cfdp::SegmentationControl>((pointers.fixedHeader->fourthByte >> 7) & 0x01);
}
cfdp::WidthInBytes HeaderReader::getLenEntityIds() const {
return static_cast<cfdp::WidthInBytes>((pointers.fixedHeader->fourthByte >> 4) & 0x07);
}
cfdp::WidthInBytes HeaderReader::getLenSeqNum() const {
return static_cast<cfdp::WidthInBytes>(pointers.fixedHeader->fourthByte & 0x07);
}
cfdp::SegmentMetadataFlag HeaderReader::getSegmentMetadataFlag() const {
return static_cast<cfdp::SegmentMetadataFlag>((pointers.fixedHeader->fourthByte >> 3) & 0x01);
}
void HeaderReader::getSourceId(cfdp::EntityId &sourceId) const {
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&sourceId), getLenEntityIds(),
this->sourceIdRaw);
}
void HeaderReader::getDestId(cfdp::EntityId &destId) const {
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&destId), getLenEntityIds(), this->destIdRaw);
}
void HeaderReader::getTransactionSeqNum(cfdp::TransactionSeqNum &seqNum) const {
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&seqNum), getLenSeqNum(), this->seqNumRaw);
}
void HeaderReader::assignVarLenField(cfdp::VarLenField *field, cfdp::WidthInBytes width,
void *sourcePtr) const {
switch (width) {
case (cfdp::WidthInBytes::ONE_BYTE): {
auto *fieldTyped = static_cast<uint8_t *>(sourcePtr);
field->setValue(width, *fieldTyped);
break;
}
case (cfdp::WidthInBytes::TWO_BYTES): {
uint16_t fieldTyped = 0;
size_t deserSize = 0;
SerializeAdapter::deSerialize(&fieldTyped, static_cast<uint8_t *>(sourcePtr), &deserSize,
SerializeIF::Endianness::NETWORK);
field->setValue(width, fieldTyped);
break;
}
case (cfdp::WidthInBytes::FOUR_BYTES): {
uint32_t fieldTyped = 0;
size_t deserSize = 0;
SerializeAdapter::deSerialize(&fieldTyped, static_cast<uint8_t *>(sourcePtr), &deserSize,
SerializeIF::Endianness::NETWORK);
field->setValue(width, fieldTyped);
break;
}
}
}
size_t HeaderReader::getMaxSize() const { return maxSize; }
bool HeaderReader::hasSegmentMetadataFlag() const {
if (this->getSegmentMetadataFlag() == cfdp::SegmentMetadataFlag::PRESENT) {
return true;
}
return false;
}
ReturnValue_t HeaderReader::setData(const uint8_t *dataPtr, size_t maxSize_) {
return setData(const_cast<uint8_t *>(dataPtr), maxSize_, nullptr);
}
bool HeaderReader::isNull() const {
return pointers.rawPtr == nullptr or pointers.fixedHeader == nullptr;
}
HeaderReader::operator bool() const { return not isNull(); }
void HeaderReader::fillConfig(PduConfig &cfg) const {
cfg.largeFile = getLargeFileFlag();
cfg.crcFlag = getCrcFlag();
cfg.mode = getTransmissionMode();
cfg.direction = getDirection();
getTransactionSeqNum(cfg.seqNum);
getSourceId(cfg.sourceId);
getDestId(cfg.destId);
}
@@ -23,15 +23,16 @@ struct PduHeaderFixedStruct {
* This is a zero-copy implementation and #parseData needs to be called to ensure the data is
* valid.
*/
class HeaderDeserializer : public RedirectableDataPointerIF, public PduHeaderIF {
class HeaderReader : public RedirectableDataPointerIF, public PduHeaderIF {
public:
HeaderReader() = default;
/**
* Initialize a PDU header from raw data. This is a zero-copy implementation and #parseData
* needs to be called to ensure the data is valid
* @param pduBuf
* @param maxSize
*/
HeaderDeserializer(const uint8_t* pduBuf, size_t maxSize);
HeaderReader(const uint8_t* pduBuf, size_t maxSize);
/**
* This needs to be called before accessing the PDU fields to avoid segmentation faults.
@@ -41,21 +42,30 @@ class HeaderDeserializer : public RedirectableDataPointerIF, public PduHeaderIF
* - SerializeIF::BUFFER_TOO_SHORT if buffer is shorter than expected
*/
virtual ReturnValue_t parseData();
size_t getHeaderSize() const;
explicit operator bool() const;
[[nodiscard]] bool isNull() const;
size_t getPduDataFieldLen() const override;
size_t getWholePduSize() const override;
/**
* Fill the provided PDU configuration from the fields detected by this reader.
* @param cfg
*/
void fillConfig(PduConfig& cfg) const;
cfdp::PduType getPduType() const override;
cfdp::Direction getDirection() const override;
cfdp::TransmissionModes getTransmissionMode() const override;
bool getCrcFlag() const override;
bool getLargeFileFlag() const override;
cfdp::SegmentationControl getSegmentationControl() const override;
cfdp::WidthInBytes getLenEntityIds() const override;
cfdp::WidthInBytes getLenSeqNum() const override;
cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const override;
bool hasSegmentMetadataFlag() const override;
[[nodiscard]] virtual size_t getHeaderSize() const;
[[nodiscard]] size_t getPduDataFieldLen() const override;
[[nodiscard]] size_t getWholePduSize() const override;
[[nodiscard]] cfdp::PduType getPduType() const override;
[[nodiscard]] cfdp::Direction getDirection() const override;
[[nodiscard]] cfdp::TransmissionModes getTransmissionMode() const override;
[[nodiscard]] bool getCrcFlag() const override;
[[nodiscard]] bool getLargeFileFlag() const override;
[[nodiscard]] cfdp::SegmentationControl getSegmentationControl() const override;
[[nodiscard]] cfdp::WidthInBytes getLenEntityIds() const override;
[[nodiscard]] cfdp::WidthInBytes getLenSeqNum() const override;
[[nodiscard]] cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const override;
[[nodiscard]] bool hasSegmentMetadataFlag() const override;
void getSourceId(cfdp::EntityId& sourceId) const override;
void getDestId(cfdp::EntityId& destId) const override;
@@ -63,6 +73,8 @@ class HeaderDeserializer : public RedirectableDataPointerIF, public PduHeaderIF
ReturnValue_t deserResult = returnvalue::OK;
[[nodiscard]] size_t getMaxSize() const;
/**
* Can also be used to reset the pointer to a nullptr, but the getter functions will not
* perform nullptr checks!
@@ -71,16 +83,27 @@ class HeaderDeserializer : public RedirectableDataPointerIF, public PduHeaderIF
* @param args
* @return
*/
ReturnValue_t setData(uint8_t* dataPtr, size_t maxSize, void* args = nullptr) override;
size_t getMaxSize() const;
ReturnValue_t setData(const uint8_t* dataPtr, size_t maxSize);
protected:
PduHeaderFixedStruct* fixedHeader = nullptr;
const uint8_t* rawPtr = nullptr;
struct Pointers {
PduHeaderFixedStruct* fixedHeader = nullptr;
const uint8_t* rawPtr = nullptr;
};
Pointers pointers;
size_t maxSize = 0;
private:
/**
* Can also be used to reset the pointer to a nullptr, but the getter functions will not
* perform nullptr checks!
* @param dataPtr
* @param maxSize
* @param args
* @return
*/
ReturnValue_t setData(uint8_t* dataPtr, size_t maxSize, void* args) override;
void assignVarLenField(cfdp::VarLenField* field, cfdp::WidthInBytes width, void* sourcePtr) const;
void* sourceIdRaw = nullptr;
void* seqNumRaw = nullptr;
-117
View File
@@ -1,117 +0,0 @@
#include "HeaderSerializer.h"
#include "HeaderDeserializer.h"
HeaderSerializer::HeaderSerializer(PduConfig &pduConf, cfdp::PduType pduType,
size_t initPduDataFieldLen,
cfdp::SegmentMetadataFlag segmentMetadataFlag,
cfdp::SegmentationControl segCtrl)
: pduType(pduType),
segmentMetadataFlag(segmentMetadataFlag),
segmentationCtrl(segCtrl),
pduDataFieldLen(initPduDataFieldLen),
pduConf(pduConf) {}
ReturnValue_t HeaderSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
if (buffer == nullptr or size == nullptr) {
return returnvalue::FAILED;
}
if (maxSize < this->getSerializedSize()) {
return BUFFER_TOO_SHORT;
}
**buffer = cfdp::VERSION_BITS | this->pduType << 4 | pduConf.direction << 3 | pduConf.mode << 2 |
pduConf.crcFlag << 1 | pduConf.largeFile;
*buffer += 1;
**buffer = (pduDataFieldLen & 0xff00) >> 8;
*buffer += 1;
**buffer = pduDataFieldLen & 0x00ff;
*buffer += 1;
**buffer = segmentationCtrl << 7 | pduConf.sourceId.getWidth() << 4 | segmentMetadataFlag << 3 |
pduConf.seqNum.getWidth();
*buffer += 1;
*size += 4;
ReturnValue_t result = pduConf.sourceId.serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
result = pduConf.seqNum.serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
result = pduConf.destId.serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
return returnvalue::OK;
}
size_t HeaderSerializer::getSerializedSize() const {
size_t shit = pduConf.seqNum.getWidth() + pduConf.sourceId.getWidth() * 2 + 4;
return shit;
}
ReturnValue_t HeaderSerializer::deSerialize(const uint8_t **buffer, size_t *size,
Endianness streamEndianness) {
// We could implement this, but I prefer dedicated classes
return returnvalue::FAILED;
}
size_t HeaderSerializer::getWholePduSize() const {
// Return size of header plus the PDU data field length
return pduDataFieldLen + HeaderSerializer::getSerializedSize();
}
size_t HeaderSerializer::getPduDataFieldLen() const { return pduDataFieldLen; }
void HeaderSerializer::setPduDataFieldLen(size_t pduDataFieldLen) {
this->pduDataFieldLen = pduDataFieldLen;
}
void HeaderSerializer::setPduType(cfdp::PduType pduType) { this->pduType = pduType; }
void HeaderSerializer::setSegmentMetadataFlag(cfdp::SegmentMetadataFlag segmentMetadataFlag) {
this->segmentMetadataFlag = segmentMetadataFlag;
}
cfdp::PduType HeaderSerializer::getPduType() const { return pduType; }
cfdp::Direction HeaderSerializer::getDirection() const { return pduConf.direction; }
cfdp::TransmissionModes HeaderSerializer::getTransmissionMode() const { return pduConf.mode; }
bool HeaderSerializer::getCrcFlag() const { return pduConf.crcFlag; }
bool HeaderSerializer::getLargeFileFlag() const { return pduConf.largeFile; }
cfdp::SegmentationControl HeaderSerializer::getSegmentationControl() const {
return segmentationCtrl;
}
cfdp::WidthInBytes HeaderSerializer::getLenEntityIds() const { return pduConf.sourceId.getWidth(); }
cfdp::WidthInBytes HeaderSerializer::getLenSeqNum() const { return pduConf.seqNum.getWidth(); }
cfdp::SegmentMetadataFlag HeaderSerializer::getSegmentMetadataFlag() const {
return segmentMetadataFlag;
}
void HeaderSerializer::getSourceId(cfdp::EntityId &sourceId) const { sourceId = pduConf.sourceId; }
void HeaderSerializer::getDestId(cfdp::EntityId &destId) const { destId = pduConf.destId; }
void HeaderSerializer::setSegmentationControl(cfdp::SegmentationControl segmentationControl) {
this->segmentationCtrl = segmentationControl;
}
void HeaderSerializer::getTransactionSeqNum(cfdp::TransactionSeqNum &seqNum) const {
seqNum = pduConf.seqNum;
}
bool HeaderSerializer::hasSegmentMetadataFlag() const {
if (this->segmentMetadataFlag == cfdp::SegmentMetadataFlag::PRESENT) {
return true;
}
return false;
}
@@ -2,16 +2,16 @@
KeepAlivePduDeserializer::KeepAlivePduDeserializer(const uint8_t* pduBuf, size_t maxSize,
cfdp::FileSize& progress)
: FileDirectiveDeserializer(pduBuf, maxSize), progress(progress) {}
: FileDirectiveReader(pduBuf, maxSize), progress(progress) {}
ReturnValue_t KeepAlivePduDeserializer::parseData() {
ReturnValue_t result = FileDirectiveDeserializer::parseData();
ReturnValue_t result = FileDirectiveReader::parseData();
if (result != returnvalue::OK) {
return result;
}
size_t currentIdx = FileDirectiveDeserializer::getHeaderSize();
size_t remLen = FileDirectiveDeserializer::getWholePduSize() - currentIdx;
const uint8_t* buffer = rawPtr + currentIdx;
size_t currentIdx = FileDirectiveReader::getHeaderSize();
size_t remLen = FileDirectiveReader::getWholePduSize() - currentIdx;
const uint8_t* buffer = pointers.rawPtr + currentIdx;
return progress.deSerialize(&buffer, &remLen, getEndianness());
}
+2 -2
View File
@@ -2,9 +2,9 @@
#define FSFW_SRC_FSFW_CFDP_PDU_KEEPALIVEPDUDESERIALIZER_H_
#include "fsfw/cfdp/FileSize.h"
#include "fsfw/cfdp/pdu/FileDirectiveDeserializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveReader.h"
class KeepAlivePduDeserializer : public FileDirectiveDeserializer {
class KeepAlivePduDeserializer : public FileDirectiveReader {
public:
KeepAlivePduDeserializer(const uint8_t* pduBuf, size_t maxSize, cfdp::FileSize& progress);
+3 -4
View File
@@ -1,12 +1,12 @@
#include "KeepAlivePduSerializer.h"
KeepAlivePduSerializer::KeepAlivePduSerializer(PduConfig &conf, cfdp::FileSize &progress)
: FileDirectiveSerializer(conf, cfdp::FileDirectives::KEEP_ALIVE, 4), progress(progress) {
: FileDirectiveCreator(conf, cfdp::FileDirectives::KEEP_ALIVE, 4), progress(progress) {
updateDirectiveFieldLen();
}
size_t KeepAlivePduSerializer::getSerializedSize() const {
return FileDirectiveSerializer::getWholePduSize();
return FileDirectiveCreator::getWholePduSize();
}
void KeepAlivePduSerializer::updateDirectiveFieldLen() {
@@ -17,8 +17,7 @@ void KeepAlivePduSerializer::updateDirectiveFieldLen() {
ReturnValue_t KeepAlivePduSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result =
FileDirectiveSerializer::serialize(buffer, size, maxSize, streamEndianness);
ReturnValue_t result = FileDirectiveCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
+2 -2
View File
@@ -2,9 +2,9 @@
#define FSFW_SRC_FSFW_CFDP_PDU_KEEPALIVEPDUSERIALIZER_H_
#include "fsfw/cfdp/FileSize.h"
#include "fsfw/cfdp/pdu/FileDirectiveSerializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveCreator.h"
class KeepAlivePduSerializer : public FileDirectiveSerializer {
class KeepAlivePduSerializer : public FileDirectiveCreator {
public:
KeepAlivePduSerializer(PduConfig& conf, cfdp::FileSize& progress);
+35 -30
View File
@@ -1,49 +1,52 @@
#include "MetadataInfo.h"
MetadataInfo::MetadataInfo(bool closureRequested, cfdp::ChecksumType checksumType,
cfdp::FileSize& fileSize, cfdp::Lv& sourceFileName,
cfdp::Lv& destFileName)
: closureRequested(closureRequested),
checksumType(checksumType),
fileSize(fileSize),
sourceFileName(sourceFileName),
destFileName(destFileName) {}
cfdp::FileSize& fileSize, cfdp::StringLv& sourceFileName,
cfdp::StringLv& destFileName)
: MetadataInfo(fileSize, sourceFileName, destFileName) {
this->closureRequested = closureRequested;
this->checksumType = checksumType;
}
void MetadataInfo::setOptionsArray(cfdp::Tlv** optionsArray, size_t* optionsLen,
size_t* maxOptionsLen) {
this->optionsArray = optionsArray;
if (maxOptionsLen != nullptr) {
this->maxOptionsLen = *maxOptionsLen;
MetadataInfo::MetadataInfo(cfdp::FileSize& fileSize, cfdp::StringLv& sourceFileName,
cfdp::StringLv& destFileName)
: fileSize(fileSize), sourceFileName(sourceFileName), destFileName(destFileName) {}
void MetadataInfo::setOptionsArray(cfdp::Tlv** optionsArray_, std::optional<size_t> optionsLen_,
std::optional<size_t> maxOptionsLen_) {
this->optionsArray = optionsArray_;
if (maxOptionsLen_) {
this->maxOptionsLen = maxOptionsLen_.value();
}
if (optionsLen != nullptr) {
this->optionsLen = *optionsLen;
if (optionsLen_) {
this->optionsLen = optionsLen_.value();
}
}
cfdp::ChecksumType MetadataInfo::getChecksumType() const { return checksumType; }
void MetadataInfo::setChecksumType(cfdp::ChecksumType checksumType) {
this->checksumType = checksumType;
void MetadataInfo::setChecksumType(cfdp::ChecksumType checksumType_) {
checksumType = checksumType_;
}
bool MetadataInfo::isClosureRequested() const { return closureRequested; }
void MetadataInfo::setClosureRequested(bool closureRequested) {
this->closureRequested = closureRequested;
void MetadataInfo::setClosureRequested(bool closureRequested_) {
closureRequested = closureRequested_;
}
cfdp::Lv& MetadataInfo::getDestFileName() { return destFileName; }
cfdp::StringLv& MetadataInfo::getDestFileName() { return destFileName; }
cfdp::FileSize& MetadataInfo::getFileSize() { return fileSize; }
ReturnValue_t MetadataInfo::getOptions(cfdp::Tlv*** optionsArray, size_t* optionsLen,
ReturnValue_t MetadataInfo::getOptions(cfdp::Tlv*** optionsArray_, size_t* optionsLen_,
size_t* maxOptsLen) {
if (optionsArray == nullptr or this->optionsArray == nullptr) {
if (optionsArray_ == nullptr or optionsArray == nullptr) {
return returnvalue::FAILED;
}
*optionsArray = this->optionsArray;
if (optionsLen != nullptr) {
*optionsLen = this->optionsLen;
*optionsArray_ = optionsArray;
if (optionsLen_ != nullptr) {
*optionsLen_ = this->optionsLen;
}
if (maxOptsLen != nullptr) {
*maxOptsLen = this->maxOptionsLen;
@@ -81,18 +84,20 @@ size_t MetadataInfo::getSerializedSize(bool fssLarge) {
return size;
}
void MetadataInfo::setDestFileName(cfdp::Lv& destFileName) { this->destFileName = destFileName; }
void MetadataInfo::setDestFileName(cfdp::StringLv& destFileName_) {
this->destFileName = destFileName_;
}
void MetadataInfo::setSourceFileName(cfdp::Lv& sourceFileName) {
this->sourceFileName = sourceFileName;
void MetadataInfo::setSourceFileName(cfdp::StringLv& sourceFileName_) {
this->sourceFileName = sourceFileName_;
}
size_t MetadataInfo::getMaxOptionsLen() const { return maxOptionsLen; }
void MetadataInfo::setMaxOptionsLen(size_t maxOptionsLen) { this->maxOptionsLen = maxOptionsLen; }
void MetadataInfo::setMaxOptionsLen(size_t maxOptionsLen_) { this->maxOptionsLen = maxOptionsLen_; }
size_t MetadataInfo::getOptionsLen() const { return optionsLen; }
void MetadataInfo::setOptionsLen(size_t optionsLen) { this->optionsLen = optionsLen; }
void MetadataInfo::setOptionsLen(size_t optionsLen_) { this->optionsLen = optionsLen_; }
cfdp::Lv& MetadataInfo::getSourceFileName() { return sourceFileName; }
cfdp::StringLv& MetadataInfo::getSourceFileName() { return sourceFileName; }
+21 -15
View File
@@ -1,45 +1,51 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_METADATAINFO_H_
#define FSFW_SRC_FSFW_CFDP_PDU_METADATAINFO_H_
#include <optional>
#include "fsfw/cfdp/FileSize.h"
#include "fsfw/cfdp/definitions.h"
#include "fsfw/cfdp/tlv/Lv.h"
#include "fsfw/cfdp/tlv/StringLv.h"
#include "fsfw/cfdp/tlv/Tlv.h"
class MetadataInfo {
public:
MetadataInfo(cfdp::FileSize& fileSize, cfdp::StringLv& sourceFileName,
cfdp::StringLv& destFileName);
MetadataInfo(bool closureRequested, cfdp::ChecksumType checksumType, cfdp::FileSize& fileSize,
cfdp::Lv& sourceFileName, cfdp::Lv& destFileName);
cfdp::StringLv& sourceFileName, cfdp::StringLv& destFileName);
size_t getSerializedSize(bool fssLarge = false);
void setOptionsArray(cfdp::Tlv** optionsArray, size_t* optionsLen, size_t* maxOptionsLen);
cfdp::ChecksumType getChecksumType() const;
void setOptionsArray(cfdp::Tlv** optionsArray, std::optional<size_t> optionsLen,
std::optional<size_t> maxOptionsLen);
[[nodiscard]] cfdp::ChecksumType getChecksumType() const;
void setChecksumType(cfdp::ChecksumType checksumType);
bool isClosureRequested() const;
[[nodiscard]] bool isClosureRequested() const;
void setClosureRequested(bool closureRequested = false);
void setDestFileName(cfdp::Lv& destFileName);
void setSourceFileName(cfdp::Lv& sourceFileName);
void setDestFileName(cfdp::StringLv& destFileName);
void setSourceFileName(cfdp::StringLv& sourceFileName);
cfdp::Lv& getDestFileName();
cfdp::Lv& getSourceFileName();
cfdp::StringLv& getDestFileName();
cfdp::StringLv& getSourceFileName();
cfdp::FileSize& getFileSize();
bool hasOptions() const;
bool canHoldOptions() const;
[[nodiscard]] bool hasOptions() const;
[[nodiscard]] bool canHoldOptions() const;
ReturnValue_t getOptions(cfdp::Tlv*** optionsArray, size_t* optionsLen, size_t* maxOptsLen);
void setOptionsLen(size_t optionsLen);
size_t getOptionsLen() const;
[[nodiscard]] size_t getOptionsLen() const;
void setMaxOptionsLen(size_t maxOptionsLen);
size_t getMaxOptionsLen() const;
[[nodiscard]] size_t getMaxOptionsLen() const;
private:
bool closureRequested = false;
cfdp::ChecksumType checksumType;
cfdp::ChecksumType checksumType = cfdp::ChecksumType::NULL_CHECKSUM;
cfdp::FileSize& fileSize;
cfdp::Lv& sourceFileName;
cfdp::Lv& destFileName;
cfdp::StringLv& sourceFileName;
cfdp::StringLv& destFileName;
cfdp::Tlv** optionsArray = nullptr;
size_t optionsLen = 0;
@@ -1,22 +1,21 @@
#include "MetadataPduSerializer.h"
#include "MetadataPduCreator.h"
MetadataPduSerializer::MetadataPduSerializer(PduConfig &conf, MetadataInfo &info)
: FileDirectiveSerializer(conf, cfdp::FileDirectives::METADATA, 5), info(info) {
MetadataPduCreator::MetadataPduCreator(PduConfig &conf, MetadataInfo &info)
: FileDirectiveCreator(conf, cfdp::FileDirectives::METADATA, 5), info(info) {
updateDirectiveFieldLen();
}
void MetadataPduSerializer::updateDirectiveFieldLen() {
void MetadataPduCreator::updateDirectiveFieldLen() {
setDirectiveDataFieldLen(info.getSerializedSize(getLargeFileFlag()));
}
size_t MetadataPduSerializer::getSerializedSize() const {
return FileDirectiveSerializer::getWholePduSize();
size_t MetadataPduCreator::getSerializedSize() const {
return FileDirectiveCreator::getWholePduSize();
}
ReturnValue_t MetadataPduSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result =
FileDirectiveSerializer::serialize(buffer, size, maxSize, streamEndianness);
ReturnValue_t MetadataPduCreator::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result = FileDirectiveCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
+22
View File
@@ -0,0 +1,22 @@
#ifndef FSFW_CFDP_PDU_METADATAPDUCREATOR_H_
#define FSFW_CFDP_PDU_METADATAPDUCREATOR_H_
#include "fsfw/cfdp/pdu/FileDirectiveCreator.h"
#include "fsfw/cfdp/pdu/MetadataInfo.h"
class MetadataPduCreator : public FileDirectiveCreator {
public:
MetadataPduCreator(PduConfig& conf, MetadataInfo& info);
void updateDirectiveFieldLen();
[[nodiscard]] size_t getSerializedSize() const override;
ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const override;
private:
MetadataInfo& info;
};
#endif /* FSFW_CFDP_PDU_METADATAPDUCREATOR_H_ */
@@ -1,17 +0,0 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_METADATAPDUDESERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_METADATAPDUDESERIALIZER_H_
#include "fsfw/cfdp/pdu/FileDirectiveDeserializer.h"
#include "fsfw/cfdp/pdu/MetadataInfo.h"
class MetadataPduDeserializer : public FileDirectiveDeserializer {
public:
MetadataPduDeserializer(const uint8_t* pduBuf, size_t maxSize, MetadataInfo& info);
ReturnValue_t parseData() override;
private:
MetadataInfo& info;
};
#endif /* FSFW_SRC_FSFW_CFDP_PDU_METADATAPDUDESERIALIZER_H_ */
@@ -1,17 +1,16 @@
#include "MetadataPduDeserializer.h"
#include "MetadataPduReader.h"
MetadataPduDeserializer::MetadataPduDeserializer(const uint8_t* pduBuf, size_t maxSize,
MetadataInfo& info)
: FileDirectiveDeserializer(pduBuf, maxSize), info(info) {}
MetadataPduReader::MetadataPduReader(const uint8_t* pduBuf, size_t maxSize, MetadataInfo& info)
: FileDirectiveReader(pduBuf, maxSize), info(info) {}
ReturnValue_t MetadataPduDeserializer::parseData() {
ReturnValue_t result = FileDirectiveDeserializer::parseData();
ReturnValue_t MetadataPduReader::parseData() {
ReturnValue_t result = FileDirectiveReader::parseData();
if (result != returnvalue::OK) {
return result;
}
size_t currentIdx = FileDirectiveDeserializer::getHeaderSize();
const uint8_t* buf = rawPtr + currentIdx;
size_t remSize = FileDirectiveDeserializer::getWholePduSize() - currentIdx;
size_t currentIdx = FileDirectiveReader::getHeaderSize();
const uint8_t* buf = pointers.rawPtr + currentIdx;
size_t remSize = FileDirectiveReader::getWholePduSize() - currentIdx;
if (remSize < 1) {
return SerializeIF::STREAM_TOO_SHORT;
}
+17
View File
@@ -0,0 +1,17 @@
#ifndef FSFW_CFDP_PDU_METADATAPDUREADER_H_
#define FSFW_CFDP_PDU_METADATAPDUREADER_H_
#include "fsfw/cfdp/pdu/FileDirectiveReader.h"
#include "fsfw/cfdp/pdu/MetadataInfo.h"
class MetadataPduReader : public FileDirectiveReader {
public:
MetadataPduReader(const uint8_t* pduBuf, size_t maxSize, MetadataInfo& info);
ReturnValue_t parseData() override;
private:
MetadataInfo& info;
};
#endif /* FSFW_CFDP_PDU_METADATAPDUREADER_H_ */
-22
View File
@@ -1,22 +0,0 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_METADATAPDUSERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_METADATAPDUSERIALIZER_H_
#include "fsfw/cfdp/pdu/FileDirectiveSerializer.h"
#include "fsfw/cfdp/pdu/MetadataInfo.h"
class MetadataPduSerializer : public FileDirectiveSerializer {
public:
MetadataPduSerializer(PduConfig& conf, MetadataInfo& info);
void updateDirectiveFieldLen();
size_t getSerializedSize() const override;
ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const override;
private:
MetadataInfo& info;
};
#endif /* FSFW_SRC_FSFW_CFDP_PDU_METADATAPDUSERIALIZER_H_ */
+1 -1
View File
@@ -26,7 +26,7 @@ bool NakInfo::hasSegmentRequests() const {
}
bool NakInfo::canHoldSegmentRequests() const {
if (this->segmentRequests != nullptr and maxSegmentRequestsLen > 0) {
if (segmentRequests != nullptr and maxSegmentRequestsLen > 0) {
return true;
}
return false;
+5 -5
View File
@@ -1,16 +1,16 @@
#include "NakPduDeserializer.h"
NakPduDeserializer::NakPduDeserializer(const uint8_t* pduBuf, size_t maxSize, NakInfo& info)
: FileDirectiveDeserializer(pduBuf, maxSize), nakInfo(info) {}
: FileDirectiveReader(pduBuf, maxSize), nakInfo(info) {}
ReturnValue_t NakPduDeserializer::parseData() {
ReturnValue_t result = FileDirectiveDeserializer::parseData();
ReturnValue_t result = FileDirectiveReader::parseData();
if (result != returnvalue::OK) {
return result;
}
size_t currentIdx = FileDirectiveDeserializer::getHeaderSize();
const uint8_t* buffer = rawPtr + currentIdx;
size_t remSize = FileDirectiveDeserializer::getWholePduSize() - currentIdx;
size_t currentIdx = FileDirectiveReader::getHeaderSize();
const uint8_t* buffer = pointers.rawPtr + currentIdx;
size_t remSize = FileDirectiveReader::getWholePduSize() - currentIdx;
if (remSize < 1) {
return SerializeIF::STREAM_TOO_SHORT;
}
+2 -2
View File
@@ -1,10 +1,10 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_NAKPDUDESERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_NAKPDUDESERIALIZER_H_
#include "fsfw/cfdp/pdu/FileDirectiveDeserializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveReader.h"
#include "fsfw/cfdp/pdu/NakInfo.h"
class NakPduDeserializer : public FileDirectiveDeserializer {
class NakPduDeserializer : public FileDirectiveReader {
public:
NakPduDeserializer(const uint8_t* pduBuf, size_t maxSize, NakInfo& info);
+3 -4
View File
@@ -1,7 +1,7 @@
#include "NakPduSerializer.h"
NakPduSerializer::NakPduSerializer(PduConfig &pduConf, NakInfo &nakInfo)
: FileDirectiveSerializer(pduConf, cfdp::FileDirectives::NAK, 0), nakInfo(nakInfo) {
: FileDirectiveCreator(pduConf, cfdp::FileDirectives::NAK, 0), nakInfo(nakInfo) {
updateDirectiveFieldLen();
}
@@ -10,13 +10,12 @@ void NakPduSerializer::updateDirectiveFieldLen() {
}
size_t NakPduSerializer::getSerializedSize() const {
return FileDirectiveSerializer::getWholePduSize();
return FileDirectiveCreator::getWholePduSize();
}
ReturnValue_t NakPduSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result =
FileDirectiveSerializer::serialize(buffer, size, maxSize, streamEndianness);
ReturnValue_t result = FileDirectiveCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
+2 -2
View File
@@ -6,9 +6,9 @@
#include "NakInfo.h"
#include "fsfw/cfdp/FileSize.h"
#include "fsfw/cfdp/definitions.h"
#include "fsfw/cfdp/pdu/FileDirectiveSerializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveCreator.h"
class NakPduSerializer : public FileDirectiveSerializer {
class NakPduSerializer : public FileDirectiveCreator {
public:
/**
*
+7 -5
View File
@@ -1,12 +1,14 @@
#include "PduConfig.h"
PduConfig::PduConfig(cfdp::TransmissionModes mode, cfdp::TransactionSeqNum seqNum,
cfdp::EntityId sourceId, cfdp::EntityId destId, bool crcFlag, bool largeFile,
#include <utility>
PduConfig::PduConfig(cfdp::EntityId sourceId, cfdp::EntityId destId, cfdp::TransmissionModes mode,
cfdp::TransactionSeqNum seqNum, bool crcFlag, bool largeFile,
cfdp::Direction direction)
: mode(mode),
seqNum(seqNum),
sourceId(sourceId),
destId(destId),
seqNum(std::move(seqNum)),
sourceId(std::move(sourceId)),
destId(std::move(destId)),
crcFlag(crcFlag),
largeFile(largeFile),
direction(direction) {}
+10 -23
View File
@@ -1,36 +1,23 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_PDUCONFIG_H_
#define FSFW_SRC_FSFW_CFDP_PDU_PDUCONFIG_H_
#include "VarLenField.h"
namespace cfdp {
struct EntityId : public VarLenField {
public:
EntityId() : VarLenField() {}
EntityId(cfdp::WidthInBytes width, size_t entityId) : VarLenField(width, entityId) {}
};
struct TransactionSeqNum : public VarLenField {
public:
TransactionSeqNum() : VarLenField() {}
TransactionSeqNum(cfdp::WidthInBytes width, size_t seqNum) : VarLenField(width, seqNum) {}
};
} // namespace cfdp
#include "fsfw/cfdp/VarLenFields.h"
#include "fsfw/cfdp/definitions.h"
class PduConfig {
public:
PduConfig(cfdp::TransmissionModes mode, cfdp::TransactionSeqNum seqNum, cfdp::EntityId sourceId,
cfdp::EntityId destId, bool crcFlag = false, bool largeFile = false,
PduConfig() = default;
PduConfig(cfdp::EntityId sourceId, cfdp::EntityId destId, cfdp::TransmissionModes mode,
cfdp::TransactionSeqNum seqNum, bool crcFlag = false, bool largeFile = false,
cfdp::Direction direction = cfdp::Direction::TOWARDS_RECEIVER);
cfdp::TransmissionModes mode;
cfdp::TransmissionModes mode = cfdp::TransmissionModes::ACKNOWLEDGED;
cfdp::TransactionSeqNum seqNum;
cfdp::EntityId sourceId;
cfdp::EntityId destId;
bool crcFlag;
bool largeFile;
cfdp::Direction direction;
bool crcFlag = false;
bool largeFile = false;
cfdp::Direction direction = cfdp::Direction::TOWARDS_RECEIVER;
};
#endif /* FSFW_SRC_FSFW_CFDP_PDU_PDUCONFIG_H_ */
+14 -14
View File
@@ -3,8 +3,8 @@
#include <cstddef>
#include "../definitions.h"
#include "PduConfig.h"
#include "fsfw/cfdp/definitions.h"
/**
* @brief Generic interface to access all fields of a PDU header
@@ -13,20 +13,20 @@
*/
class PduHeaderIF {
public:
virtual ~PduHeaderIF(){};
virtual ~PduHeaderIF() = default;
virtual size_t getWholePduSize() const = 0;
virtual size_t getPduDataFieldLen() const = 0;
virtual cfdp::PduType getPduType() const = 0;
virtual cfdp::Direction getDirection() const = 0;
virtual cfdp::TransmissionModes getTransmissionMode() const = 0;
virtual bool getCrcFlag() const = 0;
virtual bool getLargeFileFlag() const = 0;
virtual cfdp::SegmentationControl getSegmentationControl() const = 0;
virtual cfdp::WidthInBytes getLenEntityIds() const = 0;
virtual cfdp::WidthInBytes getLenSeqNum() const = 0;
virtual cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const = 0;
virtual bool hasSegmentMetadataFlag() const = 0;
[[nodiscard]] virtual size_t getWholePduSize() const = 0;
[[nodiscard]] virtual size_t getPduDataFieldLen() const = 0;
[[nodiscard]] virtual cfdp::PduType getPduType() const = 0;
[[nodiscard]] virtual cfdp::Direction getDirection() const = 0;
[[nodiscard]] virtual cfdp::TransmissionModes getTransmissionMode() const = 0;
[[nodiscard]] virtual bool getCrcFlag() const = 0;
[[nodiscard]] virtual bool getLargeFileFlag() const = 0;
[[nodiscard]] virtual cfdp::SegmentationControl getSegmentationControl() const = 0;
[[nodiscard]] virtual cfdp::WidthInBytes getLenEntityIds() const = 0;
[[nodiscard]] virtual cfdp::WidthInBytes getLenSeqNum() const = 0;
[[nodiscard]] virtual cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const = 0;
[[nodiscard]] virtual bool hasSegmentMetadataFlag() const = 0;
virtual void getSourceId(cfdp::EntityId& sourceId) const = 0;
virtual void getDestId(cfdp::EntityId& destId) const = 0;
virtual void getTransactionSeqNum(cfdp::TransactionSeqNum& seqNum) const = 0;
+5 -5
View File
@@ -1,21 +1,21 @@
#include "PromptPduDeserializer.h"
PromptPduDeserializer::PromptPduDeserializer(const uint8_t *pduBuf, size_t maxSize)
: FileDirectiveDeserializer(pduBuf, maxSize) {}
: FileDirectiveReader(pduBuf, maxSize) {}
cfdp::PromptResponseRequired PromptPduDeserializer::getPromptResponseRequired() const {
return responseRequired;
}
ReturnValue_t PromptPduDeserializer::parseData() {
ReturnValue_t result = FileDirectiveDeserializer::parseData();
ReturnValue_t result = FileDirectiveReader::parseData();
if (result != returnvalue::OK) {
return result;
}
size_t currentIdx = FileDirectiveDeserializer::getHeaderSize();
if (FileDirectiveDeserializer::getWholePduSize() - currentIdx < 1) {
if (FileDirectiveReader::getWholePduSize() <= FileDirectiveReader::getHeaderSize()) {
return SerializeIF::STREAM_TOO_SHORT;
}
responseRequired = static_cast<cfdp::PromptResponseRequired>((rawPtr[currentIdx] >> 7) & 0x01);
responseRequired = static_cast<cfdp::PromptResponseRequired>(
(pointers.rawPtr[FileDirectiveReader::getHeaderSize()] >> 7) & 0x01);
return returnvalue::OK;
}
+3 -3
View File
@@ -1,13 +1,13 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_PROMPTPDUDESERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_PROMPTPDUDESERIALIZER_H_
#include "fsfw/cfdp/pdu/FileDirectiveDeserializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveReader.h"
class PromptPduDeserializer : public FileDirectiveDeserializer {
class PromptPduDeserializer : public FileDirectiveReader {
public:
PromptPduDeserializer(const uint8_t *pduBuf, size_t maxSize);
cfdp::PromptResponseRequired getPromptResponseRequired() const;
[[nodiscard]] cfdp::PromptResponseRequired getPromptResponseRequired() const;
ReturnValue_t parseData() override;
private:
+4 -5
View File
@@ -2,24 +2,23 @@
PromptPduSerializer::PromptPduSerializer(PduConfig &conf,
cfdp::PromptResponseRequired responseRequired)
: FileDirectiveSerializer(conf, cfdp::FileDirectives::PROMPT, 1),
: FileDirectiveCreator(conf, cfdp::FileDirectives::PROMPT, 1),
responseRequired(responseRequired) {}
size_t PromptPduSerializer::getSerializedSize() const {
return FileDirectiveSerializer::getWholePduSize();
return FileDirectiveCreator::getWholePduSize();
}
ReturnValue_t PromptPduSerializer::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const {
ReturnValue_t result =
FileDirectiveSerializer::serialize(buffer, size, maxSize, streamEndianness);
ReturnValue_t result = FileDirectiveCreator::serialize(buffer, size, maxSize, streamEndianness);
if (result != returnvalue::OK) {
return result;
}
if (*size + 1 > maxSize) {
return SerializeIF::BUFFER_TOO_SHORT;
}
**buffer = this->responseRequired << 7;
**buffer = responseRequired << 7;
*buffer += 1;
*size += 1;
return result;
+3 -3
View File
@@ -1,13 +1,13 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_PROMPTPDUSERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_PROMPTPDUSERIALIZER_H_
#include "fsfw/cfdp/pdu/FileDirectiveSerializer.h"
#include "fsfw/cfdp/pdu/FileDirectiveCreator.h"
class PromptPduSerializer : public FileDirectiveSerializer {
class PromptPduSerializer : public FileDirectiveCreator {
public:
PromptPduSerializer(PduConfig& conf, cfdp::PromptResponseRequired responseRequired);
size_t getSerializedSize() const override;
[[nodiscard]] size_t getSerializedSize() const override;
ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const override;
-47
View File
@@ -1,47 +0,0 @@
#ifndef FSFW_SRC_FSFW_CFDP_PDU_VARLENFIELD_H_
#define FSFW_SRC_FSFW_CFDP_PDU_VARLENFIELD_H_
#include <cstddef>
#include <cstdint>
#include "../definitions.h"
#include "fsfw/serialize/SerializeIF.h"
namespace cfdp {
class VarLenField : public SerializeIF {
public:
union LengthFieldLen {
uint8_t oneByte;
uint16_t twoBytes;
uint32_t fourBytes;
uint64_t eightBytes;
};
VarLenField();
VarLenField(cfdp::WidthInBytes width, size_t value);
ReturnValue_t setValue(cfdp::WidthInBytes, size_t value);
ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const override;
size_t getSerializedSize() const override;
ReturnValue_t deSerialize(cfdp::WidthInBytes width, const uint8_t **buffer, size_t *size,
Endianness streamEndianness);
cfdp::WidthInBytes getWidth() const;
size_t getValue() const;
private:
ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
Endianness streamEndianness) override;
cfdp::WidthInBytes width;
LengthFieldLen value;
};
} // namespace cfdp
#endif /* FSFW_SRC_FSFW_CFDP_PDU_VARLENFIELD_H_ */
+1
View File
@@ -5,6 +5,7 @@ target_sources(
FilestoreResponseTlv.cpp
Lv.cpp
Tlv.cpp
StringLv.cpp
FlowLabelTlv.cpp
MessageToUserTlv.cpp
FaultHandlerOverrideTlv.cpp)
@@ -1,10 +1,10 @@
#include "FaultHandlerOverrideTlv.h"
FaultHandlerOverrideTlv::FaultHandlerOverrideTlv(cfdp::ConditionCode conditionCode,
cfdp::FaultHandlerCode handlerCode)
cfdp::FaultHandlerCodes handlerCode)
: conditionCode(conditionCode), handlerCode(handlerCode) {}
FaultHandlerOverrideTlv::FaultHandlerOverrideTlv() {}
FaultHandlerOverrideTlv::FaultHandlerOverrideTlv() = default;
uint8_t FaultHandlerOverrideTlv::getLengthField() const { return 1; }
@@ -45,7 +45,7 @@ ReturnValue_t FaultHandlerOverrideTlv::deSerialize(const uint8_t **buffer, size_
*buffer += 1;
*size += 1;
this->conditionCode = static_cast<cfdp::ConditionCode>((**buffer >> 4) & 0x0f);
this->handlerCode = static_cast<cfdp::FaultHandlerCode>(**buffer & 0x0f);
this->handlerCode = static_cast<cfdp::FaultHandlerCodes>(**buffer & 0x0f);
*buffer += 1;
*size += 1;
return returnvalue::OK;
+5 -17
View File
@@ -3,36 +3,24 @@
#include "TlvIF.h"
namespace cfdp {
enum FaultHandlerCode {
RESERVED = 0b0000,
NOTICE_OF_CANCELLATION = 0b0001,
NOTICE_OF_SUSPENSION = 0b0010,
IGNORE_ERROR = 0b0011,
ABANDON_TRANSACTION = 0b0100
};
}
class FaultHandlerOverrideTlv : public TlvIF {
public:
FaultHandlerOverrideTlv();
FaultHandlerOverrideTlv(cfdp::ConditionCode conditionCode, cfdp::FaultHandlerCode handlerCode);
FaultHandlerOverrideTlv(cfdp::ConditionCode conditionCode, cfdp::FaultHandlerCodes handlerCode);
ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize,
Endianness streamEndianness) const override;
size_t getSerializedSize() const override;
[[nodiscard]] size_t getSerializedSize() const override;
ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
Endianness streamEndianness) override;
uint8_t getLengthField() const override;
cfdp::TlvTypes getType() const override;
[[nodiscard]] uint8_t getLengthField() const override;
[[nodiscard]] cfdp::TlvTypes getType() const override;
private:
cfdp::ConditionCode conditionCode = cfdp::ConditionCode::NO_CONDITION_FIELD;
cfdp::FaultHandlerCode handlerCode = cfdp::FaultHandlerCode::RESERVED;
cfdp::FaultHandlerCodes handlerCode = cfdp::FaultHandlerCodes::RESERVED;
};
#endif /* FSFW_SRC_FSFW_CFDP_TLV_FAULTHANDLEROVERRIDETLV_H_ */
+2 -2
View File
@@ -3,10 +3,10 @@
#include "fsfw/FSFW.h"
FilestoreRequestTlv::FilestoreRequestTlv(cfdp::FilestoreActionCode actionCode,
cfdp::Lv &firstFileName)
cfdp::StringLv &firstFileName)
: FilestoreTlvBase(actionCode, firstFileName) {}
FilestoreRequestTlv::FilestoreRequestTlv(cfdp::Lv &firstFileName)
FilestoreRequestTlv::FilestoreRequestTlv(cfdp::StringLv &firstFileName)
: FilestoreTlvBase(cfdp::FilestoreActionCode::INVALID, firstFileName) {}
void FilestoreRequestTlv::setSecondFileName(cfdp::Lv *secondFileName) {
+4 -4
View File
@@ -9,9 +9,9 @@
class FilestoreRequestTlv : public cfdp::FilestoreTlvBase {
public:
FilestoreRequestTlv(cfdp::FilestoreActionCode actionCode, cfdp::Lv &firstFileName);
FilestoreRequestTlv(cfdp::FilestoreActionCode actionCode, cfdp::StringLv &firstFileName);
FilestoreRequestTlv(cfdp::Lv &firstFileName);
explicit FilestoreRequestTlv(cfdp::StringLv &firstFileName);
void setSecondFileName(cfdp::Lv *secondFileName);
@@ -29,8 +29,8 @@ class FilestoreRequestTlv : public cfdp::FilestoreTlvBase {
ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size,
Endianness streamEndianness) override;
uint8_t getLengthField() const override;
cfdp::TlvTypes getType() const override;
[[nodiscard]] uint8_t getLengthField() const override;
[[nodiscard]] cfdp::TlvTypes getType() const override;
private:
cfdp::Lv *secondFileName = nullptr;

Some files were not shown because too many files have changed in this diff Show More