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:
Bogdan Marinescu
Date:
Thu Sep 29 12:38:02 2016 +0300
Revision:
0:a792d4bf36c2
Child:
2:a60d8117d0e0
Added mbed-events library

Added mbed-events from https://github.com/ARMMbed/mbed-events. Changes
from upstream:

- the whole code is licensed under the Apache license. Sources and
headers were updates with this information.
- removed the porting layers for Windows and FreeRTOS and the references
to these porting layers in equeue_platform.h.
- moved the TESTS directory in mbed-events to the TESTS directory of
mbed-os.

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