#ifndef SENSOR3_DATA_H #define SENSOR3_DATA_H #include "base.h" #include #include "wifi.h" #include "mqtt.h" struct IData { time_t time; explicit IData(time_t time) : time(time) { // - } virtual void toJson(JsonObject &json) const = 0; }; template using ExtendsIData = std::enable_if_t>; template class Cache { private: T buffer[size]; T *bufferRead = buffer; T *bufferWrite = buffer; T last{}; size_t usage = 0; public: template> explicit Cache() { // - } bool add(T data) { if (usage < size && data.needsPublish(last)) { last = data; *bufferWrite = data; bufferWrite = (bufferWrite - buffer + 1) % size + buffer; usage++; return true; } return false; } void loop() { if (usage == 0 || !isTimeSet()) { return; } JsonDocument doc; JsonObject json = doc.to(); correctTime(bufferRead->time); json["timestamp"] = bufferRead->time; bufferRead->toJson(json); if (mqttPublishData(json)) { bufferRead = (bufferRead - buffer + 1) % size + buffer; usage--; } } [[nodiscard]] size_t getUsage() const { return usage; } [[nodiscard]] size_t getSize() const { return size; } }; #endif