Sporttafel-old/src/core/log.cpp

143 lines
3.2 KiB
C++

#include "log.h"
#include <cstdarg>
#include <cstdio>
#include <WiFi.h>
#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<char>(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();
}