1
0
mirror of https://github.com/peterantypas/maiana.git synced 2025-05-29 05:40:15 -07:00
maiana/application/src/EventQueue.cpp
2016-11-04 14:18:56 -07:00

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);
}
}