Note! This project has moved to github.com/armmbed/mbed-events

Dependents:   SimpleHTTPExample

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.

Committer:
Christopher Haster
Date:
Wed Apr 20 14:15:54 2016 -0500
Revision:
2:11cda6bead99
Parent:
1:2202c19570e5
Child:
10:62767e708bb6
Add support for delay/period on events

Who changed what in which revision?

UserRevisionLine numberNew 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 2:11cda6bead99 8 #include "mbed.h"
Christopher Haster 2:11cda6bead99 9
Christopher Haster 0:b1b901ae3696 10
Christopher Haster 0:b1b901ae3696 11 /** Flexible queue for managing events
Christopher Haster 0:b1b901ae3696 12 */
Christopher Haster 0:b1b901ae3696 13 class EventQueue {
Christopher Haster 0:b1b901ae3696 14 public:
Christopher Haster 2:11cda6bead99 15 /** Create an event queue
Christopher Haster 2:11cda6bead99 16 */
Christopher Haster 2:11cda6bead99 17 EventQueue();
Christopher Haster 2:11cda6bead99 18
Christopher Haster 0:b1b901ae3696 19 /** Dispatch pending events
Christopher Haster 1:2202c19570e5 20 * @param ms Time to wait for events in milliseconds,
Christopher Haster 0:b1b901ae3696 21 * 0 indicates to return immediately if no events are pending
Christopher Haster 0:b1b901ae3696 22 */
Christopher Haster 1:2202c19570e5 23 void dispatch(int ms=-1);
Christopher Haster 0:b1b901ae3696 24
Christopher Haster 2:11cda6bead99 25 /** Get current tick of the event queue
Christopher Haster 2:11cda6bead99 26 * @return Number of milliseconds since the queue was instantiated,
Christopher Haster 2:11cda6bead99 27 * this count intentionally overflows to 0 after 2^32-1
Christopher Haster 2:11cda6bead99 28 */
Christopher Haster 2:11cda6bead99 29 unsigned get_tick();
Christopher Haster 2:11cda6bead99 30
Christopher Haster 0:b1b901ae3696 31 private:
Christopher Haster 0:b1b901ae3696 32 struct event {
Christopher Haster 1:2202c19570e5 33 struct event *volatile next;
Christopher Haster 2:11cda6bead99 34 unsigned target;
Christopher Haster 2:11cda6bead99 35 bool registered;
Christopher Haster 2:11cda6bead99 36
Christopher Haster 2:11cda6bead99 37 int delay;
Christopher Haster 2:11cda6bead99 38 int period;
Christopher Haster 2:11cda6bead99 39
Christopher Haster 0:b1b901ae3696 40 void (*callback)(void *);
Christopher Haster 0:b1b901ae3696 41 void *data;
Christopher Haster 0:b1b901ae3696 42 };
Christopher Haster 0:b1b901ae3696 43
Christopher Haster 2:11cda6bead99 44 void event_register(struct event *event, int ms);
Christopher Haster 0:b1b901ae3696 45 void event_unregister(struct event *event);
Christopher Haster 0:b1b901ae3696 46
Christopher Haster 2:11cda6bead99 47 void tick();
Christopher Haster 2:11cda6bead99 48 void wakeup();
Christopher Haster 2:11cda6bead99 49
Christopher Haster 2:11cda6bead99 50 struct event *volatile _queue;
Christopher Haster 2:11cda6bead99 51 unsigned _tick;
Christopher Haster 2:11cda6bead99 52 mbed::Ticker _ticker;
Christopher Haster 2:11cda6bead99 53 mbed::Timer _timer;
Christopher Haster 2:11cda6bead99 54
Christopher Haster 0:b1b901ae3696 55 template <typename F>
Christopher Haster 0:b1b901ae3696 56 friend class Event;
Christopher Haster 0:b1b901ae3696 57 };
Christopher Haster 0:b1b901ae3696 58
Christopher Haster 0:b1b901ae3696 59
Christopher Haster 0:b1b901ae3696 60 #endif