renderbug-cpp/src/platform/arduino/MQTTTelemetry.h

59 lines
1.5 KiB
C++

#include <Figments.h>
#include <Ringbuf.h>
#include <PubSubClient.h>
#include <ArduinoLog.h>
#include "../../Sequencer.h"
class MQTTTelemetry : public BufferedInputSource, OnlineTaskMixin {
public:
MQTTTelemetry();
void setSequencer(Sequencer* seq) { m_sequencer = seq; }
class LogPrinter : public Print {
private:
MQTTTelemetry* telemetry;
Ringbuf<char, 512> buf;
public:
LogPrinter(MQTTTelemetry* telemetry) : telemetry(telemetry) {};
size_t write(uint8_t byte) {
char outBuf[512];
if (byte == '\n') {
size_t bufSize = buf.write(outBuf);
outBuf[std::min(sizeof(outBuf), bufSize)] = 0;
telemetry->m_mqtt.publish(telemetry->m_logTopic, outBuf);
} else {
buf.insert(byte);
}
return sizeof(byte);
}
};
Print* logPrinter() {
return &m_logPrinter;
}
void handleEventOnline(const InputEvent& evt) override;
void loop() override;
void loopOnline() override;
private:
char m_statTopic[100];
char m_attrTopic[100];
char m_cmdTopic[100];
char m_logTopic[100];
char m_heartbeatTopic[100];
void callback(char* topic, byte* payload, unsigned int length);
static void s_callback(char* topic, byte* payload, unsigned int length);
char m_patternBuf[48];
bool m_needHeartbeat = false;
Sequencer *m_sequencer = 0;
PubSubClient m_mqtt;
LogPrinter m_logPrinter;
};