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:
Sam Grove
Date:
Thu Oct 06 15:57:08 2016 -0500
Revision:
6:29dc481c8037
Parent:
4:f157c7bf01cc
Parent:
5:705843a08e16
Child:
7:80510299c57c
Merge pull request #2911 from theotherjimmy/docs-generation

[Tools] Add documentation generation script

Who changed what in which revision?

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