microReticulum/src/Log.cpp

112 lines
2.2 KiB
C++
Raw Permalink Normal View History

2023-10-06 17:24:48 -06:00
#include "Log.h"
2024-06-03 08:13:45 -06:00
#include "Utilities/OS.h"
#include <sys/time.h>
#include <time.h>
2023-10-06 17:24:48 -06:00
#include <stdio.h>
using namespace RNS;
//LogLevel _level = LOG_VERBOSE;
2024-07-03 11:30:01 -06:00
LogLevel _level = LOG_TRACE;
//LogLevel _level = LOG_MEM;
RNS::log_callback _on_log = nullptr;
2024-06-03 08:13:45 -06:00
char _datetime[20];
const char* RNS::getLevelName(LogLevel level) {
2023-10-06 17:24:48 -06:00
switch (level) {
case LOG_CRITICAL:
return "!!!";
2023-10-06 17:24:48 -06:00
case LOG_ERROR:
return "ERR";
2023-10-06 17:24:48 -06:00
case LOG_WARNING:
return "WRN";
2023-10-06 17:24:48 -06:00
case LOG_NOTICE:
return "NOT";
2023-10-06 17:24:48 -06:00
case LOG_INFO:
return "INF";
2023-10-06 17:24:48 -06:00
case LOG_VERBOSE:
return "VRB";
2023-10-06 17:24:48 -06:00
case LOG_DEBUG:
return "DBG";
2024-07-03 11:30:01 -06:00
case LOG_TRACE:
return "---";
case LOG_MEM:
return "...";
2023-10-06 17:24:48 -06:00
default:
return "";
}
}
const char* RNS::getTimeString() {
2024-06-03 08:13:45 -06:00
#ifdef ARDUINO
uint64_t time = Utilities::OS::ltime();
if (time < 86400000) {
snprintf(_datetime, sizeof(_datetime), "%02d:%02d:%02d.%03d", (int)(time/3600000), (int)((time/60000)%60), (int)((time/1000)%60), (int)(time%1000));
}
else {
snprintf(_datetime, sizeof(_datetime), "%02d-%02d:%02d:%02d.%03d", (int)(time/86400000), (int)((time/3600000)%24), (int)((time/60000)%60), (int)((time/1000)%60), (int)(time%1000));
}
return _datetime;
#else
struct timeval tv;
gettimeofday(&tv, nullptr);
int millis = lrint(tv.tv_usec/1000.0);
if (millis >= 1000) {
millis -= 1000;
tv.tv_sec++;
}
struct tm* tm = localtime(&tv.tv_sec);
size_t len = strftime(_datetime, sizeof(_datetime), "%Y-%m-%d %H:%M:%S", tm);
snprintf(_datetime+len, sizeof(_datetime)-len, ".%03d", millis);
return _datetime;
2024-06-03 08:13:45 -06:00
#endif
}
2023-10-06 17:24:48 -06:00
void RNS::loglevel(LogLevel level) {
_level = level;
}
LogLevel RNS::loglevel() {
return _level;
}
void RNS::setLogCallback(log_callback on_log /*= nullptr*/) {
_on_log = on_log;
}
void RNS::doLog(LogLevel level, const char* msg) {
2023-10-06 17:24:48 -06:00
if (level > _level) {
return;
}
if (_on_log != nullptr) {
_on_log(msg, level);
return;
}
#ifdef ARDUINO
if (Serial) {
Serial.print(getTimeString());
Serial.print(" [");
Serial.print(getLevelName(level));
Serial.print("] ");
Serial.println(msg);
Serial.flush();
}
2023-10-06 17:24:48 -06:00
#else
printf("%s [%s] %s\n", getTimeString(), getLevelName(level), msg);
2023-10-06 17:24:48 -06:00
#endif
}
2024-07-03 11:30:01 -06:00
void HEAD(const char* msg, LogLevel level) {
if (level > _level) {
return;
}
#ifdef ARDUINO
Serial.println("");
#else
printf("\n");
#endif
doLog(level, msg);
}