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