boothifier/include/OnEveryN.h
2025-09-07 23:38:56 -07:00

60 lines
1.6 KiB
C++

#pragma once
#include <Arduino.h>
// Generic class to handle intervals
template <unsigned long interval>
class OnEveryN {
public:
OnEveryN() : lastTime(0) {}
// Check if the interval has elapsed
bool ready() {
unsigned long currentTime = millis();
if (currentTime - lastTime >= interval) {
lastTime = currentTime;
return true;
}
return false;
}
private:
unsigned long lastTime; // Stores the last execution time
};
// Helper macros to generate unique names
#define CONCATENATE_DETAIL(x, y) x##y
#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y)
#define UNIQUE_NAME(base) CONCATENATE(base, __LINE__)
// Macro for ON_EVERY_N_MILLISECONDS (constant N via template)
#define ON_EVERY_N_MILLISECONDS(N) \
static OnEveryN<N> UNIQUE_NAME(__on_everyN_); \
if (UNIQUE_NAME(__on_everyN_).ready())
// Runtime-configurable variant (interval can be a variable/expression)
class OnEveryMsVariable {
public:
OnEveryMsVariable() : lastTime(0) {}
bool ready(unsigned long interval) {
if (interval == 0) return false; // ignore 0 to avoid busy looping
unsigned long now = millis();
if (now - lastTime >= interval) {
lastTime = now;
return true;
}
return false;
}
private:
unsigned long lastTime;
};
// Macro for variable interval in milliseconds
#define ON_EVERY_MILLISECONDS(VAR_INTERVAL) \
static OnEveryVariable UNIQUE_NAME(__on_everyVar_); \
if (UNIQUE_NAME(__on_everyVar_).ready(VAR_INTERVAL))
// Macro for ON_EVERY_N_SECONDS
#define ON_EVERY_N_SECONDS(N) ON_EVERY_N_MILLISECONDS((N) * 1000)