diff --git a/smart_bridge/platformio.ini b/smart_bridge/platformio.ini index 793e273..6b6d241 100644 --- a/smart_bridge/platformio.ini +++ b/smart_bridge/platformio.ini @@ -1,18 +1,19 @@ -; PlatformIO Project Configuration File -; -; Build options: build flags, source filter -; Upload options: custom upload port, speed and extra flags -; Library options: dependencies, extra library storages -; Advanced options: extra scripting -; -; Please visit documentation for the other options and examples -; https://docs.platformio.org/page/projectconf.html - -[env:uno] -platform = atmelavr -board = uno -framework = arduino -lib_deps = - arduino-libraries/Servo@^1.2.1 - marcoschwartz/LiquidCrystal_I2C@^1.1.4 - Wire +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:uno] +platform = atmelavr +board = uno +framework = arduino +lib_deps = + arduino-libraries/Servo@^1.2.1 + marcoschwartz/LiquidCrystal_I2C@^1.1.4 + Wire + paulstoffregen/TimerOne@^1.1.1 diff --git a/smart_bridge/src/kernel/Scheduler.cpp b/smart_bridge/src/kernel/Scheduler.cpp new file mode 100644 index 0000000..bbbda57 --- /dev/null +++ b/smart_bridge/src/kernel/Scheduler.cpp @@ -0,0 +1,57 @@ +#include "Scheduler.h" +#include + +volatile bool timerFlag = false; + +void timeHandler(void) +{ + timerFlag = true; +} + +void Scheduler::init(int period) +{ + this->period = period; + timerFlag = false; + long u_period = 1000L * period; + Timer1.initialize(u_period); + Timer1.attachInterrupt(timeHandler); + this->numTasks = 0; +} + +bool Scheduler::addTask(Task *task) +{ + if (this->numTasks < MAX_TASKS - 1) + { + this->tasks[this->numTasks++] = task; + return true; + } + return false; +} + +void Scheduler::schedule() +{ + while (!timerFlag); + timerFlag = false; + + for (int i = 0; i < this->numTasks; i++) + { + if (this->tasks[i]->isActive()) + { + if (this->tasks[i]->isPeriodic()) + { + if (this->tasks[i]->updateAndCheckTime(this->period)) + { + this->tasks[i]->tick(); + } + } + else + { + this->tasks[i]->tick(); + } + if (this->tasks[i]->isCompleted()) + { + this->tasks[i]->setActive(false); + } + } + } +} diff --git a/smart_bridge/src/kernel/Scheduler.h b/smart_bridge/src/kernel/Scheduler.h new file mode 100644 index 0000000..03be893 --- /dev/null +++ b/smart_bridge/src/kernel/Scheduler.h @@ -0,0 +1,19 @@ +#ifndef __SCHEDULER__ +#define __SCHEDULER__ + +#include "Task.h" + +#define MAX_TASKS 30 +class Scheduler { + //A simple cooperative scheduler to execute tasks + Task *tasks[MAX_TASKS]; + int numTasks; + int period; + + public: + void init(int period); + virtual bool addTask(Task *task); + virtual void schedule(); +}; + +#endif \ No newline at end of file