diff --git a/.gitignore b/.gitignore
index d6efb9cf..eb461072 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,14 @@
+# PyCharm and CLion
+/.idea/*
+!/.idea/runConfigurations
+!/.idea/cmake.xml
+!/.idea/codeStyles
+
+# Eclipse
.cproject
.project
.settings
.metadata
/build*
+/cmake-build*
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 00000000..0f3b1a4b
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 00000000..79ee123c
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/fsfw-tests_coverage.run.xml b/.run/fsfw-tests_coverage.run.xml
new file mode 100644
index 00000000..49d9b135
--- /dev/null
+++ b/.run/fsfw-tests_coverage.run.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/fsfw.run.xml b/.run/fsfw.run.xml
new file mode 100644
index 00000000..72f74939
--- /dev/null
+++ b/.run/fsfw.run.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 84fb2ca1..65fc85a9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## 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
@@ -25,18 +29,56 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
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
-- HAL Linux Uart: Baudrate and bits per word are enums now, avoiding misconfigurations
- PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/585
+- 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
-- Clock:
- - `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)
+
+### 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
@@ -46,12 +88,35 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## Additions
+- 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
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1df1008b..6328f176 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,50 +1,113 @@
cmake_minimum_required(VERSION 3.13)
-set(LIB_FSFW_NAME fsfw)
-project(${LIB_FSFW_NAME})
-
-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 "Compiling the FSFW requires a minimum of C++17 support")
-endif()
-
-set(FSFW_VERSION 4)
-set(FSFW_SUBVERSION 0)
-set(FSFW_REVISION 0)
+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")
-set(FSFW_ETL_LIB_MAJOR_VERSION 20 CACHE STRING
- "ETL library major version requirement"
-)
-set(FSFW_ETL_LIB_VERSION ${FSFW_ETL_LIB_MAJOR_VERSION}.27.3 CACHE STRING
- "ETL library exact version requirement"
-)
-set(FSFW_ETL_LINK_TARGET etl::etl)
+# ##############################################################################
+# Version file handling #
+# ##############################################################################
-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}.0.0-preview5 CACHE STRING
- "Catch2 library exact version requirement"
-)
+set(FSFW_VERSION_IF_GIT_FAILS 4)
+set(FSFW_SUBVERSION_IF_GIT_FAILS 0)
+set(FSFW_REVISION_IF_GIT_FAILS 0)
-set(FSFW_ETL_LIB_NAME etl)
-
-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)
+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_LIB_MAJOR_VERSION
+ 20
+ CACHE STRING "ETL library major version requirement")
+set(FSFW_ETL_LIB_VERSION
+ ${FSFW_ETL_LIB_MAJOR_VERSION}.28.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}.0.0-preview5
+ 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_UNITTESTS
+ "Build unittest binary in addition to static library" 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)
+ 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)
@@ -65,88 +128,93 @@ option(FSFW_ADD_TMSTORAGE "Compile with tm storage components" OFF)
# Contrib sources
option(FSFW_ADD_SGP4_PROPAGATOR "Add SGP4 propagator code" OFF)
-
set(FSFW_TEST_TGT fsfw-tests)
set(FSFW_DUMMY_TGT fsfw-dummy)
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 ${FSFW_CATCH2_LIB_MAJOR_VERSION})
- # Not installed, so use FetchContent to download and provide Catch2
- if(NOT Catch2_FOUND)
- message(STATUS "Catch2 installation not found. Downloading Catch2 library with FetchContent")
- include(FetchContent)
-
- FetchContent_Declare(
- Catch2
- GIT_REPOSITORY https://github.com/catchorg/Catch2.git
- GIT_TAG ${FSFW_CATCH2_LIB_VERSION}
- )
-
- list(APPEND FSFW_FETCH_CONTENT_TARGETS Catch2)
- endif()
-
- 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)
-
- project(${FSFW_TEST_TGT} CXX C)
- add_executable(${FSFW_TEST_TGT})
-
- 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()
+if(IPO_SUPPORTED AND FSFW_ENABLE_IPO)
+ set_property(TARGET ${LIB_FSFW_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION
+ TRUE)
endif()
-message(STATUS "Finding and/or providing ETL library")
-
-# 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
- "No ETL installation was found with find_package. Installing and providing "
- "etl with FindPackage"
+if(FSFW_BUILD_UNITTESTS)
+ 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})
+ # 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_Declare(
- ${FSFW_ETL_LIB_NAME}
- GIT_REPOSITORY https://github.com/ETLCPP/etl
- GIT_TAG ${FSFW_ETL_LIB_VERSION}
- )
+ Catch2
+ GIT_REPOSITORY https://github.com/catchorg/Catch2.git
+ GIT_TAG ${FSFW_CATCH2_LIB_VERSION})
- list(APPEND FSFW_FETCH_CONTENT_TARGETS ${FSFW_ETL_LIB_NAME})
+ list(APPEND FSFW_FETCH_CONTENT_TARGETS Catch2)
+ endif()
+
+ 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)
+
+ 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")
+
+# Check whether the user has already installed ETL first
+find_package(${FSFW_ETL_LIB_NAME} ${FSFW_ETL_LIB_MAJOR_VERSION} CONFIG QUIET)
+# Not installed, so use FetchContent to download and provide etl
+if(NOT ${FSFW_ETL_LIB_NAME}_FOUND)
+ message(
+ STATUS
+ "No ETL installation was found with find_package. Installing and providing "
+ "etl with FindPackage")
+ 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()
+ 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")
@@ -154,269 +222,242 @@ set(FSFW_CORE_INC_PATH "inc")
set_property(CACHE FSFW_OSAL PROPERTY STRINGS host linux rtems freertos)
# 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}
-)
-
+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()
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)
+ add_subdirectory(hal)
endif()
add_subdirectory(contrib)
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_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/*" "*/fsfw_hal/*"
- )
- elseif(UNIX)
- set(COVERAGE_EXCLUDES
- "/usr/include/*" "/usr/bin/*" "Catch2/*"
- "/usr/local/include/*" "*/fsfw_tests/*"
- "*/catch2-src/*" "*/fsfw_hal/*"
- )
- 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/*")
+ 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})
+ 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 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
- -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 ( for --xml and --html 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 PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
+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()
diff --git a/cmake/cmake-modules/bilke/LICENSE_1_0.txt b/cmake/cmake-modules/bilke/LICENSE_1_0.txt
new file mode 100644
index 00000000..36b7cd93
--- /dev/null
+++ b/cmake/cmake-modules/bilke/LICENSE_1_0.txt
@@ -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.
diff --git a/cmake/cmake-modules/rpavlik/GetGitRevisionDescription.cmake b/cmake/cmake-modules/rpavlik/GetGitRevisionDescription.cmake
new file mode 100644
index 00000000..69ef78b2
--- /dev/null
+++ b/cmake/cmake-modules/rpavlik/GetGitRevisionDescription.cmake
@@ -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( [ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR])
+#
+# Returns the refspec and sha hash of the current head revision
+#
+# 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( [ ...])
+#
+# 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( [ ...])
+#
+# 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()
+#
+# 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
+# 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()
diff --git a/cmake/cmake-modules/rpavlik/GetGitRevisionDescription.cmake.in b/cmake/cmake-modules/rpavlik/GetGitRevisionDescription.cmake.in
new file mode 100644
index 00000000..66eee637
--- /dev/null
+++ b/cmake/cmake-modules/rpavlik/GetGitRevisionDescription.cmake.in
@@ -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
+# 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()
diff --git a/cmake/cmake-modules/rpavlik/LICENSES/BSD-3-Clause.txt b/cmake/cmake-modules/rpavlik/LICENSES/BSD-3-Clause.txt
new file mode 100644
index 00000000..0741db78
--- /dev/null
+++ b/cmake/cmake-modules/rpavlik/LICENSES/BSD-3-Clause.txt
@@ -0,0 +1,26 @@
+Copyright (c) . 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.
diff --git a/cmake/cmake-modules/rpavlik/LICENSES/BSL-1.0.txt b/cmake/cmake-modules/rpavlik/LICENSES/BSL-1.0.txt
new file mode 100644
index 00000000..cff35365
--- /dev/null
+++ b/cmake/cmake-modules/rpavlik/LICENSES/BSL-1.0.txt
@@ -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.
diff --git a/cmake/cmake-modules/rpavlik/LICENSE_1_0.txt b/cmake/cmake-modules/rpavlik/LICENSE_1_0.txt
new file mode 100644
index 00000000..36b7cd93
--- /dev/null
+++ b/cmake/cmake-modules/rpavlik/LICENSE_1_0.txt
@@ -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.
diff --git a/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.cpp b/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.cpp
index f46ad386..15061d14 100644
--- a/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.cpp
+++ b/hal/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.cpp
@@ -20,7 +20,9 @@ LinuxLibgpioIF::~LinuxLibgpioIF() {
ReturnValue_t LinuxLibgpioIF::addGpios(GpioCookie* gpioCookie) {
ReturnValue_t result;
if (gpioCookie == nullptr) {
+#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "LinuxLibgpioIF::addGpios: Invalid cookie" << std::endl;
+#endif
return RETURN_FAILED;
}
@@ -96,8 +98,10 @@ ReturnValue_t LinuxLibgpioIF::configureGpioByLabel(gpioId_t gpioId,
std::string& label = gpioByLabel.label;
struct gpiod_chip* chip = gpiod_chip_open_by_label(label.c_str());
if (chip == nullptr) {
+#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LinuxLibgpioIF::configureGpioByLabel: Failed to open gpio from gpio "
<< "group with label " << label << ". Gpio ID: " << gpioId << std::endl;
+#endif
return RETURN_FAILED;
}
std::string failOutput = "label: " + label;
@@ -108,8 +112,10 @@ ReturnValue_t LinuxLibgpioIF::configureGpioByChip(gpioId_t gpioId, GpiodRegularB
std::string& chipname = gpioByChip.chipname;
struct gpiod_chip* chip = gpiod_chip_open_by_name(chipname.c_str());
if (chip == nullptr) {
+#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LinuxLibgpioIF::configureGpioByChip: Failed to open chip " << chipname
<< ". Gpio ID: " << gpioId << std::endl;
+#endif
return RETURN_FAILED;
}
std::string failOutput = "chipname: " + chipname;
@@ -133,8 +139,10 @@ ReturnValue_t LinuxLibgpioIF::configureGpioByLineName(gpioId_t gpioId,
struct gpiod_chip* chip = gpiod_chip_open_by_name(chipname);
if (chip == nullptr) {
+#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "LinuxLibgpioIF::configureGpioByLineName: Failed to open chip " << chipname
<< ". pullLow(gpioId);
+ result = gpioComIF->pullLow(gpioId);
if (result != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_VERBOSE_LEVEL >= 1
#if FSFW_CPP_OSTREAM_ENABLED == 1
diff --git a/hal/src/fsfw_hal/linux/uart/UartComIF.cpp b/hal/src/fsfw_hal/linux/uart/UartComIF.cpp
index 72c79df6..f77bdeae 100644
--- a/hal/src/fsfw_hal/linux/uart/UartComIF.cpp
+++ b/hal/src/fsfw_hal/linux/uart/UartComIF.cpp
@@ -314,7 +314,7 @@ void UartComIF::configureBaudrate(struct termios* options, UartCookie* uartCooki
cfsetispeed(options, B4000000);
cfsetospeed(options, B4000000);
break;
-#endif // ! __APPLE__
+#endif // ! __APPLE__
default:
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "UartComIF::configureBaudrate: Baudrate not supported" << std::endl;
diff --git a/scripts/apply-clang-format.sh b/scripts/apply-clang-format.sh
deleted file mode 100755
index 27202324..00000000
--- a/scripts/apply-clang-format.sh
+++ /dev/null
@@ -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
diff --git a/scripts/auto-formatter.sh b/scripts/auto-formatter.sh
new file mode 100755
index 00000000..405d1268
--- /dev/null
+++ b/scripts/auto-formatter.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+if [[ ! -f README.md ]]; then
+ cd ..
+fi
+
+cmake_fmt="cmake-format"
+file_selectors="-iname CMakeLists.txt"
+if command -v ${cmake_fmt} &> /dev/null; then
+ ${cmake_fmt} -i CMakeLists.txt
+ find ./src ${file_selectors} | xargs ${cmake_fmt} -i
+else
+ echo "No ${cmake_fmt} tool found, not formatting CMake files"
+fi
+
+cpp_format="clang-format"
+file_selectors="-iname *.h -o -iname *.cpp -o -iname *.c -o -iname *.tpp"
+if command -v ${cpp_format} &> /dev/null; then
+ find ./src ${file_selectors} | xargs ${cpp_format} --style=file -i
+ find ./hal ${file_selectors} | xargs ${cpp_format} --style=file -i
+ find ./tests ${file_selectors} | xargs ${cpp_format} --style=file -i
+else
+ echo "No ${cpp_format} tool found, not formatting C++/C files"
+fi
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ed2f2522..34f21c2f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,9 +1,6 @@
-target_include_directories(${LIB_FSFW_NAME} PRIVATE
- ${CMAKE_CURRENT_SOURCE_DIR}
-)
+target_include_directories(${LIB_FSFW_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
-target_include_directories(${LIB_FSFW_NAME} INTERFACE
- ${CMAKE_CURRENT_SOURCE_DIR}
-)
+target_include_directories(${LIB_FSFW_NAME}
+ INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(fsfw)
diff --git a/src/fsfw/CMakeLists.txt b/src/fsfw/CMakeLists.txt
index efb9f6c7..1daad714 100644
--- a/src/fsfw/CMakeLists.txt
+++ b/src/fsfw/CMakeLists.txt
@@ -1,6 +1,4 @@
-target_sources(${LIB_FSFW_NAME} PRIVATE
- version.cpp
-)
+target_sources(${LIB_FSFW_NAME} PRIVATE version.cpp)
# Core
@@ -37,22 +35,22 @@ add_subdirectory(tmtcservices)
# Optional
if(FSFW_ADD_MONITORING)
-add_subdirectory(monitoring)
+ add_subdirectory(monitoring)
endif()
if(FSFW_ADD_PUS)
- add_subdirectory(pus)
+ add_subdirectory(pus)
endif()
if(FSFW_ADD_TMSTORAGE)
- add_subdirectory(tmstorage)
+ add_subdirectory(tmstorage)
endif()
if(FSFW_ADD_COORDINATES)
- add_subdirectory(coordinates)
+ add_subdirectory(coordinates)
endif()
if(FSFW_ADD_RMAP)
- add_subdirectory(rmap)
+ add_subdirectory(rmap)
endif()
if(FSFW_ADD_DATALINKLAYER)
- add_subdirectory(datalinklayer)
+ add_subdirectory(datalinklayer)
endif()
# OSAL
diff --git a/src/fsfw/FSFWVersion.h.in b/src/fsfw/FSFWVersion.h.in
index 19a56214..caff1efb 100644
--- a/src/fsfw/FSFWVersion.h.in
+++ b/src/fsfw/FSFWVersion.h.in
@@ -1,9 +1,11 @@
#ifndef FSFW_VERSION_H_
#define FSFW_VERSION_H_
-// Versioning is kept in project CMakeLists.txt file
-#define FSFW_VERSION_MAJOR @FSFW_VERSION@
-#define FSFW_VERSION_MINOR @FSFW_SUBVERSION@
-#define FSFW_VERSION_REVISION @FSFW_REVISION@
+// Versioning is managed in project CMakeLists.txt file
+static constexpr int FSFW_VERSION_MAJOR = @FSFW_VERSION@;
+static constexpr int FSFW_VERSION_MINOR = @FSFW_SUBVERSION@;
+static constexpr int FSFW_VERSION_REVISION = @FSFW_REVISION@;
+// Also contains CST (Commits since tag) information
+static const char FSFW_VCS_INFO[] = "@FSFW_VCS_INFO@";
#endif /* FSFW_VERSION_H_ */
diff --git a/src/fsfw/action/CMakeLists.txt b/src/fsfw/action/CMakeLists.txt
index f9ac451d..7fb397af 100644
--- a/src/fsfw/action/CMakeLists.txt
+++ b/src/fsfw/action/CMakeLists.txt
@@ -1,7 +1,3 @@
-target_sources(${LIB_FSFW_NAME}
- PRIVATE
- ActionHelper.cpp
- ActionMessage.cpp
- CommandActionHelper.cpp
- SimpleActionHelper.cpp
-)
\ No newline at end of file
+target_sources(
+ ${LIB_FSFW_NAME} PRIVATE ActionHelper.cpp ActionMessage.cpp
+ CommandActionHelper.cpp SimpleActionHelper.cpp)
diff --git a/src/fsfw/cfdp/CMakeLists.txt b/src/fsfw/cfdp/CMakeLists.txt
index 908dc32a..0b926a9a 100644
--- a/src/fsfw/cfdp/CMakeLists.txt
+++ b/src/fsfw/cfdp/CMakeLists.txt
@@ -1,7 +1,4 @@
-target_sources(${LIB_FSFW_NAME} PRIVATE
- CFDPHandler.cpp
- CFDPMessage.cpp
-)
+target_sources(${LIB_FSFW_NAME} PRIVATE CFDPHandler.cpp CFDPMessage.cpp)
add_subdirectory(pdu)
add_subdirectory(tlv)
diff --git a/src/fsfw/cfdp/pdu/CMakeLists.txt b/src/fsfw/cfdp/pdu/CMakeLists.txt
index 931db306..4f345bdc 100644
--- a/src/fsfw/cfdp/pdu/CMakeLists.txt
+++ b/src/fsfw/cfdp/pdu/CMakeLists.txt
@@ -1,32 +1,30 @@
-target_sources(${LIB_FSFW_NAME} PRIVATE
- PduConfig.cpp
- VarLenField.cpp
- HeaderSerializer.cpp
- HeaderDeserializer.cpp
- FileDirectiveDeserializer.cpp
- FileDirectiveSerializer.cpp
-
- AckInfo.cpp
- AckPduSerializer.cpp
- AckPduDeserializer.cpp
- EofInfo.cpp
- EofPduSerializer.cpp
- EofPduDeserializer.cpp
- NakInfo.cpp
- NakPduSerializer.cpp
- NakPduDeserializer.cpp
- FinishedInfo.cpp
- FinishedPduSerializer.cpp
- FinishedPduDeserializer.cpp
- MetadataInfo.cpp
- MetadataPduSerializer.cpp
- MetadataPduDeserializer.cpp
- KeepAlivePduSerializer.cpp
- KeepAlivePduDeserializer.cpp
- PromptPduSerializer.cpp
- PromptPduDeserializer.cpp
-
- FileDataSerializer.cpp
- FileDataDeserializer.cpp
- FileDataInfo.cpp
-)
\ No newline at end of file
+target_sources(
+ ${LIB_FSFW_NAME}
+ PRIVATE PduConfig.cpp
+ VarLenField.cpp
+ HeaderSerializer.cpp
+ HeaderDeserializer.cpp
+ FileDirectiveDeserializer.cpp
+ FileDirectiveSerializer.cpp
+ AckInfo.cpp
+ AckPduSerializer.cpp
+ AckPduDeserializer.cpp
+ EofInfo.cpp
+ EofPduSerializer.cpp
+ EofPduDeserializer.cpp
+ NakInfo.cpp
+ NakPduSerializer.cpp
+ NakPduDeserializer.cpp
+ FinishedInfo.cpp
+ FinishedPduSerializer.cpp
+ FinishedPduDeserializer.cpp
+ MetadataInfo.cpp
+ MetadataPduSerializer.cpp
+ MetadataPduDeserializer.cpp
+ KeepAlivePduSerializer.cpp
+ KeepAlivePduDeserializer.cpp
+ PromptPduSerializer.cpp
+ PromptPduDeserializer.cpp
+ FileDataSerializer.cpp
+ FileDataDeserializer.cpp
+ FileDataInfo.cpp)
diff --git a/src/fsfw/cfdp/tlv/CMakeLists.txt b/src/fsfw/cfdp/tlv/CMakeLists.txt
index 24459cf8..cdf7b44a 100644
--- a/src/fsfw/cfdp/tlv/CMakeLists.txt
+++ b/src/fsfw/cfdp/tlv/CMakeLists.txt
@@ -1,10 +1,10 @@
-target_sources(${LIB_FSFW_NAME} PRIVATE
- EntityIdTlv.cpp
- FilestoreRequestTlv.cpp
- FilestoreResponseTlv.cpp
- Lv.cpp
- Tlv.cpp
- FlowLabelTlv.cpp
- MessageToUserTlv.cpp
- FaultHandlerOverrideTlv.cpp
-)
\ No newline at end of file
+target_sources(
+ ${LIB_FSFW_NAME}
+ PRIVATE EntityIdTlv.cpp
+ FilestoreRequestTlv.cpp
+ FilestoreResponseTlv.cpp
+ Lv.cpp
+ Tlv.cpp
+ FlowLabelTlv.cpp
+ MessageToUserTlv.cpp
+ FaultHandlerOverrideTlv.cpp)
diff --git a/src/fsfw/container/CMakeLists.txt b/src/fsfw/container/CMakeLists.txt
index 13eced1d..52087ff0 100644
--- a/src/fsfw/container/CMakeLists.txt
+++ b/src/fsfw/container/CMakeLists.txt
@@ -1,5 +1,2 @@
-target_sources(${LIB_FSFW_NAME}
- PRIVATE
- SharedRingBuffer.cpp
- SimpleRingBuffer.cpp
-)
\ No newline at end of file
+target_sources(${LIB_FSFW_NAME} PRIVATE SharedRingBuffer.cpp
+ SimpleRingBuffer.cpp)
diff --git a/src/fsfw/container/FIFOBase.tpp b/src/fsfw/container/FIFOBase.tpp
index 2e6a3829..91804b6c 100644
--- a/src/fsfw/container/FIFOBase.tpp
+++ b/src/fsfw/container/FIFOBase.tpp
@@ -5,89 +5,88 @@
#error Include FIFOBase.h before FIFOBase.tpp!
#endif
-template
-inline FIFOBase::FIFOBase(T* values, const size_t maxCapacity):
- maxCapacity(maxCapacity), values(values){};
+template
+inline FIFOBase::FIFOBase(T* values, const size_t maxCapacity)
+ : maxCapacity(maxCapacity), values(values){};
-template
+template
inline ReturnValue_t FIFOBase::insert(T value) {
- if (full()) {
- return FULL;
- } else {
- values[writeIndex] = value;
- writeIndex = next(writeIndex);
- ++currentSize;
- return HasReturnvaluesIF::RETURN_OK;
- }
+ if (full()) {
+ return FULL;
+ } else {
+ values[writeIndex] = value;
+ writeIndex = next(writeIndex);
+ ++currentSize;
+ return HasReturnvaluesIF::RETURN_OK;
+ }
};
-template
+template
inline ReturnValue_t FIFOBase::retrieve(T* value) {
- if (empty()) {
- return EMPTY;
- } else {
- if (value == nullptr){
- return HasReturnvaluesIF::RETURN_FAILED;
- }
- *value = values[readIndex];
- readIndex = next(readIndex);
- --currentSize;
- return HasReturnvaluesIF::RETURN_OK;
+ if (empty()) {
+ return EMPTY;
+ } else {
+ if (value == nullptr) {
+ return HasReturnvaluesIF::RETURN_FAILED;
}
+ *value = values[readIndex];
+ readIndex = next(readIndex);
+ --currentSize;
+ return HasReturnvaluesIF::RETURN_OK;
+ }
};
-template
+template
inline ReturnValue_t FIFOBase::peek(T* value) {
- if(empty()) {
- return EMPTY;
- } else {
- if (value == nullptr){
- return HasReturnvaluesIF::RETURN_FAILED;
- }
- *value = values[readIndex];
- return HasReturnvaluesIF::RETURN_OK;
+ if (empty()) {
+ return EMPTY;
+ } else {
+ if (value == nullptr) {
+ return HasReturnvaluesIF::RETURN_FAILED;
}
+ *value = values[readIndex];
+ return HasReturnvaluesIF::RETURN_OK;
+ }
};
-template
+template
inline ReturnValue_t FIFOBase::pop() {
- T value;
- return this->retrieve(&value);
+ T value;
+ return this->retrieve(&value);
};
-template
+template
inline bool FIFOBase::empty() {
- return (currentSize == 0);
+ return (currentSize == 0);
};
-template
+template
inline bool FIFOBase::full() {
- return (currentSize == maxCapacity);
+ return (currentSize == maxCapacity);
}
-template
+template
inline size_t FIFOBase::size() {
- return currentSize;
+ return currentSize;
}
-template
+template
inline size_t FIFOBase::next(size_t current) {
- ++current;
- if (current == maxCapacity) {
- current = 0;
- }
- return current;
+ ++current;
+ if (current == maxCapacity) {
+ current = 0;
+ }
+ return current;
}
-template
+template
inline size_t FIFOBase::getMaxCapacity() const {
- return maxCapacity;
+ return maxCapacity;
}
-
-template
-inline void FIFOBase::setContainer(T *data) {
- this->values = data;
+template
+inline void FIFOBase::setContainer(T* data) {
+ this->values = data;
}
#endif
diff --git a/src/fsfw/container/FixedArrayList.h b/src/fsfw/container/FixedArrayList.h
index 11882537..fc8be393 100644
--- a/src/fsfw/container/FixedArrayList.h
+++ b/src/fsfw/container/FixedArrayList.h
@@ -12,6 +12,7 @@ template
class FixedArrayList : public ArrayList {
static_assert(MAX_SIZE <= std::numeric_limits::max(),
"count_t is not large enough to hold MAX_SIZE");
+
private:
T data[MAX_SIZE];
diff --git a/src/fsfw/container/FixedOrderedMultimap.tpp b/src/fsfw/container/FixedOrderedMultimap.tpp
index 294a161f..fd58bc44 100644
--- a/src/fsfw/container/FixedOrderedMultimap.tpp
+++ b/src/fsfw/container/FixedOrderedMultimap.tpp
@@ -1,109 +1,109 @@
#ifndef FRAMEWORK_CONTAINER_FIXEDORDEREDMULTIMAP_TPP_
#define FRAMEWORK_CONTAINER_FIXEDORDEREDMULTIMAP_TPP_
-
-template
-inline ReturnValue_t FixedOrderedMultimap::insert(key_t key, T value, Iterator *storedValue) {
- if (_size == theMap.maxSize()) {
- return MAP_FULL;
- }
- size_t position = findNicePlace(key);
- memmove(static_cast(&theMap[position + 1]),static_cast(&theMap[position]),
- (_size - position) * sizeof(std::pair));
- theMap[position].first = key;
- theMap[position].second = value;
- ++_size;
- if (storedValue != nullptr) {
- *storedValue = Iterator(&theMap[position]);
- }
- return HasReturnvaluesIF::RETURN_OK;
+template
+inline ReturnValue_t FixedOrderedMultimap::insert(key_t key, T value,
+ Iterator *storedValue) {
+ if (_size == theMap.maxSize()) {
+ return MAP_FULL;
+ }
+ size_t position = findNicePlace(key);
+ memmove(static_cast(&theMap[position + 1]), static_cast(&theMap[position]),
+ (_size - position) * sizeof(std::pair));
+ theMap[position].first = key;
+ theMap[position].second = value;
+ ++_size;
+ if (storedValue != nullptr) {
+ *storedValue = Iterator(&theMap[position]);
+ }
+ return HasReturnvaluesIF::RETURN_OK;
}
-template
+template
inline ReturnValue_t FixedOrderedMultimap::insert(std::pair pair) {
- return insert(pair.first, pair.second);
+ return insert(pair.first, pair.second);
}
-template
+template
inline ReturnValue_t FixedOrderedMultimap::exists(key_t key) const {
- ReturnValue_t result = KEY_DOES_NOT_EXIST;
- if (findFirstIndex(key) < _size) {
- result = HasReturnvaluesIF::RETURN_OK;
- }
- return result;
+ ReturnValue_t result = KEY_DOES_NOT_EXIST;
+ if (findFirstIndex(key) < _size) {
+ result = HasReturnvaluesIF::RETURN_OK;
+ }
+ return result;
}
-template
+template
inline ReturnValue_t FixedOrderedMultimap::erase(Iterator *iter) {
- size_t i;
- if ((i = findFirstIndex((*iter).value->first)) >= _size) {
- return KEY_DOES_NOT_EXIST;
- }
- removeFromPosition(i);
- if (*iter != begin()) {
- (*iter)--;
- } else {
- *iter = begin();
- }
- return HasReturnvaluesIF::RETURN_OK;
+ size_t i;
+ if ((i = findFirstIndex((*iter).value->first)) >= _size) {
+ return KEY_DOES_NOT_EXIST;
+ }
+ removeFromPosition(i);
+ if (*iter != begin()) {
+ (*iter)--;
+ } else {
+ *iter = begin();
+ }
+ return HasReturnvaluesIF::RETURN_OK;
}
-template
+template
inline ReturnValue_t FixedOrderedMultimap::erase(key_t key) {
- size_t i;
- if ((i = findFirstIndex(key)) >= _size) {
- return KEY_DOES_NOT_EXIST;
- }
- do {
- removeFromPosition(i);
- i = findFirstIndex(key, i);
- } while (i < _size);
- return HasReturnvaluesIF::RETURN_OK;
+ size_t i;
+ if ((i = findFirstIndex(key)) >= _size) {
+ return KEY_DOES_NOT_EXIST;
+ }
+ do {
+ removeFromPosition(i);
+ i = findFirstIndex(key, i);
+ } while (i < _size);
+ return HasReturnvaluesIF::RETURN_OK;
}
-template
+template
inline ReturnValue_t FixedOrderedMultimap::find(key_t key, T **value) const {
- ReturnValue_t result = exists(key);
- if (result != HasReturnvaluesIF::RETURN_OK) {
- return result;
- }
- *value = &theMap[findFirstIndex(key)].second;
- return HasReturnvaluesIF::RETURN_OK;
+ ReturnValue_t result = exists(key);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ *value = &theMap[findFirstIndex(key)].second;
+ return HasReturnvaluesIF::RETURN_OK;
}
-template
-inline size_t FixedOrderedMultimap::findFirstIndex(key_t key, size_t startAt) const {
- if (startAt >= _size) {
- return startAt + 1;
+template
+inline size_t FixedOrderedMultimap::findFirstIndex(key_t key,
+ size_t startAt) const {
+ if (startAt >= _size) {
+ return startAt + 1;
+ }
+ size_t i = startAt;
+ for (i = startAt; i < _size; ++i) {
+ if (theMap[i].first == key) {
+ return i;
}
- size_t i = startAt;
- for (i = startAt; i < _size; ++i) {
- if (theMap[i].first == key) {
- return i;
- }
- }
- return i;
+ }
+ return i;
}
-template
+template
inline size_t FixedOrderedMultimap::findNicePlace(key_t key) const {
- size_t i = 0;
- for (i = 0; i < _size; ++i) {
- if (myComp(key, theMap[i].first)) {
- return i;
- }
+ size_t i = 0;
+ for (i = 0; i < _size; ++i) {
+ if (myComp(key, theMap[i].first)) {
+ return i;
}
- return i;
+ }
+ return i;
}
-template
+template
inline void FixedOrderedMultimap::removeFromPosition(size_t position) {
- if (_size <= position) {
- return;
- }
- memmove(static_cast(&theMap[position]), static_cast(&theMap[position + 1]),
- (_size - position - 1) * sizeof(std::pair));
- --_size;
+ if (_size <= position) {
+ return;
+ }
+ memmove(static_cast(&theMap[position]), static_cast(&theMap[position + 1]),
+ (_size - position - 1) * sizeof(std::pair));
+ --_size;
}
-
#endif /* FRAMEWORK_CONTAINER_FIXEDORDEREDMULTIMAP_TPP_ */
diff --git a/src/fsfw/controller/CMakeLists.txt b/src/fsfw/controller/CMakeLists.txt
index 550acfcd..c8c000d8 100644
--- a/src/fsfw/controller/CMakeLists.txt
+++ b/src/fsfw/controller/CMakeLists.txt
@@ -1,4 +1,2 @@
-target_sources(${LIB_FSFW_NAME} PRIVATE
- ControllerBase.cpp
- ExtendedControllerBase.cpp
-)
\ No newline at end of file
+target_sources(${LIB_FSFW_NAME} PRIVATE ControllerBase.cpp
+ ExtendedControllerBase.cpp)
diff --git a/src/fsfw/coordinates/CMakeLists.txt b/src/fsfw/coordinates/CMakeLists.txt
index a1fa1e52..15452b1c 100644
--- a/src/fsfw/coordinates/CMakeLists.txt
+++ b/src/fsfw/coordinates/CMakeLists.txt
@@ -1,5 +1,2 @@
-target_sources(${LIB_FSFW_NAME}
- PRIVATE
- CoordinateTransformations.cpp
- Sgp4Propagator.cpp
-)
\ No newline at end of file
+target_sources(${LIB_FSFW_NAME} PRIVATE CoordinateTransformations.cpp
+ Sgp4Propagator.cpp)
diff --git a/src/fsfw/datalinklayer/CMakeLists.txt b/src/fsfw/datalinklayer/CMakeLists.txt
index 148e7c5d..cc18088f 100644
--- a/src/fsfw/datalinklayer/CMakeLists.txt
+++ b/src/fsfw/datalinklayer/CMakeLists.txt
@@ -1,12 +1,11 @@
-target_sources(${LIB_FSFW_NAME}
- PRIVATE
- Clcw.cpp
- DataLinkLayer.cpp
- Farm1StateLockout.cpp
- Farm1StateOpen.cpp
- Farm1StateWait.cpp
- MapPacketExtraction.cpp
- TcTransferFrame.cpp
- TcTransferFrameLocal.cpp
- VirtualChannelReception.cpp
-)
\ No newline at end of file
+target_sources(
+ ${LIB_FSFW_NAME}
+ PRIVATE Clcw.cpp
+ DataLinkLayer.cpp
+ Farm1StateLockout.cpp
+ Farm1StateOpen.cpp
+ Farm1StateWait.cpp
+ MapPacketExtraction.cpp
+ TcTransferFrame.cpp
+ TcTransferFrameLocal.cpp
+ VirtualChannelReception.cpp)
diff --git a/src/fsfw/datapool/CMakeLists.txt b/src/fsfw/datapool/CMakeLists.txt
index be4606aa..b2ac592c 100644
--- a/src/fsfw/datapool/CMakeLists.txt
+++ b/src/fsfw/datapool/CMakeLists.txt
@@ -1,4 +1 @@
-target_sources(${LIB_FSFW_NAME} PRIVATE
- PoolDataSetBase.cpp
- PoolEntry.cpp
-)
\ No newline at end of file
+target_sources(${LIB_FSFW_NAME} PRIVATE PoolDataSetBase.cpp PoolEntry.cpp)
diff --git a/src/fsfw/datapoollocal/CMakeLists.txt b/src/fsfw/datapoollocal/CMakeLists.txt
index e2db39eb..749ef688 100644
--- a/src/fsfw/datapoollocal/CMakeLists.txt
+++ b/src/fsfw/datapoollocal/CMakeLists.txt
@@ -1,10 +1,6 @@
-target_sources(${LIB_FSFW_NAME}
- PRIVATE
- LocalDataPoolManager.cpp
- LocalDataSet.cpp
- LocalPoolDataSetBase.cpp
- LocalPoolObjectBase.cpp
- SharedLocalDataSet.cpp
-)
+target_sources(
+ ${LIB_FSFW_NAME}
+ PRIVATE LocalDataPoolManager.cpp LocalDataSet.cpp LocalPoolDataSetBase.cpp
+ LocalPoolObjectBase.cpp SharedLocalDataSet.cpp)
-add_subdirectory(internal)
\ No newline at end of file
+add_subdirectory(internal)
diff --git a/src/fsfw/datapoollocal/LocalPoolVariable.tpp b/src/fsfw/datapoollocal/LocalPoolVariable.tpp
index 9bb30611..f800dfd3 100644
--- a/src/fsfw/datapoollocal/LocalPoolVariable.tpp
+++ b/src/fsfw/datapoollocal/LocalPoolVariable.tpp
@@ -5,205 +5,189 @@
#error Include LocalPoolVariable.h before LocalPoolVariable.tpp!
#endif
-template
-inline LocalPoolVariable::LocalPoolVariable(HasLocalDataPoolIF* hkOwner,
- lp_id_t poolId, DataSetIF* dataSet, pool_rwm_t setReadWriteMode):
- LocalPoolObjectBase(poolId, hkOwner, dataSet, setReadWriteMode) {}
+template
+inline LocalPoolVariable::LocalPoolVariable(HasLocalDataPoolIF* hkOwner, lp_id_t poolId,
+ DataSetIF* dataSet, pool_rwm_t setReadWriteMode)
+ : LocalPoolObjectBase(poolId, hkOwner, dataSet, setReadWriteMode) {}
-template
-inline LocalPoolVariable::LocalPoolVariable(object_id_t poolOwner,
- lp_id_t poolId, DataSetIF *dataSet, pool_rwm_t setReadWriteMode):
- LocalPoolObjectBase(poolOwner, poolId, dataSet, setReadWriteMode) {}
+template
+inline LocalPoolVariable::LocalPoolVariable(object_id_t poolOwner, lp_id_t poolId,
+ DataSetIF* dataSet, pool_rwm_t setReadWriteMode)
+ : LocalPoolObjectBase(poolOwner, poolId, dataSet, setReadWriteMode) {}
+template
+inline LocalPoolVariable::LocalPoolVariable(gp_id_t globalPoolId, DataSetIF* dataSet,
+ pool_rwm_t setReadWriteMode)
+ : LocalPoolObjectBase(globalPoolId.objectId, globalPoolId.localPoolId, dataSet,
+ setReadWriteMode) {}
-template
-inline LocalPoolVariable::LocalPoolVariable(gp_id_t globalPoolId,
- DataSetIF *dataSet, pool_rwm_t setReadWriteMode):
- LocalPoolObjectBase(globalPoolId.objectId, globalPoolId.localPoolId,
- dataSet, setReadWriteMode){}
-
-
-template
-inline ReturnValue_t LocalPoolVariable::read(
- MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
- if(hkManager == nullptr) {
- return readWithoutLock();
- }
- MutexIF* mutex = LocalDpManagerAttorney::getMutexHandle(*hkManager);
- ReturnValue_t result = mutex->lockMutex(timeoutType, timeoutMs);
- if(result != HasReturnvaluesIF::RETURN_OK) {
- return result;
- }
- result = readWithoutLock();
- mutex->unlockMutex();
+template
+inline ReturnValue_t LocalPoolVariable::read(MutexIF::TimeoutType timeoutType,
+ uint32_t timeoutMs) {
+ if (hkManager == nullptr) {
+ return readWithoutLock();
+ }
+ MutexIF* mutex = LocalDpManagerAttorney::getMutexHandle(*hkManager);
+ ReturnValue_t result = mutex->lockMutex(timeoutType, timeoutMs);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
return result;
+ }
+ result = readWithoutLock();
+ mutex->unlockMutex();
+ return result;
}
-template
+template
inline ReturnValue_t LocalPoolVariable::readWithoutLock() {
- if(readWriteMode == pool_rwm_t::VAR_WRITE) {
- object_id_t targetObjectId = hkManager->getCreatorObjectId();
- reportReadCommitError("LocalPoolVector",
- PoolVariableIF::INVALID_READ_WRITE_MODE, true, targetObjectId,
- localPoolId);
- return PoolVariableIF::INVALID_READ_WRITE_MODE;
- }
+ if (readWriteMode == pool_rwm_t::VAR_WRITE) {
+ object_id_t targetObjectId = hkManager->getCreatorObjectId();
+ reportReadCommitError("LocalPoolVector", PoolVariableIF::INVALID_READ_WRITE_MODE, true,
+ targetObjectId, localPoolId);
+ return PoolVariableIF::INVALID_READ_WRITE_MODE;
+ }
- PoolEntry* poolEntry = nullptr;
- ReturnValue_t result = LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId,
- &poolEntry);
- if(result != RETURN_OK) {
- object_id_t ownerObjectId = hkManager->getCreatorObjectId();
- reportReadCommitError("LocalPoolVariable", result,
- false, ownerObjectId, localPoolId);
- return result;
- }
-
- this->value = *(poolEntry->getDataPtr());
- this->valid = poolEntry->getValid();
- return RETURN_OK;
-}
-
-template
-inline ReturnValue_t LocalPoolVariable::commit(bool setValid,
- MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
- this->setValid(setValid);
- return commit(timeoutType, timeoutMs);
-}
-
-template
-inline ReturnValue_t LocalPoolVariable::commit(
- MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
- if(hkManager == nullptr) {
- return commitWithoutLock();
- }
- MutexIF* mutex = LocalDpManagerAttorney::getMutexHandle(*hkManager);
- ReturnValue_t result = mutex->lockMutex(timeoutType, timeoutMs);
- if(result != HasReturnvaluesIF::RETURN_OK) {
- return result;
- }
- result = commitWithoutLock();
- mutex->unlockMutex();
+ PoolEntry* poolEntry = nullptr;
+ ReturnValue_t result =
+ LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId, &poolEntry);
+ if (result != RETURN_OK) {
+ object_id_t ownerObjectId = hkManager->getCreatorObjectId();
+ reportReadCommitError("LocalPoolVariable", result, false, ownerObjectId, localPoolId);
return result;
+ }
+
+ this->value = *(poolEntry->getDataPtr());
+ this->valid = poolEntry->getValid();
+ return RETURN_OK;
}
-template
+template
+inline ReturnValue_t LocalPoolVariable::commit(bool setValid, MutexIF::TimeoutType timeoutType,
+ uint32_t timeoutMs) {
+ this->setValid(setValid);
+ return commit(timeoutType, timeoutMs);
+}
+
+template
+inline ReturnValue_t LocalPoolVariable::commit(MutexIF::TimeoutType timeoutType,
+ uint32_t timeoutMs) {
+ if (hkManager == nullptr) {
+ return commitWithoutLock();
+ }
+ MutexIF* mutex = LocalDpManagerAttorney::getMutexHandle(*hkManager);
+ ReturnValue_t result = mutex->lockMutex(timeoutType, timeoutMs);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
+ result = commitWithoutLock();
+ mutex->unlockMutex();
+ return result;
+}
+
+template
inline ReturnValue_t LocalPoolVariable::commitWithoutLock() {
- if(readWriteMode == pool_rwm_t::VAR_READ) {
- object_id_t targetObjectId = hkManager->getCreatorObjectId();
- reportReadCommitError("LocalPoolVector",
- PoolVariableIF::INVALID_READ_WRITE_MODE, false, targetObjectId,
- localPoolId);
- return PoolVariableIF::INVALID_READ_WRITE_MODE;
- }
+ if (readWriteMode == pool_rwm_t::VAR_READ) {
+ object_id_t targetObjectId = hkManager->getCreatorObjectId();
+ reportReadCommitError("LocalPoolVector", PoolVariableIF::INVALID_READ_WRITE_MODE, false,
+ targetObjectId, localPoolId);
+ return PoolVariableIF::INVALID_READ_WRITE_MODE;
+ }
- PoolEntry* poolEntry = nullptr;
- ReturnValue_t result = LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId,
- &poolEntry);
- if(result != RETURN_OK) {
- object_id_t ownerObjectId = hkManager->getCreatorObjectId();
- reportReadCommitError("LocalPoolVariable", result,
- false, ownerObjectId, localPoolId);
- return result;
- }
+ PoolEntry* poolEntry = nullptr;
+ ReturnValue_t result =
+ LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId, &poolEntry);
+ if (result != RETURN_OK) {
+ object_id_t ownerObjectId = hkManager->getCreatorObjectId();
+ reportReadCommitError("LocalPoolVariable", result, false, ownerObjectId, localPoolId);
+ return result;
+ }
- *(poolEntry->getDataPtr()) = this->value;
- poolEntry->setValid(this->valid);
- return RETURN_OK;
+ *(poolEntry->getDataPtr()) = this->value;
+ poolEntry->setValid(this->valid);
+ return RETURN_OK;
}
-template
-inline ReturnValue_t LocalPoolVariable::serialize(uint8_t** buffer,
- size_t* size, const size_t max_size,
- SerializeIF::Endianness streamEndianness) const {
- return SerializeAdapter::serialize(&value,
- buffer, size ,max_size, streamEndianness);
+template
+inline ReturnValue_t LocalPoolVariable::serialize(
+ uint8_t** buffer, size_t* size, const size_t max_size,
+ SerializeIF::Endianness streamEndianness) const {
+ return SerializeAdapter::serialize(&value, buffer, size, max_size, streamEndianness);
}
-template
+template
inline size_t LocalPoolVariable::getSerializedSize() const {
- return SerializeAdapter::getSerializedSize(&value);
+ return SerializeAdapter::getSerializedSize(&value);
}
-template
-inline ReturnValue_t LocalPoolVariable::deSerialize(const uint8_t** buffer,
- size_t* size, SerializeIF::Endianness streamEndianness) {
- return SerializeAdapter::deSerialize(&value, buffer, size, streamEndianness);
+template
+inline ReturnValue_t LocalPoolVariable::deSerialize(const uint8_t** buffer, size_t* size,
+ SerializeIF::Endianness streamEndianness) {
+ return SerializeAdapter::deSerialize(&value, buffer, size, streamEndianness);
}
#if FSFW_CPP_OSTREAM_ENABLED == 1
-template
-inline std::ostream& operator<< (std::ostream &out,
- const LocalPoolVariable &var) {
- out << var.value;
- return out;
+template
+inline std::ostream& operator<<(std::ostream& out, const LocalPoolVariable& var) {
+ out << var.value;
+ return out;
}
#endif
-template
+template
inline LocalPoolVariable::operator T() const {
- return value;
+ return value;
}
-template
-inline LocalPoolVariable & LocalPoolVariable::operator=(
- const T& newValue) {
- value = newValue;
- return *this;
+template
+inline LocalPoolVariable& LocalPoolVariable::operator=(const T& newValue) {
+ value = newValue;
+ return *this;
}
-template
-inline LocalPoolVariable& LocalPoolVariable::operator =(
- const LocalPoolVariable& newPoolVariable) {
- value = newPoolVariable.value;
- return *this;
+template
+inline LocalPoolVariable& LocalPoolVariable::operator=(
+ const LocalPoolVariable& newPoolVariable) {
+ value = newPoolVariable.value;
+ return *this;
}
-template
-inline bool LocalPoolVariable::operator ==(
- const LocalPoolVariable &other) const {
- return this->value == other.value;
+template
+inline bool LocalPoolVariable::operator==(const LocalPoolVariable& other) const {
+ return this->value == other.value;
}
-template
-inline bool LocalPoolVariable::operator ==(const T &other) const {
- return this->value == other;
+template
+inline bool LocalPoolVariable::operator==(const T& other) const {
+ return this->value == other;
}
-
-template
-inline bool LocalPoolVariable::operator !=(
- const LocalPoolVariable &other) const {
- return not (*this == other);
+template
+inline bool LocalPoolVariable::operator!=(const LocalPoolVariable& other) const {
+ return not(*this == other);
}
-template
-inline bool LocalPoolVariable::operator !=(const T &other) const {
- return not (*this == other);
+template
+inline bool LocalPoolVariable::operator!=(const T& other) const {
+ return not(*this == other);
}
-
-template
-inline bool LocalPoolVariable::operator <(
- const LocalPoolVariable &other) const {
- return this->value < other.value;
+template
+inline bool LocalPoolVariable::operator<(const LocalPoolVariable& other) const {
+ return this->value < other.value;
}
-template
-inline bool LocalPoolVariable::operator <(const T &other) const {
- return this->value < other;
+template
+inline bool LocalPoolVariable::operator<(const T& other) const {
+ return this->value < other;
}
-
-template
-inline bool LocalPoolVariable::operator >(
- const LocalPoolVariable &other) const {
- return not (*this < other);
+template
+inline bool LocalPoolVariable::operator>(const LocalPoolVariable& other) const {
+ return not(*this < other);
}
-template
-inline bool LocalPoolVariable::operator >(const T &other) const {
- return not (*this < other);
+template
+inline bool LocalPoolVariable::operator>(const T& other) const {
+ return not(*this < other);
}
#endif /* FSFW_DATAPOOLLOCAL_LOCALPOOLVARIABLE_TPP_ */
diff --git a/src/fsfw/datapoollocal/LocalPoolVector.tpp b/src/fsfw/datapoollocal/LocalPoolVector.tpp
index 044b8fa7..a2c2b752 100644
--- a/src/fsfw/datapoollocal/LocalPoolVector.tpp
+++ b/src/fsfw/datapoollocal/LocalPoolVector.tpp
@@ -5,174 +5,172 @@
#error Include LocalPoolVector.h before LocalPoolVector.tpp!
#endif
-template
-inline LocalPoolVector::LocalPoolVector(
- HasLocalDataPoolIF* hkOwner, lp_id_t poolId, DataSetIF* dataSet,
- pool_rwm_t setReadWriteMode):
- LocalPoolObjectBase(poolId, hkOwner, dataSet, setReadWriteMode) {}
+template
+inline LocalPoolVector::LocalPoolVector(HasLocalDataPoolIF* hkOwner, lp_id_t poolId,
+ DataSetIF* dataSet,
+ pool_rwm_t setReadWriteMode)
+ : LocalPoolObjectBase(poolId, hkOwner, dataSet, setReadWriteMode) {}
-template
-inline LocalPoolVector::LocalPoolVector(object_id_t poolOwner,
- lp_id_t poolId, DataSetIF *dataSet, pool_rwm_t setReadWriteMode):
- LocalPoolObjectBase(poolOwner, poolId, dataSet, setReadWriteMode) {}
+template
+inline LocalPoolVector::LocalPoolVector(object_id_t poolOwner, lp_id_t poolId,
+ DataSetIF* dataSet,
+ pool_rwm_t setReadWriteMode)
+ : LocalPoolObjectBase(poolOwner, poolId, dataSet, setReadWriteMode) {}
-template
-inline LocalPoolVector::LocalPoolVector(gp_id_t globalPoolId,
- DataSetIF *dataSet, pool_rwm_t setReadWriteMode):
- LocalPoolObjectBase(globalPoolId.objectId, globalPoolId.localPoolId,
- dataSet, setReadWriteMode) {}
+template
+inline LocalPoolVector::LocalPoolVector(gp_id_t globalPoolId, DataSetIF* dataSet,
+ pool_rwm_t setReadWriteMode)
+ : LocalPoolObjectBase(globalPoolId.objectId, globalPoolId.localPoolId, dataSet,
+ setReadWriteMode) {}
-template
-inline ReturnValue_t LocalPoolVector::read(
- MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
- MutexGuard(LocalDpManagerAttorney::getMutexHandle(*hkManager), timeoutType, timeoutMs);
- return readWithoutLock();
+template
+inline ReturnValue_t LocalPoolVector::read(MutexIF::TimeoutType timeoutType,
+ uint32_t timeoutMs) {
+ MutexGuard(LocalDpManagerAttorney::getMutexHandle(*hkManager), timeoutType, timeoutMs);
+ return readWithoutLock();
}
-template
+template
inline ReturnValue_t LocalPoolVector::readWithoutLock() {
- if(readWriteMode == pool_rwm_t::VAR_WRITE) {
- object_id_t targetObjectId = hkManager->getCreatorObjectId();
- reportReadCommitError("LocalPoolVector",
- PoolVariableIF::INVALID_READ_WRITE_MODE, true, targetObjectId,
- localPoolId);
- return PoolVariableIF::INVALID_READ_WRITE_MODE;
- }
+ if (readWriteMode == pool_rwm_t::VAR_WRITE) {
+ object_id_t targetObjectId = hkManager->getCreatorObjectId();
+ reportReadCommitError("LocalPoolVector", PoolVariableIF::INVALID_READ_WRITE_MODE, true,
+ targetObjectId, localPoolId);
+ return PoolVariableIF::INVALID_READ_WRITE_MODE;
+ }
- PoolEntry* poolEntry = nullptr;
- ReturnValue_t result = LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId,
- &poolEntry);
- memset(this->value, 0, vectorSize * sizeof(T));
+ PoolEntry* poolEntry = nullptr;
+ ReturnValue_t result =
+ LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId, &poolEntry);
+ memset(this->value, 0, vectorSize * sizeof(T));
- if(result != RETURN_OK) {
- object_id_t targetObjectId = hkManager->getCreatorObjectId();
- reportReadCommitError("LocalPoolVector", result, true, targetObjectId,
- localPoolId);
- return result;
- }
- std::memcpy(this->value, poolEntry->getDataPtr(), poolEntry->getByteSize());
- this->valid = poolEntry->getValid();
- return RETURN_OK;
+ if (result != RETURN_OK) {
+ object_id_t targetObjectId = hkManager->getCreatorObjectId();
+ reportReadCommitError("LocalPoolVector", result, true, targetObjectId, localPoolId);
+ return result;
+ }
+ std::memcpy(this->value, poolEntry->getDataPtr(), poolEntry->getByteSize());
+ this->valid = poolEntry->getValid();
+ return RETURN_OK;
}
-template
+template
inline ReturnValue_t LocalPoolVector::commit(bool valid,
- MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
- this->setValid(valid);
- return commit(timeoutType, timeoutMs);
+ MutexIF::TimeoutType timeoutType,
+ uint32_t timeoutMs) {
+ this->setValid(valid);
+ return commit(timeoutType, timeoutMs);
}
-template
-inline ReturnValue_t LocalPoolVector::commit(
- MutexIF::TimeoutType timeoutType, uint32_t timeoutMs) {
- MutexGuard(LocalDpManagerAttorney::getMutexHandle(*hkManager), timeoutType, timeoutMs);
- return commitWithoutLock();
+template
+inline ReturnValue_t LocalPoolVector::commit(MutexIF::TimeoutType timeoutType,
+ uint32_t timeoutMs) {
+ MutexGuard(LocalDpManagerAttorney::getMutexHandle(*hkManager), timeoutType, timeoutMs);
+ return commitWithoutLock();
}
-template
+template
inline ReturnValue_t LocalPoolVector::commitWithoutLock() {
- if(readWriteMode == pool_rwm_t::VAR_READ) {
- object_id_t targetObjectId = hkManager->getCreatorObjectId();
- reportReadCommitError("LocalPoolVector",
- PoolVariableIF::INVALID_READ_WRITE_MODE, false, targetObjectId,
- localPoolId);
- return PoolVariableIF::INVALID_READ_WRITE_MODE;
- }
- PoolEntry* poolEntry = nullptr;
- ReturnValue_t result = LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId,
- &poolEntry);
- if(result != RETURN_OK) {
- object_id_t targetObjectId = hkManager->getCreatorObjectId();
- reportReadCommitError("LocalPoolVector", result, false, targetObjectId,
- localPoolId);
- return result;
- }
- std::memcpy(poolEntry->getDataPtr(), this->value, poolEntry->getByteSize());
- poolEntry->setValid(this->valid);
- return RETURN_OK;
-}
-
-template
-inline T& LocalPoolVector::operator [](size_t i) {
- if(i < vectorSize) {
- return value[i];
- }
- // If this happens, I have to set some value. I consider this
- // a configuration error, but I wont exit here.
-#if FSFW_CPP_OSTREAM_ENABLED == 1
- sif::warning << "LocalPoolVector: Invalid index. Setting or returning"
- " last value!" << std::endl;
-#else
- sif::printWarning("LocalPoolVector: Invalid index. Setting or returning"
- " last value!\n");
-#endif
- return value[vectorSize - 1];
-}
-
-template
-inline const T& LocalPoolVector::operator [](size_t i) const {
- if(i < vectorSize) {
- return value[i];
- }
- // If this happens, I have to set some value. I consider this
- // a configuration error, but I wont exit here.
-#if FSFW_CPP_OSTREAM_ENABLED == 1
- sif::warning << "LocalPoolVector: Invalid index. Setting or returning"
- " last value!" << std::endl;
-#else
- sif::printWarning("LocalPoolVector: Invalid index. Setting or returning"
- " last value!\n");
-#endif
- return value[vectorSize - 1];
-}
-
-template
-inline ReturnValue_t LocalPoolVector::serialize(uint8_t** buffer,
- size_t* size, size_t maxSize,
- SerializeIF::Endianness streamEndianness) const {
- ReturnValue_t result = HasReturnvaluesIF::RETURN_FAILED;
- for (uint16_t i = 0; i < vectorSize; i++) {
- result = SerializeAdapter::serialize(&(value[i]), buffer, size,
- maxSize, streamEndianness);
- if (result != HasReturnvaluesIF::RETURN_OK) {
- break;
- }
- }
+ if (readWriteMode == pool_rwm_t::VAR_READ) {
+ object_id_t targetObjectId = hkManager->getCreatorObjectId();
+ reportReadCommitError("LocalPoolVector", PoolVariableIF::INVALID_READ_WRITE_MODE, false,
+ targetObjectId, localPoolId);
+ return PoolVariableIF::INVALID_READ_WRITE_MODE;
+ }
+ PoolEntry* poolEntry = nullptr;
+ ReturnValue_t result =
+ LocalDpManagerAttorney::fetchPoolEntry(*hkManager, localPoolId, &poolEntry);
+ if (result != RETURN_OK) {
+ object_id_t targetObjectId = hkManager->getCreatorObjectId();
+ reportReadCommitError("LocalPoolVector", result, false, targetObjectId, localPoolId);
return result;
+ }
+ std::memcpy(poolEntry->getDataPtr(), this->value, poolEntry->getByteSize());
+ poolEntry->setValid(this->valid);
+ return RETURN_OK;
}
-template
+template
+inline T& LocalPoolVector::operator[](size_t i) {
+ if (i < vectorSize) {
+ return value[i];
+ }
+ // If this happens, I have to set some value. I consider this
+ // a configuration error, but I wont exit here.
+#if FSFW_CPP_OSTREAM_ENABLED == 1
+ sif::warning << "LocalPoolVector: Invalid index. Setting or returning"
+ " last value!"
+ << std::endl;
+#else
+ sif::printWarning(
+ "LocalPoolVector: Invalid index. Setting or returning"
+ " last value!\n");
+#endif
+ return value[vectorSize - 1];
+}
+
+template
+inline const T& LocalPoolVector::operator[](size_t i) const {
+ if (i < vectorSize) {
+ return value[i];
+ }
+ // If this happens, I have to set some value. I consider this
+ // a configuration error, but I wont exit here.
+#if FSFW_CPP_OSTREAM_ENABLED == 1
+ sif::warning << "LocalPoolVector: Invalid index. Setting or returning"
+ " last value!"
+ << std::endl;
+#else
+ sif::printWarning(
+ "LocalPoolVector: Invalid index. Setting or returning"
+ " last value!\n");
+#endif
+ return value[vectorSize - 1];
+}
+
+template
+inline ReturnValue_t LocalPoolVector::serialize(
+ uint8_t** buffer, size_t* size, size_t maxSize,
+ SerializeIF::Endianness streamEndianness) const {
+ ReturnValue_t result = HasReturnvaluesIF::RETURN_FAILED;
+ for (uint16_t i = 0; i < vectorSize; i++) {
+ result = SerializeAdapter::serialize(&(value[i]), buffer, size, maxSize, streamEndianness);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ break;
+ }
+ }
+ return result;
+}
+
+template
inline size_t LocalPoolVector::getSerializedSize() const {
- return vectorSize * SerializeAdapter::getSerializedSize(value);
+ return vectorSize * SerializeAdapter::getSerializedSize(value);
}
-template
+template