#pragma once #include #include namespace fgc { struct EnvSample { bool valid = false; float temp_c = 0.0f; float humidity_pct = 0.0f; long long timestamp_ms = 0; }; // Abstraction over an ambient temperature/humidity sensor. Implemented by // Sht41EnvSensor (SHT41 on the LattePanda's native I2C bus) and MockEnvSensor // (synthetic). The interface intentionally exposes nothing chip-specific, so // swapping the sensor (a different I2C part, or a serial one) means writing a // new backend, not touching Application/UiSnapshot/MQTT. class IEnvSensor { public: virtual ~IEnvSensor() = default; virtual void start() = 0; virtual void stop() = 0; // Whether a valid, recent reading is available. virtual bool connected() const = 0; // Latest reading, or nullopt if none/stale. virtual std::optional sample() = 0; // Identity string for logs/UI, e.g. "SHT41". virtual std::string name() const { return "env"; } }; } // namespace fgc