/*
Solution For:
Topics: How to store a callback inside a class?
Category: Programming Questions
Link: https://forum.arduino.cc/t/how-to-store-a-callback-inside-a-class/1097453
Sketch: AuCP_ RandomPipes.ino
Created: 02-Mar-2023
MicroBeaut (μB)
*/
class Task {
private:
typedef void(*callBackFunction)(uint16_t);
callBackFunction internalCallback = nullptr;
int duration;
unsigned long startTime = millis();
public:
Task() {};
void addTask(unsigned long msDuration, callBackFunction function) {
internalCallback = function;
duration = msDuration;
startTime = millis();
}
void working(unsigned long index) {
if (millis() - startTime >= duration) {
startTime = millis();
if (internalCallback) {
internalCallback(index);
}
}
}
};
typedef void(*callBackFunction)(uint16_t);
const uint8_t numberOfTask = 3;
const uint8_t ledPins[] = {4, 5, 6};
void Task1(uint16_t index);
void Task2(uint16_t index);
void Task3(uint16_t index);
unsigned long time[] = {2000UL, 3000UL, 4000UL};
callBackFunction function[] = {Task1, Task2, Task3};
Task task[numberOfTask];
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
for (uint8_t index = 0; index < numberOfTask ; index++) {
pinMode(ledPins[index], OUTPUT);
task[index].addTask(time[index], function[index]);
}
}
void loop() {
// put your main code here, to run repeatedly:
for (uint8_t index = 0; index < numberOfTask ; index++) {
task[index].working(index);
}
}
void Task1(uint16_t index) {
static bool value = 0;
value = !value;
digitalWrite(ledPins[index], value);
}
void Task2(uint16_t index) {
static bool value = 0;
value = !value;
digitalWrite(ledPins[index], value);
}
void Task3(uint16_t index) {
static bool value = 0;
value = !value;
digitalWrite(ledPins[index], value);
}