Fix the asynclogger not treating tail properly.
This commit is contained in:
parent
ce4f8eb8f5
commit
5c8e6f09b9
@ -28,12 +28,9 @@ template<typename Origin, typename Handler, void (Handler::*func)(), typename Ta
|
|||||||
IsrCallbackFn<Origin> createCallback(Handler& h_in)
|
IsrCallbackFn<Origin> createCallback(Handler& h_in)
|
||||||
{
|
{
|
||||||
static Handler* h = &h_in;
|
static Handler* h = &h_in;
|
||||||
printf("Set handler: %p\n", h);
|
|
||||||
return +[](Origin*)
|
return +[](Origin*)
|
||||||
{
|
{
|
||||||
printf("Into callback we go.\n");
|
|
||||||
(h->*func)();
|
(h->*func)();
|
||||||
printf("And we're out.\n");
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
template<size_t N>
|
template<size_t N>
|
||||||
using Ringbuffer = Utility::Ringbuffer<int, N>;
|
using Ringbuffer = Utility::Ringbuffer<int, N>;
|
||||||
|
|
||||||
TEST_CASE("Ringbuffer iterator", "[peripherals],[ringbuffer]")
|
TEST_CASE("Ringbuffer iterator", "[utility],[ringbuffer]")
|
||||||
{
|
{
|
||||||
using iterator = Ringbuffer<10>::iterator;
|
using iterator = Ringbuffer<10>::iterator;
|
||||||
const auto begin = iterator::pointer(10);
|
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;
|
using iterator = Ringbuffer<10>::iterator;
|
||||||
const auto begin = iterator::pointer(10);
|
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;
|
using iterator = Ringbuffer<10>::iterator;
|
||||||
const auto begin = iterator::pointer(10);
|
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;
|
Ringbuffer<10> buffer;
|
||||||
|
|
||||||
REQUIRE(buffer.begin() == buffer.end());
|
REQUIRE(buffer.begin() == buffer.end());
|
||||||
REQUIRE(buffer.size() == 0);
|
REQUIRE(buffer.size() == 0);
|
||||||
REQUIRE(buffer.empty());
|
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;
|
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;
|
Ringbuffer<10> buffer;
|
||||||
const auto old_end = buffer.end();
|
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;
|
Ringbuffer<10> buffer;
|
||||||
const auto old_begin = buffer.begin();
|
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;
|
Ringbuffer<10> buffer;
|
||||||
const auto old_begin = buffer.begin();
|
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;
|
Ringbuffer<10> buffer;
|
||||||
|
|
||||||
@ -290,10 +291,11 @@ TEST_CASE("Clearing a ringbuffer works.", "[peripherals],[ringbuffer]")
|
|||||||
SECTION("Sets begin() and end() pointers appropriately.")
|
SECTION("Sets begin() and end() pointers appropriately.")
|
||||||
{
|
{
|
||||||
REQUIRE(buffer.begin() == buffer.end());
|
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;
|
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;
|
Ringbuffer<2> buffer;
|
||||||
|
|
||||||
|
|||||||
@ -48,10 +48,8 @@ public:
|
|||||||
std::va_list args;
|
std::va_list args;
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
|
|
||||||
auto tail = _buffer_queue.end();
|
_Data& tail = (*_buffer_queue.end());
|
||||||
std::array<char, 255>& buffer = tail->buffer;
|
tail.length = vsnprintf(tail.buffer.data(), tail.buffer.size(), format, args);
|
||||||
|
|
||||||
tail->length = vsnprintf(buffer.data(), buffer.size(), format, args);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
AtomicScopeGuard<hal> s;
|
AtomicScopeGuard<hal> s;
|
||||||
@ -60,6 +58,8 @@ public:
|
|||||||
if (!_in_flight)
|
if (!_in_flight)
|
||||||
_sendNextLog();
|
_sendNextLog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void txCompleteCallback()
|
void txCompleteCallback()
|
||||||
|
|||||||
@ -172,7 +172,7 @@ public:
|
|||||||
|
|
||||||
void increment_tail()
|
void increment_tail()
|
||||||
{
|
{
|
||||||
if (_tail == _head)
|
if (_is_full)
|
||||||
++_head;
|
++_head;
|
||||||
|
|
||||||
++_tail;
|
++_tail;
|
||||||
@ -199,12 +199,18 @@ public:
|
|||||||
|
|
||||||
reference back()
|
reference back()
|
||||||
{
|
{
|
||||||
return *(_tail - 1);
|
if (empty())
|
||||||
|
return *_tail;
|
||||||
|
else
|
||||||
|
return *(_tail - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const_reference back() const
|
const_reference back() const
|
||||||
{
|
{
|
||||||
return *(_tail - 1);
|
if (empty())
|
||||||
|
return *_tail;
|
||||||
|
else
|
||||||
|
return *(_tail - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_type size() const
|
size_type size() const
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user