Sensor3/lib/patrix/data.h

79 lines
1.4 KiB
C++

#ifndef SENSOR3_DATA_H
#define SENSOR3_DATA_H
#include "base.h"
#include <ArduinoJson.h>
struct IData {
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:
struct Entry {
time_t timestamp = 0;
T data;
};
const char *name;
Entry buffer[size];
Entry *bufferRead = buffer;
Entry *bufferWrite = buffer;
size_t usage = 0;
public:
template<typename U = T, typename = ExtendsIData<U>>
explicit Cache(const char *name) : name(name) {
// -
}
bool add(const time_t timestamp, const T &data) {
if (usage >= size) {
return false;
}
bufferWrite->timestamp = timestamp;
bufferWrite->data = data;
bufferWrite = (bufferWrite - buffer + 1) % size + buffer;
usage++;
return true;
}
void loop() {
if (usage == 0 || !isTimeSet()) {
return;
}
JsonDocument json;
json["timestamp"] = correctTime(bufferRead->timestamp);
JsonObject data = json["data"].to<JsonObject>();
bufferRead->data.toJson(data);
if (mqttPublishData(name, json)) {
bufferRead = (bufferRead - buffer + 1) % size + buffer;
usage--;
}
}
size_t getUsage() const {
return usage;
}
size_t getSize() const {
return size;
}
};
#endif