generic Cache
This commit is contained in:
parent
9933a70ae3
commit
3ca74503d9
@ -3,8 +3,6 @@
|
|||||||
#include <wifi.h>
|
#include <wifi.h>
|
||||||
#include <console.h>
|
#include <console.h>
|
||||||
#include "mqtt.h"
|
#include "mqtt.h"
|
||||||
#include "log.h"
|
|
||||||
#include "data.h"
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
@ -20,6 +18,5 @@ void loop() {
|
|||||||
configLoop();
|
configLoop();
|
||||||
wifiLoop();
|
wifiLoop();
|
||||||
mqttLoop();
|
mqttLoop();
|
||||||
dataLoop();
|
|
||||||
patrixLoop();
|
patrixLoop();
|
||||||
}
|
}
|
||||||
@ -1,45 +0,0 @@
|
|||||||
#include "data.h"
|
|
||||||
#include "ArduinoJson.h"
|
|
||||||
#include "mqtt.h"
|
|
||||||
#include "wifi.h"
|
|
||||||
|
|
||||||
#define ENTRY_COUNT 1500
|
|
||||||
|
|
||||||
struct Entry {
|
|
||||||
const char *name = "";
|
|
||||||
time_t timestamp = 0;
|
|
||||||
double value = NAN;
|
|
||||||
};
|
|
||||||
|
|
||||||
Entry data[ENTRY_COUNT];
|
|
||||||
|
|
||||||
Entry *dataRead = data;
|
|
||||||
|
|
||||||
Entry *dataWrite = data;
|
|
||||||
|
|
||||||
size_t dataCount = 0;
|
|
||||||
|
|
||||||
bool dataAdd(const char *name, const time_t timestamp, const double value) {
|
|
||||||
if (dataCount >= ENTRY_COUNT) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
dataWrite->name = name;
|
|
||||||
dataWrite->timestamp = timestamp;
|
|
||||||
dataWrite->value = value;
|
|
||||||
dataWrite = (dataWrite - data + 1) % ENTRY_COUNT + data;
|
|
||||||
dataCount++;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dataLoop() {
|
|
||||||
if (dataCount == 0 || !isTimeSet()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
JsonDocument json;
|
|
||||||
json["timestamp"] = correctTime(dataRead->timestamp);
|
|
||||||
json["value"] = dataRead->value;
|
|
||||||
if (mqttPublishData(dataRead->name, json)) {
|
|
||||||
dataRead = (dataRead - data + 1) % ENTRY_COUNT + data;
|
|
||||||
dataCount--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -2,9 +2,69 @@
|
|||||||
#define SENSOR3_DATA_H
|
#define SENSOR3_DATA_H
|
||||||
|
|
||||||
#include "base.h"
|
#include "base.h"
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
bool dataAdd(const char *name, const time_t timestamp, const double value);
|
struct IData {
|
||||||
|
|
||||||
void dataLoop();
|
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 dataCount = 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 (dataCount >= size) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bufferWrite->timestamp = timestamp;
|
||||||
|
bufferWrite->data = data;
|
||||||
|
bufferWrite = (bufferWrite - buffer + 1) % size + buffer;
|
||||||
|
dataCount++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (dataCount == 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;
|
||||||
|
dataCount--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -47,7 +47,7 @@ public:
|
|||||||
// -
|
// -
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
bool loop() {
|
||||||
const time_t now = getTime();
|
const time_t now = getTime();
|
||||||
if (now - lastTimestamp > timeoutSec) {
|
if (now - lastTimestamp > timeoutSec) {
|
||||||
lastTimestamp = 0;
|
lastTimestamp = 0;
|
||||||
@ -61,7 +61,6 @@ public:
|
|||||||
if (doPublish) {
|
if (doPublish) {
|
||||||
lastSentValue = value;
|
lastSentValue = value;
|
||||||
lastSentMillis = millisNow;
|
lastSentMillis = millisNow;
|
||||||
dataAdd(name, timestamp, value);
|
|
||||||
}
|
}
|
||||||
lastValue = value;
|
lastValue = value;
|
||||||
lastTimestamp = timestamp;
|
lastTimestamp = timestamp;
|
||||||
@ -69,26 +68,28 @@ public:
|
|||||||
lastValidValue = value;
|
lastValidValue = value;
|
||||||
lastValidTimestamp = timestamp;
|
lastValidTimestamp = timestamp;
|
||||||
}
|
}
|
||||||
|
return doPublish;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *getName() const {
|
[[nodiscard]] const char *getName() const {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
double getLastValue() const {
|
[[nodiscard]] double getLastValue() const {
|
||||||
return lastValue;
|
return lastValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t getLastTimestamp() const {
|
[[nodiscard]] time_t getLastTimestamp() const {
|
||||||
return lastTimestamp;
|
return lastTimestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
double getLastValidValue() const {
|
[[nodiscard]] double getLastValidValue() const {
|
||||||
return lastValidValue;
|
return lastValidValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t getLastValidTimestamp() const {
|
[[nodiscard]] time_t getLastValidTimestamp() const {
|
||||||
return lastValidTimestamp;
|
return lastValidTimestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,6 +42,37 @@ double temperatureCurrent = NAN;
|
|||||||
|
|
||||||
double heaterPWM = 0;
|
double heaterPWM = 0;
|
||||||
|
|
||||||
|
struct Data : IData {
|
||||||
|
double temperature;
|
||||||
|
double target;
|
||||||
|
double p;
|
||||||
|
double i;
|
||||||
|
double d;
|
||||||
|
|
||||||
|
Data() {
|
||||||
|
temperature = NAN;
|
||||||
|
target = NAN;
|
||||||
|
p = NAN;
|
||||||
|
i = NAN;
|
||||||
|
d = NAN;
|
||||||
|
}
|
||||||
|
|
||||||
|
Data(double temperature, double target, double p, double i, double d) : temperature(temperature), target(target), p(p), i(i), d(d) {
|
||||||
|
// -
|
||||||
|
}
|
||||||
|
|
||||||
|
void toJson(JsonObject &json) const override {
|
||||||
|
json["temperature"] = temperature;
|
||||||
|
json["target"] = target;
|
||||||
|
json["p"] = p;
|
||||||
|
json["i"] = i;
|
||||||
|
json["d"] = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Cache<Data, 500> cache("data");
|
||||||
|
|
||||||
void writeDecimal(int *digit, double value);
|
void writeDecimal(int *digit, double value);
|
||||||
|
|
||||||
void displayLoop();
|
void displayLoop();
|
||||||
@ -59,7 +90,18 @@ void patrixSetup() {
|
|||||||
|
|
||||||
void patrixLoop() {
|
void patrixLoop() {
|
||||||
dallas.loop();
|
dallas.loop();
|
||||||
sensor.loop();
|
|
||||||
|
if (sensor.loop()) {
|
||||||
|
Data data = {
|
||||||
|
temperatureCurrent,
|
||||||
|
temperatureTarget,
|
||||||
|
proportional,
|
||||||
|
integral,
|
||||||
|
derivative,
|
||||||
|
};
|
||||||
|
cache.add(sensor.getLastTimestamp(), data);
|
||||||
|
}
|
||||||
|
cache.loop();
|
||||||
|
|
||||||
displayLoop();
|
displayLoop();
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user