mirror of
https://github.com/peterantypas/maiana.git
synced 2025-05-29 05:40:15 -07:00
72 lines
1.4 KiB
C++
72 lines
1.4 KiB
C++
/*
|
|
* EventQueue.cpp
|
|
*
|
|
* Created on: Dec 7, 2015
|
|
* Author: peter
|
|
*/
|
|
|
|
#include "EventQueue.hpp"
|
|
#include <cassert>
|
|
#include "printf2.h"
|
|
#include "LEDManager.hpp"
|
|
#include <stm32f30x.h>
|
|
#include "printf2.h"
|
|
#include "Utils.hpp"
|
|
|
|
EventQueue &EventQueue::instance()
|
|
{
|
|
static EventQueue __instance;
|
|
return __instance;
|
|
}
|
|
|
|
EventQueue::EventQueue()
|
|
{
|
|
mQueue = new CircularQueue<Event*>(100);
|
|
}
|
|
|
|
void EventQueue::init()
|
|
{
|
|
}
|
|
|
|
void EventQueue::push(Event *event)
|
|
{
|
|
assert(event);
|
|
if ( !mQueue->push(event) ) {
|
|
EventPool::instance().deleteEvent(event);
|
|
printf2("EventQueue full!!!\r\n");
|
|
}
|
|
}
|
|
|
|
void EventQueue::addObserver(EventConsumer *c, uint32_t eventMask)
|
|
{
|
|
mConsumers[c] = eventMask;
|
|
}
|
|
|
|
void EventQueue::removeObserver(EventConsumer *c)
|
|
{
|
|
map<EventConsumer*, uint32_t>::iterator i = mConsumers.find(c);
|
|
if ( i == mConsumers.end() )
|
|
return;
|
|
|
|
mConsumers.erase(i);
|
|
}
|
|
|
|
void EventQueue::dispatch()
|
|
{
|
|
Event *e = NULL;
|
|
if (mQueue->pop(e)) {
|
|
|
|
for ( map<EventConsumer*, uint32_t>::iterator c = mConsumers.begin(); c != mConsumers.end(); ++c ) {
|
|
if ( c->second & e->type )
|
|
c->first->processEvent(*e);
|
|
}
|
|
|
|
EventPool::instance().deleteEvent(e);
|
|
|
|
// TODO: Make LEDManager an EventConsumer instead
|
|
if ( e->type == AIS_PACKET_EVENT )
|
|
LEDManager::instance().blink(LEDManager::GREEN_LED);
|
|
}
|
|
}
|
|
|