From ff4cbea57137521d60dfa283cfc72c6989439257 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 24 Aug 2022 17:44:55 +0200 Subject: [PATCH 01/10] improvements for auto-formatter script --- scripts/auto-formatter.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/auto-formatter.sh b/scripts/auto-formatter.sh index c0ae7099..723add4f 100755 --- a/scripts/auto-formatter.sh +++ b/scripts/auto-formatter.sh @@ -3,6 +3,11 @@ if [[ ! -f README.md ]]; then cd .. fi +folder_list=( + "./src" + "./unittests" +) + cmake_fmt="cmake-format" file_selectors="-iname CMakeLists.txt" if command -v ${cmake_fmt} &> /dev/null; then @@ -15,8 +20,10 @@ 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 ./unittests ${file_selectors} | xargs ${cpp_format} --style=file -i + for dir in ${folder_list[@]}; do + echo "Auto-formatting ${dir} recursively" + find ${dir} ${file_selectors} | xargs clang-format --style=file -i + done else echo "No ${cpp_format} tool found, not formatting C++/C files" fi From fd278e410b943efeb30435b9a5fb00988c171be9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 29 Aug 2022 12:01:44 +0200 Subject: [PATCH 02/10] additional safety check --- src/fsfw/pus/Service11TelecommandScheduling.tpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/fsfw/pus/Service11TelecommandScheduling.tpp b/src/fsfw/pus/Service11TelecommandScheduling.tpp index 7b9ba7c0..59261cfd 100644 --- a/src/fsfw/pus/Service11TelecommandScheduling.tpp +++ b/src/fsfw/pus/Service11TelecommandScheduling.tpp @@ -588,10 +588,12 @@ inline ReturnValue_t Service11TelecommandScheduling::getMapFilterFr } // additional security check, this should never be true - if (itBegin->first > itEnd->first) { + if ((itBegin != telecommandMap.end() and itEnd != telecommandMap.end()) and + (itBegin->first > itEnd->first)) { #if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::error << "11::getMapFilterFromData: itBegin > itEnd\n" << std::endl; #else - sif::printError("11::GetMapFilterFromData: itBegin > itEnd\n"); + sif::printError("11::getMapFilterFromData: itBegin > itEnd\n"); #endif return returnvalue::FAILED; } From e2e0190caef8d26d019ad4e50e3518a7c14e9597 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Mon, 29 Aug 2022 14:51:14 +0200 Subject: [PATCH 03/10] Revert "additional safety check" This reverts commit fd278e410b943efeb30435b9a5fb00988c171be9. --- src/fsfw/pus/Service11TelecommandScheduling.tpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/fsfw/pus/Service11TelecommandScheduling.tpp b/src/fsfw/pus/Service11TelecommandScheduling.tpp index 59261cfd..7b9ba7c0 100644 --- a/src/fsfw/pus/Service11TelecommandScheduling.tpp +++ b/src/fsfw/pus/Service11TelecommandScheduling.tpp @@ -588,12 +588,10 @@ inline ReturnValue_t Service11TelecommandScheduling::getMapFilterFr } // additional security check, this should never be true - if ((itBegin != telecommandMap.end() and itEnd != telecommandMap.end()) and - (itBegin->first > itEnd->first)) { + if (itBegin->first > itEnd->first) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "11::getMapFilterFromData: itBegin > itEnd\n" << std::endl; #else - sif::printError("11::getMapFilterFromData: itBegin > itEnd\n"); + sif::printError("11::GetMapFilterFromData: itBegin > itEnd\n"); #endif return returnvalue::FAILED; } From 6605ffb6b1e2a039d6132b3e150bdc13c42dd543 Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Mon, 29 Aug 2022 14:54:52 +0200 Subject: [PATCH 04/10] Fixing check in Srv 11 Filer --- src/fsfw/pus/Service11TelecommandScheduling.tpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/fsfw/pus/Service11TelecommandScheduling.tpp b/src/fsfw/pus/Service11TelecommandScheduling.tpp index 7b9ba7c0..7f60f7e8 100644 --- a/src/fsfw/pus/Service11TelecommandScheduling.tpp +++ b/src/fsfw/pus/Service11TelecommandScheduling.tpp @@ -588,10 +588,11 @@ inline ReturnValue_t Service11TelecommandScheduling::getMapFilterFr } // additional security check, this should never be true - if (itBegin->first > itEnd->first) { + if (itBegin > itEnd) { #if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::error << "11::getMapFilterFromData: itBegin > itEnd\n" << std::endl; #else - sif::printError("11::GetMapFilterFromData: itBegin > itEnd\n"); + sif::printError("11::getMapFilterFromData: itBegin > itEnd\n"); #endif return returnvalue::FAILED; } From 20d42add0348941baba7b079f03ba0ff57bfd083 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 30 Aug 2022 12:07:09 +0200 Subject: [PATCH 05/10] add new data wrapper helper type --- src/fsfw/util/dataWrapper.h | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/fsfw/util/dataWrapper.h diff --git a/src/fsfw/util/dataWrapper.h b/src/fsfw/util/dataWrapper.h new file mode 100644 index 00000000..f5dab447 --- /dev/null +++ b/src/fsfw/util/dataWrapper.h @@ -0,0 +1,52 @@ +#ifndef FSFW_UTIL_DATAWRAPPER_H +#define FSFW_UTIL_DATAWRAPPER_H + +#include +#include +#include + +#include "fsfw/serialize.h" + +namespace util { + +struct RawData { + const uint8_t* data; + size_t len; +}; + +enum DataTypes { RAW, SERIALIZABLE }; + +union DataUnion { + RawData raw; + SerializeIF* serializable; +}; + +struct DataWrapper { + DataTypes type; + DataUnion dataUnion; + using BufPairT = std::pair; + + [[nodiscard]] size_t getLength() const { + if (type == DataTypes::RAW) { + return dataUnion.raw.len; + } else if (type == DataTypes::SERIALIZABLE and dataUnion.serializable != nullptr) { + return dataUnion.serializable->getSerializedSize(); + } + return 0; + } + + void setRawData(BufPairT bufPair) { + type = DataTypes::RAW; + dataUnion.raw.data = bufPair.first; + dataUnion.raw.len = bufPair.second; + } + + void setSerializable(SerializeIF& serializable) { + type = DataTypes::SERIALIZABLE; + dataUnion.serializable = &serializable; + } +}; + +} // namespace util + +#endif // FSFW_UTIL_DATAWRAPPER_H From 0f27c7e7e707fd3c901a43ac6de4ce072758d918 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 30 Aug 2022 13:24:29 +0200 Subject: [PATCH 06/10] extend data wrapper --- src/fsfw/util/dataWrapper.h | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/fsfw/util/dataWrapper.h b/src/fsfw/util/dataWrapper.h index f5dab447..5ae2c043 100644 --- a/src/fsfw/util/dataWrapper.h +++ b/src/fsfw/util/dataWrapper.h @@ -10,19 +10,19 @@ namespace util { struct RawData { - const uint8_t* data; - size_t len; + const uint8_t* data = nullptr; + size_t len = 0; }; -enum DataTypes { RAW, SERIALIZABLE }; +enum DataTypes { NONE, RAW, SERIALIZABLE }; union DataUnion { RawData raw; - SerializeIF* serializable; + SerializeIF* serializable = nullptr; }; struct DataWrapper { - DataTypes type; + DataTypes type = DataTypes::NONE; DataUnion dataUnion; using BufPairT = std::pair; @@ -35,6 +35,14 @@ struct DataWrapper { return 0; } + [[nodiscard]] bool isNull() const { + if (type == DataTypes::RAW and dataUnion.raw.data == nullptr or + (type == DataTypes::SERIALIZABLE and dataUnion.serializable == nullptr) or + (type == DataTypes::NONE)) { + return true; + } + return false; + } void setRawData(BufPairT bufPair) { type = DataTypes::RAW; dataUnion.raw.data = bufPair.first; From c756297e5c1ece6a2e22aa036c9a8c1d5a2e435b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 30 Aug 2022 13:39:44 +0200 Subject: [PATCH 07/10] data wrapper update --- src/fsfw/util/dataWrapper.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/fsfw/util/dataWrapper.h b/src/fsfw/util/dataWrapper.h index 5ae2c043..8bb373e6 100644 --- a/src/fsfw/util/dataWrapper.h +++ b/src/fsfw/util/dataWrapper.h @@ -36,9 +36,8 @@ struct DataWrapper { } [[nodiscard]] bool isNull() const { - if (type == DataTypes::RAW and dataUnion.raw.data == nullptr or - (type == DataTypes::SERIALIZABLE and dataUnion.serializable == nullptr) or - (type == DataTypes::NONE)) { + if ((type == DataTypes::NONE) or (type == DataTypes::RAW and dataUnion.raw.data == nullptr) or + (type == DataTypes::SERIALIZABLE and dataUnion.serializable == nullptr)) { return true; } return false; From bdd79d060df5ddde24da71b3a7df83ffbf486be9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 30 Aug 2022 14:02:58 +0200 Subject: [PATCH 08/10] basic data wrapper unittests --- src/fsfw/util/dataWrapper.h | 5 ++-- unittests/util/CMakeLists.txt | 1 + unittests/util/testDataWrapper.cpp | 31 ++++++++++++++++++++++++ unittests/util/testUnsignedByteField.cpp | 2 +- 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 unittests/util/testDataWrapper.cpp diff --git a/src/fsfw/util/dataWrapper.h b/src/fsfw/util/dataWrapper.h index 8bb373e6..440f9501 100644 --- a/src/fsfw/util/dataWrapper.h +++ b/src/fsfw/util/dataWrapper.h @@ -10,6 +10,7 @@ namespace util { struct RawData { + RawData() = default; const uint8_t* data = nullptr; size_t len = 0; }; @@ -17,8 +18,8 @@ struct RawData { enum DataTypes { NONE, RAW, SERIALIZABLE }; union DataUnion { - RawData raw; - SerializeIF* serializable = nullptr; + RawData raw{}; + SerializeIF* serializable; }; struct DataWrapper { diff --git a/unittests/util/CMakeLists.txt b/unittests/util/CMakeLists.txt index d4caa4d5..dd9f6dc1 100644 --- a/unittests/util/CMakeLists.txt +++ b/unittests/util/CMakeLists.txt @@ -1,3 +1,4 @@ target_sources(${FSFW_TEST_TGT} PRIVATE testUnsignedByteField.cpp + testDataWrapper.cpp ) diff --git a/unittests/util/testDataWrapper.cpp b/unittests/util/testDataWrapper.cpp new file mode 100644 index 00000000..5a6b26d7 --- /dev/null +++ b/unittests/util/testDataWrapper.cpp @@ -0,0 +1,31 @@ +#include +#include + +#include "fsfw/util/dataWrapper.h" +#include "mocks/SimpleSerializable.h" + +TEST_CASE("Data Wrapper", "[util]") { + util::DataWrapper wrapper; + SECTION("State") { + REQUIRE(wrapper.isNull()); + } + + SECTION("Set Raw Data") { + REQUIRE(wrapper.isNull()); + std::array data = {1, 2, 3, 4}; + wrapper.setRawData({data.data(), data.size()}); + REQUIRE(not wrapper.isNull()); + REQUIRE(wrapper.type == util::DataTypes::RAW); + REQUIRE(wrapper.dataUnion.raw.data == data.data()); + REQUIRE(wrapper.dataUnion.raw.len == data.size()); + } + + SECTION("Simple Serializable") { + REQUIRE(wrapper.isNull()); + SimpleSerializable serializable; + wrapper.setSerializable(serializable); + REQUIRE(not wrapper.isNull()); + REQUIRE(wrapper.type == util::DataTypes::SERIALIZABLE); + REQUIRE(wrapper.dataUnion.serializable == &serializable); + } +} \ No newline at end of file diff --git a/unittests/util/testUnsignedByteField.cpp b/unittests/util/testUnsignedByteField.cpp index df1ff483..58a87a7d 100644 --- a/unittests/util/testUnsignedByteField.cpp +++ b/unittests/util/testUnsignedByteField.cpp @@ -4,7 +4,7 @@ #include "fsfw/util/UnsignedByteField.h" -TEST_CASE("Unsigned Byte Field", "[unsigned-byte-field]") { +TEST_CASE("Unsigned Byte Field", "[util]") { auto testByteField = UnsignedByteField(10); auto u32ByteField = U32ByteField(10); auto u16ByteField = U16ByteField(5); From 192255df1cc9b75559d9bd57d44f467bc49a3b83 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 30 Aug 2022 14:03:33 +0200 Subject: [PATCH 09/10] additional test --- unittests/util/testDataWrapper.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/unittests/util/testDataWrapper.cpp b/unittests/util/testDataWrapper.cpp index 5a6b26d7..14ba287a 100644 --- a/unittests/util/testDataWrapper.cpp +++ b/unittests/util/testDataWrapper.cpp @@ -8,6 +8,7 @@ TEST_CASE("Data Wrapper", "[util]") { util::DataWrapper wrapper; SECTION("State") { REQUIRE(wrapper.isNull()); + REQUIRE(wrapper.type == util::DataTypes::NONE); } SECTION("Set Raw Data") { From d675a789a29c18bf1fd57f5dbc89870da54db31b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 30 Aug 2022 14:41:37 +0200 Subject: [PATCH 10/10] update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c78318c..34053f16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). # [unreleased] +# [v6.0.0] + ## Changes - Removed `HasReturnvaluesIF` class in favor of `returnvalue` namespace with `OK` and `FAILED` @@ -16,6 +18,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## Added +- Add `util::DataWrapper` class inside the `util` module. This is a tagged union which allows + to specify raw data either as a classic C-style raw pointer and size or as a `SerializeIF` + pointer. + PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/668 - Add new `UnsignedByteField` class PR: https://egit.irs.uni-stuttgart.de/fsfw/fsfw/pulls/660