Performance optimizations: - Move TLSF allocator pool to PSRAM (frees ~170KB internal SRAM) - Raise TCP_IF_MAX_CLIENTS from 4 to 8 in BOUNDARY_MODE - Raise path_table_maxsize from 48 to 128, persist from 16 to 32 - Add -DNDEBUG to boundary build: compiles out TRACE/DEBUG macros - Log level defaults to LOG_VERBOSE when NDEBUG defined - Serial baud 115200 -> 921600 in BOUNDARY_MODE (reduces CPU blocking) Previous changes included in this commit: - Comprehensive boundary filter with transitive whitelisting (7 checks) - destination_table erase+insert fix (std::map::insert no-overwrite bug) - Backbone-to-backbone routing guard in next-hop forwarding - KISS serial output disabled for boundary mode - flash.py updates for boundary mode support
115 lines
2.3 KiB
C++
Executable File
115 lines
2.3 KiB
C++
Executable File
#include "Log.h"
|
|
|
|
#include "Utilities/OS.h"
|
|
|
|
#include <sys/time.h>
|
|
#include <time.h>
|
|
#include <stdio.h>
|
|
|
|
using namespace RNS;
|
|
|
|
#ifdef NDEBUG
|
|
LogLevel _level = LOG_VERBOSE;
|
|
#else
|
|
LogLevel _level = LOG_TRACE;
|
|
#endif
|
|
//LogLevel _level = LOG_MEM;
|
|
RNS::log_callback _on_log = nullptr;
|
|
char _datetime[20];
|
|
|
|
const char* RNS::getLevelName(LogLevel level) {
|
|
switch (level) {
|
|
case LOG_CRITICAL:
|
|
return "!!!";
|
|
case LOG_ERROR:
|
|
return "ERR";
|
|
case LOG_WARNING:
|
|
return "WRN";
|
|
case LOG_NOTICE:
|
|
return "NOT";
|
|
case LOG_INFO:
|
|
return "INF";
|
|
case LOG_VERBOSE:
|
|
return "VRB";
|
|
case LOG_DEBUG:
|
|
return "DBG";
|
|
case LOG_TRACE:
|
|
return "---";
|
|
case LOG_MEM:
|
|
return "...";
|
|
default:
|
|
return "";
|
|
}
|
|
}
|
|
|
|
const char* RNS::getTimeString() {
|
|
#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;
|
|
#endif
|
|
}
|
|
|
|
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) {
|
|
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();
|
|
}
|
|
#else
|
|
printf("%s [%s] %s\n", getTimeString(), getLevelName(level), msg);
|
|
#endif
|
|
}
|
|
|
|
void HEAD(const char* msg, LogLevel level) {
|
|
if (level > _level) {
|
|
return;
|
|
}
|
|
#ifdef ARDUINO
|
|
Serial.println("");
|
|
#else
|
|
printf("\n");
|
|
#endif
|
|
doLog(level, msg);
|
|
}
|