Corrected a big and nasty memory leak, renamed two methods and added the 'trigger once and delete' functionality

This commit is contained in:
anschrammh 2019-09-01 21:33:24 +02:00
parent 3642367826
commit b93a6f64e8
2 changed files with 31 additions and 9 deletions

View File

@ -49,6 +49,11 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setM
return this; return this;
} }
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setSeconds(uint32_t seconds)
{
return TaskSchedulerManagerHelper::Schedule::setMillis(seconds*1000);
}
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setDateTime(DateTime &dateTime) TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setDateTime(DateTime &dateTime)
{ {
_everyMillis = 0; _everyMillis = 0;
@ -69,13 +74,13 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setM
return this; return this;
} }
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::triggerRightAway(boolean enabled) TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setTriggerRightAway(boolean enabled)
{ {
_triggerRightAway = enabled; _triggerRightAway = enabled;
return this; return this;
} }
TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::triggerType(TriggerType triggerType) TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setTriggerType(TriggerType triggerType)
{ {
_triggerType = triggerType; _triggerType = triggerType;
return this; return this;
@ -106,12 +111,16 @@ TaskSchedulerManager::TaskSchedulerManager(RtcManager &rtcManager) : _nextTaskIn
boolean TaskSchedulerManager::addTask(const char *name, TaskSchedulerManagerHelper::Schedule *schedule, boolean (*taskRoutine)(void*), void *pData) boolean TaskSchedulerManager::addTask(const char *name, TaskSchedulerManagerHelper::Schedule *schedule, boolean (*taskRoutine)(void*), void *pData)
{ {
return _taskDataDictio.add(name, new TaskData({*schedule, taskRoutine, pData})); boolean result = _taskDataDictio.add(name, new TaskData({*schedule, taskRoutine, pData}));
delete schedule;
return result;
} }
boolean TaskSchedulerManager::addTask(uint8_t id, TaskSchedulerManagerHelper::Schedule *schedule, boolean (*taskRoutine)(void*), void *pData) boolean TaskSchedulerManager::addTask(uint8_t id, TaskSchedulerManagerHelper::Schedule *schedule, boolean (*taskRoutine)(void*), void *pData)
{ {
return _taskDataDictio.add(id, new TaskData({*schedule, taskRoutine, pData})); boolean result = _taskDataDictio.add(id, new TaskData({*schedule, taskRoutine, pData}));
delete schedule;
return result;
} }
boolean TaskSchedulerManager::removeTask(const char *name) boolean TaskSchedulerManager::removeTask(const char *name)
@ -175,11 +184,13 @@ void TaskSchedulerManager::runTaskScheduler()
{ {
p->schedule._millis = millis(); p->schedule._millis = millis();
p->schedule._hasBeenTriggeredRightAway = true; p->schedule._hasBeenTriggeredRightAway = true;
p->schedule._triggered = true;
(*(p->taskRoutine))(p->pData); (*(p->taskRoutine))(p->pData);
} }
else if(millis() - p->schedule._millis >= p->schedule._everyMillis) //We execute the task else if(millis() - p->schedule._millis >= p->schedule._everyMillis) //We execute the task
{ {
p->schedule._millis = millis(); p->schedule._millis = millis();
p->schedule._triggered = true;
(*(p->taskRoutine))(p->pData); (*(p->taskRoutine))(p->pData);
} }
} }
@ -188,12 +199,21 @@ void TaskSchedulerManager::runTaskScheduler()
p->schedule._millis = millis(); p->schedule._millis = millis();
} }
} }
else else //Probably AT mode task
{ {
} }
} }
if(p->schedule._mode != TaskSchedulerManagerHelper::Schedule::TRIGGER_ONCE_AND_DELETE)_nextTaskIndexToBeRun++; if(p->schedule._triggerType != TaskSchedulerManagerHelper::Schedule::TRIGGER_ONCE_AND_DELETE)_nextTaskIndexToBeRun++;
else if(p->schedule._triggerType == TaskSchedulerManagerHelper::Schedule::TRIGGER_ONCE_AND_DELETE && p->schedule._triggered) //If the task has to be deleted after executing and if it has been executed, we delete it
{
_taskDataDictio.removeAt(_nextTaskIndexToBeRun);
}
} }
const unsigned int TaskSchedulerManager::taskCount()
{
return _taskDataDictio.count();
}

View File

@ -26,11 +26,12 @@ namespace TaskSchedulerManagerHelper
static Schedule *scheduleBuilder(); static Schedule *scheduleBuilder();
Schedule *setMillis(uint64_t millis); Schedule *setMillis(uint64_t millis);
Schedule *setSeconds(uint32_t seconds);
Schedule *setDateTime(DateTime &dateTime); Schedule *setDateTime(DateTime &dateTime);
Schedule *setDays(uint8_t days); Schedule *setDays(uint8_t days);
Schedule *setMonths(uint16_t months); Schedule *setMonths(uint16_t months);
Schedule *triggerRightAway(boolean enabled); Schedule *setTriggerRightAway(boolean enabled);
Schedule *triggerType(TriggerType triggerType); Schedule *setTriggerType(TriggerType triggerType);
Schedule *setMode(Mode mode); Schedule *setMode(Mode mode);
Schedule *setEnabled(boolean enabled); Schedule *setEnabled(boolean enabled);
protected: protected:
@ -45,7 +46,7 @@ namespace TaskSchedulerManagerHelper
TriggerType _triggerType; TriggerType _triggerType;
Mode _mode; Mode _mode;
boolean _enabled; boolean _enabled;
uint64_t _millis; uint64_t _millis; //Used to internally keep track of the time elapsed for this task
uint64_t _everyMillis; //We can use millis or DateTime, but not both e.g every 00h 10m 00s 000ms uint64_t _everyMillis; //We can use millis or DateTime, but not both e.g every 00h 10m 00s 000ms
DateTime *_dateTime; DateTime *_dateTime;
}; };
@ -69,6 +70,7 @@ class TaskSchedulerManager
boolean disableTask(uint8_t id); boolean disableTask(uint8_t id);
boolean clearTask(); boolean clearTask();
void runTaskScheduler(); void runTaskScheduler();
const unsigned int taskCount();
protected: protected:
TaskSchedulerManager(); TaskSchedulerManager();
TaskSchedulerManager(RtcManager &rtcManager); TaskSchedulerManager(RtcManager &rtcManager);