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:59:37 2016 -0500
Revision:
19:86ffaa34870b
Parent:
18:765776145464
Child:
20:2f9d9c53a5af
Remove nonsensical defaults

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 18:765776145464 102 /** Immediately post an event to the queue
Christopher Haster 18:765776145464 103 */
Christopher Haster 17:6d564266850e 104 template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 105 bool trigger(F func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Christopher Haster 17:6d564266850e 106 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 107 }
Christopher Haster 17:6d564266850e 108
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 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 17:6d564266850e 115 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 116 return trigger(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4);
Christopher Haster 17:6d564266850e 117 }
Christopher Haster 17:6d564266850e 118
Christopher Haster 18:765776145464 119 /** Immediately post an event to the queue
Christopher Haster 18:765776145464 120 */
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 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 127 bool trigger(T *obj, void (*func)(T*,A0,A1,A2,A3), A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 17:6d564266850e 128 return trigger(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3);
Christopher Haster 17:6d564266850e 129 }
Christopher Haster 17:6d564266850e 130
Christopher Haster 17:6d564266850e 131 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 17:6d564266850e 132 bool trigger(T *obj, void (T::*func)(A0,A1,A2,A3), A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 17:6d564266850e 133 return trigger(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3);
Christopher Haster 17:6d564266850e 134 }
Christopher Haster 17:6d564266850e 135
Christopher Haster 18:765776145464 136 /** Immediately post an event to the queue
Christopher Haster 18:765776145464 137 */
Christopher Haster 17:6d564266850e 138 template <typename F, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 139 bool trigger(F func, A0 a0, A1 a1, A2 a2) {
Christopher Haster 17:6d564266850e 140 return event_trigger(Binder<void(A0,A1,A2),A0,A1,A2>(func,a0,a1,a2), 0, -1, 0);
Christopher Haster 17:6d564266850e 141 }
Christopher Haster 17:6d564266850e 142
Christopher Haster 17:6d564266850e 143 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 144 bool trigger(T *obj, void (*func)(T*,A0,A1,A2), A0 a0, A1 a1, A2 a2) {
Christopher Haster 17:6d564266850e 145 return trigger(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2);
Christopher Haster 17:6d564266850e 146 }
Christopher Haster 17:6d564266850e 147
Christopher Haster 17:6d564266850e 148 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 17:6d564266850e 149 bool trigger(T *obj, void (T::*func)(A0,A1,A2), A0 a0, A1 a1, A2 a2) {
Christopher Haster 17:6d564266850e 150 return trigger(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2);
Christopher Haster 17:6d564266850e 151 }
Christopher Haster 17:6d564266850e 152
Christopher Haster 18:765776145464 153 /** Immediately post an event to the queue
Christopher Haster 18:765776145464 154 */
Christopher Haster 17:6d564266850e 155 template <typename F, typename A0, typename A1>
Christopher Haster 17:6d564266850e 156 bool trigger(F func, A0 a0, A1 a1) {
Christopher Haster 17:6d564266850e 157 return event_trigger(Binder<void(A0,A1),A0,A1>(func,a0,a1), 0, -1, 0);
Christopher Haster 17:6d564266850e 158 }
Christopher Haster 17:6d564266850e 159
Christopher Haster 17:6d564266850e 160 template <typename T, typename A0, typename A1>
Christopher Haster 17:6d564266850e 161 bool trigger(T *obj, void (*func)(T*,A0,A1), A0 a0, A1 a1) {
Christopher Haster 17:6d564266850e 162 return trigger(FuncPtr<void(A0,A1)>(obj,func),a0,a1);
Christopher Haster 17:6d564266850e 163 }
Christopher Haster 17:6d564266850e 164
Christopher Haster 17:6d564266850e 165 template <typename T, typename A0, typename A1>
Christopher Haster 17:6d564266850e 166 bool trigger(T *obj, void (T::*func)(A0,A1), A0 a0, A1 a1) {
Christopher Haster 17:6d564266850e 167 return trigger(FuncPtr<void(A0,A1)>(obj,func),a0,a1);
Christopher Haster 17:6d564266850e 168 }
Christopher Haster 17:6d564266850e 169
Christopher Haster 18:765776145464 170 /** Immediately post an event to the queue
Christopher Haster 18:765776145464 171 */
Christopher Haster 17:6d564266850e 172 template <typename F, typename A0>
Christopher Haster 17:6d564266850e 173 bool trigger(F func, A0 a0) {
Christopher Haster 17:6d564266850e 174 return event_trigger(Binder<void(A0),A0>(func,a0), 0, -1, 0);
Christopher Haster 17:6d564266850e 175 }
Christopher Haster 17:6d564266850e 176
Christopher Haster 17:6d564266850e 177 template <typename T, typename A0>
Christopher Haster 17:6d564266850e 178 bool trigger(T *obj, void (*func)(T*,A0), A0 a0) {
Christopher Haster 17:6d564266850e 179 return trigger(FuncPtr<void(A0)>(obj,func),a0);
Christopher Haster 17:6d564266850e 180 }
Christopher Haster 17:6d564266850e 181
Christopher Haster 17:6d564266850e 182 template <typename T, typename A0>
Christopher Haster 17:6d564266850e 183 bool trigger(T *obj, void (T::*func)(A0), A0 a0) {
Christopher Haster 17:6d564266850e 184 return trigger(FuncPtr<void(A0)>(obj,func),a0);
Christopher Haster 17:6d564266850e 185 }
Christopher Haster 17:6d564266850e 186
Christopher Haster 18:765776145464 187 /** Immediately post an event to the queue
Christopher Haster 18:765776145464 188 */
Christopher Haster 17:6d564266850e 189 template <typename F>
Christopher Haster 17:6d564266850e 190 bool trigger(F func) {
Christopher Haster 17:6d564266850e 191 return event_trigger(Binder<void()>(func), 0, -1, 0);
Christopher Haster 17:6d564266850e 192 }
Christopher Haster 17:6d564266850e 193
Christopher Haster 17:6d564266850e 194 template <typename T>
Christopher Haster 17:6d564266850e 195 bool trigger(T *obj, void (*func)(T*)) {
Christopher Haster 17:6d564266850e 196 return trigger(FuncPtr<void()>(obj,func));
Christopher Haster 17:6d564266850e 197 }
Christopher Haster 17:6d564266850e 198
Christopher Haster 17:6d564266850e 199 template <typename T>
Christopher Haster 17:6d564266850e 200 bool trigger(T *obj, void (T::*func)()) {
Christopher Haster 17:6d564266850e 201 return trigger(FuncPtr<void()>(obj,func));
Christopher Haster 17:6d564266850e 202 }
Christopher Haster 17:6d564266850e 203
Christopher Haster 18:765776145464 204 /** Post an event after a specified time
Christopher Haster 18:765776145464 205 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 206 */
Christopher Haster 17:6d564266850e 207 template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 19:86ffaa34870b 208 bool trigger_in(F func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, int ms) {
Christopher Haster 17:6d564266850e 209 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 210 }
Christopher Haster 17:6d564266850e 211
Christopher Haster 17:6d564266850e 212 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 19:86ffaa34870b 213 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 214 return trigger_in(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4,ms);
Christopher Haster 17:6d564266850e 215 }
Christopher Haster 17:6d564266850e 216
Christopher Haster 17:6d564266850e 217 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 19:86ffaa34870b 218 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 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 18:765776145464 222 /** Post an event after a specified time
Christopher Haster 18:765776145464 223 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 224 */
Christopher Haster 17:6d564266850e 225 template <typename F, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 19:86ffaa34870b 226 bool trigger_in(F func, A0 a0, A1 a1, A2 a2, A3 a3, int ms) {
Christopher Haster 17:6d564266850e 227 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 228 }
Christopher Haster 17:6d564266850e 229
Christopher Haster 17:6d564266850e 230 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 19:86ffaa34870b 231 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 232 return trigger_in(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3,ms);
Christopher Haster 17:6d564266850e 233 }
Christopher Haster 17:6d564266850e 234
Christopher Haster 17:6d564266850e 235 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 19:86ffaa34870b 236 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 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 18:765776145464 240 /** Post an event after a specified time
Christopher Haster 18:765776145464 241 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 242 */
Christopher Haster 17:6d564266850e 243 template <typename F, typename A0, typename A1, typename A2>
Christopher Haster 19:86ffaa34870b 244 bool trigger_in(F func, A0 a0, A1 a1, A2 a2, int ms) {
Christopher Haster 17:6d564266850e 245 return event_trigger(Binder<void(A0,A1,A2),A0,A1,A2>(func,a0,a1,a2), ms, -1, 0);
Christopher Haster 17:6d564266850e 246 }
Christopher Haster 17:6d564266850e 247
Christopher Haster 17:6d564266850e 248 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 19:86ffaa34870b 249 bool trigger_in(T *obj, void (*func)(T*,A0,A1,A2), A0 a0, A1 a1, A2 a2, int ms) {
Christopher Haster 17:6d564266850e 250 return trigger_in(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2,ms);
Christopher Haster 17:6d564266850e 251 }
Christopher Haster 17:6d564266850e 252
Christopher Haster 17:6d564266850e 253 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 19:86ffaa34870b 254 bool trigger_in(T *obj, void (T::*func)(A0,A1,A2), A0 a0, A1 a1, A2 a2, int ms) {
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 18:765776145464 258 /** Post an event after a specified time
Christopher Haster 18:765776145464 259 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 260 */
Christopher Haster 17:6d564266850e 261 template <typename F, typename A0, typename A1>
Christopher Haster 19:86ffaa34870b 262 bool trigger_in(F func, A0 a0, A1 a1, int ms) {
Christopher Haster 17:6d564266850e 263 return event_trigger(Binder<void(A0,A1),A0,A1>(func,a0,a1), ms, -1, 0);
Christopher Haster 17:6d564266850e 264 }
Christopher Haster 17:6d564266850e 265
Christopher Haster 17:6d564266850e 266 template <typename T, typename A0, typename A1>
Christopher Haster 19:86ffaa34870b 267 bool trigger_in(T *obj, void (*func)(T*,A0,A1), A0 a0, A1 a1, int ms) {
Christopher Haster 17:6d564266850e 268 return trigger_in(FuncPtr<void(A0,A1)>(obj,func),a0,a1,ms);
Christopher Haster 17:6d564266850e 269 }
Christopher Haster 17:6d564266850e 270
Christopher Haster 17:6d564266850e 271 template <typename T, typename A0, typename A1>
Christopher Haster 19:86ffaa34870b 272 bool trigger_in(T *obj, void (T::*func)(A0,A1), A0 a0, A1 a1, int ms) {
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 18:765776145464 276 /** Post an event after a specified time
Christopher Haster 18:765776145464 277 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 278 */
Christopher Haster 17:6d564266850e 279 template <typename F, typename A0>
Christopher Haster 19:86ffaa34870b 280 bool trigger_in(F func, A0 a0, int ms) {
Christopher Haster 17:6d564266850e 281 return event_trigger(Binder<void(A0),A0>(func,a0), ms, -1, 0);
Christopher Haster 17:6d564266850e 282 }
Christopher Haster 17:6d564266850e 283
Christopher Haster 17:6d564266850e 284 template <typename T, typename A0>
Christopher Haster 19:86ffaa34870b 285 bool trigger_in(T *obj, void (*func)(T*,A0), A0 a0, int ms) {
Christopher Haster 17:6d564266850e 286 return trigger_in(FuncPtr<void(A0)>(obj,func),a0,ms);
Christopher Haster 17:6d564266850e 287 }
Christopher Haster 17:6d564266850e 288
Christopher Haster 17:6d564266850e 289 template <typename T, typename A0>
Christopher Haster 19:86ffaa34870b 290 bool trigger_in(T *obj, void (T::*func)(A0), A0 a0, int ms) {
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 18:765776145464 294 /** Post an event after a specified time
Christopher Haster 18:765776145464 295 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 296 */
Christopher Haster 17:6d564266850e 297 template <typename F>
Christopher Haster 19:86ffaa34870b 298 bool trigger_in(F func, int ms) {
Christopher Haster 17:6d564266850e 299 return event_trigger(Binder<void()>(func), ms, -1, 0);
Christopher Haster 17:6d564266850e 300 }
Christopher Haster 17:6d564266850e 301
Christopher Haster 17:6d564266850e 302 template <typename T>
Christopher Haster 19:86ffaa34870b 303 bool trigger_in(T *obj, void (*func)(T*), int ms) {
Christopher Haster 17:6d564266850e 304 return trigger_in(FuncPtr<void()>(obj,func),ms);
Christopher Haster 17:6d564266850e 305 }
Christopher Haster 17:6d564266850e 306
Christopher Haster 17:6d564266850e 307 template <typename T>
Christopher Haster 19:86ffaa34870b 308 bool trigger_in(T *obj, void (T::*func)(), int ms) {
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 18:765776145464 312 /** Post an event periodically
Christopher Haster 18:765776145464 313 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 314 */
Christopher Haster 17:6d564266850e 315 template <typename F, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 19:86ffaa34870b 316 bool trigger_every(F func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, int ms) {
Christopher Haster 17:6d564266850e 317 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 318 }
Christopher Haster 17:6d564266850e 319
Christopher Haster 17:6d564266850e 320 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 19:86ffaa34870b 321 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 322 return trigger_every(FuncPtr<void(A0,A1,A2,A3,A4)>(obj,func),a0,a1,a2,a3,a4,ms);
Christopher Haster 17:6d564266850e 323 }
Christopher Haster 17:6d564266850e 324
Christopher Haster 17:6d564266850e 325 template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 19:86ffaa34870b 326 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 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 18:765776145464 330 /** Post an event periodically
Christopher Haster 18:765776145464 331 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 332 */
Christopher Haster 17:6d564266850e 333 template <typename F, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 19:86ffaa34870b 334 bool trigger_every(F func, A0 a0, A1 a1, A2 a2, A3 a3, int ms) {
Christopher Haster 17:6d564266850e 335 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 336 }
Christopher Haster 17:6d564266850e 337
Christopher Haster 17:6d564266850e 338 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 19:86ffaa34870b 339 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 340 return trigger_every(FuncPtr<void(A0,A1,A2,A3)>(obj,func),a0,a1,a2,a3,ms);
Christopher Haster 17:6d564266850e 341 }
Christopher Haster 17:6d564266850e 342
Christopher Haster 17:6d564266850e 343 template <typename T, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 19:86ffaa34870b 344 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 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 18:765776145464 348 /** Post an event periodically
Christopher Haster 18:765776145464 349 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 350 */
Christopher Haster 17:6d564266850e 351 template <typename F, typename A0, typename A1, typename A2>
Christopher Haster 19:86ffaa34870b 352 bool trigger_every(F func, A0 a0, A1 a1, A2 a2, int ms) {
Christopher Haster 17:6d564266850e 353 return event_trigger(Binder<void(A0,A1,A2),A0,A1,A2>(func,a0,a1,a2), 0, ms, 0);
Christopher Haster 17:6d564266850e 354 }
Christopher Haster 17:6d564266850e 355
Christopher Haster 17:6d564266850e 356 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 19:86ffaa34870b 357 bool trigger_every(T *obj, void (*func)(T*,A0,A1,A2), A0 a0, A1 a1, A2 a2, int ms) {
Christopher Haster 17:6d564266850e 358 return trigger_every(FuncPtr<void(A0,A1,A2)>(obj,func),a0,a1,a2,ms);
Christopher Haster 17:6d564266850e 359 }
Christopher Haster 17:6d564266850e 360
Christopher Haster 17:6d564266850e 361 template <typename T, typename A0, typename A1, typename A2>
Christopher Haster 19:86ffaa34870b 362 bool trigger_every(T *obj, void (T::*func)(A0,A1,A2), A0 a0, A1 a1, A2 a2, int ms) {
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 18:765776145464 366 /** Post an event periodically
Christopher Haster 18:765776145464 367 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 368 */
Christopher Haster 17:6d564266850e 369 template <typename F, typename A0, typename A1>
Christopher Haster 19:86ffaa34870b 370 bool trigger_every(F func, A0 a0, A1 a1, int ms) {
Christopher Haster 17:6d564266850e 371 return event_trigger(Binder<void(A0,A1),A0,A1>(func,a0,a1), 0, ms, 0);
Christopher Haster 17:6d564266850e 372 }
Christopher Haster 17:6d564266850e 373
Christopher Haster 17:6d564266850e 374 template <typename T, typename A0, typename A1>
Christopher Haster 19:86ffaa34870b 375 bool trigger_every(T *obj, void (*func)(T*,A0,A1), A0 a0, A1 a1, int ms) {
Christopher Haster 17:6d564266850e 376 return trigger_every(FuncPtr<void(A0,A1)>(obj,func),a0,a1,ms);
Christopher Haster 17:6d564266850e 377 }
Christopher Haster 17:6d564266850e 378
Christopher Haster 17:6d564266850e 379 template <typename T, typename A0, typename A1>
Christopher Haster 19:86ffaa34870b 380 bool trigger_every(T *obj, void (T::*func)(A0,A1), A0 a0, A1 a1, int ms) {
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 18:765776145464 384 /** Post an event periodically
Christopher Haster 18:765776145464 385 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 386 */
Christopher Haster 17:6d564266850e 387 template <typename F, typename A0>
Christopher Haster 19:86ffaa34870b 388 bool trigger_every(F func, A0 a0, int ms) {
Christopher Haster 17:6d564266850e 389 return event_trigger(Binder<void(A0),A0>(func,a0), 0, ms, 0);
Christopher Haster 17:6d564266850e 390 }
Christopher Haster 17:6d564266850e 391
Christopher Haster 17:6d564266850e 392 template <typename T, typename A0>
Christopher Haster 19:86ffaa34870b 393 bool trigger_every(T *obj, void (*func)(T*,A0), A0 a0, int ms) {
Christopher Haster 17:6d564266850e 394 return trigger_every(FuncPtr<void(A0)>(obj,func),a0,ms);
Christopher Haster 17:6d564266850e 395 }
Christopher Haster 17:6d564266850e 396
Christopher Haster 17:6d564266850e 397 template <typename T, typename A0>
Christopher Haster 19:86ffaa34870b 398 bool trigger_every(T *obj, void (T::*func)(A0), A0 a0, int ms) {
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 18:765776145464 402 /** Post an event periodically
Christopher Haster 18:765776145464 403 * @param ms Delay in milliseconds
Christopher Haster 18:765776145464 404 */
Christopher Haster 17:6d564266850e 405 template <typename F>
Christopher Haster 19:86ffaa34870b 406 bool trigger_every(F func, int ms) {
Christopher Haster 17:6d564266850e 407 return event_trigger(Binder<void()>(func), 0, ms, 0);
Christopher Haster 17:6d564266850e 408 }
Christopher Haster 17:6d564266850e 409
Christopher Haster 17:6d564266850e 410 template <typename T>
Christopher Haster 19:86ffaa34870b 411 bool trigger_every(T *obj, void (*func)(T*), int ms) {
Christopher Haster 17:6d564266850e 412 return trigger_every(FuncPtr<void()>(obj,func),ms);
Christopher Haster 17:6d564266850e 413 }
Christopher Haster 17:6d564266850e 414
Christopher Haster 17:6d564266850e 415 template <typename T>
Christopher Haster 19:86ffaa34870b 416 bool trigger_every(T *obj, void (T::*func)(), int ms) {
Christopher Haster 17:6d564266850e 417 return trigger_every(FuncPtr<void()>(obj,func),ms);
Christopher Haster 17:6d564266850e 418 }
Christopher Haster 0:b1b901ae3696 419 };
Christopher Haster 0:b1b901ae3696 420
Christopher Haster 0:b1b901ae3696 421
Christopher Haster 0:b1b901ae3696 422 #endif