This is a fork of the `events` subdirectory of https://github.com/ARMmbed/mbed-os

Dependents:   HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more

This is a fork of the events subdirectory of https://github.com/ARMmbed/mbed-os.

Note, you must import this library with import name: events!!!

Committer:
Christopher Haster
Date:
Fri Feb 17 14:33:09 2017 -0600
Revision:
15:42ba4ffdf78d
Parent:
14:65535458dd6f
Child:
9822:fb4e93c12c32
events: Added better documentation for binding types to events

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bogdan Marinescu 0:a792d4bf36c2 1 /* events
Bogdan Marinescu 0:a792d4bf36c2 2 * Copyright (c) 2016 ARM Limited
Bogdan Marinescu 0:a792d4bf36c2 3 *
Bogdan Marinescu 0:a792d4bf36c2 4 * Licensed under the Apache License, Version 2.0 (the "License");
Bogdan Marinescu 0:a792d4bf36c2 5 * you may not use this file except in compliance with the License.
Bogdan Marinescu 0:a792d4bf36c2 6 * You may obtain a copy of the License at
Bogdan Marinescu 0:a792d4bf36c2 7 *
Bogdan Marinescu 0:a792d4bf36c2 8 * http://www.apache.org/licenses/LICENSE-2.0
Bogdan Marinescu 0:a792d4bf36c2 9 *
Bogdan Marinescu 0:a792d4bf36c2 10 * Unless required by applicable law or agreed to in writing, software
Bogdan Marinescu 0:a792d4bf36c2 11 * distributed under the License is distributed on an "AS IS" BASIS,
Bogdan Marinescu 0:a792d4bf36c2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Bogdan Marinescu 0:a792d4bf36c2 13 * See the License for the specific language governing permissions and
Bogdan Marinescu 0:a792d4bf36c2 14 * limitations under the License.
Bogdan Marinescu 0:a792d4bf36c2 15 */
Bogdan Marinescu 0:a792d4bf36c2 16 #ifndef EVENT_H
Bogdan Marinescu 0:a792d4bf36c2 17 #define EVENT_H
Bogdan Marinescu 0:a792d4bf36c2 18
Sam Grove 2:a60d8117d0e0 19 #include "events/EventQueue.h"
Sam Grove 2:a60d8117d0e0 20 #include "platform/mbed_assert.h"
Bogdan Marinescu 0:a792d4bf36c2 21
Bogdan Marinescu 0:a792d4bf36c2 22 namespace events {
Jimmy Brisson 5:705843a08e16 23 /** \addtogroup events */
Jimmy Brisson 5:705843a08e16 24 /** @{*/
Bogdan Marinescu 0:a792d4bf36c2 25
Bogdan Marinescu 0:a792d4bf36c2 26 /** Event
Bogdan Marinescu 0:a792d4bf36c2 27 *
Bogdan Marinescu 0:a792d4bf36c2 28 * Representation of an event for fine-grain dispatch control
Bogdan Marinescu 0:a792d4bf36c2 29 */
Bogdan Marinescu 0:a792d4bf36c2 30 template <typename F>
Bogdan Marinescu 0:a792d4bf36c2 31 class Event;
Bogdan Marinescu 0:a792d4bf36c2 32
Bogdan Marinescu 0:a792d4bf36c2 33 /** Event
Bogdan Marinescu 0:a792d4bf36c2 34 *
Bogdan Marinescu 0:a792d4bf36c2 35 * Representation of an event for fine-grain dispatch control
Bogdan Marinescu 0:a792d4bf36c2 36 */
Bogdan Marinescu 0:a792d4bf36c2 37 template <>
Bogdan Marinescu 0:a792d4bf36c2 38 class Event<void()> {
Bogdan Marinescu 0:a792d4bf36c2 39 public:
Bogdan Marinescu 0:a792d4bf36c2 40 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 41 *
Bogdan Marinescu 0:a792d4bf36c2 42 * Constructs an event bound to the specified event queue. The specified
Bogdan Marinescu 0:a792d4bf36c2 43 * callback acts as the target for the event and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 44 * context of the event queue's dispatch loop once posted.
Bogdan Marinescu 0:a792d4bf36c2 45 *
Bogdan Marinescu 0:a792d4bf36c2 46 * @param q Event queue to dispatch on
Bogdan Marinescu 0:a792d4bf36c2 47 * @param f Function to execute when the event is dispatched
Christopher Haster 15:42ba4ffdf78d 48 * @param c0..c4 Arguments to bind to the callback, these arguments are
Christopher Haster 15:42ba4ffdf78d 49 * allocated on an irq-safe allocator from the event queue's
Christopher Haster 15:42ba4ffdf78d 50 * memory pool. Must be type-compatible with b0..b4, the
Christopher Haster 15:42ba4ffdf78d 51 * arguments to the underlying callback.
Bogdan Marinescu 0:a792d4bf36c2 52 */
Bogdan Marinescu 0:a792d4bf36c2 53 template <typename F>
Bogdan Marinescu 0:a792d4bf36c2 54 Event(EventQueue *q, F f) {
Bogdan Marinescu 0:a792d4bf36c2 55 _event = static_cast<struct event *>(
Bogdan Marinescu 0:a792d4bf36c2 56 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
Christopher Haster 4:f157c7bf01cc 57
Bogdan Marinescu 0:a792d4bf36c2 58 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 59 _event->equeue = &q->_equeue;
Bogdan Marinescu 0:a792d4bf36c2 60 _event->id = 0;
Bogdan Marinescu 0:a792d4bf36c2 61 _event->delay = 0;
Bogdan Marinescu 0:a792d4bf36c2 62 _event->period = -1;
Bogdan Marinescu 0:a792d4bf36c2 63
Christopher Haster 4:f157c7bf01cc 64 _event->post = &Event::event_post<F>;
Christopher Haster 4:f157c7bf01cc 65 _event->dtor = &Event::event_dtor<F>;
Bogdan Marinescu 0:a792d4bf36c2 66
Bogdan Marinescu 0:a792d4bf36c2 67 new (_event+1) F(f);
Bogdan Marinescu 0:a792d4bf36c2 68
Bogdan Marinescu 0:a792d4bf36c2 69 _event->ref = 1;
Bogdan Marinescu 0:a792d4bf36c2 70 }
Bogdan Marinescu 0:a792d4bf36c2 71 }
Bogdan Marinescu 0:a792d4bf36c2 72
Bogdan Marinescu 0:a792d4bf36c2 73 /** Copy constructor for events
Bogdan Marinescu 0:a792d4bf36c2 74 */
Bogdan Marinescu 0:a792d4bf36c2 75 Event(const Event &e) {
Bogdan Marinescu 0:a792d4bf36c2 76 _event = 0;
Bogdan Marinescu 0:a792d4bf36c2 77 if (e._event) {
Bogdan Marinescu 0:a792d4bf36c2 78 _event = e._event;
Bogdan Marinescu 0:a792d4bf36c2 79 _event->ref += 1;
Bogdan Marinescu 0:a792d4bf36c2 80 }
Bogdan Marinescu 0:a792d4bf36c2 81 }
Bogdan Marinescu 0:a792d4bf36c2 82
Bogdan Marinescu 0:a792d4bf36c2 83 /** Assignment operator for events
Bogdan Marinescu 0:a792d4bf36c2 84 */
Bogdan Marinescu 0:a792d4bf36c2 85 Event &operator=(const Event &that) {
Bogdan Marinescu 0:a792d4bf36c2 86 if (this != &that) {
Bogdan Marinescu 0:a792d4bf36c2 87 this->~Event();
Bogdan Marinescu 0:a792d4bf36c2 88 new (this) Event(that);
Bogdan Marinescu 0:a792d4bf36c2 89 }
Bogdan Marinescu 0:a792d4bf36c2 90
Bogdan Marinescu 0:a792d4bf36c2 91 return *this;
Bogdan Marinescu 0:a792d4bf36c2 92 }
Bogdan Marinescu 0:a792d4bf36c2 93
Bogdan Marinescu 0:a792d4bf36c2 94 /** Destructor for events
Bogdan Marinescu 0:a792d4bf36c2 95 */
Bogdan Marinescu 0:a792d4bf36c2 96 ~Event() {
Bogdan Marinescu 0:a792d4bf36c2 97 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 98 _event->ref -= 1;
Bogdan Marinescu 0:a792d4bf36c2 99 if (_event->ref == 0) {
Bogdan Marinescu 0:a792d4bf36c2 100 _event->dtor(_event);
Bogdan Marinescu 0:a792d4bf36c2 101 equeue_dealloc(_event->equeue, _event);
Bogdan Marinescu 0:a792d4bf36c2 102 }
Bogdan Marinescu 0:a792d4bf36c2 103 }
Bogdan Marinescu 0:a792d4bf36c2 104 }
Bogdan Marinescu 0:a792d4bf36c2 105
Bogdan Marinescu 0:a792d4bf36c2 106 /** Configure the delay of an event
Bogdan Marinescu 0:a792d4bf36c2 107 *
Bogdan Marinescu 0:a792d4bf36c2 108 * @param delay Millisecond delay before dispatching the event
Bogdan Marinescu 0:a792d4bf36c2 109 */
Bogdan Marinescu 0:a792d4bf36c2 110 void delay(int delay) {
Bogdan Marinescu 0:a792d4bf36c2 111 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 112 _event->delay = delay;
Bogdan Marinescu 0:a792d4bf36c2 113 }
Bogdan Marinescu 0:a792d4bf36c2 114 }
Bogdan Marinescu 0:a792d4bf36c2 115
Bogdan Marinescu 0:a792d4bf36c2 116 /** Configure the period of an event
Bogdan Marinescu 0:a792d4bf36c2 117 *
Bogdan Marinescu 0:a792d4bf36c2 118 * @param period Millisecond period for repeatedly dispatching an event
Bogdan Marinescu 0:a792d4bf36c2 119 */
Bogdan Marinescu 0:a792d4bf36c2 120 void period(int period) {
Bogdan Marinescu 0:a792d4bf36c2 121 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 122 _event->period = period;
Bogdan Marinescu 0:a792d4bf36c2 123 }
Bogdan Marinescu 0:a792d4bf36c2 124 }
Bogdan Marinescu 0:a792d4bf36c2 125
Bogdan Marinescu 0:a792d4bf36c2 126 /** Posts an event onto the underlying event queue
Bogdan Marinescu 0:a792d4bf36c2 127 *
Bogdan Marinescu 0:a792d4bf36c2 128 * The event is posted to the underlying queue and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 129 * context of the event queue's dispatch loop.
Bogdan Marinescu 0:a792d4bf36c2 130 *
Bogdan Marinescu 0:a792d4bf36c2 131 * The post function is irq safe and can act as a mechanism for moving
Bogdan Marinescu 0:a792d4bf36c2 132 * events out of irq contexts.
Bogdan Marinescu 0:a792d4bf36c2 133 *
Bogdan Marinescu 0:a792d4bf36c2 134 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 135 * @return A unique id that represents the posted event and can
Bogdan Marinescu 0:a792d4bf36c2 136 * be passed to EventQueue::cancel, or an id of 0 if
Bogdan Marinescu 0:a792d4bf36c2 137 * there is not enough memory to allocate the event.
Bogdan Marinescu 0:a792d4bf36c2 138 */
Bogdan Marinescu 0:a792d4bf36c2 139 int post() const {
Bogdan Marinescu 0:a792d4bf36c2 140 if (!_event) {
Bogdan Marinescu 0:a792d4bf36c2 141 return 0;
Bogdan Marinescu 0:a792d4bf36c2 142 }
Bogdan Marinescu 0:a792d4bf36c2 143
Bogdan Marinescu 0:a792d4bf36c2 144 _event->id = _event->post(_event);
Bogdan Marinescu 0:a792d4bf36c2 145 return _event->id;
Bogdan Marinescu 0:a792d4bf36c2 146 }
Bogdan Marinescu 0:a792d4bf36c2 147
Bogdan Marinescu 0:a792d4bf36c2 148 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 149 *
Bogdan Marinescu 0:a792d4bf36c2 150 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 151 */
Bogdan Marinescu 0:a792d4bf36c2 152 void call() const {
Christopher Haster 8:773de146a61c 153 MBED_UNUSED int id = post();
Bogdan Marinescu 0:a792d4bf36c2 154 MBED_ASSERT(id);
Bogdan Marinescu 0:a792d4bf36c2 155 }
Bogdan Marinescu 0:a792d4bf36c2 156
Bogdan Marinescu 0:a792d4bf36c2 157 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 158 *
Bogdan Marinescu 0:a792d4bf36c2 159 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 160 */
Bogdan Marinescu 0:a792d4bf36c2 161 void operator()() const {
Bogdan Marinescu 0:a792d4bf36c2 162 return call();
Bogdan Marinescu 0:a792d4bf36c2 163 }
Bogdan Marinescu 0:a792d4bf36c2 164
Bogdan Marinescu 0:a792d4bf36c2 165 /** Static thunk for passing as C-style function
Bogdan Marinescu 0:a792d4bf36c2 166 *
Bogdan Marinescu 0:a792d4bf36c2 167 * @param func Event to call passed as a void pointer
Bogdan Marinescu 0:a792d4bf36c2 168 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 169 */
Bogdan Marinescu 0:a792d4bf36c2 170 static void thunk(void *func) {
Bogdan Marinescu 0:a792d4bf36c2 171 return static_cast<Event*>(func)->call();
Bogdan Marinescu 0:a792d4bf36c2 172 }
Bogdan Marinescu 0:a792d4bf36c2 173
Bogdan Marinescu 0:a792d4bf36c2 174 /** Cancels the most recently posted event
Bogdan Marinescu 0:a792d4bf36c2 175 *
Bogdan Marinescu 0:a792d4bf36c2 176 * Attempts to cancel the most recently posted event. It is safe to call
Bogdan Marinescu 0:a792d4bf36c2 177 * cancel after an event has already been dispatched.
Bogdan Marinescu 0:a792d4bf36c2 178 *
Bogdan Marinescu 0:a792d4bf36c2 179 * The cancel function is irq safe.
Bogdan Marinescu 0:a792d4bf36c2 180 *
Bogdan Marinescu 0:a792d4bf36c2 181 * If called while the event queue's dispatch loop is active, the cancel
Bogdan Marinescu 0:a792d4bf36c2 182 * function does not garuntee that the event will not execute after it
Bogdan Marinescu 0:a792d4bf36c2 183 * returns, as the event may have already begun executing.
Bogdan Marinescu 0:a792d4bf36c2 184 */
Bogdan Marinescu 0:a792d4bf36c2 185 void cancel() const {
Bogdan Marinescu 0:a792d4bf36c2 186 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 187 equeue_cancel(_event->equeue, _event->id);
Bogdan Marinescu 0:a792d4bf36c2 188 }
Bogdan Marinescu 0:a792d4bf36c2 189 }
Bogdan Marinescu 0:a792d4bf36c2 190
Bogdan Marinescu 0:a792d4bf36c2 191 private:
Bogdan Marinescu 0:a792d4bf36c2 192 struct event {
Bogdan Marinescu 0:a792d4bf36c2 193 unsigned ref;
Bogdan Marinescu 0:a792d4bf36c2 194 equeue_t *equeue;
Bogdan Marinescu 0:a792d4bf36c2 195 int id;
Bogdan Marinescu 0:a792d4bf36c2 196
Bogdan Marinescu 0:a792d4bf36c2 197 int delay;
Bogdan Marinescu 0:a792d4bf36c2 198 int period;
Bogdan Marinescu 0:a792d4bf36c2 199
Bogdan Marinescu 0:a792d4bf36c2 200 int (*post)(struct event *);
Bogdan Marinescu 0:a792d4bf36c2 201 void (*dtor)(struct event *);
Bogdan Marinescu 0:a792d4bf36c2 202
Bogdan Marinescu 0:a792d4bf36c2 203 // F follows
Bogdan Marinescu 0:a792d4bf36c2 204 } *_event;
Bogdan Marinescu 0:a792d4bf36c2 205
Christopher Haster 4:f157c7bf01cc 206 // Event attributes
Christopher Haster 4:f157c7bf01cc 207 template <typename F>
Christopher Haster 4:f157c7bf01cc 208 static int event_post(struct event *e) {
Christopher Haster 4:f157c7bf01cc 209 typedef EventQueue::context00<F> C;
Christopher Haster 4:f157c7bf01cc 210 void *p = equeue_alloc(e->equeue, sizeof(C));
Christopher Haster 4:f157c7bf01cc 211 if (!p) {
Christopher Haster 4:f157c7bf01cc 212 return 0;
Christopher Haster 4:f157c7bf01cc 213 }
Christopher Haster 4:f157c7bf01cc 214
Christopher Haster 4:f157c7bf01cc 215 new (p) C(*(F*)(e + 1));
Christopher Haster 4:f157c7bf01cc 216 equeue_event_delay(p, e->delay);
Christopher Haster 4:f157c7bf01cc 217 equeue_event_period(p, e->period);
Christopher Haster 7:80510299c57c 218 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
Christopher Haster 7:80510299c57c 219 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
Christopher Haster 4:f157c7bf01cc 220 }
Christopher Haster 4:f157c7bf01cc 221
Christopher Haster 4:f157c7bf01cc 222 template <typename F>
Christopher Haster 4:f157c7bf01cc 223 static void event_dtor(struct event *e) {
Christopher Haster 4:f157c7bf01cc 224 ((F*)(e + 1))->~F();
Christopher Haster 4:f157c7bf01cc 225 }
Christopher Haster 4:f157c7bf01cc 226
Bogdan Marinescu 0:a792d4bf36c2 227 public:
Bogdan Marinescu 0:a792d4bf36c2 228 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 229 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 230 */
Bogdan Marinescu 0:a792d4bf36c2 231 template <typename F, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 232 Event(EventQueue *q, F f, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 233 new (this) Event(q, EventQueue::context10<F, C0>(f, c0));
Bogdan Marinescu 0:a792d4bf36c2 234 }
Bogdan Marinescu 0:a792d4bf36c2 235
Bogdan Marinescu 0:a792d4bf36c2 236 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 237 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 238 */
Bogdan Marinescu 0:a792d4bf36c2 239 template <typename F, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 240 Event(EventQueue *q, F f, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 241 new (this) Event(q, EventQueue::context20<F, C0, C1>(f, c0, c1));
Bogdan Marinescu 0:a792d4bf36c2 242 }
Bogdan Marinescu 0:a792d4bf36c2 243
Bogdan Marinescu 0:a792d4bf36c2 244 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 245 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 246 */
Bogdan Marinescu 0:a792d4bf36c2 247 template <typename F, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 248 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 249 new (this) Event(q, EventQueue::context30<F, C0, C1, C2>(f, c0, c1, c2));
Bogdan Marinescu 0:a792d4bf36c2 250 }
Bogdan Marinescu 0:a792d4bf36c2 251
Bogdan Marinescu 0:a792d4bf36c2 252 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 253 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 254 */
Bogdan Marinescu 0:a792d4bf36c2 255 template <typename F, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 256 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 257 new (this) Event(q, EventQueue::context40<F, C0, C1, C2, C3>(f, c0, c1, c2, c3));
Bogdan Marinescu 0:a792d4bf36c2 258 }
Bogdan Marinescu 0:a792d4bf36c2 259
Bogdan Marinescu 0:a792d4bf36c2 260 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 261 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 262 */
Bogdan Marinescu 0:a792d4bf36c2 263 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 264 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 265 new (this) Event(q, EventQueue::context50<F, C0, C1, C2, C3, C4>(f, c0, c1, c2, c3, c4));
Bogdan Marinescu 0:a792d4bf36c2 266 }
Bogdan Marinescu 0:a792d4bf36c2 267
Bogdan Marinescu 0:a792d4bf36c2 268 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 269 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 270 */
Bogdan Marinescu 0:a792d4bf36c2 271 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 272 Event(EventQueue *q, T *obj, R (T::*method)(B0), B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 273 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 274 }
Bogdan Marinescu 0:a792d4bf36c2 275
Bogdan Marinescu 0:a792d4bf36c2 276 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 277 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 278 */
Bogdan Marinescu 0:a792d4bf36c2 279 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 280 Event(EventQueue *q, const T *obj, R (T::*method)(B0) const, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 281 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 282 }
Bogdan Marinescu 0:a792d4bf36c2 283
Bogdan Marinescu 0:a792d4bf36c2 284 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 285 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 286 */
Bogdan Marinescu 0:a792d4bf36c2 287 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 288 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0) volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 289 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 290 }
Bogdan Marinescu 0:a792d4bf36c2 291
Bogdan Marinescu 0:a792d4bf36c2 292 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 293 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 294 */
Bogdan Marinescu 0:a792d4bf36c2 295 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 296 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0) const volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 297 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 298 }
Bogdan Marinescu 0:a792d4bf36c2 299
Bogdan Marinescu 0:a792d4bf36c2 300 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 301 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 302 */
Bogdan Marinescu 0:a792d4bf36c2 303 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 304 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1), B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 305 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 306 }
Bogdan Marinescu 0:a792d4bf36c2 307
Bogdan Marinescu 0:a792d4bf36c2 308 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 309 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 310 */
Bogdan Marinescu 0:a792d4bf36c2 311 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 312 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1) const, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 313 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 314 }
Bogdan Marinescu 0:a792d4bf36c2 315
Bogdan Marinescu 0:a792d4bf36c2 316 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 317 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 318 */
Bogdan Marinescu 0:a792d4bf36c2 319 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 320 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1) volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 321 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 322 }
Bogdan Marinescu 0:a792d4bf36c2 323
Bogdan Marinescu 0:a792d4bf36c2 324 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 325 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 326 */
Bogdan Marinescu 0:a792d4bf36c2 327 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 328 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1) const volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 329 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 330 }
Bogdan Marinescu 0:a792d4bf36c2 331
Bogdan Marinescu 0:a792d4bf36c2 332 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 333 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 334 */
Bogdan Marinescu 0:a792d4bf36c2 335 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 336 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2), B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 337 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 338 }
Bogdan Marinescu 0:a792d4bf36c2 339
Bogdan Marinescu 0:a792d4bf36c2 340 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 341 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 342 */
Bogdan Marinescu 0:a792d4bf36c2 343 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 344 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2) const, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 345 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 346 }
Bogdan Marinescu 0:a792d4bf36c2 347
Bogdan Marinescu 0:a792d4bf36c2 348 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 349 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 350 */
Bogdan Marinescu 0:a792d4bf36c2 351 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 352 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2) volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 353 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 354 }
Bogdan Marinescu 0:a792d4bf36c2 355
Bogdan Marinescu 0:a792d4bf36c2 356 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 357 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 358 */
Bogdan Marinescu 0:a792d4bf36c2 359 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 360 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2) const volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 361 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 362 }
Bogdan Marinescu 0:a792d4bf36c2 363
Bogdan Marinescu 0:a792d4bf36c2 364 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 365 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 366 */
Bogdan Marinescu 0:a792d4bf36c2 367 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 368 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3), B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 369 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 370 }
Bogdan Marinescu 0:a792d4bf36c2 371
Bogdan Marinescu 0:a792d4bf36c2 372 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 373 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 374 */
Bogdan Marinescu 0:a792d4bf36c2 375 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 376 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3) const, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 377 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 378 }
Bogdan Marinescu 0:a792d4bf36c2 379
Bogdan Marinescu 0:a792d4bf36c2 380 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 381 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 382 */
Bogdan Marinescu 0:a792d4bf36c2 383 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 384 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 385 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 386 }
Bogdan Marinescu 0:a792d4bf36c2 387
Bogdan Marinescu 0:a792d4bf36c2 388 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 389 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 390 */
Bogdan Marinescu 0:a792d4bf36c2 391 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 392 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 393 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 394 }
Bogdan Marinescu 0:a792d4bf36c2 395
Bogdan Marinescu 0:a792d4bf36c2 396 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 397 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 398 */
Bogdan Marinescu 0:a792d4bf36c2 399 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 400 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 401 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 402 }
Bogdan Marinescu 0:a792d4bf36c2 403
Bogdan Marinescu 0:a792d4bf36c2 404 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 405 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 406 */
Bogdan Marinescu 0:a792d4bf36c2 407 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 408 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 409 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 410 }
Bogdan Marinescu 0:a792d4bf36c2 411
Bogdan Marinescu 0:a792d4bf36c2 412 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 413 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 414 */
Bogdan Marinescu 0:a792d4bf36c2 415 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 416 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 417 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 418 }
Bogdan Marinescu 0:a792d4bf36c2 419
Bogdan Marinescu 0:a792d4bf36c2 420 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 421 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 422 */
Bogdan Marinescu 0:a792d4bf36c2 423 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 424 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 425 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 426 }
Bogdan Marinescu 0:a792d4bf36c2 427 };
Bogdan Marinescu 0:a792d4bf36c2 428
Bogdan Marinescu 0:a792d4bf36c2 429 /** Event
Bogdan Marinescu 0:a792d4bf36c2 430 *
Bogdan Marinescu 0:a792d4bf36c2 431 * Representation of an event for fine-grain dispatch control
Bogdan Marinescu 0:a792d4bf36c2 432 */
Bogdan Marinescu 0:a792d4bf36c2 433 template <typename A0>
Bogdan Marinescu 0:a792d4bf36c2 434 class Event<void(A0)> {
Bogdan Marinescu 0:a792d4bf36c2 435 public:
Bogdan Marinescu 0:a792d4bf36c2 436 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 437 *
Bogdan Marinescu 0:a792d4bf36c2 438 * Constructs an event bound to the specified event queue. The specified
Bogdan Marinescu 0:a792d4bf36c2 439 * callback acts as the target for the event and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 440 * context of the event queue's dispatch loop once posted.
Bogdan Marinescu 0:a792d4bf36c2 441 *
Bogdan Marinescu 0:a792d4bf36c2 442 * @param q Event queue to dispatch on
Bogdan Marinescu 0:a792d4bf36c2 443 * @param f Function to execute when the event is dispatched
Christopher Haster 15:42ba4ffdf78d 444 * @param c0..c4 Arguments to bind to the callback, these arguments are
Christopher Haster 15:42ba4ffdf78d 445 * allocated on an irq-safe allocator from the event queue's
Christopher Haster 15:42ba4ffdf78d 446 * memory pool. Must be type-compatible with b0..b4, the
Christopher Haster 15:42ba4ffdf78d 447 * arguments to the underlying callback.
Bogdan Marinescu 0:a792d4bf36c2 448 */
Bogdan Marinescu 0:a792d4bf36c2 449 template <typename F>
Bogdan Marinescu 0:a792d4bf36c2 450 Event(EventQueue *q, F f) {
Bogdan Marinescu 0:a792d4bf36c2 451 _event = static_cast<struct event *>(
Bogdan Marinescu 0:a792d4bf36c2 452 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
Christopher Haster 4:f157c7bf01cc 453
Bogdan Marinescu 0:a792d4bf36c2 454 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 455 _event->equeue = &q->_equeue;
Bogdan Marinescu 0:a792d4bf36c2 456 _event->id = 0;
Bogdan Marinescu 0:a792d4bf36c2 457 _event->delay = 0;
Bogdan Marinescu 0:a792d4bf36c2 458 _event->period = -1;
Bogdan Marinescu 0:a792d4bf36c2 459
Christopher Haster 4:f157c7bf01cc 460 _event->post = &Event::event_post<F>;
Christopher Haster 4:f157c7bf01cc 461 _event->dtor = &Event::event_dtor<F>;
Bogdan Marinescu 0:a792d4bf36c2 462
Bogdan Marinescu 0:a792d4bf36c2 463 new (_event+1) F(f);
Bogdan Marinescu 0:a792d4bf36c2 464
Bogdan Marinescu 0:a792d4bf36c2 465 _event->ref = 1;
Bogdan Marinescu 0:a792d4bf36c2 466 }
Bogdan Marinescu 0:a792d4bf36c2 467 }
Bogdan Marinescu 0:a792d4bf36c2 468
Bogdan Marinescu 0:a792d4bf36c2 469 /** Copy constructor for events
Bogdan Marinescu 0:a792d4bf36c2 470 */
Bogdan Marinescu 0:a792d4bf36c2 471 Event(const Event &e) {
Bogdan Marinescu 0:a792d4bf36c2 472 _event = 0;
Bogdan Marinescu 0:a792d4bf36c2 473 if (e._event) {
Bogdan Marinescu 0:a792d4bf36c2 474 _event = e._event;
Bogdan Marinescu 0:a792d4bf36c2 475 _event->ref += 1;
Bogdan Marinescu 0:a792d4bf36c2 476 }
Bogdan Marinescu 0:a792d4bf36c2 477 }
Bogdan Marinescu 0:a792d4bf36c2 478
Bogdan Marinescu 0:a792d4bf36c2 479 /** Assignment operator for events
Bogdan Marinescu 0:a792d4bf36c2 480 */
Bogdan Marinescu 0:a792d4bf36c2 481 Event &operator=(const Event &that) {
Bogdan Marinescu 0:a792d4bf36c2 482 if (this != &that) {
Bogdan Marinescu 0:a792d4bf36c2 483 this->~Event();
Bogdan Marinescu 0:a792d4bf36c2 484 new (this) Event(that);
Bogdan Marinescu 0:a792d4bf36c2 485 }
Bogdan Marinescu 0:a792d4bf36c2 486
Bogdan Marinescu 0:a792d4bf36c2 487 return *this;
Bogdan Marinescu 0:a792d4bf36c2 488 }
Bogdan Marinescu 0:a792d4bf36c2 489
Bogdan Marinescu 0:a792d4bf36c2 490 /** Destructor for events
Bogdan Marinescu 0:a792d4bf36c2 491 */
Bogdan Marinescu 0:a792d4bf36c2 492 ~Event() {
Bogdan Marinescu 0:a792d4bf36c2 493 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 494 _event->ref -= 1;
Bogdan Marinescu 0:a792d4bf36c2 495 if (_event->ref == 0) {
Bogdan Marinescu 0:a792d4bf36c2 496 _event->dtor(_event);
Bogdan Marinescu 0:a792d4bf36c2 497 equeue_dealloc(_event->equeue, _event);
Bogdan Marinescu 0:a792d4bf36c2 498 }
Bogdan Marinescu 0:a792d4bf36c2 499 }
Bogdan Marinescu 0:a792d4bf36c2 500 }
Bogdan Marinescu 0:a792d4bf36c2 501
Bogdan Marinescu 0:a792d4bf36c2 502 /** Configure the delay of an event
Bogdan Marinescu 0:a792d4bf36c2 503 *
Bogdan Marinescu 0:a792d4bf36c2 504 * @param delay Millisecond delay before dispatching the event
Bogdan Marinescu 0:a792d4bf36c2 505 */
Bogdan Marinescu 0:a792d4bf36c2 506 void delay(int delay) {
Bogdan Marinescu 0:a792d4bf36c2 507 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 508 _event->delay = delay;
Bogdan Marinescu 0:a792d4bf36c2 509 }
Bogdan Marinescu 0:a792d4bf36c2 510 }
Bogdan Marinescu 0:a792d4bf36c2 511
Bogdan Marinescu 0:a792d4bf36c2 512 /** Configure the period of an event
Bogdan Marinescu 0:a792d4bf36c2 513 *
Bogdan Marinescu 0:a792d4bf36c2 514 * @param period Millisecond period for repeatedly dispatching an event
Bogdan Marinescu 0:a792d4bf36c2 515 */
Bogdan Marinescu 0:a792d4bf36c2 516 void period(int period) {
Bogdan Marinescu 0:a792d4bf36c2 517 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 518 _event->period = period;
Bogdan Marinescu 0:a792d4bf36c2 519 }
Bogdan Marinescu 0:a792d4bf36c2 520 }
Bogdan Marinescu 0:a792d4bf36c2 521
Bogdan Marinescu 0:a792d4bf36c2 522 /** Posts an event onto the underlying event queue
Bogdan Marinescu 0:a792d4bf36c2 523 *
Bogdan Marinescu 0:a792d4bf36c2 524 * The event is posted to the underlying queue and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 525 * context of the event queue's dispatch loop.
Bogdan Marinescu 0:a792d4bf36c2 526 *
Bogdan Marinescu 0:a792d4bf36c2 527 * The post function is irq safe and can act as a mechanism for moving
Bogdan Marinescu 0:a792d4bf36c2 528 * events out of irq contexts.
Bogdan Marinescu 0:a792d4bf36c2 529 *
Bogdan Marinescu 0:a792d4bf36c2 530 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 531 * @return A unique id that represents the posted event and can
Bogdan Marinescu 0:a792d4bf36c2 532 * be passed to EventQueue::cancel, or an id of 0 if
Bogdan Marinescu 0:a792d4bf36c2 533 * there is not enough memory to allocate the event.
Bogdan Marinescu 0:a792d4bf36c2 534 */
Bogdan Marinescu 0:a792d4bf36c2 535 int post(A0 a0) const {
Bogdan Marinescu 0:a792d4bf36c2 536 if (!_event) {
Bogdan Marinescu 0:a792d4bf36c2 537 return 0;
Bogdan Marinescu 0:a792d4bf36c2 538 }
Bogdan Marinescu 0:a792d4bf36c2 539
Bogdan Marinescu 0:a792d4bf36c2 540 _event->id = _event->post(_event, a0);
Bogdan Marinescu 0:a792d4bf36c2 541 return _event->id;
Bogdan Marinescu 0:a792d4bf36c2 542 }
Bogdan Marinescu 0:a792d4bf36c2 543
Bogdan Marinescu 0:a792d4bf36c2 544 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 545 *
Bogdan Marinescu 0:a792d4bf36c2 546 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 547 */
Bogdan Marinescu 0:a792d4bf36c2 548 void call(A0 a0) const {
Christopher Haster 8:773de146a61c 549 MBED_UNUSED int id = post(a0);
Bogdan Marinescu 0:a792d4bf36c2 550 MBED_ASSERT(id);
Bogdan Marinescu 0:a792d4bf36c2 551 }
Bogdan Marinescu 0:a792d4bf36c2 552
Bogdan Marinescu 0:a792d4bf36c2 553 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 554 *
Bogdan Marinescu 0:a792d4bf36c2 555 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 556 */
Bogdan Marinescu 0:a792d4bf36c2 557 void operator()(A0 a0) const {
Bogdan Marinescu 0:a792d4bf36c2 558 return call(a0);
Bogdan Marinescu 0:a792d4bf36c2 559 }
Bogdan Marinescu 0:a792d4bf36c2 560
Bogdan Marinescu 0:a792d4bf36c2 561 /** Static thunk for passing as C-style function
Bogdan Marinescu 0:a792d4bf36c2 562 *
Bogdan Marinescu 0:a792d4bf36c2 563 * @param func Event to call passed as a void pointer
Bogdan Marinescu 0:a792d4bf36c2 564 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 565 */
Bogdan Marinescu 0:a792d4bf36c2 566 static void thunk(void *func, A0 a0) {
Bogdan Marinescu 0:a792d4bf36c2 567 return static_cast<Event*>(func)->call(a0);
Bogdan Marinescu 0:a792d4bf36c2 568 }
Bogdan Marinescu 0:a792d4bf36c2 569
Bogdan Marinescu 0:a792d4bf36c2 570 /** Cancels the most recently posted event
Bogdan Marinescu 0:a792d4bf36c2 571 *
Bogdan Marinescu 0:a792d4bf36c2 572 * Attempts to cancel the most recently posted event. It is safe to call
Bogdan Marinescu 0:a792d4bf36c2 573 * cancel after an event has already been dispatched.
Bogdan Marinescu 0:a792d4bf36c2 574 *
Bogdan Marinescu 0:a792d4bf36c2 575 * The cancel function is irq safe.
Bogdan Marinescu 0:a792d4bf36c2 576 *
Bogdan Marinescu 0:a792d4bf36c2 577 * If called while the event queue's dispatch loop is active, the cancel
Bogdan Marinescu 0:a792d4bf36c2 578 * function does not garuntee that the event will not execute after it
Bogdan Marinescu 0:a792d4bf36c2 579 * returns, as the event may have already begun executing.
Bogdan Marinescu 0:a792d4bf36c2 580 */
Bogdan Marinescu 0:a792d4bf36c2 581 void cancel() const {
Bogdan Marinescu 0:a792d4bf36c2 582 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 583 equeue_cancel(_event->equeue, _event->id);
Bogdan Marinescu 0:a792d4bf36c2 584 }
Bogdan Marinescu 0:a792d4bf36c2 585 }
Bogdan Marinescu 0:a792d4bf36c2 586
Bogdan Marinescu 0:a792d4bf36c2 587 private:
Bogdan Marinescu 0:a792d4bf36c2 588 struct event {
Bogdan Marinescu 0:a792d4bf36c2 589 unsigned ref;
Bogdan Marinescu 0:a792d4bf36c2 590 equeue_t *equeue;
Bogdan Marinescu 0:a792d4bf36c2 591 int id;
Bogdan Marinescu 0:a792d4bf36c2 592
Bogdan Marinescu 0:a792d4bf36c2 593 int delay;
Bogdan Marinescu 0:a792d4bf36c2 594 int period;
Bogdan Marinescu 0:a792d4bf36c2 595
Bogdan Marinescu 0:a792d4bf36c2 596 int (*post)(struct event *, A0 a0);
Bogdan Marinescu 0:a792d4bf36c2 597 void (*dtor)(struct event *);
Bogdan Marinescu 0:a792d4bf36c2 598
Bogdan Marinescu 0:a792d4bf36c2 599 // F follows
Bogdan Marinescu 0:a792d4bf36c2 600 } *_event;
Bogdan Marinescu 0:a792d4bf36c2 601
Christopher Haster 4:f157c7bf01cc 602 // Event attributes
Christopher Haster 4:f157c7bf01cc 603 template <typename F>
Christopher Haster 4:f157c7bf01cc 604 static int event_post(struct event *e, A0 a0) {
Christopher Haster 4:f157c7bf01cc 605 typedef EventQueue::context10<F, A0> C;
Christopher Haster 4:f157c7bf01cc 606 void *p = equeue_alloc(e->equeue, sizeof(C));
Christopher Haster 4:f157c7bf01cc 607 if (!p) {
Christopher Haster 4:f157c7bf01cc 608 return 0;
Christopher Haster 4:f157c7bf01cc 609 }
Christopher Haster 4:f157c7bf01cc 610
Christopher Haster 4:f157c7bf01cc 611 new (p) C(*(F*)(e + 1), a0);
Christopher Haster 4:f157c7bf01cc 612 equeue_event_delay(p, e->delay);
Christopher Haster 4:f157c7bf01cc 613 equeue_event_period(p, e->period);
Christopher Haster 7:80510299c57c 614 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
Christopher Haster 7:80510299c57c 615 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
Christopher Haster 4:f157c7bf01cc 616 }
Christopher Haster 4:f157c7bf01cc 617
Christopher Haster 4:f157c7bf01cc 618 template <typename F>
Christopher Haster 4:f157c7bf01cc 619 static void event_dtor(struct event *e) {
Christopher Haster 4:f157c7bf01cc 620 ((F*)(e + 1))->~F();
Christopher Haster 4:f157c7bf01cc 621 }
Christopher Haster 4:f157c7bf01cc 622
Bogdan Marinescu 0:a792d4bf36c2 623 public:
Bogdan Marinescu 0:a792d4bf36c2 624 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 625 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 626 */
Bogdan Marinescu 0:a792d4bf36c2 627 template <typename F, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 628 Event(EventQueue *q, F f, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 629 new (this) Event(q, EventQueue::context11<F, C0, A0>(f, c0));
Bogdan Marinescu 0:a792d4bf36c2 630 }
Bogdan Marinescu 0:a792d4bf36c2 631
Bogdan Marinescu 0:a792d4bf36c2 632 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 633 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 634 */
Bogdan Marinescu 0:a792d4bf36c2 635 template <typename F, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 636 Event(EventQueue *q, F f, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 637 new (this) Event(q, EventQueue::context21<F, C0, C1, A0>(f, c0, c1));
Bogdan Marinescu 0:a792d4bf36c2 638 }
Bogdan Marinescu 0:a792d4bf36c2 639
Bogdan Marinescu 0:a792d4bf36c2 640 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 641 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 642 */
Bogdan Marinescu 0:a792d4bf36c2 643 template <typename F, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 644 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 645 new (this) Event(q, EventQueue::context31<F, C0, C1, C2, A0>(f, c0, c1, c2));
Bogdan Marinescu 0:a792d4bf36c2 646 }
Bogdan Marinescu 0:a792d4bf36c2 647
Bogdan Marinescu 0:a792d4bf36c2 648 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 649 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 650 */
Bogdan Marinescu 0:a792d4bf36c2 651 template <typename F, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 652 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 653 new (this) Event(q, EventQueue::context41<F, C0, C1, C2, C3, A0>(f, c0, c1, c2, c3));
Bogdan Marinescu 0:a792d4bf36c2 654 }
Bogdan Marinescu 0:a792d4bf36c2 655
Bogdan Marinescu 0:a792d4bf36c2 656 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 657 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 658 */
Bogdan Marinescu 0:a792d4bf36c2 659 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 660 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 661 new (this) Event(q, EventQueue::context51<F, C0, C1, C2, C3, C4, A0>(f, c0, c1, c2, c3, c4));
Bogdan Marinescu 0:a792d4bf36c2 662 }
Bogdan Marinescu 0:a792d4bf36c2 663
Bogdan Marinescu 0:a792d4bf36c2 664 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 665 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 666 */
Bogdan Marinescu 0:a792d4bf36c2 667 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 668 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0), B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 669 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 670 }
Bogdan Marinescu 0:a792d4bf36c2 671
Bogdan Marinescu 0:a792d4bf36c2 672 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 673 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 674 */
Bogdan Marinescu 0:a792d4bf36c2 675 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 676 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0) const, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 677 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 678 }
Bogdan Marinescu 0:a792d4bf36c2 679
Bogdan Marinescu 0:a792d4bf36c2 680 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 681 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 682 */
Bogdan Marinescu 0:a792d4bf36c2 683 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 684 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0) volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 685 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 686 }
Bogdan Marinescu 0:a792d4bf36c2 687
Bogdan Marinescu 0:a792d4bf36c2 688 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 689 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 690 */
Bogdan Marinescu 0:a792d4bf36c2 691 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 692 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0) const volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 693 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 694 }
Bogdan Marinescu 0:a792d4bf36c2 695
Bogdan Marinescu 0:a792d4bf36c2 696 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 697 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 698 */
Bogdan Marinescu 0:a792d4bf36c2 699 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 700 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0), B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 701 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 702 }
Bogdan Marinescu 0:a792d4bf36c2 703
Bogdan Marinescu 0:a792d4bf36c2 704 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 705 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 706 */
Bogdan Marinescu 0:a792d4bf36c2 707 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 708 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0) const, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 709 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 710 }
Bogdan Marinescu 0:a792d4bf36c2 711
Bogdan Marinescu 0:a792d4bf36c2 712 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 713 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 714 */
Bogdan Marinescu 0:a792d4bf36c2 715 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 716 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0) volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 717 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 718 }
Bogdan Marinescu 0:a792d4bf36c2 719
Bogdan Marinescu 0:a792d4bf36c2 720 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 721 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 722 */
Bogdan Marinescu 0:a792d4bf36c2 723 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 724 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0) const volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 725 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 726 }
Bogdan Marinescu 0:a792d4bf36c2 727
Bogdan Marinescu 0:a792d4bf36c2 728 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 729 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 730 */
Bogdan Marinescu 0:a792d4bf36c2 731 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 732 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0), B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 733 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 734 }
Bogdan Marinescu 0:a792d4bf36c2 735
Bogdan Marinescu 0:a792d4bf36c2 736 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 737 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 738 */
Bogdan Marinescu 0:a792d4bf36c2 739 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 740 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0) const, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 741 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 742 }
Bogdan Marinescu 0:a792d4bf36c2 743
Bogdan Marinescu 0:a792d4bf36c2 744 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 745 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 746 */
Bogdan Marinescu 0:a792d4bf36c2 747 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 748 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0) volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 749 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 750 }
Bogdan Marinescu 0:a792d4bf36c2 751
Bogdan Marinescu 0:a792d4bf36c2 752 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 753 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 754 */
Bogdan Marinescu 0:a792d4bf36c2 755 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 756 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0) const volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 757 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 758 }
Bogdan Marinescu 0:a792d4bf36c2 759
Bogdan Marinescu 0:a792d4bf36c2 760 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 761 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 762 */
Bogdan Marinescu 0:a792d4bf36c2 763 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 764 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0), B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 765 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 766 }
Bogdan Marinescu 0:a792d4bf36c2 767
Bogdan Marinescu 0:a792d4bf36c2 768 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 769 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 770 */
Bogdan Marinescu 0:a792d4bf36c2 771 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 772 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0) const, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 773 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 774 }
Bogdan Marinescu 0:a792d4bf36c2 775
Bogdan Marinescu 0:a792d4bf36c2 776 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 777 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 778 */
Bogdan Marinescu 0:a792d4bf36c2 779 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 780 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 781 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 782 }
Bogdan Marinescu 0:a792d4bf36c2 783
Bogdan Marinescu 0:a792d4bf36c2 784 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 785 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 786 */
Bogdan Marinescu 0:a792d4bf36c2 787 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 788 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 789 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 790 }
Bogdan Marinescu 0:a792d4bf36c2 791
Bogdan Marinescu 0:a792d4bf36c2 792 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 793 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 794 */
Bogdan Marinescu 0:a792d4bf36c2 795 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 796 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 797 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 798 }
Bogdan Marinescu 0:a792d4bf36c2 799
Bogdan Marinescu 0:a792d4bf36c2 800 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 801 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 802 */
Bogdan Marinescu 0:a792d4bf36c2 803 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 804 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 805 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 806 }
Bogdan Marinescu 0:a792d4bf36c2 807
Bogdan Marinescu 0:a792d4bf36c2 808 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 809 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 810 */
Bogdan Marinescu 0:a792d4bf36c2 811 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 812 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 813 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 814 }
Bogdan Marinescu 0:a792d4bf36c2 815
Bogdan Marinescu 0:a792d4bf36c2 816 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 817 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 818 */
Bogdan Marinescu 0:a792d4bf36c2 819 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 820 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 821 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 822 }
Bogdan Marinescu 0:a792d4bf36c2 823 };
Bogdan Marinescu 0:a792d4bf36c2 824
Bogdan Marinescu 0:a792d4bf36c2 825 /** Event
Bogdan Marinescu 0:a792d4bf36c2 826 *
Bogdan Marinescu 0:a792d4bf36c2 827 * Representation of an event for fine-grain dispatch control
Bogdan Marinescu 0:a792d4bf36c2 828 */
Bogdan Marinescu 0:a792d4bf36c2 829 template <typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 830 class Event<void(A0, A1)> {
Bogdan Marinescu 0:a792d4bf36c2 831 public:
Bogdan Marinescu 0:a792d4bf36c2 832 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 833 *
Bogdan Marinescu 0:a792d4bf36c2 834 * Constructs an event bound to the specified event queue. The specified
Bogdan Marinescu 0:a792d4bf36c2 835 * callback acts as the target for the event and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 836 * context of the event queue's dispatch loop once posted.
Bogdan Marinescu 0:a792d4bf36c2 837 *
Bogdan Marinescu 0:a792d4bf36c2 838 * @param q Event queue to dispatch on
Bogdan Marinescu 0:a792d4bf36c2 839 * @param f Function to execute when the event is dispatched
Christopher Haster 15:42ba4ffdf78d 840 * @param c0..c4 Arguments to bind to the callback, these arguments are
Christopher Haster 15:42ba4ffdf78d 841 * allocated on an irq-safe allocator from the event queue's
Christopher Haster 15:42ba4ffdf78d 842 * memory pool. Must be type-compatible with b0..b4, the
Christopher Haster 15:42ba4ffdf78d 843 * arguments to the underlying callback.
Bogdan Marinescu 0:a792d4bf36c2 844 */
Bogdan Marinescu 0:a792d4bf36c2 845 template <typename F>
Bogdan Marinescu 0:a792d4bf36c2 846 Event(EventQueue *q, F f) {
Bogdan Marinescu 0:a792d4bf36c2 847 _event = static_cast<struct event *>(
Bogdan Marinescu 0:a792d4bf36c2 848 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
Christopher Haster 4:f157c7bf01cc 849
Bogdan Marinescu 0:a792d4bf36c2 850 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 851 _event->equeue = &q->_equeue;
Bogdan Marinescu 0:a792d4bf36c2 852 _event->id = 0;
Bogdan Marinescu 0:a792d4bf36c2 853 _event->delay = 0;
Bogdan Marinescu 0:a792d4bf36c2 854 _event->period = -1;
Bogdan Marinescu 0:a792d4bf36c2 855
Christopher Haster 4:f157c7bf01cc 856 _event->post = &Event::event_post<F>;
Christopher Haster 4:f157c7bf01cc 857 _event->dtor = &Event::event_dtor<F>;
Bogdan Marinescu 0:a792d4bf36c2 858
Bogdan Marinescu 0:a792d4bf36c2 859 new (_event+1) F(f);
Bogdan Marinescu 0:a792d4bf36c2 860
Bogdan Marinescu 0:a792d4bf36c2 861 _event->ref = 1;
Bogdan Marinescu 0:a792d4bf36c2 862 }
Bogdan Marinescu 0:a792d4bf36c2 863 }
Bogdan Marinescu 0:a792d4bf36c2 864
Bogdan Marinescu 0:a792d4bf36c2 865 /** Copy constructor for events
Bogdan Marinescu 0:a792d4bf36c2 866 */
Bogdan Marinescu 0:a792d4bf36c2 867 Event(const Event &e) {
Bogdan Marinescu 0:a792d4bf36c2 868 _event = 0;
Bogdan Marinescu 0:a792d4bf36c2 869 if (e._event) {
Bogdan Marinescu 0:a792d4bf36c2 870 _event = e._event;
Bogdan Marinescu 0:a792d4bf36c2 871 _event->ref += 1;
Bogdan Marinescu 0:a792d4bf36c2 872 }
Bogdan Marinescu 0:a792d4bf36c2 873 }
Bogdan Marinescu 0:a792d4bf36c2 874
Bogdan Marinescu 0:a792d4bf36c2 875 /** Assignment operator for events
Bogdan Marinescu 0:a792d4bf36c2 876 */
Bogdan Marinescu 0:a792d4bf36c2 877 Event &operator=(const Event &that) {
Bogdan Marinescu 0:a792d4bf36c2 878 if (this != &that) {
Bogdan Marinescu 0:a792d4bf36c2 879 this->~Event();
Bogdan Marinescu 0:a792d4bf36c2 880 new (this) Event(that);
Bogdan Marinescu 0:a792d4bf36c2 881 }
Bogdan Marinescu 0:a792d4bf36c2 882
Bogdan Marinescu 0:a792d4bf36c2 883 return *this;
Bogdan Marinescu 0:a792d4bf36c2 884 }
Bogdan Marinescu 0:a792d4bf36c2 885
Bogdan Marinescu 0:a792d4bf36c2 886 /** Destructor for events
Bogdan Marinescu 0:a792d4bf36c2 887 */
Bogdan Marinescu 0:a792d4bf36c2 888 ~Event() {
Bogdan Marinescu 0:a792d4bf36c2 889 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 890 _event->ref -= 1;
Bogdan Marinescu 0:a792d4bf36c2 891 if (_event->ref == 0) {
Bogdan Marinescu 0:a792d4bf36c2 892 _event->dtor(_event);
Bogdan Marinescu 0:a792d4bf36c2 893 equeue_dealloc(_event->equeue, _event);
Bogdan Marinescu 0:a792d4bf36c2 894 }
Bogdan Marinescu 0:a792d4bf36c2 895 }
Bogdan Marinescu 0:a792d4bf36c2 896 }
Bogdan Marinescu 0:a792d4bf36c2 897
Bogdan Marinescu 0:a792d4bf36c2 898 /** Configure the delay of an event
Bogdan Marinescu 0:a792d4bf36c2 899 *
Bogdan Marinescu 0:a792d4bf36c2 900 * @param delay Millisecond delay before dispatching the event
Bogdan Marinescu 0:a792d4bf36c2 901 */
Bogdan Marinescu 0:a792d4bf36c2 902 void delay(int delay) {
Bogdan Marinescu 0:a792d4bf36c2 903 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 904 _event->delay = delay;
Bogdan Marinescu 0:a792d4bf36c2 905 }
Bogdan Marinescu 0:a792d4bf36c2 906 }
Bogdan Marinescu 0:a792d4bf36c2 907
Bogdan Marinescu 0:a792d4bf36c2 908 /** Configure the period of an event
Bogdan Marinescu 0:a792d4bf36c2 909 *
Bogdan Marinescu 0:a792d4bf36c2 910 * @param period Millisecond period for repeatedly dispatching an event
Bogdan Marinescu 0:a792d4bf36c2 911 */
Bogdan Marinescu 0:a792d4bf36c2 912 void period(int period) {
Bogdan Marinescu 0:a792d4bf36c2 913 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 914 _event->period = period;
Bogdan Marinescu 0:a792d4bf36c2 915 }
Bogdan Marinescu 0:a792d4bf36c2 916 }
Bogdan Marinescu 0:a792d4bf36c2 917
Bogdan Marinescu 0:a792d4bf36c2 918 /** Posts an event onto the underlying event queue
Bogdan Marinescu 0:a792d4bf36c2 919 *
Bogdan Marinescu 0:a792d4bf36c2 920 * The event is posted to the underlying queue and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 921 * context of the event queue's dispatch loop.
Bogdan Marinescu 0:a792d4bf36c2 922 *
Bogdan Marinescu 0:a792d4bf36c2 923 * The post function is irq safe and can act as a mechanism for moving
Bogdan Marinescu 0:a792d4bf36c2 924 * events out of irq contexts.
Bogdan Marinescu 0:a792d4bf36c2 925 *
Bogdan Marinescu 0:a792d4bf36c2 926 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 927 * @return A unique id that represents the posted event and can
Bogdan Marinescu 0:a792d4bf36c2 928 * be passed to EventQueue::cancel, or an id of 0 if
Bogdan Marinescu 0:a792d4bf36c2 929 * there is not enough memory to allocate the event.
Bogdan Marinescu 0:a792d4bf36c2 930 */
Bogdan Marinescu 0:a792d4bf36c2 931 int post(A0 a0, A1 a1) const {
Bogdan Marinescu 0:a792d4bf36c2 932 if (!_event) {
Bogdan Marinescu 0:a792d4bf36c2 933 return 0;
Bogdan Marinescu 0:a792d4bf36c2 934 }
Bogdan Marinescu 0:a792d4bf36c2 935
Bogdan Marinescu 0:a792d4bf36c2 936 _event->id = _event->post(_event, a0, a1);
Bogdan Marinescu 0:a792d4bf36c2 937 return _event->id;
Bogdan Marinescu 0:a792d4bf36c2 938 }
Bogdan Marinescu 0:a792d4bf36c2 939
Bogdan Marinescu 0:a792d4bf36c2 940 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 941 *
Bogdan Marinescu 0:a792d4bf36c2 942 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 943 */
Bogdan Marinescu 0:a792d4bf36c2 944 void call(A0 a0, A1 a1) const {
Christopher Haster 8:773de146a61c 945 MBED_UNUSED int id = post(a0, a1);
Bogdan Marinescu 0:a792d4bf36c2 946 MBED_ASSERT(id);
Bogdan Marinescu 0:a792d4bf36c2 947 }
Bogdan Marinescu 0:a792d4bf36c2 948
Bogdan Marinescu 0:a792d4bf36c2 949 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 950 *
Bogdan Marinescu 0:a792d4bf36c2 951 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 952 */
Bogdan Marinescu 0:a792d4bf36c2 953 void operator()(A0 a0, A1 a1) const {
Bogdan Marinescu 0:a792d4bf36c2 954 return call(a0, a1);
Bogdan Marinescu 0:a792d4bf36c2 955 }
Bogdan Marinescu 0:a792d4bf36c2 956
Bogdan Marinescu 0:a792d4bf36c2 957 /** Static thunk for passing as C-style function
Bogdan Marinescu 0:a792d4bf36c2 958 *
Bogdan Marinescu 0:a792d4bf36c2 959 * @param func Event to call passed as a void pointer
Bogdan Marinescu 0:a792d4bf36c2 960 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 961 */
Bogdan Marinescu 0:a792d4bf36c2 962 static void thunk(void *func, A0 a0, A1 a1) {
Bogdan Marinescu 0:a792d4bf36c2 963 return static_cast<Event*>(func)->call(a0, a1);
Bogdan Marinescu 0:a792d4bf36c2 964 }
Bogdan Marinescu 0:a792d4bf36c2 965
Bogdan Marinescu 0:a792d4bf36c2 966 /** Cancels the most recently posted event
Bogdan Marinescu 0:a792d4bf36c2 967 *
Bogdan Marinescu 0:a792d4bf36c2 968 * Attempts to cancel the most recently posted event. It is safe to call
Bogdan Marinescu 0:a792d4bf36c2 969 * cancel after an event has already been dispatched.
Bogdan Marinescu 0:a792d4bf36c2 970 *
Bogdan Marinescu 0:a792d4bf36c2 971 * The cancel function is irq safe.
Bogdan Marinescu 0:a792d4bf36c2 972 *
Bogdan Marinescu 0:a792d4bf36c2 973 * If called while the event queue's dispatch loop is active, the cancel
Bogdan Marinescu 0:a792d4bf36c2 974 * function does not garuntee that the event will not execute after it
Bogdan Marinescu 0:a792d4bf36c2 975 * returns, as the event may have already begun executing.
Bogdan Marinescu 0:a792d4bf36c2 976 */
Bogdan Marinescu 0:a792d4bf36c2 977 void cancel() const {
Bogdan Marinescu 0:a792d4bf36c2 978 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 979 equeue_cancel(_event->equeue, _event->id);
Bogdan Marinescu 0:a792d4bf36c2 980 }
Bogdan Marinescu 0:a792d4bf36c2 981 }
Bogdan Marinescu 0:a792d4bf36c2 982
Bogdan Marinescu 0:a792d4bf36c2 983 private:
Bogdan Marinescu 0:a792d4bf36c2 984 struct event {
Bogdan Marinescu 0:a792d4bf36c2 985 unsigned ref;
Bogdan Marinescu 0:a792d4bf36c2 986 equeue_t *equeue;
Bogdan Marinescu 0:a792d4bf36c2 987 int id;
Bogdan Marinescu 0:a792d4bf36c2 988
Bogdan Marinescu 0:a792d4bf36c2 989 int delay;
Bogdan Marinescu 0:a792d4bf36c2 990 int period;
Bogdan Marinescu 0:a792d4bf36c2 991
Bogdan Marinescu 0:a792d4bf36c2 992 int (*post)(struct event *, A0 a0, A1 a1);
Bogdan Marinescu 0:a792d4bf36c2 993 void (*dtor)(struct event *);
Bogdan Marinescu 0:a792d4bf36c2 994
Bogdan Marinescu 0:a792d4bf36c2 995 // F follows
Bogdan Marinescu 0:a792d4bf36c2 996 } *_event;
Bogdan Marinescu 0:a792d4bf36c2 997
Christopher Haster 4:f157c7bf01cc 998 // Event attributes
Christopher Haster 4:f157c7bf01cc 999 template <typename F>
Christopher Haster 4:f157c7bf01cc 1000 static int event_post(struct event *e, A0 a0, A1 a1) {
Christopher Haster 4:f157c7bf01cc 1001 typedef EventQueue::context20<F, A0, A1> C;
Christopher Haster 4:f157c7bf01cc 1002 void *p = equeue_alloc(e->equeue, sizeof(C));
Christopher Haster 4:f157c7bf01cc 1003 if (!p) {
Christopher Haster 4:f157c7bf01cc 1004 return 0;
Christopher Haster 4:f157c7bf01cc 1005 }
Christopher Haster 4:f157c7bf01cc 1006
Christopher Haster 4:f157c7bf01cc 1007 new (p) C(*(F*)(e + 1), a0, a1);
Christopher Haster 4:f157c7bf01cc 1008 equeue_event_delay(p, e->delay);
Christopher Haster 4:f157c7bf01cc 1009 equeue_event_period(p, e->period);
Christopher Haster 7:80510299c57c 1010 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
Christopher Haster 7:80510299c57c 1011 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
Christopher Haster 4:f157c7bf01cc 1012 }
Christopher Haster 4:f157c7bf01cc 1013
Christopher Haster 4:f157c7bf01cc 1014 template <typename F>
Christopher Haster 4:f157c7bf01cc 1015 static void event_dtor(struct event *e) {
Christopher Haster 4:f157c7bf01cc 1016 ((F*)(e + 1))->~F();
Christopher Haster 4:f157c7bf01cc 1017 }
Christopher Haster 4:f157c7bf01cc 1018
Bogdan Marinescu 0:a792d4bf36c2 1019 public:
Bogdan Marinescu 0:a792d4bf36c2 1020 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1021 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1022 */
Bogdan Marinescu 0:a792d4bf36c2 1023 template <typename F, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 1024 Event(EventQueue *q, F f, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 1025 new (this) Event(q, EventQueue::context12<F, C0, A0, A1>(f, c0));
Bogdan Marinescu 0:a792d4bf36c2 1026 }
Bogdan Marinescu 0:a792d4bf36c2 1027
Bogdan Marinescu 0:a792d4bf36c2 1028 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1029 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1030 */
Bogdan Marinescu 0:a792d4bf36c2 1031 template <typename F, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 1032 Event(EventQueue *q, F f, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 1033 new (this) Event(q, EventQueue::context22<F, C0, C1, A0, A1>(f, c0, c1));
Bogdan Marinescu 0:a792d4bf36c2 1034 }
Bogdan Marinescu 0:a792d4bf36c2 1035
Bogdan Marinescu 0:a792d4bf36c2 1036 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1037 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1038 */
Bogdan Marinescu 0:a792d4bf36c2 1039 template <typename F, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 1040 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 1041 new (this) Event(q, EventQueue::context32<F, C0, C1, C2, A0, A1>(f, c0, c1, c2));
Bogdan Marinescu 0:a792d4bf36c2 1042 }
Bogdan Marinescu 0:a792d4bf36c2 1043
Bogdan Marinescu 0:a792d4bf36c2 1044 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1045 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1046 */
Bogdan Marinescu 0:a792d4bf36c2 1047 template <typename F, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 1048 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 1049 new (this) Event(q, EventQueue::context42<F, C0, C1, C2, C3, A0, A1>(f, c0, c1, c2, c3));
Bogdan Marinescu 0:a792d4bf36c2 1050 }
Bogdan Marinescu 0:a792d4bf36c2 1051
Bogdan Marinescu 0:a792d4bf36c2 1052 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1053 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1054 */
Bogdan Marinescu 0:a792d4bf36c2 1055 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 1056 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 1057 new (this) Event(q, EventQueue::context52<F, C0, C1, C2, C3, C4, A0, A1>(f, c0, c1, c2, c3, c4));
Bogdan Marinescu 0:a792d4bf36c2 1058 }
Bogdan Marinescu 0:a792d4bf36c2 1059
Bogdan Marinescu 0:a792d4bf36c2 1060 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1061 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1062 */
Bogdan Marinescu 0:a792d4bf36c2 1063 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1064 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1), B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1065 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1066 }
Bogdan Marinescu 0:a792d4bf36c2 1067
Bogdan Marinescu 0:a792d4bf36c2 1068 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1069 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1070 */
Bogdan Marinescu 0:a792d4bf36c2 1071 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1072 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1) const, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1073 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1074 }
Bogdan Marinescu 0:a792d4bf36c2 1075
Bogdan Marinescu 0:a792d4bf36c2 1076 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1077 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1078 */
Bogdan Marinescu 0:a792d4bf36c2 1079 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1080 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1) volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1081 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1082 }
Bogdan Marinescu 0:a792d4bf36c2 1083
Bogdan Marinescu 0:a792d4bf36c2 1084 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1085 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1086 */
Bogdan Marinescu 0:a792d4bf36c2 1087 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1088 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1) const volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1089 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1090 }
Bogdan Marinescu 0:a792d4bf36c2 1091
Bogdan Marinescu 0:a792d4bf36c2 1092 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1093 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1094 */
Bogdan Marinescu 0:a792d4bf36c2 1095 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1096 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1), B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1097 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1098 }
Bogdan Marinescu 0:a792d4bf36c2 1099
Bogdan Marinescu 0:a792d4bf36c2 1100 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1101 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1102 */
Bogdan Marinescu 0:a792d4bf36c2 1103 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1104 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1) const, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1105 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1106 }
Bogdan Marinescu 0:a792d4bf36c2 1107
Bogdan Marinescu 0:a792d4bf36c2 1108 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1109 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1110 */
Bogdan Marinescu 0:a792d4bf36c2 1111 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1112 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1) volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1113 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1114 }
Bogdan Marinescu 0:a792d4bf36c2 1115
Bogdan Marinescu 0:a792d4bf36c2 1116 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1117 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1118 */
Bogdan Marinescu 0:a792d4bf36c2 1119 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1120 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1) const volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1121 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1122 }
Bogdan Marinescu 0:a792d4bf36c2 1123
Bogdan Marinescu 0:a792d4bf36c2 1124 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1125 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1126 */
Bogdan Marinescu 0:a792d4bf36c2 1127 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1128 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1), B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1129 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1130 }
Bogdan Marinescu 0:a792d4bf36c2 1131
Bogdan Marinescu 0:a792d4bf36c2 1132 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1133 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1134 */
Bogdan Marinescu 0:a792d4bf36c2 1135 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1136 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1) const, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1137 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1138 }
Bogdan Marinescu 0:a792d4bf36c2 1139
Bogdan Marinescu 0:a792d4bf36c2 1140 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1141 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1142 */
Bogdan Marinescu 0:a792d4bf36c2 1143 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1144 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1145 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1146 }
Bogdan Marinescu 0:a792d4bf36c2 1147
Bogdan Marinescu 0:a792d4bf36c2 1148 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1149 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1150 */
Bogdan Marinescu 0:a792d4bf36c2 1151 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1152 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) const volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1153 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1154 }
Bogdan Marinescu 0:a792d4bf36c2 1155
Bogdan Marinescu 0:a792d4bf36c2 1156 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1157 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1158 */
Bogdan Marinescu 0:a792d4bf36c2 1159 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1160 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1), B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1161 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1162 }
Bogdan Marinescu 0:a792d4bf36c2 1163
Bogdan Marinescu 0:a792d4bf36c2 1164 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1165 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1166 */
Bogdan Marinescu 0:a792d4bf36c2 1167 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1168 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1169 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1170 }
Bogdan Marinescu 0:a792d4bf36c2 1171
Bogdan Marinescu 0:a792d4bf36c2 1172 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1173 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1174 */
Bogdan Marinescu 0:a792d4bf36c2 1175 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1176 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1177 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1178 }
Bogdan Marinescu 0:a792d4bf36c2 1179
Bogdan Marinescu 0:a792d4bf36c2 1180 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1181 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1182 */
Bogdan Marinescu 0:a792d4bf36c2 1183 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1184 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1185 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1186 }
Bogdan Marinescu 0:a792d4bf36c2 1187
Bogdan Marinescu 0:a792d4bf36c2 1188 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1189 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1190 */
Bogdan Marinescu 0:a792d4bf36c2 1191 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1192 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1193 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1194 }
Bogdan Marinescu 0:a792d4bf36c2 1195
Bogdan Marinescu 0:a792d4bf36c2 1196 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1197 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1198 */
Bogdan Marinescu 0:a792d4bf36c2 1199 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1200 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1201 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1202 }
Bogdan Marinescu 0:a792d4bf36c2 1203
Bogdan Marinescu 0:a792d4bf36c2 1204 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1205 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1206 */
Bogdan Marinescu 0:a792d4bf36c2 1207 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1208 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1209 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1210 }
Bogdan Marinescu 0:a792d4bf36c2 1211
Bogdan Marinescu 0:a792d4bf36c2 1212 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1213 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1214 */
Bogdan Marinescu 0:a792d4bf36c2 1215 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1216 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1217 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1218 }
Bogdan Marinescu 0:a792d4bf36c2 1219 };
Bogdan Marinescu 0:a792d4bf36c2 1220
Bogdan Marinescu 0:a792d4bf36c2 1221 /** Event
Bogdan Marinescu 0:a792d4bf36c2 1222 *
Bogdan Marinescu 0:a792d4bf36c2 1223 * Representation of an event for fine-grain dispatch control
Bogdan Marinescu 0:a792d4bf36c2 1224 */
Bogdan Marinescu 0:a792d4bf36c2 1225 template <typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 1226 class Event<void(A0, A1, A2)> {
Bogdan Marinescu 0:a792d4bf36c2 1227 public:
Bogdan Marinescu 0:a792d4bf36c2 1228 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1229 *
Bogdan Marinescu 0:a792d4bf36c2 1230 * Constructs an event bound to the specified event queue. The specified
Bogdan Marinescu 0:a792d4bf36c2 1231 * callback acts as the target for the event and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 1232 * context of the event queue's dispatch loop once posted.
Bogdan Marinescu 0:a792d4bf36c2 1233 *
Bogdan Marinescu 0:a792d4bf36c2 1234 * @param q Event queue to dispatch on
Bogdan Marinescu 0:a792d4bf36c2 1235 * @param f Function to execute when the event is dispatched
Christopher Haster 15:42ba4ffdf78d 1236 * @param c0..c4 Arguments to bind to the callback, these arguments are
Christopher Haster 15:42ba4ffdf78d 1237 * allocated on an irq-safe allocator from the event queue's
Christopher Haster 15:42ba4ffdf78d 1238 * memory pool. Must be type-compatible with b0..b4, the
Christopher Haster 15:42ba4ffdf78d 1239 * arguments to the underlying callback.
Bogdan Marinescu 0:a792d4bf36c2 1240 */
Bogdan Marinescu 0:a792d4bf36c2 1241 template <typename F>
Bogdan Marinescu 0:a792d4bf36c2 1242 Event(EventQueue *q, F f) {
Bogdan Marinescu 0:a792d4bf36c2 1243 _event = static_cast<struct event *>(
Bogdan Marinescu 0:a792d4bf36c2 1244 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
Christopher Haster 4:f157c7bf01cc 1245
Bogdan Marinescu 0:a792d4bf36c2 1246 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1247 _event->equeue = &q->_equeue;
Bogdan Marinescu 0:a792d4bf36c2 1248 _event->id = 0;
Bogdan Marinescu 0:a792d4bf36c2 1249 _event->delay = 0;
Bogdan Marinescu 0:a792d4bf36c2 1250 _event->period = -1;
Bogdan Marinescu 0:a792d4bf36c2 1251
Christopher Haster 4:f157c7bf01cc 1252 _event->post = &Event::event_post<F>;
Christopher Haster 4:f157c7bf01cc 1253 _event->dtor = &Event::event_dtor<F>;
Bogdan Marinescu 0:a792d4bf36c2 1254
Bogdan Marinescu 0:a792d4bf36c2 1255 new (_event+1) F(f);
Bogdan Marinescu 0:a792d4bf36c2 1256
Bogdan Marinescu 0:a792d4bf36c2 1257 _event->ref = 1;
Bogdan Marinescu 0:a792d4bf36c2 1258 }
Bogdan Marinescu 0:a792d4bf36c2 1259 }
Bogdan Marinescu 0:a792d4bf36c2 1260
Bogdan Marinescu 0:a792d4bf36c2 1261 /** Copy constructor for events
Bogdan Marinescu 0:a792d4bf36c2 1262 */
Bogdan Marinescu 0:a792d4bf36c2 1263 Event(const Event &e) {
Bogdan Marinescu 0:a792d4bf36c2 1264 _event = 0;
Bogdan Marinescu 0:a792d4bf36c2 1265 if (e._event) {
Bogdan Marinescu 0:a792d4bf36c2 1266 _event = e._event;
Bogdan Marinescu 0:a792d4bf36c2 1267 _event->ref += 1;
Bogdan Marinescu 0:a792d4bf36c2 1268 }
Bogdan Marinescu 0:a792d4bf36c2 1269 }
Bogdan Marinescu 0:a792d4bf36c2 1270
Bogdan Marinescu 0:a792d4bf36c2 1271 /** Assignment operator for events
Bogdan Marinescu 0:a792d4bf36c2 1272 */
Bogdan Marinescu 0:a792d4bf36c2 1273 Event &operator=(const Event &that) {
Bogdan Marinescu 0:a792d4bf36c2 1274 if (this != &that) {
Bogdan Marinescu 0:a792d4bf36c2 1275 this->~Event();
Bogdan Marinescu 0:a792d4bf36c2 1276 new (this) Event(that);
Bogdan Marinescu 0:a792d4bf36c2 1277 }
Bogdan Marinescu 0:a792d4bf36c2 1278
Bogdan Marinescu 0:a792d4bf36c2 1279 return *this;
Bogdan Marinescu 0:a792d4bf36c2 1280 }
Bogdan Marinescu 0:a792d4bf36c2 1281
Bogdan Marinescu 0:a792d4bf36c2 1282 /** Destructor for events
Bogdan Marinescu 0:a792d4bf36c2 1283 */
Bogdan Marinescu 0:a792d4bf36c2 1284 ~Event() {
Bogdan Marinescu 0:a792d4bf36c2 1285 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1286 _event->ref -= 1;
Bogdan Marinescu 0:a792d4bf36c2 1287 if (_event->ref == 0) {
Bogdan Marinescu 0:a792d4bf36c2 1288 _event->dtor(_event);
Bogdan Marinescu 0:a792d4bf36c2 1289 equeue_dealloc(_event->equeue, _event);
Bogdan Marinescu 0:a792d4bf36c2 1290 }
Bogdan Marinescu 0:a792d4bf36c2 1291 }
Bogdan Marinescu 0:a792d4bf36c2 1292 }
Bogdan Marinescu 0:a792d4bf36c2 1293
Bogdan Marinescu 0:a792d4bf36c2 1294 /** Configure the delay of an event
Bogdan Marinescu 0:a792d4bf36c2 1295 *
Bogdan Marinescu 0:a792d4bf36c2 1296 * @param delay Millisecond delay before dispatching the event
Bogdan Marinescu 0:a792d4bf36c2 1297 */
Bogdan Marinescu 0:a792d4bf36c2 1298 void delay(int delay) {
Bogdan Marinescu 0:a792d4bf36c2 1299 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1300 _event->delay = delay;
Bogdan Marinescu 0:a792d4bf36c2 1301 }
Bogdan Marinescu 0:a792d4bf36c2 1302 }
Bogdan Marinescu 0:a792d4bf36c2 1303
Bogdan Marinescu 0:a792d4bf36c2 1304 /** Configure the period of an event
Bogdan Marinescu 0:a792d4bf36c2 1305 *
Bogdan Marinescu 0:a792d4bf36c2 1306 * @param period Millisecond period for repeatedly dispatching an event
Bogdan Marinescu 0:a792d4bf36c2 1307 */
Bogdan Marinescu 0:a792d4bf36c2 1308 void period(int period) {
Bogdan Marinescu 0:a792d4bf36c2 1309 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1310 _event->period = period;
Bogdan Marinescu 0:a792d4bf36c2 1311 }
Bogdan Marinescu 0:a792d4bf36c2 1312 }
Bogdan Marinescu 0:a792d4bf36c2 1313
Bogdan Marinescu 0:a792d4bf36c2 1314 /** Posts an event onto the underlying event queue
Bogdan Marinescu 0:a792d4bf36c2 1315 *
Bogdan Marinescu 0:a792d4bf36c2 1316 * The event is posted to the underlying queue and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 1317 * context of the event queue's dispatch loop.
Bogdan Marinescu 0:a792d4bf36c2 1318 *
Bogdan Marinescu 0:a792d4bf36c2 1319 * The post function is irq safe and can act as a mechanism for moving
Bogdan Marinescu 0:a792d4bf36c2 1320 * events out of irq contexts.
Bogdan Marinescu 0:a792d4bf36c2 1321 *
Bogdan Marinescu 0:a792d4bf36c2 1322 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 1323 * @return A unique id that represents the posted event and can
Bogdan Marinescu 0:a792d4bf36c2 1324 * be passed to EventQueue::cancel, or an id of 0 if
Bogdan Marinescu 0:a792d4bf36c2 1325 * there is not enough memory to allocate the event.
Bogdan Marinescu 0:a792d4bf36c2 1326 */
Bogdan Marinescu 0:a792d4bf36c2 1327 int post(A0 a0, A1 a1, A2 a2) const {
Bogdan Marinescu 0:a792d4bf36c2 1328 if (!_event) {
Bogdan Marinescu 0:a792d4bf36c2 1329 return 0;
Bogdan Marinescu 0:a792d4bf36c2 1330 }
Bogdan Marinescu 0:a792d4bf36c2 1331
Bogdan Marinescu 0:a792d4bf36c2 1332 _event->id = _event->post(_event, a0, a1, a2);
Bogdan Marinescu 0:a792d4bf36c2 1333 return _event->id;
Bogdan Marinescu 0:a792d4bf36c2 1334 }
Bogdan Marinescu 0:a792d4bf36c2 1335
Bogdan Marinescu 0:a792d4bf36c2 1336 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 1337 *
Bogdan Marinescu 0:a792d4bf36c2 1338 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 1339 */
Bogdan Marinescu 0:a792d4bf36c2 1340 void call(A0 a0, A1 a1, A2 a2) const {
Christopher Haster 8:773de146a61c 1341 MBED_UNUSED int id = post(a0, a1, a2);
Bogdan Marinescu 0:a792d4bf36c2 1342 MBED_ASSERT(id);
Bogdan Marinescu 0:a792d4bf36c2 1343 }
Bogdan Marinescu 0:a792d4bf36c2 1344
Bogdan Marinescu 0:a792d4bf36c2 1345 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 1346 *
Bogdan Marinescu 0:a792d4bf36c2 1347 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 1348 */
Bogdan Marinescu 0:a792d4bf36c2 1349 void operator()(A0 a0, A1 a1, A2 a2) const {
Bogdan Marinescu 0:a792d4bf36c2 1350 return call(a0, a1, a2);
Bogdan Marinescu 0:a792d4bf36c2 1351 }
Bogdan Marinescu 0:a792d4bf36c2 1352
Bogdan Marinescu 0:a792d4bf36c2 1353 /** Static thunk for passing as C-style function
Bogdan Marinescu 0:a792d4bf36c2 1354 *
Bogdan Marinescu 0:a792d4bf36c2 1355 * @param func Event to call passed as a void pointer
Bogdan Marinescu 0:a792d4bf36c2 1356 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 1357 */
Bogdan Marinescu 0:a792d4bf36c2 1358 static void thunk(void *func, A0 a0, A1 a1, A2 a2) {
Bogdan Marinescu 0:a792d4bf36c2 1359 return static_cast<Event*>(func)->call(a0, a1, a2);
Bogdan Marinescu 0:a792d4bf36c2 1360 }
Bogdan Marinescu 0:a792d4bf36c2 1361
Bogdan Marinescu 0:a792d4bf36c2 1362 /** Cancels the most recently posted event
Bogdan Marinescu 0:a792d4bf36c2 1363 *
Bogdan Marinescu 0:a792d4bf36c2 1364 * Attempts to cancel the most recently posted event. It is safe to call
Bogdan Marinescu 0:a792d4bf36c2 1365 * cancel after an event has already been dispatched.
Bogdan Marinescu 0:a792d4bf36c2 1366 *
Bogdan Marinescu 0:a792d4bf36c2 1367 * The cancel function is irq safe.
Bogdan Marinescu 0:a792d4bf36c2 1368 *
Bogdan Marinescu 0:a792d4bf36c2 1369 * If called while the event queue's dispatch loop is active, the cancel
Bogdan Marinescu 0:a792d4bf36c2 1370 * function does not garuntee that the event will not execute after it
Bogdan Marinescu 0:a792d4bf36c2 1371 * returns, as the event may have already begun executing.
Bogdan Marinescu 0:a792d4bf36c2 1372 */
Bogdan Marinescu 0:a792d4bf36c2 1373 void cancel() const {
Bogdan Marinescu 0:a792d4bf36c2 1374 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1375 equeue_cancel(_event->equeue, _event->id);
Bogdan Marinescu 0:a792d4bf36c2 1376 }
Bogdan Marinescu 0:a792d4bf36c2 1377 }
Bogdan Marinescu 0:a792d4bf36c2 1378
Bogdan Marinescu 0:a792d4bf36c2 1379 private:
Bogdan Marinescu 0:a792d4bf36c2 1380 struct event {
Bogdan Marinescu 0:a792d4bf36c2 1381 unsigned ref;
Bogdan Marinescu 0:a792d4bf36c2 1382 equeue_t *equeue;
Bogdan Marinescu 0:a792d4bf36c2 1383 int id;
Bogdan Marinescu 0:a792d4bf36c2 1384
Bogdan Marinescu 0:a792d4bf36c2 1385 int delay;
Bogdan Marinescu 0:a792d4bf36c2 1386 int period;
Bogdan Marinescu 0:a792d4bf36c2 1387
Bogdan Marinescu 0:a792d4bf36c2 1388 int (*post)(struct event *, A0 a0, A1 a1, A2 a2);
Bogdan Marinescu 0:a792d4bf36c2 1389 void (*dtor)(struct event *);
Bogdan Marinescu 0:a792d4bf36c2 1390
Bogdan Marinescu 0:a792d4bf36c2 1391 // F follows
Bogdan Marinescu 0:a792d4bf36c2 1392 } *_event;
Bogdan Marinescu 0:a792d4bf36c2 1393
Christopher Haster 4:f157c7bf01cc 1394 // Event attributes
Christopher Haster 4:f157c7bf01cc 1395 template <typename F>
Christopher Haster 4:f157c7bf01cc 1396 static int event_post(struct event *e, A0 a0, A1 a1, A2 a2) {
Christopher Haster 4:f157c7bf01cc 1397 typedef EventQueue::context30<F, A0, A1, A2> C;
Christopher Haster 4:f157c7bf01cc 1398 void *p = equeue_alloc(e->equeue, sizeof(C));
Christopher Haster 4:f157c7bf01cc 1399 if (!p) {
Christopher Haster 4:f157c7bf01cc 1400 return 0;
Christopher Haster 4:f157c7bf01cc 1401 }
Christopher Haster 4:f157c7bf01cc 1402
Christopher Haster 4:f157c7bf01cc 1403 new (p) C(*(F*)(e + 1), a0, a1, a2);
Christopher Haster 4:f157c7bf01cc 1404 equeue_event_delay(p, e->delay);
Christopher Haster 4:f157c7bf01cc 1405 equeue_event_period(p, e->period);
Christopher Haster 7:80510299c57c 1406 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
Christopher Haster 7:80510299c57c 1407 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
Christopher Haster 4:f157c7bf01cc 1408 }
Christopher Haster 4:f157c7bf01cc 1409
Christopher Haster 4:f157c7bf01cc 1410 template <typename F>
Christopher Haster 4:f157c7bf01cc 1411 static void event_dtor(struct event *e) {
Christopher Haster 4:f157c7bf01cc 1412 ((F*)(e + 1))->~F();
Christopher Haster 4:f157c7bf01cc 1413 }
Christopher Haster 4:f157c7bf01cc 1414
Bogdan Marinescu 0:a792d4bf36c2 1415 public:
Bogdan Marinescu 0:a792d4bf36c2 1416 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1417 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1418 */
Bogdan Marinescu 0:a792d4bf36c2 1419 template <typename F, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 1420 Event(EventQueue *q, F f, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 1421 new (this) Event(q, EventQueue::context13<F, C0, A0, A1, A2>(f, c0));
Bogdan Marinescu 0:a792d4bf36c2 1422 }
Bogdan Marinescu 0:a792d4bf36c2 1423
Bogdan Marinescu 0:a792d4bf36c2 1424 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1425 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1426 */
Bogdan Marinescu 0:a792d4bf36c2 1427 template <typename F, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 1428 Event(EventQueue *q, F f, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 1429 new (this) Event(q, EventQueue::context23<F, C0, C1, A0, A1, A2>(f, c0, c1));
Bogdan Marinescu 0:a792d4bf36c2 1430 }
Bogdan Marinescu 0:a792d4bf36c2 1431
Bogdan Marinescu 0:a792d4bf36c2 1432 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1433 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1434 */
Bogdan Marinescu 0:a792d4bf36c2 1435 template <typename F, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 1436 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 1437 new (this) Event(q, EventQueue::context33<F, C0, C1, C2, A0, A1, A2>(f, c0, c1, c2));
Bogdan Marinescu 0:a792d4bf36c2 1438 }
Bogdan Marinescu 0:a792d4bf36c2 1439
Bogdan Marinescu 0:a792d4bf36c2 1440 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1441 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1442 */
Bogdan Marinescu 0:a792d4bf36c2 1443 template <typename F, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 1444 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 1445 new (this) Event(q, EventQueue::context43<F, C0, C1, C2, C3, A0, A1, A2>(f, c0, c1, c2, c3));
Bogdan Marinescu 0:a792d4bf36c2 1446 }
Bogdan Marinescu 0:a792d4bf36c2 1447
Bogdan Marinescu 0:a792d4bf36c2 1448 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1449 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1450 */
Bogdan Marinescu 0:a792d4bf36c2 1451 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 1452 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 1453 new (this) Event(q, EventQueue::context53<F, C0, C1, C2, C3, C4, A0, A1, A2>(f, c0, c1, c2, c3, c4));
Bogdan Marinescu 0:a792d4bf36c2 1454 }
Bogdan Marinescu 0:a792d4bf36c2 1455
Bogdan Marinescu 0:a792d4bf36c2 1456 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1457 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1458 */
Bogdan Marinescu 0:a792d4bf36c2 1459 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1460 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2), B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1461 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1462 }
Bogdan Marinescu 0:a792d4bf36c2 1463
Bogdan Marinescu 0:a792d4bf36c2 1464 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1465 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1466 */
Bogdan Marinescu 0:a792d4bf36c2 1467 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1468 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2) const, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1469 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1470 }
Bogdan Marinescu 0:a792d4bf36c2 1471
Bogdan Marinescu 0:a792d4bf36c2 1472 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1473 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1474 */
Bogdan Marinescu 0:a792d4bf36c2 1475 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1476 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2) volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1477 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1478 }
Bogdan Marinescu 0:a792d4bf36c2 1479
Bogdan Marinescu 0:a792d4bf36c2 1480 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1481 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1482 */
Bogdan Marinescu 0:a792d4bf36c2 1483 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1484 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2) const volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1485 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1486 }
Bogdan Marinescu 0:a792d4bf36c2 1487
Bogdan Marinescu 0:a792d4bf36c2 1488 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1489 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1490 */
Bogdan Marinescu 0:a792d4bf36c2 1491 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1492 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2), B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1493 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1494 }
Bogdan Marinescu 0:a792d4bf36c2 1495
Bogdan Marinescu 0:a792d4bf36c2 1496 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1497 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1498 */
Bogdan Marinescu 0:a792d4bf36c2 1499 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1500 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2) const, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1501 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1502 }
Bogdan Marinescu 0:a792d4bf36c2 1503
Bogdan Marinescu 0:a792d4bf36c2 1504 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1505 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1506 */
Bogdan Marinescu 0:a792d4bf36c2 1507 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1508 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1509 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1510 }
Bogdan Marinescu 0:a792d4bf36c2 1511
Bogdan Marinescu 0:a792d4bf36c2 1512 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1513 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1514 */
Bogdan Marinescu 0:a792d4bf36c2 1515 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1516 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) const volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1517 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1518 }
Bogdan Marinescu 0:a792d4bf36c2 1519
Bogdan Marinescu 0:a792d4bf36c2 1520 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1521 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1522 */
Bogdan Marinescu 0:a792d4bf36c2 1523 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1524 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2), B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1525 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1526 }
Bogdan Marinescu 0:a792d4bf36c2 1527
Bogdan Marinescu 0:a792d4bf36c2 1528 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1529 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1530 */
Bogdan Marinescu 0:a792d4bf36c2 1531 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1532 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1533 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1534 }
Bogdan Marinescu 0:a792d4bf36c2 1535
Bogdan Marinescu 0:a792d4bf36c2 1536 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1537 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1538 */
Bogdan Marinescu 0:a792d4bf36c2 1539 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1540 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1541 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1542 }
Bogdan Marinescu 0:a792d4bf36c2 1543
Bogdan Marinescu 0:a792d4bf36c2 1544 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1545 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1546 */
Bogdan Marinescu 0:a792d4bf36c2 1547 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1548 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1549 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1550 }
Bogdan Marinescu 0:a792d4bf36c2 1551
Bogdan Marinescu 0:a792d4bf36c2 1552 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1553 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1554 */
Bogdan Marinescu 0:a792d4bf36c2 1555 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1556 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2), B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1557 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1558 }
Bogdan Marinescu 0:a792d4bf36c2 1559
Bogdan Marinescu 0:a792d4bf36c2 1560 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1561 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1562 */
Bogdan Marinescu 0:a792d4bf36c2 1563 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1564 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) const, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1565 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1566 }
Bogdan Marinescu 0:a792d4bf36c2 1567
Bogdan Marinescu 0:a792d4bf36c2 1568 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1569 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1570 */
Bogdan Marinescu 0:a792d4bf36c2 1571 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1572 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1573 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1574 }
Bogdan Marinescu 0:a792d4bf36c2 1575
Bogdan Marinescu 0:a792d4bf36c2 1576 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1577 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1578 */
Bogdan Marinescu 0:a792d4bf36c2 1579 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1580 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1581 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1582 }
Bogdan Marinescu 0:a792d4bf36c2 1583
Bogdan Marinescu 0:a792d4bf36c2 1584 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1585 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1586 */
Bogdan Marinescu 0:a792d4bf36c2 1587 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1588 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1589 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1590 }
Bogdan Marinescu 0:a792d4bf36c2 1591
Bogdan Marinescu 0:a792d4bf36c2 1592 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1593 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1594 */
Bogdan Marinescu 0:a792d4bf36c2 1595 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1596 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1597 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1598 }
Bogdan Marinescu 0:a792d4bf36c2 1599
Bogdan Marinescu 0:a792d4bf36c2 1600 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1601 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1602 */
Bogdan Marinescu 0:a792d4bf36c2 1603 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1604 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1605 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1606 }
Bogdan Marinescu 0:a792d4bf36c2 1607
Bogdan Marinescu 0:a792d4bf36c2 1608 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1609 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1610 */
Bogdan Marinescu 0:a792d4bf36c2 1611 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1612 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1613 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1614 }
Bogdan Marinescu 0:a792d4bf36c2 1615 };
Bogdan Marinescu 0:a792d4bf36c2 1616
Bogdan Marinescu 0:a792d4bf36c2 1617 /** Event
Bogdan Marinescu 0:a792d4bf36c2 1618 *
Bogdan Marinescu 0:a792d4bf36c2 1619 * Representation of an event for fine-grain dispatch control
Bogdan Marinescu 0:a792d4bf36c2 1620 */
Bogdan Marinescu 0:a792d4bf36c2 1621 template <typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 1622 class Event<void(A0, A1, A2, A3)> {
Bogdan Marinescu 0:a792d4bf36c2 1623 public:
Bogdan Marinescu 0:a792d4bf36c2 1624 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1625 *
Bogdan Marinescu 0:a792d4bf36c2 1626 * Constructs an event bound to the specified event queue. The specified
Bogdan Marinescu 0:a792d4bf36c2 1627 * callback acts as the target for the event and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 1628 * context of the event queue's dispatch loop once posted.
Bogdan Marinescu 0:a792d4bf36c2 1629 *
Bogdan Marinescu 0:a792d4bf36c2 1630 * @param q Event queue to dispatch on
Bogdan Marinescu 0:a792d4bf36c2 1631 * @param f Function to execute when the event is dispatched
Christopher Haster 15:42ba4ffdf78d 1632 * @param c0..c4 Arguments to bind to the callback, these arguments are
Christopher Haster 15:42ba4ffdf78d 1633 * allocated on an irq-safe allocator from the event queue's
Christopher Haster 15:42ba4ffdf78d 1634 * memory pool. Must be type-compatible with b0..b4, the
Christopher Haster 15:42ba4ffdf78d 1635 * arguments to the underlying callback.
Bogdan Marinescu 0:a792d4bf36c2 1636 */
Bogdan Marinescu 0:a792d4bf36c2 1637 template <typename F>
Bogdan Marinescu 0:a792d4bf36c2 1638 Event(EventQueue *q, F f) {
Bogdan Marinescu 0:a792d4bf36c2 1639 _event = static_cast<struct event *>(
Bogdan Marinescu 0:a792d4bf36c2 1640 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
Christopher Haster 4:f157c7bf01cc 1641
Bogdan Marinescu 0:a792d4bf36c2 1642 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1643 _event->equeue = &q->_equeue;
Bogdan Marinescu 0:a792d4bf36c2 1644 _event->id = 0;
Bogdan Marinescu 0:a792d4bf36c2 1645 _event->delay = 0;
Bogdan Marinescu 0:a792d4bf36c2 1646 _event->period = -1;
Bogdan Marinescu 0:a792d4bf36c2 1647
Christopher Haster 4:f157c7bf01cc 1648 _event->post = &Event::event_post<F>;
Christopher Haster 4:f157c7bf01cc 1649 _event->dtor = &Event::event_dtor<F>;
Bogdan Marinescu 0:a792d4bf36c2 1650
Bogdan Marinescu 0:a792d4bf36c2 1651 new (_event+1) F(f);
Bogdan Marinescu 0:a792d4bf36c2 1652
Bogdan Marinescu 0:a792d4bf36c2 1653 _event->ref = 1;
Bogdan Marinescu 0:a792d4bf36c2 1654 }
Bogdan Marinescu 0:a792d4bf36c2 1655 }
Bogdan Marinescu 0:a792d4bf36c2 1656
Bogdan Marinescu 0:a792d4bf36c2 1657 /** Copy constructor for events
Bogdan Marinescu 0:a792d4bf36c2 1658 */
Bogdan Marinescu 0:a792d4bf36c2 1659 Event(const Event &e) {
Bogdan Marinescu 0:a792d4bf36c2 1660 _event = 0;
Bogdan Marinescu 0:a792d4bf36c2 1661 if (e._event) {
Bogdan Marinescu 0:a792d4bf36c2 1662 _event = e._event;
Bogdan Marinescu 0:a792d4bf36c2 1663 _event->ref += 1;
Bogdan Marinescu 0:a792d4bf36c2 1664 }
Bogdan Marinescu 0:a792d4bf36c2 1665 }
Bogdan Marinescu 0:a792d4bf36c2 1666
Bogdan Marinescu 0:a792d4bf36c2 1667 /** Assignment operator for events
Bogdan Marinescu 0:a792d4bf36c2 1668 */
Bogdan Marinescu 0:a792d4bf36c2 1669 Event &operator=(const Event &that) {
Bogdan Marinescu 0:a792d4bf36c2 1670 if (this != &that) {
Bogdan Marinescu 0:a792d4bf36c2 1671 this->~Event();
Bogdan Marinescu 0:a792d4bf36c2 1672 new (this) Event(that);
Bogdan Marinescu 0:a792d4bf36c2 1673 }
Bogdan Marinescu 0:a792d4bf36c2 1674
Bogdan Marinescu 0:a792d4bf36c2 1675 return *this;
Bogdan Marinescu 0:a792d4bf36c2 1676 }
Bogdan Marinescu 0:a792d4bf36c2 1677
Bogdan Marinescu 0:a792d4bf36c2 1678 /** Destructor for events
Bogdan Marinescu 0:a792d4bf36c2 1679 */
Bogdan Marinescu 0:a792d4bf36c2 1680 ~Event() {
Bogdan Marinescu 0:a792d4bf36c2 1681 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1682 _event->ref -= 1;
Bogdan Marinescu 0:a792d4bf36c2 1683 if (_event->ref == 0) {
Bogdan Marinescu 0:a792d4bf36c2 1684 _event->dtor(_event);
Bogdan Marinescu 0:a792d4bf36c2 1685 equeue_dealloc(_event->equeue, _event);
Bogdan Marinescu 0:a792d4bf36c2 1686 }
Bogdan Marinescu 0:a792d4bf36c2 1687 }
Bogdan Marinescu 0:a792d4bf36c2 1688 }
Bogdan Marinescu 0:a792d4bf36c2 1689
Bogdan Marinescu 0:a792d4bf36c2 1690 /** Configure the delay of an event
Bogdan Marinescu 0:a792d4bf36c2 1691 *
Bogdan Marinescu 0:a792d4bf36c2 1692 * @param delay Millisecond delay before dispatching the event
Bogdan Marinescu 0:a792d4bf36c2 1693 */
Bogdan Marinescu 0:a792d4bf36c2 1694 void delay(int delay) {
Bogdan Marinescu 0:a792d4bf36c2 1695 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1696 _event->delay = delay;
Bogdan Marinescu 0:a792d4bf36c2 1697 }
Bogdan Marinescu 0:a792d4bf36c2 1698 }
Bogdan Marinescu 0:a792d4bf36c2 1699
Bogdan Marinescu 0:a792d4bf36c2 1700 /** Configure the period of an event
Bogdan Marinescu 0:a792d4bf36c2 1701 *
Bogdan Marinescu 0:a792d4bf36c2 1702 * @param period Millisecond period for repeatedly dispatching an event
Bogdan Marinescu 0:a792d4bf36c2 1703 */
Bogdan Marinescu 0:a792d4bf36c2 1704 void period(int period) {
Bogdan Marinescu 0:a792d4bf36c2 1705 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1706 _event->period = period;
Bogdan Marinescu 0:a792d4bf36c2 1707 }
Bogdan Marinescu 0:a792d4bf36c2 1708 }
Bogdan Marinescu 0:a792d4bf36c2 1709
Bogdan Marinescu 0:a792d4bf36c2 1710 /** Posts an event onto the underlying event queue
Bogdan Marinescu 0:a792d4bf36c2 1711 *
Bogdan Marinescu 0:a792d4bf36c2 1712 * The event is posted to the underlying queue and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 1713 * context of the event queue's dispatch loop.
Bogdan Marinescu 0:a792d4bf36c2 1714 *
Bogdan Marinescu 0:a792d4bf36c2 1715 * The post function is irq safe and can act as a mechanism for moving
Bogdan Marinescu 0:a792d4bf36c2 1716 * events out of irq contexts.
Bogdan Marinescu 0:a792d4bf36c2 1717 *
Bogdan Marinescu 0:a792d4bf36c2 1718 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 1719 * @return A unique id that represents the posted event and can
Bogdan Marinescu 0:a792d4bf36c2 1720 * be passed to EventQueue::cancel, or an id of 0 if
Bogdan Marinescu 0:a792d4bf36c2 1721 * there is not enough memory to allocate the event.
Bogdan Marinescu 0:a792d4bf36c2 1722 */
Bogdan Marinescu 0:a792d4bf36c2 1723 int post(A0 a0, A1 a1, A2 a2, A3 a3) const {
Bogdan Marinescu 0:a792d4bf36c2 1724 if (!_event) {
Bogdan Marinescu 0:a792d4bf36c2 1725 return 0;
Bogdan Marinescu 0:a792d4bf36c2 1726 }
Bogdan Marinescu 0:a792d4bf36c2 1727
Bogdan Marinescu 0:a792d4bf36c2 1728 _event->id = _event->post(_event, a0, a1, a2, a3);
Bogdan Marinescu 0:a792d4bf36c2 1729 return _event->id;
Bogdan Marinescu 0:a792d4bf36c2 1730 }
Bogdan Marinescu 0:a792d4bf36c2 1731
Bogdan Marinescu 0:a792d4bf36c2 1732 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 1733 *
Bogdan Marinescu 0:a792d4bf36c2 1734 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 1735 */
Bogdan Marinescu 0:a792d4bf36c2 1736 void call(A0 a0, A1 a1, A2 a2, A3 a3) const {
Christopher Haster 8:773de146a61c 1737 MBED_UNUSED int id = post(a0, a1, a2, a3);
Bogdan Marinescu 0:a792d4bf36c2 1738 MBED_ASSERT(id);
Bogdan Marinescu 0:a792d4bf36c2 1739 }
Bogdan Marinescu 0:a792d4bf36c2 1740
Bogdan Marinescu 0:a792d4bf36c2 1741 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 1742 *
Bogdan Marinescu 0:a792d4bf36c2 1743 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 1744 */
Bogdan Marinescu 0:a792d4bf36c2 1745 void operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
Bogdan Marinescu 0:a792d4bf36c2 1746 return call(a0, a1, a2, a3);
Bogdan Marinescu 0:a792d4bf36c2 1747 }
Bogdan Marinescu 0:a792d4bf36c2 1748
Bogdan Marinescu 0:a792d4bf36c2 1749 /** Static thunk for passing as C-style function
Bogdan Marinescu 0:a792d4bf36c2 1750 *
Bogdan Marinescu 0:a792d4bf36c2 1751 * @param func Event to call passed as a void pointer
Bogdan Marinescu 0:a792d4bf36c2 1752 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 1753 */
Bogdan Marinescu 0:a792d4bf36c2 1754 static void thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3) {
Bogdan Marinescu 0:a792d4bf36c2 1755 return static_cast<Event*>(func)->call(a0, a1, a2, a3);
Bogdan Marinescu 0:a792d4bf36c2 1756 }
Bogdan Marinescu 0:a792d4bf36c2 1757
Bogdan Marinescu 0:a792d4bf36c2 1758 /** Cancels the most recently posted event
Bogdan Marinescu 0:a792d4bf36c2 1759 *
Bogdan Marinescu 0:a792d4bf36c2 1760 * Attempts to cancel the most recently posted event. It is safe to call
Bogdan Marinescu 0:a792d4bf36c2 1761 * cancel after an event has already been dispatched.
Bogdan Marinescu 0:a792d4bf36c2 1762 *
Bogdan Marinescu 0:a792d4bf36c2 1763 * The cancel function is irq safe.
Bogdan Marinescu 0:a792d4bf36c2 1764 *
Bogdan Marinescu 0:a792d4bf36c2 1765 * If called while the event queue's dispatch loop is active, the cancel
Bogdan Marinescu 0:a792d4bf36c2 1766 * function does not garuntee that the event will not execute after it
Bogdan Marinescu 0:a792d4bf36c2 1767 * returns, as the event may have already begun executing.
Bogdan Marinescu 0:a792d4bf36c2 1768 */
Bogdan Marinescu 0:a792d4bf36c2 1769 void cancel() const {
Bogdan Marinescu 0:a792d4bf36c2 1770 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 1771 equeue_cancel(_event->equeue, _event->id);
Bogdan Marinescu 0:a792d4bf36c2 1772 }
Bogdan Marinescu 0:a792d4bf36c2 1773 }
Bogdan Marinescu 0:a792d4bf36c2 1774
Bogdan Marinescu 0:a792d4bf36c2 1775 private:
Bogdan Marinescu 0:a792d4bf36c2 1776 struct event {
Bogdan Marinescu 0:a792d4bf36c2 1777 unsigned ref;
Bogdan Marinescu 0:a792d4bf36c2 1778 equeue_t *equeue;
Bogdan Marinescu 0:a792d4bf36c2 1779 int id;
Bogdan Marinescu 0:a792d4bf36c2 1780
Bogdan Marinescu 0:a792d4bf36c2 1781 int delay;
Bogdan Marinescu 0:a792d4bf36c2 1782 int period;
Bogdan Marinescu 0:a792d4bf36c2 1783
Bogdan Marinescu 0:a792d4bf36c2 1784 int (*post)(struct event *, A0 a0, A1 a1, A2 a2, A3 a3);
Bogdan Marinescu 0:a792d4bf36c2 1785 void (*dtor)(struct event *);
Bogdan Marinescu 0:a792d4bf36c2 1786
Bogdan Marinescu 0:a792d4bf36c2 1787 // F follows
Bogdan Marinescu 0:a792d4bf36c2 1788 } *_event;
Bogdan Marinescu 0:a792d4bf36c2 1789
Christopher Haster 4:f157c7bf01cc 1790 // Event attributes
Christopher Haster 4:f157c7bf01cc 1791 template <typename F>
Christopher Haster 4:f157c7bf01cc 1792 static int event_post(struct event *e, A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 4:f157c7bf01cc 1793 typedef EventQueue::context40<F, A0, A1, A2, A3> C;
Christopher Haster 4:f157c7bf01cc 1794 void *p = equeue_alloc(e->equeue, sizeof(C));
Christopher Haster 4:f157c7bf01cc 1795 if (!p) {
Christopher Haster 4:f157c7bf01cc 1796 return 0;
Christopher Haster 4:f157c7bf01cc 1797 }
Christopher Haster 4:f157c7bf01cc 1798
Christopher Haster 4:f157c7bf01cc 1799 new (p) C(*(F*)(e + 1), a0, a1, a2, a3);
Christopher Haster 4:f157c7bf01cc 1800 equeue_event_delay(p, e->delay);
Christopher Haster 4:f157c7bf01cc 1801 equeue_event_period(p, e->period);
Christopher Haster 7:80510299c57c 1802 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
Christopher Haster 7:80510299c57c 1803 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
Christopher Haster 4:f157c7bf01cc 1804 }
Christopher Haster 4:f157c7bf01cc 1805
Christopher Haster 4:f157c7bf01cc 1806 template <typename F>
Christopher Haster 4:f157c7bf01cc 1807 static void event_dtor(struct event *e) {
Christopher Haster 4:f157c7bf01cc 1808 ((F*)(e + 1))->~F();
Christopher Haster 4:f157c7bf01cc 1809 }
Christopher Haster 4:f157c7bf01cc 1810
Bogdan Marinescu 0:a792d4bf36c2 1811 public:
Bogdan Marinescu 0:a792d4bf36c2 1812 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1813 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1814 */
Bogdan Marinescu 0:a792d4bf36c2 1815 template <typename F, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 1816 Event(EventQueue *q, F f, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 1817 new (this) Event(q, EventQueue::context14<F, C0, A0, A1, A2, A3>(f, c0));
Bogdan Marinescu 0:a792d4bf36c2 1818 }
Bogdan Marinescu 0:a792d4bf36c2 1819
Bogdan Marinescu 0:a792d4bf36c2 1820 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1821 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1822 */
Bogdan Marinescu 0:a792d4bf36c2 1823 template <typename F, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 1824 Event(EventQueue *q, F f, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 1825 new (this) Event(q, EventQueue::context24<F, C0, C1, A0, A1, A2, A3>(f, c0, c1));
Bogdan Marinescu 0:a792d4bf36c2 1826 }
Bogdan Marinescu 0:a792d4bf36c2 1827
Bogdan Marinescu 0:a792d4bf36c2 1828 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1829 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1830 */
Bogdan Marinescu 0:a792d4bf36c2 1831 template <typename F, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 1832 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 1833 new (this) Event(q, EventQueue::context34<F, C0, C1, C2, A0, A1, A2, A3>(f, c0, c1, c2));
Bogdan Marinescu 0:a792d4bf36c2 1834 }
Bogdan Marinescu 0:a792d4bf36c2 1835
Bogdan Marinescu 0:a792d4bf36c2 1836 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1837 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1838 */
Bogdan Marinescu 0:a792d4bf36c2 1839 template <typename F, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 1840 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 1841 new (this) Event(q, EventQueue::context44<F, C0, C1, C2, C3, A0, A1, A2, A3>(f, c0, c1, c2, c3));
Bogdan Marinescu 0:a792d4bf36c2 1842 }
Bogdan Marinescu 0:a792d4bf36c2 1843
Bogdan Marinescu 0:a792d4bf36c2 1844 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1845 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1846 */
Bogdan Marinescu 0:a792d4bf36c2 1847 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 1848 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 1849 new (this) Event(q, EventQueue::context54<F, C0, C1, C2, C3, C4, A0, A1, A2, A3>(f, c0, c1, c2, c3, c4));
Bogdan Marinescu 0:a792d4bf36c2 1850 }
Bogdan Marinescu 0:a792d4bf36c2 1851
Bogdan Marinescu 0:a792d4bf36c2 1852 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1853 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1854 */
Bogdan Marinescu 0:a792d4bf36c2 1855 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1856 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2, A3), B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1857 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1858 }
Bogdan Marinescu 0:a792d4bf36c2 1859
Bogdan Marinescu 0:a792d4bf36c2 1860 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1861 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1862 */
Bogdan Marinescu 0:a792d4bf36c2 1863 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1864 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2, A3) const, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1865 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1866 }
Bogdan Marinescu 0:a792d4bf36c2 1867
Bogdan Marinescu 0:a792d4bf36c2 1868 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1869 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1870 */
Bogdan Marinescu 0:a792d4bf36c2 1871 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1872 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1873 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1874 }
Bogdan Marinescu 0:a792d4bf36c2 1875
Bogdan Marinescu 0:a792d4bf36c2 1876 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1877 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1878 */
Bogdan Marinescu 0:a792d4bf36c2 1879 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 1880 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) const volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 1881 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 1882 }
Bogdan Marinescu 0:a792d4bf36c2 1883
Bogdan Marinescu 0:a792d4bf36c2 1884 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1885 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1886 */
Bogdan Marinescu 0:a792d4bf36c2 1887 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1888 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3), B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1889 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1890 }
Bogdan Marinescu 0:a792d4bf36c2 1891
Bogdan Marinescu 0:a792d4bf36c2 1892 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1893 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1894 */
Bogdan Marinescu 0:a792d4bf36c2 1895 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1896 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1897 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1898 }
Bogdan Marinescu 0:a792d4bf36c2 1899
Bogdan Marinescu 0:a792d4bf36c2 1900 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1901 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1902 */
Bogdan Marinescu 0:a792d4bf36c2 1903 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1904 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1905 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1906 }
Bogdan Marinescu 0:a792d4bf36c2 1907
Bogdan Marinescu 0:a792d4bf36c2 1908 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1909 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1910 */
Bogdan Marinescu 0:a792d4bf36c2 1911 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 1912 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 1913 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 1914 }
Bogdan Marinescu 0:a792d4bf36c2 1915
Bogdan Marinescu 0:a792d4bf36c2 1916 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1917 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1918 */
Bogdan Marinescu 0:a792d4bf36c2 1919 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1920 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3), B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1921 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1922 }
Bogdan Marinescu 0:a792d4bf36c2 1923
Bogdan Marinescu 0:a792d4bf36c2 1924 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1925 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1926 */
Bogdan Marinescu 0:a792d4bf36c2 1927 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1928 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1929 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1930 }
Bogdan Marinescu 0:a792d4bf36c2 1931
Bogdan Marinescu 0:a792d4bf36c2 1932 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1933 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1934 */
Bogdan Marinescu 0:a792d4bf36c2 1935 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1936 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1937 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1938 }
Bogdan Marinescu 0:a792d4bf36c2 1939
Bogdan Marinescu 0:a792d4bf36c2 1940 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1941 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1942 */
Bogdan Marinescu 0:a792d4bf36c2 1943 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 1944 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 1945 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 1946 }
Bogdan Marinescu 0:a792d4bf36c2 1947
Bogdan Marinescu 0:a792d4bf36c2 1948 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1949 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1950 */
Bogdan Marinescu 0:a792d4bf36c2 1951 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1952 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3), B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1953 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1954 }
Bogdan Marinescu 0:a792d4bf36c2 1955
Bogdan Marinescu 0:a792d4bf36c2 1956 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1957 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1958 */
Bogdan Marinescu 0:a792d4bf36c2 1959 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1960 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) const, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1961 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1962 }
Bogdan Marinescu 0:a792d4bf36c2 1963
Bogdan Marinescu 0:a792d4bf36c2 1964 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1965 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1966 */
Bogdan Marinescu 0:a792d4bf36c2 1967 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1968 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1969 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1970 }
Bogdan Marinescu 0:a792d4bf36c2 1971
Bogdan Marinescu 0:a792d4bf36c2 1972 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1973 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1974 */
Bogdan Marinescu 0:a792d4bf36c2 1975 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 1976 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 1977 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 1978 }
Bogdan Marinescu 0:a792d4bf36c2 1979
Bogdan Marinescu 0:a792d4bf36c2 1980 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1981 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1982 */
Bogdan Marinescu 0:a792d4bf36c2 1983 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1984 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1985 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1986 }
Bogdan Marinescu 0:a792d4bf36c2 1987
Bogdan Marinescu 0:a792d4bf36c2 1988 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1989 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1990 */
Bogdan Marinescu 0:a792d4bf36c2 1991 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 1992 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 1993 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 1994 }
Bogdan Marinescu 0:a792d4bf36c2 1995
Bogdan Marinescu 0:a792d4bf36c2 1996 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 1997 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 1998 */
Bogdan Marinescu 0:a792d4bf36c2 1999 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 2000 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 2001 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 2002 }
Bogdan Marinescu 0:a792d4bf36c2 2003
Bogdan Marinescu 0:a792d4bf36c2 2004 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2005 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2006 */
Bogdan Marinescu 0:a792d4bf36c2 2007 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 2008 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 2009 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 2010 }
Bogdan Marinescu 0:a792d4bf36c2 2011 };
Bogdan Marinescu 0:a792d4bf36c2 2012
Bogdan Marinescu 0:a792d4bf36c2 2013 /** Event
Bogdan Marinescu 0:a792d4bf36c2 2014 *
Bogdan Marinescu 0:a792d4bf36c2 2015 * Representation of an event for fine-grain dispatch control
Bogdan Marinescu 0:a792d4bf36c2 2016 */
Bogdan Marinescu 0:a792d4bf36c2 2017 template <typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 2018 class Event<void(A0, A1, A2, A3, A4)> {
Bogdan Marinescu 0:a792d4bf36c2 2019 public:
Bogdan Marinescu 0:a792d4bf36c2 2020 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2021 *
Bogdan Marinescu 0:a792d4bf36c2 2022 * Constructs an event bound to the specified event queue. The specified
Bogdan Marinescu 0:a792d4bf36c2 2023 * callback acts as the target for the event and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 2024 * context of the event queue's dispatch loop once posted.
Bogdan Marinescu 0:a792d4bf36c2 2025 *
Bogdan Marinescu 0:a792d4bf36c2 2026 * @param q Event queue to dispatch on
Bogdan Marinescu 0:a792d4bf36c2 2027 * @param f Function to execute when the event is dispatched
Christopher Haster 15:42ba4ffdf78d 2028 * @param c0..c4 Arguments to bind to the callback, these arguments are
Christopher Haster 15:42ba4ffdf78d 2029 * allocated on an irq-safe allocator from the event queue's
Christopher Haster 15:42ba4ffdf78d 2030 * memory pool. Must be type-compatible with b0..b4, the
Christopher Haster 15:42ba4ffdf78d 2031 * arguments to the underlying callback.
Bogdan Marinescu 0:a792d4bf36c2 2032 */
Bogdan Marinescu 0:a792d4bf36c2 2033 template <typename F>
Bogdan Marinescu 0:a792d4bf36c2 2034 Event(EventQueue *q, F f) {
Bogdan Marinescu 0:a792d4bf36c2 2035 _event = static_cast<struct event *>(
Bogdan Marinescu 0:a792d4bf36c2 2036 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
Christopher Haster 4:f157c7bf01cc 2037
Bogdan Marinescu 0:a792d4bf36c2 2038 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 2039 _event->equeue = &q->_equeue;
Bogdan Marinescu 0:a792d4bf36c2 2040 _event->id = 0;
Bogdan Marinescu 0:a792d4bf36c2 2041 _event->delay = 0;
Bogdan Marinescu 0:a792d4bf36c2 2042 _event->period = -1;
Bogdan Marinescu 0:a792d4bf36c2 2043
Christopher Haster 4:f157c7bf01cc 2044 _event->post = &Event::event_post<F>;
Christopher Haster 4:f157c7bf01cc 2045 _event->dtor = &Event::event_dtor<F>;
Bogdan Marinescu 0:a792d4bf36c2 2046
Bogdan Marinescu 0:a792d4bf36c2 2047 new (_event+1) F(f);
Bogdan Marinescu 0:a792d4bf36c2 2048
Bogdan Marinescu 0:a792d4bf36c2 2049 _event->ref = 1;
Bogdan Marinescu 0:a792d4bf36c2 2050 }
Bogdan Marinescu 0:a792d4bf36c2 2051 }
Bogdan Marinescu 0:a792d4bf36c2 2052
Bogdan Marinescu 0:a792d4bf36c2 2053 /** Copy constructor for events
Bogdan Marinescu 0:a792d4bf36c2 2054 */
Bogdan Marinescu 0:a792d4bf36c2 2055 Event(const Event &e) {
Bogdan Marinescu 0:a792d4bf36c2 2056 _event = 0;
Bogdan Marinescu 0:a792d4bf36c2 2057 if (e._event) {
Bogdan Marinescu 0:a792d4bf36c2 2058 _event = e._event;
Bogdan Marinescu 0:a792d4bf36c2 2059 _event->ref += 1;
Bogdan Marinescu 0:a792d4bf36c2 2060 }
Bogdan Marinescu 0:a792d4bf36c2 2061 }
Bogdan Marinescu 0:a792d4bf36c2 2062
Bogdan Marinescu 0:a792d4bf36c2 2063 /** Assignment operator for events
Bogdan Marinescu 0:a792d4bf36c2 2064 */
Bogdan Marinescu 0:a792d4bf36c2 2065 Event &operator=(const Event &that) {
Bogdan Marinescu 0:a792d4bf36c2 2066 if (this != &that) {
Bogdan Marinescu 0:a792d4bf36c2 2067 this->~Event();
Bogdan Marinescu 0:a792d4bf36c2 2068 new (this) Event(that);
Bogdan Marinescu 0:a792d4bf36c2 2069 }
Bogdan Marinescu 0:a792d4bf36c2 2070
Bogdan Marinescu 0:a792d4bf36c2 2071 return *this;
Bogdan Marinescu 0:a792d4bf36c2 2072 }
Bogdan Marinescu 0:a792d4bf36c2 2073
Bogdan Marinescu 0:a792d4bf36c2 2074 /** Destructor for events
Bogdan Marinescu 0:a792d4bf36c2 2075 */
Bogdan Marinescu 0:a792d4bf36c2 2076 ~Event() {
Bogdan Marinescu 0:a792d4bf36c2 2077 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 2078 _event->ref -= 1;
Bogdan Marinescu 0:a792d4bf36c2 2079 if (_event->ref == 0) {
Bogdan Marinescu 0:a792d4bf36c2 2080 _event->dtor(_event);
Bogdan Marinescu 0:a792d4bf36c2 2081 equeue_dealloc(_event->equeue, _event);
Bogdan Marinescu 0:a792d4bf36c2 2082 }
Bogdan Marinescu 0:a792d4bf36c2 2083 }
Bogdan Marinescu 0:a792d4bf36c2 2084 }
Bogdan Marinescu 0:a792d4bf36c2 2085
Bogdan Marinescu 0:a792d4bf36c2 2086 /** Configure the delay of an event
Bogdan Marinescu 0:a792d4bf36c2 2087 *
Bogdan Marinescu 0:a792d4bf36c2 2088 * @param delay Millisecond delay before dispatching the event
Bogdan Marinescu 0:a792d4bf36c2 2089 */
Bogdan Marinescu 0:a792d4bf36c2 2090 void delay(int delay) {
Bogdan Marinescu 0:a792d4bf36c2 2091 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 2092 _event->delay = delay;
Bogdan Marinescu 0:a792d4bf36c2 2093 }
Bogdan Marinescu 0:a792d4bf36c2 2094 }
Bogdan Marinescu 0:a792d4bf36c2 2095
Bogdan Marinescu 0:a792d4bf36c2 2096 /** Configure the period of an event
Bogdan Marinescu 0:a792d4bf36c2 2097 *
Bogdan Marinescu 0:a792d4bf36c2 2098 * @param period Millisecond period for repeatedly dispatching an event
Bogdan Marinescu 0:a792d4bf36c2 2099 */
Bogdan Marinescu 0:a792d4bf36c2 2100 void period(int period) {
Bogdan Marinescu 0:a792d4bf36c2 2101 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 2102 _event->period = period;
Bogdan Marinescu 0:a792d4bf36c2 2103 }
Bogdan Marinescu 0:a792d4bf36c2 2104 }
Bogdan Marinescu 0:a792d4bf36c2 2105
Bogdan Marinescu 0:a792d4bf36c2 2106 /** Posts an event onto the underlying event queue
Bogdan Marinescu 0:a792d4bf36c2 2107 *
Bogdan Marinescu 0:a792d4bf36c2 2108 * The event is posted to the underlying queue and is executed in the
Bogdan Marinescu 0:a792d4bf36c2 2109 * context of the event queue's dispatch loop.
Bogdan Marinescu 0:a792d4bf36c2 2110 *
Bogdan Marinescu 0:a792d4bf36c2 2111 * The post function is irq safe and can act as a mechanism for moving
Bogdan Marinescu 0:a792d4bf36c2 2112 * events out of irq contexts.
Bogdan Marinescu 0:a792d4bf36c2 2113 *
Bogdan Marinescu 0:a792d4bf36c2 2114 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 2115 * @return A unique id that represents the posted event and can
Bogdan Marinescu 0:a792d4bf36c2 2116 * be passed to EventQueue::cancel, or an id of 0 if
Bogdan Marinescu 0:a792d4bf36c2 2117 * there is not enough memory to allocate the event.
Bogdan Marinescu 0:a792d4bf36c2 2118 */
Bogdan Marinescu 0:a792d4bf36c2 2119 int post(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
Bogdan Marinescu 0:a792d4bf36c2 2120 if (!_event) {
Bogdan Marinescu 0:a792d4bf36c2 2121 return 0;
Bogdan Marinescu 0:a792d4bf36c2 2122 }
Bogdan Marinescu 0:a792d4bf36c2 2123
Bogdan Marinescu 0:a792d4bf36c2 2124 _event->id = _event->post(_event, a0, a1, a2, a3, a4);
Bogdan Marinescu 0:a792d4bf36c2 2125 return _event->id;
Bogdan Marinescu 0:a792d4bf36c2 2126 }
Bogdan Marinescu 0:a792d4bf36c2 2127
Bogdan Marinescu 0:a792d4bf36c2 2128 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 2129 *
Bogdan Marinescu 0:a792d4bf36c2 2130 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 2131 */
Bogdan Marinescu 0:a792d4bf36c2 2132 void call(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
Christopher Haster 8:773de146a61c 2133 MBED_UNUSED int id = post(a0, a1, a2, a3, a4);
Bogdan Marinescu 0:a792d4bf36c2 2134 MBED_ASSERT(id);
Bogdan Marinescu 0:a792d4bf36c2 2135 }
Bogdan Marinescu 0:a792d4bf36c2 2136
Bogdan Marinescu 0:a792d4bf36c2 2137 /** Posts an event onto the underlying event queue, returning void
Bogdan Marinescu 0:a792d4bf36c2 2138 *
Bogdan Marinescu 0:a792d4bf36c2 2139 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 2140 */
Bogdan Marinescu 0:a792d4bf36c2 2141 void operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
Bogdan Marinescu 0:a792d4bf36c2 2142 return call(a0, a1, a2, a3, a4);
Bogdan Marinescu 0:a792d4bf36c2 2143 }
Bogdan Marinescu 0:a792d4bf36c2 2144
Bogdan Marinescu 0:a792d4bf36c2 2145 /** Static thunk for passing as C-style function
Bogdan Marinescu 0:a792d4bf36c2 2146 *
Bogdan Marinescu 0:a792d4bf36c2 2147 * @param func Event to call passed as a void pointer
Bogdan Marinescu 0:a792d4bf36c2 2148 * @param a0..a4 Arguments to pass to the event
Bogdan Marinescu 0:a792d4bf36c2 2149 */
Bogdan Marinescu 0:a792d4bf36c2 2150 static void thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Bogdan Marinescu 0:a792d4bf36c2 2151 return static_cast<Event*>(func)->call(a0, a1, a2, a3, a4);
Bogdan Marinescu 0:a792d4bf36c2 2152 }
Bogdan Marinescu 0:a792d4bf36c2 2153
Bogdan Marinescu 0:a792d4bf36c2 2154 /** Cancels the most recently posted event
Bogdan Marinescu 0:a792d4bf36c2 2155 *
Bogdan Marinescu 0:a792d4bf36c2 2156 * Attempts to cancel the most recently posted event. It is safe to call
Bogdan Marinescu 0:a792d4bf36c2 2157 * cancel after an event has already been dispatched.
Bogdan Marinescu 0:a792d4bf36c2 2158 *
Bogdan Marinescu 0:a792d4bf36c2 2159 * The cancel function is irq safe.
Bogdan Marinescu 0:a792d4bf36c2 2160 *
Bogdan Marinescu 0:a792d4bf36c2 2161 * If called while the event queue's dispatch loop is active, the cancel
Bogdan Marinescu 0:a792d4bf36c2 2162 * function does not garuntee that the event will not execute after it
Bogdan Marinescu 0:a792d4bf36c2 2163 * returns, as the event may have already begun executing.
Bogdan Marinescu 0:a792d4bf36c2 2164 */
Bogdan Marinescu 0:a792d4bf36c2 2165 void cancel() const {
Bogdan Marinescu 0:a792d4bf36c2 2166 if (_event) {
Bogdan Marinescu 0:a792d4bf36c2 2167 equeue_cancel(_event->equeue, _event->id);
Bogdan Marinescu 0:a792d4bf36c2 2168 }
Bogdan Marinescu 0:a792d4bf36c2 2169 }
Bogdan Marinescu 0:a792d4bf36c2 2170
Bogdan Marinescu 0:a792d4bf36c2 2171 private:
Bogdan Marinescu 0:a792d4bf36c2 2172 struct event {
Bogdan Marinescu 0:a792d4bf36c2 2173 unsigned ref;
Bogdan Marinescu 0:a792d4bf36c2 2174 equeue_t *equeue;
Bogdan Marinescu 0:a792d4bf36c2 2175 int id;
Bogdan Marinescu 0:a792d4bf36c2 2176
Bogdan Marinescu 0:a792d4bf36c2 2177 int delay;
Bogdan Marinescu 0:a792d4bf36c2 2178 int period;
Bogdan Marinescu 0:a792d4bf36c2 2179
Bogdan Marinescu 0:a792d4bf36c2 2180 int (*post)(struct event *, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4);
Bogdan Marinescu 0:a792d4bf36c2 2181 void (*dtor)(struct event *);
Bogdan Marinescu 0:a792d4bf36c2 2182
Bogdan Marinescu 0:a792d4bf36c2 2183 // F follows
Bogdan Marinescu 0:a792d4bf36c2 2184 } *_event;
Bogdan Marinescu 0:a792d4bf36c2 2185
Christopher Haster 4:f157c7bf01cc 2186 // Event attributes
Christopher Haster 4:f157c7bf01cc 2187 template <typename F>
Christopher Haster 4:f157c7bf01cc 2188 static int event_post(struct event *e, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
Christopher Haster 4:f157c7bf01cc 2189 typedef EventQueue::context50<F, A0, A1, A2, A3, A4> C;
Christopher Haster 4:f157c7bf01cc 2190 void *p = equeue_alloc(e->equeue, sizeof(C));
Christopher Haster 4:f157c7bf01cc 2191 if (!p) {
Christopher Haster 4:f157c7bf01cc 2192 return 0;
Christopher Haster 4:f157c7bf01cc 2193 }
Christopher Haster 4:f157c7bf01cc 2194
Christopher Haster 4:f157c7bf01cc 2195 new (p) C(*(F*)(e + 1), a0, a1, a2, a3, a4);
Christopher Haster 4:f157c7bf01cc 2196 equeue_event_delay(p, e->delay);
Christopher Haster 4:f157c7bf01cc 2197 equeue_event_period(p, e->period);
Christopher Haster 7:80510299c57c 2198 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
Christopher Haster 7:80510299c57c 2199 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
Christopher Haster 4:f157c7bf01cc 2200 }
Christopher Haster 4:f157c7bf01cc 2201
Christopher Haster 4:f157c7bf01cc 2202 template <typename F>
Christopher Haster 4:f157c7bf01cc 2203 static void event_dtor(struct event *e) {
Christopher Haster 4:f157c7bf01cc 2204 ((F*)(e + 1))->~F();
Christopher Haster 4:f157c7bf01cc 2205 }
Christopher Haster 4:f157c7bf01cc 2206
Bogdan Marinescu 0:a792d4bf36c2 2207 public:
Bogdan Marinescu 0:a792d4bf36c2 2208 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2209 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2210 */
Bogdan Marinescu 0:a792d4bf36c2 2211 template <typename F, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 2212 Event(EventQueue *q, F f, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2213 new (this) Event(q, EventQueue::context15<F, C0, A0, A1, A2, A3, A4>(f, c0));
Bogdan Marinescu 0:a792d4bf36c2 2214 }
Bogdan Marinescu 0:a792d4bf36c2 2215
Bogdan Marinescu 0:a792d4bf36c2 2216 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2217 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2218 */
Bogdan Marinescu 0:a792d4bf36c2 2219 template <typename F, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 2220 Event(EventQueue *q, F f, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2221 new (this) Event(q, EventQueue::context25<F, C0, C1, A0, A1, A2, A3, A4>(f, c0, c1));
Bogdan Marinescu 0:a792d4bf36c2 2222 }
Bogdan Marinescu 0:a792d4bf36c2 2223
Bogdan Marinescu 0:a792d4bf36c2 2224 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2225 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2226 */
Bogdan Marinescu 0:a792d4bf36c2 2227 template <typename F, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 2228 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2229 new (this) Event(q, EventQueue::context35<F, C0, C1, C2, A0, A1, A2, A3, A4>(f, c0, c1, c2));
Bogdan Marinescu 0:a792d4bf36c2 2230 }
Bogdan Marinescu 0:a792d4bf36c2 2231
Bogdan Marinescu 0:a792d4bf36c2 2232 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2233 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2234 */
Bogdan Marinescu 0:a792d4bf36c2 2235 template <typename F, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 2236 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2237 new (this) Event(q, EventQueue::context45<F, C0, C1, C2, C3, A0, A1, A2, A3, A4>(f, c0, c1, c2, c3));
Bogdan Marinescu 0:a792d4bf36c2 2238 }
Bogdan Marinescu 0:a792d4bf36c2 2239
Bogdan Marinescu 0:a792d4bf36c2 2240 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2241 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2242 */
Bogdan Marinescu 0:a792d4bf36c2 2243 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 2244 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2245 new (this) Event(q, EventQueue::context55<F, C0, C1, C2, C3, C4, A0, A1, A2, A3, A4>(f, c0, c1, c2, c3, c4));
Bogdan Marinescu 0:a792d4bf36c2 2246 }
Bogdan Marinescu 0:a792d4bf36c2 2247
Bogdan Marinescu 0:a792d4bf36c2 2248 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2249 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2250 */
Bogdan Marinescu 0:a792d4bf36c2 2251 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 2252 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4), B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 2253 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 2254 }
Bogdan Marinescu 0:a792d4bf36c2 2255
Bogdan Marinescu 0:a792d4bf36c2 2256 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2257 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2258 */
Bogdan Marinescu 0:a792d4bf36c2 2259 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 2260 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 2261 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 2262 }
Bogdan Marinescu 0:a792d4bf36c2 2263
Bogdan Marinescu 0:a792d4bf36c2 2264 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2265 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2266 */
Bogdan Marinescu 0:a792d4bf36c2 2267 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 2268 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 2269 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 2270 }
Bogdan Marinescu 0:a792d4bf36c2 2271
Bogdan Marinescu 0:a792d4bf36c2 2272 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2273 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2274 */
Bogdan Marinescu 0:a792d4bf36c2 2275 template <typename T, typename R, typename B0>
Bogdan Marinescu 0:a792d4bf36c2 2276 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const volatile, B0 b0) {
Bogdan Marinescu 0:a792d4bf36c2 2277 new (this) Event(q, mbed::callback(obj, method), b0);
Bogdan Marinescu 0:a792d4bf36c2 2278 }
Bogdan Marinescu 0:a792d4bf36c2 2279
Bogdan Marinescu 0:a792d4bf36c2 2280 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2281 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2282 */
Bogdan Marinescu 0:a792d4bf36c2 2283 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 2284 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4), B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 2285 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 2286 }
Bogdan Marinescu 0:a792d4bf36c2 2287
Bogdan Marinescu 0:a792d4bf36c2 2288 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2289 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2290 */
Bogdan Marinescu 0:a792d4bf36c2 2291 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 2292 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 2293 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 2294 }
Bogdan Marinescu 0:a792d4bf36c2 2295
Bogdan Marinescu 0:a792d4bf36c2 2296 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2297 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2298 */
Bogdan Marinescu 0:a792d4bf36c2 2299 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 2300 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 2301 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 2302 }
Bogdan Marinescu 0:a792d4bf36c2 2303
Bogdan Marinescu 0:a792d4bf36c2 2304 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2305 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2306 */
Bogdan Marinescu 0:a792d4bf36c2 2307 template <typename T, typename R, typename B0, typename B1>
Bogdan Marinescu 0:a792d4bf36c2 2308 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1) {
Bogdan Marinescu 0:a792d4bf36c2 2309 new (this) Event(q, mbed::callback(obj, method), b0, b1);
Bogdan Marinescu 0:a792d4bf36c2 2310 }
Bogdan Marinescu 0:a792d4bf36c2 2311
Bogdan Marinescu 0:a792d4bf36c2 2312 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2313 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2314 */
Bogdan Marinescu 0:a792d4bf36c2 2315 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 2316 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4), B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 2317 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 2318 }
Bogdan Marinescu 0:a792d4bf36c2 2319
Bogdan Marinescu 0:a792d4bf36c2 2320 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2321 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2322 */
Bogdan Marinescu 0:a792d4bf36c2 2323 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 2324 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 2325 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 2326 }
Bogdan Marinescu 0:a792d4bf36c2 2327
Bogdan Marinescu 0:a792d4bf36c2 2328 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2329 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2330 */
Bogdan Marinescu 0:a792d4bf36c2 2331 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 2332 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 2333 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 2334 }
Bogdan Marinescu 0:a792d4bf36c2 2335
Bogdan Marinescu 0:a792d4bf36c2 2336 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2337 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2338 */
Bogdan Marinescu 0:a792d4bf36c2 2339 template <typename T, typename R, typename B0, typename B1, typename B2>
Bogdan Marinescu 0:a792d4bf36c2 2340 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1, B2 b2) {
Bogdan Marinescu 0:a792d4bf36c2 2341 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
Bogdan Marinescu 0:a792d4bf36c2 2342 }
Bogdan Marinescu 0:a792d4bf36c2 2343
Bogdan Marinescu 0:a792d4bf36c2 2344 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2345 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2346 */
Bogdan Marinescu 0:a792d4bf36c2 2347 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 2348 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4), B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 2349 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 2350 }
Bogdan Marinescu 0:a792d4bf36c2 2351
Bogdan Marinescu 0:a792d4bf36c2 2352 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2353 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2354 */
Bogdan Marinescu 0:a792d4bf36c2 2355 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 2356 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) const, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 2357 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 2358 }
Bogdan Marinescu 0:a792d4bf36c2 2359
Bogdan Marinescu 0:a792d4bf36c2 2360 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2361 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2362 */
Bogdan Marinescu 0:a792d4bf36c2 2363 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 2364 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 2365 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 2366 }
Bogdan Marinescu 0:a792d4bf36c2 2367
Bogdan Marinescu 0:a792d4bf36c2 2368 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2369 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2370 */
Bogdan Marinescu 0:a792d4bf36c2 2371 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
Bogdan Marinescu 0:a792d4bf36c2 2372 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
Bogdan Marinescu 0:a792d4bf36c2 2373 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
Bogdan Marinescu 0:a792d4bf36c2 2374 }
Bogdan Marinescu 0:a792d4bf36c2 2375
Bogdan Marinescu 0:a792d4bf36c2 2376 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2377 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2378 */
Bogdan Marinescu 0:a792d4bf36c2 2379 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 2380 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 2381 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 2382 }
Bogdan Marinescu 0:a792d4bf36c2 2383
Bogdan Marinescu 0:a792d4bf36c2 2384 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2385 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2386 */
Bogdan Marinescu 0:a792d4bf36c2 2387 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 2388 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 2389 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 2390 }
Bogdan Marinescu 0:a792d4bf36c2 2391
Bogdan Marinescu 0:a792d4bf36c2 2392 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2393 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2394 */
Bogdan Marinescu 0:a792d4bf36c2 2395 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 2396 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 2397 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 2398 }
Bogdan Marinescu 0:a792d4bf36c2 2399
Bogdan Marinescu 0:a792d4bf36c2 2400 /** Create an event
Bogdan Marinescu 0:a792d4bf36c2 2401 * @see Event::Event
Bogdan Marinescu 0:a792d4bf36c2 2402 */
Bogdan Marinescu 0:a792d4bf36c2 2403 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
Bogdan Marinescu 0:a792d4bf36c2 2404 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
Bogdan Marinescu 0:a792d4bf36c2 2405 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
Bogdan Marinescu 0:a792d4bf36c2 2406 }
Bogdan Marinescu 0:a792d4bf36c2 2407 };
Bogdan Marinescu 0:a792d4bf36c2 2408
Bogdan Marinescu 0:a792d4bf36c2 2409
Bogdan Marinescu 0:a792d4bf36c2 2410
Bogdan Marinescu 0:a792d4bf36c2 2411 // Convenience functions declared here to avoid cyclic
Bogdan Marinescu 0:a792d4bf36c2 2412 // dependency between Event and EventQueue
Bogdan Marinescu 0:a792d4bf36c2 2413 template <typename R>
Bogdan Marinescu 0:a792d4bf36c2 2414 Event<void()> EventQueue::event(R (*func)()) {
Bogdan Marinescu 0:a792d4bf36c2 2415 return Event<void()>(this, func);
Bogdan Marinescu 0:a792d4bf36c2 2416 }
Bogdan Marinescu 0:a792d4bf36c2 2417
Bogdan Marinescu 0:a792d4bf36c2 2418 template <typename T, typename R>
Bogdan Marinescu 0:a792d4bf36c2 2419 Event<void()> EventQueue::event(T *obj, R (T::*method)()) {
Bogdan Marinescu 0:a792d4bf36c2 2420 return Event<void()>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2421 }
Bogdan Marinescu 0:a792d4bf36c2 2422
Bogdan Marinescu 0:a792d4bf36c2 2423 template <typename T, typename R>
Bogdan Marinescu 0:a792d4bf36c2 2424 Event<void()> EventQueue::event(const T *obj, R (T::*method)() const) {
Bogdan Marinescu 0:a792d4bf36c2 2425 return Event<void()>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2426 }
Bogdan Marinescu 0:a792d4bf36c2 2427
Bogdan Marinescu 0:a792d4bf36c2 2428 template <typename T, typename R>
Bogdan Marinescu 0:a792d4bf36c2 2429 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)() volatile) {
Bogdan Marinescu 0:a792d4bf36c2 2430 return Event<void()>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2431 }
Bogdan Marinescu 0:a792d4bf36c2 2432
Bogdan Marinescu 0:a792d4bf36c2 2433 template <typename T, typename R>
Bogdan Marinescu 0:a792d4bf36c2 2434 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)() const volatile) {
Bogdan Marinescu 0:a792d4bf36c2 2435 return Event<void()>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2436 }
Bogdan Marinescu 0:a792d4bf36c2 2437
Christopher Haster 14:65535458dd6f 2438 template <typename R>
Christopher Haster 14:65535458dd6f 2439 Event<void()> EventQueue::event(mbed::Callback<R()> cb) {
Christopher Haster 14:65535458dd6f 2440 return Event<void()>(this, cb);
Christopher Haster 14:65535458dd6f 2441 }
Christopher Haster 14:65535458dd6f 2442
Bogdan Marinescu 0:a792d4bf36c2 2443 template <typename R, typename B0, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 2444 Event<void()> EventQueue::event(R (*func)(B0), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2445 return Event<void()>(this, func, c0);
Bogdan Marinescu 0:a792d4bf36c2 2446 }
Bogdan Marinescu 0:a792d4bf36c2 2447
Bogdan Marinescu 0:a792d4bf36c2 2448 template <typename T, typename R, typename B0, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 2449 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2450 return Event<void()>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2451 }
Bogdan Marinescu 0:a792d4bf36c2 2452
Bogdan Marinescu 0:a792d4bf36c2 2453 template <typename T, typename R, typename B0, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 2454 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0) const, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2455 return Event<void()>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2456 }
Bogdan Marinescu 0:a792d4bf36c2 2457
Bogdan Marinescu 0:a792d4bf36c2 2458 template <typename T, typename R, typename B0, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 2459 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0) volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2460 return Event<void()>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2461 }
Bogdan Marinescu 0:a792d4bf36c2 2462
Bogdan Marinescu 0:a792d4bf36c2 2463 template <typename T, typename R, typename B0, typename C0>
Bogdan Marinescu 0:a792d4bf36c2 2464 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0) const volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2465 return Event<void()>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2466 }
Bogdan Marinescu 0:a792d4bf36c2 2467
Christopher Haster 14:65535458dd6f 2468 template <typename R, typename B0, typename C0>
Christopher Haster 14:65535458dd6f 2469 Event<void()> EventQueue::event(mbed::Callback<R(B0)> cb, C0 c0) {
Christopher Haster 14:65535458dd6f 2470 return Event<void()>(this, cb, c0);
Christopher Haster 14:65535458dd6f 2471 }
Christopher Haster 14:65535458dd6f 2472
Bogdan Marinescu 0:a792d4bf36c2 2473 template <typename R, typename B0, typename B1, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 2474 Event<void()> EventQueue::event(R (*func)(B0, B1), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2475 return Event<void()>(this, func, c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2476 }
Bogdan Marinescu 0:a792d4bf36c2 2477
Bogdan Marinescu 0:a792d4bf36c2 2478 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 2479 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2480 return Event<void()>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2481 }
Bogdan Marinescu 0:a792d4bf36c2 2482
Bogdan Marinescu 0:a792d4bf36c2 2483 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 2484 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1) const, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2485 return Event<void()>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2486 }
Bogdan Marinescu 0:a792d4bf36c2 2487
Bogdan Marinescu 0:a792d4bf36c2 2488 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 2489 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1) volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2490 return Event<void()>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2491 }
Bogdan Marinescu 0:a792d4bf36c2 2492
Bogdan Marinescu 0:a792d4bf36c2 2493 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
Bogdan Marinescu 0:a792d4bf36c2 2494 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1) const volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2495 return Event<void()>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2496 }
Bogdan Marinescu 0:a792d4bf36c2 2497
Christopher Haster 14:65535458dd6f 2498 template <typename R, typename B0, typename B1, typename C0, typename C1>
Christopher Haster 14:65535458dd6f 2499 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1)> cb, C0 c0, C1 c1) {
Christopher Haster 14:65535458dd6f 2500 return Event<void()>(this, cb, c0, c1);
Christopher Haster 14:65535458dd6f 2501 }
Christopher Haster 14:65535458dd6f 2502
Bogdan Marinescu 0:a792d4bf36c2 2503 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 2504 Event<void()> EventQueue::event(R (*func)(B0, B1, B2), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2505 return Event<void()>(this, func, c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2506 }
Bogdan Marinescu 0:a792d4bf36c2 2507
Bogdan Marinescu 0:a792d4bf36c2 2508 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 2509 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2510 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2511 }
Bogdan Marinescu 0:a792d4bf36c2 2512
Bogdan Marinescu 0:a792d4bf36c2 2513 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 2514 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2) const, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2515 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2516 }
Bogdan Marinescu 0:a792d4bf36c2 2517
Bogdan Marinescu 0:a792d4bf36c2 2518 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 2519 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2) volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2520 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2521 }
Bogdan Marinescu 0:a792d4bf36c2 2522
Bogdan Marinescu 0:a792d4bf36c2 2523 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
Bogdan Marinescu 0:a792d4bf36c2 2524 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2) const volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2525 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2526 }
Bogdan Marinescu 0:a792d4bf36c2 2527
Christopher Haster 14:65535458dd6f 2528 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
Christopher Haster 14:65535458dd6f 2529 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2)> cb, C0 c0, C1 c1, C2 c2) {
Christopher Haster 14:65535458dd6f 2530 return Event<void()>(this, cb, c0, c1, c2);
Christopher Haster 14:65535458dd6f 2531 }
Christopher Haster 14:65535458dd6f 2532
Bogdan Marinescu 0:a792d4bf36c2 2533 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 2534 Event<void()> EventQueue::event(R (*func)(B0, B1, B2, B3), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2535 return Event<void()>(this, func, c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2536 }
Bogdan Marinescu 0:a792d4bf36c2 2537
Bogdan Marinescu 0:a792d4bf36c2 2538 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 2539 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2540 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2541 }
Bogdan Marinescu 0:a792d4bf36c2 2542
Bogdan Marinescu 0:a792d4bf36c2 2543 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 2544 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3) const, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2545 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2546 }
Bogdan Marinescu 0:a792d4bf36c2 2547
Bogdan Marinescu 0:a792d4bf36c2 2548 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 2549 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2550 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2551 }
Bogdan Marinescu 0:a792d4bf36c2 2552
Bogdan Marinescu 0:a792d4bf36c2 2553 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
Bogdan Marinescu 0:a792d4bf36c2 2554 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2555 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2556 }
Bogdan Marinescu 0:a792d4bf36c2 2557
Christopher Haster 14:65535458dd6f 2558 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
Christopher Haster 14:65535458dd6f 2559 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
Christopher Haster 14:65535458dd6f 2560 return Event<void()>(this, cb, c0, c1, c2, c3);
Christopher Haster 14:65535458dd6f 2561 }
Christopher Haster 14:65535458dd6f 2562
Bogdan Marinescu 0:a792d4bf36c2 2563 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 2564 Event<void()> EventQueue::event(R (*func)(B0, B1, B2, B3, B4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2565 return Event<void()>(this, func, c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2566 }
Bogdan Marinescu 0:a792d4bf36c2 2567
Bogdan Marinescu 0:a792d4bf36c2 2568 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 2569 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2570 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2571 }
Bogdan Marinescu 0:a792d4bf36c2 2572
Bogdan Marinescu 0:a792d4bf36c2 2573 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 2574 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2575 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2576 }
Bogdan Marinescu 0:a792d4bf36c2 2577
Bogdan Marinescu 0:a792d4bf36c2 2578 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 2579 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2580 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2581 }
Bogdan Marinescu 0:a792d4bf36c2 2582
Bogdan Marinescu 0:a792d4bf36c2 2583 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
Bogdan Marinescu 0:a792d4bf36c2 2584 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2585 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2586 }
Bogdan Marinescu 0:a792d4bf36c2 2587
Christopher Haster 14:65535458dd6f 2588 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
Christopher Haster 14:65535458dd6f 2589 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Christopher Haster 14:65535458dd6f 2590 return Event<void()>(this, cb, c0, c1, c2, c3, c4);
Christopher Haster 14:65535458dd6f 2591 }
Christopher Haster 14:65535458dd6f 2592
Bogdan Marinescu 0:a792d4bf36c2 2593 template <typename R, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2594 Event<void(A0)> EventQueue::event(R (*func)(A0)) {
Bogdan Marinescu 0:a792d4bf36c2 2595 return Event<void(A0)>(this, func);
Bogdan Marinescu 0:a792d4bf36c2 2596 }
Bogdan Marinescu 0:a792d4bf36c2 2597
Bogdan Marinescu 0:a792d4bf36c2 2598 template <typename T, typename R, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2599 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(A0)) {
Bogdan Marinescu 0:a792d4bf36c2 2600 return Event<void(A0)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2601 }
Bogdan Marinescu 0:a792d4bf36c2 2602
Bogdan Marinescu 0:a792d4bf36c2 2603 template <typename T, typename R, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2604 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(A0) const) {
Bogdan Marinescu 0:a792d4bf36c2 2605 return Event<void(A0)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2606 }
Bogdan Marinescu 0:a792d4bf36c2 2607
Bogdan Marinescu 0:a792d4bf36c2 2608 template <typename T, typename R, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2609 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(A0) volatile) {
Bogdan Marinescu 0:a792d4bf36c2 2610 return Event<void(A0)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2611 }
Bogdan Marinescu 0:a792d4bf36c2 2612
Bogdan Marinescu 0:a792d4bf36c2 2613 template <typename T, typename R, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2614 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(A0) const volatile) {
Bogdan Marinescu 0:a792d4bf36c2 2615 return Event<void(A0)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2616 }
Bogdan Marinescu 0:a792d4bf36c2 2617
Christopher Haster 14:65535458dd6f 2618 template <typename R, typename A0>
Christopher Haster 14:65535458dd6f 2619 Event<void(A0)> EventQueue::event(mbed::Callback<R(A0)> cb) {
Christopher Haster 14:65535458dd6f 2620 return Event<void(A0)>(this, cb);
Christopher Haster 14:65535458dd6f 2621 }
Christopher Haster 14:65535458dd6f 2622
Bogdan Marinescu 0:a792d4bf36c2 2623 template <typename R, typename B0, typename C0, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2624 Event<void(A0)> EventQueue::event(R (*func)(B0, A0), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2625 return Event<void(A0)>(this, func, c0);
Bogdan Marinescu 0:a792d4bf36c2 2626 }
Bogdan Marinescu 0:a792d4bf36c2 2627
Bogdan Marinescu 0:a792d4bf36c2 2628 template <typename T, typename R, typename B0, typename C0, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2629 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, A0), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2630 return Event<void(A0)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2631 }
Bogdan Marinescu 0:a792d4bf36c2 2632
Bogdan Marinescu 0:a792d4bf36c2 2633 template <typename T, typename R, typename B0, typename C0, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2634 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, A0) const, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2635 return Event<void(A0)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2636 }
Bogdan Marinescu 0:a792d4bf36c2 2637
Bogdan Marinescu 0:a792d4bf36c2 2638 template <typename T, typename R, typename B0, typename C0, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2639 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0) volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2640 return Event<void(A0)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2641 }
Bogdan Marinescu 0:a792d4bf36c2 2642
Bogdan Marinescu 0:a792d4bf36c2 2643 template <typename T, typename R, typename B0, typename C0, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2644 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0) const volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2645 return Event<void(A0)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2646 }
Bogdan Marinescu 0:a792d4bf36c2 2647
Christopher Haster 14:65535458dd6f 2648 template <typename R, typename B0, typename C0, typename A0>
Christopher Haster 14:65535458dd6f 2649 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, A0)> cb, C0 c0) {
Christopher Haster 14:65535458dd6f 2650 return Event<void(A0)>(this, cb, c0);
Christopher Haster 14:65535458dd6f 2651 }
Christopher Haster 14:65535458dd6f 2652
Bogdan Marinescu 0:a792d4bf36c2 2653 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2654 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, A0), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2655 return Event<void(A0)>(this, func, c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2656 }
Bogdan Marinescu 0:a792d4bf36c2 2657
Bogdan Marinescu 0:a792d4bf36c2 2658 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2659 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2660 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2661 }
Bogdan Marinescu 0:a792d4bf36c2 2662
Bogdan Marinescu 0:a792d4bf36c2 2663 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2664 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0) const, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2665 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2666 }
Bogdan Marinescu 0:a792d4bf36c2 2667
Bogdan Marinescu 0:a792d4bf36c2 2668 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2669 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0) volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2670 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2671 }
Bogdan Marinescu 0:a792d4bf36c2 2672
Bogdan Marinescu 0:a792d4bf36c2 2673 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2674 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0) const volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2675 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2676 }
Bogdan Marinescu 0:a792d4bf36c2 2677
Christopher Haster 14:65535458dd6f 2678 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
Christopher Haster 14:65535458dd6f 2679 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, A0)> cb, C0 c0, C1 c1) {
Christopher Haster 14:65535458dd6f 2680 return Event<void(A0)>(this, cb, c0, c1);
Christopher Haster 14:65535458dd6f 2681 }
Christopher Haster 14:65535458dd6f 2682
Bogdan Marinescu 0:a792d4bf36c2 2683 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2684 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, A0), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2685 return Event<void(A0)>(this, func, c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2686 }
Bogdan Marinescu 0:a792d4bf36c2 2687
Bogdan Marinescu 0:a792d4bf36c2 2688 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2689 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2690 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2691 }
Bogdan Marinescu 0:a792d4bf36c2 2692
Bogdan Marinescu 0:a792d4bf36c2 2693 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2694 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0) const, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2695 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2696 }
Bogdan Marinescu 0:a792d4bf36c2 2697
Bogdan Marinescu 0:a792d4bf36c2 2698 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2699 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0) volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2700 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2701 }
Bogdan Marinescu 0:a792d4bf36c2 2702
Bogdan Marinescu 0:a792d4bf36c2 2703 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2704 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0) const volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2705 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2706 }
Bogdan Marinescu 0:a792d4bf36c2 2707
Christopher Haster 14:65535458dd6f 2708 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
Christopher Haster 14:65535458dd6f 2709 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0)> cb, C0 c0, C1 c1, C2 c2) {
Christopher Haster 14:65535458dd6f 2710 return Event<void(A0)>(this, cb, c0, c1, c2);
Christopher Haster 14:65535458dd6f 2711 }
Christopher Haster 14:65535458dd6f 2712
Bogdan Marinescu 0:a792d4bf36c2 2713 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2714 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2715 return Event<void(A0)>(this, func, c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2716 }
Bogdan Marinescu 0:a792d4bf36c2 2717
Bogdan Marinescu 0:a792d4bf36c2 2718 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2719 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2720 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2721 }
Bogdan Marinescu 0:a792d4bf36c2 2722
Bogdan Marinescu 0:a792d4bf36c2 2723 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2724 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0) const, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2725 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2726 }
Bogdan Marinescu 0:a792d4bf36c2 2727
Bogdan Marinescu 0:a792d4bf36c2 2728 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2729 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2730 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2731 }
Bogdan Marinescu 0:a792d4bf36c2 2732
Bogdan Marinescu 0:a792d4bf36c2 2733 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2734 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2735 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2736 }
Bogdan Marinescu 0:a792d4bf36c2 2737
Christopher Haster 14:65535458dd6f 2738 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
Christopher Haster 14:65535458dd6f 2739 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
Christopher Haster 14:65535458dd6f 2740 return Event<void(A0)>(this, cb, c0, c1, c2, c3);
Christopher Haster 14:65535458dd6f 2741 }
Christopher Haster 14:65535458dd6f 2742
Bogdan Marinescu 0:a792d4bf36c2 2743 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2744 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2745 return Event<void(A0)>(this, func, c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2746 }
Bogdan Marinescu 0:a792d4bf36c2 2747
Bogdan Marinescu 0:a792d4bf36c2 2748 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2749 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2750 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2751 }
Bogdan Marinescu 0:a792d4bf36c2 2752
Bogdan Marinescu 0:a792d4bf36c2 2753 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2754 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2755 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2756 }
Bogdan Marinescu 0:a792d4bf36c2 2757
Bogdan Marinescu 0:a792d4bf36c2 2758 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2759 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2760 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2761 }
Bogdan Marinescu 0:a792d4bf36c2 2762
Bogdan Marinescu 0:a792d4bf36c2 2763 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
Bogdan Marinescu 0:a792d4bf36c2 2764 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2765 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2766 }
Bogdan Marinescu 0:a792d4bf36c2 2767
Christopher Haster 14:65535458dd6f 2768 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
Christopher Haster 14:65535458dd6f 2769 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Christopher Haster 14:65535458dd6f 2770 return Event<void(A0)>(this, cb, c0, c1, c2, c3, c4);
Christopher Haster 14:65535458dd6f 2771 }
Christopher Haster 14:65535458dd6f 2772
Bogdan Marinescu 0:a792d4bf36c2 2773 template <typename R, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2774 Event<void(A0, A1)> EventQueue::event(R (*func)(A0, A1)) {
Bogdan Marinescu 0:a792d4bf36c2 2775 return Event<void(A0, A1)>(this, func);
Bogdan Marinescu 0:a792d4bf36c2 2776 }
Bogdan Marinescu 0:a792d4bf36c2 2777
Bogdan Marinescu 0:a792d4bf36c2 2778 template <typename T, typename R, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2779 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(A0, A1)) {
Bogdan Marinescu 0:a792d4bf36c2 2780 return Event<void(A0, A1)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2781 }
Bogdan Marinescu 0:a792d4bf36c2 2782
Bogdan Marinescu 0:a792d4bf36c2 2783 template <typename T, typename R, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2784 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(A0, A1) const) {
Bogdan Marinescu 0:a792d4bf36c2 2785 return Event<void(A0, A1)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2786 }
Bogdan Marinescu 0:a792d4bf36c2 2787
Bogdan Marinescu 0:a792d4bf36c2 2788 template <typename T, typename R, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2789 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1) volatile) {
Bogdan Marinescu 0:a792d4bf36c2 2790 return Event<void(A0, A1)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2791 }
Bogdan Marinescu 0:a792d4bf36c2 2792
Bogdan Marinescu 0:a792d4bf36c2 2793 template <typename T, typename R, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2794 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1) const volatile) {
Bogdan Marinescu 0:a792d4bf36c2 2795 return Event<void(A0, A1)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2796 }
Bogdan Marinescu 0:a792d4bf36c2 2797
Christopher Haster 14:65535458dd6f 2798 template <typename R, typename A0, typename A1>
Christopher Haster 14:65535458dd6f 2799 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(A0, A1)> cb) {
Christopher Haster 14:65535458dd6f 2800 return Event<void(A0, A1)>(this, cb);
Christopher Haster 14:65535458dd6f 2801 }
Christopher Haster 14:65535458dd6f 2802
Bogdan Marinescu 0:a792d4bf36c2 2803 template <typename R, typename B0, typename C0, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2804 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, A0, A1), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2805 return Event<void(A0, A1)>(this, func, c0);
Bogdan Marinescu 0:a792d4bf36c2 2806 }
Bogdan Marinescu 0:a792d4bf36c2 2807
Bogdan Marinescu 0:a792d4bf36c2 2808 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2809 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2810 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2811 }
Bogdan Marinescu 0:a792d4bf36c2 2812
Bogdan Marinescu 0:a792d4bf36c2 2813 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2814 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1) const, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2815 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2816 }
Bogdan Marinescu 0:a792d4bf36c2 2817
Bogdan Marinescu 0:a792d4bf36c2 2818 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2819 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1) volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2820 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2821 }
Bogdan Marinescu 0:a792d4bf36c2 2822
Bogdan Marinescu 0:a792d4bf36c2 2823 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2824 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1) const volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2825 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2826 }
Bogdan Marinescu 0:a792d4bf36c2 2827
Christopher Haster 14:65535458dd6f 2828 template <typename R, typename B0, typename C0, typename A0, typename A1>
Christopher Haster 14:65535458dd6f 2829 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, A0, A1)> cb, C0 c0) {
Christopher Haster 14:65535458dd6f 2830 return Event<void(A0, A1)>(this, cb, c0);
Christopher Haster 14:65535458dd6f 2831 }
Christopher Haster 14:65535458dd6f 2832
Bogdan Marinescu 0:a792d4bf36c2 2833 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2834 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, A0, A1), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2835 return Event<void(A0, A1)>(this, func, c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2836 }
Bogdan Marinescu 0:a792d4bf36c2 2837
Bogdan Marinescu 0:a792d4bf36c2 2838 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2839 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2840 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2841 }
Bogdan Marinescu 0:a792d4bf36c2 2842
Bogdan Marinescu 0:a792d4bf36c2 2843 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2844 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1) const, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2845 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2846 }
Bogdan Marinescu 0:a792d4bf36c2 2847
Bogdan Marinescu 0:a792d4bf36c2 2848 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2849 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1) volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2850 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2851 }
Bogdan Marinescu 0:a792d4bf36c2 2852
Bogdan Marinescu 0:a792d4bf36c2 2853 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2854 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1) const volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 2855 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 2856 }
Bogdan Marinescu 0:a792d4bf36c2 2857
Christopher Haster 14:65535458dd6f 2858 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
Christopher Haster 14:65535458dd6f 2859 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1)> cb, C0 c0, C1 c1) {
Christopher Haster 14:65535458dd6f 2860 return Event<void(A0, A1)>(this, cb, c0, c1);
Christopher Haster 14:65535458dd6f 2861 }
Christopher Haster 14:65535458dd6f 2862
Bogdan Marinescu 0:a792d4bf36c2 2863 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2864 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2865 return Event<void(A0, A1)>(this, func, c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2866 }
Bogdan Marinescu 0:a792d4bf36c2 2867
Bogdan Marinescu 0:a792d4bf36c2 2868 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2869 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2870 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2871 }
Bogdan Marinescu 0:a792d4bf36c2 2872
Bogdan Marinescu 0:a792d4bf36c2 2873 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2874 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1) const, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2875 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2876 }
Bogdan Marinescu 0:a792d4bf36c2 2877
Bogdan Marinescu 0:a792d4bf36c2 2878 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2879 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2880 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2881 }
Bogdan Marinescu 0:a792d4bf36c2 2882
Bogdan Marinescu 0:a792d4bf36c2 2883 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2884 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) const volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 2885 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 2886 }
Bogdan Marinescu 0:a792d4bf36c2 2887
Christopher Haster 14:65535458dd6f 2888 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
Christopher Haster 14:65535458dd6f 2889 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1)> cb, C0 c0, C1 c1, C2 c2) {
Christopher Haster 14:65535458dd6f 2890 return Event<void(A0, A1)>(this, cb, c0, c1, c2);
Christopher Haster 14:65535458dd6f 2891 }
Christopher Haster 14:65535458dd6f 2892
Bogdan Marinescu 0:a792d4bf36c2 2893 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2894 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2895 return Event<void(A0, A1)>(this, func, c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2896 }
Bogdan Marinescu 0:a792d4bf36c2 2897
Bogdan Marinescu 0:a792d4bf36c2 2898 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2899 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2900 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2901 }
Bogdan Marinescu 0:a792d4bf36c2 2902
Bogdan Marinescu 0:a792d4bf36c2 2903 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2904 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2905 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2906 }
Bogdan Marinescu 0:a792d4bf36c2 2907
Bogdan Marinescu 0:a792d4bf36c2 2908 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2909 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2910 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2911 }
Bogdan Marinescu 0:a792d4bf36c2 2912
Bogdan Marinescu 0:a792d4bf36c2 2913 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2914 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 2915 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 2916 }
Bogdan Marinescu 0:a792d4bf36c2 2917
Christopher Haster 14:65535458dd6f 2918 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
Christopher Haster 14:65535458dd6f 2919 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
Christopher Haster 14:65535458dd6f 2920 return Event<void(A0, A1)>(this, cb, c0, c1, c2, c3);
Christopher Haster 14:65535458dd6f 2921 }
Christopher Haster 14:65535458dd6f 2922
Bogdan Marinescu 0:a792d4bf36c2 2923 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2924 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2925 return Event<void(A0, A1)>(this, func, c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2926 }
Bogdan Marinescu 0:a792d4bf36c2 2927
Bogdan Marinescu 0:a792d4bf36c2 2928 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2929 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2930 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2931 }
Bogdan Marinescu 0:a792d4bf36c2 2932
Bogdan Marinescu 0:a792d4bf36c2 2933 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2934 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2935 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2936 }
Bogdan Marinescu 0:a792d4bf36c2 2937
Bogdan Marinescu 0:a792d4bf36c2 2938 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2939 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2940 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2941 }
Bogdan Marinescu 0:a792d4bf36c2 2942
Bogdan Marinescu 0:a792d4bf36c2 2943 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
Bogdan Marinescu 0:a792d4bf36c2 2944 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 2945 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 2946 }
Bogdan Marinescu 0:a792d4bf36c2 2947
Christopher Haster 14:65535458dd6f 2948 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
Christopher Haster 14:65535458dd6f 2949 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0, A1)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Christopher Haster 14:65535458dd6f 2950 return Event<void(A0, A1)>(this, cb, c0, c1, c2, c3, c4);
Christopher Haster 14:65535458dd6f 2951 }
Christopher Haster 14:65535458dd6f 2952
Bogdan Marinescu 0:a792d4bf36c2 2953 template <typename R, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2954 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(A0, A1, A2)) {
Bogdan Marinescu 0:a792d4bf36c2 2955 return Event<void(A0, A1, A2)>(this, func);
Bogdan Marinescu 0:a792d4bf36c2 2956 }
Bogdan Marinescu 0:a792d4bf36c2 2957
Bogdan Marinescu 0:a792d4bf36c2 2958 template <typename T, typename R, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2959 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2)) {
Bogdan Marinescu 0:a792d4bf36c2 2960 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2961 }
Bogdan Marinescu 0:a792d4bf36c2 2962
Bogdan Marinescu 0:a792d4bf36c2 2963 template <typename T, typename R, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2964 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2) const) {
Bogdan Marinescu 0:a792d4bf36c2 2965 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2966 }
Bogdan Marinescu 0:a792d4bf36c2 2967
Bogdan Marinescu 0:a792d4bf36c2 2968 template <typename T, typename R, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2969 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2) volatile) {
Bogdan Marinescu 0:a792d4bf36c2 2970 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2971 }
Bogdan Marinescu 0:a792d4bf36c2 2972
Bogdan Marinescu 0:a792d4bf36c2 2973 template <typename T, typename R, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2974 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2) const volatile) {
Bogdan Marinescu 0:a792d4bf36c2 2975 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 2976 }
Bogdan Marinescu 0:a792d4bf36c2 2977
Christopher Haster 14:65535458dd6f 2978 template <typename R, typename A0, typename A1, typename A2>
Christopher Haster 14:65535458dd6f 2979 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(A0, A1, A2)> cb) {
Christopher Haster 14:65535458dd6f 2980 return Event<void(A0, A1, A2)>(this, cb);
Christopher Haster 14:65535458dd6f 2981 }
Christopher Haster 14:65535458dd6f 2982
Bogdan Marinescu 0:a792d4bf36c2 2983 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2984 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, A0, A1, A2), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2985 return Event<void(A0, A1, A2)>(this, func, c0);
Bogdan Marinescu 0:a792d4bf36c2 2986 }
Bogdan Marinescu 0:a792d4bf36c2 2987
Bogdan Marinescu 0:a792d4bf36c2 2988 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2989 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2990 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2991 }
Bogdan Marinescu 0:a792d4bf36c2 2992
Bogdan Marinescu 0:a792d4bf36c2 2993 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2994 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2) const, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 2995 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 2996 }
Bogdan Marinescu 0:a792d4bf36c2 2997
Bogdan Marinescu 0:a792d4bf36c2 2998 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 2999 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2) volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3000 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3001 }
Bogdan Marinescu 0:a792d4bf36c2 3002
Bogdan Marinescu 0:a792d4bf36c2 3003 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3004 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1, A2) const volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3005 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3006 }
Bogdan Marinescu 0:a792d4bf36c2 3007
Christopher Haster 14:65535458dd6f 3008 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
Christopher Haster 14:65535458dd6f 3009 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2)> cb, C0 c0) {
Christopher Haster 14:65535458dd6f 3010 return Event<void(A0, A1, A2)>(this, cb, c0);
Christopher Haster 14:65535458dd6f 3011 }
Christopher Haster 14:65535458dd6f 3012
Bogdan Marinescu 0:a792d4bf36c2 3013 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3014 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3015 return Event<void(A0, A1, A2)>(this, func, c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3016 }
Bogdan Marinescu 0:a792d4bf36c2 3017
Bogdan Marinescu 0:a792d4bf36c2 3018 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3019 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1, A2), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3020 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3021 }
Bogdan Marinescu 0:a792d4bf36c2 3022
Bogdan Marinescu 0:a792d4bf36c2 3023 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3024 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1, A2) const, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3025 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3026 }
Bogdan Marinescu 0:a792d4bf36c2 3027
Bogdan Marinescu 0:a792d4bf36c2 3028 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3029 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3030 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3031 }
Bogdan Marinescu 0:a792d4bf36c2 3032
Bogdan Marinescu 0:a792d4bf36c2 3033 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3034 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) const volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3035 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3036 }
Bogdan Marinescu 0:a792d4bf36c2 3037
Christopher Haster 14:65535458dd6f 3038 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
Christopher Haster 14:65535458dd6f 3039 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2)> cb, C0 c0, C1 c1) {
Christopher Haster 14:65535458dd6f 3040 return Event<void(A0, A1, A2)>(this, cb, c0, c1);
Christopher Haster 14:65535458dd6f 3041 }
Christopher Haster 14:65535458dd6f 3042
Bogdan Marinescu 0:a792d4bf36c2 3043 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3044 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1, A2), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3045 return Event<void(A0, A1, A2)>(this, func, c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3046 }
Bogdan Marinescu 0:a792d4bf36c2 3047
Bogdan Marinescu 0:a792d4bf36c2 3048 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3049 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3050 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3051 }
Bogdan Marinescu 0:a792d4bf36c2 3052
Bogdan Marinescu 0:a792d4bf36c2 3053 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3054 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3055 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3056 }
Bogdan Marinescu 0:a792d4bf36c2 3057
Bogdan Marinescu 0:a792d4bf36c2 3058 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3059 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3060 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3061 }
Bogdan Marinescu 0:a792d4bf36c2 3062
Bogdan Marinescu 0:a792d4bf36c2 3063 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3064 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3065 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3066 }
Bogdan Marinescu 0:a792d4bf36c2 3067
Christopher Haster 14:65535458dd6f 3068 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
Christopher Haster 14:65535458dd6f 3069 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1, A2)> cb, C0 c0, C1 c1, C2 c2) {
Christopher Haster 14:65535458dd6f 3070 return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2);
Christopher Haster 14:65535458dd6f 3071 }
Christopher Haster 14:65535458dd6f 3072
Bogdan Marinescu 0:a792d4bf36c2 3073 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3074 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3075 return Event<void(A0, A1, A2)>(this, func, c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3076 }
Bogdan Marinescu 0:a792d4bf36c2 3077
Bogdan Marinescu 0:a792d4bf36c2 3078 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3079 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3080 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3081 }
Bogdan Marinescu 0:a792d4bf36c2 3082
Bogdan Marinescu 0:a792d4bf36c2 3083 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3084 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) const, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3085 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3086 }
Bogdan Marinescu 0:a792d4bf36c2 3087
Bogdan Marinescu 0:a792d4bf36c2 3088 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3089 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3090 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3091 }
Bogdan Marinescu 0:a792d4bf36c2 3092
Bogdan Marinescu 0:a792d4bf36c2 3093 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3094 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3095 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3096 }
Bogdan Marinescu 0:a792d4bf36c2 3097
Christopher Haster 14:65535458dd6f 3098 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
Christopher Haster 14:65535458dd6f 3099 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1, A2)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
Christopher Haster 14:65535458dd6f 3100 return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2, c3);
Christopher Haster 14:65535458dd6f 3101 }
Christopher Haster 14:65535458dd6f 3102
Bogdan Marinescu 0:a792d4bf36c2 3103 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3104 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3105 return Event<void(A0, A1, A2)>(this, func, c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3106 }
Bogdan Marinescu 0:a792d4bf36c2 3107
Bogdan Marinescu 0:a792d4bf36c2 3108 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3109 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3110 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3111 }
Bogdan Marinescu 0:a792d4bf36c2 3112
Bogdan Marinescu 0:a792d4bf36c2 3113 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3114 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3115 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3116 }
Bogdan Marinescu 0:a792d4bf36c2 3117
Bogdan Marinescu 0:a792d4bf36c2 3118 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3119 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3120 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3121 }
Bogdan Marinescu 0:a792d4bf36c2 3122
Bogdan Marinescu 0:a792d4bf36c2 3123 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
Bogdan Marinescu 0:a792d4bf36c2 3124 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3125 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3126 }
Bogdan Marinescu 0:a792d4bf36c2 3127
Christopher Haster 14:65535458dd6f 3128 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
Christopher Haster 14:65535458dd6f 3129 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0, A1, A2)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Christopher Haster 14:65535458dd6f 3130 return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2, c3, c4);
Christopher Haster 14:65535458dd6f 3131 }
Christopher Haster 14:65535458dd6f 3132
Bogdan Marinescu 0:a792d4bf36c2 3133 template <typename R, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3134 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(A0, A1, A2, A3)) {
Bogdan Marinescu 0:a792d4bf36c2 3135 return Event<void(A0, A1, A2, A3)>(this, func);
Bogdan Marinescu 0:a792d4bf36c2 3136 }
Bogdan Marinescu 0:a792d4bf36c2 3137
Bogdan Marinescu 0:a792d4bf36c2 3138 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3139 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2, A3)) {
Bogdan Marinescu 0:a792d4bf36c2 3140 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 3141 }
Bogdan Marinescu 0:a792d4bf36c2 3142
Bogdan Marinescu 0:a792d4bf36c2 3143 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3144 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2, A3) const) {
Bogdan Marinescu 0:a792d4bf36c2 3145 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 3146 }
Bogdan Marinescu 0:a792d4bf36c2 3147
Bogdan Marinescu 0:a792d4bf36c2 3148 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3149 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
Bogdan Marinescu 0:a792d4bf36c2 3150 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 3151 }
Bogdan Marinescu 0:a792d4bf36c2 3152
Bogdan Marinescu 0:a792d4bf36c2 3153 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3154 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
Bogdan Marinescu 0:a792d4bf36c2 3155 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 3156 }
Bogdan Marinescu 0:a792d4bf36c2 3157
Christopher Haster 14:65535458dd6f 3158 template <typename R, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 14:65535458dd6f 3159 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(A0, A1, A2, A3)> cb) {
Christopher Haster 14:65535458dd6f 3160 return Event<void(A0, A1, A2, A3)>(this, cb);
Christopher Haster 14:65535458dd6f 3161 }
Christopher Haster 14:65535458dd6f 3162
Bogdan Marinescu 0:a792d4bf36c2 3163 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3164 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, A0, A1, A2, A3), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3165 return Event<void(A0, A1, A2, A3)>(this, func, c0);
Bogdan Marinescu 0:a792d4bf36c2 3166 }
Bogdan Marinescu 0:a792d4bf36c2 3167
Bogdan Marinescu 0:a792d4bf36c2 3168 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3169 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2, A3), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3170 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3171 }
Bogdan Marinescu 0:a792d4bf36c2 3172
Bogdan Marinescu 0:a792d4bf36c2 3173 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3174 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2, A3) const, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3175 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3176 }
Bogdan Marinescu 0:a792d4bf36c2 3177
Bogdan Marinescu 0:a792d4bf36c2 3178 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3179 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3180 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3181 }
Bogdan Marinescu 0:a792d4bf36c2 3182
Bogdan Marinescu 0:a792d4bf36c2 3183 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3184 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) const volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3185 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3186 }
Bogdan Marinescu 0:a792d4bf36c2 3187
Christopher Haster 14:65535458dd6f 3188 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 14:65535458dd6f 3189 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2, A3)> cb, C0 c0) {
Christopher Haster 14:65535458dd6f 3190 return Event<void(A0, A1, A2, A3)>(this, cb, c0);
Christopher Haster 14:65535458dd6f 3191 }
Christopher Haster 14:65535458dd6f 3192
Bogdan Marinescu 0:a792d4bf36c2 3193 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3194 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2, A3), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3195 return Event<void(A0, A1, A2, A3)>(this, func, c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3196 }
Bogdan Marinescu 0:a792d4bf36c2 3197
Bogdan Marinescu 0:a792d4bf36c2 3198 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3199 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3200 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3201 }
Bogdan Marinescu 0:a792d4bf36c2 3202
Bogdan Marinescu 0:a792d4bf36c2 3203 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3204 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3205 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3206 }
Bogdan Marinescu 0:a792d4bf36c2 3207
Bogdan Marinescu 0:a792d4bf36c2 3208 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3209 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3210 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3211 }
Bogdan Marinescu 0:a792d4bf36c2 3212
Bogdan Marinescu 0:a792d4bf36c2 3213 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3214 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3215 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3216 }
Bogdan Marinescu 0:a792d4bf36c2 3217
Christopher Haster 14:65535458dd6f 3218 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 14:65535458dd6f 3219 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2, A3)> cb, C0 c0, C1 c1) {
Christopher Haster 14:65535458dd6f 3220 return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1);
Christopher Haster 14:65535458dd6f 3221 }
Christopher Haster 14:65535458dd6f 3222
Bogdan Marinescu 0:a792d4bf36c2 3223 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3224 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3225 return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3226 }
Bogdan Marinescu 0:a792d4bf36c2 3227
Bogdan Marinescu 0:a792d4bf36c2 3228 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3229 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3230 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3231 }
Bogdan Marinescu 0:a792d4bf36c2 3232
Bogdan Marinescu 0:a792d4bf36c2 3233 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3234 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3235 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3236 }
Bogdan Marinescu 0:a792d4bf36c2 3237
Bogdan Marinescu 0:a792d4bf36c2 3238 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3239 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3240 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3241 }
Bogdan Marinescu 0:a792d4bf36c2 3242
Bogdan Marinescu 0:a792d4bf36c2 3243 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3244 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3245 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3246 }
Bogdan Marinescu 0:a792d4bf36c2 3247
Christopher Haster 14:65535458dd6f 3248 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 14:65535458dd6f 3249 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1, A2, A3)> cb, C0 c0, C1 c1, C2 c2) {
Christopher Haster 14:65535458dd6f 3250 return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2);
Christopher Haster 14:65535458dd6f 3251 }
Christopher Haster 14:65535458dd6f 3252
Bogdan Marinescu 0:a792d4bf36c2 3253 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3254 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3255 return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3256 }
Bogdan Marinescu 0:a792d4bf36c2 3257
Bogdan Marinescu 0:a792d4bf36c2 3258 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3259 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3260 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3261 }
Bogdan Marinescu 0:a792d4bf36c2 3262
Bogdan Marinescu 0:a792d4bf36c2 3263 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3264 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) const, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3265 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3266 }
Bogdan Marinescu 0:a792d4bf36c2 3267
Bogdan Marinescu 0:a792d4bf36c2 3268 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3269 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3270 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3271 }
Bogdan Marinescu 0:a792d4bf36c2 3272
Bogdan Marinescu 0:a792d4bf36c2 3273 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3274 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3275 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3276 }
Bogdan Marinescu 0:a792d4bf36c2 3277
Christopher Haster 14:65535458dd6f 3278 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 14:65535458dd6f 3279 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1, A2, A3)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
Christopher Haster 14:65535458dd6f 3280 return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2, c3);
Christopher Haster 14:65535458dd6f 3281 }
Christopher Haster 14:65535458dd6f 3282
Bogdan Marinescu 0:a792d4bf36c2 3283 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3284 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3285 return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3286 }
Bogdan Marinescu 0:a792d4bf36c2 3287
Bogdan Marinescu 0:a792d4bf36c2 3288 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3289 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3290 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3291 }
Bogdan Marinescu 0:a792d4bf36c2 3292
Bogdan Marinescu 0:a792d4bf36c2 3293 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3294 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3295 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3296 }
Bogdan Marinescu 0:a792d4bf36c2 3297
Bogdan Marinescu 0:a792d4bf36c2 3298 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3299 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3300 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3301 }
Bogdan Marinescu 0:a792d4bf36c2 3302
Bogdan Marinescu 0:a792d4bf36c2 3303 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
Bogdan Marinescu 0:a792d4bf36c2 3304 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3305 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3306 }
Bogdan Marinescu 0:a792d4bf36c2 3307
Christopher Haster 14:65535458dd6f 3308 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
Christopher Haster 14:65535458dd6f 3309 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0, A1, A2, A3)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Christopher Haster 14:65535458dd6f 3310 return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2, c3, c4);
Christopher Haster 14:65535458dd6f 3311 }
Christopher Haster 14:65535458dd6f 3312
Bogdan Marinescu 0:a792d4bf36c2 3313 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3314 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(A0, A1, A2, A3, A4)) {
Bogdan Marinescu 0:a792d4bf36c2 3315 return Event<void(A0, A1, A2, A3, A4)>(this, func);
Bogdan Marinescu 0:a792d4bf36c2 3316 }
Bogdan Marinescu 0:a792d4bf36c2 3317
Bogdan Marinescu 0:a792d4bf36c2 3318 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3319 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
Bogdan Marinescu 0:a792d4bf36c2 3320 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 3321 }
Bogdan Marinescu 0:a792d4bf36c2 3322
Bogdan Marinescu 0:a792d4bf36c2 3323 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3324 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
Bogdan Marinescu 0:a792d4bf36c2 3325 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 3326 }
Bogdan Marinescu 0:a792d4bf36c2 3327
Bogdan Marinescu 0:a792d4bf36c2 3328 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3329 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
Bogdan Marinescu 0:a792d4bf36c2 3330 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 3331 }
Bogdan Marinescu 0:a792d4bf36c2 3332
Bogdan Marinescu 0:a792d4bf36c2 3333 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3334 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
Bogdan Marinescu 0:a792d4bf36c2 3335 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
Bogdan Marinescu 0:a792d4bf36c2 3336 }
Bogdan Marinescu 0:a792d4bf36c2 3337
Christopher Haster 14:65535458dd6f 3338 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 14:65535458dd6f 3339 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(A0, A1, A2, A3, A4)> cb) {
Christopher Haster 14:65535458dd6f 3340 return Event<void(A0, A1, A2, A3, A4)>(this, cb);
Christopher Haster 14:65535458dd6f 3341 }
Christopher Haster 14:65535458dd6f 3342
Bogdan Marinescu 0:a792d4bf36c2 3343 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3344 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, A0, A1, A2, A3, A4), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3345 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0);
Bogdan Marinescu 0:a792d4bf36c2 3346 }
Bogdan Marinescu 0:a792d4bf36c2 3347
Bogdan Marinescu 0:a792d4bf36c2 3348 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3349 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4), C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3350 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3351 }
Bogdan Marinescu 0:a792d4bf36c2 3352
Bogdan Marinescu 0:a792d4bf36c2 3353 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3354 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3355 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3356 }
Bogdan Marinescu 0:a792d4bf36c2 3357
Bogdan Marinescu 0:a792d4bf36c2 3358 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3359 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3360 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3361 }
Bogdan Marinescu 0:a792d4bf36c2 3362
Bogdan Marinescu 0:a792d4bf36c2 3363 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3364 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const volatile, C0 c0) {
Bogdan Marinescu 0:a792d4bf36c2 3365 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
Bogdan Marinescu 0:a792d4bf36c2 3366 }
Bogdan Marinescu 0:a792d4bf36c2 3367
Christopher Haster 14:65535458dd6f 3368 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 14:65535458dd6f 3369 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2, A3, A4)> cb, C0 c0) {
Christopher Haster 14:65535458dd6f 3370 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0);
Christopher Haster 14:65535458dd6f 3371 }
Christopher Haster 14:65535458dd6f 3372
Bogdan Marinescu 0:a792d4bf36c2 3373 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3374 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2, A3, A4), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3375 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3376 }
Bogdan Marinescu 0:a792d4bf36c2 3377
Bogdan Marinescu 0:a792d4bf36c2 3378 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3379 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4), C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3380 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3381 }
Bogdan Marinescu 0:a792d4bf36c2 3382
Bogdan Marinescu 0:a792d4bf36c2 3383 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3384 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3385 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3386 }
Bogdan Marinescu 0:a792d4bf36c2 3387
Bogdan Marinescu 0:a792d4bf36c2 3388 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3389 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3390 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3391 }
Bogdan Marinescu 0:a792d4bf36c2 3392
Bogdan Marinescu 0:a792d4bf36c2 3393 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3394 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const volatile, C0 c0, C1 c1) {
Bogdan Marinescu 0:a792d4bf36c2 3395 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
Bogdan Marinescu 0:a792d4bf36c2 3396 }
Bogdan Marinescu 0:a792d4bf36c2 3397
Christopher Haster 14:65535458dd6f 3398 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 14:65535458dd6f 3399 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1) {
Christopher Haster 14:65535458dd6f 3400 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1);
Christopher Haster 14:65535458dd6f 3401 }
Christopher Haster 14:65535458dd6f 3402
Bogdan Marinescu 0:a792d4bf36c2 3403 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3404 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3405 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3406 }
Bogdan Marinescu 0:a792d4bf36c2 3407
Bogdan Marinescu 0:a792d4bf36c2 3408 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3409 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3410 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3411 }
Bogdan Marinescu 0:a792d4bf36c2 3412
Bogdan Marinescu 0:a792d4bf36c2 3413 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3414 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3415 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3416 }
Bogdan Marinescu 0:a792d4bf36c2 3417
Bogdan Marinescu 0:a792d4bf36c2 3418 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3419 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3420 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3421 }
Bogdan Marinescu 0:a792d4bf36c2 3422
Bogdan Marinescu 0:a792d4bf36c2 3423 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3424 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const volatile, C0 c0, C1 c1, C2 c2) {
Bogdan Marinescu 0:a792d4bf36c2 3425 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
Bogdan Marinescu 0:a792d4bf36c2 3426 }
Bogdan Marinescu 0:a792d4bf36c2 3427
Christopher Haster 14:65535458dd6f 3428 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 14:65535458dd6f 3429 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1, C2 c2) {
Christopher Haster 14:65535458dd6f 3430 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2);
Christopher Haster 14:65535458dd6f 3431 }
Christopher Haster 14:65535458dd6f 3432
Bogdan Marinescu 0:a792d4bf36c2 3433 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3434 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3435 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3436 }
Bogdan Marinescu 0:a792d4bf36c2 3437
Bogdan Marinescu 0:a792d4bf36c2 3438 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3439 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3440 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3441 }
Bogdan Marinescu 0:a792d4bf36c2 3442
Bogdan Marinescu 0:a792d4bf36c2 3443 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3444 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) const, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3445 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3446 }
Bogdan Marinescu 0:a792d4bf36c2 3447
Bogdan Marinescu 0:a792d4bf36c2 3448 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3449 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3450 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3451 }
Bogdan Marinescu 0:a792d4bf36c2 3452
Bogdan Marinescu 0:a792d4bf36c2 3453 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3454 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
Bogdan Marinescu 0:a792d4bf36c2 3455 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
Bogdan Marinescu 0:a792d4bf36c2 3456 }
Bogdan Marinescu 0:a792d4bf36c2 3457
Christopher Haster 14:65535458dd6f 3458 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 14:65535458dd6f 3459 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
Christopher Haster 14:65535458dd6f 3460 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2, c3);
Christopher Haster 14:65535458dd6f 3461 }
Christopher Haster 14:65535458dd6f 3462
Bogdan Marinescu 0:a792d4bf36c2 3463 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3464 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3465 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3466 }
Bogdan Marinescu 0:a792d4bf36c2 3467
Bogdan Marinescu 0:a792d4bf36c2 3468 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3469 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3470 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3471 }
Bogdan Marinescu 0:a792d4bf36c2 3472
Bogdan Marinescu 0:a792d4bf36c2 3473 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3474 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3475 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3476 }
Bogdan Marinescu 0:a792d4bf36c2 3477
Bogdan Marinescu 0:a792d4bf36c2 3478 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3479 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3480 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3481 }
Bogdan Marinescu 0:a792d4bf36c2 3482
Bogdan Marinescu 0:a792d4bf36c2 3483 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
Bogdan Marinescu 0:a792d4bf36c2 3484 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Bogdan Marinescu 0:a792d4bf36c2 3485 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
Bogdan Marinescu 0:a792d4bf36c2 3486 }
Bogdan Marinescu 0:a792d4bf36c2 3487
Christopher Haster 14:65535458dd6f 3488 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
Christopher Haster 14:65535458dd6f 3489 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
Christopher Haster 14:65535458dd6f 3490 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2, c3, c4);
Christopher Haster 14:65535458dd6f 3491 }
Christopher Haster 14:65535458dd6f 3492
Bogdan Marinescu 0:a792d4bf36c2 3493 }
Bogdan Marinescu 0:a792d4bf36c2 3494
Bogdan Marinescu 0:a792d4bf36c2 3495 #endif
Jimmy Brisson 5:705843a08e16 3496
Jimmy Brisson 5:705843a08e16 3497 /** @}*/