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:
Sun Apr 17 23:50:50 2016 -0500
Revision:
4:30883e8633b4
Parent:
3:6dccdc36651f
Child:
12:1feb78280125
Increase to 5 args

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 0:b1b901ae3696 1 /* Event
Christopher Haster 0:b1b901ae3696 2 *
Christopher Haster 0:b1b901ae3696 3 * Pendable event
Christopher Haster 0:b1b901ae3696 4 */
Christopher Haster 0:b1b901ae3696 5 #ifndef EVENT_H
Christopher Haster 0:b1b901ae3696 6 #define EVENT_H
Christopher Haster 0:b1b901ae3696 7
Christopher Haster 0:b1b901ae3696 8 #include "EventQueue.h"
Christopher Haster 0:b1b901ae3696 9 #include "FuncPtr.h"
Christopher Haster 0:b1b901ae3696 10 #include "Binder.h"
Christopher Haster 0:b1b901ae3696 11
Christopher Haster 0:b1b901ae3696 12
Christopher Haster 0:b1b901ae3696 13 /** Pendable event class
Christopher Haster 0:b1b901ae3696 14 */
Christopher Haster 0:b1b901ae3696 15 template <typename F>
Christopher Haster 0:b1b901ae3696 16 class Event;
Christopher Haster 0:b1b901ae3696 17
Christopher Haster 0:b1b901ae3696 18 /** Pendable event class
Christopher Haster 0:b1b901ae3696 19 */
Christopher Haster 4:30883e8633b4 20 template <typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 4:30883e8633b4 21 class Event<void(A0, A1, A2, A3, A4)> {
Christopher Haster 4:30883e8633b4 22 public:
Christopher Haster 4:30883e8633b4 23 /** Create an unbound event
Christopher Haster 4:30883e8633b4 24 */
Christopher Haster 4:30883e8633b4 25 Event() {
Christopher Haster 4:30883e8633b4 26 memset(&_event, 0, sizeof _event);
Christopher Haster 4:30883e8633b4 27 _event.delay = 0;
Christopher Haster 4:30883e8633b4 28 _event.period = -1;
Christopher Haster 4:30883e8633b4 29 }
Christopher Haster 4:30883e8633b4 30
Christopher Haster 4:30883e8633b4 31 /** Create an event bound to a queue
Christopher Haster 4:30883e8633b4 32 */
Christopher Haster 4:30883e8633b4 33 Event(EventQueue *queue, FuncPtr<void(A0, A1, A2, A3, A4)> callback) {
Christopher Haster 4:30883e8633b4 34 memset(&_event, 0, sizeof _event);
Christopher Haster 4:30883e8633b4 35 _event.delay = 0;
Christopher Haster 4:30883e8633b4 36 _event.period = -1;
Christopher Haster 4:30883e8633b4 37 attach(queue, callback);
Christopher Haster 4:30883e8633b4 38 }
Christopher Haster 4:30883e8633b4 39
Christopher Haster 4:30883e8633b4 40 /** Create an event bound to a queue
Christopher Haster 4:30883e8633b4 41 */
Christopher Haster 4:30883e8633b4 42 template <typename T, typename M>
Christopher Haster 4:30883e8633b4 43 Event(EventQueue *queue, T *obj, M method) {
Christopher Haster 4:30883e8633b4 44 memset(&_event, 0, sizeof _event);
Christopher Haster 4:30883e8633b4 45 _event.delay = 0;
Christopher Haster 4:30883e8633b4 46 _event.period = -1;
Christopher Haster 4:30883e8633b4 47 attach(queue, obj, method);
Christopher Haster 4:30883e8633b4 48 }
Christopher Haster 4:30883e8633b4 49
Christopher Haster 4:30883e8633b4 50 /** Safe lifetime management
Christopher Haster 4:30883e8633b4 51 */
Christopher Haster 4:30883e8633b4 52 ~Event() {
Christopher Haster 4:30883e8633b4 53 cancel();
Christopher Haster 4:30883e8633b4 54 }
Christopher Haster 4:30883e8633b4 55
Christopher Haster 4:30883e8633b4 56 /** Attach an event to a queue
Christopher Haster 4:30883e8633b4 57 */
Christopher Haster 4:30883e8633b4 58 void attach(EventQueue *queue, FuncPtr<void(A0, A1, A2, A3, A4)> callback) {
Christopher Haster 4:30883e8633b4 59 _queue = queue;
Christopher Haster 4:30883e8633b4 60 _callback.attach(callback);
Christopher Haster 4:30883e8633b4 61 }
Christopher Haster 4:30883e8633b4 62
Christopher Haster 4:30883e8633b4 63 /** Attach an event to a queue
Christopher Haster 4:30883e8633b4 64 */
Christopher Haster 4:30883e8633b4 65 template <typename T, typename M>
Christopher Haster 4:30883e8633b4 66 void attach(EventQueue *queue, T *obj, M method) {
Christopher Haster 4:30883e8633b4 67 _queue = queue;
Christopher Haster 4:30883e8633b4 68 _callback.attach(FuncPtr<void(A0, A1, A2, A3, A4)>(obj, method));
Christopher Haster 4:30883e8633b4 69 }
Christopher Haster 4:30883e8633b4 70
Christopher Haster 4:30883e8633b4 71 /** Set delay for when the event is dispatched after it is posted
Christopher Haster 4:30883e8633b4 72 * @param ms Delay in milliseconds
Christopher Haster 4:30883e8633b4 73 */
Christopher Haster 4:30883e8633b4 74 void delay(int ms) {
Christopher Haster 4:30883e8633b4 75 _event.delay = ms;
Christopher Haster 4:30883e8633b4 76 }
Christopher Haster 4:30883e8633b4 77
Christopher Haster 4:30883e8633b4 78 /** Set event to repeat periodically after it is posted
Christopher Haster 4:30883e8633b4 79 * @param ms period in milliseconds
Christopher Haster 4:30883e8633b4 80 */
Christopher Haster 4:30883e8633b4 81 void period(int ms) {
Christopher Haster 4:30883e8633b4 82 _event.period = ms;
Christopher Haster 4:30883e8633b4 83 }
Christopher Haster 4:30883e8633b4 84
Christopher Haster 4:30883e8633b4 85 /** Set tolerance hint on when the event must be called, defaults to 0
Christopher Haster 4:30883e8633b4 86 * @param ms tolerance in milliseconds
Christopher Haster 4:30883e8633b4 87 */
Christopher Haster 4:30883e8633b4 88 void tolerance(int ms) {
Christopher Haster 4:30883e8633b4 89 (void)ms; // currently ignored
Christopher Haster 4:30883e8633b4 90 }
Christopher Haster 4:30883e8633b4 91
Christopher Haster 4:30883e8633b4 92 /** Post the event onto the bound queue
Christopher Haster 4:30883e8633b4 93 */
Christopher Haster 4:30883e8633b4 94 void call(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Christopher Haster 4:30883e8633b4 95 _bind.attach(_callback, a0, a1, a2, a3, a4);
Christopher Haster 4:30883e8633b4 96 _event.callback = Binder<void(A0, A1, A2, A3, A4), A0, A1, A2, A3, A4>::thunk;
Christopher Haster 4:30883e8633b4 97 _event.data = &_bind;
Christopher Haster 4:30883e8633b4 98 _queue->event_register(&_event, _event.delay);
Christopher Haster 4:30883e8633b4 99 }
Christopher Haster 4:30883e8633b4 100
Christopher Haster 4:30883e8633b4 101 /** Post the event onto the bound queue
Christopher Haster 4:30883e8633b4 102 */
Christopher Haster 4:30883e8633b4 103 void operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Christopher Haster 4:30883e8633b4 104 return call(a0, a1, a2, a3, a4);
Christopher Haster 4:30883e8633b4 105 }
Christopher Haster 4:30883e8633b4 106
Christopher Haster 4:30883e8633b4 107 /** Test if event has been bound
Christopher Haster 4:30883e8633b4 108 */
Christopher Haster 4:30883e8633b4 109 operator bool() const {
Christopher Haster 4:30883e8633b4 110 return _callback && _queue;
Christopher Haster 4:30883e8633b4 111 }
Christopher Haster 4:30883e8633b4 112
Christopher Haster 4:30883e8633b4 113 /** Static thunk for passing as C-style function
Christopher Haster 4:30883e8633b4 114 * @param data Event to dispatch passed as void pointer
Christopher Haster 4:30883e8633b4 115 */
Christopher Haster 4:30883e8633b4 116 static void thunk(void *data, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Christopher Haster 4:30883e8633b4 117 return static_cast<Event<void(A0, A1, A2, A3, A4)>*>(data)
Christopher Haster 4:30883e8633b4 118 ->call(a0, a1, a2, a3, a4);
Christopher Haster 4:30883e8633b4 119 }
Christopher Haster 4:30883e8633b4 120
Christopher Haster 4:30883e8633b4 121 /** Cancel a pending event
Christopher Haster 4:30883e8633b4 122 */
Christopher Haster 4:30883e8633b4 123 void cancel() {
Christopher Haster 4:30883e8633b4 124 _queue->event_unregister(&_event);
Christopher Haster 4:30883e8633b4 125 }
Christopher Haster 4:30883e8633b4 126
Christopher Haster 4:30883e8633b4 127 private:
Christopher Haster 4:30883e8633b4 128 EventQueue *_queue;
Christopher Haster 4:30883e8633b4 129 EventQueue::event _event;
Christopher Haster 4:30883e8633b4 130 FuncPtr<void(A0, A1, A2, A3, A4)> _callback;
Christopher Haster 4:30883e8633b4 131 Binder<void(A0, A1, A2, A3, A4), A0, A1, A2, A3, A4> _bind;
Christopher Haster 4:30883e8633b4 132 };
Christopher Haster 4:30883e8633b4 133
Christopher Haster 4:30883e8633b4 134 /** Pendable event class
Christopher Haster 4:30883e8633b4 135 */
Christopher Haster 0:b1b901ae3696 136 template <typename A0, typename A1, typename A2, typename A3>
Christopher Haster 0:b1b901ae3696 137 class Event<void(A0, A1, A2, A3)> {
Christopher Haster 0:b1b901ae3696 138 public:
Christopher Haster 0:b1b901ae3696 139 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 140 */
Christopher Haster 2:11cda6bead99 141 Event() {
Christopher Haster 2:11cda6bead99 142 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 143 _event.delay = 0;
Christopher Haster 2:11cda6bead99 144 _event.period = -1;
Christopher Haster 2:11cda6bead99 145 }
Christopher Haster 0:b1b901ae3696 146
Christopher Haster 0:b1b901ae3696 147 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 148 */
Christopher Haster 0:b1b901ae3696 149 Event(EventQueue *queue, FuncPtr<void(A0, A1, A2, A3)> callback) {
Christopher Haster 2:11cda6bead99 150 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 151 _event.delay = 0;
Christopher Haster 2:11cda6bead99 152 _event.period = -1;
Christopher Haster 0:b1b901ae3696 153 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 154 }
Christopher Haster 0:b1b901ae3696 155
Christopher Haster 3:6dccdc36651f 156 /** Create an event bound to a queue
Christopher Haster 3:6dccdc36651f 157 */
Christopher Haster 3:6dccdc36651f 158 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 159 Event(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 160 memset(&_event, 0, sizeof _event);
Christopher Haster 3:6dccdc36651f 161 _event.delay = 0;
Christopher Haster 3:6dccdc36651f 162 _event.period = -1;
Christopher Haster 3:6dccdc36651f 163 attach(queue, obj, method);
Christopher Haster 3:6dccdc36651f 164 }
Christopher Haster 3:6dccdc36651f 165
Christopher Haster 0:b1b901ae3696 166 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 167 */
Christopher Haster 0:b1b901ae3696 168 ~Event() {
Christopher Haster 0:b1b901ae3696 169 cancel();
Christopher Haster 0:b1b901ae3696 170 }
Christopher Haster 0:b1b901ae3696 171
Christopher Haster 0:b1b901ae3696 172 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 173 */
Christopher Haster 0:b1b901ae3696 174 void attach(EventQueue *queue, FuncPtr<void(A0, A1, A2, A3)> callback) {
Christopher Haster 0:b1b901ae3696 175 _queue = queue;
Christopher Haster 0:b1b901ae3696 176 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 177 }
Christopher Haster 0:b1b901ae3696 178
Christopher Haster 3:6dccdc36651f 179 /** Attach an event to a queue
Christopher Haster 3:6dccdc36651f 180 */
Christopher Haster 3:6dccdc36651f 181 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 182 void attach(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 183 _queue = queue;
Christopher Haster 3:6dccdc36651f 184 _callback.attach(FuncPtr<void(A0, A1, A2, A3)>(obj, method));
Christopher Haster 3:6dccdc36651f 185 }
Christopher Haster 3:6dccdc36651f 186
Christopher Haster 2:11cda6bead99 187 /** Set delay for when the event is dispatched after it is posted
Christopher Haster 2:11cda6bead99 188 * @param ms Delay in milliseconds
Christopher Haster 2:11cda6bead99 189 */
Christopher Haster 2:11cda6bead99 190 void delay(int ms) {
Christopher Haster 2:11cda6bead99 191 _event.delay = ms;
Christopher Haster 2:11cda6bead99 192 }
Christopher Haster 2:11cda6bead99 193
Christopher Haster 2:11cda6bead99 194 /** Set event to repeat periodically after it is posted
Christopher Haster 2:11cda6bead99 195 * @param ms period in milliseconds
Christopher Haster 2:11cda6bead99 196 */
Christopher Haster 2:11cda6bead99 197 void period(int ms) {
Christopher Haster 2:11cda6bead99 198 _event.period = ms;
Christopher Haster 2:11cda6bead99 199 }
Christopher Haster 2:11cda6bead99 200
Christopher Haster 2:11cda6bead99 201 /** Set tolerance hint on when the event must be called, defaults to 0
Christopher Haster 2:11cda6bead99 202 * @param ms tolerance in milliseconds
Christopher Haster 2:11cda6bead99 203 */
Christopher Haster 2:11cda6bead99 204 void tolerance(int ms) {
Christopher Haster 2:11cda6bead99 205 (void)ms; // currently ignored
Christopher Haster 2:11cda6bead99 206 }
Christopher Haster 2:11cda6bead99 207
Christopher Haster 2:11cda6bead99 208 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 209 */
Christopher Haster 0:b1b901ae3696 210 void call(A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 0:b1b901ae3696 211 _bind.attach(_callback, a0, a1, a2, a3);
Christopher Haster 0:b1b901ae3696 212 _event.callback = Binder<void(A0, A1, A2, A3), A0, A1, A2, A3>::thunk;
Christopher Haster 0:b1b901ae3696 213 _event.data = &_bind;
Christopher Haster 2:11cda6bead99 214 _queue->event_register(&_event, _event.delay);
Christopher Haster 0:b1b901ae3696 215 }
Christopher Haster 0:b1b901ae3696 216
Christopher Haster 2:11cda6bead99 217 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 218 */
Christopher Haster 0:b1b901ae3696 219 void operator()(A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 0:b1b901ae3696 220 return call(a0, a1, a2, a3);
Christopher Haster 0:b1b901ae3696 221 }
Christopher Haster 0:b1b901ae3696 222
Christopher Haster 0:b1b901ae3696 223 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 224 */
Christopher Haster 0:b1b901ae3696 225 operator bool() const {
Christopher Haster 0:b1b901ae3696 226 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 227 }
Christopher Haster 0:b1b901ae3696 228
Christopher Haster 0:b1b901ae3696 229 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 230 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 231 */
Christopher Haster 0:b1b901ae3696 232 static void thunk(void *data, A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 0:b1b901ae3696 233 return static_cast<Event<void(A0, A1, A2, A3)>*>(data)
Christopher Haster 0:b1b901ae3696 234 ->call(a0, a1, a2, a3);
Christopher Haster 0:b1b901ae3696 235 }
Christopher Haster 0:b1b901ae3696 236
Christopher Haster 0:b1b901ae3696 237 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 238 */
Christopher Haster 0:b1b901ae3696 239 void cancel() {
Christopher Haster 0:b1b901ae3696 240 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 241 }
Christopher Haster 0:b1b901ae3696 242
Christopher Haster 0:b1b901ae3696 243 private:
Christopher Haster 0:b1b901ae3696 244 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 245 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 246 FuncPtr<void(A0, A1, A2, A3)> _callback;
Christopher Haster 0:b1b901ae3696 247 Binder<void(A0, A1, A2, A3), A0, A1, A2, A3> _bind;
Christopher Haster 0:b1b901ae3696 248 };
Christopher Haster 0:b1b901ae3696 249
Christopher Haster 0:b1b901ae3696 250 /** Pendable event class
Christopher Haster 0:b1b901ae3696 251 */
Christopher Haster 0:b1b901ae3696 252 template <typename A0, typename A1, typename A2>
Christopher Haster 0:b1b901ae3696 253 class Event<void(A0, A1, A2)> {
Christopher Haster 0:b1b901ae3696 254 public:
Christopher Haster 0:b1b901ae3696 255 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 256 */
Christopher Haster 2:11cda6bead99 257 Event() {
Christopher Haster 2:11cda6bead99 258 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 259 _event.delay = 0;
Christopher Haster 2:11cda6bead99 260 _event.period = -1;
Christopher Haster 2:11cda6bead99 261 }
Christopher Haster 0:b1b901ae3696 262
Christopher Haster 0:b1b901ae3696 263 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 264 */
Christopher Haster 0:b1b901ae3696 265 Event(EventQueue *queue, FuncPtr<void(A0, A1, A2)> callback) {
Christopher Haster 2:11cda6bead99 266 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 267 _event.delay = 0;
Christopher Haster 2:11cda6bead99 268 _event.period = -1;
Christopher Haster 0:b1b901ae3696 269 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 270 }
Christopher Haster 0:b1b901ae3696 271
Christopher Haster 3:6dccdc36651f 272 /** Create an event bound to a queue
Christopher Haster 3:6dccdc36651f 273 */
Christopher Haster 3:6dccdc36651f 274 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 275 Event(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 276 memset(&_event, 0, sizeof _event);
Christopher Haster 3:6dccdc36651f 277 _event.delay = 0;
Christopher Haster 3:6dccdc36651f 278 _event.period = -1;
Christopher Haster 3:6dccdc36651f 279 attach(queue, obj, method);
Christopher Haster 3:6dccdc36651f 280 }
Christopher Haster 3:6dccdc36651f 281
Christopher Haster 0:b1b901ae3696 282 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 283 */
Christopher Haster 0:b1b901ae3696 284 ~Event() {
Christopher Haster 0:b1b901ae3696 285 cancel();
Christopher Haster 0:b1b901ae3696 286 }
Christopher Haster 0:b1b901ae3696 287
Christopher Haster 0:b1b901ae3696 288 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 289 */
Christopher Haster 0:b1b901ae3696 290 void attach(EventQueue *queue, FuncPtr<void(A0, A1, A2)> callback) {
Christopher Haster 0:b1b901ae3696 291 _queue = queue;
Christopher Haster 0:b1b901ae3696 292 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 293 }
Christopher Haster 0:b1b901ae3696 294
Christopher Haster 3:6dccdc36651f 295 /** Attach an event to a queue
Christopher Haster 3:6dccdc36651f 296 */
Christopher Haster 3:6dccdc36651f 297 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 298 void attach(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 299 _queue = queue;
Christopher Haster 3:6dccdc36651f 300 _callback.attach(FuncPtr<void(A0, A1, A2)>(obj, method));
Christopher Haster 3:6dccdc36651f 301 }
Christopher Haster 3:6dccdc36651f 302
Christopher Haster 2:11cda6bead99 303 /** Set delay for when the event is dispatched after it is posted
Christopher Haster 2:11cda6bead99 304 * @param ms Delay in milliseconds
Christopher Haster 2:11cda6bead99 305 */
Christopher Haster 2:11cda6bead99 306 void delay(int ms) {
Christopher Haster 2:11cda6bead99 307 _event.delay = ms;
Christopher Haster 2:11cda6bead99 308 }
Christopher Haster 2:11cda6bead99 309
Christopher Haster 2:11cda6bead99 310 /** Set event to repeat periodically after it is posted
Christopher Haster 2:11cda6bead99 311 * @param ms period in milliseconds
Christopher Haster 2:11cda6bead99 312 */
Christopher Haster 2:11cda6bead99 313 void period(int ms) {
Christopher Haster 2:11cda6bead99 314 _event.period = ms;
Christopher Haster 2:11cda6bead99 315 }
Christopher Haster 2:11cda6bead99 316
Christopher Haster 2:11cda6bead99 317 /** Set tolerance hint on when the event must be called, defaults to 0
Christopher Haster 2:11cda6bead99 318 * @param ms tolerance in milliseconds
Christopher Haster 2:11cda6bead99 319 */
Christopher Haster 2:11cda6bead99 320 void tolerance(int ms) {
Christopher Haster 2:11cda6bead99 321 (void)ms; // currently ignored
Christopher Haster 2:11cda6bead99 322 }
Christopher Haster 2:11cda6bead99 323
Christopher Haster 2:11cda6bead99 324 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 325 */
Christopher Haster 0:b1b901ae3696 326 void call(A0 a0, A1 a1, A2 a2) {
Christopher Haster 0:b1b901ae3696 327 _bind.attach(_callback, a0, a1, a2);
Christopher Haster 0:b1b901ae3696 328 _event.callback = Binder<void(A0, A1, A2), A0, A1, A2>::thunk;
Christopher Haster 0:b1b901ae3696 329 _event.data = &_bind;
Christopher Haster 2:11cda6bead99 330 _queue->event_register(&_event, _event.delay);
Christopher Haster 0:b1b901ae3696 331 }
Christopher Haster 0:b1b901ae3696 332
Christopher Haster 2:11cda6bead99 333 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 334 */
Christopher Haster 0:b1b901ae3696 335 void operator()(A0 a0, A1 a1, A2 a2) {
Christopher Haster 0:b1b901ae3696 336 return call(a0, a1, a2);
Christopher Haster 0:b1b901ae3696 337 }
Christopher Haster 0:b1b901ae3696 338
Christopher Haster 0:b1b901ae3696 339 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 340 */
Christopher Haster 0:b1b901ae3696 341 operator bool() const {
Christopher Haster 0:b1b901ae3696 342 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 343 }
Christopher Haster 0:b1b901ae3696 344
Christopher Haster 0:b1b901ae3696 345 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 346 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 347 */
Christopher Haster 0:b1b901ae3696 348 static void thunk(void *data, A0 a0, A1 a1, A2 a2) {
Christopher Haster 0:b1b901ae3696 349 return static_cast<Event<void(A0, A1, A2)>*>(data)
Christopher Haster 0:b1b901ae3696 350 ->call(a0, a1, a2);
Christopher Haster 0:b1b901ae3696 351 }
Christopher Haster 0:b1b901ae3696 352
Christopher Haster 0:b1b901ae3696 353 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 354 */
Christopher Haster 0:b1b901ae3696 355 void cancel() {
Christopher Haster 0:b1b901ae3696 356 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 357 }
Christopher Haster 0:b1b901ae3696 358
Christopher Haster 0:b1b901ae3696 359 private:
Christopher Haster 0:b1b901ae3696 360 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 361 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 362 FuncPtr<void(A0, A1, A2)> _callback;
Christopher Haster 0:b1b901ae3696 363 Binder<void(A0, A1, A2), A0, A1, A2> _bind;
Christopher Haster 0:b1b901ae3696 364 };
Christopher Haster 0:b1b901ae3696 365
Christopher Haster 0:b1b901ae3696 366 /** Pendable event class
Christopher Haster 0:b1b901ae3696 367 */
Christopher Haster 0:b1b901ae3696 368 template <typename A0, typename A1>
Christopher Haster 0:b1b901ae3696 369 class Event<void(A0, A1)> {
Christopher Haster 0:b1b901ae3696 370 public:
Christopher Haster 0:b1b901ae3696 371 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 372 */
Christopher Haster 2:11cda6bead99 373 Event() {
Christopher Haster 2:11cda6bead99 374 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 375 _event.delay = 0;
Christopher Haster 2:11cda6bead99 376 _event.period = -1;
Christopher Haster 2:11cda6bead99 377 }
Christopher Haster 0:b1b901ae3696 378
Christopher Haster 0:b1b901ae3696 379 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 380 */
Christopher Haster 0:b1b901ae3696 381 Event(EventQueue *queue, FuncPtr<void(A0, A1)> callback) {
Christopher Haster 2:11cda6bead99 382 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 383 _event.delay = 0;
Christopher Haster 2:11cda6bead99 384 _event.period = -1;
Christopher Haster 0:b1b901ae3696 385 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 386 }
Christopher Haster 0:b1b901ae3696 387
Christopher Haster 3:6dccdc36651f 388 /** Create an event bound to a queue
Christopher Haster 3:6dccdc36651f 389 */
Christopher Haster 3:6dccdc36651f 390 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 391 Event(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 392 memset(&_event, 0, sizeof _event);
Christopher Haster 3:6dccdc36651f 393 _event.delay = 0;
Christopher Haster 3:6dccdc36651f 394 _event.period = -1;
Christopher Haster 3:6dccdc36651f 395 attach(queue, obj, method);
Christopher Haster 3:6dccdc36651f 396 }
Christopher Haster 3:6dccdc36651f 397
Christopher Haster 0:b1b901ae3696 398 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 399 */
Christopher Haster 0:b1b901ae3696 400 ~Event() {
Christopher Haster 0:b1b901ae3696 401 cancel();
Christopher Haster 0:b1b901ae3696 402 }
Christopher Haster 0:b1b901ae3696 403
Christopher Haster 0:b1b901ae3696 404 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 405 */
Christopher Haster 0:b1b901ae3696 406 void attach(EventQueue *queue, FuncPtr<void(A0, A1)> callback) {
Christopher Haster 0:b1b901ae3696 407 _queue = queue;
Christopher Haster 0:b1b901ae3696 408 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 409 }
Christopher Haster 0:b1b901ae3696 410
Christopher Haster 3:6dccdc36651f 411 /** Attach an event to a queue
Christopher Haster 3:6dccdc36651f 412 */
Christopher Haster 3:6dccdc36651f 413 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 414 void attach(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 415 _queue = queue;
Christopher Haster 3:6dccdc36651f 416 _callback.attach(FuncPtr<void(A0, A1)>(obj, method));
Christopher Haster 3:6dccdc36651f 417 }
Christopher Haster 3:6dccdc36651f 418
Christopher Haster 2:11cda6bead99 419 /** Set delay for when the event is dispatched after it is posted
Christopher Haster 2:11cda6bead99 420 * @param ms Delay in milliseconds
Christopher Haster 2:11cda6bead99 421 */
Christopher Haster 2:11cda6bead99 422 void delay(int ms) {
Christopher Haster 2:11cda6bead99 423 _event.delay = ms;
Christopher Haster 2:11cda6bead99 424 }
Christopher Haster 2:11cda6bead99 425
Christopher Haster 2:11cda6bead99 426 /** Set event to repeat periodically after it is posted
Christopher Haster 2:11cda6bead99 427 * @param ms period in milliseconds
Christopher Haster 2:11cda6bead99 428 */
Christopher Haster 2:11cda6bead99 429 void period(int ms) {
Christopher Haster 2:11cda6bead99 430 _event.period = ms;
Christopher Haster 2:11cda6bead99 431 }
Christopher Haster 2:11cda6bead99 432
Christopher Haster 2:11cda6bead99 433 /** Set tolerance hint on when the event must be called, defaults to 0
Christopher Haster 2:11cda6bead99 434 * @param ms tolerance in milliseconds
Christopher Haster 2:11cda6bead99 435 */
Christopher Haster 2:11cda6bead99 436 void tolerance(int ms) {
Christopher Haster 2:11cda6bead99 437 (void)ms; // currently ignored
Christopher Haster 2:11cda6bead99 438 }
Christopher Haster 2:11cda6bead99 439
Christopher Haster 2:11cda6bead99 440 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 441 */
Christopher Haster 0:b1b901ae3696 442 void call(A0 a0, A1 a1) {
Christopher Haster 0:b1b901ae3696 443 _bind.attach(_callback, a0, a1);
Christopher Haster 0:b1b901ae3696 444 _event.callback = Binder<void(A0, A1), A0, A1>::thunk;
Christopher Haster 0:b1b901ae3696 445 _event.data = &_bind;
Christopher Haster 2:11cda6bead99 446 _queue->event_register(&_event, _event.delay);
Christopher Haster 0:b1b901ae3696 447 }
Christopher Haster 0:b1b901ae3696 448
Christopher Haster 2:11cda6bead99 449 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 450 */
Christopher Haster 0:b1b901ae3696 451 void operator()(A0 a0, A1 a1) {
Christopher Haster 0:b1b901ae3696 452 return call(a0, a1);
Christopher Haster 0:b1b901ae3696 453 }
Christopher Haster 0:b1b901ae3696 454
Christopher Haster 0:b1b901ae3696 455 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 456 */
Christopher Haster 0:b1b901ae3696 457 operator bool() const {
Christopher Haster 0:b1b901ae3696 458 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 459 }
Christopher Haster 0:b1b901ae3696 460
Christopher Haster 0:b1b901ae3696 461 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 462 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 463 */
Christopher Haster 0:b1b901ae3696 464 static void thunk(void *data, A0 a0, A1 a1) {
Christopher Haster 0:b1b901ae3696 465 return static_cast<Event<void(A0, A1)>*>(data)
Christopher Haster 0:b1b901ae3696 466 ->call(a0, a1);
Christopher Haster 0:b1b901ae3696 467 }
Christopher Haster 0:b1b901ae3696 468
Christopher Haster 0:b1b901ae3696 469 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 470 */
Christopher Haster 0:b1b901ae3696 471 void cancel() {
Christopher Haster 0:b1b901ae3696 472 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 473 }
Christopher Haster 0:b1b901ae3696 474
Christopher Haster 0:b1b901ae3696 475 private:
Christopher Haster 0:b1b901ae3696 476 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 477 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 478 FuncPtr<void(A0, A1)> _callback;
Christopher Haster 0:b1b901ae3696 479 Binder<void(A0, A1), A0, A1> _bind;
Christopher Haster 0:b1b901ae3696 480 };
Christopher Haster 0:b1b901ae3696 481
Christopher Haster 0:b1b901ae3696 482 /** Pendable event class
Christopher Haster 0:b1b901ae3696 483 */
Christopher Haster 0:b1b901ae3696 484 template <typename A0>
Christopher Haster 0:b1b901ae3696 485 class Event<void(A0)> {
Christopher Haster 0:b1b901ae3696 486 public:
Christopher Haster 0:b1b901ae3696 487 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 488 */
Christopher Haster 2:11cda6bead99 489 Event() {
Christopher Haster 2:11cda6bead99 490 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 491 _event.delay = 0;
Christopher Haster 2:11cda6bead99 492 _event.period = -1;
Christopher Haster 2:11cda6bead99 493 }
Christopher Haster 0:b1b901ae3696 494
Christopher Haster 0:b1b901ae3696 495 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 496 */
Christopher Haster 0:b1b901ae3696 497 Event(EventQueue *queue, FuncPtr<void(A0)> callback) {
Christopher Haster 2:11cda6bead99 498 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 499 _event.delay = 0;
Christopher Haster 2:11cda6bead99 500 _event.period = -1;
Christopher Haster 0:b1b901ae3696 501 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 502 }
Christopher Haster 0:b1b901ae3696 503
Christopher Haster 3:6dccdc36651f 504 /** Create an event bound to a queue
Christopher Haster 3:6dccdc36651f 505 */
Christopher Haster 3:6dccdc36651f 506 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 507 Event(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 508 memset(&_event, 0, sizeof _event);
Christopher Haster 3:6dccdc36651f 509 _event.delay = 0;
Christopher Haster 3:6dccdc36651f 510 _event.period = -1;
Christopher Haster 3:6dccdc36651f 511 attach(queue, obj, method);
Christopher Haster 3:6dccdc36651f 512 }
Christopher Haster 3:6dccdc36651f 513
Christopher Haster 0:b1b901ae3696 514 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 515 */
Christopher Haster 0:b1b901ae3696 516 ~Event() {
Christopher Haster 0:b1b901ae3696 517 cancel();
Christopher Haster 0:b1b901ae3696 518 }
Christopher Haster 0:b1b901ae3696 519
Christopher Haster 0:b1b901ae3696 520 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 521 */
Christopher Haster 0:b1b901ae3696 522 void attach(EventQueue *queue, FuncPtr<void(A0)> callback) {
Christopher Haster 0:b1b901ae3696 523 _queue = queue;
Christopher Haster 0:b1b901ae3696 524 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 525 }
Christopher Haster 0:b1b901ae3696 526
Christopher Haster 3:6dccdc36651f 527 /** Attach an event to a queue
Christopher Haster 3:6dccdc36651f 528 */
Christopher Haster 3:6dccdc36651f 529 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 530 void attach(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 531 _queue = queue;
Christopher Haster 3:6dccdc36651f 532 _callback.attach(FuncPtr<void(A0)>(obj, method));
Christopher Haster 3:6dccdc36651f 533 }
Christopher Haster 3:6dccdc36651f 534
Christopher Haster 2:11cda6bead99 535 /** Set delay for when the event is dispatched after it is posted
Christopher Haster 2:11cda6bead99 536 * @param ms Delay in milliseconds
Christopher Haster 2:11cda6bead99 537 */
Christopher Haster 2:11cda6bead99 538 void delay(int ms) {
Christopher Haster 2:11cda6bead99 539 _event.delay = ms;
Christopher Haster 2:11cda6bead99 540 }
Christopher Haster 2:11cda6bead99 541
Christopher Haster 2:11cda6bead99 542 /** Set event to repeat periodically after it is posted
Christopher Haster 2:11cda6bead99 543 * @param ms period in milliseconds
Christopher Haster 2:11cda6bead99 544 */
Christopher Haster 2:11cda6bead99 545 void period(int ms) {
Christopher Haster 2:11cda6bead99 546 _event.period = ms;
Christopher Haster 2:11cda6bead99 547 }
Christopher Haster 2:11cda6bead99 548
Christopher Haster 2:11cda6bead99 549 /** Set tolerance hint on when the event must be called, defaults to 0
Christopher Haster 2:11cda6bead99 550 * @param ms tolerance in milliseconds
Christopher Haster 2:11cda6bead99 551 */
Christopher Haster 2:11cda6bead99 552 void tolerance(int ms) {
Christopher Haster 2:11cda6bead99 553 (void)ms; // currently ignored
Christopher Haster 2:11cda6bead99 554 }
Christopher Haster 2:11cda6bead99 555
Christopher Haster 2:11cda6bead99 556 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 557 */
Christopher Haster 0:b1b901ae3696 558 void call(A0 a0) {
Christopher Haster 0:b1b901ae3696 559 _bind.attach(_callback, a0);
Christopher Haster 0:b1b901ae3696 560 _event.callback = Binder<void(A0), A0>::thunk;
Christopher Haster 0:b1b901ae3696 561 _event.data = &_bind;
Christopher Haster 2:11cda6bead99 562 _queue->event_register(&_event, _event.delay);
Christopher Haster 0:b1b901ae3696 563 }
Christopher Haster 0:b1b901ae3696 564
Christopher Haster 2:11cda6bead99 565 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 566 */
Christopher Haster 0:b1b901ae3696 567 void operator()(A0 a0) {
Christopher Haster 0:b1b901ae3696 568 return call(a0);
Christopher Haster 0:b1b901ae3696 569 }
Christopher Haster 0:b1b901ae3696 570
Christopher Haster 0:b1b901ae3696 571 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 572 */
Christopher Haster 0:b1b901ae3696 573 operator bool() const {
Christopher Haster 0:b1b901ae3696 574 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 575 }
Christopher Haster 0:b1b901ae3696 576
Christopher Haster 0:b1b901ae3696 577 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 578 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 579 */
Christopher Haster 0:b1b901ae3696 580 static void thunk(void *data, A0 a0) {
Christopher Haster 0:b1b901ae3696 581 return static_cast<Event<void(A0)>*>(data)
Christopher Haster 0:b1b901ae3696 582 ->call(a0);
Christopher Haster 0:b1b901ae3696 583 }
Christopher Haster 0:b1b901ae3696 584
Christopher Haster 0:b1b901ae3696 585 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 586 */
Christopher Haster 0:b1b901ae3696 587 void cancel() {
Christopher Haster 0:b1b901ae3696 588 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 589 }
Christopher Haster 0:b1b901ae3696 590
Christopher Haster 0:b1b901ae3696 591 private:
Christopher Haster 0:b1b901ae3696 592 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 593 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 594 FuncPtr<void(A0)> _callback;
Christopher Haster 0:b1b901ae3696 595 Binder<void(A0), A0> _bind;
Christopher Haster 0:b1b901ae3696 596 };
Christopher Haster 0:b1b901ae3696 597
Christopher Haster 0:b1b901ae3696 598 /** Pendable event class
Christopher Haster 0:b1b901ae3696 599 */
Christopher Haster 0:b1b901ae3696 600 template <>
Christopher Haster 0:b1b901ae3696 601 class Event<void()> {
Christopher Haster 0:b1b901ae3696 602 public:
Christopher Haster 0:b1b901ae3696 603 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 604 */
Christopher Haster 2:11cda6bead99 605 Event() {
Christopher Haster 2:11cda6bead99 606 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 607 _event.delay = 0;
Christopher Haster 2:11cda6bead99 608 _event.period = -1;
Christopher Haster 2:11cda6bead99 609 }
Christopher Haster 0:b1b901ae3696 610
Christopher Haster 0:b1b901ae3696 611 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 612 */
Christopher Haster 0:b1b901ae3696 613 Event(EventQueue *queue, FuncPtr<void()> callback) {
Christopher Haster 2:11cda6bead99 614 memset(&_event, 0, sizeof _event);
Christopher Haster 2:11cda6bead99 615 _event.delay = 0;
Christopher Haster 2:11cda6bead99 616 _event.period = -1;
Christopher Haster 0:b1b901ae3696 617 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 618 }
Christopher Haster 0:b1b901ae3696 619
Christopher Haster 3:6dccdc36651f 620 /** Create an event bound to a queue
Christopher Haster 3:6dccdc36651f 621 */
Christopher Haster 3:6dccdc36651f 622 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 623 Event(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 624 memset(&_event, 0, sizeof _event);
Christopher Haster 3:6dccdc36651f 625 _event.delay = 0;
Christopher Haster 3:6dccdc36651f 626 _event.period = -1;
Christopher Haster 3:6dccdc36651f 627 attach(queue, obj, method);
Christopher Haster 3:6dccdc36651f 628 }
Christopher Haster 3:6dccdc36651f 629
Christopher Haster 0:b1b901ae3696 630 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 631 */
Christopher Haster 0:b1b901ae3696 632 ~Event() {
Christopher Haster 0:b1b901ae3696 633 cancel();
Christopher Haster 0:b1b901ae3696 634 }
Christopher Haster 0:b1b901ae3696 635
Christopher Haster 0:b1b901ae3696 636 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 637 */
Christopher Haster 0:b1b901ae3696 638 void attach(EventQueue *queue, FuncPtr<void()> callback) {
Christopher Haster 0:b1b901ae3696 639 _queue = queue;
Christopher Haster 0:b1b901ae3696 640 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 641 }
Christopher Haster 0:b1b901ae3696 642
Christopher Haster 3:6dccdc36651f 643 /** Attach an event to a queue
Christopher Haster 3:6dccdc36651f 644 */
Christopher Haster 3:6dccdc36651f 645 template <typename T, typename M>
Christopher Haster 3:6dccdc36651f 646 void attach(EventQueue *queue, T *obj, M method) {
Christopher Haster 3:6dccdc36651f 647 _queue = queue;
Christopher Haster 3:6dccdc36651f 648 _callback.attach(FuncPtr<void()>(obj, method));
Christopher Haster 3:6dccdc36651f 649 }
Christopher Haster 3:6dccdc36651f 650
Christopher Haster 2:11cda6bead99 651 /** Set delay for when the event is dispatched after it is posted
Christopher Haster 2:11cda6bead99 652 * @param ms Delay in milliseconds
Christopher Haster 2:11cda6bead99 653 */
Christopher Haster 2:11cda6bead99 654 void delay(int ms) {
Christopher Haster 2:11cda6bead99 655 _event.delay = ms;
Christopher Haster 2:11cda6bead99 656 }
Christopher Haster 2:11cda6bead99 657
Christopher Haster 2:11cda6bead99 658 /** Set event to repeat periodically after it is posted
Christopher Haster 2:11cda6bead99 659 * @param ms period in milliseconds
Christopher Haster 2:11cda6bead99 660 */
Christopher Haster 2:11cda6bead99 661 void period(int ms) {
Christopher Haster 2:11cda6bead99 662 _event.period = ms;
Christopher Haster 2:11cda6bead99 663 }
Christopher Haster 2:11cda6bead99 664
Christopher Haster 2:11cda6bead99 665 /** Set tolerance hint on when the event must be called, defaults to 0
Christopher Haster 2:11cda6bead99 666 * @param ms tolerance in milliseconds
Christopher Haster 2:11cda6bead99 667 */
Christopher Haster 2:11cda6bead99 668 void tolerance(int ms) {
Christopher Haster 2:11cda6bead99 669 (void)ms; // currently ignored
Christopher Haster 2:11cda6bead99 670 }
Christopher Haster 2:11cda6bead99 671
Christopher Haster 2:11cda6bead99 672 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 673 */
Christopher Haster 0:b1b901ae3696 674 void call() {
Christopher Haster 0:b1b901ae3696 675 _event.callback = FuncPtr<void()>::thunk;
Christopher Haster 0:b1b901ae3696 676 _event.data = &_callback;
Christopher Haster 2:11cda6bead99 677 _queue->event_register(&_event, _event.delay);
Christopher Haster 0:b1b901ae3696 678 }
Christopher Haster 0:b1b901ae3696 679
Christopher Haster 2:11cda6bead99 680 /** Post the event onto the bound queue
Christopher Haster 0:b1b901ae3696 681 */
Christopher Haster 0:b1b901ae3696 682 void operator()() {
Christopher Haster 0:b1b901ae3696 683 return call();
Christopher Haster 0:b1b901ae3696 684 }
Christopher Haster 0:b1b901ae3696 685
Christopher Haster 0:b1b901ae3696 686 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 687 */
Christopher Haster 0:b1b901ae3696 688 operator bool() const {
Christopher Haster 0:b1b901ae3696 689 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 690 }
Christopher Haster 0:b1b901ae3696 691
Christopher Haster 0:b1b901ae3696 692 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 693 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 694 */
Christopher Haster 0:b1b901ae3696 695 static void thunk(void *data) {
Christopher Haster 0:b1b901ae3696 696 return static_cast<Event<void()>*>(data)
Christopher Haster 0:b1b901ae3696 697 ->call();
Christopher Haster 0:b1b901ae3696 698 }
Christopher Haster 0:b1b901ae3696 699
Christopher Haster 0:b1b901ae3696 700 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 701 */
Christopher Haster 0:b1b901ae3696 702 void cancel() {
Christopher Haster 0:b1b901ae3696 703 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 704 }
Christopher Haster 0:b1b901ae3696 705
Christopher Haster 0:b1b901ae3696 706 private:
Christopher Haster 0:b1b901ae3696 707 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 708 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 709 FuncPtr<void()> _callback;
Christopher Haster 0:b1b901ae3696 710 };
Christopher Haster 0:b1b901ae3696 711
Christopher Haster 0:b1b901ae3696 712
Christopher Haster 0:b1b901ae3696 713 #endif