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:
Mon Apr 18 12:51:04 2016 -0500
Revision:
17:6d564266850e
Parent:
16:ff5d48fcce1b
Child:
18:765776145464
Add convenience trigger functions

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 10:62767e708bb6 8 #include "Timer.h"
Christopher Haster 10:62767e708bb6 9 #include "Ticker.h"
Christopher Haster 14:5abf2ccf2dbf 10 #include "FuncPtr.h"
Christopher Haster 14:5abf2ccf2dbf 11 #include "Binder.h"
Christopher Haster 2:11cda6bead99 12
Christopher Haster 0:b1b901ae3696 13
Christopher Haster 0:b1b901ae3696 14 /** Flexible queue for managing events
Christopher Haster 0:b1b901ae3696 15 */
Christopher Haster 0:b1b901ae3696 16 class EventQueue {
Christopher Haster 0:b1b901ae3696 17 public:
Christopher Haster 2:11cda6bead99 18 /** Create an event queue
Christopher Haster 14:5abf2ccf2dbf 19 * @param event_count Number of events to allow enqueueing at once
Christopher Haster 14:5abf2ccf2dbf 20 * @param event_context Max size of arguments passed with an event
Christopher Haster 2:11cda6bead99 21 */
Christopher Haster 14:5abf2ccf2dbf 22 EventQueue(unsigned event_count=32,
Christopher Haster 14:5abf2ccf2dbf 23 unsigned event_context=0);
Christopher Haster 16:ff5d48fcce1b 24
Christopher Haster 16:ff5d48fcce1b 25 /** Clean up event queue
Christopher Haster 16:ff5d48fcce1b 26 */
Christopher Haster 16:ff5d48fcce1b 27 ~EventQueue();
Christopher Haster 2:11cda6bead99 28
Christopher Haster 0:b1b901ae3696 29 /** Dispatch pending events
Christopher Haster 1:2202c19570e5 30 * @param ms Time to wait for events in milliseconds,
Christopher Haster 0:b1b901ae3696 31 * 0 indicates to return immediately if no events are pending
Christopher Haster 0:b1b901ae3696 32 */
Christopher Haster 1:2202c19570e5 33 void dispatch(int ms=-1);
Christopher Haster 0:b1b901ae3696 34
Christopher Haster 2:11cda6bead99 35 /** Get current tick of the event queue
Christopher Haster 2:11cda6bead99 36 * @return Number of milliseconds since the queue was instantiated,
Christopher Haster 2:11cda6bead99 37 * this count intentionally overflows to 0 after 2^32-1
Christopher Haster 2:11cda6bead99 38 */
Christopher Haster 2:11cda6bead99 39 unsigned get_tick();
Christopher Haster 2:11cda6bead99 40
Christopher Haster 16:ff5d48fcce1b 41 /** Determine if tick has been passed
Christopher Haster 16:ff5d48fcce1b 42 * @param Tick to check
Christopher Haster 16:ff5d48fcce1b 43 * @param True if tick has been passed
Christopher Haster 16:ff5d48fcce1b 44 */
Christopher Haster 16:ff5d48fcce1b 45 bool past_tick(unsigned tick);
Christopher Haster 16:ff5d48fcce1b 46
Christopher Haster 0:b1b901ae3696 47 private:
Christopher Haster 0:b1b901ae3696 48 struct event {
Christopher Haster 1:2202c19570e5 49 struct event *volatile next;
Christopher Haster 2:11cda6bead99 50 unsigned target;
Christopher Haster 2:11cda6bead99 51 int period;
Christopher Haster 2:11cda6bead99 52
Christopher Haster 14:5abf2ccf2dbf 53 void (*dispatch)(void *p);
Christopher Haster 14:5abf2ccf2dbf 54 // data follows
Christopher Haster 0:b1b901ae3696 55 };
Christopher Haster 0:b1b901ae3696 56
Christopher Haster 17:6d564266850e 57 struct event *event_alloc(unsigned size, int ms=-1);
Christopher Haster 17:6d564266850e 58 void event_dealloc(struct event *);
Christopher Haster 14:5abf2ccf2dbf 59
Christopher Haster 17:6d564266850e 60 void event_trigger(struct event *e, int delay);
Christopher Haster 14:5abf2ccf2dbf 61
Christopher Haster 14:5abf2ccf2dbf 62 template <typename F>
Christopher Haster 17:6d564266850e 63 bool event_trigger(F func, int delay, int period, int tolerance, int ms=-1) {
Christopher Haster 17:6d564266850e 64 struct event *e = event_alloc(sizeof(F), ms);
Christopher Haster 14:5abf2ccf2dbf 65 if (!e) {
Christopher Haster 14:5abf2ccf2dbf 66 return false;
Christopher Haster 14:5abf2ccf2dbf 67 }
Christopher Haster 14:5abf2ccf2dbf 68
Christopher Haster 14:5abf2ccf2dbf 69 e->period = period;
Christopher Haster 14:5abf2ccf2dbf 70 (void)tolerance; // unused
Christopher Haster 14:5abf2ccf2dbf 71 e->dispatch = &F::thunk;
Christopher Haster 14:5abf2ccf2dbf 72 *reinterpret_cast<F*>(e+1) = func;
Christopher Haster 14:5abf2ccf2dbf 73
Christopher Haster 17:6d564266850e 74 event_trigger(e, delay);
Christopher Haster 14:5abf2ccf2dbf 75 return true;
Christopher Haster 14:5abf2ccf2dbf 76 }
Christopher Haster 0:b1b901ae3696 77
Christopher Haster 2:11cda6bead99 78 void tick();
Christopher Haster 2:11cda6bead99 79
Christopher Haster 14:5abf2ccf2dbf 80 unsigned _event_context;
Christopher Haster 16:ff5d48fcce1b 81 void *_mem;
Christopher Haster 16:ff5d48fcce1b 82 struct event *volatile _free;
Christopher Haster 2:11cda6bead99 83 struct event *volatile _queue;
Christopher Haster 14:5abf2ccf2dbf 84
Christopher Haster 2:11cda6bead99 85 unsigned _tick;
Christopher Haster 2:11cda6bead99 86 mbed::Ticker _ticker;
Christopher Haster 2:11cda6bead99 87 mbed::Timer _timer;
Christopher Haster 2:11cda6bead99 88
Christopher Haster 0:b1b901ae3696 89 template <typename F>
Christopher Haster 0:b1b901ae3696 90 friend class Event;
Christopher Haster 17:6d564266850e 91
Christopher Haster 17:6d564266850e 92 public:
Christopher Haster 17:6d564266850e 93 // An event loop provides three additional convenience functions
Christopher Haster 17:6d564266850e 94 // trigger - Immediately post an event to the queue
Christopher Haster 17:6d564266850e 95 // trigger_in - Post an event after a specified time in milliseconds
Christopher Haster 17:6d564266850e 96 // trigger_every - Post an event periodically in milliseconds
Christopher Haster 17:6d564266850e 97 //
Christopher Haster 17:6d564266850e 98 // Unfortunately, the lack of converting constructors in
Christopher Haster 17:6d564266850e 99 // template functions combined with a lack of variadic
Christopher Haster 17:6d564266850e 100 // templates requires 18 declarations for each function
Christopher Haster 17:6d564266850e 101
Christopher Haster 17:6d564266850e 102 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 103 template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 104 bool trigger(F func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Christopher Haster 17:6d564266850e 105 return event_trigger(Binder<void(A0,A1,A2,A3,A4),A0,A1,A2,A3,A4>(func,a0,a1,a2,a3,a4), 0, -1, 0);
Christopher Haster 17:6d564266850e 106 }
Christopher Haster 17:6d564266850e 107
Christopher Haster 17:6d564266850e 108 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 109 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 110 bool trigger(T *obj, void (*func)(T*,A0,A1,A2,A3,A4), A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Christopher Haster 17:6d564266850e 111 return trigger(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4);
Christopher Haster 17:6d564266850e 112 }
Christopher Haster 17:6d564266850e 113
Christopher Haster 17:6d564266850e 114 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 115 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 116 bool trigger(T *obj, void (T::*func)(A0,A1,A2,A3,A4), A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Christopher Haster 17:6d564266850e 117 return trigger(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4);
Christopher Haster 17:6d564266850e 118 }
Christopher Haster 17:6d564266850e 119
Christopher Haster 17:6d564266850e 120 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 121 template <typename F, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 122 bool trigger(F func, A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 17:6d564266850e 123 return event_trigger(Binder<void(A0,A1,A2,A3),A0,A1,A2,A3>(func,a0,a1,a2,a3), 0, -1, 0);
Christopher Haster 17:6d564266850e 124 }
Christopher Haster 17:6d564266850e 125
Christopher Haster 17:6d564266850e 126 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 127 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 128 bool trigger(T *obj, void (*func)(T*,A0,A1,A2,A3), A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 17:6d564266850e 129 return trigger(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3);
Christopher Haster 17:6d564266850e 130 }
Christopher Haster 17:6d564266850e 131
Christopher Haster 17:6d564266850e 132 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 133 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 134 bool trigger(T *obj, void (T::*func)(A0,A1,A2,A3), A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 17:6d564266850e 135 return trigger(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3);
Christopher Haster 17:6d564266850e 136 }
Christopher Haster 17:6d564266850e 137
Christopher Haster 17:6d564266850e 138 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 139 template <typename F, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 140 bool trigger(F func, A0 a0, A1 a1, A2 a2) {
Christopher Haster 17:6d564266850e 141 return event_trigger(Binder<void(A0,A1,A2),A0,A1,A2>(func,a0,a1,a2), 0, -1, 0);
Christopher Haster 17:6d564266850e 142 }
Christopher Haster 17:6d564266850e 143
Christopher Haster 17:6d564266850e 144 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 145 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 146 bool trigger(T *obj, void (*func)(T*,A0,A1,A2), A0 a0, A1 a1, A2 a2) {
Christopher Haster 17:6d564266850e 147 return trigger(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2);
Christopher Haster 17:6d564266850e 148 }
Christopher Haster 17:6d564266850e 149
Christopher Haster 17:6d564266850e 150 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 151 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 152 bool trigger(T *obj, void (T::*func)(A0,A1,A2), A0 a0, A1 a1, A2 a2) {
Christopher Haster 17:6d564266850e 153 return trigger(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2);
Christopher Haster 17:6d564266850e 154 }
Christopher Haster 17:6d564266850e 155
Christopher Haster 17:6d564266850e 156 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 157 template <typename F, typename A0, typename A1>
Christopher Haster 17:6d564266850e 158 bool trigger(F func, A0 a0, A1 a1) {
Christopher Haster 17:6d564266850e 159 return event_trigger(Binder<void(A0,A1),A0,A1>(func,a0,a1), 0, -1, 0);
Christopher Haster 17:6d564266850e 160 }
Christopher Haster 17:6d564266850e 161
Christopher Haster 17:6d564266850e 162 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 163 template <typename T, typename A0, typename A1>
Christopher Haster 17:6d564266850e 164 bool trigger(T *obj, void (*func)(T*,A0,A1), A0 a0, A1 a1) {
Christopher Haster 17:6d564266850e 165 return trigger(FuncPtr<void(A0,A1)>(obj,func),a0,a1);
Christopher Haster 17:6d564266850e 166 }
Christopher Haster 17:6d564266850e 167
Christopher Haster 17:6d564266850e 168 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 169 template <typename T, typename A0, typename A1>
Christopher Haster 17:6d564266850e 170 bool trigger(T *obj, void (T::*func)(A0,A1), A0 a0, A1 a1) {
Christopher Haster 17:6d564266850e 171 return trigger(FuncPtr<void(A0,A1)>(obj,func),a0,a1);
Christopher Haster 17:6d564266850e 172 }
Christopher Haster 17:6d564266850e 173
Christopher Haster 17:6d564266850e 174 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 175 template <typename F, typename A0>
Christopher Haster 17:6d564266850e 176 bool trigger(F func, A0 a0) {
Christopher Haster 17:6d564266850e 177 return event_trigger(Binder<void(A0),A0>(func,a0), 0, -1, 0);
Christopher Haster 17:6d564266850e 178 }
Christopher Haster 17:6d564266850e 179
Christopher Haster 17:6d564266850e 180 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 181 template <typename T, typename A0>
Christopher Haster 17:6d564266850e 182 bool trigger(T *obj, void (*func)(T*,A0), A0 a0) {
Christopher Haster 17:6d564266850e 183 return trigger(FuncPtr<void(A0)>(obj,func),a0);
Christopher Haster 17:6d564266850e 184 }
Christopher Haster 17:6d564266850e 185
Christopher Haster 17:6d564266850e 186 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 187 template <typename T, typename A0>
Christopher Haster 17:6d564266850e 188 bool trigger(T *obj, void (T::*func)(A0), A0 a0) {
Christopher Haster 17:6d564266850e 189 return trigger(FuncPtr<void(A0)>(obj,func),a0);
Christopher Haster 17:6d564266850e 190 }
Christopher Haster 17:6d564266850e 191
Christopher Haster 17:6d564266850e 192 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 193 template <typename F>
Christopher Haster 17:6d564266850e 194 bool trigger(F func) {
Christopher Haster 17:6d564266850e 195 return event_trigger(Binder<void()>(func), 0, -1, 0);
Christopher Haster 17:6d564266850e 196 }
Christopher Haster 17:6d564266850e 197
Christopher Haster 17:6d564266850e 198 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 199 template <typename T>
Christopher Haster 17:6d564266850e 200 bool trigger(T *obj, void (*func)(T*)) {
Christopher Haster 17:6d564266850e 201 return trigger(FuncPtr<void()>(obj,func));
Christopher Haster 17:6d564266850e 202 }
Christopher Haster 17:6d564266850e 203
Christopher Haster 17:6d564266850e 204 /** Immediately post an event to the queue */
Christopher Haster 17:6d564266850e 205 template <typename T>
Christopher Haster 17:6d564266850e 206 bool trigger(T *obj, void (T::*func)()) {
Christopher Haster 17:6d564266850e 207 return trigger(FuncPtr<void()>(obj,func));
Christopher Haster 17:6d564266850e 208 }
Christopher Haster 17:6d564266850e 209
Christopher Haster 17:6d564266850e 210 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 211 template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 212 bool trigger_in(F func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, int ms=-1) {
Christopher Haster 17:6d564266850e 213 return event_trigger(Binder<void(A0,A1,A2,A3,A4),A0,A1,A2,A3,A4>(func,a0,a1,a2,a3,a4), ms, -1, 0);
Christopher Haster 17:6d564266850e 214 }
Christopher Haster 17:6d564266850e 215
Christopher Haster 17:6d564266850e 216 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 217 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 218 bool trigger_in(T *obj, void (*func)(T*,A0,A1,A2,A3,A4), A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, int ms=-1) {
Christopher Haster 17:6d564266850e 219 return trigger_in(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4,ms);
Christopher Haster 17:6d564266850e 220 }
Christopher Haster 17:6d564266850e 221
Christopher Haster 17:6d564266850e 222 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 223 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 224 bool trigger_in(T *obj, void (T::*func)(A0,A1,A2,A3,A4), A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, int ms=-1) {
Christopher Haster 17:6d564266850e 225 return trigger_in(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4,ms);
Christopher Haster 17:6d564266850e 226 }
Christopher Haster 17:6d564266850e 227
Christopher Haster 17:6d564266850e 228 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 229 template <typename F, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 230 bool trigger_in(F func, A0 a0, A1 a1, A2 a2, A3 a3, int ms=-1) {
Christopher Haster 17:6d564266850e 231 return event_trigger(Binder<void(A0,A1,A2,A3),A0,A1,A2,A3>(func,a0,a1,a2,a3), ms, -1, 0);
Christopher Haster 17:6d564266850e 232 }
Christopher Haster 17:6d564266850e 233
Christopher Haster 17:6d564266850e 234 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 235 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 236 bool trigger_in(T *obj, void (*func)(T*,A0,A1,A2,A3), A0 a0, A1 a1, A2 a2, A3 a3, int ms=-1) {
Christopher Haster 17:6d564266850e 237 return trigger_in(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3,ms);
Christopher Haster 17:6d564266850e 238 }
Christopher Haster 17:6d564266850e 239
Christopher Haster 17:6d564266850e 240 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 241 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 242 bool trigger_in(T *obj, void (T::*func)(A0,A1,A2,A3), A0 a0, A1 a1, A2 a2, A3 a3, int ms=-1) {
Christopher Haster 17:6d564266850e 243 return trigger_in(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3,ms);
Christopher Haster 17:6d564266850e 244 }
Christopher Haster 17:6d564266850e 245
Christopher Haster 17:6d564266850e 246 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 247 template <typename F, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 248 bool trigger_in(F func, A0 a0, A1 a1, A2 a2, int ms=-1) {
Christopher Haster 17:6d564266850e 249 return event_trigger(Binder<void(A0,A1,A2),A0,A1,A2>(func,a0,a1,a2), ms, -1, 0);
Christopher Haster 17:6d564266850e 250 }
Christopher Haster 17:6d564266850e 251
Christopher Haster 17:6d564266850e 252 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 253 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 254 bool trigger_in(T *obj, void (*func)(T*,A0,A1,A2), A0 a0, A1 a1, A2 a2, int ms=-1) {
Christopher Haster 17:6d564266850e 255 return trigger_in(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2,ms);
Christopher Haster 17:6d564266850e 256 }
Christopher Haster 17:6d564266850e 257
Christopher Haster 17:6d564266850e 258 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 259 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 260 bool trigger_in(T *obj, void (T::*func)(A0,A1,A2), A0 a0, A1 a1, A2 a2, int ms=-1) {
Christopher Haster 17:6d564266850e 261 return trigger_in(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2,ms);
Christopher Haster 17:6d564266850e 262 }
Christopher Haster 17:6d564266850e 263
Christopher Haster 17:6d564266850e 264 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 265 template <typename F, typename A0, typename A1>
Christopher Haster 17:6d564266850e 266 bool trigger_in(F func, A0 a0, A1 a1, int ms=-1) {
Christopher Haster 17:6d564266850e 267 return event_trigger(Binder<void(A0,A1),A0,A1>(func,a0,a1), ms, -1, 0);
Christopher Haster 17:6d564266850e 268 }
Christopher Haster 17:6d564266850e 269
Christopher Haster 17:6d564266850e 270 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 271 template <typename T, typename A0, typename A1>
Christopher Haster 17:6d564266850e 272 bool trigger_in(T *obj, void (*func)(T*,A0,A1), A0 a0, A1 a1, int ms=-1) {
Christopher Haster 17:6d564266850e 273 return trigger_in(FuncPtr<void(A0,A1)>(obj,func),a0,a1,ms);
Christopher Haster 17:6d564266850e 274 }
Christopher Haster 17:6d564266850e 275
Christopher Haster 17:6d564266850e 276 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 277 template <typename T, typename A0, typename A1>
Christopher Haster 17:6d564266850e 278 bool trigger_in(T *obj, void (T::*func)(A0,A1), A0 a0, A1 a1, int ms=-1) {
Christopher Haster 17:6d564266850e 279 return trigger_in(FuncPtr<void(A0,A1)>(obj,func),a0,a1,ms);
Christopher Haster 17:6d564266850e 280 }
Christopher Haster 17:6d564266850e 281
Christopher Haster 17:6d564266850e 282 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 283 template <typename F, typename A0>
Christopher Haster 17:6d564266850e 284 bool trigger_in(F func, A0 a0, int ms=-1) {
Christopher Haster 17:6d564266850e 285 return event_trigger(Binder<void(A0),A0>(func,a0), ms, -1, 0);
Christopher Haster 17:6d564266850e 286 }
Christopher Haster 17:6d564266850e 287
Christopher Haster 17:6d564266850e 288 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 289 template <typename T, typename A0>
Christopher Haster 17:6d564266850e 290 bool trigger_in(T *obj, void (*func)(T*,A0), A0 a0, int ms=-1) {
Christopher Haster 17:6d564266850e 291 return trigger_in(FuncPtr<void(A0)>(obj,func),a0,ms);
Christopher Haster 17:6d564266850e 292 }
Christopher Haster 17:6d564266850e 293
Christopher Haster 17:6d564266850e 294 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 295 template <typename T, typename A0>
Christopher Haster 17:6d564266850e 296 bool trigger_in(T *obj, void (T::*func)(A0), A0 a0, int ms=-1) {
Christopher Haster 17:6d564266850e 297 return trigger_in(FuncPtr<void(A0)>(obj,func),a0,ms);
Christopher Haster 17:6d564266850e 298 }
Christopher Haster 17:6d564266850e 299
Christopher Haster 17:6d564266850e 300 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 301 template <typename F>
Christopher Haster 17:6d564266850e 302 bool trigger_in(F func, int ms=-1) {
Christopher Haster 17:6d564266850e 303 return event_trigger(Binder<void()>(func), ms, -1, 0);
Christopher Haster 17:6d564266850e 304 }
Christopher Haster 17:6d564266850e 305
Christopher Haster 17:6d564266850e 306 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 307 template <typename T>
Christopher Haster 17:6d564266850e 308 bool trigger_in(T *obj, void (*func)(T*), int ms=-1) {
Christopher Haster 17:6d564266850e 309 return trigger_in(FuncPtr<void()>(obj,func),ms);
Christopher Haster 17:6d564266850e 310 }
Christopher Haster 17:6d564266850e 311
Christopher Haster 17:6d564266850e 312 /** Post an event after a specified time in milliseconds */
Christopher Haster 17:6d564266850e 313 template <typename T>
Christopher Haster 17:6d564266850e 314 bool trigger_in(T *obj, void (T::*func)(), int ms=-1) {
Christopher Haster 17:6d564266850e 315 return trigger_in(FuncPtr<void()>(obj,func),ms);
Christopher Haster 17:6d564266850e 316 }
Christopher Haster 17:6d564266850e 317
Christopher Haster 17:6d564266850e 318 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 319 template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 320 bool trigger_every(F func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, int ms=-1) {
Christopher Haster 17:6d564266850e 321 return event_trigger(Binder<void(A0,A1,A2,A3,A4),A0,A1,A2,A3,A4>(func,a0,a1,a2,a3,a4), 0, ms, 0);
Christopher Haster 17:6d564266850e 322 }
Christopher Haster 17:6d564266850e 323
Christopher Haster 17:6d564266850e 324 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 325 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 326 bool trigger_every(T *obj, void (*func)(T*,A0,A1,A2,A3,A4), A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, int ms=-1) {
Christopher Haster 17:6d564266850e 327 return trigger_every(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4,ms);
Christopher Haster 17:6d564266850e 328 }
Christopher Haster 17:6d564266850e 329
Christopher Haster 17:6d564266850e 330 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 331 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 332 bool trigger_every(T *obj, void (T::*func)(A0,A1,A2,A3,A4), A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, int ms=-1) {
Christopher Haster 17:6d564266850e 333 return trigger_every(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4,ms);
Christopher Haster 17:6d564266850e 334 }
Christopher Haster 17:6d564266850e 335
Christopher Haster 17:6d564266850e 336 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 337 template <typename F, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 338 bool trigger_every(F func, A0 a0, A1 a1, A2 a2, A3 a3, int ms=-1) {
Christopher Haster 17:6d564266850e 339 return event_trigger(Binder<void(A0,A1,A2,A3),A0,A1,A2,A3>(func,a0,a1,a2,a3), 0, ms, 0);
Christopher Haster 17:6d564266850e 340 }
Christopher Haster 17:6d564266850e 341
Christopher Haster 17:6d564266850e 342 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 343 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 344 bool trigger_every(T *obj, void (*func)(T*,A0,A1,A2,A3), A0 a0, A1 a1, A2 a2, A3 a3, int ms=-1) {
Christopher Haster 17:6d564266850e 345 return trigger_every(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3,ms);
Christopher Haster 17:6d564266850e 346 }
Christopher Haster 17:6d564266850e 347
Christopher Haster 17:6d564266850e 348 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 349 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 350 bool trigger_every(T *obj, void (T::*func)(A0,A1,A2,A3), A0 a0, A1 a1, A2 a2, A3 a3, int ms=-1) {
Christopher Haster 17:6d564266850e 351 return trigger_every(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3,ms);
Christopher Haster 17:6d564266850e 352 }
Christopher Haster 17:6d564266850e 353
Christopher Haster 17:6d564266850e 354 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 355 template <typename F, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 356 bool trigger_every(F func, A0 a0, A1 a1, A2 a2, int ms=-1) {
Christopher Haster 17:6d564266850e 357 return event_trigger(Binder<void(A0,A1,A2),A0,A1,A2>(func,a0,a1,a2), 0, ms, 0);
Christopher Haster 17:6d564266850e 358 }
Christopher Haster 17:6d564266850e 359
Christopher Haster 17:6d564266850e 360 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 361 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 362 bool trigger_every(T *obj, void (*func)(T*,A0,A1,A2), A0 a0, A1 a1, A2 a2, int ms=-1) {
Christopher Haster 17:6d564266850e 363 return trigger_every(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2,ms);
Christopher Haster 17:6d564266850e 364 }
Christopher Haster 17:6d564266850e 365
Christopher Haster 17:6d564266850e 366 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 367 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 368 bool trigger_every(T *obj, void (T::*func)(A0,A1,A2), A0 a0, A1 a1, A2 a2, int ms=-1) {
Christopher Haster 17:6d564266850e 369 return trigger_every(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2,ms);
Christopher Haster 17:6d564266850e 370 }
Christopher Haster 17:6d564266850e 371
Christopher Haster 17:6d564266850e 372 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 373 template <typename F, typename A0, typename A1>
Christopher Haster 17:6d564266850e 374 bool trigger_every(F func, A0 a0, A1 a1, int ms=-1) {
Christopher Haster 17:6d564266850e 375 return event_trigger(Binder<void(A0,A1),A0,A1>(func,a0,a1), 0, ms, 0);
Christopher Haster 17:6d564266850e 376 }
Christopher Haster 17:6d564266850e 377
Christopher Haster 17:6d564266850e 378 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 379 template <typename T, typename A0, typename A1>
Christopher Haster 17:6d564266850e 380 bool trigger_every(T *obj, void (*func)(T*,A0,A1), A0 a0, A1 a1, int ms=-1) {
Christopher Haster 17:6d564266850e 381 return trigger_every(FuncPtr<void(A0,A1)>(obj,func),a0,a1,ms);
Christopher Haster 17:6d564266850e 382 }
Christopher Haster 17:6d564266850e 383
Christopher Haster 17:6d564266850e 384 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 385 template <typename T, typename A0, typename A1>
Christopher Haster 17:6d564266850e 386 bool trigger_every(T *obj, void (T::*func)(A0,A1), A0 a0, A1 a1, int ms=-1) {
Christopher Haster 17:6d564266850e 387 return trigger_every(FuncPtr<void(A0,A1)>(obj,func),a0,a1,ms);
Christopher Haster 17:6d564266850e 388 }
Christopher Haster 17:6d564266850e 389
Christopher Haster 17:6d564266850e 390 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 391 template <typename F, typename A0>
Christopher Haster 17:6d564266850e 392 bool trigger_every(F func, A0 a0, int ms=-1) {
Christopher Haster 17:6d564266850e 393 return event_trigger(Binder<void(A0),A0>(func,a0), 0, ms, 0);
Christopher Haster 17:6d564266850e 394 }
Christopher Haster 17:6d564266850e 395
Christopher Haster 17:6d564266850e 396 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 397 template <typename T, typename A0>
Christopher Haster 17:6d564266850e 398 bool trigger_every(T *obj, void (*func)(T*,A0), A0 a0, int ms=-1) {
Christopher Haster 17:6d564266850e 399 return trigger_every(FuncPtr<void(A0)>(obj,func),a0,ms);
Christopher Haster 17:6d564266850e 400 }
Christopher Haster 17:6d564266850e 401
Christopher Haster 17:6d564266850e 402 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 403 template <typename T, typename A0>
Christopher Haster 17:6d564266850e 404 bool trigger_every(T *obj, void (T::*func)(A0), A0 a0, int ms=-1) {
Christopher Haster 17:6d564266850e 405 return trigger_every(FuncPtr<void(A0)>(obj,func),a0,ms);
Christopher Haster 17:6d564266850e 406 }
Christopher Haster 17:6d564266850e 407
Christopher Haster 17:6d564266850e 408 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 409 template <typename F>
Christopher Haster 17:6d564266850e 410 bool trigger_every(F func, int ms=-1) {
Christopher Haster 17:6d564266850e 411 return event_trigger(Binder<void()>(func), 0, ms, 0);
Christopher Haster 17:6d564266850e 412 }
Christopher Haster 17:6d564266850e 413
Christopher Haster 17:6d564266850e 414 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 415 template <typename T>
Christopher Haster 17:6d564266850e 416 bool trigger_every(T *obj, void (*func)(T*), int ms=-1) {
Christopher Haster 17:6d564266850e 417 return trigger_every(FuncPtr<void()>(obj,func),ms);
Christopher Haster 17:6d564266850e 418 }
Christopher Haster 17:6d564266850e 419
Christopher Haster 17:6d564266850e 420 /** Post an event periodically in milliseconds */
Christopher Haster 17:6d564266850e 421 template <typename T>
Christopher Haster 17:6d564266850e 422 bool trigger_every(T *obj, void (T::*func)(), int ms=-1) {
Christopher Haster 17:6d564266850e 423 return trigger_every(FuncPtr<void()>(obj,func),ms);
Christopher Haster 17:6d564266850e 424 }
Christopher Haster 0:b1b901ae3696 425 };
Christopher Haster 0:b1b901ae3696 426
Christopher Haster 0:b1b901ae3696 427
Christopher Haster 0:b1b901ae3696 428 #endif