79 lines
1.4 KiB
C++
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
|