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.h@10:62767e708bb6, 2016-04-22 (annotated)
- Committer:
- Christopher Haster
- Date:
- Fri Apr 22 02:59:41 2016 -0500
- Revision:
- 10:62767e708bb6
- Parent:
- 2:11cda6bead99
- Child:
- 14:5abf2ccf2dbf
Clean mbed namespace from events
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Christopher Haster |
0:b1b901ae3696 | 1 | /* EventQueue |
Christopher Haster |
0:b1b901ae3696 | 2 | * |
Christopher Haster |
0:b1b901ae3696 | 3 | * Flexible queue for managing events |
Christopher Haster |
0:b1b901ae3696 | 4 | */ |
Christopher Haster |
0:b1b901ae3696 | 5 | #ifndef EVENT_QUEUE_H |
Christopher Haster |
0:b1b901ae3696 | 6 | #define EVENT_QUEUE_H |
Christopher Haster |
0:b1b901ae3696 | 7 | |
Christopher Haster |
10:62767e708bb6 | 8 | #include "Timer.h" |
Christopher Haster |
10:62767e708bb6 | 9 | #include "Ticker.h" |
Christopher Haster |
2:11cda6bead99 | 10 | |
Christopher Haster |
0:b1b901ae3696 | 11 | |
Christopher Haster |
0:b1b901ae3696 | 12 | /** Flexible queue for managing events |
Christopher Haster |
0:b1b901ae3696 | 13 | */ |
Christopher Haster |
0:b1b901ae3696 | 14 | class EventQueue { |
Christopher Haster |
0:b1b901ae3696 | 15 | public: |
Christopher Haster |
2:11cda6bead99 | 16 | /** Create an event queue |
Christopher Haster |
2:11cda6bead99 | 17 | */ |
Christopher Haster |
2:11cda6bead99 | 18 | EventQueue(); |
Christopher Haster |
2:11cda6bead99 | 19 | |
Christopher Haster |
0:b1b901ae3696 | 20 | /** Dispatch pending events |
Christopher Haster |
1:2202c19570e5 | 21 | * @param ms Time to wait for events in milliseconds, |
Christopher Haster |
0:b1b901ae3696 | 22 | * 0 indicates to return immediately if no events are pending |
Christopher Haster |
0:b1b901ae3696 | 23 | */ |
Christopher Haster |
1:2202c19570e5 | 24 | void dispatch(int ms=-1); |
Christopher Haster |
0:b1b901ae3696 | 25 | |
Christopher Haster |
2:11cda6bead99 | 26 | /** Get current tick of the event queue |
Christopher Haster |
2:11cda6bead99 | 27 | * @return Number of milliseconds since the queue was instantiated, |
Christopher Haster |
2:11cda6bead99 | 28 | * this count intentionally overflows to 0 after 2^32-1 |
Christopher Haster |
2:11cda6bead99 | 29 | */ |
Christopher Haster |
2:11cda6bead99 | 30 | unsigned get_tick(); |
Christopher Haster |
2:11cda6bead99 | 31 | |
Christopher Haster |
0:b1b901ae3696 | 32 | private: |
Christopher Haster |
0:b1b901ae3696 | 33 | struct event { |
Christopher Haster |
1:2202c19570e5 | 34 | struct event *volatile next; |
Christopher Haster |
2:11cda6bead99 | 35 | unsigned target; |
Christopher Haster |
2:11cda6bead99 | 36 | bool registered; |
Christopher Haster |
2:11cda6bead99 | 37 | |
Christopher Haster |
2:11cda6bead99 | 38 | int delay; |
Christopher Haster |
2:11cda6bead99 | 39 | int period; |
Christopher Haster |
2:11cda6bead99 | 40 | |
Christopher Haster |
0:b1b901ae3696 | 41 | void (*callback)(void *); |
Christopher Haster |
0:b1b901ae3696 | 42 | void *data; |
Christopher Haster |
0:b1b901ae3696 | 43 | }; |
Christopher Haster |
0:b1b901ae3696 | 44 | |
Christopher Haster |
2:11cda6bead99 | 45 | void event_register(struct event *event, int ms); |
Christopher Haster |
0:b1b901ae3696 | 46 | void event_unregister(struct event *event); |
Christopher Haster |
0:b1b901ae3696 | 47 | |
Christopher Haster |
2:11cda6bead99 | 48 | void tick(); |
Christopher Haster |
2:11cda6bead99 | 49 | void wakeup(); |
Christopher Haster |
2:11cda6bead99 | 50 | |
Christopher Haster |
2:11cda6bead99 | 51 | struct event *volatile _queue; |
Christopher Haster |
2:11cda6bead99 | 52 | unsigned _tick; |
Christopher Haster |
2:11cda6bead99 | 53 | mbed::Ticker _ticker; |
Christopher Haster |
2:11cda6bead99 | 54 | mbed::Timer _timer; |
Christopher Haster |
2:11cda6bead99 | 55 | |
Christopher Haster |
0:b1b901ae3696 | 56 | template <typename F> |
Christopher Haster |
0:b1b901ae3696 | 57 | friend class Event; |
Christopher Haster |
0:b1b901ae3696 | 58 | }; |
Christopher Haster |
0:b1b901ae3696 | 59 | |
Christopher Haster |
0:b1b901ae3696 | 60 | |
Christopher Haster |
0:b1b901ae3696 | 61 | #endif |