diff --git a/Peripherals/Inc/peripherals_hal_st.hpp b/Peripherals/Inc/peripherals_hal_st.hpp index ff58dfe..ee4487a 100644 --- a/Peripherals/Inc/peripherals_hal_st.hpp +++ b/Peripherals/Inc/peripherals_hal_st.hpp @@ -28,12 +28,9 @@ template createCallback(Handler& h_in) { static Handler* h = &h_in; - printf("Set handler: %p\n", h); return +[](Origin*) { - printf("Into callback we go.\n"); (h->*func)(); - printf("And we're out.\n"); }; } diff --git a/Tests/ringbuffer.cpp b/Tests/ringbuffer.cpp index e02220f..abac8b6 100644 --- a/Tests/ringbuffer.cpp +++ b/Tests/ringbuffer.cpp @@ -9,7 +9,7 @@ template using Ringbuffer = Utility::Ringbuffer; -TEST_CASE("Ringbuffer iterator", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer iterator", "[utility],[ringbuffer]") { using iterator = Ringbuffer<10>::iterator; const auto begin = iterator::pointer(10); @@ -43,7 +43,7 @@ TEST_CASE("Ringbuffer iterator", "[peripherals],[ringbuffer]") } } -TEST_CASE("Ringbuffer iterator at the end", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer iterator at the end", "[utility],[ringbuffer]") { using iterator = Ringbuffer<10>::iterator; const auto begin = iterator::pointer(10); @@ -71,7 +71,7 @@ TEST_CASE("Ringbuffer iterator at the end", "[peripherals],[ringbuffer]") } } -TEST_CASE("Ringbuffer iterator at the beginning", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer iterator at the beginning", "[utility],[ringbuffer]") { using iterator = Ringbuffer<10>::iterator; const auto begin = iterator::pointer(10); @@ -87,16 +87,17 @@ TEST_CASE("Ringbuffer iterator at the beginning", "[peripherals],[ringbuffer]") } } -TEST_CASE("Constructed buffer is empty.", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer constructed buffer is empty.", "[utility],[ringbuffer]") { Ringbuffer<10> buffer; REQUIRE(buffer.begin() == buffer.end()); REQUIRE(buffer.size() == 0); REQUIRE(buffer.empty()); + REQUIRE(&buffer.front() == &buffer.back()); } -TEST_CASE("Buffer reports size properly.", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer reports size properly.", "[utility],[ringbuffer]") { Ringbuffer<3> buffer; @@ -140,7 +141,7 @@ TEST_CASE("Buffer reports size properly.", "[peripherals],[ringbuffer]") } } -TEST_CASE("Adding single element.", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer adding single element.", "[utility],[ringbuffer]") { Ringbuffer<10> buffer; const auto old_end = buffer.end(); @@ -191,7 +192,7 @@ TEST_CASE("Adding single element.", "[peripherals],[ringbuffer]") } } -TEST_CASE("Adding multiple elements.", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer adding multiple elements.", "[utility],[ringbuffer]") { Ringbuffer<10> buffer; const auto old_begin = buffer.begin(); @@ -223,7 +224,7 @@ TEST_CASE("Adding multiple elements.", "[peripherals],[ringbuffer]") } } -TEST_CASE("Removing elements from the ringbuffer.", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer removing elements from the ringbuffer.", "[utility],[ringbuffer]") { Ringbuffer<10> buffer; const auto old_begin = buffer.begin(); @@ -271,7 +272,7 @@ TEST_CASE("Removing elements from the ringbuffer.", "[peripherals],[ringbuffer]" } } -TEST_CASE("Clearing a ringbuffer works.", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer clearing a ringbuffer works.", "[utility],[ringbuffer]") { Ringbuffer<10> buffer; @@ -290,10 +291,11 @@ TEST_CASE("Clearing a ringbuffer works.", "[peripherals],[ringbuffer]") SECTION("Sets begin() and end() pointers appropriately.") { REQUIRE(buffer.begin() == buffer.end()); + REQUIRE(&buffer.front() == &buffer.back()); } } -TEST_CASE("Manually incrementing tail works.", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer manually incrementing tail works.", "[utility],[ringbuffer]") { Ringbuffer<10> buffer; @@ -312,7 +314,55 @@ TEST_CASE("Manually incrementing tail works.", "[peripherals],[ringbuffer]") } } -TEST_CASE("Manually incrementing tail when full deletes data.", "[peripherals],[ringbuffer]") +TEST_CASE("Ringbuffer manually incrementing tail from empty state works.", "[utility],[ringbuffer]") +{ + Ringbuffer<10> buffer; + + const auto old_end = buffer.end(); + const auto old_begin = buffer.begin(); + auto* old_tail_item_ptr = &(*old_end); + + buffer.increment_tail(); + + SECTION("Head remains in place.") + { + const auto new_end = buffer.end(); + const auto new_begin = buffer.begin(); + REQUIRE(old_begin == new_begin); + REQUIRE(new_end != new_begin); + REQUIRE(new_end - new_begin == 1); + } + + SECTION("Tail has been incremented.") + { + const auto new_end = buffer.end(); + REQUIRE(new_end != old_end); + REQUIRE(new_end - old_end == 1); + REQUIRE(buffer.size() == 1); + } + + SECTION("Item pointer for end is increased appropriately.") + { + auto* new_tail_item_ptr = &(*buffer.end()); + REQUIRE(new_tail_item_ptr != old_tail_item_ptr); + REQUIRE(new_tail_item_ptr - old_tail_item_ptr == 1); + } + + SECTION("Second incrementation works as expected.") + { + buffer.increment_tail(); + const auto new_end = buffer.end(); + const auto new_begin = buffer.begin(); + auto* new_tail_item_ptr = &(*buffer.end()); + + REQUIRE(new_begin == old_begin); + REQUIRE(new_end - old_end == 2); + REQUIRE(new_tail_item_ptr - old_tail_item_ptr == 2); + REQUIRE(buffer.size() == 2); + } +} + +TEST_CASE("Ringbuffer manually incrementing tail when full deletes data.", "[utility],[ringbuffer]") { Ringbuffer<2> buffer; diff --git a/Utility/Inc/utility_asynclogger.hpp b/Utility/Inc/utility_asynclogger.hpp index b23a65f..249dd2b 100644 --- a/Utility/Inc/utility_asynclogger.hpp +++ b/Utility/Inc/utility_asynclogger.hpp @@ -48,10 +48,8 @@ public: std::va_list args; va_start(args, format); - auto tail = _buffer_queue.end(); - std::array& buffer = tail->buffer; - - tail->length = vsnprintf(buffer.data(), buffer.size(), format, args); + _Data& tail = (*_buffer_queue.end()); + tail.length = vsnprintf(tail.buffer.data(), tail.buffer.size(), format, args); { AtomicScopeGuard s; @@ -60,6 +58,8 @@ public: if (!_in_flight) _sendNextLog(); } + + va_end(args); } void txCompleteCallback() diff --git a/Utility/Inc/utility_ringbuffer.hpp b/Utility/Inc/utility_ringbuffer.hpp index 235ecb8..15033bc 100644 --- a/Utility/Inc/utility_ringbuffer.hpp +++ b/Utility/Inc/utility_ringbuffer.hpp @@ -172,7 +172,7 @@ public: void increment_tail() { - if (_tail == _head) + if (_is_full) ++_head; ++_tail; @@ -199,12 +199,18 @@ public: reference back() { - return *(_tail - 1); + if (empty()) + return *_tail; + else + return *(_tail - 1); } const_reference back() const { - return *(_tail - 1); + if (empty()) + return *_tail; + else + return *(_tail - 1); } size_type size() const