#include #include #include #include #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 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; };