Added a few methods and improved some code, class not finished yet
This commit is contained in:
parent
f76639745f
commit
0d7c68645b
@ -3,17 +3,17 @@
|
||||
//Schedule part
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule::Schedule() :
|
||||
_days(0xFE),
|
||||
_months(0xFFF0),
|
||||
_days(0x7F),
|
||||
_months(0xFFF),
|
||||
_triggered(false),
|
||||
_triggerRightAway(true),
|
||||
_hasBeenTriggeredRightAway(false),
|
||||
_triggerType(TRIGGER_REPEAT),
|
||||
_mode(EVERY),
|
||||
_enabled(true),
|
||||
_millis(millis()),
|
||||
_millis(0),
|
||||
_everyMillis(1000),
|
||||
_dateTime(NULL)
|
||||
_dateTime(2000,0,0,0,0,0)
|
||||
{
|
||||
|
||||
}
|
||||
@ -29,10 +29,8 @@ TaskSchedulerManagerHelper::Schedule::Schedule(const TaskSchedulerManagerHelper:
|
||||
_enabled(Object._enabled),
|
||||
_millis(Object._millis),
|
||||
_everyMillis(Object._everyMillis),
|
||||
_dateTime(NULL)
|
||||
_dateTime(Object._dateTime)
|
||||
{
|
||||
if(Object._dateTime != NULL)
|
||||
_dateTime = new DateTime(*(Object._dateTime));
|
||||
}
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::scheduleBuilder()
|
||||
@ -42,23 +40,37 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::sche
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setMillis(uint32_t millis)
|
||||
{
|
||||
if(millis == 0)return this;
|
||||
|
||||
_everyMillis = millis;
|
||||
delete _dateTime;_dateTime = NULL;
|
||||
return this;
|
||||
}
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setSeconds(uint32_t seconds)
|
||||
{
|
||||
if(seconds < 60)
|
||||
_dateTime = DateTime(_dateTime.year(), _dateTime.month(), _dateTime.day(), _dateTime.hour(), _dateTime.minute(), seconds);
|
||||
|
||||
return TaskSchedulerManagerHelper::Schedule::setMillis(seconds*1000);
|
||||
}
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setMinutes(uint32_t minutes)
|
||||
{
|
||||
if(minutes < 60)
|
||||
_dateTime = DateTime(_dateTime.year(), _dateTime.month(), _dateTime.day(), _dateTime.hour(), minutes, _dateTime.second());
|
||||
|
||||
return TaskSchedulerManagerHelper::Schedule::setSeconds(minutes*60);
|
||||
}
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setHours(uint16_t hours)
|
||||
{
|
||||
if(hours < 24)
|
||||
_dateTime = DateTime(_dateTime.year(), _dateTime.month(), _dateTime.day(), hours, _dateTime.minute(), _dateTime.second());
|
||||
|
||||
return TaskSchedulerManagerHelper::Schedule::setMinutes(hours*60);
|
||||
}
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setDateTime(DateTime &dateTime)
|
||||
{
|
||||
_everyMillis = 0;
|
||||
delete _dateTime;_dateTime = NULL;
|
||||
_dateTime = new DateTime(dateTime);
|
||||
_dateTime = dateTime;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -77,6 +89,7 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setM
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setTriggerRightAway(boolean enabled)
|
||||
{
|
||||
_triggerRightAway = enabled;
|
||||
_hasBeenTriggeredRightAway = false;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -98,6 +111,11 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setE
|
||||
return this;
|
||||
}
|
||||
|
||||
void TaskSchedulerManagerHelper::Schedule::printDebug()
|
||||
{
|
||||
Serial.printf("###Schedule DEBUG###\nMillis -> %u\nTrigger right away -> %u\nTrigger type -> %u\nMode -> %u\nEnabled -> %u\nDays -> %u\nMonth -> >%u\n h : %u, m : %u, s : %u\n######\n",_everyMillis, _triggerRightAway, _triggerType, _mode, _enabled, _days, _months, _dateTime.hour(), _dateTime.minute(), _dateTime.second());
|
||||
}
|
||||
|
||||
// TaskScheduleManager part
|
||||
TaskSchedulerManager::TaskSchedulerManager() : _nextTaskIndexToBeRun(0), _rtcManager(NULL)
|
||||
{
|
||||
@ -111,6 +129,9 @@ TaskSchedulerManager::TaskSchedulerManager(RtcManager &rtcManager) : _nextTaskIn
|
||||
|
||||
boolean TaskSchedulerManager::addTask(const char *name, TaskSchedulerManagerHelper::Schedule *schedule, boolean (*taskRoutine)(void*), void *pData)
|
||||
{
|
||||
if(schedule == NULL)return false;
|
||||
|
||||
schedule->_millis = millis();
|
||||
boolean result = _taskDataDictio.add(name, new TaskData({*schedule, taskRoutine, pData}));
|
||||
delete schedule;schedule = NULL;
|
||||
|
||||
@ -119,6 +140,9 @@ boolean TaskSchedulerManager::addTask(const char *name, TaskSchedulerManagerHelp
|
||||
|
||||
boolean TaskSchedulerManager::addTask(uint16_t id, TaskSchedulerManagerHelper::Schedule *schedule, boolean (*taskRoutine)(void*), void *pData)
|
||||
{
|
||||
if(schedule == NULL)return false;
|
||||
|
||||
schedule->_millis = millis();
|
||||
boolean result = _taskDataDictio.add(id, new TaskData({*schedule, taskRoutine, pData}));
|
||||
delete schedule;schedule = NULL;
|
||||
|
||||
@ -137,26 +161,34 @@ boolean TaskSchedulerManager::removeTask(uint16_t id)
|
||||
|
||||
boolean TaskSchedulerManager::enableTask(const char *name)
|
||||
{
|
||||
_taskDataDictio(name)->schedule.setEnabled(true);
|
||||
getTask(name)->setEnabled(true);
|
||||
}
|
||||
|
||||
boolean TaskSchedulerManager::enableTask(uint16_t id)
|
||||
{
|
||||
char indiceToStr[10];
|
||||
sprintf(indiceToStr,"%d", id);
|
||||
_taskDataDictio(indiceToStr)->schedule.setEnabled(true);
|
||||
getTask(id)->setEnabled(true);
|
||||
}
|
||||
|
||||
boolean TaskSchedulerManager::disableTask(const char *name)
|
||||
{
|
||||
_taskDataDictio(name)->schedule.setEnabled(false);
|
||||
getTask(name)->setEnabled(false);
|
||||
}
|
||||
|
||||
boolean TaskSchedulerManager::disableTask(uint16_t id)
|
||||
{
|
||||
getTask(id)->setEnabled(false);
|
||||
}
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManager::getTask(const char *name)
|
||||
{
|
||||
return &(_taskDataDictio(name)->schedule);
|
||||
}
|
||||
|
||||
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManager::getTask(uint16_t id)
|
||||
{
|
||||
char indiceToStr[10];
|
||||
sprintf(indiceToStr,"%d", id);
|
||||
_taskDataDictio(indiceToStr)->schedule.setEnabled(false);
|
||||
return &(_taskDataDictio(indiceToStr)->schedule);
|
||||
}
|
||||
|
||||
boolean TaskSchedulerManager::clearTask()
|
||||
@ -177,38 +209,23 @@ void TaskSchedulerManager::run()
|
||||
|
||||
if(p->schedule._enabled)
|
||||
{
|
||||
if(p->schedule._everyMillis != 0)
|
||||
if(p->schedule._mode == TaskSchedulerManagerHelper::Schedule::Mode::EVERY)
|
||||
{
|
||||
if(p->schedule._triggerRightAway && !p->schedule._hasBeenTriggeredRightAway)//No rollover possible
|
||||
if(p->schedule._triggerRightAway && !p->schedule._hasBeenTriggeredRightAway)//Should it be executed right away ?
|
||||
{
|
||||
p->schedule._millis = millis();
|
||||
p->schedule._hasBeenTriggeredRightAway = true;
|
||||
p->schedule._triggered = true;
|
||||
(*(p->taskRoutine))(p->pData);
|
||||
}
|
||||
else if(millis() >= p->schedule._millis) //Millis rollover ?
|
||||
else if(millis() - p->schedule._millis >= p->schedule._everyMillis) //Or should it be executed
|
||||
{
|
||||
if(millis() - p->schedule._millis >= p->schedule._everyMillis) //No, we execute the task
|
||||
{
|
||||
p->schedule._millis = millis();
|
||||
p->schedule._triggered = true;
|
||||
(*(p->taskRoutine))(p->pData);
|
||||
}
|
||||
}
|
||||
else //Millis rollover
|
||||
{
|
||||
//We compute the time elapsed during the rollover:
|
||||
unsigned long max_ul(~0), from_last_millis_to_max(max_ul - p->schedule._millis), total_elapsed_millis(from_last_millis_to_max + millis());
|
||||
|
||||
if(total_elapsed_millis >= p->schedule._everyMillis)
|
||||
{
|
||||
p->schedule._millis = millis();
|
||||
p->schedule._triggered = true;
|
||||
(*(p->taskRoutine))(p->pData);
|
||||
}
|
||||
}
|
||||
}
|
||||
else //Probably AT mode task
|
||||
else //AT mode task
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -21,12 +21,13 @@ namespace TaskSchedulerManagerHelper
|
||||
|
||||
~Schedule()
|
||||
{
|
||||
delete _dateTime;
|
||||
}
|
||||
|
||||
static Schedule *scheduleBuilder();
|
||||
Schedule *setMillis(uint32_t millis);
|
||||
Schedule *setSeconds(uint32_t seconds);
|
||||
Schedule *setMinutes(uint32_t minutes);
|
||||
Schedule *setHours(uint16_t hours);
|
||||
Schedule *setDateTime(DateTime &dateTime);
|
||||
Schedule *setDays(uint8_t days);
|
||||
Schedule *setMonths(uint16_t months);
|
||||
@ -34,9 +35,11 @@ namespace TaskSchedulerManagerHelper
|
||||
Schedule *setTriggerType(TriggerType triggerType);
|
||||
Schedule *setMode(Mode mode);
|
||||
Schedule *setEnabled(boolean enabled);
|
||||
|
||||
void printDebug();
|
||||
protected:
|
||||
Schedule();//By default, the schedule is the following : every second, every day, every month, trigger is repeated...
|
||||
Schedule(const Schedule &Object);
|
||||
Schedule();//By default, the schedule is the following : every second, every minute, every hour, every day, every month, trigger is repeated...
|
||||
Schedule(const Schedule &Object);//Copy constructor
|
||||
private:
|
||||
uint8_t _days;
|
||||
uint16_t _months;
|
||||
@ -48,7 +51,7 @@ namespace TaskSchedulerManagerHelper
|
||||
boolean _enabled;
|
||||
uint32_t _millis; //Used to internally keep track of the time elapsed for this task
|
||||
uint32_t _everyMillis; //We can use millis or DateTime, but not both e.g every 00h 10m 00s 000ms
|
||||
DateTime *_dateTime;
|
||||
DateTime _dateTime;
|
||||
};
|
||||
}
|
||||
|
||||
@ -69,6 +72,8 @@ class TaskSchedulerManager
|
||||
boolean disableTask(const char *name);
|
||||
boolean disableTask(uint16_t id);
|
||||
boolean clearTask();
|
||||
TaskSchedulerManagerHelper::Schedule *getTask(const char *name);
|
||||
TaskSchedulerManagerHelper::Schedule *getTask(uint16_t id);
|
||||
void run();
|
||||
const unsigned int taskCount();
|
||||
uint16_t findFreeTaskId();
|
||||
|
Loading…
Reference in New Issue
Block a user