#include "log.h" #include #include #include #include "clock.h" void doLog(LogLevel level, const char *format, va_list args); auto logLevel = DEBUG; void logSetup() { delay(500); Serial.begin(115200); info("Startup"); } void execute(const char *cmd) { if (strcmp(cmd, "help") == 0) { info("HELP"); info(" network"); info(" reboot"); info(" reconnect"); info(" time"); } else if (strcmp(cmd, "network") == 0) { info("NETWORK"); info(" %-10s %s", "mac:", WiFi.macAddress().c_str()); info(" %-10s %s", "state:", WiFi.localIP() != 0 ? "connected" : "disconnected"); info(" %-10s %s", "ssid:", WiFi.SSID().c_str()); info(" %-10s %s", "bssid:", WiFi.BSSIDstr().c_str()); info(" %-10s %s", "ip:", WiFi.localIP().toString().c_str()); info(" %-10s %s", "mask:", WiFi.subnetMask().toString().c_str()); info(" %-10s %s", "gateway:", WiFi.gatewayIP().toString().c_str()); info(" %-10s %s", "dns:", WiFi.dnsIP().toString().c_str()); } else if (strcmp(cmd, "reboot") == 0) { info("REBOOT"); delay(1000); yield(); ESP.restart(); } else if (strcmp(cmd, "reconnect") == 0) { info("RECONNECT"); WiFi.disconnect(); } else if (strcmp(cmd, "time") == 0) { info("TIME"); info(" %-10s %s", "epoch:", time(nullptr)); info(" %-10s %s", "real:", getClockStr()); info(" %-10s %s", "startup:", getStartupStr()); info(" %-10s %s", "uptime:", getUptimeStr()); } else { info("UNKNOWN COMMAND: %s", cmd); } } void logLoop() { static char cmd[64]; static auto write = cmd; if (Serial.available() > 0) { const auto c = static_cast(Serial.read()); switch (c) { case 13: execute(cmd); write = cmd; *write = 0; break; case 8: Serial.print(c); if (write > cmd) { *write-- = 0; } break; default: Serial.print(c); *write = c; write++; break; } } } void log(const LogLevel level, const char *format, ...) { va_list args; va_start(args, format); doLog(level, format, args); va_end(args); } void error(const char *format, ...) { va_list args; va_start(args, format); doLog(ERROR, format, args); va_end(args); } void warn(const char *format, ...) { va_list args; va_start(args, format); doLog(WARN, format, args); va_end(args); } void info(const char *format, ...) { va_list args; va_start(args, format); doLog(INFO, format, args); va_end(args); } void debug(const char *format, ...) { va_list args; va_start(args, format); doLog(DEBUG, format, args); va_end(args); } void doLog(const LogLevel level, const char *format, const va_list args) { if (level > logLevel) { return; } Serial.print(getClockStr()); switch (level) { case ERROR: Serial.print(" [ERROR] "); break; case WARN: Serial.print(" [WARN ] "); break; case INFO: Serial.print(" [INFO ] "); break; case DEBUG: Serial.print(" [DEBUG] "); break; } char message[256]; vsnprintf(message, sizeof message, format, args); Serial.print(message); Serial.print("\n"); yield(); }