Mbed OS Reference
Loading...
Searching...
No Matches
EventQueue Class Reference

EventQueue. More...

#include <EventQueue.h>

Inheritance diagram for EventQueue:
NonCopyable< EventQueue >

Public Member Functions

 EventQueue (unsigned size=(32 *(EQUEUE_EVENT_SIZE - 2 *sizeof(void *)+sizeof(mbed::Callback< void()>))), unsigned char *buffer=NULL)
 Create an EventQueue. More...
 
 ~EventQueue ()
 Destroy an EventQueue. More...
 
void dispatch_for (duration ms)
 Dispatch events. More...
 
void dispatch (int ms=-1)
 Dispatch events. More...
 
void dispatch_forever ()
 Dispatch events without a timeout. More...
 
void dispatch_once ()
 Dispatch currently queued events only and then terminate. More...
 
void break_dispatch ()
 Break out of a running event loop. More...
 
unsigned tick ()
 Millisecond counter. More...
 
bool cancel (int id)
 Cancel an in-flight event. More...
 
template<typename F , typename A >
bool cancel (UserAllocatedEvent< F, A > *event)
 Cancel an in-flight user allocated event. More...
 
int time_left (int id)
 Query how much time is left for delayed event. More...
 
template<typename F , typename A >
int time_left (UserAllocatedEvent< F, A > *event)
 Query how much time is left for delayed UserAllocatedEvent. More...
 
void background (mbed::Callback< void(int)> update)
 Background an event queue onto a single-shot timer-interrupt. More...
 
int chain (EventQueue *target)
 Chain an event queue onto another event queue. More...
 
template<typename F , typename ... Args>
int call (F f, Args ...args)
 Calls an event on the queue. More...
 
template<typename T , typename R , typename ... Args>
int call (T *obj, R(T::*method)(Args ...args), Args ...args)
 Calls an event on the queue. More...
 
template<typename F , typename ... ArgTs>
int call_in (duration ms, F f, ArgTs ...args)
 Calls an event on the queue after a specified delay. More...
 
template<typename T , typename R , typename ... ArgTs>
int call_in (duration ms, T *obj, R(T::*method)(ArgTs ...args), ArgTs ...args)
 Calls an event on the queue after a specified delay. More...
 
template<typename F , typename ... ArgTs>
int call_every (duration ms, F f, ArgTs ...args)
 Calls an event on the queue periodically. More...
 
template<typename T , typename R , typename ... ArgTs>
int call_every (duration ms, T *obj, R(T::*method)(ArgTs ...args), ArgTs ...args)
 Calls an event on the queue periodically. More...
 
template<typename R , typename ... BoundArgTs, typename ... ContextArgTs, typename ... ArgTs>
Event< void(ArgTs...)> event (R(*func)(BoundArgTs..., ArgTs...), ContextArgTs ...context_args)
 Creates an event bound to the event queue. More...
 
template<typename T , typename R , typename ... BoundArgTs, typename ... ContextArgTs, typename ... ArgTs>
Event< void(ArgTs...)> event (T *obj, R(T::*method)(BoundArgTs..., ArgTs...), ContextArgTs ...context_args)
 Creates an event bound to the event queue. More...
 
template<typename R , typename ... BoundArgTs, typename ... ContextArgTs, typename ... ArgTs>
Event< void(ArgTs...)> event (mbed::Callback< R(BoundArgTs..., ArgTs...)> cb, ContextArgTs ...context_args)
 Creates an event bound to the event queue. More...
 
template<typename F , typename... ArgTs>
UserAllocatedEvent< F, void(ArgTs...)> make_user_allocated_event (F f, ArgTs... args)
 Creates an user allocated event bound to the event queue. More...
 
template<typename T , typename R , typename... ArgTs>
UserAllocatedEvent< mbed::Callback< void(ArgTs...)>, void(ArgTs...)> make_user_allocated_event (T *obj, R(T::*method)(ArgTs... args), ArgTs... args)
 Creates an user allocated event bound to the event queue. More...
 

Detailed Description

EventQueue.

Flexible event queue for dispatching events

Definition at line 62 of file EventQueue.h.

Constructor & Destructor Documentation

◆ EventQueue()

EventQueue ( unsigned  size = (32 *(EQUEUE_EVENT_SIZE - 2 *sizeof(void *)+sizeof(mbed::Callback< void()>))),
unsigned char *  buffer = NULL 
)

Create an EventQueue.

Create an event queue. The event queue either allocates a buffer of the specified size with malloc or uses the user provided buffer or uses 1B dummy buffer if 0 size passed.

0 size queue is a special purpose queue to dispatch static events only (see UserAllocatedEvent). Such a queue gives the guarantee that no dynamic memory allocation will take place while queue creation and events posting & dispatching.

Parameters
sizeSize of buffer to use for events in bytes (default to EVENTS_QUEUE_SIZE) If 0 provided then 1B dummy buffer is used
bufferPointer to buffer to use for events (default to NULL)

◆ ~EventQueue()

~EventQueue ( )

Destroy an EventQueue.

Member Function Documentation

◆ dispatch_for()

void dispatch_for ( duration  ms)

Dispatch events.

Executes events for the specified number of milliseconds.

The dispatch_for() function is guaranteed to terminate after the elapsed wait.

Parameters
msTime to wait for events in milliseconds, expressed as a Chrono duration.

◆ dispatch()

void dispatch ( int  ms = -1)

Dispatch events.

Executes events until the specified milliseconds have passed. If ms is negative, the dispatch function will dispatch events indefinitely or until break_dispatch is called on this queue.

When called with a finite timeout, the dispatch function is guaranteed to terminate. When called with a timeout of 0, the dispatch function does not wait and is IRQ safe.

NOTE: Since the majority of the event library was updated to use Chrono types (as part of the Mbed 6 release), this function will not function as expected. Please update to use the new dispatch functions to ensure correct functionality.

Parameters
msTime to wait for events in milliseconds, a negative value will dispatch events indefinitely (default to -1)

◆ dispatch_forever()

void dispatch_forever ( )

Dispatch events without a timeout.

Executes events indefinitely unless the dispatch loop is forcibly broken.

See also
break_dispatch()

◆ dispatch_once()

void dispatch_once ( )

Dispatch currently queued events only and then terminate.

In this case the dispatch function does not wait.

◆ break_dispatch()

void break_dispatch ( )

Break out of a running event loop.

Forces the specified event queue's dispatch loop to terminate. Pending events may finish executing, but no new events will be executed.

◆ tick()

unsigned tick ( )

Millisecond counter.

Returns the underlying tick of the event queue represented as the number of milliseconds that have passed since an arbitrary point in time. Intentionally overflows to 0 after 2^32-1.

Returns
The underlying tick of the event queue in milliseconds

◆ cancel() [1/2]

bool cancel ( int  id)

Cancel an in-flight event.

Attempts to cancel an event referenced by the unique id returned from one of the call functions. It is not safe to call cancel after an event has already been dispatched.

id must be valid i.e. event must have not finished executing.

The cancel function is IRQ safe.

If called while the event queue's dispatch loop is active in another thread, the cancel function does not guarantee that the event will not execute after it returns, as the event may have already begun executing. A call made from the same thread as the dispatch loop will always succeed with a valid id.

Parameters
idUnique id of the event
Returns
true if event was successfully cancelled false if event was not cancelled (invalid id or executing already begun)

◆ cancel() [2/2]

bool cancel ( UserAllocatedEvent< F, A > *  event)

Cancel an in-flight user allocated event.

Attempts to cancel an UserAllocatedEvent referenced by its address It is not safe to call cancel after an event has already been dispatched.

Event must be valid i.e. event must have not finished executing and must have been bound to this queue.

The cancel function is IRQ safe.

If called while the event queue's dispatch loop is active in another thread, the cancel function does not guarantee that the event will not execute after it returns, as the event may have already begun executing. A call made from the same thread as the dispatch loop will always succeed with a valid id.

Parameters
eventAddress of the event
Returns
true if event was successfully cancelled false if event was not cancelled (invalid queue or executing already begun)

Definition at line 195 of file EventQueue.h.

◆ time_left() [1/2]

int time_left ( int  id)

Query how much time is left for delayed event.

If the event is delayed, this function can be used to query how much time is left until the event is due to be dispatched.

id must be valid i.e. event must have not finished executing.

This function is IRQ safe.

Parameters
idUnique id of the event
Returns
Remaining time in milliseconds or 0 if event is already due to be dispatched or is currently executing. Undefined if id is invalid.

◆ time_left() [2/2]

int time_left ( UserAllocatedEvent< F, A > *  event)

Query how much time is left for delayed UserAllocatedEvent.

If the event is delayed, this function can be used to query how much time is left until the event is due to be dispatched.

Event must be valid i.e. event must have not finished executing and must have been bound to this queue.

This function is IRQ safe.

Parameters
eventAddress of the event
Returns
Remaining time in milliseconds or 0 if event is already due to be dispatched or is currently executing. Undefined if id is invalid.

Definition at line 241 of file EventQueue.h.

◆ background()

void background ( mbed::Callback< void(int)>  update)

Background an event queue onto a single-shot timer-interrupt.

When updated, the event queue will call the provided update function with a timeout indicating when the queue should be dispatched. A negative timeout will be passed to the update function when the timer-interrupt is no longer needed.

Passing a null function disables the existing update function.

The background function allows an event queue to take advantage of hardware timers or other event loops, allowing an event queue to be ran in the background without consuming the foreground thread.

Parameters
updateFunction called to indicate when the queue should be dispatched

◆ chain()

int chain ( EventQueue target)

Chain an event queue onto another event queue.

After chaining a queue to a target, calling dispatch on the target queue will also dispatch events from this queue. The queues use their own buffers and events must be handled independently.

A null queue as the target will unchain the existing queue.

The chain function allows multiple event queues to be composed, sharing the context of a dispatch loop while still being managed independently

Parameters
targetQueue that will dispatch this queue's events as a part of its dispatch loop
Returns
Zero on success and negative error code value if chaining fails

◆ call() [1/2]

int call ( f,
Args ...  args 
)

Calls an event on the queue.

The specified callback will be executed in the context of the event queue's dispatch loop.

The call function is IRQ safe and can act as a mechanism for moving events out of IRQ contexts.

Parameters
fFunction to execute in the context of the dispatch loop
argsArguments to pass to the callback
Returns
A unique id that represents the posted event and can be passed to cancel, or an id of 0 if there is not enough memory to allocate the event. Returned id will remain valid until event has finished executing.
#include "mbed.h"
int main() {
// creates a queue with the default size
EventQueue queue;
// events are simple callbacks
queue.call(printf, "called immediately\n");
// the dispatch method executes events
queue.dispatch();
}
EventQueue.
Definition: EventQueue.h:62
void dispatch(int ms=-1)
Dispatch events.
int call(F f, Args ...args)
Calls an event on the queue.

◆ call() [2/2]

int call ( T *  obj,
R(T::*)(Args ...args)  method,
Args ...  args 
)

Calls an event on the queue.

The specified callback is executed in the context of the event queue's dispatch loop.

The call function is IRQ safe and can act as a mechanism for moving events out of IRQ contexts.

Parameters
objObject to call with the member function
methodMember function to execute in the context of the dispatch loop
argsArguments to pass to the callback
Returns
A unique ID that represents the posted event and can be passed to cancel, or an ID of 0 if there is not enough memory to allocate the event. Returned ID remains valid until event has finished executing.
#include "mbed.h"
class EventHandler {
int _id;
public:
EventHandler(int id) : _id(id) { }
void handler(int c) {
printf("ID: %d Param: %d\r\n", _id, c);
}
};
int main() {
// creates a queue with the default size
EventQueue queue;
// Create EventHandler object with state
EventHandler handler_cb(1);
// events are simple callbacks, call object method
// with provided parameter
queue.call(&handler_cb, &EventHandler::handler, 2);
// the dispath method executes events
queue.dispatch();
}
EventQueue(unsigned size=(32 *(EQUEUE_EVENT_SIZE - 2 *sizeof(void *)+sizeof(mbed::Callback< void()>))), unsigned char *buffer=NULL)
Create an EventQueue.

◆ call_in() [1/2]

int call_in ( duration  ms,
f,
ArgTs ...  args 
)

Calls an event on the queue after a specified delay.

The specified callback is executed in the context of the event queue's dispatch loop.

The call_in function is IRQ safe and can act as a mechanism for moving events out of IRQ contexts.

Parameters
msTime to delay in milliseconds
fFunction to execute in the context of the dispatch loop
argsArguments to pass to the callback
Returns
A unique ID that represents the posted event and can be passed to cancel, or an ID of 0 if there is not enough memory to allocate the event.
#include "mbed.h"
using namespace std::chrono_literals;
int main() {
// creates a queue with the default size
EventQueue queue;
// events are simple callbacks
queue.call_in(2s, printf, "called in 2 seconds\n");
// the dispatch methods executes events
queue.dispatch();
}
int call_in(duration ms, F f, ArgTs ...args)
Calls an event on the queue after a specified delay.

◆ call_in() [2/2]

int call_in ( duration  ms,
T *  obj,
R(T::*)(ArgTs ...args)  method,
ArgTs ...  args 
)

Calls an event on the queue after a specified delay.

The specified callback is executed in the context of the event queue's dispatch loop.

The call_in function is IRQ safe and can act as a mechanism for moving events out of IRQ contexts.

Parameters
msTime to delay in milliseconds
objObject to call with the member function
methodMember function to execute in the context of the dispatch loop
argsArguments to pass to the callback
Returns
A unique ID that represents the posted event and can be passed to cancel, or an ID of 0 if there is not enough memory to allocate the event.
#include "mbed.h"
using namespace std::chrono_literals;
class EventHandler {
int _id;
public:
EventHandler(int id) : _id(id) { }
void handler(int c) {
printf("ID: %d Param: %d\r\n", _id, c);
}
};
int main() {
// creates a queue with the default size
EventQueue queue;
// Create EventHandler object with state
EventHandler handler_cb(3);
// events are simple callbacks, call object method in 2 seconds
// with provided parameter
queue.call_in(2s, &handler_cb, &EventHandler::handler, 4);
// the dispatch method executes events
queue.dispatch();
}

◆ call_every() [1/2]

int call_every ( duration  ms,
f,
ArgTs ...  args 
)

Calls an event on the queue periodically.

Note
The first call_every event occurs after the specified delay. To create a periodic event that fires immediately,
See also
Event.

The specified callback is executed in the context of the event queue's dispatch loop.

The call_every function is IRQ safe and can act as a mechanism for moving events out of IRQ contexts.

Parameters
msPeriod of the event in milliseconds
fFunction to execute in the context of the dispatch loop
argsArguments to pass to the callback
Returns
A unique ID that represents the posted event and can be passed to cancel, or an ID of 0 if there is not enough memory to allocate the event.
#include "mbed.h"
using namespace std::chrono_literals;
class EventHandler {
int _id;
public:
EventHandler(int id) : _id(id) { }
void handler(int c) {
printf("ID: %d Param: %d\r\n", _id, c);
}
};
int main() {
// creates a queue with the default size
EventQueue queue;
// events are simple callbacks, call every 2 seconds
queue.call_every(2s, printf, "Calling every 2 seconds\n");
// the dispatch method executes events
queue.dispatch();
}

◆ call_every() [2/2]

int call_every ( duration  ms,
T *  obj,
R(T::*)(ArgTs ...args)  method,
ArgTs ...  args 
)

Calls an event on the queue periodically.

Note
The first call_every event occurs after the specified delay. To create a periodic event that fires immediately,
See also
Event.

The specified callback is executed in the context of the event queue's dispatch loop.

The call_every function is IRQ safe and can act as a mechanism for moving events out of IRQ contexts.

Parameters
msPeriod of the event in milliseconds
objObject to call with the member function
methodMember function to execute in the context of the dispatch loop
argsArguments to pass to the callback
#include "mbed.h"
using namespace std::chrono_literals;
class EventHandler {
int _id;
public:
EventHandler(int id) : _id(id) { }
void handler(int c) {
printf("ID: %d Param: %d\r\n", _id, c);
}
};
int main() {
// creates a queue with the default size
EventQueue queue;
// Create EventHandler object with state
EventHandler handler_cb(5);
// events are simple callbacks, call object method every 2 seconds
// with provided parameter
queue.call_every(2s, &handler_cb, &EventHandler::handler, 6);
// the dispatch method executes events
queue.dispatch();
}

◆ event() [1/3]

Event< void(ArgTs...)> event ( R(*)(BoundArgTs..., ArgTs...)  func,
ContextArgTs ...  context_args 
)

Creates an event bound to the event queue.

Constructs an event bound to the specified event queue. The specified callback acts as the target for the event and is executed in the context of the event queue's dispatch loop once posted.

Parameters
funcFunction to execute when the event is dispatched
context_argsArguments to pass to the callback
Returns
Event that dispatches on the specific queue
#include "mbed.h"
void handler(int c) {
printf("Param: %d\r\n", c);
}
int main()
{
EventQueue queue;
// Create event with parameter
Event<void()> e = queue.event(handler, 1);
e();
// Create event and post parameter later
Event<void(int)> e2 = queue.event(handler);
// Post the event with paramter 8
e.post(8);
// The dispatch method executes events
queue.dispatch();
e2.post(2);
queue.dispatch();
}
Event.
Definition: Event.h:38
Event< void(ArgTs...)> event(R(*func)(BoundArgTs..., ArgTs...), ContextArgTs ...context_args)
Creates an event bound to the event queue.

◆ event() [2/3]

Event< void(ArgTs...)> event ( T *  obj,
R(T::*)(BoundArgTs..., ArgTs...)  method,
ContextArgTs ...  context_args 
)

Creates an event bound to the event queue.

Constructs an event bound to the specified event queue. The specified callback acts as the target for the event and is executed in the context of the event queue's dispatch loop once posted.

Parameters
objObject to call with the member function
methodMember function to execute in the context of the dispatch loop
context_argsArguments to pass to the callback
Returns
Event that dispatches on the specific queue
#include "mbed.h"
class EventHandler {
int _id;
public:
EventHandler(int id) : _id(id) { }
void handler(int c) {
printf("ID: %d Param: %d\r\n", _id, c);
}
};
int main()
{
EventQueue queue;
EventHandler handler_cb(10);
// Create event on the eventqueue with a method callback
Event<void(int)> e = queue.event(&handler_cb, &EventHandler::handler);
// Post the event with paramter 8
e.post(11);
// The dispatch method executes events
queue.dispatch();
}

◆ event() [3/3]

Event< void(ArgTs...)> event ( mbed::Callback< R(BoundArgTs..., ArgTs...)>  cb,
ContextArgTs ...  context_args 
)

Creates an event bound to the event queue.

Constructs an event bound to the specified event queue. The specified callback acts as the target for the event and is executed in the context of the event queue's dispatch loop once posted.

Parameters
cbCallback object
context_argsArguments to pass to the callback
Returns
Event that dispatches on the specific queue
#include "mbed.h"
void handler(int c) {
printf("Param: %d\r\n", c);
}
int main()
{
EventQueue queue;
// Create callback object acting as a function
// pointer to handler
Callback<void(int)> cb(handler);
// Pass the callback object to the eventqueue
Event<void(int)> e = queue.event(cb);
// Post the event with parameter 8
e.post(9);
// The dispatch method executes events
q.dispatch();
}