2021-12-22 23:33:47 +01:00
|
|
|
#include "TickerScheduler.h"
|
|
|
|
|
|
|
|
|
|
TickerScheduler::TickerScheduler(uint8_t size)
|
|
|
|
|
{
|
|
|
|
|
this->items = new TickerSchedulerItem[size];
|
|
|
|
|
this->size = size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TickerScheduler::~TickerScheduler()
|
|
|
|
|
{
|
|
|
|
|
for (uint8_t i = 0; i < this->size; i++)
|
|
|
|
|
{
|
|
|
|
|
this->remove(i);
|
|
|
|
|
yield();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete[] this->items;
|
|
|
|
|
this->items = NULL;
|
|
|
|
|
this->size = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TickerScheduler::handleTickerFlag(bool * flag)
|
|
|
|
|
{
|
|
|
|
|
if (!*flag)
|
|
|
|
|
*flag = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TickerScheduler::handleTicker(tscallback_t f, void * arg, bool * flag)
|
|
|
|
|
{
|
|
|
|
|
if (*flag)
|
|
|
|
|
{
|
|
|
|
|
yield();
|
|
|
|
|
*flag = false;
|
|
|
|
|
yield();
|
|
|
|
|
f(arg);
|
|
|
|
|
yield();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TickerScheduler::add(uint8_t i, uint32_t period, tscallback_t f, void* arg, boolean shouldFireNow)
|
|
|
|
|
{
|
|
|
|
|
if (i >= this->size || this->items[i].is_used)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
this->items[i].cb = f;
|
|
|
|
|
this->items[i].cb_arg = arg;
|
|
|
|
|
this->items[i].flag = shouldFireNow;
|
|
|
|
|
this->items[i].period = period;
|
|
|
|
|
this->items[i].is_used = true;
|
|
|
|
|
|
|
|
|
|
enable(i);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TickerScheduler::remove(uint8_t i)
|
|
|
|
|
{
|
|
|
|
|
if (i >= this->size || !this->items[i].is_used)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
this->items[i].is_used = false;
|
|
|
|
|
this->items[i].t.detach();
|
|
|
|
|
this->items[i].flag = false;
|
|
|
|
|
this->items[i].cb = NULL;
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TickerScheduler::disable(uint8_t i)
|
|
|
|
|
{
|
|
|
|
|
if (i >= this->size || !this->items[i].is_used)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
this->items[i].t.detach();
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TickerScheduler::enable(uint8_t i)
|
|
|
|
|
{
|
|
|
|
|
if (i >= this->size || !this->items[i].is_used)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
bool * flag = &this->items[i].flag;
|
|
|
|
|
this->items[i].t.attach_ms(this->items[i].period, TickerScheduler::handleTickerFlag, flag);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TickerScheduler::disableAll()
|
|
|
|
|
{
|
|
|
|
|
for (uint8_t i = 0; i < this->size; i++)
|
|
|
|
|
disable(i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TickerScheduler::enableAll()
|
|
|
|
|
{
|
|
|
|
|
for (uint8_t i = 0; i < this->size; i++)
|
|
|
|
|
enable(i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TickerScheduler::update()
|
|
|
|
|
{
|
|
|
|
|
for (uint8_t i = 0; i < this->size; i++)
|
|
|
|
|
{
|
|
|
|
|
if (this->items[i].is_used)
|
|
|
|
|
{
|
2024-09-20 12:45:17 +03:00
|
|
|
//#ifdef ARDUINO_ARCH_AVR
|
2021-12-22 23:33:47 +01:00
|
|
|
this->items[i].t.Tick();
|
2024-09-20 12:45:17 +03:00
|
|
|
//#endif
|
2021-12-22 23:33:47 +01:00
|
|
|
|
|
|
|
|
handleTicker(this->items[i].cb, this->items[i].cb_arg, &this->items[i].flag);
|
|
|
|
|
}
|
|
|
|
|
yield();
|
|
|
|
|
}
|
|
|
|
|
}
|