Files
renderbug-cpp/src/platform/arduino/MQTTTelemetry.h
Torrie Fischer e994f1f20c
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
platform: arduno: mqtt: fix mqtt build
2023-02-18 19:36:43 +01:00

80 lines
2.0 KiB
C++

#include <Figments.h>
#include <Ringbuf.h>
#include <PubSubClient.h>
#include <ArduinoLog.h>
#include "../../Sequencer.h"
#ifdef BOARD_ESP8266
#include <ESP8266WiFi.h>
#elif defined(BOARD_ESP32)
#include <WiFi.h>
#endif
class MQTTTelemetry : public BufferedInputSource, OnlineTaskMixin, ConfigTaskMixin {
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) {
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;
};