struct Timeout {
unsigned long timeout;
unsigned long time;
bool set = false;
};
template <size_t n>
class Delay {
Timeout timeouts_[n];
public:
bool run(size_t const, unsigned long const);
};
template <size_t n>
bool Delay<n>::run(size_t const id, unsigned long const timeout) {
if (not timeouts_[id].set) {
timeouts_[id].timeout = timeout;
timeouts_[id].time = millis();
timeouts_[id].set = true;
return false;
}
if (millis() - timeouts_[id].time < timeouts_[id].timeout) {
return false;
}
timeouts_[id].set = false;
return true;
}
Delay<2> delayer;
void setup() {
Serial.begin(9600);
}
void loop() {
if (delayer.run(0, 1000)) {
Serial.println("Every second.");
}
if (delayer.run(1, 2000)) {
Serial.println("Every two seconds.");
}
}