Sensor3/lib/patrix/data.h

83 lines
1.4 KiB
C++

#ifndef SENSOR3_DATA_H
#define SENSOR3_DATA_H
#include "base.h"
#include <ArduinoJson.h>
#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<typename Data>
using ExtendsIData = std::enable_if_t<std::is_base_of_v<IData, Data>>;
template<typename T, int size>
class Cache {
private:
T buffer[size];
T *bufferRead = buffer;
T *bufferWrite = buffer;
T last{};
size_t usage = 0;
public:
template<typename U = T, typename = ExtendsIData<U>>
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<JsonObject>();
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