From fd11cae7be5bebcae0e4483a532f407e362f1a11 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 14 Jan 2021 19:32:18 +0100 Subject: [PATCH 01/19] printer: helper macros --- serviceinterface/ServiceInterfacePrinter.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/serviceinterface/ServiceInterfacePrinter.h b/serviceinterface/ServiceInterfacePrinter.h index fbdccdd1..e898adf6 100644 --- a/serviceinterface/ServiceInterfacePrinter.h +++ b/serviceinterface/ServiceInterfacePrinter.h @@ -2,6 +2,20 @@ #include #endif +//! https://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format +//! Can be used to print out binary numbers in human-readable format. +#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c" +#define BYTE_TO_BINARY(byte) \ + (byte & 0x80 ? '1' : '0'), \ + (byte & 0x40 ? '1' : '0'), \ + (byte & 0x20 ? '1' : '0'), \ + (byte & 0x10 ? '1' : '0'), \ + (byte & 0x08 ? '1' : '0'), \ + (byte & 0x04 ? '1' : '0'), \ + (byte & 0x02 ? '1' : '0'), \ + (byte & 0x01 ? '1' : '0') + + namespace sif { enum PrintLevel { From eb5548333ee365711f78372dd39c6bf48e10aff7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 14 Jan 2021 20:00:48 +0100 Subject: [PATCH 02/19] added missing include guards --- serviceinterface/ServiceInterfacePrinter.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/serviceinterface/ServiceInterfacePrinter.h b/serviceinterface/ServiceInterfacePrinter.h index e898adf6..6b062108 100644 --- a/serviceinterface/ServiceInterfacePrinter.h +++ b/serviceinterface/ServiceInterfacePrinter.h @@ -1,3 +1,6 @@ +#ifndef FSFW_SERVICEINTERFACE_SERVICEINTERFACEPRINTER +#define FSFW_SERVICEINTERFACE_SERVICEINTERFACEPRINTER + #if FSFW_DISABLE_PRINTOUT == 0 #include #endif @@ -52,3 +55,4 @@ void printError(const char* fmt, ...); } +#endif /* FSFW_SERVICEINTERFACE_SERVICEINTERFACEPRINTER */ From f69d6d49c75998d76d30bb51d3b783332283152c Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Fri, 15 Jan 2021 15:21:13 +0100 Subject: [PATCH 03/19] replaced zu with lu --- globalfunctions/arrayprinter.cpp | 3 ++- osal/linux/PosixThread.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/globalfunctions/arrayprinter.cpp b/globalfunctions/arrayprinter.cpp index 25d6fcf4..b50aeb21 100644 --- a/globalfunctions/arrayprinter.cpp +++ b/globalfunctions/arrayprinter.cpp @@ -10,7 +10,8 @@ void arrayprinter::print(const uint8_t *data, size_t size, OutputType type, } sif::info << "["; #else - sif::printInfo("Printing data with size %zu: [", size); + // TODO: Use %zu or %lu depending on whether C99 support is given. + sif::printInfo("Printing data with size %lu: [", static_cast(size)); #endif if(type == OutputType::HEX) { arrayprinter::printHex(data, size, maxCharPerLine); diff --git a/osal/linux/PosixThread.cpp b/osal/linux/PosixThread.cpp index 2499b442..bd8e7258 100644 --- a/osal/linux/PosixThread.cpp +++ b/osal/linux/PosixThread.cpp @@ -152,7 +152,7 @@ void PosixThread::createTask(void* (*fnc_)(void*), void* arg_) { " the requested " << stackMb << " MB" << std::endl; #else sif::printError("PosixThread::createTask: Insufficient memory for " - "the requested %zu MB\n", stackMb); + "the requested %lu MB\n", static_cast(stackMb)); #endif } else if(errno == EINVAL) { From 05508418a793df4d4c8e1116cf15fe7cbcef5d91 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Jan 2021 16:32:25 +0100 Subject: [PATCH 04/19] printf support for array printer --- globalfunctions/arrayprinter.cpp | 134 ++++++++++++++++++++----------- globalfunctions/arrayprinter.h | 12 ++- 2 files changed, 95 insertions(+), 51 deletions(-) diff --git a/globalfunctions/arrayprinter.cpp b/globalfunctions/arrayprinter.cpp index b50aeb21..6dc959d7 100644 --- a/globalfunctions/arrayprinter.cpp +++ b/globalfunctions/arrayprinter.cpp @@ -3,64 +3,101 @@ #include void arrayprinter::print(const uint8_t *data, size_t size, OutputType type, - bool printInfo, size_t maxCharPerLine) { + bool printInfo, size_t maxCharPerLine) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - if(printInfo) { - sif::info << "Printing data with size " << size << ": "; - } - sif::info << "["; + if(printInfo) { + sif::info << "Printing data with size " << size << ": "; + } + sif::info << "["; #else - // TODO: Use %zu or %lu depending on whether C99 support is given. - sif::printInfo("Printing data with size %lu: [", static_cast(size)); -#endif - if(type == OutputType::HEX) { - arrayprinter::printHex(data, size, maxCharPerLine); - } - else if (type == OutputType::DEC) { - arrayprinter::printDec(data, size, maxCharPerLine); - } - else if(type == OutputType::BIN) { - arrayprinter::printBin(data, size); - } +#if FSFW_NO_C99_IO == 1 + sif::printInfo("Printing data with size %lu: [", static_cast(size)); +#else + sif::printInfo("Printing data with size %zu: [", size); +#endif /* FSFW_NO_C99_IO == 1 */ +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ + if(type == OutputType::HEX) { + arrayprinter::printHex(data, size, maxCharPerLine); + } + else if (type == OutputType::DEC) { + arrayprinter::printDec(data, size, maxCharPerLine); + } + else if(type == OutputType::BIN) { + arrayprinter::printBin(data, size); + } } void arrayprinter::printHex(const uint8_t *data, size_t size, - size_t maxCharPerLine) { + size_t maxCharPerLine) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::info << std::hex; - for(size_t i = 0; i < size; i++) { - sif::info << "0x" << static_cast(data[i]); - if(i < size - 1){ - sif::info << " , "; - if(i > 0 and i % maxCharPerLine == 0) { - sif::info << std::endl; + sif::info << std::hex; + for(size_t i = 0; i < size; i++) { + sif::info << "0x" << static_cast(data[i]); + if(i < size - 1) { + sif::info << " , "; + if(i > 0 and i % maxCharPerLine == 0) { + sif::info << std::endl; - } - } - } - sif::info << std::dec; - sif::info << "]" << std::endl; + } + } + } + sif::info << std::dec; + sif::info << "]" << std::endl; #else - // how much memory to reserve for printout? + // General format: 0x01, 0x02, 0x03 so it is number of chars times 6 + // plus line break plus small safety margin. + char printBuffer[(size + 1) * 7 + 1]; + size_t currentPos = 0; + for(size_t i = 0; i < size; i++) { + // To avoid buffer overflows. + if(sizeof(printBuffer) - currentPos <= 7) { + break; + } + + currentPos += snprintf(printBuffer + currentPos, 6, "0x%02x", data[i]); + if(i < size - 1) { + currentPos += sprintf(printBuffer + currentPos, ", "); + if(i > 0 and i % maxCharPerLine == 0) { + currentPos += sprintf(printBuffer + currentPos, "\n"); + } + } + } #endif } void arrayprinter::printDec(const uint8_t *data, size_t size, - size_t maxCharPerLine) { + size_t maxCharPerLine) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::info << std::dec; - for(size_t i = 0; i < size; i++) { - sif::info << static_cast(data[i]); - if(i < size - 1){ - sif::info << " , "; - if(i > 0 and i % maxCharPerLine == 0) { - sif::info << std::endl; - } - } - } - sif::info << "]" << std::endl; + sif::info << std::dec; + for(size_t i = 0; i < size; i++) { + sif::info << static_cast(data[i]); + if(i < size - 1){ + sif::info << " , "; + if(i > 0 and i % maxCharPerLine == 0) { + sif::info << std::endl; + } + } + } + sif::info << "]" << std::endl; #else - // how much memory to reserve for printout? + // General format: 32, 243, -12 so it is number of chars times 5 + // plus line break plus small safety margin. + char printBuffer[(size + 1) * 5 + 1]; + size_t currentPos = 0; + for(size_t i = 0; i < size; i++) { + // To avoid buffer overflows. + if(sizeof(printBuffer) - currentPos <= 5) { + break; + } + + currentPos += snprintf(printBuffer + currentPos, 3, "%d", data[i]); + if(i < size - 1) { + currentPos += sprintf(printBuffer + currentPos, ", "); + if(i > 0 and i % maxCharPerLine == 0) { + currentPos += sprintf(printBuffer + currentPos, "\n"); + } + } + } #endif } @@ -68,11 +105,14 @@ void arrayprinter::printBin(const uint8_t *data, size_t size) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::info << "\n" << std::flush; for(size_t i = 0; i < size; i++) { - sif::info << "Byte " << i + 1 << ": 0b"<< - std::bitset<8>(data[i]) << ",\n" << std::flush; + sif::info << "Byte " << i + 1 << ": 0b" << std::bitset<8>(data[i]) << "," << std::endl; } sif::info << "]" << std::endl; #else - // how much memory to reserve for printout? + sif::printInfo("\n"); + for(size_t i = 0; i < size; i++) { + sif::printInfo("Byte %d: 0b" BYTE_TO_BINARY_PATTERN ",\n", BYTE_TO_BINARY(data[i])); + } + sif::printInfo("]\n"); #endif } diff --git a/globalfunctions/arrayprinter.h b/globalfunctions/arrayprinter.h index e57d8e04..6dfa6ecd 100644 --- a/globalfunctions/arrayprinter.h +++ b/globalfunctions/arrayprinter.h @@ -1,20 +1,24 @@ #ifndef FRAMEWORK_GLOBALFUNCTIONS_ARRAYPRINTER_H_ #define FRAMEWORK_GLOBALFUNCTIONS_ARRAYPRINTER_H_ + #include #include enum class OutputType { - DEC, - HEX, - BIN + DEC, + HEX, + BIN }; +//! TODO: Write unit tests for this module. namespace arrayprinter { + void print(const uint8_t* data, size_t size, OutputType type = OutputType::HEX, - bool printInfo = true, size_t maxCharPerLine = 12); + bool printInfo = true, size_t maxCharPerLine = 12); void printHex(const uint8_t* data, size_t size, size_t maxCharPerLine = 12); void printDec(const uint8_t* data, size_t size, size_t maxCharPerLine = 12); void printBin(const uint8_t* data, size_t size); + } #endif /* FRAMEWORK_GLOBALFUNCTIONS_ARRAYPRINTER_H_ */ From baba8fa5d796acc11d3a67f1f57ce427147a3fe2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Jan 2021 16:34:05 +0100 Subject: [PATCH 05/19] added array printer test stubs --- unittest/tests/globalfunctions/CMakeLists.txt | 3 +++ unittest/tests/globalfunctions/TestArrayPrinter.cpp | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 unittest/tests/globalfunctions/CMakeLists.txt create mode 100644 unittest/tests/globalfunctions/TestArrayPrinter.cpp diff --git a/unittest/tests/globalfunctions/CMakeLists.txt b/unittest/tests/globalfunctions/CMakeLists.txt new file mode 100644 index 00000000..4ea49bf7 --- /dev/null +++ b/unittest/tests/globalfunctions/CMakeLists.txt @@ -0,0 +1,3 @@ +target_sources(${TARGET_NAME} PRIVATE + TestArrayPrinter.cpp +) diff --git a/unittest/tests/globalfunctions/TestArrayPrinter.cpp b/unittest/tests/globalfunctions/TestArrayPrinter.cpp new file mode 100644 index 00000000..59143619 --- /dev/null +++ b/unittest/tests/globalfunctions/TestArrayPrinter.cpp @@ -0,0 +1,5 @@ +#include + + + + From 73b9d058e5a9fb2b897b0a6e59cb2e51feb7dbb5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Jan 2021 16:56:36 +0100 Subject: [PATCH 06/19] updated internal unit test --- unittest/internal/InternalUnitTester.cpp | 15 ++++++++++++++- unittest/internal/InternalUnitTester.h | 2 +- .../internal/globalfunctions/TestArrayPrinter.cpp | 4 ++++ .../internal/globalfunctions/TestArrayPrinter.h | 12 ++++++++++++ .../tests/globalfunctions/TestArrayPrinter.cpp | 5 ----- 5 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 unittest/internal/globalfunctions/TestArrayPrinter.cpp create mode 100644 unittest/internal/globalfunctions/TestArrayPrinter.h delete mode 100644 unittest/tests/globalfunctions/TestArrayPrinter.cpp diff --git a/unittest/internal/InternalUnitTester.cpp b/unittest/internal/InternalUnitTester.cpp index bd41969c..199a3cf0 100644 --- a/unittest/internal/InternalUnitTester.cpp +++ b/unittest/internal/InternalUnitTester.cpp @@ -5,24 +5,37 @@ #include "osal/IntTestSemaphore.h" #include "osal/IntTestMutex.h" #include "serialize/IntTestSerialization.h" +#include "globalfunctions/TestArrayPrinter.h" #include +struct TestConfig { + bool testArrayPrinter; +}; InternalUnitTester::InternalUnitTester() {} InternalUnitTester::~InternalUnitTester() {} -ReturnValue_t InternalUnitTester::performTests() { +ReturnValue_t InternalUnitTester::performTests(struct TestConfig testConfig) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::info << "Running internal unit tests.." << std::endl; +#else + sif::printInfo("Running internal unit tests..\n"); #endif + testserialize::test_serialization(); testmq::testMq(); testsemaph::testBinSemaph(); testsemaph::testCountingSemaph(); testmutex::testMutex(); + if(testConfig.testArrayPrinter) { + arrayprinter::testArrayPrinter(); + } + #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::info << "Internal unit tests finished." << std::endl; +#else + sif::printInfo("Running internal unit tests..\n"); #endif return RETURN_OK; } diff --git a/unittest/internal/InternalUnitTester.h b/unittest/internal/InternalUnitTester.h index d0b1c106..e67777b9 100644 --- a/unittest/internal/InternalUnitTester.h +++ b/unittest/internal/InternalUnitTester.h @@ -22,7 +22,7 @@ public: * Some function which calls all other tests * @return */ - virtual ReturnValue_t performTests(); + virtual ReturnValue_t performTests(struct TestConfig testConfig); }; diff --git a/unittest/internal/globalfunctions/TestArrayPrinter.cpp b/unittest/internal/globalfunctions/TestArrayPrinter.cpp new file mode 100644 index 00000000..078134e1 --- /dev/null +++ b/unittest/internal/globalfunctions/TestArrayPrinter.cpp @@ -0,0 +1,4 @@ +#include "TestArrayPrinter.cpp" + +void arrayprinter::testArrayPrinter() { +} diff --git a/unittest/internal/globalfunctions/TestArrayPrinter.h b/unittest/internal/globalfunctions/TestArrayPrinter.h new file mode 100644 index 00000000..b77f1897 --- /dev/null +++ b/unittest/internal/globalfunctions/TestArrayPrinter.h @@ -0,0 +1,12 @@ +#ifndef FSFW_UNITTEST_INTERNAL_GLOBALFUNCTIONS_TESTARRAYPRINTER_H_ +#define FSFW_UNITTEST_INTERNAL_GLOBALFUNCTIONS_TESTARRAYPRINTER_H_ + +namespace arrayprinter { + +void testArrayPrinter(); + +} + + + +#endif /* FSFW_UNITTEST_INTERNAL_GLOBALFUNCTIONS_TESTARRAYPRINTER_H_ */ diff --git a/unittest/tests/globalfunctions/TestArrayPrinter.cpp b/unittest/tests/globalfunctions/TestArrayPrinter.cpp deleted file mode 100644 index 59143619..00000000 --- a/unittest/tests/globalfunctions/TestArrayPrinter.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include - - - - From 79cf009049675f07e695fe4627b021b5912902e3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Jan 2021 17:06:05 +0100 Subject: [PATCH 07/19] updated internal unit tester --- unittest/internal/CMakeLists.txt | 3 ++- unittest/internal/InternalUnitTester.cpp | 5 +---- unittest/internal/InternalUnitTester.h | 7 ++++++- unittest/internal/globalfunctions/CMakeLists.txt | 3 +++ unittest/internal/globalfunctions/TestArrayPrinter.cpp | 2 +- unittest/internal/internal.mk | 1 + 6 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 unittest/internal/globalfunctions/CMakeLists.txt diff --git a/unittest/internal/CMakeLists.txt b/unittest/internal/CMakeLists.txt index 9c24317f..11fd2b2f 100644 --- a/unittest/internal/CMakeLists.txt +++ b/unittest/internal/CMakeLists.txt @@ -4,4 +4,5 @@ target_sources(${TARGET_NAME} PRIVATE ) add_subdirectory(osal) -add_subdirectory(serialize) \ No newline at end of file +add_subdirectory(serialize) +add_subdirectory(globalfunctions) \ No newline at end of file diff --git a/unittest/internal/InternalUnitTester.cpp b/unittest/internal/InternalUnitTester.cpp index 199a3cf0..f89d093a 100644 --- a/unittest/internal/InternalUnitTester.cpp +++ b/unittest/internal/InternalUnitTester.cpp @@ -9,14 +9,11 @@ #include -struct TestConfig { - bool testArrayPrinter; -}; InternalUnitTester::InternalUnitTester() {} InternalUnitTester::~InternalUnitTester() {} -ReturnValue_t InternalUnitTester::performTests(struct TestConfig testConfig) { +ReturnValue_t InternalUnitTester::performTests(struct InternalUnitTester::TestConfig& testConfig) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::info << "Running internal unit tests.." << std::endl; #else diff --git a/unittest/internal/InternalUnitTester.h b/unittest/internal/InternalUnitTester.h index e67777b9..ae954c6a 100644 --- a/unittest/internal/InternalUnitTester.h +++ b/unittest/internal/InternalUnitTester.h @@ -4,6 +4,7 @@ #include "UnittDefinitions.h" #include "../../returnvalues/HasReturnvaluesIF.h" + /** * @brief Can be used for internal testing, for example for hardware specific * tests which can not be run on a host-machine. @@ -15,6 +16,10 @@ */ class InternalUnitTester: public HasReturnvaluesIF { public: + struct TestConfig { + bool testArrayPrinter; + }; + InternalUnitTester(); virtual~ InternalUnitTester(); @@ -22,7 +27,7 @@ public: * Some function which calls all other tests * @return */ - virtual ReturnValue_t performTests(struct TestConfig testConfig); + virtual ReturnValue_t performTests(struct InternalUnitTester::TestConfig& testConfig); }; diff --git a/unittest/internal/globalfunctions/CMakeLists.txt b/unittest/internal/globalfunctions/CMakeLists.txt new file mode 100644 index 00000000..4ea49bf7 --- /dev/null +++ b/unittest/internal/globalfunctions/CMakeLists.txt @@ -0,0 +1,3 @@ +target_sources(${TARGET_NAME} PRIVATE + TestArrayPrinter.cpp +) diff --git a/unittest/internal/globalfunctions/TestArrayPrinter.cpp b/unittest/internal/globalfunctions/TestArrayPrinter.cpp index 078134e1..c26faa85 100644 --- a/unittest/internal/globalfunctions/TestArrayPrinter.cpp +++ b/unittest/internal/globalfunctions/TestArrayPrinter.cpp @@ -1,4 +1,4 @@ -#include "TestArrayPrinter.cpp" +#include "TestArrayPrinter.h" void arrayprinter::testArrayPrinter() { } diff --git a/unittest/internal/internal.mk b/unittest/internal/internal.mk index 799fd796..1d4c9c99 100644 --- a/unittest/internal/internal.mk +++ b/unittest/internal/internal.mk @@ -1,3 +1,4 @@ CXXSRC += $(wildcard $(CURRENTPATH)/osal/*.cpp) CXXSRC += $(wildcard $(CURRENTPATH)/serialize/*.cpp) +CXXSRC += $(wildcard $(CURRENTPATH)/globalfunctions/*.cpp) CXXSRC += $(wildcard $(CURRENTPATH)/*.cpp) \ No newline at end of file From eae3175976c55ada568cc6785f10ace3eb27a9ad Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Jan 2021 17:25:27 +0100 Subject: [PATCH 08/19] repaired internal unit test --- unittest/CMakeLists.txt | 5 ++++- unittest/internal/UnittDefinitions.cpp | 2 +- unittest/internal/osal/IntTestMutex.cpp | 15 ++++++++++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 119ef243..24f8ef6f 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -1,2 +1,5 @@ add_subdirectory(internal) -add_subdirectory(tests) \ No newline at end of file + +if(LINK_CATCH2) + add_subdirectory(tests) +endif() \ No newline at end of file diff --git a/unittest/internal/UnittDefinitions.cpp b/unittest/internal/UnittDefinitions.cpp index 517f561a..ed4b59c1 100644 --- a/unittest/internal/UnittDefinitions.cpp +++ b/unittest/internal/UnittDefinitions.cpp @@ -5,7 +5,7 @@ sif::error << "Unit Tester error: Failed at test ID " << errorId << std::endl; #else - sif::printError("Unit Tester error: Failed at test ID 0x%08x", errorId); + sif::printError("Unit Tester error: Failed at test ID %s\n", errorId.c_str()); #endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ return HasReturnvaluesIF::RETURN_FAILED; } diff --git a/unittest/internal/osal/IntTestMutex.cpp b/unittest/internal/osal/IntTestMutex.cpp index 2a1584b8..13d87a8b 100644 --- a/unittest/internal/osal/IntTestMutex.cpp +++ b/unittest/internal/osal/IntTestMutex.cpp @@ -3,8 +3,8 @@ #include #include -#if defined(hosted) -#include +#if defined(WIN32) || defined(UNIX) +#include #include #include #endif @@ -19,10 +19,11 @@ void testmutex::testMutex() { } // timed_mutex from the C++ library specifies undefined behaviour if // the timed mutex is locked twice from the same thread. -#if defined(hosted) + // TODO: we should pass a define like FSFW_OSAL_HOST to the build. +#if defined(WIN32) || defined(UNIX) // This calls the function from // another thread and stores the returnvalue in a future. - auto future = std::async(&MutexIF::lockMutex, mutex, 1); + auto future = std::async(&MutexIF::lockMutex, mutex, MutexIF::TimeoutType::WAITING, 1); result = future.get(); #else result = mutex->lockMutex(MutexIF::TimeoutType::WAITING, 1); @@ -35,8 +36,12 @@ void testmutex::testMutex() { if(result != HasReturnvaluesIF::RETURN_OK) { unitt::put_error(id); } - result = mutex->unlockMutex(); + + // TODO: we should pass a define like FSFW_OSAL_HOST to the build. +#if !defined(WIN32) && !defined(UNIX) + result = mutex->unlockMutex(); if(result != MutexIF::CURR_THREAD_DOES_NOT_OWN_MUTEX) { unitt::put_error(id); } +#endif } From 38dd2308879d37ca666b308cda743e2c9079c464 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Jan 2021 17:28:31 +0100 Subject: [PATCH 09/19] fixed syntax error --- unittest/internal/globalfunctions/TestArrayPrinter.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/unittest/internal/globalfunctions/TestArrayPrinter.h b/unittest/internal/globalfunctions/TestArrayPrinter.h index b77f1897..714c3aed 100644 --- a/unittest/internal/globalfunctions/TestArrayPrinter.h +++ b/unittest/internal/globalfunctions/TestArrayPrinter.h @@ -7,6 +7,4 @@ void testArrayPrinter(); } - - #endif /* FSFW_UNITTEST_INTERNAL_GLOBALFUNCTIONS_TESTARRAYPRINTER_H_ */ From a9135696a58b8ec783ffa46770c4869541d21846 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Jan 2021 18:07:32 +0100 Subject: [PATCH 10/19] array printer tests complete --- globalfunctions/arrayprinter.cpp | 57 +++++++++++-------- globalfunctions/arrayprinter.h | 9 +-- serviceinterface/ServiceInterfaceBuffer.cpp | 4 +- serviceinterface/ServiceInterfaceBuffer.h | 2 + serviceinterface/ServiceInterfaceStream.cpp | 4 ++ serviceinterface/ServiceInterfaceStream.h | 2 + unittest/internal/InternalUnitTester.cpp | 2 +- .../globalfunctions/TestArrayPrinter.cpp | 25 ++++++++ .../globalfunctions/TestArrayPrinter.h | 3 + 9 files changed, 77 insertions(+), 31 deletions(-) diff --git a/globalfunctions/arrayprinter.cpp b/globalfunctions/arrayprinter.cpp index 6dc959d7..7dc056b0 100644 --- a/globalfunctions/arrayprinter.cpp +++ b/globalfunctions/arrayprinter.cpp @@ -2,20 +2,21 @@ #include "../serviceinterface/ServiceInterface.h" #include + void arrayprinter::print(const uint8_t *data, size_t size, OutputType type, bool printInfo, size_t maxCharPerLine) { #if FSFW_CPP_OSTREAM_ENABLED == 1 if(printInfo) { - sif::info << "Printing data with size " << size << ": "; + sif::info << "Printing data with size " << size << ": " << std::endl; } - sif::info << "["; #else #if FSFW_NO_C99_IO == 1 - sif::printInfo("Printing data with size %lu: [", static_cast(size)); + sif::printInfo("Printing data with size %lu: \n", static_cast(size)); #else - sif::printInfo("Printing data with size %zu: [", size); + sif::printInfo("Printing data with size %zu: \n", size); #endif /* FSFW_NO_C99_IO == 1 */ #endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ + if(type == OutputType::HEX) { arrayprinter::printHex(data, size, maxCharPerLine); } @@ -30,19 +31,23 @@ void arrayprinter::print(const uint8_t *data, size_t size, OutputType type, void arrayprinter::printHex(const uint8_t *data, size_t size, size_t maxCharPerLine) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::info << std::hex; + if(sif::info.crAdditionEnabled()) { + std::cout << "\r" << std::endl; + } + + std::cout << "[" << std::hex; for(size_t i = 0; i < size; i++) { - sif::info << "0x" << static_cast(data[i]); + std::cout << "0x" << static_cast(data[i]); if(i < size - 1) { - sif::info << " , "; - if(i > 0 and i % maxCharPerLine == 0) { - sif::info << std::endl; + std::cout << " , "; + if(i > 0 and (i + 1) % maxCharPerLine == 0) { + std::cout << std::endl; } } } - sif::info << std::dec; - sif::info << "]" << std::endl; + std::cout << std::dec; + std::cout << "]" << std::endl; #else // General format: 0x01, 0x02, 0x03 so it is number of chars times 6 // plus line break plus small safety margin. @@ -57,28 +62,33 @@ void arrayprinter::printHex(const uint8_t *data, size_t size, currentPos += snprintf(printBuffer + currentPos, 6, "0x%02x", data[i]); if(i < size - 1) { currentPos += sprintf(printBuffer + currentPos, ", "); - if(i > 0 and i % maxCharPerLine == 0) { + if(i > 0 and (i + 1) % maxCharPerLine == 0) { currentPos += sprintf(printBuffer + currentPos, "\n"); } } } + printf("[%s]\n", printBuffer); #endif } void arrayprinter::printDec(const uint8_t *data, size_t size, size_t maxCharPerLine) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::info << std::dec; + if(sif::info.crAdditionEnabled()) { + std::cout << "\r" << std::endl; + } + + std::cout << "[" << std::dec; for(size_t i = 0; i < size; i++) { - sif::info << static_cast(data[i]); + std::cout << static_cast(data[i]); if(i < size - 1){ - sif::info << " , "; - if(i > 0 and i % maxCharPerLine == 0) { - sif::info << std::endl; + std::cout << " , "; + if(i > 0 and (i + 1) % maxCharPerLine == 0) { + std::cout << std::endl; } } } - sif::info << "]" << std::endl; + std::cout << "]" << std::endl; #else // General format: 32, 243, -12 so it is number of chars times 5 // plus line break plus small safety margin. @@ -93,26 +103,23 @@ void arrayprinter::printDec(const uint8_t *data, size_t size, currentPos += snprintf(printBuffer + currentPos, 3, "%d", data[i]); if(i < size - 1) { currentPos += sprintf(printBuffer + currentPos, ", "); - if(i > 0 and i % maxCharPerLine == 0) { + if(i > 0 and (i + 1) % maxCharPerLine == 0) { currentPos += sprintf(printBuffer + currentPos, "\n"); } } } + printf("[%s]\n", printBuffer); #endif } void arrayprinter::printBin(const uint8_t *data, size_t size) { #if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::info << "\n" << std::flush; for(size_t i = 0; i < size; i++) { - sif::info << "Byte " << i + 1 << ": 0b" << std::bitset<8>(data[i]) << "," << std::endl; + sif::info << "Byte " << i + 1 << ": 0b" << std::bitset<8>(data[i]) << std::endl; } - sif::info << "]" << std::endl; #else - sif::printInfo("\n"); for(size_t i = 0; i < size; i++) { - sif::printInfo("Byte %d: 0b" BYTE_TO_BINARY_PATTERN ",\n", BYTE_TO_BINARY(data[i])); + sif::printInfo("Byte %d: 0b" BYTE_TO_BINARY_PATTERN "\n", i + 1, BYTE_TO_BINARY(data[i])); } - sif::printInfo("]\n"); #endif } diff --git a/globalfunctions/arrayprinter.h b/globalfunctions/arrayprinter.h index 6dfa6ecd..e6b3ea6b 100644 --- a/globalfunctions/arrayprinter.h +++ b/globalfunctions/arrayprinter.h @@ -10,13 +10,14 @@ enum class OutputType { BIN }; -//! TODO: Write unit tests for this module. namespace arrayprinter { + + void print(const uint8_t* data, size_t size, OutputType type = OutputType::HEX, - bool printInfo = true, size_t maxCharPerLine = 12); -void printHex(const uint8_t* data, size_t size, size_t maxCharPerLine = 12); -void printDec(const uint8_t* data, size_t size, size_t maxCharPerLine = 12); + bool printInfo = true, size_t maxCharPerLine = 10); +void printHex(const uint8_t* data, size_t size, size_t maxCharPerLine = 10); +void printDec(const uint8_t* data, size_t size, size_t maxCharPerLine = 10); void printBin(const uint8_t* data, size_t size); } diff --git a/serviceinterface/ServiceInterfaceBuffer.cpp b/serviceinterface/ServiceInterfaceBuffer.cpp index 1a02d6e9..3f624564 100644 --- a/serviceinterface/ServiceInterfaceBuffer.cpp +++ b/serviceinterface/ServiceInterfaceBuffer.cpp @@ -167,7 +167,9 @@ std::string* ServiceInterfaceBuffer::getPreamble(size_t * preambleSize) { return &preamble; } - +bool ServiceInterfaceBuffer::crAdditionEnabled() const { + return addCrToPreamble; +} #ifdef UT699 #include "../osal/rtems/Interrupt.h" diff --git a/serviceinterface/ServiceInterfaceBuffer.h b/serviceinterface/ServiceInterfaceBuffer.h index b1a50848..9d3ce069 100644 --- a/serviceinterface/ServiceInterfaceBuffer.h +++ b/serviceinterface/ServiceInterfaceBuffer.h @@ -70,6 +70,8 @@ private: void putChars(char const* begin, char const* end); std::string* getPreamble(size_t * preambleSize = nullptr); + + bool crAdditionEnabled() const; }; #endif diff --git a/serviceinterface/ServiceInterfaceStream.cpp b/serviceinterface/ServiceInterfaceStream.cpp index 59526536..ad14cd04 100644 --- a/serviceinterface/ServiceInterfaceStream.cpp +++ b/serviceinterface/ServiceInterfaceStream.cpp @@ -15,5 +15,9 @@ std::string* ServiceInterfaceStream::getPreamble() { return streambuf.getPreamble(); } +bool ServiceInterfaceStream::crAdditionEnabled() const { + return streambuf.crAdditionEnabled(); +} + #endif diff --git a/serviceinterface/ServiceInterfaceStream.h b/serviceinterface/ServiceInterfaceStream.h index f3cb2cd0..e3c0ea7a 100644 --- a/serviceinterface/ServiceInterfaceStream.h +++ b/serviceinterface/ServiceInterfaceStream.h @@ -39,6 +39,8 @@ public: */ std::string* getPreamble(); + bool crAdditionEnabled() const; + protected: ServiceInterfaceBuffer streambuf; }; diff --git a/unittest/internal/InternalUnitTester.cpp b/unittest/internal/InternalUnitTester.cpp index f89d093a..a9394ad3 100644 --- a/unittest/internal/InternalUnitTester.cpp +++ b/unittest/internal/InternalUnitTester.cpp @@ -32,7 +32,7 @@ ReturnValue_t InternalUnitTester::performTests(struct InternalUnitTester::TestCo #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::info << "Internal unit tests finished." << std::endl; #else - sif::printInfo("Running internal unit tests..\n"); + sif::printInfo("Internal unit tests finished.\n"); #endif return RETURN_OK; } diff --git a/unittest/internal/globalfunctions/TestArrayPrinter.cpp b/unittest/internal/globalfunctions/TestArrayPrinter.cpp index c26faa85..de016d19 100644 --- a/unittest/internal/globalfunctions/TestArrayPrinter.cpp +++ b/unittest/internal/globalfunctions/TestArrayPrinter.cpp @@ -1,4 +1,29 @@ #include "TestArrayPrinter.h" void arrayprinter::testArrayPrinter() { + { + const std::array testDataSmall = {0x01, 0x02, 0x03, 0x04, 0x05}; + arrayprinter::print(testDataSmall.data(), testDataSmall.size()); + arrayprinter::print(testDataSmall.data(), testDataSmall.size(), OutputType::DEC); + arrayprinter::print(testDataSmall.data(), testDataSmall.size(), OutputType::BIN); + } + + { + std::array testDataMed; + for(size_t idx = 0; idx < testDataMed.size(); idx ++) { + testDataMed[idx] = testDataMed.size() - idx; + } + arrayprinter::print(testDataMed.data(), testDataMed.size()); + arrayprinter::print(testDataMed.data(), testDataMed.size(), OutputType::DEC, 8); + } + + { + std::array testDataLarge; + for(size_t idx = 0; idx < testDataLarge.size(); idx ++) { + testDataLarge[idx] = idx; + } + arrayprinter::print(testDataLarge.data(), testDataLarge.size()); + arrayprinter::print(testDataLarge.data(), testDataLarge.size(), OutputType::DEC); + } + } diff --git a/unittest/internal/globalfunctions/TestArrayPrinter.h b/unittest/internal/globalfunctions/TestArrayPrinter.h index 714c3aed..50b82ca0 100644 --- a/unittest/internal/globalfunctions/TestArrayPrinter.h +++ b/unittest/internal/globalfunctions/TestArrayPrinter.h @@ -1,6 +1,9 @@ #ifndef FSFW_UNITTEST_INTERNAL_GLOBALFUNCTIONS_TESTARRAYPRINTER_H_ #define FSFW_UNITTEST_INTERNAL_GLOBALFUNCTIONS_TESTARRAYPRINTER_H_ +#include +#include + namespace arrayprinter { void testArrayPrinter(); From 0514ab4d050628773b7279cccf5880593bb3ee3c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 15 Jan 2021 18:15:52 +0100 Subject: [PATCH 11/19] doc --- serviceinterface/ServiceInterfaceStream.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/serviceinterface/ServiceInterfaceStream.h b/serviceinterface/ServiceInterfaceStream.h index e3c0ea7a..0ea44f0b 100644 --- a/serviceinterface/ServiceInterfaceStream.h +++ b/serviceinterface/ServiceInterfaceStream.h @@ -39,6 +39,11 @@ public: */ std::string* getPreamble(); + /** + * Can be used to determine if the stream was configured to add CR characters in addition + * to newline characters. + * @return + */ bool crAdditionEnabled() const; protected: From aa7ea35b80e86c3d5e7d8b2bb0f374b55480d351 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 16 Jan 2021 14:24:59 +0100 Subject: [PATCH 12/19] cyan instead of magenta for debug now --- serviceinterface/ServiceInterfaceBuffer.cpp | 2 +- serviceinterface/ServiceInterfacePrinter.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/serviceinterface/ServiceInterfaceBuffer.cpp b/serviceinterface/ServiceInterfaceBuffer.cpp index 3f624564..ccc051c3 100644 --- a/serviceinterface/ServiceInterfaceBuffer.cpp +++ b/serviceinterface/ServiceInterfaceBuffer.cpp @@ -29,7 +29,7 @@ ServiceInterfaceBuffer::ServiceInterfaceBuffer(std::string setMessage, #if FSFW_COLORED_OUTPUT == 1 if(setMessage.find("DEBUG") != std::string::npos) { - colorPrefix = sif::ANSI_COLOR_MAGENTA; + colorPrefix = sif::ANSI_COLOR_CYAN; } else if(setMessage.find("INFO") != std::string::npos) { colorPrefix = sif::ANSI_COLOR_GREEN; diff --git a/serviceinterface/ServiceInterfacePrinter.cpp b/serviceinterface/ServiceInterfacePrinter.cpp index a12f49e3..ce797f1c 100644 --- a/serviceinterface/ServiceInterfacePrinter.cpp +++ b/serviceinterface/ServiceInterfacePrinter.cpp @@ -45,7 +45,7 @@ void fsfwPrint(sif::PrintLevel printType, const char* fmt, va_list arg) { len += sprintf(bufferPosition, sif::ANSI_COLOR_GREEN); } else if(printType == sif::PrintLevel::DEBUG_LEVEL) { - len += sprintf(bufferPosition, sif::ANSI_COLOR_MAGENTA); + len += sprintf(bufferPosition, sif::ANSI_COLOR_CYAN); } else if(printType == sif::PrintLevel::WARNING_LEVEL) { len += sprintf(bufferPosition, sif::ANSI_COLOR_YELLOW); From 2c21400aed50fab873a4ca75be24777bfef00bc7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 18 Jan 2021 19:43:44 +0100 Subject: [PATCH 13/19] important bugfix --- action/ActionMessage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/action/ActionMessage.cpp b/action/ActionMessage.cpp index b0bcabaa..4e56feea 100644 --- a/action/ActionMessage.cpp +++ b/action/ActionMessage.cpp @@ -1,3 +1,4 @@ +#include #include "ActionMessage.h" #include "../objectmanager/ObjectManagerIF.h" #include "../storagemanager/StorageManagerIF.h" @@ -53,7 +54,7 @@ void ActionMessage::setDataReply(CommandMessage* message, ActionId_t actionId, void ActionMessage::setCompletionReply(CommandMessage* message, ActionId_t fid, ReturnValue_t result) { - if (result == HasReturnvaluesIF::RETURN_OK) { + if (result == HasReturnvaluesIF::RETURN_OK or result == HasActionsIF::EXECUTION_FINISHED) { message->setCommand(COMPLETION_SUCCESS); } else { message->setCommand(COMPLETION_FAILED); From 74def820c6ee13c81c08fa799785d75a14f88baa Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 18 Jan 2021 20:03:03 +0100 Subject: [PATCH 14/19] improved naming convention --- storagemanager/LocalPool.cpp | 12 ++++++++---- storagemanager/LocalPool.h | 27 +++++++++++++++++---------- storagemanager/StorageManagerIF.h | 10 ++++++++-- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/storagemanager/LocalPool.cpp b/storagemanager/LocalPool.cpp index cc7c9266..b72f21ca 100644 --- a/storagemanager/LocalPool.cpp +++ b/storagemanager/LocalPool.cpp @@ -348,16 +348,20 @@ void LocalPool::getFillCount(uint8_t *buffer, uint8_t *bytesWritten) { } -void LocalPool::clearPage(max_pools_t pageIndex) { - if(pageIndex >= NUMBER_OF_POOLS) { +void LocalPool::clearPool(max_pools_t poolIndex) { + if(poolIndex >= NUMBER_OF_POOLS) { return; } // Mark the storage as free - for(auto& size: sizeLists[pageIndex]) { + for(auto& size: sizeLists[poolIndex]) { size = STORAGE_FREE; } // Set all the page content to 0. - std::memset(store[pageIndex].data(), 0, elementSizes[pageIndex]); + std::memset(store[poolIndex].data(), 0, elementSizes[poolIndex]); +} + +LocalPool::max_pools_t LocalPool::getNumberOfPools() const { + return NUMBER_OF_POOLS; } diff --git a/storagemanager/LocalPool.h b/storagemanager/LocalPool.h index db771152..4d3994bb 100644 --- a/storagemanager/LocalPool.h +++ b/storagemanager/LocalPool.h @@ -60,15 +60,6 @@ public: }; using LocalPoolConfig = std::multiset; - /** - * @brief This definition generally sets the number of - * different sized pools. It is derived from the number of pairs - * inside the LocalPoolConfig set on object creation. - * @details - * This must be less than the maximum number of pools (currently 0xff). - */ - const max_pools_t NUMBER_OF_POOLS; - /** * @brief This is the default constructor for a pool manager instance. * @details @@ -143,9 +134,15 @@ public: void getFillCount(uint8_t* buffer, uint8_t* bytesWritten) override; void clearStore() override; - void clearPage(max_pools_t pageIndex) override; + void clearPool(max_pools_t poolIndex) override; ReturnValue_t initialize() override; + + /** + * Get number pools. Each pool has pages with a specific bucket size. + * @return + */ + max_pools_t getNumberOfPools() const override; protected: /** * With this helper method, a free element of @c size is reserved. @@ -158,6 +155,16 @@ protected: store_address_t* address, bool ignoreFault); private: + + /** + * @brief This definition generally sets the number of + * different sized pools. It is derived from the number of pairs + * inside the LocalPoolConfig set on object creation. + * @details + * This must be less than the maximum number of pools (currently 0xff). + */ + const max_pools_t NUMBER_OF_POOLS; + /** * Indicates that this element is free. * This value limits the maximum size of a pool. diff --git a/storagemanager/StorageManagerIF.h b/storagemanager/StorageManagerIF.h index 62251933..cd878c6f 100644 --- a/storagemanager/StorageManagerIF.h +++ b/storagemanager/StorageManagerIF.h @@ -171,10 +171,10 @@ public: virtual void clearStore() = 0; /** - * Clears a page in the store. Use with care! + * Clears a pool in the store with the given pool index. Use with care! * @param pageIndex */ - virtual void clearPage(uint8_t pageIndex) = 0; + virtual void clearPool(uint8_t poolIndex) = 0; /** * Get the fill count of the pool. The exact form will be implementation @@ -185,6 +185,12 @@ public: virtual void getFillCount(uint8_t* buffer, uint8_t* bytesWritten) = 0; virtual size_t getTotalSize(size_t* additionalSize) = 0; + + /** + * Get number of pools. + * @return + */ + virtual max_pools_t getNumberOfPools() const = 0; }; #endif /* FSFW_STORAGEMANAGER_STORAGEMANAGERIF_H_ */ From f7b70984c19ef8752bfef7173a4cc12a3c352acb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 18 Jan 2021 20:20:01 +0100 Subject: [PATCH 15/19] updated doc --- storagemanager/StorageManagerIF.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/storagemanager/StorageManagerIF.h b/storagemanager/StorageManagerIF.h index cd878c6f..7aeca5d3 100644 --- a/storagemanager/StorageManagerIF.h +++ b/storagemanager/StorageManagerIF.h @@ -177,10 +177,13 @@ public: virtual void clearPool(uint8_t poolIndex) = 0; /** - * Get the fill count of the pool. The exact form will be implementation - * dependant. + * Get the fill count of the pool. Each character inside the provided + * buffer will be assigned to a rounded percentage fill count for each + * page. The last written byte (at the index bytesWritten - 1) + * will contain the total fill count of the pool as a mean of the + * percentages of single pages. * @param buffer - * @param bytesWritten + * @param maxSize */ virtual void getFillCount(uint8_t* buffer, uint8_t* bytesWritten) = 0; From f4a60a03236da519ff89ef0a4ecc829e6789df23 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 19 Jan 2021 14:37:52 +0100 Subject: [PATCH 16/19] less confusing code --- events/EventManager.cpp | 1 + events/EventManagerIF.h | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/events/EventManager.cpp b/events/EventManager.cpp index e25e574f..5b2b31b5 100644 --- a/events/EventManager.cpp +++ b/events/EventManager.cpp @@ -6,6 +6,7 @@ #include "../ipc/QueueFactory.h" #include "../ipc/MutexFactory.h" +MessageQueueId_t EventManagerIF::eventmanagerQueue = MessageQueueIF::NO_QUEUE; // If one checks registerListener calls, there are around 40 (to max 50) // objects registering for certain events. diff --git a/events/EventManagerIF.h b/events/EventManagerIF.h index 253e6910..ea22f8ae 100644 --- a/events/EventManagerIF.h +++ b/events/EventManagerIF.h @@ -1,11 +1,12 @@ -#ifndef EVENTMANAGERIF_H_ -#define EVENTMANAGERIF_H_ +#ifndef FSFW_EVENTS_EVENTMANAGERIF_H_ +#define FSFW_EVENTS_EVENTMANAGERIF_H_ #include "EventMessage.h" #include "eventmatching/eventmatching.h" #include "../objectmanager/ObjectManagerIF.h" #include "../ipc/MessageQueueSenderIF.h" #include "../ipc/MessageQueueIF.h" +#include "../serviceinterface/ServiceInterface.h" class EventManagerIF { public: @@ -41,11 +42,19 @@ public: static void triggerEvent(EventMessage* message, MessageQueueId_t sentFrom = 0) { - static MessageQueueId_t eventmanagerQueue = MessageQueueIF::NO_QUEUE; if (eventmanagerQueue == MessageQueueIF::NO_QUEUE) { EventManagerIF *eventmanager = objectManager->get( objects::EVENT_MANAGER); if (eventmanager == nullptr) { +#if FSFW_VERBOSE_LEVEL >= 1 +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::warning << "EventManagerIF::triggerEvent: EventManager invalid or not found!" + << std::endl; +#else + sif::printWarning("EventManagerIF::triggerEvent: " + "EventManager invalid or not found!"); +#endif /* FSFW_CPP_OSTREAM_ENABLED == 1 */ +#endif /* FSFW_VERBOSE_LEVEL >= 1 */ return; } eventmanagerQueue = eventmanager->getEventReportQueue(); @@ -53,6 +62,10 @@ public: MessageQueueSenderIF::sendMessage(eventmanagerQueue, message, sentFrom); } +private: + //! Initialized by EventManager (C++11 does not allow header-only static member initialization). + static MessageQueueId_t eventmanagerQueue; + }; -#endif /* EVENTMANAGERIF_H_ */ +#endif /* FSFW_EVENTS_EVENTMANAGERIF_H_ */ From b6888a81855159796594f128eb81e335a3d19872 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 19 Jan 2021 15:04:47 +0100 Subject: [PATCH 17/19] better naming --- storagemanager/LocalPool.cpp | 36 +++++++++++++++---------------- storagemanager/LocalPool.h | 18 ++++++++-------- storagemanager/StorageManagerIF.h | 10 ++++----- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/storagemanager/LocalPool.cpp b/storagemanager/LocalPool.cpp index b72f21ca..2742de77 100644 --- a/storagemanager/LocalPool.cpp +++ b/storagemanager/LocalPool.cpp @@ -5,15 +5,15 @@ LocalPool::LocalPool(object_id_t setObjectId, const LocalPoolConfig& poolConfig, bool registered, bool spillsToHigherPools): SystemObject(setObjectId, registered), - NUMBER_OF_POOLS(poolConfig.size()), + NUMBER_OF_SUBPOOLS(poolConfig.size()), spillsToHigherPools(spillsToHigherPools) { - if(NUMBER_OF_POOLS == 0) { + if(NUMBER_OF_SUBPOOLS == 0) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "LocalPool::LocalPool: Passed pool configuration is " << " invalid!" << std::endl; #endif } - max_pools_t index = 0; + max_subpools_t index = 0; for (const auto& currentPoolConfig: poolConfig) { this->numberOfElements[index] = currentPoolConfig.first; this->elementSizes[index] = currentPoolConfig.second; @@ -98,7 +98,7 @@ ReturnValue_t LocalPool::modifyData(store_address_t storeId, ReturnValue_t LocalPool::modifyData(store_address_t storeId, uint8_t **packetPtr, size_t *size) { ReturnValue_t status = RETURN_FAILED; - if (storeId.poolIndex >= NUMBER_OF_POOLS) { + if (storeId.poolIndex >= NUMBER_OF_SUBPOOLS) { return ILLEGAL_STORAGE_ID; } if ((storeId.packetIndex >= numberOfElements[storeId.poolIndex])) { @@ -151,7 +151,7 @@ ReturnValue_t LocalPool::deleteData(uint8_t *ptr, size_t size, store_address_t *storeId) { store_address_t localId; ReturnValue_t result = ILLEGAL_ADDRESS; - for (uint16_t n = 0; n < NUMBER_OF_POOLS; n++) { + for (uint16_t n = 0; n < NUMBER_OF_SUBPOOLS; n++) { //Not sure if new allocates all stores in order. so better be careful. if ((store[n].data() <= ptr) and (&store[n][numberOfElements[n]*elementSizes[n]] > ptr)) { @@ -192,7 +192,7 @@ ReturnValue_t LocalPool::initialize() { } //Check if any pool size is large than the maximum allowed. - for (uint8_t count = 0; count < NUMBER_OF_POOLS; count++) { + for (uint8_t count = 0; count < NUMBER_OF_SUBPOOLS; count++) { if (elementSizes[count] >= STORAGE_FREE) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "LocalPool::initialize: Pool is too large! " @@ -263,8 +263,8 @@ void LocalPool::write(store_address_t storeId, const uint8_t *data, sizeLists[storeId.poolIndex][storeId.packetIndex] = size; } -LocalPool::size_type LocalPool::getPageSize(max_pools_t poolIndex) { - if (poolIndex < NUMBER_OF_POOLS) { +LocalPool::size_type LocalPool::getPageSize(max_subpools_t poolIndex) { + if (poolIndex < NUMBER_OF_SUBPOOLS) { return elementSizes[poolIndex]; } else { @@ -278,7 +278,7 @@ void LocalPool::setToSpillToHigherPools(bool enable) { ReturnValue_t LocalPool::getPoolIndex(size_t packetSize, uint16_t *poolIndex, uint16_t startAtIndex) { - for (uint16_t n = startAtIndex; n < NUMBER_OF_POOLS; n++) { + for (uint16_t n = startAtIndex; n < NUMBER_OF_SUBPOOLS; n++) { #if FSFW_VERBOSE_PRINTOUT == 2 #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::debug << "LocalPool " << getObjectId() << "::getPoolIndex: Pool: " @@ -313,7 +313,7 @@ ReturnValue_t LocalPool::findEmpty(n_pool_elem_t poolIndex, uint16_t *element) { size_t LocalPool::getTotalSize(size_t* additionalSize) { size_t totalSize = 0; size_t sizesSize = 0; - for(uint8_t idx = 0; idx < NUMBER_OF_POOLS; idx ++) { + for(uint8_t idx = 0; idx < NUMBER_OF_SUBPOOLS; idx ++) { totalSize += elementSizes[idx] * numberOfElements[idx]; sizesSize += numberOfElements[idx] * sizeof(size_type); } @@ -331,7 +331,7 @@ void LocalPool::getFillCount(uint8_t *buffer, uint8_t *bytesWritten) { uint16_t reservedHits = 0; uint8_t idx = 0; uint16_t sum = 0; - for(; idx < NUMBER_OF_POOLS; idx ++) { + for(; idx < NUMBER_OF_SUBPOOLS; idx ++) { for(const auto& size: sizeLists[idx]) { if(size != STORAGE_FREE) { reservedHits++; @@ -343,25 +343,25 @@ void LocalPool::getFillCount(uint8_t *buffer, uint8_t *bytesWritten) { sum += buffer[idx]; reservedHits = 0; } - buffer[idx] = sum / NUMBER_OF_POOLS; + buffer[idx] = sum / NUMBER_OF_SUBPOOLS; *bytesWritten += 1; } -void LocalPool::clearPool(max_pools_t poolIndex) { - if(poolIndex >= NUMBER_OF_POOLS) { +void LocalPool::clearSubPool(max_subpools_t subpoolIndex) { + if(subpoolIndex >= NUMBER_OF_SUBPOOLS) { return; } // Mark the storage as free - for(auto& size: sizeLists[poolIndex]) { + for(auto& size: sizeLists[subpoolIndex]) { size = STORAGE_FREE; } // Set all the page content to 0. - std::memset(store[poolIndex].data(), 0, elementSizes[poolIndex]); + std::memset(store[subpoolIndex].data(), 0, elementSizes[subpoolIndex]); } -LocalPool::max_pools_t LocalPool::getNumberOfPools() const { - return NUMBER_OF_POOLS; +LocalPool::max_subpools_t LocalPool::getNumberOfSubPools() const { + return NUMBER_OF_SUBPOOLS; } diff --git a/storagemanager/LocalPool.h b/storagemanager/LocalPool.h index 4d3994bb..a58f911b 100644 --- a/storagemanager/LocalPool.h +++ b/storagemanager/LocalPool.h @@ -134,15 +134,15 @@ public: void getFillCount(uint8_t* buffer, uint8_t* bytesWritten) override; void clearStore() override; - void clearPool(max_pools_t poolIndex) override; + void clearSubPool(max_subpools_t poolIndex) override; ReturnValue_t initialize() override; /** - * Get number pools. Each pool has pages with a specific bucket size. + * Get number sub pools. Each pool has pages with a specific bucket size. * @return */ - max_pools_t getNumberOfPools() const override; + max_subpools_t getNumberOfSubPools() const override; protected: /** * With this helper method, a free element of @c size is reserved. @@ -163,7 +163,7 @@ private: * @details * This must be less than the maximum number of pools (currently 0xff). */ - const max_pools_t NUMBER_OF_POOLS; + const max_subpools_t NUMBER_OF_SUBPOOLS; /** * Indicates that this element is free. @@ -177,20 +177,20 @@ private: * must be set in ascending order on construction. */ std::vector elementSizes = - std::vector(NUMBER_OF_POOLS); + std::vector(NUMBER_OF_SUBPOOLS); /** * @brief n_elements stores the number of elements per pool. * @details These numbers are maintained for internal pool management. */ std::vector numberOfElements = - std::vector(NUMBER_OF_POOLS); + std::vector(NUMBER_OF_SUBPOOLS); /** * @brief store represents the actual memory pool. * @details It is an array of pointers to memory, which was allocated with * a @c new call on construction. */ std::vector> store = - std::vector>(NUMBER_OF_POOLS); + std::vector>(NUMBER_OF_SUBPOOLS); /** * @brief The size_list attribute stores the size values of every pool element. @@ -198,7 +198,7 @@ private: * is also dynamically allocated there. */ std::vector> sizeLists = - std::vector>(NUMBER_OF_POOLS); + std::vector>(NUMBER_OF_SUBPOOLS); //! A variable to determine whether higher n pools are used if //! the store is full. @@ -217,7 +217,7 @@ private: * @param pool_index The pool in which to look. * @return Returns the size of an element or 0. */ - size_type getPageSize(max_pools_t poolIndex); + size_type getPageSize(max_subpools_t poolIndex); /** * @brief This helper method looks up a fitting pool for a given size. diff --git a/storagemanager/StorageManagerIF.h b/storagemanager/StorageManagerIF.h index 7aeca5d3..da7ce01d 100644 --- a/storagemanager/StorageManagerIF.h +++ b/storagemanager/StorageManagerIF.h @@ -29,7 +29,7 @@ using ConstAccessorPair = std::pair; class StorageManagerIF : public HasReturnvaluesIF { public: using size_type = size_t; - using max_pools_t = uint8_t; + using max_subpools_t = uint8_t; static const uint8_t INTERFACE_ID = CLASS_ID::STORAGE_MANAGER_IF; //!< The unique ID for return codes for this interface. static const ReturnValue_t DATA_TOO_LARGE = MAKE_RETURN_CODE(1); //!< This return code indicates that the data to be stored is too large for the store. @@ -149,10 +149,10 @@ public: virtual ReturnValue_t modifyData(store_address_t packet_id, uint8_t** packet_ptr, size_t* size) = 0; /** - * This method reserves an element of \c size. + * This method reserves an element of @c size. * * It returns the packet id of this element as well as a direct pointer to the - * data of the element. It must be assured that exactly \c size data is + * data of the element. It must be assured that exactly @c size data is * written to p_data! * @param storageId A pointer to the storageId to retrieve. * @param size The size of the space to be reserved. @@ -174,7 +174,7 @@ public: * Clears a pool in the store with the given pool index. Use with care! * @param pageIndex */ - virtual void clearPool(uint8_t poolIndex) = 0; + virtual void clearSubPool(uint8_t poolIndex) = 0; /** * Get the fill count of the pool. Each character inside the provided @@ -193,7 +193,7 @@ public: * Get number of pools. * @return */ - virtual max_pools_t getNumberOfPools() const = 0; + virtual max_subpools_t getNumberOfSubPools() const = 0; }; #endif /* FSFW_STORAGEMANAGER_STORAGEMANAGERIF_H_ */ From ca22ff5d8e8b9ab1e9fd3e6ddffccb52d44509ca Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 19 Jan 2021 15:06:21 +0100 Subject: [PATCH 18/19] more renaming --- storagemanager/LocalPool.cpp | 16 ++++++++-------- storagemanager/LocalPool.h | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/storagemanager/LocalPool.cpp b/storagemanager/LocalPool.cpp index 2742de77..2b733548 100644 --- a/storagemanager/LocalPool.cpp +++ b/storagemanager/LocalPool.cpp @@ -127,7 +127,7 @@ ReturnValue_t LocalPool::deleteData(store_address_t storeId) { #endif ReturnValue_t status = RETURN_OK; - size_type pageSize = getPageSize(storeId.poolIndex); + size_type pageSize = getSubpoolElementSize(storeId.poolIndex); if ((pageSize != 0) and (storeId.packetIndex < numberOfElements[storeId.poolIndex])) { uint16_t packetPosition = getRawPosition(storeId); @@ -217,7 +217,7 @@ void LocalPool::clearStore() { ReturnValue_t LocalPool::reserveSpace(const size_t size, store_address_t *storeId, bool ignoreFault) { - ReturnValue_t status = getPoolIndex(size, &storeId->poolIndex); + ReturnValue_t status = getSubPoolIndex(size, &storeId->poolIndex); if (status != RETURN_OK) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "LocalPool( " << std::hex << getObjectId() << std::dec @@ -227,7 +227,7 @@ ReturnValue_t LocalPool::reserveSpace(const size_t size, } status = findEmpty(storeId->poolIndex, &storeId->packetIndex); while (status != RETURN_OK && spillsToHigherPools) { - status = getPoolIndex(size, &storeId->poolIndex, storeId->poolIndex + 1); + status = getSubPoolIndex(size, &storeId->poolIndex, storeId->poolIndex + 1); if (status != RETURN_OK) { //We don't find any fitting pool anymore. break; @@ -263,9 +263,9 @@ void LocalPool::write(store_address_t storeId, const uint8_t *data, sizeLists[storeId.poolIndex][storeId.packetIndex] = size; } -LocalPool::size_type LocalPool::getPageSize(max_subpools_t poolIndex) { - if (poolIndex < NUMBER_OF_SUBPOOLS) { - return elementSizes[poolIndex]; +LocalPool::size_type LocalPool::getSubpoolElementSize(max_subpools_t subpoolIndex) { + if (subpoolIndex < NUMBER_OF_SUBPOOLS) { + return elementSizes[subpoolIndex]; } else { return 0; @@ -276,7 +276,7 @@ void LocalPool::setToSpillToHigherPools(bool enable) { this->spillsToHigherPools = enable; } -ReturnValue_t LocalPool::getPoolIndex(size_t packetSize, uint16_t *poolIndex, +ReturnValue_t LocalPool::getSubPoolIndex(size_t packetSize, uint16_t *subpoolIndex, uint16_t startAtIndex) { for (uint16_t n = startAtIndex; n < NUMBER_OF_SUBPOOLS; n++) { #if FSFW_VERBOSE_PRINTOUT == 2 @@ -286,7 +286,7 @@ ReturnValue_t LocalPool::getPoolIndex(size_t packetSize, uint16_t *poolIndex, #endif #endif if (elementSizes[n] >= packetSize) { - *poolIndex = n; + *subpoolIndex = n; return RETURN_OK; } } diff --git a/storagemanager/LocalPool.h b/storagemanager/LocalPool.h index a58f911b..6a666485 100644 --- a/storagemanager/LocalPool.h +++ b/storagemanager/LocalPool.h @@ -217,7 +217,7 @@ private: * @param pool_index The pool in which to look. * @return Returns the size of an element or 0. */ - size_type getPageSize(max_subpools_t poolIndex); + size_type getSubpoolElementSize(max_subpools_t subpoolIndex); /** * @brief This helper method looks up a fitting pool for a given size. @@ -228,7 +228,7 @@ private: * @return - @c RETURN_OK on success, * - @c DATA_TOO_LARGE otherwise. */ - ReturnValue_t getPoolIndex(size_t packetSize, uint16_t* poolIndex, + ReturnValue_t getSubPoolIndex(size_t packetSize, uint16_t* subpoolIndex, uint16_t startAtIndex = 0); /** * @brief This helper method calculates the true array position in store From 583d354fb5af3d68615f6597fb3ead4f57ce6f89 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 19 Jan 2021 15:48:50 +0100 Subject: [PATCH 19/19] removed include --- action/ActionMessage.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/action/ActionMessage.cpp b/action/ActionMessage.cpp index 34b7913e..1c00dee0 100644 --- a/action/ActionMessage.cpp +++ b/action/ActionMessage.cpp @@ -1,4 +1,3 @@ -#include #include "ActionMessage.h" #include "HasActionsIF.h"