59 lines
1.5 KiB
C++
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;
|
|
};
|