#include #include #include #include #include "../../Sequencer.h" #ifdef BOARD_ESP8266 #include #elif defined(BOARD_ESP32) #include #endif class MQTTTelemetry : public BufferedInputSource, OnlineTaskMixin, ConfigTaskMixin { 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) { if (byte == '\n') { char c; String logTopic = telemetry->m_debugTopic + "/log"; telemetry->m_mqtt.beginPublish(logTopic.c_str(), buf.size(), false); while (buf.take(c)) { Serial.write(c); telemetry->m_mqtt.write(c); } Serial.println(); telemetry->m_mqtt.endPublish(); } else { buf.insert(byte); } return sizeof(byte); } }; Print* logPrinter() { return &m_logPrinter; } void handleEvent(const InputEvent& evt) override; void handleEventOnline(const InputEvent& evt) override; void handleConfigChange(const InputEvent& evt) override; void loop() override; void loopOnline() override; void onOnline() override; void onOffline() override; private: String m_rootTopic; String m_debugTopic; void callback(char* topic, const char* payload); static void s_callback(char* topic, byte* payload, unsigned int length); char m_patternBuf[48]; bool m_needHeartbeat = false; bool m_isOn = true; static char s_topicBuf[128]; static char s_payloadBuf[512]; char m_hostBuf[15]; void publishDoc(const char* topic); void publishDoc(const char* topic, bool retain); Sequencer *m_sequencer = 0; WiFiClient m_wifi; PubSubClient m_mqtt; LogPrinter m_logPrinter; };