Compare commits

..

1431 Commits

Author SHA1 Message Date
7ebfcdda60 added Action::clear()
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-28 17:48:47 +02:00
5c25a2777c datapool working
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-26 22:28:18 +02:00
7f80e91a91 removed HasModesIF::getModeDefinitionHelper(), do not think this will last
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-24 16:01:55 +02:00
732419e239 multiple stuff, need to leave
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-21 14:23:55 +02:00
d328f3e190 handling DatasetEntries
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-18 15:07:21 +02:00
4c0d9ae039 switching to non template set, added valid flag handling 2023-07-18 14:43:18 +02:00
753d587b69 valid flags in housekeeping tm
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-18 13:17:34 +02:00
979a7b7d75 TM working
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-14 16:10:21 +02:00
a30146a799 working on TM
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-14 14:11:22 +02:00
ae2823ba2d tm path 2023-07-12 14:19:58 +02:00
3a433915f1 moved action parameters to a generic place to use them for HK TM
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-12 12:52:07 +02:00
d766469f1e working on HK and Dataset TM
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-11 14:57:17 +02:00
33a2fb48e5 WIP Datapool
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-10 17:07:39 +02:00
531d8c45e8 removed hardcoded ip information
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-10 16:17:05 +02:00
14a7dd885b removed debug code and typo
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-06 13:33:59 +02:00
50a4ec97ef working on tm
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-05 23:47:07 +02:00
de93bff561 working on tm
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-05 13:49:03 +02:00
ad4adc7cba breaking everything in preperation of new Datapool
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-07-03 17:10:16 +02:00
6a76857f5f clearer wording 2023-07-03 10:09:47 +02:00
2044e1cde2 event manager debug prints
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-06-23 16:22:53 +02:00
b56b54951b missed one GCC13 adaption 2023-06-23 16:22:19 +02:00
1fc50a1562 lots of breaking some patching back together
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-06-20 15:14:15 +02:00
e831ba11d2 breaking everything, WIP
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-06-19 17:27:25 +02:00
0da490481e Merge branch 'development' into mohr_introspection
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-06-02 15:20:00 +02:00
146c3471d0 Merge pull request 'fixes for GCC13' (#750) from mohr/GCC13 into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #750
2023-06-02 13:40:35 +02:00
1816c3f623 Merge pull request 'CFDP bugfix' (#749) from eive/fsfw:cfdp-bugfix-unittest-fixes into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #749
2023-06-02 13:30:54 +02:00
d03d5aa74c fixing host osal for GCC13
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
2023-06-02 12:02:37 +02:00
26e97ddf89 overload vs override clarification for GCC13; Also, cmake-format
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2023-06-02 11:33:20 +02:00
be3a57a795 bump ETL and Catch2 version 2023-06-01 17:54:38 +02:00
318a933b3b Builds, unittests failing
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-06-01 17:51:55 +02:00
13b97abf0d fixing build failure for master and development branch
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2023-06-01 17:06:19 +02:00
e8480cf962 Merge remote-tracking branch 'origin/development' into mohr_introspection 2023-06-01 15:08:03 +02:00
a5e6107001 bug found by unittest 2023-06-01 14:56:05 +02:00
f95c373076 Merge pull request 'TCP/IP server fixes and improvements' (#747) from eive/fsfw:tcpip_server_fixes_improvements into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #747
2023-05-25 16:04:28 +02:00
e03731bcf8 Merge pull request 'event manager improvements' (#741) from eive/fsfw:event_manager_improvements into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #741
2023-05-25 15:46:42 +02:00
9fe8579377 CFDP bugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-05-25 15:11:56 +02:00
2714e588d7 improvements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-05-25 15:01:53 +02:00
e905288adc Merge remote-tracking branch 'upstream/development' into tcpip_server_fixes_improvements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-05-25 15:00:42 +02:00
3805ea50a7 remove unused constant
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-05-25 14:58:18 +02:00
699bd694cd Merge branch 'development' into event_manager_improvements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-05-25 14:44:22 +02:00
4518fec65c CHANGELOG
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-05-08 15:25:47 +02:00
dac1aacab2 Merge pull request 'Update Power Switch IF' (#743) from eive/fsfw:update_power_switch_if into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #743
2023-05-08 15:00:47 +02:00
0042f92fdf Merge pull request 'bump ETL version' (#748) from KSat/fsfw:bump_etl_dep into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #748
2023-05-08 14:53:02 +02:00
656faf8169 Merge remote-tracking branch 'upstream/development' into update_power_switch_if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-05-08 14:44:27 +02:00
f84431e965 Merge pull request 'bugfix and changelog for Linux getUptime' (#745) from eive/fsfw:important_bugfix_linux_get_uptime into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #745
2023-05-08 14:29:55 +02:00
0cec9ebb73 Merge pull request 'small tweak for version getter' (#744) from eive/fsfw:small_version_getter_tweak into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #744
2023-05-08 14:13:06 +02:00
a440b7c394 Merge pull request 'add CFDP subsystem ID' (#742) from eive/fsfw:add_cfdp_subsystem_id into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #742
2023-05-08 14:09:04 +02:00
bbfc1b2b34 Merge pull request 'FixedArrayList compile time assert' (#740) from eive/fsfw:container_additional_assert into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #740
2023-05-08 14:04:56 +02:00
025b379e8b bump ETL version
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-05-04 14:04:55 +02:00
c35a0a8541 TCP/IP server fixes and improvements
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-03-15 12:40:44 +01:00
0f81d5e458 Merge remote-tracking branch 'upstream/development' into container_additional_assert
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-03-15 12:34:36 +01:00
e0a072859b Merge remote-tracking branch 'upstream/development' into event_manager_improvements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-03-15 12:33:57 +01:00
b50f092939 Merge remote-tracking branch 'upstream/development' into update_power_switch_if
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-03-15 12:33:08 +01:00
2f90e12179 Merge remote-tracking branch 'upstream/development' into important_bugfix_linux_get_uptime
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2023-03-15 12:32:25 +01:00
8b77fac099 Merge pull request 'health service fixes and changelog' (#746) from eive/fsfw:health_service_fixes into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #746
2023-03-15 12:29:31 +01:00
47503824d7 health service fixes and changelog
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2023-03-15 12:27:39 +01:00
5e3f5c4121 fuse update
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-03-15 12:25:39 +01:00
1f36c082ef bugfix and changelog for Linux getUptime
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-03-15 12:21:50 +01:00
aa84e93603 small tweak for version getter
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2023-03-15 12:17:36 +01:00
8f63a0e747 changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-03-15 12:15:21 +01:00
6fc8f756a7 update power switch IF 2023-03-15 12:13:55 +01:00
067cb7d0f8 update catch factory
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-03-15 12:11:22 +01:00
d98ed40e3d add CFDP subsystem ID
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2023-03-15 12:09:30 +01:00
2c17af4ef8 changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-03-15 12:06:13 +01:00
110fb43b9c event manager improvements
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-03-15 12:05:22 +01:00
b057250bfb changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-03-15 11:53:12 +01:00
066dd0d397 changelog 2023-03-15 11:52:20 +01:00
f735c2e9d4 assert size larger than 0 2023-03-15 11:51:51 +01:00
dc7afc5415 Version bump, CHANGELOG update, format
Some checks failed
fsfw/fsfw/pipeline/pr-master This commit looks good
fsfw/fsfw/pipeline/head There was a failure building this commit
2023-02-23 13:38:24 +01:00
9bf3ff95b7 Merge pull request 'Add Health Service Announce All Health Info' (#725) from eive/fsfw:add_health_service_announce_all into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #725
2023-02-23 13:13:56 +01:00
61562b18ab Merge branch 'development' into add_health_service_announce_all
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-23 12:56:12 +01:00
d76d97a36b changed health table parameter to objectId
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-23 12:44:42 +01:00
76b377c4c0 Merge pull request 'Mode Service: Add allowed subservice' (#739) from eive/fsfw:small_mode_service_fix into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #739
2023-02-20 13:40:53 +01:00
3562bf11b9 CHANGELOG update
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
2023-02-10 11:06:46 +01:00
fffb2b61e5 release check helper 2023-02-10 11:06:30 +01:00
94e5f62331 add allowed subservice
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-09 18:30:08 +01:00
0a9c563bbc format 2023-02-09 15:58:48 +01:00
fa7675897d Merge pull request 'Mode Service Bugfixes' (#736) from eive/fsfw:mode_service_fixes into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #736
2023-02-09 15:56:26 +01:00
3a2393885f more style
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-09 15:44:39 +01:00
c752b6d143 Merge pull request 'Generic TMTC Bridge Update' (#734) from eive/fsfw:tmtcbridge_tweaks into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #734
2023-02-09 15:37:35 +01:00
b676040c7c Merge pull request 'CMakeLists file updates' (#731) from eive/fsfw:cmakelists_update into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #731
2023-02-09 15:29:46 +01:00
010509efb4 removed unneeded find_package parameter for etl
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-09 13:50:16 +01:00
dfb1633f00 Merge branch 'development' into mode_service_fixes
Some checks reported errors
fsfw/fsfw/pipeline/pr-development Something is wrong with the build of this commit
2023-02-09 13:46:19 +01:00
5f7172e130 Merge pull request 'TCP/IP TMTC bridge memory leak fixes' (#737) from eive/fsfw:possible_tcpip_bridge_fixes into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #737
2023-02-09 12:15:45 +01:00
0c6465cd95 Merge pull request 'time stamper empty ctor' (#730) from eive/fsfw:empty_cds_short_ctor into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #730
2023-02-09 11:45:49 +01:00
f94987c46d Merge pull request 'RM3100 important bugfix' (#733) from eive/fsfw:rm3100_fixes into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #733
2023-02-09 11:41:53 +01:00
1809ce359b Merge pull request 'comment tweak to event parser can read everything' (#732) from eive/fsfw:health_if_update into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #732
2023-02-09 11:39:53 +01:00
8c712441ab Making fetch Catch2 quiet as well.
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-09 11:34:58 +01:00
f1b0ca7cff add PR link
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-08 21:26:37 +01:00
000df85556 bump changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-08 21:24:00 +01:00
1fffcc2229 possiible leak fixes 2023-02-08 21:23:21 +01:00
a419806a05 Merge remote-tracking branch 'upstream/development' into mode_service_fixes
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-08 09:33:13 +01:00
6445debfa1 bump changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-08 09:24:55 +01:00
8014e4adf9 mode service fixes 2023-02-08 09:23:48 +01:00
134d908f26 that stuff is not in upstream yet..
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2023-02-07 12:52:18 +01:00
40a9e12416 1000 is a bit much
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-07 12:47:40 +01:00
f39054edd4 introduce warning switch 2023-02-07 12:45:29 +01:00
5adf89b911 changelog update
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-07 12:41:42 +01:00
c2e6a22dec important bugfix for RM3100 2023-02-07 12:39:43 +01:00
c8e065a713 comment tweak to event parser can read everything
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-07 12:36:42 +01:00
3ed49dbae3 Merge remote-tracking branch 'upstream/development' into empty_cds_short_ctor
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2023-02-07 12:24:02 +01:00
4cf52d5dfe Merge pull request 'Time Service 9 update' (#726) from eive/fsfw:updates_fixes_pus_time_service into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #726
2023-02-07 12:19:45 +01:00
539d7aac9e suppress error if ETL is not found
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-07 12:17:03 +01:00
0a23f2c85a correction for printout, add prefix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-07 12:15:44 +01:00
46230e6c6d Merge remote-tracking branch 'upstream/development' into updates_fixes_pus_time_service
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-07 12:11:29 +01:00
b22d439300 bump changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-07 12:10:11 +01:00
7e7b3bbbc9 time stamper empty ctor
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-07 12:07:41 +01:00
5b92247fbd Merge branch 'development' into add_health_service_announce_all
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-06 16:31:05 +01:00
e2b66df72e Merge pull request 'various fixes related to linux Unittests and memory leaks' (#715) from eive/fsfw:unittest_fix_semaphore into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #715
2023-02-06 16:30:37 +01:00
d9da55fdab Merge branch 'development' into add_health_service_announce_all
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-06 15:03:52 +01:00
7b828f233a Merge pull request 'I2C Linux: remove duplicate printout' (#718) from eive/fsfw:i2c_remove_duplicate_printout into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #718
2023-02-06 14:54:58 +01:00
c3d1000cd5 Merge branch 'development' into unittest_fix_semaphore
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-06 14:46:45 +01:00
8e0e57714d Merge pull request 'allow using SO_REUSEADDR and SO_REUSEPORT on TCP server' (#722) from eive/fsfw:tcp_server_reuseaddr_reusesocket into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #722
2023-02-06 14:45:40 +01:00
066f7a6f9b remove unreachable code
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-06 14:41:14 +01:00
cc9e54ea6b Merge pull request 'improve srv20 error messages' (#723) from eive/fsfw:srv20_error_msgs into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #723
2023-02-06 14:37:26 +01:00
31465a4e0f Merge pull request 'MGM: small tweak, gain factor was always them same' (#724) from eive/fsfw:mgm_handler_small_fix into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #724
2023-02-06 14:36:34 +01:00
c0e5d1eb99 Merge branch 'development' into tcp_server_reuseaddr_reusesocket
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-06 14:34:52 +01:00
3bc5d4a2e0 Merge remote-tracking branch 'upstream/development' into mgm_handler_small_fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-06 14:25:33 +01:00
b1e9dd9e4a Merge remote-tracking branch 'upstream/development' into updates_fixes_pus_time_service
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-06 14:24:38 +01:00
ab86599db3 Merge pull request 'Bugfix DHB setNormalDatapoolEntriesInvalid' (#728) from eive/fsfw:bugfix_dhb_set_datapool_entries_invalid into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #728
2023-02-06 14:20:34 +01:00
034eb34c2e small tweak
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-03 16:05:50 +01:00
4374c7c4f4 changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-03 16:01:56 +01:00
5343844be5 bugfix in setNormalDataPoolEntriesInvalid
Do not forget to call read and write to actually update the
validity state
2023-02-03 16:00:55 +01:00
e300490b93 Merge pull request 'Bugfix PUS packet creators Sequence flags' (#727) from eive/fsfw:bugfix_pus_packets_seq_flags into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-master This commit looks good
Reviewed-on: #727
2023-02-02 17:22:29 +01:00
0f811777a7 changelog update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-01 20:49:53 +01:00
e93137939e set sequence flags for PUS TMTC to unsegmented 2023-02-01 20:48:26 +01:00
c1f42618db small but important bugfix for health service
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-01 19:59:32 +01:00
1f88c006d9 update changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-02-01 18:42:09 +01:00
7e94baceef service 9 update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
- fix time info event
- add time dump subservice
2023-02-01 18:39:23 +01:00
61df451dd8 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-02-01 17:41:47 +01:00
29ea89044e beatufil 2023-02-01 17:35:49 +01:00
e487f5be87 proper announce all impl 2023-02-01 17:35:32 +01:00
9b05e8f274 re-order fields in TcpConfig
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-01-30 14:24:48 +01:00
eb223dae88 bump changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2023-01-30 14:20:28 +01:00
3656662d88 small tweak, gain factory was always them same
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-01-30 14:18:03 +01:00
fe71978467 improve srv20 error messages
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2023-01-30 14:15:37 +01:00
b646717a76 bump changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-01-30 14:11:00 +01:00
99d8c845f2 allow using SO_REUSEADDR and SO_REUSEPORT on TCP server
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-01-30 14:07:41 +01:00
0e7c6b117f Merge pull request 'Service 11 TC Scheduler Robustness Improvements' (#720) from service_11_bugfixes into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #720
2023-01-13 13:33:19 +01:00
d16c5024dc small include improvement
Some checks are pending
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head Build queued...
2023-01-13 11:15:36 +01:00
a4531e4ced typo
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-01-13 10:59:39 +01:00
97c629ad84 update changelog
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2023-01-13 10:53:36 +01:00
bf12f284fa add size and crc check for contained TC 2023-01-13 10:53:04 +01:00
ba62c28b64 adding linux ci and fixing problems
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-01-12 15:40:52 +01:00
7adb47aecb remove duplicate printout
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2023-01-11 08:45:37 +01:00
8589f4d63a Merge pull request 'updates for source sequence counter' (#714) from eive/fsfw:source_seq_counter_update into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #714
2022-12-19 15:00:28 +01:00
ca80589233 make get const
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-12-19 14:58:08 +01:00
f2ebaed092 Merge pull request 'vec getter, reset for content' (#716) from eive/fsfw:get_cmd_exec_read_buf into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #716
2022-12-19 14:56:11 +01:00
f0b89e98df Merge pull request 'printout handling improvements' (#717) from eive/fsfw:i2c_printout_improvements into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #717
2022-12-19 14:45:04 +01:00
5557d95994 Merge branch 'development' into i2c_printout_improvements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-12-05 14:20:58 +01:00
fc24c9b5d8 Merge branch 'development' into get_cmd_exec_read_buf
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-12-05 14:20:52 +01:00
7ef69c839c Merge pull request 'small fix to allow teardown handling' (#713) from eive/fsfw:mueller/shutdown_for_failed_to_on_transition into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #713
2022-11-28 14:30:15 +01:00
9b798d798e Merge pull request 'DLE parser' (#711) from eive/fsfw:mueller/dle_parser into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #711
2022-11-28 14:13:18 +01:00
b13453f46b vec getter, reset for content
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-28 08:43:54 +01:00
d0e322d7e2 printout handling improvements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-28 08:42:08 +01:00
ecde164f68 updates for source sequence counter
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2022-11-28 08:30:45 +01:00
50930b41ba Merge remote-tracking branch 'upstream/development' into mueller/dle_parser
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-28 08:27:24 +01:00
d6ee2ed400 Merge pull request 'AcceptsTelemetryIF tweaks' (#712) from eive/fsfw:mueller/accepts_tm_if_adaptions into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #712
2022-11-21 16:30:43 +01:00
f2150ff9c2 Merge pull request 'only delete table entry if not nullptr' (#710) from eive/fsfw:mueller/health_helper_bugfix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #710
2022-11-21 16:24:13 +01:00
1b9c98f3fe Merge pull request 'uio able to resolve symlinks now' (#709) from eive/fsfw:mueller/uio_mapper_handle_symlinks into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #709
2022-11-21 16:14:36 +01:00
742152b28e Merge branch 'development' into mueller/accepts_tm_if_adaptions
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 15:29:35 +01:00
bf4ca56658 Merge branch 'development' into mueller/shutdown_for_failed_to_on_transition
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 15:29:11 +01:00
16ffa00155 Merge branch 'development' into mueller/dle_parser
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-11-21 15:28:34 +01:00
14c681c93a Merge branch 'development' into mueller/uio_mapper_handle_symlinks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 15:27:06 +01:00
0958c3a00e Merge branch 'development' into mueller/health_helper_bugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 15:24:51 +01:00
d699d16307 Merge pull request 'SP reader getPacketData is const now' (#708) from eive/fsfw:mueller/sp_reader_const_get_data into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #708
2022-11-21 15:23:39 +01:00
3b0fed733f Merge branch 'development' into mueller/uio_mapper_handle_symlinks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 15:23:15 +01:00
23d3812fe3 this is actually important
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 15:22:25 +01:00
dec7db3ae2 Merge remote-tracking branch 'upstream/development' into mueller/accepts_tm_if_adaptions
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 15:00:06 +01:00
65a5abab49 move free call
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 14:56:08 +01:00
0129783e34 Merge branch 'development' into mueller/sp_reader_const_get_data
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-21 14:50:44 +01:00
cabe0868ec Merge pull request 'move container returnvalues to namespace' (#707) from eive/fsfw:mueller/update_containers_retval into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #707
2022-11-21 14:49:44 +01:00
f05295bada small fix to allow teardown handling
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-17 15:16:29 +01:00
b85ca64690 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 11:48:28 +01:00
3bc3da5a8d update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 11:47:26 +01:00
f8c07ec9cf update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 11:46:43 +01:00
8199b8f359 bump changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 11:45:39 +01:00
cbc8dbcdd4 update changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-11-15 11:44:45 +01:00
d31a5306f0 fix mock
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 11:41:03 +01:00
a236a5ec50 adaptions for AcceptsTelemetryIF 2022-11-15 11:40:26 +01:00
03620970e2 function to get queue is const now 2022-11-15 11:38:32 +01:00
8fe8d810e9 only delete table if not nullptr
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 11:27:31 +01:00
9483c2809d DLE parser
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 11:26:53 +01:00
fe3d6bd432 uio able to resolve symlinks now
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 10:56:46 +01:00
2a842666d5 SP reader getPacketData is const now
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 10:46:46 +01:00
c013fcc1f5 move container retvals to namespace
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-15 10:01:37 +01:00
1b8fc2af19 Merge pull request 'CFDP Update' (#682) from mueller/cfdp-update-without-handlers into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #682
2022-11-14 15:04:43 +01:00
72d7c43445 updates for storage manager mock
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-14 14:57:37 +01:00
ab9b6c8c89 Merge remote-tracking branch 'origin/development' into mueller/cfdp-update-without-handlers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-11-14 14:51:33 +01:00
69d338f9bb Merge pull request 'Local Pool Update Remove Add Data Ignore Fault Argument' (#701) from eive/fsfw:mueller/local-pool-update-remove-ignore-fault-arg into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #701
2022-11-14 14:49:34 +01:00
68223869d5 Merge branch 'development' into mueller/local-pool-update-remove-ignore-fault-arg
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-14 14:47:07 +01:00
93fda71989 Merge pull request 'refactoring of serial drivers for linux' (#705) from eive/fsfw:mueller/refactor_serial_linux into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #705
2022-11-14 14:39:41 +01:00
7b0db08962 Merge branch 'development' into mueller/refactor_serial_linux
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-14 14:36:31 +01:00
0956fbc740 Merge pull request 'fix compiler warning for fixed array list copy ctor' (#704) from eive/fsfw:mueller/fixed_array_list_copy_ctor into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #704
2022-11-14 14:28:46 +01:00
b48e0fdc0d Merge remote-tracking branch 'origin/development' into mueller/cfdp-update-without-handlers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-11-14 14:25:36 +01:00
1d084ee22f Merge branch 'development' into mueller/fixed_array_list_copy_ctor
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-14 14:21:04 +01:00
1bea2344f6 remove using declaraction
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-14 14:21:00 +01:00
d7e16a67a7 Merge pull request 'Windows Tweaks' (#691) from eive/fsfw:windows-tweaks-upstream into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #691
2022-11-14 14:18:47 +01:00
6021d897b8 Merge branch 'development' into windows-tweaks-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-14 14:13:57 +01:00
83a6f0b5f8 reenable setup function call
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-14 14:12:26 +01:00
a9c6c088f2 remove leftover debugging code
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-14 14:08:38 +01:00
b6a3c206cc smaller include tweaks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-11 11:34:58 +01:00
5b352978c5 rename cookie class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-11 11:33:35 +01:00
819a298b19 refactoring of serial drivers for linux
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-10 17:50:21 +01:00
16246d6ece replace other memcpy
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-10 16:18:36 +01:00
5c84f12440 this not crash
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-10 16:15:52 +01:00
83c2c4825c fix compiler error for fixed array list copy ctor
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-11-10 15:54:03 +01:00
c913fe40bf tweaks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-09 17:54:08 +01:00
70ec08bf1d Merge pull request 'missing include' (#703) from KSat/fsfw:mueller/time_reader_include into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #703
2022-11-09 16:59:25 +01:00
ef23665d9c Merge branch 'development' into mueller/time_reader_include 2022-11-09 16:39:55 +01:00
eefc122292 Merge pull request 'defaultconfig did not build anymore' (#702) from mohr/fix_defaultconfig into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #702
2022-11-09 14:12:41 +01:00
bee33526a1 missing include
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-11-09 13:49:40 +01:00
f715b65d6e Merge remote-tracking branch 'upstream/development' into mueller/local-pool-update-remove-ignore-fault-arg
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-28 10:06:04 +02:00
c11af63015 Merge remote-tracking branch 'origin/development' into mueller/cfdp-update-without-handlers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-28 10:04:21 +02:00
11a22577be defaultconfig did not build anymore
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-25 11:28:13 +02:00
dc1583c932 Merge branch 'development' into windows-tweaks-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-24 17:10:44 +02:00
94f1f1f908 Merge pull request 'Refactor TM and TC acceptor interfaces' (#684) from mueller/refactor-accepts-tc-tm-if into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #684
2022-10-24 17:10:03 +02:00
81a7de2814 make dtor virtual
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-24 16:39:32 +02:00
d26f230bee builds
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-24 15:43:20 +02:00
4db124c680 ignore fault 2022-10-24 15:41:29 +02:00
955579c856 Merge branch 'development' into mueller/refactor-accepts-tc-tm-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-24 14:57:38 +02:00
2df66c9304 Merge branch 'mueller/local-pool-update' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/local-pool-update
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-24 14:39:11 +02:00
54ad6b3016 add some docs 2022-10-24 14:39:05 +02:00
73e313c35b Merge branch 'development' into mueller/local-pool-update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-24 14:35:24 +02:00
c6585c8645 Merge pull request 'important bugfix for linux i2c device com IF' (#700) from eive/fsfw:mueller/i2c-com-if-bugfix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #700
2022-10-24 14:35:01 +02:00
dd2f42d22b Merge branch 'development' into mueller/local-pool-update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-24 14:34:56 +02:00
d8a4675842 bump changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-24 14:30:14 +02:00
1164c21ddd iter not a member anymore, more bugfixes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-24 14:23:43 +02:00
77b1a85b47 important bugfix for i2c device com IF
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-20 14:24:40 +02:00
652c31a683 missing validity check
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-10-17 17:25:27 +02:00
bfe120636c this should have the same effect
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-17 15:08:46 +02:00
a8041f220f Merge branch 'development' into mueller/cfdp-update-without-handlers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-17 14:44:28 +02:00
dd636b186b size check bugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-17 14:30:27 +02:00
3349fc36f8 Merge branch 'development' into windows-tweaks-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-17 14:20:48 +02:00
f3e9277e59 Merge branch 'development' into mueller/refactor-accepts-tc-tm-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-10 15:45:05 +02:00
d592f1ecbc Merge pull request 'Minor API tweak' (#689) from eive/fsfw:mueller/smaller-tweaks into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #689
2022-10-10 15:10:57 +02:00
6ec18171a8 Merge pull request 'now that doc server is up, remove markdown files' (#688) from mueller/remove-markdown-docs into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #688
2022-10-10 15:04:11 +02:00
518dcdef4b Merge branch 'development' into mueller/smaller-tweaks
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2022-10-10 15:03:04 +02:00
d9730032fd Merge pull request 'DHB Countdown Bug' (#693) from eive/fsfw:mueller/dhb-countdown-bug into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #693
2022-10-10 14:55:43 +02:00
b3ac72b7db Merge pull request 'missing retval conv' (#697) from mueller/missing-retval-conversion into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #697
2022-10-10 14:54:26 +02:00
cd0cb43412 Merge branch 'development' into mueller/missing-retval-conversion
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-10 14:46:10 +02:00
32c12b3dbf Merge pull request 'small fix for helper' (#698) from mueller/small-helper-script-fix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #698
2022-10-10 14:43:59 +02:00
3e9acf476e Merge branch 'development' into mueller/small-helper-script-fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-10 14:25:49 +02:00
99101ce2bf Merge pull request 'hotfix' (#699) from eive/fsfw:mueller/dhb-some-more-fixes into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #699
2022-10-10 14:22:30 +02:00
6b991045f7 Merge branch 'development' into mueller/smaller-tweaks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-10 13:41:47 +02:00
df06064df0 Merge branch 'development' into windows-tweaks-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-10 13:41:09 +02:00
337cb0d6c9 hotfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-10 10:21:17 +02:00
c283e0c988 okay this is correct
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-04 11:02:08 +02:00
448d20f3bd small fix for helper
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-04 10:55:46 +02:00
2316728d74 Merge branch 'development' into mueller/dhb-countdown-bug
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2022-10-04 10:53:26 +02:00
6f562e5f3e missing retval conv
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-10-04 10:25:58 +02:00
176f243194 Merge pull request 'Switch to new documentation server' (#694) from mohr/documentation_ci into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #694
2022-09-30 15:05:16 +02:00
d964fa2107 Merge branch 'development' into mohr/documentation_ci
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
2022-09-30 14:50:20 +02:00
7b5ae6a445 done?
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-30 14:40:59 +02:00
8e362a000c Revert "one last check"
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
This reverts commit 7877776e24.
2022-09-30 14:36:25 +02:00
7877776e24 one last check
Some checks reported errors
fsfw/fsfw/pipeline/head Something is wrong with the build of this commit
2022-09-30 14:34:25 +02:00
3de0ae5a48 DHB bug
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-29 17:22:44 +02:00
e0c780f21c better comment
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-28 09:59:31 +02:00
876815b1c9 another small windows tweak 2022-09-28 09:59:22 +02:00
b0ecf87580 last windows tweak 2022-09-28 09:59:12 +02:00
68ce8b5b08 tweaks to make windows build again 2022-09-28 09:59:02 +02:00
fe03da6def Merge remote-tracking branch 'origin/development' into mueller/cfdp-update-without-handlers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 15:38:45 +02:00
95ac53c417 Merge branch 'development' into mueller/smaller-tweaks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:40:29 +02:00
62f638a3d2 Merge pull request 'doc corrections' (#687) from mueller/doc-corrections into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #687
2022-09-26 14:38:39 +02:00
bd64591f30 Merge branch 'development' into mueller/smaller-tweaks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:34:38 +02:00
e6a877f048 Merge branch 'development' into mueller/doc-corrections
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:26:48 +02:00
ea8c557ee8 Merge pull request 'better error printout' (#686) from eive/fsfw:mueller/local-pool-obj-base-better-warning into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #686
2022-09-26 14:26:20 +02:00
0bdd780f82 Merge branch 'development' into mueller/doc-corrections
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:17:24 +02:00
9ec397c8b7 Merge branch 'development' into mueller/local-pool-obj-base-better-warning
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:17:19 +02:00
c54d9d7ba6 add some tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:15:11 +02:00
30c03c110c Merge pull request 'include correction' (#683) from mueller/service-interface-include-correction into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #683
2022-09-26 14:14:57 +02:00
69f1be263a Merge branch 'development' into mueller/local-pool-obj-base-better-warning
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:10:21 +02:00
c7b5309dcb Merge branch 'development' into mueller/service-interface-include-correction
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-26 14:08:38 +02:00
775d5632de update to ssh connection to doc server
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-23 20:26:45 +02:00
4f3361eb2b another ci check
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-23 18:33:47 +02:00
9e6c1d60e5 another ci check
Some checks failed
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-23 17:54:41 +02:00
12d0c23c13 Revert "testing deployment of documentation"
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
This reverts commit 5488ee715f.
2022-09-23 17:31:17 +02:00
5c3bb13834 Revert "testing deployment of both development and master doc"
This reverts commit c0000a8635.
2022-09-23 17:31:07 +02:00
292fe3e5e4 forgot epilog file
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-23 17:11:57 +02:00
33530f2819 adding Impressum and Datenschutz to lcov output
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-23 17:04:35 +02:00
c0000a8635 testing deployment of both development and master doc
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-23 14:14:10 +02:00
5488ee715f testing deployment of documentation
Some checks reported errors
fsfw/fsfw/pipeline/head Something is wrong with the build of this commit
2022-09-23 14:07:12 +02:00
0fea22d031 switching to rsync and deploying to web documentation 2022-09-23 14:06:28 +02:00
3b8ca09299 prepared docker for documentation rsync
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-23 13:46:03 +02:00
9a2146fa2d added impressum and datenschutz in sphinx documentation
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-23 11:36:29 +02:00
558550ecb9 Merge branch 'development' into mueller/smaller-tweaks
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-09-16 18:37:39 +02:00
72172a972b update changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-16 18:24:23 +02:00
b4b11ebd3b fixes and tweaks 2022-09-16 18:20:42 +02:00
6f8ccf83e7 use singular enum names
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 18:41:15 +02:00
67f1cd0b5f Merge branch 'development' into mueller/cfdp-update-without-handlers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 18:35:22 +02:00
54762232a4 refactoring and condition code to strin converter
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 16:46:09 +02:00
2fee2fdff5 unittest which would have caught this
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 16:20:52 +02:00
954c749de0 additional docs
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 16:02:46 +02:00
bcbbc9763a markdown update not required, will be removed
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 14:00:01 +02:00
0042372cb6 now that doc server is up, remove markdown files
Some checks are pending
fsfw/fsfw/pipeline/head Build queued...
fsfw/fsfw/pipeline/pr-development Build started...
2022-09-15 13:58:13 +02:00
8dea13742f update rst file
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 13:57:39 +02:00
0f027d29d2 doc corrections
Some checks are pending
fsfw/fsfw/pipeline/head Build queued...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 13:53:42 +02:00
131e3ff1e3 Revert "doc corrections"
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
This reverts commit 423a9540ed.
2022-09-15 13:52:28 +02:00
423a9540ed doc corrections
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 13:51:59 +02:00
ce7146e468 printout tweak
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 13:40:12 +02:00
a681a4a797 better error printout
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 13:38:38 +02:00
e585c1d84a Merge remote-tracking branch 'origin/development' into mueller/cfdp-update-without-handlers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 11:02:04 +02:00
83b7b8707c Merge remote-tracking branch 'origin/development' into mueller/refactor-accepts-tc-tm-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 11:01:19 +02:00
4002b74ea2 Merge branch 'development' into mueller/service-interface-include-correction
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 11:01:06 +02:00
4f7f8310c9 Merge remote-tracking branch 'origin/development' into mueller/local-pool-update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 11:00:43 +02:00
1a833e2d45 another missing changelog entry
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:59:10 +02:00
8df6d934d7 another missing changelog entry
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:56:52 +02:00
5363868120 added another missing changelog entry
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:54:45 +02:00
36cf59cc8e Merge branch 'mueller/refactor-accepts-tc-tm-if' into mueller/cfdp-update-without-handlers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 10:52:13 +02:00
97fec909f2 Merge branch 'mueller/local-pool-update' into mueller/cfdp-update-without-handlers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 10:50:35 +02:00
1db77753e3 Merge remote-tracking branch 'origin/development' into mueller/local-pool-update
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 10:49:24 +02:00
8501477a78 Merge remote-tracking branch 'origin/development' into mueller/refactor-accepts-tc-tm-if
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 10:48:42 +02:00
6eea711d9f Merge branch 'development' into mueller/service-interface-include-correction
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 10:48:28 +02:00
9a181aa6a8 another missing changelog entry
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:47:50 +02:00
655c944c0e another missing changelog entry
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:45:35 +02:00
2e310fca8d add another missing changelog entry
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:43:45 +02:00
37390dfc74 add missing changelog entry
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-15 10:42:35 +02:00
75ddfdc65d Merge branch 'mueller/refactor-accepts-tc-tm-if' into mueller/cfdp-update-without-handlers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 10:41:16 +02:00
1efc0d2855 update changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 10:38:40 +02:00
e063b44899 add link to PR
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-15 10:32:38 +02:00
b3c0e24611 bump changelog
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-15 10:31:55 +02:00
ab7c3480f5 storage manager update 2022-09-15 10:30:22 +02:00
237e29cc59 all necessary modifications
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-14 20:21:03 +02:00
0849c8a08d adding files manually 2022-09-14 20:10:41 +02:00
9d626e0a5d include correction
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-14 19:59:02 +02:00
723f8749d4 bump changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-14 19:52:33 +02:00
2e27a85c95 finished renaming operation
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-14 19:48:11 +02:00
73f1917c81 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-14 19:26:07 +02:00
3a52454949 removed handlers
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-14 19:15:52 +02:00
ac7dc55fc1 fix unittest
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
2022-09-14 19:07:17 +02:00
389d804735 Merge remote-tracking branch 'origin/development' into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-14 19:05:59 +02:00
44615c150b add printout capabilities
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-14 14:00:20 +02:00
0ce568ad26 Merge pull request 'publish documentation for development and master branch' (#681) from mohr/documentation_ci into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #681
2022-09-14 11:22:35 +02:00
6970068d56 small fix in README
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-13 18:19:35 +02:00
af282c7d3e reverting to only publish development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 18:17:56 +02:00
21a9d89fb3 pushing code coverage report to documentation server
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 18:14:26 +02:00
3257935150 fixing scp yet again again
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 18:06:16 +02:00
f34cf9095d fixing scp yet again
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 18:02:38 +02:00
24ecf125a3 fixing scp command again
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 17:55:12 +02:00
6451a16888 fixing scp command
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 17:51:01 +02:00
4dadef34fd Merge remote-tracking branch 'origin/development' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-13 15:35:59 +02:00
382543fc59 important bugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-13 15:26:14 +02:00
fa5605c959 testing Jenkinsfile
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 14:50:37 +02:00
a1ea671e2f header include update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-13 14:46:41 +02:00
8e835be55f testing Jenkinsfile
Some checks reported errors
fsfw/fsfw/pipeline/head Something is wrong with the build of this commit
2022-09-13 14:46:12 +02:00
9bd600c488 testing Jenkinsfile
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 14:32:10 +02:00
9c7248e78e typo in Dockerfile
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 14:20:30 +02:00
ecf51b2913 testing Jenkinsfile
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 14:09:08 +02:00
8bbde05413 add jenkins user in docker so that ssh will work
Some checks reported errors
fsfw/fsfw/pipeline/head Something is wrong with the build of this commit
2022-09-13 14:08:04 +02:00
d79b5348d8 testing Jenkinsfile
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 14:00:36 +02:00
92e3ab04f3 testing Jenkinsfile
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-13 13:54:23 +02:00
003a6d00fa Documentation build tools in docker
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-09-13 13:13:18 +02:00
26b3e5a013 fix misc def config
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-12 15:14:42 +02:00
3e9b47d3a2 update docs release in conf.py
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-12 15:12:26 +02:00
9ee1896553 Merge pull request 'Refactor Local Pool API' (#667) from mueller/refactor-local-pool-api into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #667
2022-09-12 14:32:08 +02:00
a5b5523111 Merge pull request 'Refactor TMTC Stack, improve test framework' (#655) from mueller/refactor-tmtc-stack into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #655
2022-09-12 14:31:22 +02:00
62cd39e573 Merge pull request 'SerialBufferAdapter refactoring' (#677) from mueller/refactor-serial-buffer-adapter into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #677
2022-09-12 14:30:51 +02:00
278ed36db8 Merge pull request 'bump catch2 version' (#678) from mueller/bump-catch2 into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #678
2022-09-12 14:24:28 +02:00
aed30d54ef Merge pull request 'remove bsp specific code' (#679) from mueller/remove-bsp-specific-code into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #679
2022-09-12 14:23:48 +02:00
1126db2c8a Merge pull request 'remove user includes' (#675) from mueller/remove-user-includes into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #675
2022-09-12 14:15:18 +02:00
a64a04d7fe Merge branch 'development' into mueller/refactor-tmtc-stack
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-09-12 14:14:49 +02:00
80467bf097 Merge pull request 'sif::buffer: if disabeld do not print' (#680) from mohr/enableDisable into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #680
2022-09-12 14:12:13 +02:00
6a6aa7fdd6 Merge branch 'development' into mohr/enableDisable
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-09-12 14:11:38 +02:00
7e379d2159 Merge pull request 'provide a weak print char impl' (#674) from mueller/provide-weak-print-char into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #674
2022-09-12 14:10:31 +02:00
6ae709acc3 Merge branch 'development' into mueller/remove-user-includes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-12 14:07:09 +02:00
34dd478848 helper class OneRemoteConfigProvider
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-08 16:25:19 +02:00
b73754dfd6 implemented basic PDU forwarding
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-08 12:07:16 +02:00
ec1e07b466 some more returncodes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-08 11:53:06 +02:00
d52f335455 sif::buffer: if disabeld do not print
Some checks are pending
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development Build started...
2022-09-08 11:47:40 +02:00
1c527c4946 copy paste fail #2
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-09-08 11:41:32 +02:00
c87667c03f some API improvements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-08 11:26:17 +02:00
683cf8a047 some additional tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-08 11:08:40 +02:00
11a4b27642 allow deferred init
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-07 18:20:38 +02:00
770463e618 remove old code
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-07 18:04:46 +02:00
04b619a15c update header as well
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-07 17:58:49 +02:00
282704e0fd remove bsp specific code
Some checks failed
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-07 17:54:04 +02:00
8971eb386e retval replacement
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-07 17:40:22 +02:00
c54caf134a segmented file transfer working
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 16:33:38 +02:00
aebd401d5b start segmentes file unittest
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 16:14:39 +02:00
67439b4285 refactor away some duplication
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 16:03:26 +02:00
07ef9a0ec3 bump catch2 version
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development Build queued...
2022-09-06 15:47:04 +02:00
af851165b4 continue basic small file transfer unittest
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 15:45:51 +02:00
94c9800fae refactored out generic metadata part
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 14:33:01 +02:00
ba046cebd9 empty file unittest complete
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 14:06:22 +02:00
428da017ba empty file transfer unittest almost done
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 13:45:43 +02:00
806ae9b41a check that indication was called
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 13:16:00 +02:00
7b97c8a182 continue tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-06 11:56:05 +02:00
2e4cdb7366 additional filesystem abstractions
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 17:42:56 +02:00
5a3f05fa79 return struct ref instead of code
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 17:20:29 +02:00
80464f2a81 Merge branch 'mueller/refactor-serial-buffer-adapter' into mueller/refactor-tmtc-stack
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 16:38:58 +02:00
16688316a8 rename setBuffer to setConstBuffer
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development Build started...
2022-09-05 16:31:56 +02:00
ead22c8bd6 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 16:29:10 +02:00
3583e30ee6 rename const buf setter
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 16:27:20 +02:00
61db018a74 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 16:26:29 +02:00
1e395dc402 set buffer expects const pointer now
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 16:25:02 +02:00
afc48726b9 comment out check
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 16:23:13 +02:00
ece5ae59e4 compile fixes 2022-09-05 16:22:41 +02:00
a5d1c38b22 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-05 16:19:34 +02:00
f5421e9abd refactor tm helper
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 16:10:06 +02:00
4c3f9feb93 explicit include
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-05 16:06:24 +02:00
b7ed8ff390 Merge branch 'mueller/refactor-tmtc-stack' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/refactor-tmtc-stack
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-05 16:02:41 +02:00
75dc7a405d del data wrapper 2022-09-05 16:02:32 +02:00
b7a1f79d5b update FSFWCnfig.h
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 15:36:12 +02:00
f0b7a103d4 refactor ctors 2022-09-05 15:30:53 +02:00
fb96250e36 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-05 14:50:43 +02:00
ee93f4a4ca Merge branch 'development' into mueller/refactor-tmtc-stack
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 14:46:51 +02:00
d64ad71529 Some improvements for time stamper API
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 14:44:35 +02:00
5ce1e76723 init dest handler unittests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-05 14:20:01 +02:00
26bc80964e Merge branch 'development' into mueller/provide-weak-print-char
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 14:14:06 +02:00
eb03bf52a6 Merge pull request 'better warning for missing include paths' (#676) from mueller/better-missing-inc-path-warning into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #676
2022-09-05 14:13:19 +02:00
52802f127b basic test stubs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 11:40:22 +02:00
d2c4d546c3 first dest handler unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
- Add new mock class for event reporting proxies
- Add basic setup for unittesting the CFDP destination handler
2022-09-05 11:37:41 +02:00
0dd2b5ddd4 need an event reporter proxy
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 11:19:23 +02:00
3dfc882226 impl finish PDU sending
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 11:03:25 +02:00
b984128de5 stub for creating finished PDU
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 10:30:55 +02:00
134d5a1411 basic impl which allows naked no closure file transfer
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-05 10:26:35 +02:00
3147f67fbd basic dest handler framework almost complete
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 18:03:52 +02:00
108e7737e2 continued dest handler
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 17:54:25 +02:00
c90d1c8071 continue dest handler impl
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 14:39:53 +02:00
eae75b29e7 start file data pdu processing
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 11:58:16 +02:00
dc79b7ba00 delete metadata after processing
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 11:38:46 +02:00
db84dcd3ce afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 11:12:16 +02:00
80355910ee better warning
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 09:05:10 +02:00
04800df31e another user-level-include
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 09:04:37 +02:00
1e85cdadfd remove user includes
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 08:55:33 +02:00
ebc02673dd provide a weak print char impl
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-02 08:50:39 +02:00
935f35a40d Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 17:52:17 +02:00
348af0124b Merge remote-tracking branch 'origin/development' into mueller/cfdp-routers 2022-09-01 17:52:11 +02:00
9202c6c17f Merge branch 'mueller/refactor-tmtc-stack' into mueller/refactor-local-pool-api
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-09-01 17:51:50 +02:00
5f8c549993 Merge remote-tracking branch 'origin/development' into mueller/refactor-local-pool-api 2022-09-01 17:51:44 +02:00
04bff7a522 test fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 17:51:09 +02:00
5c20cc804e Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-09-01 17:48:40 +02:00
eb8e236cd4 Merge pull request 'Bugfix for Space Packet Parser' (#673) from eive/fsfw:mueller/fixes-tmtc-server-sp-parser into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #673
2022-09-01 14:12:16 +02:00
7dec45ccf2 Merge pull request 'Service 11 regression' (#670) from eive/fsfw:mueller/service-11-issues into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #670
2022-09-01 11:59:18 +02:00
2b01e86f9c one small additional precaution
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 11:56:07 +02:00
60fd3d43c0 Merge pull request 'DHB TM handler alternative API raw buffer' (#671) from mueller/dhb-handle-device-tm-2 into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #671
2022-09-01 11:22:17 +02:00
67980cb592 Merge branch 'development' into mueller/fixes-tmtc-server-sp-parser
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 11:21:02 +02:00
3010f2f925 Merge pull request 'DHB set action commander before buildCommandFromCommand' (#672) from eive/fsfw:mueller/dhb-set-action-commander-before-building-cmd into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #672
2022-09-01 11:18:32 +02:00
01651f0521 more simplfications
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 10:52:48 +02:00
c7f300671f update header
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 10:45:10 +02:00
7d3223d766 add comment blocks 2022-09-01 10:44:57 +02:00
7ae82a5cb4 do not cache previous recipient
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 08:58:18 +02:00
28ecd0e5c6 bugfix for SP parser
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-09-01 08:51:12 +02:00
7345c18b04 small fix which allows sending action reply immediately
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-31 16:50:48 +02:00
0de7b66218 new retval for permission errors
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-31 13:26:44 +02:00
158007fa7f const correct API
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-31 00:02:25 +02:00
ab719a3e59 alternative solution
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 23:38:55 +02:00
64a7fde301 this is annoying
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 15:19:01 +02:00
9131ca688b make two helper functions protected
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-30 15:01:10 +02:00
8e6cee7761 Merge branch 'mueller/data-wrapper' into mueller/refactor-tmtc-stack
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-30 13:46:03 +02:00
c756297e5c data wrapper update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 13:39:44 +02:00
0f27c7e7e7 extend data wrapper
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 13:24:29 +02:00
20d42add03 add new data wrapper helper type
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 12:07:09 +02:00
a9277622ce move data wrapper
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 12:04:15 +02:00
80e8511a43 Merge branch 'mueller/cfdp-routers' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 11:21:12 +02:00
4a06f11582 Merge branch 'mueller/refactor-local-pool-api' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 11:12:59 +02:00
32c53b932d Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers 2022-08-30 11:12:53 +02:00
aea9db75cb better name
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 11:12:06 +02:00
9fedd03ed8 use cfg struct for local pool API
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 11:02:21 +02:00
10fc4dd89d Merge branch 'mueller/refactor-tmtc-stack' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/refactor-tmtc-stack
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-30 10:58:06 +02:00
0cc8af5eb0 afmt 2022-08-30 10:57:17 +02:00
92d65aa3a5 use old lpm api 2022-08-30 10:57:02 +02:00
342a56410c delete commented function 2022-08-30 10:28:55 +02:00
2cab73d972 avoid duplicate code
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 20:09:28 +02:00
9a9085b9e6 avoid duplicate code 2022-08-29 20:08:59 +02:00
cb23911ccd default initialization of CDS short struct
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 15:30:45 +02:00
b499dedd76 remove TODO
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 15:27:53 +02:00
1bb487373d Merge branch 'mueller/refactor-tmtc-stack' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/refactor-tmtc-stack
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 15:20:51 +02:00
3bffb4f968 fix for static fw obj setter 2022-08-29 15:20:33 +02:00
6bcb208968 Merge branch 'development' into mueller/refactor-tmtc-stack
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 15:11:50 +02:00
6c2b5ab39e Merge pull request 'improvements for auto-formatter script' (#665) from eive/fsfw:mueller/update-afmt-script into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #665
2022-08-29 15:06:56 +02:00
a7039bad41 Merge pull request 'PUS Service 11: Additional Safety Check' (#666) from eive/fsfw:mueller/service-11-tweak into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #666
2022-08-29 14:59:24 +02:00
6605ffb6b1 Fixing check in Srv 11 Filer
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 14:55:50 +02:00
e2e0190cae Revert "additional safety check"
This reverts commit fd278e410b.
2022-08-29 14:51:14 +02:00
fd278e410b additional safety check
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-29 13:18:54 +02:00
4c0f67adf5 missing implementation in subsystembase
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-26 15:03:17 +02:00
450ad1dad4 ControllerBase Modes 2022-08-26 12:07:59 +02:00
1dfb3323f7 default getModehelper for ControllerBase 2022-08-26 11:53:46 +02:00
f5adcd0625 default getModehelper for subsystembase 2022-08-26 10:57:05 +02:00
bc593c938d some more mode introspection 2022-08-26 10:31:45 +02:00
3f8f17a66e copy paste fail
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-25 22:39:21 +02:00
3260a03544 forgot include 2022-08-25 22:37:41 +02:00
3ffdc0d31f Mode introspection 2022-08-25 22:33:33 +02:00
d367baa42c stupid idea 2022-08-24 18:47:25 +02:00
59f8dd1322 preparing DHB::buildCommandFromCommand for retirement
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-24 17:49:16 +02:00
ff4cbea571 improvements for auto-formatter script
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 17:44:55 +02:00
81a7c21cd1 continued router component
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 17:31:26 +02:00
61b4e68f3d parameter tuning 2022-08-24 17:19:45 +02:00
267466be9d pass const references to user handler now
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 15:43:58 +02:00
2c730c8632 use const struct ref instead
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 12:11:03 +02:00
eb29b79467 some more docs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-24 08:44:20 +02:00
26ea6606bf metadata recvd indication
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-23 20:56:09 +02:00
b1bd631322 implemented metadata handler
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-23 20:30:41 +02:00
9441b4a70e continue dest handler
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-23 19:37:30 +02:00
95457b1760 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-22 16:38:41 +02:00
a46d8c34d9 small changelog update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-22 16:37:53 +02:00
d12c59c8ac all retval replacements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-22 16:35:53 +02:00
9e5dddf79c Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-22 16:24:20 +02:00
ba5c6410d6 tests running again
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-22 16:23:36 +02:00
52f8c5038b Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-22 16:21:41 +02:00
10f34e5a48 Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack-with-retval-refactoring
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-22 15:57:22 +02:00
dab1b1d067 apply auto-formatter
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-22 15:02:53 +02:00
8c8d1cfa84 apply auto-formatter
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-08-22 15:02:16 +02:00
2a4ab0af7b Merge branch 'mueller/refactor-tmtc-stack' into mueller/refactor-tmtc-stack-with-retval-refactoring
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-22 14:17:24 +02:00
7c59df3f1c Merge pull request 'returnvalue namespace' (#659) from mueller/expand-retval-if into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #659
2022-08-22 14:14:06 +02:00
e34664d265 Adding error message to a coding error
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-19 13:47:13 +02:00
20eb232bf5 added access to objectlist and a produce function to ObjectManager 2022-08-19 12:23:14 +02:00
3b33b429e6 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-18 11:21:16 +02:00
ff6de8e378 important bugfix for verif reporter
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-18 11:20:27 +02:00
11a699c3ce a list should do the job
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 18:49:51 +02:00
6930656d4e added some more basic tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 17:09:39 +02:00
0bb82e0da2 add fs mock feed function
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 16:47:46 +02:00
12c452e7ce finished host FS unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 16:10:52 +02:00
23f514039a host filesystem continued
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-17 11:39:15 +02:00
2e52d7a31d Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 17:23:52 +02:00
239d053562 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 17:23:10 +02:00
875174c4ad better name for global object
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 17:17:45 +02:00
8fd8a37f59 flip verif reporter ctor arguments
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 17:10:48 +02:00
217276d50c renamed returnvalue header
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 12:48:22 +02:00
d2ac3603a5 some more occurences
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 12:29:53 +02:00
f63f3fa564 more occurences in comments
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 12:12:21 +02:00
fc34d56239 cicd fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-16 01:12:50 +02:00
1037102349 merge retval refactoring
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-08-16 01:08:26 +02:00
221361eb9c Merge remote-tracking branch 'origin/development' into mueller/expand-retval-if
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-15 20:32:38 +02:00
7f9269b387 fix for def cfg
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-15 20:30:59 +02:00
4224c3d009 bump changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-15 20:29:23 +02:00
62fe75ee40 perform renaming 2022-08-15 20:28:16 +02:00
e76e109bdb Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 19:17:15 +02:00
9e064fe800 fix unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 19:16:31 +02:00
2339c48756 Merge branch 'mueller/refactor-tmtc-stack' into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-15 19:07:22 +02:00
d7ec04bf4b Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-15 19:05:50 +02:00
adcc375f25 Merge pull request 'New UnsignedByte Field class' (#660) from mueller/new-object-id-class into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #660
2022-08-15 15:22:30 +02:00
94a718ff19 Merge remote-tracking branch 'origin/development' into mueller/expand-retval-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 15:15:51 +02:00
4a10f76784 Merge remote-tracking branch 'origin/development' into mueller/new-object-id-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 15:15:00 +02:00
57ce5d1f34 Merge pull request 'Expand SerializeIF' (#656) from mueller/expand-serialize-if into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #656
2022-08-15 15:13:50 +02:00
90963b3940 Merge pull request 'group MGM data in local pool vectors' (#664) from eive/fsfw:mueller/group-mgm-data into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #664
2022-08-15 15:07:16 +02:00
71ed95b09a Merge branch 'development' into mueller/group-mgm-data
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 15:03:35 +02:00
7ac4f1c64d Merge branch 'development' into mueller/new-object-id-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 15:03:11 +02:00
9d64b96e9a update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 15:02:39 +02:00
5de2c6af66 Merge branch 'mueller/new-object-id-class' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/new-object-id-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 15:02:12 +02:00
ca2efb6021 remove object ID 2022-08-15 15:02:05 +02:00
3b000d924a Merge branch 'development' into mueller/expand-retval-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 14:36:04 +02:00
deeeef553b remove implicit machine endianness variants
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 14:34:04 +02:00
0e7ec79af9 Merge pull request 'Add Linux HAL options' (#663) from eive/fsfw:mueller/cmake-linux-hal-options into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #663
2022-08-15 13:58:09 +02:00
d3cabd8984 afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 11:26:29 +02:00
8efe85cb15 Merge branch 'development' into mueller/new-object-id-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 11:25:51 +02:00
b28c26b288 group MGM data in local pool vectors
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-15 10:49:00 +02:00
8b4253bc46 update cmakelists.txt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-12 13:02:30 +02:00
c12492df03 continued host FS test
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-11 10:19:25 +02:00
8aaabc5d73 basic host FS unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-11 10:10:05 +02:00
e796e025b6 continue host fs unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-11 09:59:14 +02:00
20eee2c469 finished host FS impl
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-11 09:32:18 +02:00
aca8b53a59 start host FS impl
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-10 17:03:23 +02:00
3df1161560 this should do the job
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-10 15:03:53 +02:00
ea6e5d9971 Merge branch 'mueller/cfdp-routers' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-10 13:36:51 +02:00
46a4203d00 testLvs fix 2022-08-10 13:36:41 +02:00
c86adf8e10 Merge branch 'development' into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 13:10:09 +02:00
a2e0646ed4 fix duplicate naming error
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 13:05:07 +02:00
28c8248f26 add FS mock and improve HasFilesystemIF
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 11:09:07 +02:00
3e1fd15613 completed all indication parameters
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 10:34:02 +02:00
e45a99143c added const char* test
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 09:45:24 +02:00
96dfe46e25 added string LV tests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-10 09:39:57 +02:00
507c6ddff1 added some param structs
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 21:03:56 +02:00
0cb15e901e new cfdp mock folder, added additional cfdp mocks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 19:00:47 +02:00
d45108e3c2 add remote config table provider class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 18:51:44 +02:00
8c059f8f32 new filesystem module
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 16:36:35 +02:00
5bea92d2a4 some doc updates
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 16:26:37 +02:00
bba2d883b6 added some documentation
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 16:18:45 +02:00
7a20412305 add user base documentation
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 15:51:01 +02:00
dce1ebcf65 add CFDP user base
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 15:46:42 +02:00
4ee01e395b finished fault handler unit tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 15:29:22 +02:00
7f9401cf63 some bugfixes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 15:09:43 +02:00
dba3f9960e add CFDP fault handler mock
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 14:55:08 +02:00
eccb629ba8 fnished fault handler base
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 14:39:03 +02:00
7fb906a0ac add first fault handler base class
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 14:05:43 +02:00
9796abfc7d Merge branch 'development' into mueller/refactor-tmtc-stack
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-09 13:06:08 +02:00
0d26a0f54b fnish CFDP distributor unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 13:04:23 +02:00
192956c2c7 use new storage manager mock
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 12:50:50 +02:00
22e1555f50 basic storage manager mock
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 12:45:05 +02:00
bddf5bded1 move some storage manager impl to IF
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
- Add StorageManagerMock
2022-08-09 12:36:29 +02:00
1c0b778848 continue CFDP distrib unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 12:13:10 +02:00
c832bffdb0 clean up header test
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 11:17:57 +02:00
2f8020baac move parsing steps into parse function
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 11:03:22 +02:00
06bea2f621 test inNull and bool operator
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-09 10:59:24 +02:00
4f1fe39182 fix unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 18:36:10 +02:00
904abfba28 clean up CFDP stack a bit
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-08 18:29:32 +02:00
202d9341d8 add CFDP unit tests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-08-08 17:53:42 +02:00
37c60d1dd0 add source and dest test stubs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 12:41:05 +02:00
43fb6ef5cb some tag replacements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 12:35:58 +02:00
65a47c7c57 add distributor test stub
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 12:34:54 +02:00
fdb0cc0e44 tweaks for CFDP distributor
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-08 12:31:19 +02:00
e6957de166 Merge branch 'development' into mueller/expand-retval-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-05 14:02:50 +02:00
cc56b00df3 Merge branch 'development' into mueller/expand-serialize-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-05 14:02:31 +02:00
269a3052ca added stubs for source and dest handler
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 18:18:01 +02:00
c6a7a0fec8 use distributor instead of router
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 18:14:49 +02:00
acf5c2a56d better names
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 16:00:48 +02:00
7fb9e14555 better names for CFDP components
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 15:22:39 +02:00
b20e8a9679 continue new cfdp router
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 15:12:29 +02:00
29bcaee196 some tests for new var len field
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 13:34:49 +02:00
cc98512caf use tags properly
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 13:23:49 +02:00
60ea9a9a7c clean up a few tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 13:15:49 +02:00
df690b9628 some re-ordering
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 11:36:56 +02:00
b0c479cab9 remove some shadowing warnings
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 11:34:30 +02:00
a426aef7c7 add some more tests for CCSDS distributor
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-03 11:33:10 +02:00
43048c852a Merge pull request 'Fixed cmake variable for tests in README.md' (#661) from gaisser/fsfw:gaisser_readme_fix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #661
2022-08-01 20:55:26 +02:00
19817bd3a5 Update 'docs/getting_started.rst'
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
Actually, this version still uses old folder names
2022-08-01 20:47:53 +02:00
1db04cf20c Update 'docs/getting_started.rst'
Update for new recommended build folder and cmake define name
2022-08-01 20:45:39 +02:00
902a4bfa9c unittests for TC and CCSDS distributor
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-01 17:16:37 +02:00
52ee50ba8c Fixed cmake variable for tests in README.md
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-08-01 16:21:07 +02:00
bf540ebb49 use sanitized include file 2022-08-01 14:23:52 +02:00
aa978205d8 Merge branch 'mueller/cfdp-routers' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/cfdp-routers
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-01 13:05:56 +02:00
4334106ad1 applied auto-formatter
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-08-01 11:05:46 +02:00
458fe460eb TMTC Routing Refactoring
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
1. Make TcDistributor less powerful / more flexible and rename it to TcDistributorBase
2. Require AcceptsTelecommandsIF to have an abstract function returning the name
3. Allows the CCSDS distributor to remove the CCSDS header before rerouting. This is useful
for protocols like CFDP which are CCSDS agnostic.

WIP: Still need to implement the removal of the CCSDS header
2022-08-01 11:00:36 +02:00
83d71548ec CCSDS unpacker implementation 2022-07-29 16:32:50 +02:00
f4beef8c9f run auto-formatter
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-29 15:54:17 +02:00
c7b4dc349a using uint32_t for getIdentifier of AcceptsTcIF 2022-07-29 15:53:39 +02:00
96f092ef75 type correction
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-29 14:30:58 +02:00
f75379fceb Merge branch 'mueller/new-object-id-class' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-29 14:27:59 +02:00
4a4d23573d verify correct key behaviour
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-29 14:24:16 +02:00
cd4d92b12c Merge branch 'mueller/new-object-id-class' into mueller/cfdp-routers
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-29 14:22:52 +02:00
47e148af8f decoupling
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-29 14:19:10 +02:00
c9bec03f00 Merge branch 'mueller/expand-serialize-if' into mueller/new-object-id-type
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-29 14:16:22 +02:00
6c5c59cad8 Merge branch 'mueller/expand-serialize-if' into mueller/new-object-id-type 2022-07-29 14:15:14 +02:00
03e12a2388 new object ID type 2022-07-29 14:15:05 +02:00
6c5bbfa080 some renaming
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-29 12:03:14 +02:00
da106fd96f do not use TC info for failed TC retrieval
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-29 10:23:59 +02:00
dd281f8a67 Controller base missing a function
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-28 16:32:12 +02:00
fc3412fa35 set sec header flag and add unit test for it
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-28 15:13:27 +02:00
f9e9ff320f Small fixes 2022-07-28 14:55:43 +02:00
8f6f0e1d45 some more fail tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-28 13:42:34 +02:00
1b5fa2a8fa test no crc generation
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-28 13:37:07 +02:00
cb118176a0 completed ZcWriter unittests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-28 13:24:50 +02:00
30ba9ab916 some more fixes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-28 13:00:53 +02:00
fb4ba487b5 Merge remote-tracking branch 'origin/mueller/expand-retval-if' into mueller/refactor-tmtc-stack 2022-07-28 12:55:42 +02:00
72bc5d4d60 add tm zc test 2022-07-28 12:52:20 +02:00
5355e63711 use result instead of retval
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 21:43:32 +02:00
b11cdf6184 update unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 21:32:22 +02:00
dc31358d52 adaption for SerializeIF
- Returns serialized and deserialized size now
2022-07-27 21:31:09 +02:00
b485afea57 Simple SerializeIF adaptions
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
- Returns serialized or deserialized size
2022-07-27 21:29:05 +02:00
5bb7023ff3 improvements for creator API
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 21:11:12 +02:00
85dbef20b0 update serialize IF
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 21:07:34 +02:00
93acac02f5 tests running again
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 21:06:23 +02:00
7e8afcc12f remove nullptr check
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 20:37:21 +02:00
f03b7cd660 another bugfix in CSB
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 20:10:15 +02:00
d641d63531 set queue of tm send helper
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 19:56:11 +02:00
4e571e5082 some more minor fixes
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 19:40:54 +02:00
356d778743 afmt
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 18:03:17 +02:00
0a38d2e22d small bugfix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 17:56:16 +02:00
234ccdf764 send time stampers properly now
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 17:48:59 +02:00
f591b9793c pass timeReader to Pus ZC writer
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 17:33:39 +02:00
c5ad9b5fa9 switch off debugging switches
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 17:13:42 +02:00
083d08ae2a various bugs and improvements 2022-07-27 17:00:43 +02:00
740644f2c8 updates for PusDistributor
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 14:40:51 +02:00
059fb10558 add helper methods to disable crc calculation
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 11:41:06 +02:00
86692e202d this gets rid of some warnings
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 11:35:35 +02:00
064b195c75 some of the deprecation warnings run amok
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 11:33:19 +02:00
18ee2ab903 example compiles again
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-27 11:26:47 +02:00
9eb652e585 some printout fixes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-27 10:49:49 +02:00
e7d9979078 Merge branch 'development' into mueller/expand-serialize-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 19:09:06 +02:00
681738dcc6 PSB unittests complete
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 19:08:12 +02:00
152c01b2ec psb unittests almost complete
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 18:58:36 +02:00
8bf0fb9885 test auto-initializers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 18:46:28 +02:00
1954ce0ea4 default PUS receiver set automatically now
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 17:41:10 +02:00
d98b79cf5e adapt PSB so it can be unittested properly
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-26 16:49:46 +02:00
f14c812aff removed some obsolete code
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 14:14:00 +02:00
146a0e3828 created PSB mock
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 14:10:24 +02:00
75c824ec80 add new VerificationReporterIF
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 13:59:09 +02:00
332e9dbfd5 add new tests 2022-07-26 11:19:36 +02:00
f1c37203a4 some more API improvements and replacements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 11:14:40 +02:00
500a5602bd added additional TM store and send helper
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 11:09:57 +02:00
4ed028000d Merge branch 'mueller/expand-retval-if' into mueller/refactor-tmtc-stack
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-26 10:29:51 +02:00
88ebb67c8d fix deprecation warnings
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-26 10:27:44 +02:00
b827bd8370 update HasReturnvaluesIF
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
1. Add new retval namespace which contains OK and FAIL returnvalue
2. Also contains makeCode constexpr function
3. Mark HasReturnvaluesIF::makeReturnCode deprecated

This prevents from having to implement an interface just to use a shorter
version of the general returnvalues. A namespace is better suited for this
I think
2022-07-26 10:22:05 +02:00
bdf71d4e66 add new HasReturnvaluesIF features
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-26 10:21:16 +02:00
e48b6f1432 possible double delete
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 22:36:53 +02:00
747243684d more leaks
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 22:29:18 +02:00
db33f9cc7e maybe this teardown fixes the leak
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 22:22:08 +02:00
c12669fe50 this should fix the mmeory leak
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 22:10:20 +02:00
6d00fc65c0 fix memory leak
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 21:08:04 +02:00
7d87274844 add old api but mark it deprecated
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 20:53:18 +02:00
c83f75c515 some more tests using TM send helper
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 20:41:01 +02:00
586993c081 completed send helper tests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 20:31:06 +02:00
a88f767cca all tests running again
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 19:49:19 +02:00
935e135f1c normal queue sufficient
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 19:42:05 +02:00
6d0fa36f8a cleaning up message queue mock and subscription API
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 19:36:56 +02:00
8f07133e2c Merge branch 'development' into mueller/expand-serialize-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 15:08:04 +02:00
f11433e50f Merge pull request 'Release v5.0.0' (#657) from development into master
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #657
2022-07-25 15:05:56 +02:00
5fd5d488ff Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 14:57:28 +02:00
edc5a314b8 Merge pull request 'v5.0.0' (#654) from v5.0.0 into development
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #654
2022-07-25 14:53:35 +02:00
f80be9e9fa run afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 14:44:49 +02:00
f3af88ae40 add [[nodiscard]] and const specifiers
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 14:44:19 +02:00
380f1d0206 remove obsolete returns
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 14:40:10 +02:00
54fc35eae7 re-run afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 14:36:18 +02:00
05d4162f5b Merge branch 'development' into v5.0.0
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 14:35:36 +02:00
e030878023 changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 14:33:10 +02:00
9ee6da47e9 improving mocks 2022-07-25 14:31:57 +02:00
1a7d7b172b set up new internal error reporter mock
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-25 14:04:06 +02:00
36e3956efb finished tm store helper tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 13:39:07 +02:00
180210dc38 Merge branch 'development' into mueller/expand-serialize-if
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:39:19 +02:00
ca1e921b94 Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:35:32 +02:00
2a34c831b1 use Be instead of Ne, which could be confused
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:33:12 +02:00
e2ad37e3e6 more ref replacements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:26:45 +02:00
973d4ee8a5 some more ref replacements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:24:13 +02:00
899d021e00 using uint32_t as store_address requires explicit cast
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 11:15:45 +02:00
4989bd0f02 fixes for Linux OSAL clock
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:56:19 +02:00
832367fb30 replace some API components with references
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:50:52 +02:00
63ee88af17 added base for tm store test
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:38:44 +02:00
4921527022 replace c include
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:31:49 +02:00
f0c8fd2688 some renaming
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-25 10:24:43 +02:00
c96e304b68 Merge pull request 'Possible Ring Buffer Fix' (#586) from eive/fsfw:mueller/possible-ring-buffer-fix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Merged to avoid crashing bug until full functionality is fixed.

Reviewed-on: #586
2022-07-25 10:12:39 +02:00
d474c4a7ee store helper 2022-07-23 11:43:48 +02:00
3708df2423 small fix 2022-07-23 11:15:55 +02:00
f629d60aaf Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack 2022-07-23 11:15:20 +02:00
b809f90e72 added unittests for new helpers 2022-07-23 11:10:44 +02:00
f2bf4b463e expand serializeIF tests 2022-07-23 10:34:19 +02:00
b66fd63cb4 remove doubly defines 2022-07-23 10:29:19 +02:00
fd55de9e95 Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack 2022-07-23 10:28:13 +02:00
8e05fc0417 added a few more methods 2022-07-23 10:28:01 +02:00
55a238d553 extended serialize if further 2022-07-23 10:24:56 +02:00
9ccd9fd775 Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack 2022-07-23 10:07:10 +02:00
ddad97033d expand serialize IF further 2022-07-23 10:06:42 +02:00
99aaf7068d some tests 2022-07-23 10:05:57 +02:00
c9d37e8d62 Merge branch 'mueller/expand-serialize-if' into mueller/refactor-tmtc-stack 2022-07-23 10:05:14 +02:00
42a1d6cccd default implementation of simple serialize/deserialize 2022-07-23 10:03:42 +02:00
133894f4ba add basic CCSDS tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 18:46:58 +02:00
cb05329dd9 completed baseline PUS TM unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 18:31:00 +02:00
b350018cad completed basic test set
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 18:22:35 +02:00
2dfbce6174 start TM reader unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 17:11:55 +02:00
cecaec6007 PUS TM creator tests done
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 17:09:44 +02:00
f28b9ea61b APID getter bugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 16:41:32 +02:00
9275ccb79b added some missing implementations
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 16:09:18 +02:00
67776241de verify successfull TM serialization
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-22 16:06:31 +02:00
bfee4fd90a add empty test files
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-21 19:16:44 +02:00
0dfaba81f9 finished basic TC unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-21 19:10:15 +02:00
affde6bad5 rename namespace
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-21 18:21:10 +02:00
0981ee6f7e minor changes, virtual dtors added
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 18:17:37 +02:00
61bc867bed delete code which is not used anymore
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 17:57:31 +02:00
5af3138e81 fnished PUS TC creator unittests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 17:48:11 +02:00
08e0b0f1a0 added sp reader unittests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 14:40:00 +02:00
23f264096c delete a few old classes
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 14:05:31 +02:00
e5ee96259d some fixes
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-21 13:48:58 +02:00
9bbe1dc716 Merge branch 'development' into mueller/possible-ring-buffer-fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-21 13:23:44 +02:00
d8b6cb39ac various bugfixes and improvements
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-21 11:34:11 +02:00
be35bd53a6 switched to new tmtc stack API
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-20 22:21:15 +02:00
f56646d2c3 changed action handling slightly 2022-07-20 16:59:42 +02:00
9860061fc6 create new TmSendHelper
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-20 11:45:50 +02:00
d80941514f start refactoring PUS TM handling
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-20 11:43:16 +02:00
6c636661b6 a lot of refactoring
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-19 18:13:25 +02:00
5fffbd4a90 start PUS TC refactoring
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 18:36:41 +02:00
95b476d4bd start ccsds reader unittests 2022-07-18 16:21:00 +02:00
3d2af203f2 finished creator unittests
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-18 16:18:04 +02:00
74794bb71b apply auto-formatter
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-18 16:08:06 +02:00
ddf38b65c3 apply auto-formatter
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-18 16:07:26 +02:00
490a80e49f Merge remote-tracking branch 'origin/development' into mueller/refactor-tmtc-stack
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 15:26:31 +02:00
6f751c2cf9 Merge branch 'development' into v5.0.0
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-18 15:12:21 +02:00
9a2e68b37e Merge pull request 'Move HAL and Tests folder' (#653) from mueller/move-hal-tests-folder into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #653
2022-07-18 15:05:25 +02:00
91067cde98 typo
Some checks are pending
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head Build queued...
2022-07-18 15:00:40 +02:00
428018e4f1 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-18 14:59:25 +02:00
e4d7182d93 update changelog
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 14:58:47 +02:00
8b6dd3f868 add date to changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-18 14:49:27 +02:00
f6ede7cd3e bump version
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-18 14:46:36 +02:00
4da18172b3 Merge branch 'development' into mueller/possible-ring-buffer-fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-18 14:37:56 +02:00
6e5239e9a0 update jenkinsfile
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-18 14:36:40 +02:00
7e2fdc06cd hmm this is problematic
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 14:05:43 +02:00
3c72a42ce1 added basic sp creator test
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-18 13:51:02 +02:00
78b09ed0c9 fixes includes
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-18 11:58:55 +02:00
fdf35232ee some fixes 2022-07-18 11:47:00 +02:00
8465670374 separate unittest folder
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-18 11:42:51 +02:00
0c5f623780 additional ctor for space packet creator
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-18 10:53:55 +02:00
d7a2eada94 add space packet creator class
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 10:42:56 +02:00
546e173cef add new PUS TC IF 2022-07-18 10:29:39 +02:00
0a7f2c6646 refactored space packet interface 2022-07-18 10:20:26 +02:00
3b23fb77b4 add obsolete add_subdirectory calls
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-18 09:01:45 +02:00
6f7be281ef move HAL and tests folder
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-07-18 08:59:40 +02:00
3686bbc486 Merge pull request 'DHB Reply Timeout' (#637) from meier/dhbReplyTimeout into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #637
2022-07-14 09:17:18 +02:00
ecac08814e better naming for functions which reset states of replies
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
2022-07-14 09:15:13 +02:00
e8b8fff0b5 Merge branch 'development' into meier/dhbReplyTimeout
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-14 09:01:28 +02:00
4d34f93cfc missing reset of timedOut value in loop of decrementDeviceReplyMap 2022-07-14 08:58:23 +02:00
adbf375f38 some small fixes to dhb countdown addition
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-07-13 21:58:07 +02:00
2e42f53682 Merge pull request 'New PoolEntry constructor' (#651) from eive/fsfw:mueller/new-pool-entry-ctor into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #651
2022-07-13 17:43:56 +02:00
c519b70302 Merge pull request 'printout tweak' (#652) from mueller/printout-tweak-mq-linux-osal into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #652
2022-07-13 17:35:53 +02:00
45ee307bc4 Merge pull request 'remove duplicate CHANGELOG entries' (#649) from eive/fsfw:mueller/clean-changelog into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #649
2022-07-13 16:50:50 +02:00
8a2068aca6 Merge pull request 'clang-tidy changes for controller module' (#648) from clang-tidy-controllers into development
Reviewed-on: #648
2022-07-13 16:49:15 +02:00
aa60484111 Merge pull request 'clang-tidy changes for actions module' (#647) from clang-tidy-actions into development
Reviewed-on: #647
2022-07-13 16:42:39 +02:00
e99c7f3824 Merge pull request 'Install ETL library in CI/CD' (#645) from mueller/install-etl-cicd into development
Reviewed-on: #645
2022-07-13 16:39:29 +02:00
2ee3ef1f1d Merge branch 'development' into mueller/install-etl-cicd 2022-07-13 16:38:30 +02:00
ce48827ee5 Merge branch 'development' into clang-tidy-actions 2022-07-13 16:00:50 +02:00
0d80fad685 Merge branch 'development' into clang-tidy-controllers 2022-07-13 16:00:42 +02:00
c6253bf0dd Merge branch 'development' into mueller/new-pool-entry-ctor
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-13 15:41:47 +02:00
93933dee02 Merge pull request 'delete run configs' (#646) from mueller/del-cmake-run-cfgs into development
Reviewed-on: #646
2022-07-13 15:37:55 +02:00
0e49640306 update CHANGELOG
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-08 17:59:43 +02:00
32fea9838e add new pool entry constructor
- This constructor allows to simply specify the length.
  This is also the new default constructor for scalar values
  which are initially invalid
2022-07-08 17:56:44 +02:00
0519083894 remove duplicate entries
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-08 17:48:06 +02:00
14bac9a418 clang-tidy changes for controller module
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-04 11:48:36 +02:00
3bef73708f clang-tidy changes for actions module
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-04 11:44:26 +02:00
fef6ddceff delete run configs
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-04 11:16:13 +02:00
5a9db72814 test public linkage
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-04 10:27:14 +02:00
5cccd5caba bump used container
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-07-04 10:21:47 +02:00
7de56f189b install etl library in ci/cd
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-07-04 10:13:48 +02:00
ef18377cef new Actions
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-06-29 23:36:45 +02:00
0c057c66b1 added introspection 2022-06-28 18:56:52 +02:00
34c50ce3e2 ignore .vscode 2022-06-28 17:44:53 +02:00
df97bbc691 run auto-formatter
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-23 11:56:46 +02:00
2d2f65bf89 moved activation of periodic replies to updatePeriodicReply
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-23 11:54:51 +02:00
3e9ae62b28 Merge branch 'development' into meier/dhbReplyTimeout
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-21 10:49:06 +02:00
2ebefdffae Merge remote-tracking branch 'upstream/development' into mueller/possible-ring-buffer-fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-21 10:49:03 +02:00
45792e86b9 Merge remote-tracking branch 'upstream/development' into mueller/possible-ring-buffer-fix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-21 10:48:04 +02:00
541f563683 Merge pull request 'Fix StorageAccessor move assignment' (#643) from gaisser/fsfw:gaisser_storage_accessor_fix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #643
2022-06-21 10:31:36 +02:00
28ea71a077 Merge branch 'development' into gaisser_storage_accessor_fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 17:56:58 +02:00
a044d7d724 Merge pull request 'new cmake options for CICD build' (#623) from mueller/new-cicd-cmake-opts into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #623
2022-06-20 17:56:29 +02:00
687700cee8 Merge branch 'development' into gaisser_storage_accessor_fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 16:36:49 +02:00
732b615cb3 Merge branch 'development' into mueller/new-cicd-cmake-opts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 16:34:13 +02:00
394ce2ec3e Merge pull request 'LocalDataPoolManager Warning Text' (#642) from meier/debug-info into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #642
2022-06-20 16:15:30 +02:00
dde96ae220 Merge branch 'development' into gaisser_storage_accessor_fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 16:15:05 +02:00
c3aaab4b93 Merge pull request 'Task IF refactoring' (#636) from mueller/task-if-refactoring into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #636
2022-06-20 16:08:03 +02:00
edf1d5ae8d Added more test cases
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 16:02:35 +02:00
690991b4b5 include fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 15:42:08 +02:00
1a294e6a13 include TestsConfig.h
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-20 15:40:15 +02:00
8c4e34153b README updates
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 15:36:48 +02:00
b60e4bcb90 Fix StorageAccessor move assignment
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
* Added Unittest for this
* Fixed missing include in test
2022-06-20 15:15:33 +02:00
b18410aa63 Merge remote-tracking branch 'refs/remotes/origin/mueller/task-if-refactoring' into mueller/task-if-refactoring
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 15:02:38 +02:00
7f57a8784a Fixed deadline missed call on linux 2022-06-20 15:02:16 +02:00
4b33aa8262 bump ETL version
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 14:25:39 +02:00
d47a908117 Merge branch 'development' into mueller/task-if-refactoring
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-20 09:40:31 +02:00
fce95e04a8 Merge branch 'development' into mueller/new-cicd-cmake-opts
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-20 09:39:58 +02:00
fc742e4270 Merge branch 'development' into meier/debug-info
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-16 07:22:43 +02:00
b5183a19fc minor change in debug text
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-16 07:03:58 +02:00
ca453a8f16 Merge pull request 'run auto formatters' (#641) from KSat/fsfw:mueller/reapply-fmt into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #641
2022-06-13 17:04:11 +02:00
b7c0c07141 Merge remote-tracking branch 'origin/development' into mueller/new-cicd-cmake-opts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-13 16:28:01 +02:00
0158102f11 Merge pull request 'apply afmt, basic CLion support' (#625) from mueller/apply-afmt into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #625
2022-06-13 16:27:02 +02:00
69859fdbc9 rerun afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-13 16:21:20 +02:00
90bccc744e Merge pull request 'Fix SPI ComIF shadowing warning' (#639) from KSat/fsfw:mueller/spi-com-if-shadowing into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #639
2022-06-13 14:35:46 +02:00
ab89108c55 Merge pull request 'some fixes for TC Map printout function' (#640) from KSat/fsfw:mueller/pus-11-printout-fixes into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #640
2022-06-13 14:29:36 +02:00
a682bbe400 remove static missed deadline
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-13 14:23:56 +02:00
e67fc2ab0d some fixes for TC Map printout function
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-13 10:56:37 +02:00
71ce966531 Merge branch 'mueller/spi-com-if-shadowing' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/spi-com-if-shadowing
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-13 10:54:25 +02:00
6b0f4a159f Merge remote-tracking branch 'upstream/development' into mueller/spi-com-if-shadowing 2022-06-13 10:54:20 +02:00
4a06b558c1 Fix SPI ComIF shadowing warning 2022-06-13 10:53:04 +02:00
6d921f03fd Fix SPI ComIF shadowing warning 2022-06-13 10:50:49 +02:00
65bc8213fe Merge branch 'development' into mueller/new-cicd-cmake-opts
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-13 09:43:32 +02:00
a0ee86ace8 use override instead of virtual as recommended
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-08 17:36:20 +02:00
a07a368272 Merge branch 'development' into mueller/apply-afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-08 17:34:04 +02:00
cb8a4bbbec Merge remote-tracking branch 'origin/development' into mueller/task-if-refactoring
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-08 17:33:12 +02:00
17f54006b8 Merge pull request 'rtems fixes' (#635) from mueller/rtems-fixes into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #635
2022-06-08 16:12:53 +02:00
395cf9cfa7 added clion base files
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-08 12:12:33 +02:00
a3c0b441ec update changelog 2022-06-08 12:12:33 +02:00
b4132800ae apply afmt, update .gitignore 2022-06-08 12:12:33 +02:00
ad53b48fcb explicitely ignore returnvalue in linux OSAL
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-08 12:12:09 +02:00
dee40f9079 fixed unittests 2022-06-08 12:12:09 +02:00
92ec24352f fix unit test 2022-06-08 12:12:09 +02:00
3f9e459f48 update changelog 2022-06-08 12:12:09 +02:00
e0c7f8d51d apply afmt 2022-06-08 12:12:09 +02:00
eb79386c92 new addSlot function taking executable pointer 2022-06-08 12:12:09 +02:00
4542f31c40 improved custom checker API
- More clang-tidy improvements
2022-06-08 12:12:09 +02:00
689fb378d8 a regular set should suffice here 2022-06-08 12:12:09 +02:00
98b711a872 update changelog 2022-06-08 12:12:09 +02:00
800aa131fa reverted some unrelated changes 2022-06-08 12:12:09 +02:00
6983980304 missing newline and clang-tidy improvement 2022-06-08 12:12:09 +02:00
7c0ba59993 remove include 2022-06-08 12:12:09 +02:00
28873fc87b refactores rtems task module 2022-06-08 12:12:09 +02:00
24e849ed9c avoid compiler warning 2022-06-08 12:12:09 +02:00
d8985c141e some clang tidy stuff and bugfixes 2022-06-08 12:12:09 +02:00
7602b15256 important bugfix 2022-06-08 12:12:09 +02:00
d1a82bceed rtems fixes 2022-06-08 12:12:09 +02:00
7292b02907 refactor freeRTOS task components 2022-06-08 12:12:09 +02:00
347714d53a refactored and tested hosted and linux task IF 2022-06-08 12:12:09 +02:00
f230fa1617 continued refactoring 2022-06-08 12:12:09 +02:00
93615b100c continued refactoring 2022-06-08 12:12:09 +02:00
e18d3d559e refactoring host osal 2022-06-08 12:12:09 +02:00
08ff061d07 minor bugfix 2022-06-08 12:12:09 +02:00
cc351c1066 new base class for periodic tasks 2022-06-08 12:12:09 +02:00
664a548c53 removed some changes which belong in separate PR 2022-06-08 12:12:09 +02:00
e9895559a3 vector as core container is ok 2022-06-08 12:12:09 +02:00
eda5b8f593 refactor task IF 2022-06-08 12:12:09 +02:00
e03f55604a rtems fixes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-08 12:11:26 +02:00
51d7df2dba Merge branch 'development' into mueller/new-cicd-cmake-opts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-08 11:13:13 +02:00
12046a2db6 Merge pull request 'bump etl to 20.28.0' (#634) from mueller/bump-etl into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #634
2022-06-08 11:09:42 +02:00
21eb386f3c changed reply timeouts
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-06 12:34:57 +02:00
ade36e65c6 missed reply check in simple command nominal test case
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-06 12:30:27 +02:00
103661facc deugging
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-06-06 12:26:00 +02:00
ae2f7219fd run auto-formatter
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-06 11:55:42 +02:00
4fba2704aa unit test for detection of missed reply when commanded externally
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-06-06 10:53:08 +02:00
161dbde0d7 fixed merge conflicts
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-06-06 10:30:17 +02:00
2fa4fd61d0 device fdir mock 2022-06-05 12:54:13 +02:00
bf673c56c6 unit test for dhb 2022-06-05 12:52:55 +02:00
c697d0f8ab bump etl to 20.28.0
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-30 10:34:03 +02:00
c7cf8e710d Merge pull request 'return end iterator instead of crashing' (#633) from mueller/possible-fix-ccsds-distrib into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #633
2022-05-25 13:59:35 +02:00
7dddcdfd55 Merge branch 'development' into mueller/possible-fix-ccsds-distrib
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-25 09:52:33 +02:00
261eea381e Merge pull request 'PUS11 TC sched update and bugfixes' (#632) from mueller/tc-11-tweaks into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #632
2022-05-24 17:48:06 +02:00
e59f1f26bf return end iterator instead of crashing
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-24 14:33:18 +02:00
f7cde80088 added missing delete
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-24 14:32:35 +02:00
e60a665de4 added 3 new subservices
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-24 11:52:29 +02:00
34658ef7db afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-24 10:40:25 +02:00
940fd6f465 Merge branch 'development' into mueller/new-cicd-cmake-opts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-23 15:59:13 +02:00
f288d5120d Merge branch 'development' into mueller/tc-11-tweaks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-23 15:34:00 +02:00
5a425a1c58 Merge pull request 'cache the TCP client address now' (#630) from eive/fsfw:mueller/tcp-server-cache-client-addr into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #630
2022-05-23 14:42:12 +02:00
5e62258aa6 Merge branch 'development' into mueller/tcp-server-cache-client-addr
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-23 14:38:05 +02:00
0b53b4873f bugfix for srv11
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-20 11:20:31 +02:00
8e2597f609 clang-format
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-05-20 11:09:03 +02:00
dac700b80a static STORE renamed
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-05-20 08:59:06 +02:00
d0fc360697 apply afmt
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-05-20 08:34:14 +02:00
576414438c Merge pull request 'Apply cmake-format and auto-format script on all CMakeLists.txt file' (#628) from eive/fsfw:mueller/apply-clang-format-on-all-files into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #628
2022-05-18 13:14:18 +02:00
13cda86d23 remove commented code
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-18 13:13:24 +02:00
e1dd27b9dd cache the TCP client address now
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-17 13:16:36 +02:00
8e9d4b451c better printout if ping test fails
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-16 16:18:44 +02:00
d871f55a89 Merge remote-tracking branch 'upstream/development' into mueller/possible-ring-buffer-fix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-16 15:13:47 +02:00
816550b69c Merge remote-tracking branch 'upstream/development' into mueller/new-cicd-cmake-opts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-16 14:58:25 +02:00
7fee852dbd re-apply updated auto-formatter
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-16 14:55:15 +02:00
1e7032f89c minor improvements for auto-formatter 2022-05-16 14:54:43 +02:00
f0debecbbc Merge pull request 'Extend version handling and class' (#601) from eive/fsfw:mueller/extend-version-class into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #601
2022-05-16 14:52:15 +02:00
ef9d7aa7d3 Merge branch 'development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-16 14:42:23 +02:00
b8fd2db434 Merge pull request 'Add PUS TC scheduler service' (#594) from KSat/fsfw:mueller/add-tc-scheduler-pus-11 into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #594
2022-05-16 14:32:19 +02:00
878e32cbe8 Merge branch 'development' into mueller/add-tc-scheduler-pus-11
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-16 14:29:02 +02:00
4821706561 Merge branch 'development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-16 14:16:53 +02:00
1611a4e1f0 device handler unittest wip
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-05-16 11:10:35 +02:00
eed6a64597 Merge pull request 'Power Switcher Component' (#596) from eive/fsfw:mueller/power-switcher-component-upstream into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #596
2022-05-13 22:42:23 +02:00
5736023ffa Merge branch 'development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 17:22:57 +02:00
8a12a5097e Merge branch 'mueller/apply-afmt' into mueller/new-cicd-cmake-opts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 13:50:41 +02:00
87e4a57ef7 added clion base files
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 13:48:13 +02:00
0375ee1881 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 13:46:54 +02:00
c8e034d975 Merge branch 'development' into mueller/new-cicd-cmake-opts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 13:41:58 +02:00
e98aa005cb Merge branch 'development' into mueller/power-switcher-component-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 13:25:13 +02:00
52310f7d32 Merge remote-tracking branch 'upstream/development' into mueller/add-tc-scheduler-pus-11
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 13:24:26 +02:00
e3d1308205 Merge pull request 'preproc guards' (#612) from eive/fsfw:mueller/missing-preproc-defs into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #612
2022-05-13 13:22:38 +02:00
970f039e85 Merge remote-tracking branch 'origin/development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 13:21:01 +02:00
99c72fd00b Merge pull request 'Auto-Formatter Script Improvements' (#626) from mueller/amft-cmakelists into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #626
2022-05-13 12:01:40 +02:00
2708b71d77 Merge remote-tracking branch 'origin/development' into mueller/new-cicd-cmake-opts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 12:00:40 +02:00
5a4539def4 Merge branch 'mueller/add-tc-scheduler-pus-11' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/add-tc-scheduler-pus-11
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-13 11:58:45 +02:00
13a34cd677 Merge remote-tracking branch 'upstream/development' into mueller/add-tc-scheduler-pus-11 2022-05-13 11:58:41 +02:00
811287aac8 delete old scripts
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:57:22 +02:00
23fb06578b this is better
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:56:37 +02:00
c86e99e6dc rename auto-formatter 2022-05-13 11:56:20 +02:00
4092de911c use variable for repeated section
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:55:19 +02:00
00952e15b0 Merge branch 'development' into mueller/missing-preproc-defs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:50:24 +02:00
6366283ce2 Merge branch 'development' into mueller/apply-afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:50:03 +02:00
01ebf0f4d3 tab size
Some checks are pending
fsfw/fsfw/pipeline/head Build queued...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:49:01 +02:00
99fe6487c8 another small improvement
Some checks are pending
fsfw/fsfw/pipeline/head Build queued...
2022-05-13 11:48:18 +02:00
d4a6f987bc small fix
Some checks are pending
fsfw/fsfw/pipeline/head Build queued...
2022-05-13 11:46:59 +02:00
57bac4f262 Merge remote-tracking branch 'origin/development' into mueller/amft-cmakelists
Some checks are pending
fsfw/fsfw/pipeline/head Build queued...
2022-05-13 11:46:17 +02:00
cfa6843c8f check whether clang-format is installed 2022-05-13 11:46:04 +02:00
b6b3221b22 Merge pull request 'run auto-formatter over cmakelists.txt' (#619) from mueller/amft-cmakelists into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #619
2022-05-13 11:44:48 +02:00
8dc640c162 apply afmt, update .gitignore
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:39:37 +02:00
deee4c43c0 finally this works
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:37:58 +02:00
ad0b6f1ed1 another small fix 2022-05-13 11:35:59 +02:00
ec03a674bd Merge branch 'mueller/amft-cmakelists' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/amft-cmakelists
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:35:28 +02:00
9e3d5b6a0c small fix 2022-05-13 11:35:18 +02:00
994c7299b9 add cmake-format command to shell script 2022-05-13 11:34:44 +02:00
57a830cb46 Merge branch 'development' into mueller/amft-cmakelists
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 11:30:52 +02:00
ff40a71582 Merge remote-tracking branch 'upstream/development' into mueller/possible-ring-buffer-fix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-13 11:30:32 +02:00
271057ca6b Merge remote-tracking branch 'upstream/development' into mueller/extend-version-class
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-13 11:28:54 +02:00
861335212e Merge remote-tracking branch 'upstream/development' into mueller/add-tc-scheduler-pus-11
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-13 00:30:18 +02:00
038e47a46e better returncode handling 2022-05-13 00:30:01 +02:00
c215508a12 another missing preproc guard
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 00:25:52 +02:00
ccadbb5942 Merge branch 'development' into mueller/missing-preproc-defs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-13 00:24:04 +02:00
171c48495c Merge remote-tracking branch 'upstream/development' into mueller/power-switcher-component-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-12 19:07:12 +02:00
a83b86ccd2 Merge pull request 'refactor power module' (#590) from eive/fsfw:mueller/refactor-power-switch-if-etc into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #590
2022-05-12 18:37:45 +02:00
2e4b9bcd7c Merge remote-tracking branch 'origin/development' into mueller/new-cicd-cmake-opts
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-12 17:42:49 +02:00
3046822e88 run cmake-format
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-12 17:27:39 +02:00
6442dd0c38 Merge branch 'mueller/amft-cmakelists' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/amft-cmakelists
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-12 17:16:15 +02:00
9b6fa646ed Merge remote-tracking branch 'origin/development' into mueller/amft-cmakelists 2022-05-12 17:16:10 +02:00
e77bde459b Merge remote-tracking branch 'upstream/development' into mueller/extend-version-class
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-12 17:12:26 +02:00
2d9d83a1c5 Merge branch 'development' into mueller/missing-preproc-defs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-12 17:10:54 +02:00
c561271070 Merge branch 'development' into mueller/refactor-power-switch-if-etc
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-12 17:09:27 +02:00
70d4fc1e0a Merge branch 'mueller/add-tc-scheduler-pus-11' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/add-tc-scheduler-pus-11
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-12 17:06:12 +02:00
b8cfb36426 added additional explicit returnvalues 2022-05-12 17:05:58 +02:00
e5c140e0ae Merge branch 'development' into mueller/add-tc-scheduler-pus-11 2022-05-12 16:59:01 +02:00
b99160e850 Merge pull request 'Add LTO support' (#616) from mueller/add-lto-support into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #616
2022-05-12 16:56:54 +02:00
c4c340fde1 lot of refactoring
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-12 16:56:06 +02:00
9a4c7589cc Merge remote-tracking branch 'upstream/development' into mueller/add-tc-scheduler-pus-11 2022-05-12 15:52:47 +02:00
d11f898f70 update dummy power switcher docs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-12 15:02:06 +02:00
e1604b292c Merge branch 'development' into mueller/possible-ring-buffer-fix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-11 11:34:32 +02:00
34e124f2db Merge branch 'development' into mueller/amft-cmakelists
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-11 11:30:40 +02:00
e05c72b062 minor formatting fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 13:08:14 +02:00
377c3325d2 update cmake-modules file
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-10 12:16:38 +02:00
2ca8523215 Merge branch 'mueller/add-lto-support' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/add-lto-support
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 11:57:01 +02:00
25775614de only check IPO support if enabled 2022-05-10 11:56:51 +02:00
efb3d982f3 added missing prefix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 11:52:40 +02:00
0410ecd9e3 Merge branch 'development' into mueller/add-lto-support
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 11:51:39 +02:00
dd986fefd3 experimenting with PRE_BUILD command
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 11:51:25 +02:00
b38329aa0e Merge branch 'development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 11:19:48 +02:00
0fe1b70bae keep LTO option off by default
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 11:19:29 +02:00
c5b4499d98 Merge remote-tracking branch 'upstream/development' into mueller/refactor-power-switch-if-etc
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 09:58:21 +02:00
458aa5c265 Merge branch 'development' into mueller/missing-preproc-defs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-10 09:56:29 +02:00
4499c9bf04 Merge pull request 'Added new functions to add sequences and tables' (#606) from eive/fsfw:mueller/new-ss-adder-functions into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #606
2022-05-10 09:35:16 +02:00
eb0223bc51 Merge branch 'development' into mueller/add-lto-support
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 22:34:28 +02:00
be6a492022 Merge branch 'development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 22:34:09 +02:00
d8bd08dd8c Merge branch 'development' into mueller/amft-cmakelists
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 17:22:40 +02:00
18c2847b08 Merge branch 'development' into mueller/missing-preproc-defs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 17:21:48 +02:00
d45cda93b2 Merge pull request 'important bugfix for TCP server' (#618) from mueller/tcp-server-bugfix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #618
2022-05-09 16:59:54 +02:00
3448292e8a Merge branch 'development' into mueller/tcp-server-bugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 16:56:07 +02:00
d983305ea5 Merge branch 'development' into mueller/amft-cmakelists
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 16:34:22 +02:00
c83cc492c0 Merge pull request 'Compile Time Size Check fixed' (#614) from gaisser/fsfw:gaisser_fix_compile_check into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #614
2022-05-09 16:14:44 +02:00
ece32f88f4 Merge remote-tracking branch 'origin/development' into mueller/tcp-server-bugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 16:14:17 +02:00
dd9e28fca1 Merge branch 'development' into mueller/add-lto-support
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 16:09:31 +02:00
46cfe65321 Merge pull request 'Health Service Bugfix' (#617) from mueller/health-srv-bugfix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #617
2022-05-09 16:08:28 +02:00
7b7f5d7e0a Merge branch 'mueller/add-lto-support' of https://egit.irs.uni-stuttgart.de/fsfw/fsfw into mueller/add-lto-support
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 16:07:19 +02:00
fd112ed597 enable lto for test target 2022-05-09 16:07:05 +02:00
96eb8fc21f Merge branch 'development' into gaisser_fix_compile_check
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:59:44 +02:00
88fa4f1d9d Merge remote-tracking branch 'origin/development' into mueller/tcp-server-bugfix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 15:55:07 +02:00
5989c88c88 indentation
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:54:29 +02:00
da8a108cb7 Merge remote-tracking branch 'origin/development' into mueller/amft-cmakelists 2022-05-09 15:54:10 +02:00
75132c1e39 Merge branch 'development' into mueller/add-lto-support
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 15:52:28 +02:00
eb494707af Merge remote-tracking branch 'upstream/development' into mueller/power-switcher-component-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:51:28 +02:00
736f8d0238 order fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:50:49 +02:00
f1acf8e18b Merge remote-tracking branch 'upstream/development' into mueller/extend-version-class
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 15:48:04 +02:00
281f91ec5d Merge remote-tracking branch 'origin/development' into mueller/health-srv-bugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:41:10 +02:00
15352b539d Merge remote-tracking branch 'upstream/development' into mueller/refactor-power-switch-if-etc
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 15:37:32 +02:00
4015e85506 Merge branch 'development' into mueller/missing-preproc-defs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:35:49 +02:00
aacaf52fd9 Merge branch 'development' into mueller/new-cicd-cmake-opts
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 15:34:36 +02:00
118f1da8dd Merge pull request 'Bump C++ standard to C++17' (#622) from mueller/cpp17-update into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #622
2022-05-09 15:33:52 +02:00
89f83f4e3d update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:33:03 +02:00
39b7976056 new cmake options for CICD build
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:26:38 +02:00
8b0508d50a Merge branch 'development' into gaisser_fix_compile_check
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:17:28 +02:00
8a40878eb5 Merge remote-tracking branch 'origin/development' into mueller/add-lto-support
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 15:17:16 +02:00
220469a2dd Merge remote-tracking branch 'origin/development' into mueller/amft-cmakelists
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 15:16:12 +02:00
83de5b4ec1 Merge branch 'development' into mueller/cpp17-update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:13:50 +02:00
fe1c51ae6d Merge pull request 'CMake move some directives up top' (#621) from mueller/cmake-fixes into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #621
2022-05-09 15:13:02 +02:00
10cc954d27 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:09:07 +02:00
73ff9b97db bump CMAKE_CXX_STANDARD to C++17
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 15:07:46 +02:00
b0d71597f0 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 14:58:39 +02:00
226f28dc7b Move some directives up top
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 14:53:52 +02:00
7afe30ea88 fixed merge conflict 2022-05-09 12:56:22 +02:00
6308427d03 run auto-formatter over cmakelists.txt
Some checks failed
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 11:18:56 +02:00
398d04dc50 fixed tests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 11:15:18 +02:00
80a5ed3c5b added back fsfw namespace
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 11:06:45 +02:00
5d5a355110 Merge remote-tracking branch 'upstream/development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 11:04:15 +02:00
c78b7c432b Merge branch 'development' into mueller/refactor-power-switch-if-etc
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 11:02:45 +02:00
6bfdace512 update changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 11:00:31 +02:00
16e55a98ce important bugfix for TCP server
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 10:57:23 +02:00
79f17843d8 update changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 10:50:29 +02:00
e5e163bdbf mark unused function
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 10:47:56 +02:00
4e4820af05 bugfix for prepareHealthSetReply function 2022-05-09 10:47:23 +02:00
637512ad77 changelog update
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-09 10:34:14 +02:00
a4bd5a2aaa update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 10:31:03 +02:00
a943e4eebb enable LTO where applicable
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-09 02:23:20 +02:00
cb0c80d8dc add option and cmake module for lto support 2022-05-09 02:22:16 +02:00
3332f68ce7 Tested only std::numeric_limits in MSVC
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-02 17:22:13 +02:00
2fbf847367 Merge branch 'development' into mueller/missing-preproc-defs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 16:16:33 +02:00
54feb77770 Proposed fix for gcc and clang
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 16:14:23 +02:00
1a07864a5f Merge pull request 'CCSDS Time CUC Tests' (#593) from gaisser/fsfw:gaisser_cuc_tests into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #593
2022-05-02 15:29:48 +02:00
3e9d6bdbb9 Merge branch 'development' into gaisser_cuc_tests
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-05-02 15:24:32 +02:00
c295539c79 Merge pull request 'Fixes to allow compilation on MacOS' (#611) from mueller/mac-os into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #611
2022-05-02 15:22:19 +02:00
57e6c46e72 Merge branch 'development' into mueller/missing-preproc-defs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 15:16:37 +02:00
cddf16f941 Merge branch 'development' into mueller/mac-os
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 15:15:53 +02:00
a3dee05fe3 Merge pull request 'space packet bug fix' (#607) from meier/spacePacketBugFix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #607
2022-05-02 15:15:28 +02:00
a3617cad11 preproc guards
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 15:12:38 +02:00
8edf4c3c8d Merge branch 'development' into meier/spacePacketBugFix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 15:10:32 +02:00
7801c6effe Merge remote-tracking branch 'upstream/development' into mueller/new-ss-adder-functions
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 15:09:09 +02:00
8cc94a55ab Merge pull request 'Bump Catch2 dependency & Catch2 pre-installed for CI/CD' (#605) from mueller/bump-catch2 into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #605
2022-05-02 15:03:08 +02:00
b62c19a364 Merge branch 'development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 14:48:23 +02:00
daffb6b666 Merge branch 'development' into gaisser_cuc_tests
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2022-05-02 14:45:33 +02:00
7cfb1e6076 Merge branch 'development' into mueller/bump-catch2
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 14:36:44 +02:00
cc36baff78 Merge pull request 'Hotfix CMake & ETL' (#604) from mueller/hotfix-etl into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #604
2022-05-02 14:36:29 +02:00
4c65109ac0 Merge branch 'development' into meier/spacePacketBugFix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 14:36:24 +02:00
861bd15eda Merge branch 'development' into mueller/hotfix-etl
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 14:20:40 +02:00
7b979eadff Merge pull request 'fix compiler warnings and auto-formatting' (#598) from eive/fsfw:mueller/compiler-warning-fixes-upstream-2 into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #598
2022-05-02 14:17:00 +02:00
16714ceb40 Merge branch 'development' into gaisser_cuc_tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 13:58:17 +02:00
fea301bcc9 Merge remote-tracking branch 'origin/mueller/hotfix-etl' into mueller/mac-os
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-05-02 09:35:28 +02:00
77450eb4b7 removed flag which does not exist
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-05-02 09:09:41 +02:00
28015c4735 it compiles and runs
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-05-01 17:48:49 +02:00
7d61e67d20 more macos changes
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-04-30 19:02:41 +02:00
afcbc8be0a changes for MacOS
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-04-30 18:40:22 +02:00
7a2269262b Merge branch 'development' into meier/spacePacketBugFix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-29 08:45:10 +02:00
9731dc1e61 space packet bug fix
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-29 07:47:23 +02:00
bf2e0f2d73 added option to change initial submode
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-28 16:49:13 +02:00
e98857fab4 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-28 14:37:21 +02:00
29b0a352fc added new functions to add sequences and tables 2022-04-28 14:26:00 +02:00
8642b13fd1 Merge branch 'mueller/hotfix-etl' into mueller/bump-catch2
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-27 21:55:45 +02:00
6aa72892ed clean usage of FetchContent_MakeAvailable
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 21:53:57 +02:00
70f0a72f1b added explicit checkout of v3.0.0-preview5
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 13:54:15 +02:00
b5d890eedd install Catch2 for docker_d2 and update Jenkinsfile
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-04-27 13:43:49 +02:00
50b1b48678 link Catch2 issue
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-04-27 13:36:26 +02:00
0e0dbc74aa Merge branch 'mueller/hotfix-etl' into mueller/bump-catch2 2022-04-27 09:45:42 +02:00
8c34051d8b bump Catch2 revision 2022-04-27 09:45:20 +02:00
b00d83cb1a bump ETL revision
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 09:41:16 +02:00
17e609c3a5 some more var replacements
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 09:37:11 +02:00
64f0166b64 hotfix for new ETL dependency
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 09:16:52 +02:00
c80f06fbcb hotfix for ETL lib dep 2022-04-27 09:08:17 +02:00
70eb8325a0 Merge remote-tracking branch 'upstream/development' into mueller/compiler-warning-fixes-upstream-2
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 08:47:45 +02:00
8e4ad10627 Merge remote-tracking branch 'upstream/development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 08:46:18 +02:00
496bc665d6 Merge remote-tracking branch 'upstream/development' into mueller/add-tc-scheduler-pus-11
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 08:45:47 +02:00
2c8531ea48 Merge remote-tracking branch 'upstream/development' into mueller/refactor-power-switch-if-etc
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 08:45:04 +02:00
d3e7037759 Merge branch 'development' into mueller/possible-ring-buffer-fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-27 08:42:24 +02:00
e796f82203 Merge pull request 'gpio bug fix' (#602) from KSat/fsfw:hoffmann/gpioBugfix into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #602
2022-04-27 08:41:54 +02:00
5b7ca8c13c update CHANGELOG.md, apply afmt 2022-04-27 08:39:21 +02:00
0aee86442e typo in readme
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-04-26 11:48:18 +02:00
951c077abc option to use Countdown object to time out replies
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-04-26 10:03:04 +02:00
031739ef51 Merge branch 'development' into hoffmann/gpioBugfix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:45:21 +02:00
b94685e045 added missing PR cross-ref
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:44:46 +02:00
572d602b72 improve changelog, add entry
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:42:44 +02:00
88051c9302 Merge remote-tracking branch 'upstream/development' into mueller/refactor-power-switch-if-etc
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:37:03 +02:00
80be937d9d Merge remote-tracking branch 'upstream/development' into mueller/compiler-warning-fixes-upstream-2
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:24:17 +02:00
d62ee6a611 Merge remote-tracking branch 'upstream/development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:23:46 +02:00
91ef4ff30b Merge remote-tracking branch 'upstream/development' into mueller/add-tc-scheduler-pus-11
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:23:15 +02:00
b8516b15cb Merge pull request 'Added an additional conversion function' (#584) from eive/fsfw:mueller/clock-addition into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #584
2022-04-25 15:22:07 +02:00
755dcf66a3 Merge remote-tracking branch 'upstream/development' into mueller/possible-ring-buffer-fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:16:52 +02:00
4032228005 Merge remote-tracking branch 'upstream/development' into mueller/extend-version-class
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:15:54 +02:00
50ce13d596 Merge branch 'development' into mueller/power-switcher-component-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:14:38 +02:00
68302e7c5e Merge remote-tracking branch 'upstream/development' into mueller/add-tc-scheduler-pus-11
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:14:13 +02:00
ac5a54b5da Merge branch 'development' into mueller/clock-addition
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:12:24 +02:00
b7ffd2653b Merge remote-tracking branch 'upstream/development' into mueller/possible-ring-buffer-fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:11:52 +02:00
29015b340b update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 15:10:50 +02:00
64274acbeb Merge pull request 'Add ETL dependency' (#592) from KSat/fsfw:mueller/add-etl-dependency into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #592
2022-04-25 15:08:05 +02:00
ff98c42514 Merge branch 'development' into mueller/clock-addition
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 14:54:22 +02:00
126ac52975 Merge pull request 'Allow passing a MqArgs struct to the MQ creation' (#583) from eive/fsfw:mueller/ipc-pass-arbitrary-args-to-mq into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #583
2022-04-25 14:43:52 +02:00
70d3197212 gpio init bug fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
Return values from configureGpios were not checked
2022-04-25 14:32:05 +02:00
dd90980520 push test
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-25 14:19:03 +02:00
18f9958332 add git CST and sha info to version ctor
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-22 15:39:44 +02:00
68231db9a1 changelog typo
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-22 15:37:14 +02:00
85e849ca00 small remaining fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-22 15:10:08 +02:00
617d41c7d5 maybe this fixed CI/CD issues
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-22 15:08:16 +02:00
cccdced74d unique helper file name
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-22 15:00:04 +02:00
750369b0a6 small addition and possible fix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-22 14:55:17 +02:00
539e01deee minor form change
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-22 14:53:12 +02:00
4079edc80e update changelog 2022-04-22 14:52:55 +02:00
a569990ca2 fix tests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-22 14:50:50 +02:00
9c7eba4431 git version handler more robust now
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-22 14:47:28 +02:00
513ae9dc10 prefixed git info variable
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-22 14:38:32 +02:00
effecd4662 include cmake-modules manually instead
- Instead of using FetchContent
- Separate folder for easier update and for distintion
- LICENSE file included
2022-04-22 14:33:34 +02:00
b951cb736a add fsfw specific cmake message prefix 2022-04-22 14:08:26 +02:00
7e1aed6ad9 apply afmt 2022-04-22 14:04:30 +02:00
07155e2546 extend version handling with git describe 2022-04-22 14:04:18 +02:00
8c6c8ad3c0 exntend version class to allow add info 2022-04-22 11:58:44 +02:00
352ab43c1f Merge remote-tracking branch 'upstream/development' into mueller/add-etl-dependency
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-12 17:11:41 +02:00
35f257800e Merge remote-tracking branch 'upstream/development' into mueller/add-tc-scheduler-pus-11
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-12 17:10:55 +02:00
07f5dbb9ac Merge branch 'development' into mueller/compiler-warning-fixes-upstream-2
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-12 17:08:56 +02:00
97e98eae24 Merge branch 'development' into mueller/ipc-pass-arbitrary-args-to-mq
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-12 17:06:30 +02:00
5ac88f2b15 Merge pull request 'added missing empty implementation in STM32 SPI HAL' (#599) from mueller/small-stm32-hal-bugifx into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #599
2022-04-11 17:48:48 +02:00
7a5ce57bbc Merge branch 'development' into mueller/possible-ring-buffer-fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 17:35:42 +02:00
b03a6684f9 Merge branch 'development' into mueller/small-stm32-hal-bugifx
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 17:34:39 +02:00
afce942bf8 Merge branch 'development' into mueller/compiler-warning-fixes-upstream-2
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-04-11 17:33:04 +02:00
7c2e50b665 added related PR in changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 17:32:01 +02:00
c04ca704d2 Merge pull request 'progagate reply returnvalue' (#597) from eive/fsfw:mueller/propagate-pool-manage-retval into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #597
2022-04-11 17:31:54 +02:00
6aa54fe1d4 added missing empty implementation
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 17:30:27 +02:00
a1d7a56dfa small fix
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 17:14:43 +02:00
cb78fefbb3 afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 17:14:04 +02:00
c55925959b Merge branch 'mueller/add-etl-dependency' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/add-etl-dependency
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:44:30 +02:00
4f0669c574 doc update 2022-04-11 16:44:20 +02:00
f0d996ffd2 Merge branch 'development' into mueller/add-etl-dependency 2022-04-11 16:17:46 +02:00
d0b7c22afc Merge branch 'mueller/add-tc-scheduler-pus-11' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/add-tc-scheduler-pus-11
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:17:05 +02:00
a18bc15cbb update changelog 2022-04-11 16:16:56 +02:00
f4d05c2c9c Merge branch 'mueller/ipc-pass-arbitrary-args-to-mq' of https://egit.irs.uni-stuttgart.de/eive/fsfw into mueller/ipc-pass-arbitrary-args-to-mq
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:13:55 +02:00
d1151ca707 changelog update 2022-04-11 16:13:47 +02:00
82f46992f6 Merge branch 'development' into mueller/ipc-pass-arbitrary-args-to-mq
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:11:57 +02:00
4ed9cc933f Merge branch 'development' into mueller/refactor-power-switch-if-etc
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:11:27 +02:00
7af1c86f1c use default call
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:10:17 +02:00
bd0b7aa230 Merge branch 'mueller/power-switcher-component-upstream' of https://egit.irs.uni-stuttgart.de/eive/fsfw into mueller/power-switcher-component-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:09:32 +02:00
72e0938f9a use size instead of capacity on sanity check 2022-04-11 16:09:15 +02:00
dd1b0a9380 Merge branch 'development' into mueller/power-switcher-component-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:08:27 +02:00
9947a648df fix compiler warnings
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 16:06:13 +02:00
c0f80680ef Merge branch 'mueller/propagate-pool-manage-retval' of https://egit.irs.uni-stuttgart.de/eive/fsfw into mueller/propagate-pool-manage-retval
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 14:35:28 +02:00
7761b66fe2 delete data from ipc store if reply fails 2022-04-11 14:35:16 +02:00
acc4c8d975 check serialize result as well 2022-04-11 14:33:28 +02:00
fe739aa81a Merge branch 'development' into mueller/propagate-pool-manage-retval
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 14:26:34 +02:00
adfefdd93f printout tweak
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
2022-04-11 14:19:01 +02:00
afe006e234 Merge pull request 'Alternative reply ID activation' (#595) from meier/alternativeReply into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #595
2022-04-11 14:18:52 +02:00
95f018a0b0 update IF method
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 14:07:02 +02:00
8c2105ae0a correct init value for object ID
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 14:00:37 +02:00
ed2c2af4a0 take upstream impl of local data pool manager
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 13:59:38 +02:00
17771c0497 progagate reply returnvalue
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 13:57:18 +02:00
82df132e7d tests running again
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-11 13:54:43 +02:00
a02619e5a2 strongly simplified and streamlined IPC MQ Impl
- Generic code was duplicated across all OSALs.
  Is contained in generic base class now
- Remove duplicate documentation
2022-04-11 11:19:38 +02:00
a011e70665 Merge branch 'development' into mueller/ipc-pass-arbitrary-args-to-mq
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-04 17:21:11 +02:00
c05184e1c4 Merge branch 'development' into meier/alternativeReply
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-04 14:25:08 +02:00
4dee913d51 Merge branch 'development' into mueller/add-tc-scheduler-pus-11
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-04 14:19:25 +02:00
b2252bdc0b Merge remote-tracking branch 'upstream/development' into mueller/add-etl-dependency
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-04 14:18:30 +02:00
7e61ce1ed2 Merge pull request 'cmake lists update to suppress large warning' (#588) from eive/fsfw:mueller/catch2-find-package-quiet into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #588
2022-04-04 14:07:38 +02:00
b764194ed0 added more unit tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-01 18:43:46 +02:00
2d0e4ba951 applied afmt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-01 18:38:54 +02:00
0d549b687d Merge branch 'mueller/refactor-power-switch-if-etc' of https://egit.irs.uni-stuttgart.de/eive/fsfw into mueller/refactor-power-switch-if-etc
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-01 18:38:34 +02:00
738f572043 added unit tests, minor API change 2022-04-01 18:38:25 +02:00
cab508fd64 Merge branch 'development' into mueller/refactor-power-switch-if-etc
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-01 17:28:14 +02:00
c7daf697a8 add new power switcher component
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-01 17:27:53 +02:00
c20be13733 change switch type in header as well
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-04-01 16:40:13 +02:00
fcb6437388 Merge branch 'development' into mueller/ipc-pass-arbitrary-args-to-mq
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-31 14:42:15 +02:00
6c1db8473b get alternative reply from device command info
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-31 14:36:45 +02:00
b42987059a make dummy power switcher a system object
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-30 17:41:38 +02:00
82fc7f33a8 update afmt scripts to format *.tpp files
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-29 15:11:41 +02:00
bfa77cf810 Add TC scheduler service
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
- Written by David Woodward as part of the SOURCE project
- Adaptions to make it more generic and compatible to FSFW
2022-03-29 15:07:29 +02:00
a3930dafc5 Moved unused constructors
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 21:37:25 +02:00
4f9797af3b Updated CCSDS CuC Functions
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 21:24:33 +02:00
1a530633ca small fix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-28 21:10:51 +02:00
8037e8074b more docs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 21:03:18 +02:00
d07e0e5576 trying something 2022-03-28 21:01:26 +02:00
5525466b52 update changelog 2022-03-28 20:57:30 +02:00
c2a89bf709 bugfix 2022-03-28 20:57:13 +02:00
8dd0b2608d cache version variables 2022-03-28 20:55:34 +02:00
05495077ec doc update 2022-03-28 20:53:39 +02:00
8ff9eadf30 update changelog, add basic instructions for etl 2022-03-28 20:43:36 +02:00
082c86ea18 link ETL lib as well
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-28 20:18:49 +02:00
2800d6f28c add ETL dependency 2022-03-28 20:16:11 +02:00
b4effe7a46 Clang format
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 18:33:24 +02:00
e6e71436c2 Added more tests 2022-03-28 18:32:51 +02:00
4be45adae6 Merge branch 'development' into mueller/catch2-find-package-quiet
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 16:44:23 +02:00
a887f852c8 Merge branch 'development' into mueller/clock-addition
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 15:45:58 +02:00
0d7d2203d2 Merge pull request 'Added function to add component to a periodic task by pointer' (#591) from mohr/task into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #591
2022-03-28 15:23:26 +02:00
cde184f428 Merge branch 'development' into mohr/task
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 15:18:23 +02:00
0b3255e463 Fixed tests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 15:17:59 +02:00
df3794dfd8 Merge pull request 'delete code which is not required anymore' (#587) from eive/fsfw:mueller/small-mgmlis3-tweak into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #587
2022-03-28 15:08:22 +02:00
b7a316008a increase allowed read bytes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 15:07:46 +02:00
d02d5c351d Merge branch 'development' into mueller/small-mgmlis3-tweak
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 15:05:24 +02:00
f598f7030f Merge remote-tracking branch 'upstream/development' into mueller/possible-ring-buffer-fix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-28 15:03:01 +02:00
631a531212 Merge branch 'development' into mueller/clock-addition
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 14:51:23 +02:00
febecd4b30 Merge pull request 'small tweaks for local datapool code' (#582) from eive/fsfw:mueller/localpool-tweaks into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #582
2022-03-28 14:49:42 +02:00
964e311d8b Merge branch 'development' into mueller/localpool-tweaks
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-03-28 14:48:34 +02:00
d43caa8296 Merge pull request 'Using enums to configure baudrate and bits per word in Linux HAL UART' (#585) from mohr/hal_uart into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #585
2022-03-28 14:47:04 +02:00
916ed3f56a added function to add component to a periodic task by pointer
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 13:50:42 +02:00
23af170229 small tweaks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 12:59:03 +02:00
b32d1da421 this should compile
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-28 12:57:11 +02:00
6f0362b956 refactor power module
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-28 12:48:15 +02:00
665d8cd479 Applied clang format
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-25 18:48:53 +01:00
10398855a9 Added more unittest coverage
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
Added Mutex for gmtime functions
Moved Statics used in ClockCommon to ClockCommon
2022-03-25 18:47:31 +01:00
70f575396d Added changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-25 15:27:22 +01:00
ad57e6713e Fixed Unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-25 15:20:06 +01:00
d0fec93dc3 argument order inversion
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-25 13:42:49 +01:00
59ab54b2fb call corrections
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-25 13:41:37 +01:00
7095999bd2 remove CCSDSTime function
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-25 13:34:35 +01:00
7ffb4107d2 added missing docs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-25 13:34:08 +01:00
d9d9a28ef8 delete code which is not required anymore
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-24 21:04:46 +01:00
23f8e5cb41 some more tests fail
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-24 21:01:21 +01:00
879223f38f added nullptr check
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-24 20:57:42 +01:00
d95582b81b cmake lists update to suppress large warning
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-24 16:54:41 +01:00
8a44c498c5 add two additional tests for ring buffer
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-24 16:50:59 +01:00
c60aa68d00 changed hal linux uart baudrate and bits per word to enums
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-master This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-24 15:44:32 +01:00
a891769a02 ring buffer cfg error warning
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-24 11:32:27 +01:00
df97c582d7 possibly important fix for ring buffer write 2022-03-23 16:48:17 +01:00
9ce59d3c75 added an additional conversion function
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
- timeval to TimeOfDay_t
2022-03-22 17:54:09 +01:00
a0dfdfab2c Allow passing a MqArgs struct to the MQ creation
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
The struct contains context information (which can be extended)
and an arbitrary user argument in form of a void pointer.
This makes the API a lot more flexible
2022-03-22 17:49:22 +01:00
3e17011087 small tweaks for local datapool code
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2022-03-22 17:42:56 +01:00
f441505476 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-22 17:41:49 +01:00
7c64797f03 Add more baud rates
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-22 17:38:47 +01:00
e08bdd3e35 Merge pull request 'Always define FSFW_DISABLE_PRINTOUT' (#576) from eive/fsfw:mueller/define-fsfw-disabled-printout-upstream into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #576
2022-03-14 15:20:40 +01:00
d2dd16aef3 Merge branch 'development' into mueller/define-fsfw-disabled-printout-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-14 15:12:37 +01:00
b7a617dab3 Merge pull request 'minor event changes' (#578) from eive/fsfw:mueller/event-update into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #578
2022-03-14 15:12:21 +01:00
bc95e7c886 Merge branch 'mueller/event-update' of https://egit.irs.uni-stuttgart.de/eive/fsfw into mueller/event-update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-14 15:08:54 +01:00
fca43b3d34 run auto-formatter 2022-03-14 15:08:45 +01:00
48c5c3fbd5 Merge branch 'development' into mueller/event-update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-14 15:07:25 +01:00
b694aea100 Merge pull request 'call setTimeout in Countdown ctor' (#577) from eive/fsfw:mueller/countdown-improvement-upstream into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #577
2022-03-14 15:04:57 +01:00
6998626ad4 Merge branch 'development' into mueller/define-fsfw-disabled-printout-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-14 15:02:07 +01:00
24ad858b64 Merge branch 'development' into mueller/countdown-improvement-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-14 14:46:54 +01:00
288d453978 Merge pull request 'Version Getter Function' (#575) from eive/fsfw:mueller/version-getter-upstream into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #575
2022-03-14 14:44:37 +01:00
522cbc7f3d Merge remote-tracking branch 'upstream/development' into mueller/version-getter-upstream
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-14 14:38:27 +01:00
ce5bcc5897 bugfix
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-14 14:37:41 +01:00
97c93afeff Merge remote-tracking branch 'upstream/development' into mueller/version-getter-upstream
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-14 14:24:43 +01:00
8704b9ab06 Merge pull request 'Fixed test issue with overflow of times' (#574) from gaisser/fsfw:gaisser_ccsds_time_tests into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #574
2022-03-14 14:23:35 +01:00
5a1585bd00 Merge pull request 'SPI HAL improvement' (#573) from eive/fsfw:mueller/spi-initialize-line-state into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #573
2022-03-14 14:18:03 +01:00
5d6de90859 Merge remote-tracking branch 'upstream/development' into mueller/spi-initialize-line-state
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build queued...
2022-03-14 14:15:13 +01:00
378c6c8006 Merge pull request 'HAL: Update for GPIO code' (#572) from eive/fsfw:mueller/gpio-update into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #572
2022-03-14 14:13:33 +01:00
f4922a8686 Merge pull request 'small test device handler fixes' (#571) from eive/fsfw:mueller/small-dh-test-foxes into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #571
2022-03-14 14:11:44 +01:00
0bdcb40609 minor event changes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-11 14:25:34 +01:00
e684680d60 avoid namespace pollution
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-10 09:58:37 +01:00
aa5d1042f0 undef major and minor 2022-03-10 09:57:37 +01:00
14ac852b7e this tests even a bit more
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-10 09:44:06 +01:00
6b1a81ee92 minor tweaks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-10 09:40:34 +01:00
3779b44813 added some more minor tests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-10 09:37:57 +01:00
949549178a update changelog
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-10 09:36:36 +01:00
7daa9812ff added tests
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-03-10 09:35:10 +01:00
ca508bfe61 getter not required anymore
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-09 19:10:33 +01:00
345a799031 improved version.h
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-09 19:08:17 +01:00
445d5dd6f0 Added Checks for CDSShort in unittests
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-09 18:56:08 +01:00
238baa8597 call setTimeout
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-08 11:54:20 +01:00
7932afc315 small form change
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-08 10:13:11 +01:00
d1e3dc4d49 define FSFW_DISABLE_PRINTOUT in any case 2022-03-08 10:12:02 +01:00
77e5fba7fd update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-08 10:08:53 +01:00
ca70c8c614 function to get fsfw version 2022-03-08 10:07:07 +01:00
14620fdd72 minor correction
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2022-03-08 09:02:40 +01:00
89c1878622 add link to PR
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-08 09:01:23 +01:00
d6856fc54a another minor changelog update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-08 09:00:14 +01:00
e5a9cab34e fix changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-08 08:57:18 +01:00
a4f97a7ba7 Fixed another issue of time checks
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-07 18:33:24 +01:00
8b1af232c3 Added Tests for CCSDS Time, fixed LPM Test
Changed behaviour of Host and Linux Clock
2022-03-07 18:22:10 +01:00
983fa346b3 update CHANGELOG
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-07 16:17:33 +01:00
32f420c4f0 SPI HAL improvement
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
- Initialize line state
2022-03-07 16:13:04 +01:00
41a82e923c update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-07 16:09:18 +01:00
5ddac36314 GPIO update 2022-03-07 16:07:01 +01:00
d06eecf9b0 small test device handler fixes
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-07 15:56:45 +01:00
5912ddd2a2 Merge pull request 'Activates new gcc compiler flags' (#568) from gaisser/fsfw:gaisser_compiler_flags into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #568
2022-03-07 14:44:09 +01:00
7db11588b4 Merge branch 'development' into gaisser_compiler_flags 2022-03-07 14:39:01 +01:00
c88b931ef1 Merge pull request 'HAL Devicehandlers: Periodic printouts are runtime configurable now' (#561) from eive/fsfw:mueller/dev-printout-runtime-configurable into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #561
2022-03-07 14:36:25 +01:00
10ffa2f44a Merge branch 'development' into mueller/dev-printout-runtime-configurable
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-07 14:20:56 +01:00
dbe31dd339 Merge pull request 'some forgotten size_t' (#570) from eive/fsfw:mohr/sizes into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #570
2022-03-07 14:19:59 +01:00
14b44f8bb2 Merge branch 'development' into gaisser_compiler_flags
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-07 13:09:21 +01:00
117747970d some forgotten size_t
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-05 22:03:25 +01:00
c6540650e2 Merge pull request 'Changing build to -j4 from -j to lessen load on build server' (#569) from mohr/slowbuild into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #569
2022-03-04 15:16:25 +01:00
f659f13759 Changing build to -j4 from -j to lessen load on build server
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-03-03 16:03:06 +01:00
95078e1103 Merge remote-tracking branch 'upstream/development' into mueller/dev-printout-runtime-configurable
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-28 15:52:54 +01:00
8920255565 Merge pull request 'one shot flag not static anymore' (#560) from eive/fsfw:mueller/test-task-one-shot-flag-not-static into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #560
2022-02-28 15:50:06 +01:00
2d12618c96 Merge branch 'development' into mueller/test-task-one-shot-flag-not-static
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-28 15:42:08 +01:00
68ca6fd122 Merge branch 'development' into gaisser_compiler_flags
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-28 15:29:57 +01:00
33e9592659 Merge pull request 'Unit test for Internal Error Reporter' (#563) from gaisser/fsfw:gaisser_unit_test_internal_error into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #563
2022-02-28 15:26:00 +01:00
19d217e3b9 Merge remote-tracking branch 'upstream/development' into mueller/dev-printout-runtime-configurable
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-28 15:23:54 +01:00
af286d3bc6 Merge remote-tracking branch 'upstream/development' into mueller/test-task-one-shot-flag-not-static
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-28 15:23:21 +01:00
20928732ec Merge branch 'development' into gaisser_unit_test_internal_error
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-28 15:19:44 +01:00
a8426750f2 Merge pull request 'display run commands in helper script' (#564) from eive/fsfw:mueller/update-helper-script into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #564
2022-02-28 15:13:39 +01:00
2635f39344 Merge branch 'development' into mueller/update-helper-script
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-28 15:05:02 +01:00
89327463e3 Merge pull request 'HkSwitchHelper should not be needed anymore' (#557) from eive/fsfw:mueller/delete-obsolete-module into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #557
2022-02-28 15:03:09 +01:00
cf45eca100 Merge remote-tracking branch 'upstream/development' into mueller/dev-printout-runtime-configurable
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-28 15:00:38 +01:00
c0fa365f8f Merge remote-tracking branch 'upstream/development' into mueller/delete-obsolete-module
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-28 14:58:28 +01:00
9d9f19781d Merge remote-tracking branch 'upstream/development' into mueller/test-task-one-shot-flag-not-static
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-28 14:57:38 +01:00
f4520ea346 Merge remote-tracking branch 'upstream/development' into mueller/test-task-one-shot-flag-not-static
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-28 14:56:51 +01:00
bbacdc5cac Merge pull request 'Linux HAL: Add I2C wiretapping option' (#559) from eive/fsfw:mueller/hal-i2c-wiretapping into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #559
2022-02-28 14:55:21 +01:00
a6c0f3fef5 Merge remote-tracking branch 'upstream/development' into mueller/delete-obsolete-module
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-28 14:17:09 +01:00
0e8328fca3 Fixed include based on Feedback
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-24 11:22:51 +01:00
1ef3dae72e Fixed an missing include
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-23 22:36:29 +01:00
32381a7872 Fixed an issue with wrong buffer size 2022-02-23 21:20:22 +01:00
09815f5cce Clang format 2022-02-23 18:24:07 +01:00
f6357b4531 WIP compiler Flags and new unit tests for fixes 2022-02-23 18:23:22 +01:00
a10e5c6ed4 Merge branch 'development' into mueller/update-helper-script
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-23 15:38:25 +01:00
d6d13eec95 Merge branch 'development' into gaisser_unit_test_internal_error
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-23 12:37:55 +01:00
457bc6609e Merge pull request 'apply clang format' (#558) from eive/fsfw:mueller/apply-clang-format into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #558
2022-02-23 12:36:24 +01:00
e75155c329 Merge branch 'development' into mueller/apply-clang-format
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-23 12:30:40 +01:00
d4e48006f2 Merge branch 'development' into mueller/update-helper-script
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-23 12:28:12 +01:00
d6508e23b6 Added more coverage and Documentation
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-23 12:12:49 +01:00
2cb254a556 Removed unused code 2022-02-23 11:53:48 +01:00
f99f5ed730 Merge branch 'development' into mueller/dev-printout-runtime-configurable
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-23 11:03:48 +01:00
5f7e384442 Merge branch 'development' into mueller/hal-i2c-wiretapping
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-23 11:01:53 +01:00
56d0c8c616 Merge branch 'development' into mueller/test-task-one-shot-flag-not-static
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-23 11:01:34 +01:00
5ff0f8ea10 Merge pull request 'README tweak' (#562) from eive/fsfw:mueller/readme-tweak into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #562
2022-02-23 10:08:49 +01:00
fdc8a3d4f7 display run commands in helper script
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 14:02:03 +01:00
e5e85bcff9 still clang
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 13:43:25 +01:00
4862edfdb5 Clang format 2022-02-22 13:42:56 +01:00
a50b52df51 Fixed an issue in host OSAL and added more coverage to IER
All checks were successful
fsfw/fsfw/pipeline/pr-master This commit looks good
2022-02-22 13:37:28 +01:00
eac7e6db07 try readme tweak
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:40:31 +01:00
0c4835bfb5 update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:37:38 +01:00
aebd4817b8 periodic printouts are runtime configurable now
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:33:41 +01:00
9c2ceb4a9f one shot flag not static anymore
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-22 11:29:23 +01:00
68ace0b74a update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:23:29 +01:00
d119479c0a update changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:22:20 +01:00
6739890d53 add i2c wiretapping option
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:19:49 +01:00
90b8ad1e6d apply clang format
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:16:33 +01:00
025f79fcb4 apply clang format
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:16:14 +01:00
6fb64f9ada removed source from cmakelists.txt
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-22 11:11:54 +01:00
2f1b923009 this module should not be needed anymore
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-22 11:06:00 +01:00
45ea09291a Still test for InternalError Reporter 2022-02-18 19:57:36 +01:00
b7f3eff742 WIP unit tests 2022-02-18 19:08:06 +01:00
a274d6598e Merge pull request 'Release v4.0.0' (#554) from development into master
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #554
2022-02-14 16:49:15 +01:00
c3d78120ea preparing 4.0.0
Some checks are pending
fsfw/fsfw/pipeline/pr-master Build started...
fsfw/fsfw/pipeline/head This commit looks good
2022-02-14 16:42:40 +01:00
f24de22e9b Merge pull request 'Some DHB docs' (#551) from eive/fsfw:mueller/dhb-docs into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #551
2022-02-14 16:35:10 +01:00
918783774f Merge branch 'development' into mueller/dhb-docs
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
2022-02-14 16:34:47 +01:00
6744a55b9b docs update
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 16:31:13 +01:00
a612fb446c added two links
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 16:23:21 +01:00
a5adeb333c Merge pull request 'Fixed valgrind python script' (#553) from gaisser/fsfw:gaisser_build_script into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #553
2022-02-14 15:27:04 +01:00
7788cada54 Merge branch 'development' into gaisser_build_script 2022-02-14 15:26:06 +01:00
074ef29b86 Fixed valgrind python script
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 15:19:47 +01:00
d4f059d639 Merge pull request 'increase test limit' (#552) from eive/fsfw:mueller/increase-test-limit into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #552
2022-02-14 15:18:17 +01:00
22bc300902 increase other limits
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 16:14:14 +01:00
0d38ac62d8 this should work an ALL systems
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 16:12:48 +01:00
d81257a91c Merge branch 'mueller/increase-test-limit' of https://egit.irs.uni-stuttgart.de/eive/fsfw into mueller/increase-test-limit
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 16:01:02 +01:00
d53c7e1190 increase test limit 2022-02-14 16:00:43 +01:00
e312cd094a Merge branch 'development' into mueller/increase-test-limit 2022-02-14 14:55:19 +01:00
9e958e752e applied clang format
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-02-14 14:54:20 +01:00
3bcd71598d Merge branch 'development' into mueller/increase-test-limit
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 14:51:35 +01:00
2602d4fed1 Merge branch 'development' into mueller/dhb-docs
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 14:51:16 +01:00
805538ec6e Merge pull request 'meier/uioMapper' (#543) from meier/uioMapper into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #543
2022-02-14 14:50:52 +01:00
120750f22a removed one fclose
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-14 08:51:53 +01:00
9897f51307 added flose and changed warning message to error message
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-14 08:43:10 +01:00
4f87e24f60 increase test limit
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-10 14:08:52 +01:00
2dcf896cca this sounds better
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-10 14:04:23 +01:00
cdf2a90f90 fixed up cross-ref 2022-02-10 14:02:30 +01:00
b25555a533 started DHB docs 2022-02-10 13:53:59 +01:00
bc0100ee08 Merge pull request 'Update CHANGELOG' (#539) from mueller/update-changelog into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #539
2022-02-07 17:13:41 +01:00
c6d152a01d updated changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-07 17:11:04 +01:00
f4f1174849 Merge branch 'development' into mueller/update-changelog 2022-02-07 17:06:16 +01:00
9df8722c10 Merge pull request 'Switching to a static docker image' (#549) from mohr/static_docker into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #549
2022-02-07 17:02:00 +01:00
7208139630 Jenkinsfile another typo
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-07 16:50:59 +01:00
54f3d7bd2d Jenkinsfile typo
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-02-07 16:49:42 +01:00
7a83289b3d using prebuild, static docker image
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
2022-02-07 16:48:41 +01:00
136524424f Merge pull request 'Fix for Catch2 build regression' (#548) from mohr/catch2workaround into development
Some checks failed
fsfw/fsfw/pipeline/head There was a failure building this commit
Reviewed-on: #548
2022-02-07 16:45:47 +01:00
793b97f651 Merge branch 'development' into mohr/catch2workaround
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-07 16:40:13 +01:00
2e4cd80556 workaround for build regression catch2-v3.0.0-preview4
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-07 15:51:06 +01:00
a4f57a38fa Merge branch 'mueller/update-changelog' of egit.irs.uni-stuttgart.de:fsfw/fsfw into mueller/update-changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-07 15:42:00 +01:00
6dc34fc1f0 removed cmake warning as I have a workaround 2022-02-07 15:41:10 +01:00
9e6948a8d7 Merge pull request 'virtual function to print datasets' (#544) from meier/printDataSet into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #544
2022-02-07 14:42:17 +01:00
9b17b282c6 Merge pull request 'do send read hook' (#545) from meier/doSendReadHook into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #545
2022-02-07 14:42:05 +01:00
5f48d77c64 Merge branch 'development' into meier/printDataSet
Some checks are pending
fsfw/fsfw/pipeline/pr-development Build started...
fsfw/fsfw/pipeline/head This commit looks good
2022-02-07 14:17:26 +01:00
8ab8c57f9c Merge branch 'development' into meier/doSendReadHook
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
2022-02-07 14:17:03 +01:00
c7b9df5e40 Merge branch 'development' into mueller/update-changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-07 14:16:52 +01:00
7b8019c621 Merge branch 'development' into meier/uioMapper
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-07 14:09:13 +01:00
baddbf7340 Updated changelog for v4.0.0
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-07 13:44:25 +01:00
80a610141a added v3.0.1 to changelog
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-04 13:45:09 +01:00
f93c173715 Merge pull request 'Update development to master v3.0.1' (#546) from master into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
Reviewed-on: #546
2022-02-04 13:29:59 +01:00
1b41153ee6 add uio subdirectory
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-04 10:16:37 +01:00
f08d291e3e fix to remove compiler warning
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-03 11:07:51 +01:00
06ffe27fcc do send read hook
All checks were successful
fsfw/fsfw/pipeline/head fixing jenkins bug
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-03 10:46:14 +01:00
e9b0951a95 virtual function to print datasets
All checks were successful
fsfw/fsfw/pipeline/head fixing jenkins bug
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-03 10:37:07 +01:00
348274c145 merged develop
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-03 10:31:15 +01:00
40329a33b2 prepared for proper pr
Some checks failed
fsfw/fsfw/pipeline/head Build started...
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-03 10:19:33 +01:00
2d52042ed6 add uio subdir
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
2022-02-03 10:16:06 +01:00
79936a3335 uio mapper 2022-02-03 10:14:47 +01:00
51add8a8ad Merge remote-tracking branch 'origin/development' into mueller/update-changelog
All checks were successful
fsfw/fsfw/pipeline/head fixing jenkins bug
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-02 10:40:25 +01:00
ad5bb4c694 update changelog.md
Some checks are pending
fsfw/fsfw/pipeline/head Build started...
2022-02-02 10:40:00 +01:00
bf5a11cbd3 Merge pull request 'applied clang script' (#534) from mueller/apply-clang-script into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #534
2022-02-02 10:38:07 +01:00
ddcac2bbac reapply clang format
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-02 10:29:30 +01:00
70b593df65 Merge pull request 'Added CFDP packet stack' (#528) from KSat/fsfw:mueller/cfdp-pdus into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #528
2022-02-02 10:27:39 +01:00
e5cc7069a6 Merge remote-tracking branch 'upstream/development' into mueller/cfdp-pdus
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-02 10:19:31 +01:00
98dbaf03e0 Merge pull request 'Linux CommandExecutor' (#536) from eive/fsfw:mueller/cmd-executor into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #536
2022-02-02 10:17:52 +01:00
e0c50477cb it actually was an uninitialized array
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-02-02 10:00:57 +01:00
30687f84c8 Merge branch 'mueller/cmd-executor' of https://egit.irs.uni-stuttgart.de/eive/fsfw into mueller/cmd-executor 2022-02-02 09:56:41 +01:00
fed39defd3 update helper script 2022-02-02 09:56:12 +01:00
acbc2cd749 valgrind why
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-01 18:04:08 +01:00
368481f88b move strcmp outside of macro
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-01 14:04:13 +01:00
d2b561ba2f test
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-01 13:57:27 +01:00
990e8672a8 update dockerfile
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-01 13:47:16 +01:00
9cde8c7f45 Merge branch 'mueller/cfdp-pdus' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/cfdp-pdus
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-01 11:01:19 +01:00
751de7accc Merge remote-tracking branch 'upstream/development' into mueller/cfdp-pdus 2022-02-01 11:00:57 +01:00
74ae3f1371 Merge remote-tracking branch 'upstream/development' into mueller/cmd-executor
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-02-01 10:49:14 +01:00
02ac92a6b3 Merge pull request 'CMake optimization' (#533) from mueller/cmake-optimization into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #533
2022-01-31 15:41:09 +01:00
b83b2e8f89 Merge pull request 'Catch 2 Update' (#538) from mueller/catch2-update into development
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
Reviewed-on: #538
2022-01-31 15:18:42 +01:00
8a39971a1c oops, wrong language
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
fsfw/fsfw/pipeline/head This commit looks good
2022-01-31 15:11:37 +01:00
1ead156c64 added --pull to the docker build
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-01-31 15:08:52 +01:00
5b968f7e5a Can't use env variables in top leve agent section
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-01-31 15:01:45 +01:00
b98127cea6 Updated CI Build
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
- Always clean and rebuild docker image.
- Use single docker container
2022-01-31 14:59:45 +01:00
eba9abfc9a Jenkinsfile syntax is weird, maybe this works...
All checks were successful
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-01-28 14:10:24 +01:00
bf7fabd7ba commented out when block
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-01-28 13:46:05 +01:00
cf3d4d8de3 cleanDocker
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-01-28 13:43:21 +01:00
8414c9d471 added steps
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-01-28 13:36:43 +01:00
386843e3e7 update jenkinsfile
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-01-28 13:33:06 +01:00
441b3b83c8 Changes to Dockerfile and Jenkinsfile
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
fsfw/fsfw/pipeline/pr-development This commit looks good
1. Install Catch2 from sources inside a Docker stage/layer
2. Some tweaks to Jenkinsfile
2022-01-27 11:30:33 +01:00
c453af5911 cleanCI
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-01-26 15:30:01 +01:00
fe95c3337a changed builddir name in Jenkinsfile
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-01-26 12:28:30 +01:00
bc5a6b4a51 bump catch2 version to v3.0.0-preview4
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2022-01-26 12:23:12 +01:00
371ff931bf Linux CommandExecutor
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
The CommandExecutor helper class can execute shell commands in blocking and non-blocking mode
This class is able to execute processes by using the Linux popen call. It also has the capability of writing
the read output of a process into a provided ring buffer.

The executor works by first loading the command which should be executed and specifying whether
it should be executed blocking or non-blocking. After that, execution can be started with the execute call.

Using non-blocking mode allows to execute commands which might take a longer time in the background,
and allowing the user thread to check completion status with the check function

Moved to HAL like requested in code review and unit tested with failing commands as well.
Also, Linux HAL components are compiled by default now unless explicitely disabled.
2022-01-26 12:11:52 +01:00
6c63d82f5c better comment
All checks were successful
fsfw/fsfw/pipeline/head build bug von Jenkins manuell gefixed
fsfw/fsfw/pipeline/pr-development This commit looks good
2022-01-18 18:47:29 +01:00
78ddce249c try an optimization
All checks were successful
fsfw/fsfw/pipeline/head This commit looks good
2022-01-18 18:29:54 +01:00
d93f2c5055 Merge branch 'development' into mueller/cfdp-pdus
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2021-12-20 14:16:02 +01:00
d39e0c8bb6 renamed test folder
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2021-12-07 14:08:26 +01:00
7a84dff7d6 maybe this fixes the build error?
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2021-12-06 16:23:09 +01:00
6a6f6011ba Merge branch 'mueller/cfdp-pdus' of https://egit.irs.uni-stuttgart.de/KSat/fsfw into mueller/cfdp-pdus
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2021-12-06 16:12:32 +01:00
602fa3a956 Merge remote-tracking branch 'upstream/development' into mueller/cfdp-pdus 2021-12-06 16:12:06 +01:00
c3a0aabfb8 Merge branch 'development' into mueller/cfdp-pdus
Some checks failed
fsfw/fsfw/pipeline/pr-development There was a failure building this commit
2021-12-06 15:07:51 +01:00
5907f8ee9d Added CFDP packet stack
This PR adds the packet stack for the CCSDS File Delivery Protocol.
It also refactors the existing TMTC infastructure to allow sending
of CFDP packets to the CCSDS handlers.

This includes the whole PDU (Protocol Data Unit) stack:

- File Data PDUs

and all file directive PDUs

- ACK PDU
- NAK PDU
- Metadata PDU
- Finished PDU
- Prompt PDU
- Keep Alive PDU
- EOF PDU

The PR includes a full set of unittests for the packet stack
with a coverage of 90+ %.

The refactoring of the existing TMTC infastructure includes non-ideal
solutions like diamond inheritance.
Avoiding this solution would require refactoring the packet stack.
This would be a good idea anyway because the existing stack is tightly
coupled to the FSFW, making reuse more difficult if only the stack is
planned to be used without the store functionalities etc.

The PDU implementation provided here is only weakly coupled to the FSFW,
only using components like returnvalues or the Serialization modules.
There are dedicated serializers and deserializers, which also helps in
creating small focused modules which are easy to test.

Some of the modules here were provied by Matthias Tompert.
2021-12-03 15:37:49 +01:00
1354 changed files with 73981 additions and 59619 deletions

11
.gitignore vendored
View File

@ -1,6 +1,17 @@
# PyCharm and CLion
/.idea/*
!/.idea/runConfigurations
!/.idea/cmake.xml
!/.idea/codeStyles
# Eclipse
.cproject
.project
.settings
.metadata
# VSCode
.vscode
/build*
/cmake-build*

14
.idea/codeStyles/Project.xml generated Normal file
View File

@ -0,0 +1,14 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<clangFormatSettings>
<option name="ENABLED" value="true" />
</clangFormatSettings>
<codeStyleSettings language="CMake">
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="0" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

175
CHANGELOG
View File

@ -1,175 +0,0 @@
# Changed from ASTP 1.1.0 to 1.2.0
## API Changes
### FSFW Architecture
- New src folder which contains all source files except the HAL, contributed code and test code
- External and internal API mostly stayed the same
- Folder names are now all smaller case: internalError was renamed to internalerror and
FreeRTOS was renamed to freertos
- Warning if optional headers are used but the modules was not added to the source files to compile
### HAL
- HAL added back into FSFW. It is tightly bound to the FSFW, and compiling it as a static library
made using it more complicated than necessary
## Bugfixes
### FreeRTOS QueueMapManager
- Fixed a bug which causes the first generated Queue ID to be invalid
## Enhancements
### FSFW Architecture
- See API changes chapter. This change will keep the internal API consistent in the future
# Changes from ASTP 1.0.0 to 1.1.0
## API Changes
### PUS
- Added PUS C support
- SUBSYSTEM_IDs added for PUS Services
- Added new Parameter which must be defined in config: fsfwconfig::FSFW_MAX_TM_PACKET_SIZE
### ObjectManager
- ObjectManager is now a singelton
### Configuration
- Additional configuration option fsfwconfig::FSFW_MAX_TM_PACKET_SIZE which
need to be specified in FSFWConfig.h
### CMake
- Changed Cmake FSFW_ADDITIONAL_INC_PATH to FSFW_ADDITIONAL_INC_PATHS
## Bugfixes
- timemanager/TimeStamperIF.h: Timestamp config was not used correctly, leading to different timestamp sizes than configured in fsfwconfig::FSFW_MISSION_TIMESTAMP_SIZE
- TCP server fixes
## Enhancements
### FreeRTOS Queue Handles
- Fixed an internal issue how FreeRTOS MessageQueues were handled
### Linux OSAL
- Better printf error messages
### CMake
- Check for C++11 as mininimum required Version
### Debug Output
- Changed Warning color to magenta, which is well readable on both dark and light mode IDEs
# Changes from ASTP 0.0.1 to 1.0.0
### Host OSAL
- Bugfix in MessageQueue, which caused the sender not to be set properly
### FreeRTOS OSAL
- vRequestContextSwitchFromISR is declared extern "C" so it can be defined in
a C file without issues
### PUS Services
- It is now possible to change the message queue depth for the telecommand verification service (PUS1)
- The same is possible for the event reporting service (PUS5)
- PUS Health Service added, which allows to command and retrieve health via PUS packets
### EnhancedControllerBase
- New base class for a controller which also implements HasActionsIF and HasLocalDataPoolIF
### Local Pool
- Interface of LocalPools has changed. LocalPool is not a template anymore. Instead the size and
bucket number of the pools per page and the number of pages are passed to the ctor instead of
two ctor arguments and a template parameter
### Parameter Service
- The API of the parameter service has been changed to prevent inconsistencies
between documentation and actual code and to clarify usage.
- The parameter ID now consists of:
1. Domain ID (1 byte)
2. Unique Identifier (1 byte)
3. Linear Index (2 bytes)
The linear index can be used for arrays as well as matrices.
The parameter load command now explicitely expects the ECSS PTC and PFC
information as well as the rows and column number. Rows and column will
default to one, which is equivalent to one scalar parameter (the most
important use-case)
### File System Interface
- A new interfaces specifies the functions for a software object which exposes the file system of
a given hardware to use message based file handling (e.g. PUS commanding)
### Internal Error Reporter
- The new internal error reporter uses the local data pools. The pool IDs for
the exisiting three error values and the new error set will be hardcoded for
now, the the constructor for the internal error reporter just takes an object
ID for now.
### Device Handler Base
- There is an additional `PERFORM_OPERATION` step for the device handler base. It is important
that DHB users adapt their polling sequence tables to perform this step. This steps allows for
a clear distinction between operation and communication steps
- setNormalDatapoolEntriesInvalid is not an abstract method and a default implementation was provided
- getTransitionDelayMs is now an abstract method
### DeviceHandlerIF
- Typo for UNKNOWN_DEVICE_REPLY
### Events
- makeEvent function: Now takes three input parameters instead of two and
allows setting a unique ID. Event.cpp source file removed, functions now
defined in header directly. Namespaces renamed. Functions declared `constexpr`
now
### Commanding Service Base
- CSB uses the new fsfwconfig::FSFW_CSB_FIFO_DEPTH variable to determine the FIFO depth for each
CSB instance. This variable has to be set in the FSFWConfig.h file
### Service Interface
- Proper printf support contained in ServiceInterfacePrinter.h
- CPP ostream support now optional (can reduce executable size by 150 - 250 kB)
- Amalagated header which determines automatically which service interface to use depending on FSFWConfig.h configuration.
Users can just use #include <fsfw/serviceinterface/ServiceInterface.h>
- If CPP streams are excluded, sif:: calls won't work anymore and need to be replaced by their printf counterparts.
For the fsfw, this can be done by checking the processor define FSFW_CPP_OSTREAM_ENABLED from FSFWConfig.h.
For mission code, developers need to replace sif:: calls by the printf counterparts, but only if the CPP stream are excluded.
If this is not the case, everything should work as usual.
### ActionHelper and ActionMessage
- ActionHelper finish function and ActionMessage::setCompletionReply now expects explicit
information whether to report a success or failure message instead of deriving it implicitely
from returnvalue
### PUS Parameter Service 20
Added PUS parameter service 20 (only custom subservices available).

785
CHANGELOG.md Normal file
View File

@ -0,0 +1,785 @@
Change Log
=======
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
# [unreleased]
## Fixes
- Important bugfix in CFDP PDU header format: The entity length field and the transaction sequence
number fields stored the actual length of the field instead of the length minus 1 like specified
in the CFDP standard.
- PUS Health Service: Size check for set health command.
Perform operation completion for announce health command.
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/746
- Linux OSAL `getUptime` fix: Check validity of `/proc/uptime` file before reading uptime.
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/745
- Small tweak for version getter
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/744
## Added
- add CFDP subsystem ID
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/742
## Changed
- Bump ETL version to 20.35.14
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/748
- Renamed `PCDU_2` subsystem ID to `POWER_SWITCH_IF`.
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/743
- Add new `PowerSwitchIF::SWITCH_UNKNOWN` returnvalue.
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/743
- Assert that `FixedArrayList` is larger than 0 at compile time.
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/740
## Added
- `EventManager`: Add function to print all listeners.
## Changed
- `EventManager`: Queue depth is configurable now
# [v6.0.0] 2023-02-10
## Fixes
- Mode Service: Add allowed subservice
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/739
- `CService200ModeManagement`: Various bugfixes which lead to now execution complete being generated
on mode announcements, duplicate mode reply generated on announce commands, and the mode read
subservice not working properly.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/736
- Memory leak fixes for the TCP/IP TMTC bridge.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/737
- `Service9TimeManagement`: Fix the time dump at the `SET_TIME` subservice: Include clock timeval
seconds instead of uptime.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/726
- HAL MGM3100 Handler: Use axis specific gain/scaling factors. Previously,
only the X scaling factor was used.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/724
- HAL MGM3100 Handler: Z value was previously calculated with bytes of the X value.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/733
- DHB `setNormalDatapoolEntriesInvalid`: The default implementation did not set the validity
to false correctly because the `read` and `write` calls were missing.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/728
- PUS TMTC creator module: Sequence flags were set to continuation segment (0b00) instead
of the correct unsegmented flags (0b11) as specified in the standard.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/727
- TC Scheduler Service 11: Add size and CRC check for contained TC.
Bug: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/issues/719
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/720
- Only delete health table entry in `HealthHelper` destructor if
health table was set.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/710
- I2C Bugfixes: Do not keep iterator as member and fix some incorrect handling with the iterator.
Also properly reset the reply size for successfull transfers and erroneous transfers.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/700
- Bugfix for Serial Buffer Stream: Setting `doActive` to false now
actually fully disables printing.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/680
- `TcpTmTcServer.cpp`: The server was actually not able to handle
CCSDS packets which were clumped together. This has been fixed now.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/673
- `CServiceHealthCommanding`: Add announce all health info implementation
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/725
- various fixes related to linux Unittests and memory leaks
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/715
- small fix to allow teardown handling
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/713
- fix compiler warning for fixed array list copy ctor
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/704
- missing include
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/703
- defaultconfig did not build anymore
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/702
- hotfix
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/699
- small fix for helper
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/698
- missing retval conv
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/697
- DHB Countdown Bug
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/693
- doc corrections
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/687
- better error printout
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/686
- include correction
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/683
- better warning for missing include paths
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/676
- Service 11 regression
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/670
## Added
- Empty constructor for `CdsShortTimeStamper` which does not do an object manager registration.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/730
- `Service9TimeManagement`: Add `DUMP_TIME` (129) subservice.
- `TcpTmTcServer`: Allow setting the `SO_REUSEADDR` and `SO_REUSEPORT`
option on the TCP server. CTOR prototype has changed and expects an explicit
TCP configuration struct to be passed.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/722
- `DleParser` helper class to parse DLE encoded packets from a byte stream.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/711
- `UioMapper` is able to resolve symlinks now.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/709
- Add new `UnsignedByteField` class
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/660
- publish documentation for development and master branch
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/681
- Add Linux HAL options
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/663
- Expand SerializeIF
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/656
- PUS Service 11: Additional Safety Check
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/666
- improvements for auto-formatter script
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/665
- provide a weak print char impl
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/674
## Removed
- now that doc server is up, remove markdown files
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/688
- remove bsp specific code
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/679
## Changes
- `CService201HealthCommanding` renamed to `CServiceHealthCommanding`,
service ID customizable now. `CServiceHealthCommanding` expects configuration struct
`HealthServiceCfg` now
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/725
- `AcceptsTelemetryIF`: `getReportReceptionQueue` is const now
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/712
- Moved some container returnvalues to dedicated header and namespace
so they can be used without template specification.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/707
- Remove default secondary header argument for
`uint16_t getTcSpacePacketIdFromApid(uint16_t apid, bool secondaryHeaderFlag)` and
`uint16_t getTmSpacePacketIdFromApid(uint16_t apid, bool secondaryHeaderFlag)`
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/689
- Removed `HasReturnvaluesIF` class in favor of `returnvalue` namespace with `OK` and `FAILED`
constants.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/659
- Overhaul of the TMTC stack, including various changes and improvements
for other modules
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/655
which also includes a migration guide
- Bump Catch2 dependency to regular version `v3.1.0`
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/678
- `SerialBufferAdapter`: Rename `setBuffer` to `setConstBuffer` and update
API to expect `const uint8_t*` accordingly.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/677
- Remove the following user includes from `fsfw/events/Event.h` and
`fsfw/returnvalues/returnvalue.h`:
- `#include "events/subsystemIdRanges.h"`
- `#include "returnvalues/classIds.h"`
The user has to include those themselves now
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/675
- `DeviceHandlerBase`: Set command sender before calling `buildCommandFromCommand`.
This allows finishing action commands immediately inside the function.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/672
- `DeviceHandlerBase`: New signature of `handleDeviceTm` which expects
a `const SerializeIF&` and additional helper variant which expects `const uint8_t*`
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/671
- Improvements for `AcceptsTelemetryIF` and `AcceptsTelecommandsIF`:
- Make functions `const` where it makes sense
- Add `const char* getName const` abstract function
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/684
- Generic TMTC Bridge Update
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/734
- comment tweak to event parser can read everything
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/732
- CMakeLists file updates
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/731
- improve srv20 error messages
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/723
- I2C Linux: remove duplicate printout
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/718
- printout handling improvements
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/717
- vec getter, reset for content
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/716
- updates for source sequence counter
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/714
- SP reader getPacketData is const now
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/708
- refactoring of serial drivers for linux
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/705
- Local Pool Update Remove Add Data Ignore Fault Argument
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/701
- Switch to new documentation server
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/694
- Windows Tweaks
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/691
- Refactor Local Pool API
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/667
- group MGM data in local pool vectors
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/664
## CFDP
- Refactoring of CFDP stack which was done during implementation of the CFDP source and destination
handlers.
- New filesystem module, changes for filesystem abstraction `HasFileSystemIF` to better
fit requirements of CFDP
- New `HostFilesystem` implementation of the `HasFileSystemIF`
- New `cfdp::UserBase` class which is the abstraction for the CFDP user in an OBSW context.
- mib module for the CFDP stack
- PDU classes renamed from `...Serializer`/`...Deserializer` to `...Creator`/`...Reader`
respetively
- Renamed `TcDistributor` to `TcDistributorBase` to prevent confusion
- Refactored `TcDisitributorBase` to be more flexible and usable for CFDP distribution
- Renamed `CCSDSDistributor` to `CcsdsDistributor` and add feature which allows it
to remove the CCSDS header when routing a packet. This allows CCSDS agnostic receiver
implementation without an extra component
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/682
# [v5.0.0] 2022-07-25
## Changes
- Renamed auto-formatting script to `auto-formatter.sh` and made it more robust.
If `cmake-format` is installed, it will also auto-format the `CMakeLists.txt` files now.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/625
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/626
- Bump C++ required version to C++17. Every project which uses the FSFW and every modern
compiler supports it
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/622
- New CMake option `FSFW_HAL_LINUX_ADD_LIBGPIOD` to specifically exclude `gpiod` code.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/572
- HAL Devicehandlers: Periodic printout is run-time configurable now
- `oneShotAction` flag in the `TestTask` class is not static anymore
- `SimpleRingBuffer::writeData` now checks if the amount is larger than the total size of the
Buffer and rejects such writeData calls with `returnvalue::FAILED`
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/586
- Major update for version handling, using `git describe` to fetch version information with git.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/601
- Add helper functions provided by [`cmake-modules`](https://github.com/bilke/cmake-modules)
manually now. Those should not change too often and only a small subset is needed
- Separate folder for easier update and for distinction
- LICENSE file included
- use `int` for version numbers to allow unset or uninitialized version
- Initialize Version object with numbers set to -1
- Instead of hardcoding the git hash, it is now retrieved from git
- `Version` now allows specifying additional version information like the git SHA1 hash and the
versions since the last tag
- Additional information is set to the last part of the git describe output for `FSFW_VERSION` now.
- Version still need to be hand-updated if the FSFW is not included as a submodule for now.
- IPC Message Queue Handling: Allow passing an optional `MqArgs` argument into the MessageQueue
creation call. It allows passing context information and an arbitrary user argument into
the message queue. Also streamlined and simplified `MessageQueue` implementation for all OSALs
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/583
- Internal API change: Moved the `fsfw_hal` to the `src` folder and integration and internal
tests part of `fsfw_tests` to `src`. Unittests are now in a dedicated folder called `unittests`
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/653
### Task Module Refactoring
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/636
**Refactoring general task code**
- There was a lot of duplicate/boilerplate code inside the individual task IF OSAL implementations.
Remove it by introducing base classes `PeriodicTaskBase` and `FixedTimeslotTaskBase`.
**Refactor PeriodicTaskIF**
- Convert `virtual ReturnValue_t addComponent(object_id_t object)` to
`virtual ReturnValue_t addComponent(object_id_t object, uint8_t opCode = 0)`, allowing to pass
the operation code passed to `performOperation`. Updated API taking
an `ExecutableObjectIF` accordingly
**Refactor FixedTimeslotTaskIF**
- Add additional `addSlot` function which takes an `ExecutableObjectIF` pointer and its Object ID
**Refactor FixedSequenceSlot**
- Introduce typedef `CustomCheckFunc` for `ReturnValue_t (*customCheckFunction)(const SlotList&)`.
- Convert `ReturnValue_t (*customCheckFunction)(const SlotList&)` to
`ReturnValue_t (*customCheckFunction)(const SlotList&, void*)`, allowing arbitrary user arguments
for the custom checker
**Linux Task Module**
- Use composition instead of inheritance for the `PeriodicPosixTask` and make the `PosixTask` a
member of the class
### HAL
- HAL Linux Uart: Baudrate and bits per word are enums now, avoiding misconfigurations
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/585
- HAL Linux SPI: Set the Clock Default State when setting new SPI speed
and mode
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/573
- GPIO HAL: `Direction`, `GpioOperation` and `Levels` are enum classes now, which prevents
name clashes with Windows defines.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/572
- HAL Linux Uart: Baudrate and bits per word are enums now, avoiding misconfigurations
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/585
### Time
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/584 and
https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/593
- `timeval` to `TimeOfDay_t`
- Added Mutex for gmtime calls: (compare http://www.opengate.at/blog/2020/01/timeless/)
- Moved the statics used by Clock in ClockCommon.cpp to this file
- Better check for leap seconds
- Added Unittests for Clock (only getter)
### Power
- `PowerSwitchIF`: Remove `const` specifier from `sendSwitchCommand` and `sendFuseOnCommand` and
also specify a `ReturnValue_t` return type
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/590
- Extend `PowerSwitcher` module to optionally check current state when calling `turnOn` or
`turnOff`. Tis can be helpful to avoid commanding switches which do not need commanding
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/590
## Removed
- Removed the `HkSwitchHelper`. This module should not be needed anymore, now that the local
datapools have been implemented.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/557
## Additions
- New constructor for PoolEntry which allows to simply specify the length of the pool entry.
This is also the new default constructor for scalar value with 0 as an initial value
- Added options for CI/CD builds: `FSFW_CICD_BUILD`. This allows the source code to know
whether it is running in CI/CD
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/623
- Basic `clion` support: Update `.gitignore` and add some basic run configurations
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/625
- LTO support: Allow using LTO/IPO by setting `FSFW_ENABLE_LTO=1`. CMake is able to detect whether
the user compiler supports IPO/LPO. LTO is on by default now. Most modern compilers support it,
can make good use of it and it usually makes the code faster and/or smaller.
After some more research:
Enabling LTO will actually cause the compiler to only produce thin LTO by adding
`-flto -fno-fat-lto-objects` to the compiler options. I am not sure this is an ideal choice
because if an application linking against the FSFW does not use LTO, there can be compile
issues (e.g. observed when compiling the FSFW tests without LTO). This is a known issue as
can be seen in the multiple CMake issues for it:
- https://gitlab.kitware.com/cmake/cmake/-/issues/22913,
- https://gitlab.kitware.com/cmake/cmake/-/issues/16808,
- https://gitlab.kitware.com/cmake/cmake/-/issues/21696
Easiest solution for now: Keep this option OFF by default.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/616
- Linux HAL: Add wiretapping option for I2C. Enabled with `FSFW_HAL_I2C_WIRETAPPING` defined to 1
- Dedicated Version class and constant `fsfw::FSFW_VERSION` containing version information
inside `fsfw/version.h`
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/559
- Added generic PUS TC Scheduler Service 11. It depends on the new added Emebeded Template Library
(ETL) dependency.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/594
- Added ETL dependency and improved library dependency management
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/592
- Add a `DummyPowerSwitcher` module which can be useful for test setups when no PCDU is available
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/590
- New typedef for switcher type
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/590
- `Subsystem`: New API to add table and sequence entries
## Fixed
- TCP TMTC Server: `MutexGuard` was not created properly in
`TcpTmTcServer::handleTmSending(socket_t connSocket, bool& tmSent)` call.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/618
- Fix infinite recursion in `prepareHealthSetReply` of PUS Health Service 201.
Is not currently used right now but might be used in the future
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/617
- Move some CMake directives further up top so they are not ignored
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/621
- Small bugfix in STM32 HAL for SPI
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/599
- HAL GPIO: Improved error checking in `LinuxLibgpioIF::configureGpios(...)`. If a GPIO
configuration fails, the function will exit prematurely with a dedicated error code
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/602
# [v4.0.0]
## Additions
- CFDP Packet Stack and related tests added. It also refactors the existing TMTC infastructure to
allow sending of CFDP packets to the CCSDS handlers.
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/528
- added virtual function to print datasets
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/544
- doSendRead Hook
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/545
- Dockumentation for DHB
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/551
### HAL additions
- Linux Command Executor, which can execute shell commands in blocking and non-blocking mode
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/536
- uio Mapper
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/543
## Changes
- Applied the `clang-format` auto-formatter to all source code
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/534
- Updated Catch2 to v3.0.0-preview4
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/538
- Changed CI to use prebuilt docker image
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/549
## Bugfix
- CMake fixes in PR https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/533 , was problematic
if the uppermost user `CMakeLists.txt` did not have the include paths set up properly, which
could lead to compile errors that `#include "fsfw/FSFW.h"` was not found.
- Fix for build regression in Catch2 v3.0.0-preview4
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/548
- Fix in unittest which failed on CI
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/552
- Fix in helper script
PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/553
## API Changes
- Aforementioned changes to existing TMTC stack
## Known bugs
-
# [v3.0.1]
## API Changes
*
## Bugfixes
* Version number was not updated for v3.0.0 #542
## Enhancement
*
## Known bugs
*
# [v3.0.0]
## API Changes
#### TCP Socket Changes
* Keep Open TCP Implementation #496
* The socket will now kept open after disconnect. This allows reconnecting.
* Only one connection is allowed
* No internal influence but clients need to change their Code.
### GPIO IF
* Add feature to open GPIO by line name #506
### Bitutil
* Unittests for Op Divider and Bitutility #510
### Filesystem IF changed
* Filesystem Base Interface: Use IF instead of void pointer #511
### STM32
* STM32 SPI Updates #518
## Bugfixes
* Small bugfix for LIS3 handler #504
* Spelling fixed for function names #509
* CMakeLists fixes #517
* Out of bound reads and writes in unittests #519
* Bug in TmPacketStoredPusC (#478)
* Windows ifdef fixed #529
## Enhancement
* FSFW.h.in more default values #491
* Minor updates for PUS services #498
* HasReturnvaluesIF naming for parameter #499
* Tests can now be built as part of FSFW and versioning moved to CMake #500
* Added integration test code #508
* More printouts for rejected TC packets #505
* Arrayprinter format improvements #514
* Adding code for CI with docker and jenkins #520
* Added new function in SerializeAdapter #513
* Enables simple deSerialize if you keep track of the buffer position yourself
* `` static ReturnValue_t deSerialize(T *object, const uint8_t* buffer,
size_t* deserSize, SerializeIF::Endianness streamEndianness) ``
* Unittest helper scripts has a new Parameter to open the coverage html in the webrowser #525
* ``'-o', '--open', Open coverage data in webbrowser``
* Documentation updated. Sphinx Documentation can now be build with python script #526
## Known bugs
* Version number was not updated for v3.0.0 #542
All Pull Requests:
Milestone: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/milestone/19
# [v2.0.0]
## API Changes
### File Structure changed to fit more common structure
* See pull request (#445)
* HAL is now part of the main project
* **See Instructions below:**
#### Instruction how to update existing / user code
* Changes in `#include`:
* Rename `internalError` in includes to `internalerror`
* Rename `fsfw/hal` to `fsfw_hal`
* Rename `fsfw/tests` to `fsfw_tests`
* Rename `osal/FreeRTOS` to `osal/freertos`
* Changes in `CMakeLists.txt`:
* Rename `OS_FSFW` to `FSFW_OSAL`
* Changes in `DleEncoder.cpp`
* Create an instance of the `DleEncoder` first before calling the `encode` and `decode` functions
### Removed osal/linux/Timer (#486)
* Was redundant to timemanager/Countdown
#### Instruction how to update existing / user code
* Use timemanager/Countdown instead
## Bugfixes
### TM Stack
* Increased TM stack robustness by introducing `nullptr` checks and more printouts (#483)
#### Host OSAL / FreeRTOS
* QueueMapManager Bugfix (NO_QUEUE was used as MessageQueueId) (#444)
#### Events
* Event output is now consistent (#447)
#### DLE Encoder
* Fixed possible out of bounds access in DLE Encoder (#492)
## Enhancment
* HAL as major new feature, also includes three MEMS devicehandlers as part of #481
* Linux HAL updates (#456)
* FreeRTOS Header cleaning update and Cmake tweaks (#442)
* Printer updates (#453)
* New returnvalue for for empty PST (#485)
* TMTC Bridge: Increase limit of packets stored (#484)
## Known bugs
* Bug in TmPacketStoredPusC (#478)
All Pull Requests:
Milestone: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/milestone/5
# [v1.2.0]
## API Changes
### FSFW Architecture
- New src folder which contains all source files except the HAL, contributed code and test code
- External and internal API mostly stayed the same
- Folder names are now all smaller case: internalError was renamed to internalerror and
FreeRTOS was renamed to freertos
- Warning if optional headers are used but the modules was not added to the source files to compile
### HAL
- HAL added back into FSFW. It is tightly bound to the FSFW, and compiling it as a static library
made using it more complicated than necessary
## Bugfixes
### FreeRTOS QueueMapManager
- Fixed a bug which causes the first generated Queue ID to be invalid
## Enhancements
### FSFW Architecture
- See API changes chapter. This change will keep the internal API consistent in the future
# [v1.1.0]
## API Changes
### PUS
- Added PUS C support
- SUBSYSTEM_IDs added for PUS Services
- Added new Parameter which must be defined in config: fsfwconfig::FSFW_MAX_TM_PACKET_SIZE
### ObjectManager
- ObjectManager is now a singelton
### Configuration
- Additional configuration option fsfwconfig::FSFW_MAX_TM_PACKET_SIZE which
need to be specified in FSFWConfig.h
### CMake
- Changed Cmake FSFW_ADDITIONAL_INC_PATH to FSFW_ADDITIONAL_INC_PATHS
## Bugfixes
- timemanager/TimeStamperIF.h: Timestamp config was not used correctly, leading to different timestamp sizes than configured in fsfwconfig::FSFW_MISSION_TIMESTAMP_SIZE
- TCP server fixes
## Enhancements
### FreeRTOS Queue Handles
- Fixed an internal issue how FreeRTOS MessageQueues were handled
### Linux OSAL
- Better printf error messages
### CMake
- Check for C++11 as mininimum required Version
### Debug Output
- Changed Warning color to magenta, which is well readable on both dark and light mode IDEs
# Changes from ASTP 0.0.1 to 1.0.0
### Host OSAL
- Bugfix in MessageQueue, which caused the sender not to be set properly
### FreeRTOS OSAL
- vRequestContextSwitchFromISR is declared extern "C" so it can be defined in
a C file without issues
### PUS Services
- It is now possible to change the message queue depth for the telecommand verification service (PUS1)
- The same is possible for the event reporting service (PUS5)
- PUS Health Service added, which allows to command and retrieve health via PUS packets
### EnhancedControllerBase
- New base class for a controller which also implements HasActionsIF and HasLocalDataPoolIF
### Local Pool
- Interface of LocalPools has changed. LocalPool is not a template anymore. Instead the size and
bucket number of the pools per page and the number of pages are passed to the ctor instead of
two ctor arguments and a template parameter
### Parameter Service
- The API of the parameter service has been changed to prevent inconsistencies
between documentation and actual code and to clarify usage.
- The parameter ID now consists of:
1. Domain ID (1 byte)
2. Unique Identifier (1 byte)
3. Linear Index (2 bytes)
The linear index can be used for arrays as well as matrices.
The parameter load command now explicitely expects the ECSS PTC and PFC
information as well as the rows and column number. Rows and column will
default to one, which is equivalent to one scalar parameter (the most
important use-case)
### File System Interface
- A new interfaces specifies the functions for a software object which exposes the file system of
a given hardware to use message based file handling (e.g. PUS commanding)
### Internal Error Reporter
- The new internal error reporter uses the local data pools. The pool IDs for
the exisiting three error values and the new error set will be hardcoded for
now, the the constructor for the internal error reporter just takes an object
ID for now.
### Device Handler Base
- There is an additional `PERFORM_OPERATION` step for the device handler base. It is important
that DHB users adapt their polling sequence tables to perform this step. This steps allows for
a clear distinction between operation and communication steps
- setNormalDatapoolEntriesInvalid is not an abstract method and a default implementation was provided
- getTransitionDelayMs is now an abstract method
### DeviceHandlerIF
- Typo for UNKNOWN_DEVICE_REPLY
### Events
- makeEvent function: Now takes three input parameters instead of two and
allows setting a unique ID. Event.cpp source file removed, functions now
defined in header directly. Namespaces renamed. Functions declared `constexpr`
now
### Commanding Service Base
- CSB uses the new fsfwconfig::FSFW_CSB_FIFO_DEPTH variable to determine the FIFO depth for each
CSB instance. This variable has to be set in the FSFWConfig.h file
### Service Interface
- Proper printf support contained in ServiceInterfacePrinter.h
- CPP ostream support now optional (can reduce executable size by 150 - 250 kB)
- Amalagated header which determines automatically which service interface to use depending on FSFWConfig.h configuration.
Users can just use #include <fsfw/serviceinterface/ServiceInterface.h>
- If CPP streams are excluded, sif:: calls won't work anymore and need to be replaced by their printf counterparts.
For the fsfw, this can be done by checking the processor define FSFW_CPP_OSTREAM_ENABLED from FSFWConfig.h.
For mission code, developers need to replace sif:: calls by the printf counterparts, but only if the CPP stream are excluded.
If this is not the case, everything should work as usual.
### ActionHelper and ActionMessage
- ActionHelper finish function and ActionMessage::setCompletionReply now expects explicit
information whether to report a success or failure message instead of deriving it implicitely
from returnvalue
### PUS Parameter Service 20
Added PUS parameter service 20 (only custom subservices available).

View File

@ -1,31 +1,130 @@
cmake_minimum_required(VERSION 3.13)
set(FSFW_VERSION 3)
set(FSFW_SUBVERSION 0)
set(FSFW_REVISION 1)
set(MSG_PREFIX "fsfw |")
# Add the cmake folder so the FindSphinx module is found
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
list(APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-modules/bilke")
list(APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-modules/rpavlik")
option(FSFW_GENERATE_SECTIONS
"Generate function and data sections. Required to remove unused code" ON
)
if(FSFW_GENERATE_SECTIONS)
option(FSFW_REMOVE_UNUSED_CODE "Remove unused code" ON)
# ##############################################################################
# Version file handling #
# ##############################################################################
set(FSFW_VERSION_IF_GIT_FAILS 6)
set(FSFW_SUBVERSION_IF_GIT_FAILS 0)
set(FSFW_REVISION_IF_GIT_FAILS 0)
set(FSFW_GIT_VER_HANDLING_OK FALSE)
# Version handling
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
message(STATUS "${MSG_PREFIX} Determining version information with git")
include(FsfwHelpers)
determine_version_with_git("--exclude" "docker_*")
if(GIT_INFO)
set(FSFW_GIT_INFO
${GIT_INFO}
CACHE STRING "Version information retrieved with git describe")
list(GET FSFW_GIT_INFO 1 FSFW_VERSION)
list(GET FSFW_GIT_INFO 2 FSFW_SUBVERSION)
list(GET FSFW_GIT_INFO 3 FSFW_REVISION)
list(GET FSFW_GIT_INFO 4 FSFW_VCS_INFO)
if(NOT FSFW_VERSION)
set(FSFW_VERSION ${FSFW_VERSION_IF_GIT_FAILS})
endif()
if(NOT FSFW_SUBVERSION)
set(FSFW_SUBVERSION ${FSFW_SUBVERSION_IF_GIT_FAILS})
endif()
if(NOT FSFW_REVISION)
set(FSFW_REVISION ${FSFW_REVISION_IF_GIT_FAILS})
endif()
set(FSFW_GIT_VER_HANDLING_OK TRUE)
else()
set(FSFW_GIT_VER_HANDLING_OK FALSE)
endif()
endif()
if(NOT FSFW_GIT_VER_HANDLING_OK)
set(FSFW_VERSION ${FSFW_VERSION_IF_GIT_FAILS})
set(FSFW_SUBVERSION ${FSFW_SUBVERSION_IF_GIT_FAILS})
set(FSFW_REVISION ${FSFW_REVISION_IF_GIT_FAILS})
endif()
option(FSFW_BUILD_UNITTESTS "Build unittest binary in addition to static library" OFF)
set(LIB_FSFW_NAME fsfw)
project(${LIB_FSFW_NAME}
VERSION ${FSFW_VERSION}.${FSFW_SUBVERSION}.${FSFW_REVISION})
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
elseif(${CMAKE_CXX_STANDARD} LESS 17)
message(
FATAL_ERROR
"${MSG_PREFIX} Compiling the FSFW requires a minimum of C++17 support")
endif()
set(FSFW_SOURCES_DIR "${CMAKE_SOURCE_DIR}/src/fsfw")
set(FSFW_ETL_LIB_NAME etl)
set(FSFW_ETL_LINK_TARGET etl::etl)
set(FSFW_ETL_LIB_MAJOR_VERSION
20
CACHE STRING "ETL library major version requirement")
set(FSFW_ETL_LIB_VERSION
${FSFW_ETL_LIB_MAJOR_VERSION}.36.0
CACHE STRING "ETL library exact version requirement")
set(FSFW_ETL_LINK_TARGET etl::etl)
set(FSFW_CATCH2_LIB_MAJOR_VERSION
3
CACHE STRING "Catch2 library major version requirement")
set(FSFW_CATCH2_LIB_VERSION
v${FSFW_CATCH2_LIB_MAJOR_VERSION}.3.2
CACHE STRING "Catch2 library exact version requirement")
# Keep this off by default for now. See PR:
# https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/616 for information which
# keeping this on by default is problematic
option(
FSFW_ENABLE_IPO
"Enable interprocedural optimization or link-time optimization if available"
OFF)
if(FSFW_ENABLE_IPO)
include(CheckIPOSupported)
check_ipo_supported(RESULT IPO_SUPPORTED OUTPUT IPO_ERROR)
if(NOT IPO_SUPPORTED)
message(STATUS "FSFW | IPO/LTO not supported: ${IPO_ERROR}")
endif()
endif()
option(FSFW_GENERATE_SECTIONS
"Generate function and data sections. Required to remove unused code" ON)
if(FSFW_GENERATE_SECTIONS)
option(FSFW_REMOVE_UNUSED_CODE "Remove unused code" ON)
endif()
option(FSFW_BUILD_TESTS
"Build unittest binary in addition to static library. Requires Catch2"
OFF)
option(FSFW_CICD_BUILD "Build for CI/CD. This can disable problematic test" OFF)
option(FSFW_BUILD_DOCS "Build documentation with Sphinx and Doxygen" OFF)
if(FSFW_BUILD_UNITTESTS)
option(FSFW_TESTS_GEN_COV "Generate coverage data for unittests" ON)
if(FSFW_BUILD_TESTS)
option(FSFW_TESTS_GEN_COV "Generate coverage data for unittests" ON)
endif()
option(FSFW_WARNING_SHADOW_LOCAL_GCC "Enable -Wshadow=local warning in GCC" ON)
# Options to exclude parts of the FSFW from compilation.
option(FSFW_ADD_INTERNAL_TESTS "Add internal unit tests" ON)
option(FSFW_ADD_UNITTESTS "Add regular unittests. Requires Catch2" OFF)
option(FSFW_ADD_HAL "Add Hardware Abstraction Layer" ON)
if(UNIX)
option(FSFW_HAL_LINUX_ADD_PERIPHERAL_DRIVERS "Add Linux peripheral drivers"
OFF)
option(FSFW_HAL_LINUX_ADD_LIBGPIOD "Attempt to add Linux GPIOD drivers" OFF)
option(FSFW_HAL_LINUX_ADD_SERIAL_DRIVERS "Add serial drivers" ON)
endif()
# Optional sources
option(FSFW_ADD_PUS "Compile with PUS sources" ON)
option(FSFW_ADD_MONITORING "Compile with monitoring components" ON)
@ -38,314 +137,346 @@ option(FSFW_ADD_TMSTORAGE "Compile with tm storage components" OFF)
# Contrib sources
option(FSFW_ADD_SGP4_PROPAGATOR "Add SGP4 propagator code" OFF)
set(LIB_FSFW_NAME fsfw)
set(FSFW_TEST_TGT fsfw-tests)
set(FSFW_DUMMY_TGT fsfw-dummy)
project(${LIB_FSFW_NAME})
add_library(${LIB_FSFW_NAME})
if(FSFW_BUILD_UNITTESTS)
message(STATUS "Building the FSFW unittests in addition to the static library")
# Check whether the user has already installed Catch2 first
find_package(Catch2 3)
# Not installed, so use FetchContent to download and provide Catch2
if(NOT Catch2_FOUND)
include(FetchContent)
if(IPO_SUPPORTED AND FSFW_ENABLE_IPO)
set_property(TARGET ${LIB_FSFW_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION
TRUE)
endif()
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.0.0-preview3
)
if(FSFW_BUILD_TESTS)
message(
STATUS
"${MSG_PREFIX} Building the FSFW unittests in addition to the static library"
)
# Check whether the user has already installed Catch2 first
find_package(Catch2 ${FSFW_CATCH2_LIB_MAJOR_VERSION} QUIET)
# Not installed, so use FetchContent to download and provide Catch2
if(NOT Catch2_FOUND)
message(
STATUS
"${MSG_PREFIX} Catch2 installation not found. Downloading Catch2 library with FetchContent."
)
include(FetchContent)
FetchContent_MakeAvailable(Catch2)
endif()
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG ${FSFW_CATCH2_LIB_VERSION})
set(FSFW_CONFIG_PATH tests/src/fsfw_tests/unit/testcfg)
configure_file(tests/src/fsfw_tests/unit/testcfg/FSFWConfig.h.in FSFWConfig.h)
configure_file(tests/src/fsfw_tests/unit/testcfg/TestsConfig.h.in tests/TestsConfig.h)
list(APPEND FSFW_FETCH_CONTENT_TARGETS Catch2)
endif()
project(${FSFW_TEST_TGT} CXX C)
add_executable(${FSFW_TEST_TGT})
set(FSFW_CONFIG_PATH unittests/testcfg)
configure_file(unittests/testcfg/FSFWConfig.h.in FSFWConfig.h)
configure_file(unittests/testcfg/TestsConfig.h.in tests/TestsConfig.h)
if(FSFW_TESTS_GEN_COV)
message(STATUS "Generating coverage data for the library")
message(STATUS "Targets linking against ${LIB_FSFW_NAME} "
"will be compiled with coverage data as well"
)
include(FetchContent)
FetchContent_Declare(
cmake-modules
GIT_REPOSITORY https://github.com/bilke/cmake-modules.git
)
FetchContent_MakeAvailable(cmake-modules)
set(CMAKE_BUILD_TYPE "Debug")
list(APPEND CMAKE_MODULE_PATH ${cmake-modules_SOURCE_DIR})
include(CodeCoverage)
endif()
project(${FSFW_TEST_TGT} CXX C)
add_executable(${FSFW_TEST_TGT})
if(IPO_SUPPORTED AND FSFW_ENABLE_IPO)
set_property(TARGET ${FSFW_TEST_TGT} PROPERTY INTERPROCEDURAL_OPTIMIZATION
TRUE)
endif()
if(FSFW_TESTS_GEN_COV)
message(STATUS "${MSG_PREFIX} Generating coverage data for the library")
message(STATUS "${MSG_PREFIX} Targets linking against ${LIB_FSFW_NAME} "
"will be compiled with coverage data as well")
set(CMAKE_BUILD_TYPE "Debug")
include(CodeCoverage)
endif()
endif()
message(
STATUS
"${MSG_PREFIX} Finding and/or providing etl library with version ${FSFW_ETL_LIB_MAJOR_VERSION}"
)
# Check whether the user has already installed ETL first
find_package(${FSFW_ETL_LIB_NAME} ${FSFW_ETL_LIB_MAJOR_VERSION} QUIET)
# Not installed, so use FetchContent to download and provide etl
if(NOT ${FSFW_ETL_LIB_NAME}_FOUND)
message(
STATUS
"${MSG_PREFIX} ETL installation not found. Downloading ETL with FetchContent."
)
include(FetchContent)
FetchContent_Declare(
${FSFW_ETL_LIB_NAME}
GIT_REPOSITORY https://github.com/ETLCPP/etl
GIT_TAG ${FSFW_ETL_LIB_VERSION})
list(APPEND FSFW_FETCH_CONTENT_TARGETS ${FSFW_ETL_LIB_NAME})
endif()
# The documentation for FetchContent recommends declaring all the dependencies
# before making them available. We make all declared dependency available here
# after their declaration
if(FSFW_FETCH_CONTENT_TARGETS)
FetchContent_MakeAvailable(${FSFW_FETCH_CONTENT_TARGETS})
if(TARGET ${FSFW_ETL_LIB_NAME})
add_library(${FSFW_ETL_LINK_TARGET} ALIAS ${FSFW_ETL_LIB_NAME})
endif()
if(TARGET Catch2)
# Fixes regression -preview4, to be confirmed in later releases Related
# GitHub issue: https://github.com/catchorg/Catch2/issues/2417
set_target_properties(Catch2 PROPERTIES DEBUG_POSTFIX "")
endif()
endif()
set(FSFW_CORE_INC_PATH "inc")
set_property(CACHE FSFW_OSAL PROPERTY STRINGS host linux rtems freertos)
# Configure Files
target_include_directories(${LIB_FSFW_NAME} PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
)
target_include_directories(${LIB_FSFW_NAME} INTERFACE
${CMAKE_CURRENT_BINARY_DIR}
)
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
elseif(${CMAKE_CXX_STANDARD} LESS 11)
message(FATAL_ERROR "Compiling the FSFW requires a minimum of C++11 support")
endif()
# For configure files
target_include_directories(${LIB_FSFW_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_include_directories(${LIB_FSFW_NAME}
INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
# Backwards comptability
if(OS_FSFW AND NOT FSFW_OSAL)
message(WARNING "Please pass the FSFW OSAL as FSFW_OSAL instead of OS_FSFW")
set(FSFW_OSAL OS_FSFW)
message(
WARNING
"${MSG_PREFIX} Please pass the FSFW OSAL as FSFW_OSAL instead of OS_FSFW")
set(FSFW_OSAL OS_FSFW)
endif()
if(NOT FSFW_OSAL)
message(STATUS "No OS for FSFW via FSFW_OSAL set. Assuming host OS")
# Assume host OS and autodetermine from OS_FSFW
if(UNIX)
set(FSFW_OSAL "linux"
CACHE STRING
"OS abstraction layer used in the FSFW"
)
elseif(WIN32)
set(FSFW_OSAL "host"
CACHE STRING "OS abstraction layer used in the FSFW"
)
endif()
message(STATUS "No OS for FSFW via FSFW_OSAL set. Assuming host OS")
# Assume host OS and autodetermine from OS_FSFW
if(UNIX)
set(FSFW_OSAL
"linux"
CACHE STRING "OS abstraction layer used in the FSFW")
elseif(WIN32)
set(FSFW_OSAL
"host"
CACHE STRING "OS abstraction layer used in the FSFW")
endif()
endif()
set(FSFW_OSAL_DEFINITION FSFW_OSAL_HOST)
if(FSFW_OSAL MATCHES host)
set(FSFW_OS_NAME "Host")
set(FSFW_OSAL_HOST ON)
set(FSFW_OS_NAME "Host")
set(FSFW_OSAL_HOST ON)
elseif(FSFW_OSAL MATCHES linux)
set(FSFW_OS_NAME "Linux")
set(FSFW_OSAL_LINUX ON)
set(FSFW_OS_NAME "Linux")
set(FSFW_OSAL_LINUX ON)
elseif(FSFW_OSAL MATCHES freertos)
set(FSFW_OS_NAME "FreeRTOS")
set(FSFW_OSAL_FREERTOS ON)
target_link_libraries(${LIB_FSFW_NAME} PRIVATE
${LIB_OS_NAME}
)
set(FSFW_OS_NAME "FreeRTOS")
set(FSFW_OSAL_FREERTOS ON)
target_link_libraries(${LIB_FSFW_NAME} PRIVATE ${LIB_OS_NAME})
elseif(FSFW_OSAL STREQUAL rtems)
set(FSFW_OS_NAME "RTEMS")
set(FSFW_OSAL_RTEMS ON)
set(FSFW_OS_NAME "RTEMS")
set(FSFW_OSAL_RTEMS ON)
else()
message(WARNING
"Invalid operating system for FSFW specified! Setting to host.."
)
set(FSFW_OS_NAME "Host")
set(OS_FSFW "host")
message(
WARNING
"${MSG_PREFIX} Invalid operating system for FSFW specified! Setting to host.."
)
set(FSFW_OS_NAME "Host")
set(OS_FSFW "host")
endif()
if(FSFW_BUILD_UNITTESTS OR FSFW_BUILD_DOCS)
configure_file(src/fsfw/FSFW.h.in fsfw/FSFW.h)
configure_file(src/fsfw/FSFWVersion.h.in fsfw/FSFWVersion.h)
else()
configure_file(src/fsfw/FSFW.h.in FSFW.h)
configure_file(src/fsfw/FSFWVersion.h.in FSFWVersion.h)
endif()
configure_file(src/fsfw/FSFW.h.in fsfw/FSFW.h)
configure_file(src/fsfw/FSFWVersion.h.in fsfw/FSFWVersion.h)
message(STATUS "Compiling FSFW for the ${FSFW_OS_NAME} operating system.")
message(
STATUS "${MSG_PREFIX} Compiling FSFW for the ${FSFW_OS_NAME} operating system"
)
add_subdirectory(src)
add_subdirectory(tests)
if(FSFW_ADD_HAL)
add_subdirectory(hal)
endif()
add_subdirectory(contrib)
if(FSFW_BUILD_TESTS)
add_subdirectory(unittests)
endif()
if(FSFW_BUILD_DOCS)
add_subdirectory(docs)
add_subdirectory(docs)
endif()
if(FSFW_BUILD_UNITTESTS)
if(FSFW_TESTS_GEN_COV)
if(CMAKE_COMPILER_IS_GNUCXX)
include(CodeCoverage)
if(FSFW_BUILD_TESTS)
if(FSFW_TESTS_GEN_COV)
if(CMAKE_COMPILER_IS_GNUCXX)
include(CodeCoverage)
# Remove quotes.
separate_arguments(COVERAGE_COMPILER_FLAGS
NATIVE_COMMAND "${COVERAGE_COMPILER_FLAGS}"
)
# 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(${FSFW_TEST_TGT} PRIVATE
"${COVERAGE_COMPILER_FLAGS}"
)
target_compile_options(${LIB_FSFW_NAME} PRIVATE
"${COVERAGE_COMPILER_FLAGS}"
)
# Add compile options manually, we don't want coverage for Catch2
target_compile_options(${FSFW_TEST_TGT}
PRIVATE "${COVERAGE_COMPILER_FLAGS}")
target_compile_options(${LIB_FSFW_NAME}
PRIVATE "${COVERAGE_COMPILER_FLAGS}")
# Exclude directories here
if(WIN32)
set(GCOVR_ADDITIONAL_ARGS
"--exclude-throw-branches"
"--exclude-unreachable-branches"
)
set(COVERAGE_EXCLUDES
"/c/msys64/mingw64/*"
)
elseif(UNIX)
set(COVERAGE_EXCLUDES
"/usr/include/*" "/usr/bin/*" "Catch2/*"
"/usr/local/include/*" "*/fsfw_tests/*"
"*/catch2-src/*"
)
endif()
# Exclude directories here
if(WIN32)
set(GCOVR_ADDITIONAL_ARGS "--exclude-throw-branches"
"--exclude-unreachable-branches")
set(COVERAGE_EXCLUDES "/c/msys64/mingw64/*" "*/fsfw_hal/*")
elseif(UNIX)
set(COVERAGE_EXCLUDES
"/usr/include/*"
"/usr/bin/*"
"Catch2/*"
"/usr/local/include/*"
"*/fsfw_tests/*"
"*/catch2-src/*"
"*/fsfw_hal/*"
"unittests/*")
endif()
target_link_options(${FSFW_TEST_TGT} PRIVATE
-fprofile-arcs
-ftest-coverage
)
target_link_options(${LIB_FSFW_NAME} PRIVATE
-fprofile-arcs
-ftest-coverage
)
# Need to specify this as an interface, otherwise there will the compile issues
target_link_options(${LIB_FSFW_NAME} INTERFACE
-fprofile-arcs
-ftest-coverage
)
target_link_options(${FSFW_TEST_TGT} PRIVATE -fprofile-arcs
-ftest-coverage)
target_link_options(${LIB_FSFW_NAME} PRIVATE -fprofile-arcs
-ftest-coverage)
# Need to specify this as an interface, otherwise there will the compile
# issues
target_link_options(${LIB_FSFW_NAME} INTERFACE -fprofile-arcs
-ftest-coverage)
if(WIN32)
setup_target_for_coverage_gcovr_html(
NAME ${FSFW_TEST_TGT}_coverage
EXECUTABLE ${FSFW_TEST_TGT}
DEPENDENCIES ${FSFW_TEST_TGT}
)
else()
setup_target_for_coverage_lcov(
NAME ${FSFW_TEST_TGT}_coverage
EXECUTABLE ${FSFW_TEST_TGT}
DEPENDENCIES ${FSFW_TEST_TGT}
)
endif()
endif()
if(WIN32)
setup_target_for_coverage_gcovr_html(
NAME ${FSFW_TEST_TGT}_coverage EXECUTABLE ${FSFW_TEST_TGT}
DEPENDENCIES ${FSFW_TEST_TGT})
else()
setup_target_for_coverage_lcov(
NAME
${FSFW_TEST_TGT}_coverage
EXECUTABLE
${FSFW_TEST_TGT}
DEPENDENCIES
${FSFW_TEST_TGT}
GENHTML_ARGS
--html-epilog
${CMAKE_SOURCE_DIR}/unittests/lcov_epilog.html)
endif()
endif()
target_link_libraries(${FSFW_TEST_TGT} PRIVATE Catch2::Catch2 ${LIB_FSFW_NAME})
endif()
target_link_libraries(${FSFW_TEST_TGT} PRIVATE Catch2::Catch2
${LIB_FSFW_NAME})
endif()
# The project CMakeLists file has to set the FSFW_CONFIG_PATH and add it.
# If this is not given, we include the default configuration and emit a warning.
# The project CMakeLists file has to set the FSFW_CONFIG_PATH and add it. If
# this is not given, we include the default configuration and emit a warning.
if(NOT FSFW_CONFIG_PATH)
set(DEF_CONF_PATH misc/defaultcfg/fsfwconfig)
if(NOT FSFW_BUILD_DOCS)
message(WARNING "Flight Software Framework configuration path not set!")
message(WARNING "Setting default configuration from ${DEF_CONF_PATH} ..")
endif()
add_subdirectory(${DEF_CONF_PATH})
set(FSFW_CONFIG_PATH ${DEF_CONF_PATH})
set(DEF_CONF_PATH misc/defaultcfg/fsfwconfig)
if(NOT FSFW_BUILD_DOCS)
message(
WARNING
"${MSG_PREFIX} Flight Software Framework configuration path FSFW_CONFIG_PATH not set"
)
message(
WARNING
"${MSG_PREFIX} Setting default configuration from ${DEF_CONF_PATH} ..")
endif()
add_subdirectory(${DEF_CONF_PATH})
set(FSFW_CONFIG_PATH ${DEF_CONF_PATH})
endif()
# FSFW might be part of a possibly complicated folder structure, so we
# extract the absolute path of the fsfwconfig folder.
# FSFW might be part of a possibly complicated folder structure, so we extract
# the absolute path of the fsfwconfig folder.
if(IS_ABSOLUTE ${FSFW_CONFIG_PATH})
set(FSFW_CONFIG_PATH_ABSOLUTE ${FSFW_CONFIG_PATH})
set(FSFW_CONFIG_PATH_ABSOLUTE ${FSFW_CONFIG_PATH})
else()
get_filename_component(FSFW_CONFIG_PATH_ABSOLUTE
${FSFW_CONFIG_PATH} REALPATH BASE_DIR ${CMAKE_SOURCE_DIR}
)
get_filename_component(FSFW_CONFIG_PATH_ABSOLUTE ${FSFW_CONFIG_PATH} REALPATH
BASE_DIR ${CMAKE_SOURCE_DIR})
endif()
foreach(INCLUDE_PATH ${FSFW_ADDITIONAL_INC_PATHS})
if(IS_ABSOLUTE ${INCLUDE_PATH})
set(CURR_ABS_INC_PATH "${INCLUDE_PATH}")
else()
get_filename_component(CURR_ABS_INC_PATH
${INCLUDE_PATH} REALPATH BASE_DIR ${CMAKE_SOURCE_DIR})
endif()
if(IS_ABSOLUTE ${INCLUDE_PATH})
set(CURR_ABS_INC_PATH "${INCLUDE_PATH}")
else()
get_filename_component(CURR_ABS_INC_PATH ${INCLUDE_PATH} REALPATH BASE_DIR
${CMAKE_SOURCE_DIR})
endif()
if(CMAKE_VERBOSE)
message(STATUS "FSFW include path: ${CURR_ABS_INC_PATH}")
endif()
if(CMAKE_VERBOSE)
message(STATUS "FSFW include path: ${CURR_ABS_INC_PATH}")
endif()
list(APPEND FSFW_ADD_INC_PATHS_ABS ${CURR_ABS_INC_PATH})
list(APPEND FSFW_ADD_INC_PATHS_ABS ${CURR_ABS_INC_PATH})
endforeach()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(NOT DEFINED FSFW_WARNING_FLAGS)
set(FSFW_WARNING_FLAGS
-Wall
-Wextra
-Wimplicit-fallthrough=1
-Wno-unused-parameter
-Wno-psabi
)
endif()
if(NOT DEFINED FSFW_WARNING_FLAGS)
set(FSFW_WARNING_FLAGS
-Wall
-Wextra
-Wimplicit-fallthrough=1
-Wno-unused-parameter
-Wno-psabi
-Wduplicated-cond # check for duplicate conditions
-Wduplicated-branches # check for duplicate branches
-Wlogical-op # Search for bitwise operations instead of logical
-Wnull-dereference # Search for NULL dereference
-Wundef # Warn if undefind marcos are used
-Wformat=2 # Format string problem detection
-Wformat-overflow=2 # Formatting issues in printf
-Wformat-truncation=2 # Formatting issues in printf
-Wformat-security # Search for dangerous printf operations
-Wstrict-overflow=3 # Warn if integer overflows might happen
-Warray-bounds=2 # Some array bounds violations will be found
-Wshift-overflow=2 # Search for bit left shift overflows (<c++14)
-Wcast-qual # Warn if the constness is cast away
-Wstringop-overflow=4
# -Wstack-protector # Emits a few false positives for low level access
# -Wconversion # Creates many false positives -Warith-conversion # Use
# with Wconversion to find more implicit conversions -fanalyzer # Should
# be used to look through problems
)
endif()
if(FSFW_GENERATE_SECTIONS)
target_compile_options(${LIB_FSFW_NAME} PRIVATE
"-ffunction-sections"
"-fdata-sections"
)
endif()
if(FSFW_GENERATE_SECTIONS)
target_compile_options(${LIB_FSFW_NAME} PRIVATE "-ffunction-sections"
"-fdata-sections")
endif()
if(FSFW_REMOVE_UNUSED_CODE)
target_link_options(${LIB_FSFW_NAME} PRIVATE "Wl,--gc-sections")
endif()
if(FSFW_WARNING_SHADOW_LOCAL_GCC)
list(APPEND WARNING_FLAGS "-Wshadow=local")
endif()
if(FSFW_REMOVE_UNUSED_CODE)
target_link_options(${LIB_FSFW_NAME} PRIVATE
"Wl,--gc-sections"
)
endif()
if(FSFW_WARNING_SHADOW_LOCAL_GCC)
list(APPEND WARNING_FLAGS "-Wshadow=local")
endif()
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(COMPILER_FLAGS "/permissive-")
set(COMPILER_FLAGS "/permissive-")
endif()
# Required include paths to compile the FSFW
target_include_directories(${LIB_FSFW_NAME} INTERFACE
${CMAKE_SOURCE_DIR}
${FSFW_CONFIG_PATH_ABSOLUTE}
${FSFW_CORE_INC_PATH}
${FSFW_ADD_INC_PATHS_ABS}
)
target_include_directories(
${LIB_FSFW_NAME} INTERFACE ${CMAKE_SOURCE_DIR} ${FSFW_CONFIG_PATH_ABSOLUTE}
${FSFW_CORE_INC_PATH} ${FSFW_ADD_INC_PATHS_ABS})
# Includes path required to compile FSFW itself as well
# We assume that the fsfwconfig folder uses include relative to the project
# root here!
target_include_directories(${LIB_FSFW_NAME} PRIVATE
${CMAKE_SOURCE_DIR}
${FSFW_CONFIG_PATH_ABSOLUTE}
${FSFW_CORE_INC_PATH}
${FSFW_ADD_INC_PATHS_ABS}
)
# Includes path required to compile FSFW itself as well We assume that the
# fsfwconfig folder uses include relative to the project root here!
target_include_directories(
${LIB_FSFW_NAME} PRIVATE ${CMAKE_SOURCE_DIR} ${FSFW_CONFIG_PATH_ABSOLUTE}
${FSFW_CORE_INC_PATH} ${FSFW_ADD_INC_PATHS_ABS})
target_compile_options(${LIB_FSFW_NAME} PRIVATE
${FSFW_WARNING_FLAGS}
${COMPILER_FLAGS}
)
target_compile_options(${LIB_FSFW_NAME} PRIVATE ${FSFW_WARNING_FLAGS}
${COMPILER_FLAGS})
target_link_libraries(${LIB_FSFW_NAME} PRIVATE
${FSFW_ADDITIONAL_LINK_LIBS}
)
target_link_libraries(${LIB_FSFW_NAME} PRIVATE ${FSFW_ADDITIONAL_LINK_LIBS})
target_link_libraries(${LIB_FSFW_NAME} PUBLIC ${FSFW_ETL_LINK_TARGET})
string(CONCAT POST_BUILD_COMMENT
string(
CONCAT
POST_BUILD_COMMENT
"######################################################################\n"
"Built FSFW v${FSFW_VERSION}.${FSFW_SUBVERSION}.${FSFW_REVISION}, "
"Target OSAL: ${FSFW_OS_NAME}\n"
"######################################################################\n"
)
"######################################################################\n")
add_custom_command(
TARGET ${LIB_FSFW_NAME}
POST_BUILD
COMMENT ${POST_BUILD_COMMENT}
)
TARGET ${LIB_FSFW_NAME}
POST_BUILD
COMMENT ${POST_BUILD_COMMENT})

0
FSFWVersion.h.in Normal file
View File

View File

@ -11,9 +11,15 @@ with Airbus Defence and Space GmbH.
## Quick facts
The framework is designed for systems, which communicate with external devices, perform control loops, receive telecommands and send telemetry, and need to maintain a high level of availability. Therefore, a mode and health system provides control over the states of the software and the controlled devices. In addition, a simple mechanism of event based fault detection, isolation and recovery is implemented as well.
The framework is designed for systems, which communicate with external devices, perform control loops,
receive telecommands and send telemetry, and need to maintain a high level of availability. Therefore,
a mode and health system provides control over the states of the software and the controlled devices.
In addition, a simple mechanism of event based fault detection, isolation and recovery is implemented as well.
The FSFW provides abstraction layers for operating systems to provide a uniform operating system abstraction layer (OSAL). Some components of this OSAL are required internally by the FSFW but is also very useful for developers to implement the same application logic on different operating systems with a uniform interface.
The FSFW provides abstraction layers for operating systems to provide a uniform operating system
abstraction layer (OSAL). Some components of this OSAL are required internally by the FSFW but is
also very useful for developers to implement the same application logic on different operating
systems with a uniform interface.
Currently, the FSFW provides the following OSALs:
@ -45,6 +51,28 @@ A template configuration folder was provided and can be copied into the project
a starting point. The [configuration section](docs/README-config.md#top) provides more specific
information about the possible options.
## Prerequisites
The Embedded Template Library (etl) is a dependency of the FSFW which is automatically
installed and provided by the build system unless the correction version was installed.
The current recommended version can be found inside the fsfw `CMakeLists.txt` file or by using
`ccmake` and looking up the `FSFW_ETL_LIB_MAJOR_VERSION` variable.
You can install the ETL library like this. On Linux, it might be necessary to add `sudo` before
the install call:
```cpp
git clone https://github.com/ETLCPP/etl
cd etl
git checkout <currentRecommendedVersion>
mkdir build && cd build
cmake ..
cmake --install .
```
It is recommended to install `20.27.2` or newer for the package version handling of
ETL to work.
## Adding the library
The following steps show how to add and use FSFW components. It is still recommended to
@ -71,9 +99,9 @@ add and link against the FSFW library in general.
4. Link against the FSFW library
```cmake
target_link_libraries(<YourProjectName> PRIVATE fsfw)
```
```sh
target_link_libraries(${YourProjectName} PRIVATE fsfw)
```
5. It should now be possible use the FSFW as a static library from the user code.
@ -83,6 +111,19 @@ The FSFW also has unittests which use the [Catch2 library](https://github.com/ca
These are built by setting the CMake option `FSFW_BUILD_UNITTESTS` to `ON` or `TRUE`
from your project `CMakeLists.txt` file or from the command line.
You can install the Catch2 library, which prevents the build system to avoid re-downloading
the dependency if the unit tests are completely rebuilt. The current recommended version
can be found inside the fsfw `CMakeLists.txt` file or by using `ccmake` and looking up
the `FSFW_CATCH2_LIB_VERSION` variable.
```sh
git clone https://github.com/catchorg/Catch2.git
cd Catch2
git checkout <currentRecommendedVersion>
cmake -Bbuild -H. -DBUILD_TESTING=OFF
sudo cmake --build build/ --target install
```
The fsfw-tests binary will be built as part of the static library and dropped alongside it.
If the unittests are built, the library and the tests will be built with coverage information by
default. This can be disabled by setting the `FSFW_TESTS_COV_GEN` option to `OFF` or `FALSE`.
@ -90,15 +131,15 @@ default. This can be disabled by setting the `FSFW_TESTS_COV_GEN` option to `OFF
You can use the following commands inside the `fsfw` folder to set up the build system
```sh
mkdir build-Unittest && cd build-Unittest
cmake -DFSFW_BUILD_UNITTESTS=ON -DFSFW_OSAL=host ..
mkdir build-tests && cd build-tests
cmake -DFSFW_BUILD_TESTS=ON -DFSFW_OSAL=host -DCMAKE_BUILD_TYPE=Debug ..
```
You can also use `-DFSFW_OSAL=linux` on Linux systems.
Coverage data in HTML format can be generated using the `CodeCoverage`
[CMake module](https://github.com/bilke/cmake-modules/tree/master).
To build the unittests, run them and then generare the coverage data in this format,
To build the unittests, run them and then generate the coverage data in this format,
the following command can be used inside the build directory after the build system was set up
```sh
@ -107,11 +148,50 @@ cmake --build . -- fsfw-tests_coverage -j
The `coverage.py` script located in the `script` folder can also be used to do this conveniently.
## Building the documentations
The FSFW documentation is built using the tools Sphinx, doxygen and breathe based on the
instructions provided in [this blogpost](https://devblogs.microsoft.com/cppblog/clear-functional-c-documentation-with-sphinx-breathe-doxygen-cmake/). If you
want to do this locally, set up the prerequisites first. This requires a ``python3``
installation as well. Example here is for Ubuntu.
```sh
sudo apt-get install doxygen graphviz
```
And the following Python packages
```sh
python3 -m pip install sphinx breathe
```
You can set up a documentation build system using the following commands
```sh
mkdir build-docs && cd build-docs
cmake -DFSFW_BUILD_DOCS=ON -DFSFW_OSAL=host ..
```
Then you can generate the documentation using
```sh
cmake --build . -- Sphinx -j
```
You can find the generated documentation inside the `docs/sphinx` folder inside the build
folder. Simply open the `index.html` in the webbrowser of your choice.
The `helper.py` script located in the script` folder can also be used to create, build
and open the documentation conveniently. Try `helper.py -h for more information.
## Formatting the sources
The formatting is done by the `clang-format` tool. The configuration is contained within the
`.clang-format` file in the repository root. As long as `clang-format` is installed, you
can run the `apply-clang-format.sh` helper script to format all source files consistently.
can run the `auto-format.sh` helper script to format all source files consistently. Furthermore cmake-format is required to format CMake files which can be installed with:
````sh
sudo pip install cmakelang
````
## Index

View File

@ -5,4 +5,25 @@ RUN apt-get --yes upgrade
#tzdata is a dependency, won't install otherwise
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get --yes install gcc g++ cmake make lcov git valgrind nano
RUN apt-get --yes install gcc g++ cmake make lcov git valgrind nano iputils-ping python3 pip doxygen graphviz rsync
RUN python3 -m pip install sphinx breathe
RUN git clone https://github.com/catchorg/Catch2.git && \
cd Catch2 && \
git checkout v3.1.0 && \
cmake -Bbuild -H. -DBUILD_TESTING=OFF && \
cmake --build build/ --target install
RUN git clone https://github.com/ETLCPP/etl.git && \
cd etl && \
git checkout 20.28.0 && \
cmake -B build . && \
cmake --install build/
#ssh needs a valid user to work
RUN adduser --uid 114 jenkins
#add documentation server to known hosts
RUN echo "|1|/LzCV4BuTmTb2wKnD146l9fTKgQ=|NJJtVjvWbtRt8OYqFgcYRnMQyVw= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNL8ssTonYtgiR/6RRlSIK9WU1ywOcJmxFTLcEblAwH7oifZzmYq3XRfwXrgfMpylEfMFYfCU8JRqtmi19xc21A=" >> /etc/ssh/ssh_known_hosts
RUN echo "|1|CcBvBc3EG03G+XM5rqRHs6gK/Gg=|oGeJQ+1I8NGI2THIkJsW92DpTzs= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNL8ssTonYtgiR/6RRlSIK9WU1ywOcJmxFTLcEblAwH7oifZzmYq3XRfwXrgfMpylEfMFYfCU8JRqtmi19xc21A=" >> /etc/ssh/ssh_known_hosts

149
automation/Jenkinsfile vendored
View File

@ -1,70 +1,125 @@
pipeline {
agent any
environment {
BUILDDIR = 'build-unittests'
BUILDDIR_HOST = 'cmake-build-tests-host'
BUILDDIR_LINUX = 'cmake-build-tests-linux'
DOCDDIR = 'cmake-build-documentation'
}
agent {
docker {
image 'fsfw-ci:d6'
args '--network host --sysctl fs.mqueue.msg_max=100'
}
}
stages {
stage('Create Docker') {
agent {
dockerfile {
dir 'automation'
additionalBuildArgs '--no-cache'
reuseNode true
stage('Host') {
stages{
stage('Clean') {
steps {
sh 'rm -rf $BUILDDIR_HOST'
}
}
}
steps {
sh 'rm -rf $BUILDDIR'
}
}
stage('Configure') {
agent {
dockerfile {
dir 'automation'
reuseNode true
stage('Configure') {
steps {
dir(BUILDDIR_HOST) {
sh 'cmake -DFSFW_OSAL=host -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..'
}
}
}
}
steps {
dir(BUILDDIR) {
sh 'cmake -DFSFW_OSAL=host -DFSFW_BUILD_UNITTESTS=ON ..'
stage('Build') {
steps {
dir(BUILDDIR_HOST) {
sh 'cmake --build . -j4'
}
}
}
stage('Unittests') {
steps {
dir(BUILDDIR_HOST) {
sh 'cmake --build . -- fsfw-tests_coverage -j4'
}
}
}
stage('Valgrind') {
steps {
dir(BUILDDIR_HOST) {
sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests'
}
}
}
}
}
stage('Build') {
agent {
dockerfile {
dir 'automation'
reuseNode true
stage('Linux') {
stages{
stage('Clean') {
steps {
sh 'rm -rf $BUILDDIR_LINUX'
}
}
}
steps {
dir(BUILDDIR) {
sh 'cmake --build . -j'
stage('Configure') {
steps {
dir(BUILDDIR_LINUX) {
sh 'cmake -DFSFW_OSAL=linux -DFSFW_BUILD_TESTS=ON -DFSFW_CICD_BUILD=ON ..'
}
}
}
stage('Build') {
steps {
dir(BUILDDIR_LINUX) {
sh 'cmake --build . -j4'
}
}
}
stage('Unittests') {
steps {
dir(BUILDDIR_LINUX) {
sh 'cmake --build . -- fsfw-tests_coverage -j4'
}
}
}
stage('Valgrind') {
steps {
dir(BUILDDIR_LINUX) {
sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests'
}
}
}
}
}
stage('Unittests') {
agent {
dockerfile {
dir 'automation'
reuseNode true
}
stage('Documentation') {
when {
branch 'development'
}
steps {
dir(BUILDDIR) {
sh 'cmake --build . -- fsfw-tests_coverage -j'
dir(DOCDDIR) {
sh 'cmake -DFSFW_BUILD_DOCS=ON -DFSFW_OSAL=host ..'
sh 'make Sphinx'
sshagent(credentials: ['documentation-buildfix']) {
sh 'rsync -r --delete docs/sphinx/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/development'
}
}
dir(BUILDDIR_LINUX) {
sshagent(credentials: ['documentation-buildfix']) {
sh 'rsync -r --delete fsfw-tests_coverage/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/coverage/development'
}
}
}
}
stage('Valgrind') {
agent {
dockerfile {
dir 'automation'
reuseNode true
}
stage('Master Documentation') {
when {
branch 'master'
}
steps {
dir(BUILDDIR) {
sh 'valgrind --leak-check=full --error-exitcode=1 ./fsfw-tests'
dir(DOCDDIR) {
sh 'cmake -DFSFW_BUILD_DOCS=ON -DFSFW_OSAL=host ..'
sh 'make Sphinx'
sshagent(credentials: ['documentation-buildfix']) {
sh 'rsync -r --delete docs/sphinx/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/master'
}
}
dir(BUILDDIR_LINUX) {
sshagent(credentials: ['documentation-buildfix']) {
sh 'rsync -r --delete fsfw-tests_coverage/* buildfix@documentation.irs.uni-stuttgart.de:/fsfw/coverage/master'
}
}
}
}

28
cmake/FsfwHelpers.cmake Normal file
View File

@ -0,0 +1,28 @@
# Determines the git version with git describe and returns it by setting
# the GIT_INFO list in the parent scope. The list has the following entries
# 1. Full version string
# 2. Major version
# 3. Minor version
# 4. Revision
# 5. git SHA hash and commits since tag
function(determine_version_with_git)
include(GetGitRevisionDescription)
git_describe(VERSION ${ARGN})
string(FIND ${VERSION} "." VALID_VERSION)
if(VALID_VERSION EQUAL -1)
message(WARNING "Version string ${VERSION} retrieved with git describe is invalid")
return()
endif()
# Parse the version information into pieces.
string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" _VERSION_MAJOR "${VERSION}")
string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" _VERSION_MINOR "${VERSION}")
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" _VERSION_PATCH "${VERSION}")
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+-(.*)" "\\1" VERSION_SHA1 "${VERSION}")
set(GIT_INFO ${VERSION})
list(APPEND GIT_INFO ${_VERSION_MAJOR})
list(APPEND GIT_INFO ${_VERSION_MINOR})
list(APPEND GIT_INFO ${_VERSION_PATCH})
list(APPEND GIT_INFO ${VERSION_SHA1})
set(GIT_INFO ${GIT_INFO} PARENT_SCOPE)
message(STATUS "${MSG_PREFIX} Set git version info into GIT_INFO from the git tag ${VERSION}")
endfunction()

View File

@ -0,0 +1,7 @@
The files in the `bilke` folder were manually copy and pasted from the
[cmake-modules repository](https://github.com/bilke/cmake-modules). It was decided to do
this because only a small subset of its provided functions are needed.
The files in the `rpavlik` folder were manually copy and pasted from the
[cmake-modules repository](https://github.com/rpavlik/cmake-modules). It was decided to do
this because only a small subset of its provided functions are needed.

View File

@ -0,0 +1,719 @@
# Copyright (c) 2012 - 2017, Lars Bilke
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors
# may be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# CHANGES:
#
# 2012-01-31, Lars Bilke
# - Enable Code Coverage
#
# 2013-09-17, Joakim Söderberg
# - Added support for Clang.
# - Some additional usage instructions.
#
# 2016-02-03, Lars Bilke
# - Refactored functions to use named parameters
#
# 2017-06-02, Lars Bilke
# - Merged with modified version from github.com/ufz/ogs
#
# 2019-05-06, Anatolii Kurotych
# - Remove unnecessary --coverage flag
#
# 2019-12-13, FeRD (Frank Dana)
# - Deprecate COVERAGE_LCOVR_EXCLUDES and COVERAGE_GCOVR_EXCLUDES lists in favor
# of tool-agnostic COVERAGE_EXCLUDES variable, or EXCLUDE setup arguments.
# - CMake 3.4+: All excludes can be specified relative to BASE_DIRECTORY
# - All setup functions: accept BASE_DIRECTORY, EXCLUDE list
# - Set lcov basedir with -b argument
# - Add automatic --demangle-cpp in lcovr, if 'c++filt' is available (can be
# overridden with NO_DEMANGLE option in setup_target_for_coverage_lcovr().)
# - Delete output dir, .info file on 'make clean'
# - Remove Python detection, since version mismatches will break gcovr
# - Minor cleanup (lowercase function names, update examples...)
#
# 2019-12-19, FeRD (Frank Dana)
# - Rename Lcov outputs, make filtered file canonical, fix cleanup for targets
#
# 2020-01-19, Bob Apthorpe
# - Added gfortran support
#
# 2020-02-17, FeRD (Frank Dana)
# - Make all add_custom_target()s VERBATIM to auto-escape wildcard characters
# in EXCLUDEs, and remove manual escaping from gcovr targets
#
# 2021-01-19, Robin Mueller
# - Add CODE_COVERAGE_VERBOSE option which will allow to print out commands which are run
# - Added the option for users to set the GCOVR_ADDITIONAL_ARGS variable to supply additional
# flags to the gcovr command
#
# 2020-05-04, Mihchael Davis
# - Add -fprofile-abs-path to make gcno files contain absolute paths
# - Fix BASE_DIRECTORY not working when defined
# - Change BYPRODUCT from folder to index.html to stop ninja from complaining about double defines
#
# 2021-05-10, Martin Stump
# - Check if the generator is multi-config before warning about non-Debug builds
#
# 2022-02-22, Marko Wehle
# - Change gcovr output from -o <filename> for --xml <filename> and --html <filename> output respectively.
# This will allow for Multiple Output Formats at the same time by making use of GCOVR_ADDITIONAL_ARGS, e.g. GCOVR_ADDITIONAL_ARGS "--txt".
#
# USAGE:
#
# 1. Copy this file into your cmake modules path.
#
# 2. Add the following line to your CMakeLists.txt (best inside an if-condition
# using a CMake option() to enable it just optionally):
# include(CodeCoverage)
#
# 3. Append necessary compiler flags for all supported source files:
# append_coverage_compiler_flags()
# Or for specific target:
# append_coverage_compiler_flags_to_target(YOUR_TARGET_NAME)
#
# 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og
#
# 4. If you need to exclude additional directories from the report, specify them
# using full paths in the COVERAGE_EXCLUDES variable before calling
# setup_target_for_coverage_*().
# Example:
# set(COVERAGE_EXCLUDES
# '${PROJECT_SOURCE_DIR}/src/dir1/*'
# '/path/to/my/src/dir2/*')
# Or, use the EXCLUDE argument to setup_target_for_coverage_*().
# Example:
# setup_target_for_coverage_lcov(
# NAME coverage
# EXECUTABLE testrunner
# EXCLUDE "${PROJECT_SOURCE_DIR}/src/dir1/*" "/path/to/my/src/dir2/*")
#
# 4.a NOTE: With CMake 3.4+, COVERAGE_EXCLUDES or EXCLUDE can also be set
# relative to the BASE_DIRECTORY (default: PROJECT_SOURCE_DIR)
# Example:
# set(COVERAGE_EXCLUDES "dir1/*")
# setup_target_for_coverage_gcovr_html(
# NAME coverage
# EXECUTABLE testrunner
# BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/src"
# EXCLUDE "dir2/*")
#
# 5. Use the functions described below to create a custom make target which
# runs your test executable and produces a code coverage report.
#
# 6. Build a Debug build:
# cmake -DCMAKE_BUILD_TYPE=Debug ..
# make
# make my_coverage_target
#
include(CMakeParseArguments)
option(CODE_COVERAGE_VERBOSE "Verbose information" FALSE)
# Check prereqs
find_program( GCOV_PATH gcov )
find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl)
find_program( FASTCOV_PATH NAMES fastcov fastcov.py )
find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat )
find_program( GCOVR_PATH gcovr )
find_program( CPPFILT_PATH NAMES c++filt )
if(NOT GCOV_PATH)
message(FATAL_ERROR "gcov not found! Aborting...")
endif() # NOT GCOV_PATH
get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
list(GET LANGUAGES 0 LANG)
if("${CMAKE_${LANG}_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
if("${CMAKE_${LANG}_COMPILER_VERSION}" VERSION_LESS 3)
message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
endif()
elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
if("${CMAKE_Fortran_COMPILER_ID}" MATCHES "[Ff]lang")
# Do nothing; exit conditional without error if true
elseif("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU")
# Do nothing; exit conditional without error if true
else()
message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
endif()
endif()
set(COVERAGE_COMPILER_FLAGS "-g -fprofile-arcs -ftest-coverage"
CACHE INTERNAL "")
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(-fprofile-abs-path HAVE_fprofile_abs_path)
if(HAVE_fprofile_abs_path)
set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
endif()
endif()
set(CMAKE_Fortran_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the Fortran compiler during coverage builds."
FORCE )
set(CMAKE_CXX_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C++ compiler during coverage builds."
FORCE )
set(CMAKE_C_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C compiler during coverage builds."
FORCE )
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
""
CACHE STRING "Flags used for linking binaries during coverage builds."
FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
""
CACHE STRING "Flags used by the shared libraries linker during coverage builds."
FORCE )
mark_as_advanced(
CMAKE_Fortran_FLAGS_COVERAGE
CMAKE_CXX_FLAGS_COVERAGE
CMAKE_C_FLAGS_COVERAGE
CMAKE_EXE_LINKER_FLAGS_COVERAGE
CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG))
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
endif() # NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG)
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
link_libraries(gcov)
endif()
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# setup_target_for_coverage_lcov(
# NAME testrunner_coverage # New target name
# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES testrunner # Dependencies to build first
# BASE_DIRECTORY "../" # Base directory for report
# # (defaults to PROJECT_SOURCE_DIR)
# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative
# # to BASE_DIRECTORY, with CMake 3.4+)
# NO_DEMANGLE # Don't demangle C++ symbols
# # even if c++filt is found
# )
function(setup_target_for_coverage_lcov)
set(options NO_DEMANGLE)
set(oneValueArgs BASE_DIRECTORY NAME)
set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS GENHTML_ARGS)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT LCOV_PATH)
message(FATAL_ERROR "lcov not found! Aborting...")
endif() # NOT LCOV_PATH
if(NOT GENHTML_PATH)
message(FATAL_ERROR "genhtml not found! Aborting...")
endif() # NOT GENHTML_PATH
# Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR
if(DEFINED Coverage_BASE_DIRECTORY)
get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE)
else()
set(BASEDIR ${PROJECT_SOURCE_DIR})
endif()
# Collect excludes (CMake 3.4+: Also compute absolute paths)
set(LCOV_EXCLUDES "")
foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_LCOV_EXCLUDES})
if(CMAKE_VERSION VERSION_GREATER 3.4)
get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR})
endif()
list(APPEND LCOV_EXCLUDES "${EXCLUDE}")
endforeach()
list(REMOVE_DUPLICATES LCOV_EXCLUDES)
# Conditional arguments
if(CPPFILT_PATH AND NOT ${Coverage_NO_DEMANGLE})
set(GENHTML_EXTRA_ARGS "--demangle-cpp")
endif()
# Setting up commands which will be run to generate coverage data.
# Cleanup lcov
set(LCOV_CLEAN_CMD
${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -directory .
-b ${BASEDIR} --zerocounters
)
# Create baseline to make sure untouched files show up in the report
set(LCOV_BASELINE_CMD
${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -c -i -d . -b
${BASEDIR} -o ${Coverage_NAME}.base
)
# Run tests
set(LCOV_EXEC_TESTS_CMD
${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
)
# Capturing lcov counters and generating report
set(LCOV_CAPTURE_CMD
${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --directory . -b
${BASEDIR} --capture --output-file ${Coverage_NAME}.capture
)
# add baseline counters
set(LCOV_BASELINE_COUNT_CMD
${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -a ${Coverage_NAME}.base
-a ${Coverage_NAME}.capture --output-file ${Coverage_NAME}.total
)
# filter collected data to final coverage report
set(LCOV_FILTER_CMD
${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --remove
${Coverage_NAME}.total ${LCOV_EXCLUDES} --output-file ${Coverage_NAME}.info
)
# Generate HTML output
set(LCOV_GEN_HTML_CMD
${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS} -o
${Coverage_NAME} ${Coverage_NAME}.info
)
if(CODE_COVERAGE_VERBOSE)
message(STATUS "Executed command report")
message(STATUS "Command to clean up lcov: ")
string(REPLACE ";" " " LCOV_CLEAN_CMD_SPACED "${LCOV_CLEAN_CMD}")
message(STATUS "${LCOV_CLEAN_CMD_SPACED}")
message(STATUS "Command to create baseline: ")
string(REPLACE ";" " " LCOV_BASELINE_CMD_SPACED "${LCOV_BASELINE_CMD}")
message(STATUS "${LCOV_BASELINE_CMD_SPACED}")
message(STATUS "Command to run the tests: ")
string(REPLACE ";" " " LCOV_EXEC_TESTS_CMD_SPACED "${LCOV_EXEC_TESTS_CMD}")
message(STATUS "${LCOV_EXEC_TESTS_CMD_SPACED}")
message(STATUS "Command to capture counters and generate report: ")
string(REPLACE ";" " " LCOV_CAPTURE_CMD_SPACED "${LCOV_CAPTURE_CMD}")
message(STATUS "${LCOV_CAPTURE_CMD_SPACED}")
message(STATUS "Command to add baseline counters: ")
string(REPLACE ";" " " LCOV_BASELINE_COUNT_CMD_SPACED "${LCOV_BASELINE_COUNT_CMD}")
message(STATUS "${LCOV_BASELINE_COUNT_CMD_SPACED}")
message(STATUS "Command to filter collected data: ")
string(REPLACE ";" " " LCOV_FILTER_CMD_SPACED "${LCOV_FILTER_CMD}")
message(STATUS "${LCOV_FILTER_CMD_SPACED}")
message(STATUS "Command to generate lcov HTML output: ")
string(REPLACE ";" " " LCOV_GEN_HTML_CMD_SPACED "${LCOV_GEN_HTML_CMD}")
message(STATUS "${LCOV_GEN_HTML_CMD_SPACED}")
endif()
# Setup target
add_custom_target(${Coverage_NAME}
COMMAND ${LCOV_CLEAN_CMD}
COMMAND ${LCOV_BASELINE_CMD}
COMMAND ${LCOV_EXEC_TESTS_CMD}
COMMAND ${LCOV_CAPTURE_CMD}
COMMAND ${LCOV_BASELINE_COUNT_CMD}
COMMAND ${LCOV_FILTER_CMD}
COMMAND ${LCOV_GEN_HTML_CMD}
# Set output files as GENERATED (will be removed on 'make clean')
BYPRODUCTS
${Coverage_NAME}.base
${Coverage_NAME}.capture
${Coverage_NAME}.total
${Coverage_NAME}.info
${Coverage_NAME}/index.html
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
VERBATIM # Protect arguments to commands
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
)
# Show where to find the lcov info report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info."
)
# Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
)
endfunction() # setup_target_for_coverage_lcov
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# setup_target_for_coverage_gcovr_xml(
# NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first
# BASE_DIRECTORY "../" # Base directory for report
# # (defaults to PROJECT_SOURCE_DIR)
# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative
# # to BASE_DIRECTORY, with CMake 3.4+)
# )
# The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the
# GCVOR command.
function(setup_target_for_coverage_gcovr_xml)
set(options NONE)
set(oneValueArgs BASE_DIRECTORY NAME)
set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT GCOVR_PATH)
message(FATAL_ERROR "gcovr not found! Aborting...")
endif() # NOT GCOVR_PATH
# Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR
if(DEFINED Coverage_BASE_DIRECTORY)
get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE)
else()
set(BASEDIR ${PROJECT_SOURCE_DIR})
endif()
# Collect excludes (CMake 3.4+: Also compute absolute paths)
set(GCOVR_EXCLUDES "")
foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_GCOVR_EXCLUDES})
if(CMAKE_VERSION VERSION_GREATER 3.4)
get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR})
endif()
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach()
list(REMOVE_DUPLICATES GCOVR_EXCLUDES)
# Combine excludes to several -e arguments
set(GCOVR_EXCLUDE_ARGS "")
foreach(EXCLUDE ${GCOVR_EXCLUDES})
list(APPEND GCOVR_EXCLUDE_ARGS "-e")
list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}")
endforeach()
# Set up commands which will be run to generate coverage data
# Run tests
set(GCOVR_XML_EXEC_TESTS_CMD
${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
)
# Running gcovr
set(GCOVR_XML_CMD
${GCOVR_PATH} --xml ${Coverage_NAME}.xml -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS}
${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR}
)
if(CODE_COVERAGE_VERBOSE)
message(STATUS "Executed command report")
message(STATUS "Command to run tests: ")
string(REPLACE ";" " " GCOVR_XML_EXEC_TESTS_CMD_SPACED "${GCOVR_XML_EXEC_TESTS_CMD}")
message(STATUS "${GCOVR_XML_EXEC_TESTS_CMD_SPACED}")
message(STATUS "Command to generate gcovr XML coverage data: ")
string(REPLACE ";" " " GCOVR_XML_CMD_SPACED "${GCOVR_XML_CMD}")
message(STATUS "${GCOVR_XML_CMD_SPACED}")
endif()
add_custom_target(${Coverage_NAME}
COMMAND ${GCOVR_XML_EXEC_TESTS_CMD}
COMMAND ${GCOVR_XML_CMD}
BYPRODUCTS ${Coverage_NAME}.xml
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
VERBATIM # Protect arguments to commands
COMMENT "Running gcovr to produce Cobertura code coverage report."
)
# Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml."
)
endfunction() # setup_target_for_coverage_gcovr_xml
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# setup_target_for_coverage_gcovr_html(
# NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first
# BASE_DIRECTORY "../" # Base directory for report
# # (defaults to PROJECT_SOURCE_DIR)
# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative
# # to BASE_DIRECTORY, with CMake 3.4+)
# )
# The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the
# GCVOR command.
function(setup_target_for_coverage_gcovr_html)
set(options NONE)
set(oneValueArgs BASE_DIRECTORY NAME)
set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT GCOVR_PATH)
message(FATAL_ERROR "gcovr not found! Aborting...")
endif() # NOT GCOVR_PATH
# Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR
if(DEFINED Coverage_BASE_DIRECTORY)
get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE)
else()
set(BASEDIR ${PROJECT_SOURCE_DIR})
endif()
# Collect excludes (CMake 3.4+: Also compute absolute paths)
set(GCOVR_EXCLUDES "")
foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_GCOVR_EXCLUDES})
if(CMAKE_VERSION VERSION_GREATER 3.4)
get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR})
endif()
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach()
list(REMOVE_DUPLICATES GCOVR_EXCLUDES)
# Combine excludes to several -e arguments
set(GCOVR_EXCLUDE_ARGS "")
foreach(EXCLUDE ${GCOVR_EXCLUDES})
list(APPEND GCOVR_EXCLUDE_ARGS "-e")
list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}")
endforeach()
# Set up commands which will be run to generate coverage data
# Run tests
set(GCOVR_HTML_EXEC_TESTS_CMD
${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
)
# Create folder
set(GCOVR_HTML_FOLDER_CMD
${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}
)
# Running gcovr
set(GCOVR_HTML_CMD
${GCOVR_PATH} --html ${Coverage_NAME}/index.html --html-details -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS}
${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR}
)
if(CODE_COVERAGE_VERBOSE)
message(STATUS "Executed command report")
message(STATUS "Command to run tests: ")
string(REPLACE ";" " " GCOVR_HTML_EXEC_TESTS_CMD_SPACED "${GCOVR_HTML_EXEC_TESTS_CMD}")
message(STATUS "${GCOVR_HTML_EXEC_TESTS_CMD_SPACED}")
message(STATUS "Command to create a folder: ")
string(REPLACE ";" " " GCOVR_HTML_FOLDER_CMD_SPACED "${GCOVR_HTML_FOLDER_CMD}")
message(STATUS "${GCOVR_HTML_FOLDER_CMD_SPACED}")
message(STATUS "Command to generate gcovr HTML coverage data: ")
string(REPLACE ";" " " GCOVR_HTML_CMD_SPACED "${GCOVR_HTML_CMD}")
message(STATUS "${GCOVR_HTML_CMD_SPACED}")
endif()
add_custom_target(${Coverage_NAME}
COMMAND ${GCOVR_HTML_EXEC_TESTS_CMD}
COMMAND ${GCOVR_HTML_FOLDER_CMD}
COMMAND ${GCOVR_HTML_CMD}
BYPRODUCTS ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html # report directory
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
VERBATIM # Protect arguments to commands
COMMENT "Running gcovr to produce HTML code coverage report."
)
# Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
)
endfunction() # setup_target_for_coverage_gcovr_html
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# setup_target_for_coverage_fastcov(
# NAME testrunner_coverage # New target name
# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES testrunner # Dependencies to build first
# BASE_DIRECTORY "../" # Base directory for report
# # (defaults to PROJECT_SOURCE_DIR)
# EXCLUDE "src/dir1/" "src/dir2/" # Patterns to exclude.
# NO_DEMANGLE # Don't demangle C++ symbols
# # even if c++filt is found
# SKIP_HTML # Don't create html report
# POST_CMD perl -i -pe s!${PROJECT_SOURCE_DIR}/!!g ctest_coverage.json # E.g. for stripping source dir from file paths
# )
function(setup_target_for_coverage_fastcov)
set(options NO_DEMANGLE SKIP_HTML)
set(oneValueArgs BASE_DIRECTORY NAME)
set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES FASTCOV_ARGS GENHTML_ARGS POST_CMD)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT FASTCOV_PATH)
message(FATAL_ERROR "fastcov not found! Aborting...")
endif()
if(NOT Coverage_SKIP_HTML AND NOT GENHTML_PATH)
message(FATAL_ERROR "genhtml not found! Aborting...")
endif()
# Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR
if(Coverage_BASE_DIRECTORY)
get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE)
else()
set(BASEDIR ${PROJECT_SOURCE_DIR})
endif()
# Collect excludes (Patterns, not paths, for fastcov)
set(FASTCOV_EXCLUDES "")
foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_FASTCOV_EXCLUDES})
list(APPEND FASTCOV_EXCLUDES "${EXCLUDE}")
endforeach()
list(REMOVE_DUPLICATES FASTCOV_EXCLUDES)
# Conditional arguments
if(CPPFILT_PATH AND NOT ${Coverage_NO_DEMANGLE})
set(GENHTML_EXTRA_ARGS "--demangle-cpp")
endif()
# Set up commands which will be run to generate coverage data
set(FASTCOV_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS})
set(FASTCOV_CAPTURE_CMD ${FASTCOV_PATH} ${Coverage_FASTCOV_ARGS} --gcov ${GCOV_PATH}
--search-directory ${BASEDIR}
--process-gcno
--output ${Coverage_NAME}.json
--exclude ${FASTCOV_EXCLUDES}
--exclude ${FASTCOV_EXCLUDES}
)
set(FASTCOV_CONVERT_CMD ${FASTCOV_PATH}
-C ${Coverage_NAME}.json --lcov --output ${Coverage_NAME}.info
)
if(Coverage_SKIP_HTML)
set(FASTCOV_HTML_CMD ";")
else()
set(FASTCOV_HTML_CMD ${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS}
-o ${Coverage_NAME} ${Coverage_NAME}.info
)
endif()
set(FASTCOV_POST_CMD ";")
if(Coverage_POST_CMD)
set(FASTCOV_POST_CMD ${Coverage_POST_CMD})
endif()
if(CODE_COVERAGE_VERBOSE)
message(STATUS "Code coverage commands for target ${Coverage_NAME} (fastcov):")
message(" Running tests:")
string(REPLACE ";" " " FASTCOV_EXEC_TESTS_CMD_SPACED "${FASTCOV_EXEC_TESTS_CMD}")
message(" ${FASTCOV_EXEC_TESTS_CMD_SPACED}")
message(" Capturing fastcov counters and generating report:")
string(REPLACE ";" " " FASTCOV_CAPTURE_CMD_SPACED "${FASTCOV_CAPTURE_CMD}")
message(" ${FASTCOV_CAPTURE_CMD_SPACED}")
message(" Converting fastcov .json to lcov .info:")
string(REPLACE ";" " " FASTCOV_CONVERT_CMD_SPACED "${FASTCOV_CONVERT_CMD}")
message(" ${FASTCOV_CONVERT_CMD_SPACED}")
if(NOT Coverage_SKIP_HTML)
message(" Generating HTML report: ")
string(REPLACE ";" " " FASTCOV_HTML_CMD_SPACED "${FASTCOV_HTML_CMD}")
message(" ${FASTCOV_HTML_CMD_SPACED}")
endif()
if(Coverage_POST_CMD)
message(" Running post command: ")
string(REPLACE ";" " " FASTCOV_POST_CMD_SPACED "${FASTCOV_POST_CMD}")
message(" ${FASTCOV_POST_CMD_SPACED}")
endif()
endif()
# Setup target
add_custom_target(${Coverage_NAME}
# Cleanup fastcov
COMMAND ${FASTCOV_PATH} ${Coverage_FASTCOV_ARGS} --gcov ${GCOV_PATH}
--search-directory ${BASEDIR}
--zerocounters
COMMAND ${FASTCOV_EXEC_TESTS_CMD}
COMMAND ${FASTCOV_CAPTURE_CMD}
COMMAND ${FASTCOV_CONVERT_CMD}
COMMAND ${FASTCOV_HTML_CMD}
COMMAND ${FASTCOV_POST_CMD}
# Set output files as GENERATED (will be removed on 'make clean')
BYPRODUCTS
${Coverage_NAME}.info
${Coverage_NAME}.json
${Coverage_NAME}/index.html # report directory
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
VERBATIM # Protect arguments to commands
COMMENT "Resetting code coverage counters to zero. Processing code coverage counters and generating report."
)
set(INFO_MSG "fastcov code coverage info report saved in ${Coverage_NAME}.info and ${Coverage_NAME}.json.")
if(NOT Coverage_SKIP_HTML)
string(APPEND INFO_MSG " Open ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html in your browser to view the coverage report.")
endif()
# Show where to find the fastcov info report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo ${INFO_MSG}
)
endfunction() # setup_target_for_coverage_fastcov
function(append_coverage_compiler_flags)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
endfunction() # append_coverage_compiler_flags
# Setup coverage for specific library
function(append_coverage_compiler_flags_to_target name)
target_compile_options(${name}
PRIVATE ${COVERAGE_COMPILER_FLAGS})
endfunction()

View File

@ -0,0 +1,23 @@
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,284 @@
# - Returns a version string from Git
#
# These functions force a re-configure on each git commit so that you can
# trust the values of the variables in your build system.
#
# get_git_head_revision(<refspecvar> <hashvar> [ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR])
#
# Returns the refspec and sha hash of the current head revision
#
# git_describe(<var> [<additional arguments to git describe> ...])
#
# Returns the results of git describe on the source tree, and adjusting
# the output so that it tests false if an error occurs.
#
# git_describe_working_tree(<var> [<additional arguments to git describe> ...])
#
# Returns the results of git describe on the working tree (--dirty option),
# and adjusting the output so that it tests false if an error occurs.
#
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
#
# Returns the results of git describe --exact-match on the source tree,
# and adjusting the output so that it tests false if there was no exact
# matching tag.
#
# git_local_changes(<var>)
#
# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes.
# Uses the return code of "git diff-index --quiet HEAD --".
# Does not regard untracked files.
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2020 Ryan Pavlik <ryan.pavlik@gmail.com> <abiryan@ryand.net>
# http://academic.cleardefinition.com
#
# Copyright 2009-2013, Iowa State University.
# Copyright 2013-2020, Ryan Pavlik
# Copyright 2013-2020, Contributors
# SPDX-License-Identifier: BSL-1.0
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__get_git_revision_description)
return()
endif()
set(__get_git_revision_description YES)
# We must run the following at "include" time, not at function call time,
# to find the path to this module rather than the path to a calling list file
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
# Function _git_find_closest_git_dir finds the next closest .git directory
# that is part of any directory in the path defined by _start_dir.
# The result is returned in the parent scope variable whose name is passed
# as variable _git_dir_var. If no .git directory can be found, the
# function returns an empty string via _git_dir_var.
#
# Example: Given a path C:/bla/foo/bar and assuming C:/bla/.git exists and
# neither foo nor bar contain a file/directory .git. This wil return
# C:/bla/.git
#
function(_git_find_closest_git_dir _start_dir _git_dir_var)
set(cur_dir "${_start_dir}")
set(git_dir "${_start_dir}/.git")
while(NOT EXISTS "${git_dir}")
# .git dir not found, search parent directories
set(git_previous_parent "${cur_dir}")
get_filename_component(cur_dir "${cur_dir}" DIRECTORY)
if(cur_dir STREQUAL git_previous_parent)
# We have reached the root directory, we are not in git
set(${_git_dir_var}
""
PARENT_SCOPE)
return()
endif()
set(git_dir "${cur_dir}/.git")
endwhile()
set(${_git_dir_var}
"${git_dir}"
PARENT_SCOPE)
endfunction()
function(get_git_head_revision _refspecvar _hashvar)
_git_find_closest_git_dir("${CMAKE_CURRENT_SOURCE_DIR}" GIT_DIR)
if("${ARGN}" STREQUAL "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR")
set(ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR TRUE)
else()
set(ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR FALSE)
endif()
if(NOT "${GIT_DIR}" STREQUAL "")
file(RELATIVE_PATH _relative_to_source_dir "${CMAKE_SOURCE_DIR}"
"${GIT_DIR}")
if("${_relative_to_source_dir}" MATCHES "[.][.]" AND NOT ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR)
# We've gone above the CMake root dir.
set(GIT_DIR "")
endif()
endif()
if("${GIT_DIR}" STREQUAL "")
set(${_refspecvar}
"GITDIR-NOTFOUND"
PARENT_SCOPE)
set(${_hashvar}
"GITDIR-NOTFOUND"
PARENT_SCOPE)
return()
endif()
# Check if the current source dir is a git submodule or a worktree.
# In both cases .git is a file instead of a directory.
#
if(NOT IS_DIRECTORY ${GIT_DIR})
# The following git command will return a non empty string that
# points to the super project working tree if the current
# source dir is inside a git submodule.
# Otherwise the command will return an empty string.
#
execute_process(
COMMAND "${GIT_EXECUTABLE}" rev-parse
--show-superproject-working-tree
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT "${out}" STREQUAL "")
# If out is empty, GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a submodule
file(READ ${GIT_DIR} submodule)
string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE
${submodule})
string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE}
ABSOLUTE)
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
else()
# GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a worktree
file(READ ${GIT_DIR} worktree_ref)
# The .git directory contains a path to the worktree information directory
# inside the parent git repo of the worktree.
#
string(REGEX REPLACE "gitdir: (.*)$" "\\1" git_worktree_dir
${worktree_ref})
string(STRIP ${git_worktree_dir} git_worktree_dir)
_git_find_closest_git_dir("${git_worktree_dir}" GIT_DIR)
set(HEAD_SOURCE_FILE "${git_worktree_dir}/HEAD")
endif()
else()
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
endif()
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
if(NOT EXISTS "${GIT_DATA}")
file(MAKE_DIRECTORY "${GIT_DATA}")
endif()
if(NOT EXISTS "${HEAD_SOURCE_FILE}")
return()
endif()
set(HEAD_FILE "${GIT_DATA}/HEAD")
configure_file("${HEAD_SOURCE_FILE}" "${HEAD_FILE}" COPYONLY)
configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
"${GIT_DATA}/grabRef.cmake" @ONLY)
include("${GIT_DATA}/grabRef.cmake")
set(${_refspecvar}
"${HEAD_REF}"
PARENT_SCOPE)
set(${_hashvar}
"${HEAD_HASH}"
PARENT_SCOPE)
endfunction()
function(git_describe _var)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
get_git_head_revision(refspec hash)
if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE)
return()
endif()
if(NOT hash)
set(${_var}
"HEAD-HASH-NOTFOUND"
PARENT_SCOPE)
return()
endif()
# TODO sanitize
#if((${ARGN}" MATCHES "&&") OR
# (ARGN MATCHES "||") OR
# (ARGN MATCHES "\\;"))
# message("Please report the following error to the project!")
# message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
#endif()
#message(STATUS "Arguments to execute_process: ${ARGN}")
execute_process(
COMMAND "${GIT_EXECUTABLE}" describe --tags --always ${hash} ${ARGN}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_var}
"${out}"
PARENT_SCOPE)
endfunction()
function(git_describe_working_tree _var)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE)
return()
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" describe --dirty ${ARGN}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_var}
"${out}"
PARENT_SCOPE)
endfunction()
function(git_get_exact_tag _var)
git_describe(out --exact-match ${ARGN})
set(${_var}
"${out}"
PARENT_SCOPE)
endfunction()
function(git_local_changes _var)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
get_git_head_revision(refspec hash)
if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE)
return()
endif()
if(NOT hash)
set(${_var}
"HEAD-HASH-NOTFOUND"
PARENT_SCOPE)
return()
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD --
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(res EQUAL 0)
set(${_var}
"CLEAN"
PARENT_SCOPE)
else()
set(${_var}
"DIRTY"
PARENT_SCOPE)
endif()
endfunction()

View File

@ -0,0 +1,43 @@
#
# Internal file for GetGitRevisionDescription.cmake
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright 2009-2012, Iowa State University
# Copyright 2011-2015, Contributors
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
# SPDX-License-Identifier: BSL-1.0
set(HEAD_HASH)
file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
if(HEAD_CONTENTS MATCHES "ref")
# named branch
string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
if(EXISTS "@GIT_DIR@/${HEAD_REF}")
configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
else()
configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY)
file(READ "@GIT_DATA@/packed-refs" PACKED_REFS)
if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
set(HEAD_HASH "${CMAKE_MATCH_1}")
endif()
endif()
else()
# detached HEAD
configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
endif()
if(NOT HEAD_HASH)
file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
string(STRIP "${HEAD_HASH}" HEAD_HASH)
endif()

View File

@ -0,0 +1,26 @@
Copyright (c) <year> <owner>. All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,23 @@
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute, execute,
and transmit the Software, and to prepare derivative works of the Software,
and to permit third-parties to whom the Software is furnished to do so, all
subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer, must
be included in all copies of the Software, in whole or in part, and all derivative
works of the Software, unless such copies or derivative works are solely in
the form of machine-executable object code generated by a source language
processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES
OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,23 @@
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@ -1,40 +0,0 @@
Configuring the FSFW
======
The FSFW can be configured via the `fsfwconfig` folder. A template folder has
been provided to have a starting point for this. The folder should be added
to the include path. The primary configuration file is the `FSFWConfig.h` folder. Some
of the available options will be explained in more detail here.
# Auto-Translation of Events
The FSFW allows the automatic translation of events, which allows developers to track triggered
events directly via console output. Using this feature requires:
1. `FSFW_OBJ_EVENT_TRANSLATION` set to 1 in the configuration file.
2. Special auto-generated translation files which translate event IDs and object IDs into
human readable strings. These files can be generated using the
[modgen Python scripts](https://git.ksat-stuttgart.de/source/modgen.git).
3. The generated translation files for the object IDs should be named `translatesObjects.cpp`
and `translateObjects.h` and should be copied to the `fsfwconfig/objects` folder
4. The generated translation files for the event IDs should be named `translateEvents.cpp` and
`translateEvents.h` and should be copied to the `fsfwconfig/events` folder
An example implementations of these translation file generators can be found as part
of the [SOURCE project here](https://git.ksat-stuttgart.de/source/sourceobsw/-/tree/development/generators)
or the [FSFW example](https://egit.irs.uni-stuttgart.de/fsfw/fsfw_example_public/src/branch/master/generators)
## Configuring the Event Manager
The number of allowed subscriptions can be modified with the following
parameters:
``` c++
namespace fsfwconfig {
//! Configure the allocated pool sizes for the event manager.
static constexpr size_t FSFW_EVENTMGMR_MATCHTREE_NODES = 240;
static constexpr size_t FSFW_EVENTMGMT_EVENTIDMATCHERS = 120;
static constexpr size_t FSFW_EVENTMGMR_RANGEMATCHERS = 120;
}
```

View File

@ -1 +0,0 @@
## Controllers

View File

@ -1,55 +0,0 @@
## FSFW Core Modules
These core modules provide the most important functionalities of the
Flight Software Framework
### Clock
* This is a class of static functions that can be used at anytime
* Leap Seconds must be set if any time conversions from UTC to other times is used
### ObjectManager
* Must be created during program startup
* The component which handles all references. All SystemObjects register at this component.
* Any SystemObject needs to have a unique ObjectId. Those can be managed like objects::framework_objects.
* A reference to an object can be get by calling the following function. T must be the specific Interface you want to call.
A nullptr check of the returning Pointer must be done. This function is based on Run-time type information.
```cpp
template <typename T> T* ObjectManagerIF::get( object_id_t id )
```
* A typical way to create all objects on startup is a handing a static produce function to the
ObjectManager on creation. By calling objectManager->initialize() the produce function will be
called and all SystemObjects will be initialized afterwards.
### Event Manager
* Component which allows routing of events
* Other objects can subscribe to specific events, ranges of events or all events of an object.
* Subscriptions can be done during runtime but should be done during initialization
* Amounts of allowed subscriptions can be configured in `FSFWConfig.h`
### Health Table
* A component which holds every health state
* Provides a thread safe way to access all health states without the need of message exchanges
### Stores
* The message based communication can only exchange a few bytes of information inside the message
itself. Therefore, additional information can be exchanged with Stores. With this, only the
store address must be exchanged in the message.
* Internally, the FSFW uses an IPC Store to exchange data between processes. For incoming TCs a TC
Store is used. For outgoing TM a TM store is used.
* All of them should use the Thread Safe Class storagemanager/PoolManager
### Tasks
There are two different types of tasks:
* The PeriodicTask just executes objects that are of type ExecutableObjectIF in the order of the
insertion to the Tasks.
* FixedTimeslotTask executes a list of calls in the order of the given list. This is intended for
DeviceHandlers, where polling should be in a defined order. An example can be found in
`defaultcfg/fsfwconfig/pollingSequence` folder

View File

@ -1 +0,0 @@
## Device Handlers

View File

@ -1,135 +0,0 @@
High-level overview
======
# Structure
The general structure is driven by the usage of interfaces provided by objects.
The FSFW uses C++11 as baseline. The intention behind this is that this C++ Standard should be
widely available, even with older compilers.
The FSFW uses dynamic allocation during the initialization but provides static containers during runtime.
This simplifies the instantiation of objects and allows the usage of some standard containers.
Dynamic Allocation after initialization is discouraged and different solutions are provided in the
FSFW to achieve that. The fsfw uses run-time type information but exceptions are not allowed.
# Failure Handling
Functions should return a defined `ReturnValue_t` to signal to the caller that something has
gone wrong. Returnvalues must be unique. For this the function `HasReturnvaluesIF::makeReturnCode`
or the macro `MAKE_RETURN` can be used. The `CLASS_ID` is a unique id for that type of object.
See `returnvalues/FwClassIds` folder. The user can add custom `CLASS_ID`s via the
`fsfwconfig` folder.
# OSAL
The FSFW provides operation system abstraction layers for Linux, FreeRTOS and RTEMS.
The OSAL provides periodic tasks, message queues, clocks and semaphores as well as mutexes.
The [OSAL README](doc/README-osal.md#top) provides more detailed information on provided components
and how to use them.
# Core Components
The FSFW has following core components. More detailed informations can be found in the
[core component section](doc/README-core.md#top):
1. Tasks: Abstraction for different (periodic) task types like periodic tasks or tasks
with fixed timeslots
2. ObjectManager: This module stores all `SystemObjects` by mapping a provided unique object ID
to the object handles.
3. Static Stores: Different stores are provided to store data of variable size (like telecommands
or small telemetry) in a pool structure without using dynamic memory allocation.
These pools are allocated up front.
3. Clock: This module provided common time related functions
4. EventManager: This module allows routing of events generated by `SystemObjects`
5. HealthTable: A component which stores the health states of objects
# Static IDs in the framework
Some parts of the framework use a static routing address for communication.
An example setup of ids can be found in the example config in `defaultcft/fsfwconfig/objects`
inside the function `Factory::setStaticFrameworkObjectIds()`.
# Events
Events are tied to objects. EventIds can be generated by calling the Macro MAKE_EVENT.
This works analog to the returnvalues. Every object that needs own EventIds has to get a
unique SUBSYSTEM_ID. Every SystemObject can call triggerEvent from the parent class.
Therefore, event messages contain the specific EventId and the objectId of the object that
has triggered.
# Internal Communication
Components communicate mostly via Messages through Queues.
Those queues are created by calling the singleton `QueueFactory::instance()->create()` which
will create `MessageQueue` instances for the used OSAL.
# External Communication
The external communication with the mission control system is mostly up to the user implementation.
The FSFW provides PUS Services which can be used to but don't need to be used.
The services can be seen as a conversion from a TC to a message based communication and back.
## TMTC Communication
The FSFW provides some components to facilitate TMTC handling via the PUS commands.
For example, a UDP or TCP PUS server socket can be opened on a specific port using the
files located in `osal/common`. The FSFW example uses this functionality to allow sending telecommands
and receiving telemetry using the [TMTC commander application](https://github.com/spacefisch/tmtccmd).
Simple commands like the PUS Service 17 ping service can be tested by simply running the
`tmtc_client_cli.py` or `tmtc_client_gui.py` utility in
the [example tmtc folder](https://egit.irs.uni-stuttgart.de/fsfw/fsfw_example_public/src/branch/master/tmtc)
while the `fsfw_example` application is running.
More generally, any class responsible for handling incoming telecommands and sending telemetry
can implement the generic `TmTcBridge` class located in `tmtcservices`. Many applications
also use a dedicated polling task for reading telecommands which passes telecommands
to the `TmTcBridge` implementation.
## CCSDS Frames, CCSDS Space Packets and PUS
If the communication is based on CCSDS Frames and Space Packets, several classes can be used to
distributed the packets to the corresponding services. Those can be found in `tcdistribution`.
If Space Packets are used, a timestamper has to be provided by the user.
An example can be found in the `timemanager` folder, which uses `CCSDSTime::CDS_short`.
# Device Handlers
DeviceHandlers are another important component of the FSFW.
The idea is, to have a software counterpart of every physical device to provide a simple mode,
health and commanding interface. By separating the underlying Communication Interface with
`DeviceCommunicationIF`, a device handler (DH) can be tested on different hardware.
The DH has mechanisms to monitor the communication with the physical device which allow
for FDIR reaction. Device Handlers can be created by implementing `DeviceHandlerBase`.
A standard FDIR component for the DH will be created automatically but can
be overwritten by the user. More information on DeviceHandlers can be found in the
related [documentation section](doc/README-devicehandlers.md#top).
# Modes and Health
The two interfaces `HasModesIF` and `HasHealthIF` provide access for commanding and monitoring
of components. On-board Mode Management is implement in hierarchy system.
DeviceHandlers and Controllers are the lowest part of the hierarchy.
The next layer are Assemblies. Those assemblies act as a component which handle
redundancies of handlers. Assemblies share a common core with the next level which
are the Subsystems.
Those Assemblies are intended to act as auto-generated components from a database which describes
the subsystem modes. The definitions contain transition and target tables which contain the DH,
Assembly and Controller Modes to be commanded.
Transition tables contain as many steps as needed to reach the mode from any other mode, e.g. a
switch into any higher AOCS mode might first turn on the sensors, than the actuators and the
controller as last component.
The target table is used to describe the state that is checked continuously by the subsystem.
All of this allows System Modes to be generated as Subsystem object as well from the same database.
This System contains list of subsystem modes in the transition and target tables.
Therefore, it allows a modular system to create system modes and easy commanding of those, because
only the highest components must be commanded.
The health state represents if the component is able to perform its tasks.
This can be used to signal the system to avoid using this component instead of a redundant one.
The on-board FDIR uses the health state for isolation and recovery.
# Unit Tests
Unit Tests are provided in the unittest folder. Those use the catch2 framework but do not include
catch2 itself. More information on how to run these tests can be found in the separate
[`fsfw_tests` reposoitory](https://egit.irs.uni-stuttgart.de/fsfw/fsfw_tests)

View File

@ -1,174 +0,0 @@
## Local Data Pools Developer Information
The following text is targeted towards mission software developers which would like
to use the local data pools provided by the FSFW to store data like sensor values so they can be
used by other software objects like controllers as well. If a custom class should have a local
pool which can be used by other software objects as well, following steps have to be performed:
1. Create a `LocalDataPoolManager` member object in the custom class
2. Implement the `HasLocalDataPoolIF` with specifies the interface between the local pool manager
and the class owning the local pool.
The local data pool manager is also able to process housekeeping service requests in form
of messages, generate periodic housekeeping packet, generate notification and snapshots of changed
variables and datasets and process notifications and snapshots coming from other objects.
The two former tasks are related to the external interface using telemetry and telecommands (TMTC)
while the later two are related to data consumers like controllers only acting on data change
detected by the data creator instead of checking the data manually each cycle. Two important
framework classes `DeviceHandlerBase` and `ExtendedControllerBase` already perform the two steps
shown above so the steps required are altered slightly.
### Storing and Accessing pool data
The pool manager is responsible for thread-safe access of the pool data, but the actual
access to the pool data from the point of view of a mission software developer happens via proxy
classes like pool variable classes. These classes store a copy
of the pool variable with the matching datatype and copy the actual data from the local pool
on a `read` call. Changed variables can then be written to the local pool with a `commit` call.
The `read` and `commit` calls are thread-safe and can be called concurrently from data creators
and data consumers. Generally, a user will create a dataset class which in turn groups all
cohesive pool variables. These sets simply iterator over the list of variables and call the
`read` and `commit` functions of each variable. The following diagram shows the
high-level architecture of the local data pools.
.. image:: ../misc/logo/FSFW_Logo_V3_bw.png
:alt: FSFW Logo
An example is shown for using the local data pools with a Gyroscope.
For example, the following code shows an implementation to access data from a Gyroscope taken
from the SOURCE CubeSat project:
```cpp
class GyroPrimaryDataset: public StaticLocalDataSet<3 * sizeof(float)> {
public:
/**
* Constructor for data users
* @param gyroId
*/
GyroPrimaryDataset(object_id_t gyroId):
StaticLocalDataSet(sid_t(gyroId, gyrodefs::GYRO_DATA_SET_ID)) {
setAllVariablesReadOnly();
}
lp_var_t<float> angVelocityX = lp_var_t<float>(sid.objectId,
gyrodefs::ANGULAR_VELOCITY_X, this);
lp_var_t<float> angVelocityY = lp_var_t<float>(sid.objectId,
gyrodefs::ANGULAR_VELOCITY_Y, this);
lp_var_t<float> angVelocityZ = lp_var_t<float>(sid.objectId,
gyrodefs::ANGULAR_VELOCITY_Z, this);
private:
friend class GyroHandler;
/**
* Constructor for data creator
* @param hkOwner
*/
GyroPrimaryDataset(HasLocalDataPoolIF* hkOwner):
StaticLocalDataSet(hkOwner, gyrodefs::GYRO_DATA_SET_ID) {}
};
```
There is a public constructor for users which sets all variables to read-only and there is a
constructor for the GyroHandler data creator by marking it private and declaring the `GyroHandler`
as a friend class. Both the atittude controller and the `GyroHandler` can now
use the same class definition to access the pool variables with `read` and `commit` semantics
in a thread-safe way. Generally, each class requiring access will have the set class as a member
class. The data creator will also be generally a `DeviceHandlerBase` subclass and some additional
steps are necessary to expose the set for housekeeping purposes.
### Using the local data pools in a `DeviceHandlerBase` subclass
It is very common to store data generated by devices like a sensor into a pool which can
then be used by other objects. Therefore, the `DeviceHandlerBase` already has a
local pool. Using the aforementioned example, our `GyroHandler` will now have the set class
as a member:
```cpp
class GyroHandler: ... {
public:
...
private:
...
GyroPrimaryDataset gyroData;
...
};
```
The constructor used for the creators expects the owner class as a parameter, so we initialize
the object in the `GyroHandler` constructor like this:
```cpp
GyroHandler::GyroHandler(object_id_t objectId, object_id_t comIF,
CookieIF *comCookie, uint8_t switchId):
DeviceHandlerBase(objectId, comIF, comCookie), switchId(switchId),
gyroData(this) {}
```
We need to assign the set to a reply ID used in the `DeviceHandlerBase`.
The combination of the `GyroHandler` object ID and the reply ID will be the 64-bit structure ID
`sid_t` and is used to globally identify the set, for example when requesting housekeeping data or
generating update messages. We need to assign our custom set class in some way so that the local
pool manager can access the custom data sets as well.
By default, the `getDataSetHandle` will take care of this tasks. The default implementation for a
`DeviceHandlerBase` subclass will use the internal command map to retrieve
a handle to a dataset from a given reply ID. Therefore,
we assign the set in the `fillCommandAndReplyMap` function:
```cpp
void GyroHandler::fillCommandAndReplyMap() {
...
this->insertInCommandAndReplyMap(gyrodefs::GYRO_DATA, 3, &gyroData);
...
}
```
Now, we need to create the actual pool entries as well, using the `initializeLocalDataPool`
function. Here, we also immediately subscribe for periodic housekeeping packets
with an interval of 4 seconds. They are still disabled in this example and can be enabled
with a housekeeping service command.
```cpp
ReturnValue_t GyroHandler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
LocalDataPoolManager &poolManager) {
localDataPoolMap.emplace(gyrodefs::ANGULAR_VELOCITY_X,
new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(gyrodefs::ANGULAR_VELOCITY_Y,
new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(gyrodefs::ANGULAR_VELOCITY_Z,
new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(gyrodefs::GENERAL_CONFIG_REG42,
new PoolEntry<uint8_t>({0}));
localDataPoolMap.emplace(gyrodefs::RANGE_CONFIG_REG43,
new PoolEntry<uint8_t>({0}));
poolManager.subscribeForPeriodicPacket(gyroData.getSid(), false, 4.0, false);
return HasReturnvaluesIF::RETURN_OK;
}
```
Now, if we receive some sensor data and converted them into the right format,
we can write it into the pool like this, using a guard class to ensure the set is commited back
in any case:
```cpp
PoolReadGuard readHelper(&gyroData);
if(readHelper.getReadResult() == HasReturnvaluesIF::RETURN_OK) {
if(not gyroData.isValid()) {
gyroData.setValidity(true, true);
}
gyroData.angVelocityX = angularVelocityX;
gyroData.angVelocityY = angularVelocityY;
gyroData.angVelocityZ = angularVelocityZ;
}
```
The guard class will commit the changed data on destruction automatically.
### Using the local data pools in a `ExtendedControllerBase` subclass
Coming soon

View File

@ -1,32 +0,0 @@
# Operating System Abstraction Layer (OSAL)
Some specific information on the provided OSALs are provided.
## Linux OSAL
This OSAL can be used to compile for Linux host systems like Ubuntu 20.04 or for
embedded Linux targets like the Raspberry Pi. This OSAL generally requires threading support
and real-time functionalities. For most UNIX systems, this is done by adding `-lrt` and `-lpthread` to the linked libraries in the compilation process. The CMake build support provided will do this automatically for the `fsfw` target. It should be noted that most UNIX systems need to be configured specifically to allow the real-time functionalities required by the FSFW.
More information on how to set up a Linux system accordingly can be found in the
[Linux README of the FSFW example application](https://egit.irs.uni-stuttgart.de/fsfw/fsfw_example/src/branch/master/doc/README-linux.md#top)
## Hosted OSAL
This is the newest OSAL. Support for Semaphores has not been implemented yet and will propably be implemented as soon as C++20 with Semaphore support has matured. This OSAL can be used to run the FSFW on any host system, but currently has only been tested on Windows 10 and Ubuntu 20.04. Unlike the other OSALs, it uses dynamic memory allocation (e.g. for the message queue implementation). Cross-platform serial port (USB) support might be added soon.
## FreeRTOS OSAL
FreeRTOS is not included and the developer needs to take care of compiling the FreeRTOS sources and adding the `FreeRTOSConfig.h` file location to the include path. This OSAL has only been tested extensively with the pre-emptive scheduler configuration so far but it should in principle also be possible to use a cooperative scheduler. It is recommended to use the `heap_4` allocation scheme. When using newlib (nano), it is also recommended to add `#define configUSE_NEWLIB_REENTRANT` to the FreeRTOS configuration file to ensure thread-safety.
When using this OSAL, developers also need to provide an implementation for the `vRequestContextSwitchFromISR` function. This has been done because the call to request a context switch from an ISR is generally located in the `portmacro.h` header and is different depending on the target architecture or device.
## RTEMS OSAL
The RTEMS OSAL was the first implemented OSAL which is also used on the active satellite Flying Laptop.
## TCP/IP socket abstraction
The Linux and Host OSAL provide abstraction layers for the socket API. Currently, only UDP sockets have been imlemented. This is very useful to test TMTC handling either on the host computer directly (targeting localhost with a TMTC application) or on embedded Linux devices, sending TMTC packets via Ethernet.

View File

@ -1 +0,0 @@
## PUS Services

View File

@ -4,6 +4,7 @@ API
.. toctree::
:maxdepth: 4
api/cfdp
api/objectmanager
api/task
api/ipc

8
docs/api/cfdp.rst Normal file
View File

@ -0,0 +1,8 @@
CFDP API
=================
``UserBase``
-----------------
.. doxygenclass:: cfdp::UserBase
:members:

View File

@ -3,7 +3,7 @@
Returnvalue API
==================
.. doxygenfile:: HasReturnvaluesIF.h
.. doxygenfile:: returnvalue.h
.. _fwclassids:

View File

@ -17,12 +17,12 @@
# -- Project information -----------------------------------------------------
project = 'Flight Software Framework'
copyright = '2021, Institute of Space Systems (IRS)'
author = 'Institute of Space Systems (IRS)'
project = "Flight Software Framework"
copyright = "2021, Institute of Space Systems (IRS)"
author = "Institute of Space Systems (IRS)"
# The full version, including alpha/beta/rc tags
release = '2.0.1'
release = "5.0.0"
# -- General configuration ---------------------------------------------------
@ -30,17 +30,17 @@ release = '2.0.1'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [ "breathe" ]
extensions = ["breathe"]
breathe_default_project = "fsfw"
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
templates_path = ["_templates"]
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
# -- Options for HTML output -------------------------------------------------
@ -48,9 +48,14 @@ exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
html_theme = "alabaster"
html_theme_options = {
"extra_nav_links": {"Impressum" : "https://www.uni-stuttgart.de/impressum", "Datenschutz": "https://info.irs.uni-stuttgart.de/datenschutz/datenschutzWebmit.html"}
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = []
html_static_path = []

View File

@ -1,3 +1,110 @@
.. _dhb-prim-doc:
Device Handlers
==================
Device handler components represent, control and monitor equipment, for example sensors or actuators
of a spacecraft or the payload.
Most device handlers have the same common functionality or
requirements, which are fulfilled by implementing certain interfaces:
- The handler/device needs to be commandable: :cpp:class:`HasActionsIF`
- The handler needs to communicate with the physical device via a dedicated
communication bus, for example SpaceWire, UART or SPI: :cpp:class:`DeviceCommunicationIF`
- The handler has housekeeping data which has to be exposed to the operator and/or other software
components: :cpp:class:`HasLocalDataPoolIF`
- The handler has configurable parameters: :cpp:class:`ReceivesParameterMessagesIF` which
also implements :cpp:class:`HasParametersIF`
- The handler has health states, for example to indicate a broken device:
:cpp:class:`HasHealthIF`
- The handler has modes. For example there are the core modes `MODE_ON`, `MODE_OFF`
and `MODE_NORMAL` provided by the FSFW. `MODE_ON` means that a device is physically powered
but that it is not periodically polling data from the
physical device, `MODE_NORMAL` means that it is able to do that: :cpp:class:`HasModesIF`
The device handler base therefore provides abstractions for a lot of common
functionality, which can potentially avoid high amounts or logic and code duplication.
Template Device Handler Base File
----------------------------------
This is an example template device handler header file with all necessary
functions implemented:
.. code-block:: cpp
#ifndef __TESTDEVICEHANDLER_H_
#define __TESTDEVICEHANDLER_H_
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
class TestDeviceHandler: DeviceHandlerBase {
public:
TestDeviceHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie);
private:
void doStartUp() override;
void doShutDown() override;
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override;
ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t* id) override;
void fillCommandAndReplyMap() override;
ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData,
size_t commandDataLen) override;
ReturnValue_t scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId,
size_t* foundLen) override;
ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override;
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) override;
};
#endif /* __TESTDEVICEHANDLER_H_ */
and the respective source file with sensible default return values:
.. code-block:: cpp
#include "TestDeviceHandler.h"
TestDeviceHandler::TestDeviceHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie)
: DeviceHandlerBase(objectId, comIF, cookie) {}
void TestDeviceHandler::doStartUp() {}
void TestDeviceHandler::doShutDown() {}
ReturnValue_t TestDeviceHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) {
return returnvalue::OK;
}
ReturnValue_t TestDeviceHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) {
return returnvalue::OK;
}
void TestDeviceHandler::fillCommandAndReplyMap() {}
ReturnValue_t TestDeviceHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
const uint8_t* commandData,
size_t commandDataLen) {
return returnvalue::OK;
}
ReturnValue_t TestDeviceHandler::scanForReply(const uint8_t* start, size_t remainingSize,
DeviceCommandId_t* foundId, size_t* foundLen) {
return returnvalue::OK;
}
ReturnValue_t TestDeviceHandler::interpretDeviceReply(DeviceCommandId_t id,
const uint8_t* packet) {
return returnvalue::OK;
}
uint32_t TestDeviceHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) {
return 10000;
}
ReturnValue_t TestDeviceHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) {
return returnvalue::OK;
}

View File

@ -19,6 +19,29 @@ A template configuration folder was provided and can be copied into the project
a starting point. The [configuration section](docs/README-config.md#top) provides more specific
information about the possible options.
Prerequisites
-------------------
The Embedded Template Library (etl) is a dependency of the FSFW which is automatically
installed and provided by the build system unless the correction version was installed.
The current recommended version can be found inside the fsfw ``CMakeLists.txt`` file or by using
``ccmake`` and looking up the ``FSFW_ETL_LIB_MAJOR_VERSION`` variable.
You can install the ETL library like this. On Linux, it might be necessary to add ``sudo`` before
the install call:
.. code-block:: console
git clone https://github.com/ETLCPP/etl
cd etl
git checkout <currentRecommendedVersion>
mkdir build && cd build
cmake ..
cmake --install .
It is recommended to install ``20.27.2`` or newer for the package version handling of
ETL to work.
Adding the library
-------------------
@ -60,6 +83,20 @@ The FSFW also has unittests which use the `Catch2 library`_.
These are built by setting the CMake option ``FSFW_BUILD_UNITTESTS`` to ``ON`` or `TRUE`
from your project `CMakeLists.txt` file or from the command line.
You can install the Catch2 library, which prevents the build system to avoid re-downloading
the dependency if the unit tests are completely rebuilt. The current recommended version
can be found inside the fsfw ``CMakeLists.txt`` file or by using ``ccmake`` and looking up
the ``FSFW_CATCH2_LIB_VERSION`` variable.
.. code-block:: console
git clone https://github.com/catchorg/Catch2.git
cd Catch2
git checkout <currentRecommendedVersion>
cmake -Bbuild -H. -DBUILD_TESTING=OFF
sudo cmake --build build/ --target install
The fsfw-tests binary will be built as part of the static library and dropped alongside it.
If the unittests are built, the library and the tests will be built with coverage information by
default. This can be disabled by setting the `FSFW_TESTS_COV_GEN` option to `OFF` or `FALSE`.
@ -69,7 +106,7 @@ You can use the following commands inside the ``fsfw`` folder to set up the buil
.. code-block:: console
mkdir build-tests && cd build-tests
cmake -DFSFW_BUILD_UNITTESTS=ON -DFSFW_OSAL=host ..
cmake -DFSFW_BUILD_TESTS=ON -DFSFW_OSAL=host ..
You can also use ``-DFSFW_OSAL=linux`` on Linux systems.
@ -90,8 +127,21 @@ Building the documentation
----------------------------
The FSFW documentation is built using the tools Sphinx, doxygen and breathe based on the
instructions provided in `this blogpost <https://devblogs.microsoft.com/cppblog/clear-functional-c-documentation-with-sphinx-breathe-doxygen-cmake/>`_. You can set up a
documentation build system using the following commands
instructions provided in `this blogpost <https://devblogs.microsoft.com/cppblog/clear-functional-c-documentation-with-sphinx-breathe-doxygen-cmake/>`_. If you
want to do this locally, set up the prerequisites first. This requires a ``python3``
installation as well. Example here is for Ubuntu.
.. code-block:: console
sudo apt-get install doxygen graphviz
And the following Python packages
.. code-block:: console
python3 -m pip install sphinx breathe
You can set up a documentation build system using the following commands
.. code-block:: bash
@ -110,6 +160,14 @@ folder. Simply open the ``index.html`` in the webbrowser of your choice.
The ``helper.py`` script located in the ``script`` folder can also be used to create, build
and open the documentation conveniently. Try ``helper.py -h`` for more information.
Formatting the source
-----------------------
The formatting is done by the ``clang-format`` tool. The configuration is contained within the
``.clang-format`` file in the repository root. As long as ``clang-format`` is installed, you
can run the ``apply-clang-format.sh`` helper script to format all source files consistently.
.. _`Hosted FSFW example`: https://egit.irs.uni-stuttgart.de/fsfw/fsfw-example-hosted
.. _`Catch2 library`: https://github.com/catchorg/Catch2
.. _`Code coverage`: https://github.com/bilke/cmake-modules/tree/master

View File

@ -6,19 +6,20 @@ High-level overview
Structure
----------
The general structure is driven by the usage of interfaces provided by objects.
The FSFW uses C++11 as baseline. The intention behind this is that this C++ Standard should be
widely available, even with older compilers.
The FSFW uses dynamic allocation during the initialization but provides static containers during runtime.
This simplifies the instantiation of objects and allows the usage of some standard containers.
Dynamic Allocation after initialization is discouraged and different solutions are provided in the
FSFW to achieve that. The fsfw uses run-time type information but exceptions are not allowed.
The general structure is driven by the usage of interfaces provided by objects.
The FSFW uses C++17 as baseline. Most modern compilers like GCC should have support for this
standard, even for micocontrollers.
The FSFW might use dynamic allocation during program initialization but not during runtime.
It offers pool objects, static containers and it also exposes the
`Embedded Template Library <https://www.etlcpp.com/>`_ to allow writing code which does not perform
allocation during runtime. The fsfw uses run-time type information but will not throw exceptions.
Failure Handling
-----------------
Functions should return a defined :cpp:type:`ReturnValue_t` to signal to the caller that something has
gone wrong. Returnvalues must be unique. For this the function :cpp:func:`HasReturnvaluesIF::makeReturnCode`
gone wrong. Returnvalues must be unique. For this the function :cpp:func:`returnvalue::makeCode`
or the :ref:`macro MAKE_RETURN_CODE <retvalapi>` can be used. The ``CLASS_ID`` is a unique ID for that type of object.
See the :ref:`FSFW Class IDs file <fwclassids>`. The user can add custom ``CLASS_ID``\s via the
``fsfwconfig`` folder.
@ -118,7 +119,7 @@ The DH has mechanisms to monitor the communication with the physical device whic
for FDIR reaction. Device Handlers can be created by implementing ``DeviceHandlerBase``.
A standard FDIR component for the DH will be created automatically but can
be overwritten by the user. More information on DeviceHandlers can be found in the
related [documentation section](doc/README-devicehandlers.md#top).
related :ref:`documentation section <dhb-prim-doc>`.
Modes and Health
--------------------

View File

@ -150,7 +150,7 @@ with a housekeeping service command.
new PoolEntry<uint8_t>({0}));
poolManager.subscribeForPeriodicPacket(gyroData.getSid(), false, 4.0, false);
return HasReturnvaluesIF::RETURN_OK;
return returnvalue::OK;
}
Now, if we receive some sensor data and converted them into the right format,
@ -160,7 +160,7 @@ in any case:
.. code-block:: cpp
PoolReadGuard readHelper(&gyroData);
if(readHelper.getReadResult() == HasReturnvaluesIF::RETURN_OK) {
if(readHelper.getReadResult() == returnvalue::OK) {
if(not gyroData.isValid()) {
gyroData.setValidity(true, true);
}

View File

@ -1,41 +0,0 @@
cmake_minimum_required(VERSION 3.13)
# Can also be changed by upper CMakeLists.txt file
find_library(LIB_FSFW_NAME fsfw REQUIRED)
option(FSFW_HAL_ADD_LINUX "Add the Linux HAL to the sources. Required gpiod library" OFF)
option(FSFW_HAL_ADD_RASPBERRY_PI "Add Raspberry Pi specific code to the sources" OFF)
option(FSFW_HAL_ADD_STM32H7 "Add the STM32H7 HAL to the sources" OFF)
option(FSFW_HAL_WARNING_SHADOW_LOCAL_GCC "Enable -Wshadow=local warning in GCC" ON)
set(LINUX_HAL_PATH_NAME linux)
set(STM32H7_PATH_NAME stm32h7)
add_subdirectory(src)
foreach(INCLUDE_PATH ${FSFW_HAL_ADDITIONAL_INC_PATHS})
if(IS_ABSOLUTE ${INCLUDE_PATH})
set(CURR_ABS_INC_PATH "${INCLUDE_PATH}")
else()
get_filename_component(CURR_ABS_INC_PATH
${INCLUDE_PATH} REALPATH BASE_DIR ${CMAKE_SOURCE_DIR})
endif()
if(CMAKE_VERBOSE)
message(STATUS "FSFW include path: ${CURR_ABS_INC_PATH}")
endif()
list(APPEND FSFW_HAL_ADD_INC_PATHS_ABS ${CURR_ABS_INC_PATH})
endforeach()
target_include_directories(${LIB_FSFW_NAME} PRIVATE
${FSFW_HAL_ADD_INC_PATHS_ABS}
)
target_compile_definitions(${LIB_FSFW_NAME} PRIVATE
${FSFW_HAL_DEFINES}
)
target_link_libraries(${LIB_FSFW_NAME} PRIVATE
${FSFW_HAL_LINK_LIBS}
)

View File

@ -1,9 +0,0 @@
target_include_directories(${LIB_FSFW_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
)
target_include_directories(${LIB_FSFW_NAME} INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}
)
add_subdirectory(fsfw_hal)

View File

@ -1 +0,0 @@
add_subdirectory(gpio)

View File

@ -1,3 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
GpioCookie.cpp
)

View File

@ -1,50 +0,0 @@
#include "fsfw_hal/common/gpio/GpioCookie.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
GpioCookie::GpioCookie() {
}
ReturnValue_t GpioCookie::addGpio(gpioId_t gpioId, GpioBase* gpioConfig) {
if (gpioConfig == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "GpioCookie::addGpio: gpioConfig is nullpointer" << std::endl;
#else
sif::printWarning("GpioCookie::addGpio: gpioConfig is nullpointer\n");
#endif
return HasReturnvaluesIF::RETURN_FAILED;
}
auto gpioMapIter = gpioMap.find(gpioId);
if(gpioMapIter == gpioMap.end()) {
auto statusPair = gpioMap.emplace(gpioId, gpioConfig);
if (statusPair.second == false) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "GpioCookie::addGpio: Failed to add GPIO " << gpioId <<
" to GPIO map" << std::endl;
#else
sif::printWarning("GpioCookie::addGpio: Failed to add GPIO %d to GPIO map\n", gpioId);
#endif
#endif
return HasReturnvaluesIF::RETURN_FAILED;
}
return HasReturnvaluesIF::RETURN_OK;
}
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "GpioCookie::addGpio: GPIO already exists in GPIO map " << std::endl;
#else
sif::printWarning("GpioCookie::addGpio: GPIO already exists in GPIO map\n");
#endif
#endif
return HasReturnvaluesIF::RETURN_FAILED;
}
GpioMap GpioCookie::getGpioMap() const {
return gpioMap;
}
GpioCookie::~GpioCookie() {
for(auto& config: gpioMap) {
delete(config.second);
}
}

View File

@ -1,54 +0,0 @@
#ifndef COMMON_GPIO_GPIOIF_H_
#define COMMON_GPIO_GPIOIF_H_
#include "gpioDefinitions.h"
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <fsfw/devicehandlers/CookieIF.h>
class GpioCookie;
/**
* @brief This class defines the interface for objects requiring the control
* over GPIOs.
* @author J. Meier
*/
class GpioIF : public HasReturnvaluesIF {
public:
virtual ~GpioIF() {};
/**
* @brief Called by the GPIO using object.
* @param cookie Cookie specifying informations of the GPIOs required
* by a object.
*/
virtual ReturnValue_t addGpios(GpioCookie* cookie) = 0;
/**
* @brief By implementing this function a child must provide the
* functionality to pull a certain GPIO to high logic level.
*
* @param gpioId A unique number which specifies the GPIO to drive.
* @return Returns RETURN_OK for success. This should never return RETURN_FAILED.
*/
virtual ReturnValue_t pullHigh(gpioId_t gpioId) = 0;
/**
* @brief By implementing this function a child must provide the
* functionality to pull a certain GPIO to low logic level.
*
* @param gpioId A unique number which specifies the GPIO to drive.
*/
virtual ReturnValue_t pullLow(gpioId_t gpioId) = 0;
/**
* @brief This function requires a child to implement the functionality to read the state of
* an ouput or input gpio.
*
* @param gpioId A unique number which specifies the GPIO to read.
* @param gpioState State of GPIO will be written to this pointer.
*/
virtual ReturnValue_t readGpio(gpioId_t gpioId, int* gpioState) = 0;
};
#endif /* COMMON_GPIO_GPIOIF_H_ */

View File

@ -1,170 +0,0 @@
#ifndef COMMON_GPIO_GPIODEFINITIONS_H_
#define COMMON_GPIO_GPIODEFINITIONS_H_
#include <string>
#include <unordered_map>
#include <map>
using gpioId_t = uint16_t;
namespace gpio {
enum Levels: uint8_t {
LOW = 0,
HIGH = 1,
NONE = 99
};
enum Direction: uint8_t {
IN = 0,
OUT = 1
};
enum GpioOperation {
READ,
WRITE
};
enum class GpioTypes {
NONE,
GPIO_REGULAR_BY_CHIP,
GPIO_REGULAR_BY_LABEL,
GPIO_REGULAR_BY_LINE_NAME,
CALLBACK
};
static constexpr gpioId_t NO_GPIO = -1;
using gpio_cb_t = void (*) (gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Levels value,
void* args);
}
/**
* @brief Struct containing information about the GPIO to use. This is
* required by the libgpiod to access and drive a GPIO.
* @param chipname String of the chipname specifying the group which contains the GPIO to
* access. E.g. gpiochip0. To detect names of GPIO groups run gpiodetect on
* the linux command line.
* @param lineNum The offset of the GPIO within the GPIO group.
* @param consumer Name of the consumer. Simply a description of the GPIO configuration.
* @param direction Specifies whether the GPIO should be used as in- or output.
* @param initValue Defines the initial state of the GPIO when configured as output.
* Only required for output GPIOs.
* @param lineHandle The handle returned by gpiod_chip_get_line will be later written to this
* pointer.
*/
class GpioBase {
public:
GpioBase() = default;
GpioBase(gpio::GpioTypes gpioType, std::string consumer, gpio::Direction direction,
gpio::Levels initValue):
gpioType(gpioType), consumer(consumer),direction(direction), initValue(initValue) {}
virtual~ GpioBase() {};
// Can be used to cast GpioBase to a concrete child implementation
gpio::GpioTypes gpioType = gpio::GpioTypes::NONE;
std::string consumer;
gpio::Direction direction = gpio::Direction::IN;
gpio::Levels initValue = gpio::Levels::NONE;
};
class GpiodRegularBase: public GpioBase {
public:
GpiodRegularBase(gpio::GpioTypes gpioType, std::string consumer, gpio::Direction direction,
gpio::Levels initValue, int lineNum):
GpioBase(gpioType, consumer, direction, initValue), lineNum(lineNum) {
}
// line number will be configured at a later point for the open by line name configuration
GpiodRegularBase(gpio::GpioTypes gpioType, std::string consumer, gpio::Direction direction,
gpio::Levels initValue): GpioBase(gpioType, consumer, direction, initValue) {
}
int lineNum = 0;
struct gpiod_line* lineHandle = nullptr;
};
class GpiodRegularByChip: public GpiodRegularBase {
public:
GpiodRegularByChip() :
GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP,
std::string(), gpio::Direction::IN, gpio::LOW, 0) {
}
GpiodRegularByChip(std::string chipname_, int lineNum_, std::string consumer_,
gpio::Direction direction_, gpio::Levels initValue_) :
GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP,
consumer_, direction_, initValue_, lineNum_),
chipname(chipname_){
}
GpiodRegularByChip(std::string chipname_, int lineNum_, std::string consumer_) :
GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP, consumer_,
gpio::Direction::IN, gpio::LOW, lineNum_),
chipname(chipname_) {
}
std::string chipname;
};
class GpiodRegularByLabel: public GpiodRegularBase {
public:
GpiodRegularByLabel(std::string label_, int lineNum_, std::string consumer_,
gpio::Direction direction_, gpio::Levels initValue_) :
GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_LABEL, consumer_,
direction_, initValue_, lineNum_),
label(label_) {
}
GpiodRegularByLabel(std::string label_, int lineNum_, std::string consumer_) :
GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_LABEL, consumer_,
gpio::Direction::IN, gpio::LOW, lineNum_),
label(label_) {
}
std::string label;
};
/**
* @brief Passing this GPIO configuration to the GPIO IF object will try to open the GPIO by its
* line name. This line name can be set in the device tree and must be unique. Otherwise
* the driver will open the first line with the given name.
*/
class GpiodRegularByLineName: public GpiodRegularBase {
public:
GpiodRegularByLineName(std::string lineName_, std::string consumer_, gpio::Direction direction_,
gpio::Levels initValue_) :
GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME, consumer_, direction_,
initValue_), lineName(lineName_) {
}
GpiodRegularByLineName(std::string lineName_, std::string consumer_) :
GpiodRegularBase(gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME, consumer_,
gpio::Direction::IN, gpio::LOW), lineName(lineName_) {
}
std::string lineName;
};
class GpioCallback: public GpioBase {
public:
GpioCallback(std::string consumer, gpio::Direction direction_, gpio::Levels initValue_,
gpio::gpio_cb_t callback, void* callbackArgs):
GpioBase(gpio::GpioTypes::CALLBACK, consumer, direction_, initValue_),
callback(callback), callbackArgs(callbackArgs) {}
gpio::gpio_cb_t callback = nullptr;
void* callbackArgs = nullptr;
};
using GpioMap = std::map<gpioId_t, GpioBase*>;
using GpioUnorderedMap = std::unordered_map<gpioId_t, GpioBase*>;
using GpioMapIter = GpioMap::iterator;
using GpioUnorderedMapIter = GpioUnorderedMap::iterator;
#endif /* LINUX_GPIO_GPIODEFINITIONS_H_ */

View File

@ -1,5 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
GyroL3GD20Handler.cpp
MgmRM3100Handler.cpp
MgmLIS3MDLHandler.cpp
)

View File

@ -1,287 +0,0 @@
#include "GyroL3GD20Handler.h"
#include "fsfw/datapool/PoolReadGuard.h"
#include <cmath>
GyroHandlerL3GD20H::GyroHandlerL3GD20H(object_id_t objectId, object_id_t deviceCommunication,
CookieIF *comCookie, uint32_t transitionDelayMs):
DeviceHandlerBase(objectId, deviceCommunication, comCookie),
transitionDelayMs(transitionDelayMs), dataset(this) {
#if FSFW_HAL_L3GD20_GYRO_DEBUG == 1
debugDivider = new PeriodicOperationDivider(3);
#endif
}
GyroHandlerL3GD20H::~GyroHandlerL3GD20H() {}
void GyroHandlerL3GD20H::doStartUp() {
if(internalState == InternalState::NONE) {
internalState = InternalState::CONFIGURE;
}
if(internalState == InternalState::CONFIGURE) {
if(commandExecuted) {
internalState = InternalState::CHECK_REGS;
commandExecuted = false;
}
}
if(internalState == InternalState::CHECK_REGS) {
if(commandExecuted) {
internalState = InternalState::NORMAL;
if(goNormalModeImmediately) {
setMode(MODE_NORMAL);
}
else {
setMode(_MODE_TO_ON);
}
commandExecuted = false;
}
}
}
void GyroHandlerL3GD20H::doShutDown() {
setMode(_MODE_POWER_DOWN);
}
ReturnValue_t GyroHandlerL3GD20H::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
switch(internalState) {
case(InternalState::NONE):
case(InternalState::NORMAL): {
return NOTHING_TO_SEND;
}
case(InternalState::CONFIGURE): {
*id = L3GD20H::CONFIGURE_CTRL_REGS;
uint8_t command [5];
command[0] = L3GD20H::CTRL_REG_1_VAL;
command[1] = L3GD20H::CTRL_REG_2_VAL;
command[2] = L3GD20H::CTRL_REG_3_VAL;
command[3] = L3GD20H::CTRL_REG_4_VAL;
command[4] = L3GD20H::CTRL_REG_5_VAL;
return buildCommandFromCommand(*id, command, 5);
}
case(InternalState::CHECK_REGS): {
*id = L3GD20H::READ_REGS;
return buildCommandFromCommand(*id, nullptr, 0);
}
default:
#if FSFW_CPP_OSTREAM_ENABLED == 1
/* Might be a configuration error. */
sif::warning << "GyroL3GD20Handler::buildTransitionDeviceCommand: "
"Unknown internal state!" << std::endl;
#else
sif::printDebug("GyroL3GD20Handler::buildTransitionDeviceCommand: "
"Unknown internal state!\n");
#endif
return HasReturnvaluesIF::RETURN_OK;
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroHandlerL3GD20H::buildNormalDeviceCommand(DeviceCommandId_t *id) {
*id = L3GD20H::READ_REGS;
return buildCommandFromCommand(*id, nullptr, 0);
}
ReturnValue_t GyroHandlerL3GD20H::buildCommandFromCommand(
DeviceCommandId_t deviceCommand, const uint8_t *commandData,
size_t commandDataLen) {
switch(deviceCommand) {
case(L3GD20H::READ_REGS): {
commandBuffer[0] = L3GD20H::READ_START | L3GD20H::AUTO_INCREMENT_MASK | L3GD20H::READ_MASK;
std::memset(commandBuffer + 1, 0, L3GD20H::READ_LEN);
rawPacket = commandBuffer;
rawPacketLen = L3GD20H::READ_LEN + 1;
break;
}
case(L3GD20H::CONFIGURE_CTRL_REGS): {
commandBuffer[0] = L3GD20H::CTRL_REG_1 | L3GD20H::AUTO_INCREMENT_MASK;
if(commandData == nullptr or commandDataLen != 5) {
return DeviceHandlerIF::INVALID_COMMAND_PARAMETER;
}
ctrlReg1Value = commandData[0];
ctrlReg2Value = commandData[1];
ctrlReg3Value = commandData[2];
ctrlReg4Value = commandData[3];
ctrlReg5Value = commandData[4];
bool fsH = ctrlReg4Value & L3GD20H::SET_FS_1;
bool fsL = ctrlReg4Value & L3GD20H::SET_FS_0;
if(not fsH and not fsL) {
sensitivity = L3GD20H::SENSITIVITY_00;
}
else if(not fsH and fsL) {
sensitivity = L3GD20H::SENSITIVITY_01;
}
else {
sensitivity = L3GD20H::SENSITIVITY_11;
}
commandBuffer[1] = ctrlReg1Value;
commandBuffer[2] = ctrlReg2Value;
commandBuffer[3] = ctrlReg3Value;
commandBuffer[4] = ctrlReg4Value;
commandBuffer[5] = ctrlReg5Value;
rawPacket = commandBuffer;
rawPacketLen = 6;
break;
}
case(L3GD20H::READ_CTRL_REGS): {
commandBuffer[0] = L3GD20H::READ_START | L3GD20H::AUTO_INCREMENT_MASK |
L3GD20H::READ_MASK;
std::memset(commandBuffer + 1, 0, 5);
rawPacket = commandBuffer;
rawPacketLen = 6;
break;
}
default:
return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroHandlerL3GD20H::scanForReply(const uint8_t *start, size_t len,
DeviceCommandId_t *foundId, size_t *foundLen) {
// For SPI, the ID will always be the one of the last sent command
*foundId = this->getPendingCommand();
*foundLen = this->rawPacketLen;
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroHandlerL3GD20H::interpretDeviceReply(DeviceCommandId_t id,
const uint8_t *packet) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
switch(id) {
case(L3GD20H::CONFIGURE_CTRL_REGS): {
commandExecuted = true;
break;
}
case(L3GD20H::READ_CTRL_REGS): {
if(packet[1] == ctrlReg1Value and packet[2] == ctrlReg2Value and
packet[3] == ctrlReg3Value and packet[4] == ctrlReg4Value and
packet[5] == ctrlReg5Value) {
commandExecuted = true;
}
else {
// Attempt reconfiguration
internalState = InternalState::CONFIGURE;
return DeviceHandlerIF::DEVICE_REPLY_INVALID;
}
break;
}
case(L3GD20H::READ_REGS): {
if(packet[1] != ctrlReg1Value and packet[2] != ctrlReg2Value and
packet[3] != ctrlReg3Value and packet[4] != ctrlReg4Value and
packet[5] != ctrlReg5Value) {
return DeviceHandlerIF::DEVICE_REPLY_INVALID;
}
else {
if(internalState == InternalState::CHECK_REGS) {
commandExecuted = true;
}
}
statusReg = packet[L3GD20H::STATUS_IDX];
int16_t angVelocXRaw = packet[L3GD20H::OUT_X_H] << 8 | packet[L3GD20H::OUT_X_L];
int16_t angVelocYRaw = packet[L3GD20H::OUT_Y_H] << 8 | packet[L3GD20H::OUT_Y_L];
int16_t angVelocZRaw = packet[L3GD20H::OUT_Z_H] << 8 | packet[L3GD20H::OUT_Z_L];
float angVelocX = angVelocXRaw * sensitivity;
float angVelocY = angVelocYRaw * sensitivity;
float angVelocZ = angVelocZRaw * sensitivity;
int8_t temperaturOffset = (-1) * packet[L3GD20H::TEMPERATURE_IDX];
float temperature = 25.0 + temperaturOffset;
#if FSFW_HAL_L3GD20_GYRO_DEBUG == 1
if(debugDivider->checkAndIncrement()) {
/* Set terminal to utf-8 if there is an issue with micro printout. */
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "GyroHandlerL3GD20H: Angular velocities (deg/s):" << std::endl;
sif::info << "X: " << angVelocX << std::endl;
sif::info << "Y: " << angVelocY << std::endl;
sif::info << "Z: " << angVelocZ << std::endl;
#else
sif::printInfo("GyroHandlerL3GD20H: Angular velocities (deg/s):\n");
sif::printInfo("X: %f\n", angVelocX);
sif::printInfo("Y: %f\n", angVelocY);
sif::printInfo("Z: %f\n", angVelocZ);
#endif
}
#endif
PoolReadGuard readSet(&dataset);
if(readSet.getReadResult() == HasReturnvaluesIF::RETURN_OK) {
if(std::abs(angVelocX) < this->absLimitX) {
dataset.angVelocX = angVelocX;
dataset.angVelocX.setValid(true);
}
else {
dataset.angVelocX.setValid(false);
}
if(std::abs(angVelocY) < this->absLimitY) {
dataset.angVelocY = angVelocY;
dataset.angVelocY.setValid(true);
}
else {
dataset.angVelocY.setValid(false);
}
if(std::abs(angVelocZ) < this->absLimitZ) {
dataset.angVelocZ = angVelocZ;
dataset.angVelocZ.setValid(true);
}
else {
dataset.angVelocZ.setValid(false);
}
dataset.temperature = temperature;
dataset.temperature.setValid(true);
}
break;
}
default:
return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
}
return result;
}
uint32_t GyroHandlerL3GD20H::getTransitionDelayMs(Mode_t from, Mode_t to) {
return this->transitionDelayMs;
}
void GyroHandlerL3GD20H::setToGoToNormalMode(bool enable) {
this->goNormalModeImmediately = true;
}
ReturnValue_t GyroHandlerL3GD20H::initializeLocalDataPool(
localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) {
localDataPoolMap.emplace(L3GD20H::ANG_VELOC_X, new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(L3GD20H::ANG_VELOC_Y, new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(L3GD20H::ANG_VELOC_Z, new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(L3GD20H::TEMPERATURE, new PoolEntry<float>({0.0}));
return HasReturnvaluesIF::RETURN_OK;
}
void GyroHandlerL3GD20H::fillCommandAndReplyMap() {
insertInCommandAndReplyMap(L3GD20H::READ_REGS, 1, &dataset);
insertInCommandAndReplyMap(L3GD20H::CONFIGURE_CTRL_REGS, 1);
insertInCommandAndReplyMap(L3GD20H::READ_CTRL_REGS, 1);
}
void GyroHandlerL3GD20H::modeChanged() {
internalState = InternalState::NONE;
}
void GyroHandlerL3GD20H::setAbsoluteLimits(float limitX, float limitY, float limitZ) {
this->absLimitX = limitX;
this->absLimitY = limitY;
this->absLimitZ = limitZ;
}

View File

@ -1,99 +0,0 @@
#ifndef MISSION_DEVICES_GYROL3GD20HANDLER_H_
#define MISSION_DEVICES_GYROL3GD20HANDLER_H_
#include "fsfw/FSFW.h"
#include "devicedefinitions/GyroL3GD20Definitions.h"
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
#include <fsfw/globalfunctions/PeriodicOperationDivider.h>
/**
* @brief Device Handler for the L3GD20H gyroscope sensor
* (https://www.st.com/en/mems-and-sensors/l3gd20h.html)
* @details
* Advanced documentation:
* https://egit.irs.uni-stuttgart.de/redmine/projects/eive-flight-manual/wiki/L3GD20H_Gyro
*
* Data is read big endian with the smallest possible range of 245 degrees per second.
*/
class GyroHandlerL3GD20H: public DeviceHandlerBase {
public:
GyroHandlerL3GD20H(object_id_t objectId, object_id_t deviceCommunication,
CookieIF* comCookie, uint32_t transitionDelayMs);
virtual ~GyroHandlerL3GD20H();
/**
* Set the absolute limit for the values on the axis in degrees per second.
* The dataset values will be marked as invalid if that limit is exceeded
* @param xLimit
* @param yLimit
* @param zLimit
*/
void setAbsoluteLimits(float limitX, float limitY, float limitZ);
/**
* @brief Configure device handler to go to normal mode immediately
*/
void setToGoToNormalMode(bool enable);
protected:
/* DeviceHandlerBase overrides */
ReturnValue_t buildTransitionDeviceCommand(
DeviceCommandId_t *id) override;
void doStartUp() override;
void doShutDown() override;
ReturnValue_t buildNormalDeviceCommand(
DeviceCommandId_t *id) override;
ReturnValue_t buildCommandFromCommand(
DeviceCommandId_t deviceCommand, const uint8_t *commandData,
size_t commandDataLen) override;
ReturnValue_t scanForReply(const uint8_t *start, size_t len,
DeviceCommandId_t *foundId, size_t *foundLen) override;
virtual ReturnValue_t interpretDeviceReply(DeviceCommandId_t id,
const uint8_t *packet) override;
void fillCommandAndReplyMap() override;
void modeChanged() override;
virtual uint32_t getTransitionDelayMs(Mode_t from, Mode_t to) override;
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
LocalDataPoolManager &poolManager) override;
private:
uint32_t transitionDelayMs = 0;
GyroPrimaryDataset dataset;
float absLimitX = L3GD20H::RANGE_DPS_00;
float absLimitY = L3GD20H::RANGE_DPS_00;
float absLimitZ = L3GD20H::RANGE_DPS_00;
enum class InternalState {
NONE,
CONFIGURE,
CHECK_REGS,
NORMAL
};
InternalState internalState = InternalState::NONE;
bool commandExecuted = false;
uint8_t statusReg = 0;
bool goNormalModeImmediately = false;
uint8_t ctrlReg1Value = L3GD20H::CTRL_REG_1_VAL;
uint8_t ctrlReg2Value = L3GD20H::CTRL_REG_2_VAL;
uint8_t ctrlReg3Value = L3GD20H::CTRL_REG_3_VAL;
uint8_t ctrlReg4Value = L3GD20H::CTRL_REG_4_VAL;
uint8_t ctrlReg5Value = L3GD20H::CTRL_REG_5_VAL;
uint8_t commandBuffer[L3GD20H::READ_LEN + 1];
// Set default value
float sensitivity = L3GD20H::SENSITIVITY_00;
#if FSFW_HAL_L3GD20_GYRO_DEBUG == 1
PeriodicOperationDivider* debugDivider = nullptr;
#endif
};
#endif /* MISSION_DEVICES_GYROL3GD20HANDLER_H_ */

View File

@ -1,520 +0,0 @@
#include "MgmLIS3MDLHandler.h"
#include "fsfw/datapool/PoolReadGuard.h"
#if FSFW_HAL_LIS3MDL_MGM_DEBUG == 1
#include "fsfw/globalfunctions/PeriodicOperationDivider.h"
#endif
#include <cmath>
MgmLIS3MDLHandler::MgmLIS3MDLHandler(object_id_t objectId, object_id_t deviceCommunication,
CookieIF* comCookie, uint32_t transitionDelay):
DeviceHandlerBase(objectId, deviceCommunication, comCookie),
dataset(this), transitionDelay(transitionDelay) {
#if FSFW_HAL_LIS3MDL_MGM_DEBUG == 1
debugDivider = new PeriodicOperationDivider(3);
#endif
// Set to default values right away
registers[0] = MGMLIS3MDL::CTRL_REG1_DEFAULT;
registers[1] = MGMLIS3MDL::CTRL_REG2_DEFAULT;
registers[2] = MGMLIS3MDL::CTRL_REG3_DEFAULT;
registers[3] = MGMLIS3MDL::CTRL_REG4_DEFAULT;
registers[4] = MGMLIS3MDL::CTRL_REG5_DEFAULT;
}
MgmLIS3MDLHandler::~MgmLIS3MDLHandler() {
}
void MgmLIS3MDLHandler::doStartUp() {
switch (internalState) {
case(InternalState::STATE_NONE): {
internalState = InternalState::STATE_FIRST_CONTACT;
break;
}
case(InternalState::STATE_FIRST_CONTACT): {
/* Will be set by checking device ID (WHO AM I register) */
if(commandExecuted) {
commandExecuted = false;
internalState = InternalState::STATE_SETUP;
}
break;
}
case(InternalState::STATE_SETUP): {
internalState = InternalState::STATE_CHECK_REGISTERS;
break;
}
case(InternalState::STATE_CHECK_REGISTERS): {
/* Set up cached registers which will be used to configure the MGM. */
if(commandExecuted) {
commandExecuted = false;
if(goToNormalMode) {
setMode(MODE_NORMAL);
}
else {
setMode(_MODE_TO_ON);
}
}
break;
}
default:
break;
}
}
void MgmLIS3MDLHandler::doShutDown() {
setMode(_MODE_POWER_DOWN);
}
ReturnValue_t MgmLIS3MDLHandler::buildTransitionDeviceCommand(
DeviceCommandId_t *id) {
switch (internalState) {
case(InternalState::STATE_NONE):
case(InternalState::STATE_NORMAL): {
return DeviceHandlerBase::NOTHING_TO_SEND;
}
case(InternalState::STATE_FIRST_CONTACT): {
*id = MGMLIS3MDL::IDENTIFY_DEVICE;
break;
}
case(InternalState::STATE_SETUP): {
*id = MGMLIS3MDL::SETUP_MGM;
break;
}
case(InternalState::STATE_CHECK_REGISTERS): {
*id = MGMLIS3MDL::READ_CONFIG_AND_DATA;
break;
}
default: {
/* might be a configuration error. */
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "GyroHandler::buildTransitionDeviceCommand: Unknown internal state!" <<
std::endl;
#else
sif::printWarning("GyroHandler::buildTransitionDeviceCommand: Unknown internal state!\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
return HasReturnvaluesIF::RETURN_OK;
}
}
return buildCommandFromCommand(*id, NULL, 0);
}
uint8_t MgmLIS3MDLHandler::readCommand(uint8_t command, bool continuousCom) {
command |= (1 << MGMLIS3MDL::RW_BIT);
if (continuousCom == true) {
command |= (1 << MGMLIS3MDL::MS_BIT);
}
return command;
}
uint8_t MgmLIS3MDLHandler::writeCommand(uint8_t command, bool continuousCom) {
command &= ~(1 << MGMLIS3MDL::RW_BIT);
if (continuousCom == true) {
command |= (1 << MGMLIS3MDL::MS_BIT);
}
return command;
}
void MgmLIS3MDLHandler::setupMgm() {
registers[0] = MGMLIS3MDL::CTRL_REG1_DEFAULT;
registers[1] = MGMLIS3MDL::CTRL_REG2_DEFAULT;
registers[2] = MGMLIS3MDL::CTRL_REG3_DEFAULT;
registers[3] = MGMLIS3MDL::CTRL_REG4_DEFAULT;
registers[4] = MGMLIS3MDL::CTRL_REG5_DEFAULT;
prepareCtrlRegisterWrite();
}
ReturnValue_t MgmLIS3MDLHandler::buildNormalDeviceCommand(
DeviceCommandId_t *id) {
// Data/config register will be read in an alternating manner.
if(communicationStep == CommunicationStep::DATA) {
*id = MGMLIS3MDL::READ_CONFIG_AND_DATA;
communicationStep = CommunicationStep::TEMPERATURE;
return buildCommandFromCommand(*id, NULL, 0);
}
else {
*id = MGMLIS3MDL::READ_TEMPERATURE;
communicationStep = CommunicationStep::DATA;
return buildCommandFromCommand(*id, NULL, 0);
}
}
ReturnValue_t MgmLIS3MDLHandler::buildCommandFromCommand(
DeviceCommandId_t deviceCommand, const uint8_t *commandData,
size_t commandDataLen) {
switch(deviceCommand) {
case(MGMLIS3MDL::READ_CONFIG_AND_DATA): {
std::memset(commandBuffer, 0, sizeof(commandBuffer));
commandBuffer[0] = readCommand(MGMLIS3MDL::CTRL_REG1, true);
rawPacket = commandBuffer;
rawPacketLen = MGMLIS3MDL::NR_OF_DATA_AND_CFG_REGISTERS + 1;
return RETURN_OK;
}
case(MGMLIS3MDL::READ_TEMPERATURE): {
std::memset(commandBuffer, 0, 3);
commandBuffer[0] = readCommand(MGMLIS3MDL::TEMP_LOWBYTE, true);
rawPacket = commandBuffer;
rawPacketLen = 3;
return RETURN_OK;
}
case(MGMLIS3MDL::IDENTIFY_DEVICE): {
return identifyDevice();
}
case(MGMLIS3MDL::TEMP_SENSOR_ENABLE): {
return enableTemperatureSensor(commandData, commandDataLen);
}
case(MGMLIS3MDL::SETUP_MGM): {
setupMgm();
return HasReturnvaluesIF::RETURN_OK;
}
case(MGMLIS3MDL::ACCURACY_OP_MODE_SET): {
return setOperatingMode(commandData, commandDataLen);
}
default:
return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
}
return HasReturnvaluesIF::RETURN_FAILED;
}
ReturnValue_t MgmLIS3MDLHandler::identifyDevice() {
uint32_t size = 2;
commandBuffer[0] = readCommand(MGMLIS3MDL::IDENTIFY_DEVICE_REG_ADDR);
commandBuffer[1] = 0x00;
rawPacket = commandBuffer;
rawPacketLen = size;
return RETURN_OK;
}
ReturnValue_t MgmLIS3MDLHandler::scanForReply(const uint8_t *start,
size_t len, DeviceCommandId_t *foundId, size_t *foundLen) {
*foundLen = len;
if (len == MGMLIS3MDL::NR_OF_DATA_AND_CFG_REGISTERS + 1) {
*foundLen = len;
*foundId = MGMLIS3MDL::READ_CONFIG_AND_DATA;
// Check validity by checking config registers
if (start[1] != registers[0] or start[2] != registers[1] or
start[3] != registers[2] or start[4] != registers[3] or
start[5] != registers[4]) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "MGMHandlerLIS3MDL::scanForReply: Invalid registers!" << std::endl;
#else
sif::printWarning("MGMHandlerLIS3MDL::scanForReply: Invalid registers!\n");
#endif
#endif
return DeviceHandlerIF::INVALID_DATA;
}
if(mode == _MODE_START_UP) {
commandExecuted = true;
}
}
else if(len == MGMLIS3MDL::TEMPERATURE_REPLY_LEN) {
*foundLen = len;
*foundId = MGMLIS3MDL::READ_TEMPERATURE;
}
else if (len == MGMLIS3MDL::SETUP_REPLY_LEN) {
*foundLen = len;
*foundId = MGMLIS3MDL::SETUP_MGM;
}
else if (len == SINGLE_COMMAND_ANSWER_LEN) {
*foundLen = len;
*foundId = getPendingCommand();
if(*foundId == MGMLIS3MDL::IDENTIFY_DEVICE) {
if(start[1] != MGMLIS3MDL::DEVICE_ID) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "MGMHandlerLIS3MDL::scanForReply: "
"Device identification failed!" << std::endl;
#else
sif::printWarning("MGMHandlerLIS3MDL::scanForReply: "
"Device identification failed!\n");
#endif
#endif
return DeviceHandlerIF::INVALID_DATA;
}
if(mode == _MODE_START_UP) {
commandExecuted = true;
}
}
}
else {
return DeviceHandlerIF::INVALID_DATA;
}
/* Data with SPI Interface always has this answer */
if (start[0] == 0b11111111) {
return RETURN_OK;
}
else {
return DeviceHandlerIF::INVALID_DATA;
}
}
ReturnValue_t MgmLIS3MDLHandler::interpretDeviceReply(DeviceCommandId_t id,
const uint8_t *packet) {
switch (id) {
case MGMLIS3MDL::IDENTIFY_DEVICE: {
break;
}
case MGMLIS3MDL::SETUP_MGM: {
break;
}
case MGMLIS3MDL::READ_CONFIG_AND_DATA: {
// TODO: Store configuration in new local datasets.
float sensitivityFactor = getSensitivityFactor(getSensitivity(registers[2]));
int16_t mgmMeasurementRawX = packet[MGMLIS3MDL::X_HIGHBYTE_IDX] << 8
| packet[MGMLIS3MDL::X_LOWBYTE_IDX] ;
int16_t mgmMeasurementRawY = packet[MGMLIS3MDL::Y_HIGHBYTE_IDX] << 8
| packet[MGMLIS3MDL::Y_LOWBYTE_IDX] ;
int16_t mgmMeasurementRawZ = packet[MGMLIS3MDL::Z_HIGHBYTE_IDX] << 8
| packet[MGMLIS3MDL::Z_LOWBYTE_IDX] ;
/* Target value in microtesla */
float mgmX = static_cast<float>(mgmMeasurementRawX) * sensitivityFactor
* MGMLIS3MDL::GAUSS_TO_MICROTESLA_FACTOR;
float mgmY = static_cast<float>(mgmMeasurementRawY) * sensitivityFactor
* MGMLIS3MDL::GAUSS_TO_MICROTESLA_FACTOR;
float mgmZ = static_cast<float>(mgmMeasurementRawZ) * sensitivityFactor
* MGMLIS3MDL::GAUSS_TO_MICROTESLA_FACTOR;
#if FSFW_HAL_LIS3MDL_MGM_DEBUG == 1
if(debugDivider->checkAndIncrement()) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "MGMHandlerLIS3: Magnetic field strength in"
" microtesla:" << std::endl;
sif::info << "X: " << mgmX << " uT" << std::endl;
sif::info << "Y: " << mgmY << " uT" << std::endl;
sif::info << "Z: " << mgmZ << " uT" << std::endl;
#else
sif::printInfo("MGMHandlerLIS3: Magnetic field strength in microtesla:\n");
sif::printInfo("X: %f uT\n", mgmX);
sif::printInfo("Y: %f uT\n", mgmY);
sif::printInfo("Z: %f uT\n", mgmZ);
#endif /* FSFW_CPP_OSTREAM_ENABLED == 0 */
}
#endif /* OBSW_VERBOSE_LEVEL >= 1 */
PoolReadGuard readHelper(&dataset);
if(readHelper.getReadResult() == HasReturnvaluesIF::RETURN_OK) {
if(std::abs(mgmX) < absLimitX) {
dataset.fieldStrengthX = mgmX;
dataset.fieldStrengthX.setValid(true);
}
else {
dataset.fieldStrengthX.setValid(false);
}
if(std::abs(mgmY) < absLimitY) {
dataset.fieldStrengthY = mgmY;
dataset.fieldStrengthY.setValid(true);
}
else {
dataset.fieldStrengthY.setValid(false);
}
if(std::abs(mgmZ) < absLimitZ) {
dataset.fieldStrengthZ = mgmZ;
dataset.fieldStrengthZ.setValid(true);
}
else {
dataset.fieldStrengthZ.setValid(false);
}
}
break;
}
case MGMLIS3MDL::READ_TEMPERATURE: {
int16_t tempValueRaw = packet[2] << 8 | packet[1];
float tempValue = 25.0 + ((static_cast<float>(tempValueRaw)) / 8.0);
#if FSFW_HAL_LIS3MDL_MGM_DEBUG == 1
if(debugDivider->check()) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "MGMHandlerLIS3: Temperature: " << tempValue << " C" <<
std::endl;
#else
sif::printInfo("MGMHandlerLIS3: Temperature: %f C\n");
#endif
}
#endif
ReturnValue_t result = dataset.read();
if(result == HasReturnvaluesIF::RETURN_OK) {
dataset.temperature = tempValue;
dataset.commit();
}
break;
}
default: {
return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY;
}
}
return RETURN_OK;
}
MGMLIS3MDL::Sensitivies MgmLIS3MDLHandler::getSensitivity(uint8_t ctrlRegister2) {
bool fs0Set = ctrlRegister2 & (1 << MGMLIS3MDL::FSO); // Checks if FS0 bit is set
bool fs1Set = ctrlRegister2 & (1 << MGMLIS3MDL::FS1); // Checks if FS1 bit is set
if (fs0Set && fs1Set)
return MGMLIS3MDL::Sensitivies::GAUSS_16;
else if (!fs0Set && fs1Set)
return MGMLIS3MDL::Sensitivies::GAUSS_12;
else if (fs0Set && !fs1Set)
return MGMLIS3MDL::Sensitivies::GAUSS_8;
else
return MGMLIS3MDL::Sensitivies::GAUSS_4;
}
float MgmLIS3MDLHandler::getSensitivityFactor(MGMLIS3MDL::Sensitivies sens) {
switch(sens) {
case(MGMLIS3MDL::GAUSS_4): {
return MGMLIS3MDL::FIELD_LSB_PER_GAUSS_4_SENS;
}
case(MGMLIS3MDL::GAUSS_8): {
return MGMLIS3MDL::FIELD_LSB_PER_GAUSS_8_SENS;
}
case(MGMLIS3MDL::GAUSS_12): {
return MGMLIS3MDL::FIELD_LSB_PER_GAUSS_12_SENS;
}
case(MGMLIS3MDL::GAUSS_16): {
return MGMLIS3MDL::FIELD_LSB_PER_GAUSS_16_SENS;
}
default: {
// Should never happen
return MGMLIS3MDL::FIELD_LSB_PER_GAUSS_4_SENS;
}
}
}
ReturnValue_t MgmLIS3MDLHandler::enableTemperatureSensor(
const uint8_t *commandData, size_t commandDataLen) {
triggerEvent(CHANGE_OF_SETUP_PARAMETER);
uint32_t size = 2;
commandBuffer[0] = writeCommand(MGMLIS3MDL::CTRL_REG1);
if (commandDataLen > 1) {
return INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS;
}
switch (*commandData) {
case (MGMLIS3MDL::ON): {
commandBuffer[1] = registers[0] | (1 << 7);
break;
}
case (MGMLIS3MDL::OFF): {
commandBuffer[1] = registers[0] & ~(1 << 7);
break;
}
default:
return INVALID_COMMAND_PARAMETER;
}
registers[0] = commandBuffer[1];
rawPacket = commandBuffer;
rawPacketLen = size;
return RETURN_OK;
}
ReturnValue_t MgmLIS3MDLHandler::setOperatingMode(const uint8_t *commandData,
size_t commandDataLen) {
triggerEvent(CHANGE_OF_SETUP_PARAMETER);
if (commandDataLen != 1) {
return INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS;
}
switch (commandData[0]) {
case MGMLIS3MDL::LOW:
registers[0] = (registers[0] & (~(1 << MGMLIS3MDL::OM1))) & (~(1 << MGMLIS3MDL::OM0));
registers[3] = (registers[3] & (~(1 << MGMLIS3MDL::OMZ1))) & (~(1 << MGMLIS3MDL::OMZ0));
break;
case MGMLIS3MDL::MEDIUM:
registers[0] = (registers[0] & (~(1 << MGMLIS3MDL::OM1))) | (1 << MGMLIS3MDL::OM0);
registers[3] = (registers[3] & (~(1 << MGMLIS3MDL::OMZ1))) | (1 << MGMLIS3MDL::OMZ0);
break;
case MGMLIS3MDL::HIGH:
registers[0] = (registers[0] | (1 << MGMLIS3MDL::OM1)) & (~(1 << MGMLIS3MDL::OM0));
registers[3] = (registers[3] | (1 << MGMLIS3MDL::OMZ1)) & (~(1 << MGMLIS3MDL::OMZ0));
break;
case MGMLIS3MDL::ULTRA:
registers[0] = (registers[0] | (1 << MGMLIS3MDL::OM1)) | (1 << MGMLIS3MDL::OM0);
registers[3] = (registers[3] | (1 << MGMLIS3MDL::OMZ1)) | (1 << MGMLIS3MDL::OMZ0);
break;
default:
break;
}
return prepareCtrlRegisterWrite();
}
void MgmLIS3MDLHandler::fillCommandAndReplyMap() {
insertInCommandAndReplyMap(MGMLIS3MDL::READ_CONFIG_AND_DATA, 1, &dataset);
insertInCommandAndReplyMap(MGMLIS3MDL::READ_TEMPERATURE, 1);
insertInCommandAndReplyMap(MGMLIS3MDL::SETUP_MGM, 1);
insertInCommandAndReplyMap(MGMLIS3MDL::IDENTIFY_DEVICE, 1);
insertInCommandAndReplyMap(MGMLIS3MDL::TEMP_SENSOR_ENABLE, 1);
insertInCommandAndReplyMap(MGMLIS3MDL::ACCURACY_OP_MODE_SET, 1);
}
void MgmLIS3MDLHandler::setToGoToNormalMode(bool enable) {
this->goToNormalMode = enable;
}
ReturnValue_t MgmLIS3MDLHandler::prepareCtrlRegisterWrite() {
commandBuffer[0] = writeCommand(MGMLIS3MDL::CTRL_REG1, true);
for (size_t i = 0; i < MGMLIS3MDL::NR_OF_CTRL_REGISTERS; i++) {
commandBuffer[i + 1] = registers[i];
}
rawPacket = commandBuffer;
rawPacketLen = MGMLIS3MDL::NR_OF_CTRL_REGISTERS + 1;
// We dont have to check if this is working because we just did i
return RETURN_OK;
}
void MgmLIS3MDLHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) {
}
uint32_t MgmLIS3MDLHandler::getTransitionDelayMs(Mode_t from, Mode_t to) {
return transitionDelay;
}
void MgmLIS3MDLHandler::modeChanged(void) {
internalState = InternalState::STATE_NONE;
}
ReturnValue_t MgmLIS3MDLHandler::initializeLocalDataPool(
localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) {
localDataPoolMap.emplace(MGMLIS3MDL::FIELD_STRENGTH_X,
new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(MGMLIS3MDL::FIELD_STRENGTH_Y,
new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(MGMLIS3MDL::FIELD_STRENGTH_Z,
new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(MGMLIS3MDL::TEMPERATURE_CELCIUS,
new PoolEntry<float>({0.0}));
return HasReturnvaluesIF::RETURN_OK;
}
void MgmLIS3MDLHandler::setAbsoluteLimits(float xLimit, float yLimit, float zLimit) {
this->absLimitX = xLimit;
this->absLimitY = yLimit;
this->absLimitZ = zLimit;
}

View File

@ -1,186 +0,0 @@
#ifndef MISSION_DEVICES_MGMLIS3MDLHANDLER_H_
#define MISSION_DEVICES_MGMLIS3MDLHANDLER_H_
#include "fsfw/FSFW.h"
#include "events/subsystemIdRanges.h"
#include "devicedefinitions/MgmLIS3HandlerDefs.h"
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
class PeriodicOperationDivider;
/**
* @brief Device handler object for the LIS3MDL 3-axis magnetometer
* by STMicroeletronics
* @details
* Datasheet can be found online by googling LIS3MDL.
* Flight manual:
* https://egit.irs.uni-stuttgart.de/redmine/projects/eive-flight-manual/wiki/LIS3MDL_MGM
* @author L. Loidold, R. Mueller
*/
class MgmLIS3MDLHandler: public DeviceHandlerBase {
public:
enum class CommunicationStep {
DATA,
TEMPERATURE
};
static const uint8_t INTERFACE_ID = CLASS_ID::MGM_LIS3MDL;
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::MGM_LIS3MDL;
//Notifies a command to change the setup parameters
static const Event CHANGE_OF_SETUP_PARAMETER = MAKE_EVENT(0, severity::LOW);
MgmLIS3MDLHandler(uint32_t objectId, object_id_t deviceCommunication, CookieIF* comCookie,
uint32_t transitionDelay);
virtual ~MgmLIS3MDLHandler();
/**
* Set the absolute limit for the values on the axis in microtesla. The dataset values will
* be marked as invalid if that limit is exceeded
* @param xLimit
* @param yLimit
* @param zLimit
*/
void setAbsoluteLimits(float xLimit, float yLimit, float zLimit);
void setToGoToNormalMode(bool enable);
protected:
/** DeviceHandlerBase overrides */
void doShutDown() override;
void doStartUp() override;
void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override;
virtual uint32_t getTransitionDelayMs(Mode_t from, Mode_t to) override;
ReturnValue_t buildCommandFromCommand(
DeviceCommandId_t deviceCommand, const uint8_t *commandData,
size_t commandDataLen) override;
ReturnValue_t buildTransitionDeviceCommand(
DeviceCommandId_t *id) override;
ReturnValue_t buildNormalDeviceCommand(
DeviceCommandId_t *id) override;
ReturnValue_t scanForReply(const uint8_t *start, size_t len,
DeviceCommandId_t *foundId, size_t *foundLen) override;
/**
* This implementation is tailored towards space applications and will flag values larger
* than 100 microtesla on X,Y and 150 microtesla on Z as invalid
* @param id
* @param packet
* @return
*/
virtual ReturnValue_t interpretDeviceReply(DeviceCommandId_t id,
const uint8_t *packet) override;
void fillCommandAndReplyMap() override;
void modeChanged(void) override;
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
LocalDataPoolManager &poolManager) override;
private:
MGMLIS3MDL::MgmPrimaryDataset dataset;
//Length a single command SPI answer
static const uint8_t SINGLE_COMMAND_ANSWER_LEN = 2;
uint32_t transitionDelay;
// Single SPI command has 2 bytes, first for adress, second for content
size_t singleComandSize = 2;
// Has the size for all adresses of the lis3mdl + the continous write bit
uint8_t commandBuffer[MGMLIS3MDL::NR_OF_DATA_AND_CFG_REGISTERS + 1];
float absLimitX = 100;
float absLimitY = 100;
float absLimitZ = 150;
/**
* We want to save the registers we set, so we dont have to read the
* registers when we want to change something.
* --> everytime we change set a register we have to save it
*/
uint8_t registers[MGMLIS3MDL::NR_OF_CTRL_REGISTERS];
uint8_t statusRegister = 0;
bool goToNormalMode = false;
enum class InternalState {
STATE_NONE,
STATE_FIRST_CONTACT,
STATE_SETUP,
STATE_CHECK_REGISTERS,
STATE_NORMAL
};
InternalState internalState = InternalState::STATE_NONE;
CommunicationStep communicationStep = CommunicationStep::DATA;
bool commandExecuted = false;
/*------------------------------------------------------------------------*/
/* Device specific commands and variables */
/*------------------------------------------------------------------------*/
/**
* Sets the read bit for the command
* @param single command to set the read-bit at
* @param boolean to select a continuous read bit, default = false
*/
uint8_t readCommand(uint8_t command, bool continuousCom = false);
/**
* Sets the write bit for the command
* @param single command to set the write-bit at
* @param boolean to select a continuous write bit, default = false
*/
uint8_t writeCommand(uint8_t command, bool continuousCom = false);
/**
* This Method gets the full scale for the measurement range
* e.g.: +- 4 gauss. See p.25 datasheet.
* @return The ReturnValue does not contain the sign of the value
*/
MGMLIS3MDL::Sensitivies getSensitivity(uint8_t ctrlReg2);
/**
* The 16 bit value needs to be multiplied with a sensitivity factor
* which depends on the sensitivity configuration
*
* @param sens Configured sensitivity of the LIS3 device
* @return Multiplication factor to get the sensor value from raw data.
*/
float getSensitivityFactor(MGMLIS3MDL::Sensitivies sens);
/**
* This Command detects the device ID
*/
ReturnValue_t identifyDevice();
virtual void setupMgm();
/*------------------------------------------------------------------------*/
/* Non normal commands */
/*------------------------------------------------------------------------*/
/**
* Enables/Disables the integrated Temperaturesensor
* @param commandData On or Off
* @param length of the commandData: has to be 1
*/
virtual ReturnValue_t enableTemperatureSensor(const uint8_t *commandData,
size_t commandDataLen);
/**
* Sets the accuracy of the measurement of the axis. The noise is changing.
* @param commandData LOW, MEDIUM, HIGH, ULTRA
* @param length of the command, has to be 1
*/
virtual ReturnValue_t setOperatingMode(const uint8_t *commandData,
size_t commandDataLen);
/**
* We always update all registers together, so this method updates
* the rawpacket and rawpacketLen, so we just manipulate the local
* saved register
*
*/
ReturnValue_t prepareCtrlRegisterWrite();
#if FSFW_HAL_LIS3MDL_MGM_DEBUG == 1
PeriodicOperationDivider* debugDivider;
#endif
};
#endif /* MISSION_DEVICES_MGMLIS3MDLHANDLER_H_ */

View File

@ -1,376 +0,0 @@
#include "MgmRM3100Handler.h"
#include "fsfw/datapool/PoolReadGuard.h"
#include "fsfw/globalfunctions/bitutility.h"
#include "fsfw/devicehandlers/DeviceHandlerMessage.h"
#include "fsfw/objectmanager/SystemObjectIF.h"
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
MgmRM3100Handler::MgmRM3100Handler(object_id_t objectId,
object_id_t deviceCommunication, CookieIF* comCookie, uint32_t transitionDelay):
DeviceHandlerBase(objectId, deviceCommunication, comCookie),
primaryDataset(this), transitionDelay(transitionDelay) {
#if FSFW_HAL_RM3100_MGM_DEBUG == 1
debugDivider = new PeriodicOperationDivider(3);
#endif
}
MgmRM3100Handler::~MgmRM3100Handler() {}
void MgmRM3100Handler::doStartUp() {
switch(internalState) {
case(InternalState::NONE): {
internalState = InternalState::CONFIGURE_CMM;
break;
}
case(InternalState::CONFIGURE_CMM): {
internalState = InternalState::READ_CMM;
break;
}
case(InternalState::READ_CMM): {
if(commandExecuted) {
internalState = InternalState::STATE_CONFIGURE_TMRC;
}
break;
}
case(InternalState::STATE_CONFIGURE_TMRC): {
if(commandExecuted) {
internalState = InternalState::STATE_READ_TMRC;
}
break;
}
case(InternalState::STATE_READ_TMRC): {
if(commandExecuted) {
internalState = InternalState::NORMAL;
if(goToNormalModeAtStartup) {
setMode(MODE_NORMAL);
}
else {
setMode(_MODE_TO_ON);
}
}
break;
}
default: {
break;
}
}
}
void MgmRM3100Handler::doShutDown() {
setMode(_MODE_POWER_DOWN);
}
ReturnValue_t MgmRM3100Handler::buildTransitionDeviceCommand(
DeviceCommandId_t *id) {
size_t commandLen = 0;
switch(internalState) {
case(InternalState::NONE):
case(InternalState::NORMAL): {
return NOTHING_TO_SEND;
}
case(InternalState::CONFIGURE_CMM): {
*id = RM3100::CONFIGURE_CMM;
break;
}
case(InternalState::READ_CMM): {
*id = RM3100::READ_CMM;
break;
}
case(InternalState::STATE_CONFIGURE_TMRC): {
commandBuffer[0] = RM3100::TMRC_DEFAULT_VALUE;
commandLen = 1;
*id = RM3100::CONFIGURE_TMRC;
break;
}
case(InternalState::STATE_READ_TMRC): {
*id = RM3100::READ_TMRC;
break;
}
default:
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
// Might be a configuration error
sif::warning << "MgmRM3100Handler::buildTransitionDeviceCommand: "
"Unknown internal state" << std::endl;
#else
sif::printWarning("MgmRM3100Handler::buildTransitionDeviceCommand: "
"Unknown internal state\n");
#endif
#endif
return HasReturnvaluesIF::RETURN_OK;
}
return buildCommandFromCommand(*id, commandBuffer, commandLen);
}
ReturnValue_t MgmRM3100Handler::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
const uint8_t *commandData, size_t commandDataLen) {
switch(deviceCommand) {
case(RM3100::CONFIGURE_CMM): {
commandBuffer[0] = RM3100::CMM_REGISTER;
commandBuffer[1] = RM3100::CMM_VALUE;
rawPacket = commandBuffer;
rawPacketLen = 2;
break;
}
case(RM3100::READ_CMM): {
commandBuffer[0] = RM3100::CMM_REGISTER | RM3100::READ_MASK;
commandBuffer[1] = 0;
rawPacket = commandBuffer;
rawPacketLen = 2;
break;
}
case(RM3100::CONFIGURE_TMRC): {
return handleTmrcConfigCommand(deviceCommand, commandData, commandDataLen);
}
case(RM3100::READ_TMRC): {
commandBuffer[0] = RM3100::TMRC_REGISTER | RM3100::READ_MASK;
commandBuffer[1] = 0;
rawPacket = commandBuffer;
rawPacketLen = 2;
break;
}
case(RM3100::CONFIGURE_CYCLE_COUNT): {
return handleCycleCountConfigCommand(deviceCommand, commandData, commandDataLen);
}
case(RM3100::READ_CYCLE_COUNT): {
commandBuffer[0] = RM3100::CYCLE_COUNT_START_REGISTER | RM3100::READ_MASK;
std::memset(commandBuffer + 1, 0, 6);
rawPacket = commandBuffer;
rawPacketLen = 7;
break;
}
case(RM3100::READ_DATA): {
commandBuffer[0] = RM3100::MEASUREMENT_REG_START | RM3100::READ_MASK;
std::memset(commandBuffer + 1, 0, 9);
rawPacketLen = 10;
break;
}
default:
return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
}
return RETURN_OK;
}
ReturnValue_t MgmRM3100Handler::buildNormalDeviceCommand(
DeviceCommandId_t *id) {
*id = RM3100::READ_DATA;
return buildCommandFromCommand(*id, nullptr, 0);
}
ReturnValue_t MgmRM3100Handler::scanForReply(const uint8_t *start,
size_t len, DeviceCommandId_t *foundId,
size_t *foundLen) {
// For SPI, ID will always be the one of the last sent command
*foundId = this->getPendingCommand();
*foundLen = len;
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t MgmRM3100Handler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
switch(id) {
case(RM3100::CONFIGURE_CMM):
case(RM3100::CONFIGURE_CYCLE_COUNT):
case(RM3100::CONFIGURE_TMRC): {
// We can only check whether write was successful with read operation
if(mode == _MODE_START_UP) {
commandExecuted = true;
}
break;
}
case(RM3100::READ_CMM): {
uint8_t cmmValue = packet[1];
// We clear the seventh bit in any case
// because this one is zero sometimes for some reason
bitutil::clear(&cmmValue, 6);
if(cmmValue == cmmRegValue and internalState == InternalState::READ_CMM) {
commandExecuted = true;
}
else {
// Attempt reconfiguration
internalState = InternalState::CONFIGURE_CMM;
return DeviceHandlerIF::DEVICE_REPLY_INVALID;
}
break;
}
case(RM3100::READ_TMRC): {
if(packet[1] == tmrcRegValue) {
commandExecuted = true;
// Reading TMRC was commanded. Trigger event to inform ground
if(mode != _MODE_START_UP) {
triggerEvent(tmrcSet, tmrcRegValue, 0);
}
}
else {
// Attempt reconfiguration
internalState = InternalState::STATE_CONFIGURE_TMRC;
return DeviceHandlerIF::DEVICE_REPLY_INVALID;
}
break;
}
case(RM3100::READ_CYCLE_COUNT): {
uint16_t cycleCountX = packet[1] << 8 | packet[2];
uint16_t cycleCountY = packet[3] << 8 | packet[4];
uint16_t cycleCountZ = packet[5] << 8 | packet[6];
if(cycleCountX != cycleCountRegValueX or cycleCountY != cycleCountRegValueY or
cycleCountZ != cycleCountRegValueZ) {
return DeviceHandlerIF::DEVICE_REPLY_INVALID;
}
// Reading TMRC was commanded. Trigger event to inform ground
if(mode != _MODE_START_UP) {
uint32_t eventParam1 = (cycleCountX << 16) | cycleCountY;
triggerEvent(cycleCountersSet, eventParam1, cycleCountZ);
}
break;
}
case(RM3100::READ_DATA): {
result = handleDataReadout(packet);
break;
}
default:
return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY;
}
return result;
}
ReturnValue_t MgmRM3100Handler::handleCycleCountConfigCommand(DeviceCommandId_t deviceCommand,
const uint8_t *commandData, size_t commandDataLen) {
if(commandData == nullptr) {
return DeviceHandlerIF::INVALID_COMMAND_PARAMETER;
}
// Set cycle count
if(commandDataLen == 2) {
handleCycleCommand(true, commandData, commandDataLen);
}
else if(commandDataLen == 6) {
handleCycleCommand(false, commandData, commandDataLen);
}
else {
return DeviceHandlerIF::INVALID_COMMAND_PARAMETER;
}
commandBuffer[0] = RM3100::CYCLE_COUNT_VALUE;
std::memcpy(commandBuffer + 1, &cycleCountRegValueX, 2);
std::memcpy(commandBuffer + 3, &cycleCountRegValueY, 2);
std::memcpy(commandBuffer + 5, &cycleCountRegValueZ, 2);
rawPacketLen = 7;
rawPacket = commandBuffer;
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t MgmRM3100Handler::handleCycleCommand(bool oneCycleValue,
const uint8_t *commandData, size_t commandDataLen) {
RM3100::CycleCountCommand command(oneCycleValue);
ReturnValue_t result = command.deSerialize(&commandData, &commandDataLen,
SerializeIF::Endianness::BIG);
if(result != HasReturnvaluesIF::RETURN_OK) {
return result;
}
// Data sheet p.30 "while noise limits the useful upper range to ~400 cycle counts."
if(command.cycleCountX > 450 ) {
return DeviceHandlerIF::INVALID_COMMAND_PARAMETER;
}
if(not oneCycleValue and (command.cycleCountY > 450 or command.cycleCountZ > 450)) {
return DeviceHandlerIF::INVALID_COMMAND_PARAMETER;
}
cycleCountRegValueX = command.cycleCountX;
cycleCountRegValueY = command.cycleCountY;
cycleCountRegValueZ = command.cycleCountZ;
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t MgmRM3100Handler::handleTmrcConfigCommand(DeviceCommandId_t deviceCommand,
const uint8_t *commandData, size_t commandDataLen) {
if(commandData == nullptr or commandDataLen != 1) {
return DeviceHandlerIF::INVALID_COMMAND_PARAMETER;
}
commandBuffer[0] = RM3100::TMRC_REGISTER;
commandBuffer[1] = commandData[0];
tmrcRegValue = commandData[0];
rawPacketLen = 2;
rawPacket = commandBuffer;
return HasReturnvaluesIF::RETURN_OK;
}
void MgmRM3100Handler::fillCommandAndReplyMap() {
insertInCommandAndReplyMap(RM3100::CONFIGURE_CMM, 3);
insertInCommandAndReplyMap(RM3100::READ_CMM, 3);
insertInCommandAndReplyMap(RM3100::CONFIGURE_TMRC, 3);
insertInCommandAndReplyMap(RM3100::READ_TMRC, 3);
insertInCommandAndReplyMap(RM3100::CONFIGURE_CYCLE_COUNT, 3);
insertInCommandAndReplyMap(RM3100::READ_CYCLE_COUNT, 3);
insertInCommandAndReplyMap(RM3100::READ_DATA, 3, &primaryDataset);
}
void MgmRM3100Handler::modeChanged(void) {
internalState = InternalState::NONE;
}
ReturnValue_t MgmRM3100Handler::initializeLocalDataPool(
localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) {
localDataPoolMap.emplace(RM3100::FIELD_STRENGTH_X, new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(RM3100::FIELD_STRENGTH_Y, new PoolEntry<float>({0.0}));
localDataPoolMap.emplace(RM3100::FIELD_STRENGTH_Z, new PoolEntry<float>({0.0}));
return HasReturnvaluesIF::RETURN_OK;
}
uint32_t MgmRM3100Handler::getTransitionDelayMs(Mode_t from, Mode_t to) {
return this->transitionDelay;
}
void MgmRM3100Handler::setToGoToNormalMode(bool enable) {
goToNormalModeAtStartup = enable;
}
ReturnValue_t MgmRM3100Handler::handleDataReadout(const uint8_t *packet) {
// Analyze data here. The sensor generates 24 bit signed values so we need to do some bitshift
// trickery here to calculate the raw values first
int32_t fieldStrengthRawX = ((packet[1] << 24) | (packet[2] << 16) | (packet[3] << 8)) >> 8;
int32_t fieldStrengthRawY = ((packet[4] << 24) | (packet[5] << 16) | (packet[6] << 8)) >> 8;
int32_t fieldStrengthRawZ = ((packet[7] << 24) | (packet[8] << 16) | (packet[3] << 8)) >> 8;
// Now scale to physical value in microtesla
float fieldStrengthX = fieldStrengthRawX * scaleFactorX;
float fieldStrengthY = fieldStrengthRawY * scaleFactorX;
float fieldStrengthZ = fieldStrengthRawZ * scaleFactorX;
#if FSFW_HAL_RM3100_MGM_DEBUG == 1
if(debugDivider->checkAndIncrement()) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "MgmRM3100Handler: Magnetic field strength in"
" microtesla:" << std::endl;
sif::info << "X: " << fieldStrengthX << " uT" << std::endl;
sif::info << "Y: " << fieldStrengthY << " uT" << std::endl;
sif::info << "Z: " << fieldStrengthZ << " uT" << std::endl;
#else
sif::printInfo("MgmRM3100Handler: Magnetic field strength in microtesla:\n");
sif::printInfo("X: %f uT\n", fieldStrengthX);
sif::printInfo("Y: %f uT\n", fieldStrengthY);
sif::printInfo("Z: %f uT\n", fieldStrengthZ);
#endif
}
#endif
// TODO: Sanity check on values?
PoolReadGuard readGuard(&primaryDataset);
if(readGuard.getReadResult() == HasReturnvaluesIF::RETURN_OK) {
primaryDataset.fieldStrengthX = fieldStrengthX;
primaryDataset.fieldStrengthY = fieldStrengthY;
primaryDataset.fieldStrengthZ = fieldStrengthZ;
primaryDataset.setValidity(true, true);
}
return RETURN_OK;
}

View File

@ -1,110 +0,0 @@
#ifndef MISSION_DEVICES_MGMRM3100HANDLER_H_
#define MISSION_DEVICES_MGMRM3100HANDLER_H_
#include "fsfw/FSFW.h"
#include "devicedefinitions/MgmRM3100HandlerDefs.h"
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
#if FSFW_HAL_RM3100_MGM_DEBUG == 1
#include "fsfw/globalfunctions/PeriodicOperationDivider.h"
#endif
/**
* @brief Device Handler for the RM3100 geomagnetic magnetometer sensor
* (https://www.pnicorp.com/rm3100/)
* @details
* Flight manual:
* https://egit.irs.uni-stuttgart.de/redmine/projects/eive-flight-manual/wiki/RM3100_MGM
*/
class MgmRM3100Handler: public DeviceHandlerBase {
public:
static const uint8_t INTERFACE_ID = CLASS_ID::MGM_RM3100;
//! [EXPORT] : [COMMENT] P1: TMRC value which was set, P2: 0
static constexpr Event tmrcSet = event::makeEvent(SUBSYSTEM_ID::MGM_RM3100,
0x00, severity::INFO);
//! [EXPORT] : [COMMENT] Cycle counter set. P1: First two bytes new Cycle Count X
//! P1: Second two bytes new Cycle Count Y
//! P2: New cycle count Z
static constexpr Event cycleCountersSet = event::makeEvent(
SUBSYSTEM_ID::MGM_RM3100, 0x01, severity::INFO);
MgmRM3100Handler(object_id_t objectId, object_id_t deviceCommunication,
CookieIF* comCookie, uint32_t transitionDelay);
virtual ~MgmRM3100Handler();
/**
* Configure device handler to go to normal mode after startup immediately
* @param enable
*/
void setToGoToNormalMode(bool enable);
protected:
/* DeviceHandlerBase overrides */
ReturnValue_t buildTransitionDeviceCommand(
DeviceCommandId_t *id) override;
void doStartUp() override;
void doShutDown() override;
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override;
ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand,
const uint8_t *commandData, size_t commandDataLen) override;
ReturnValue_t scanForReply(const uint8_t *start, size_t len,
DeviceCommandId_t *foundId, size_t *foundLen) override;
ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override;
void fillCommandAndReplyMap() override;
void modeChanged(void) override;
virtual uint32_t getTransitionDelayMs(Mode_t from, Mode_t to) override;
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
LocalDataPoolManager &poolManager) override;
private:
enum class InternalState {
NONE,
CONFIGURE_CMM,
READ_CMM,
// The cycle count states are propably not going to be used because
// the default cycle count will be used.
STATE_CONFIGURE_CYCLE_COUNT,
STATE_READ_CYCLE_COUNT,
STATE_CONFIGURE_TMRC,
STATE_READ_TMRC,
NORMAL
};
InternalState internalState = InternalState::NONE;
bool commandExecuted = false;
RM3100::Rm3100PrimaryDataset primaryDataset;
uint8_t commandBuffer[10];
uint8_t commandBufferLen = 0;
uint8_t cmmRegValue = RM3100::CMM_VALUE;
uint8_t tmrcRegValue = RM3100::TMRC_DEFAULT_VALUE;
uint16_t cycleCountRegValueX = RM3100::CYCLE_COUNT_VALUE;
uint16_t cycleCountRegValueY = RM3100::CYCLE_COUNT_VALUE;
uint16_t cycleCountRegValueZ = RM3100::CYCLE_COUNT_VALUE;
float scaleFactorX = 1.0 / RM3100::DEFAULT_GAIN;
float scaleFactorY = 1.0 / RM3100::DEFAULT_GAIN;
float scaleFactorZ = 1.0 / RM3100::DEFAULT_GAIN;
bool goToNormalModeAtStartup = false;
uint32_t transitionDelay;
ReturnValue_t handleCycleCountConfigCommand(DeviceCommandId_t deviceCommand,
const uint8_t *commandData,size_t commandDataLen);
ReturnValue_t handleCycleCommand(bool oneCycleValue,
const uint8_t *commandData, size_t commandDataLen);
ReturnValue_t handleTmrcConfigCommand(DeviceCommandId_t deviceCommand,
const uint8_t *commandData,size_t commandDataLen);
ReturnValue_t handleDataReadout(const uint8_t* packet);
#if FSFW_HAL_RM3100_MGM_DEBUG == 1
PeriodicOperationDivider* debugDivider;
#endif
};
#endif /* MISSION_DEVICEHANDLING_MGMRM3100HANDLER_H_ */

View File

@ -1 +0,0 @@

View File

@ -1,13 +0,0 @@
if(FSFW_HAL_ADD_RASPBERRY_PI)
add_subdirectory(rpi)
endif()
target_sources(${LIB_FSFW_NAME} PRIVATE
UnixFileGuard.cpp
utility.cpp
)
add_subdirectory(gpio)
add_subdirectory(spi)
add_subdirectory(i2c)
add_subdirectory(uart)

View File

@ -1,37 +0,0 @@
#include "fsfw/FSFW.h"
#include "fsfw/serviceinterface.h"
#include "fsfw_hal/linux/UnixFileGuard.h"
#include <cerrno>
#include <cstring>
UnixFileGuard::UnixFileGuard(std::string device, int* fileDescriptor, int flags,
std::string diagnosticPrefix):
fileDescriptor(fileDescriptor) {
if(fileDescriptor == nullptr) {
return;
}
*fileDescriptor = open(device.c_str(), flags);
if (*fileDescriptor < 0) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << diagnosticPrefix << ": Opening device failed with error code " <<
errno << ": " << strerror(errno) << std::endl;
#else
sif::printWarning("%s: Opening device failed with error code %d: %s\n",
diagnosticPrefix, errno, strerror(errno));
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
openStatus = OPEN_FILE_FAILED;
}
}
UnixFileGuard::~UnixFileGuard() {
if(fileDescriptor != nullptr) {
close(*fileDescriptor);
}
}
ReturnValue_t UnixFileGuard::getOpenResult() const {
return openStatus;
}

View File

@ -1,33 +0,0 @@
#ifndef LINUX_UTILITY_UNIXFILEGUARD_H_
#define LINUX_UTILITY_UNIXFILEGUARD_H_
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <string>
#include <fcntl.h>
#include <unistd.h>
class UnixFileGuard {
public:
static constexpr int READ_WRITE_FLAG = O_RDWR;
static constexpr int READ_ONLY_FLAG = O_RDONLY;
static constexpr int NON_BLOCKING_IO_FLAG = O_NONBLOCK;
static constexpr ReturnValue_t OPEN_FILE_FAILED = 1;
UnixFileGuard(std::string device, int* fileDescriptor, int flags,
std::string diagnosticPrefix = "");
virtual~ UnixFileGuard();
ReturnValue_t getOpenResult() const;
private:
int* fileDescriptor = nullptr;
ReturnValue_t openStatus = HasReturnvaluesIF::RETURN_OK;
};
#endif /* LINUX_UTILITY_UNIXFILEGUARD_H_ */

View File

@ -1,12 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
LinuxLibgpioIF.cpp
)
# This abstraction layer requires the gpiod library. You can install this library
# with "sudo apt-get install -y libgpiod-dev". If you are cross-compiling, you need
# to install the package before syncing the sysroot to your host computer.
find_library(LIB_GPIO gpiod REQUIRED)
target_link_libraries(${LIB_FSFW_NAME} PRIVATE
${LIB_GPIO}
)

View File

@ -1,442 +0,0 @@
#include "LinuxLibgpioIF.h"
#include "fsfw_hal/common/gpio/gpioDefinitions.h"
#include "fsfw_hal/common/gpio/GpioCookie.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
#include <utility>
#include <unistd.h>
#include <gpiod.h>
LinuxLibgpioIF::LinuxLibgpioIF(object_id_t objectId) : SystemObject(objectId) {
}
LinuxLibgpioIF::~LinuxLibgpioIF() {
for(auto& config: gpioMap) {
delete(config.second);
}
}
ReturnValue_t LinuxLibgpioIF::addGpios(GpioCookie* gpioCookie) {
ReturnValue_t result;
if(gpioCookie == nullptr) {
sif::error << "LinuxLibgpioIF::addGpios: Invalid cookie" << std::endl;
return RETURN_FAILED;
}
GpioMap mapToAdd = gpioCookie->getGpioMap();
/* Check whether this ID already exists in the map and remove duplicates */
result = checkForConflicts(mapToAdd);
if (result != RETURN_OK){
return result;
}
result = configureGpios(mapToAdd);
if (result != RETURN_OK) {
return RETURN_FAILED;
}
/* Register new GPIOs in gpioMap */
gpioMap.insert(mapToAdd.begin(), mapToAdd.end());
return RETURN_OK;
}
ReturnValue_t LinuxLibgpioIF::configureGpios(GpioMap& mapToAdd) {
for(auto& gpioConfig: mapToAdd) {
auto& gpioType = gpioConfig.second->gpioType;
switch(gpioType) {
case(gpio::GpioTypes::NONE): {
return GPIO_INVALID_INSTANCE;
}
case(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP): {
auto regularGpio = dynamic_cast<GpiodRegularByChip*>(gpioConfig.second);
if(regularGpio == nullptr) {
return GPIO_INVALID_INSTANCE;
}
configureGpioByChip(gpioConfig.first, *regularGpio);
break;
}
case(gpio::GpioTypes::GPIO_REGULAR_BY_LABEL):{
auto regularGpio = dynamic_cast<GpiodRegularByLabel*>(gpioConfig.second);
if(regularGpio == nullptr) {
return GPIO_INVALID_INSTANCE;
}
configureGpioByLabel(gpioConfig.first, *regularGpio);
break;
}
case(gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME):{
auto regularGpio = dynamic_cast<GpiodRegularByLineName*>(gpioConfig.second);
if(regularGpio == nullptr) {
return GPIO_INVALID_INSTANCE;
}
configureGpioByLineName(gpioConfig.first, *regularGpio);
break;
}
case(gpio::GpioTypes::CALLBACK): {
auto gpioCallback = dynamic_cast<GpioCallback*>(gpioConfig.second);
if(gpioCallback->callback == nullptr) {
return GPIO_INVALID_INSTANCE;
}
gpioCallback->callback(gpioConfig.first, gpio::GpioOperation::WRITE,
gpioCallback->initValue, gpioCallback->callbackArgs);
}
}
}
return RETURN_OK;
}
ReturnValue_t LinuxLibgpioIF::configureGpioByLabel(gpioId_t gpioId,
GpiodRegularByLabel &gpioByLabel) {
std::string& label = gpioByLabel.label;
struct gpiod_chip* chip = gpiod_chip_open_by_label(label.c_str());
if (chip == nullptr) {
sif::warning << "LinuxLibgpioIF::configureGpioByLabel: Failed to open gpio from gpio "
<< "group with label " << label << ". Gpio ID: " << gpioId << std::endl;
return RETURN_FAILED;
}
std::string failOutput = "label: " + label;
return configureRegularGpio(gpioId, chip, gpioByLabel, failOutput);
}
ReturnValue_t LinuxLibgpioIF::configureGpioByChip(gpioId_t gpioId,
GpiodRegularByChip &gpioByChip) {
std::string& chipname = gpioByChip.chipname;
struct gpiod_chip* chip = gpiod_chip_open_by_name(chipname.c_str());
if (chip == nullptr) {
sif::warning << "LinuxLibgpioIF::configureGpioByChip: Failed to open chip "
<< chipname << ". Gpio ID: " << gpioId << std::endl;
return RETURN_FAILED;
}
std::string failOutput = "chipname: " + chipname;
return configureRegularGpio(gpioId, chip, gpioByChip, failOutput);
}
ReturnValue_t LinuxLibgpioIF::configureGpioByLineName(gpioId_t gpioId,
GpiodRegularByLineName &gpioByLineName) {
std::string& lineName = gpioByLineName.lineName;
char chipname[MAX_CHIPNAME_LENGTH];
unsigned int lineOffset;
int result = gpiod_ctxless_find_line(lineName.c_str(), chipname, MAX_CHIPNAME_LENGTH,
&lineOffset);
if (result != LINE_FOUND) {
parseFindeLineResult(result, lineName);
return RETURN_FAILED;
}
gpioByLineName.lineNum = static_cast<int>(lineOffset);
struct gpiod_chip* chip = gpiod_chip_open_by_name(chipname);
if (chip == nullptr) {
sif::warning << "LinuxLibgpioIF::configureGpioByLineName: Failed to open chip "
<< chipname << ". <Gpio ID: " << gpioId << std::endl;
return RETURN_FAILED;
}
std::string failOutput = "line name: " + lineName;
return configureRegularGpio(gpioId, chip, gpioByLineName, failOutput);
}
ReturnValue_t LinuxLibgpioIF::configureRegularGpio(gpioId_t gpioId, struct gpiod_chip* chip,
GpiodRegularBase& regularGpio, std::string failOutput) {
unsigned int lineNum;
gpio::Direction direction;
std::string consumer;
struct gpiod_line *lineHandle;
int result = 0;
lineNum = regularGpio.lineNum;
lineHandle = gpiod_chip_get_line(chip, lineNum);
if (!lineHandle) {
sif::warning << "LinuxLibgpioIF::configureRegularGpio: Failed to open line " << std::endl;
sif::warning << "GPIO ID: " << gpioId << ", line number: " << lineNum <<
", " << failOutput << std::endl;
sif::warning << "Check if Linux GPIO configuration has changed. " << std::endl;
gpiod_chip_close(chip);
return RETURN_FAILED;
}
direction = regularGpio.direction;
consumer = regularGpio.consumer;
/* Configure direction and add a description to the GPIO */
switch (direction) {
case(gpio::OUT): {
result = gpiod_line_request_output(lineHandle, consumer.c_str(),
regularGpio.initValue);
break;
}
case(gpio::IN): {
result = gpiod_line_request_input(lineHandle, consumer.c_str());
break;
}
default: {
sif::error << "LinuxLibgpioIF::configureGpios: Invalid direction specified"
<< std::endl;
return GPIO_INVALID_INSTANCE;
}
if (result < 0) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "LinuxLibgpioIF::configureRegularGpio: Failed to request line " <<
lineNum << " from GPIO instance with ID: " << gpioId << std::endl;
#else
sif::printError("LinuxLibgpioIF::configureRegularGpio: "
"Failed to request line %d from GPIO instance with ID: %d\n", lineNum, gpioId);
#endif
gpiod_line_release(lineHandle);
return RETURN_FAILED;
}
}
/**
* Write line handle to GPIO configuration instance so it can later be used to set or
* read states of GPIOs.
*/
regularGpio.lineHandle = lineHandle;
return RETURN_OK;
}
ReturnValue_t LinuxLibgpioIF::pullHigh(gpioId_t gpioId) {
gpioMapIter = gpioMap.find(gpioId);
if (gpioMapIter == gpioMap.end()) {
sif::warning << "LinuxLibgpioIF::pullHigh: Unknown GPIO ID " << gpioId << std::endl;
return UNKNOWN_GPIO_ID;
}
auto gpioType = gpioMapIter->second->gpioType;
if (gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_CHIP
or gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_LABEL
or gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME) {
auto regularGpio = dynamic_cast<GpiodRegularBase*>(gpioMapIter->second);
if(regularGpio == nullptr) {
return GPIO_TYPE_FAILURE;
}
return driveGpio(gpioId, *regularGpio, gpio::HIGH);
}
else {
auto gpioCallback = dynamic_cast<GpioCallback*>(gpioMapIter->second);
if(gpioCallback->callback == nullptr) {
return GPIO_INVALID_INSTANCE;
}
gpioCallback->callback(gpioMapIter->first, gpio::GpioOperation::WRITE,
gpio::Levels::HIGH, gpioCallback->callbackArgs);
return RETURN_OK;
}
return GPIO_TYPE_FAILURE;
}
ReturnValue_t LinuxLibgpioIF::pullLow(gpioId_t gpioId) {
gpioMapIter = gpioMap.find(gpioId);
if (gpioMapIter == gpioMap.end()) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LinuxLibgpioIF::pullLow: Unknown GPIO ID " << gpioId << std::endl;
#else
sif::printWarning("LinuxLibgpioIF::pullLow: Unknown GPIO ID %d\n", gpioId);
#endif
return UNKNOWN_GPIO_ID;
}
auto& gpioType = gpioMapIter->second->gpioType;
if (gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_CHIP
or gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_LABEL
or gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME) {
auto regularGpio = dynamic_cast<GpiodRegularBase*>(gpioMapIter->second);
if(regularGpio == nullptr) {
return GPIO_TYPE_FAILURE;
}
return driveGpio(gpioId, *regularGpio, gpio::LOW);
}
else {
auto gpioCallback = dynamic_cast<GpioCallback*>(gpioMapIter->second);
if(gpioCallback->callback == nullptr) {
return GPIO_INVALID_INSTANCE;
}
gpioCallback->callback(gpioMapIter->first, gpio::GpioOperation::WRITE,
gpio::Levels::LOW, gpioCallback->callbackArgs);
return RETURN_OK;
}
return GPIO_TYPE_FAILURE;
}
ReturnValue_t LinuxLibgpioIF::driveGpio(gpioId_t gpioId,
GpiodRegularBase& regularGpio, gpio::Levels logicLevel) {
int result = gpiod_line_set_value(regularGpio.lineHandle, logicLevel);
if (result < 0) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LinuxLibgpioIF::driveGpio: Failed to pull GPIO with ID " << gpioId <<
" to logic level " << logicLevel << std::endl;
#else
sif::printWarning("LinuxLibgpioIF::driveGpio: Failed to pull GPIO with ID %d to "
"logic level %d\n", gpioId, logicLevel);
#endif
return DRIVE_GPIO_FAILURE;
}
return RETURN_OK;
}
ReturnValue_t LinuxLibgpioIF::readGpio(gpioId_t gpioId, int* gpioState) {
gpioMapIter = gpioMap.find(gpioId);
if (gpioMapIter == gpioMap.end()){
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LinuxLibgpioIF::readGpio: Unknown GPIOD ID " << gpioId << std::endl;
#else
sif::printWarning("LinuxLibgpioIF::readGpio: Unknown GPIOD ID %d\n", gpioId);
#endif
return UNKNOWN_GPIO_ID;
}
auto gpioType = gpioMapIter->second->gpioType;
if (gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_CHIP
or gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_LABEL
or gpioType == gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME) {
auto regularGpio = dynamic_cast<GpiodRegularBase*>(gpioMapIter->second);
if(regularGpio == nullptr) {
return GPIO_TYPE_FAILURE;
}
*gpioState = gpiod_line_get_value(regularGpio->lineHandle);
}
else {
auto gpioCallback = dynamic_cast<GpioCallback*>(gpioMapIter->second);
if(gpioCallback->callback == nullptr) {
return GPIO_INVALID_INSTANCE;
}
gpioCallback->callback(gpioMapIter->first, gpio::GpioOperation::READ,
gpio::Levels::NONE, gpioCallback->callbackArgs);
return RETURN_OK;
}
return RETURN_OK;
}
ReturnValue_t LinuxLibgpioIF::checkForConflicts(GpioMap& mapToAdd){
ReturnValue_t status = HasReturnvaluesIF::RETURN_OK;
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
for(auto& gpioConfig: mapToAdd) {
switch(gpioConfig.second->gpioType) {
case(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP):
case(gpio::GpioTypes::GPIO_REGULAR_BY_LABEL):
case(gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME): {
auto regularGpio = dynamic_cast<GpiodRegularBase*>(gpioConfig.second);
if(regularGpio == nullptr) {
return GPIO_TYPE_FAILURE;
}
// Check for conflicts and remove duplicates if necessary
result = checkForConflictsById(gpioConfig.first, gpioConfig.second->gpioType, mapToAdd);
if(result != HasReturnvaluesIF::RETURN_OK) {
status = result;
}
break;
}
case(gpio::GpioTypes::CALLBACK): {
auto callbackGpio = dynamic_cast<GpioCallback*>(gpioConfig.second);
if(callbackGpio == nullptr) {
return GPIO_TYPE_FAILURE;
}
// Check for conflicts and remove duplicates if necessary
result = checkForConflictsById(gpioConfig.first,
gpioConfig.second->gpioType, mapToAdd);
if(result != HasReturnvaluesIF::RETURN_OK) {
status = result;
}
break;
}
default: {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "Invalid GPIO type detected for GPIO ID " << gpioConfig.first
<< std::endl;
#else
sif::printWarning("Invalid GPIO type detected for GPIO ID %d\n", gpioConfig.first);
#endif
status = GPIO_TYPE_FAILURE;
}
}
}
return status;
}
ReturnValue_t LinuxLibgpioIF::checkForConflictsById(gpioId_t gpioIdToCheck,
gpio::GpioTypes expectedType, GpioMap& mapToAdd) {
// Cross check with private map
gpioMapIter = gpioMap.find(gpioIdToCheck);
if(gpioMapIter != gpioMap.end()) {
auto& gpioType = gpioMapIter->second->gpioType;
bool eraseDuplicateDifferentType = false;
switch(expectedType) {
case(gpio::GpioTypes::NONE): {
break;
}
case(gpio::GpioTypes::GPIO_REGULAR_BY_CHIP):
case(gpio::GpioTypes::GPIO_REGULAR_BY_LABEL):
case(gpio::GpioTypes::GPIO_REGULAR_BY_LINE_NAME): {
if(gpioType == gpio::GpioTypes::NONE or gpioType == gpio::GpioTypes::CALLBACK) {
eraseDuplicateDifferentType = true;
}
break;
}
case(gpio::GpioTypes::CALLBACK): {
if(gpioType != gpio::GpioTypes::CALLBACK) {
eraseDuplicateDifferentType = true;
}
}
}
if(eraseDuplicateDifferentType) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LinuxLibgpioIF::checkForConflicts: ID already exists for "
"different GPIO type " << gpioIdToCheck <<
". Removing duplicate from map to add" << std::endl;
#else
sif::printWarning("LinuxLibgpioIF::checkForConflicts: ID already exists for "
"different GPIO type %d. Removing duplicate from map to add\n", gpioIdToCheck);
#endif
mapToAdd.erase(gpioIdToCheck);
return GPIO_DUPLICATE_DETECTED;
}
// Remove element from map to add because a entry for this GPIO already exists
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LinuxLibgpioIF::checkForConflictsRegularGpio: Duplicate GPIO "
"definition with ID " << gpioIdToCheck << " detected. " <<
"Duplicate will be removed from map to add" << std::endl;
#else
sif::printWarning("LinuxLibgpioIF::checkForConflictsRegularGpio: Duplicate GPIO definition "
"with ID %d detected. Duplicate will be removed from map to add\n", gpioIdToCheck);
#endif
mapToAdd.erase(gpioIdToCheck);
return GPIO_DUPLICATE_DETECTED;
}
return HasReturnvaluesIF::RETURN_OK;
}
void LinuxLibgpioIF::parseFindeLineResult(int result, std::string& lineName) {
switch (result) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
case LINE_NOT_EXISTS:
case LINE_ERROR: {
sif::warning << "LinuxLibgpioIF::parseFindeLineResult: Line with name " << lineName <<
" does not exist" << std::endl;
break;
}
default: {
sif::warning << "LinuxLibgpioIF::parseFindeLineResult: Unknown return code for line "
"with name " << lineName << std::endl;
break;
}
#else
case LINE_NOT_EXISTS:
case LINE_ERROR: {
sif::printWarning("LinuxLibgpioIF::parseFindeLineResult: Line with name %s "
"does not exist\n", lineName);
break;
}
default: {
sif::printWarning("LinuxLibgpioIF::parseFindeLineResult: Unknown return code for line "
"with name %s\n", lineName);
break;
}
#endif
}
}

View File

@ -1,91 +0,0 @@
#ifndef LINUX_GPIO_LINUXLIBGPIOIF_H_
#define LINUX_GPIO_LINUXLIBGPIOIF_H_
#include "fsfw/returnvalues/FwClassIds.h"
#include "fsfw_hal/common/gpio/GpioIF.h"
#include "fsfw/objectmanager/SystemObject.h"
class GpioCookie;
class GpiodRegularIF;
/**
* @brief This class implements the GpioIF for a linux based system.
* @details
* This implementation is based on the libgpiod lib which requires Linux 4.8 or higher.
* @note
* The Petalinux SDK from Xilinx supports libgpiod since Petalinux 2019.1.
*/
class LinuxLibgpioIF : public GpioIF, public SystemObject {
public:
static const uint8_t gpioRetvalId = CLASS_ID::HAL_GPIO;
static constexpr ReturnValue_t UNKNOWN_GPIO_ID =
HasReturnvaluesIF::makeReturnCode(gpioRetvalId, 1);
static constexpr ReturnValue_t DRIVE_GPIO_FAILURE =
HasReturnvaluesIF::makeReturnCode(gpioRetvalId, 2);
static constexpr ReturnValue_t GPIO_TYPE_FAILURE =
HasReturnvaluesIF::makeReturnCode(gpioRetvalId, 3);
static constexpr ReturnValue_t GPIO_INVALID_INSTANCE =
HasReturnvaluesIF::makeReturnCode(gpioRetvalId, 4);
static constexpr ReturnValue_t GPIO_DUPLICATE_DETECTED =
HasReturnvaluesIF::makeReturnCode(gpioRetvalId, 5);
LinuxLibgpioIF(object_id_t objectId);
virtual ~LinuxLibgpioIF();
ReturnValue_t addGpios(GpioCookie* gpioCookie) override;
ReturnValue_t pullHigh(gpioId_t gpioId) override;
ReturnValue_t pullLow(gpioId_t gpioId) override;
ReturnValue_t readGpio(gpioId_t gpioId, int* gpioState) override;
private:
static const size_t MAX_CHIPNAME_LENGTH = 11;
static const int LINE_NOT_EXISTS = 0;
static const int LINE_ERROR = -1;
static const int LINE_FOUND = 1;
// Holds the information and configuration of all used GPIOs
GpioUnorderedMap gpioMap;
GpioUnorderedMapIter gpioMapIter;
/**
* @brief This functions drives line of a GPIO specified by the GPIO ID.
*
* @param gpioId The GPIO ID of the GPIO to drive.
* @param logiclevel The logic level to set. O or 1.
*/
ReturnValue_t driveGpio(gpioId_t gpioId, GpiodRegularBase& regularGpio,
gpio::Levels logicLevel);
ReturnValue_t configureGpioByLabel(gpioId_t gpioId, GpiodRegularByLabel& gpioByLabel);
ReturnValue_t configureGpioByChip(gpioId_t gpioId, GpiodRegularByChip& gpioByChip);
ReturnValue_t configureGpioByLineName(gpioId_t gpioId,
GpiodRegularByLineName &gpioByLineName);
ReturnValue_t configureRegularGpio(gpioId_t gpioId, struct gpiod_chip* chip,
GpiodRegularBase& regularGpio, std::string failOutput);
/**
* @brief This function checks if GPIOs are already registered and whether
* there exists a conflict in the GPIO configuration. E.g. the
* direction.
*
* @param mapToAdd The GPIOs which shall be added to the gpioMap.
*
* @return RETURN_OK if successful, otherwise RETURN_FAILED
*/
ReturnValue_t checkForConflicts(GpioMap& mapToAdd);
ReturnValue_t checkForConflictsById(gpioId_t gpiodId, gpio::GpioTypes type,
GpioMap& mapToAdd);
/**
* @brief Performs the initial configuration of all GPIOs specified in the GpioMap mapToAdd.
*/
ReturnValue_t configureGpios(GpioMap& mapToAdd);
void parseFindeLineResult(int result, std::string& lineName);
};
#endif /* LINUX_GPIO_LINUXLIBGPIOIF_H_ */

View File

@ -1,8 +0,0 @@
target_sources(${LIB_FSFW_NAME} PUBLIC
I2cComIF.cpp
I2cCookie.cpp
)

View File

@ -1,205 +0,0 @@
#include "fsfw_hal/linux/i2c/I2cComIF.h"
#include "fsfw_hal/linux/utility.h"
#include "fsfw_hal/linux/UnixFileGuard.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#include <errno.h>
#include <cstring>
I2cComIF::I2cComIF(object_id_t objectId): SystemObject(objectId){
}
I2cComIF::~I2cComIF() {}
ReturnValue_t I2cComIF::initializeInterface(CookieIF* cookie) {
address_t i2cAddress;
std::string deviceFile;
if(cookie == nullptr) {
sif::error << "I2cComIF::initializeInterface: Invalid cookie!" << std::endl;
return NULLPOINTER;
}
I2cCookie* i2cCookie = dynamic_cast<I2cCookie*>(cookie);
if(i2cCookie == nullptr) {
sif::error << "I2cComIF::initializeInterface: Invalid I2C cookie!" << std::endl;
return NULLPOINTER;
}
i2cAddress = i2cCookie->getAddress();
i2cDeviceMapIter = i2cDeviceMap.find(i2cAddress);
if(i2cDeviceMapIter == i2cDeviceMap.end()) {
size_t maxReplyLen = i2cCookie->getMaxReplyLen();
I2cInstance i2cInstance = {std::vector<uint8_t>(maxReplyLen), 0};
auto statusPair = i2cDeviceMap.emplace(i2cAddress, i2cInstance);
if (not statusPair.second) {
sif::error << "I2cComIF::initializeInterface: Failed to insert device with address " <<
i2cAddress << "to I2C device " << "map" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
return HasReturnvaluesIF::RETURN_OK;
}
sif::error << "I2cComIF::initializeInterface: Device with address " << i2cAddress <<
"already in use" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
ReturnValue_t I2cComIF::sendMessage(CookieIF *cookie,
const uint8_t *sendData, size_t sendLen) {
ReturnValue_t result;
int fd;
std::string deviceFile;
if(sendData == nullptr) {
sif::error << "I2cComIF::sendMessage: Send Data is nullptr"
<< std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
if(sendLen == 0) {
return HasReturnvaluesIF::RETURN_OK;
}
I2cCookie* i2cCookie = dynamic_cast<I2cCookie*>(cookie);
if(i2cCookie == nullptr) {
sif::error << "I2cComIF::sendMessage: Invalid I2C Cookie!" << std::endl;
return NULLPOINTER;
}
address_t i2cAddress = i2cCookie->getAddress();
i2cDeviceMapIter = i2cDeviceMap.find(i2cAddress);
if (i2cDeviceMapIter == i2cDeviceMap.end()) {
sif::error << "I2cComIF::sendMessage: i2cAddress of Cookie not "
<< "registered in i2cDeviceMap" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
deviceFile = i2cCookie->getDeviceFile();
UnixFileGuard fileHelper(deviceFile, &fd, O_RDWR, "I2cComIF::sendMessage");
if(fileHelper.getOpenResult() != HasReturnvaluesIF::RETURN_OK) {
return fileHelper.getOpenResult();
}
result = openDevice(deviceFile, i2cAddress, &fd);
if (result != HasReturnvaluesIF::RETURN_OK){
return result;
}
if (write(fd, sendData, sendLen) != (int)sendLen) {
sif::error << "I2cComIF::sendMessage: Failed to send data to I2C "
"device with error code " << errno << ". Error description: "
<< strerror(errno) << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t I2cComIF::getSendSuccess(CookieIF *cookie) {
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t I2cComIF::requestReceiveMessage(CookieIF *cookie,
size_t requestLen) {
ReturnValue_t result;
int fd;
std::string deviceFile;
if (requestLen == 0) {
return HasReturnvaluesIF::RETURN_OK;
}
I2cCookie* i2cCookie = dynamic_cast<I2cCookie*>(cookie);
if(i2cCookie == nullptr) {
sif::error << "I2cComIF::requestReceiveMessage: Invalid I2C Cookie!" << std::endl;
i2cDeviceMapIter->second.replyLen = 0;
return NULLPOINTER;
}
address_t i2cAddress = i2cCookie->getAddress();
i2cDeviceMapIter = i2cDeviceMap.find(i2cAddress);
if (i2cDeviceMapIter == i2cDeviceMap.end()) {
sif::error << "I2cComIF::requestReceiveMessage: i2cAddress of Cookie not "
<< "registered in i2cDeviceMap" << std::endl;
i2cDeviceMapIter->second.replyLen = 0;
return HasReturnvaluesIF::RETURN_FAILED;
}
deviceFile = i2cCookie->getDeviceFile();
UnixFileGuard fileHelper(deviceFile, &fd, O_RDWR, "I2cComIF::requestReceiveMessage");
if(fileHelper.getOpenResult() != HasReturnvaluesIF::RETURN_OK) {
return fileHelper.getOpenResult();
}
result = openDevice(deviceFile, i2cAddress, &fd);
if (result != HasReturnvaluesIF::RETURN_OK){
i2cDeviceMapIter->second.replyLen = 0;
return result;
}
uint8_t* replyBuffer = i2cDeviceMapIter->second.replyBuffer.data();
int readLen = read(fd, replyBuffer, requestLen);
if (readLen != static_cast<int>(requestLen)) {
#if FSFW_VERBOSE_LEVEL >= 1 and FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "I2cComIF::requestReceiveMessage: Reading from I2C "
<< "device failed with error code " << errno <<". Description"
<< " of error: " << strerror(errno) << std::endl;
sif::error << "I2cComIF::requestReceiveMessage: Read only " << readLen << " from "
<< requestLen << " bytes" << std::endl;
#endif
i2cDeviceMapIter->second.replyLen = 0;
sif::debug << "I2cComIF::requestReceiveMessage: Read " << readLen << " of " << requestLen << " bytes" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
i2cDeviceMapIter->second.replyLen = requestLen;
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t I2cComIF::readReceivedMessage(CookieIF *cookie,
uint8_t **buffer, size_t* size) {
I2cCookie* i2cCookie = dynamic_cast<I2cCookie*>(cookie);
if(i2cCookie == nullptr) {
sif::error << "I2cComIF::readReceivedMessage: Invalid I2C Cookie!" << std::endl;
return NULLPOINTER;
}
address_t i2cAddress = i2cCookie->getAddress();
i2cDeviceMapIter = i2cDeviceMap.find(i2cAddress);
if (i2cDeviceMapIter == i2cDeviceMap.end()) {
sif::error << "I2cComIF::readReceivedMessage: i2cAddress of Cookie not "
<< "found in i2cDeviceMap" << std::endl;
return HasReturnvaluesIF::RETURN_FAILED;
}
*buffer = i2cDeviceMapIter->second.replyBuffer.data();
*size = i2cDeviceMapIter->second.replyLen;
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t I2cComIF::openDevice(std::string deviceFile,
address_t i2cAddress, int* fileDescriptor) {
if (ioctl(*fileDescriptor, I2C_SLAVE, i2cAddress) < 0) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "I2cComIF: Specifying target device failed with error code " << errno << "."
<< std::endl;
sif::warning << "Error description " << strerror(errno) << std::endl;
#else
sif::printWarning("I2cComIF: Specifying target device failed with error code %d.\n");
sif::printWarning("Error description: %s\n", strerror(errno));
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
return HasReturnvaluesIF::RETURN_FAILED;
}
return HasReturnvaluesIF::RETURN_OK;
}

View File

@ -1,61 +0,0 @@
#ifndef LINUX_I2C_I2COMIF_H_
#define LINUX_I2C_I2COMIF_H_
#include "I2cCookie.h"
#include <fsfw/objectmanager/SystemObject.h>
#include <fsfw/devicehandlers/DeviceCommunicationIF.h>
#include <unordered_map>
#include <vector>
/**
* @brief This is the communication interface for I2C devices connected
* to a system running a Linux OS.
*
* @note The Xilinx Linux kernel might not support to read more than 255 bytes at once.
*
* @author J. Meier
*/
class I2cComIF: public DeviceCommunicationIF, public SystemObject {
public:
I2cComIF(object_id_t objectId);
virtual ~I2cComIF();
ReturnValue_t initializeInterface(CookieIF * cookie) override;
ReturnValue_t sendMessage(CookieIF *cookie,const uint8_t *sendData,
size_t sendLen) override;
ReturnValue_t getSendSuccess(CookieIF *cookie) override;
ReturnValue_t requestReceiveMessage(CookieIF *cookie,
size_t requestLen) override;
ReturnValue_t readReceivedMessage(CookieIF *cookie, uint8_t **buffer,
size_t *size) override;
private:
struct I2cInstance {
std::vector<uint8_t> replyBuffer;
size_t replyLen;
};
using I2cDeviceMap = std::unordered_map<address_t, I2cInstance>;
using I2cDeviceMapIter = I2cDeviceMap::iterator;
/* In this map all i2c devices will be registered with their address and
* the appropriate file descriptor will be stored */
I2cDeviceMap i2cDeviceMap;
I2cDeviceMapIter i2cDeviceMapIter;
/**
* @brief This function opens an I2C device and binds the opened file
* to a specific I2C address.
* @param deviceFile The name of the device file. E.g. i2c-0
* @param i2cAddress The address of the i2c slave device.
* @param fileDescriptor Pointer to device descriptor.
* @return RETURN_OK if successful, otherwise RETURN_FAILED.
*/
ReturnValue_t openDevice(std::string deviceFile,
address_t i2cAddress, int* fileDescriptor);
};
#endif /* LINUX_I2C_I2COMIF_H_ */

View File

@ -1,20 +0,0 @@
#include "fsfw_hal/linux/i2c/I2cCookie.h"
I2cCookie::I2cCookie(address_t i2cAddress_, size_t maxReplyLen_,
std::string deviceFile_) :
i2cAddress(i2cAddress_), maxReplyLen(maxReplyLen_), deviceFile(deviceFile_) {
}
address_t I2cCookie::getAddress() const {
return i2cAddress;
}
size_t I2cCookie::getMaxReplyLen() const {
return maxReplyLen;
}
std::string I2cCookie::getDeviceFile() const {
return deviceFile;
}
I2cCookie::~I2cCookie() {}

View File

@ -1,38 +0,0 @@
#ifndef LINUX_I2C_I2CCOOKIE_H_
#define LINUX_I2C_I2CCOOKIE_H_
#include <fsfw/devicehandlers/CookieIF.h>
#include <string>
/**
* @brief Cookie for the i2cDeviceComIF.
*
* @author J. Meier
*/
class I2cCookie: public CookieIF {
public:
/**
* @brief Constructor for the I2C cookie.
* @param i2cAddress_ The i2c address of the target device.
* @param maxReplyLen_ The maximum expected length of a reply from the
* target device.
* @param devicFile_ The device file specifying the i2c interface to use. E.g. "/dev/i2c-0".
*/
I2cCookie(address_t i2cAddress_, size_t maxReplyLen_,
std::string deviceFile_);
virtual ~I2cCookie();
address_t getAddress() const;
size_t getMaxReplyLen() const;
std::string getDeviceFile() const;
private:
address_t i2cAddress = 0;
size_t maxReplyLen = 0;
std::string deviceFile;
};
#endif /* LINUX_I2C_I2CCOOKIE_H_ */

View File

@ -1,3 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
GpioRPi.cpp
)

View File

@ -1,38 +0,0 @@
#include "fsfw/FSFW.h"
#include "fsfw_hal/linux/rpi/GpioRPi.h"
#include "fsfw_hal/common/gpio/GpioCookie.h"
#include <fsfw/serviceinterface/ServiceInterface.h>
ReturnValue_t gpio::createRpiGpioConfig(GpioCookie* cookie, gpioId_t gpioId, int bcmPin,
std::string consumer, gpio::Direction direction, int initValue) {
if(cookie == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED;
}
auto config = new GpiodRegularByChip();
/* Default chipname for Raspberry Pi. There is still gpiochip1 for expansion, but most users
will not need this */
config->chipname = "gpiochip0";
config->consumer = consumer;
config->direction = direction;
config->initValue = initValue;
/* Sanity check for the BCM pins before assigning it */
if(bcmPin > 27) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "createRpiGpioConfig: BCM pin " << bcmPin << " invalid!" << std::endl;
#else
sif::printError("createRpiGpioConfig: BCM pin %d invalid!\n", bcmPin);
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
return HasReturnvaluesIF::RETURN_FAILED;
}
config->lineNum = bcmPin;
cookie->addGpio(gpioId, config);
return HasReturnvaluesIF::RETURN_OK;
}

View File

@ -1,8 +0,0 @@
target_sources(${LIB_FSFW_NAME} PUBLIC
SpiComIF.cpp
SpiCookie.cpp
)

View File

@ -1,408 +0,0 @@
#include "fsfw/FSFW.h"
#include "fsfw_hal/linux/spi/SpiComIF.h"
#include "fsfw_hal/linux/spi/SpiCookie.h"
#include "fsfw_hal/linux/utility.h"
#include "fsfw_hal/linux/UnixFileGuard.h"
#include <fsfw/ipc/MutexFactory.h>
#include <fsfw/globalfunctions/arrayprinter.h>
#include <linux/spi/spidev.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <cerrno>
#include <cstring>
SpiComIF::SpiComIF(object_id_t objectId, GpioIF* gpioComIF):
SystemObject(objectId), gpioComIF(gpioComIF) {
if(gpioComIF == nullptr) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "SpiComIF::SpiComIF: GPIO communication interface invalid!" << std::endl;
#else
sif::printError("SpiComIF::SpiComIF: GPIO communication interface invalid!\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
}
spiMutex = MutexFactory::instance()->createMutex();
}
ReturnValue_t SpiComIF::initializeInterface(CookieIF *cookie) {
int retval = 0;
SpiCookie* spiCookie = dynamic_cast<SpiCookie*>(cookie);
if(spiCookie == nullptr) {
return NULLPOINTER;
}
address_t spiAddress = spiCookie->getSpiAddress();
auto iter = spiDeviceMap.find(spiAddress);
if(iter == spiDeviceMap.end()) {
size_t bufferSize = spiCookie->getMaxBufferSize();
SpiInstance spiInstance(bufferSize);
auto statusPair = spiDeviceMap.emplace(spiAddress, spiInstance);
if (not statusPair.second) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "SpiComIF::initializeInterface: Failed to insert device with address " <<
spiAddress << "to SPI device map" << std::endl;
#else
sif::printError("SpiComIF::initializeInterface: Failed to insert device with address "
"%lu to SPI device map\n", static_cast<unsigned long>(spiAddress));
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
return HasReturnvaluesIF::RETURN_FAILED;
}
/* Now we emplaced the read buffer in the map, we still need to assign that location
to the SPI driver transfer struct */
spiCookie->assignReadBuffer(statusPair.first->second.replyBuffer.data());
}
else {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "SpiComIF::initializeInterface: SPI address already exists!" << std::endl;
#else
sif::printError("SpiComIF::initializeInterface: SPI address already exists!\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
return HasReturnvaluesIF::RETURN_FAILED;
}
/* Pull CS high in any case to be sure that device is inactive */
gpioId_t gpioId = spiCookie->getChipSelectPin();
if(gpioId != gpio::NO_GPIO) {
gpioComIF->pullHigh(gpioId);
}
uint32_t spiSpeed = 0;
spi::SpiModes spiMode = spi::SpiModes::MODE_0;
SpiCookie::UncommonParameters params;
spiCookie->getSpiParameters(spiMode, spiSpeed, &params);
int fileDescriptor = 0;
UnixFileGuard fileHelper(spiCookie->getSpiDevice(), &fileDescriptor, O_RDWR,
"SpiComIF::initializeInterface");
if(fileHelper.getOpenResult() != HasReturnvaluesIF::RETURN_OK) {
return fileHelper.getOpenResult();
}
/* These flags are rather uncommon */
if(params.threeWireSpi or params.noCs or params.csHigh) {
uint32_t currentMode = 0;
retval = ioctl(fileDescriptor, SPI_IOC_RD_MODE32, &currentMode);
if(retval != 0) {
utility::handleIoctlError("SpiComIF::initialiezInterface: Could not read full mode!");
}
if(params.threeWireSpi) {
currentMode |= SPI_3WIRE;
}
if(params.noCs) {
/* Some drivers like the Raspberry Pi ignore this flag in any case */
currentMode |= SPI_NO_CS;
}
if(params.csHigh) {
currentMode |= SPI_CS_HIGH;
}
/* Write adapted mode */
retval = ioctl(fileDescriptor, SPI_IOC_WR_MODE32, &currentMode);
if(retval != 0) {
utility::handleIoctlError("SpiComIF::initialiezInterface: Could not write full mode!");
}
}
if(params.lsbFirst) {
retval = ioctl(fileDescriptor, SPI_IOC_WR_LSB_FIRST, &params.lsbFirst);
if(retval != 0) {
utility::handleIoctlError("SpiComIF::initializeInterface: Setting LSB first failed");
}
}
if(params.bitsPerWord != 8) {
retval = ioctl(fileDescriptor, SPI_IOC_WR_BITS_PER_WORD, &params.bitsPerWord);
if(retval != 0) {
utility::handleIoctlError("SpiComIF::initializeInterface: "
"Could not write bits per word!");
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t SpiComIF::sendMessage(CookieIF *cookie, const uint8_t *sendData, size_t sendLen) {
SpiCookie* spiCookie = dynamic_cast<SpiCookie*>(cookie);
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
if(spiCookie == nullptr) {
return NULLPOINTER;
}
if(sendLen > spiCookie->getMaxBufferSize()) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "SpiComIF::sendMessage: Too much data sent, send length " << sendLen <<
"larger than maximum buffer length " << spiCookie->getMaxBufferSize() << std::endl;
#else
sif::printWarning("SpiComIF::sendMessage: Too much data sent, send length %lu larger "
"than maximum buffer length %lu!\n", static_cast<unsigned long>(sendLen),
static_cast<unsigned long>(spiCookie->getMaxBufferSize()));
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
return DeviceCommunicationIF::TOO_MUCH_DATA;
}
if(spiCookie->getComIfMode() == spi::SpiComIfModes::REGULAR) {
result = performRegularSendOperation(spiCookie, sendData, sendLen);
}
else if(spiCookie->getComIfMode() == spi::SpiComIfModes::CALLBACK) {
spi::send_callback_function_t sendFunc = nullptr;
void* funcArgs = nullptr;
spiCookie->getCallback(&sendFunc, &funcArgs);
if(sendFunc != nullptr) {
result = sendFunc(this, spiCookie, sendData, sendLen, funcArgs);
}
}
return result;
}
ReturnValue_t SpiComIF::performRegularSendOperation(SpiCookie *spiCookie, const uint8_t *sendData,
size_t sendLen) {
address_t spiAddress = spiCookie->getSpiAddress();
auto iter = spiDeviceMap.find(spiAddress);
if(iter != spiDeviceMap.end()) {
spiCookie->assignReadBuffer(iter->second.replyBuffer.data());
}
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
int retval = 0;
/* Prepare transfer */
int fileDescriptor = 0;
std::string device = spiCookie->getSpiDevice();
UnixFileGuard fileHelper(device, &fileDescriptor, O_RDWR, "SpiComIF::sendMessage");
if(fileHelper.getOpenResult() != HasReturnvaluesIF::RETURN_OK) {
return OPENING_FILE_FAILED;
}
spi::SpiModes spiMode = spi::SpiModes::MODE_0;
uint32_t spiSpeed = 0;
spiCookie->getSpiParameters(spiMode, spiSpeed, nullptr);
setSpiSpeedAndMode(fileDescriptor, spiMode, spiSpeed);
spiCookie->assignWriteBuffer(sendData);
spiCookie->setTransferSize(sendLen);
bool fullDuplex = spiCookie->isFullDuplex();
gpioId_t gpioId = spiCookie->getChipSelectPin();
/* Pull SPI CS low. For now, no support for active high given */
if(gpioId != gpio::NO_GPIO) {
result = spiMutex->lockMutex(timeoutType, timeoutMs);
if (result != RETURN_OK) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "SpiComIF::sendMessage: Failed to lock mutex" << std::endl;
#else
sif::printError("SpiComIF::sendMessage: Failed to lock mutex\n");
#endif
#endif
return result;
}
ReturnValue_t result = gpioComIF->pullLow(gpioId);
if(result != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "SpiComIF::sendMessage: Pulling low CS pin failed" << std::endl;
#else
sif::printWarning("SpiComIF::sendMessage: Pulling low CS pin failed");
#endif
#endif
return result;
}
}
/* Execute transfer */
if(fullDuplex) {
/* Initiate a full duplex SPI transfer. */
retval = ioctl(fileDescriptor, SPI_IOC_MESSAGE(1), spiCookie->getTransferStructHandle());
if(retval < 0) {
utility::handleIoctlError("SpiComIF::sendMessage: ioctl error.");
result = FULL_DUPLEX_TRANSFER_FAILED;
}
#if FSFW_HAL_SPI_WIRETAPPING == 1
performSpiWiretapping(spiCookie);
#endif /* FSFW_LINUX_SPI_WIRETAPPING == 1 */
}
else {
/* We write with a blocking half-duplex transfer here */
if (write(fileDescriptor, sendData, sendLen) != static_cast<ssize_t>(sendLen)) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "SpiComIF::sendMessage: Half-Duplex write operation failed!" <<
std::endl;
#else
sif::printWarning("SpiComIF::sendMessage: Half-Duplex write operation failed!\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
result = HALF_DUPLEX_TRANSFER_FAILED;
}
}
if(gpioId != gpio::NO_GPIO) {
gpioComIF->pullHigh(gpioId);
result = spiMutex->unlockMutex();
if (result != RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "SpiComIF::sendMessage: Failed to unlock mutex" << std::endl;
#endif
return result;
}
}
return result;
}
ReturnValue_t SpiComIF::getSendSuccess(CookieIF *cookie) {
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t SpiComIF::requestReceiveMessage(CookieIF *cookie, size_t requestLen) {
SpiCookie* spiCookie = dynamic_cast<SpiCookie*>(cookie);
if(spiCookie == nullptr) {
return NULLPOINTER;
}
if(spiCookie->isFullDuplex()) {
return HasReturnvaluesIF::RETURN_OK;
}
return performHalfDuplexReception(spiCookie);
}
ReturnValue_t SpiComIF::performHalfDuplexReception(SpiCookie* spiCookie) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
std::string device = spiCookie->getSpiDevice();
int fileDescriptor = 0;
UnixFileGuard fileHelper(device, &fileDescriptor, O_RDWR,
"SpiComIF::requestReceiveMessage");
if(fileHelper.getOpenResult() != HasReturnvaluesIF::RETURN_OK) {
return OPENING_FILE_FAILED;
}
uint8_t* rxBuf = nullptr;
size_t readSize = spiCookie->getCurrentTransferSize();
result = getReadBuffer(spiCookie->getSpiAddress(), &rxBuf);
if(result != HasReturnvaluesIF::RETURN_OK) {
return result;
}
gpioId_t gpioId = spiCookie->getChipSelectPin();
if(gpioId != gpio::NO_GPIO) {
result = spiMutex->lockMutex(timeoutType, timeoutMs);
if (result != RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "SpiComIF::getSendSuccess: Failed to lock mutex" << std::endl;
#endif
return result;
}
gpioComIF->pullLow(gpioId);
}
if(read(fileDescriptor, rxBuf, readSize) != static_cast<ssize_t>(readSize)) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "SpiComIF::sendMessage: Half-Duplex read operation failed!" << std::endl;
#else
sif::printWarning("SpiComIF::sendMessage: Half-Duplex read operation failed!\n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
result = HALF_DUPLEX_TRANSFER_FAILED;
}
if(gpioId != gpio::NO_GPIO) {
gpioComIF->pullHigh(gpioId);
result = spiMutex->unlockMutex();
if (result != RETURN_OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "SpiComIF::getSendSuccess: Failed to unlock mutex" << std::endl;
#endif
return result;
}
}
return result;
}
ReturnValue_t SpiComIF::readReceivedMessage(CookieIF *cookie, uint8_t **buffer, size_t *size) {
SpiCookie* spiCookie = dynamic_cast<SpiCookie*>(cookie);
if(spiCookie == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED;
}
uint8_t* rxBuf = nullptr;
ReturnValue_t result = getReadBuffer(spiCookie->getSpiAddress(), &rxBuf);
if(result != HasReturnvaluesIF::RETURN_OK) {
return result;
}
*buffer = rxBuf;
*size = spiCookie->getCurrentTransferSize();
spiCookie->setTransferSize(0);
return HasReturnvaluesIF::RETURN_OK;
}
MutexIF* SpiComIF::getMutex(MutexIF::TimeoutType* timeoutType, uint32_t* timeoutMs) {
if(timeoutType != nullptr) {
*timeoutType = this->timeoutType;
}
if(timeoutMs != nullptr) {
*timeoutMs = this->timeoutMs;
}
return spiMutex;
}
void SpiComIF::performSpiWiretapping(SpiCookie* spiCookie) {
if(spiCookie == nullptr) {
return;
}
size_t dataLen = spiCookie->getTransferStructHandle()->len;
uint8_t* dataPtr = reinterpret_cast<uint8_t*>(spiCookie->getTransferStructHandle()->tx_buf);
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::info << "Sent SPI data: " << std::endl;
arrayprinter::print(dataPtr, dataLen, OutputType::HEX, false);
sif::info << "Received SPI data: " << std::endl;
#else
sif::printInfo("Sent SPI data: \n");
arrayprinter::print(dataPtr, dataLen, OutputType::HEX, false);
sif::printInfo("Received SPI data: \n");
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
dataPtr = reinterpret_cast<uint8_t*>(spiCookie->getTransferStructHandle()->rx_buf);
arrayprinter::print(dataPtr, dataLen, OutputType::HEX, false);
}
ReturnValue_t SpiComIF::getReadBuffer(address_t spiAddress, uint8_t** buffer) {
if(buffer == nullptr) {
return HasReturnvaluesIF::RETURN_FAILED;
}
auto iter = spiDeviceMap.find(spiAddress);
if(iter == spiDeviceMap.end()) {
return HasReturnvaluesIF::RETURN_FAILED;
}
*buffer = iter->second.replyBuffer.data();
return HasReturnvaluesIF::RETURN_OK;
}
GpioIF* SpiComIF::getGpioInterface() {
return gpioComIF;
}
void SpiComIF::setSpiSpeedAndMode(int spiFd, spi::SpiModes mode, uint32_t speed) {
int retval = ioctl(spiFd, SPI_IOC_WR_MODE, reinterpret_cast<uint8_t*>(&mode));
if(retval != 0) {
utility::handleIoctlError("SpiComIF::setSpiSpeedAndMode: Setting SPI mode failed");
}
retval = ioctl(spiFd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if(retval != 0) {
utility::handleIoctlError("SpiComIF::setSpiSpeedAndMode: Setting SPI speed failed");
}
}

View File

@ -1,91 +0,0 @@
#ifndef LINUX_SPI_SPICOMIF_H_
#define LINUX_SPI_SPICOMIF_H_
#include "fsfw/FSFW.h"
#include "spiDefinitions.h"
#include "returnvalues/classIds.h"
#include "fsfw_hal/common/gpio/GpioIF.h"
#include "fsfw/devicehandlers/DeviceCommunicationIF.h"
#include "fsfw/objectmanager/SystemObject.h"
#include <vector>
#include <unordered_map>
class SpiCookie;
/**
* @brief Encapsulates access to linux SPI driver for FSFW objects
* @details
* Right now, only full-duplex SPI is supported. Most device specific transfer properties
* are contained in the SPI cookie.
* @author R. Mueller
*/
class SpiComIF: public DeviceCommunicationIF, public SystemObject {
public:
static constexpr uint8_t spiRetvalId = CLASS_ID::HAL_SPI;
static constexpr ReturnValue_t OPENING_FILE_FAILED =
HasReturnvaluesIF::makeReturnCode(spiRetvalId, 0);
/* Full duplex (ioctl) transfer failure */
static constexpr ReturnValue_t FULL_DUPLEX_TRANSFER_FAILED =
HasReturnvaluesIF::makeReturnCode(spiRetvalId, 1);
/* Half duplex (read/write) transfer failure */
static constexpr ReturnValue_t HALF_DUPLEX_TRANSFER_FAILED =
HasReturnvaluesIF::makeReturnCode(spiRetvalId, 2);
SpiComIF(object_id_t objectId, GpioIF* gpioComIF);
ReturnValue_t initializeInterface(CookieIF * cookie) override;
ReturnValue_t sendMessage(CookieIF *cookie,const uint8_t *sendData,
size_t sendLen) override;
ReturnValue_t getSendSuccess(CookieIF *cookie) override;
ReturnValue_t requestReceiveMessage(CookieIF *cookie,
size_t requestLen) override;
ReturnValue_t readReceivedMessage(CookieIF *cookie, uint8_t **buffer,
size_t *size) override;
/**
* @brief This function returns the mutex which can be used to protect the spi bus when
* the chip select must be driven from outside of the com if.
*/
MutexIF* getMutex(MutexIF::TimeoutType* timeoutType = nullptr, uint32_t* timeoutMs = nullptr);
/**
* Perform a regular send operation using Linux iotcl. This is public so it can be used
* in functions like a user callback if special handling is only necessary for certain commands.
* @param spiCookie
* @param sendData
* @param sendLen
* @return
*/
ReturnValue_t performRegularSendOperation(SpiCookie* spiCookie, const uint8_t *sendData,
size_t sendLen);
GpioIF* getGpioInterface();
void setSpiSpeedAndMode(int spiFd, spi::SpiModes mode, uint32_t speed);
void performSpiWiretapping(SpiCookie* spiCookie);
ReturnValue_t getReadBuffer(address_t spiAddress, uint8_t** buffer);
private:
struct SpiInstance {
SpiInstance(size_t maxRecvSize): replyBuffer(std::vector<uint8_t>(maxRecvSize)) {}
std::vector<uint8_t> replyBuffer;
};
GpioIF* gpioComIF = nullptr;
MutexIF* spiMutex = nullptr;
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING;
uint32_t timeoutMs = 20;
using SpiDeviceMap = std::unordered_map<address_t, SpiInstance>;
using SpiDeviceMapIter = SpiDeviceMap::iterator;
SpiDeviceMap spiDeviceMap;
ReturnValue_t performHalfDuplexReception(SpiCookie* spiCookie);
};
#endif /* LINUX_SPI_SPICOMIF_H_ */

View File

@ -1,144 +0,0 @@
#include "fsfw_hal/linux/spi/SpiCookie.h"
SpiCookie::SpiCookie(address_t spiAddress, gpioId_t chipSelect, std::string spiDev,
const size_t maxSize, spi::SpiModes spiMode, uint32_t spiSpeed):
SpiCookie(spi::SpiComIfModes::REGULAR, spiAddress, chipSelect, spiDev, maxSize, spiMode,
spiSpeed, nullptr, nullptr) {
}
SpiCookie::SpiCookie(address_t spiAddress, std::string spiDev, const size_t maxSize,
spi::SpiModes spiMode, uint32_t spiSpeed):
SpiCookie(spiAddress, gpio::NO_GPIO, spiDev, maxSize, spiMode, spiSpeed) {
}
SpiCookie::SpiCookie(address_t spiAddress, gpioId_t chipSelect, std::string spiDev,
const size_t maxSize, spi::SpiModes spiMode, uint32_t spiSpeed,
spi::send_callback_function_t callback, void *args):
SpiCookie(spi::SpiComIfModes::CALLBACK, spiAddress, chipSelect, spiDev, maxSize,
spiMode, spiSpeed, callback, args) {
}
SpiCookie::SpiCookie(spi::SpiComIfModes comIfMode, address_t spiAddress, gpioId_t chipSelect,
std::string spiDev, const size_t maxSize, spi::SpiModes spiMode, uint32_t spiSpeed,
spi::send_callback_function_t callback, void* args):
spiAddress(spiAddress), chipSelectPin(chipSelect), spiDevice(spiDev),
comIfMode(comIfMode), maxSize(maxSize), spiMode(spiMode), spiSpeed(spiSpeed),
sendCallback(callback), callbackArgs(args) {
}
spi::SpiComIfModes SpiCookie::getComIfMode() const {
return this->comIfMode;
}
void SpiCookie::getSpiParameters(spi::SpiModes& spiMode, uint32_t& spiSpeed,
UncommonParameters* parameters) const {
spiMode = this->spiMode;
spiSpeed = this->spiSpeed;
if(parameters != nullptr) {
parameters->threeWireSpi = uncommonParameters.threeWireSpi;
parameters->lsbFirst = uncommonParameters.lsbFirst;
parameters->noCs = uncommonParameters.noCs;
parameters->bitsPerWord = uncommonParameters.bitsPerWord;
parameters->csHigh = uncommonParameters.csHigh;
}
}
gpioId_t SpiCookie::getChipSelectPin() const {
return chipSelectPin;
}
size_t SpiCookie::getMaxBufferSize() const {
return maxSize;
}
address_t SpiCookie::getSpiAddress() const {
return spiAddress;
}
std::string SpiCookie::getSpiDevice() const {
return spiDevice;
}
void SpiCookie::setThreeWireSpi(bool enable) {
uncommonParameters.threeWireSpi = enable;
}
void SpiCookie::setLsbFirst(bool enable) {
uncommonParameters.lsbFirst = enable;
}
void SpiCookie::setNoCs(bool enable) {
uncommonParameters.noCs = enable;
}
void SpiCookie::setBitsPerWord(uint8_t bitsPerWord) {
uncommonParameters.bitsPerWord = bitsPerWord;
}
void SpiCookie::setCsHigh(bool enable) {
uncommonParameters.csHigh = enable;
}
void SpiCookie::activateCsDeselect(bool deselectCs, uint16_t delayUsecs) {
spiTransferStruct.cs_change = deselectCs;
spiTransferStruct.delay_usecs = delayUsecs;
}
void SpiCookie::assignReadBuffer(uint8_t* rx) {
if(rx != nullptr) {
spiTransferStruct.rx_buf = reinterpret_cast<__u64>(rx);
}
}
void SpiCookie::assignWriteBuffer(const uint8_t* tx) {
if(tx != nullptr) {
spiTransferStruct.tx_buf = reinterpret_cast<__u64>(tx);
}
}
void SpiCookie::setCallbackMode(spi::send_callback_function_t callback,
void *args) {
this->comIfMode = spi::SpiComIfModes::CALLBACK;
this->sendCallback = callback;
this->callbackArgs = args;
}
void SpiCookie::setCallbackArgs(void *args) {
this->callbackArgs = args;
}
spi_ioc_transfer* SpiCookie::getTransferStructHandle() {
return &spiTransferStruct;
}
void SpiCookie::setFullOrHalfDuplex(bool halfDuplex) {
this->halfDuplex = halfDuplex;
}
bool SpiCookie::isFullDuplex() const {
return not this->halfDuplex;
}
void SpiCookie::setTransferSize(size_t transferSize) {
spiTransferStruct.len = transferSize;
}
size_t SpiCookie::getCurrentTransferSize() const {
return spiTransferStruct.len;
}
void SpiCookie::setSpiSpeed(uint32_t newSpeed) {
this->spiSpeed = newSpeed;
}
void SpiCookie::setSpiMode(spi::SpiModes newMode) {
this->spiMode = newMode;
}
void SpiCookie::getCallback(spi::send_callback_function_t *callback,
void **args) {
*callback = this->sendCallback;
*args = this->callbackArgs;
}

View File

@ -1,183 +0,0 @@
#ifndef LINUX_SPI_SPICOOKIE_H_
#define LINUX_SPI_SPICOOKIE_H_
#include "spiDefinitions.h"
#include "../../common/gpio/gpioDefinitions.h"
#include <fsfw/devicehandlers/CookieIF.h>
#include <linux/spi/spidev.h>
/**
* @brief This cookie class is passed to the SPI communication interface
* @details
* This cookie contains device specific properties like speed and SPI mode or the SPI transfer
* struct required by the Linux SPI driver. It also contains a handle to a GPIO interface
* to perform slave select switching when necessary.
*
* The user can specify gpio::NO_GPIO as the GPIO ID or use a custom send callback to meet
* special requirements like expander slave select switching (e.g. GPIO or I2C expander)
* or special timing related requirements.
*/
class SpiCookie: public CookieIF {
public:
/**
* Each SPI device will have a corresponding cookie. The cookie is used by the communication
* interface and contains device specific information like the largest expected size to be
* sent and received and the GPIO pin used to toggle the SPI slave select pin.
* @param spiAddress
* @param chipSelect Chip select. gpio::NO_GPIO can be used for hardware slave selects.
* @param spiDev
* @param maxSize
*/
SpiCookie(address_t spiAddress, gpioId_t chipSelect, std::string spiDev,
const size_t maxSize, spi::SpiModes spiMode, uint32_t spiSpeed);
/**
* Like constructor above, but without a dedicated GPIO CS. Can be used for hardware
* slave select or if CS logic is performed with decoders.
*/
SpiCookie(address_t spiAddress, std::string spiDev, const size_t maxReplySize,
spi::SpiModes spiMode, uint32_t spiSpeed);
/**
* Use the callback mode of the SPI communication interface. The user can pass the callback
* function here or by using the setter function #setCallbackMode
*/
SpiCookie(address_t spiAddress, gpioId_t chipSelect, std::string spiDev, const size_t maxSize,
spi::SpiModes spiMode, uint32_t spiSpeed, spi::send_callback_function_t callback,
void *args);
/**
* Get the callback function
* @param callback
* @param args
*/
void getCallback(spi::send_callback_function_t* callback, void** args);
address_t getSpiAddress() const;
std::string getSpiDevice() const;
gpioId_t getChipSelectPin() const;
size_t getMaxBufferSize() const;
spi::SpiComIfModes getComIfMode() const;
/** Enables changing SPI speed at run-time */
void setSpiSpeed(uint32_t newSpeed);
/** Enables changing the SPI mode at run-time */
void setSpiMode(spi::SpiModes newMode);
/**
* Set the SPI to callback mode and assigns the user supplied callback and an argument
* passed to the callback.
* @param callback
* @param args
*/
void setCallbackMode(spi::send_callback_function_t callback, void* args);
/**
* Can be used to set the callback arguments and a later point than initialization.
* @param args
*/
void setCallbackArgs(void* args);
/**
* True if SPI transfers should be performed in full duplex mode
* @return
*/
bool isFullDuplex() const;
/**
* Set transfer type to full duplex or half duplex. Full duplex is the default setting,
* ressembling common SPI hardware implementation with shift registers, where read and writes
* happen simultaneosly.
* @param fullDuplex
*/
void setFullOrHalfDuplex(bool halfDuplex);
/**
* This needs to be called to specify where the SPI driver writes to or reads from.
* @param readLocation
* @param writeLocation
*/
void assignReadBuffer(uint8_t* rx);
void assignWriteBuffer(const uint8_t* tx);
/**
* Set size for the next transfer. Set to 0 for no transfer
* @param transferSize
*/
void setTransferSize(size_t transferSize);
size_t getCurrentTransferSize() const;
struct UncommonParameters {
uint8_t bitsPerWord = 8;
bool noCs = false;
bool csHigh = false;
bool threeWireSpi = false;
/* MSB first is more common */
bool lsbFirst = false;
};
/**
* Can be used to explicitely disable hardware chip select.
* Some drivers like the Raspberry Pi Linux driver will not use hardware chip select by default
* (see https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md)
* @param enable
*/
void setNoCs(bool enable);
void setThreeWireSpi(bool enable);
void setLsbFirst(bool enable);
void setCsHigh(bool enable);
void setBitsPerWord(uint8_t bitsPerWord);
void getSpiParameters(spi::SpiModes& spiMode, uint32_t& spiSpeed,
UncommonParameters* parameters = nullptr) const;
/**
* See spidev.h cs_change and delay_usecs
* @param deselectCs
* @param delayUsecs
*/
void activateCsDeselect(bool deselectCs, uint16_t delayUsecs);
spi_ioc_transfer* getTransferStructHandle();
private:
/**
* Internal constructor which initializes every field
* @param spiAddress
* @param chipSelect
* @param spiDev
* @param maxSize
* @param spiMode
* @param spiSpeed
* @param callback
* @param args
*/
SpiCookie(spi::SpiComIfModes comIfMode, address_t spiAddress, gpioId_t chipSelect,
std::string spiDev, const size_t maxSize, spi::SpiModes spiMode, uint32_t spiSpeed,
spi::send_callback_function_t callback, void* args);
address_t spiAddress;
gpioId_t chipSelectPin;
std::string spiDevice;
spi::SpiComIfModes comIfMode;
// Required for regular mode
const size_t maxSize;
spi::SpiModes spiMode;
uint32_t spiSpeed;
bool halfDuplex = false;
// Required for callback mode
spi::send_callback_function_t sendCallback = nullptr;
void* callbackArgs = nullptr;
struct spi_ioc_transfer spiTransferStruct = {};
UncommonParameters uncommonParameters;
};
#endif /* LINUX_SPI_SPICOOKIE_H_ */

View File

@ -1,28 +0,0 @@
#ifndef LINUX_SPI_SPIDEFINITONS_H_
#define LINUX_SPI_SPIDEFINITONS_H_
#include "../../common/gpio/gpioDefinitions.h"
#include "../../common/spi/spiCommon.h"
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
#include <linux/spi/spidev.h>
#include <cstdint>
class SpiCookie;
class SpiComIF;
namespace spi {
enum SpiComIfModes {
REGULAR,
CALLBACK
};
using send_callback_function_t = ReturnValue_t (*) (SpiComIF* comIf, SpiCookie *cookie,
const uint8_t *sendData, size_t sendLen, void* args);
}
#endif /* LINUX_SPI_SPIDEFINITONS_H_ */

View File

@ -1,4 +0,0 @@
target_sources(${LIB_FSFW_NAME} PUBLIC
UartComIF.cpp
UartCookie.cpp
)

View File

@ -1,529 +0,0 @@
#include "UartComIF.h"
#include "OBSWConfig.h"
#include "fsfw_hal/linux/utility.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
#include <cstring>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
UartComIF::UartComIF(object_id_t objectId): SystemObject(objectId){
}
UartComIF::~UartComIF() {}
ReturnValue_t UartComIF::initializeInterface(CookieIF* cookie) {
std::string deviceFile;
UartDeviceMapIter uartDeviceMapIter;
if(cookie == nullptr) {
return NULLPOINTER;
}
UartCookie* uartCookie = dynamic_cast<UartCookie*>(cookie);
if (uartCookie == nullptr) {
sif::error << "UartComIF::initializeInterface: Invalid UART Cookie!" << std::endl;
return NULLPOINTER;
}
deviceFile = uartCookie->getDeviceFile();
uartDeviceMapIter = uartDeviceMap.find(deviceFile);
if(uartDeviceMapIter == uartDeviceMap.end()) {
int fileDescriptor = configureUartPort(uartCookie);
if (fileDescriptor < 0) {
return RETURN_FAILED;
}
size_t maxReplyLen = uartCookie->getMaxReplyLen();
UartElements uartElements = {fileDescriptor, std::vector<uint8_t>(maxReplyLen), 0};
auto status = uartDeviceMap.emplace(deviceFile, uartElements);
if (status.second == false) {
sif::warning << "UartComIF::initializeInterface: Failed to insert device " <<
deviceFile << "to UART device map" << std::endl;
return RETURN_FAILED;
}
}
else {
sif::warning << "UartComIF::initializeInterface: UART device " << deviceFile <<
" already in use" << std::endl;
return RETURN_FAILED;
}
return RETURN_OK;
}
int UartComIF::configureUartPort(UartCookie* uartCookie) {
struct termios options = {};
std::string deviceFile = uartCookie->getDeviceFile();
int flags = O_RDWR;
if(uartCookie->getUartMode() == UartModes::CANONICAL) {
// In non-canonical mode, don't specify O_NONBLOCK because these properties will be
// controlled by the VTIME and VMIN parameters and O_NONBLOCK would override this
flags |= O_NONBLOCK;
}
int fd = open(deviceFile.c_str(), flags);
if (fd < 0) {
sif::warning << "UartComIF::configureUartPort: Failed to open uart " << deviceFile <<
"with error code " << errno << strerror(errno) << std::endl;
return fd;
}
/* Read in existing settings */
if(tcgetattr(fd, &options) != 0) {
sif::warning << "UartComIF::configureUartPort: Error " << errno << "from tcgetattr: "
<< strerror(errno) << std::endl;
return fd;
}
setParityOptions(&options, uartCookie);
setStopBitOptions(&options, uartCookie);
setDatasizeOptions(&options, uartCookie);
setFixedOptions(&options);
setUartMode(&options, *uartCookie);
if(uartCookie->getInputShouldBeFlushed()) {
tcflush(fd, TCIFLUSH);
}
/* Sets uart to non-blocking mode. Read returns immediately when there are no data available */
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 0;
configureBaudrate(&options, uartCookie);
/* Save option settings */
if (tcsetattr(fd, TCSANOW, &options) != 0) {
sif::warning << "UartComIF::configureUartPort: Failed to set options with error " <<
errno << ": " << strerror(errno);
return fd;
}
return fd;
}
void UartComIF::setParityOptions(struct termios* options, UartCookie* uartCookie) {
/* Clear parity bit */
options->c_cflag &= ~PARENB;
switch (uartCookie->getParity()) {
case Parity::EVEN:
options->c_cflag |= PARENB;
options->c_cflag &= ~PARODD;
break;
case Parity::ODD:
options->c_cflag |= PARENB;
options->c_cflag |= PARODD;
break;
default:
break;
}
}
void UartComIF::setStopBitOptions(struct termios* options, UartCookie* uartCookie) {
/* Clear stop field. Sets stop bit to one bit */
options->c_cflag &= ~CSTOPB;
switch (uartCookie->getStopBits()) {
case StopBits::TWO_STOP_BITS:
options->c_cflag |= CSTOPB;
break;
default:
break;
}
}
void UartComIF::setDatasizeOptions(struct termios* options, UartCookie* uartCookie) {
/* Clear size bits */
options->c_cflag &= ~CSIZE;
switch (uartCookie->getBitsPerWord()) {
case 5:
options->c_cflag |= CS5;
break;
case 6:
options->c_cflag |= CS6;
break;
case 7:
options->c_cflag |= CS7;
break;
case 8:
options->c_cflag |= CS8;
break;
default:
sif::warning << "UartComIF::setDatasizeOptions: Invalid size specified" << std::endl;
break;
}
}
void UartComIF::setFixedOptions(struct termios* options) {
/* Disable RTS/CTS hardware flow control */
options->c_cflag &= ~CRTSCTS;
/* Turn on READ & ignore ctrl lines (CLOCAL = 1) */
options->c_cflag |= CREAD | CLOCAL;
/* Disable echo */
options->c_lflag &= ~ECHO;
/* Disable erasure */
options->c_lflag &= ~ECHOE;
/* Disable new-line echo */
options->c_lflag &= ~ECHONL;
/* Disable interpretation of INTR, QUIT and SUSP */
options->c_lflag &= ~ISIG;
/* Turn off s/w flow ctrl */
options->c_iflag &= ~(IXON | IXOFF | IXANY);
/* Disable any special handling of received bytes */
options->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);
/* Prevent special interpretation of output bytes (e.g. newline chars) */
options->c_oflag &= ~OPOST;
/* Prevent conversion of newline to carriage return/line feed */
options->c_oflag &= ~ONLCR;
}
void UartComIF::configureBaudrate(struct termios* options, UartCookie* uartCookie) {
switch (uartCookie->getBaudrate()) {
case 50:
cfsetispeed(options, B50);
cfsetospeed(options, B50);
break;
case 75:
cfsetispeed(options, B75);
cfsetospeed(options, B75);
break;
case 110:
cfsetispeed(options, B110);
cfsetospeed(options, B110);
break;
case 134:
cfsetispeed(options, B134);
cfsetospeed(options, B134);
break;
case 150:
cfsetispeed(options, B150);
cfsetospeed(options, B150);
break;
case 200:
cfsetispeed(options, B200);
cfsetospeed(options, B200);
break;
case 300:
cfsetispeed(options, B300);
cfsetospeed(options, B300);
break;
case 600:
cfsetispeed(options, B600);
cfsetospeed(options, B600);
break;
case 1200:
cfsetispeed(options, B1200);
cfsetospeed(options, B1200);
break;
case 1800:
cfsetispeed(options, B1800);
cfsetospeed(options, B1800);
break;
case 2400:
cfsetispeed(options, B2400);
cfsetospeed(options, B2400);
break;
case 4800:
cfsetispeed(options, B4800);
cfsetospeed(options, B4800);
break;
case 9600:
cfsetispeed(options, B9600);
cfsetospeed(options, B9600);
break;
case 19200:
cfsetispeed(options, B19200);
cfsetospeed(options, B19200);
break;
case 38400:
cfsetispeed(options, B38400);
cfsetospeed(options, B38400);
break;
case 57600:
cfsetispeed(options, B57600);
cfsetospeed(options, B57600);
break;
case 115200:
cfsetispeed(options, B115200);
cfsetospeed(options, B115200);
break;
case 230400:
cfsetispeed(options, B230400);
cfsetospeed(options, B230400);
break;
case 460800:
cfsetispeed(options, B460800);
cfsetospeed(options, B460800);
break;
default:
sif::warning << "UartComIF::configureBaudrate: Baudrate not supported" << std::endl;
break;
}
}
ReturnValue_t UartComIF::sendMessage(CookieIF *cookie,
const uint8_t *sendData, size_t sendLen) {
int fd = 0;
std::string deviceFile;
UartDeviceMapIter uartDeviceMapIter;
if(sendLen == 0) {
return RETURN_OK;
}
if(sendData == nullptr) {
sif::warning << "UartComIF::sendMessage: Send data is nullptr" << std::endl;
return RETURN_FAILED;
}
UartCookie* uartCookie = dynamic_cast<UartCookie*>(cookie);
if(uartCookie == nullptr) {
sif::warning << "UartComIF::sendMessasge: Invalid UART Cookie!" << std::endl;
return NULLPOINTER;
}
deviceFile = uartCookie->getDeviceFile();
uartDeviceMapIter = uartDeviceMap.find(deviceFile);
if (uartDeviceMapIter == uartDeviceMap.end()) {
sif::debug << "UartComIF::sendMessage: Device file " << deviceFile <<
"not in UART map" << std::endl;
return RETURN_FAILED;
}
fd = uartDeviceMapIter->second.fileDescriptor;
if (write(fd, sendData, sendLen) != (int)sendLen) {
sif::error << "UartComIF::sendMessage: Failed to send data with error code " <<
errno << ": Error description: " << strerror(errno) << std::endl;
return RETURN_FAILED;
}
return RETURN_OK;
}
ReturnValue_t UartComIF::getSendSuccess(CookieIF *cookie) {
return RETURN_OK;
}
ReturnValue_t UartComIF::requestReceiveMessage(CookieIF *cookie, size_t requestLen) {
std::string deviceFile;
UartDeviceMapIter uartDeviceMapIter;
UartCookie* uartCookie = dynamic_cast<UartCookie*>(cookie);
if(uartCookie == nullptr) {
sif::debug << "UartComIF::requestReceiveMessage: Invalid Uart Cookie!" << std::endl;
return NULLPOINTER;
}
UartModes uartMode = uartCookie->getUartMode();
deviceFile = uartCookie->getDeviceFile();
uartDeviceMapIter = uartDeviceMap.find(deviceFile);
if(uartMode == UartModes::NON_CANONICAL and requestLen == 0) {
return RETURN_OK;
}
if (uartDeviceMapIter == uartDeviceMap.end()) {
sif::debug << "UartComIF::requestReceiveMessage: Device file " << deviceFile
<< " not in uart map" << std::endl;
return RETURN_FAILED;
}
if (uartMode == UartModes::CANONICAL) {
return handleCanonicalRead(*uartCookie, uartDeviceMapIter, requestLen);
}
else if (uartMode == UartModes::NON_CANONICAL) {
return handleNoncanonicalRead(*uartCookie, uartDeviceMapIter, requestLen);
}
else {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
ReturnValue_t UartComIF::handleCanonicalRead(UartCookie& uartCookie, UartDeviceMapIter& iter,
size_t requestLen) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
uint8_t maxReadCycles = uartCookie.getReadCycles();
uint8_t currentReadCycles = 0;
int bytesRead = 0;
size_t currentBytesRead = 0;
size_t maxReplySize = uartCookie.getMaxReplyLen();
int fd = iter->second.fileDescriptor;
auto bufferPtr = iter->second.replyBuffer.data();
iter->second.replyLen = 0;
do {
size_t allowedReadSize = 0;
if(currentBytesRead >= maxReplySize) {
// Overflow risk. Emit warning, trigger event and break. If this happens,
// the reception buffer is not large enough or data is not polled often enough.
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "UartComIF::requestReceiveMessage: Next read would cause overflow!"
<< std::endl;
#else
sif::printWarning("UartComIF::requestReceiveMessage: "
"Next read would cause overflow!");
#endif
#endif
result = UART_RX_BUFFER_TOO_SMALL;
break;
}
else {
allowedReadSize = maxReplySize - currentBytesRead;
}
bytesRead = read(fd, bufferPtr, allowedReadSize);
if (bytesRead < 0) {
// EAGAIN: No data available in non-blocking mode
if(errno != EAGAIN) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "UartComIF::handleCanonicalRead: read failed with code" <<
errno << ": " << strerror(errno) << std::endl;
#else
sif::printWarning("UartComIF::handleCanonicalRead: read failed with code %d: %s\n",
errno, strerror(errno));
#endif
#endif
return RETURN_FAILED;
}
}
else if(bytesRead > 0) {
iter->second.replyLen += bytesRead;
bufferPtr += bytesRead;
currentBytesRead += bytesRead;
}
currentReadCycles++;
} while(bytesRead > 0 and currentReadCycles < maxReadCycles);
return result;
}
ReturnValue_t UartComIF::handleNoncanonicalRead(UartCookie &uartCookie, UartDeviceMapIter &iter,
size_t requestLen) {
int fd = iter->second.fileDescriptor;
auto bufferPtr = iter->second.replyBuffer.data();
// Size check to prevent buffer overflow
if(requestLen > uartCookie.getMaxReplyLen()) {
#if OBSW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "UartComIF::requestReceiveMessage: Next read would cause overflow!"
<< std::endl;
#else
sif::printWarning("UartComIF::requestReceiveMessage: "
"Next read would cause overflow!");
#endif
#endif
return UART_RX_BUFFER_TOO_SMALL;
}
int bytesRead = read(fd, bufferPtr, requestLen);
if (bytesRead < 0) {
return RETURN_FAILED;
}
else if (bytesRead != static_cast<int>(requestLen)) {
if(uartCookie.isReplySizeFixed()) {
sif::warning << "UartComIF::requestReceiveMessage: Only read " << bytesRead <<
" of " << requestLen << " bytes" << std::endl;
return RETURN_FAILED;
}
}
iter->second.replyLen = bytesRead;
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t UartComIF::readReceivedMessage(CookieIF *cookie,
uint8_t **buffer, size_t* size) {
std::string deviceFile;
UartDeviceMapIter uartDeviceMapIter;
UartCookie* uartCookie = dynamic_cast<UartCookie*>(cookie);
if(uartCookie == nullptr) {
sif::debug << "UartComIF::readReceivedMessage: Invalid uart cookie!" << std::endl;
return NULLPOINTER;
}
deviceFile = uartCookie->getDeviceFile();
uartDeviceMapIter = uartDeviceMap.find(deviceFile);
if (uartDeviceMapIter == uartDeviceMap.end()) {
sif::debug << "UartComIF::readReceivedMessage: Device file " << deviceFile <<
" not in uart map" << std::endl;
return RETURN_FAILED;
}
*buffer = uartDeviceMapIter->second.replyBuffer.data();
*size = uartDeviceMapIter->second.replyLen;
/* Length is reset to 0 to prevent reading the same data twice */
uartDeviceMapIter->second.replyLen = 0;
return RETURN_OK;
}
ReturnValue_t UartComIF::flushUartRxBuffer(CookieIF *cookie) {
std::string deviceFile;
UartDeviceMapIter uartDeviceMapIter;
UartCookie* uartCookie = dynamic_cast<UartCookie*>(cookie);
if(uartCookie == nullptr) {
sif::warning << "UartComIF::flushUartRxBuffer: Invalid uart cookie!" << std::endl;
return NULLPOINTER;
}
deviceFile = uartCookie->getDeviceFile();
uartDeviceMapIter = uartDeviceMap.find(deviceFile);
if(uartDeviceMapIter != uartDeviceMap.end()) {
int fd = uartDeviceMapIter->second.fileDescriptor;
tcflush(fd, TCIFLUSH);
return RETURN_OK;
}
return RETURN_FAILED;
}
ReturnValue_t UartComIF::flushUartTxBuffer(CookieIF *cookie) {
std::string deviceFile;
UartDeviceMapIter uartDeviceMapIter;
UartCookie* uartCookie = dynamic_cast<UartCookie*>(cookie);
if(uartCookie == nullptr) {
sif::warning << "UartComIF::flushUartTxBuffer: Invalid uart cookie!" << std::endl;
return NULLPOINTER;
}
deviceFile = uartCookie->getDeviceFile();
uartDeviceMapIter = uartDeviceMap.find(deviceFile);
if(uartDeviceMapIter != uartDeviceMap.end()) {
int fd = uartDeviceMapIter->second.fileDescriptor;
tcflush(fd, TCOFLUSH);
return RETURN_OK;
}
return RETURN_FAILED;
}
ReturnValue_t UartComIF::flushUartTxAndRxBuf(CookieIF *cookie) {
std::string deviceFile;
UartDeviceMapIter uartDeviceMapIter;
UartCookie* uartCookie = dynamic_cast<UartCookie*>(cookie);
if(uartCookie == nullptr) {
sif::warning << "UartComIF::flushUartTxAndRxBuf: Invalid uart cookie!" << std::endl;
return NULLPOINTER;
}
deviceFile = uartCookie->getDeviceFile();
uartDeviceMapIter = uartDeviceMap.find(deviceFile);
if(uartDeviceMapIter != uartDeviceMap.end()) {
int fd = uartDeviceMapIter->second.fileDescriptor;
tcflush(fd, TCIOFLUSH);
return RETURN_OK;
}
return RETURN_FAILED;
}
void UartComIF::setUartMode(struct termios *options, UartCookie &uartCookie) {
UartModes uartMode = uartCookie.getUartMode();
if(uartMode == UartModes::NON_CANONICAL) {
/* Disable canonical mode */
options->c_lflag &= ~ICANON;
}
else if(uartMode == UartModes::CANONICAL) {
options->c_lflag |= ICANON;
}
}

View File

@ -1,125 +0,0 @@
#ifndef BSP_Q7S_COMIF_UARTCOMIF_H_
#define BSP_Q7S_COMIF_UARTCOMIF_H_
#include "UartCookie.h"
#include <fsfw/objectmanager/SystemObject.h>
#include <fsfw/devicehandlers/DeviceCommunicationIF.h>
#include <unordered_map>
#include <vector>
/**
* @brief This is the communication interface to access serial ports on linux based operating
* systems.
*
* @details The implementation follows the instructions from https://blog.mbedded.ninja/programming/
* operating-systems/linux/linux-serial-ports-using-c-cpp/#disabling-canonical-mode
*
* @author J. Meier
*/
class UartComIF: public DeviceCommunicationIF, public SystemObject {
public:
static constexpr uint8_t uartRetvalId = CLASS_ID::HAL_UART;
static constexpr ReturnValue_t UART_READ_FAILURE =
HasReturnvaluesIF::makeReturnCode(uartRetvalId, 1);
static constexpr ReturnValue_t UART_READ_SIZE_MISSMATCH =
HasReturnvaluesIF::makeReturnCode(uartRetvalId, 2);
static constexpr ReturnValue_t UART_RX_BUFFER_TOO_SMALL =
HasReturnvaluesIF::makeReturnCode(uartRetvalId, 3);
UartComIF(object_id_t objectId);
virtual ~UartComIF();
ReturnValue_t initializeInterface(CookieIF * cookie) override;
ReturnValue_t sendMessage(CookieIF *cookie,const uint8_t *sendData,
size_t sendLen) override;
ReturnValue_t getSendSuccess(CookieIF *cookie) override;
ReturnValue_t requestReceiveMessage(CookieIF *cookie,
size_t requestLen) override;
ReturnValue_t readReceivedMessage(CookieIF *cookie, uint8_t **buffer,
size_t *size) override;
/**
* @brief This function discards all data received but not read in the UART buffer.
*/
ReturnValue_t flushUartRxBuffer(CookieIF *cookie);
/**
* @brief This function discards all data in the transmit buffer of the UART driver.
*/
ReturnValue_t flushUartTxBuffer(CookieIF *cookie);
/**
* @brief This function discards both data in the transmit and receive buffer of the UART.
*/
ReturnValue_t flushUartTxAndRxBuf(CookieIF *cookie);
private:
using UartDeviceFile_t = std::string;
struct UartElements {
int fileDescriptor;
std::vector<uint8_t> replyBuffer;
/** Number of bytes read will be written to this variable */
size_t replyLen;
};
using UartDeviceMap = std::unordered_map<UartDeviceFile_t, UartElements>;
using UartDeviceMapIter = UartDeviceMap::iterator;
/**
* The uart devie map stores informations of initialized uart ports.
*/
UartDeviceMap uartDeviceMap;
/**
* @brief This function opens and configures a uart device by using the information stored
* in the uart cookie.
* @param uartCookie Pointer to uart cookie with information about the uart. Contains the
* uart device file, baudrate, parity, stopbits etc.
* @return The file descriptor of the configured uart.
*/
int configureUartPort(UartCookie* uartCookie);
/**
* @brief This function adds the parity settings to the termios options struct.
*
* @param options Pointer to termios options struct which will be modified to enable or disable
* parity checking.
* @param uartCookie Pointer to uart cookie containing the information about the desired
* parity settings.
*
*/
void setParityOptions(struct termios* options, UartCookie* uartCookie);
void setStopBitOptions(struct termios* options, UartCookie* uartCookie);
/**
* @brief This function sets options which are not configurable by the uartCookie.
*/
void setFixedOptions(struct termios* options);
/**
* @brief With this function the datasize settings are added to the termios options struct.
*/
void setDatasizeOptions(struct termios* options, UartCookie* uartCookie);
/**
* @brief This functions adds the baudrate specified in the uartCookie to the termios options
* struct.
*/
void configureBaudrate(struct termios* options, UartCookie* uartCookie);
void setUartMode(struct termios* options, UartCookie& uartCookie);
ReturnValue_t handleCanonicalRead(UartCookie& uartCookie, UartDeviceMapIter& iter,
size_t requestLen);
ReturnValue_t handleNoncanonicalRead(UartCookie& uartCookie, UartDeviceMapIter& iter,
size_t requestLen);
};
#endif /* BSP_Q7S_COMIF_UARTCOMIF_H_ */

View File

@ -1,97 +0,0 @@
#include "fsfw_hal/linux/uart/UartCookie.h"
#include <fsfw/serviceinterface/ServiceInterface.h>
UartCookie::UartCookie(object_id_t handlerId, std::string deviceFile, UartModes uartMode,
uint32_t baudrate, size_t maxReplyLen):
handlerId(handlerId), deviceFile(deviceFile), uartMode(uartMode),
baudrate(baudrate), maxReplyLen(maxReplyLen) {
}
UartCookie::~UartCookie() {}
uint32_t UartCookie::getBaudrate() const {
return baudrate;
}
size_t UartCookie::getMaxReplyLen() const {
return maxReplyLen;
}
std::string UartCookie::getDeviceFile() const {
return deviceFile;
}
void UartCookie::setParityOdd() {
parity = Parity::ODD;
}
void UartCookie::setParityEven() {
parity = Parity::EVEN;
}
Parity UartCookie::getParity() const {
return parity;
}
void UartCookie::setBitsPerWord(uint8_t bitsPerWord_) {
switch(bitsPerWord_) {
case 5:
case 6:
case 7:
case 8:
break;
default:
sif::debug << "UartCookie::setBitsPerWord: Invalid bits per word specified" << std::endl;
return;
}
bitsPerWord = bitsPerWord_;
}
uint8_t UartCookie::getBitsPerWord() const {
return bitsPerWord;
}
StopBits UartCookie::getStopBits() const {
return stopBits;
}
void UartCookie::setTwoStopBits() {
stopBits = StopBits::TWO_STOP_BITS;
}
void UartCookie::setOneStopBit() {
stopBits = StopBits::ONE_STOP_BIT;
}
UartModes UartCookie::getUartMode() const {
return uartMode;
}
void UartCookie::setReadCycles(uint8_t readCycles) {
this->readCycles = readCycles;
}
void UartCookie::setToFlushInput(bool enable) {
this->flushInput = enable;
}
uint8_t UartCookie::getReadCycles() const {
return readCycles;
}
bool UartCookie::getInputShouldBeFlushed() {
return this->flushInput;
}
object_id_t UartCookie::getHandlerId() const {
return this->handlerId;
}
void UartCookie::setNoFixedSizeReply() {
replySizeFixed = false;
}
bool UartCookie::isReplySizeFixed() {
return replySizeFixed;
}

View File

@ -1,121 +0,0 @@
#ifndef SAM9G20_COMIF_COOKIES_UART_COOKIE_H_
#define SAM9G20_COMIF_COOKIES_UART_COOKIE_H_
#include <fsfw/devicehandlers/CookieIF.h>
#include <fsfw/objectmanager/SystemObjectIF.h>
#include <string>
enum class Parity {
NONE,
EVEN,
ODD
};
enum class StopBits {
ONE_STOP_BIT,
TWO_STOP_BITS
};
enum class UartModes {
CANONICAL,
NON_CANONICAL
};
/**
* @brief Cookie for the UartComIF. There are many options available to configure the UART driver.
* The constructor only requests for common options like the baudrate. Other options can
* be set by member functions.
*
* @author J. Meier
*/
class UartCookie: public CookieIF {
public:
/**
* @brief Constructor for the uart cookie.
* @param deviceFile The device file specifying the uart to use, e.g. "/dev/ttyPS1"
* @param uartMode Specify the UART mode. The canonical mode should be used if the
* messages are separated by a delimited character like '\n'. See the
* termios documentation for more information
* @param baudrate The baudrate to use for input and output. Possible Baudrates are: 50,
* 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, B19200,
* 38400, 57600, 115200, 230400, 460800
* @param maxReplyLen The maximum size an object using this cookie expects
* @details
* Default configuration: No parity
* 8 databits (number of bits transfered with one uart frame)
* One stop bit
*/
UartCookie(object_id_t handlerId, std::string deviceFile, UartModes uartMode,
uint32_t baudrate, size_t maxReplyLen);
virtual ~UartCookie();
uint32_t getBaudrate() const;
size_t getMaxReplyLen() const;
std::string getDeviceFile() const;
Parity getParity() const;
uint8_t getBitsPerWord() const;
StopBits getStopBits() const;
UartModes getUartMode() const;
object_id_t getHandlerId() const;
/**
* The UART ComIF will only perform a specified number of read cycles for the canonical mode.
* The user can specify how many of those read cycles are performed for one device handler
* communication cycle. An example use-case would be to read all available GPS NMEA strings
* at once.
* @param readCycles
*/
void setReadCycles(uint8_t readCycles);
uint8_t getReadCycles() const;
/**
* Allows to flush the data which was received but has not been read yet. This is useful
* to discard obsolete data at software startup.
*/
void setToFlushInput(bool enable);
bool getInputShouldBeFlushed();
/**
* Functions two enable parity checking.
*/
void setParityOdd();
void setParityEven();
/**
* Function two set number of bits per UART frame.
*/
void setBitsPerWord(uint8_t bitsPerWord_);
/**
* Function to specify the number of stopbits.
*/
void setTwoStopBits();
void setOneStopBit();
/**
* Calling this function prevents the UartComIF to return failed if not all requested bytes
* could be read. This is required by a device handler when the size of a reply is not known.
*/
void setNoFixedSizeReply();
bool isReplySizeFixed();
private:
const object_id_t handlerId;
std::string deviceFile;
const UartModes uartMode;
bool flushInput = false;
uint32_t baudrate;
size_t maxReplyLen = 0;
Parity parity = Parity::NONE;
uint8_t bitsPerWord = 8;
uint8_t readCycles = 1;
StopBits stopBits = StopBits::ONE_STOP_BIT;
bool replySizeFixed = true;
};
#endif

View File

@ -1,26 +0,0 @@
#include "fsfw/FSFW.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
#include "fsfw_hal/linux/utility.h"
#include <cerrno>
#include <cstring>
void utility::handleIoctlError(const char* const customPrintout) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
if(customPrintout != nullptr) {
sif::warning << customPrintout << std::endl;
}
sif::warning << "handleIoctlError: Error code " << errno << ", "<< strerror(errno) <<
std::endl;
#else
if(customPrintout != nullptr) {
sif::printWarning("%s\n", customPrintout);
}
sif::printWarning("handleIoctlError: Error code %d, %s\n", errno, strerror(errno));
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
}

View File

@ -1,3 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
GyroL3GD20H.cpp
)

View File

@ -1,558 +0,0 @@
#include "fsfw_hal/stm32h7/devicetest/GyroL3GD20H.h"
#include "fsfw_hal/stm32h7/spi/mspInit.h"
#include "fsfw_hal/stm32h7/spi/spiDefinitions.h"
#include "fsfw_hal/stm32h7/spi/spiCore.h"
#include "fsfw_hal/stm32h7/spi/spiInterrupts.h"
#include "fsfw_hal/stm32h7/spi/stm32h743zi.h"
#include "fsfw/tasks/TaskFactory.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
#include "stm32h7xx_hal_spi.h"
#include "stm32h7xx_hal_rcc.h"
#include <cstring>
alignas(32) std::array<uint8_t, GyroL3GD20H::recvBufferSize> GyroL3GD20H::rxBuffer;
alignas(32) std::array<uint8_t, GyroL3GD20H::txBufferSize>
GyroL3GD20H::txBuffer __attribute__((section(".dma_buffer")));
TransferStates transferState = TransferStates::IDLE;
spi::TransferModes GyroL3GD20H::transferMode = spi::TransferModes::POLLING;
GyroL3GD20H::GyroL3GD20H(SPI_HandleTypeDef *spiHandle, spi::TransferModes transferMode_):
spiHandle(spiHandle) {
txDmaHandle = new DMA_HandleTypeDef();
rxDmaHandle = new DMA_HandleTypeDef();
spi::setSpiHandle(spiHandle);
spi::assignSpiUserArgs(spi::SpiBus::SPI_1, spiHandle);
transferMode = transferMode_;
if(transferMode == spi::TransferModes::DMA) {
mspCfg = new spi::MspDmaConfigStruct();
auto typedCfg = dynamic_cast<spi::MspDmaConfigStruct*>(mspCfg);
spi::setDmaHandles(txDmaHandle, rxDmaHandle);
stm32h7::h743zi::standardDmaCfg(*typedCfg, IrqPriorities::HIGHEST_FREERTOS,
IrqPriorities::HIGHEST_FREERTOS, IrqPriorities::HIGHEST_FREERTOS);
spi::setSpiDmaMspFunctions(typedCfg);
}
else if(transferMode == spi::TransferModes::INTERRUPT) {
mspCfg = new spi::MspIrqConfigStruct();
auto typedCfg = dynamic_cast<spi::MspIrqConfigStruct*>(mspCfg);
stm32h7::h743zi::standardInterruptCfg(*typedCfg, IrqPriorities::HIGHEST_FREERTOS);
spi::setSpiIrqMspFunctions(typedCfg);
}
else if(transferMode == spi::TransferModes::POLLING) {
mspCfg = new spi::MspPollingConfigStruct();
auto typedCfg = dynamic_cast<spi::MspPollingConfigStruct*>(mspCfg);
stm32h7::h743zi::standardPollingCfg(*typedCfg);
spi::setSpiPollingMspFunctions(typedCfg);
}
spi::assignTransferRxTxCompleteCallback(&spiTransferCompleteCallback, nullptr);
spi::assignTransferErrorCallback(&spiTransferErrorCallback, nullptr);
GPIO_InitTypeDef chipSelect = {};
__HAL_RCC_GPIOD_CLK_ENABLE();
chipSelect.Pin = GPIO_PIN_14;
chipSelect.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOD, &chipSelect);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
}
GyroL3GD20H::~GyroL3GD20H() {
delete txDmaHandle;
delete rxDmaHandle;
if(mspCfg != nullptr) {
delete mspCfg;
}
}
ReturnValue_t GyroL3GD20H::initialize() {
// Configure the SPI peripheral
spiHandle->Instance = SPI1;
spiHandle->Init.BaudRatePrescaler = spi::getPrescaler(HAL_RCC_GetHCLKFreq(), 3900000);
spiHandle->Init.Direction = SPI_DIRECTION_2LINES;
spi::assignSpiMode(spi::SpiModes::MODE_3, *spiHandle);
spiHandle->Init.DataSize = SPI_DATASIZE_8BIT;
spiHandle->Init.FirstBit = SPI_FIRSTBIT_MSB;
spiHandle->Init.TIMode = SPI_TIMODE_DISABLE;
spiHandle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
spiHandle->Init.CRCPolynomial = 7;
spiHandle->Init.CRCLength = SPI_CRC_LENGTH_8BIT;
spiHandle->Init.NSS = SPI_NSS_SOFT;
spiHandle->Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
// Recommended setting to avoid glitches
spiHandle->Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
spiHandle->Init.Mode = SPI_MODE_MASTER;
if(HAL_SPI_Init(spiHandle) != HAL_OK) {
sif::printWarning("Error initializing SPI\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
delete mspCfg;
transferState = TransferStates::WAIT;
sif::printInfo("GyroL3GD20H::performOperation: Reading WHO AM I register\n");
txBuffer[0] = WHO_AM_I_REG | STM_READ_MASK;
txBuffer[1] = 0;
switch(transferMode) {
case(spi::TransferModes::DMA): {
return handleDmaTransferInit();
}
case(spi::TransferModes::INTERRUPT): {
return handleInterruptTransferInit();
}
case(spi::TransferModes::POLLING): {
return handlePollingTransferInit();
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroL3GD20H::performOperation() {
switch(transferMode) {
case(spi::TransferModes::DMA): {
return handleDmaSensorRead();
}
case(spi::TransferModes::POLLING): {
return handlePollingSensorRead();
}
case(spi::TransferModes::INTERRUPT): {
return handleInterruptSensorRead();
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroL3GD20H::handleDmaTransferInit() {
/* Clean D-cache */
/* Make sure the address is 32-byte aligned and add 32-bytes to length,
in case it overlaps cacheline */
// See https://community.st.com/s/article/FAQ-DMA-is-not-working-on-STM32H7-devices
HAL_StatusTypeDef result = performDmaTransfer(2);
if(result != HAL_OK) {
// Transfer error in transmission process
sif::printWarning("GyroL3GD20H::initialize: Error transmitting SPI with DMA\n");
}
// Wait for the transfer to complete
while (transferState == TransferStates::WAIT) {
TaskFactory::delayTask(1);
}
switch(transferState) {
case(TransferStates::SUCCESS): {
uint8_t whoAmIVal = rxBuffer[1];
if(whoAmIVal != EXPECTED_WHO_AM_I_VAL) {
sif::printDebug("GyroL3GD20H::initialize: "
"Read WHO AM I value %d not equal to expected value!\n", whoAmIVal);
}
transferState = TransferStates::IDLE;
break;
}
case(TransferStates::FAILURE): {
sif::printWarning("Transfer failure\n");
transferState = TransferStates::FAILURE;
return HasReturnvaluesIF::RETURN_FAILED;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
sif::printInfo("GyroL3GD20H::initialize: Configuring device\n");
// Configure the 5 configuration registers
uint8_t configRegs[5];
prepareConfigRegs(configRegs);
result = performDmaTransfer(6);
if(result != HAL_OK) {
// Transfer error in transmission process
sif::printWarning("Error transmitting SPI with DMA\n");
}
// Wait for the transfer to complete
while (transferState == TransferStates::WAIT) {
TaskFactory::delayTask(1);
}
switch(transferState) {
case(TransferStates::SUCCESS): {
sif::printInfo("GyroL3GD20H::initialize: Configuration transfer success\n");
transferState = TransferStates::IDLE;
break;
}
case(TransferStates::FAILURE): {
sif::printWarning("GyroL3GD20H::initialize: Configuration transfer failure\n");
transferState = TransferStates::FAILURE;
return HasReturnvaluesIF::RETURN_FAILED;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
txBuffer[0] = CTRL_REG_1 | STM_AUTO_INCREMENT_MASK | STM_READ_MASK;
std::memset(txBuffer.data() + 1, 0 , 5);
result = performDmaTransfer(6);
if(result != HAL_OK) {
// Transfer error in transmission process
sif::printWarning("Error transmitting SPI with DMA\n");
}
// Wait for the transfer to complete
while (transferState == TransferStates::WAIT) {
TaskFactory::delayTask(1);
}
switch(transferState) {
case(TransferStates::SUCCESS): {
if(rxBuffer[1] != configRegs[0] or rxBuffer[2] != configRegs[1] or
rxBuffer[3] != configRegs[2] or rxBuffer[4] != configRegs[3] or
rxBuffer[5] != configRegs[4]) {
sif::printWarning("GyroL3GD20H::initialize: Configuration failure\n");
}
else {
sif::printInfo("GyroL3GD20H::initialize: Configuration success\n");
}
transferState = TransferStates::IDLE;
break;
}
case(TransferStates::FAILURE): {
sif::printWarning("GyroL3GD20H::initialize: Configuration transfer failure\n");
transferState = TransferStates::FAILURE;
return HasReturnvaluesIF::RETURN_FAILED;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroL3GD20H::handleDmaSensorRead() {
txBuffer[0] = CTRL_REG_1 | STM_AUTO_INCREMENT_MASK | STM_READ_MASK;
std::memset(txBuffer.data() + 1, 0 , 14);
HAL_StatusTypeDef result = performDmaTransfer(15);
if(result != HAL_OK) {
// Transfer error in transmission process
sif::printDebug("GyroL3GD20H::handleDmaSensorRead: Error transmitting SPI with DMA\n");
}
// Wait for the transfer to complete
while (transferState == TransferStates::WAIT) {
TaskFactory::delayTask(1);
}
switch(transferState) {
case(TransferStates::SUCCESS): {
handleSensorReadout();
break;
}
case(TransferStates::FAILURE): {
sif::printWarning("GyroL3GD20H::handleDmaSensorRead: Sensor read failure\n");
transferState = TransferStates::FAILURE;
return HasReturnvaluesIF::RETURN_FAILED;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
HAL_StatusTypeDef GyroL3GD20H::performDmaTransfer(size_t sendSize) {
transferState = TransferStates::WAIT;
#if STM_USE_PERIPHERAL_TX_BUFFER_MPU_PROTECTION == 0
SCB_CleanDCache_by_Addr((uint32_t*)(((uint32_t)txBuffer.data()) & ~(uint32_t)0x1F),
txBuffer.size()+32);
#endif
// Start SPI transfer via DMA
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
return HAL_SPI_TransmitReceive_DMA(spiHandle, txBuffer.data(), rxBuffer.data(), sendSize);
}
ReturnValue_t GyroL3GD20H::handlePollingTransferInit() {
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
auto result = HAL_SPI_TransmitReceive(spiHandle, txBuffer.data(), rxBuffer.data(), 2, 1000);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
switch(result) {
case(HAL_OK): {
sif::printInfo("GyroL3GD20H::initialize: Polling transfer success\n");
uint8_t whoAmIVal = rxBuffer[1];
if(whoAmIVal != EXPECTED_WHO_AM_I_VAL) {
sif::printDebug("GyroL3GD20H::performOperation: "
"Read WHO AM I value %d not equal to expected value!\n", whoAmIVal);
}
break;
}
case(HAL_TIMEOUT): {
sif::printDebug("GyroL3GD20H::initialize: Polling transfer timeout\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
case(HAL_ERROR): {
sif::printDebug("GyroL3GD20H::initialize: Polling transfer failure\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
sif::printInfo("GyroL3GD20H::initialize: Configuring device\n");
// Configure the 5 configuration registers
uint8_t configRegs[5];
prepareConfigRegs(configRegs);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
result = HAL_SPI_TransmitReceive(spiHandle, txBuffer.data(), rxBuffer.data(), 6, 1000);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
switch(result) {
case(HAL_OK): {
break;
}
case(HAL_TIMEOUT): {
sif::printDebug("GyroL3GD20H::initialize: Polling transfer timeout\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
case(HAL_ERROR): {
sif::printDebug("GyroL3GD20H::initialize: Polling transfer failure\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
txBuffer[0] = CTRL_REG_1 | STM_AUTO_INCREMENT_MASK | STM_READ_MASK;
std::memset(txBuffer.data() + 1, 0 , 5);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
result = HAL_SPI_TransmitReceive(spiHandle, txBuffer.data(), rxBuffer.data(), 6, 1000);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
switch(result) {
case(HAL_OK): {
if(rxBuffer[1] != configRegs[0] or rxBuffer[2] != configRegs[1] or
rxBuffer[3] != configRegs[2] or rxBuffer[4] != configRegs[3] or
rxBuffer[5] != configRegs[4]) {
sif::printWarning("GyroL3GD20H::initialize: Configuration failure\n");
}
else {
sif::printInfo("GyroL3GD20H::initialize: Configuration success\n");
}
break;
}
case(HAL_TIMEOUT): {
sif::printDebug("GyroL3GD20H::initialize: Polling transfer timeout\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
case(HAL_ERROR): {
sif::printDebug("GyroL3GD20H::initialize: Polling transfer failure\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroL3GD20H::handlePollingSensorRead() {
txBuffer[0] = CTRL_REG_1 | STM_AUTO_INCREMENT_MASK | STM_READ_MASK;
std::memset(txBuffer.data() + 1, 0 , 14);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
auto result = HAL_SPI_TransmitReceive(spiHandle, txBuffer.data(), rxBuffer.data(), 15, 1000);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
switch(result) {
case(HAL_OK): {
handleSensorReadout();
break;
}
case(HAL_TIMEOUT): {
sif::printDebug("GyroL3GD20H::initialize: Polling transfer timeout\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
case(HAL_ERROR): {
sif::printDebug("GyroL3GD20H::initialize: Polling transfer failure\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroL3GD20H::handleInterruptTransferInit() {
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
switch(HAL_SPI_TransmitReceive_IT(spiHandle, txBuffer.data(), rxBuffer.data(), 2)) {
case(HAL_OK): {
sif::printInfo("GyroL3GD20H::initialize: Interrupt transfer success\n");
// Wait for the transfer to complete
while (transferState == TransferStates::WAIT) {
TaskFactory::delayTask(1);
}
uint8_t whoAmIVal = rxBuffer[1];
if(whoAmIVal != EXPECTED_WHO_AM_I_VAL) {
sif::printDebug("GyroL3GD20H::initialize: "
"Read WHO AM I value %d not equal to expected value!\n", whoAmIVal);
}
break;
}
case(HAL_BUSY):
case(HAL_ERROR):
case(HAL_TIMEOUT): {
sif::printDebug("GyroL3GD20H::initialize: Initialization failure using interrupts\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
}
sif::printInfo("GyroL3GD20H::initialize: Configuring device\n");
transferState = TransferStates::WAIT;
// Configure the 5 configuration registers
uint8_t configRegs[5];
prepareConfigRegs(configRegs);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
switch(HAL_SPI_TransmitReceive_IT(spiHandle, txBuffer.data(), rxBuffer.data(), 6)) {
case(HAL_OK): {
// Wait for the transfer to complete
while (transferState == TransferStates::WAIT) {
TaskFactory::delayTask(1);
}
break;
}
case(HAL_BUSY):
case(HAL_ERROR):
case(HAL_TIMEOUT): {
sif::printDebug("GyroL3GD20H::initialize: Initialization failure using interrupts\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
}
txBuffer[0] = CTRL_REG_1 | STM_AUTO_INCREMENT_MASK | STM_READ_MASK;
std::memset(txBuffer.data() + 1, 0 , 5);
transferState = TransferStates::WAIT;
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
switch(HAL_SPI_TransmitReceive_IT(spiHandle, txBuffer.data(), rxBuffer.data(), 6)) {
case(HAL_OK): {
// Wait for the transfer to complete
while (transferState == TransferStates::WAIT) {
TaskFactory::delayTask(1);
}
if(rxBuffer[1] != configRegs[0] or rxBuffer[2] != configRegs[1] or
rxBuffer[3] != configRegs[2] or rxBuffer[4] != configRegs[3] or
rxBuffer[5] != configRegs[4]) {
sif::printWarning("GyroL3GD20H::initialize: Configuration failure\n");
}
else {
sif::printInfo("GyroL3GD20H::initialize: Configuration success\n");
}
break;
}
case(HAL_BUSY):
case(HAL_ERROR):
case(HAL_TIMEOUT): {
sif::printDebug("GyroL3GD20H::initialize: Initialization failure using interrupts\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t GyroL3GD20H::handleInterruptSensorRead() {
transferState = TransferStates::WAIT;
txBuffer[0] = CTRL_REG_1 | STM_AUTO_INCREMENT_MASK | STM_READ_MASK;
std::memset(txBuffer.data() + 1, 0 , 14);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
switch(HAL_SPI_TransmitReceive_IT(spiHandle, txBuffer.data(), rxBuffer.data(), 15)) {
case(HAL_OK): {
// Wait for the transfer to complete
while (transferState == TransferStates::WAIT) {
TaskFactory::delayTask(1);
}
handleSensorReadout();
break;
}
case(HAL_BUSY):
case(HAL_ERROR):
case(HAL_TIMEOUT): {
sif::printDebug("GyroL3GD20H::initialize: Sensor read failure using interrupts\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
void GyroL3GD20H::prepareConfigRegs(uint8_t* configRegs) {
// Enable sensor
configRegs[0] = 0b00001111;
configRegs[1] = 0b00000000;
configRegs[2] = 0b00000000;
// Big endian select
configRegs[3] = 0b01000000;
configRegs[4] = 0b00000000;
txBuffer[0] = CTRL_REG_1 | STM_AUTO_INCREMENT_MASK;
std::memcpy(txBuffer.data() + 1, configRegs, 5);
}
uint8_t GyroL3GD20H::readRegPolling(uint8_t reg) {
uint8_t rxBuf[2] = {};
uint8_t txBuf[2] = {};
txBuf[0] = reg | STM_READ_MASK;
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
auto result = HAL_SPI_TransmitReceive(spiHandle, txBuf, rxBuf, 2, 1000);
if(result) {};
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
return rxBuf[1];
}
void GyroL3GD20H::handleSensorReadout() {
uint8_t statusReg = rxBuffer[8];
int16_t gyroXRaw = rxBuffer[9] << 8 | rxBuffer[10];
float gyroX = static_cast<float>(gyroXRaw) * 0.00875;
int16_t gyroYRaw = rxBuffer[11] << 8 | rxBuffer[12];
float gyroY = static_cast<float>(gyroYRaw) * 0.00875;
int16_t gyroZRaw = rxBuffer[13] << 8 | rxBuffer[14];
float gyroZ = static_cast<float>(gyroZRaw) * 0.00875;
sif::printInfo("Status register: 0b" BYTE_TO_BINARY_PATTERN "\n", BYTE_TO_BINARY(statusReg));
sif::printInfo("Gyro X: %f\n", gyroX);
sif::printInfo("Gyro Y: %f\n", gyroY);
sif::printInfo("Gyro Z: %f\n", gyroZ);
}
void GyroL3GD20H::spiTransferCompleteCallback(SPI_HandleTypeDef *hspi, void* args) {
transferState = TransferStates::SUCCESS;
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
if(GyroL3GD20H::transferMode == spi::TransferModes::DMA) {
// Invalidate cache prior to access by CPU
SCB_InvalidateDCache_by_Addr ((uint32_t *)GyroL3GD20H::rxBuffer.data(),
GyroL3GD20H::recvBufferSize);
}
}
/**
* @brief SPI error callbacks.
* @param hspi: SPI handle
* @note This example shows a simple way to report transfer error, and you can
* add your own implementation.
* @retval None
*/
void GyroL3GD20H::spiTransferErrorCallback(SPI_HandleTypeDef *hspi, void* args) {
transferState = TransferStates::FAILURE;
}

View File

@ -1,70 +0,0 @@
#ifndef FSFW_HAL_STM32H7_DEVICETEST_GYRO_L3GD20H_H_
#define FSFW_HAL_STM32H7_DEVICETEST_GYRO_L3GD20H_H_
#include "stm32h7xx_hal.h"
#include "stm32h7xx_hal_spi.h"
#include "../spi/mspInit.h"
#include "../spi/spiDefinitions.h"
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
#include <cstdint>
#include <array>
enum class TransferStates {
IDLE,
WAIT,
SUCCESS,
FAILURE
};
class GyroL3GD20H {
public:
GyroL3GD20H(SPI_HandleTypeDef* spiHandle, spi::TransferModes transferMode);
~GyroL3GD20H();
ReturnValue_t initialize();
ReturnValue_t performOperation();
private:
const uint8_t WHO_AM_I_REG = 0b00001111;
const uint8_t STM_READ_MASK = 0b10000000;
const uint8_t STM_AUTO_INCREMENT_MASK = 0b01000000;
const uint8_t EXPECTED_WHO_AM_I_VAL = 0b11010111;
const uint8_t CTRL_REG_1 = 0b00100000;
const uint32_t L3G_RANGE = 245;
SPI_HandleTypeDef* spiHandle;
static spi::TransferModes transferMode;
static constexpr size_t recvBufferSize = 32 * 10;
static std::array<uint8_t, recvBufferSize> rxBuffer;
static constexpr size_t txBufferSize = 32;
static std::array<uint8_t, txBufferSize> txBuffer;
ReturnValue_t handleDmaTransferInit();
ReturnValue_t handlePollingTransferInit();
ReturnValue_t handleInterruptTransferInit();
ReturnValue_t handleDmaSensorRead();
HAL_StatusTypeDef performDmaTransfer(size_t sendSize);
ReturnValue_t handlePollingSensorRead();
ReturnValue_t handleInterruptSensorRead();
uint8_t readRegPolling(uint8_t reg);
static void spiTransferCompleteCallback(SPI_HandleTypeDef *hspi, void* args);
static void spiTransferErrorCallback(SPI_HandleTypeDef *hspi, void* args);
void prepareConfigRegs(uint8_t* configRegs);
void handleSensorReadout();
DMA_HandleTypeDef* txDmaHandle = {};
DMA_HandleTypeDef* rxDmaHandle = {};
spi::MspCfgBase* mspCfg = {};
};
#endif /* FSFW_HAL_STM32H7_DEVICETEST_GYRO_L3GD20H_H_ */

View File

@ -1,84 +0,0 @@
#include <fsfw_hal/stm32h7/dma.h>
#include <cstdint>
#include <cstddef>
user_handler_t DMA_1_USER_HANDLERS[8];
user_args_t DMA_1_USER_ARGS[8];
user_handler_t DMA_2_USER_HANDLERS[8];
user_args_t DMA_2_USER_ARGS[8];
void dma::assignDmaUserHandler(DMAIndexes dma_idx, DMAStreams stream_idx,
user_handler_t user_handler, user_args_t user_args) {
if(dma_idx == DMA_1) {
DMA_1_USER_HANDLERS[stream_idx] = user_handler;
DMA_1_USER_ARGS[stream_idx] = user_args;
}
else if(dma_idx == DMA_2) {
DMA_2_USER_HANDLERS[stream_idx] = user_handler;
DMA_2_USER_ARGS[stream_idx] = user_args;
}
}
// The interrupt handlers in the format required for the IRQ vector table
/* Do not change these function names! They need to be exactly equal to the name of the functions
defined in the startup_stm32h743xx.s files! */
#define GENERIC_DMA_IRQ_HANDLER(DMA_IDX, STREAM_IDX) \
if(DMA_##DMA_IDX##_USER_HANDLERS[STREAM_IDX] != NULL) { \
DMA_##DMA_IDX##_USER_HANDLERS[STREAM_IDX](DMA_##DMA_IDX##_USER_ARGS[STREAM_IDX]); \
return; \
} \
Default_Handler() \
extern"C" void DMA1_Stream0_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(1, 0);
}
extern"C" void DMA1_Stream1_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(1, 1);
}
extern"C" void DMA1_Stream2_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(1, 2);
}
extern"C" void DMA1_Stream3_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(1, 3);
}
extern"C" void DMA1_Stream4_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(1, 4);
}
extern"C" void DMA1_Stream5_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(1, 5);
}
extern"C" void DMA1_Stream6_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(1, 6);
}
extern"C" void DMA1_Stream7_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(1, 7);
}
extern"C" void DMA2_Stream0_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(2, 0);
}
extern"C" void DMA2_Stream1_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(2, 1);
}
extern"C" void DMA2_Stream2_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(2, 2);
}
extern"C" void DMA2_Stream3_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(2, 3);
}
extern"C" void DMA2_Stream4_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(2, 4);
}
extern"C" void DMA2_Stream5_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(2, 5);
}
extern"C" void DMA2_Stream6_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(2, 6);
}
extern"C" void DMA2_Stream7_IRQHandler() {
GENERIC_DMA_IRQ_HANDLER(2, 7);
}

View File

@ -1,3 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
gpio.cpp
)

View File

@ -1,71 +0,0 @@
#include "fsfw_hal/stm32h7/gpio/gpio.h"
#include "stm32h7xx_hal_rcc.h"
void gpio::initializeGpioClock(GPIO_TypeDef* gpioPort) {
#ifdef GPIOA
if(gpioPort == GPIOA) {
__HAL_RCC_GPIOA_CLK_ENABLE();
}
#endif
#ifdef GPIOB
if(gpioPort == GPIOB) {
__HAL_RCC_GPIOB_CLK_ENABLE();
}
#endif
#ifdef GPIOC
if(gpioPort == GPIOC) {
__HAL_RCC_GPIOC_CLK_ENABLE();
}
#endif
#ifdef GPIOD
if(gpioPort == GPIOD) {
__HAL_RCC_GPIOD_CLK_ENABLE();
}
#endif
#ifdef GPIOE
if(gpioPort == GPIOE) {
__HAL_RCC_GPIOE_CLK_ENABLE();
}
#endif
#ifdef GPIOF
if(gpioPort == GPIOF) {
__HAL_RCC_GPIOF_CLK_ENABLE();
}
#endif
#ifdef GPIOG
if(gpioPort == GPIOG) {
__HAL_RCC_GPIOG_CLK_ENABLE();
}
#endif
#ifdef GPIOH
if(gpioPort == GPIOH) {
__HAL_RCC_GPIOH_CLK_ENABLE();
}
#endif
#ifdef GPIOI
if(gpioPort == GPIOI) {
__HAL_RCC_GPIOI_CLK_ENABLE();
}
#endif
#ifdef GPIOJ
if(gpioPort == GPIOJ) {
__HAL_RCC_GPIOJ_CLK_ENABLE();
}
#endif
#ifdef GPIOK
if(gpioPort == GPIOK) {
__HAL_RCC_GPIOK_CLK_ENABLE();
}
#endif
}

View File

@ -1,2 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
)

View File

@ -1,9 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
spiCore.cpp
spiDefinitions.cpp
spiInterrupts.cpp
mspInit.cpp
SpiCookie.cpp
SpiComIF.cpp
stm32h743zi.cpp
)

View File

@ -1,480 +0,0 @@
#include "fsfw_hal/stm32h7/spi/SpiComIF.h"
#include "fsfw_hal/stm32h7/spi/SpiCookie.h"
#include "fsfw/tasks/SemaphoreFactory.h"
#include "fsfw_hal/stm32h7/spi/spiCore.h"
#include "fsfw_hal/stm32h7/spi/spiInterrupts.h"
#include "fsfw_hal/stm32h7/spi/mspInit.h"
#include "fsfw_hal/stm32h7/gpio/gpio.h"
// FreeRTOS required special Semaphore handling from an ISR. Therefore, we use the concrete
// instance here, because RTEMS and FreeRTOS are the only relevant OSALs currently
// and it is not trivial to add a releaseFromISR to the SemaphoreIF
#if defined FSFW_OSAL_RTEMS
#include "fsfw/osal/rtems/BinarySemaphore.h"
#elif defined FSFW_OSAL_FREERTOS
#include "fsfw/osal/freertos/TaskManagement.h"
#include "fsfw/osal/freertos/BinarySemaphore.h"
#endif
#include "stm32h7xx_hal_gpio.h"
SpiComIF::SpiComIF(object_id_t objectId): SystemObject(objectId) {
void* irqArgsVoided = reinterpret_cast<void*>(&irqArgs);
spi::assignTransferRxTxCompleteCallback(&spiTransferCompleteCallback, irqArgsVoided);
spi::assignTransferRxCompleteCallback(&spiTransferRxCompleteCallback, irqArgsVoided);
spi::assignTransferTxCompleteCallback(&spiTransferTxCompleteCallback, irqArgsVoided);
spi::assignTransferErrorCallback(&spiTransferErrorCallback, irqArgsVoided);
}
void SpiComIF::configureCacheMaintenanceOnTxBuffer(bool enable) {
this->cacheMaintenanceOnTxBuffer = enable;
}
void SpiComIF::addDmaHandles(DMA_HandleTypeDef *txHandle, DMA_HandleTypeDef *rxHandle) {
spi::setDmaHandles(txHandle, rxHandle);
}
ReturnValue_t SpiComIF::initialize() {
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t SpiComIF::initializeInterface(CookieIF *cookie) {
SpiCookie* spiCookie = dynamic_cast<SpiCookie*>(cookie);
if(spiCookie == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error < "SpiComIF::initializeInterface: Invalid cookie" << std::endl;
#else
sif::printError("SpiComIF::initializeInterface: Invalid cookie\n");
#endif
return NULLPOINTER;
}
auto transferMode = spiCookie->getTransferMode();
if(transferMode == spi::TransferModes::DMA) {
DMA_HandleTypeDef *txHandle = nullptr;
DMA_HandleTypeDef *rxHandle = nullptr;
spi::getDmaHandles(&txHandle, &rxHandle);
if(txHandle == nullptr or rxHandle == nullptr) {
sif::printError("SpiComIF::initialize: DMA handles not set!\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
}
// This semaphore ensures thread-safety for a given bus
spiSemaphore = dynamic_cast<BinarySemaphore*>(
SemaphoreFactory::instance()->createBinarySemaphore());
address_t spiAddress = spiCookie->getDeviceAddress();
auto iter = spiDeviceMap.find(spiAddress);
if(iter == spiDeviceMap.end()) {
size_t bufferSize = spiCookie->getMaxRecvSize();
auto statusPair = spiDeviceMap.emplace(spiAddress, SpiInstance(bufferSize));
if (not statusPair.second) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "SpiComIF::initializeInterface: Failed to insert device with address " <<
spiAddress << "to SPI device map" << std::endl;
#else
sif::printError("SpiComIF::initializeInterface: Failed to insert device with address "
"%lu to SPI device map\n", static_cast<unsigned long>(spiAddress));
#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */
#endif /* FSFW_VERBOSE_LEVEL >= 1 */
return HasReturnvaluesIF::RETURN_FAILED;
}
}
auto gpioPin = spiCookie->getChipSelectGpioPin();
auto gpioPort = spiCookie->getChipSelectGpioPort();
SPI_HandleTypeDef& spiHandle = spiCookie->getSpiHandle();
auto spiIdx = spiCookie->getSpiIdx();
if(spiIdx == spi::SpiBus::SPI_1) {
#ifdef SPI1
spiHandle.Instance = SPI1;
#endif
}
else if(spiIdx == spi::SpiBus::SPI_2) {
#ifdef SPI2
spiHandle.Instance = SPI2;
#endif
}
else {
printCfgError("SPI Bus Index");
return HasReturnvaluesIF::RETURN_FAILED;
}
auto mspCfg = spiCookie->getMspCfg();
if(transferMode == spi::TransferModes::POLLING) {
auto typedCfg = dynamic_cast<spi::MspPollingConfigStruct*>(mspCfg);
if(typedCfg == nullptr) {
printCfgError("Polling MSP");
return HasReturnvaluesIF::RETURN_FAILED;
}
spi::setSpiPollingMspFunctions(typedCfg);
}
else if(transferMode == spi::TransferModes::INTERRUPT) {
auto typedCfg = dynamic_cast<spi::MspIrqConfigStruct*>(mspCfg);
if(typedCfg == nullptr) {
printCfgError("IRQ MSP");
return HasReturnvaluesIF::RETURN_FAILED;
}
spi::setSpiIrqMspFunctions(typedCfg);
}
else if(transferMode == spi::TransferModes::DMA) {
auto typedCfg = dynamic_cast<spi::MspDmaConfigStruct*>(mspCfg);
if(typedCfg == nullptr) {
printCfgError("DMA MSP");
return HasReturnvaluesIF::RETURN_FAILED;
}
// Check DMA handles
DMA_HandleTypeDef* txHandle = nullptr;
DMA_HandleTypeDef* rxHandle = nullptr;
spi::getDmaHandles(&txHandle, &rxHandle);
if(txHandle == nullptr or rxHandle == nullptr) {
printCfgError("DMA Handle");
return HasReturnvaluesIF::RETURN_FAILED;
}
spi::setSpiDmaMspFunctions(typedCfg);
}
if(gpioPort != nullptr) {
gpio::initializeGpioClock(gpioPort);
GPIO_InitTypeDef chipSelect = {};
chipSelect.Pin = gpioPin;
chipSelect.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(gpioPort, &chipSelect);
HAL_GPIO_WritePin(gpioPort, gpioPin, GPIO_PIN_SET);
}
if(HAL_SPI_Init(&spiHandle) != HAL_OK) {
sif::printWarning("SpiComIF::initialize: Error initializing SPI\n");
return HasReturnvaluesIF::RETURN_FAILED;
}
// The MSP configuration struct is not required anymore
spiCookie->deleteMspCfg();
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t SpiComIF::sendMessage(CookieIF *cookie, const uint8_t *sendData, size_t sendLen) {
SpiCookie* spiCookie = dynamic_cast<SpiCookie*>(cookie);
if(spiCookie == nullptr) {
return NULLPOINTER;
}
SPI_HandleTypeDef& spiHandle = spiCookie->getSpiHandle();
auto iter = spiDeviceMap.find(spiCookie->getDeviceAddress());
if(iter == spiDeviceMap.end()) {
return HasReturnvaluesIF::RETURN_FAILED;
}
iter->second.currentTransferLen = sendLen;
auto transferMode = spiCookie->getTransferMode();
switch(spiCookie->getTransferState()) {
case(spi::TransferStates::IDLE): {
break;
}
case(spi::TransferStates::WAIT):
case(spi::TransferStates::FAILURE):
case(spi::TransferStates::SUCCESS):
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
switch(transferMode) {
case(spi::TransferModes::POLLING): {
return handlePollingSendOperation(iter->second.replyBuffer.data(), spiHandle, *spiCookie,
sendData, sendLen);
}
case(spi::TransferModes::INTERRUPT): {
return handleInterruptSendOperation(iter->second.replyBuffer.data(), spiHandle, *spiCookie,
sendData, sendLen);
}
case(spi::TransferModes::DMA): {
return handleDmaSendOperation(iter->second.replyBuffer.data(), spiHandle, *spiCookie,
sendData, sendLen);
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t SpiComIF::getSendSuccess(CookieIF *cookie) {
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t SpiComIF::requestReceiveMessage(CookieIF *cookie, size_t requestLen) {
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t SpiComIF::readReceivedMessage(CookieIF *cookie, uint8_t **buffer, size_t *size) {
SpiCookie* spiCookie = dynamic_cast<SpiCookie*>(cookie);
if(spiCookie == nullptr) {
return NULLPOINTER;
}
switch(spiCookie->getTransferState()) {
case(spi::TransferStates::SUCCESS): {
auto iter = spiDeviceMap.find(spiCookie->getDeviceAddress());
if(iter == spiDeviceMap.end()) {
return HasReturnvaluesIF::RETURN_FAILED;
}
*buffer = iter->second.replyBuffer.data();
*size = iter->second.currentTransferLen;
spiCookie->setTransferState(spi::TransferStates::IDLE);
break;
}
case(spi::TransferStates::FAILURE): {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "SpiComIF::readReceivedMessage: Transfer failure" << std::endl;
#else
sif::printWarning("SpiComIF::readReceivedMessage: Transfer failure\n");
#endif
#endif
spiCookie->setTransferState(spi::TransferStates::IDLE);
return HasReturnvaluesIF::RETURN_FAILED;
}
case(spi::TransferStates::WAIT):
case(spi::TransferStates::IDLE): {
break;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
void SpiComIF::setDefaultPollingTimeout(dur_millis_t timeout) {
this->defaultPollingTimeout = timeout;
}
ReturnValue_t SpiComIF::handlePollingSendOperation(uint8_t* recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t *sendData, size_t sendLen) {
auto gpioPort = spiCookie.getChipSelectGpioPort();
auto gpioPin = spiCookie.getChipSelectGpioPin();
auto returnval = spiSemaphore->acquire(timeoutType, timeoutMs);
if(returnval != HasReturnvaluesIF::RETURN_OK) {
return returnval;
}
spiCookie.setTransferState(spi::TransferStates::WAIT);
if(gpioPort != nullptr) {
HAL_GPIO_WritePin(gpioPort, gpioPin, GPIO_PIN_RESET);
}
auto result = HAL_SPI_TransmitReceive(&spiHandle, const_cast<uint8_t*>(sendData),
recvPtr, sendLen, defaultPollingTimeout);
if(gpioPort != nullptr) {
HAL_GPIO_WritePin(gpioPort, gpioPin, GPIO_PIN_SET);
}
spiSemaphore->release();
switch(result) {
case(HAL_OK): {
spiCookie.setTransferState(spi::TransferStates::SUCCESS);
break;
}
case(HAL_TIMEOUT): {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "SpiComIF::sendMessage: Polling Mode | Timeout for SPI device" <<
spiCookie->getDeviceAddress() << std::endl;
#else
sif::printWarning("SpiComIF::sendMessage: Polling Mode | Timeout for SPI device %d\n",
spiCookie.getDeviceAddress());
#endif
#endif
spiCookie.setTransferState(spi::TransferStates::FAILURE);
return spi::HAL_TIMEOUT_RETVAL;
}
case(HAL_ERROR):
default: {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "SpiComIF::sendMessage: Polling Mode | HAL error for SPI device" <<
spiCookie->getDeviceAddress() << std::endl;
#else
sif::printWarning("SpiComIF::sendMessage: Polling Mode | HAL error for SPI device %d\n",
spiCookie.getDeviceAddress());
#endif
#endif
spiCookie.setTransferState(spi::TransferStates::FAILURE);
return spi::HAL_ERROR_RETVAL;
}
}
return HasReturnvaluesIF::RETURN_OK;
}
ReturnValue_t SpiComIF::handleInterruptSendOperation(uint8_t* recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t * sendData, size_t sendLen) {
return handleIrqSendOperation(recvPtr, spiHandle, spiCookie, sendData, sendLen);
}
ReturnValue_t SpiComIF::handleDmaSendOperation(uint8_t* recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t * sendData, size_t sendLen) {
return handleIrqSendOperation(recvPtr, spiHandle, spiCookie, sendData, sendLen);
}
ReturnValue_t SpiComIF::handleIrqSendOperation(uint8_t *recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t *sendData, size_t sendLen) {
ReturnValue_t result = genericIrqSendSetup(recvPtr, spiHandle, spiCookie, sendData, sendLen);
if(result != HasReturnvaluesIF::RETURN_OK) {
return result;
}
// yet another HAL driver which is not const-correct..
HAL_StatusTypeDef status = HAL_OK;
auto transferMode = spiCookie.getTransferMode();
if(transferMode == spi::TransferModes::DMA) {
if(cacheMaintenanceOnTxBuffer) {
/* Clean D-cache. Make sure the address is 32-byte aligned and add 32-bytes to length,
in case it overlaps cacheline */
SCB_CleanDCache_by_Addr((uint32_t*)(((uint32_t) sendData ) & ~(uint32_t)0x1F),
sendLen + 32);
}
status = HAL_SPI_TransmitReceive_DMA(&spiHandle, const_cast<uint8_t*>(sendData),
currentRecvPtr, sendLen);
}
else {
status = HAL_SPI_TransmitReceive_IT(&spiHandle, const_cast<uint8_t*>(sendData),
currentRecvPtr, sendLen);
}
switch(status) {
case(HAL_OK): {
break;
}
default: {
return halErrorHandler(status, transferMode);
}
}
return result;
}
ReturnValue_t SpiComIF::halErrorHandler(HAL_StatusTypeDef status, spi::TransferModes transferMode) {
char modeString[10];
if(transferMode == spi::TransferModes::DMA) {
std::snprintf(modeString, sizeof(modeString), "Dma");
}
else {
std::snprintf(modeString, sizeof(modeString), "Interrupt");
}
sif::printWarning("SpiComIF::handle%sSendOperation: HAL error %d occured\n", modeString,
status);
switch(status) {
case(HAL_BUSY): {
return spi::HAL_BUSY_RETVAL;
}
case(HAL_ERROR): {
return spi::HAL_ERROR_RETVAL;
}
case(HAL_TIMEOUT): {
return spi::HAL_TIMEOUT_RETVAL;
}
default: {
return HasReturnvaluesIF::RETURN_FAILED;
}
}
}
ReturnValue_t SpiComIF::genericIrqSendSetup(uint8_t *recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t *sendData, size_t sendLen) {
currentRecvPtr = recvPtr;
currentRecvBuffSize = sendLen;
// Take the semaphore which will be released by a callback when the transfer is complete
ReturnValue_t result = spiSemaphore->acquire(SemaphoreIF::TimeoutType::WAITING, timeoutMs);
if(result != HasReturnvaluesIF::RETURN_OK) {
// Configuration error
sif::printWarning("SpiComIF::handleInterruptSendOperation: Semaphore "
"could not be acquired after %d ms\n", timeoutMs);
return result;
}
// Cache the current SPI handle in any case
spi::setSpiHandle(&spiHandle);
// Assign the IRQ arguments for the user callbacks
irqArgs.comIF = this;
irqArgs.spiCookie = &spiCookie;
// The SPI handle is passed to the default SPI callback as a void argument. This callback
// is different from the user callbacks specified above!
spi::assignSpiUserArgs(spiCookie.getSpiIdx(), reinterpret_cast<void*>(&spiHandle));
if(spiCookie.getChipSelectGpioPort() != nullptr) {
HAL_GPIO_WritePin(spiCookie.getChipSelectGpioPort(), spiCookie.getChipSelectGpioPin(),
GPIO_PIN_RESET);
}
return HasReturnvaluesIF::RETURN_OK;
}
void SpiComIF::spiTransferTxCompleteCallback(SPI_HandleTypeDef *hspi, void *args) {
genericIrqHandler(args, spi::TransferStates::SUCCESS);
}
void SpiComIF::spiTransferRxCompleteCallback(SPI_HandleTypeDef *hspi, void *args) {
genericIrqHandler(args, spi::TransferStates::SUCCESS);
}
void SpiComIF::spiTransferCompleteCallback(SPI_HandleTypeDef *hspi, void *args) {
genericIrqHandler(args, spi::TransferStates::SUCCESS);
}
void SpiComIF::spiTransferErrorCallback(SPI_HandleTypeDef *hspi, void *args) {
genericIrqHandler(args, spi::TransferStates::FAILURE);
}
void SpiComIF::genericIrqHandler(void *irqArgsVoid, spi::TransferStates targetState) {
IrqArgs* irqArgs = reinterpret_cast<IrqArgs*>(irqArgsVoid);
if(irqArgs == nullptr) {
return;
}
SpiCookie* spiCookie = irqArgs->spiCookie;
SpiComIF* comIF = irqArgs->comIF;
if(spiCookie == nullptr or comIF == nullptr) {
return;
}
spiCookie->setTransferState(targetState);
if(spiCookie->getChipSelectGpioPort() != nullptr) {
// Pull CS pin high again
HAL_GPIO_WritePin(spiCookie->getChipSelectGpioPort(), spiCookie->getChipSelectGpioPin(),
GPIO_PIN_SET);
}
#if defined FSFW_OSAL_FREERTOS
// Release the task semaphore
BaseType_t taskWoken = pdFALSE;
ReturnValue_t result = BinarySemaphore::releaseFromISR(comIF->spiSemaphore->getSemaphore(),
&taskWoken);
#elif defined FSFW_OSAL_RTEMS
ReturnValue_t result = comIF->spiSemaphore->release();
#endif
if(result != HasReturnvaluesIF::RETURN_OK) {
// Configuration error
printf("SpiComIF::genericIrqHandler: Failure releasing Semaphore!\n");
}
// Perform cache maintenance operation for DMA transfers
if(spiCookie->getTransferMode() == spi::TransferModes::DMA) {
// Invalidate cache prior to access by CPU
SCB_InvalidateDCache_by_Addr ((uint32_t *) comIF->currentRecvPtr,
comIF->currentRecvBuffSize);
}
#if defined FSFW_OSAL_FREERTOS
/* Request a context switch if the SPI ComIF task was woken up and has a higher priority
than the currently running task */
if(taskWoken == pdTRUE) {
TaskManagement::requestContextSwitch(CallContext::ISR);
}
#endif
}
void SpiComIF::printCfgError(const char *const type) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "SpiComIF::initializeInterface: Invalid " << type << " configuration"
<< std::endl;
#else
sif::printWarning("SpiComIF::initializeInterface: Invalid %s configuration\n", type);
#endif
}

View File

@ -1,129 +0,0 @@
#ifndef FSFW_HAL_STM32H7_SPI_SPICOMIF_H_
#define FSFW_HAL_STM32H7_SPI_SPICOMIF_H_
#include "fsfw/tasks/SemaphoreIF.h"
#include "fsfw/devicehandlers/DeviceCommunicationIF.h"
#include "fsfw/objectmanager/SystemObject.h"
#include "fsfw_hal/stm32h7/spi/spiDefinitions.h"
#include "stm32h7xx_hal_spi.h"
#include "stm32h743xx.h"
#include <vector>
#include <map>
class SpiCookie;
class BinarySemaphore;
/**
* @brief This communication interface allows using generic device handlers with using
* the STM32H7 SPI peripherals
* @details
* This communication interface supports all three major communcation modes:
* - Polling: Simple, but not recommended to real use-cases, blocks the CPU
* - Interrupt: Good for small data only arriving occasionally
* - DMA: Good for large data which also occur regularly. Please note that the number
* of DMA channels in limited
* The device specific information is usually kept in the SpiCookie class. The current
* implementation limits the transfer mode for a given SPI bus.
* @author R. Mueller
*/
class SpiComIF:
public SystemObject,
public DeviceCommunicationIF {
public:
/**
* Create a SPI communication interface for the given SPI peripheral (spiInstance)
* @param objectId
* @param spiInstance
* @param spiHandle
* @param transferMode
*/
SpiComIF(object_id_t objectId);
/**
* Allows the user to disable cache maintenance on the TX buffer. This can be done if the
* TX buffers are places and MPU protected properly like specified in this link:
* https://community.st.com/s/article/FAQ-DMA-is-not-working-on-STM32H7-devices
* The cache maintenace is enabled by default.
* @param enable
*/
void configureCacheMaintenanceOnTxBuffer(bool enable);
void setDefaultPollingTimeout(dur_millis_t timeout);
/**
* Add the DMA handles. These need to be set in the DMA transfer mode is used.
* @param txHandle
* @param rxHandle
*/
void addDmaHandles(DMA_HandleTypeDef* txHandle, DMA_HandleTypeDef* rxHandle);
ReturnValue_t initialize() override;
// DeviceCommunicationIF overrides
virtual ReturnValue_t initializeInterface(CookieIF * cookie) override;
virtual ReturnValue_t sendMessage(CookieIF *cookie,
const uint8_t * sendData, size_t sendLen) override;
virtual ReturnValue_t getSendSuccess(CookieIF *cookie) override;
virtual ReturnValue_t requestReceiveMessage(CookieIF *cookie,
size_t requestLen) override;
virtual ReturnValue_t readReceivedMessage(CookieIF *cookie,
uint8_t **buffer, size_t *size) override;
protected:
struct SpiInstance {
SpiInstance(size_t maxRecvSize): replyBuffer(std::vector<uint8_t>(maxRecvSize)) {}
std::vector<uint8_t> replyBuffer;
size_t currentTransferLen = 0;
};
struct IrqArgs {
SpiComIF* comIF = nullptr;
SpiCookie* spiCookie = nullptr;
};
IrqArgs irqArgs;
uint32_t defaultPollingTimeout = 50;
SemaphoreIF::TimeoutType timeoutType = SemaphoreIF::TimeoutType::WAITING;
dur_millis_t timeoutMs = 20;
BinarySemaphore* spiSemaphore = nullptr;
bool cacheMaintenanceOnTxBuffer = true;
using SpiDeviceMap = std::map<address_t, SpiInstance>;
using SpiDeviceMapIter = SpiDeviceMap::iterator;
uint8_t* currentRecvPtr = nullptr;
size_t currentRecvBuffSize = 0;
SpiDeviceMap spiDeviceMap;
ReturnValue_t handlePollingSendOperation(uint8_t* recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t * sendData, size_t sendLen);
ReturnValue_t handleInterruptSendOperation(uint8_t* recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t * sendData, size_t sendLen);
ReturnValue_t handleDmaSendOperation(uint8_t* recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t * sendData, size_t sendLen);
ReturnValue_t handleIrqSendOperation(uint8_t* recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t * sendData, size_t sendLen);
ReturnValue_t genericIrqSendSetup(uint8_t* recvPtr, SPI_HandleTypeDef& spiHandle,
SpiCookie& spiCookie, const uint8_t * sendData, size_t sendLen);
ReturnValue_t halErrorHandler(HAL_StatusTypeDef status, spi::TransferModes transferMode);
static void spiTransferTxCompleteCallback(SPI_HandleTypeDef *hspi, void* args);
static void spiTransferRxCompleteCallback(SPI_HandleTypeDef *hspi, void* args);
static void spiTransferCompleteCallback(SPI_HandleTypeDef *hspi, void* args);
static void spiTransferErrorCallback(SPI_HandleTypeDef *hspi, void* args);
static void genericIrqHandler(void* irqArgs, spi::TransferStates targetState);
void printCfgError(const char* const type);
};
#endif /* FSFW_HAL_STM32H7_SPI_SPICOMIF_H_ */

View File

@ -1,78 +0,0 @@
#include "fsfw_hal/stm32h7/spi/SpiCookie.h"
SpiCookie::SpiCookie(address_t deviceAddress, spi::SpiBus spiIdx, spi::TransferModes transferMode,
spi::MspCfgBase* mspCfg, uint32_t spiSpeed, spi::SpiModes spiMode,
size_t maxRecvSize, stm32h7::GpioCfg csGpio):
deviceAddress(deviceAddress), spiIdx(spiIdx), spiSpeed(spiSpeed), spiMode(spiMode),
transferMode(transferMode), csGpio(csGpio),
mspCfg(mspCfg), maxRecvSize(maxRecvSize) {
spiHandle.Init.DataSize = SPI_DATASIZE_8BIT;
spiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
spiHandle.Init.TIMode = SPI_TIMODE_DISABLE;
spiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
spiHandle.Init.CRCPolynomial = 7;
spiHandle.Init.CRCLength = SPI_CRC_LENGTH_8BIT;
spiHandle.Init.NSS = SPI_NSS_SOFT;
spiHandle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
spiHandle.Init.Direction = SPI_DIRECTION_2LINES;
// Recommended setting to avoid glitches
spiHandle.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
spiHandle.Init.Mode = SPI_MODE_MASTER;
spi::assignSpiMode(spiMode, spiHandle);
spiHandle.Init.BaudRatePrescaler = spi::getPrescaler(HAL_RCC_GetHCLKFreq(), spiSpeed);
}
uint16_t SpiCookie::getChipSelectGpioPin() const {
return csGpio.pin;
}
GPIO_TypeDef* SpiCookie::getChipSelectGpioPort() {
return csGpio.port;
}
address_t SpiCookie::getDeviceAddress() const {
return deviceAddress;
}
spi::SpiBus SpiCookie::getSpiIdx() const {
return spiIdx;
}
spi::SpiModes SpiCookie::getSpiMode() const {
return spiMode;
}
uint32_t SpiCookie::getSpiSpeed() const {
return spiSpeed;
}
size_t SpiCookie::getMaxRecvSize() const {
return maxRecvSize;
}
SPI_HandleTypeDef& SpiCookie::getSpiHandle() {
return spiHandle;
}
spi::MspCfgBase* SpiCookie::getMspCfg() {
return mspCfg;
}
void SpiCookie::deleteMspCfg() {
if(mspCfg != nullptr) {
delete mspCfg;
}
}
spi::TransferModes SpiCookie::getTransferMode() const {
return transferMode;
}
void SpiCookie::setTransferState(spi::TransferStates transferState) {
this->transferState = transferState;
}
spi::TransferStates SpiCookie::getTransferState() const {
return this->transferState;
}

View File

@ -1,80 +0,0 @@
#ifndef FSFW_HAL_STM32H7_SPI_SPICOOKIE_H_
#define FSFW_HAL_STM32H7_SPI_SPICOOKIE_H_
#include "spiDefinitions.h"
#include "mspInit.h"
#include "../definitions.h"
#include "fsfw/devicehandlers/CookieIF.h"
#include "stm32h743xx.h"
#include <utility>
/**
* @brief SPI cookie implementation for the STM32H7 device family
* @details
* This cookie contains and caches device specific information to be used by the
* SPI communication interface
* @author R. Mueller
*/
class SpiCookie: public CookieIF {
friend class SpiComIF;
public:
/**
* Allows construction of a SPI cookie for a connected SPI device
* @param deviceAddress
* @param spiIdx SPI bus, e.g. SPI1 or SPI2
* @param transferMode
* @param mspCfg This is the MSP configuration. The user is expected to supply
* a valid MSP configuration. See mspInit.h for functions
* to create one.
* @param spiSpeed
* @param spiMode
* @param chipSelectGpioPin GPIO port. Don't use a number here, use the 16 bit type
* definitions supplied in the MCU header file! (e.g. GPIO_PIN_X)
* @param chipSelectGpioPort GPIO port (e.g. GPIOA)
* @param maxRecvSize Maximum expected receive size. Chose as small as possible.
* @param csGpio Optional CS GPIO definition.
*/
SpiCookie(address_t deviceAddress, spi::SpiBus spiIdx, spi::TransferModes transferMode,
spi::MspCfgBase* mspCfg, uint32_t spiSpeed, spi::SpiModes spiMode,
size_t maxRecvSize, stm32h7::GpioCfg csGpio = stm32h7::GpioCfg(nullptr, 0, 0));
uint16_t getChipSelectGpioPin() const;
GPIO_TypeDef* getChipSelectGpioPort();
address_t getDeviceAddress() const;
spi::SpiBus getSpiIdx() const;
spi::SpiModes getSpiMode() const;
spi::TransferModes getTransferMode() const;
uint32_t getSpiSpeed() const;
size_t getMaxRecvSize() const;
SPI_HandleTypeDef& getSpiHandle();
private:
address_t deviceAddress;
SPI_HandleTypeDef spiHandle = {};
spi::SpiBus spiIdx;
uint32_t spiSpeed;
spi::SpiModes spiMode;
spi::TransferModes transferMode;
volatile spi::TransferStates transferState = spi::TransferStates::IDLE;
stm32h7::GpioCfg csGpio;
// The MSP configuration is cached here. Be careful when using this, it is automatically
// deleted by the SPI communication interface if it is not required anymore!
spi::MspCfgBase* mspCfg = nullptr;
const size_t maxRecvSize;
// Only the SpiComIF is allowed to use this to prevent dangling pointers issues
spi::MspCfgBase* getMspCfg();
void deleteMspCfg();
void setTransferState(spi::TransferStates transferState);
spi::TransferStates getTransferState() const;
};
#endif /* FSFW_HAL_STM32H7_SPI_SPICOOKIE_H_ */

View File

@ -1,253 +0,0 @@
#include "fsfw_hal/stm32h7/dma.h"
#include "fsfw_hal/stm32h7/spi/mspInit.h"
#include "fsfw_hal/stm32h7/spi/spiCore.h"
#include "fsfw_hal/stm32h7/spi/spiInterrupts.h"
#include "stm32h743xx.h"
#include "stm32h7xx_hal_spi.h"
#include "stm32h7xx_hal_dma.h"
#include "stm32h7xx_hal_def.h"
#include <cstdio>
spi::msp_func_t mspInitFunc = nullptr;
spi::MspCfgBase* mspInitArgs = nullptr;
spi::msp_func_t mspDeinitFunc = nullptr;
spi::MspCfgBase* mspDeinitArgs = nullptr;
/**
* @brief SPI MSP Initialization
* This function configures the hardware resources used in this example:
* - Peripheral's clock enable
* - Peripheral's GPIO Configuration
* - DMA configuration for transmission request by peripheral
* - NVIC configuration for DMA interrupt request enable
* @param hspi: SPI handle pointer
* @retval None
*/
void spi::halMspInitDma(SPI_HandleTypeDef* hspi, MspCfgBase* cfgBase) {
auto cfg = dynamic_cast<MspDmaConfigStruct*>(cfgBase);
if(hspi == nullptr or cfg == nullptr) {
return;
}
setSpiHandle(hspi);
DMA_HandleTypeDef* hdma_tx = nullptr;
DMA_HandleTypeDef* hdma_rx = nullptr;
spi::getDmaHandles(&hdma_tx, &hdma_rx);
if(hdma_tx == nullptr or hdma_rx == nullptr) {
printf("HAL_SPI_MspInit: Invalid DMA handles. Make sure to call setDmaHandles!\n");
return;
}
spi::halMspInitInterrupt(hspi, cfg);
// DMA setup
if(cfg->dmaClkEnableWrapper == nullptr) {
mspErrorHandler("spi::halMspInitDma", "DMA Clock init invalid");
}
cfg->dmaClkEnableWrapper();
// Configure the DMA
/* Configure the DMA handler for Transmission process */
if(hdma_tx->Instance == nullptr) {
// Assume it was not configured properly
mspErrorHandler("spi::halMspInitDma", "DMA TX handle invalid");
}
HAL_DMA_Init(hdma_tx);
/* Associate the initialized DMA handle to the the SPI handle */
__HAL_LINKDMA(hspi, hdmatx, *hdma_tx);
HAL_DMA_Init(hdma_rx);
/* Associate the initialized DMA handle to the the SPI handle */
__HAL_LINKDMA(hspi, hdmarx, *hdma_rx);
/*##-4- Configure the NVIC for DMA #########################################*/
/* NVIC configuration for DMA transfer complete interrupt (SPI1_RX) */
// Assign the interrupt handler
dma::assignDmaUserHandler(cfg->rxDmaIndex, cfg->rxDmaStream, &spi::dmaRxIrqHandler, hdma_rx);
HAL_NVIC_SetPriority(cfg->rxDmaIrqNumber, cfg->rxPreEmptPriority, cfg->rxSubpriority);
HAL_NVIC_EnableIRQ(cfg->rxDmaIrqNumber);
/* NVIC configuration for DMA transfer complete interrupt (SPI1_TX) */
// Assign the interrupt handler
dma::assignDmaUserHandler(cfg->txDmaIndex, cfg->txDmaStream,
&spi::dmaTxIrqHandler, hdma_tx);
HAL_NVIC_SetPriority(cfg->txDmaIrqNumber, cfg->txPreEmptPriority, cfg->txSubpriority);
HAL_NVIC_EnableIRQ(cfg->txDmaIrqNumber);
}
/**
* @brief SPI MSP De-Initialization
* This function frees the hardware resources used in this example:
* - Disable the Peripheral's clock
* - Revert GPIO, DMA and NVIC configuration to their default state
* @param hspi: SPI handle pointer
* @retval None
*/
void spi::halMspDeinitDma(SPI_HandleTypeDef* hspi, MspCfgBase* cfgBase) {
auto cfg = dynamic_cast<MspDmaConfigStruct*>(cfgBase);
if(hspi == nullptr or cfg == nullptr) {
return;
}
spi::halMspDeinitInterrupt(hspi, cfgBase);
DMA_HandleTypeDef* hdma_tx = NULL;
DMA_HandleTypeDef* hdma_rx = NULL;
spi::getDmaHandles(&hdma_tx, &hdma_rx);
if(hdma_tx == NULL || hdma_rx == NULL) {
printf("HAL_SPI_MspInit: Invalid DMA handles. Make sure to call setDmaHandles!\n");
}
else {
// Disable the DMA
/* De-Initialize the DMA associated to transmission process */
HAL_DMA_DeInit(hdma_tx);
/* De-Initialize the DMA associated to reception process */
HAL_DMA_DeInit(hdma_rx);
}
// Disable the NVIC for DMA
HAL_NVIC_DisableIRQ(cfg->txDmaIrqNumber);
HAL_NVIC_DisableIRQ(cfg->rxDmaIrqNumber);
}
void spi::halMspInitPolling(SPI_HandleTypeDef* hspi, MspCfgBase* cfgBase) {
auto cfg = dynamic_cast<MspPollingConfigStruct*>(cfgBase);
GPIO_InitTypeDef GPIO_InitStruct = {};
/*##-1- Enable peripherals and GPIO Clocks #################################*/
/* Enable GPIO TX/RX clock */
cfg->setupCb();
/*##-2- Configure peripheral GPIO ##########################################*/
/* SPI SCK GPIO pin configuration */
GPIO_InitStruct.Pin = cfg->sck.pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = cfg->sck.altFnc;
HAL_GPIO_Init(cfg->sck.port, &GPIO_InitStruct);
/* SPI MISO GPIO pin configuration */
GPIO_InitStruct.Pin = cfg->miso.pin;
GPIO_InitStruct.Alternate = cfg->miso.altFnc;
HAL_GPIO_Init(cfg->miso.port, &GPIO_InitStruct);
/* SPI MOSI GPIO pin configuration */
GPIO_InitStruct.Pin = cfg->mosi.pin;
GPIO_InitStruct.Alternate = cfg->mosi.altFnc;
HAL_GPIO_Init(cfg->mosi.port, &GPIO_InitStruct);
}
void spi::halMspDeinitPolling(SPI_HandleTypeDef* hspi, MspCfgBase* cfgBase) {
auto cfg = reinterpret_cast<MspPollingConfigStruct*>(cfgBase);
// Reset peripherals
cfg->cleanupCb();
// Disable peripherals and GPIO Clocks
/* Configure SPI SCK as alternate function */
HAL_GPIO_DeInit(cfg->sck.port, cfg->sck.pin);
/* Configure SPI MISO as alternate function */
HAL_GPIO_DeInit(cfg->miso.port, cfg->miso.pin);
/* Configure SPI MOSI as alternate function */
HAL_GPIO_DeInit(cfg->mosi.port, cfg->mosi.pin);
}
void spi::halMspInitInterrupt(SPI_HandleTypeDef* hspi, MspCfgBase* cfgBase) {
auto cfg = dynamic_cast<MspIrqConfigStruct*>(cfgBase);
if(cfg == nullptr or hspi == nullptr) {
return;
}
spi::halMspInitPolling(hspi, cfg);
// Configure the NVIC for SPI
spi::assignSpiUserHandler(cfg->spiBus, cfg->spiIrqHandler, cfg->spiUserArgs);
HAL_NVIC_SetPriority(cfg->spiIrqNumber, cfg->preEmptPriority, cfg->subpriority);
HAL_NVIC_EnableIRQ(cfg->spiIrqNumber);
}
void spi::halMspDeinitInterrupt(SPI_HandleTypeDef* hspi, MspCfgBase* cfgBase) {
auto cfg = dynamic_cast<MspIrqConfigStruct*>(cfgBase);
spi::halMspDeinitPolling(hspi, cfg);
// Disable the NVIC for SPI
HAL_NVIC_DisableIRQ(cfg->spiIrqNumber);
}
void spi::getMspInitFunction(msp_func_t* init_func, MspCfgBase** args) {
if(init_func != NULL && args != NULL) {
*init_func = mspInitFunc;
*args = mspInitArgs;
}
}
void spi::getMspDeinitFunction(msp_func_t* deinit_func, MspCfgBase** args) {
if(deinit_func != NULL && args != NULL) {
*deinit_func = mspDeinitFunc;
*args = mspDeinitArgs;
}
}
void spi::setSpiDmaMspFunctions(MspDmaConfigStruct* cfg,
msp_func_t initFunc, msp_func_t deinitFunc) {
mspInitFunc = initFunc;
mspDeinitFunc = deinitFunc;
mspInitArgs = cfg;
mspDeinitArgs = cfg;
}
void spi::setSpiIrqMspFunctions(MspIrqConfigStruct *cfg, msp_func_t initFunc,
msp_func_t deinitFunc) {
mspInitFunc = initFunc;
mspDeinitFunc = deinitFunc;
mspInitArgs = cfg;
mspDeinitArgs = cfg;
}
void spi::setSpiPollingMspFunctions(MspPollingConfigStruct *cfg, msp_func_t initFunc,
msp_func_t deinitFunc) {
mspInitFunc = initFunc;
mspDeinitFunc = deinitFunc;
mspInitArgs = cfg;
mspDeinitArgs = cfg;
}
/**
* @brief SPI MSP Initialization
* This function configures the hardware resources used in this example:
* - Peripheral's clock enable
* - Peripheral's GPIO Configuration
* - DMA configuration for transmission request by peripheral
* - NVIC configuration for DMA interrupt request enable
* @param hspi: SPI handle pointer
* @retval None
*/
extern "C" void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) {
if(mspInitFunc != NULL) {
mspInitFunc(hspi, mspInitArgs);
}
else {
printf("HAL_SPI_MspInit: Please call set_msp_functions to assign SPI MSP functions\n");
}
}
/**
* @brief SPI MSP De-Initialization
* This function frees the hardware resources used in this example:
* - Disable the Peripheral's clock
* - Revert GPIO, DMA and NVIC configuration to their default state
* @param hspi: SPI handle pointer
* @retval None
*/
extern "C" void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) {
if(mspDeinitFunc != NULL) {
mspDeinitFunc(hspi, mspDeinitArgs);
}
else {
printf("HAL_SPI_MspDeInit: Please call set_msp_functions to assign SPI MSP functions\n");
}
}
void spi::mspErrorHandler(const char* const function, const char *const message) {
printf("%s failure: %s\n", function, message);
}

View File

@ -1,132 +0,0 @@
#ifndef FSFW_HAL_STM32H7_SPI_MSPINIT_H_
#define FSFW_HAL_STM32H7_SPI_MSPINIT_H_
#include "spiDefinitions.h"
#include "../definitions.h"
#include "../dma.h"
#include "stm32h7xx_hal_spi.h"
#include <cstdint>
#ifdef __cplusplus
extern "C" {
#endif
using mspCb = void (*) (void);
/**
* @brief This file provides MSP implementation for DMA, IRQ and Polling mode for the
* SPI peripheral. This configuration is required for the SPI communication to work.
*/
namespace spi {
struct MspCfgBase {
MspCfgBase();
MspCfgBase(stm32h7::GpioCfg sck, stm32h7::GpioCfg mosi, stm32h7::GpioCfg miso,
mspCb cleanupCb = nullptr, mspCb setupCb = nullptr):
sck(sck), mosi(mosi), miso(miso), cleanupCb(cleanupCb),
setupCb(setupCb) {}
virtual ~MspCfgBase() = default;
stm32h7::GpioCfg sck;
stm32h7::GpioCfg mosi;
stm32h7::GpioCfg miso;
mspCb cleanupCb = nullptr;
mspCb setupCb = nullptr;
};
struct MspPollingConfigStruct: public MspCfgBase {
MspPollingConfigStruct(): MspCfgBase() {};
MspPollingConfigStruct(stm32h7::GpioCfg sck, stm32h7::GpioCfg mosi, stm32h7::GpioCfg miso,
mspCb cleanupCb = nullptr, mspCb setupCb = nullptr):
MspCfgBase(sck, mosi, miso, cleanupCb, setupCb) {}
};
/* A valid instance of this struct must be passed to the MSP initialization function as a void*
argument */
struct MspIrqConfigStruct: public MspPollingConfigStruct {
MspIrqConfigStruct(): MspPollingConfigStruct() {};
MspIrqConfigStruct(stm32h7::GpioCfg sck, stm32h7::GpioCfg mosi, stm32h7::GpioCfg miso,
mspCb cleanupCb = nullptr, mspCb setupCb = nullptr):
MspPollingConfigStruct(sck, mosi, miso, cleanupCb, setupCb) {}
SpiBus spiBus = SpiBus::SPI_1;
user_handler_t spiIrqHandler = nullptr;
user_args_t spiUserArgs = nullptr;
IRQn_Type spiIrqNumber = SPI1_IRQn;
// Priorities for NVIC
// Pre-Empt priority ranging from 0 to 15. If FreeRTOS calls are used, only 5-15 are allowed
IrqPriorities preEmptPriority = IrqPriorities::LOWEST;
IrqPriorities subpriority = IrqPriorities::LOWEST;
};
/* A valid instance of this struct must be passed to the MSP initialization function as a void*
argument */
struct MspDmaConfigStruct: public MspIrqConfigStruct {
MspDmaConfigStruct(): MspIrqConfigStruct() {};
MspDmaConfigStruct(stm32h7::GpioCfg sck, stm32h7::GpioCfg mosi, stm32h7::GpioCfg miso,
mspCb cleanupCb = nullptr, mspCb setupCb = nullptr):
MspIrqConfigStruct(sck, mosi, miso, cleanupCb, setupCb) {}
void (* dmaClkEnableWrapper) (void) = nullptr;
dma::DMAIndexes txDmaIndex = dma::DMAIndexes::DMA_1;
dma::DMAIndexes rxDmaIndex = dma::DMAIndexes::DMA_1;
dma::DMAStreams txDmaStream = dma::DMAStreams::STREAM_0;
dma::DMAStreams rxDmaStream = dma::DMAStreams::STREAM_0;
IRQn_Type txDmaIrqNumber = DMA1_Stream0_IRQn;
IRQn_Type rxDmaIrqNumber = DMA1_Stream1_IRQn;
// Priorities for NVIC
IrqPriorities txPreEmptPriority = IrqPriorities::LOWEST;
IrqPriorities rxPreEmptPriority = IrqPriorities::LOWEST;
IrqPriorities txSubpriority = IrqPriorities::LOWEST;
IrqPriorities rxSubpriority = IrqPriorities::LOWEST;
};
using msp_func_t = void (*) (SPI_HandleTypeDef* hspi, MspCfgBase* cfg);
void getMspInitFunction(msp_func_t* init_func, MspCfgBase **args);
void getMspDeinitFunction(msp_func_t* deinit_func, MspCfgBase **args);
void halMspInitDma(SPI_HandleTypeDef* hspi, MspCfgBase* cfg);
void halMspDeinitDma(SPI_HandleTypeDef* hspi, MspCfgBase* cfg);
void halMspInitInterrupt(SPI_HandleTypeDef* hspi, MspCfgBase* cfg);
void halMspDeinitInterrupt(SPI_HandleTypeDef* hspi, MspCfgBase* cfg);
void halMspInitPolling(SPI_HandleTypeDef* hspi, MspCfgBase* cfg);
void halMspDeinitPolling(SPI_HandleTypeDef* hspi, MspCfgBase* cfg);
/**
* Assign MSP init functions. Important for SPI configuration
* @param init_func
* @param init_args
* @param deinit_func
* @param deinit_args
*/
void setSpiDmaMspFunctions(MspDmaConfigStruct* cfg,
msp_func_t initFunc = &spi::halMspInitDma,
msp_func_t deinitFunc= &spi::halMspDeinitDma
);
void setSpiIrqMspFunctions(MspIrqConfigStruct* cfg,
msp_func_t initFunc = &spi::halMspInitInterrupt,
msp_func_t deinitFunc= &spi::halMspDeinitInterrupt
);
void setSpiPollingMspFunctions(MspPollingConfigStruct* cfg,
msp_func_t initFunc = &spi::halMspInitPolling,
msp_func_t deinitFunc= &spi::halMspDeinitPolling
);
void mspErrorHandler(const char* const function, const char *const message);
}
#ifdef __cplusplus
}
#endif
#endif /* FSFW_HAL_STM32H7_SPI_MSPINIT_H_ */

View File

@ -1,341 +0,0 @@
#include "fsfw_hal/stm32h7/spi/spiCore.h"
#include "fsfw_hal/stm32h7/spi/spiDefinitions.h"
#include <cstdio>
SPI_HandleTypeDef* spiHandle = nullptr;
DMA_HandleTypeDef* hdmaTx = nullptr;
DMA_HandleTypeDef* hdmaRx = nullptr;
spi_transfer_cb_t rxTxCb = nullptr;
void* rxTxArgs = nullptr;
spi_transfer_cb_t txCb = nullptr;
void* txArgs = nullptr;
spi_transfer_cb_t rxCb = nullptr;
void* rxArgs = nullptr;
spi_transfer_cb_t errorCb = nullptr;
void* errorArgs = nullptr;
void mapIndexAndStream(DMA_HandleTypeDef* handle, dma::DMAType dmaType, dma::DMAIndexes dmaIdx,
dma::DMAStreams dmaStream, IRQn_Type* dmaIrqNumber);
void mapSpiBus(DMA_HandleTypeDef *handle, dma::DMAType dmaType, spi::SpiBus spiBus);
void spi::configureDmaHandle(DMA_HandleTypeDef *handle, spi::SpiBus spiBus, dma::DMAType dmaType,
dma::DMAIndexes dmaIdx, dma::DMAStreams dmaStream, IRQn_Type* dmaIrqNumber,
uint32_t dmaMode, uint32_t dmaPriority) {
using namespace dma;
mapIndexAndStream(handle, dmaType, dmaIdx, dmaStream, dmaIrqNumber);
mapSpiBus(handle, dmaType, spiBus);
if(dmaType == DMAType::TX) {
handle->Init.Direction = DMA_MEMORY_TO_PERIPH;
}
else {
handle->Init.Direction = DMA_PERIPH_TO_MEMORY;
}
handle->Init.Priority = dmaPriority;
handle->Init.Mode = dmaMode;
// Standard settings for the rest for now
handle->Init.FIFOMode = DMA_FIFOMODE_DISABLE;
handle->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
handle->Init.MemBurst = DMA_MBURST_INC4;
handle->Init.PeriphBurst = DMA_PBURST_INC4;
handle->Init.PeriphInc = DMA_PINC_DISABLE;
handle->Init.MemInc = DMA_MINC_ENABLE;
handle->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
handle->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
}
void spi::setDmaHandles(DMA_HandleTypeDef* txHandle, DMA_HandleTypeDef* rxHandle) {
hdmaTx = txHandle;
hdmaRx = rxHandle;
}
void spi::getDmaHandles(DMA_HandleTypeDef** txHandle, DMA_HandleTypeDef** rxHandle) {
*txHandle = hdmaTx;
*rxHandle = hdmaRx;
}
void spi::setSpiHandle(SPI_HandleTypeDef *spiHandle_) {
if(spiHandle_ == NULL) {
return;
}
spiHandle = spiHandle_;
}
void spi::assignTransferRxTxCompleteCallback(spi_transfer_cb_t callback, void *userArgs) {
rxTxCb = callback;
rxTxArgs = userArgs;
}
void spi::assignTransferRxCompleteCallback(spi_transfer_cb_t callback, void *userArgs) {
rxCb = callback;
rxArgs = userArgs;
}
void spi::assignTransferTxCompleteCallback(spi_transfer_cb_t callback, void *userArgs) {
txCb = callback;
txArgs = userArgs;
}
void spi::assignTransferErrorCallback(spi_transfer_cb_t callback, void *userArgs) {
errorCb = callback;
errorArgs = userArgs;
}
SPI_HandleTypeDef* spi::getSpiHandle() {
return spiHandle;
}
/**
* @brief TxRx Transfer completed callback.
* @param hspi: SPI handle
*/
extern "C" void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) {
if(rxTxCb != NULL) {
rxTxCb(hspi, rxTxArgs);
}
else {
printf("HAL_SPI_TxRxCpltCallback: No user callback specified\n");
}
}
/**
* @brief TxRx Transfer completed callback.
* @param hspi: SPI handle
*/
extern "C" void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) {
if(txCb != NULL) {
txCb(hspi, txArgs);
}
else {
printf("HAL_SPI_TxCpltCallback: No user callback specified\n");
}
}
/**
* @brief TxRx Transfer completed callback.
* @param hspi: SPI handle
*/
extern "C" void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) {
if(rxCb != nullptr) {
rxCb(hspi, rxArgs);
}
else {
printf("HAL_SPI_RxCpltCallback: No user callback specified\n");
}
}
/**
* @brief SPI error callbacks.
* @param hspi: SPI handle
* @note This example shows a simple way to report transfer error, and you can
* add your own implementation.
* @retval None
*/
extern "C" void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) {
if(errorCb != nullptr) {
errorCb(hspi, rxArgs);
}
else {
printf("HAL_SPI_ErrorCallback: No user callback specified\n");
}
}
void mapIndexAndStream(DMA_HandleTypeDef* handle, dma::DMAType dmaType, dma::DMAIndexes dmaIdx,
dma::DMAStreams dmaStream, IRQn_Type* dmaIrqNumber) {
using namespace dma;
if(dmaIdx == DMAIndexes::DMA_1) {
#ifdef DMA1
switch(dmaStream) {
case(DMAStreams::STREAM_0): {
#ifdef DMA1_Stream0
handle->Instance = DMA1_Stream0;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA1_Stream0_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_1): {
#ifdef DMA1_Stream1
handle->Instance = DMA1_Stream1;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA1_Stream1_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_2): {
#ifdef DMA1_Stream2
handle->Instance = DMA1_Stream2;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA1_Stream2_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_3): {
#ifdef DMA1_Stream3
handle->Instance = DMA1_Stream3;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA1_Stream3_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_4): {
#ifdef DMA1_Stream4
handle->Instance = DMA1_Stream4;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA1_Stream4_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_5): {
#ifdef DMA1_Stream5
handle->Instance = DMA1_Stream5;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA1_Stream5_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_6): {
#ifdef DMA1_Stream6
handle->Instance = DMA1_Stream6;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA1_Stream6_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_7): {
#ifdef DMA1_Stream7
handle->Instance = DMA1_Stream7;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA1_Stream7_IRQn;
}
#endif
break;
}
}
if(dmaType == DMAType::TX) {
handle->Init.Request = DMA_REQUEST_SPI1_TX;
}
else {
handle->Init.Request = DMA_REQUEST_SPI1_RX;
}
#endif /* DMA1 */
}
if(dmaIdx == DMAIndexes::DMA_2) {
#ifdef DMA2
switch(dmaStream) {
case(DMAStreams::STREAM_0): {
#ifdef DMA2_Stream0
handle->Instance = DMA2_Stream0;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA2_Stream0_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_1): {
#ifdef DMA2_Stream1
handle->Instance = DMA2_Stream1;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA2_Stream1_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_2): {
#ifdef DMA2_Stream2
handle->Instance = DMA2_Stream2;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA2_Stream2_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_3): {
#ifdef DMA2_Stream3
handle->Instance = DMA2_Stream3;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA2_Stream3_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_4): {
#ifdef DMA2_Stream4
handle->Instance = DMA2_Stream4;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA2_Stream4_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_5): {
#ifdef DMA2_Stream5
handle->Instance = DMA2_Stream5;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA2_Stream5_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_6): {
#ifdef DMA2_Stream6
handle->Instance = DMA2_Stream6;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA2_Stream6_IRQn;
}
#endif
break;
}
case(DMAStreams::STREAM_7): {
#ifdef DMA2_Stream7
handle->Instance = DMA2_Stream7;
if(dmaIrqNumber != nullptr) {
*dmaIrqNumber = DMA2_Stream7_IRQn;
}
#endif
break;
}
}
#endif /* DMA2 */
}
}
void mapSpiBus(DMA_HandleTypeDef *handle, dma::DMAType dmaType, spi::SpiBus spiBus) {
if(dmaType == dma::DMAType::TX) {
if(spiBus == spi::SpiBus::SPI_1) {
#ifdef DMA_REQUEST_SPI1_TX
handle->Init.Request = DMA_REQUEST_SPI1_TX;
#endif
}
else if(spiBus == spi::SpiBus::SPI_2) {
#ifdef DMA_REQUEST_SPI2_TX
handle->Init.Request = DMA_REQUEST_SPI2_TX;
#endif
}
}
else {
if(spiBus == spi::SpiBus::SPI_1) {
#ifdef DMA_REQUEST_SPI1_RX
handle->Init.Request = DMA_REQUEST_SPI1_RX;
#endif
}
else if(spiBus == spi::SpiBus::SPI_2) {
#ifdef DMA_REQUEST_SPI2_RX
handle->Init.Request = DMA_REQUEST_SPI2_RX;
#endif
}
}
}

View File

@ -1,52 +0,0 @@
#include "fsfw_hal/stm32h7/spi/spiDefinitions.h"
void spi::assignSpiMode(SpiModes spiMode, SPI_HandleTypeDef& spiHandle) {
switch(spiMode) {
case(SpiModes::MODE_0): {
spiHandle.Init.CLKPolarity = SPI_POLARITY_LOW;
spiHandle.Init.CLKPhase = SPI_PHASE_1EDGE;
break;
}
case(SpiModes::MODE_1): {
spiHandle.Init.CLKPolarity = SPI_POLARITY_LOW;
spiHandle.Init.CLKPhase = SPI_PHASE_2EDGE;
break;
}
case(SpiModes::MODE_2): {
spiHandle.Init.CLKPolarity = SPI_POLARITY_HIGH;
spiHandle.Init.CLKPhase = SPI_PHASE_1EDGE;
break;
}
case(SpiModes::MODE_3): {
spiHandle.Init.CLKPolarity = SPI_POLARITY_HIGH;
spiHandle.Init.CLKPhase = SPI_PHASE_2EDGE;
break;
}
}
}
uint32_t spi::getPrescaler(uint32_t clock_src_freq, uint32_t baudrate_mbps) {
uint32_t divisor = 0;
uint32_t spi_clk = clock_src_freq;
uint32_t presc = 0;
static const uint32_t baudrate[] = {
SPI_BAUDRATEPRESCALER_2,
SPI_BAUDRATEPRESCALER_4,
SPI_BAUDRATEPRESCALER_8,
SPI_BAUDRATEPRESCALER_16,
SPI_BAUDRATEPRESCALER_32,
SPI_BAUDRATEPRESCALER_64,
SPI_BAUDRATEPRESCALER_128,
SPI_BAUDRATEPRESCALER_256,
};
while( spi_clk > baudrate_mbps) {
presc = baudrate[divisor];
if (++divisor > 7)
break;
spi_clk = ( spi_clk >> 1);
}
return presc;
}

View File

@ -1,106 +0,0 @@
#include "fsfw_hal/stm32h7/spi/spiInterrupts.h"
#include "fsfw_hal/stm32h7/spi/spiCore.h"
#include "stm32h7xx_hal.h"
#include "stm32h7xx_hal_dma.h"
#include "stm32h7xx_hal_spi.h"
#include <stddef.h>
user_handler_t spi1UserHandler = &spi::spiIrqHandler;
user_args_t spi1UserArgs = nullptr;
user_handler_t spi2UserHandler = &spi::spiIrqHandler;
user_args_t spi2UserArgs = nullptr;
/**
* @brief This function handles DMA Rx interrupt request.
* @param None
* @retval None
*/
void spi::dmaRxIrqHandler(void* dmaHandle) {
if(dmaHandle == nullptr) {
return;
}
HAL_DMA_IRQHandler((DMA_HandleTypeDef *) dmaHandle);
}
/**
* @brief This function handles DMA Rx interrupt request.
* @param None
* @retval None
*/
void spi::dmaTxIrqHandler(void* dmaHandle) {
if(dmaHandle == nullptr) {
return;
}
HAL_DMA_IRQHandler((DMA_HandleTypeDef *) dmaHandle);
}
/**
* @brief This function handles SPIx interrupt request.
* @param None
* @retval None
*/
void spi::spiIrqHandler(void* spiHandle) {
if(spiHandle == nullptr) {
return;
}
//auto currentSpiHandle = spi::getSpiHandle();
HAL_SPI_IRQHandler((SPI_HandleTypeDef *) spiHandle);
}
void spi::assignSpiUserHandler(spi::SpiBus spiIdx, user_handler_t userHandler,
user_args_t userArgs) {
if(spiIdx == spi::SpiBus::SPI_1) {
spi1UserHandler = userHandler;
spi1UserArgs = userArgs;
}
else {
spi2UserHandler = userHandler;
spi2UserArgs = userArgs;
}
}
void spi::getSpiUserHandler(spi::SpiBus spiBus, user_handler_t *userHandler,
user_args_t *userArgs) {
if(userHandler == nullptr or userArgs == nullptr) {
return;
}
if(spiBus == spi::SpiBus::SPI_1) {
*userArgs = spi1UserArgs;
*userHandler = spi1UserHandler;
}
else {
*userArgs = spi2UserArgs;
*userHandler = spi2UserHandler;
}
}
void spi::assignSpiUserArgs(spi::SpiBus spiBus, user_args_t userArgs) {
if(spiBus == spi::SpiBus::SPI_1) {
spi1UserArgs = userArgs;
}
else {
spi2UserArgs = userArgs;
}
}
/* Do not change these function names! They need to be exactly equal to the name of the functions
defined in the startup_stm32h743xx.s files! */
extern "C" void SPI1_IRQHandler() {
if(spi1UserHandler != NULL) {
spi1UserHandler(spi1UserArgs);
return;
}
Default_Handler();
}
extern "C" void SPI2_IRQHandler() {
if(spi2UserHandler != nullptr) {
spi2UserHandler(spi2UserArgs);
return;
}
Default_Handler();
}

View File

@ -1,82 +0,0 @@
#include "fsfw_hal/stm32h7/spi/stm32h743zi.h"
#include "fsfw_hal/stm32h7/spi/spiCore.h"
#include "fsfw_hal/stm32h7/spi/spiInterrupts.h"
#include "stm32h7xx_hal.h"
#include "stm32h7xx_hal_rcc.h"
#include <cstdio>
void spiSetupWrapper() {
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_SPI1_CLK_ENABLE();
}
void spiCleanUpWrapper() {
__HAL_RCC_SPI1_FORCE_RESET();
__HAL_RCC_SPI1_RELEASE_RESET();
}
void spiDmaClockEnableWrapper() {
__HAL_RCC_DMA2_CLK_ENABLE();
}
void stm32h7::h743zi::standardPollingCfg(spi::MspPollingConfigStruct& cfg) {
cfg.setupCb = &spiSetupWrapper;
cfg.cleanupCb = &spiCleanUpWrapper;
cfg.sck.port = GPIOA;
cfg.sck.pin = GPIO_PIN_5;
cfg.miso.port = GPIOA;
cfg.miso.pin = GPIO_PIN_6;
cfg.mosi.port = GPIOA;
cfg.mosi.pin = GPIO_PIN_7;
cfg.sck.altFnc = GPIO_AF5_SPI1;
cfg.mosi.altFnc = GPIO_AF5_SPI1;
cfg.miso.altFnc = GPIO_AF5_SPI1;
}
void stm32h7::h743zi::standardInterruptCfg(spi::MspIrqConfigStruct& cfg, IrqPriorities spiIrqPrio,
IrqPriorities spiSubprio) {
// High, but works on FreeRTOS as well (priorities range from 0 to 15)
cfg.preEmptPriority = spiIrqPrio;
cfg.subpriority = spiSubprio;
cfg.spiIrqNumber = SPI1_IRQn;
cfg.spiBus = spi::SpiBus::SPI_1;
user_handler_t spiUserHandler = nullptr;
user_args_t spiUserArgs = nullptr;
getSpiUserHandler(spi::SpiBus::SPI_1, &spiUserHandler, &spiUserArgs);
if(spiUserHandler == nullptr) {
printf("spi::h743zi::standardInterruptCfg: Invalid SPI user handlers\n");
return;
}
cfg.spiUserArgs = spiUserArgs;
cfg.spiIrqHandler = spiUserHandler;
standardPollingCfg(cfg);
}
void stm32h7::h743zi::standardDmaCfg(spi::MspDmaConfigStruct& cfg, IrqPriorities spiIrqPrio,
IrqPriorities txIrqPrio, IrqPriorities rxIrqPrio, IrqPriorities spiSubprio,
IrqPriorities txSubprio, IrqPriorities rxSubprio) {
cfg.dmaClkEnableWrapper = &spiDmaClockEnableWrapper;
cfg.rxDmaIndex = dma::DMAIndexes::DMA_2;
cfg.txDmaIndex = dma::DMAIndexes::DMA_2;
cfg.txDmaStream = dma::DMAStreams::STREAM_3;
cfg.rxDmaStream = dma::DMAStreams::STREAM_2;
DMA_HandleTypeDef* txHandle;
DMA_HandleTypeDef* rxHandle;
spi::getDmaHandles(&txHandle, &rxHandle);
if(txHandle == nullptr or rxHandle == nullptr) {
printf("spi::h743zi::standardDmaCfg: Invalid DMA handles\n");
return;
}
spi::configureDmaHandle(txHandle, spi::SpiBus::SPI_1, dma::DMAType::TX, cfg.txDmaIndex,
cfg.txDmaStream, &cfg.txDmaIrqNumber);
spi::configureDmaHandle(rxHandle, spi::SpiBus::SPI_1, dma::DMAType::RX, cfg.rxDmaIndex,
cfg.rxDmaStream, &cfg.rxDmaIrqNumber, DMA_NORMAL, DMA_PRIORITY_HIGH);
cfg.txPreEmptPriority = txIrqPrio;
cfg.rxPreEmptPriority = txSubprio;
cfg.txSubpriority = rxIrqPrio;
cfg.rxSubpriority = rxSubprio;
standardInterruptCfg(cfg, spiIrqPrio, spiSubprio);
}

View File

@ -1,2 +0,0 @@
target_sources(${LIB_FSFW_NAME} PRIVATE
)

View File

@ -4,6 +4,10 @@
#include <cstddef>
#include <cstdint>
// It is assumed the user has a subsystem and class ID list in some user header files.
// #include "events/subsystemIdRanges.h"
// #include "returnvalues/classIds.h"
//! Used to determine whether C++ ostreams are used which can increase
//! the binary size significantly. If this is disabled,
//! the C stdio functions can be used alternatively

View File

@ -10,7 +10,7 @@
*/
namespace addresses {
/* Logical addresses have uint32_t datatype */
enum logicalAddresses: address_t {
enum LogAddr: address_t {
};
}

View File

@ -4,7 +4,6 @@
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
#include <fsfw/events/EventManager.h>
#include <fsfw/health/HealthTable.h>
#include <fsfw/tmtcpacket/pus/tm/TmPacketStored.h>
#include <fsfw/tmtcservices/CommandingServiceBase.h>
#include <fsfw/tmtcservices/PusServiceBase.h>
#include <fsfw/internalerror/InternalErrorReporter.h>
@ -35,19 +34,15 @@ void Factory::produceFsfwObjects(void) {
}
void Factory::setStaticFrameworkObjectIds() {
PusServiceBase::packetSource = objects::NO_OBJECT;
PusServiceBase::packetDestination = objects::NO_OBJECT;
PusServiceBase::PUS_DISTRIBUTOR = objects::NO_OBJECT;
PusServiceBase::PACKET_DESTINATION = objects::NO_OBJECT;
CommandingServiceBase::defaultPacketSource = objects::NO_OBJECT;
CommandingServiceBase::defaultPacketDestination = objects::NO_OBJECT;
VerificationReporter::messageReceiver = objects::PUS_SERVICE_1_VERIFICATION;
DeviceHandlerBase::powerSwitcherId = objects::NO_OBJECT;
DeviceHandlerBase::rawDataReceiverId = objects::PUS_SERVICE_2_DEVICE_ACCESS;
DeviceHandlerFailureIsolation::powerConfirmationId = objects::NO_OBJECT;
TmPacketBase::timeStamperId = objects::NO_OBJECT;
}

View File

@ -11,15 +11,15 @@ ReturnValue_t pst::pollingSequenceInitDefault(
/* Add polling sequence table here */
if (thisSequence->checkSequence() == HasReturnvaluesIF::RETURN_OK) {
return HasReturnvaluesIF::RETURN_OK;
if (thisSequence->checkSequence() == returnvalue::OK) {
return returnvalue::OK;
}
else {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "pst::pollingSequenceInitDefault: Sequence invalid!"
<< std::endl;
#endif
return HasReturnvaluesIF::RETURN_FAILED;
return returnvalue::FAILED;
}
}

View File

@ -1,7 +1,7 @@
#ifndef POLLINGSEQUENCEFACTORY_H_
#define POLLINGSEQUENCEFACTORY_H_
#include <fsfw/returnvalues/HasReturnvaluesIF.h>
#include <fsfw/returnvalues/returnvalue.h>
class FixedTimeslotTaskIF;

View File

@ -1,8 +0,0 @@
#!/bin/bash
if [[ ! -f README.md ]]; then
cd ..
fi
find ./src -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --style=file -i
find ./hal -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --style=file -i
find ./tests -iname *.h -o -iname *.cpp -o -iname *.c | xargs clang-format --style=file -i

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