#pragma once #include // MAX6675 fault sentinels // 0.0 °C → VCC or GND missing (no power) // 1023.75 °C → thermocouple open / disconnected static constexpr float TEMP_MIN_VALID = 0.5f; static constexpr float TEMP_MAX_VALID = 1000.0f; inline bool isValidTemp(float t) { return t >= TEMP_MIN_VALID && t <= TEMP_MAX_VALID; } // Fixed-capacity rolling average — no heap allocation template class RollingAverage { static_assert(N > 0, "RollingAverage size must be > 0"); public: void push(float v) { buf[idx] = v; idx = (idx + 1) % N; if (count < N) ++count; } float value() const { if (count == 0) return 0.0f; float sum = 0.0f; for (uint8_t i = 0; i < count; ++i) sum += buf[i]; return sum / count; } uint8_t size() const { return count; } bool empty() const { return count == 0; } void reset() { idx = 0; count = 0; for (uint8_t i = 0; i < N; ++i) buf[i] = 0.0f; } private: float buf[N] = {}; uint8_t idx = 0; uint8_t count = 0; };