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:
Wed Oct 12 17:48:54 2016 -0500
Revision:
7:80510299c57c
Parent:
6:29dc481c8037
Child:
8:773de146a61c
callback - Fixed missing workaround for IAR issue with type information

Related to commit abba0c2

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