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.
EventQueue.cpp@0:b1b901ae3696, 2016-04-20 (annotated)
- Committer:
- Christopher Haster
- Date:
- Wed Apr 20 11:43:51 2016 -0500
- Revision:
- 0:b1b901ae3696
- Child:
- 1:2202c19570e5
Initial commit of Event and EventQueue classes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Christopher Haster |
0:b1b901ae3696 | 1 | #include <EventQueue.h> |
Christopher Haster |
0:b1b901ae3696 | 2 | #include "mbed.h" |
Christopher Haster |
0:b1b901ae3696 | 3 | |
Christopher Haster |
0:b1b901ae3696 | 4 | |
Christopher Haster |
0:b1b901ae3696 | 5 | static void wakeup() {} |
Christopher Haster |
0:b1b901ae3696 | 6 | |
Christopher Haster |
0:b1b901ae3696 | 7 | void EventQueue::dispatch(unsigned milli) { |
Christopher Haster |
0:b1b901ae3696 | 8 | mbed::Timer timer; |
Christopher Haster |
0:b1b901ae3696 | 9 | mbed::Timeout timeout; |
Christopher Haster |
0:b1b901ae3696 | 10 | timer.start(); |
Christopher Haster |
0:b1b901ae3696 | 11 | timeout.attach_us(wakeup, milli * 1000); |
Christopher Haster |
0:b1b901ae3696 | 12 | |
Christopher Haster |
0:b1b901ae3696 | 13 | while (true) { |
Christopher Haster |
0:b1b901ae3696 | 14 | while (_queue) { |
Christopher Haster |
0:b1b901ae3696 | 15 | _queue->callback(_queue->data); |
Christopher Haster |
0:b1b901ae3696 | 16 | _queue = _queue->next; |
Christopher Haster |
0:b1b901ae3696 | 17 | } |
Christopher Haster |
0:b1b901ae3696 | 18 | |
Christopher Haster |
0:b1b901ae3696 | 19 | if ((unsigned)timer.read_ms() > milli) { |
Christopher Haster |
0:b1b901ae3696 | 20 | break; |
Christopher Haster |
0:b1b901ae3696 | 21 | } |
Christopher Haster |
0:b1b901ae3696 | 22 | |
Christopher Haster |
0:b1b901ae3696 | 23 | __WFI(); |
Christopher Haster |
0:b1b901ae3696 | 24 | } |
Christopher Haster |
0:b1b901ae3696 | 25 | } |
Christopher Haster |
0:b1b901ae3696 | 26 | |
Christopher Haster |
0:b1b901ae3696 | 27 | void EventQueue::event_register(struct event *event) { |
Christopher Haster |
0:b1b901ae3696 | 28 | __disable_irq(); |
Christopher Haster |
0:b1b901ae3696 | 29 | for (struct event **p = &_queue;; p = &(*p)->next) { |
Christopher Haster |
0:b1b901ae3696 | 30 | if (!*p) { |
Christopher Haster |
0:b1b901ae3696 | 31 | event->next = 0; |
Christopher Haster |
0:b1b901ae3696 | 32 | *p = event; |
Christopher Haster |
0:b1b901ae3696 | 33 | break; |
Christopher Haster |
0:b1b901ae3696 | 34 | } else if (*p == event) { |
Christopher Haster |
0:b1b901ae3696 | 35 | break; |
Christopher Haster |
0:b1b901ae3696 | 36 | } |
Christopher Haster |
0:b1b901ae3696 | 37 | } |
Christopher Haster |
0:b1b901ae3696 | 38 | __enable_irq(); |
Christopher Haster |
0:b1b901ae3696 | 39 | } |
Christopher Haster |
0:b1b901ae3696 | 40 | |
Christopher Haster |
0:b1b901ae3696 | 41 | void EventQueue::event_unregister(struct event *event) { |
Christopher Haster |
0:b1b901ae3696 | 42 | __disable_irq(); |
Christopher Haster |
0:b1b901ae3696 | 43 | for (struct event **p = &_queue; *p; p = &(*p)->next) { |
Christopher Haster |
0:b1b901ae3696 | 44 | if (*p == event) { |
Christopher Haster |
0:b1b901ae3696 | 45 | *p = event->next; |
Christopher Haster |
0:b1b901ae3696 | 46 | break; |
Christopher Haster |
0:b1b901ae3696 | 47 | } |
Christopher Haster |
0:b1b901ae3696 | 48 | } |
Christopher Haster |
0:b1b901ae3696 | 49 | __enable_irq(); |
Christopher Haster |
0:b1b901ae3696 | 50 | } |
Christopher Haster |
0:b1b901ae3696 | 51 |