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

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

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

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

Committer:
Christopher Haster
Date:
Mon Oct 03 18:33:25 2016 -0500
Revision:
4:f157c7bf01cc
Parent:
2:a60d8117d0e0
Child:
6:29dc481c8037
callback - Added workaround for IAR issue with type information

In the IAR ide, implicitly generated structures based on function
templates end up with missing type information. This has no effect
on using the IAR compiler standalone, but when used through the ide
the missing type information causes the ide to error.

As a workaround, moved the function attributes generated for the
Callback and Event classes into the class scope. This avoids the
syntax that confuses IAR.

Who changed what in which revision?

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