From b93a6f64e80872adc52417622d8e07d06898961c Mon Sep 17 00:00:00 2001 From: anschrammh Date: Sun, 1 Sep 2019 21:33:24 +0200 Subject: [PATCH] Corrected a big and nasty memory leak, renamed two methods and added the 'trigger once and delete' functionality --- src/app/TaskSchedulerManager.cpp | 32 ++++++++++++++++++++++++++------ src/app/TaskSchedulerManager.h | 8 +++++--- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/app/TaskSchedulerManager.cpp b/src/app/TaskSchedulerManager.cpp index f48d567..4ee38a3 100644 --- a/src/app/TaskSchedulerManager.cpp +++ b/src/app/TaskSchedulerManager.cpp @@ -49,6 +49,11 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setM return this; } +TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setSeconds(uint32_t seconds) +{ + return TaskSchedulerManagerHelper::Schedule::setMillis(seconds*1000); +} + TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setDateTime(DateTime &dateTime) { _everyMillis = 0; @@ -69,13 +74,13 @@ TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setM return this; } -TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::triggerRightAway(boolean enabled) +TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setTriggerRightAway(boolean enabled) { _triggerRightAway = enabled; return this; } -TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::triggerType(TriggerType triggerType) +TaskSchedulerManagerHelper::Schedule *TaskSchedulerManagerHelper::Schedule::setTriggerType(TriggerType triggerType) { _triggerType = triggerType; 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) { - 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) { - 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) @@ -175,11 +184,13 @@ void TaskSchedulerManager::runTaskScheduler() { p->schedule._millis = millis(); p->schedule._hasBeenTriggeredRightAway = true; + p->schedule._triggered = true; (*(p->taskRoutine))(p->pData); } else if(millis() - p->schedule._millis >= p->schedule._everyMillis) //We execute the task { p->schedule._millis = millis(); + p->schedule._triggered = true; (*(p->taskRoutine))(p->pData); } } @@ -188,12 +199,21 @@ void TaskSchedulerManager::runTaskScheduler() 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(); +} diff --git a/src/app/TaskSchedulerManager.h b/src/app/TaskSchedulerManager.h index 0c3f97c..ad7bbb7 100644 --- a/src/app/TaskSchedulerManager.h +++ b/src/app/TaskSchedulerManager.h @@ -26,11 +26,12 @@ namespace TaskSchedulerManagerHelper static Schedule *scheduleBuilder(); Schedule *setMillis(uint64_t millis); + Schedule *setSeconds(uint32_t seconds); Schedule *setDateTime(DateTime &dateTime); Schedule *setDays(uint8_t days); Schedule *setMonths(uint16_t months); - Schedule *triggerRightAway(boolean enabled); - Schedule *triggerType(TriggerType triggerType); + Schedule *setTriggerRightAway(boolean enabled); + Schedule *setTriggerType(TriggerType triggerType); Schedule *setMode(Mode mode); Schedule *setEnabled(boolean enabled); protected: @@ -45,7 +46,7 @@ namespace TaskSchedulerManagerHelper TriggerType _triggerType; Mode _mode; 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 DateTime *_dateTime; }; @@ -69,6 +70,7 @@ class TaskSchedulerManager boolean disableTask(uint8_t id); boolean clearTask(); void runTaskScheduler(); + const unsigned int taskCount(); protected: TaskSchedulerManager(); TaskSchedulerManager(RtcManager &rtcManager);