Note! This project has moved to github.com/armmbed/mbed-events
This repository has been superceded
This project has moved to mbed-events
Composable event loops combine the cheap synchronicity of event loops with the composability of preempted threads.
Two modular event queue classes are provided:
- EventLoop - for loops coupled with a c++ managed thread
- EventQueue - for manually managed event queues
The Event class takes advantage of the extensibility of FuncPtr to allow an event to be passed through APIs as a normal function.
More information on composable event loops.
Diff: EventQueue.cpp
- Revision:
- 0:b1b901ae3696
- Child:
- 1:2202c19570e5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EventQueue.cpp Wed Apr 20 11:43:51 2016 -0500 @@ -0,0 +1,51 @@ +#include <EventQueue.h> +#include "mbed.h" + + +static void wakeup() {} + +void EventQueue::dispatch(unsigned milli) { + mbed::Timer timer; + mbed::Timeout timeout; + timer.start(); + timeout.attach_us(wakeup, milli * 1000); + + while (true) { + while (_queue) { + _queue->callback(_queue->data); + _queue = _queue->next; + } + + if ((unsigned)timer.read_ms() > milli) { + break; + } + + __WFI(); + } +} + +void EventQueue::event_register(struct event *event) { + __disable_irq(); + for (struct event **p = &_queue;; p = &(*p)->next) { + if (!*p) { + event->next = 0; + *p = event; + break; + } else if (*p == event) { + break; + } + } + __enable_irq(); +} + +void EventQueue::event_unregister(struct event *event) { + __disable_irq(); + for (struct event **p = &_queue; *p; p = &(*p)->next) { + if (*p == event) { + *p = event->next; + break; + } + } + __enable_irq(); +} +