游戏王对战板,目前code还是空的

Committer:
WFKnight
Date:
Thu Jun 21 13:51:43 2018 +0000
Revision:
0:9b3d4731edbb
UART, RTOS, LED

Who changed what in which revision?

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