diff --git a/firmware/common/fifo.hpp b/firmware/common/fifo.hpp index 66c9c811c..f217e67eb 100644 --- a/firmware/common/fifo.hpp +++ b/firmware/common/fifo.hpp @@ -114,6 +114,26 @@ public: return len; } + bool skip() { + if( is_empty() ) { + return false; + } + + size_t len = peek_n(); + _out += len + recsize(); + return true; + } + + size_t peek_r(void* const buf, size_t len) { + if( is_empty() ) { + return 0; + } + + size_t n; + len = out_copy_r((T*)buf, len, &n); + return len; + } + size_t out_r(void* const buf, size_t len) { if( is_empty() ) { return 0; diff --git a/firmware/common/message_queue.hpp b/firmware/common/message_queue.hpp index 94745f3ee..c4430a237 100644 --- a/firmware/common/message_queue.hpp +++ b/firmware/common/message_queue.hpp @@ -47,6 +47,25 @@ public: return push(&message, sizeof(message)); } + template + bool push_and_wait(const T& message) { + const bool result = push(message); + if( result ) { + // TODO: More graceful method of waiting for empty? Maybe sleep for a bit? + while( !is_empty() ); + } + return result; + } + + Message* peek(std::array& buf) { + Message* const p = reinterpret_cast(buf.data()); + return fifo.peek_r(buf.data(), buf.size()) ? p : nullptr; + } + + bool skip() { + return fifo.skip(); + } + Message* pop(std::array& buf) { Message* const p = reinterpret_cast(buf.data()); return fifo.out_r(buf.data(), buf.size()) ? p : nullptr;