From 0d7c68645b2530b51e97bc571d51f2233b4c6a6a Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Tue, 14 Jul 2020 19:07:01 +0200 Subject: [PATCH] Added a few methods and improved some code, class not finished yet --- src/app/TaskSchedulerManager.cpp | 93 +++++++++++++++++++------------- src/app/TaskSchedulerManager.h | 13 +++-- 2 files changed, 64 insertions(+), 42 deletions(-) diff --git a/src/app/TaskSchedulerManager.cpp b/src/app/TaskSchedulerManager.cpp index cc08876..db2f29c 100644 --- a/src/app/TaskSchedulerManager.cpp +++ b/src/app/TaskSchedulerManager.cpp @@ -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 { } diff --git a/src/app/TaskSchedulerManager.h b/src/app/TaskSchedulerManager.h index 12d5385..2eb3b1e 100644 --- a/src/app/TaskSchedulerManager.h +++ b/src/app/TaskSchedulerManager.h @@ -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();