#include "debugMqtt.h" PubSubClient* DebugMqtt::client; Loglevel DebugMqtt::loglevel; bool DebugMqtt::isInit = false; char DebugMqtt::msg[MQTT_BUFFER_SITE]; char DebugMqtt::topic[MQTT_BUFFER_SITE]; unsigned long long int DebugMqtt::real_millis = 0; unsigned long int DebugMqtt::last_millis = 0; DebugMqtt::DebugMqtt(const char* name) { this->name = name; } void DebugMqtt::sendMsg(Loglevel loglevel, String topic, String msg) { snprintf (DebugMqtt::msg, MQTT_BUFFER_SITE, "%s: %s",this->name ,msg.c_str()); this->sendData(loglevel, topic, DebugMqtt::msg); } void DebugMqtt::sendMsg(Loglevel loglevel, String msg) { this->sendMsg(loglevel, "", msg); } void DebugMqtt::sendData(Loglevel loglevel, String topic, String data) { if (!DebugMqtt::isInit) {return;} if (loglevel <= DebugMqtt::loglevel && loglevel > Loglevel::none) { snprintf (DebugMqtt::topic, MQTT_BUFFER_SITE, "%s%s", DebugMqtt::enum_to_string(loglevel).c_str(), topic.c_str()); snprintf (DebugMqtt::msg, MQTT_BUFFER_SITE, "%s", data.c_str()); client->publish(DebugMqtt::topic, DebugMqtt::msg); } } void DebugMqtt::sendData(Loglevel loglevel, String data){ this->sendData(loglevel, "", data); } void DebugMqtt::writeToInflux(String measurement_name, String field_set, float measurement) { // Example String: "weather temperature=82 1465839830100400200"; unsigned long long int nanos = DebugMqtt::getUpdatedRealMillis() * 1000000; snprintf(DebugMqtt::msg, MQTT_BUFFER_SITE, "%s %s=%f %llu", measurement_name.c_str(), field_set.c_str(), measurement, nanos); this->sendData(Loglevel::influx, DebugMqtt::msg); } void DebugMqtt::sendTime() { struct tm timeinfo; if(!getLocalTime(&timeinfo)){ snprintf(DebugMqtt::msg, MQTT_BUFFER_SITE, "Failed to obtain time"); } snprintf(DebugMqtt::msg, MQTT_BUFFER_SITE, "%d %d %d %d %d %d %llu", timeinfo.tm_year, timeinfo.tm_mon, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, DebugMqtt::getUpdatedRealMillis()); this->sendMsg(Loglevel::info, DebugMqtt::msg); } void DebugMqtt::init(PubSubClient *client, Loglevel loglevel) { DebugMqtt::client = client; DebugMqtt::loglevel = loglevel; DebugMqtt::isInit = true; } void DebugMqtt::changeLoglevel(Loglevel loglevel) { DebugMqtt::loglevel = loglevel; } void DebugMqtt::initRealMillis() { time_t now; struct tm timeinfo; if(!getLocalTime(&timeinfo)){ snprintf(DebugMqtt::msg, MQTT_BUFFER_SITE, "Failed to obtain time in initRealMillis()"); DebugMqtt::client->publish(DebugMqtt::enum_to_string(Loglevel::error).c_str(), DebugMqtt::msg); return; } time(&now); DebugMqtt::last_millis = millis(); DebugMqtt::real_millis = now; DebugMqtt::real_millis = DebugMqtt::real_millis * 1000 + DebugMqtt::last_millis; } unsigned long long int DebugMqtt::getUpdatedRealMillis() { DebugMqtt::real_millis = DebugMqtt::real_millis + (millis() - DebugMqtt::last_millis); DebugMqtt::last_millis = millis(); return DebugMqtt::real_millis; } String DebugMqtt::enum_to_string(Loglevel loglevel) { switch(loglevel){ case Loglevel::error : return "Rover/Error"; case Loglevel::warn : return "Rover/Warn"; case Loglevel::info : return "Rover/Info"; case Loglevel::debug : return "Rover/Debug"; case Loglevel::influx : return "Rover/Influx"; default: return "INVALID ENUM"; } }