Skip to content

Commit

Permalink
equeue: added config option which tells equeue_mbed.cpp if it shall u…
Browse files Browse the repository at this point in the history
…se LowPowerTimer, LowPowerTimeout and LowPowerTicker instead of Timer/Timeout/Ticker.

This way, on SiLabs boards the low power sleep states will be used when using event queue.
  • Loading branch information
MikeDK authored and geky committed Aug 4, 2019
1 parent d2820cf commit ee3a50c
Showing 1 changed file with 19 additions and 10 deletions.
29 changes: 19 additions & 10 deletions equeue_mbed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,36 @@
#include <stdbool.h>
#include "mbed.h"

#if MBED_CONF_EVENTS_USE_LOWPOWER_TIMER_TICKER
#define AliasTimer LowPowerTimer
#define AliasTicker LowPowerTicker
#define AliasTimeout LowPowerTimeout
#else
#define AliasTimer Timer
#define AliasTicker Ticker
#define AliasTimeout Timeout
#endif

// Ticker operations
static bool equeue_tick_inited = false;
static volatile unsigned equeue_minutes = 0;
static unsigned equeue_timer[
(sizeof(Timer)+sizeof(unsigned)-1)/sizeof(unsigned)];
(sizeof(AliasTimer)+sizeof(unsigned)-1)/sizeof(unsigned)];
static unsigned equeue_ticker[
(sizeof(Ticker)+sizeof(unsigned)-1)/sizeof(unsigned)];
(sizeof(AliasTicker)+sizeof(unsigned)-1)/sizeof(unsigned)];

static void equeue_tick_update() {
equeue_minutes += reinterpret_cast<Timer*>(equeue_timer)->read_ms();
reinterpret_cast<Timer*>(equeue_timer)->reset();
equeue_minutes += reinterpret_cast<AliasTimer*>(equeue_timer)->read_ms();
reinterpret_cast<AliasTimer*>(equeue_timer)->reset();
}

static void equeue_tick_init() {
MBED_STATIC_ASSERT(sizeof(equeue_timer) >= sizeof(Timer),
MBED_STATIC_ASSERT(sizeof(equeue_timer) >= sizeof(AliasTimer),
"The equeue_timer buffer must fit the class Timer");
MBED_STATIC_ASSERT(sizeof(equeue_ticker) >= sizeof(Ticker),
MBED_STATIC_ASSERT(sizeof(equeue_ticker) >= sizeof(AliasTicker),
"The equeue_ticker buffer must fit the class Ticker");
Timer *timer = new (equeue_timer) Timer;
Ticker *ticker = new (equeue_ticker) Ticker;
AliasTimer *timer = new (equeue_timer) AliasTimer;
AliasTicker *ticker = new (equeue_ticker) AliasTicker;

equeue_minutes = 0;
timer->start();
Expand All @@ -51,7 +60,7 @@ unsigned equeue_tick() {

do {
minutes = equeue_minutes;
ms = reinterpret_cast<Timer*>(equeue_timer)->read_ms();
ms = reinterpret_cast<AliasTimer*>(equeue_timer)->read_ms();
} while (minutes != equeue_minutes);

return minutes + ms;
Expand Down Expand Up @@ -121,7 +130,7 @@ static void equeue_sema_timeout(equeue_sema_t *s) {

bool equeue_sema_wait(equeue_sema_t *s, int ms) {
int signal = 0;
Timeout timeout;
AliasTimeout timeout;
if (ms == 0) {
return false;
} else if (ms > 0) {
Expand Down

0 comments on commit ee3a50c

Please sign in to comment.