Squashed commit of the following:

commit 27e5254ecd
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 13 11:45:47 2021 +0100

    include fixes

commit eb5c56664f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 21:03:09 2021 +0100

    relative include

commit af7e9194e5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 21:01:55 2021 +0100

    more consistency renamings

commit 634a8f3469
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 20:59:15 2021 +0100

    renamed to pool manager for consistency

commit 0b08ac1004
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 20:56:53 2021 +0100

    updated template config files

commit b637f03389
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 20:54:52 2021 +0100

    updated defaultconfig

commit 59b4f50c1c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 20:53:30 2021 +0100

    added FSFW verbose level

commit f9a8c3d35a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 20:46:54 2021 +0100

    updated .mk support

commit b3e2e93f52
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 20:46:34 2021 +0100

    cleaned up a bit

commit 20bf7b6fc4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 20:33:53 2021 +0100

    fixed annoying bug

commit fa636fded5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 20:15:15 2021 +0100

    source files for attorney

commit 0643faf0e5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 19:59:43 2021 +0100

    forward declaration correctness

commit 40ae81c4ff
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 19:58:29 2021 +0100

    unfortunate api change

    should improve include robustness

commit 71a12792a9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 19:41:47 2021 +0100

    hopefully this fixes circular includes

commit 3242264a77
Merge: cafc8e4c 25a86e91
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 15:04:00 2021 +0100

    Merge remote-tracking branch 'upstream/mueller/master' into mueller/master

commit cafc8e4ccb
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 14:08:51 2021 +0100

    updated attorneys

commit 25a86e91de
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 13:23:24 2021 +0100

    fixed warning of static var

commit 7e394ea15f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 13:18:18 2021 +0100

    replaced all fsfw:: by sif:: for printouts

commit 071ce21f09
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 13:12:44 2021 +0100

    renamed namepsace for printers

commit bb10c25909
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 12 00:13:49 2021 +0100

    introduced new accessor IF

commit 0109428d47
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 22:46:40 2021 +0100

    indentation

commit fa5580cb7f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 22:45:04 2021 +0100

    indentation

commit 58d813c249
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 22:33:58 2021 +0100

    minor formatting stuff

commit 0be4c35b73
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 22:32:36 2021 +0100

    using 100 line width now

commit 44955db341
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 22:27:24 2021 +0100

    tab replacement

commit a8873e608c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 22:25:39 2021 +0100

    cleaning up

commit 065f79615a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 22:21:21 2021 +0100

    compiling again

commit 5bc46bae02
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 22:18:42 2021 +0100

    reverted some stuff

commit 037bd83af9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 21:31:03 2021 +0100

    trying new interface

commit 0bf0d8e743
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 20:20:39 2021 +0100

    stuff

commit 54e97f7bdc
Merge: ef9ad60b 217866c0
Author: NguSa1 <sa.nguyen@gmx.de>
Date:   Mon Jan 11 20:18:11 2021 +0100

    Merge branch 'sa/new-if' into mueller/master

commit 217866c042
Author: NguSa1 <sa.nguyen@gmx.de>
Date:   Mon Jan 11 19:44:07 2021 +0100

    SubscriptIF implementation started

commit ef9ad60ba8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 16:38:25 2021 +0100

    doc update

commit 5e251705f6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 16:33:02 2021 +0100

    getter function for object iD

commit af7def3368
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 16:26:46 2021 +0100

    some bugfixes

commit 6010246592
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 16:21:41 2021 +0100

    rearchitectured a little bit

commit 2d28f71eca
Merge: f083e83f e497c4ab
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 11 00:49:33 2021 +0100

    Merge remote-tracking branch 'upstream/mueller/master' into mueller/master

commit e497c4ab15
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 17:34:21 2021 +0100

    added new reamde file stubs

commit c956feafd6
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 17:30:31 2021 +0100

    added new readme which will be filled later

commit 1f901a14ff
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 17:28:13 2021 +0100

    updated osal readme

commit 368b42c7b0
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 17:26:48 2021 +0100

    formatting improvements

commit 6dde0ab8f6
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 17:25:51 2021 +0100

    readme update

commit 952438f252
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 17:25:19 2021 +0100

    README

commit 7a053b6f72
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 17:24:19 2021 +0100

    updated README

commit 4bfbeead00
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 15:04:47 2021 +0100

    additional doc

commit 63ce87acab
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 14:59:03 2021 +0100

    more indentation corrections

commit 15b65b78e7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 14:57:56 2021 +0100

    ndentiation

commit 6993415873
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 14:54:05 2021 +0100

    more tests

commit 4fa9a1fe19
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 14:33:02 2021 +0100

    added more tests

commit 69e931c07b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 14:27:57 2021 +0100

    important logic fix

commit 1af28dd457
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 13:59:40 2021 +0100

    updated user folder for unittests

commit b570da6467
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 13:58:33 2021 +0100

    more tests added

commit 918200e88c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 12:53:01 2021 +0100

    added first unit tests for hk manager

commit f8abf3527d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 10 11:51:33 2021 +0100

    fixed indentation

commit 13ffcfe801
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 9 16:20:35 2021 +0100

    prints added

commit 7129ea67bd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 9 16:06:54 2021 +0100

    linux fixes

commit 36bc7609c5
Merge: dbe326e7 57829faa
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 9 13:52:57 2021 +0100

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/master

commit dbe326e787
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 9 13:52:47 2021 +0100

    minor tweak

commit f083e83f63
Merge: ffb7b41f 57829faa
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 21:09:29 2021 +0100

    Merge remote-tracking branch 'upstream/mueller/master' into mueller/master

commit 57829faa64
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 21:03:47 2021 +0100

    added cast

commit ffb7b41f0a
Merge: b59d6d32 12091ca6
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 20:56:23 2021 +0100

    Merge remote-tracking branch 'upstream/mueller/master' into mueller/master

commit 12091ca6ab
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 20:55:36 2021 +0100

    enum members renamed, global vars static now

commit b59d6d3244
Merge: f64e356d 7c47b1ce
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 20:46:49 2021 +0100

    Merge remote-tracking branch 'upstream/mueller/master' into mueller/master

commit 7c47b1ce34
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 20:44:05 2021 +0100

    100 percent test coverage for pool vector

commit 9f15cd697d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 16:23:57 2021 +0100

    improved includes

commit a1c394143a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 16:18:08 2021 +0100

    small formatting stuff

commit a9dba82661
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 16:16:17 2021 +0100

    bugfix

commit c0fd981360
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 16:14:11 2021 +0100

    improved DHB error handling

commit 541478e4d5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 15:15:02 2021 +0100

    another small improvement

commit f2ecd6d740
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 15:10:33 2021 +0100

    revamed and imroved error handling

commit 5a8647d367
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 13:40:13 2021 +0100

    better returnvalues etc.

commit 3b39c6b6e2
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 02:07:37 2021 +0100

    defaultcfg update

commit 2ef3e0aa7b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 02:06:27 2021 +0100

    added option to add CR for printf support

commit 4255176b5c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 01:49:00 2021 +0100

    more tests, minor bugfix

commit 41d8cbda55
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 00:22:04 2021 +0100

    small form changes

commit 8e3f4c81a5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 00:20:39 2021 +0100

    pool entry doc correction

commit c1c331e29e
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 8 00:10:10 2021 +0100

    fixed vector test

commit d3405ee340
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 7 20:30:52 2021 +0100

    whitespace

commit d3fbe4a3b9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 7 20:29:38 2021 +0100

    local pool variable error handling improved

commit 44a5430555
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 7 20:28:03 2021 +0100

    pool vector improvements

commit 3be51762cc
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 7 20:23:23 2021 +0100

    improved error handling significantly

commit 007526c050
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 7 19:10:07 2021 +0100

    new f unctions for read error reporting, bugfix

commit 8aaf45049f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 21:49:40 2021 +0100

    major bugfix in rtems osal

commit fcb33201a4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 21:45:35 2021 +0100

    fixed linux osal

commit 2b287dfc3a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 21:33:54 2021 +0100

    freertos and pool read helper fix

commit dacdfc62d3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 21:14:23 2021 +0100

    a lot of bugfixes and important api change

commit 91cf5f1764
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 19:49:58 2021 +0100

    added way to completely disable printouts

commit db7d28f852
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 19:32:33 2021 +0100

    test update

commit 8807772d13
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 19:16:41 2021 +0100

    100 % line coverage reached

commit dc8dd770e7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 19:07:35 2021 +0100

    added more tests

commit 16458f6a1e
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 18:20:38 2021 +0100

    continued tests

commit bd93392b59
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 6 16:26:08 2021 +0100

    local pool variabel tweaks and fixes

commit b241ef6aad
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 5 22:51:49 2021 +0100

    continued tests

commit a05cf8d4ab
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 5 22:46:17 2021 +0100

    updated tests

commit 85764ba94c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 5 17:30:15 2021 +0100

    added include

commit fbb063ceda
Merge: 8e3aef5d 3c041388
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 5 16:44:52 2021 +0100

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/master

commit 3c041388d6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 4 15:31:06 2021 +0100

    bugfix

commit cca5689a18
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 4 15:17:11 2021 +0100

    clock improvements for rtems

commit 8e3aef5df0
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 4 00:21:44 2021 +0100

    adding new tests for local pool variable

commit 49c6cd9473
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 3 23:27:49 2021 +0100

    added local pool owner base

commit e9a8313df7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 3 23:18:10 2021 +0100

    repaired unit tests

commit e9da8e79f3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 3 22:00:40 2021 +0100

    updated testcfg

commit f64e356de3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 3 16:42:29 2021 +0100

    small include fix

commit fd44fb4781
Merge: 3486a047 c94a396f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 3 16:00:09 2021 +0100

    Merge remote-tracking branch 'upstream/mueller/master' into mueller/master

commit 3486a04741
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Dec 25 00:37:24 2020 +0100

    renaming for name shadowing

commit ccbbef7778
Merge: 208ad7d4 52d9a55d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 17:54:10 2020 +0100

    Merge branch 'development' into mueller/master

commit 208ad7d479
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:24:52 2020 +0100

    fixed timeslot task doc

commit e55df691ff
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:24:15 2020 +0100

    upstream subsystem taken over

commit 27d03dc17f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:21:17 2020 +0100

    upstream cmakelists f iles taken over

commit f905a753e2
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:20:24 2020 +0100

    upstream unittest folder adapted

commit 41dc9ce6c6
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:19:30 2020 +0100

    cmake lists form upstream taken over

commit 707bb9dd5d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:18:50 2020 +0100

    serviceinterface taken over

commit 2e1ad41da7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:18:12 2020 +0100

    power and pus upstream taken over

commit f6e7e232f5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:17:15 2020 +0100

    parameter upstream taken over

commit c174c9ecb8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:15:18 2020 +0100

    osal taken over

commit e052a9694f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:10:13 2020 +0100

    upstream stuff

commit c603bcc91c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:08:24 2020 +0100

    some upstream stuff taken over

commit f21f43754b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:06:46 2020 +0100

    taken over upstream defaultcfg

commit 7b98b0d5dd
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:04:39 2020 +0100

    txt is md now

commit df7a2322bf
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:03:56 2020 +0100

    timemanager update

commit 8f88032110
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 16:00:30 2020 +0100

    taken over upstream .mk file

commit a73cd37e52
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 15:59:46 2020 +0100

    taken over changelog

commit 75a0df4cd9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 15:59:28 2020 +0100

    tm storage update

commit 7ba660a222
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 14:18:48 2020 +0100

    removed comment

commit 947dfd69e9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 14:16:33 2020 +0100

    service types.h delted

commit 362578e982
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 14:12:35 2020 +0100

    transition delay abstract

commit 8896752927
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 13:22:10 2020 +0100

    updated readme

commit 632f319a2f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 13:19:00 2020 +0100

    updated readme

commit 95a8dd418c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 13:29:58 2020 +0100

    added cmake lists

commit ee05a34c9e
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 13:27:47 2020 +0100

    added gitmodules

commit 5e8aff0603
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 13:25:00 2020 +0100

    unittest update

commit e41aba719c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 13:20:17 2020 +0100

    updated testcfg

commit b97b67d56e
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 13:19:07 2020 +0100

    updating unittest folder

commit 770336fff3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 13:06:35 2020 +0100

    added ipc cmakelists

commit 81201d6fb7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 00:39:51 2020 +0100

    typo

commit 38983407fd
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 00:22:35 2020 +0100

    added default implementation for setNormalDatapool

    entries invalid

commit 6abc560094
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Tue Dec 22 00:55:47 2020 +0100

    feed back include improvements

commit 8dd9d6ad91
Merge: c2619bf0 17a12b78
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 21 23:39:34 2020 +0100

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit c2619bf070
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 21 23:39:24 2020 +0100

    transition delay not 0 anymore

commit 17a12b7807
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Mon Dec 21 14:05:44 2020 +0100

    clock update

commit a6e38afb98
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Mon Dec 21 14:04:04 2020 +0100

    buffer more explicit eof()

commit 30c9209c74
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Mon Dec 21 14:03:19 2020 +0100

    better win udp polling task error handling

commit e511dc61b4
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Mon Dec 21 14:02:41 2020 +0100

    upstream osal endiness adapted

commit de61d0c3ac
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Mon Dec 21 14:02:13 2020 +0100

    upstream timeval op

commit ca25714646
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Mon Dec 21 14:01:48 2020 +0100

    upstream coordinates taken over

commit 60d69c95c4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 17 17:10:27 2020 +0100

    address in use handling for socket

commit f8b34bcb53
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 16 13:53:36 2020 +0100

    some readme improvements

commit 8706d663d5
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Tue Dec 15 22:57:14 2020 +0100

    upstream changes taken over

commit f99bf6d75c
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Tue Dec 15 22:51:30 2020 +0100

    taken over cmake list for storagemanager

commit 1f7938f610
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Tue Dec 15 22:46:55 2020 +0100

    deleted archive folder

commit 910e6817ef
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 15 15:48:06 2020 +0100

    default cfg update

commit 48aef06837
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 15 15:24:46 2020 +0100

    fsfwconfig update

commit ca52255d30
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 15 15:20:32 2020 +0100

    update

commit 3e41b202a1
Merge: 052e2ed1 0c3e87f1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 15 14:41:07 2020 +0100

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit 052e2ed1e8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 15 14:40:49 2020 +0100

    type update, assert that type is not boolean

commit 0c3e87f1de
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 23:55:54 2020 +0100

    using new xTaskDelayUntil

commit b8f4d8690b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 23:38:06 2020 +0100

    determination of freeRTOS features from version

commit 9170f466e8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 23:21:07 2020 +0100

    freeRTOS version checks

commit 95b2191824
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 22:55:12 2020 +0100

    long name

commit 3ee25785a2
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:54:03 2020 +0100

    linux changes adapted

commit f2ba653833
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:47:42 2020 +0100

    ipc changes taken over

commit db42e79fd4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:38:45 2020 +0100

    taken over cmakelists file

commit 1c79da0e75
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:34:29 2020 +0100

    tc distrib changed  taken over

commit 796f0e2e17
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:33:19 2020 +0100

    important changes adapted

commit 8c88255873
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:31:50 2020 +0100

    taken over some tweaks

commit d2f631a955
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:20:21 2020 +0100

    cast added

commit f604d621e8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:19:12 2020 +0100

    removed interrupt class

commit 6911f91744
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:15:41 2020 +0100

    rtems fixes taken over

commit c1a156dde3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:08:35 2020 +0100

    catch factory in objects folder again

commit 050770c184
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 21:07:58 2020 +0100

    catch factory fixes

commit 14a0573f3d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 20:58:20 2020 +0100

    one define now

commit b14c1c43cc
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 20:50:56 2020 +0100

    small fix

commit 2100ae34f2
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 20:49:17 2020 +0100

    event folder taken over

commit a0e7584e84
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 20:19:23 2020 +0100

    tiny tweak

commit a547fafa33
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 11:49:01 2020 +0100

    minor tweaks

commit 3dd86039bb
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 11:43:32 2020 +0100

    changes taken over

commit d3239b9064
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 11:41:40 2020 +0100

    tiny format stuff

commit 89de4cc321
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 11:40:26 2020 +0100

    changes and tweaks taken over

commit 5c6916a078
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 11:23:23 2020 +0100

    small tweaks

commit 620c9c6ae1
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 11:19:05 2020 +0100

    taken over freeRTOS changes

commit 073cd4f5e1
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 11:09:53 2020 +0100

    small tweaks

commit 7ace117c42
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 11:06:09 2020 +0100

    added cmakelistst

commit 0ccd266f51
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 10:49:00 2020 +0100

    internal unittests fixed

commit f161a94113
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 14 10:44:48 2020 +0100

    taken over upstream fixes

commit 692aa087d8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 22:13:22 2020 +0100

    taken over cleaned up branch

commit 3f77fab2d9
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 22:01:38 2020 +0100

    taken over cmake lists

commit 7c390c07ee
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 21:58:54 2020 +0100

    taken over unnittest folder from upstream

commit 0b056720ba
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 21:57:06 2020 +0100

    taken over master

commit d944e25d4a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 21:54:46 2020 +0100

    taken over upstream changes

commit f69113b4d5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 21:53:37 2020 +0100

    taken over upstream change in ipc

commit 0e42ba062d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 21:51:46 2020 +0100

    notice taken over

commit 62e16b13d3
Merge: b7dbdb07 b2d01a31
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 21:51:09 2020 +0100

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit b7dbdb072d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 13 21:50:33 2020 +0100

    taken over upstream changes

commit b2d01a31c2
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Thu Dec 10 16:58:18 2020 +0100

    removed some commented stuff

commit 5bad114205
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Thu Dec 10 16:39:31 2020 +0100

    thermal module set heating repaired

commit 9a540e97c5
Author: Spacefish <robin.mueller.m@gmail.com>
Date:   Thu Dec 10 16:36:44 2020 +0100

    taken over thermal module from thermal-update

commit df333e0cc8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 8 16:01:23 2020 +0100

    tab replacement

commit e9a740f110
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 8 16:00:02 2020 +0100

    small tweak

commit beab942f07
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 8 15:57:30 2020 +0100

    fixes taken over from master

commit 322dd1253e
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 8 15:15:22 2020 +0100

    map packet extract update

commit d9cccdedf3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 8 14:34:56 2020 +0100

    event update

commit 89e80beb62
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Dec 5 17:10:36 2020 +0100

    task if set now

commit 248ceebf81
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Dec 5 17:09:49 2020 +0100

    taken over host osal from upstream branch

commit c5c776e676
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 3 18:57:50 2020 +0100

    rtems changes taken over from upstream

commit b7a29235f8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 3 13:28:56 2020 +0100

    deleted memory proxy file

commit 6d915b7dcf
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 2 23:26:40 2020 +0100

    doc formatting

commit 21c3db4ffc
Merge: 586e8b03 4d76bf24
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 2 23:22:40 2020 +0100

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit 586e8b0347
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 2 23:22:28 2020 +0100

    function more robust now

commit f4ed0ce502
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 2 23:18:48 2020 +0100

    doc format improvements

commit 5e77058add
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 2 23:15:30 2020 +0100

    added getter function for pending command

commit 4d76bf24b5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 19:16:19 2020 +0100

    fsfw compiles without datapoolglob folder

commit e3de5ce777
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 19:12:40 2020 +0100

    device handler changes complete

commit 74b2830d9b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 18:55:53 2020 +0100

    using new device handler thermal set

commit fff928a191
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 18:29:00 2020 +0100

    bugfixes and improvements

commit 3fb3039be5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 18:16:26 2020 +0100

    minus 1 replacement

commit 0116bb8663
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 18:15:09 2020 +0100

    replacing global pool with local pool DHB

commit 84ab5f8318
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 17:19:26 2020 +0100

    readme and logo update

commit 314dc577b5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 17:19:00 2020 +0100

    added changelog from upstream

commit e0f063f232
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 17:14:44 2020 +0100

    comment added

commit e323c69f20
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 13:36:30 2020 +0100

    better name for preproc define

commit f357de21c9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 1 13:23:51 2020 +0100

    updated testcfg

commit ef2e07b389
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 17:03:14 2020 +0100

    added explicit type conversion operator

commit d1beb96c60
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 16:30:20 2020 +0100

    some more replacements

commit f108ae883c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 16:28:16 2020 +0100

    local pool replacement

commit f581b37fcf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 16:25:09 2020 +0100

    thermal module replacements

commit 4bb9dd816e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 16:06:59 2020 +0100

    compiling again

commit f70ee7696a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 15:30:56 2020 +0100

    it compiles again

commit e7a96d5ad8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 14:13:52 2020 +0100

    it doesnt work? comment it !

commit 25f08b8c1f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 13:59:54 2020 +0100

    started replacing local pool vars

commit b7945dfe60
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 13:45:08 2020 +0100

    added gp_id_t

commit fa4597782e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 13:09:56 2020 +0100

    some improvements taken over from master

commit f0ca4be71e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 30 13:09:03 2020 +0100

    fsfw version include removed

commit 952978f999
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Nov 29 13:04:38 2020 +0100

    moved perform hk op call

commit 279df93cdf
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Nov 29 13:01:37 2020 +0100

    form and doc comments

commit b7fb1b42e6
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Nov 29 12:43:19 2020 +0100

    added new cfg option

commit 03fad1cfcd
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Nov 19 00:10:59 2020 +0100

    better naming.. hopefully..

commit 0d79d4ab03
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Nov 18 21:15:48 2020 +0100

    replaced spaces with tab

commit cb5fa4a217
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Nov 18 21:15:14 2020 +0100

    monitoring changes

commit 434709ca96
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 10 11:16:56 2020 +0100

    parameter small stuff

commit 72f7a1b1b7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 9 21:24:23 2020 +0100

    translation files removed

commit 225e65628d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 9 00:12:39 2020 +0100

    include corrections

commit 319ae72478
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Nov 8 15:29:06 2020 +0100

    folder config renamed to fsfwconfig

commit aa45d34b4a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Nov 8 15:20:51 2020 +0100

    include improvements /factory improvement

commit 1b2af5285d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Nov 5 13:12:42 2020 +0100

    message queue depth configurable

commit 8d109b7cd0
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Nov 5 11:57:05 2020 +0100

    preproc define correction

commit 5efbc7496a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 23:39:56 2020 +0100

    doc improved, some functions virtual now

commit cf7385d64e
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 23:32:34 2020 +0100

    include fixes

commit e99cf32bdd
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 23:29:03 2020 +0100

    amazing size checks

commit f72ee0b7ac
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 23:26:28 2020 +0100

    small bugfix

commit 65aecc3565
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 23:23:05 2020 +0100

    IT IS DONE

commit e9aecdac26
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 22:58:09 2020 +0100

    sth with eclipse indentiation

commit d87f78f5c3
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 22:25:14 2020 +0100

    timer stamper in fsfw now

commit c69681b402
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 22:22:26 2020 +0100

    time stamper

commit 5908f99f0b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 17:09:33 2020 +0100

    size t changes

commit 30947d3901
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 17:08:40 2020 +0100

    size_t changes

commit d424d85f6d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 17:07:48 2020 +0100

    sizet changes and indentation

commit 695b161934
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 16:54:56 2020 +0100

    some bugfixes

commit 9e97357b8c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 16:46:43 2020 +0100

    taken over changes from master

commit f69f9bb31e
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 16:31:25 2020 +0100

    comments removed

commit 81f5783d37
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 16:06:30 2020 +0100

    clock update, definitions file

commit dcf36d4cee
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 15:54:27 2020 +0100

    cstdint include added

commit 83f0b4bffc
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 15:51:56 2020 +0100

    defaultcfg changes taken over

commit 633203eb54
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 15:50:55 2020 +0100

    upstream time stamper taken over

commit 38b5695a10
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 15:45:04 2020 +0100

    size check + include guard

commit b71ccf8dd8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 3 15:28:55 2020 +0100

    some refactoring

commit cd71a9cc12
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 2 15:53:08 2020 +0100

    fsfw container taken over

commit 41bf5622f3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 2 15:50:14 2020 +0100

    master taken over

commit aed7f31f24
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 2 15:47:09 2020 +0100

    health changes taken over

commit e0a11f3a6e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 17:46:44 2020 +0100

    include guard update

commit 6edc2ef1d6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 17:42:05 2020 +0100

    class IDs moved

commit 641da2aa21
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 17:33:22 2020 +0100

    config make update

commit 777457482b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 17:21:51 2020 +0100

    fixes for internal unittest

commit 3fc2068011
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 17:09:16 2020 +0100

    fsfwconfig update

commit 0919d2c532
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 16:52:06 2020 +0100

    updates taken over

commit 3d2778fdf7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 16:45:47 2020 +0100

    doc update

commit 42e611899b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 16:43:03 2020 +0100

    added timestamp size

commit fb12045f23
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 15:25:03 2020 +0100

    changes from master taken over

commit 4b2af9eaa6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 15:15:08 2020 +0100

    static keyword removed

commit 172fbd7e48
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 15:13:03 2020 +0100

    some changes taken over

commit 7970043cb5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 15:12:36 2020 +0100

    deleted some sutff

commit 176ca56e35
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 15:12:05 2020 +0100

    core changes taken over

commit 565fd63d08
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 12:07:48 2020 +0100

    makefile moved

commit 29187fbc4b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 11:59:50 2020 +0100

    some config adaptions

commit a38c3e5005
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 29 11:47:03 2020 +0100

    config folder renamed

commit a9b4874904
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 22:49:19 2020 +0100

    new defines added

commit b860d8bce7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 22:34:41 2020 +0100

    include fixes

commit 6325eb7647
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 22:11:13 2020 +0100

    include fixes

commit 24cb83498a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 21:28:59 2020 +0100

    include fix

commit 82ccd14692
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 21:25:11 2020 +0100

    added new tests

commit ea04e7d4d6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 21:13:00 2020 +0100

    removed catch2

commit 3244487eae
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 20:18:58 2020 +0100

    slight improvements

commit dcb24360d8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 20:17:50 2020 +0100

    form improvements taken over

commit d1a399a1a8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 19:46:27 2020 +0100

    tm packet store update

commit 90bdb844e7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 28 19:27:00 2020 +0100

    taken over some changes

commit e7210a34f9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 22 14:34:52 2020 +0200

    output tweaked

commit 742cc6eb76
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 21 18:19:51 2020 +0200

    no command added

commit b9f3c1ee84
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 20 17:53:47 2020 +0200

    takne over defaultcfg

commit 057f3b859e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 20 17:39:48 2020 +0200

    added readme and efaultcfg

commit 9309562716
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 20 17:24:53 2020 +0200

    defaultcfg folder added

commit bb53c71f70
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 20 17:21:20 2020 +0200

    fsfs config update

commit 7033328962
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 20 17:12:56 2020 +0200

    unittest folder added

commit 95924dd55b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 19 15:38:22 2020 +0200

    some more bugfixes

commit 22e4e464c7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 19 00:43:10 2020 +0200

    doc improved, new returnvalue

commit 75e67ce5f8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 19 00:37:26 2020 +0200

    small form improvements

commit ad9ac7537e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 19 00:25:03 2020 +0200

    bool is mapped to uint8 now for pod type conversion

commit 8b8324f21c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 18 23:50:02 2020 +0200

    some stuff renamed

commit 1bddfeb86b
Merge: 88a89d67 6baa8596
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 18 22:41:37 2020 +0200

    Merge branch 'mueller/LocalPoolTests' into mueller/master

commit 88a89d6797
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 18 17:32:10 2020 +0200

    added basic documentation

commit 8e49806057
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 18 17:23:47 2020 +0200

    some adaptions

commit 3b0b474ab6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 18 17:01:49 2020 +0200

    better naming

commit 02b7c51318
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 18 16:54:55 2020 +0200

    HasParametersIF less confusing

commit 9a70f75a4b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Oct 16 01:45:07 2020 +0200

    returnvalues added

commit 6f955ed8ba
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Oct 16 00:42:49 2020 +0200

    another bugfix

commit 91cf33127a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Oct 16 00:41:50 2020 +0200

    bugfix

commit 6baa859628
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 13:42:35 2020 +0200

    fsfw config removed for now

commit ba02becfc9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 13:38:41 2020 +0200

    deleted old files

commit b6ae82ec2c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 13:21:46 2020 +0200

    bugfixes

commit 6e5f029a64
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 12:47:21 2020 +0200

    type usage improved, getFillCoutn implemented

commit 48ff5dea08
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 01:57:30 2020 +0200

    line break added

commit 56dc06e0ed
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 01:51:12 2020 +0200

    some little formatting stuff

commit e5000abbb7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 01:31:11 2020 +0200

    custom cmp operator

commit 364bce90dd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 01:07:20 2020 +0200

    small fixes

commit 1ee01ffcdb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 00:54:00 2020 +0200

    important bugfixes

commit 64bed475fe
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 00:43:23 2020 +0200

    important bugfix

commit d149836612
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 15 00:34:20 2020 +0200

    better  form

commit bdfea9ea38
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 23:53:50 2020 +0200

    includes reordered

commit b3e5946291
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 23:42:49 2020 +0200

    implementation added

commit 57c9775d7d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 23:41:16 2020 +0200

    add fill count func added

commit 7bd536e763
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 23:20:53 2020 +0200

    new templateless pool prototype

commit ab603abada
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 20:05:39 2020 +0200

    subscription mechanism almost complete

commit a9a31308ae
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 19:52:06 2020 +0200

    update notifications working

commit 5b96161331
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 16:46:00 2020 +0200

    optimization and printout improvements

commit 088bc35301
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 12:42:30 2020 +0200

    update handler continued

commit 45c0acec5f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 01:38:27 2020 +0200

    its all falling into places

commit 9ca086e026
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 01:25:15 2020 +0200

    base class extraction complete

commit 72ca2bfa43
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 14 00:50:24 2020 +0200

    added new messages

commit 9917f7126d
Merge: 3af79e57 d22c6a5f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 18:19:28 2020 +0200

    Merge branch 'mueller/DHB_separating_steps' into mueller/master

commit 3af79e572e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 18:19:11 2020 +0200

    default msg size for health device

commit afe5a62789
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 18:12:26 2020 +0200

    imrpoved form, removed comm msg for now

commit d22c6a5fe9
Merge: dbb394f7 736ce2d5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 17:44:58 2020 +0200

    Merge branch 'mueller/master' into mueller/DHB_separating_steps

commit 736ce2d5fd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 17:42:30 2020 +0200

    some more form improvements

commit 06c7919daa
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 17:39:13 2020 +0200

    monitoring form improvements

commit e4c74ec060
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 16:57:37 2020 +0200

    added todos

commit 8c689751b4
Merge: b9ebd153 18671a0d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 16:55:57 2020 +0200

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit b9ebd153a2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 16:55:40 2020 +0200

    added action helper function

commit 18671a0db7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 12 13:40:24 2020 +0200

    doc wrong

commit ed71a37004
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 20:11:20 2020 +0200

    get command queue override

commit 3e79d2e73a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 20:04:01 2020 +0200

    added extended controller base

commit 670e9bfa0f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 18:12:22 2020 +0200

    CMD/REPLY prefixes added

commit b9c7d1bd3f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 18:09:04 2020 +0200

    added health subservices

commit 01e7a98425
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 17:55:38 2020 +0200

    added announce all subservice

commit bc0402faf7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 17:49:50 2020 +0200

    health update

commit 837a18135e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 17:41:51 2020 +0200

    subsystem folder update

commit 3aa666633e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 17:14:52 2020 +0200

    include guard replacements

commit 94884c2402
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 10 17:11:11 2020 +0200

    service 1 small improvements

commit e338b4662d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Oct 9 02:49:18 2020 +0200

    fix for c++11 comformity

commit 2364c4f9a4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 7 20:47:46 2020 +0200

    form improvements

commit 6e9db0d675
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 7 18:43:56 2020 +0200

    retval added

commit 9fb38e9b7c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 6 19:58:29 2020 +0200

    better error output

commit df1a730cdf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 6 16:01:35 2020 +0200

    some form stuff

commit 6a077c583d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 6 14:00:18 2020 +0200

    action helper some formatting stuff

commit 8c43c6993e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 5 22:47:32 2020 +0200

    CSB fifo depth configurable

commit c17d50bd1e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 5 19:46:25 2020 +0200

    file syste mmessage moved to mission code for now

commit 1431116417
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 5 12:11:11 2020 +0200

    NULL exception somewhere

commit a7fe23c300
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 5 00:12:52 2020 +0200

    small stuff

commit f955cd9eee
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 4 23:37:22 2020 +0200

    made interface more generic

commit a8a6d448ec
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 4 23:24:36 2020 +0200

    added subservices

commit 2b1029916b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 4 15:55:39 2020 +0200

    using deletei nstead

commit 20c261514b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 4 14:31:06 2020 +0200

    made message interface more readable (dec instead hex)

commit 0c1c61558b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Oct 3 03:45:29 2020 +0200

    very important bugfix

commit 55a4c0423d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:45:28 2020 +0200

    typo

commit af038d0a2f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:44:27 2020 +0200

    master taken over

commit f9e6b9faca
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:42:28 2020 +0200

    taken over master

commit 0b1b159582
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:40:45 2020 +0200

    taken over master

commit bf3276cbb2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:40:02 2020 +0200

    taken over master

commit 148bbb4be4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:36:43 2020 +0200

    master taken over

commit f2c07ee9c6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:35:56 2020 +0200

    removed tests

commit 5fbb8f8ef0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:35:13 2020 +0200

    taken over fixed array list from master

commit 1ecca4b3d8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:33:50 2020 +0200

    taken over array list

commit 0714dc6e06
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 20:31:30 2020 +0200

    taken over container

commit 26454356f8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 13:57:34 2020 +0200

    tpp extraction

commit 315777d265
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 13:21:23 2020 +0200

    tc distribution equalization

commit 32ebca48b8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 11:07:46 2020 +0200

    FIFO updates

commit 43b44c57b6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 1 11:07:20 2020 +0200

    placement fact update

commit aed2d7fc93
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 30 23:42:18 2020 +0200

    slight formatting

commit d44428f49c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 30 23:38:54 2020 +0200

    DH IF and DH message improved

commit d8392de058
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 30 20:28:33 2020 +0200

    made define more generic

commit b59a4c5de6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 18:02:41 2020 +0200

    equalization complete

commit 3c814a5e61
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 18:01:55 2020 +0200

    include fixes

commit 4f3cfdcaaf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 16:41:14 2020 +0200

    fixed map and array list implemented as non - members

commit 9013ac240f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 16:12:01 2020 +0200

    array list taken over

commit d85096d98b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 16:03:01 2020 +0200

    service 200 take over

commit e1eb1a3be1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 15:48:42 2020 +0200

    small tweaks

commit 1ea1c8c02f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 15:16:20 2020 +0200

    srv9 fix

commit 207d2cab9c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 15:15:29 2020 +0200

    service 1 changes taken over

commit bc23fd65a6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 15:13:51 2020 +0200

    master taken over

commit fd87a16661
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 14:51:25 2020 +0200

    changes taken over

commit 485e96f12f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 14:49:57 2020 +0200

    merged changes

commit 224248dfa1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 14:27:31 2020 +0200

    removed debug outpuzt for missed deadline

commit 1691d63169
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 13:54:08 2020 +0200

    include fix

commit 3663d7269c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 13:37:21 2020 +0200

    changes taken over

commit 7b1f72254f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 13:30:30 2020 +0200

    object id names improved

commit 53a6225790
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 29 12:50:36 2020 +0200

    doc & tweaks

commit 260fac43f7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 23:38:37 2020 +0200

    bugfix

commit 1f70b1159d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 23:21:21 2020 +0200

    another small bugfix

commit 7ff9c29b62
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 22:51:02 2020 +0200

    added another command

commit 62ee1391bf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 22:48:10 2020 +0200

    added two new commands

commit 1d972fcbef
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 22:46:18 2020 +0200

    hk messages are cleared properly now

commit 7e9d095ed1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 22:38:36 2020 +0200

    important bugfixes

commit e48dbb8797
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 22:17:18 2020 +0200

    small improvements

commit 786dcdf88d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 22:13:17 2020 +0200

    removed clock include

commit ad2ca814b2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 21:28:03 2020 +0200

    improved doc

commit bf574c12e4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 21:09:56 2020 +0200

    bugfixes, owner ptr not const anymore

commit 88c4b2a539
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 28 16:56:42 2020 +0200

    bugfixes for srv3

commit c12110cbf1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 22:23:17 2020 +0200

    has file system IF retvals

commit 6eaade2395
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 17:28:03 2020 +0200

    added new mode for local datapool manager

commit c3830da3d0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 17:24:06 2020 +0200

    bugfixes

commit 4a97596030
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 17:21:32 2020 +0200

    internal error reporter uses new local datapool now

commit e67b1fce9a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 16:38:07 2020 +0200

    added additional include

commit 52d8c4f3a8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 15:35:10 2020 +0200

    include guard fix

commit de08bd6c8a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 15:33:24 2020 +0200

    small include fix

commit 5062170407
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 15:32:16 2020 +0200

    correct function used now

commit 55bdd2c2f5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 15:28:28 2020 +0200

    include fix

commit 6fd39dfac3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 15:27:06 2020 +0200

    set struct reporting continued

commit 08d0e09493
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 15:16:13 2020 +0200

    power equalization

commit fab7eb8a5d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 15:03:04 2020 +0200

    controller base update

commit 9aca5cb6f2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 26 14:59:40 2020 +0200

    taken over convergence changes

commit cf28c9ff9d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 25 19:01:59 2020 +0200

    make event func changed

commit a65745d037
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 25 18:40:04 2020 +0200

    added explicit function to refresh task handle

commit 5ca1c7bca2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 23 19:58:51 2020 +0200

    coutndown update

commit 43ab0ba270
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 23 19:55:48 2020 +0200

    updated subsystemId ranged

commit 2f0b36de46
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 23 19:54:22 2020 +0200

    updated framework object list

commit 9ff3a8537c
Merge: 320a5ac3 c7a6711e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 23 17:44:41 2020 +0200

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit 320a5ac355
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 23 17:44:22 2020 +0200

    has health IF improvements

commit c7a6711eec
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 22 16:25:10 2020 +0200

    include fix

commit 4074ca1b89
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 22 14:22:14 2020 +0200

    error code improved

commit 5072c09bc0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 22 13:59:25 2020 +0200

    csb hotfix

commit e3cbc4dfd5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 22 02:12:02 2020 +0200

    shared ring buffer extended

commit f5d793a1cf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 20 13:38:53 2020 +0200

    file system message getter func

commit 763c52cfca
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 21:57:23 2020 +0200

    CSB FIFO first steps to make configurable

commit 40db85e73f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 21:36:12 2020 +0200

    separate messages for success/failure

commit cad08e1ea9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 20:54:27 2020 +0200

    error output for failed deletion

commit e140d39944
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 20:08:25 2020 +0200

    some  fixes for sd card handler

commit 9e9bde0395
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 19:50:02 2020 +0200

    srv23 taken over

commit 44989ada64
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 19:41:41 2020 +0200

    file system message taken over

commit 718502c04b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 17:15:33 2020 +0200

    added additional flag which casn be used to disable

    periodic handling

commit 02f778ea1d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 17:14:09 2020 +0200

    new error code added

commit 4ab7a08387
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 17:08:08 2020 +0200

    srv3 continued

commit 32c0140cc2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 15:58:34 2020 +0200

    hk stuff continued

commit 9ecbc8199e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 02:46:29 2020 +0200

    added periodic helper

commit ba56f48e8e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 19 01:17:43 2020 +0200

    huge progress on hk + testing

commit 757d2275ea
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 15:06:14 2020 +0200

    internal bugfix

commit 33e7cca23c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 15:01:35 2020 +0200

    several bugfixes amd improvements

commit 5e3f40a2c1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 13:40:48 2020 +0200

    changes taken over from pull request

commit 3a043b5773
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 13:31:51 2020 +0200

    object manager tweaks complete

commit f50a80fc3c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 13:29:42 2020 +0200

    minor tweaks

commit 4d4166071c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 13:28:20 2020 +0200

    added pus services to framework objects

commit 1b5c3786b6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 13:24:06 2020 +0200

    taken over serviceinterface folder

commit b429359864
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 13:14:01 2020 +0200

    renormalize files

commit 57c88059e5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 13:12:07 2020 +0200

    DHB small improvements

commit 7b0ddb3941
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 13:09:23 2020 +0200

    quick fix DHB

commit e70e9e3f1f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 12:57:30 2020 +0200

    added uptime seconds functions

commit 19632b8fb1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 12:36:36 2020 +0200

    linux fixes

commit e0b2e0b00a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 12:31:11 2020 +0200

    fxed linux message queues

commit 37f4cc4644
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 18 12:28:29 2020 +0200

    taken over stopwatch changes

commit 0c6514a682
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 17 22:31:28 2020 +0200

    clock uses getUptime again

commit 6ef5e3e550
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 16 21:22:53 2020 +0200

    queue factory host OS fix

commit e5dac30e98
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 17:37:43 2020 +0200

    new include used now

commit 0d5724e3d4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 17:34:07 2020 +0200

    include improvements taken over

commit 347d591def
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 17:33:21 2020 +0200

    uses new define and config file now

commit 7643af8607
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 17:15:22 2020 +0200

    include guard fix

commit b8ad17639c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 17:02:31 2020 +0200

    include guard fix

commit 850a4a3e3d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 16:44:48 2020 +0200

    header file renamed

commit 15891b3cf0
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 16:42:17 2020 +0200

    fixed some message queue includes

commit ad98a63e87
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 16:02:58 2020 +0200

    changes taken over from upstream master

commit e707c5e051
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 15 15:58:12 2020 +0200

    fixes taken over

commit e8de2fc47a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 14 18:29:19 2020 +0200

    added srv3

commit 2d2316a0c7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 14 18:01:48 2020 +0200

    hk message continued

commit f9612afe06
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 11 14:06:08 2020 +0200

    added report status toggler

commit 71125c075a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 21:05:50 2020 +0200

    added new setter function

commit 2d2d0de35c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 20:24:49 2020 +0200

    local data pool manager bugfixes

commit d7bbd4b652
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 19:51:17 2020 +0200

    severla bugfixes, new periodic op divider added

commit e4d95a4e09
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 16:07:09 2020 +0200

    subsystem changes taken over

commit e57d4a11ae
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 16:01:05 2020 +0200

    fixed ordered multi map changes integrated

commit d9dcee3692
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:55:56 2020 +0200

    array list changes taken over

commit f35efa3cbe
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:52:00 2020 +0200

    taken over CSB changes

commit 96e471add6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:51:11 2020 +0200

    merged fixed map changes

commit bbc73a6aaf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:25:29 2020 +0200

    taken over serialize adapter changes

commit fd09774fc3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:18:45 2020 +0200

    serialize if update

commit f663de2418
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:17:38 2020 +0200

    taken over changes from master

commit 224ea3914a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:15:13 2020 +0200

    deleted file not needed anymore

commit db3e32655d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:05:26 2020 +0200

    changes taken over from master

commit 18e6de7d6b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:04:43 2020 +0200

    added compile time check

commit cefac2db0b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:03:28 2020 +0200

    assignment operator added

commit d43ef479b6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:02:58 2020 +0200

    assignment operator added

commit 26bb2de050
Merge: d99b100a e085deb2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 10 15:01:49 2020 +0200

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit e085deb235
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Sep 7 15:23:27 2020 +0200

    fifo fix

commit d99b100ace
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 18:46:56 2020 +0200

    debug output removed

commit 26cbcdbff0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 15:21:02 2020 +0200

    removed comment

commit 673af26472
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 14:57:05 2020 +0200

    rework/restructuring

commit 50ae50d286
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 14:01:41 2020 +0200

    removed pool raw access helper

commit ac2f6c5ed4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 12:59:59 2020 +0200

    minor improvements

commit efa41b29aa
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 12:16:43 2020 +0200

    added informative comment

commit 8db9a4a191
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 12:00:57 2020 +0200

    some minor tweaks

commit 7774434d7a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 11:58:12 2020 +0200

    windows sockets working

commit 3e0819f954
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 11:48:32 2020 +0200

    some bugfixes

commit b7c4f5ce05
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 10:36:39 2020 +0200

    continued win sockets

commit 0c85b05aca
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 09:54:22 2020 +0200

    continued win bridge

commit 08ffbfefae
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Sep 6 09:33:02 2020 +0200

    added windows udp bridge

commit f698275a0b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 21:59:17 2020 +0200

    removed seconds typedef, confusing

commit c7606b7b1e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 21:51:17 2020 +0200

    updating and cleaning pool files

commit cb970b1883
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 21:24:59 2020 +0200

    task IF is set now

commit 7a24f89915
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 21:19:15 2020 +0200

    removed comment

commit c43ae66205
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 21:18:30 2020 +0200

    some tweaks

commit 883103af2b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 21:13:07 2020 +0200

    queue map manager update

commit 80e60566d8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 21:11:27 2020 +0200

    compiling and working again

commit 39b675cf99
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 20:39:10 2020 +0200

    repairing host osal

commit 05814dc805
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Sep 5 15:58:53 2020 +0200

    added way to start DH immediately, bugfix in event manager

commit faeeca8707
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 16:07:54 2020 +0200

    seiralize folder converged

commit 1803030640
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 16:04:11 2020 +0200

    taken over serialize element changes

commit 721b981df2
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 16:01:18 2020 +0200

    changes taken over

commit 305d8ef840
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 15:56:52 2020 +0200

    taken over changes

commit f2f7a5de87
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 15:47:33 2020 +0200

    taken over convergence changes

commit 0d69e9beca
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 15:42:15 2020 +0200

    taken over serial uffer adapter from upstream

commit 37764f7ca7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 15:39:17 2020 +0200

    include guard fixed

commit be89e7ebb7
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 15:36:53 2020 +0200

    taken over from upstream with little tweak

commit cfa952d982
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 15:33:36 2020 +0200

    hybrid iterator same to FSFW

commit fff0131c9b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 15:20:07 2020 +0200

    taken over changes

commit 147ab94149
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 15:13:32 2020 +0200

    include guard improvements

commit f4a5067775
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 14:53:27 2020 +0200

    update fw class Ids

commit 94b45d7407
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 14:49:27 2020 +0200

    changed taken over

commit 9d1f292af0
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 14:32:32 2020 +0200

    changed taken over

commit 6980245c98
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 14:30:04 2020 +0200

    added line break

commit 31c16382fc
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Sep 4 14:28:43 2020 +0200

    took over changed for fixed slot sequence

commit 403d83f32c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 3 13:01:14 2020 +0200

    removed commented out code

commit dbb394f761
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 3 00:22:16 2020 +0200

    new member to store last step

commit 822a908353
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Sep 3 00:17:01 2020 +0200

    separated steps, everything seems to work

commit e8fa9816ce
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 2 23:45:14 2020 +0200

    doc improved

commit 6069c64048
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 2 23:36:54 2020 +0200

    doc improved

commit 631b2ca705
Merge: ae9bc39b 33039f8c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 2 17:59:45 2020 +0200

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit ae9bc39bda
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Sep 2 17:59:26 2020 +0200

    some bugfixes and improvements

commit 33039f8c60
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 1 12:57:56 2020 +0200

    include  guard correction

commit bec562ece0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 1 12:54:33 2020 +0200

    FIFO updates

commit a634875b4b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 1 12:50:17 2020 +0200

    dynamic fifo update

commit 7cf79c17a9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 1 12:48:51 2020 +0200

    fifo update

commit f7f134ac20
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 1 12:48:11 2020 +0200

    corrections

commit edde2ee58b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Sep 1 12:43:50 2020 +0200

    offsetr update

commit 15bb0aee98
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 29 19:08:10 2020 +0200

    handler ID cached, debug output improved

commit 6c02776975
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 29 00:16:40 2020 +0200

    added srv9

commit b0673c7fa6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 18:47:11 2020 +0200

    typo fixes

commit b6a19f911d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 18:45:19 2020 +0200

    include guards improved

commit 1b9c8446b7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 18:33:29 2020 +0200

    renormalized line endings

commit 9abd796e6f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:58:36 2020 +0200

    updated map packet extraction

commit 8596810fe2
Merge: 9f522466 b71cab39
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:58:31 2020 +0200

    Merge branch 'event/git-update' into mueller/master

commit b71cab3993
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:55:13 2020 +0200

    integrated all changes

commit 9f522466f0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:52:13 2020 +0200

    wrapped info output in additonal ifdef

commit e800aad979
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:44:10 2020 +0200

    event git update

commit d2ef2b2be4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:40:53 2020 +0200

    taken over datalinklayer form upstream

commit 5ce954672b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:40:21 2020 +0200

    taken over coordinates  from upstream

commit 2e23fc1201
Merge: 468ebfb8 8862f35a
Author: Robin Müller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:37:29 2020 +0200

    Merge pull request 'git is weird' (#15) from mueller/action-git-update into mueller/master

    Reviewed-on: #15

commit 8862f35ad1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:35:27 2020 +0200

    git is weird

commit 468ebfb809
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:18:11 2020 +0200

    include improvement

commit 5ca26a72ea
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 28 17:00:16 2020 +0200

    fixed some shadowing issues

commit 42dd665e26
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 20:06:19 2020 +0200

    include improvement

commit ed70f38612
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 20:04:17 2020 +0200

    some renaming

commit a6e99e443a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 20:00:36 2020 +0200

    took over dHB failure isolation base fixes

commit 4d1b1ba506
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 17:24:40 2020 +0200

    additonal doc for freeRTOS semaphores

commit b9314cffb9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 17:13:52 2020 +0200

    small improvements

commit 5aa664648e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 17:03:54 2020 +0200

    linux semaph update

commit fd42d8cd46
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 16:14:42 2020 +0200

    periodic task taken over from master

commit 6d3fdab944
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 15:52:55 2020 +0200

    adapted semaphore IF to mutex IF

commit 1dfdd65662
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 14:42:10 2020 +0200

    new initializeSequence func

commit 790e0399b7
Merge: 67ab1f62 3aa6858c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 14:23:14 2020 +0200

    Merge branch 'mueller/project/distribDatapool' into mueller/master

commit 67ab1f6240
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 27 14:17:13 2020 +0200

    initialize after task crteation moved

commit 0f9930524b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Aug 26 15:54:13 2020 +0200

    some minor improvements

commit 83c9d4fc1c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Aug 26 14:55:27 2020 +0200

    improved tmtc bridge

commit 51b62fd9b1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Aug 26 03:21:26 2020 +0200

    debug output fix

commit c314792e86
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Aug 26 02:52:59 2020 +0200

    linebreak changed

commit da3b2b2500
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 25 18:09:05 2020 +0200

    form improvements

commit 6afbeb8423
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 25 13:42:11 2020 +0200

    removed linker forward decl

commit 92e18b91a3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 25 13:38:53 2020 +0200

    seriasl buffer update

commit b97128c12e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 25 13:29:10 2020 +0200

    deserialize improved

commit c8ba486538
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 25 13:17:57 2020 +0200

    serial buffer adapter

commit 3aa6858c93
Merge: 11ce3d02 6afbeb84
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 25 13:04:20 2020 +0200

    Merge branch 'mueller/master' into mueller/project/distribDatapool

commit 11ce3d025f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Aug 24 22:08:27 2020 +0200

    srv3 received reply now

commit 8e7f167a66
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Aug 24 14:48:22 2020 +0200

    small fix taken over

commit a5227115e5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Aug 23 23:24:48 2020 +0200

    first subscriptio nfunction written

commit a95bc6b293
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Aug 23 22:33:22 2020 +0200

    sid cached now

commit 687e124929
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Aug 23 21:52:44 2020 +0200

    doc added

commit 2b63f1b3f3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Aug 23 21:00:25 2020 +0200

    New reporting mode

commit 2f53a3fb1b
Merge: f39b8bdb cdaed452
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Aug 23 20:27:00 2020 +0200

    Merge branch 'mueller/master' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/master

commit cdaed4523b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 21 16:15:40 2020 +0200

    tmtc bridge todo added

commit 0d47606229
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 21 15:49:06 2020 +0200

    tm/tc packet stored improvements

commit 15fd30b23f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 20 22:31:58 2020 +0200

    assigned read len for decoding error

commit 9385f90241
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 20 20:36:49 2020 +0200

    some bugfixes and improvements

commit adbf39166f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Aug 20 18:13:17 2020 +0200

    removed pus parser

commit f90bd01282
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Aug 19 17:00:50 2020 +0200

    added srv17 and srv201

commit 7b998268cb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Aug 19 13:17:40 2020 +0200

    error message improvement

commit a1d94ec556
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 18 20:51:13 2020 +0200

    added aditional comment

commit 5af50cfbf7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 18 20:50:24 2020 +0200

    renamed .mk file

commit fbecda7549
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 18 13:09:15 2020 +0200

    include replacements

commit f39b8bdb41
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Aug 10 18:33:28 2020 +0200

    several simplifications

commit 87eb31b65a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Aug 9 20:06:29 2020 +0200

    local data pool manager uses new packet now

commit 9e7d92b387
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Aug 9 19:46:37 2020 +0200

    some renaming , hk packets finished

commit a181f19c02
Merge: b092850d 5d09ae32
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Aug 9 17:13:58 2020 +0200

    Merge branch 'mueller/master' into mueller/project/distribDatapool

commit 5d09ae3221
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 23:47:44 2020 +0200

    additional comment

commit f9ce1d9eb9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 23:46:21 2020 +0200

    more simplifications for shared ring buffer

commit 6484c1a276
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 23:45:18 2020 +0200

    shared ring buffer simplified

commit b092850dfc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 21:32:15 2020 +0200

    internal housekeeping packet finished

commit b828d7c6d7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 19:56:42 2020 +0200

    continued with local datapool manager

commit e7d28d630c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 19:43:28 2020 +0200

    continued with implementation

commit 03cd5780f9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 13:29:38 2020 +0200

    null initializations in header

commit 121e94a385
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 13:20:02 2020 +0200

    local pool var update

commit 5c85d03c39
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 13:04:31 2020 +0200

    additional check for freeRTOS

commit fba8775f49
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 12:51:31 2020 +0200

    some renaming

commit f766398b20
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 12:49:20 2020 +0200

    some bugfixes

commit af11c8fcf9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 12:38:39 2020 +0200

    freeRTOS corrections

commit a6a1e65607
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 12:17:27 2020 +0200

    local data set fix

commit 4afb19be51
Merge: b7411591 03cd5780
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 8 12:04:52 2020 +0200

    Merge branch 'mueller/master' into mueller/project/distribDatapool

commit 979fea3400
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 7 22:15:03 2020 +0200

    mutex helper api change

commit 458e849f7d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 7 22:11:13 2020 +0200

    adapting mutex helper to new interface

commit 44b70b45e2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 7 22:06:20 2020 +0200

    little doc correction

commit e3d094b2de
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 7 22:02:23 2020 +0200

    linux: removed old static timeout values

commit 37f2539d89
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 7 20:44:40 2020 +0200

    empty line removed

commit bfecbfbd80
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 7 20:36:37 2020 +0200

    implemented new mutex interface

commit 1a118fe215
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Aug 7 19:21:47 2020 +0200

    added documentation to assembly base

commit 66039bd3fe
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 18:14:39 2020 +0200

    move group def down

commit c4ffb1acd5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 18:12:15 2020 +0200

    subservice number correction

commit 3f87537c61
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 15:25:24 2020 +0200

    minor corrections

commit 4d3f0875c1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 15:23:37 2020 +0200

    periodic task if adapted

commit 2177877625
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 15:16:09 2020 +0200

    updated framework subsystem ID ranges

commit 4dcfa5125e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 11:47:47 2020 +0200

    added additional calls

commit 6b475792a4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 02:25:10 2020 +0200

    shared ring buffer continued

commit 4e9e465360
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 02:00:00 2020 +0200

    shared ring buffer continued

commit 0ead44bea9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 01:07:59 2020 +0200

    getFreeElement implemented

commit f240827bbd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Aug 4 00:59:19 2020 +0200

    added getFreeElement

commit ebf5d41a78
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 1 19:03:03 2020 +0200

    parameters IF doc and improvement

commit 7475e6a9b8
Merge: 76cc3e96 66eac57e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 1 17:06:12 2020 +0200

    Merge branch 'mueller/master' into source/master

commit 66eac57e3b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 1 16:54:54 2020 +0200

    csb update

commit 58a4f4f8a1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 1 16:39:17 2020 +0200

    command message bugfix, CSB improvement

    parameter helper diagnostic message

commit 76cc3e96e8
Merge: ffba6641 18899a4c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Aug 1 12:34:46 2020 +0200

    Merge branch 'mueller/master' into source/master

commit 18899a4c82
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 29 20:07:24 2020 +0200

    hotfix for deadline checking

commit 276c3b172e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 29 15:32:36 2020 +0200

    better diagnostic warning for DHB

commit c64aa9f7f5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 28 21:00:11 2020 +0200

    another important bugfix

commit 9fa9421ba5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 28 20:57:05 2020 +0200

    important bugfix

commit 9acf82cf51
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 28 18:12:10 2020 +0200

    doc improved

commit 69f9ff02f0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 28 17:00:51 2020 +0200

    better returnvalue for failed  comIF init

commit afc16ef2d7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 28 12:49:18 2020 +0200

    new servicei nterface buffer /stream

commit 6425c0dd4c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 26 03:12:04 2020 +0200

    better init error output

commit e179288c00
Author: Steffen Gaisser <gaisser@irs.uni-stuttgart.de>
Date:   Thu Jun 25 18:09:32 2020 +0200

    Fixed spelling mistake in HealthHelper

commit b7411591a1
Merge: a0b8f885 b4d6d970
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 16 12:42:02 2020 +0200

    Merge branch 'mueller/master' into mueller/project/distribDatapool

commit b4d6d970bc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 16 12:41:05 2020 +0200

    removed HK manager virtual functions

commit aaafed7b28
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 16 12:38:21 2020 +0200

    health table init now mandatory, better

    diagnostic output for uninit health table or invalid health helper owner

commit 47b3a428c6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 16 12:33:03 2020 +0200

    removed device switch, not necessary anymore

commit a0b8f8855c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 16 11:45:23 2020 +0200

    cotinued distir datapool

commit e5ab7ada68
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 14 15:45:03 2020 +0200

    added new interfaces for datasets

commit e204bd77c6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 14 02:21:11 2020 +0200

    created tpp file for fixed ordered multimap

commit e7b6999c5e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 13 22:13:19 2020 +0200

    added back inttypes.h for cleaner code

commit 15052cb333
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 13 19:54:38 2020 +0200

    singly linked list update

commit 6d99ab3df3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 13 19:37:33 2020 +0200

    ncreased readability of DHB function

commit b4f292f3d7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 12 18:01:09 2020 +0200

    new generic freertos task interface

commit 99aef0cf28
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 12 01:16:32 2020 +0200

    C++ linkage for yield from ISR function

commit 7d794c7623
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 11 18:24:09 2020 +0200

    task management functions have freertos syntax now

commit 799846d89f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 11 14:29:30 2020 +0200

    little formatting changes

commit e4f795d209
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 11 13:38:14 2020 +0200

    stack high watermark in bytes now

commit ffba664144
Merge: 69946d52 35d4267b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 11 11:57:46 2020 +0200

    Merge branch 'mueller_framework' into front_branch

    changes for new freertos task monitor

commit 69946d5276
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 11 11:52:01 2020 +0200

    FIFO hotfix

commit 35d4267b40
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 11 02:36:04 2020 +0200

    dynamic fifo bug fixed

commit 6a6395313f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 11 01:06:01 2020 +0200

    added copy ctor and assignment for FIFObase

commit 444ee80f35
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 20:31:10 2020 +0200

    removed unnecessary case and added more size checks

commit 3145036210
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 19:34:18 2020 +0200

    getter functions for task handle

commit 36a7f2f9ee
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 14:32:25 2020 +0200

    removed file header comment

commit e29226c9bb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 14:28:36 2020 +0200

    srv8 improved

commit 9716bcdd74
Merge: c8821ae7 a7d68f8c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 13:55:14 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit a7d68f8c52
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 13:31:45 2020 +0200

    deleted copy ctor

commit be8913efea
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 03:30:52 2020 +0200

    srv8 improvements

commit 9cbc1a18b8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 03:16:08 2020 +0200

    csrv200 improvements

commit bdc6e88198
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 03:09:32 2020 +0200

    reordered includes

commit 3551a767a7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 03:06:18 2020 +0200

    removed old code

commit f3739fd213
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 02:44:58 2020 +0200

    bugfix failure isolation base

commit 7a4cc1a6b6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 01:22:23 2020 +0200

    hk manager initialized now

commit 1fde3c2c99
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jul 10 00:19:25 2020 +0200

    added srv200, CSB doc

commit cdd877032f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 23:20:48 2020 +0200

    doc for system object IF improved

commit 57418eb877
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 20:04:49 2020 +0200

    distrinction between default settings

    and individual settings for service

commit ad049cc634
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 19:41:52 2020 +0200

    tmtc bridge formatting improvements

commit ceb6197904
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 17:01:12 2020 +0200

    some minor improvements

commit da30680d04
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 16:54:18 2020 +0200

    readability improvement

commit 0cdce6e327
Merge: a5d3d9ea ac9e6e13
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 16:47:39 2020 +0200

    Merge branch 'mueller_devel_distribDatapool' into mueller_framework

commit a5d3d9ea80
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 16:46:57 2020 +0200

    improved init function

commit 5a351474d2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 16:31:33 2020 +0200

    DHB ctor simplified

commit 32ef807341
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 15:49:52 2020 +0200

    newline

commit ecd740a101
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 15:47:50 2020 +0200

    ring buffer base calls made protected

commit 6f50356964
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 14:26:15 2020 +0200

    new shared ring buffer

commit ac9e6e1337
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 9 00:59:10 2020 +0200

    continued with local data pool manager

commit c8821ae74f
Merge: e48de981 64c290ff
Author: Robin Müller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 18:49:09 2020 +0200

    Merge pull request 'A lot of new features and tweaks' (#12) from mueller_framework into front_branch

commit 64c290ffe4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 18:38:58 2020 +0200

    include guard fix

commit dc27cc9aff
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 18:37:26 2020 +0200

    srv8 added to framework

commit 8046d005a4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 18:18:54 2020 +0200

    CSB static framework id setting

commit 236ad1b85b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 15:06:46 2020 +0200

    a lot of debug output added

commit 5ec78b065c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 13:29:57 2020 +0200

    error handling for invalid dest queues improved

commit b56aa94f99
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 12:54:40 2020 +0200

    additional doc

commit 01b1080376
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 12:53:46 2020 +0200

    readability increase

commit 94f9b1e1ef
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 12:41:15 2020 +0200

    dle encoder doc finished and hopefully correct

commit 264914e86a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 03:18:09 2020 +0200

    tmtcbridge tweaks.

    UDP bridge now working :-D

commit 2efcda735f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 8 02:20:38 2020 +0200

    message arriving.

    big clean up in tcdistribution folder

commit 399fc0e287
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 7 17:42:37 2020 +0200

    fifo replacements

commit dd48f7ccad
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 7 17:28:00 2020 +0200

    some form improvements

commit 06d389ed1e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 7 17:25:52 2020 +0200

    increased srv2 readability

commit 684b56ac88
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 7 17:21:47 2020 +0200

    srv2 tweak: CSB params now configurable

commit 7698f3f13e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 7 17:18:33 2020 +0200

    moved srv2 to framework

commit 359163886b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 7 17:06:30 2020 +0200

    pus srv5 and 1 moved to framework

commit 4f1f610ae0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jul 7 16:36:41 2020 +0200

    doc and improvements for DLE encoder

commit e48de981f5
Merge: 062ebabb cb691db8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 23:31:38 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit cb691db807
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 23:07:38 2020 +0200

    fifo tweaks, pus parser fixes

commit fd1e612ea5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 20:17:05 2020 +0200

    pus parser fixes

commit 8ba75fc3c2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 19:36:21 2020 +0200

    pus parser implemented

commit f442a5889e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 16:34:11 2020 +0200

    pus parser continued

commit 78283ddbee
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 14:09:33 2020 +0200

    queue map manager: not using std::atomic anymore

commit b61e1df8bc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 13:43:41 2020 +0200

    fifo in namespace now

commit bb5de8f110
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 13:41:07 2020 +0200

    merged new changes

commit 2158208a2f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jul 6 00:33:55 2020 +0200

    new pus parser

commit ebec074655
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 23:53:13 2020 +0200

    Split up FIFO into StaticFIFO and normale FIFO

commit 2395e487ae
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 20:42:05 2020 +0200

    udp polling taks init

commit 327b1e9d2f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 19:11:21 2020 +0200

    file renamed

commit 724fee09ff
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 18:58:16 2020 +0200

    new task for tc unix polling

commit 26ab1983dc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 18:22:39 2020 +0200

    new ports

commit 9e2fa16550
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 15:31:02 2020 +0200

    mq stack error improved

commit fcf3f04377
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 01:25:49 2020 +0200

    diag output for inits improved

commit 9dcf0c7118
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Fri Jul 3 15:50:29 2020 +0200

    size_t for DataPoolAdmin

commit b86e5664c4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 00:33:03 2020 +0200

    include which was missing, pool raw access size_t replacements

commit 1a177d2efa
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 00:28:06 2020 +0200

    integrated pool raw access serialize changes

commit 24240b6c7d
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Fri Jul 3 15:46:00 2020 +0200

    Documented EndianConverter and changed length to size_t

commit c160000027
Author: Ulrich Mohr <mohr@irs.uni-stuttgart.de>
Date:   Fri Jul 3 12:44:08 2020 +0200

    Corrected filename of EndianConverter.h

commit 5cee126841
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jul 5 00:06:30 2020 +0200

    formatting

commit 571da39108
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 4 23:52:44 2020 +0200

    continued new bridge

commit e0a3257f8b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 4 23:20:29 2020 +0200

    even better output for unset max msg size

commit 72768a6815
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jul 4 00:51:49 2020 +0200

    started unix udp bridge

commit 18173772af
Merge: 47b8ed23 099e6281
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 2 16:56:27 2020 +0200

    Merge branch 'mueller_framework' into mueller_merge_mohr_serialize

commit 099e6281ec
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 2 16:54:53 2020 +0200

    DataSetBase not bound to max size anymore

commit 3e069c34aa
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 2 16:29:29 2020 +0200

    datasetbase stays same f or now

commit 8011d49ebc
Merge: 837fecf8 68c41e23
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jul 2 16:07:16 2020 +0200

    Merge remote-tracking branch 'upstream/master' into mueller_framework

commit 47b8ed2321
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 1 14:34:16 2020 +0200

    split up long debug message

commit d7bff31a4c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 1 14:17:55 2020 +0200

    compiling again

commit 6802ff7d71
Merge: 837fecf8 6553450b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jul 1 13:15:58 2020 +0200

    Merge remote-tracking branch 'upstream/mohr_serialize' into mueller_merge_mohr_serialize

commit 837fecf859
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 30 21:22:26 2020 +0200

    added hk receiver obj id to dhb ctor

commit 062ebabb9a
Merge: 2de972bb 1820b5f9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 30 16:41:38 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 1820b5f95c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 30 16:02:07 2020 +0200

    hotfix for copy ctor

commit 2de972bb8a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 30 15:51:19 2020 +0200

    const store accessor copy ctor fixx

commit 3a85001855
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 30 00:48:48 2020 +0200

    bit setter correction

commit 85cc936d5d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 16:50:45 2020 +0200

    added back clear CommandMessage function

commit e2a36efce3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 16:47:58 2020 +0200

    csb changes taken over

commit 48df3cbe83
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 16:43:02 2020 +0200

    csb comment improved

commit 691be0dcd4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 16:39:55 2020 +0200

    dhb doc improvements

commit 044aa259e6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 16:37:55 2020 +0200

    dhb cached pst interval now

commit ae6314d8cd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 16:06:53 2020 +0200

    added task handle member

commit 003e70bf47
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 15:55:20 2020 +0200

    new initializeAfterTaskCreation()

commit d5d968a393
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 15:46:16 2020 +0200

    some more correctioons

commit b81b458ba6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 29 15:44:18 2020 +0200

    exec task if new init function, some corrections

commit 71f997888b
Merge: 61370d43 ba5b8bd6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 26 13:33:19 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit ba5b8bd682
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 26 13:28:58 2020 +0200

    hybrid iter update

commit 08f25370f3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 12:03:52 2020 +0200

    moved typedefs into namespace

commit 0c32a96452
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 11:54:41 2020 +0200

    some more singly linked list improvements

commit 8d633bf127
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 11:40:48 2020 +0200

    took over changed for singly linked list

commit 6f2bb4125d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 02:02:57 2020 +0200

    bugfix

commit 7f3607c3d9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 02:00:26 2020 +0200

    hk service fixed

commit 61370d43da
Merge: 65c775b8 bb9f606f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 01:29:11 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit bb9f606ffd
Merge: 16cbbb26 b2c352b0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 01:26:23 2020 +0200

    Merge remote-tracking branch 'upstream/master' into mueller_framework

commit 16cbbb2693
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 01:11:48 2020 +0200

    linux fixes

commit af24cc7d04
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 00:49:13 2020 +0200

    some bugfixes

commit c7c49b4239
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 00:30:32 2020 +0200

    deleted command messge base

commit 3bf29a7315
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 24 00:24:15 2020 +0200

    removed CommandMessageBase, changed interfaces

commit 905c1a92e3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 21:03:22 2020 +0200

    reverted some changes

commit 56455a5fa2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 14:11:53 2020 +0200

    added static function as alternative to macro

commit 67366c25a0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 13:49:25 2020 +0200

    typo fix

commit 5f16d30d82
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 13:47:38 2020 +0200

    all ones value for return failed now

commit 6f4682e1c8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 12:53:30 2020 +0200

    hasactionsIF include guard and doc

commit 2ecd7c4493
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 11:05:40 2020 +0200

    some minor improvements

commit 446e7d2f82
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 11:00:40 2020 +0200

    const storage accessor improvement

commit 45ffb7549a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 10:58:48 2020 +0200

    storage accessor const in own file now

commit e27310da40
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 10:47:31 2020 +0200

    updates for tmtcbridge

commit c0beef4463
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 10:27:44 2020 +0200

    some include guards, todo comments

commit 64a02c55ba
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 01:37:25 2020 +0200

    linux fixed, size checks added

commit f7d55a8a37
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 01:15:35 2020 +0200

    equal to pull request now

commit 847292ea30
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 23 01:10:19 2020 +0200

    added overflow checking for periodic task

commit a82dbcbd50
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 22 23:47:18 2020 +0200

    minor doc correction

commit 6a7f47e06d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 22 23:46:44 2020 +0200

    doc fix

commit dadc867d9e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 22 20:18:13 2020 +0200

    adapted MessageQueueSenderIF function calls

commit 5734a0a0e9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 22 19:22:52 2020 +0200

    some fixes necessary to perform size check

commit 3b2fa978e1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 22 19:06:10 2020 +0200

    replaced break with continue

commit 109fdad8b3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 22 15:34:35 2020 +0200

    size check for message queue

commit 65c775b83c
Merge: 555b7cc9 45a55044
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 20:48:35 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 45a55044dd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 20:47:36 2020 +0200

    using debug stream now

commit 95b646046b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 20:43:29 2020 +0200

    debug output working again

commit 3936fe9360
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 20:34:19 2020 +0200

    linux fix

commit 2c04b87418
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 20:18:00 2020 +0200

    corrected includes

commit 1b0e7c84c7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 20:15:58 2020 +0200

    linux periodic task improvements

commit 2de811e0af
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 20:14:56 2020 +0200

    moved timeslot files to task folder

    implmented setting task IF for regular periodic tasks

commit eb4ce980fe
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 14:32:04 2020 +0200

    small fixed

commit 60ae2d4565
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 14:25:03 2020 +0200

    continued with hk data pool

    added deadline missed check for fixed timeslot task,
    improved doc for both periodic task and fixed timeslot task

commit 84b8d733c0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 19 03:03:17 2020 +0200

    hk continued

commit 583efec3f8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 17 20:45:44 2020 +0200

    nullptr

commit ed26992d7f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 17 20:40:40 2020 +0200

    shoulddo added

commit bb16fd80b8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 17 20:37:45 2020 +0200

    singly linked list improvements

commit 259517ac9b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 17 20:22:09 2020 +0200

    single linked list improvement

commit d5ae74f860
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 17 20:21:49 2020 +0200

    bugfix hk message size

commit b68ad9e4f9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 17 19:50:26 2020 +0200

    new ctor for simple ring buffer which does not

    allocate

commit f8f10a1730
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 17 19:41:10 2020 +0200

    slight hybrid iter improvements

commit 38676308e3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 17 19:37:55 2020 +0200

    improved array list a bit

commit 813e82415a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 16 11:03:24 2020 +0200

    additional doc info

commit 555b7cc982
Merge: cd424d79 7871ee7c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 15 17:59:59 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 7871ee7ca8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 15 17:39:52 2020 +0200

    mutex helper little formatting correction

commit e39d5689e5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 15 16:56:22 2020 +0200

    device com IF formattign

commit c9d8bd59f0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 15 11:11:42 2020 +0200

    ctor improved

commit 6ecf1cf534
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 14 19:03:28 2020 +0200

    hk message continued

commit 9f69191f23
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 14 17:59:14 2020 +0200

    optimized command messages a bit

commit cd424d79e7
Merge: 60aed39b 8c03f6a8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 14 17:13:52 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 8c03f6a823
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 13 21:01:01 2020 +0200

    command message only passed IF now

commit 6b67f46c80
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 13 17:37:48 2020 +0200

    evil hidden bug found.

    CSB uses CommandMessageIF now

commit 7b538e9750
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 12 20:23:39 2020 +0200

    introduced command message base and

    command message IF

commit f578c3ea29
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 11 16:46:18 2020 +0200

    set buffer: const buffer is set too

commit 60aed39bc5
Merge: b6427d01 6838a9e7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 11 16:22:50 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 6838a9e768
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 11 16:19:22 2020 +0200

    serial buffer adapter bugfix

commit 206235ed47
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 11 16:03:09 2020 +0200

    dataset base bugfixes

commit a9c7ad84c8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 11 02:03:18 2020 +0200

    added new interface to host and linux osal

commit c1fe326f67
Merge: b2ed0edc 3268806f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 23:42:09 2020 +0200

    Merge branch 'mueller_framework' into mueller_newCommandMessageTest

commit 3268806f75
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 22:51:54 2020 +0200

    split up huge function to be more readable

commit b2ed0edce0
Merge: 47aa9ddc 454524d2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 22:45:04 2020 +0200

    Merge remote-tracking branch 'upstream/master' into mueller_newCommandMessageTest

commit bb9a299e33
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 22:19:40 2020 +0200

    added back removed comments

commit 5007041bc8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 22:12:29 2020 +0200

    cleaned up includes and improved doc a bit

commit 659594bac7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 21:35:47 2020 +0200

    better include guard and doc form improvement

commit 606957dc24
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 21:26:45 2020 +0200

    PSB update

commit 8fbd414a86
Merge: 52c88792 454524d2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 20:57:04 2020 +0200

    Merge remote-tracking branch 'upstream/master' into mueller_framework

commit 52c887925f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 20:53:28 2020 +0200

    iomanip include

commit b6427d017b
Merge: b20ba1f9 20e3b3c0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 01:19:00 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 20e3b3c0e2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 01:10:16 2020 +0200

    0 replaced by MQIF::NO_QUEUE

commit 3277d199ac
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 10 01:07:50 2020 +0200

    linux mq update

commit 47aa9ddcc3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 9 02:46:19 2020 +0200

    doc for mqm improved

commit 8ff6506ad9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 9 02:18:39 2020 +0200

    MessageQueue refactoring complete

commit b1f91439c6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 8 17:50:09 2020 +0200

    deleted copy ctor taskes const ref now

commit 07302e0d2a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 8 17:44:54 2020 +0200

    removed include

commit b20ba1f938
Merge: 3b4413a6 514ff4f4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 8 14:06:01 2020 +0200

    Merge remote-tracking branch 'upstream/master' into front_branch

commit 3cb79ebc86
Merge: 0ea249aa 514ff4f4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 8 14:05:40 2020 +0200

    Merge remote-tracking branch 'upstream/master' into mueller_framework

commit 0ea249aac4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 8 12:25:20 2020 +0200

    messagetype namespace im small letters now

commit 4c41456ddf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jun 8 01:22:21 2020 +0200

    thoughts on message queuee message

    new interface. What if there are MQ messages with different sizes?
    -> generic interface

    furthermore, maybe command message should be refactored to operate
    on a mq message instead of implementing it

commit 2649fa1507
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 23:38:15 2020 +0200

    small small command message tweaks

commit e8bc2cec9f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 23:26:52 2020 +0200

    small comment in semaph factory

commit 4a90f41122
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 18:53:55 2020 +0200

    generate HK packet function continued

commit 3b4413a6ee
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 16:12:23 2020 +0200

    added queue lock for  receiveMessage

commit 98e6ca5f78
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 15:22:32 2020 +0200

    removed locks in lockless functions

commit 73932f0349
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 13:58:51 2020 +0200

    object maanager tweaks

commit fe5b50d885
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 02:22:18 2020 +0200

    improved documentation signigicantly

commit d0b218c18e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 01:40:48 2020 +0200

    renaming for host os

commit 3c80bdfefa
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 01:18:19 2020 +0200

    some linebreaks

commit 33cc8591dc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jun 7 01:17:24 2020 +0200

    yaaay, hardcoded values

commit c81613690b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 23:41:54 2020 +0200

    no_queue value is 0xffffffff now

commit 65999ac6d6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 23:30:16 2020 +0200

    pool var no param is one now

commit 3d8993b0c5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 23:23:20 2020 +0200

    new typedef names

commit 9ed92e5e6f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 23:21:51 2020 +0200

    clock typedefs renamed

commit 70212d9f4e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 23:15:42 2020 +0200

    slight formatting

commit 8216b26fde
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 23:15:05 2020 +0200

    datapoollocal updates

commit ea548dea5b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 21:16:47 2020 +0200

    map lock init

commit d99be25529
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 20:52:28 2020 +0200

    cookie info iter was uninitialized

    leads to crash

commit 262d34174e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 18:56:54 2020 +0200

    using strncat now

commit b79efa6d6c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 16:25:06 2020 +0200

    variable for name len

commit 096fbec156
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 15:40:10 2020 +0200

    cleaned includesu p a bit

commit dc9ef41bec
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 15:31:45 2020 +0200

    added doc for linux

commit b0634ab0a2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 15:26:22 2020 +0200

    fixed bug (critical!)

commit ef01b78140
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 15:01:57 2020 +0200

    some issue with stack size ..

commit 212cd58f9a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 14:45:45 2020 +0200

    issues with fixed timeslo ttask on linux

commit 788f7a3745
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 13:59:00 2020 +0200

    better name for mq

commit 95bc5a871b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 13:56:35 2020 +0200

    improved diagnostic messages for linux

commit 04236859da
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 13:03:37 2020 +0200

    slight improvements to diagnostic ouput

commit 5289497ab5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 12:59:43 2020 +0200

    health helper optional, diagnostic output improved

commit d35524ecbc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 12:41:17 2020 +0200

    decoupling from raw reciever, linux mq improvements

commit 8e7593d68a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 02:10:21 2020 +0200

    removed error handling in separate fnctn

commit b4561465ba
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 01:36:07 2020 +0200

    some little form improvements

commit d600d48816
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jun 6 01:31:08 2020 +0200

    added the decoupling of DHB from powerSwitcher

    + some first hk maanger changes, might comment them out

commit 87f64d99cd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 23:18:00 2020 +0200

    implemented fixed timeslot task

commit d74f2c7560
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 21:40:06 2020 +0200

    housekeeping folder added to .mk file

commit 579115f904
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 21:36:50 2020 +0200

    adapting host osal

commit 2b646551e9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:40:22 2020 +0200

    mutex helper new output error

commit e9a9a543ce
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:38:59 2020 +0200

    fw message count one line further

commit 0d4d4123ab
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:37:46 2020 +0200

    added new message  type (hk)

commit 7247a1af7e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:36:25 2020 +0200

    new class ids

commit 9ec2283d13
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:35:08 2020 +0200

    hk folder update

commit 319fa9ddb6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:34:34 2020 +0200

    datapoollocal update

commit e04e6a6f15
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:33:57 2020 +0200

    datapoolglob update

commit 9fd5ef0194
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:28:06 2020 +0200

    updated datapool files

commit 8d3ac33b0e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 20:18:38 2020 +0200

    reordering init list for compiler

commit 872c350a92
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 18:36:22 2020 +0200

    another small bugfix (this-> was missing)

commit ef3e5c4582
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 18:20:21 2020 +0200

    very important bugfix for serial buffer adapter

commit dbeb04895b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 17:55:03 2020 +0200

    added hosted OSAL

commit 4ebd937fe0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 16:47:46 2020 +0200

    deleted old printer file

commit abcd818f2f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 16:44:31 2020 +0200

    printer renamed to arrayprinter

commit 2a632ae711
Merge: 405e1149 d7036edb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 16:03:58 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit d7036edb94
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 15:53:20 2020 +0200

    hotfix

commit dd210e99af
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 13:45:18 2020 +0200

    additional include which was missing

commit 904721cc36
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jun 5 13:44:11 2020 +0200

    improved pool entry iF

commit dd193fd64d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 21:27:37 2020 +0200

    obj manager.cpp improvements

commit e4944a067c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 21:24:44 2020 +0200

    change made was wrong (pointers in map are not deleted!)

commit d423c00115
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 21:14:35 2020 +0200

    additional nullptr check

commit 569724843e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 21:11:49 2020 +0200

    object manager improvements

commit 849053b830
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 21:04:24 2020 +0200

    small fix for object manager.cpp

commit 71487d60ca
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 21:01:09 2020 +0200

    onj managerIF update

commit 3eca16ff78
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 20:59:52 2020 +0200

    removed exit clause

commit 405e1149e5
Merge: f0be1b1f 4d59ddc3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 20:41:30 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 4d59ddc3db
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 19:50:26 2020 +0200

    some fixes, check for preamble size

commit 6ff1cf46c5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 19:40:43 2020 +0200

    new service interface stream

commit f2a9d29696
Merge: a115bf11 d75e4716
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 14:45:06 2020 +0200

    Merge remote-tracking branch 'upstream/master' into mueller_framework

commit a115bf1186
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 14:43:33 2020 +0200

    store access improvements

commit 925a54dec9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jun 4 01:06:03 2020 +0200

    more improvements for servicei nterface

commit 17ed9b7796
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 3 23:38:02 2020 +0200

    OS renamed to OS_FSFW (nameclash with system variable)

commit 5eb3d77bdb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 3 23:29:00 2020 +0200

    clarfiying comment

commit 0a512abc33
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 3 23:26:27 2020 +0200

    additional clarification comment

commit 5b93799ea6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 3 23:10:04 2020 +0200

    added forward declarations for service interface streams

commit 1c0ca4c329
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 3 23:02:23 2020 +0200

    some changes to take care of activity

commit 3483dff2ab
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jun 3 22:56:03 2020 +0200

    some more interface improvements

commit 5036cdbef3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 2 23:54:24 2020 +0200

    queue factory first param uint32_t again

commit 6972e72fbf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 2 23:52:31 2020 +0200

    fixed order

commit f0be1b1fff
Merge: c34c6238 54edeacb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 2 22:27:57 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 54edeacb2d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 2 22:25:28 2020 +0200

    changed names for linux

commit 986dc2047e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 2 22:19:48 2020 +0200

    replaced mutexIF and semaphoreIF name for timeouts

commit f0a25b5e2b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 2 22:10:34 2020 +0200

    new timeout values for MUtexIF and SemaphIF

commit de6ed5c085
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jun 2 15:57:04 2020 +0200

    improved include guard and removed old comment

commit 42f0687a6b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 31 23:28:51 2020 +0200

    self deletion nullptr

commit c8a36a79de
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 31 00:23:38 2020 +0200

    corrected doc for task factory interface

commit c34c6238c6
Merge: 66b75802 7a22d12d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 17:56:06 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 7a22d12d0f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 17:48:24 2020 +0200

    removed extern "C", not needed

commit 914bf8b9fc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 17:45:53 2020 +0200

    seconds_t is double now

commit 4d4ca2f3bd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 17:43:37 2020 +0200

    doc fix for stopwatch

commit f13eff79c9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 16:51:09 2020 +0200

    another little include guard fix

commit 6b0558d6c7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 16:49:11 2020 +0200

    added author tag back

commit 3ef939aca8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 16:46:26 2020 +0200

    fixed inclue protection

commit 5cf9e938cc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 16:45:03 2020 +0200

    added include protection

commit b90492562a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 16:40:57 2020 +0200

    added author tag back at class definition

commit f14bacba32
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 14:15:45 2020 +0200

    using nullptr now

    added new distinction between blocking (MAX_TIMEOUT) and polling
    (NO_TIMEOUT)

commit 6a3dc94108
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 13:18:27 2020 +0200

    removed extern "C" for freertos includes

commit d5352a9b87
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 13:15:37 2020 +0200

    actually extern "C" is not needed

    it is included by freeRTOS

commit e7ae35c659
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 13:09:47 2020 +0200

    improved structure a bit

commit 5169c09fd8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 13:07:35 2020 +0200

    improved includes

commit 78ae109a08
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 13:02:13 2020 +0200

    removed context switch request

    (shall be done at end of ISR, so must be performed by caller)

commit da403c01d0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 03:03:48 2020 +0200

    retval fix, unittest running again

commit 3d2935ac69
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 02:23:14 2020 +0200

    linux time lib improvements

    stop watch other function used (more precise for linux)

commit ccf79ab5b6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 01:55:20 2020 +0200

    output correction for linux

commit 671f298935
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 01:41:16 2020 +0200

    implemented counting semaph for linux

commit 56498e5bc1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 00:50:44 2020 +0200

    linux bin semaph unlocked

commit 8676fcd9a9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 29 00:47:54 2020 +0200

    yay, linux bin semaph finished

commit 60872f936c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 23:43:40 2020 +0200

    some output improvements

commit 08ffe89682
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 23:41:59 2020 +0200

    doc and api improvements

commit 7ce505fdf9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 23:29:06 2020 +0200

    some safety updates and fixes

commit 63dbf99592
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 22:12:52 2020 +0200

    counting semaph implementation finished

commit 95bf5c1071
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 21:33:34 2020 +0200

    improved const correctness

commit c4e60946d3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 21:30:20 2020 +0200

    improved bin semaph implementation

commit 88e3dc15b2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 21:27:31 2020 +0200

    replaced old semaph api

commit 7145982b4a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 19:59:59 2020 +0200

    improved documentation

commit eabee85ba9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 19:56:02 2020 +0200

    tweaked factory to have configurability

commit b4065c7764
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 19:46:56 2020 +0200

    seperation of semaph implementations finished

commit 8a1e0dab03
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 19:03:46 2020 +0200

    continued with task notifications

commit 2d33274c23
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 17:42:18 2020 +0200

    implementing new task notifications

commit 968d7fad81
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 17:07:35 2020 +0200

    replaced some timeout values

commit 66b75802b2
Merge: 9b5095e5 5b521e03
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 12:58:17 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 5b521e039b
Merge: badcacad 18d19fbb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 12:40:01 2020 +0200

    Merge branch 'mueller_fw_loc_globpool_distinction' into mueller_framework

commit 9b5095e5b8
Merge: a926312b badcacad
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 12:28:43 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit badcacad49
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 11:48:11 2020 +0200

    added new timeout values

commit f6ae0348cb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 11:41:36 2020 +0200

    some linux mutex tweaks

commit be4ac0bc8f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 27 00:28:13 2020 +0200

    added semaph factory to linux

commit f7dd91891a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 26 16:05:03 2020 +0200

    removed comments

commit 1a623a6a52
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 26 11:05:49 2020 +0200

    added override

commit a19fa231f5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 26 01:21:48 2020 +0200

    comment improvements

commit 9f2d5b64e0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 26 01:03:26 2020 +0200

    comment improvements

commit a926312b25
Merge: 8ddccfe3 242ca355
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 26 00:08:00 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 242ca355f5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 26 00:01:07 2020 +0200

    removed swappers for arraylist for now

commit 8ddccfe3bd
Merge: 219d85d7 3fd30635
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 23:54:39 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 3fd306356a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 23:43:44 2020 +0200

    fix for dh returnvalues

commit 243ea9cd87
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 23:38:51 2020 +0200

    improved dhb IF returnvalues

commit eacda67f02
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 23:36:03 2020 +0200

    added some comments for returnvalues

commit 18d19fbb2c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 23:12:25 2020 +0200

    < removed

commit a37f01cd0e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 23:11:56 2020 +0200

    improved readability of mode explanations

commit 96462ba8dc
Merge: f6ec65d3 7a0cbfb2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 22:29:33 2020 +0200

    Merge branch 'mueller_framework' into mueller_fw_loc_globpool_distinction

commit 7a0cbfb2f5
Merge: d6af9da5 cb14ec15
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 22:21:13 2020 +0200

    Merge remote-tracking branch 'upstram/master' into mueller_framework

commit 219d85d700
Merge: 723e7150 5e91363d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 15:59:17 2020 +0200

    Merge remote-tracking branch 'upstram/master' into front_branch

commit d6af9da566
Merge: 723e7150 5e91363d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 15:58:57 2020 +0200

    Merge remote-tracking branch 'upstram/master' into mueller_framework

commit f6ec65d35d
Merge: 8eb13ec6 5e91363d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 14:49:22 2020 +0200

    Merge remote-tracking branch 'upstram/master' into mueller_fw_loc_globpool_distinction

commit 8eb13ec627
Merge: 2f16b1e7 723e7150
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 14:02:43 2020 +0200

    Merge branch 'mueller_framework' into mueller_fw_loc_globpool_distinction

commit 723e715022
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 14:01:35 2020 +0200

    consistency fix

commit 2f16b1e733
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 25 13:48:43 2020 +0200

    moved some files

commit d4abfacd27
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 22 01:15:02 2020 +0200

    found solution for circ dependency

    had to put store_address_t in own file though

commit d2d1ef9a85
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 22 00:58:30 2020 +0200

    better include guards

commit aea18c423e
Merge: 7c48274c f6b17d6e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 21 17:01:29 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit f6b17d6e2e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 20 12:50:56 2020 +0200

    deleted copyctor and copy assignment

commit 338651af2f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 19 23:07:28 2020 +0200

    binary printer added

commit 9b53e2b64f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 19 22:45:48 2020 +0200

    added informative comment for counting semaphore

commit 7afaa752f3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 19 20:25:54 2020 +0200

    form improvement

commit 1aef000eff
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 19 20:24:58 2020 +0200

    printer improvements and fixes

    tc packet stored getter function

commit e2418d61a6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 19 19:53:10 2020 +0200

    improved printer

commit f612b095c1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 19 19:39:19 2020 +0200

    updated tmtc packet base

commit 2790a40d6c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 19 18:55:13 2020 +0200

    some renamings

commit 3c7e2c7cff
Merge: b12bace3 066930b1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 20:46:50 2020 +0200

    Merge branch 'mueller_BinSempahInterface' into mueller_framework

commit 066930b110
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 20:39:48 2020 +0200

    improvements

commit 7227c3a866
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 20:35:13 2020 +0200

    implemented semaph factory

commit 067cd95731
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 19:42:45 2020 +0200

    removed file header

commit b1d9d55f50
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 19:42:05 2020 +0200

    improved documentation

commit 4dd6594845
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 19:38:02 2020 +0200

    integrated interface into bin semaphore

commit 9ba21b1e28
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 19:30:50 2020 +0200

    semaphore if continued

commit 87bf843bef
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 19:19:50 2020 +0200

    binary semaphore IF init

commit 45b0193ef3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 18:06:40 2020 +0200

    bin semaph todo

commit b237287315
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 17:48:16 2020 +0200

    bin semaph sif replacements

commit ec8538b442
Merge: 41c0ca6c fc4199c3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 17:46:04 2020 +0200

    Merge branch 'mueller_binSemaph' into mueller_FreeRTOS_improvements

commit 41c0ca6c52
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 17:39:10 2020 +0200

    added doc for switchSystemContext

commit f8614e23a8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 17:38:19 2020 +0200

    deleted copy ans assignment ctor

commit d1500a7868
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 17:31:05 2020 +0200

    mq doc improvements

commit 1d4d01d190
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 17:22:10 2020 +0200

    Added ISR calls for MQ and task mgmt

    The task management defines an external function which
    implements a context switch call from an ISR

commit b12bace385
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 16:40:11 2020 +0200

    changed order of input arguments (relevance)

    default argument for ACK

commit 7e04c055b3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 16:13:46 2020 +0200

    tc packet stored formatting

commit 355bc2b905
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 18 15:42:47 2020 +0200

    improvements

commit 767850e125
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 23:58:57 2020 +0200

    deleted poolvector

commit d1b315c7df
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 23:54:56 2020 +0200

    pool raw access adaptions

commit 1d28e1398e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 23:41:28 2020 +0200

    DataSetBase class finished

commit 71f1722b88
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 22:20:54 2020 +0200

    removed old poolVar file

commit 9da0b0b2b2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 22:16:25 2020 +0200

    glob pool vec implementation in tpp file

commit 8b1fef730d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 18:02:58 2020 +0200

    resolved conflict

commit 234fd8e300
Merge: e9a4056d 0467b6a1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 18:00:51 2020 +0200

    Merge branch 'mueller_framework' into mueller_fw_loc_globpool_distinction

commit 0467b6a1bf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 17:53:18 2020 +0200

    slight DHB improvements

commit 7c48274c9b
Merge: ebcc4742 9597a012
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 17:27:04 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 9597a0121b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 15:49:46 2020 +0200

    DHB update

commit da972e1b58
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 15:41:42 2020 +0200

    DHB improvements

commit e9a4056deb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 15:19:24 2020 +0200

    added DHB cookie init

    (why was that never a problem beofre????) ¯\_(ツ)_/¯

commit 9056ad36ed
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 14:13:31 2020 +0200

    object manager better output

commit 5b8a6e35dc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 13:37:50 2020 +0200

    renaming complete, pool in namespace

commit cbfa21d45a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 17 01:17:11 2020 +0200

    merging renaming into main branch

commit b673e13892
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat May 16 20:58:48 2020 +0200

    some refactoring

commit 7d57988979
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat May 16 13:09:50 2020 +0200

    added deadline check

commit 20900227f8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 22:53:01 2020 +0200

    periodic posix task ctor format

commit ebcc4742a9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 21:14:21 2020 +0200

    removed conflict markers

commit abdf04ce79
Merge: d44a06fa 0e243841
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 21:10:56 2020 +0200

    Merge branch 'mueller_framework' into front_branch

commit 0e2438416d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 20:00:43 2020 +0200

    added comment

commit 5b41f2a6bd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 19:58:58 2020 +0200

    optimization

commit c77ec9e7fc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 19:56:54 2020 +0200

    uint16_t correction

commit 3f71babfa9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 19:50:51 2020 +0200

    app data len uint16_t, full length size_t

commit 24bfbfbd33
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 18:56:06 2020 +0200

    removed StorageAccessoremoved StorageAccessorr

commit 80cee27429
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 18:53:54 2020 +0200

    printer fixes

commit d48fe8fb09
Merge: 6e1bb16d 1b093d96
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 18:51:58 2020 +0200

    Merge branch 'mueller_globalPrinter' into mueller_framework

commit 6e1bb16d4e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 18:46:58 2020 +0200

    printers continued,

    possible  bugfix in tc packet base

commit 237dd4a256
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 18:23:57 2020 +0200

    added additonal functions for tc packet base

commit 5ac32b14f0
Merge: 684da2b8 effac0e9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 18:23:45 2020 +0200

    Merge branch 'mueller_globalPrinter' into mueller_framework

commit 684da2b8d5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 15 15:30:29 2020 +0200

    set application data function added

commit 69237bc2e8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 14 21:26:04 2020 +0200

    freertos includes adapted

commit 49fa2fe32c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 14 16:12:01 2020 +0200

    changed void* cast to QueueHandle_t cast

commit 50a1b5170a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 13 18:03:09 2020 +0200

    formatting

commit 19e51575cf
Merge: 3122f62b 0e56a094
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 13 12:53:25 2020 +0200

    Merge remote-tracking branch 'origin/meier_framework' into mueller_framework

commit 3122f62b0a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 12 19:02:59 2020 +0200

    bugfixes for write() call

commit 291710f257
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 12 17:57:37 2020 +0200

    new ctor and bugfixes

commit d873fcbf8e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 12 16:47:47 2020 +0200

    added documentation for storage manager IF

commit 6c70abfe16
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 12 16:32:01 2020 +0200

    moved pool accessor fuctions to local pool

commit 5af0c15dfc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 12 14:12:39 2020 +0200

    simplified storage accessor

commit 1946af64af
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 12 14:11:00 2020 +0200

    storage accessor mutex lock removed

commit e5c46c5ec1
Merge: 43d3ca7e 77565c74
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 11 19:25:45 2020 +0200

    Merge branch 'mueller_FixedSequenceImprovements' into mueller_framework

commit 43d3ca7e37
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 10 21:56:21 2020 +0200

    memory message: no retval

    CSB: retval

commit d44a06fafc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 10 12:48:22 2020 +0200

    removed cfg include

commit 2f58c3a305
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 10 00:14:00 2020 +0200

    commented out storage accessor

commit 0f286461d0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat May 9 18:10:26 2020 +0200

    added new storage raw accessor

commit d35a6e6c14
Merge: c05b9cbd 6dc05e49
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 8 18:41:07 2020 +0200

    Merge remote-tracking branch 'upstream/master' into front_branch

commit 9489b7abc1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 7 19:23:56 2020 +0200

    modifyData override deleted

    is not really thread-safe anyway

commit fe9aa46cf8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu May 7 12:22:17 2020 +0200

    removed system object list include.

    makes it difficult for multiple configurations, because the wrong header
    might be included

commit b016f2995a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 6 16:34:43 2020 +0200

    added default vlaue for init function

commit e950051b4a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 6 14:35:30 2020 +0200

    some object managerIF security measures

    objectmanager get function checks whether global object manager was
    initialized now.
    New returnvalues, which are also used for local pool init

commit 6b205e166b
Merge: cc0469fe 77c21fc2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed May 6 13:54:18 2020 +0200

    Merge branch 'master' into mueller_framework

commit cc0469fef6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 20:09:42 2020 +0200

    return failed insteead of exiting

commit f09836a9eb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 19:30:03 2020 +0200

    removed exit for empty psremoved exit for empty pstt

commit 4695e87cdc
Merge: 160a0979 df9e6683
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 19:08:46 2020 +0200

    Merge branch 'mueller_fifo_enhancement' into mueller_framework

commit 160a09790e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 18:53:25 2020 +0200

    removed c omment for now

commit bc17b5a907
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 18:43:28 2020 +0200

    resolved conflict

commit ad31a1b97d
Merge: 399e6b3a f1a0bb9d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 18:41:40 2020 +0200

    Merge branch 'luz_FixedTimeslotTask_ExistenceCheck' into mueller_framework

commit 399e6b3a09
Merge: 6817aa4d c05b9cbd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 15:07:47 2020 +0200

    Merge branch 'front_branch' into mueller_framework

commit c05b9cbd01
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 14:07:27 2020 +0200

    reverted ResultIF. for now, keep using HasReturnvaluesIF

commit 1825924b7b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue May 5 10:16:16 2020 +0200

    abbreviation for resultIF

commit 6817aa4d03
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 4 16:57:08 2020 +0200

    pool manager refactoring

commit b947253ac3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 4 16:49:15 2020 +0200

    local pool neat

commit 4b65d6e847
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon May 4 12:33:57 2020 +0200

    local pool bugfix

commit 3e4263f068
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 3 12:27:18 2020 +0200

    freeRTOS task factory fix

commit 35594d4b71
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun May 3 00:48:18 2020 +0200

    goofed up, delay function back in task factory

commit 281da25bf9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 1 16:47:53 2020 +0200

    extended task management for freeRTOS

commit 15c03863c0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri May 1 14:49:52 2020 +0200

    additional docmentation for freeRTOS task factory

commit 03333c2af0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 30 21:37:02 2020 +0200

    pool raw acces printout

commit 431709a3ec
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 30 15:42:33 2020 +0200

    pool raw acces helper bugfix

commit e1aa285b6d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 29 13:46:30 2020 +0200

    linux osal output in namespace

commit 7ec6d2ceaa
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Apr 28 18:58:55 2020 +0200

    remove dspecial character messing with decoding

commit ecf3b4b535
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 22:05:12 2020 +0200

    stopwatch warning fix

commit a5d2cbd7db
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 21:59:24 2020 +0200

    some more sif replacements

commit 0ea692a5ea
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 20:04:48 2020 +0200

    some more sif changes

commit 01195093e3
Merge: 1415cd23 2c6b4465
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 19:21:12 2020 +0200

    Merge branch 'mueller_sifRenaming_soooMany' into mueller_framework

commit fc4199c3b1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 18:13:14 2020 +0200

    architecture dependant call delcared external

commit 328737d0ad
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 18:12:02 2020 +0200

    newer non-deprecated semaphore call used

commit 1415cd2339
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 17:54:41 2020 +0200

    using newer bin semaph create call.

    architecture dependant function call is external now and shall
    be implemented by developer

commit 44d4678089
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 14:06:48 2020 +0200

    fifo features and stopwatch enhancement

commit ee2ee745c7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 12:47:59 2020 +0200

    fifo renamed

commit d546317e6a
Merge: 40d952a3 3a3960ed
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 10:33:19 2020 +0200

    Merge branch 'mueller_TmTcBridge_cherryPicked' into mueller_framework

commit 40d952a349
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 10:24:34 2020 +0200

    minor form changes

commit e40c9f42c6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 10:22:25 2020 +0200

    info output commented out

commit c075e1bf23
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 10:20:19 2020 +0200

    adapting tmtc bridge

commit db535e25f2
Merge: 2c2ccf8a d0ce075e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 23 10:03:15 2020 +0200

    Merge branch 'mueller_TmTcBridge_cherryPicked' into mueller_framework

commit 2c2ccf8a8d
Merge: 9f7f8073 50265170
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 23:49:10 2020 +0200

    Merge branch 'mueller_TmTcBridge_cherryPicked' into mueller_framework

commit 0e6f8d3f82
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 19:53:06 2020 +0200

    comment adapted

commit 1b5127dc85
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 19:50:07 2020 +0200

    added task management implementation

commit 6eda5a0838
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 19:46:49 2020 +0200

    task management header added

commit e26f0d54b2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 19:44:03 2020 +0200

    binary semaphore init

commit 9f7f8073f1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 19:42:42 2020 +0200

    freertos includes in extern "C"

commit fb9a5678fc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 10:24:00 2020 +0200

    removed comment belonging in egit

commit 4e76b8133e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 01:08:36 2020 +0200

    uninitialized variable

commit 326e5cf5fe
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 22 01:01:32 2020 +0200

    initialized uninitialized variables

commit 6553450b4b
Author: Uli <uli@vnks.de>
Date:   Tue Apr 21 22:28:43 2020 +0200

    Actually, not that horrible, thanks to sed

commit a42832ca01
Author: Uli <uli@vnks.de>
Date:   Tue Apr 21 21:34:03 2020 +0200

    working on updating SerializeIF, to quote Basti: This is going to be horrible

commit 7e3af7cf83
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 19 21:36:10 2020 +0200

    replaced slotLengthMs with lengthMs

commit 36715e3f4c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 19 12:06:28 2020 +0200

    test folder moved to separate test folder

    for fsfw for now

commit e77ca55b1d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Apr 18 17:12:26 2020 +0200

    serial fixed array list adapter doc fix

commit a7d3b4c4a0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Apr 18 15:05:51 2020 +0200

    added std:: before uint32_t typedef

commit 9580f51c30
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Apr 18 14:16:46 2020 +0200

    removed self-inclusion

commit e34a438e77
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Apr 18 13:38:05 2020 +0200

    using size_t

commit 4d8aca8417
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Apr 18 13:32:40 2020 +0200

    message queue adaptation for ISRs

commit a405357578
Merge: ea1d55b0 05c1330b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Apr 18 13:30:22 2020 +0200

    Merge remote-tracking branch 'upstream/master'
    into mueller_framework

commit ea1d55b033
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Apr 18 13:16:00 2020 +0200

    null replaced by nullptr.

    storeID initialization added, all nullptr/0 initializations in header

commit 5595b0f3ce
Merge: eb362dca f45a8cc1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 16 17:02:10 2020 +0200

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit eb362dcad2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 16 17:02:04 2020 +0200

    some comment line break

commit f45a8cc171
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 16 13:17:26 2020 +0200

    fixed slot sequence safety check added

commit 21650b064d
Merge: 5582ca27 33b834ad
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 16 13:01:17 2020 +0200

    Merge branch 'mueller_framework'

commit 33b834ad91
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 16 10:43:50 2020 +0200

    null replaced by nullptr

commit 7c360be1e0
Merge: bd0b9cb8 9284fe81
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 16 09:30:26 2020 +0200

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit bd0b9cb877
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 16 09:30:02 2020 +0200

    catch example informative comment

commit fc08754b98
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 15 23:28:45 2020 +0200

    some doc unclarities comment added

commit 9284fe81da
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 15 20:53:03 2020 +0200

    added override specifiers, some doc fixes

commit 906f941f32
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 15 15:53:46 2020 +0200

    ssize_t in deSerialize replaced by size_t

commit af27a2441a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Apr 14 16:19:13 2020 +0200

    added catch framework for basic testing

commit c5e5de1530
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Apr 14 12:24:26 2020 +0200

    deleted example values

commit 2cc4386b4c
Merge: b48a0a4a 03b0ae7b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Apr 14 11:18:24 2020 +0200

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit 03b0ae7b68
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Apr 14 11:16:51 2020 +0200

    unit test fixes

commit b48a0a4a4c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 13 22:45:23 2020 +0200

    unit test class continued. serialize adapter

    functions which are internal, extracted to separate class

commit fe45c7eb8b
Merge: 0d016e5a a0ee0109
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 13 16:38:29 2020 +0200

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit 0d016e5a2b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 13 16:37:25 2020 +0200

    slight formatting

commit a0ee010926
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 13 16:27:05 2020 +0200

    Added test folder.

commit eb2df3d88c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 12 23:06:57 2020 +0200

    Using C++ to implement preamble. adding optional flag for carriage return

commit 69e9710bf1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Apr 10 17:06:06 2020 +0200

    added intial carriage return im preamble

commit 841b28b65d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 9 18:02:10 2020 +0200

    stopwatch ms now working

commit 8a8761ea88
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Apr 9 17:56:48 2020 +0200

    stopwatch bugfix

commit 5582ca278b
Merge: 94137896 640cc1dd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 19:44:21 2020 +0200

    Merge branch 'mueller_framework'

commit 94137896cc
Merge: 35eff6df 2a72e94d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 19:44:10 2020 +0200

    Merge branch 'mueller_stopwatch'

commit 35eff6dfba
Merge: 826e2bdb c88c6c2a
Author: Robin Müller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 19:35:26 2020 +0200

    Merge branch 'ksat_master' of KSat/fsfw into master

commit 640cc1ddec
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 19:30:39 2020 +0200

    some more bugfixes

commit 5b0f80509f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 19:24:24 2020 +0200

    usec replaced by seconds

commit da9bb97b23
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 19:05:21 2020 +0200

    added precision for double output

commit 3dbf353385
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 18:33:38 2020 +0200

    some more refactoring for stopwatch

commit 3af241b9c4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 18:27:18 2020 +0200

    stopwatch more lightweight now

commit e0e1e64a09
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 8 18:08:14 2020 +0200

    various changes, stopwatch

    Semaphore: Some bugfixes, some constructors added
    Stopwatch: First implementation, can measure in ms(double) and
    ms(normal)

commit 30ed08005f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Apr 7 22:16:43 2020 +0200

    reverted some naming changes

commit c88c6c2a45
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 6 19:51:45 2020 +0200

    binary semaphore info printout added

commit aaabbe8aef
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 6 13:59:57 2020 +0200

    DHB fix

commit 78aad91aab
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 6 12:38:39 2020 +0200

    PSB subservice passed to handleRequest

commit 3654c7bf81
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Apr 6 11:15:44 2020 +0200

    some form stuff

commit e791f44c41
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 5 23:03:32 2020 +0200

    copy ctor and assgnment op forbidden

    for serial linked lists

commit 42838272a5
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 5 22:42:48 2020 +0200

    replaced int32_t size by ssize_t (type trait trick)

commit 87852e5f2a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 5 21:54:11 2020 +0200

    replaced getSerializedSize returnvalue with size_t

commit 7079c9c56d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 5 17:58:39 2020 +0200

    replaced serializeIF serialize sizes with size_t

commit 06ae64d59c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 5 15:46:10 2020 +0200

    CSB: replaced some uint32 with size_t

commit a65a19f583
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 5 15:33:24 2020 +0200

    deletd serial buffer adapter2

commit 4a35035b28
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 5 15:30:31 2020 +0200

    serial buffer adapted improvements

commit 80b1d28bc8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Apr 5 00:23:29 2020 +0200

    new dvice com IF return value

commit bd468a1b74
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 1 17:19:03 2020 +0200

    timeslot time 0 definitely leads to error

commit 335df7787a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 1 17:15:27 2020 +0200

    testing timeslot task 0

commit 8f39820ace
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 1 17:05:55 2020 +0200

    doc formatting

commit 996dbc9e4b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Apr 1 12:41:54 2020 +0200

    DHB/Cookie refactoring

commit 5218a0d84f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Mar 28 19:42:24 2020 +0100

    doc fix

commit 93678adc5a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Mar 28 00:09:15 2020 +0100

    replace std::set by std::multiset

    so there can be multiple entries with same pollignTime

commit 5d071a1cf1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Mar 26 19:53:05 2020 +0100

    new device comIF return value in DHB

    request receive message

commit 0e56a094d3
Author: jakob.meier <jakob.meier@outlook.de>
Date:   Thu Mar 26 19:43:38 2020 +0100

    merged FwMessageTypes

commit e252a5b795
Author: jakob.meier <jakob.meier@outlook.de>
Date:   Thu Mar 26 19:20:16 2020 +0100

    file system support

commit 093fef5d6f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Mar 26 15:20:17 2020 +0100

    moved address_t typedef to cookieImoved address_t typedef to cookieIFF

commit 163779622f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Mar 25 02:08:35 2020 +0100

    DHB: replyLen in replyMap now

commit b2b6b8ee23
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Mar 24 15:33:18 2020 +0100

    added initializeInterface for comIF/cookie

commit ea49d88c4b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Mar 24 14:21:57 2020 +0100

    moved all return values to DH IF

commit 7e8d92f956
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Mar 24 00:22:17 2020 +0100

    replaced std::list by std::set for fixedSlotSequen

commit f7b7e10d05
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Mar 23 19:14:36 2020 +0100

    date format changed

commit b6bf9d7147
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Mar 23 19:09:42 2020 +0100

    to avoid dynamic casting, introuced CookieIF

commit f7bd661e69
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Mar 23 18:08:24 2020 +0100

    small fixes

commit fa058ee602
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Mar 23 18:05:39 2020 +0100

    renamed rmap to com (more generic)

commit d3e2652078
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Mar 23 17:58:23 2020 +0100

    replaced DHB sizes by size_t, rework

    Cookie now passed to DHB, rework in progress

commit c50d9d90d6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Mar 23 13:14:23 2020 +0100

    replaced std::variant by two uint32 parameters

commit af6d18d60b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Mar 20 22:47:07 2020 +0100

    added additional parameter form open/reopen call

commit 52c05e2f3d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Mar 19 12:44:24 2020 +0100

    minor formatting for pull request

commit b7e3449b04
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Mar 19 12:38:11 2020 +0100

    some more doc for containers

commit a3903f80fb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Mar 19 00:49:47 2020 +0100

    typedef address_t moved to deviceComIF

commit b5fe1fa530
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Mar 9 22:15:52 2020 +0100

    dhb virtual function moved to top

commit 6579200f55
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Mar 6 19:01:31 2020 +0100

    removed counter, will be implemented in childclass

commit 68cda479d6
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Mar 6 18:48:48 2020 +0100

    DHB: performOperation Hook + polling counter

    polling counter to specify how often communication opertions are
    performed, however this still needs to be changed..

commit 22e4dabd1b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Mar 6 15:39:42 2020 +0100

    BinSemaphore reset function added

commit 43ac0ec04b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Mar 4 23:07:54 2020 +0100

    Communication Message continued

commit fb6172fdc5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Mar 4 00:37:58 2020 +0100

    communication message continued.

    Some fixed timeslot task improvements

commit dd4a5a45e3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Mar 3 21:20:08 2020 +0100

    communication message extended

commit 72963f5855
Merge: d0e8eb38 238892bd
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Mar 3 00:07:48 2020 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit d0e8eb386c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Mar 2 01:00:17 2020 +0100

    renamed system context to call context

    to avoid conflicts with ISIS library, I don't want to fiddle with
    it if we don't have source code

commit 238892bd66
Merge: 6d6c78b2 fa38a376
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Feb 29 01:22:41 2020 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit 6d6c78b255
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Feb 29 01:21:36 2020 +0100

    task management doc

commit fa38a37604
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Feb 28 22:55:25 2020 +0100

    all context switches calls to TaskManagement.h now

commit c93ee5c6cd
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Feb 27 19:00:51 2020 +0100

    message queue IF return values

commit abccd81fdf
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Feb 26 16:55:35 2020 +0100

    new file for freeRTOS task management functions

commit 083cc7c50a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Feb 25 17:04:21 2020 +0100

    sempahore wrapper extended

commit 685c18dc4e
Merge: 7a426ace bfc7a768
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Feb 25 12:55:20 2020 +0100

    Merge branch 'ksat_master' into mueller_framework

commit bfc7a768ce
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Feb 25 12:54:28 2020 +0100

    message queue adaptions for calls from ISR

    functions moved to top
    binary sempahore file init
    mutex return values

commit 7a426acece
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Feb 21 16:08:43 2020 +0100

    therm sensor doc correction

commit 54eeb71f02
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Feb 17 21:20:51 2020 +0100

    bugfix: added implementation

commit 6ab07aeb19
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Feb 16 21:04:17 2020 +0100

    valid mask bugfixes

commit 1001c1d48b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Feb 16 17:21:06 2020 +0100

    added new IF for thermal messages

commit 99b90e625d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Feb 16 16:14:29 2020 +0100

    refactored: limit type specified separately

commit ddae9ee80f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Feb 16 14:59:45 2020 +0100

    adapted temp sensor to use °C limits, doc added

commit d8ed5bb1c1
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Feb 15 18:55:22 2020 +0100

    some comments for missing doc

commit e15839b3a6
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Feb 15 18:26:25 2020 +0100

    Thermal: Some formatting stuff, doc to do

    Need to find out how to use the thermal components

commit a7964c7200
Merge: b3faf1e4 413d6593
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sat Feb 15 15:34:53 2020 +0100

    Merge branch 'luz_FixedTimeslotTask_ExistenceCheck' into mueller_framework

commit b3faf1e4ad
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 31 23:42:11 2020 +0100

    old timestring used

commit 5190e4c16e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 31 00:54:34 2020 +0100

    Serial Buffer dapter changes reverted

    CCSDS time bugfixes in separate section (for C98)
    Serial buffer adapter 2 bugfixes

commit 09144b18c4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 29 01:03:20 2020 +0100

    ccsds time changes changed

commit 7dd4694d9d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 28 23:19:19 2020 +0100

    CCSDS time extra defined for avr lib

commit 8f17d5147e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 27 00:43:01 2020 +0100

    SerialFixedArrayList constructor bugfix

commit 85048cc9ee
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 26 22:13:56 2020 +0100

    Pool Raw Access change bugfix

commit d9fa13b6eb
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 26 18:31:17 2020 +0100

    ADDED old pool entry constructor

commit 6eedb3f097
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 23 15:45:21 2020 +0100

    New Pool List Initializer.

    Needs testing !!!

commit d330958abb
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 22 14:27:11 2020 +0100

    Array List endian swapper protected now

commit 1977942c4b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 22 14:24:48 2020 +0100

    Array List Entry swapper function

    And respective SerialAdapter functions to use it

commit 3d2bdae14d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 20 23:29:36 2020 +0100

    CSB abstract functions moved to top

    So documentation of functions to implement is closer to the top

commit dba26baee6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 20 23:00:23 2020 +0100

    Restructured header file

    Abstract functions are closer to the top
    because they must be implemented and documentation
    should be near the top.
    Important virtual functions moved up too.
    Additional documentation added

commit 424c82ce16
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 18 23:07:43 2020 +0100

    Extracted one logic block

    To increase readability

commit 5cb591a063
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 18 18:01:37 2020 +0100

    Array List swapper for SerialFixedArrayList

commit 6fe0f45c27
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 18 16:48:33 2020 +0100

    SerialBufferAdapter new setBuffer function

    Serial Fixed Array List Adapter documentation adapted
    SinglyLinkedList setEnd() function added

commit c9e4c73bd2
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 18 15:03:22 2020 +0100

    Local pool public members/functions moved to top

commit 1f4391f56e
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 17 21:11:39 2020 +0100

    Endian Swapper buffer swapper changes reverted

commit 1d1bb88a6f
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 16 19:07:53 2020 +0100

    Merge request check

commit 9bdbc2c380
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 16 18:46:29 2020 +0100

    Endian swapper changes, Serial buffer adapter

    New Serial Buffer Adapter with complete template class for buffer type.
    Endian Swapper input now standard uint8_t * pointers instead of template
    type. Fixed Array List new ctor, but commented out for now

commit 1437f33027
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 15 17:30:23 2020 +0100

    Serial Fixed Array List template type clarifications

commit 9aa57f29b8
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 15 13:52:18 2020 +0100

    basic documentation thermal

commit 9ec0b80497
Merge: f16cce8b b0d88129
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 15 13:32:41 2020 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit f16cce8be1
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 15 13:32:21 2020 +0100

    Basic doc for thermal modules started

commit b0d88129db
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 14 01:39:47 2020 +0100

    Pool Raw Access Helper bugfix

    debug output commented

commit c747952336
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Jan 14 00:49:09 2020 +0100

    fixed map full() function added.

    Pool raw access debugging

commit 01551b8fa5
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 13 01:21:53 2020 +0100

    Getter function in SerialBufferAdapter

    For const uint8_t *

commit 1369e792b4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Jan 13 00:14:14 2020 +0100

    CommandingServiceBase documentation

commit d2325e60b6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 12 15:51:59 2020 +0100

    Import bugfix in MessageQueue.cpp

    lastPartner is only assigned if receiveMessage is successful

commit a8247eb2f0
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 12 14:18:12 2020 +0100

    Some more debugging output switched on

commit 0ce67de8c8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 10 00:57:09 2020 +0100

    Changes to pool access classes

    1. PoolRawAccessHelper is more robust now and has better error handling
    2. PoolRawAccess: Removed an unneeded constructor value, moved serialize
    further to the top. Added new returnvalues and more precise error
    handling for read() call
    3. DataSet: Made MAX Number of data pool entries public so it can be
    used by pool raw access error handling

commit 59b25bee86
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 9 19:04:33 2020 +0100

    pool raw helper input buffer type changed to uint32_t

commit 0ddc44062d
Merge: a7450144 2ec486a8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 9 12:50:00 2020 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit 2ec486a880
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Jan 5 18:20:57 2020 +0100

    max number of stored packets lowered

commit 827f185e20
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Jan 4 16:37:08 2020 +0100

    Some bugfixes(?) for PusServiceBase.
    Getter Function for Serial Buffer Adapter.

commit a7450144de
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Jan 3 15:39:32 2020 +0100

    doxygen group definitions moved to framework

commit 0a57103339
Merge: f6e88e83 e2f07cbc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 2 21:12:42 2020 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit f6e88e83db
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 2 21:12:21 2020 +0100

    debug output change

commit e2f07cbcd1
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Jan 2 14:01:21 2020 +0100

    connect and disconnect functions public

commit 831a01e79e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 1 17:31:17 2020 +0100

    recvBuffer and recvSize initialized

commit c73cb90c36
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Jan 1 16:54:05 2020 +0100

    receiveTc function adapted

commit a762c159fe
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 30 01:13:33 2019 +0100

    pool raw access helper info output commented out

commit 2425685e44
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 29 01:59:02 2019 +0100

    Pool Raw Access Helper serialization of vectors implemented

commit 666341d03d
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Fri Dec 27 22:43:09 2019 +0100

    new bool datatype for possible pool entries

commit 79e7fee807
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 26 22:15:19 2019 +0100

    comment deleted

commit a38a2f4b3a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 26 22:07:17 2019 +0100

    tmtc bridge bugfix: tm data deleted when overwriting old data

commit 33a7c033a2
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 26 20:38:15 2019 +0100

    doc extended, instructions for sendTm and receiveTc

commit 19e257a90a
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 26 20:35:11 2019 +0100

    tmtc bridge debug output corrected

commit 8397f5b2b1
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 26 20:17:21 2019 +0100

    tmtc bridge bugfix

commit 0066a6b788
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 26 19:47:46 2019 +0100

    Generic TMTC Bridge added

commit 29b4480fc4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 26 18:55:31 2019 +0100

    include adapted

commit e24f9b89e4
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 26 16:44:50 2019 +0100

    Pool Raw Access Helper tested, appesrs to work. SerializeAdapter doc
    changes, tm packet stored debug output if not enough
    storage available

commit 1f1831c4a1
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 24 22:15:39 2019 +0100

    pool raw access init

commit f6b9b23287
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 24 01:41:04 2019 +0100

    pool raw access init

commit 89f490ac36
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Dec 20 23:09:35 2019 +0100

    assembly constructor formatting

commit d17146d847
Author: Maximilian Luz <luzmaximilian@gmail.com>
Date:   Thu Dec 19 16:09:50 2019 +0100

    Check object existence before adding it to the PST

    Currently, adding new objects/components to the FixedSlotSequence PST is
    not being checked, meaning that it is possible to add NULL objects here
    without any warning. This causes NULL-pointer errors when non-existent
    components are added, which can be hard to debug.

    To solve this, add a check for the object existence before adding it to
    PST and emit an error message.

    Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>

commit fa6cbe7e0c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 11 23:18:28 2019 +0100

    pool raw access changed reverted

commit 625f3dc79c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 11 23:15:34 2019 +0100

    local pool modify data doc modifided

commit 9382eb03e6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 11 22:50:08 2019 +0100

    function to serialize pool ID buffers into dataset created

commit 29a15e8154
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 11 13:03:51 2019 +0100

    commented out functions which will propably not
    be needed and removed

commit 138cac98d1
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Wed Dec 11 01:57:36 2019 +0100

    experimenting with recursive constructor and dataset call

commit f7d8f0c161
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 10 23:26:48 2019 +0100

    Reverted changed  pool raw access commit

commit 6abb3cc525
Merge: f33949ba 356d1d35
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 10 14:54:32 2019 +0100

    Merge remote-tracking branch 'origin/feature_EndianSwapper_UINT32_BUFFER_PoolRawAccess_Modification_For_Vectors' into mueller_framework

commit f33949ba4b
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 10 14:54:17 2019 +0100

    doc adapted, merging

commit 356d1d35dc
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 10 13:29:16 2019 +0100

    experimenting with recursive constructor to enable
    automatic vector registering

commit e765f8c99b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Dec 9 12:27:14 2019 +0100

    pool raw access modified so vectors are properly serialized now
    Endian swapper can swap the entries of a uint16,uint32 buffers now.
    Some documentation for functions added. setter function for serial buffer
    adapter written but does not appear to compile, commented out

commit 8168885dd9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 8 22:57:03 2019 +0100

    Serialization documentation update

commit 3159ccbc40
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 8 22:26:42 2019 +0100

    fixed map and local pool doc

commit d99ed47150
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 8 19:04:53 2019 +0100

    fixed map bugfix (fist instead of first), new access functions for fixed maP
    (first(), second()), some documentation, raw pool access read() call public
    because call is necessary before using public serialize function.
    maybe integrate read() call into serialize function?

commit 950a48078c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Dec 5 12:21:06 2019 +0100

    some documentation, question about HasParametersIF,
    variable in ParameterHelper intialized (compiler warning)

commit 9c3a9323b7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Dec 3 19:30:37 2019 +0100

    some doc change proposals while
    writing hk service.
    Added Type.h in PoolRawAccess.h, compiler error
    when not doing that

commit 37a70df244
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Dec 1 17:48:05 2019 +0100

    SerialBufferAdapter can process uint32_t * buffers now

commit 10c24e39a3
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Nov 29 19:56:05 2019 +0100

    new returnvalue for scanForReply to ignore full packet

commit 2039aa5665
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 25 00:14:39 2019 +0100

    Service Interface Stream buffer size higher to print long buffers (like nav data)

commit 2f14fd5d4d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 11 22:45:53 2019 +0100

    Cant reach mode reason getter function added

commit 2b44e1c9c4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Nov 10 13:08:02 2019 +0100

    CCSDS sscanf function adapted for atmel stdio.c (see comments)

commit b8af3b5e3d
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Nov 9 18:15:45 2019 +0100

    debugInterface extended

commit 537e2ceb18
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Nov 9 13:29:12 2019 +0100

    Getter method for logicalAddress

commit ee765eafc7
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Nov 9 13:17:54 2019 +0100

    ioBoardAddress renamed to logicalAddress

commit 801bd4d7eb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Nov 9 13:07:26 2019 +0100

    debug interface for dhb created.
    This is useful to track states or values
    in child handler. some documentation added.
    New doxygen group for interfaced added.

commit bf7bc342ff
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 5 19:30:02 2019 +0100

    Revert "documentation for DHB init function, ioBoard addres has default value 0 now, order in ctor changed (not used in source)"

    This reverts commit c6e34cada6.

commit af4e9db9e3
Merge: b594bc2a 8a93a873
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 5 19:25:27 2019 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit b594bc2a97
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Nov 5 19:25:00 2019 +0100

    removed obsolete comment

commit 8a93a873a8
Merge: e7f7625a cb919ada
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 4 11:07:02 2019 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit e7f7625adf
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 4 11:06:59 2019 +0100

    removed wrong include

commit cb919ada2a
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 4 01:55:40 2019 +0100

    assuming that a default value of 0 for expectedReplies is needed, I introduced a new variable into DeviceCommandInfo, which stores another number of replies expected. this value is assigned in enableReplyInReplyMap. That way, the initial value of 0 remains the same (if it was needed), and is only set to another desired value if a write was sent

commit 12f51575eb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 4 00:53:05 2019 +0100

    removed a flag by accident, fixed now

commit 8eb1a5b13e
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Nov 4 00:47:46 2019 +0100

    proposal 1: expectedReplies parameter is set in insertInCommandAndReplyMap, default value stays one. overriding enableReplyInReplyMap is not necessary anymore.second proposal: the commander id is supplied in the interpretDeviceReply function, so we don't have to look for it in the DeviceCommandMap. was it removed at some point because it is listed in the documentation?

commit 46986f69e4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sat Nov 2 23:30:12 2019 +0100

    serialize tools more documentation

commit d47496db40
Merge: 16af33a7 3887cb8c
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 29 19:31:20 2019 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit 16af33a7bb
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 29 19:31:18 2019 +0100

    doc for fifo, device com if..

commit 3887cb8ca1
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 29 18:22:34 2019 +0100

    removed wrong include in dhb

commit 3f1d68542e
Merge: e8a16ac5 1ee445ce
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 29 18:21:03 2019 +0100

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit e8a16ac59c
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 29 18:21:01 2019 +0100

    dummy com if sendMessage data const

commit 1ee445ce24
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 29 11:17:07 2019 +0100

    fifo typo

commit b51536c772
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 28 12:48:41 2019 +0100

    CSB doc correction

commit d79f072851
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 27 13:38:08 2019 +0100

    Additional documentation for DHB and CSB

commit 64f84d9d9f
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Sun Oct 27 03:21:38 2019 +0100

    doc for dhb, serializeIF and SerializeAdapter

commit 8f1517d276
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Oct 25 21:12:11 2019 +0200

    additional comments on endianness (I hope this is correct)

commit 1631e739b8
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 23 12:03:32 2019 +0200

    at91sam9g20 uses custom stdio.c, unsigned long cast in sprintf does not seem to work, casting (unsigned int) does, timestamp now visible in debug output

commit 07950b0c2b
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Wed Oct 23 00:31:45 2019 +0200

    documentation for object manager IF get function

commit cd1b26b04c
Merge: c6e34cad 4db655e4
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 22 17:15:54 2019 +0200

    Merge branch 'mueller_framework' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller_framework

commit c6e34cada6
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 22 17:15:29 2019 +0200

    documentation for DHB init function, ioBoard addres has default value 0 now, order in ctor changed (not used in source)

commit 4db655e489
Author: Robin Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 22 14:01:17 2019 +0200

    task priority order comment

commit cbc8012198
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Tue Oct 22 00:06:11 2019 +0200

    ioBoardAddress protected instead of private to allow custom initialize

commit 907664cea9
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Mon Oct 21 11:38:13 2019 +0200

    added do performOperation where the comIF functions are called, some comments added in DeviceHandlerIF

commit 5e3b7c3625
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Fri Oct 18 13:37:09 2019 +0200

    explanation of cookie purpose added, device handler base indentation

commit 743d8abeaf
Author: Robin.Mueller <robin.mueller.m@gmail.com>
Date:   Thu Oct 17 00:23:46 2019 +0200

    first attempt to document and explain serialization tools for application developers
This commit is contained in:
Robin Müller 2021-01-13 11:53:34 +01:00
parent c52183f273
commit e8cadd069e
90 changed files with 3080 additions and 1509 deletions

View File

@ -3,6 +3,7 @@
#include "ArrayList.h" #include "ArrayList.h"
#include <cstring> #include <cstring>
#include <functional>
/** /**
* @brief An associative container which allows multiple entries of the same key. * @brief An associative container which allows multiple entries of the same key.

View File

@ -4,7 +4,7 @@
ExtendedControllerBase::ExtendedControllerBase(object_id_t objectId, ExtendedControllerBase::ExtendedControllerBase(object_id_t objectId,
object_id_t parentId, size_t commandQueueDepth): object_id_t parentId, size_t commandQueueDepth):
ControllerBase(objectId, parentId, commandQueueDepth), ControllerBase(objectId, parentId, commandQueueDepth),
localPoolManager(this, commandQueue), poolManager(this, commandQueue),
actionHelper(this, commandQueue) { actionHelper(this, commandQueue) {
} }
@ -17,7 +17,7 @@ ReturnValue_t ExtendedControllerBase::executeAction(ActionId_t actionId,
ReturnValue_t ExtendedControllerBase::initializeLocalDataPool( ReturnValue_t ExtendedControllerBase::initializeLocalDataPool(
LocalDataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) {
// needs to be overriden and implemented by child class. // needs to be overriden and implemented by child class.
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
@ -26,8 +26,8 @@ object_id_t ExtendedControllerBase::getObjectId() const {
return SystemObject::getObjectId(); return SystemObject::getObjectId();
} }
LocalDataPoolManager* ExtendedControllerBase::getHkManagerHandle() { AccessPoolManagerIF* ExtendedControllerBase::getAccessorHandle() {
return &localPoolManager; return &poolManager;
} }
uint32_t ExtendedControllerBase::getPeriodicOperationFrequency() const { uint32_t ExtendedControllerBase::getPeriodicOperationFrequency() const {
@ -40,7 +40,7 @@ ReturnValue_t ExtendedControllerBase::handleCommandMessage(
if(result == HasReturnvaluesIF::RETURN_OK) { if(result == HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }
return localPoolManager.handleHousekeepingMessage(message); return poolManager.handleHousekeepingMessage(message);
} }
void ExtendedControllerBase::handleQueue() { void ExtendedControllerBase::handleQueue() {
@ -64,7 +64,7 @@ void ExtendedControllerBase::handleQueue() {
continue; continue;
} }
result = localPoolManager.handleHousekeepingMessage(&command); result = poolManager.handleHousekeepingMessage(&command);
if (result == RETURN_OK) { if (result == RETURN_OK) {
continue; continue;
} }
@ -88,16 +88,16 @@ ReturnValue_t ExtendedControllerBase::initialize() {
return result; return result;
} }
return localPoolManager.initialize(commandQueue); return poolManager.initialize(commandQueue);
} }
ReturnValue_t ExtendedControllerBase::initializeAfterTaskCreation() { ReturnValue_t ExtendedControllerBase::initializeAfterTaskCreation() {
return localPoolManager.initializeAfterTaskCreation(); return poolManager.initializeAfterTaskCreation();
} }
ReturnValue_t ExtendedControllerBase::performOperation(uint8_t opCode) { ReturnValue_t ExtendedControllerBase::performOperation(uint8_t opCode) {
handleQueue(); handleQueue();
localPoolManager.performHkOperation(); poolManager.performHkOperation();
performControlOperation(); performControlOperation();
return RETURN_OK; return RETURN_OK;
} }
@ -113,3 +113,7 @@ LocalPoolDataSetBase* ExtendedControllerBase::getDataSetHandle(sid_t sid) {
#endif #endif
return nullptr; return nullptr;
} }
ProvidesDataPoolSubscriptionIF* ExtendedControllerBase::getSubscriptionInterface() {
return &poolManager;
}

View File

@ -32,10 +32,20 @@ public:
virtual ReturnValue_t performOperation(uint8_t opCode) override; virtual ReturnValue_t performOperation(uint8_t opCode) override;
virtual ReturnValue_t initializeAfterTaskCreation() override; virtual ReturnValue_t initializeAfterTaskCreation() override;
/**
* Provides a subscription interface for objects which required updates on changed
* controller variables or datasets
* @return
*/
ProvidesDataPoolSubscriptionIF* getSubscriptionInterface() override;
protected: protected:
LocalDataPoolManager localPoolManager; LocalDataPoolManager poolManager;
ActionHelper actionHelper; ActionHelper actionHelper;
//! Accessor handle required for internal handling
AccessPoolManagerIF* getAccessorHandle() override;
/** /**
* Implemented by child class. Handle all command messages which are * Implemented by child class. Handle all command messages which are
* not health, mode, action or housekeeping messages. * not health, mode, action or housekeeping messages.
@ -60,9 +70,8 @@ protected:
/** HasLocalDatapoolIF overrides */ /** HasLocalDatapoolIF overrides */
virtual object_id_t getObjectId() const override; virtual object_id_t getObjectId() const override;
virtual ReturnValue_t initializeLocalDataPool( virtual ReturnValue_t initializeLocalDataPool(
LocalDataPool& localDataPoolMap, localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) override; LocalDataPoolManager& poolManager) override;
virtual LocalDataPoolManager* getHkManagerHandle() override;
virtual uint32_t getPeriodicOperationFrequency() const override; virtual uint32_t getPeriodicOperationFrequency() const override;
virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override; virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
}; };

View File

@ -38,11 +38,12 @@ ReturnValue_t PoolDataSetBase::registerVariable(
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
ReturnValue_t PoolDataSetBase::read(uint32_t lockTimeout) { ReturnValue_t PoolDataSetBase::read(MutexIF::TimeoutType timeoutType,
uint32_t lockTimeout) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
ReturnValue_t error = result; ReturnValue_t error = result;
if (state == States::STATE_SET_UNINITIALISED) { if (state == States::STATE_SET_UNINITIALISED) {
lockDataPool(lockTimeout); lockDataPool(timeoutType, lockTimeout);
for (uint16_t count = 0; count < fillCount; count++) { for (uint16_t count = 0; count < fillCount; count++) {
result = readVariable(count); result = readVariable(count);
if(result != RETURN_OK) { if(result != RETURN_OK) {
@ -86,7 +87,9 @@ ReturnValue_t PoolDataSetBase::readVariable(uint16_t count) {
!= PoolVariableIF::NO_PARAMETER) != PoolVariableIF::NO_PARAMETER)
{ {
if(protectEveryReadCommitCall) { if(protectEveryReadCommitCall) {
result = registeredVariables[count]->read(mutexTimeout); result = registeredVariables[count]->read(
timeoutTypeForSingleVars,
mutexTimeoutForSingleVars);
} }
else { else {
result = registeredVariables[count]->readWithoutLock(); result = registeredVariables[count]->readWithoutLock();
@ -99,25 +102,29 @@ ReturnValue_t PoolDataSetBase::readVariable(uint16_t count) {
return result; return result;
} }
ReturnValue_t PoolDataSetBase::commit(uint32_t lockTimeout) { ReturnValue_t PoolDataSetBase::commit(MutexIF::TimeoutType timeoutType,
uint32_t lockTimeout) {
if (state == States::STATE_SET_WAS_READ) { if (state == States::STATE_SET_WAS_READ) {
handleAlreadyReadDatasetCommit(lockTimeout); handleAlreadyReadDatasetCommit(timeoutType, lockTimeout);
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
else { else {
return handleUnreadDatasetCommit(lockTimeout); return handleUnreadDatasetCommit(timeoutType, lockTimeout);
} }
} }
void PoolDataSetBase::handleAlreadyReadDatasetCommit(uint32_t lockTimeout) { void PoolDataSetBase::handleAlreadyReadDatasetCommit(
lockDataPool(lockTimeout); MutexIF::TimeoutType timeoutType, uint32_t lockTimeout) {
lockDataPool(timeoutType, lockTimeout);
for (uint16_t count = 0; count < fillCount; count++) { for (uint16_t count = 0; count < fillCount; count++) {
if (registeredVariables[count]->getReadWriteMode() if (registeredVariables[count]->getReadWriteMode()
!= PoolVariableIF::VAR_READ != PoolVariableIF::VAR_READ
&& registeredVariables[count]->getDataPoolId() && registeredVariables[count]->getDataPoolId()
!= PoolVariableIF::NO_PARAMETER) { != PoolVariableIF::NO_PARAMETER) {
if(protectEveryReadCommitCall) { if(protectEveryReadCommitCall) {
registeredVariables[count]->commit(mutexTimeout); registeredVariables[count]->commit(
timeoutTypeForSingleVars,
mutexTimeoutForSingleVars);
} }
else { else {
registeredVariables[count]->commitWithoutLock(); registeredVariables[count]->commitWithoutLock();
@ -128,16 +135,19 @@ void PoolDataSetBase::handleAlreadyReadDatasetCommit(uint32_t lockTimeout) {
unlockDataPool(); unlockDataPool();
} }
ReturnValue_t PoolDataSetBase::handleUnreadDatasetCommit(uint32_t lockTimeout) { ReturnValue_t PoolDataSetBase::handleUnreadDatasetCommit(
MutexIF::TimeoutType timeoutType, uint32_t lockTimeout) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
lockDataPool(lockTimeout); lockDataPool(timeoutType, lockTimeout);
for (uint16_t count = 0; count < fillCount; count++) { for (uint16_t count = 0; count < fillCount; count++) {
if (registeredVariables[count]->getReadWriteMode() if (registeredVariables[count]->getReadWriteMode()
== PoolVariableIF::VAR_WRITE == PoolVariableIF::VAR_WRITE
&& registeredVariables[count]->getDataPoolId() && registeredVariables[count]->getDataPoolId()
!= PoolVariableIF::NO_PARAMETER) { != PoolVariableIF::NO_PARAMETER) {
if(protectEveryReadCommitCall) { if(protectEveryReadCommitCall) {
result = registeredVariables[count]->commit(mutexTimeout); result = registeredVariables[count]->commit(
timeoutTypeForSingleVars,
mutexTimeoutForSingleVars);
} }
else { else {
result = registeredVariables[count]->commitWithoutLock(); result = registeredVariables[count]->commitWithoutLock();
@ -160,7 +170,8 @@ ReturnValue_t PoolDataSetBase::handleUnreadDatasetCommit(uint32_t lockTimeout) {
} }
ReturnValue_t PoolDataSetBase::lockDataPool(uint32_t timeoutMs) { ReturnValue_t PoolDataSetBase::lockDataPool(MutexIF::TimeoutType timeoutType,
uint32_t lockTimeout) {
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
@ -206,8 +217,14 @@ void PoolDataSetBase::setContainer(PoolVariableIF **variablesContainer) {
this->registeredVariables = variablesContainer; this->registeredVariables = variablesContainer;
} }
void PoolDataSetBase::setReadCommitProtectionBehaviour( PoolVariableIF** PoolDataSetBase::getContainer() const {
bool protectEveryReadCommit, uint32_t mutexTimeout) { return registeredVariables;
this->protectEveryReadCommitCall = protectEveryReadCommit; }
this->mutexTimeout = mutexTimeout;
void PoolDataSetBase::setReadCommitProtectionBehaviour(
bool protectEveryReadCommit, MutexIF::TimeoutType timeoutType,
uint32_t mutexTimeout) {
this->protectEveryReadCommitCall = protectEveryReadCommit;
this->timeoutTypeForSingleVars = timeoutType;
this->mutexTimeoutForSingleVars = mutexTimeout;
} }

View File

@ -3,6 +3,7 @@
#include "PoolDataSetIF.h" #include "PoolDataSetIF.h"
#include "PoolVariableIF.h" #include "PoolVariableIF.h"
#include "../serialize/SerializeIF.h"
#include "../ipc/MutexIF.h" #include "../ipc/MutexIF.h"
/** /**
@ -62,8 +63,9 @@ public:
* - @c SET_WAS_ALREADY_READ if read() is called twice without calling * - @c SET_WAS_ALREADY_READ if read() is called twice without calling
* commit() in between * commit() in between
*/ */
virtual ReturnValue_t read(uint32_t lockTimeout = virtual ReturnValue_t read(
MutexIF::BLOCKING) override; MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
uint32_t lockTimeout = 20) override;
/** /**
* @brief The commit call initializes writing back the registered variables. * @brief The commit call initializes writing back the registered variables.
* @details * @details
@ -82,8 +84,9 @@ public:
* - @c COMMITING_WITHOUT_READING if set was not read yet and * - @c COMMITING_WITHOUT_READING if set was not read yet and
* contains non write-only variables * contains non write-only variables
*/ */
virtual ReturnValue_t commit(uint32_t lockTimeout = virtual ReturnValue_t commit(
MutexIF::BLOCKING) override; MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
uint32_t lockTimeout = 20) override;
/** /**
* Register the passed pool variable instance into the data set. * Register the passed pool variable instance into the data set.
@ -97,8 +100,9 @@ public:
* thread-safety. Default implementation is empty * thread-safety. Default implementation is empty
* @return Always returns -@c RETURN_OK * @return Always returns -@c RETURN_OK
*/ */
virtual ReturnValue_t lockDataPool(uint32_t timeoutMs = virtual ReturnValue_t lockDataPool(
MutexIF::BLOCKING) override; MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20) override;
/** /**
* Provides the means to unlock the underlying data structure to ensure * Provides the means to unlock the underlying data structure to ensure
* thread-safety. Default implementation is empty * thread-safety. Default implementation is empty
@ -124,6 +128,7 @@ protected:
* @param mutexTimeout * @param mutexTimeout
*/ */
void setReadCommitProtectionBehaviour(bool protectEveryReadCommit, void setReadCommitProtectionBehaviour(bool protectEveryReadCommit,
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
uint32_t mutexTimeout = 20); uint32_t mutexTimeout = 20);
/** /**
@ -154,14 +159,20 @@ protected:
const size_t maxFillCount = 0; const size_t maxFillCount = 0;
void setContainer(PoolVariableIF** variablesContainer); void setContainer(PoolVariableIF** variablesContainer);
PoolVariableIF** getContainer() const;
private: private:
bool protectEveryReadCommitCall = false; bool protectEveryReadCommitCall = false;
uint32_t mutexTimeout = 20; MutexIF::TimeoutType timeoutTypeForSingleVars;
uint32_t mutexTimeoutForSingleVars = 20;
ReturnValue_t readVariable(uint16_t count); ReturnValue_t readVariable(uint16_t count);
void handleAlreadyReadDatasetCommit(uint32_t lockTimeout); void handleAlreadyReadDatasetCommit(
ReturnValue_t handleUnreadDatasetCommit(uint32_t lockTimeout); MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20);
ReturnValue_t handleUnreadDatasetCommit(
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20);
}; };
#endif /* FSFW_DATAPOOL_POOLDATASETBASE_H_ */ #endif /* FSFW_DATAPOOL_POOLDATASETBASE_H_ */

View File

@ -18,7 +18,10 @@ public:
* thread-safety * thread-safety
* @return Lock operation result * @return Lock operation result
*/ */
virtual ReturnValue_t lockDataPool(dur_millis_t timeoutMs) = 0; virtual ReturnValue_t lockDataPool(
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20) = 0;
/** /**
* @brief Unlock call corresponding to the lock call. * @brief Unlock call corresponding to the lock call.
* @return Unlock operation result * @return Unlock operation result

View File

@ -1,25 +1,17 @@
#include "PoolEntry.h" #include "PoolEntry.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterface.h"
#include "../globalfunctions/arrayprinter.h" #include "../globalfunctions/arrayprinter.h"
#include <cstring> #include <cstring>
#include <algorithm> #include <algorithm>
template <typename T> template <typename T>
PoolEntry<T>::PoolEntry(std::initializer_list<T> initValue, uint8_t setLength, PoolEntry<T>::PoolEntry(std::initializer_list<T> initValue, bool setValid ):
bool setValid ) : length(setLength), valid(setValid) { length(initValue.size()), valid(setValid) {
this->address = new T[this->length]; this->address = new T[this->length];
if(initValue.size() == 0) { if(initValue.size() == 0) {
std::memset(this->address, 0, this->getByteSize()); std::memset(this->address, 0, this->getByteSize());
} }
else if (initValue.size() != setLength){
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "PoolEntry: setLength is not equal to initializer list"
"length! Performing zero initialization with given setLength"
<< std::endl;
#endif
std::memset(this->address, 0, this->getByteSize());
}
else { else {
std::copy(initValue.begin(), initValue.end(), this->address); std::copy(initValue.begin(), initValue.end(), this->address);
} }
@ -70,14 +62,26 @@ bool PoolEntry<T>::getValid() {
template <typename T> template <typename T>
void PoolEntry<T>::print() { void PoolEntry<T>::print() {
const char* validString = nullptr;
if(valid) {
validString = "Valid";
}
else {
validString = "Invalid";
}
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::debug << "Pool Entry Validity: " << sif::info << "PoolEntry information." << std::endl;
(this->valid? " (valid) " : " (invalid) ") << std::endl; sif::info << "PoolEntry validity: " << validString << std::endl;
#endif #else
arrayprinter::print(reinterpret_cast<uint8_t*>(address), length); sif::printInfo("PoolEntry information.\n");
#if FSFW_CPP_OSTREAM_ENABLED == 1 sif::printInfo("PoolEntry validity: %s\n", validString);
sif::debug << std::dec << std::endl;
#endif #endif
arrayprinter::print(reinterpret_cast<uint8_t*>(address), getByteSize());
}
template<typename T>
inline T* PoolEntry<T>::getDataPtr() {
return this->address;
} }
template<typename T> template<typename T>
@ -88,8 +92,10 @@ Type PoolEntry<T>::getType() {
template class PoolEntry<uint8_t>; template class PoolEntry<uint8_t>;
template class PoolEntry<uint16_t>; template class PoolEntry<uint16_t>;
template class PoolEntry<uint32_t>; template class PoolEntry<uint32_t>;
template class PoolEntry<uint64_t>;
template class PoolEntry<int8_t>; template class PoolEntry<int8_t>;
template class PoolEntry<int16_t>; template class PoolEntry<int16_t>;
template class PoolEntry<int32_t>; template class PoolEntry<int32_t>;
template class PoolEntry<int64_t>;
template class PoolEntry<float>; template class PoolEntry<float>;
template class PoolEntry<double>; template class PoolEntry<double>;

View File

@ -35,24 +35,22 @@ public:
"uint8_t"); "uint8_t");
/** /**
* @brief In the classe's constructor, space is allocated on the heap and * @brief In the classe's constructor, space is allocated on the heap and
* potential init values are copied to that space. * potential initialization values are copied to that space.
* @details * @details
* Not passing any arguments will initialize an non-array pool entry * Not passing any arguments will initialize an non-array pool entry
* (setLength = 1) with an initial invalid state. * with an initial invalid state and the value 0.
* Please note that if an initializer list is passed, the correct * Please note that if an initializer list is passed, the length of the
* corresponding length should be passed too, otherwise a zero * initializer list needs to be correct for vector entries because
* initialization will be performed with the given setLength. * required allocated space will be deduced from the initializer list length
* and the pool entry type.
* @param initValue * @param initValue
* Initializer list with values to initialize with, for example {0, 0} to * Initializer list with values to initialize with, for example {0, 0} to
* initialize the two entries to zero. * initialize the a pool entry of a vector with two entries to 0.
* @param setLength
* Defines the array length of this entry. Should be equal to the
* intializer list length.
* @param setValid * @param setValid
* Sets the initialization flag. It is invalid by default. * Sets the initialization flag. It is invalid by default.
*/ */
PoolEntry(std::initializer_list<T> initValue = {}, uint8_t setLength = 1, PoolEntry(std::initializer_list<T> initValue = {0}, bool setValid = false);
bool setValid = false);
/** /**
* @brief In the classe's constructor, space is allocated on the heap and * @brief In the classe's constructor, space is allocated on the heap and
* potential init values are copied to that space. * potential init values are copied to that space.
@ -66,9 +64,9 @@ public:
*/ */
PoolEntry(T* initValue, uint8_t setLength = 1, bool setValid = false); PoolEntry(T* initValue, uint8_t setLength = 1, bool setValid = false);
//! Explicitely deleted copy ctor, copying is not allowed! //! Explicitely deleted copy ctor, copying is not allowed.
PoolEntry(const PoolEntry&) = delete; PoolEntry(const PoolEntry&) = delete;
//! Explicitely deleted copy assignment, copying is not allowed! //! Explicitely deleted copy assignment, copying is not allowed.
PoolEntry& operator=(const PoolEntry&) = delete; PoolEntry& operator=(const PoolEntry&) = delete;
/** /**
@ -82,21 +80,16 @@ public:
~PoolEntry(); ~PoolEntry();
/** /**
* @brief This is the address pointing to the allocated memory. * Return typed pointer to start of data.
* @return
*/ */
T* address; T* getDataPtr();
/**
* @brief This attribute stores the length information.
*/
uint8_t length;
/**
* @brief Here, the validity information for a variable is stored.
* Every entry (single variable or vector) has one valid flag.
*/
uint8_t valid;
/** /**
* @brief getSize returns the array size of the entry. * @brief getSize returns the array size of the entry.
* @details A single parameter has size 1. * @details
* For non-array pool entries return type size, for vector entries
* return type size times the number of entries.
*/ */
uint8_t getSize(); uint8_t getSize();
/** /**
@ -123,8 +116,22 @@ public:
* information to the screen. It prints all array entries in a row. * information to the screen. It prints all array entries in a row.
*/ */
void print(); void print();
Type getType(); Type getType();
private:
/**
* @brief This attribute stores the length information.
*/
uint8_t length;
/**
* @brief Here, the validity information for a variable is stored.
* Every entry (single variable or vector) has one valid flag.
*/
uint8_t valid;
/**
* @brief This is the address pointing to the allocated memory.
*/
T* address;
}; };
#endif /* FSFW_DATAPOOL_POOLENTRY_H_ */ #endif /* FSFW_DATAPOOL_POOLENTRY_H_ */

View File

@ -25,6 +25,7 @@ class PoolVariableIF : public SerializeIF,
public: public:
static constexpr uint8_t INTERFACE_ID = CLASS_ID::POOL_VARIABLE_IF; static constexpr uint8_t INTERFACE_ID = CLASS_ID::POOL_VARIABLE_IF;
static constexpr ReturnValue_t INVALID_READ_WRITE_MODE = MAKE_RETURN_CODE(0xA0); static constexpr ReturnValue_t INVALID_READ_WRITE_MODE = MAKE_RETURN_CODE(0xA0);
static constexpr ReturnValue_t INVALID_POOL_ENTRY = MAKE_RETURN_CODE(0xA1);
static constexpr bool VALID = 1; static constexpr bool VALID = 1;
static constexpr bool INVALID = 0; static constexpr bool INVALID = 0;

View File

@ -2,6 +2,7 @@
#define FSFW_DATAPOOL_READCOMMITIF_H_ #define FSFW_DATAPOOL_READCOMMITIF_H_
#include <fsfw/returnvalues/HasReturnvaluesIF.h> #include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <fsfw/ipc/MutexIF.h>
/** /**
* @brief Common interface for all software objects which employ read-commit * @brief Common interface for all software objects which employ read-commit
@ -10,8 +11,10 @@
class ReadCommitIF { class ReadCommitIF {
public: public:
virtual ~ReadCommitIF() {} virtual ~ReadCommitIF() {}
virtual ReturnValue_t read(uint32_t mutexTimeout) = 0; virtual ReturnValue_t read(MutexIF::TimeoutType timeoutType,
virtual ReturnValue_t commit(uint32_t mutexTimeout) = 0; uint32_t timeoutMs) = 0;
virtual ReturnValue_t commit(MutexIF::TimeoutType timeoutType,
uint32_t timeoutMs) = 0;
protected: protected:
@ -19,11 +22,11 @@ protected:
//! members with commit and read semantics where the lock is only necessary //! members with commit and read semantics where the lock is only necessary
//! once. //! once.
virtual ReturnValue_t readWithoutLock() { virtual ReturnValue_t readWithoutLock() {
return read(20); return read(MutexIF::TimeoutType::WAITING, 20);
} }
virtual ReturnValue_t commitWithoutLock() { virtual ReturnValue_t commitWithoutLock() {
return commit(20); return commit(MutexIF::TimeoutType::WAITING, 20);
} }
}; };

View File

@ -0,0 +1,27 @@
#ifndef FSFW_DATAPOOLLOCAL_ACCESSLOCALPOOLF_H_
#define FSFW_DATAPOOLLOCAL_ACCESSLOCALPOOLF_H_
class LocalDataPoolManager;
class MutexIF;
/**
* @brief Accessor class which can be used by classes which like to use the pool manager.
*/
class AccessPoolManagerIF {
public:
virtual ~AccessPoolManagerIF() {};
virtual MutexIF* getLocalPoolMutex() = 0;
/**
* Can be used to get a handle to the local data pool manager.
* This function is protected because it should only be used by the
* class imlementing the interface.
*/
virtual LocalDataPoolManager* getHkManagerHandle() = 0;
protected:
};
#endif /* FSFW_DATAPOOLLOCAL_ACCESSLOCALPOOLF_H_ */

View File

@ -6,3 +6,5 @@ target_sources(${LIB_FSFW_NAME}
LocalPoolObjectBase.cpp LocalPoolObjectBase.cpp
SharedLocalDataSet.cpp SharedLocalDataSet.cpp
) )
add_subdirectory(internal)

View File

@ -1,52 +1,40 @@
#ifndef FSFW_DATAPOOLLOCAL_HASLOCALDATAPOOLIF_H_ #ifndef FSFW_DATAPOOLLOCAL_HASLOCALDATAPOOLIF_H_
#define FSFW_DATAPOOLLOCAL_HASLOCALDATAPOOLIF_H_ #define FSFW_DATAPOOLLOCAL_HASLOCALDATAPOOLIF_H_
#include "locPoolDefinitions.h" #include "localPoolDefinitions.h"
#include "../datapool/PoolEntryIF.h" #include "../datapool/PoolEntryIF.h"
#include "../serviceinterface/ServiceInterface.h"
#include "../ipc/MessageQueueSenderIF.h" #include "../ipc/MessageQueueSenderIF.h"
#include "../housekeeping/HousekeepingMessage.h" #include "../housekeeping/HousekeepingMessage.h"
#include <map> #include <map>
class LocalDataPoolManager; class AccessPoolManagerIF;
class ProvidesDataPoolSubscriptionIF;
class LocalPoolDataSetBase; class LocalPoolDataSetBase;
class LocalPoolObjectBase; class LocalPoolObjectBase;
class LocalDataPoolManager;
using LocalDataPool = std::map<lp_id_t, PoolEntryIF*>;
using LocalDataPoolMapIter = LocalDataPool::iterator;
/** /**
* @brief This interface is implemented by classes which posses a local * @brief This interface is implemented by classes which posses a local data pool (not the
* data pool (not the managing class). It defines the relationship * managing class). It defines the relationship between the local data pool owner
* between the local data pool owner and the LocalDataPoolManager. * and the LocalDataPoolManager.
* @details * @details
* Any class implementing this interface shall also have a LocalDataPoolManager * Any class implementing this interface shall also have a LocalDataPoolManager member class which
* member class which contains the actual pool data structure * contains the actual pool data structure and exposes the public interface for it.
* and exposes the public interface for it. * The local data pool can be accessed using helper classes by using the
* This is required because the pool entries are templates, which makes * LocalPoolVariable, LocalPoolVector or LocalDataSet classes. Every local pool variable can
* specifying an interface rather difficult. The local data pool can be * be uniquely identified by a global pool ID (gp_id_t) and every dataset tied
* accessed by using the LocalPoolVariable, LocalPoolVector or LocalDataSet * to a pool manager can be uniqely identified by a global structure ID (sid_t).
* classes.
* *
* Architectural Note:
* This could be circumvented by using a wrapper/accessor function or
* implementing the templated function in this interface..
* The first solution sounds better than the second but
* the LocalPoolVariable classes are templates as well, so this just shifts
* the problem somewhere else. Interfaces are nice, but the most
* pragmatic solution I found was to offer the client the full interface
* of the LocalDataPoolManager.
*/ */
class HasLocalDataPoolIF { class HasLocalDataPoolIF {
friend class HasLocalDpIFManagerAttorney;
friend class HasLocalDpIFUserAttorney;
public: public:
virtual~ HasLocalDataPoolIF() {}; virtual~ HasLocalDataPoolIF() {};
static constexpr uint8_t INTERFACE_ID = CLASS_ID::LOCAL_POOL_OWNER_IF;
static constexpr ReturnValue_t POOL_ENTRY_NOT_FOUND = MAKE_RETURN_CODE(0x00);
static constexpr ReturnValue_t POOL_ENTRY_TYPE_CONFLICT = MAKE_RETURN_CODE(0x01);
static constexpr uint32_t INVALID_LPID = localpool::INVALID_LPID; static constexpr uint32_t INVALID_LPID = localpool::INVALID_LPID;
virtual object_id_t getObjectId() const = 0; virtual object_id_t getObjectId() const = 0;
@ -59,13 +47,9 @@ public:
* The manager instance shall also be passed to this function. * The manager instance shall also be passed to this function.
* It can be used to subscribe for periodic packets for for updates. * It can be used to subscribe for periodic packets for for updates.
*/ */
virtual ReturnValue_t initializeLocalDataPool( virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
LocalDataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) = 0; LocalDataPoolManager& poolManager) = 0;
/** Can be used to get a handle to the local data pool manager. */
virtual LocalDataPoolManager* getHkManagerHandle() = 0;
/** /**
* Returns the minimum sampling frequency in milliseconds, which will * Returns the minimum sampling frequency in milliseconds, which will
* usually be the period the pool owner performs its periodic operation. * usually be the period the pool owner performs its periodic operation.
@ -73,33 +57,10 @@ public:
*/ */
virtual uint32_t getPeriodicOperationFrequency() const = 0; virtual uint32_t getPeriodicOperationFrequency() const = 0;
/**
* This function is used by the pool manager to get a valid dataset
* from a SID
* @param sid Corresponding structure ID
* @return
*/
virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) = 0;
/**
* Similar to the function above, but used to get a local pool variable
* handle. This is only needed for update notifications, so it is not
* defined as abstract.
* @param localPoolId
* @return
*/
virtual LocalPoolObjectBase* getPoolObjectHandle(lp_id_t localPoolId) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "HasLocalDataPoolIF::getPoolObjectHandle: Not overriden"
<< ". Returning nullptr!" << std::endl;
#endif
return nullptr;
}
/** /**
* @brief This function will be called by the manager if an update * @brief This function will be called by the manager if an update
* notification is received. * notification is received.
* @details * @details HasLocalDataPoolIF
* Can be overriden by the child class to handle changed datasets. * Can be overriden by the child class to handle changed datasets.
* @param sid * @param sid
* @param storeId If a snapshot was requested, data will be located inside * @param storeId If a snapshot was requested, data will be located inside
@ -124,18 +85,68 @@ public:
return; return;
} }
/* These function can be implemented by pool owner, as they are required /**
* by the housekeeping message interface */ * These function can be implemented by pool owner, if they are required
* and used by the housekeeping message interface.
* */
virtual ReturnValue_t addDataSet(sid_t sid) { virtual ReturnValue_t addDataSet(sid_t sid) {
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
}; };
virtual ReturnValue_t removeDataSet(sid_t sid) { virtual ReturnValue_t removeDataSet(sid_t sid) {
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
}; };
virtual ReturnValue_t changeCollectionInterval(sid_t sid, virtual ReturnValue_t changeCollectionInterval(sid_t sid, float newIntervalSeconds) {
float newIntervalSeconds) {
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
}; };
/**
* This function can be used by data pool consumers to retrieve a handle
* which allows subscriptions to dataset and variable updates in form of messages.
* The consumers can then read the most recent variable value by calling read with
* an own pool variable or set instance or using the deserialized snapshot data.
* @return
*/
virtual ProvidesDataPoolSubscriptionIF* getSubscriptionInterface() = 0;
protected:
/**
* Accessor handle required for internal handling. Not intended for users and therefore
* declared protected. Users should instead use pool variables, sets or the subscription
* interface to access pool entries.
* @return
*/
virtual AccessPoolManagerIF* getAccessorHandle() = 0;
/**
* This function is used by the pool manager to get a valid dataset
* from a SID. This function is protected to prevent users from
* using raw data set pointers which could not be thread-safe. Users
* should use the #ProvidesDataPoolSubscriptionIF.
* @param sid Corresponding structure ID
* @return
*/
virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) = 0;
/**
* Similar to the function above, but used to get a local pool variable
* handle. This is only needed for update notifications, so it is not
* defined as abstract. This function is protected to prevent users from
* using raw pool variable pointers which could not be thread-safe.
* Users should use the #ProvidesDataPoolSubscriptionIF.
* @param localPoolId
* @return
*/
virtual LocalPoolObjectBase* getPoolObjectHandle(lp_id_t localPoolId) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "HasLocalDataPoolIF::getPoolObjectHandle: Not overriden"
<< ". Returning nullptr!" << std::endl;
#else
sif::printWarning("HasLocalDataPoolIF::getPoolObjectHandle: "
"Not overriden. Returning nullptr!\n");
#endif
return nullptr;
}
}; };
#endif /* FSFW_DATAPOOLLOCAL_HASLOCALDATAPOOLIF_H_ */ #endif /* FSFW_DATAPOOLLOCAL_HASLOCALDATAPOOLIF_H_ */

View File

@ -1,11 +1,13 @@
#include "HasLocalDataPoolIF.h"
#include "LocalDataPoolManager.h" #include "LocalDataPoolManager.h"
#include "LocalPoolObjectBase.h" #include "LocalPoolObjectBase.h"
#include "LocalPoolDataSetBase.h" #include "LocalPoolDataSetBase.h"
#include "internal/LocalPoolDataSetAttorney.h"
#include "internal/HasLocalDpIFManagerAttorney.h"
#include "../housekeeping/HousekeepingPacketUpdate.h" #include "../housekeeping/HousekeepingPacketUpdate.h"
#include "../housekeeping/HousekeepingSetPacket.h" #include "../housekeeping/HousekeepingSetPacket.h"
#include "../housekeeping/AcceptsHkPacketsIF.h" #include "../housekeeping/AcceptsHkPacketsIF.h"
#include "../timemanager/CCSDSTime.h" #include "../timemanager/CCSDSTime.h"
#include "../ipc/MutexFactory.h" #include "../ipc/MutexFactory.h"
#include "../ipc/MutexHelper.h" #include "../ipc/MutexHelper.h"
@ -14,26 +16,23 @@
#include <array> #include <array>
#include <cmath> #include <cmath>
object_id_t LocalDataPoolManager::defaultHkDestination = object_id_t LocalDataPoolManager::defaultHkDestination = objects::PUS_SERVICE_3_HOUSEKEEPING;
objects::PUS_SERVICE_3_HOUSEKEEPING;
LocalDataPoolManager::LocalDataPoolManager(HasLocalDataPoolIF* owner, LocalDataPoolManager::LocalDataPoolManager(HasLocalDataPoolIF* owner, MessageQueueIF* queueToUse,
MessageQueueIF* queueToUse, bool appendValidityBuffer): bool appendValidityBuffer):
appendValidityBuffer(appendValidityBuffer) { appendValidityBuffer(appendValidityBuffer) {
if(owner == nullptr) { if(owner == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::error << "LocalDataPoolManager::LocalDataPoolManager: " "LocalDataPoolManager", HasReturnvaluesIF::RETURN_FAILED,
<< "Invalid supplied owner!" << std::endl; "Invalid supplied owner");
#endif
return; return;
} }
this->owner = owner; this->owner = owner;
mutex = MutexFactory::instance()->createMutex(); mutex = MutexFactory::instance()->createMutex();
if(mutex == nullptr) { if(mutex == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR,
sif::error << "LocalDataPoolManager::LocalDataPoolManager: " "LocalDataPoolManager", HasReturnvaluesIF::RETURN_FAILED,
<< "Could not create mutex." << std::endl; "Could not create mutex");
#endif
} }
hkQueue = queueToUse; hkQueue = queueToUse;
@ -43,21 +42,18 @@ LocalDataPoolManager::~LocalDataPoolManager() {}
ReturnValue_t LocalDataPoolManager::initialize(MessageQueueIF* queueToUse) { ReturnValue_t LocalDataPoolManager::initialize(MessageQueueIF* queueToUse) {
if(queueToUse == nullptr) { if(queueToUse == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 // error, all destinations invalid
sif::error << "LocalDataPoolManager::initialize: " printWarningOrError(sif::OutputTypes::OUT_ERROR,
<< std::hex << "0x" << owner->getObjectId() << ". Supplied " "initialize", QUEUE_OR_DESTINATION_INVALID);
<< "queue invalid!" << std::dec << std::endl;
#endif
} }
hkQueue = queueToUse; hkQueue = queueToUse;
ipcStore = objectManager->get<StorageManagerIF>(objects::IPC_STORE); ipcStore = objectManager->get<StorageManagerIF>(objects::IPC_STORE);
if(ipcStore == nullptr) { if(ipcStore == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 // error, all destinations invalid
sif::error << "LocalDataPoolManager::initialize: " printWarningOrError(sif::OutputTypes::OUT_ERROR,
<< std::hex << "0x" << owner->getObjectId() << ": Could not " "initialize", HasReturnvaluesIF::RETURN_FAILED,
<< "set IPC store." <<std::dec << std::endl; "Could not set IPC store.");
#endif
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
@ -69,11 +65,9 @@ ReturnValue_t LocalDataPoolManager::initialize(MessageQueueIF* queueToUse) {
hkDestinationId = hkPacketReceiver->getHkQueue(); hkDestinationId = hkPacketReceiver->getHkQueue();
} }
else { else {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR,
sif::error << "LocalDataPoolManager::LocalDataPoolManager: " "initialize", QUEUE_OR_DESTINATION_INVALID);
<< "Default HK destination object is invalid!" << std::endl; return QUEUE_OR_DESTINATION_INVALID;
#endif
return HasReturnvaluesIF::RETURN_FAILED;
} }
} }
@ -95,10 +89,10 @@ ReturnValue_t LocalDataPoolManager::initializeHousekeepingPoolEntriesOnce() {
} }
return result; return result;
} }
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "HousekeepingManager: The map should only be initialized " printWarningOrError(sif::OutputTypes::OUT_WARNING,
<< "once!" << std::endl; "initialize", HasReturnvaluesIF::RETURN_FAILED,
#endif "The map should only be initialized once");
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
@ -141,7 +135,7 @@ ReturnValue_t LocalDataPoolManager::handleHkUpdate(HkReceiver& receiver,
// Update packets shall only be generated from datasets. // Update packets shall only be generated from datasets.
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle( LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner,
receiver.dataId.sid); receiver.dataId.sid);
if(dataSet->hasChanged()) { if(dataSet->hasChanged()) {
// prepare and send update notification // prepare and send update notification
@ -156,20 +150,23 @@ ReturnValue_t LocalDataPoolManager::handleHkUpdate(HkReceiver& receiver,
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
ReturnValue_t LocalDataPoolManager::handleNotificationUpdate( ReturnValue_t LocalDataPoolManager::handleNotificationUpdate(HkReceiver& receiver,
HkReceiver& receiver, ReturnValue_t& status) { ReturnValue_t& status) {
MarkChangedIF* toReset = nullptr; MarkChangedIF* toReset = nullptr;
if(receiver.dataType == DataType::LOCAL_POOL_VARIABLE) { if(receiver.dataType == DataType::LOCAL_POOL_VARIABLE) {
LocalPoolObjectBase* poolObj = owner->getPoolObjectHandle( LocalPoolObjectBase* poolObj = HasLocalDpIFManagerAttorney::getPoolObjectHandle(owner,
receiver.dataId.localPoolId); receiver.dataId.localPoolId);
//LocalPoolObjectBase* poolObj = owner->getPoolObjectHandle(receiver.dataId.localPoolId);
if(poolObj == nullptr) { if(poolObj == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED; printWarningOrError(sif::OutputTypes::OUT_WARNING,
"handleNotificationUpdate", POOLOBJECT_NOT_FOUND);
return POOLOBJECT_NOT_FOUND;
} }
if(poolObj->hasChanged()) { if(poolObj->hasChanged()) {
// prepare and send update notification. // prepare and send update notification.
CommandMessage notification; CommandMessage notification;
HousekeepingMessage::setUpdateNotificationVariableCommand( HousekeepingMessage::setUpdateNotificationVariableCommand(&notification,
&notification, receiver.dataId.localPoolId); receiver.dataId.localPoolId);
ReturnValue_t result = hkQueue->sendMessage( ReturnValue_t result = hkQueue->sendMessage(
receiver.destinationQueue, &notification); receiver.destinationQueue, &notification);
if(result != HasReturnvaluesIF::RETURN_OK) { if(result != HasReturnvaluesIF::RETURN_OK) {
@ -180,10 +177,12 @@ ReturnValue_t LocalDataPoolManager::handleNotificationUpdate(
} }
else { else {
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle( LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner,
receiver.dataId.sid); receiver.dataId.sid);
if(dataSet == nullptr) { if(dataSet == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED; printWarningOrError(sif::OutputTypes::OUT_WARNING,
"handleNotificationUpdate", DATASET_NOT_FOUND);
return DATASET_NOT_FOUND;
} }
if(dataSet->hasChanged()) { if(dataSet->hasChanged()) {
// prepare and send update notification // prepare and send update notification
@ -210,10 +209,12 @@ ReturnValue_t LocalDataPoolManager::handleNotificationSnapshot(
MarkChangedIF* toReset = nullptr; MarkChangedIF* toReset = nullptr;
// check whether data has changed and send messages in case it has. // check whether data has changed and send messages in case it has.
if(receiver.dataType == DataType::LOCAL_POOL_VARIABLE) { if(receiver.dataType == DataType::LOCAL_POOL_VARIABLE) {
LocalPoolObjectBase* poolObj = owner->getPoolObjectHandle( LocalPoolObjectBase* poolObj = HasLocalDpIFManagerAttorney::getPoolObjectHandle(owner,
receiver.dataId.localPoolId); receiver.dataId.localPoolId);
if(poolObj == nullptr) { if(poolObj == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED; printWarningOrError(sif::OutputTypes::OUT_WARNING,
"handleNotificationSnapshot", POOLOBJECT_NOT_FOUND);
return POOLOBJECT_NOT_FOUND;
} }
if (not poolObj->hasChanged()) { if (not poolObj->hasChanged()) {
@ -226,7 +227,7 @@ ReturnValue_t LocalDataPoolManager::handleNotificationSnapshot(
CCSDSTime::CDS_short cds; CCSDSTime::CDS_short cds;
CCSDSTime::convertToCcsds(&cds, &now); CCSDSTime::convertToCcsds(&cds, &now);
HousekeepingPacketUpdate updatePacket(reinterpret_cast<uint8_t*>(&cds), HousekeepingPacketUpdate updatePacket(reinterpret_cast<uint8_t*>(&cds),
sizeof(cds), owner->getPoolObjectHandle( sizeof(cds), HasLocalDpIFManagerAttorney::getPoolObjectHandle(owner,
receiver.dataId.localPoolId)); receiver.dataId.localPoolId));
store_address_t storeId; store_address_t storeId;
@ -246,10 +247,12 @@ ReturnValue_t LocalDataPoolManager::handleNotificationSnapshot(
toReset = poolObj; toReset = poolObj;
} }
else { else {
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle( LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner,
receiver.dataId.sid); receiver.dataId.sid);
if(dataSet == nullptr) { if(dataSet == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED; printWarningOrError(sif::OutputTypes::OUT_WARNING,
"handleNotificationSnapshot", DATASET_NOT_FOUND);
return DATASET_NOT_FOUND;
} }
if(not dataSet->hasChanged()) { if(not dataSet->hasChanged()) {
@ -262,7 +265,8 @@ ReturnValue_t LocalDataPoolManager::handleNotificationSnapshot(
CCSDSTime::CDS_short cds; CCSDSTime::CDS_short cds;
CCSDSTime::convertToCcsds(&cds, &now); CCSDSTime::convertToCcsds(&cds, &now);
HousekeepingPacketUpdate updatePacket(reinterpret_cast<uint8_t*>(&cds), HousekeepingPacketUpdate updatePacket(reinterpret_cast<uint8_t*>(&cds),
sizeof(cds), owner->getDataSetHandle(receiver.dataId.sid)); sizeof(cds), HasLocalDpIFManagerAttorney::getDataSetHandle(owner,
receiver.dataId.sid));
store_address_t storeId; store_address_t storeId;
ReturnValue_t result = addUpdateToStore(updatePacket, storeId); ReturnValue_t result = addUpdateToStore(updatePacket, storeId);
@ -308,8 +312,8 @@ void LocalDataPoolManager::handleChangeResetLogic(
// config error! // config error!
return; return;
} }
HkUpdateResetList& listRef = *hkUpdateResetList;
for(auto& changeInfo: *hkUpdateResetList) { for(auto& changeInfo: listRef) {
if(changeInfo.dataType != type) { if(changeInfo.dataType != type) {
continue; continue;
} }
@ -322,12 +326,16 @@ void LocalDataPoolManager::handleChangeResetLogic(
continue; continue;
} }
// only one update recipient, we can reset changes status immediately.
if(changeInfo.updateCounter <= 1) { if(changeInfo.updateCounter <= 1) {
toReset->setChanged(false); toReset->setChanged(false);
} }
if(changeInfo.currentUpdateCounter == 0) { // All recipients have been notified, reset the changed flag.
if(changeInfo.currentUpdateCounter <= 1) {
toReset->setChanged(false); toReset->setChanged(false);
changeInfo.currentUpdateCounter = 0;
} }
// Not all recipiens have been notified yet, decrement.
else { else {
changeInfo.currentUpdateCounter--; changeInfo.currentUpdateCounter--;
} }
@ -351,11 +359,9 @@ ReturnValue_t LocalDataPoolManager::subscribeForPeriodicPacket(sid_t sid,
AcceptsHkPacketsIF* hkReceiverObject = AcceptsHkPacketsIF* hkReceiverObject =
objectManager->get<AcceptsHkPacketsIF>(packetDestination); objectManager->get<AcceptsHkPacketsIF>(packetDestination);
if(hkReceiverObject == nullptr) { if(hkReceiverObject == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::error << "LocalDataPoolManager::subscribeForPeriodicPacket:" "subscribeForPeriodicPacket", QUEUE_OR_DESTINATION_INVALID);
<< " Invalid receiver!"<< std::endl; return QUEUE_OR_DESTINATION_INVALID;
#endif
return HasReturnvaluesIF::RETURN_OK;
} }
struct HkReceiver hkReceiver; struct HkReceiver hkReceiver;
@ -364,11 +370,12 @@ ReturnValue_t LocalDataPoolManager::subscribeForPeriodicPacket(sid_t sid,
hkReceiver.dataType = DataType::DATA_SET; hkReceiver.dataType = DataType::DATA_SET;
hkReceiver.destinationQueue = hkReceiverObject->getHkQueue(); hkReceiver.destinationQueue = hkReceiverObject->getHkQueue();
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid); LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
//LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid);
if(dataSet != nullptr) { if(dataSet != nullptr) {
dataSet->setReportingEnabled(enableReporting); LocalPoolDataSetAttorney::setReportingEnabled(*dataSet, enableReporting);
dataSet->setDiagnostic(isDiagnostics); LocalPoolDataSetAttorney::setDiagnostic(*dataSet, isDiagnostics);
dataSet->initializePeriodicHelper(collectionInterval, LocalPoolDataSetAttorney::initializePeriodicHelper(*dataSet, collectionInterval,
owner->getPeriodicOperationFrequency(), isDiagnostics); owner->getPeriodicOperationFrequency(), isDiagnostics);
} }
@ -383,11 +390,9 @@ ReturnValue_t LocalDataPoolManager::subscribeForUpdatePackets(sid_t sid,
AcceptsHkPacketsIF* hkReceiverObject = AcceptsHkPacketsIF* hkReceiverObject =
objectManager->get<AcceptsHkPacketsIF>(packetDestination); objectManager->get<AcceptsHkPacketsIF>(packetDestination);
if(hkReceiverObject == nullptr) { if(hkReceiverObject == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::error << "LocalDataPoolManager::subscribeForPeriodicPacket:" "subscribeForPeriodicPacket", QUEUE_OR_DESTINATION_INVALID);
<< " Invalid receiver!"<< std::endl; return QUEUE_OR_DESTINATION_INVALID;
#endif
return HasReturnvaluesIF::RETURN_OK;
} }
struct HkReceiver hkReceiver; struct HkReceiver hkReceiver;
@ -396,10 +401,11 @@ ReturnValue_t LocalDataPoolManager::subscribeForUpdatePackets(sid_t sid,
hkReceiver.dataType = DataType::DATA_SET; hkReceiver.dataType = DataType::DATA_SET;
hkReceiver.destinationQueue = hkReceiverObject->getHkQueue(); hkReceiver.destinationQueue = hkReceiverObject->getHkQueue();
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid); LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
//LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid);
if(dataSet != nullptr) { if(dataSet != nullptr) {
dataSet->setReportingEnabled(true); LocalPoolDataSetAttorney::setReportingEnabled(*dataSet, true);
dataSet->setDiagnostic(isDiagnostics); LocalPoolDataSetAttorney::setDiagnostic(*dataSet, isDiagnostics);
} }
hkReceiversMap.push_back(hkReceiver); hkReceiversMap.push_back(hkReceiver);
@ -413,7 +419,7 @@ ReturnValue_t LocalDataPoolManager::subscribeForSetUpdateMessages(
MessageQueueId_t targetQueueId, bool generateSnapshot) { MessageQueueId_t targetQueueId, bool generateSnapshot) {
struct HkReceiver hkReceiver; struct HkReceiver hkReceiver;
hkReceiver.dataType = DataType::DATA_SET; hkReceiver.dataType = DataType::DATA_SET;
hkReceiver.dataId.sid = sid_t(this->getOwner()->getObjectId(), setId); hkReceiver.dataId.sid = sid_t(owner->getObjectId(), setId);
hkReceiver.destinationQueue = targetQueueId; hkReceiver.destinationQueue = targetQueueId;
hkReceiver.objectId = destinationObject; hkReceiver.objectId = destinationObject;
if(generateSnapshot) { if(generateSnapshot) {
@ -513,10 +519,13 @@ ReturnValue_t LocalDataPoolManager::handleHousekeepingMessage(
break; break;
} }
case(HousekeepingMessage::REPORT_DIAGNOSTICS_REPORT_STRUCTURES): case(HousekeepingMessage::REPORT_DIAGNOSTICS_REPORT_STRUCTURES): {
return generateSetStructurePacket(sid, true); return generateSetStructurePacket(sid, true);
case(HousekeepingMessage::REPORT_HK_REPORT_STRUCTURES): }
case(HousekeepingMessage::REPORT_HK_REPORT_STRUCTURES): {
return generateSetStructurePacket(sid, false); return generateSetStructurePacket(sid, false);
}
case(HousekeepingMessage::MODIFY_DIAGNOSTICS_REPORT_COLLECTION_INTERVAL): case(HousekeepingMessage::MODIFY_DIAGNOSTICS_REPORT_COLLECTION_INTERVAL):
case(HousekeepingMessage::MODIFY_PARAMETER_REPORT_COLLECTION_INTERVAL): { case(HousekeepingMessage::MODIFY_PARAMETER_REPORT_COLLECTION_INTERVAL): {
float newCollIntvl = 0; float newCollIntvl = 0;
@ -534,13 +543,14 @@ ReturnValue_t LocalDataPoolManager::handleHousekeepingMessage(
case(HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT): case(HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT):
case(HousekeepingMessage::GENERATE_ONE_DIAGNOSTICS_REPORT): { case(HousekeepingMessage::GENERATE_ONE_DIAGNOSTICS_REPORT): {
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid); LocalPoolDataSetBase* dataSet =HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
//LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid);
if(command == HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT if(command == HousekeepingMessage::GENERATE_ONE_PARAMETER_REPORT
and dataSet->isDiagnostics()) { and LocalPoolDataSetAttorney::isDiagnostics(*dataSet)) {
return WRONG_HK_PACKET_TYPE; return WRONG_HK_PACKET_TYPE;
} }
else if(command == HousekeepingMessage::GENERATE_ONE_DIAGNOSTICS_REPORT else if(command == HousekeepingMessage::GENERATE_ONE_DIAGNOSTICS_REPORT
and not dataSet->isDiagnostics()) { and not LocalPoolDataSetAttorney::isDiagnostics(*dataSet)) {
return WRONG_HK_PACKET_TYPE; return WRONG_HK_PACKET_TYPE;
} }
return generateHousekeepingPacket(HousekeepingMessage::getSid(message), return generateHousekeepingPacket(HousekeepingMessage::getSid(message),
@ -591,11 +601,9 @@ ReturnValue_t LocalDataPoolManager::printPoolEntry(
lp_id_t localPoolId) { lp_id_t localPoolId) {
auto poolIter = localPoolMap.find(localPoolId); auto poolIter = localPoolMap.find(localPoolId);
if (poolIter == localPoolMap.end()) { if (poolIter == localPoolMap.end()) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING, "printPoolEntry",
sif::debug << "HousekeepingManager::fechPoolEntry:" localpool::POOL_ENTRY_NOT_FOUND);
<< " Pool entry not found." << std::endl; return localpool::POOL_ENTRY_NOT_FOUND;
#endif
return HasLocalDataPoolIF::POOL_ENTRY_NOT_FOUND;
} }
poolIter->second->print(); poolIter->second->print();
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
@ -614,11 +622,10 @@ ReturnValue_t LocalDataPoolManager::generateHousekeepingPacket(sid_t sid,
MessageQueueId_t destination) { MessageQueueId_t destination) {
if(dataSet == nullptr) { if(dataSet == nullptr) {
// Configuration error. // Configuration error.
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::warning << "HousekeepingManager::generateHousekeepingPacket:" "generateHousekeepingPacket",
<< " Set ID not found or dataset not assigned!" << std::endl; DATASET_NOT_FOUND);
#endif return DATASET_NOT_FOUND;
return HasReturnvaluesIF::RETURN_FAILED;
} }
store_address_t storeId; store_address_t storeId;
@ -632,7 +639,7 @@ ReturnValue_t LocalDataPoolManager::generateHousekeepingPacket(sid_t sid,
// and now we set a HK message and send it the HK packet destination. // and now we set a HK message and send it the HK packet destination.
CommandMessage hkMessage; CommandMessage hkMessage;
if(dataSet->isDiagnostics()) { if(LocalPoolDataSetAttorney::isDiagnostics(*dataSet)) {
HousekeepingMessage::setHkDiagnosticsReply(&hkMessage, sid, storeId); HousekeepingMessage::setHkDiagnosticsReply(&hkMessage, sid, storeId);
} }
else { else {
@ -640,12 +647,18 @@ ReturnValue_t LocalDataPoolManager::generateHousekeepingPacket(sid_t sid,
} }
if(hkQueue == nullptr) { if(hkQueue == nullptr) {
return QUEUE_OR_DESTINATION_NOT_SET; // error, no queue available to send packet with.
printWarningOrError(sif::OutputTypes::OUT_WARNING,
"generateHousekeepingPacket",
QUEUE_OR_DESTINATION_INVALID);
return QUEUE_OR_DESTINATION_INVALID;
} }
if(destination == MessageQueueIF::NO_QUEUE) { if(destination == MessageQueueIF::NO_QUEUE) {
if(hkDestinationId == MessageQueueIF::NO_QUEUE) { if(hkDestinationId == MessageQueueIF::NO_QUEUE) {
// error, all destinations invalid // error, all destinations invalid
return HasReturnvaluesIF::RETURN_FAILED; printWarningOrError(sif::OutputTypes::OUT_WARNING,
"generateHousekeepingPacket",
QUEUE_OR_DESTINATION_INVALID);
} }
destination = hkDestinationId; destination = hkDestinationId;
} }
@ -680,17 +693,28 @@ void LocalDataPoolManager::setNonDiagnosticIntervalFactor(
void LocalDataPoolManager::performPeriodicHkGeneration(HkReceiver& receiver) { void LocalDataPoolManager::performPeriodicHkGeneration(HkReceiver& receiver) {
sid_t sid = receiver.dataId.sid; sid_t sid = receiver.dataId.sid;
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid); //LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid);
if(not dataSet->getReportingEnabled()) { LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
if(dataSet == nullptr) {
printWarningOrError(sif::OutputTypes::OUT_WARNING,
"performPeriodicHkGeneration",
DATASET_NOT_FOUND);
return; return;
} }
if(dataSet->periodicHelper == nullptr) { if(not LocalPoolDataSetAttorney::getReportingEnabled(*dataSet)) {
return;
}
PeriodicHousekeepingHelper* periodicHelper =
LocalPoolDataSetAttorney::getPeriodicHelper(*dataSet);
if(periodicHelper == nullptr) {
// Configuration error. // Configuration error.
return; return;
} }
if(not dataSet->periodicHelper->checkOpNecessary()) { if(periodicHelper->checkOpNecessary()) {
return; return;
} }
@ -699,10 +723,11 @@ void LocalDataPoolManager::performPeriodicHkGeneration(HkReceiver& receiver) {
if(result != HasReturnvaluesIF::RETURN_OK) { if(result != HasReturnvaluesIF::RETURN_OK) {
// configuration error // configuration error
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::debug << "LocalDataPoolManager::performHkOperation:" sif::warning << "LocalDataPoolManager::performHkOperation: "
<< "0x" << std::hex << std::setfill('0') << std::setw(8) << "HK generation failed." << std::endl;
<< owner->getObjectId() << " Error generating " #else
<< "HK packet" << std::setfill(' ') << std::dec << std::endl; sif::printWarning("LocalDataPoolManager::performHkOperation: "
"HK generation failed.\n");
#endif #endif
} }
} }
@ -710,62 +735,67 @@ void LocalDataPoolManager::performPeriodicHkGeneration(HkReceiver& receiver) {
ReturnValue_t LocalDataPoolManager::togglePeriodicGeneration(sid_t sid, ReturnValue_t LocalDataPoolManager::togglePeriodicGeneration(sid_t sid,
bool enable, bool isDiagnostics) { bool enable, bool isDiagnostics) {
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid); //LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid);
if((dataSet->isDiagnostics() and not isDiagnostics) or LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
(not dataSet->isDiagnostics() and isDiagnostics)) { if((LocalPoolDataSetAttorney::isDiagnostics(*dataSet) and not isDiagnostics) or
(not LocalPoolDataSetAttorney::isDiagnostics(*dataSet) and isDiagnostics)) {
return WRONG_HK_PACKET_TYPE; return WRONG_HK_PACKET_TYPE;
} }
if((dataSet->getReportingEnabled() and enable) or if((LocalPoolDataSetAttorney::getReportingEnabled(*dataSet) and enable) or
(not dataSet->getReportingEnabled() and not enable)) { (not LocalPoolDataSetAttorney::getReportingEnabled(*dataSet) and not enable)) {
return REPORTING_STATUS_UNCHANGED; return REPORTING_STATUS_UNCHANGED;
} }
dataSet->setReportingEnabled(enable); LocalPoolDataSetAttorney::setReportingEnabled(*dataSet, enable);
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
ReturnValue_t LocalDataPoolManager::changeCollectionInterval(sid_t sid, ReturnValue_t LocalDataPoolManager::changeCollectionInterval(sid_t sid,
float newCollectionInterval, bool isDiagnostics) { float newCollectionInterval, bool isDiagnostics) {
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid); //LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid);
bool targetIsDiagnostics = dataSet->isDiagnostics(); LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
bool targetIsDiagnostics = LocalPoolDataSetAttorney::isDiagnostics(*dataSet);
if((targetIsDiagnostics and not isDiagnostics) or if((targetIsDiagnostics and not isDiagnostics) or
(not targetIsDiagnostics and isDiagnostics)) { (not targetIsDiagnostics and isDiagnostics)) {
return WRONG_HK_PACKET_TYPE; return WRONG_HK_PACKET_TYPE;
} }
if(dataSet->periodicHelper == nullptr) { PeriodicHousekeepingHelper* periodicHelper =
LocalPoolDataSetAttorney::getPeriodicHelper(*dataSet);
if(periodicHelper == nullptr) {
// config error // config error
return PERIODIC_HELPER_INVALID; return PERIODIC_HELPER_INVALID;
} }
dataSet->periodicHelper->changeCollectionInterval(newCollectionInterval); periodicHelper->changeCollectionInterval(newCollectionInterval);
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
ReturnValue_t LocalDataPoolManager::generateSetStructurePacket(sid_t sid, ReturnValue_t LocalDataPoolManager::generateSetStructurePacket(sid_t sid,
bool isDiagnostics) { bool isDiagnostics) {
// Get and check dataset first. // Get and check dataset first.
LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid); //LocalPoolDataSetBase* dataSet = owner->getDataSetHandle(sid);
LocalPoolDataSetBase* dataSet = HasLocalDpIFManagerAttorney::getDataSetHandle(owner, sid);
if(dataSet == nullptr) { if(dataSet == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::warning << "HousekeepingManager::generateHousekeepingPacket:" "performPeriodicHkGeneration",
<< " Set ID not found" << std::endl; DATASET_NOT_FOUND);
#endif return DATASET_NOT_FOUND;
return HasReturnvaluesIF::RETURN_FAILED;
} }
bool targetIsDiagnostics = dataSet->isDiagnostics(); bool targetIsDiagnostics = LocalPoolDataSetAttorney::isDiagnostics(*dataSet);
if((targetIsDiagnostics and not isDiagnostics) or if((targetIsDiagnostics and not isDiagnostics) or
(not targetIsDiagnostics and isDiagnostics)) { (not targetIsDiagnostics and isDiagnostics)) {
return WRONG_HK_PACKET_TYPE; return WRONG_HK_PACKET_TYPE;
} }
bool valid = dataSet->isValid(); bool valid = dataSet->isValid();
bool reportingEnabled = dataSet->getReportingEnabled(); bool reportingEnabled = LocalPoolDataSetAttorney::getReportingEnabled(*dataSet);
float collectionInterval = float collectionInterval = LocalPoolDataSetAttorney::getPeriodicHelper(*dataSet)->
dataSet->periodicHelper->getCollectionIntervalInSeconds(); getCollectionIntervalInSeconds();
// Generate set packet which can be serialized. // Generate set packet which can be serialized.
HousekeepingSetPacket setPacket(sid, HousekeepingSetPacket setPacket(sid,
@ -776,10 +806,9 @@ ReturnValue_t LocalDataPoolManager::generateSetStructurePacket(sid_t sid,
ReturnValue_t result = ipcStore->getFreeElement(&storeId, ReturnValue_t result = ipcStore->getFreeElement(&storeId,
expectedSize,&storePtr); expectedSize,&storePtr);
if(result != HasReturnvaluesIF::RETURN_OK) { if(result != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR,
sif::error << "HousekeepingManager::generateHousekeepingPacket: " "generateSetStructurePacket", HasReturnvaluesIF::RETURN_FAILED,
<< "Could not get free element from IPC store." << std::endl; "Could not get free element from IPC store.");
#endif
return result; return result;
} }
@ -788,10 +817,9 @@ ReturnValue_t LocalDataPoolManager::generateSetStructurePacket(sid_t sid,
result = setPacket.serialize(&storePtr, &size, expectedSize, result = setPacket.serialize(&storePtr, &size, expectedSize,
SerializeIF::Endianness::BIG); SerializeIF::Endianness::BIG);
if(expectedSize != size) { if(expectedSize != size) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::error << "HousekeepingManager::generateSetStructurePacket: " "generateSetStructurePacket", HasReturnvaluesIF::RETURN_FAILED,
<< "Expected size is not equal to serialized size" << std::endl; "Expected size is not equal to serialized size");
#endif
} }
// Send structure reporting reply. // Send structure reporting reply.
@ -808,3 +836,76 @@ ReturnValue_t LocalDataPoolManager::generateSetStructurePacket(sid_t sid,
hkQueue->reply(&reply); hkQueue->reply(&reply);
return result; return result;
} }
void LocalDataPoolManager::clearReceiversList() {
// clear the vector completely and releases allocated memory.
HkReceivers().swap(hkReceiversMap);
}
MutexIF* LocalDataPoolManager::getLocalPoolMutex() {
return this->mutex;
}
object_id_t LocalDataPoolManager::getCreatorObjectId() const {
return owner->getObjectId();
//return owner->getObjectId();
}
void LocalDataPoolManager::printWarningOrError(sif::OutputTypes outputType,
const char* functionName, ReturnValue_t error, const char* errorPrint) {
if(errorPrint == nullptr) {
if(error == DATASET_NOT_FOUND) {
errorPrint = "Dataset not found";
}
else if(error == POOLOBJECT_NOT_FOUND) {
errorPrint = "Pool Object not found";
}
else if(error == HasReturnvaluesIF::RETURN_FAILED) {
if(outputType == sif::OutputTypes::OUT_WARNING) {
errorPrint = "Generic Warning";
}
else {
errorPrint = "Generic error";
}
}
else if(error == QUEUE_OR_DESTINATION_INVALID) {
errorPrint = "Queue or destination not set";
}
else if(error == localpool::POOL_ENTRY_TYPE_CONFLICT) {
errorPrint = "Pool entry type conflict";
}
else if(error == localpool::POOL_ENTRY_NOT_FOUND) {
errorPrint = "Pool entry not found";
}
else {
errorPrint = "Unknown error";
}
}
if(outputType == sif::OutputTypes::OUT_WARNING) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LocalDataPoolManager::" << functionName
<< ": Object ID " << std::setw(8) << std::setfill('0')
<< std::hex << owner->getObjectId() << " | " << errorPrint
<< std::dec << std::setfill(' ') << std::endl;
#else
sif::printWarning("LocalDataPoolManager::%s: Object ID 0x%08x | %s\n",
owner->getObjectId(), errorPrint);
#endif
}
else if(outputType == sif::OutputTypes::OUT_ERROR) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "LocalDataPoolManager::" << functionName
<< ": Object ID " << std::setw(8) << std::setfill('0')
<< std::hex << owner->getObjectId() << " | " << errorPrint
<< std::dec << std::setfill(' ') << std::endl;
#else
sif::printError("LocalDataPoolManager::%s: Object ID 0x%08x | %s\n",
owner->getObjectId(), errorPrint);
#endif
}
}
LocalDataPoolManager* LocalDataPoolManager::getHkManagerHandle() {
return this;
}

View File

@ -1,8 +1,10 @@
#ifndef FSFW_DATAPOOLLOCAL_LOCALDATAPOOLMANAGER_H_ #ifndef FSFW_DATAPOOLLOCAL_LOCALDATAPOOLMANAGER_H_
#define FSFW_DATAPOOLLOCAL_LOCALDATAPOOLMANAGER_H_ #define FSFW_DATAPOOLLOCAL_LOCALDATAPOOLMANAGER_H_
#include "HasLocalDataPoolIF.h" #include "ProvidesDataPoolSubscriptionIF.h"
#include "AccessLocalPoolF.h"
#include "../serviceinterface/ServiceInterface.h"
#include "../housekeeping/HousekeepingPacketDownlink.h" #include "../housekeeping/HousekeepingPacketDownlink.h"
#include "../housekeeping/HousekeepingMessage.h" #include "../housekeeping/HousekeepingMessage.h"
#include "../housekeeping/PeriodicHousekeepingHelper.h" #include "../housekeeping/PeriodicHousekeepingHelper.h"
@ -15,6 +17,7 @@
#include "../ipc/MutexHelper.h" #include "../ipc/MutexHelper.h"
#include <map> #include <map>
#include <vector>
namespace Factory { namespace Factory {
void setStaticFrameworkObjectIds(); void setStaticFrameworkObjectIds();
@ -22,6 +25,8 @@ void setStaticFrameworkObjectIds();
class LocalPoolDataSetBase; class LocalPoolDataSetBase;
class HousekeepingPacketUpdate; class HousekeepingPacketUpdate;
class HasLocalDataPoolIF;
class LocalDataPool;
/** /**
* @brief This class is the managing instance for the local data pool. * @brief This class is the managing instance for the local data pool.
@ -47,19 +52,23 @@ class HousekeepingPacketUpdate;
* Each pool entry has a valid state too. * Each pool entry has a valid state too.
* @author R. Mueller * @author R. Mueller
*/ */
class LocalDataPoolManager { class LocalDataPoolManager: public ProvidesDataPoolSubscriptionIF,
template<typename T> friend class LocalPoolVariable; public AccessPoolManagerIF {
template<typename T, uint16_t vecSize> friend class LocalPoolVector;
friend class LocalPoolDataSetBase;
friend void (Factory::setStaticFrameworkObjectIds)(); friend void (Factory::setStaticFrameworkObjectIds)();
//! Some classes using the pool manager directly need to access class internals of the
//! manager. The attorney provides granular control of access to these internals.
friend class LocalDpManagerAttorney;
public: public:
static constexpr uint8_t INTERFACE_ID = CLASS_ID::HOUSEKEEPING_MANAGER; static constexpr uint8_t INTERFACE_ID = CLASS_ID::HOUSEKEEPING_MANAGER;
static constexpr ReturnValue_t QUEUE_OR_DESTINATION_NOT_SET = MAKE_RETURN_CODE(0x0); static constexpr ReturnValue_t QUEUE_OR_DESTINATION_INVALID = MAKE_RETURN_CODE(0);
static constexpr ReturnValue_t WRONG_HK_PACKET_TYPE = MAKE_RETURN_CODE(1);
static constexpr ReturnValue_t REPORTING_STATUS_UNCHANGED = MAKE_RETURN_CODE(2);
static constexpr ReturnValue_t PERIODIC_HELPER_INVALID = MAKE_RETURN_CODE(3);
static constexpr ReturnValue_t POOLOBJECT_NOT_FOUND = MAKE_RETURN_CODE(4);
static constexpr ReturnValue_t DATASET_NOT_FOUND = MAKE_RETURN_CODE(5);
static constexpr ReturnValue_t WRONG_HK_PACKET_TYPE = MAKE_RETURN_CODE(0x01);
static constexpr ReturnValue_t REPORTING_STATUS_UNCHANGED = MAKE_RETURN_CODE(0x02);
static constexpr ReturnValue_t PERIODIC_HELPER_INVALID = MAKE_RETURN_CODE(0x03);
/** /**
* This constructor is used by a class which wants to implement * This constructor is used by a class which wants to implement
@ -116,7 +125,7 @@ public:
*/ */
ReturnValue_t subscribeForPeriodicPacket(sid_t sid, bool enableReporting, ReturnValue_t subscribeForPeriodicPacket(sid_t sid, bool enableReporting,
float collectionInterval, bool isDiagnostics, float collectionInterval, bool isDiagnostics,
object_id_t packetDestination = defaultHkDestination); object_id_t packetDestination = defaultHkDestination) override;
/** /**
* @brief Subscribe for the generation of packets if the dataset * @brief Subscribe for the generation of packets if the dataset
@ -130,7 +139,7 @@ public:
*/ */
ReturnValue_t subscribeForUpdatePackets(sid_t sid, bool reportingEnabled, ReturnValue_t subscribeForUpdatePackets(sid_t sid, bool reportingEnabled,
bool isDiagnostics, bool isDiagnostics,
object_id_t packetDestination = defaultHkDestination); object_id_t packetDestination = defaultHkDestination) override;
/** /**
* @brief Subscribe for a notification message which will be sent * @brief Subscribe for a notification message which will be sent
@ -149,7 +158,7 @@ public:
ReturnValue_t subscribeForSetUpdateMessages(const uint32_t setId, ReturnValue_t subscribeForSetUpdateMessages(const uint32_t setId,
object_id_t destinationObject, object_id_t destinationObject,
MessageQueueId_t targetQueueId, MessageQueueId_t targetQueueId,
bool generateSnapshot); bool generateSnapshot) override;
/** /**
* @brief Subscribe for an notification message which will be sent if a * @brief Subscribe for an notification message which will be sent if a
@ -168,7 +177,9 @@ public:
ReturnValue_t subscribeForVariableUpdateMessages(const lp_id_t localPoolId, ReturnValue_t subscribeForVariableUpdateMessages(const lp_id_t localPoolId,
object_id_t destinationObject, object_id_t destinationObject,
MessageQueueId_t targetQueueId, MessageQueueId_t targetQueueId,
bool generateSnapshot); bool generateSnapshot) override;
MutexIF* getLocalPoolMutex() override;
/** /**
* Non-Diagnostics packets usually have a lower minimum sampling frequency * Non-Diagnostics packets usually have a lower minimum sampling frequency
@ -247,8 +258,18 @@ public:
LocalDataPoolManager(const LocalDataPoolManager &) = delete; LocalDataPoolManager(const LocalDataPoolManager &) = delete;
LocalDataPoolManager operator=(const LocalDataPoolManager&) = delete; LocalDataPoolManager operator=(const LocalDataPoolManager&) = delete;
/**
* This function can be used to clear the receivers list. This is
* intended for test functions and not for regular operations, because
* the insertion operations allocate dynamically.
*/
void clearReceiversList();
object_id_t getCreatorObjectId() const;
virtual LocalDataPoolManager* getHkManagerHandle() override;
private: private:
LocalDataPool localPoolMap; localpool::DataPool localPoolMap;
//! Every housekeeping data manager has a mutex to protect access //! Every housekeeping data manager has a mutex to protect access
//! to it's data pool. //! to it's data pool.
MutexIF* mutex = nullptr; MutexIF* mutex = nullptr;
@ -367,6 +388,11 @@ private:
ReturnValue_t& status); ReturnValue_t& status);
ReturnValue_t addUpdateToStore(HousekeepingPacketUpdate& updatePacket, ReturnValue_t addUpdateToStore(HousekeepingPacketUpdate& updatePacket,
store_address_t& storeId); store_address_t& storeId);
void printWarningOrError(sif::OutputTypes outputType,
const char* functionName,
ReturnValue_t errorCode = HasReturnvaluesIF::RETURN_FAILED,
const char* errorPrint = nullptr);
}; };
@ -375,20 +401,16 @@ ReturnValue_t LocalDataPoolManager::fetchPoolEntry(lp_id_t localPoolId,
PoolEntry<T> **poolEntry) { PoolEntry<T> **poolEntry) {
auto poolIter = localPoolMap.find(localPoolId); auto poolIter = localPoolMap.find(localPoolId);
if (poolIter == localPoolMap.end()) { if (poolIter == localPoolMap.end()) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR, "fetchPoolEntry",
sif::warning << "HousekeepingManager::fechPoolEntry: Pool entry " localpool::POOL_ENTRY_NOT_FOUND);
"not found." << std::endl; return localpool::POOL_ENTRY_NOT_FOUND;
#endif
return HasLocalDataPoolIF::POOL_ENTRY_NOT_FOUND;
} }
*poolEntry = dynamic_cast< PoolEntry<T>* >(poolIter->second); *poolEntry = dynamic_cast< PoolEntry<T>* >(poolIter->second);
if(*poolEntry == nullptr) { if(*poolEntry == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR, "fetchPoolEntry",
sif::debug << "HousekeepingManager::fetchPoolEntry:" localpool::POOL_ENTRY_TYPE_CONFLICT);
" Pool entry not found." << std::endl; return localpool::POOL_ENTRY_TYPE_CONFLICT;
#endif
return HasLocalDataPoolIF::POOL_ENTRY_TYPE_CONFLICT;
} }
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }

View File

@ -1,4 +1,8 @@
#include "LocalPoolDataSetBase.h" #include "LocalPoolDataSetBase.h"
#include "HasLocalDataPoolIF.h"
#include "internal/HasLocalDpIFUserAttorney.h"
#include "../serviceinterface/ServiceInterface.h"
#include "../datapoollocal/LocalDataPoolManager.h" #include "../datapoollocal/LocalDataPoolManager.h"
#include "../housekeeping/PeriodicHousekeepingHelper.h" #include "../housekeeping/PeriodicHousekeepingHelper.h"
#include "../serialize/SerializeAdapter.h" #include "../serialize/SerializeAdapter.h"
@ -15,15 +19,22 @@ LocalPoolDataSetBase::LocalPoolDataSetBase(HasLocalDataPoolIF *hkOwner,
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "LocalPoolDataSetBase::LocalPoolDataSetBase: Owner " sif::error << "LocalPoolDataSetBase::LocalPoolDataSetBase: Owner "
<< "invalid!" << std::endl; << "invalid!" << std::endl;
#endif #else
sif::printError("LocalPoolDataSetBase::LocalPoolDataSetBase: Owner "
"invalid!\n\r");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
return; return;
} }
hkManager = hkOwner->getHkManagerHandle(); AccessPoolManagerIF* accessor = HasLocalDpIFUserAttorney::getAccessorHandle(hkOwner);
if(poolManager != nullptr) {
poolManager = accessor->getHkManagerHandle();
mutexIfSingleDataCreator = accessor->getLocalPoolMutex();
}
this->sid.objectId = hkOwner->getObjectId(); this->sid.objectId = hkOwner->getObjectId();
this->sid.ownerSetId = setId; this->sid.ownerSetId = setId;
mutex = MutexFactory::instance()->createMutex();
// Data creators get a periodic helper for periodic HK data generation. // Data creators get a periodic helper for periodic HK data generation.
if(periodicHandling) { if(periodicHandling) {
periodicHelper = new PeriodicHousekeepingHelper(this); periodicHelper = new PeriodicHousekeepingHelper(this);
@ -34,23 +45,34 @@ LocalPoolDataSetBase::LocalPoolDataSetBase(sid_t sid,
PoolVariableIF** registeredVariablesArray, PoolVariableIF** registeredVariablesArray,
const size_t maxNumberOfVariables): const size_t maxNumberOfVariables):
PoolDataSetBase(registeredVariablesArray, maxNumberOfVariables) { PoolDataSetBase(registeredVariablesArray, maxNumberOfVariables) {
HasLocalDataPoolIF* hkOwner = objectManager->get<HasLocalDataPoolIF>( AccessPoolManagerIF* hkOwner = objectManager->get<AccessPoolManagerIF>(
sid.objectId); sid.objectId);
if(hkOwner != nullptr) { if(hkOwner != nullptr) {
hkManager = hkOwner->getHkManagerHandle(); mutexIfSingleDataCreator = hkOwner->getLocalPoolMutex();
} }
this->sid = sid;
mutex = MutexFactory::instance()->createMutex(); this->sid = sid;
} }
LocalPoolDataSetBase::LocalPoolDataSetBase(
PoolVariableIF **registeredVariablesArray,
const size_t maxNumberOfVariables, bool protectEveryReadCommitCall):
PoolDataSetBase(registeredVariablesArray, maxNumberOfVariables) {
this->setReadCommitProtectionBehaviour(protectEveryReadCommitCall);
}
LocalPoolDataSetBase::~LocalPoolDataSetBase() { LocalPoolDataSetBase::~LocalPoolDataSetBase() {
if(periodicHelper != nullptr) {
delete periodicHelper;
}
} }
ReturnValue_t LocalPoolDataSetBase::lockDataPool(uint32_t timeoutMs) { ReturnValue_t LocalPoolDataSetBase::lockDataPool(
if(hkManager != nullptr) { MutexIF::TimeoutType timeoutType,
MutexIF* mutex = hkManager->getMutexHandle(); uint32_t timeoutMs) {
return mutex->lockMutex(MutexIF::TimeoutType::WAITING, timeoutMs); if(mutexIfSingleDataCreator != nullptr) {
return mutexIfSingleDataCreator->lockMutex(timeoutType, timeoutMs);
} }
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
@ -128,9 +150,8 @@ ReturnValue_t LocalPoolDataSetBase::deSerializeWithValidityBuffer(
} }
ReturnValue_t LocalPoolDataSetBase::unlockDataPool() { ReturnValue_t LocalPoolDataSetBase::unlockDataPool() {
if(hkManager != nullptr) { if(mutexIfSingleDataCreator != nullptr) {
MutexIF* mutex = hkManager->getMutexHandle(); return mutexIfSingleDataCreator->unlockMutex();
return mutex->unlockMutex();
} }
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
@ -150,9 +171,12 @@ ReturnValue_t LocalPoolDataSetBase::serializeLocalPoolIds(uint8_t** buffer,
size, maxSize, streamEndianness); size, maxSize, streamEndianness);
if(result != HasReturnvaluesIF::RETURN_OK) { if(result != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LocalDataSet::serializeLocalPoolIds: Serialization" sif::warning << "LocalPoolDataSetBase::serializeLocalPoolIds: "
" error!" << std::endl; << "Serialization error!" << std::endl;
#endif #else
sif::printWarning("LocalPoolDataSetBase::serializeLocalPoolIds: "
"Serialization error!\n\r");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
return result; return result;
} }
} }
@ -211,8 +235,11 @@ ReturnValue_t LocalPoolDataSetBase::serialize(uint8_t **buffer, size_t *size,
void LocalPoolDataSetBase::bitSetter(uint8_t* byte, uint8_t position) const { void LocalPoolDataSetBase::bitSetter(uint8_t* byte, uint8_t position) const {
if(position > 7) { if(position > 7) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::debug << "Pool Raw Access: Bit setting invalid position" sif::warning << "LocalPoolDataSetBase::bitSetter: Invalid position!"
<< std::endl; << std::endl;
#else
sif::printWarning("LocalPoolDataSetBase::bitSetter: "
"Invalid position!\n\r");
#endif #endif
return; return;
} }
@ -244,14 +271,10 @@ void LocalPoolDataSetBase::initializePeriodicHelper(
} }
void LocalPoolDataSetBase::setChanged(bool changed) { void LocalPoolDataSetBase::setChanged(bool changed) {
// TODO: Make this configurable?
MutexHelper(mutex, MutexIF::TimeoutType::WAITING, 20);
this->changed = changed; this->changed = changed;
} }
bool LocalPoolDataSetBase::hasChanged() const { bool LocalPoolDataSetBase::hasChanged() const {
// TODO: Make this configurable?
MutexHelper(mutex, MutexIF::TimeoutType::WAITING, 20);
return changed; return changed;
} }
@ -273,12 +296,10 @@ bool LocalPoolDataSetBase::bitGetter(const uint8_t* byte,
} }
bool LocalPoolDataSetBase::isValid() const { bool LocalPoolDataSetBase::isValid() const {
MutexHelper(mutex, MutexIF::TimeoutType::WAITING, 5);
return this->valid; return this->valid;
} }
void LocalPoolDataSetBase::setValidity(bool valid, bool setEntriesRecursively) { void LocalPoolDataSetBase::setValidity(bool valid, bool setEntriesRecursively) {
MutexHelper(mutex, MutexIF::TimeoutType::WAITING, 5);
if(setEntriesRecursively) { if(setEntriesRecursively) {
for(size_t idx = 0; idx < this->getFillCount(); idx++) { for(size_t idx = 0; idx < this->getFillCount(); idx++) {
registeredVariables[idx] -> setValid(valid); registeredVariables[idx] -> setValid(valid);
@ -287,8 +308,9 @@ void LocalPoolDataSetBase::setValidity(bool valid, bool setEntriesRecursively) {
this->valid = valid; this->valid = valid;
} }
void LocalPoolDataSetBase::setReadCommitProtectionBehaviour( object_id_t LocalPoolDataSetBase::getCreatorObjectId() {
bool protectEveryReadCommit, uint32_t mutexTimeout) { if(poolManager != nullptr) {
PoolDataSetBase::setReadCommitProtectionBehaviour(protectEveryReadCommit, return poolManager->getCreatorObjectId();
mutexTimeout); }
return objects::NO_OBJECT;
} }

View File

@ -1,16 +1,16 @@
#ifndef FSFW_DATAPOOLLOCAL_LOCALPOOLDATASETBASE_H_ #ifndef FSFW_DATAPOOLLOCAL_LOCALPOOLDATASETBASE_H_
#define FSFW_DATAPOOLLOCAL_LOCALPOOLDATASETBASE_H_ #define FSFW_DATAPOOLLOCAL_LOCALPOOLDATASETBASE_H_
#include "HasLocalDataPoolIF.h"
#include "MarkChangedIF.h" #include "MarkChangedIF.h"
#include "localPoolDefinitions.h"
#include "../datapool/DataSetIF.h" #include "../datapool/DataSetIF.h"
#include "../datapool/PoolDataSetBase.h" #include "../datapool/PoolDataSetBase.h"
#include "../serialize/SerializeIF.h"
#include <vector> #include <vector>
class LocalDataPoolManager; class LocalDataPoolManager;
class HasLocalDataPoolIF;
class PeriodicHousekeepingHelper; class PeriodicHousekeepingHelper;
/** /**
@ -43,7 +43,7 @@ class PeriodicHousekeepingHelper;
*/ */
class LocalPoolDataSetBase: public PoolDataSetBase, class LocalPoolDataSetBase: public PoolDataSetBase,
public MarkChangedIF { public MarkChangedIF {
friend class LocalDataPoolManager; friend class LocalPoolDataSetAttorney;
friend class PeriodicHousekeepingHelper; friend class PeriodicHousekeepingHelper;
public: public:
/** /**
@ -57,8 +57,11 @@ public:
const size_t maxNumberOfVariables, bool periodicHandling = true); const size_t maxNumberOfVariables, bool periodicHandling = true);
/** /**
* @brief Constructor for users of local pool data. * @brief Constructor for users of the local pool data, which need
* to access data created by one (!) HK manager.
* @details * @details
* Unlike the first constructor, no component for periodic handling
* will be initiated.
* @param sid Unique identifier of dataset consisting of object ID and * @param sid Unique identifier of dataset consisting of object ID and
* set ID. * set ID.
* @param registeredVariablesArray * @param registeredVariablesArray
@ -67,6 +70,28 @@ public:
LocalPoolDataSetBase(sid_t sid, PoolVariableIF** registeredVariablesArray, LocalPoolDataSetBase(sid_t sid, PoolVariableIF** registeredVariablesArray,
const size_t maxNumberOfVariables); const size_t maxNumberOfVariables);
/**
* @brief Simple constructor, if the dataset is not the owner by
* a class with a HK manager.
* @details
* This constructor won't create components required for periodic handling
* and it also won't try to deduce the HK manager because no SID is
* supplied. This function should therefore be called by classes which need
* to access pool variables from different creators.
*
* If the class is intended to access pool variables from different
* creators, the third argument should be set to true. The mutex
* properties can be set with #setReadCommitProtectionBehaviour .
* @param registeredVariablesArray
* @param maxNumberOfVariables
* @param protectEveryReadCommitCall If the pool variables are created by
* multiple creators, this flag can be set to protect all read and
* commit calls separately.
*/
LocalPoolDataSetBase(PoolVariableIF** registeredVariablesArray,
const size_t maxNumberOfVariables,
bool protectEveryReadCommitCall = true);
/** /**
* @brief The destructor automatically manages writing the valid * @brief The destructor automatically manages writing the valid
* information of variables. * information of variables.
@ -77,16 +102,6 @@ public:
*/ */
~LocalPoolDataSetBase(); ~LocalPoolDataSetBase();
/**
* If the data is pulled from different local data pools, every read and
* commit call should be mutex protected for thread safety.
* This can be specified with the second parameter.
* @param dataCreator
* @param protectEveryReadCommit
*/
void setReadCommitProtectionBehaviour(bool protectEveryReadCommit,
uint32_t mutexTimeout = 20);
void setValidityBufferGeneration(bool withValidityBuffer); void setValidityBufferGeneration(bool withValidityBuffer);
sid_t getSid() const; sid_t getSid() const;
@ -136,10 +151,11 @@ public:
void setChanged(bool changed) override; void setChanged(bool changed) override;
bool hasChanged() const override; bool hasChanged() const override;
object_id_t getCreatorObjectId();
protected: protected:
sid_t sid; sid_t sid;
uint32_t mutexTimeout = 20; //! This mutex is used if the data is created by one object only.
MutexIF* mutex = nullptr; MutexIF* mutexIfSingleDataCreator = nullptr;
bool diagnostic = false; bool diagnostic = false;
void setDiagnostic(bool diagnostics); void setDiagnostic(bool diagnostics);
@ -183,7 +199,9 @@ protected:
* @details * @details
* It makes use of the lockDataPool method offered by the DataPool class. * It makes use of the lockDataPool method offered by the DataPool class.
*/ */
ReturnValue_t lockDataPool(uint32_t timeoutMs) override; ReturnValue_t lockDataPool(MutexIF::TimeoutType timeoutType,
uint32_t timeoutMs) override;
/** /**
* @brief This is a small helper function to facilitate * @brief This is a small helper function to facilitate
* unlocking the global data pool * unlocking the global data pool
@ -192,8 +210,6 @@ protected:
*/ */
ReturnValue_t unlockDataPool() override; ReturnValue_t unlockDataPool() override;
LocalDataPoolManager* hkManager = nullptr;
/** /**
* Set n-th bit of a byte, with n being the position from 0 * Set n-th bit of a byte, with n being the position from 0
* (most significant bit) to 7 (least significant bit) * (most significant bit) to 7 (least significant bit)
@ -202,6 +218,7 @@ protected:
bool bitGetter(const uint8_t* byte, uint8_t position) const; bool bitGetter(const uint8_t* byte, uint8_t position) const;
PeriodicHousekeepingHelper* periodicHelper = nullptr; PeriodicHousekeepingHelper* periodicHelper = nullptr;
LocalDataPoolManager* poolManager = nullptr;
}; };

View File

@ -1,9 +1,13 @@
#include "LocalDataPoolManager.h"
#include "LocalPoolObjectBase.h" #include "LocalPoolObjectBase.h"
#include "internal/HasLocalDpIFUserAttorney.h"
#include "HasLocalDataPoolIF.h"
LocalPoolObjectBase::LocalPoolObjectBase(lp_id_t poolId, #include "../objectmanager/ObjectManagerIF.h"
HasLocalDataPoolIF* hkOwner, DataSetIF* dataSet,
pool_rwm_t setReadWriteMode): localPoolId(poolId), LocalPoolObjectBase::LocalPoolObjectBase(lp_id_t poolId, HasLocalDataPoolIF* hkOwner,
readWriteMode(setReadWriteMode) { DataSetIF* dataSet, pool_rwm_t setReadWriteMode):
localPoolId(poolId), readWriteMode(setReadWriteMode) {
if(poolId == PoolVariableIF::NO_PARAMETER) { if(poolId == PoolVariableIF::NO_PARAMETER) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LocalPoolVar<T>::LocalPoolVar: 0 passed as pool ID, " sif::warning << "LocalPoolVar<T>::LocalPoolVar: 0 passed as pool ID, "
@ -17,23 +21,24 @@ LocalPoolObjectBase::LocalPoolObjectBase(lp_id_t poolId,
#endif #endif
return; return;
} }
hkManager = hkOwner->getHkManagerHandle(); AccessPoolManagerIF* poolManAccessor = HasLocalDpIFUserAttorney::getAccessorHandle(hkOwner);
hkManager = poolManAccessor->getHkManagerHandle();
if (dataSet != nullptr) { if (dataSet != nullptr) {
dataSet->registerVariable(this); dataSet->registerVariable(this);
} }
} }
LocalPoolObjectBase::LocalPoolObjectBase(object_id_t poolOwner, lp_id_t poolId, LocalPoolObjectBase::LocalPoolObjectBase(object_id_t poolOwner, lp_id_t poolId, DataSetIF *dataSet,
DataSetIF *dataSet, pool_rwm_t setReadWriteMode): localPoolId(poolId), pool_rwm_t setReadWriteMode):
readWriteMode(setReadWriteMode) { localPoolId(poolId), readWriteMode(setReadWriteMode) {
if(poolId == PoolVariableIF::NO_PARAMETER) { if(poolId == PoolVariableIF::NO_PARAMETER) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LocalPoolVar<T>::LocalPoolVar: 0 passed as pool ID, " sif::warning << "LocalPoolVar<T>::LocalPoolVar: 0 passed as pool ID, "
<< "which is the NO_PARAMETER value!" << std::endl; << "which is the NO_PARAMETER value!" << std::endl;
#endif #endif
} }
HasLocalDataPoolIF* hkOwner = HasLocalDataPoolIF* hkOwner = objectManager->get<HasLocalDataPoolIF>(poolOwner);
objectManager->get<HasLocalDataPoolIF>(poolOwner);
if(hkOwner == nullptr) { if(hkOwner == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "LocalPoolVariable: The supplied pool owner did not " sif::error << "LocalPoolVariable: The supplied pool owner did not "
@ -42,7 +47,10 @@ LocalPoolObjectBase::LocalPoolObjectBase(object_id_t poolOwner, lp_id_t poolId,
#endif #endif
return; return;
} }
hkManager = hkOwner->getHkManagerHandle(); //hkManager = hkOwner->getHkManagerHandle();
AccessPoolManagerIF* poolManAccessor = HasLocalDpIFUserAttorney::getAccessorHandle(hkOwner);
//hkManager = HasLocalDpIFUserAttorney::getHkManagerHandle(hkOwner);
hkManager = poolManAccessor->getHkManagerHandle();
if(dataSet != nullptr) { if(dataSet != nullptr) {
dataSet->registerVariable(this); dataSet->registerVariable(this);
} }
@ -79,3 +87,42 @@ bool LocalPoolObjectBase::hasChanged() const {
void LocalPoolObjectBase::setReadWriteMode(pool_rwm_t newReadWriteMode) { void LocalPoolObjectBase::setReadWriteMode(pool_rwm_t newReadWriteMode) {
this->readWriteMode = newReadWriteMode; this->readWriteMode = newReadWriteMode;
} }
void LocalPoolObjectBase::reportReadCommitError(const char* variableType,
ReturnValue_t error, bool read, object_id_t objectId, lp_id_t lpId) {
#if FSFW_DISABLE_PRINTOUT == 0
const char* type = nullptr;
if(read) {
type = "read";
}
else {
type = "commit";
}
const char* errMsg = nullptr;
if(error == localpool::POOL_ENTRY_NOT_FOUND) {
errMsg = "Pool entry not found";
}
else if(error == localpool::POOL_ENTRY_TYPE_CONFLICT) {
errMsg = "Pool entry type conflict";
}
else if(error == PoolVariableIF::INVALID_READ_WRITE_MODE) {
errMsg = "Pool variable wrong read-write mode";
}
else if(error == PoolVariableIF::INVALID_POOL_ENTRY) {
errMsg = "Pool entry invalid";
}
else {
errMsg = "Unknown error code";
}
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << variableType << ": " << type << " call | " << errMsg << " | Owner: 0x"
<< std::hex << std::setw(8) << std::setfill('0') << objectId << std::dec
<< " LPID: " << lpId << std::endl;
#else
sif::printWarning("%s: %s call | %s | Owner: 0x%08x LPID: %lu\n",
variableType, type, errMsg, objectId, lpId);
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_DISABLE_PRINTOUT == 0 */
}

View File

@ -1,10 +1,15 @@
#ifndef FSFW_DATAPOOLLOCAL_LOCALPOOLOBJECTBASE_H_ #ifndef FSFW_DATAPOOLLOCAL_LOCALPOOLOBJECTBASE_H_
#define FSFW_DATAPOOLLOCAL_LOCALPOOLOBJECTBASE_H_ #define FSFW_DATAPOOLLOCAL_LOCALPOOLOBJECTBASE_H_
#include <fsfw/datapoollocal/localPoolDefinitions.h>
#include "MarkChangedIF.h" #include "MarkChangedIF.h"
#include "../datapoollocal/LocalDataPoolManager.h" #include "../objectmanager/SystemObjectIF.h"
#include "../datapool/PoolVariableIF.h" #include "../datapool/PoolVariableIF.h"
#include "../returnvalues/HasReturnvaluesIF.h"
class LocalDataPoolManager;
class DataSetIF;
class HasLocalDataPoolIF;
class LocalPoolObjectBase: public PoolVariableIF, class LocalPoolObjectBase: public PoolVariableIF,
public HasReturnvaluesIF, public HasReturnvaluesIF,
@ -54,8 +59,10 @@ protected:
ReadWriteMode_t readWriteMode = pool_rwm_t::VAR_READ_WRITE; ReadWriteMode_t readWriteMode = pool_rwm_t::VAR_READ_WRITE;
//! @brief Pointer to the class which manages the HK pool. //! @brief Pointer to the class which manages the HK pool.
LocalDataPoolManager* hkManager; LocalDataPoolManager* hkManager = nullptr;
void reportReadCommitError(const char* variableType,
ReturnValue_t error, bool read, object_id_t objectId, lp_id_t lpId);
}; };

View File

@ -4,9 +4,12 @@
#include "LocalPoolObjectBase.h" #include "LocalPoolObjectBase.h"
#include "HasLocalDataPoolIF.h" #include "HasLocalDataPoolIF.h"
#include "LocalDataPoolManager.h" #include "LocalDataPoolManager.h"
#include "AccessLocalPoolF.h"
#include "internal/LocalDpManagerAttorney.h"
#include "../datapool/PoolVariableIF.h" #include "../datapool/PoolVariableIF.h"
#include "../datapool/DataSetIF.h" #include "../datapool/DataSetIF.h"
#include "../serviceinterface/ServiceInterface.h"
#include "../objectmanager/ObjectManagerIF.h" #include "../objectmanager/ObjectManagerIF.h"
#include "../serialize/SerializeAdapter.h" #include "../serialize/SerializeAdapter.h"
@ -105,7 +108,9 @@ public:
* at once to avoid the overhead of unnecessary lock und unlock operations. * at once to avoid the overhead of unnecessary lock und unlock operations.
* *
*/ */
ReturnValue_t read(dur_millis_t lockTimeout = MutexIF::BLOCKING) override; ReturnValue_t read(MutexIF::TimeoutType timeoutType =
MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20) override;
/** /**
* @brief The commit call copies the array values back to the data pool. * @brief The commit call copies the array values back to the data pool.
* @details * @details
@ -115,8 +120,21 @@ public:
* It is recommended to use DataSets to read and commit multiple variables * It is recommended to use DataSets to read and commit multiple variables
* at once to avoid the overhead of unnecessary lock und unlock operations. * at once to avoid the overhead of unnecessary lock und unlock operations.
*/ */
ReturnValue_t commit(dur_millis_t lockTimeout = MutexIF::BLOCKING) override; ReturnValue_t commit(MutexIF::TimeoutType timeoutType =
MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20) override;
/**
* @brief This commit function can be used to set the pool variable valid
* as well.
* @param setValid
* @param timeoutType
* @param timeoutMs
* @return
*/
ReturnValue_t commit(bool setValid, MutexIF::TimeoutType timeoutType =
MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20);
LocalPoolVariable<T> &operator=(const T& newValue); LocalPoolVariable<T> &operator=(const T& newValue);
LocalPoolVariable<T> &operator=(const LocalPoolVariable<T>& newPoolVariable); LocalPoolVariable<T> &operator=(const LocalPoolVariable<T>& newPoolVariable);
@ -163,8 +181,6 @@ protected:
friend std::ostream& operator<< (std::ostream &out, friend std::ostream& operator<< (std::ostream &out,
const LocalPoolVariable<U> &var); const LocalPoolVariable<U> &var);
#endif #endif
private:
}; };
#include "LocalPoolVariable.tpp" #include "LocalPoolVariable.tpp"

View File

@ -24,73 +24,91 @@ inline LocalPoolVariable<T>::LocalPoolVariable(gp_id_t globalPoolId,
template<typename T> template<typename T>
inline ReturnValue_t LocalPoolVariable<T>::read(dur_millis_t lockTimeout) { inline ReturnValue_t LocalPoolVariable<T>::read(
MutexHelper(hkManager->getMutexHandle(), MutexIF::TimeoutType::WAITING, MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
lockTimeout); MutexHelper(LocalDpManagerAttorney::getMutexHandle(*hkManager), timeoutType, timeoutMs);
return readWithoutLock(); return readWithoutLock();
} }
template<typename T> template<typename T>
inline ReturnValue_t LocalPoolVariable<T>::readWithoutLock() { inline ReturnValue_t LocalPoolVariable<T>::readWithoutLock() {
if(readWriteMode == pool_rwm_t::VAR_WRITE) { if(readWriteMode == pool_rwm_t::VAR_WRITE) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 object_id_t targetObjectId = hkManager->getCreatorObjectId();
sif::debug << "LocalPoolVar: Invalid read write " reportReadCommitError("LocalPoolVector",
"mode for read() call." << std::endl; PoolVariableIF::INVALID_READ_WRITE_MODE, true, targetObjectId,
#endif localPoolId);
return PoolVariableIF::INVALID_READ_WRITE_MODE; return PoolVariableIF::INVALID_READ_WRITE_MODE;
} }
PoolEntry<T>* poolEntry = nullptr; PoolEntry<T>* poolEntry = nullptr;
ReturnValue_t result = hkManager->fetchPoolEntry(localPoolId, &poolEntry); ReturnValue_t result = LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId,
if(result != RETURN_OK or poolEntry == nullptr) { &poolEntry);
#if FSFW_CPP_OSTREAM_ENABLED == 1 //ReturnValue_t result = hkManager->fetchPoolEntry(localPoolId, &poolEntry);
sif::error << "PoolVector: Read of local pool variable of object " if(result != RETURN_OK) {
<< std::hex << std::setw(8) << std::setfill('0') object_id_t ownerObjectId = hkManager->getCreatorObjectId();
<< hkManager->getOwner() << " and lp ID " << localPoolId reportReadCommitError("LocalPoolVariable", result,
<< std::dec << " failed." << std::setfill(' ') << std::endl; false, ownerObjectId, localPoolId);
#endif
return result; return result;
} }
this->value = *(poolEntry->address);
this->valid = poolEntry->valid; // Actually this should never happen..
// if(poolEntry->address == nullptr) {
// result = PoolVariableIF::INVALID_POOL_ENTRY;
// object_id_t ownerObjectId = hkManager->getOwner()->getObjectId();
// reportReadCommitError("LocalPoolVariable", result,
// false, ownerObjectId, localPoolId);
// return result;
// }
this->value = *(poolEntry->getDataPtr());
this->valid = poolEntry->getValid();
return RETURN_OK; return RETURN_OK;
} }
template<typename T> template<typename T>
inline ReturnValue_t LocalPoolVariable<T>::commit(dur_millis_t lockTimeout) { inline ReturnValue_t LocalPoolVariable<T>::commit(bool setValid,
MutexHelper(hkManager->getMutexHandle(), MutexIF::TimeoutType::WAITING, MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
lockTimeout); this->setValid(setValid);
return commit(timeoutType, timeoutMs);
}
template<typename T>
inline ReturnValue_t LocalPoolVariable<T>::commit(
MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
MutexHelper(LocalDpManagerAttorney::getMutexHandle(*hkManager), timeoutType, timeoutMs);
return commitWithoutLock(); return commitWithoutLock();
} }
template<typename T> template<typename T>
inline ReturnValue_t LocalPoolVariable<T>::commitWithoutLock() { inline ReturnValue_t LocalPoolVariable<T>::commitWithoutLock() {
if(readWriteMode == pool_rwm_t::VAR_READ) { if(readWriteMode == pool_rwm_t::VAR_READ) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 object_id_t targetObjectId = hkManager->getCreatorObjectId();
sif::debug << "LocalPoolVariable: Invalid read write " reportReadCommitError("LocalPoolVector",
"mode for commit() call." << std::endl; PoolVariableIF::INVALID_READ_WRITE_MODE, false, targetObjectId,
#endif localPoolId);
return PoolVariableIF::INVALID_READ_WRITE_MODE; return PoolVariableIF::INVALID_READ_WRITE_MODE;
} }
PoolEntry<T>* poolEntry = nullptr; PoolEntry<T>* poolEntry = nullptr;
ReturnValue_t result = hkManager->fetchPoolEntry(localPoolId, &poolEntry); //ReturnValue_t result = hkManager->fetchPoolEntry(localPoolId, &poolEntry);
ReturnValue_t result = LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId,
&poolEntry);
if(result != RETURN_OK) { if(result != RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 object_id_t ownerObjectId = hkManager->getCreatorObjectId();
sif::error << "PoolVector: Read of local pool variable of object " reportReadCommitError("LocalPoolVariable", result,
"0x" << std::hex << std::setw(8) << std::setfill('0') << false, ownerObjectId, localPoolId);
hkManager->getOwner() << " and lp ID 0x" << localPoolId <<
std::dec << " failed.\n" << std::flush;
#endif
return result; return result;
} }
*(poolEntry->address) = this->value;
poolEntry->valid = this->valid; *(poolEntry->getDataPtr()) = this->value;
poolEntry->setValid(this->valid);
return RETURN_OK; return RETURN_OK;
} }
template<typename T> template<typename T>
inline ReturnValue_t LocalPoolVariable<T>::serialize(uint8_t** buffer, size_t* size, inline ReturnValue_t LocalPoolVariable<T>::serialize(uint8_t** buffer,
const size_t max_size, SerializeIF::Endianness streamEndianness) const { size_t* size, const size_t max_size,
SerializeIF::Endianness streamEndianness) const {
return SerializeAdapter::serialize(&value, return SerializeAdapter::serialize(&value,
buffer, size ,max_size, streamEndianness); buffer, size ,max_size, streamEndianness);
} }
@ -121,7 +139,8 @@ inline LocalPoolVariable<T>::operator T() const {
} }
template<typename T> template<typename T>
inline LocalPoolVariable<T> & LocalPoolVariable<T>::operator=(const T& newValue) { inline LocalPoolVariable<T> & LocalPoolVariable<T>::operator=(
const T& newValue) {
value = newValue; value = newValue;
return *this; return *this;
} }
@ -134,7 +153,8 @@ inline LocalPoolVariable<T>& LocalPoolVariable<T>::operator =(
} }
template<typename T> template<typename T>
inline bool LocalPoolVariable<T>::operator ==(const LocalPoolVariable<T> &other) const { inline bool LocalPoolVariable<T>::operator ==(
const LocalPoolVariable<T> &other) const {
return this->value == other.value; return this->value == other.value;
} }
@ -145,7 +165,8 @@ inline bool LocalPoolVariable<T>::operator ==(const T &other) const {
template<typename T> template<typename T>
inline bool LocalPoolVariable<T>::operator !=(const LocalPoolVariable<T> &other) const { inline bool LocalPoolVariable<T>::operator !=(
const LocalPoolVariable<T> &other) const {
return not (*this == other); return not (*this == other);
} }
@ -156,7 +177,8 @@ inline bool LocalPoolVariable<T>::operator !=(const T &other) const {
template<typename T> template<typename T>
inline bool LocalPoolVariable<T>::operator <(const LocalPoolVariable<T> &other) const { inline bool LocalPoolVariable<T>::operator <(
const LocalPoolVariable<T> &other) const {
return this->value < other.value; return this->value < other.value;
} }
@ -167,7 +189,8 @@ inline bool LocalPoolVariable<T>::operator <(const T &other) const {
template<typename T> template<typename T>
inline bool LocalPoolVariable<T>::operator >(const LocalPoolVariable<T> &other) const { inline bool LocalPoolVariable<T>::operator >(
const LocalPoolVariable<T> &other) const {
return not (*this < other); return not (*this < other);
} }

View File

@ -2,12 +2,14 @@
#define FSFW_DATAPOOLLOCAL_LOCALPOOLVECTOR_H_ #define FSFW_DATAPOOLLOCAL_LOCALPOOLVECTOR_H_
#include "LocalPoolObjectBase.h" #include "LocalPoolObjectBase.h"
#include "internal/LocalDpManagerAttorney.h"
#include "../datapool/DataSetIF.h" #include "../datapool/DataSetIF.h"
#include "../datapool/PoolEntry.h" #include "../datapool/PoolEntry.h"
#include "../datapool/PoolVariableIF.h" #include "../datapool/PoolVariableIF.h"
#include "../datapoollocal/LocalDataPoolManager.h" #include "../datapoollocal/LocalDataPoolManager.h"
#include "../serialize/SerializeAdapter.h" #include "../serialize/SerializeAdapter.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterface.h"
/** /**
@ -100,8 +102,8 @@ public:
return vectorSize; return vectorSize;
} }
T& operator [](int i); T& operator [](size_t i);
const T &operator [](int i) const; const T &operator [](size_t i) const;
virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size,
const size_t maxSize, const size_t maxSize,
@ -123,7 +125,10 @@ public:
* It is recommended to use DataSets to read and commit multiple variables * It is recommended to use DataSets to read and commit multiple variables
* at once to avoid the overhead of unnecessary lock und unlock operations. * at once to avoid the overhead of unnecessary lock und unlock operations.
*/ */
ReturnValue_t read(uint32_t lockTimeout = MutexIF::BLOCKING) override; ReturnValue_t read(MutexIF::TimeoutType timeoutType =
MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20) override;
/** /**
* @brief The commit call copies the array values back to the data pool. * @brief The commit call copies the array values back to the data pool.
* @details * @details
@ -133,7 +138,17 @@ public:
* It is recommended to use DataSets to read and commit multiple variables * It is recommended to use DataSets to read and commit multiple variables
* at once to avoid the overhead of unnecessary lock und unlock operations. * at once to avoid the overhead of unnecessary lock und unlock operations.
*/ */
ReturnValue_t commit(uint32_t lockTimeout = MutexIF::BLOCKING) override; ReturnValue_t commit(MutexIF::TimeoutType timeoutType =
MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20) override;
/**
* @brief This commit call also sets the validity of the pool entry.
* @details
*/
ReturnValue_t commit(bool valid, MutexIF::TimeoutType timeoutType =
MutexIF::TimeoutType::WAITING,
uint32_t timeoutMs = 20);
protected: protected:
/** /**
@ -157,12 +172,12 @@ protected:
private: private:
#if FSFW_CPP_OSTREAM_ENABLED == 1
// std::ostream is the type for object std::cout // std::ostream is the type for object std::cout
template <typename U, uint16_t otherSize> template <typename U, uint16_t otherSize>
friend std::ostream& operator<< (std::ostream &out, friend std::ostream& operator<< (std::ostream &out,
const LocalPoolVector<U, otherSize> &var); const LocalPoolVector<U, otherSize> &var);
#endif
}; };

View File

@ -24,98 +24,106 @@ inline LocalPoolVector<T, vectorSize>::LocalPoolVector(gp_id_t globalPoolId,
dataSet, setReadWriteMode) {} dataSet, setReadWriteMode) {}
template<typename T, uint16_t vectorSize> template<typename T, uint16_t vectorSize>
inline ReturnValue_t LocalPoolVector<T, vectorSize>::read(uint32_t lockTimeout) { inline ReturnValue_t LocalPoolVector<T, vectorSize>::read(
MutexHelper(hkManager->getMutexHandle(), MutexIF::TimeoutType::WAITING, MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
lockTimeout); MutexHelper(LocalDpManagerAttorney::getMutexHandle(*hkManager), timeoutType, timeoutMs);
return readWithoutLock(); return readWithoutLock();
} }
template<typename T, uint16_t vectorSize> template<typename T, uint16_t vectorSize>
inline ReturnValue_t LocalPoolVector<T, vectorSize>::readWithoutLock() { inline ReturnValue_t LocalPoolVector<T, vectorSize>::readWithoutLock() {
if(readWriteMode == pool_rwm_t::VAR_WRITE) { if(readWriteMode == pool_rwm_t::VAR_WRITE) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 object_id_t targetObjectId = hkManager->getCreatorObjectId();
sif::debug << "LocalPoolVar: Invalid read write " reportReadCommitError("LocalPoolVector",
"mode for read() call." << std::endl; PoolVariableIF::INVALID_READ_WRITE_MODE, true, targetObjectId,
#endif localPoolId);
return PoolVariableIF::INVALID_READ_WRITE_MODE; return PoolVariableIF::INVALID_READ_WRITE_MODE;
} }
PoolEntry<T>* poolEntry = nullptr; PoolEntry<T>* poolEntry = nullptr;
ReturnValue_t result = hkManager->fetchPoolEntry(localPoolId, &poolEntry); ReturnValue_t result = LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId,
&poolEntry);
memset(this->value, 0, vectorSize * sizeof(T)); memset(this->value, 0, vectorSize * sizeof(T));
if(result != RETURN_OK) { if(result != RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 object_id_t targetObjectId = hkManager->getCreatorObjectId();
sif::error << "PoolVector: Read of local pool variable of object " reportReadCommitError("LocalPoolVector", result, true, targetObjectId,
"0x" << std::hex << std::setw(8) << std::setfill('0') << localPoolId);
hkManager->getOwner() << "and lp ID 0x" << localPoolId <<
std::dec << " failed." << std::endl;
#endif
return result; return result;
} }
std::memcpy(this->value, poolEntry->address, poolEntry->getByteSize()); std::memcpy(this->value, poolEntry->getDataPtr(), poolEntry->getByteSize());
this->valid = poolEntry->valid; this->valid = poolEntry->getValid();
return RETURN_OK; return RETURN_OK;
} }
template<typename T, uint16_t vectorSize>
inline ReturnValue_t LocalPoolVector<T, vectorSize>::commit(bool valid,
MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
this->setValid(valid);
return commit(timeoutType, timeoutMs);
}
template<typename T, uint16_t vectorSize> template<typename T, uint16_t vectorSize>
inline ReturnValue_t LocalPoolVector<T, vectorSize>::commit( inline ReturnValue_t LocalPoolVector<T, vectorSize>::commit(
uint32_t lockTimeout) { MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
MutexHelper(hkManager->getMutexHandle(), MutexIF::TimeoutType::WAITING, MutexHelper(LocalDpManagerAttorney::getMutexHandle(*hkManager), timeoutType, timeoutMs);
lockTimeout);
return commitWithoutLock(); return commitWithoutLock();
} }
template<typename T, uint16_t vectorSize> template<typename T, uint16_t vectorSize>
inline ReturnValue_t LocalPoolVector<T, vectorSize>::commitWithoutLock() { inline ReturnValue_t LocalPoolVector<T, vectorSize>::commitWithoutLock() {
if(readWriteMode == pool_rwm_t::VAR_READ) { if(readWriteMode == pool_rwm_t::VAR_READ) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 object_id_t targetObjectId = hkManager->getCreatorObjectId();
sif::debug << "LocalPoolVar: Invalid read write " reportReadCommitError("LocalPoolVector",
"mode for commit() call." << std::endl; PoolVariableIF::INVALID_READ_WRITE_MODE, false, targetObjectId,
#endif localPoolId);
return PoolVariableIF::INVALID_READ_WRITE_MODE; return PoolVariableIF::INVALID_READ_WRITE_MODE;
} }
PoolEntry<T>* poolEntry = nullptr; PoolEntry<T>* poolEntry = nullptr;
ReturnValue_t result = hkManager->fetchPoolEntry(localPoolId, &poolEntry); ReturnValue_t result = LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId,
&poolEntry);
if(result != RETURN_OK) { if(result != RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 object_id_t targetObjectId = hkManager->getCreatorObjectId();
sif::error << "PoolVector: Read of local pool variable of object " reportReadCommitError("LocalPoolVector", result, false, targetObjectId,
"0x" << std::hex << std::setw(8) << std::setfill('0') << localPoolId);
hkManager->getOwner() << " and lp ID 0x" << localPoolId <<
std::dec << " failed.\n" << std::flush;
#endif
return result; return result;
} }
std::memcpy(poolEntry->address, this->value, poolEntry->getByteSize()); std::memcpy(poolEntry->getDataPtr(), this->value, poolEntry->getByteSize());
poolEntry->valid = this->valid; poolEntry->setValid(this->valid);
return RETURN_OK; return RETURN_OK;
} }
template<typename T, uint16_t vectorSize> template<typename T, uint16_t vectorSize>
inline T& LocalPoolVector<T, vectorSize>::operator [](int i) { inline T& LocalPoolVector<T, vectorSize>::operator [](size_t i) {
if(i <= vectorSize) { if(i < vectorSize) {
return value[i]; return value[i];
} }
// If this happens, I have to set some value. I consider this // If this happens, I have to set some value. I consider this
// a configuration error, but I wont exit here. // a configuration error, but I wont exit here.
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "LocalPoolVector: Invalid index. Setting or returning" sif::warning << "LocalPoolVector: Invalid index. Setting or returning"
" last value!" << std::endl; " last value!" << std::endl;
#else
sif::printWarning("LocalPoolVector: Invalid index. Setting or returning"
" last value!\n");
#endif #endif
return value[i]; return value[vectorSize - 1];
} }
template<typename T, uint16_t vectorSize> template<typename T, uint16_t vectorSize>
inline const T& LocalPoolVector<T, vectorSize>::operator [](int i) const { inline const T& LocalPoolVector<T, vectorSize>::operator [](size_t i) const {
if(i <= vectorSize) { if(i < vectorSize) {
return value[i]; return value[i];
} }
// If this happens, I have to set some value. I consider this // If this happens, I have to set some value. I consider this
// a configuration error, but I wont exit here. // a configuration error, but I wont exit here.
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "LocalPoolVector: Invalid index. Setting or returning" sif::warning << "LocalPoolVector: Invalid index. Setting or returning"
" last value!" << std::endl; " last value!" << std::endl;
#else
sif::printWarning("LocalPoolVector: Invalid index. Setting or returning"
" last value!\n");
#endif #endif
return value[i]; return value[vectorSize - 1];
} }
template<typename T, uint16_t vectorSize> template<typename T, uint16_t vectorSize>
@ -153,6 +161,7 @@ inline ReturnValue_t LocalPoolVector<T, vectorSize>::deSerialize(
return result; return result;
} }
#if FSFW_CPP_OSTREAM_ENABLED == 1
template<typename T, uint16_t vectorSize> template<typename T, uint16_t vectorSize>
inline std::ostream& operator<< (std::ostream &out, inline std::ostream& operator<< (std::ostream &out,
const LocalPoolVector<T, vectorSize> &var) { const LocalPoolVector<T, vectorSize> &var) {
@ -166,5 +175,6 @@ inline std::ostream& operator<< (std::ostream &out,
out << "]"; out << "]";
return out; return out;
} }
#endif
#endif /* FSFW_DATAPOOLLOCAL_LOCALPOOLVECTOR_TPP_ */ #endif /* FSFW_DATAPOOLLOCAL_LOCALPOOLVECTOR_TPP_ */

View File

@ -1,7 +1,8 @@
#ifndef FSFW_DATAPOOLLOCAL_POOLREADHELPER_H_ #ifndef FSFW_DATAPOOLLOCAL_POOLREADHELPER_H_
#define FSFW_DATAPOOLLOCAL_POOLREADHELPER_H_ #define FSFW_DATAPOOLLOCAL_POOLREADHELPER_H_
#include <fsfw/datapoollocal/LocalPoolDataSetBase.h> #include "LocalPoolDataSetBase.h"
#include "../serviceinterface/ServiceInterface.h"
#include <FSFWConfig.h> #include <FSFWConfig.h>
/** /**
@ -9,13 +10,17 @@
*/ */
class PoolReadHelper { class PoolReadHelper {
public: public:
PoolReadHelper(ReadCommitIF* readObject, uint32_t mutexTimeout = 20): PoolReadHelper(ReadCommitIF* readObject,
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING,
uint32_t mutexTimeout = 20):
readObject(readObject), mutexTimeout(mutexTimeout) { readObject(readObject), mutexTimeout(mutexTimeout) {
if(readObject != nullptr) { if(readObject != nullptr) {
readResult = readObject->read(mutexTimeout); readResult = readObject->read(timeoutType, mutexTimeout);
#if FSFW_PRINT_VERBOSITY_LEVEL == 1 #if FSFW_VERBOSE_LEVEL == 1
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "PoolReadHelper: Read failed!" << std::endl; sif::error << "PoolReadHelper: Read failed!" << std::endl;
#else
sif::printError("PoolReadHelper: Read failed!\n");
#endif /* FSFW_PRINT_VERBOSITY_LEVEL == 1 */ #endif /* FSFW_PRINT_VERBOSITY_LEVEL == 1 */
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ #endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
} }
@ -27,7 +32,7 @@ public:
~PoolReadHelper() { ~PoolReadHelper() {
if(readObject != nullptr) { if(readObject != nullptr) {
readObject->commit(mutexTimeout); readObject->commit(timeoutType, mutexTimeout);
} }
} }
@ -35,6 +40,7 @@ public:
private: private:
ReadCommitIF* readObject = nullptr; ReadCommitIF* readObject = nullptr;
ReturnValue_t readResult = HasReturnvaluesIF::RETURN_OK; ReturnValue_t readResult = HasReturnvaluesIF::RETURN_OK;
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING;
uint32_t mutexTimeout = 20; uint32_t mutexTimeout = 20;
}; };

View File

@ -0,0 +1,84 @@
#ifndef FSFW_DATAPOOLLOCAL_PROVIDESDATAPOOLSUBSCRIPTION_H_
#define FSFW_DATAPOOLLOCAL_PROVIDESDATAPOOLSUBSCRIPTION_H_
#include <fsfw/datapoollocal/localPoolDefinitions.h>
#include <fsfw/ipc/messageQueueDefinitions.h>
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
class ProvidesDataPoolSubscriptionIF {
public:
virtual ~ProvidesDataPoolSubscriptionIF(){};
/**
* @brief Subscribe for the generation of periodic packets.
* @details
* This subscription mechanism will generally be used by the data creator
* to generate housekeeping packets which are downlinked directly.
* @return
*/
virtual ReturnValue_t subscribeForPeriodicPacket(sid_t sid,
bool enableReporting,
float collectionInterval, bool isDiagnostics,
object_id_t packetDestination) = 0;
/**
* @brief Subscribe for the generation of packets if the dataset
* is marked as changed.
* @details
* This subscription mechanism will generally be used by the data creator.
* @param sid
* @param isDiagnostics
* @param packetDestination
* @return
*/
virtual ReturnValue_t subscribeForUpdatePackets(sid_t sid,
bool reportingEnabled,
bool isDiagnostics,
object_id_t packetDestination) = 0;
/**
* @brief Subscribe for a notification message which will be sent
* if a dataset has changed.
* @details
* This subscription mechanism will generally be used internally by
* other software components.
* @param setId Set ID of the set to receive update messages from.
* @param destinationObject
* @param targetQueueId
* @param generateSnapshot If this is set to true, a copy of the current
* data with a timestamp will be generated and sent via message.
* Otherwise, only an notification message is sent.
* @return
*/
virtual ReturnValue_t subscribeForSetUpdateMessages(const uint32_t setId,
object_id_t destinationObject,
MessageQueueId_t targetQueueId,
bool generateSnapshot) = 0;
/**
* @brief Subscribe for an notification message which will be sent if a
* pool variable has changed.
* @details
* This subscription mechanism will generally be used internally by
* other software components.
* @param localPoolId Pool ID of the pool variable
* @param destinationObject
* @param targetQueueId
* @param generateSnapshot If this is set to true, a copy of the current
* data with a timestamp will be generated and sent via message.
* Otherwise, only an notification message is sent.
* @return
*/
virtual ReturnValue_t subscribeForVariableUpdateMessages(
const lp_id_t localPoolId,
object_id_t destinationObject,
MessageQueueId_t targetQueueId,
bool generateSnapshot) = 0;
};
#endif /* FSFW_DATAPOOLLOCAL_PROVIDESDATAPOOLSUBSCRIPTION_H_ */

View File

@ -6,6 +6,13 @@
#include "../objectmanager/SystemObject.h" #include "../objectmanager/SystemObject.h"
#include <vector> #include <vector>
/**
* This local dataset variation can be used if the dataset is used concurrently across
* multiple threads. It provides a lock in addition to all other functionalities provided
* by the LocalPoolDataSetBase class.
*
* TODO: override and protect read, commit and some other calls used by pool manager.
*/
class SharedLocalDataSet: public SystemObject, class SharedLocalDataSet: public SystemObject,
public LocalPoolDataSetBase, public LocalPoolDataSetBase,
public SharedDataSetIF { public SharedDataSetIF {

View File

@ -0,0 +1,5 @@
target_sources(${LIB_FSFW_NAME}
PRIVATE
HasLocalDpIFUserAttorney.cpp
HasLocalDpIFManagerAttorney.cpp
)

View File

@ -0,0 +1,18 @@
#include "HasLocalDpIFManagerAttorney.h"
#include "../LocalPoolObjectBase.h"
#include "../LocalPoolDataSetBase.h"
#include "../HasLocalDataPoolIF.h"
LocalPoolDataSetBase* HasLocalDpIFManagerAttorney::getDataSetHandle(HasLocalDataPoolIF* clientIF,
sid_t sid) {
return clientIF->getDataSetHandle(sid);
}
LocalPoolObjectBase* HasLocalDpIFManagerAttorney::getPoolObjectHandle(HasLocalDataPoolIF* clientIF,
lp_id_t localPoolId) {
return clientIF->getPoolObjectHandle(localPoolId);
}
object_id_t HasLocalDpIFManagerAttorney::getObjectId(HasLocalDataPoolIF* clientIF) {
return clientIF->getObjectId();
}

View File

@ -0,0 +1,22 @@
#ifndef FSFW_DATAPOOLLOCAL_HASLOCALDPIFMANAGERATTORNEY_H_
#define FSFW_DATAPOOLLOCAL_HASLOCALDPIFMANAGERATTORNEY_H_
#include "../localPoolDefinitions.h"
class HasLocalDataPoolIF;
class LocalPoolDataSetBase;
class LocalPoolObjectBase;
class HasLocalDpIFManagerAttorney {
static LocalPoolDataSetBase* getDataSetHandle(HasLocalDataPoolIF* clientIF, sid_t sid);
static LocalPoolObjectBase* getPoolObjectHandle(HasLocalDataPoolIF* clientIF,
lp_id_t localPoolId);
static object_id_t getObjectId(HasLocalDataPoolIF* clientIF);
friend class LocalDataPoolManager;
};
#endif /* FSFW_DATAPOOLLOCAL_HASLOCALDPIFMANAGERATTORNEY_H_ */

View File

@ -0,0 +1,7 @@
#include "HasLocalDpIFUserAttorney.h"
#include "../AccessLocalPoolF.h"
#include "../HasLocalDataPoolIF.h"
AccessPoolManagerIF* HasLocalDpIFUserAttorney::getAccessorHandle(HasLocalDataPoolIF *clientIF) {
return clientIF->getAccessorHandle();
}

View File

@ -0,0 +1,18 @@
#ifndef FSFW_DATAPOOLLOCAL_HASLOCALDPIFUSERATTORNEY_H_
#define FSFW_DATAPOOLLOCAL_HASLOCALDPIFUSERATTORNEY_H_
class HasLocalDataPoolIF;
class AccessPoolManagerIF;
class HasLocalDpIFUserAttorney {
private:
static AccessPoolManagerIF* getAccessorHandle(HasLocalDataPoolIF* clientIF);
friend class LocalPoolObjectBase;
friend class LocalPoolDataSetBase;
};
#endif /* FSFW_DATAPOOLLOCAL_HASLOCALDPIFUSERATTORNEY_H_ */

View File

@ -0,0 +1,32 @@
#ifndef FSFW_DATAPOOLLOCAL_LOCALDPMANAGERATTORNEY_H_
#define FSFW_DATAPOOLLOCAL_LOCALDPMANAGERATTORNEY_H_
#include <fsfw/datapoollocal/LocalDataPoolManager.h>
/**
* @brief This is a helper class implements the Attorney-Client idiom for access to
* LocalDataPoolManager internals
* @details
* This helper class provides better control over which classes are allowed to access
* LocalDataPoolManager internals in a granular and encapsulated way when compared to
* other methods like direct friend declarations. It allows these classes to use
* an explicit subset of the pool manager private/protected functions.
* See: https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Friendship_and_the_Attorney-Client
*/
class LocalDpManagerAttorney {
private:
template<typename T> static ReturnValue_t fetchPoolEntry(LocalDataPoolManager& manager,
lp_id_t localPoolId, PoolEntry<T> **poolEntry) {
return manager.fetchPoolEntry(localPoolId, poolEntry);
}
static MutexIF* getMutexHandle(LocalDataPoolManager& manager) {
return manager.getMutexHandle();
}
template<typename T> friend class LocalPoolVariable;
template<typename T, uint16_t vecSize> friend class LocalPoolVector;
};
#endif /* FSFW_DATAPOOLLOCAL_LOCALDPMANAGERATTORNEY_H_ */

View File

@ -0,0 +1,39 @@
#ifndef FSFW_DATAPOOLLOCAL_LOCALPOOLDATASETATTORNEY_H_
#define FSFW_DATAPOOLLOCAL_LOCALPOOLDATASETATTORNEY_H_
#include "../LocalPoolDataSetBase.h"
class LocalPoolDataSetAttorney {
private:
static void setDiagnostic(LocalPoolDataSetBase& set, bool diagnostics) {
set.setDiagnostic(diagnostics);
}
static bool isDiagnostics(LocalPoolDataSetBase& set) {
return set.isDiagnostics();
}
static void initializePeriodicHelper(LocalPoolDataSetBase& set, float collectionInterval,
uint32_t minimumPeriodicIntervalMs,
bool isDiagnostics, uint8_t nonDiagIntervalFactor = 5) {
set.initializePeriodicHelper(collectionInterval, minimumPeriodicIntervalMs, isDiagnostics,
nonDiagIntervalFactor);
}
static void setReportingEnabled(LocalPoolDataSetBase& set, bool enabled) {
set.setReportingEnabled(enabled);
}
static bool getReportingEnabled(LocalPoolDataSetBase& set) {
return set.getReportingEnabled();
}
static PeriodicHousekeepingHelper* getPeriodicHelper(LocalPoolDataSetBase& set) {
return set.periodicHelper;
}
friend class LocalDataPoolManager;
};
#endif /* FSFW_DATAPOOLLOCAL_LOCALPOOLDATASETATTORNEY_H_ */

View File

@ -1,10 +1,13 @@
#ifndef FSFW_DATAPOOLLOCAL_LOCPOOLDEFINITIONS_H_ #ifndef FSFW_DATAPOOLLOCAL_LOCALPOOLDEFINITIONS_H_
#define FSFW_DATAPOOLLOCAL_LOCPOOLDEFINITIONS_H_ #define FSFW_DATAPOOLLOCAL_LOCALPOOLDEFINITIONS_H_
#include <cstdint> #include "../datapool/PoolEntryIF.h"
#include "../objectmanager/SystemObjectIF.h" #include "../objectmanager/SystemObjectIF.h"
#include "../objectmanager/frameworkObjects.h" #include "../objectmanager/frameworkObjects.h"
#include <cstdint>
#include <map>
/** /**
* @brief Type definition for local pool entries. * @brief Type definition for local pool entries.
*/ */
@ -12,10 +15,21 @@ using lp_id_t = uint32_t;
namespace localpool { namespace localpool {
static constexpr uint32_t INVALID_LPID = -1; static constexpr uint32_t INVALID_LPID = -1;
static constexpr uint8_t INTERFACE_ID = CLASS_ID::LOCAL_POOL_OWNER_IF;
static constexpr ReturnValue_t POOL_ENTRY_NOT_FOUND = MAKE_RETURN_CODE(0x00);
static constexpr ReturnValue_t POOL_ENTRY_TYPE_CONFLICT = MAKE_RETURN_CODE(0x01);
//! This is the core data structure of the local data pools. Users should insert all desired
//! pool variables, using the std::map interface.
using DataPool = std::map<lp_id_t, PoolEntryIF*>;
using DataPoolMapIter = DataPool::iterator;
} }
/** /**
* Used as a unique identifier for data sets. * Used as a unique identifier for data sets. Consists of 4 byte object ID and 4 byte set ID.
*/ */
union sid_t { union sid_t {
static constexpr uint64_t INVALID_SID = -1; static constexpr uint64_t INVALID_SID = -1;
@ -57,7 +71,8 @@ union sid_t {
}; };
/** /**
* Used as a global unique identifier for local pool variables. * Used as a global unique identifier for local pool variables. Consists of 4 byte object ID
* and 4 byte local pool ID.
*/ */
union gp_id_t { union gp_id_t {
static constexpr uint64_t INVALID_GPID = -1; static constexpr uint64_t INVALID_GPID = -1;
@ -90,4 +105,4 @@ union gp_id_t {
} }
}; };
#endif /* FSFW_DATAPOOLLOCAL_LOCPOOLDEFINITIONS_H_ */ #endif /* FSFW_DATAPOOLLOCAL_LOCALPOOLDEFINITIONS_H_ */

View File

@ -9,18 +9,14 @@
//! the C stdio functions can be used alternatively //! the C stdio functions can be used alternatively
#define FSFW_CPP_OSTREAM_ENABLED 1 #define FSFW_CPP_OSTREAM_ENABLED 1
//! More FSFW related printouts. //! More FSFW related printouts depending on level. Useful for development.
//! Be careful, this also turns off most diagnostic prinouts! #define FSFW_VERBOSE_LEVEL 1
#define FSFW_ENHANCED_PRINTOUT 0
//! Can be used to completely disable printouts, even the C stdio ones. //! Can be used to completely disable printouts, even the C stdio ones.
#if FSFW_CPP_OSTREAM_ENABLED == 0 && FSFW_ENHANCED_PRINTOUT == 0 #if FSFW_CPP_OSTREAM_ENABLED == 0 && FSFW_VERBOSE_LEVEL == 0
#define FSFW_DISABLE_PRINTOUT 0 #define FSFW_DISABLE_PRINTOUT 0
#endif #endif
//! Can be used to enable additional debugging printouts for developing the FSFW
#define FSFW_PRINT_VERBOSITY_LEVEL 0
//! Can be used to disable the ANSI color sequences for C stdio. //! Can be used to disable the ANSI color sequences for C stdio.
#define FSFW_COLORED_OUTPUT 1 #define FSFW_COLORED_OUTPUT 1

View File

@ -2,7 +2,7 @@
#include "AcceptsDeviceResponsesIF.h" #include "AcceptsDeviceResponsesIF.h"
#include "DeviceTmReportingWrapper.h" #include "DeviceTmReportingWrapper.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterface.h"
#include "../objectmanager/ObjectManager.h" #include "../objectmanager/ObjectManager.h"
#include "../storagemanager/StorageManagerIF.h" #include "../storagemanager/StorageManagerIF.h"
#include "../thermal/ThermalComponentIF.h" #include "../thermal/ThermalComponentIF.h"
@ -13,9 +13,6 @@
#include "../subsystem/SubsystemBase.h" #include "../subsystem/SubsystemBase.h"
#include "../datapoollocal/LocalPoolVariable.h" #include "../datapoollocal/LocalPoolVariable.h"
#include <iomanip>
object_id_t DeviceHandlerBase::powerSwitcherId = objects::NO_OBJECT; object_id_t DeviceHandlerBase::powerSwitcherId = objects::NO_OBJECT;
object_id_t DeviceHandlerBase::rawDataReceiverId = objects::NO_OBJECT; object_id_t DeviceHandlerBase::rawDataReceiverId = objects::NO_OBJECT;
object_id_t DeviceHandlerBase::defaultFdirParentId = objects::NO_OBJECT; object_id_t DeviceHandlerBase::defaultFdirParentId = objects::NO_OBJECT;
@ -27,7 +24,7 @@ DeviceHandlerBase::DeviceHandlerBase(object_id_t setObjectId,
wiretappingMode(OFF), storedRawData(StorageManagerIF::INVALID_ADDRESS), wiretappingMode(OFF), storedRawData(StorageManagerIF::INVALID_ADDRESS),
deviceCommunicationId(deviceCommunication), comCookie(comCookie), deviceCommunicationId(deviceCommunication), comCookie(comCookie),
healthHelper(this,setObjectId), modeHelper(this), parameterHelper(this), healthHelper(this,setObjectId), modeHelper(this), parameterHelper(this),
actionHelper(this, nullptr), hkManager(this, nullptr), actionHelper(this, nullptr), poolManager(this, nullptr),
childTransitionFailure(RETURN_OK), fdirInstance(fdirInstance), childTransitionFailure(RETURN_OK), fdirInstance(fdirInstance),
hkSwitcher(this), defaultFDIRUsed(fdirInstance == nullptr), hkSwitcher(this), defaultFDIRUsed(fdirInstance == nullptr),
switchOffWasReported(false), childTransitionDelay(5000), switchOffWasReported(false), childTransitionDelay(5000),
@ -39,13 +36,8 @@ DeviceHandlerBase::DeviceHandlerBase(object_id_t setObjectId,
cookieInfo.state = COOKIE_UNUSED; cookieInfo.state = COOKIE_UNUSED;
cookieInfo.pendingCommand = deviceCommandMap.end(); cookieInfo.pendingCommand = deviceCommandMap.end();
if (comCookie == nullptr) { if (comCookie == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR, "DeviceHandlerBase",
sif::error << "DeviceHandlerBase: ObjectID 0x" << std::hex HasReturnvaluesIF::RETURN_FAILED, "Invalid cookie");
<< std::setw(8) << std::setfill('0') << this->getObjectId()
<< std::dec << ": Do not pass nullptr as a cookie, consider "
<< std::setfill(' ') << "passing a dummy cookie instead!"
<< std::endl;
#endif
} }
if (this->fdirInstance == nullptr) { if (this->fdirInstance == nullptr) {
this->fdirInstance = new DeviceHandlerFailureIsolation(setObjectId, this->fdirInstance = new DeviceHandlerFailureIsolation(setObjectId,
@ -115,7 +107,7 @@ ReturnValue_t DeviceHandlerBase::performOperation(uint8_t counter) {
doGetRead(); doGetRead();
// This will be performed after datasets have been updated by the // This will be performed after datasets have been updated by the
// custom device implementation. // custom device implementation.
hkManager.performHkOperation(); poolManager.performHkOperation();
break; break;
default: default:
break; break;
@ -132,30 +124,24 @@ ReturnValue_t DeviceHandlerBase::initialize() {
communicationInterface = objectManager->get<DeviceCommunicationIF>( communicationInterface = objectManager->get<DeviceCommunicationIF>(
deviceCommunicationId); deviceCommunicationId);
if (communicationInterface == nullptr) { if (communicationInterface == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR, "initialize",
sif::error << "DeviceHandlerBase::initialize: Communication interface " ObjectManagerIF::CHILD_INIT_FAILED,
"invalid." << std::endl; "Passed communication IF invalid");
sif::error << "Make sure it is set up properly and implements"
" DeviceCommunicationIF" << std::endl;
#endif
return ObjectManagerIF::CHILD_INIT_FAILED; return ObjectManagerIF::CHILD_INIT_FAILED;
} }
result = communicationInterface->initializeInterface(comCookie); result = communicationInterface->initializeInterface(comCookie);
if (result != RETURN_OK) { if (result != RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR, "initialize",
sif::error << "DeviceHandlerBase::initialize: Initializing " ObjectManagerIF::CHILD_INIT_FAILED,
"communication interface failed!" << std::endl; "ComIF initialization failed");
#endif
return result; return result;
} }
IPCStore = objectManager->get<StorageManagerIF>(objects::IPC_STORE); IPCStore = objectManager->get<StorageManagerIF>(objects::IPC_STORE);
if (IPCStore == nullptr) { if (IPCStore == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_ERROR, "initialize",
sif::error << "DeviceHandlerBase::initialize: IPC store not set up in " ObjectManagerIF::CHILD_INIT_FAILED, "IPC Store not set up");
"factory." << std::endl;
#endif
return ObjectManagerIF::CHILD_INIT_FAILED; return ObjectManagerIF::CHILD_INIT_FAILED;
} }
@ -164,11 +150,15 @@ ReturnValue_t DeviceHandlerBase::initialize() {
AcceptsDeviceResponsesIF>(rawDataReceiverId); AcceptsDeviceResponsesIF>(rawDataReceiverId);
if (rawReceiver == nullptr) { if (rawReceiver == nullptr) {
printWarningOrError(sif::OutputTypes::OUT_ERROR,
"initialize", ObjectManagerIF::CHILD_INIT_FAILED,
"Raw receiver object ID set but no valid object found.");
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "DeviceHandlerBase::initialize: Raw receiver object "
"ID set but no valid object found." << std::endl;
sif::error << "Make sure the raw receiver object is set up properly" sif::error << "Make sure the raw receiver object is set up properly"
" and implements AcceptsDeviceResponsesIF" << std::endl; " and implements AcceptsDeviceResponsesIF" << std::endl;
#else
sif::printError("Make sure the raw receiver object is set up "
"properly and implements AcceptsDeviceResponsesIF\n");
#endif #endif
return ObjectManagerIF::CHILD_INIT_FAILED; return ObjectManagerIF::CHILD_INIT_FAILED;
} }
@ -178,11 +168,15 @@ ReturnValue_t DeviceHandlerBase::initialize() {
if(powerSwitcherId != objects::NO_OBJECT) { if(powerSwitcherId != objects::NO_OBJECT) {
powerSwitcher = objectManager->get<PowerSwitchIF>(powerSwitcherId); powerSwitcher = objectManager->get<PowerSwitchIF>(powerSwitcherId);
if (powerSwitcher == nullptr) { if (powerSwitcher == nullptr) {
printWarningOrError(sif::OutputTypes::OUT_ERROR,
"initialize", ObjectManagerIF::CHILD_INIT_FAILED,
"Power switcher set but no valid object found.");
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "DeviceHandlerBase::initialize: Power switcher " sif::error << "Make sure the power switcher object is set up "
<< "object ID set but no valid object found." << std::endl; << "properly and implements PowerSwitchIF" << std::endl;
sif::error << "Make sure the raw receiver object is set up properly" #else
<< " and implements PowerSwitchIF" << std::endl; sif::printError("Make sure the power switcher object is set up "
"properly and implements PowerSwitchIF\n");
#endif #endif
return ObjectManagerIF::CHILD_INIT_FAILED; return ObjectManagerIF::CHILD_INIT_FAILED;
} }
@ -216,7 +210,7 @@ ReturnValue_t DeviceHandlerBase::initialize() {
return result; return result;
} }
result = hkManager.initialize(commandQueue); result = poolManager.initialize(commandQueue);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }
@ -229,7 +223,8 @@ ReturnValue_t DeviceHandlerBase::initialize() {
if(result == HasReturnvaluesIF::RETURN_OK) { if(result == HasReturnvaluesIF::RETURN_OK) {
thermalSet->heaterRequest.value = thermalSet->heaterRequest.value =
ThermalComponentIF::STATE_REQUEST_NON_OPERATIONAL; ThermalComponentIF::STATE_REQUEST_NON_OPERATIONAL;
thermalSet->commit(PoolVariableIF::VALID); thermalSet->heaterRequest.setValid(true);
thermalSet->commit();
} }
} }
@ -285,7 +280,7 @@ void DeviceHandlerBase::readCommandQueue() {
return; return;
} }
result = hkManager.handleHousekeepingMessage(&command); result = poolManager.handleHousekeepingMessage(&command);
if (result == RETURN_OK) { if (result == RETURN_OK) {
return; return;
} }
@ -580,7 +575,8 @@ void DeviceHandlerBase::replyToCommand(ReturnValue_t status,
void DeviceHandlerBase::replyToReply(DeviceReplyMap::iterator iter, void DeviceHandlerBase::replyToReply(DeviceReplyMap::iterator iter,
ReturnValue_t status) { ReturnValue_t status) {
//No need to check if iter exists, as this is checked by callers. If someone else uses the method, add check. // No need to check if iter exists, as this is checked by callers.
// If someone else uses the method, add check.
if (iter->second.command == deviceCommandMap.end()) { if (iter->second.command == deviceCommandMap.end()) {
//Is most likely periodic reply. Silent return. //Is most likely periodic reply. Silent return.
return; return;
@ -588,7 +584,8 @@ void DeviceHandlerBase::replyToReply(DeviceReplyMap::iterator iter,
// Check if more replies are expected. If so, do nothing. // Check if more replies are expected. If so, do nothing.
DeviceCommandInfo* info = &(iter->second.command->second); DeviceCommandInfo* info = &(iter->second.command->second);
if (--info->expectedReplies == 0) { if (--info->expectedReplies == 0) {
//Check if it was transition or internal command. Don't send any replies in that case. // Check if it was transition or internal command.
// Don't send any replies in that case.
if (info->sendReplyTo != NO_COMMANDER) { if (info->sendReplyTo != NO_COMMANDER) {
actionHelper.finish(info->sendReplyTo, iter->first, status); actionHelper.finish(info->sendReplyTo, iter->first, status);
} }
@ -720,10 +717,9 @@ void DeviceHandlerBase::parseReply(const uint8_t* receivedData,
case RETURN_OK: case RETURN_OK:
handleReply(receivedData, foundId, foundLen); handleReply(receivedData, foundId, foundLen);
if(foundLen == 0) { if(foundLen == 0) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::warning << "DeviceHandlerBase::parseReply: foundLen is 0!" "parseReply", ObjectManagerIF::CHILD_INIT_FAILED,
" Packet parsing will be stuck." << std::endl; "Found length is one, parsing might be stuck");
#endif
} }
break; break;
case APERIODIC_REPLY: { case APERIODIC_REPLY: {
@ -734,6 +730,9 @@ void DeviceHandlerBase::parseReply(const uint8_t* receivedData,
foundId); foundId);
} }
if(foundLen == 0) { if(foundLen == 0) {
printWarningOrError(sif::OutputTypes::OUT_ERROR,
"parseReply", ObjectManagerIF::CHILD_INIT_FAILED,
"Power switcher set but no valid object found.");
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "DeviceHandlerBase::parseReply: foundLen is 0!" sif::warning << "DeviceHandlerBase::parseReply: foundLen is 0!"
" Packet parsing will be stuck." << std::endl; " Packet parsing will be stuck." << std::endl;
@ -746,7 +745,8 @@ void DeviceHandlerBase::parseReply(const uint8_t* receivedData,
case IGNORE_FULL_PACKET: case IGNORE_FULL_PACKET:
return; return;
default: default:
//We need to wait for timeout.. don't know what command failed and who sent it. // We need to wait for timeout.. don't know what command failed
// and who sent it.
replyRawReplyIfnotWiretapped(receivedData, foundLen); replyRawReplyIfnotWiretapped(receivedData, foundLen);
triggerEvent(DEVICE_READING_REPLY_FAILED, result, foundLen); triggerEvent(DEVICE_READING_REPLY_FAILED, result, foundLen);
break; break;
@ -967,7 +967,8 @@ ReturnValue_t DeviceHandlerBase::getStateOfSwitches(void) {
} }
Mode_t DeviceHandlerBase::getBaseMode(Mode_t transitionMode) { Mode_t DeviceHandlerBase::getBaseMode(Mode_t transitionMode) {
//only child action special modes are handled, as a child should never see any base action modes // only child action special modes are handled, as a child should
// never see any base action modes
if (transitionMode == _MODE_START_UP) { if (transitionMode == _MODE_START_UP) {
return _MODE_TO_ON; return _MODE_TO_ON;
} }
@ -1291,11 +1292,10 @@ void DeviceHandlerBase::buildInternalCommand(void) {
result = buildNormalDeviceCommand(&deviceCommandId); result = buildNormalDeviceCommand(&deviceCommandId);
if (result == BUSY) { if (result == BUSY) {
// so we can track misconfigurations // so we can track misconfigurations
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::debug << std::hex << getObjectId() "buildInternalCommand",
<< ": DHB::buildInternalCommand: Busy" << std::dec HasReturnvaluesIF::RETURN_FAILED,
<< std::endl; "Busy.");
#endif
result = NOTHING_TO_SEND; //no need to report this result = NOTHING_TO_SEND; //no need to report this
} }
} }
@ -1319,12 +1319,15 @@ void DeviceHandlerBase::buildInternalCommand(void) {
if (iter == deviceCommandMap.end()) { if (iter == deviceCommandMap.end()) {
result = COMMAND_NOT_SUPPORTED; result = COMMAND_NOT_SUPPORTED;
} else if (iter->second.isExecuting) { } else if (iter->second.isExecuting) {
#if FSFW_DISABLE_PRINTOUT == 0
char output[36];
sprintf(output, "Command 0x%08x is executing",
static_cast<unsigned int>(deviceCommandId));
// so we can track misconfigurations // so we can track misconfigurations
#if FSFW_CPP_OSTREAM_ENABLED == 1 printWarningOrError(sif::OutputTypes::OUT_WARNING,
sif::debug << std::hex << getObjectId() "buildInternalCommand",
<< ": DHB::buildInternalCommand: Command " HasReturnvaluesIF::RETURN_FAILED,
<< deviceCommandId << " isExecuting" << std::dec output);
<< std::endl;
#endif #endif
// this is an internal command, no need to report a failure here, // this is an internal command, no need to report a failure here,
// missed reply will track if a reply is too late, otherwise, it's ok // missed reply will track if a reply is too late, otherwise, it's ok
@ -1418,7 +1421,7 @@ void DeviceHandlerBase::performOperationHook() {
} }
ReturnValue_t DeviceHandlerBase::initializeLocalDataPool( ReturnValue_t DeviceHandlerBase::initializeLocalDataPool(
LocalDataPool &localDataPoolMap, localpool::DataPool &localDataPoolMap,
LocalDataPoolManager& poolManager) { LocalDataPoolManager& poolManager) {
if(thermalSet != nullptr) { if(thermalSet != nullptr) {
localDataPoolMap.emplace(thermalSet->thermalStatePoolId, localDataPoolMap.emplace(thermalSet->thermalStatePoolId,
@ -1429,18 +1432,13 @@ ReturnValue_t DeviceHandlerBase::initializeLocalDataPool(
return RETURN_OK; return RETURN_OK;
} }
LocalDataPoolManager* DeviceHandlerBase::getHkManagerHandle() {
return &hkManager;
}
ReturnValue_t DeviceHandlerBase::initializeAfterTaskCreation() { ReturnValue_t DeviceHandlerBase::initializeAfterTaskCreation() {
// In this function, the task handle should be valid if the task // In this function, the task handle should be valid if the task
// was implemented correctly. We still check to be 1000 % sure :-) // was implemented correctly. We still check to be 1000 % sure :-)
if(executingTask != nullptr) { if(executingTask != nullptr) {
pstIntervalMs = executingTask->getPeriodMs(); pstIntervalMs = executingTask->getPeriodMs();
} }
this->hkManager.initializeAfterTaskCreation(); this->poolManager.initializeAfterTaskCreation();
if(setStartupImmediately) { if(setStartupImmediately) {
startTransition(MODE_ON, SUBMODE_NONE); startTransition(MODE_ON, SUBMODE_NONE);
@ -1484,3 +1482,56 @@ void DeviceHandlerBase::setNormalDatapoolEntriesInvalid() {
} }
} }
} }
AccessPoolManagerIF* DeviceHandlerBase::getAccessorHandle() {
return &poolManager;
}
void DeviceHandlerBase::printWarningOrError(sif::OutputTypes errorType,
const char *functionName, ReturnValue_t errorCode,
const char *errorPrint) {
if(errorPrint == nullptr) {
if(errorCode == ObjectManagerIF::CHILD_INIT_FAILED) {
errorPrint = "Initialization error";
}
if(errorCode == HasReturnvaluesIF::RETURN_FAILED) {
if(errorType == sif::OutputTypes::OUT_WARNING) {
errorPrint = "Generic Warning";
}
else {
errorPrint = "Generic Error";
}
}
else {
errorPrint = "Unknown error";
}
}
if(errorType == sif::OutputTypes::OUT_WARNING) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "DeviceHandlerBase::" << functionName << ": Object ID "
<< std::hex << std::setw(8) << std::setfill('0')
<< this->getObjectId() << " | " << errorPrint << std::dec
<< std::setfill(' ') << std::endl;
#else
sif::printWarning("DeviceHandlerBase::%s: Object ID 0x%08x | %s\n",
this->getObjectId(), errorPrint);
#endif
}
else if(errorType == sif::OutputTypes::OUT_ERROR) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "DeviceHandlerBase::" << functionName << ": Object ID "
<< std::hex << std::setw(8) << std::setfill('0')
<< this->getObjectId() << " | " << errorPrint << std::dec
<< std::setfill(' ') << std::endl;
#else
sif::printError("DeviceHandlerBase::%s: Object ID 0x%08x | %s\n",
this->getObjectId(), errorPrint);
#endif
}
}
ProvidesDataPoolSubscriptionIF* DeviceHandlerBase::getSubscriptionInterface() {
return &poolManager;
}

View File

@ -6,6 +6,8 @@
#include "DeviceHandlerFailureIsolation.h" #include "DeviceHandlerFailureIsolation.h"
#include "DeviceHandlerThermalSet.h" #include "DeviceHandlerThermalSet.h"
#include "../serviceinterface/ServiceInterface.h"
#include "../serviceinterface/serviceInterfaceDefintions.h"
#include "../objectmanager/SystemObject.h" #include "../objectmanager/SystemObject.h"
#include "../tasks/ExecutableObjectIF.h" #include "../tasks/ExecutableObjectIF.h"
#include "../returnvalues/HasReturnvaluesIF.h" #include "../returnvalues/HasReturnvaluesIF.h"
@ -512,11 +514,18 @@ protected:
* @param localDataPoolMap * @param localDataPoolMap
* @return * @return
*/ */
virtual ReturnValue_t initializeLocalDataPool(LocalDataPool& localDataPoolMap, virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) override; LocalDataPoolManager& poolManager) override;
/** Get the HK manager object handle */ /**
virtual LocalDataPoolManager* getHkManagerHandle() override; * Provides the subscription handle which can be used by classes like controllers
* to get messages on data updates.
* @return
*/
ProvidesDataPoolSubscriptionIF* getSubscriptionInterface() override;
//! Accessor handle required for internal handling.
AccessPoolManagerIF* getAccessorHandle() override;
/** /**
* @brief Hook function for child handlers which is called once per * @brief Hook function for child handlers which is called once per
@ -646,7 +655,7 @@ protected:
/** Action helper for HasActionsIF */ /** Action helper for HasActionsIF */
ActionHelper actionHelper; ActionHelper actionHelper;
/** Housekeeping Manager */ /** Housekeeping Manager */
LocalDataPoolManager hkManager; LocalDataPoolManager poolManager;
/** /**
* @brief Information about commands * @brief Information about commands
@ -1111,7 +1120,7 @@ private:
/** /**
* @brief The mode the current transition originated from * @brief The mode the current transition originated from
* *
* This is private so the child can not change it and fuck up the timeouts * This is private so the child can not change it and mess up the timeouts
* *
* IMPORTANT: This is not valid during _MODE_SHUT_DOWN and _MODE_START_UP!! * IMPORTANT: This is not valid during _MODE_SHUT_DOWN and _MODE_START_UP!!
* (it is _MODE_POWER_DOWN during this modes) * (it is _MODE_POWER_DOWN during this modes)
@ -1190,7 +1199,8 @@ private:
* Check if the RMAP sendWrite action was successful. * Check if the RMAP sendWrite action was successful.
* *
* Depending on the result, the following is done * Depending on the result, the following is done
* - if the device command was external commanded, a reply is sent indicating the result * - if the device command was external commanded, a reply is sent
* indicating the result
* - if the action was successful, the reply timout counter is initialized * - if the action was successful, the reply timout counter is initialized
*/ */
void doGetWrite(void); void doGetWrite(void);
@ -1206,9 +1216,9 @@ private:
/** /**
* Check the getRead reply and the contained data. * Check the getRead reply and the contained data.
* *
* If data was received scanForReply() and, if successful, handleReply() are called. * If data was received scanForReply() and, if successful, handleReply()
* If the current mode is @c MODE_RAW, the received packet is sent to the commanding object * are called. If the current mode is @c MODE_RAW, the received packet
* via commandQueue. * is sent to the commanding object via commandQueue.
*/ */
void doGetRead(void); void doGetRead(void);
@ -1227,7 +1237,7 @@ private:
uint32_t *len); uint32_t *len);
/** /**
* @param modeTo either @c MODE_ON, MODE_NORMAL or MODE_RAW NOTHING ELSE!!! * @param modeTo either @c MODE_ON, MODE_NORMAL or MODE_RAW, nothing else!
*/ */
void setTransition(Mode_t modeTo, Submode_t submodeTo); void setTransition(Mode_t modeTo, Submode_t submodeTo);
@ -1247,6 +1257,11 @@ private:
void handleTransitionToOnMode(Mode_t commandedMode, void handleTransitionToOnMode(Mode_t commandedMode,
Submode_t commandedSubmode); Submode_t commandedSubmode);
void printWarningOrError(sif::OutputTypes errorType,
const char* functionName,
ReturnValue_t errorCode = HasReturnvaluesIF::RETURN_FAILED,
const char* errorPrint = nullptr);
}; };
#endif /* FSFW_DEVICEHANDLERS_DEVICEHANDLERBASE_H_ */ #endif /* FSFW_DEVICEHANDLERS_DEVICEHANDLERBASE_H_ */

View File

@ -1,10 +1,10 @@
#ifndef FSFW_DEVICEHANDLERS_DEVICEHANDLERIF_H_ #ifndef FSFW_DEVICEHANDLERS_DEVICEHANDLERIF_H_
#define FSFW_DEVICEHANDLERS_DEVICEHANDLERIF_H_ #define FSFW_DEVICEHANDLERS_DEVICEHANDLERIF_H_
#include <fsfw/datapoollocal/localPoolDefinitions.h>
#include "DeviceHandlerMessage.h" #include "DeviceHandlerMessage.h"
#include "../action/HasActionsIF.h" #include "../action/HasActionsIF.h"
#include "../datapoollocal/locPoolDefinitions.h"
#include "../events/Event.h" #include "../events/Event.h"
#include "../modes/HasModesIF.h" #include "../modes/HasModesIF.h"
#include "../ipc/MessageQueueSenderIF.h" #include "../ipc/MessageQueueSenderIF.h"

View File

@ -162,9 +162,15 @@ void EventManager::printEvent(EventMessage* message) {
#endif #endif
void EventManager::lockMutex() { void EventManager::lockMutex() {
mutex->lockMutex(MutexIF::BLOCKING); mutex->lockMutex(timeoutType, timeoutMs);
} }
void EventManager::unlockMutex() { void EventManager::unlockMutex() {
mutex->unlockMutex(); mutex->unlockMutex();
} }
void EventManager::setMutexTimeout(MutexIF::TimeoutType timeoutType,
uint32_t timeoutMs) {
this->timeoutType = timeoutType;
this->timeoutMs = timeoutMs;
}

View File

@ -29,6 +29,8 @@ public:
EventManager(object_id_t setObjectId); EventManager(object_id_t setObjectId);
virtual ~EventManager(); virtual ~EventManager();
void setMutexTimeout(MutexIF::TimeoutType timeoutType, uint32_t timeoutMs);
MessageQueueId_t getEventReportQueue(); MessageQueueId_t getEventReportQueue();
ReturnValue_t registerListener(MessageQueueId_t listener, bool forwardAllButSelected = false); ReturnValue_t registerListener(MessageQueueId_t listener, bool forwardAllButSelected = false);
@ -51,6 +53,8 @@ protected:
std::map<MessageQueueId_t, EventMatchTree> listenerList; std::map<MessageQueueId_t, EventMatchTree> listenerList;
MutexIF* mutex = nullptr; MutexIF* mutex = nullptr;
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING;
uint32_t timeoutMs = 20;
static const uint8_t N_POOLS = 3; static const uint8_t N_POOLS = 3;
LocalPool factoryBackend; LocalPool factoryBackend;

View File

@ -10,6 +10,7 @@ CXXSRC += $(wildcard $(FRAMEWORK_PATH)/coordinates/*.cpp)
CXXSRC += $(wildcard $(FRAMEWORK_PATH)/datalinklayer/*.cpp) CXXSRC += $(wildcard $(FRAMEWORK_PATH)/datalinklayer/*.cpp)
CXXSRC += $(wildcard $(FRAMEWORK_PATH)/datapool/*.cpp) CXXSRC += $(wildcard $(FRAMEWORK_PATH)/datapool/*.cpp)
CXXSRC += $(wildcard $(FRAMEWORK_PATH)/datapoollocal/*.cpp) CXXSRC += $(wildcard $(FRAMEWORK_PATH)/datapoollocal/*.cpp)
CXXSRC += $(wildcard $(FRAMEWORK_PATH)/datapoollocal/internal/*.cpp)
CXXSRC += $(wildcard $(FRAMEWORK_PATH)/housekeeping/*.cpp) CXXSRC += $(wildcard $(FRAMEWORK_PATH)/housekeeping/*.cpp)
CXXSRC += $(wildcard $(FRAMEWORK_PATH)/devicehandlers/*.cpp) CXXSRC += $(wildcard $(FRAMEWORK_PATH)/devicehandlers/*.cpp)
CXXSRC += $(wildcard $(FRAMEWORK_PATH)/events/*.cpp) CXXSRC += $(wildcard $(FRAMEWORK_PATH)/events/*.cpp)

View File

@ -1,5 +1,5 @@
#include "arrayprinter.h" #include "arrayprinter.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterface.h"
#include <bitset> #include <bitset>
void arrayprinter::print(const uint8_t *data, size_t size, OutputType type, void arrayprinter::print(const uint8_t *data, size_t size, OutputType type,
@ -9,6 +9,8 @@ void arrayprinter::print(const uint8_t *data, size_t size, OutputType type,
sif::info << "Printing data with size " << size << ": "; sif::info << "Printing data with size " << size << ": ";
} }
sif::info << "["; sif::info << "[";
#else
sif::printInfo("Printing data with size %zu: [", size);
#endif #endif
if(type == OutputType::HEX) { if(type == OutputType::HEX) {
arrayprinter::printHex(data, size, maxCharPerLine); arrayprinter::printHex(data, size, maxCharPerLine);
@ -37,6 +39,8 @@ void arrayprinter::printHex(const uint8_t *data, size_t size,
} }
sif::info << std::dec; sif::info << std::dec;
sif::info << "]" << std::endl; sif::info << "]" << std::endl;
#else
// how much memory to reserve for printout?
#endif #endif
} }
@ -54,6 +58,8 @@ void arrayprinter::printDec(const uint8_t *data, size_t size,
} }
} }
sif::info << "]" << std::endl; sif::info << "]" << std::endl;
#else
// how much memory to reserve for printout?
#endif #endif
} }
@ -65,5 +71,7 @@ void arrayprinter::printBin(const uint8_t *data, size_t size) {
std::bitset<8>(data[i]) << ",\n" << std::flush; std::bitset<8>(data[i]) << ",\n" << std::flush;
} }
sif::info << "]" << std::endl; sif::info << "]" << std::endl;
#else
// how much memory to reserve for printout?
#endif #endif
} }

View File

@ -1,7 +1,7 @@
#ifndef FSFW_HOUSEKEEPING_HOUSEKEEPINGMESSAGE_H_ #ifndef FSFW_HOUSEKEEPING_HOUSEKEEPINGMESSAGE_H_
#define FSFW_HOUSEKEEPING_HOUSEKEEPINGMESSAGE_H_ #define FSFW_HOUSEKEEPING_HOUSEKEEPINGMESSAGE_H_
#include "../datapoollocal/locPoolDefinitions.h" #include "../datapoollocal/localPoolDefinitions.h"
#include "../ipc/CommandMessage.h" #include "../ipc/CommandMessage.h"
#include "../ipc/FwMessageTypes.h" #include "../ipc/FwMessageTypes.h"
#include "../objectmanager/frameworkObjects.h" #include "../objectmanager/frameworkObjects.h"

View File

@ -21,11 +21,11 @@ public:
InternalErrorDataset(object_id_t objectId): InternalErrorDataset(object_id_t objectId):
StaticLocalDataSet(sid_t(objectId , ERROR_SET_ID)) {} StaticLocalDataSet(sid_t(objectId , ERROR_SET_ID)) {}
lp_var_t<uint32_t> tmHits = lp_var_t<uint32_t>(hkManager->getOwner(), lp_var_t<uint32_t> tmHits = lp_var_t<uint32_t>(sid.objectId,
TM_HITS, this); TM_HITS, this);
lp_var_t<uint32_t> queueHits = lp_var_t<uint32_t>(hkManager->getOwner(), lp_var_t<uint32_t> queueHits = lp_var_t<uint32_t>(sid.objectId,
QUEUE_HITS, this); QUEUE_HITS, this);
lp_var_t<uint32_t> storeHits = lp_var_t<uint32_t>(hkManager->getOwner(), lp_var_t<uint32_t> storeHits = lp_var_t<uint32_t>(sid.objectId,
STORE_HITS, this); STORE_HITS, this);
}; };

View File

@ -2,7 +2,7 @@
#include "../ipc/QueueFactory.h" #include "../ipc/QueueFactory.h"
#include "../ipc/MutexFactory.h" #include "../ipc/MutexFactory.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterface.h"
InternalErrorReporter::InternalErrorReporter(object_id_t setObjectId, InternalErrorReporter::InternalErrorReporter(object_id_t setObjectId,
uint32_t messageQueueDepth): SystemObject(setObjectId), uint32_t messageQueueDepth): SystemObject(setObjectId),
@ -23,13 +23,13 @@ void InternalErrorReporter::setDiagnosticPrintout(bool enable) {
} }
ReturnValue_t InternalErrorReporter::performOperation(uint8_t opCode) { ReturnValue_t InternalErrorReporter::performOperation(uint8_t opCode) {
internalErrorDataset.read(INTERNAL_ERROR_MUTEX_TIMEOUT); internalErrorDataset.read(timeoutType, timeoutMs);
uint32_t newQueueHits = getAndResetQueueHits(); uint32_t newQueueHits = getAndResetQueueHits();
uint32_t newTmHits = getAndResetTmHits(); uint32_t newTmHits = getAndResetTmHits();
uint32_t newStoreHits = getAndResetStoreHits(); uint32_t newStoreHits = getAndResetStoreHits();
#if FSFW_ENHANCED_PRINTOUT == 1 #if FSFW_VERBOSE_LEVEL == 1
if(diagnosticPrintout) { if(diagnosticPrintout) {
if((newQueueHits > 0) or (newTmHits > 0) or (newStoreHits > 0)) { if((newQueueHits > 0) or (newTmHits > 0) or (newStoreHits > 0)) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
@ -38,6 +38,11 @@ ReturnValue_t InternalErrorReporter::performOperation(uint8_t opCode) {
sif::debug << "Queue errors: " << newQueueHits << std::endl; sif::debug << "Queue errors: " << newQueueHits << std::endl;
sif::debug << "TM errors: " << newTmHits << std::endl; sif::debug << "TM errors: " << newTmHits << std::endl;
sif::debug << "Store errors: " << newStoreHits << std::endl; sif::debug << "Store errors: " << newStoreHits << std::endl;
#else
sif::printDebug("InternalErrorReporter::performOperation: Errors occured!\n");
sif::printDebug("Queue errors: %lu\n", static_cast<unsigned int>(newQueueHits));
sif::printDebug("TM errors: %lu\n", static_cast<unsigned int>(newTmHits));
sif::printDebug("Store errors: %lu\n", static_cast<unsigned int>(newStoreHits));
#endif #endif
} }
} }
@ -46,8 +51,8 @@ ReturnValue_t InternalErrorReporter::performOperation(uint8_t opCode) {
internalErrorDataset.queueHits.value += newQueueHits; internalErrorDataset.queueHits.value += newQueueHits;
internalErrorDataset.storeHits.value += newStoreHits; internalErrorDataset.storeHits.value += newStoreHits;
internalErrorDataset.tmHits.value += newTmHits; internalErrorDataset.tmHits.value += newTmHits;
internalErrorDataset.setValidity(true, true);
internalErrorDataset.commit(INTERNAL_ERROR_MUTEX_TIMEOUT); internalErrorDataset.commit(timeoutType, timeoutMs);
poolManager.performHkOperation(); poolManager.performHkOperation();
@ -69,7 +74,7 @@ void InternalErrorReporter::lostTm() {
uint32_t InternalErrorReporter::getAndResetQueueHits() { uint32_t InternalErrorReporter::getAndResetQueueHits() {
uint32_t value; uint32_t value;
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
value = queueHits; value = queueHits;
queueHits = 0; queueHits = 0;
mutex->unlockMutex(); mutex->unlockMutex();
@ -78,21 +83,21 @@ uint32_t InternalErrorReporter::getAndResetQueueHits() {
uint32_t InternalErrorReporter::getQueueHits() { uint32_t InternalErrorReporter::getQueueHits() {
uint32_t value; uint32_t value;
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
value = queueHits; value = queueHits;
mutex->unlockMutex(); mutex->unlockMutex();
return value; return value;
} }
void InternalErrorReporter::incrementQueueHits() { void InternalErrorReporter::incrementQueueHits() {
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
queueHits++; queueHits++;
mutex->unlockMutex(); mutex->unlockMutex();
} }
uint32_t InternalErrorReporter::getAndResetTmHits() { uint32_t InternalErrorReporter::getAndResetTmHits() {
uint32_t value; uint32_t value;
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
value = tmHits; value = tmHits;
tmHits = 0; tmHits = 0;
mutex->unlockMutex(); mutex->unlockMutex();
@ -101,14 +106,14 @@ uint32_t InternalErrorReporter::getAndResetTmHits() {
uint32_t InternalErrorReporter::getTmHits() { uint32_t InternalErrorReporter::getTmHits() {
uint32_t value; uint32_t value;
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
value = tmHits; value = tmHits;
mutex->unlockMutex(); mutex->unlockMutex();
return value; return value;
} }
void InternalErrorReporter::incrementTmHits() { void InternalErrorReporter::incrementTmHits() {
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
tmHits++; tmHits++;
mutex->unlockMutex(); mutex->unlockMutex();
} }
@ -119,7 +124,7 @@ void InternalErrorReporter::storeFull() {
uint32_t InternalErrorReporter::getAndResetStoreHits() { uint32_t InternalErrorReporter::getAndResetStoreHits() {
uint32_t value; uint32_t value;
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
value = storeHits; value = storeHits;
storeHits = 0; storeHits = 0;
mutex->unlockMutex(); mutex->unlockMutex();
@ -128,14 +133,18 @@ uint32_t InternalErrorReporter::getAndResetStoreHits() {
uint32_t InternalErrorReporter::getStoreHits() { uint32_t InternalErrorReporter::getStoreHits() {
uint32_t value; uint32_t value;
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
value = storeHits; value = storeHits;
mutex->unlockMutex(); mutex->unlockMutex();
return value; return value;
} }
AccessPoolManagerIF* InternalErrorReporter::getAccessorHandle() {
return &poolManager;
}
void InternalErrorReporter::incrementStoreHits() { void InternalErrorReporter::incrementStoreHits() {
mutex->lockMutex(MutexIF::WAITING, INTERNAL_ERROR_MUTEX_TIMEOUT); mutex->lockMutex(timeoutType, timeoutMs);
storeHits++; storeHits++;
mutex->unlockMutex(); mutex->unlockMutex();
} }
@ -149,7 +158,7 @@ MessageQueueId_t InternalErrorReporter::getCommandQueue() const {
} }
ReturnValue_t InternalErrorReporter::initializeLocalDataPool( ReturnValue_t InternalErrorReporter::initializeLocalDataPool(
LocalDataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) {
localDataPoolMap.emplace(errorPoolIds::TM_HITS, localDataPoolMap.emplace(errorPoolIds::TM_HITS,
new PoolEntry<uint32_t>()); new PoolEntry<uint32_t>());
localDataPoolMap.emplace(errorPoolIds::QUEUE_HITS, localDataPoolMap.emplace(errorPoolIds::QUEUE_HITS,
@ -162,10 +171,6 @@ ReturnValue_t InternalErrorReporter::initializeLocalDataPool(
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
LocalDataPoolManager* InternalErrorReporter::getHkManagerHandle() {
return &poolManager;
}
dur_millis_t InternalErrorReporter::getPeriodicOperationFrequency() const { dur_millis_t InternalErrorReporter::getPeriodicOperationFrequency() const {
return this->executingTask->getPeriodMs(); return this->executingTask->getPeriodMs();
} }
@ -190,3 +195,12 @@ ReturnValue_t InternalErrorReporter::initializeAfterTaskCreation() {
return poolManager.initializeAfterTaskCreation(); return poolManager.initializeAfterTaskCreation();
} }
void InternalErrorReporter::setMutexTimeout(MutexIF::TimeoutType timeoutType,
uint32_t timeoutMs) {
this->timeoutType = timeoutType;
this->timeoutMs = timeoutMs;
}
ProvidesDataPoolSubscriptionIF* InternalErrorReporter::getSubscriptionInterface() {
return &poolManager;
}

View File

@ -22,7 +22,6 @@ class InternalErrorReporter: public SystemObject,
public InternalErrorReporterIF, public InternalErrorReporterIF,
public HasLocalDataPoolIF { public HasLocalDataPoolIF {
public: public:
static constexpr uint8_t INTERNAL_ERROR_MUTEX_TIMEOUT = 20;
InternalErrorReporter(object_id_t setObjectId, InternalErrorReporter(object_id_t setObjectId,
uint32_t messageQueueDepth = 5); uint32_t messageQueueDepth = 5);
@ -34,16 +33,20 @@ public:
*/ */
void setDiagnosticPrintout(bool enable); void setDiagnosticPrintout(bool enable);
void setMutexTimeout(MutexIF::TimeoutType timeoutType,
uint32_t timeoutMs);
virtual ~InternalErrorReporter(); virtual ~InternalErrorReporter();
virtual object_id_t getObjectId() const override; virtual object_id_t getObjectId() const override;
virtual MessageQueueId_t getCommandQueue() const override; virtual MessageQueueId_t getCommandQueue() const override;
virtual ReturnValue_t initializeLocalDataPool( virtual ReturnValue_t initializeLocalDataPool(
LocalDataPool& localDataPoolMap, localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) override; LocalDataPoolManager& poolManager) override;
virtual LocalDataPoolManager* getHkManagerHandle() override;
virtual dur_millis_t getPeriodicOperationFrequency() const override; virtual dur_millis_t getPeriodicOperationFrequency() const override;
virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override; virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
ProvidesDataPoolSubscriptionIF* getSubscriptionInterface() override;
AccessPoolManagerIF* getAccessorHandle() override;
virtual ReturnValue_t initialize() override; virtual ReturnValue_t initialize() override;
virtual ReturnValue_t initializeAfterTaskCreation() override; virtual ReturnValue_t initializeAfterTaskCreation() override;
@ -61,7 +64,11 @@ protected:
LocalDataPoolManager poolManager; LocalDataPoolManager poolManager;
PeriodicTaskIF* executingTask = nullptr; PeriodicTaskIF* executingTask = nullptr;
MutexIF* mutex = nullptr; MutexIF* mutex = nullptr;
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING;
uint32_t timeoutMs = 20;
sid_t internalErrorSid; sid_t internalErrorSid;
InternalErrorDataset internalErrorDataset; InternalErrorDataset internalErrorDataset;

View File

@ -14,7 +14,7 @@ public:
/** /**
* Different types of timeout for the mutex lock. * Different types of timeout for the mutex lock.
*/ */
enum TimeoutType { enum class TimeoutType {
POLLING, //!< If mutex is not available, return immediately POLLING, //!< If mutex is not available, return immediately
WAITING, //!< Wait a specified time for the mutex to become available WAITING, //!< Wait a specified time for the mutex to become available
BLOCKING //!< Block indefinitely until the mutex becomes available. BLOCKING //!< Block indefinitely until the mutex becomes available.

View File

@ -5,7 +5,7 @@
#include "MonitoringIF.h" #include "MonitoringIF.h"
#include "MonitoringMessageContent.h" #include "MonitoringMessageContent.h"
#include "../datapoollocal/locPoolDefinitions.h" #include "../datapoollocal/localPoolDefinitions.h"
#include "../events/EventManagerIF.h" #include "../events/EventManagerIF.h"
#include "../parameters/HasParametersIF.h" #include "../parameters/HasParametersIF.h"

View File

@ -1,9 +1,10 @@
#ifndef MONITORINGMESSAGECONTENT_H_ #ifndef FSFW_MONITORING_MONITORINGMESSAGECONTENT_H_
#define MONITORINGMESSAGECONTENT_H_ #define FSFW_MONITORING_MONITORINGMESSAGECONTENT_H_
#include "HasMonitorsIF.h" #include "HasMonitorsIF.h"
#include "MonitoringIF.h" #include "MonitoringIF.h"
#include "../datapoollocal/locPoolDefinitions.h"
#include "../datapoollocal/localPoolDefinitions.h"
#include "../objectmanager/ObjectManagerIF.h" #include "../objectmanager/ObjectManagerIF.h"
#include "../serialize/SerialBufferAdapter.h" #include "../serialize/SerialBufferAdapter.h"
#include "../serialize/SerialFixedArrayListAdapter.h" #include "../serialize/SerialFixedArrayListAdapter.h"
@ -85,4 +86,4 @@ private:
template<typename T> template<typename T>
object_id_t MonitoringReportContent<T>::timeStamperId = 0; object_id_t MonitoringReportContent<T>::timeStamperId = 0;
#endif /* MONITORINGMESSAGECONTENT_H_ */ #endif /* FSFW_MONITORING_MONITORINGMESSAGECONTENT_H_ */

View File

@ -163,7 +163,7 @@ ReturnValue_t Clock::setLeapSeconds(const uint16_t leapSeconds_) {
if (checkOrCreateClockMutex() != HasReturnvaluesIF::RETURN_OK) { if (checkOrCreateClockMutex() != HasReturnvaluesIF::RETURN_OK) {
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
ReturnValue_t result = timeMutex->lockMutex(MutexIF::BLOCKING); ReturnValue_t result = timeMutex->lockMutex(MutexIF::TimeoutType::BLOCKING);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }
@ -178,7 +178,7 @@ ReturnValue_t Clock::getLeapSeconds(uint16_t* leapSeconds_) {
if (timeMutex == NULL) { if (timeMutex == NULL) {
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
ReturnValue_t result = timeMutex->lockMutex(MutexIF::BLOCKING); ReturnValue_t result = timeMutex->lockMutex(MutexIF::TimeoutType::BLOCKING);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }

View File

@ -202,7 +202,7 @@ ReturnValue_t Clock::setLeapSeconds(const uint16_t leapSeconds_) {
if(checkOrCreateClockMutex()!=HasReturnvaluesIF::RETURN_OK){ if(checkOrCreateClockMutex()!=HasReturnvaluesIF::RETURN_OK){
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
ReturnValue_t result = timeMutex->lockMutex(MutexIF::BLOCKING); ReturnValue_t result = timeMutex->lockMutex();
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }
@ -217,7 +217,7 @@ ReturnValue_t Clock::getLeapSeconds(uint16_t* leapSeconds_) {
if(timeMutex == nullptr){ if(timeMutex == nullptr){
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
ReturnValue_t result = timeMutex->lockMutex(MutexIF::BLOCKING); ReturnValue_t result = timeMutex->lockMutex();
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }

View File

@ -4,16 +4,16 @@
Mutex::Mutex() {} Mutex::Mutex() {}
ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType, uint32_t timeoutMs) { ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType, uint32_t timeoutMs) {
if(timeoutType == MutexIF::BLOCKING) { if(timeoutType == TimeoutType::BLOCKING) {
mutex.lock(); mutex.lock();
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
else if(timeoutType == MutexIF::POLLING) { else if(timeoutType == TimeoutType::POLLING) {
if(mutex.try_lock()) { if(mutex.try_lock()) {
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
} }
else if(timeoutMs > MutexIF::POLLING){ else if(timeoutType == TimeoutType::WAITING){
auto chronoMs = std::chrono::milliseconds(timeoutMs); auto chronoMs = std::chrono::milliseconds(timeoutMs);
if(mutex.try_lock_for(chronoMs)) { if(mutex.try_lock_for(chronoMs)) {
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;

View File

@ -22,7 +22,6 @@ public:
std::timed_mutex* getMutexHandle(); std::timed_mutex* getMutexHandle();
private: private:
//bool locked = false;
std::timed_mutex mutex; std::timed_mutex mutex;
}; };

View File

@ -1,10 +1,11 @@
#include "BinarySemaphore.h" #include "BinarySemaphore.h"
#include "../../serviceinterface/ServiceInterfacePrinter.h"
#include "../../serviceinterface/ServiceInterfaceStream.h" #include "../../serviceinterface/ServiceInterfaceStream.h"
extern "C" { #include <time.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
}
BinarySemaphore::BinarySemaphore() { BinarySemaphore::BinarySemaphore() {
// Using unnamed semaphores for now // Using unnamed semaphores for now
@ -113,7 +114,8 @@ uint8_t BinarySemaphore::getSemaphoreCounter(sem_t *handle) {
} }
else if(result != 0 and errno == EINVAL) { else if(result != 0 and errno == EINVAL) {
// Could be called from interrupt, use lightweight printf // Could be called from interrupt, use lightweight printf
printf("BinarySemaphore::getSemaphoreCounter: Invalid semaphore\n"); sif::printError("BinarySemaphore::getSemaphoreCounter: "
"Invalid semaphore\n");
return 0; return 0;
} }
else { else {
@ -128,15 +130,19 @@ void BinarySemaphore::initSemaphore(uint8_t initCount) {
switch(errno) { switch(errno) {
case(EINVAL): case(EINVAL):
// Value exceeds SEM_VALUE_MAX // Value exceeds SEM_VALUE_MAX
case(ENOSYS): case(ENOSYS): {
// System does not support process-shared semaphores // System does not support process-shared semaphores
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "BinarySemaphore: Init failed with" << strerror(errno) sif::error << "BinarySemaphore: Init failed with "
<< std::endl; << strerror(errno) << std::endl;
#else
sif::printError("BinarySemaphore: Init failed with %s\n",
strerror(errno));
#endif #endif
} }
} }
} }
}
ReturnValue_t BinarySemaphore::checkCount(sem_t* handle, uint8_t maxCount) { ReturnValue_t BinarySemaphore::checkCount(sem_t* handle, uint8_t maxCount) {
int value = getSemaphoreCounter(handle); int value = getSemaphoreCounter(handle);

View File

@ -182,7 +182,7 @@ ReturnValue_t Clock::setLeapSeconds(const uint16_t leapSeconds_) {
if(checkOrCreateClockMutex()!=HasReturnvaluesIF::RETURN_OK){ if(checkOrCreateClockMutex()!=HasReturnvaluesIF::RETURN_OK){
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
ReturnValue_t result = timeMutex->lockMutex(MutexIF::BLOCKING); ReturnValue_t result = timeMutex->lockMutex(MutexIF::TimeoutType::BLOCKING);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }
@ -197,7 +197,7 @@ ReturnValue_t Clock::getLeapSeconds(uint16_t* leapSeconds_) {
if(timeMutex==NULL){ if(timeMutex==NULL){
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
ReturnValue_t result = timeMutex->lockMutex(MutexIF::BLOCKING); ReturnValue_t result = timeMutex->lockMutex(MutexIF::TimeoutType::BLOCKING);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
return result; return result;
} }
@ -209,13 +209,13 @@ ReturnValue_t Clock::getLeapSeconds(uint16_t* leapSeconds_) {
} }
ReturnValue_t Clock::checkOrCreateClockMutex(){ ReturnValue_t Clock::checkOrCreateClockMutex(){
if(timeMutex==NULL){ if(timeMutex == nullptr){
MutexFactory* mutexFactory = MutexFactory::instance(); MutexFactory* mutexFactory = MutexFactory::instance();
if (mutexFactory == NULL) { if (mutexFactory == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
timeMutex = mutexFactory->createMutex(); timeMutex = mutexFactory->createMutex();
if (timeMutex == NULL) { if (timeMutex == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }
} }

View File

@ -1,5 +1,7 @@
#include "../../osal/linux/CountingSemaphore.h" #include "../../osal/linux/CountingSemaphore.h"
#include "../../serviceinterface/ServiceInterfaceStream.h" #include "../../serviceinterface/ServiceInterface.h"
#include <errno.h>
CountingSemaphore::CountingSemaphore(const uint8_t maxCount, uint8_t initCount): CountingSemaphore::CountingSemaphore(const uint8_t maxCount, uint8_t initCount):
maxCount(maxCount), initCount(initCount) { maxCount(maxCount), initCount(initCount) {

View File

@ -1,5 +1,5 @@
#include "MessageQueue.h" #include "MessageQueue.h"
#include "../../serviceinterface/ServiceInterfaceStream.h" #include "../../serviceinterface/ServiceInterface.h"
#include "../../objectmanager/ObjectManagerIF.h" #include "../../objectmanager/ObjectManagerIF.h"
#include <fstream> #include <fstream>
@ -121,14 +121,16 @@ ReturnValue_t MessageQueue::handleError(mq_attr* attributes,
break; break;
} }
default: default: {
// Failed either the first time or the second time // Failed either the first time or the second time
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "MessageQueue::MessageQueue: Creating Queue " << std::hex sif::error << "MessageQueue::MessageQueue: Creating Queue " << name
<< name << std::dec << " failed with status: " << " failed with status: " << strerror(errno) << std::endl;
<< strerror(errno) << std::endl; #else
sif::printError("MessageQueue::MessageQueue: Creating Queue %s"
" failed with status: %s\n", name, strerror(errno));
#endif #endif
}
} }
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;

View File

@ -1,6 +1,6 @@
#include "PosixThread.h" #include "PosixThread.h"
#include "../../serviceinterface/ServiceInterfaceStream.h" #include "../../serviceinterface/ServiceInterface.h"
#include <cstring> #include <cstring>
#include <errno.h> #include <errno.h>
@ -146,16 +146,22 @@ void PosixThread::createTask(void* (*fnc_)(void*), void* arg_) {
strerror(status) << std::endl; strerror(status) << std::endl;
#endif #endif
if(errno == ENOMEM) { if(errno == ENOMEM) {
uint64_t stackMb = stackSize/10e6; size_t stackMb = stackSize/10e6;
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "PosixThread::createTask: Insufficient memory for" sif::error << "PosixThread::createTask: Insufficient memory for"
" the requested " << stackMb << " MB" << std::endl; " the requested " << stackMb << " MB" << std::endl;
#else
sif::printError("PosixThread::createTask: Insufficient memory for "
"the requested %zu MB\n", stackMb);
#endif #endif
} }
else if(errno == EINVAL) { else if(errno == EINVAL) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "PosixThread::createTask: Wrong alignment argument!" sif::error << "PosixThread::createTask: Wrong alignment argument!"
<< std::endl; << std::endl;
#else
sif::printError("PosixThread::createTask: "
"Wrong alignment argument!\n");
#endif #endif
} }
return; return;

View File

@ -1,6 +1,8 @@
#include "TcUnixUdpPollingTask.h" #include "TcUnixUdpPollingTask.h"
#include "../../globalfunctions/arrayprinter.h" #include "../../globalfunctions/arrayprinter.h"
#include <errno.h>
TcUnixUdpPollingTask::TcUnixUdpPollingTask(object_id_t objectId, TcUnixUdpPollingTask::TcUnixUdpPollingTask(object_id_t objectId,
object_id_t tmtcUnixUdpBridge, size_t frameSize, object_id_t tmtcUnixUdpBridge, size_t frameSize,
double timeoutSeconds): SystemObject(objectId), double timeoutSeconds): SystemObject(objectId),

View File

@ -1,5 +1,5 @@
#include "TmTcUnixUdpBridge.h" #include "TmTcUnixUdpBridge.h"
#include "../../serviceinterface/ServiceInterfaceStream.h" #include "../../serviceinterface/ServiceInterface.h"
#include "../../ipc/MutexHelper.h" #include "../../ipc/MutexHelper.h"
#include <errno.h> #include <errno.h>
@ -188,13 +188,17 @@ void TmTcUnixUdpBridge::handleBindError() {
void TmTcUnixUdpBridge::handleSendError() { void TmTcUnixUdpBridge::handleSendError() {
switch(errno) { switch(errno) {
default: default: {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "TmTcUnixBridge::handleSendError: " sif::error << "TmTcUnixBridge::handleSendError: "
<< strerror(errno) << std::endl; << strerror(errno) << std::endl;
#else
sif::printError("TmTcUnixBridge::handleSendError: %s\n",
strerror(errno));
#endif #endif
} }
} }
}
void TmTcUnixUdpBridge::setClientAddressToAny(bool ipAddrAnySet){ void TmTcUnixUdpBridge::setClientAddressToAny(bool ipAddrAnySet){
this->ipAddrAnySet = ipAddrAnySet; this->ipAddrAnySet = ipAddrAnySet;

View File

@ -30,11 +30,11 @@ Mutex::~Mutex() {
ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType = ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType =
TimeoutType::BLOCKING, uint32_t timeoutMs) { TimeoutType::BLOCKING, uint32_t timeoutMs) {
rtems_status_code status = RTEMS_INVALID_ID; rtems_status_code status = RTEMS_INVALID_ID;
if(timeoutMs == MutexIF::TimeoutType::BLOCKING) { if(timeoutType == MutexIF::TimeoutType::BLOCKING) {
status = rtems_semaphore_obtain(mutexId, status = rtems_semaphore_obtain(mutexId,
RTEMS_WAIT, RTEMS_NO_TIMEOUT); RTEMS_WAIT, RTEMS_NO_TIMEOUT);
} }
else if(timeoutMs == MutexIF::TimeoutType::POLLING) { else if(timeoutType == MutexIF::TimeoutType::POLLING) {
timeoutMs = RTEMS_NO_TIMEOUT; timeoutMs = RTEMS_NO_TIMEOUT;
status = rtems_semaphore_obtain(mutexId, status = rtems_semaphore_obtain(mutexId,
RTEMS_NO_WAIT, 0); RTEMS_NO_WAIT, 0);

View File

@ -65,8 +65,8 @@ ReturnValue_t Fuse::check() {
set.read(); set.read();
if (!healthHelper.healthTable->isHealthy(getObjectId())) { if (!healthHelper.healthTable->isHealthy(getObjectId())) {
setAllMonitorsToUnchecked(); setAllMonitorsToUnchecked();
set.commit(PoolVariableIF::INVALID); set.setValidity(false, true);
return RETURN_OK; return set.commit();
} }
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
checkFuseState(); checkFuseState();
@ -206,7 +206,8 @@ float Fuse::getPower() {
void Fuse::setDataPoolEntriesInvalid() { void Fuse::setDataPoolEntriesInvalid() {
set.read(); set.read();
set.commit(PoolVariableIF::INVALID); set.setValidity(false, true);
set.commit();
} }
ReturnValue_t Fuse::getParameter(uint8_t domainId, uint16_t parameterId, ReturnValue_t Fuse::getParameter(uint8_t domainId, uint16_t parameterId,

View File

@ -97,7 +97,8 @@ void PowerSensor::checkCommandQueue() {
void PowerSensor::setDataPoolEntriesInvalid() { void PowerSensor::setDataPoolEntriesInvalid() {
powerSensorSet.read(); powerSensorSet.read();
powerSensorSet.commit(PoolVariableIF::INVALID); powerSensorSet.setValidity(false, true);
powerSensorSet.commit();
} }
float PowerSensor::getPower() { float PowerSensor::getPower() {

View File

@ -3,7 +3,9 @@
ReturnValue_t unitt::put_error(std::string errorId) { ReturnValue_t unitt::put_error(std::string errorId) {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "Unit Tester error: Failed at test ID " sif::error << "Unit Tester error: Failed at test ID "
<< errorId << "\n" << std::flush; << errorId << std::endl;
#endif #else
sif::printError("Unit Tester error: Failed at test ID 0x%08x", errorId);
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
return HasReturnvaluesIF::RETURN_FAILED; return HasReturnvaluesIF::RETURN_FAILED;
} }

View File

@ -2,9 +2,10 @@
#define UNITTEST_INTERNAL_UNITTDEFINITIONS_H_ #define UNITTEST_INTERNAL_UNITTDEFINITIONS_H_
#include "../../returnvalues/HasReturnvaluesIF.h" #include "../../returnvalues/HasReturnvaluesIF.h"
#include "../../serviceinterface/ServiceInterfaceStream.h" #include "../../serviceinterface/ServiceInterface.h"
#include <cstdint> #include <cstdint>
#include <cstddef> #include <cstddef>
#include <string>
namespace tv { namespace tv {
// POD test values // POD test values

View File

@ -13,7 +13,7 @@
void testmutex::testMutex() { void testmutex::testMutex() {
std::string id = "[testMutex]"; std::string id = "[testMutex]";
MutexIF* mutex = MutexFactory::instance()->createMutex(); MutexIF* mutex = MutexFactory::instance()->createMutex();
auto result = mutex->lockMutex(MutexIF::POLLING); auto result = mutex->lockMutex(MutexIF::TimeoutType::POLLING);
if(result != HasReturnvaluesIF::RETURN_OK) { if(result != HasReturnvaluesIF::RETURN_OK) {
unitt::put_error(id); unitt::put_error(id);
} }

View File

@ -2,5 +2,6 @@ add_subdirectory(action)
add_subdirectory(container) add_subdirectory(container)
add_subdirectory(osal) add_subdirectory(osal)
add_subdirectory(serialize) add_subdirectory(serialize)
add_subdirectory(datapoollocal)
add_subdirectory(storagemanager) add_subdirectory(storagemanager)

View File

@ -4,9 +4,12 @@
#include <fsfw/action/ActionHelper.h> #include <fsfw/action/ActionHelper.h>
#include <fsfw/ipc/CommandMessage.h> #include <fsfw/ipc/CommandMessage.h>
#include <fsfw/unittest/tests/mocks/MessageQueueMockBase.h>
#include <catch2/catch_test_macros.hpp> #include <catch2/catch_test_macros.hpp>
#include <array>
TEST_CASE( "Action Helper" , "[ActionHelper]") { TEST_CASE( "Action Helper" , "[ActionHelper]") {
ActionHelperOwnerMockBase testDhMock; ActionHelperOwnerMockBase testDhMock;

View File

@ -48,85 +48,4 @@ public:
}; };
class MessageQueueMockBase: public MessageQueueIF {
public:
MessageQueueId_t myQueueId = 0;
bool defaultDestSet = false;
bool messageSent = false;
bool wasMessageSent() {
bool tempMessageSent = messageSent;
messageSent = false;
return tempMessageSent;
}
virtual ReturnValue_t reply( MessageQueueMessageIF* message ) {
messageSent = true;
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
return HasReturnvaluesIF::RETURN_OK;
};
virtual ReturnValue_t receiveMessage(MessageQueueMessageIF* message,
MessageQueueId_t *receivedFrom) {
(*message) = lastMessage;
lastMessage.clear();
return HasReturnvaluesIF::RETURN_OK;
}
virtual ReturnValue_t receiveMessage(MessageQueueMessageIF* message) {
memcpy(message->getBuffer(), lastMessage.getBuffer(),
message->getMessageSize());
lastMessage.clear();
return HasReturnvaluesIF::RETURN_OK;
}
virtual ReturnValue_t flush(uint32_t* count) {
return HasReturnvaluesIF::RETURN_OK;
}
virtual MessageQueueId_t getLastPartner() const {
return tconst::testQueueId;
}
virtual MessageQueueId_t getId() const {
return tconst::testQueueId;
}
virtual ReturnValue_t sendMessageFrom( MessageQueueId_t sendTo,
MessageQueueMessageIF* message, MessageQueueId_t sentFrom,
bool ignoreFault = false ) {
messageSent = true;
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
return HasReturnvaluesIF::RETURN_OK;
}
virtual ReturnValue_t sendMessage( MessageQueueId_t sendTo,
MessageQueueMessageIF* message, bool ignoreFault = false ) override {
messageSent = true;
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
return HasReturnvaluesIF::RETURN_OK;
}
virtual ReturnValue_t sendToDefaultFrom( MessageQueueMessageIF* message,
MessageQueueId_t sentFrom, bool ignoreFault = false ) {
messageSent = true;
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
return HasReturnvaluesIF::RETURN_OK;
}
virtual ReturnValue_t sendToDefault( MessageQueueMessageIF* message ) {
messageSent = true;
lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
return HasReturnvaluesIF::RETURN_OK;
}
virtual void setDefaultDestination(MessageQueueId_t defaultDestination) {
myQueueId = defaultDestination;
defaultDestSet = true;
}
virtual MessageQueueId_t getDefaultDestination() const {
return myQueueId;
}
virtual bool isDefaultDestinationSet() const {
return defaultDestSet;
}
private:
MessageQueueMessage lastMessage;
};
#endif /* UNITTEST_TESTFW_NEWTESTS_TESTACTIONHELPER_H_ */ #endif /* UNITTEST_TESTFW_NEWTESTS_TESTACTIONHELPER_H_ */

View File

@ -1,45 +1,48 @@
//#include <fsfw/container/PlacementFactory.h> #include <fsfw/container/PlacementFactory.h>
//#include <fsfw/storagemanager/LocalPool.h> #include <fsfw/storagemanager/LocalPool.h>
//#include <fsfw/returnvalues/HasReturnvaluesIF.h> #include <fsfw/returnvalues/HasReturnvaluesIF.h>
//#include <fsfw/container/ArrayList.h> #include <fsfw/container/ArrayList.h>
//
//#include <catch2/catch.hpp> #include <catch2/catch_test_macros.hpp>
//#include "../../core/CatchDefinitions.h" #include <unittest/core/CatchDefinitions.h>
//
//TEST_CASE( "PlacementFactory Tests", "[TestPlacementFactory]") { TEST_CASE( "PlacementFactory Tests", "[TestPlacementFactory]") {
// INFO("PlacementFactory Tests"); INFO("PlacementFactory Tests");
//
LocalPool::LocalPoolConfig poolCfg= {{1, sizeof(uint16_t)},
{1, sizeof(uint32_t)}, {1, sizeof(uint64_t)}
};
//const uint16_t element_sizes[3] = {sizeof(uint16_t), sizeof(uint32_t), sizeof(uint64_t)}; //const uint16_t element_sizes[3] = {sizeof(uint16_t), sizeof(uint32_t), sizeof(uint64_t)};
//const uint16_t n_elements[3] = {1, 1, 1}; //const uint16_t n_elements[3] = {1, 1, 1};
// LocalPool<3> storagePool(0x1, element_sizes, n_elements, false, true); LocalPool storagePool(0x1, poolCfg, false, true);
// PlacementFactory factory(&storagePool); PlacementFactory factory(&storagePool);
//
// SECTION("Pool overload"){ SECTION("Pool overload"){
// store_address_t address; store_address_t address;
// uint8_t* ptr = nullptr; uint8_t* ptr = nullptr;
// REQUIRE(storagePool.getFreeElement(&address, sizeof(ArrayList<uint32_t, uint16_t>), &ptr) REQUIRE(storagePool.getFreeElement(&address, sizeof(ArrayList<uint32_t, uint16_t>), &ptr)
// == static_cast<int>(StorageManagerIF::DATA_TOO_LARGE)); == static_cast<int>(StorageManagerIF::DATA_TOO_LARGE));
// ArrayList<uint32_t, uint16_t>* list2 = factory.generate<ArrayList<uint32_t, uint16_t> >(80); ArrayList<uint32_t, uint16_t>* list2 = factory.generate<ArrayList<uint32_t, uint16_t> >(80);
// REQUIRE(list2 == nullptr); REQUIRE(list2 == nullptr);
// } }
//
// SECTION("Test generate and destroy"){ SECTION("Test generate and destroy"){
// uint64_t* number = factory.generate<uint64_t>(32000); uint64_t* number = factory.generate<uint64_t>(32000);
// REQUIRE(number != nullptr); REQUIRE(number != nullptr);
// REQUIRE(*number == 32000); REQUIRE(*number == 32000);
// store_address_t address; store_address_t address;
// uint8_t* ptr = nullptr; uint8_t* ptr = nullptr;
// REQUIRE(storagePool.getFreeElement(&address, sizeof(uint64_t), &ptr) REQUIRE(storagePool.getFreeElement(&address, sizeof(uint64_t), &ptr)
// == static_cast<int>(StorageManagerIF::DATA_TOO_LARGE)); == static_cast<int>(StorageManagerIF::DATA_TOO_LARGE));
// uint64_t* number2 = factory.generate<uint64_t>(12345); uint64_t* number2 = factory.generate<uint64_t>(12345);
// REQUIRE(number2 == nullptr); REQUIRE(number2 == nullptr);
// REQUIRE(factory.destroy(number) == static_cast<int>(HasReturnvaluesIF::RETURN_OK)); REQUIRE(factory.destroy(number) == static_cast<int>(HasReturnvaluesIF::RETURN_OK));
// REQUIRE(storagePool.getFreeElement(&address, sizeof(uint64_t), &ptr) REQUIRE(storagePool.getFreeElement(&address, sizeof(uint64_t), &ptr)
// == static_cast<int>(HasReturnvaluesIF::RETURN_OK)); == static_cast<int>(HasReturnvaluesIF::RETURN_OK));
// REQUIRE(storagePool.deleteData(address) == static_cast<int>(HasReturnvaluesIF::RETURN_OK)); REQUIRE(storagePool.deleteData(address) == static_cast<int>(HasReturnvaluesIF::RETURN_OK));
//
// //Check that PlacementFactory checks for nullptr //Check that PlacementFactory checks for nullptr
// ptr = nullptr; ptr = nullptr;
// REQUIRE(factory.destroy(ptr) == static_cast<int>(HasReturnvaluesIF::RETURN_FAILED)); REQUIRE(factory.destroy(ptr) == static_cast<int>(HasReturnvaluesIF::RETURN_FAILED));
// } }
//} }

View File

@ -0,0 +1,6 @@
target_sources(${TARGET_NAME} PRIVATE
LocalPoolVariableTest.cpp
LocalPoolVectorTest.cpp
DataSetTest.cpp
LocalPoolManagerTest.cpp
)

View File

@ -0,0 +1,23 @@
#include "LocalPoolOwnerBase.h"
#include <catch2/catch_test_macros.hpp>
#include <fsfw/datapoollocal/HasLocalDataPoolIF.h>
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
#include <unittest/core/CatchDefinitions.h>
TEST_CASE("LocalDataSet" , "[LocDataSetTest]") {
LocalPoolOwnerBase* poolOwner = objectManager->
get<LocalPoolOwnerBase>(objects::TEST_LOCAL_POOL_OWNER_BASE);
REQUIRE(poolOwner != nullptr);
REQUIRE(poolOwner->initializeHkManager() == retval::CATCH_OK);
REQUIRE(poolOwner->initializeHkManagerAfterTaskCreation()
== retval::CATCH_OK);
const uint32_t setId = 0;
SECTION("BasicTest") {
StaticLocalDataSet<3> localSet = StaticLocalDataSet<3>(
sid_t(objects::TEST_LOCAL_POOL_OWNER_BASE, setId));
}
}

View File

@ -0,0 +1,122 @@
#include "LocalPoolOwnerBase.h"
#include <catch2/catch_test_macros.hpp>
#include <fsfw/datapoollocal/HasLocalDataPoolIF.h>
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
#include <fsfw/ipc/CommandMessageCleaner.h>
#include <unittest/core/CatchDefinitions.h>
TEST_CASE("LocalPoolManagerTest" , "[LocManTest]") {
LocalPoolOwnerBase* poolOwner = objectManager->
get<LocalPoolOwnerBase>(objects::TEST_LOCAL_POOL_OWNER_BASE);
REQUIRE(poolOwner != nullptr);
REQUIRE(poolOwner->initializeHkManager() == retval::CATCH_OK);
REQUIRE(poolOwner->initializeHkManagerAfterTaskCreation()
== retval::CATCH_OK);
REQUIRE(poolOwner->dataset.assignPointers() == retval::CATCH_OK);
MessageQueueMockBase* mqMock = poolOwner->getMockQueueHandle();
REQUIRE(mqMock != nullptr);
CommandMessage messageSent;
uint8_t messagesSent = 0;
SECTION("BasicTest") {
// Subscribe for message generation on update.
REQUIRE(poolOwner->subscribeWrapperSetUpdate() == retval::CATCH_OK);
// Subscribe for an update message.
poolOwner->dataset.setChanged(true);
// Now the update message should be generated.
REQUIRE(poolOwner->poolManager.performHkOperation() == retval::CATCH_OK);
REQUIRE(mqMock->wasMessageSent() == true);
REQUIRE(mqMock->receiveMessage(&messageSent) == retval::CATCH_OK);
CHECK(messageSent.getCommand() == static_cast<int>(
HousekeepingMessage::UPDATE_NOTIFICATION_SET));
// Should have been reset.
CHECK(poolOwner->dataset.hasChanged() == false);
// Set changed again, result should be the same.
poolOwner->dataset.setChanged(true);
REQUIRE(poolOwner->poolManager.performHkOperation() == retval::CATCH_OK);
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
CHECK(messagesSent == 1);
REQUIRE(mqMock->receiveMessage(&messageSent) == retval::CATCH_OK);
CHECK(messageSent.getCommand() == static_cast<int>(
HousekeepingMessage::UPDATE_NOTIFICATION_SET));
// now subscribe for set update HK as well.
REQUIRE(poolOwner->subscribeWrapperSetUpdateHk() == retval::CATCH_OK);
poolOwner->dataset.setChanged(true);
REQUIRE(poolOwner->poolManager.performHkOperation() == retval::CATCH_OK);
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
CHECK(messagesSent == 2);
// first message sent should be the update notification, considering
// the internal list is a vector checked in insertion order.
REQUIRE(mqMock->receiveMessage(&messageSent) == retval::CATCH_OK);
CHECK(messageSent.getCommand() == static_cast<int>(
HousekeepingMessage::UPDATE_NOTIFICATION_SET));
REQUIRE(mqMock->receiveMessage(&messageSent) == retval::CATCH_OK);
CHECK(messageSent.getCommand() == static_cast<int>(
HousekeepingMessage::HK_REPORT));
// clear message to avoid memory leak, our mock won't do it for us (yet)
CommandMessageCleaner::clearCommandMessage(&messageSent);
}
SECTION("AdvancedTests") {
// we need to reset the subscription list because the pool owner
// is a global object.
poolOwner->resetSubscriptionList();
// Subscribe for variable update as well
REQUIRE(not poolOwner->dataset.hasChanged());
REQUIRE(poolOwner->subscribeWrapperVariableUpdate(lpool::uint8VarId) ==
retval::CATCH_OK);
lp_var_t<uint8_t>* poolVar = dynamic_cast<lp_var_t<uint8_t>*>(
poolOwner->getPoolObjectHandle(lpool::uint8VarId));
REQUIRE(poolVar != nullptr);
poolVar->setChanged(true);
REQUIRE(poolOwner->poolManager.performHkOperation() == retval::CATCH_OK);
// Check update notification was sent.
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
CHECK(messagesSent == 1);
// Should have been reset.
CHECK(poolVar->hasChanged() == false);
REQUIRE(mqMock->receiveMessage(&messageSent) == retval::CATCH_OK);
CHECK(messageSent.getCommand() == static_cast<int>(
HousekeepingMessage::UPDATE_NOTIFICATION_VARIABLE));
// now subscribe for the dataset update (HK and update) again
REQUIRE(poolOwner->subscribeWrapperSetUpdate() == retval::CATCH_OK);
REQUIRE(poolOwner->subscribeWrapperSetUpdateHk() == retval::CATCH_OK);
poolOwner->dataset.setChanged(true);
REQUIRE(poolOwner->poolManager.performHkOperation() == retval::CATCH_OK);
// now two messages should be sent.
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
CHECK(messagesSent == 2);
mqMock->clearMessages(true);
poolOwner->dataset.setChanged(true);
poolVar->setChanged(true);
REQUIRE(poolOwner->poolManager.performHkOperation() == retval::CATCH_OK);
// now three messages should be sent.
REQUIRE(mqMock->wasMessageSent(&messagesSent) == true);
CHECK(messagesSent == 3);
REQUIRE(mqMock->receiveMessage(&messageSent) == retval::CATCH_OK);
CHECK(messageSent.getCommand() == static_cast<int>(
HousekeepingMessage::UPDATE_NOTIFICATION_VARIABLE));
REQUIRE(mqMock->receiveMessage(&messageSent) == retval::CATCH_OK);
CHECK(messageSent.getCommand() == static_cast<int>(
HousekeepingMessage::UPDATE_NOTIFICATION_SET));
REQUIRE(mqMock->receiveMessage(&messageSent) == retval::CATCH_OK);
CHECK(messageSent.getCommand() == static_cast<int>(
HousekeepingMessage::HK_REPORT));
CommandMessageCleaner::clearCommandMessage(&messageSent);
REQUIRE(mqMock->receiveMessage(&messageSent) ==
static_cast<int>(MessageQueueIF::EMPTY));
}
}

View File

@ -0,0 +1,206 @@
#ifndef FSFW_UNITTEST_TESTS_DATAPOOLLOCAL_LOCALPOOLOWNERBASE_H_
#define FSFW_UNITTEST_TESTS_DATAPOOLLOCAL_LOCALPOOLOWNERBASE_H_
#include <fsfw/datapoollocal/HasLocalDataPoolIF.h>
#include <fsfw/datapoollocal/LocalDataSet.h>
#include <fsfw/objectmanager/SystemObject.h>
#include <fsfw/datapoollocal/LocalPoolVariable.h>
#include <fsfw/datapoollocal/LocalPoolVector.h>
#include <fsfw/ipc/QueueFactory.h>
#include <testcfg/objects/systemObjectList.h>
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
#include <fsfw/unittest/tests/mocks/MessageQueueMockBase.h>
namespace lpool {
static constexpr lp_id_t uint8VarId = 0;
static constexpr lp_id_t floatVarId = 1;
static constexpr lp_id_t uint32VarId = 2;
static constexpr lp_id_t uint16Vec3Id = 3;
static constexpr lp_id_t int64Vec2Id = 4;
static constexpr uint32_t testSetId = 0;
static constexpr uint8_t dataSetMaxVariables = 10;
static const sid_t testSid = sid_t(objects::TEST_LOCAL_POOL_OWNER_BASE,
testSetId);
}
class LocalPoolTestDataSet: public LocalDataSet {
public:
LocalPoolTestDataSet(HasLocalDataPoolIF* owner, uint32_t setId):
LocalDataSet(owner, setId, lpool::dataSetMaxVariables) {
}
ReturnValue_t assignPointers() {
PoolVariableIF** rawVarArray = getContainer();
localPoolVarUint8 = dynamic_cast<lp_var_t<uint8_t>*>(rawVarArray[0]);
localPoolVarFloat = dynamic_cast<lp_var_t<float>*>(rawVarArray[1]);
localPoolUint16Vec = dynamic_cast<lp_vec_t<uint16_t, 3>*>(
rawVarArray[2]);
if(localPoolVarUint8 == nullptr or localPoolVarFloat == nullptr or
localPoolUint16Vec == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED;
}
return HasReturnvaluesIF::RETURN_OK;
}
lp_var_t<uint8_t>* localPoolVarUint8 = nullptr;
lp_var_t<float>* localPoolVarFloat = nullptr;
lp_vec_t<uint16_t, 3>* localPoolUint16Vec = nullptr;
private:
};
class LocalPoolOwnerBase: public SystemObject, public HasLocalDataPoolIF {
public:
LocalPoolOwnerBase(
object_id_t objectId = objects::TEST_LOCAL_POOL_OWNER_BASE):
SystemObject(objectId), hkManager(this, messageQueue),
dataset(this, lpool::testSetId) {
messageQueue = new MessageQueueMockBase();
}
~LocalPoolOwnerBase() {
QueueFactory::instance()->deleteMessageQueue(messageQueue);
}
object_id_t getObjectId() const override {
return SystemObject::getObjectId();
}
ReturnValue_t initializeHkManager() {
if(not initialized) {
initialized = true;
return hkManager.initialize(messageQueue);
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t initializeHkManagerAfterTaskCreation() {
if(not initializedAfterTaskCreation) {
initializedAfterTaskCreation = true;
return hkManager.initializeAfterTaskCreation();
}
return HasReturnvaluesIF::RETURN_OK;
}
/** Command queue for housekeeping messages. */
MessageQueueId_t getCommandQueue() const override {
return messageQueue->getId();
}
// This is called by initializeAfterTaskCreation of the HK manager.
virtual ReturnValue_t initializeLocalDataPool(
localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) {
// Default initialization empty for now.
localDataPoolMap.emplace(lpool::uint8VarId,
new PoolEntry<uint8_t>({0}));
localDataPoolMap.emplace(lpool::floatVarId,
new PoolEntry<float>({0}));
localDataPoolMap.emplace(lpool::uint32VarId,
new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(lpool::uint16Vec3Id,
new PoolEntry<uint16_t>({0, 0, 0}));
localDataPoolMap.emplace(lpool::int64Vec2Id,
new PoolEntry<int64_t>({0, 0}));
return HasReturnvaluesIF::RETURN_OK;
}
/**
* This function can be used by data pool consumers to retrieve a handle
* which allows subscriptions to dataset and variable updates.
* @return
*/
virtual ProvidesDataPoolSubscriptionIF* getSubscriptionInterface() override {
return &hkManager;
}
virtual AccessPoolManagerIF* getAccessorHandle() override {
return &hkManager;
}
uint32_t getPeriodicOperationFrequency() const override {
return 0;
}
/**
* This function is used by the pool manager to get a valid dataset
* from a SID
* @param sid Corresponding structure ID
* @return
*/
virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override {
return &dataset;
}
virtual LocalPoolObjectBase* getPoolObjectHandle(
lp_id_t localPoolId) override {
if(localPoolId == lpool::uint8VarId) {
return &testUint8;
}
else if(localPoolId == lpool::uint16Vec3Id) {
return &testUint16Vec;
}
else if(localPoolId == lpool::floatVarId) {
return &testFloat;
}
else if(localPoolId == lpool::int64Vec2Id) {
return &testInt64Vec;
}
else if(localPoolId == lpool::uint32VarId) {
return &testUint32;
}
else {
return &testUint8;
}
}
MessageQueueMockBase* getMockQueueHandle() const {
return dynamic_cast<MessageQueueMockBase*>(messageQueue);
}
ReturnValue_t subscribeWrapperSetUpdate() {
return hkManager.subscribeForSetUpdateMessages(lpool::testSetId,
objects::NO_OBJECT, MessageQueueIF::NO_QUEUE, false);
}
ReturnValue_t subscribeWrapperSetUpdateHk(bool diagnostics = false) {
return hkManager.subscribeForUpdatePackets(lpool::testSid, diagnostics,
false, objects::HK_RECEIVER_MOCK);
}
ReturnValue_t subscribeWrapperVariableUpdate(lp_id_t localPoolId) {
return hkManager.subscribeForVariableUpdateMessages(localPoolId,
MessageQueueIF::NO_QUEUE, objects::NO_OBJECT, false);
}
void resetSubscriptionList() {
hkManager.clearReceiversList();
}
LocalDataPoolManager hkManager;
LocalPoolTestDataSet dataset;
private:
lp_var_t<uint8_t> testUint8 = lp_var_t<uint8_t>(this, lpool::uint8VarId,
&dataset);
lp_var_t<float> testFloat = lp_var_t<float>(this, lpool::floatVarId,
&dataset);
lp_var_t<uint32_t> testUint32 = lp_var_t<uint32_t>(this, lpool::uint32VarId);
lp_vec_t<uint16_t, 3> testUint16Vec = lp_vec_t<uint16_t, 3>(this,
lpool::uint16Vec3Id, &dataset);
lp_vec_t<int64_t, 2> testInt64Vec = lp_vec_t<int64_t, 2>(this,
lpool::int64Vec2Id);
MessageQueueIF* messageQueue = nullptr;
bool initialized = false;
bool initializedAfterTaskCreation = false;
};
#endif /* FSFW_UNITTEST_TESTS_DATAPOOLLOCAL_LOCALPOOLOWNERBASE_H_ */

View File

@ -0,0 +1,123 @@
#include "LocalPoolOwnerBase.h"
#include <catch2/catch_test_macros.hpp>
#include <fsfw/datapoollocal/HasLocalDataPoolIF.h>
#include <unittest/core/CatchDefinitions.h>
TEST_CASE("LocalPoolVariable" , "[LocPoolVarTest]") {
LocalPoolOwnerBase* poolOwner = objectManager->
get<LocalPoolOwnerBase>(objects::TEST_LOCAL_POOL_OWNER_BASE);
REQUIRE(poolOwner != nullptr);
REQUIRE(poolOwner->initializeHkManager() == retval::CATCH_OK);
REQUIRE(poolOwner->initializeHkManagerAfterTaskCreation()
== retval::CATCH_OK);
SECTION("Basic Tests") {
// very basic test.
lp_var_t<uint8_t> testVariable = lp_var_t<uint8_t>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint8VarId);
REQUIRE(testVariable.read() == retval::CATCH_OK);
CHECK(testVariable.value == 0);
testVariable.value = 5;
REQUIRE(testVariable.commit() == retval::CATCH_OK);
REQUIRE(testVariable.read() == retval::CATCH_OK);
REQUIRE(testVariable.value == 5);
CHECK(not testVariable.isValid());
testVariable.setValid(true);
CHECK(testVariable.isValid());
CHECK(testVariable.commit(true) == retval::CATCH_OK);
testVariable.setReadWriteMode(pool_rwm_t::VAR_READ);
CHECK(testVariable.getReadWriteMode() == pool_rwm_t::VAR_READ);
testVariable.setReadWriteMode(pool_rwm_t::VAR_READ_WRITE);
testVariable.setDataPoolId(22);
CHECK(testVariable.getDataPoolId() == 22);
testVariable.setDataPoolId(lpool::uint8VarId);
testVariable.setChanged(true);
CHECK(testVariable.hasChanged());
testVariable.setChanged(false);
gp_id_t globPoolId(objects::TEST_LOCAL_POOL_OWNER_BASE,
lpool::uint8VarId);
lp_var_t<uint8_t> testVariable2 = lp_var_t<uint8_t>(globPoolId);
REQUIRE(testVariable2.read() == retval::CATCH_OK);
CHECK(testVariable2 == 5);
CHECK(testVariable == testVariable2);
testVariable = 10;
CHECK(testVariable != 5);
//CHECK(not testVariable != testVariable2);
uint8_t variableRaw = 0;
uint8_t* varPtr = &variableRaw;
size_t maxSize = testVariable.getSerializedSize();
CHECK(maxSize == 1);
size_t serSize = 0;
CHECK(testVariable.serialize(&varPtr, &serSize, maxSize,
SerializeIF::Endianness::MACHINE) == retval::CATCH_OK);
CHECK(variableRaw == 10);
const uint8_t* varConstPtr = &variableRaw;
testVariable = 5;
CHECK(testVariable.deSerialize(&varConstPtr, &serSize,
SerializeIF::Endianness::MACHINE) == retval::CATCH_OK);
CHECK(testVariable == 10);
CHECK(testVariable != testVariable2);
CHECK(testVariable2 < testVariable);
CHECK(testVariable2 < 10);
CHECK(testVariable > 5);
CHECK(testVariable > testVariable2);
variableRaw = static_cast<uint8_t>(testVariable2);
CHECK(variableRaw == 5);
CHECK(testVariable == 10);
testVariable = testVariable2;
CHECK(testVariable == 5);
}
SECTION("ErrorHandling") {
// not try to use a local pool variable which does not exist
lp_var_t<uint8_t> invalidVariable = lp_var_t<uint8_t>(
objects::TEST_LOCAL_POOL_OWNER_BASE, 0xffffffff);
REQUIRE(invalidVariable.read() ==
static_cast<int>(localpool::POOL_ENTRY_NOT_FOUND));
REQUIRE(invalidVariable.commit() ==
static_cast<int>(localpool::POOL_ENTRY_NOT_FOUND));
// now try to access with wrong type
lp_var_t<int8_t> invalidVariable2 = lp_var_t<int8_t>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint8VarId);
REQUIRE(invalidVariable2.read() ==
static_cast<int>(localpool::POOL_ENTRY_TYPE_CONFLICT));
lp_var_t<uint8_t> readOnlyVar = lp_var_t<uint8_t>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint8VarId,
nullptr, pool_rwm_t::VAR_READ);
REQUIRE(readOnlyVar.commit() ==
static_cast<int>(PoolVariableIF::INVALID_READ_WRITE_MODE));
lp_var_t<uint8_t> writeOnlyVar = lp_var_t<uint8_t>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint8VarId,
nullptr, pool_rwm_t::VAR_WRITE);
REQUIRE(writeOnlyVar.read() == static_cast<int>(
PoolVariableIF::INVALID_READ_WRITE_MODE));
lp_var_t<uint32_t> uint32tVar = lp_var_t<uint32_t>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint32VarId);
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "LocalPoolVariable printout: " <<uint32tVar << std::endl;
#endif
// for code coverage. If program does not crash -> OK
lp_var_t<uint8_t> invalidObjectVar = lp_var_t<uint8_t>(
0xffffffff, lpool::uint8VarId);
gp_id_t globPoolId(0xffffffff,
lpool::uint8VarId);
lp_var_t<uint8_t> invalidObjectVar2 = lp_var_t<uint8_t>(globPoolId);
lp_var_t<uint8_t> invalidObjectVar3 = lp_var_t<uint8_t>(nullptr,
lpool::uint8VarId);
}
}

View File

@ -0,0 +1,120 @@
#include "LocalPoolOwnerBase.h"
#include <catch2/catch_test_macros.hpp>
#include <fsfw/datapoollocal/HasLocalDataPoolIF.h>
#include <unittest/core/CatchDefinitions.h>
TEST_CASE("LocalPoolVector" , "[LocPoolVecTest]") {
LocalPoolOwnerBase* poolOwner = objectManager->
get<LocalPoolOwnerBase>(objects::TEST_LOCAL_POOL_OWNER_BASE);
REQUIRE(poolOwner != nullptr);
REQUIRE(poolOwner->initializeHkManager() == retval::CATCH_OK);
REQUIRE(poolOwner->initializeHkManagerAfterTaskCreation()
== retval::CATCH_OK);
SECTION("BasicTest") {
// very basic test.
lp_vec_t<uint16_t, 3> testVector = lp_vec_t<uint16_t, 3>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint16Vec3Id);
REQUIRE(testVector.read() == retval::CATCH_OK);
testVector.value[0] = 5;
testVector.value[1] = 232;
testVector.value[2] = 32023;
REQUIRE(testVector.commit(true) == retval::CATCH_OK);
CHECK(testVector.isValid());
testVector.value[0] = 0;
testVector.value[1] = 0;
testVector.value[2] = 0;
CHECK(testVector.read() == retval::CATCH_OK);
CHECK(testVector.value[0] == 5);
CHECK(testVector.value[1] == 232);
CHECK(testVector.value[2] == 32023);
CHECK(testVector[0] == 5);
// This is invalid access, so the last value will be set instead.
// (we can't throw exceptions)
testVector[4] = 12;
CHECK(testVector[2] == 12);
CHECK(testVector.commit() == retval::CATCH_OK);
// Use read-only reference.
const lp_vec_t<uint16_t, 3>& roTestVec = testVector;
uint16_t valueOne = roTestVec[0];
CHECK(valueOne == 5);
uint16_t lastVal = roTestVec[25];
CHECK(lastVal == 12);
size_t maxSize = testVector.getSerializedSize();
CHECK(maxSize == 6);
uint16_t serializedVector[3];
uint8_t* vecPtr = reinterpret_cast<uint8_t*>(serializedVector);
size_t serSize = 0;
REQUIRE(testVector.serialize(&vecPtr, &serSize,
maxSize, SerializeIF::Endianness::MACHINE) == retval::CATCH_OK);
CHECK(serSize == 6);
CHECK(serializedVector[0] == 5);
CHECK(serializedVector[1] == 232);
CHECK(serializedVector[2] == 12);
maxSize = 1;
REQUIRE(testVector.serialize(&vecPtr, &serSize,
maxSize, SerializeIF::Endianness::MACHINE) ==
static_cast<int>(SerializeIF::BUFFER_TOO_SHORT));
serializedVector[0] = 16;
serializedVector[1] = 7832;
serializedVector[2] = 39232;
const uint8_t* constVecPtr = reinterpret_cast<const uint8_t*>(
serializedVector);
REQUIRE(testVector.deSerialize(&constVecPtr, &serSize,
SerializeIF::Endianness::MACHINE) == retval::CATCH_OK);
CHECK(testVector[0] == 16);
CHECK(testVector[1] == 7832);
CHECK(testVector[2] == 39232);
serSize = 1;
REQUIRE(testVector.deSerialize(&constVecPtr, &serSize,
SerializeIF::Endianness::MACHINE) ==
static_cast<int>(SerializeIF::STREAM_TOO_SHORT));
}
SECTION("ErrorHandling") {
// not try to use a local pool variable which does not exist
lp_vec_t<uint16_t, 3> invalidVector = lp_vec_t<uint16_t, 3>(
objects::TEST_LOCAL_POOL_OWNER_BASE, 0xffffffff);
REQUIRE(invalidVector.read() ==
static_cast<int>(localpool::POOL_ENTRY_NOT_FOUND));
REQUIRE(invalidVector.commit() ==
static_cast<int>(localpool::POOL_ENTRY_NOT_FOUND));
// now try to access with wrong type
lp_vec_t<uint32_t, 3> invalidVector2 = lp_vec_t<uint32_t, 3>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint16Vec3Id);
REQUIRE(invalidVector2.read() ==
static_cast<int>(localpool::POOL_ENTRY_TYPE_CONFLICT));
REQUIRE(invalidVector2.commit() ==
static_cast<int>(localpool::POOL_ENTRY_TYPE_CONFLICT));
lp_vec_t<uint16_t, 3> writeOnlyVec = lp_vec_t<uint16_t, 3>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint16Vec3Id,
nullptr, pool_rwm_t::VAR_WRITE);
REQUIRE(writeOnlyVec.read() ==
static_cast<int>(PoolVariableIF::INVALID_READ_WRITE_MODE));
lp_vec_t<uint16_t, 3> readOnlyVec = lp_vec_t<uint16_t, 3>(
objects::TEST_LOCAL_POOL_OWNER_BASE, lpool::uint16Vec3Id,
nullptr, pool_rwm_t::VAR_READ);
REQUIRE(readOnlyVec.commit() ==
static_cast<int>(PoolVariableIF::INVALID_READ_WRITE_MODE));
}
}

View File

@ -0,0 +1,20 @@
#ifndef FSFW_UNITTEST_TESTS_MOCKS_HKRECEIVERMOCK_H_
#define FSFW_UNITTEST_TESTS_MOCKS_HKRECEIVERMOCK_H_
#include <fsfw/housekeeping/AcceptsHkPacketsIF.h>
#include <fsfw/objectmanager/SystemObject.h>
class HkReceiverMock: public SystemObject, public AcceptsHkPacketsIF {
public:
HkReceiverMock(object_id_t objectId): SystemObject(objectId) {
}
MessageQueueId_t getHkQueue() const {
return MessageQueueIF::NO_QUEUE;
}
};
#endif /* FSFW_UNITTEST_TESTS_MOCKS_HKRECEIVERMOCK_H_ */

View File

@ -0,0 +1,121 @@
#ifndef FSFW_UNITTEST_TESTS_MOCKS_MESSAGEQUEUEMOCKBASE_H_
#define FSFW_UNITTEST_TESTS_MOCKS_MESSAGEQUEUEMOCKBASE_H_
#include <fsfw/ipc/MessageQueueIF.h>
#include <fsfw/ipc/MessageQueueMessage.h>
#include <unittest/core/CatchDefinitions.h>
#include <cstring>
#include <queue>
class MessageQueueMockBase: public MessageQueueIF {
public:
MessageQueueId_t myQueueId = tconst::testQueueId;
uint8_t messageSentCounter = 0;
bool defaultDestSet = false;
bool messageSent = false;
bool wasMessageSent(uint8_t* messageSentCounter = nullptr,
bool resetCounter = true) {
bool tempMessageSent = messageSent;
messageSent = false;
if(messageSentCounter != nullptr) {
*messageSentCounter = this->messageSentCounter;
}
if(resetCounter) {
this->messageSentCounter = 0;
}
return tempMessageSent;
}
virtual ReturnValue_t reply( MessageQueueMessageIF* message ) {
//messageSent = true;
//lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
return sendMessage(myQueueId, message);
return HasReturnvaluesIF::RETURN_OK;
};
virtual ReturnValue_t receiveMessage(MessageQueueMessageIF* message,
MessageQueueId_t *receivedFrom) {
return receiveMessage(message);
}
virtual ReturnValue_t receiveMessage(MessageQueueMessageIF* message) {
if(messagesSentQueue.empty()) {
return MessageQueueIF::EMPTY;
}
std::memcpy(message->getBuffer(), messagesSentQueue.front().getBuffer(),
message->getMessageSize());
messagesSentQueue.pop();
return HasReturnvaluesIF::RETURN_OK;
}
virtual ReturnValue_t flush(uint32_t* count) {
return HasReturnvaluesIF::RETURN_OK;
}
virtual MessageQueueId_t getLastPartner() const {
return myQueueId;
}
virtual MessageQueueId_t getId() const {
return myQueueId;
}
virtual ReturnValue_t sendMessageFrom( MessageQueueId_t sendTo,
MessageQueueMessageIF* message, MessageQueueId_t sentFrom,
bool ignoreFault = false ) {
//messageSent = true;
//lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
//return HasReturnvaluesIF::RETURN_OK;
return sendMessage(sendTo, message);
}
virtual ReturnValue_t sendToDefaultFrom( MessageQueueMessageIF* message,
MessageQueueId_t sentFrom, bool ignoreFault = false ) {
//messageSent = true;
//lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
//return HasReturnvaluesIF::RETURN_OK;
return sendMessage(myQueueId, message);
}
virtual ReturnValue_t sendToDefault( MessageQueueMessageIF* message ) {
//messageSent = true;
//lastMessage = *(dynamic_cast<MessageQueueMessage*>(message));
return sendMessage(myQueueId, message);
}
virtual ReturnValue_t sendMessage( MessageQueueId_t sendTo,
MessageQueueMessageIF* message, bool ignoreFault = false ) override {
messageSent = true;
messageSentCounter++;
MessageQueueMessage& messageRef = *(
dynamic_cast<MessageQueueMessage*>(message));
messagesSentQueue.push(messageRef);
return HasReturnvaluesIF::RETURN_OK;
}
virtual void setDefaultDestination(MessageQueueId_t defaultDestination) {
myQueueId = defaultDestination;
defaultDestSet = true;
}
virtual MessageQueueId_t getDefaultDestination() const {
return myQueueId;
}
virtual bool isDefaultDestinationSet() const {
return defaultDestSet;
}
void clearMessages(bool clearCommandMessages = true) {
while(not messagesSentQueue.empty()) {
if(clearCommandMessages) {
CommandMessage message;
std::memcpy(message.getBuffer(),
messagesSentQueue.front().getBuffer(),
message.getMessageSize());
message.clear();
}
messagesSentQueue.pop();
}
}
private:
std::queue<MessageQueueMessage> messagesSentQueue;
//MessageQueueMessage lastMessage;
};
#endif /* FSFW_UNITTEST_TESTS_MOCKS_MESSAGEQUEUEMOCKBASE_H_ */

View File

@ -1,161 +1,161 @@
//#include <fsfw/storagemanager/LocalPool.h> #include <fsfw/storagemanager/LocalPool.h>
//#include <catch2/catch.hpp> #include <catch2/catch_test_macros.hpp>
//#include "../../core/CatchDefinitions.h" #include <unittest/core/CatchDefinitions.h>
//#include <array> #include <array>
// #include <cstring>
//TEST_CASE( "New Accessor" , "[NewAccessor]") {
// uint16_t numberOfElements[1] = {1}; TEST_CASE( "New Accessor" , "[NewAccessor]") {
// uint16_t sizeofElements[1] = {10}; LocalPool::LocalPoolConfig poolCfg = {{1, 10}};
// LocalPool<1> SimplePool = LocalPool<1>(0, sizeofElements, numberOfElements); LocalPool SimplePool = LocalPool(0, poolCfg);
// std::array<uint8_t, 20> testDataArray; std::array<uint8_t, 20> testDataArray;
// std::array<uint8_t, 20> receptionArray; std::array<uint8_t, 20> receptionArray;
// store_address_t testStoreId; store_address_t testStoreId;
// ReturnValue_t result = retval::CATCH_FAILED; ReturnValue_t result = retval::CATCH_FAILED;
//
// for(size_t i = 0; i < testDataArray.size(); i++) { for(size_t i = 0; i < testDataArray.size(); i++) {
// testDataArray[i] = i; testDataArray[i] = i;
// } }
// size_t size = 10; size_t size = 10;
//
// SECTION ("Simple tests getter functions") { SECTION ("Simple tests getter functions") {
// result = SimplePool.addData(&testStoreId, testDataArray.data(), size); result = SimplePool.addData(&testStoreId, testDataArray.data(), size);
// REQUIRE(result == retval::CATCH_OK); REQUIRE(result == retval::CATCH_OK);
// auto resultPair = SimplePool.getData(testStoreId); auto resultPair = SimplePool.getData(testStoreId);
// REQUIRE(resultPair.first == retval::CATCH_OK); REQUIRE(resultPair.first == retval::CATCH_OK);
// resultPair.second.getDataCopy(receptionArray.data(), 20); resultPair.second.getDataCopy(receptionArray.data(), 20);
// CHECK(resultPair.second.getId() == testStoreId); CHECK(resultPair.second.getId() == testStoreId);
// CHECK(resultPair.second.size() == 10); CHECK(resultPair.second.size() == 10);
// for(size_t i = 0; i < size; i++) { for(size_t i = 0; i < size; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
//
// std::copy(resultPair.second.data(), resultPair.second.data() + std::copy(resultPair.second.data(), resultPair.second.data() +
// resultPair.second.size(), receptionArray.data()); resultPair.second.size(), receptionArray.data());
// for(size_t i = 0; i < size; i++) { for(size_t i = 0; i < size; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
//
// { {
// auto resultPairLoc = SimplePool.getData(testStoreId); auto resultPairLoc = SimplePool.getData(testStoreId);
// REQUIRE(resultPairLoc.first == retval::CATCH_OK); REQUIRE(resultPairLoc.first == retval::CATCH_OK);
// // data should be deleted when accessor goes out of scope. // data should be deleted when accessor goes out of scope.
// } }
// resultPair = SimplePool.getData(testStoreId); resultPair = SimplePool.getData(testStoreId);
// REQUIRE(resultPair.first == (int) StorageManagerIF::DATA_DOES_NOT_EXIST); REQUIRE(resultPair.first == (int) StorageManagerIF::DATA_DOES_NOT_EXIST);
//
// result = SimplePool.addData(&testStoreId, testDataArray.data(), size); result = SimplePool.addData(&testStoreId, testDataArray.data(), size);
// REQUIRE(result == retval::CATCH_OK); REQUIRE(result == retval::CATCH_OK);
// { {
// ConstStorageAccessor constAccessor(testStoreId); ConstStorageAccessor constAccessor(testStoreId);
// result = SimplePool.getData(testStoreId, constAccessor); result = SimplePool.getData(testStoreId, constAccessor);
// REQUIRE(result == retval::CATCH_OK); REQUIRE(result == retval::CATCH_OK);
// constAccessor.getDataCopy(receptionArray.data(), 20); constAccessor.getDataCopy(receptionArray.data(), 20);
// for(size_t i = 0; i < size; i++) { for(size_t i = 0; i < size; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
// // likewise, data should be deleted when accessor gets out of scope. // likewise, data should be deleted when accessor gets out of scope.
// } }
// resultPair = SimplePool.getData(testStoreId); resultPair = SimplePool.getData(testStoreId);
// REQUIRE(resultPair.first == (int) StorageManagerIF::DATA_DOES_NOT_EXIST); REQUIRE(resultPair.first == (int) StorageManagerIF::DATA_DOES_NOT_EXIST);
//
// result = SimplePool.addData(&testStoreId, testDataArray.data(), size); result = SimplePool.addData(&testStoreId, testDataArray.data(), size);
// { {
// resultPair = SimplePool.getData(testStoreId); resultPair = SimplePool.getData(testStoreId);
// REQUIRE(resultPair.first == retval::CATCH_OK); REQUIRE(resultPair.first == retval::CATCH_OK);
// resultPair.second.release(); resultPair.second.release();
// // now data should not be deleted anymore // now data should not be deleted anymore
// } }
// resultPair = SimplePool.getData(testStoreId); resultPair = SimplePool.getData(testStoreId);
// REQUIRE(resultPair.first == retval::CATCH_OK); REQUIRE(resultPair.first == retval::CATCH_OK);
// resultPair.second.getDataCopy(receptionArray.data(), 20); resultPair.second.getDataCopy(receptionArray.data(), 20);
// for(size_t i = 0; i < size; i++) { for(size_t i = 0; i < size; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
// } }
//
//
// SECTION("Simple tests modify functions") { SECTION("Simple tests modify functions") {
// result = SimplePool.addData(&testStoreId, testDataArray.data(), size); result = SimplePool.addData(&testStoreId, testDataArray.data(), size);
// REQUIRE(result == retval::CATCH_OK); REQUIRE(result == retval::CATCH_OK);
// { {
// StorageAccessor accessor(testStoreId); StorageAccessor accessor(testStoreId);
// result = SimplePool.modifyData(testStoreId, accessor); result = SimplePool.modifyData(testStoreId, accessor);
// REQUIRE(result == retval::CATCH_OK); REQUIRE(result == retval::CATCH_OK);
// CHECK(accessor.getId() == testStoreId); CHECK(accessor.getId() == testStoreId);
// CHECK(accessor.size() == 10); CHECK(accessor.size() == 10);
// accessor.getDataCopy(receptionArray.data(), 20); accessor.getDataCopy(receptionArray.data(), 20);
// for(size_t i = 0; i < size; i++) { for(size_t i = 0; i < size; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
// std::copy(accessor.data(), accessor.data() + std::copy(accessor.data(), accessor.data() +
// accessor.size(), receptionArray.data()); accessor.size(), receptionArray.data());
// for(size_t i = 0; i < size; i++) { for(size_t i = 0; i < size; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
// // data should be deleted when accessor goes out of scope // data should be deleted when accessor goes out of scope
// } }
// auto resultPair = SimplePool.getData(testStoreId); auto resultPair = SimplePool.getData(testStoreId);
// REQUIRE(resultPair.first == (int) StorageManagerIF::DATA_DOES_NOT_EXIST); REQUIRE(resultPair.first == (int) StorageManagerIF::DATA_DOES_NOT_EXIST);
//
// result = SimplePool.addData(&testStoreId, testDataArray.data(), size); result = SimplePool.addData(&testStoreId, testDataArray.data(), size);
// REQUIRE(result == retval::CATCH_OK); REQUIRE(result == retval::CATCH_OK);
// { {
// auto resultPairLoc = SimplePool.modifyData(testStoreId); auto resultPairLoc = SimplePool.modifyData(testStoreId);
// REQUIRE(resultPairLoc.first == retval::CATCH_OK); REQUIRE(resultPairLoc.first == retval::CATCH_OK);
// CHECK(resultPairLoc.second.getId() == testStoreId); CHECK(resultPairLoc.second.getId() == testStoreId);
// CHECK(resultPairLoc.second.size() == 10); CHECK(resultPairLoc.second.size() == 10);
// resultPairLoc.second.getDataCopy(receptionArray.data(), 20); resultPairLoc.second.getDataCopy(receptionArray.data(), 20);
// for(size_t i = 0; i < size; i++) { for(size_t i = 0; i < size; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
// std::copy(resultPairLoc.second.data(), resultPairLoc.second.data() + std::copy(resultPairLoc.second.data(), resultPairLoc.second.data() +
// resultPairLoc.second.size(), receptionArray.data()); resultPairLoc.second.size(), receptionArray.data());
// for(size_t i = 0; i < size; i++) { for(size_t i = 0; i < size; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
// resultPairLoc.second.release(); resultPairLoc.second.release();
// // data should not be deleted when accessor goes out of scope // data should not be deleted when accessor goes out of scope
// } }
// resultPair = SimplePool.getData(testStoreId); resultPair = SimplePool.getData(testStoreId);
// REQUIRE(resultPair.first == retval::CATCH_OK); REQUIRE(resultPair.first == retval::CATCH_OK);
// } }
//
//
// SECTION("Write tests") { SECTION("Write tests") {
// result = SimplePool.addData(&testStoreId, testDataArray.data(), size); result = SimplePool.addData(&testStoreId, testDataArray.data(), size);
// REQUIRE(result == retval::CATCH_OK); REQUIRE(result == retval::CATCH_OK);
// { {
// auto resultPair = SimplePool.modifyData(testStoreId); auto resultPair = SimplePool.modifyData(testStoreId);
// REQUIRE(resultPair.first == retval::CATCH_OK); REQUIRE(resultPair.first == retval::CATCH_OK);
// testDataArray[9] = 42; testDataArray[9] = 42;
// resultPair.second.write(testDataArray.data(), 10, 0); resultPair.second.write(testDataArray.data(), 10, 0);
// // now data should not be deleted // now data should not be deleted
// resultPair.second.release(); resultPair.second.release();
// } }
// auto resultConstPair = SimplePool.getData(testStoreId); auto resultConstPair = SimplePool.getData(testStoreId);
// REQUIRE(resultConstPair.first == retval::CATCH_OK); REQUIRE(resultConstPair.first == retval::CATCH_OK);
//
// resultConstPair.second.getDataCopy(receptionArray.data(), 10); resultConstPair.second.getDataCopy(receptionArray.data(), 10);
// for(size_t i = 0; i < size-1; i++) { for(size_t i = 0; i < size-1; i++) {
// CHECK(receptionArray[i] == i ); CHECK(receptionArray[i] == i );
// } }
// CHECK(receptionArray[9] == 42 ); CHECK(receptionArray[9] == 42 );
//
// auto resultPair = SimplePool.modifyData(testStoreId); auto resultPair = SimplePool.modifyData(testStoreId);
// REQUIRE(resultPair.first == retval::CATCH_OK); REQUIRE(resultPair.first == retval::CATCH_OK);
// result = resultPair.second.write(testDataArray.data(), 20, 0); result = resultPair.second.write(testDataArray.data(), 20, 0);
// REQUIRE(result == retval::CATCH_FAILED); REQUIRE(result == retval::CATCH_FAILED);
// result = resultPair.second.write(testDataArray.data(), 10, 5); result = resultPair.second.write(testDataArray.data(), 10, 5);
// REQUIRE(result == retval::CATCH_FAILED); REQUIRE(result == retval::CATCH_FAILED);
//
// memset(testDataArray.data(), 42, 5); std::memset(testDataArray.data(), 42, 5);
// result = resultPair.second.write(testDataArray.data(), 5, 5); result = resultPair.second.write(testDataArray.data(), 5, 5);
// REQUIRE(result == retval::CATCH_OK); REQUIRE(result == retval::CATCH_OK);
// resultConstPair = SimplePool.getData(testStoreId); resultConstPair = SimplePool.getData(testStoreId);
// resultPair.second.getDataCopy(receptionArray.data(), 20); resultPair.second.getDataCopy(receptionArray.data(), 20);
// for(size_t i = 5; i < 10; i++) { for(size_t i = 5; i < 10; i++) {
// CHECK(receptionArray[i] == 42 ); CHECK(receptionArray[i] == 42 );
// } }
//
// } }
//} }

View File

@ -8,8 +8,6 @@
TEST_CASE( "Local Pool Simple Tests [1 Pool]" , "[TestPool]") { TEST_CASE( "Local Pool Simple Tests [1 Pool]" , "[TestPool]") {
// uint16_t numberOfElements[1] = {1};
// uint16_t sizeofElements[1] = {10};
LocalPool::LocalPoolConfig config = {{1, 10}}; LocalPool::LocalPoolConfig config = {{1, 10}};
LocalPool simplePool(0, config); LocalPool simplePool(0, config);
std::array<uint8_t, 20> testDataArray; std::array<uint8_t, 20> testDataArray;

View File

@ -13,7 +13,19 @@ cmake_minimum_required(VERSION 3.13)
# set(CMAKE_VERBOSE TRUE) # set(CMAKE_VERBOSE TRUE)
set(CMAKE_SCRIPT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/buildsystem/cmake") set(CMAKE_SCRIPT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
option(TMTC_TEST "Build binary for manual or automatic TMTC tests" FALSE)
option(GENERATE_COVERAGE
"Specify whether coverage data is generated with GCOV"
TRUE
)
if(TMTC_TEST)
set(LINK_CATCH2 FALSE)
else()
set(LINK_CATCH2 TRUE)
endif()
# Tests can be built with the Host OSAL or with the Linux OSAL. # Tests can be built with the Host OSAL or with the Linux OSAL.
if(NOT OS_FSFW) if(NOT OS_FSFW)
@ -53,6 +65,7 @@ set(FSFW_PATH fsfw)
set(CATCH2_PATH Catch2) set(CATCH2_PATH Catch2)
set(FSFW_TESTS_PATH fsfw/unittest) set(FSFW_TESTS_PATH fsfw/unittest)
set(TEST_SETUP_PATH unittest) set(TEST_SETUP_PATH unittest)
set(TMTC_TEST_PATH tests)
# Analyse different OS and architecture/target options and # Analyse different OS and architecture/target options and
# determine BSP_PATH # determine BSP_PATH
@ -71,6 +84,15 @@ else()
endif() endif()
endif() endif()
if(GENERATE_COVERAGE)
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/cmake-modules)
if(CMAKE_COMPILER_IS_GNUCXX)
include(CodeCoverage)
# Add compile options on target base, we don't want coverage for Catch2
# append_coverage_compiler_flags()
endif()
endif()
set(FSFW_CONFIG_PATH testcfg) set(FSFW_CONFIG_PATH testcfg)
################################################################################ ################################################################################
@ -82,10 +104,16 @@ add_executable(${TARGET_NAME})
# Add subdirectories # Add subdirectories
add_subdirectory(${FSFW_PATH}) add_subdirectory(${FSFW_PATH})
add_subdirectory(${CATCH2_PATH})
add_subdirectory(${FSFW_CONFIG_PATH}) add_subdirectory(${FSFW_CONFIG_PATH})
if(LINK_CATCH2)
add_subdirectory(${CATCH2_PATH})
add_subdirectory(${FSFW_TESTS_PATH}) add_subdirectory(${FSFW_TESTS_PATH})
add_subdirectory(${TEST_SETUP_PATH}) add_subdirectory(${TEST_SETUP_PATH})
else()
add_subdirectory(${TMTC_TEST_PATH})
endif()
################################################################################ ################################################################################
# Post-Sources preparation # Post-Sources preparation
@ -94,8 +122,73 @@ add_subdirectory(${TEST_SETUP_PATH})
# Add libraries for all sources. # Add libraries for all sources.
target_link_libraries(${TARGET_NAME} PRIVATE target_link_libraries(${TARGET_NAME} PRIVATE
${LIB_FSFW_NAME} ${LIB_FSFW_NAME}
)
if(LINK_CATCH2)
target_link_libraries(${TARGET_NAME} PRIVATE
${CATCH2_TARGET} ${CATCH2_TARGET}
) )
endif()
if(GENERATE_COVERAGE)
if(CMAKE_COMPILER_IS_GNUCXX)
set(CODE_COVERAGE_VERBOSE TRUE)
include(CodeCoverage)
# Remove quotes.
separate_arguments(COVERAGE_COMPILER_FLAGS
NATIVE_COMMAND "${COVERAGE_COMPILER_FLAGS}"
)
# Add compile options manually, we don't want coverage for Catch2
target_compile_options(${TARGET_NAME} PRIVATE
"${COVERAGE_COMPILER_FLAGS}"
)
target_compile_options(${LIB_FSFW_NAME} PRIVATE
"${COVERAGE_COMPILER_FLAGS}"
)
# Exclude internal unittest from coverage for now.
if(WIN32)
set(GCOVR_ADDITIONAL_ARGS
"--exclude-throw-branches"
"--exclude-unreachable-branches"
)
set(COVERAGE_EXCLUDES
"/c/msys64/mingw64/*" "Catch2"
"${CMAKE_CURRENT_SOURCE_DIR}/fsfw/unittest/internal"
)
elseif(UNIX)
set(COVERAGE_EXCLUDES
"/usr/include/*" "/usr/bin/*" "Catch2/*"
"fsfw/unittest/internal/*"
)
endif()
target_link_options(${TARGET_NAME} PRIVATE
-fprofile-arcs
-ftest-coverage
)
target_link_options(${LIB_FSFW_NAME} PRIVATE
-fprofile-arcs
-ftest-coverage
)
if(WIN32)
setup_target_for_coverage_gcovr_html(
NAME ${TARGET_NAME}_coverage
EXECUTABLE ${TARGET_NAME}
DEPENDENCIES ${TARGET_NAME}
)
else()
setup_target_for_coverage_lcov(
NAME ${TARGET_NAME}_coverage
EXECUTABLE ${TARGET_NAME}
DEPENDENCIES ${TARGET_NAME}
)
endif()
endif()
endif()
# Add include paths for all sources. # Add include paths for all sources.
target_include_directories(${TARGET_NAME} PRIVATE target_include_directories(${TARGET_NAME} PRIVATE
@ -147,8 +240,7 @@ if(NOT CMAKE_SIZE)
endif() endif()
endif() endif()
add_custom_command( add_custom_command(TARGET ${TARGET_NAME}
TARGET ${TARGET_NAME}
POST_BUILD POST_BUILD
COMMAND echo "Build directory: ${CMAKE_BINARY_DIR}" COMMAND echo "Build directory: ${CMAKE_BINARY_DIR}"
COMMAND echo "Target OSAL: ${OS_FSFW}" COMMAND echo "Target OSAL: ${OS_FSFW}"
@ -156,7 +248,7 @@ add_custom_command(
COMMAND ${CMAKE_SIZE} ${TARGET_NAME}${FILE_SUFFIX} COMMAND ${CMAKE_SIZE} ${TARGET_NAME}${FILE_SUFFIX}
) )
include (${CMAKE_CURRENT_SOURCE_DIR}/buildsystem/cmake/BuildType.cmake) include (${CMAKE_SCRIPT_PATH}/BuildType.cmake)
set_build_type() set_build_type()

View File

@ -4,16 +4,21 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
//! Used to determine whether C++ ostreams are used //! Used to determine whether C++ ostreams are used which can increase
//! Those can lead to code bloat. //! the binary size significantly. If this is disabled,
//! the C stdio functions can be used alternatively
#define FSFW_CPP_OSTREAM_ENABLED 1 #define FSFW_CPP_OSTREAM_ENABLED 1
//! Reduced printout to further decrease code size //! More FSFW related printouts depending on level. Useful for development.
//! Be careful, this also turns off most diagnostic prinouts! #define FSFW_VERBOSE_LEVEL 1
#define FSFW_ENHANCED_PRINTOUT 0
//! Can be used to enable additional debugging printouts for developing the FSFW //! Can be used to completely disable printouts, even the C stdio ones.
#define FSFW_PRINT_VERBOSITY_LEVEL 0 #if FSFW_CPP_OSTREAM_ENABLED == 0 && FSFW_VERBOSE_LEVEL == 0
#define FSFW_DISABLE_PRINTOUT 0
#endif
//! Can be used to disable the ANSI color sequences for C stdio.
#define FSFW_COLORED_OUTPUT 1
//! If FSFW_OBJ_EVENT_TRANSLATION is set to one, //! If FSFW_OBJ_EVENT_TRANSLATION is set to one,
//! additional output which requires the translation files translateObjects //! additional output which requires the translation files translateObjects
@ -49,7 +54,9 @@ static constexpr size_t FSFW_EVENTMGMR_RANGEMATCHERS = 120;
//! also determines how many commands a CSB service can handle in one cycle //! also determines how many commands a CSB service can handle in one cycle
//! simulataneously. This will increase the required RAM for //! simulataneously. This will increase the required RAM for
//! each CSB service ! //! each CSB service !
static constexpr uint8_t FSFW_CSB_FIFO_DEPTH = 3; static constexpr uint8_t FSFW_CSB_FIFO_DEPTH = 6;
static constexpr size_t FSFW_PRINT_BUFFER_SIZE = 124;
} }
#endif /* CONFIG_FSFWCONFIG_H_ */ #endif /* CONFIG_FSFWCONFIG_H_ */

View File

@ -9,7 +9,20 @@ namespace objects {
enum sourceObjects: uint32_t { enum sourceObjects: uint32_t {
/* All addresses between start and end are reserved for the FSFW */ /* All addresses between start and end are reserved for the FSFW */
FSFW_CONFIG_RESERVED_START = PUS_SERVICE_1_VERIFICATION, FSFW_CONFIG_RESERVED_START = PUS_SERVICE_1_VERIFICATION,
FSFW_CONFIG_RESERVED_END = TM_STORE FSFW_CONFIG_RESERVED_END = TM_STORE,
CCSDS_DISTRIBUTOR = 10,
PUS_DISTRIBUTOR = 11,
TM_FUNNEL = 12,
UDP_BRIDGE = 15,
UDP_POLLING_TASK = 16,
TEST_ECHO_COM_IF = 20,
TEST_DEVICE = 21,
HK_RECEIVER_MOCK = 22,
TEST_LOCAL_POOL_OWNER_BASE = 25
}; };
} }

View File

@ -0,0 +1 @@
add_subdirectory(core)

View File

@ -5,3 +5,9 @@ target_sources(${TARGET_NAME} PRIVATE
CatchSetup.cpp CatchSetup.cpp
printChar.cpp printChar.cpp
) )
if(CUSTOM_UNITTEST_RUNNER)
target_sources(${TARGET_NAME} PRIVATE
CatchRunner.cpp
)
endif()

View File

@ -1,4 +1,5 @@
#include "CatchDefinitions.h" #include "CatchDefinitions.h"
#include <fsfw/serviceinterface/ServiceInterface.h>
#include <fsfw/objectmanager/ObjectManagerIF.h> #include <fsfw/objectmanager/ObjectManagerIF.h>
StorageManagerIF* tglob::getIpcStoreHandle() { StorageManagerIF* tglob::getIpcStoreHandle() {
@ -7,7 +8,9 @@ StorageManagerIF* tglob::getIpcStoreHandle() {
} else { } else {
#if FSFW_CPP_OSTREAM_ENABLED == 1 #if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "Global object manager uninitialized" << std::endl; sif::error << "Global object manager uninitialized" << std::endl;
#endif #else
sif::printError("Global object manager uninitialized\n\r");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
return nullptr; return nullptr;
} }
} }

View File

@ -1,11 +1,17 @@
#include <fsfw/datapoollocal/LocalDataPoolManager.h>
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
#include "CatchFactory.h" #include "CatchFactory.h"
#include <fsfw/events/EventManager.h> #include <fsfw/events/EventManager.h>
#include <fsfw/health/HealthTable.h> #include <fsfw/health/HealthTable.h>
#include <fsfw/internalError/InternalErrorReporter.h> #include <fsfw/internalError/InternalErrorReporter.h>
#include <fsfw/objectmanager/frameworkObjects.h> #include <fsfw/objectmanager/frameworkObjects.h>
#include <fsfw/storagemanager/PoolManager.h> #include <fsfw/storagemanager/PoolManager.h>
#include <fsfw/tmtcpacket/pus/TmPacketStored.h>
#include <fsfw/tmtcservices/CommandingServiceBase.h>
#include <fsfw/tmtcservices/PusServiceBase.h>
#include <fsfw/unittest/tests/datapoollocal/LocalPoolOwnerBase.h>
#include <fsfw/unittest/tests/mocks/HkReceiverMock.h>
/** /**
* @brief Produces system objects. * @brief Produces system objects.
@ -26,6 +32,9 @@ void Factory::produce(void) {
new HealthTable(objects::HEALTH_TABLE); new HealthTable(objects::HEALTH_TABLE);
new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER); new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);
new LocalPoolOwnerBase (objects::TEST_LOCAL_POOL_OWNER_BASE);
new HkReceiverMock(objects::HK_RECEIVER_MOCK);
{ {
PoolManager::LocalPoolConfig poolCfg = { PoolManager::LocalPoolConfig poolCfg = {
{100, 16}, {50, 32}, {25, 64} , {15, 128}, {5, 1024} {100, 16}, {50, 32}, {25, 64} , {15, 128}, {5, 1024}
@ -50,7 +59,23 @@ void Factory::produce(void) {
} }
void Factory::setStaticFrameworkObjectIds() { void Factory::setStaticFrameworkObjectIds() {
PusServiceBase::packetSource = objects::NO_OBJECT;
PusServiceBase::packetDestination = objects::NO_OBJECT;
CommandingServiceBase::defaultPacketSource = objects::NO_OBJECT;
CommandingServiceBase::defaultPacketDestination = objects::NO_OBJECT;
VerificationReporter::messageReceiver = objects::PUS_SERVICE_1_VERIFICATION;
DeviceHandlerBase::powerSwitcherId = objects::NO_OBJECT;
DeviceHandlerBase::rawDataReceiverId = objects::PUS_SERVICE_2_DEVICE_ACCESS;
LocalDataPoolManager::defaultHkDestination = objects::HK_RECEIVER_MOCK;
DeviceHandlerFailureIsolation::powerConfirmationId = objects::NO_OBJECT;
TmPacketStored::timeStamperId = objects::NO_OBJECT;
} }

View File

@ -1,17 +1,16 @@
/** /**
* @file CatchSource.cpp * @file CatchRunner.cpp
* @brief Source file to compile catch framework. * @brief Source file to compile catch framework.
* @details All tests should be written in other files. * @details All tests should be written in other files.
* For eclipse console output, install ANSI Escape in Console * For eclipse console output, install ANSI Escape in Console
* from the eclipse market place to get colored characters. * from the eclipse market place to get colored characters.
*/ */
#ifndef NO_UNIT_TEST_FRAMEWORK #include <TestsConfig.h>
#define CATCH_CONFIG_RUNNER #define CATCH_CONFIG_COLOUR_WINDOWS
#include <catch2/catch.hpp>
#if CUSTOM_UNITTEST_RUNNER == 0 #include <catch2/catch_session.hpp>
extern int customSetup(); extern int customSetup();
@ -25,7 +24,3 @@ int main( int argc, char* argv[] ) {
return result; return result;
} }
#endif
#endif

View File

@ -1,21 +1,20 @@
#include <fsfw/unittest/core/CatchFactory.h> #include "CatchFactory.h"
#include "CatchDefinitions.h" #include "CatchDefinitions.h"
#include <testcfg/cdatapool/dataPoolInit.h>
#ifdef GCOV #ifdef GCOV
#include <gcov.h> #include <gcov.h>
#endif #endif
#include "../../objectmanager/ObjectManager.h" #include <fsfw/objectmanager/ObjectManager.h>
#include "../../objectmanager/ObjectManagerIF.h" #include <fsfw/objectmanager/ObjectManagerIF.h>
#include "../../storagemanager/StorageManagerIF.h" #include <fsfw/storagemanager/StorageManagerIF.h>
#include "../../serviceinterface/ServiceInterfaceStream.h" #include <fsfw/serviceinterface/ServiceInterfaceStream.h>
/* Global instantiations normally done in main.cpp */ /* Global instantiations normally done in main.cpp */
/* Initialize Data Pool */ /* Initialize Data Pool */
#if FSFW_CPP_OSTREAM_ENABLED == 1
namespace sif { namespace sif {
/* Set up output streams */ /* Set up output streams */
ServiceInterfaceStream debug("DEBUG"); ServiceInterfaceStream debug("DEBUG");
@ -23,6 +22,7 @@ ServiceInterfaceStream info("INFO");
ServiceInterfaceStream error("ERROR"); ServiceInterfaceStream error("ERROR");
ServiceInterfaceStream warning("WARNING"); ServiceInterfaceStream warning("WARNING");
} }
#endif
/* Global object manager */ /* Global object manager */
ObjectManagerIF *objectManager; ObjectManagerIF *objectManager;

View File

@ -1,4 +1,4 @@
#include <fsfw/unittest/core/printChar.h> #include "printChar.h"
#include <cstdio> #include <cstdio>
void printChar(const char* character, bool errStream) { void printChar(const char* character, bool errStream) {