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 13:22:21 2016 -0500
Revision:
20:2f9d9c53a5af
Parent:
19:86ffaa34870b
Add event_pointer argument to avoid memory allocation

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