42 lines
1.2 KiB
C++
42 lines
1.2 KiB
C++
// CEventQueue.cpp
|
||
// Ring-Buffer FIFO-Implementierung.
|
||
//
|
||
// Funktionsprinzip (klassischer Power-of-2-freier Ring-Buffer):
|
||
// m_head = Lese-Index (pop)
|
||
// m_tail = Schreib-Index (push)
|
||
// Leer: m_head == m_tail
|
||
// Voll: (m_tail + 1) % SIZE == m_head → ein Slot bleibt immer frei
|
||
//
|
||
// Nebenläufigkeit:
|
||
// Encoder-ISRs und der Matrixcallback im Loop können beide push() aufrufen.
|
||
// Der Matrixcallback schützt seinen push() mit einer kurzen Critical Section,
|
||
// sodass m_tail nie von Loop und ISR gleichzeitig verändert wird.
|
||
|
||
#include "CEventQueue.h"
|
||
|
||
bool CEventQueue::is_empty() const
|
||
{
|
||
return m_head == m_tail;
|
||
}
|
||
|
||
bool CEventQueue::is_full() const
|
||
{
|
||
// Voll wenn der nächste Schreib-Index auf den Lese-Index zeigen würde
|
||
return ((m_tail + 1) % QUEUE_SIZE) == m_head;
|
||
}
|
||
|
||
bool CEventQueue::push(SEvent ev)
|
||
{
|
||
if (is_full()) return false; // Event verwerfen – sollte bei 16 Slots nie passieren
|
||
m_buf[m_tail] = ev;
|
||
m_tail = (m_tail + 1) % QUEUE_SIZE;
|
||
return true;
|
||
}
|
||
|
||
bool CEventQueue::pop(SEvent& out)
|
||
{
|
||
if (is_empty()) return false;
|
||
out = m_buf[m_head];
|
||
m_head = (m_head + 1) % QUEUE_SIZE;
|
||
return true;
|
||
}
|