diff --git a/include/log.hpp b/include/log.hpp index f06264e..2fc2a15 100644 --- a/include/log.hpp +++ b/include/log.hpp @@ -1,7 +1,7 @@ #ifndef LOG_HPP #define LOG_HPP -#define log _log // comment to disable logging +#define log(level, fmt, ...) _log(level, std::source_location::current(), fmt, ##__VA_ARGS__) // comment to disable logging // #define LOG_FILE_LOCATION "linuxSmartie.log.gz" #ifdef log @@ -9,6 +9,7 @@ #include #include #include +#include #include #ifdef LOG_FILE_LOCATION @@ -16,13 +17,26 @@ inline std::mutex fmtx; // file logging mutex #endif +// #define FUNC_NAME pFname(std::source_location::current().function_name()) + inline std::mutex cmtx; // console logging mutex enum class LOG { INF, WRN, ERR, DBG, START }; +inline std::string_view pFname(std::string_view full) { + if (auto pos = full.find(' '); pos != std::string_view::npos) + full.remove_prefix(pos + 1); + + if (auto pos = full.rfind('('); pos != std::string_view::npos) + full.remove_suffix(full.size() - pos); + + return full; +} + template -inline void _log(LOG level, std::string_view tag, std::format_string str, Args&&... args) { +inline void _log(LOG level, const std::source_location& loc, std::format_string str, Args&&... args) { constexpr std::string_view reset = "\033[0m"; constexpr std::string_view pattern = "[{}{}{}] "; + std::string_view tag = pFname(loc.function_name()); std::string_view color = ""; switch (level) { diff --git a/main.cpp b/main.cpp index 25cbff0..8812a7d 100644 --- a/main.cpp +++ b/main.cpp @@ -43,13 +43,13 @@ struct Sensors { }; void sighandler(int) { - log(LOG::WRN, "Signal", "got SIGINT/SIGTERM, exiting..."); + log(LOG::WRN, "got SIGINT/SIGTERM, exiting..."); sem::main.release(); sem::display.release(); } void hassThread(std::stop_token st, Sensors* s) { - log(LOG::INF, "Thread", "Starting hass_thread"); + log(LOG::INF, "Thread started"); HomeAssistant pc_power("home.drath.win", "sensor.gniazdko_komputer_moc"); pc_power.connect(); @@ -66,7 +66,7 @@ void hassThread(std::stop_token st, Sensors* s) { } void sensorsThread(std::stop_token st, Sensors* s) { - log(LOG::INF, "Thread", "Starting sensors_thread, poll interval {} ms", LCD_INTERVAL_MS); + log(LOG::INF, "Thread started, poll interval {} ms", LCD_INTERVAL_MS); cpu::detectHwmon(&s->cpu, "0000:00:18.3"); gpu::detectHwmon(&s->gpu, "0000:0b:00.0"); sys::detectHwmon(&s->sys, "nct6775.656"); @@ -87,14 +87,14 @@ void sensorsThread(std::stop_token st, Sensors* s) { gpu::update(&s->gpu); } - // log(LOG::DBG, "Sensors", "took {} microseconds", std::chrono::duration_cast(std::chrono::steady_clock::now() - start).count()); + // log(LOG::DBG, "took {} microseconds", std::chrono::duration_cast(std::chrono::steady_clock::now() - start).count()); sem::display.release(); // unlocks display loop std::this_thread::sleep_until(start + std::chrono::milliseconds(LCD_INTERVAL_MS)); } } void displayThread(std::stop_token st, Sensors* s) { - log(LOG::INF, "Thread", "Starting display_thread"); + log(LOG::INF, "Thread started"); // init internal variables of LCDDisplay class LCDDisplay lcd(LCD_PORT); @@ -165,7 +165,7 @@ void displayThread(std::stop_token st, Sensors* s) { } int main() { - log(LOG::START, "LINUXSMARTIE", "============================= PROGRAM START ============================="); // to make logs clearer + log(LOG::START, "============================= PROGRAM START ============================="); // to make logs clearer std::signal(SIGINT, sighandler); std::signal(SIGTERM, sighandler); diff --git a/src/LCDDisplay.cpp b/src/LCDDisplay.cpp index 580f897..06698c2 100644 --- a/src/LCDDisplay.cpp +++ b/src/LCDDisplay.cpp @@ -40,11 +40,11 @@ LCDDisplay::~LCDDisplay() { } void LCDDisplay::open(bool reopen) { - log(LOG::INF, "LCDDisplay", "Opening serial port at \"{}\"", _dev); + log(LOG::INF, "Opening serial port at \"{}\"", _dev); if (_lcd < 0 || reopen) _lcd = ::open(_dev.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK); // ::open calls the global open() instead of LCDDisplay::open() if (_lcd < 0) { - log(LOG::ERR, "LCDDisplay", "Error opening serial port \"{}\"", _dev); // err + log(LOG::ERR, "Error opening serial port \"{}\"", _dev); // err exit(_lcd); } } @@ -52,7 +52,7 @@ void LCDDisplay::open(bool reopen) { void LCDDisplay::close() { if (_lcd >= 0) { ::close(_lcd); - log(LOG::INF, "LCDDisplay", "Closed LCD port"); + log(LOG::INF, "Closed LCD port"); } _lcd = -1; } @@ -60,7 +60,7 @@ void LCDDisplay::close() { void LCDDisplay::write(const uint8_t* cmdbuf, uint8_t len) { int rc = ::write(_lcd, cmdbuf, len); if(rc < 0) { - log(LOG::ERR, "LCDDisplay::write", "failed to execute ::write, lost access to port?"); + log(LOG::ERR, "failed to execute ::write, lost access to port?"); this->open(true); } } @@ -71,20 +71,20 @@ void LCDDisplay::clear() { } void LCDDisplay::setContrast(uint8_t contrast) { - log(LOG::INF, "LCDDisplay::setContrast", "Set contrast to {}", contrast); + log(LOG::INF, "Set contrast to {}", contrast); const uint8_t cmdbuf[] = {254, 80, contrast}; this->write(cmdbuf, sizeof(cmdbuf)); } void LCDDisplay::setBacklight(bool enabled) { - log(LOG::INF, "LCDDisplay::setBacklight", "Set backlight to {}", enabled); + log(LOG::INF, "Set backlight to {}", enabled); const uint8_t cmdbuf[] = {254, (uint8_t)(enabled ? 66 : 70), 255}; this->write(cmdbuf, enabled ? 3 : 2); } /* still doesnt work? */ void LCDDisplay::setBacklight(uint8_t brightness) { - log(LOG::INF, "LCDDisplay::setBacklight", "Set backlight brightness to {}", brightness); + log(LOG::INF, "Set backlight brightness to {}", brightness); const uint8_t cmdbuf[] = {254, (uint8_t)(brightness ? 66 : 70), 255, brightness}; // 3rd char is timer, 4th is brightness this->write(cmdbuf, brightness ? 4 : 2); } diff --git a/src/cpu.cpp b/src/cpu.cpp index a69c1b6..df3da98 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -13,12 +13,12 @@ void detectHwmon(cpuSensors* target, const std::string& pci) { try { target->hwmon = getFirstDir(path); } catch (...) { - log(LOG::ERR, "cpu::detectHwmon", "NO CPU HWMON KERNEL MODULE DETECTED"); + log(LOG::ERR, "NO CPU HWMON KERNEL MODULE DETECTED"); return; } target->zenpower = false; // we were using readFileToStr to figure this out, we dont f/w it anymore, find another way (see if hwmon/in1_input exists?) - log(LOG::INF, "cpu::detectHwmon", "Detected module \"{}\" in path \"{}\"", target->zenpower ? "zenpower" : "k10temp", target->hwmon); + log(LOG::INF, "Detected module \"{}\" in path \"{}\"", target->zenpower ? "zenpower" : "k10temp", target->hwmon); } void update(cpuSensors* c) { diff --git a/src/gpu.cpp b/src/gpu.cpp index 64db35f..325498f 100644 --- a/src/gpu.cpp +++ b/src/gpu.cpp @@ -12,11 +12,11 @@ namespace gpu { /* takes pointer to a target gpu::sensors struct and updates its hwmon path and detects gpu_metrics */ void detectHwmon(gpuSensors* target, const std::string& pci) { target->hwmon = getFirstDir("/sys/bus/pci/devices/" + pci + "/hwmon"); - log(LOG::INF, "gpu::detectHwmon", "Detected path \"{}\"", target->hwmon); + log(LOG::INF, "Detected path \"{}\"", target->hwmon); if (FILE* file = fopen((target->hwmon + REL_METRICS_PATH).c_str(), "r")) { fclose(file); - log(LOG::INF, "gpu::detectHwmon", "found gpu_metrics"); + log(LOG::INF, "found gpu_metrics"); target->hasGpuMetrics = true; } } @@ -86,7 +86,7 @@ void updateFromMetrics(gpuSensors* g) { /* werid hardware i probably dont like, maybe fallback to reading from fs? */ default: { - log(LOG::WRN, "gpu::updateFromMetrics", "Unsupported gpu_metrics_v{}_{}", header->format_revision, header->content_revision); + log(LOG::WRN, "Unsupported gpu_metrics_v{}_{}", header->format_revision, header->content_revision); break; } } diff --git a/src/hass.cpp b/src/hass.cpp index a75f6cd..4b85329 100644 --- a/src/hass.cpp +++ b/src/hass.cpp @@ -19,7 +19,7 @@ void HomeAssistant::event_handler(struct lws* wsi, enum lws_callback_reasons rea ArduinoJson::JsonDocument json; switch (reason) { case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: { - log(LOG::ERR, "HomeAssistant::event_handler", "websocket conn error: {}", in ? in : "(null)"); + log(LOG::ERR, "websocket conn error: {}", in ? in : "(null)"); return; } @@ -36,7 +36,7 @@ void HomeAssistant::event_handler(struct lws* wsi, enum lws_callback_reasons rea } if (ha_type == "auth_ok") { - log(LOG::INF, "HomeAssistant::event_handler", "subscribing to entity \"{}\"", entity); + log(LOG::INF, "subscribing to entity \"{}\"", entity); json.clear(); json["id"] = id++; json["type"] = "subscribe_entities"; @@ -47,7 +47,7 @@ void HomeAssistant::event_handler(struct lws* wsi, enum lws_callback_reasons rea if (ha_type == "result") { if (json["success"].as() == "false") - log(LOG::ERR, "HomeAssistant::event_handler", "api said success was \"false\" on message id {}", id - 1); + log(LOG::ERR, "api said success was \"false\" on message id {}", id - 1); break; } @@ -56,17 +56,17 @@ void HomeAssistant::event_handler(struct lws* wsi, enum lws_callback_reasons rea break; } - log(LOG::WRN, "HomeAssistant::event_handler", "unhandled event: {}", (char*)in); + log(LOG::WRN, "unhandled event: {}", (char*)in); break; } case LWS_CALLBACK_CLIENT_ESTABLISHED: { - log(LOG::INF, "HomeAssistant::event_handler", "Websocket connected"); + log(LOG::INF, "Websocket connected"); break; } case LWS_CALLBACK_CLIENT_CLOSED: { - log(LOG::INF, "HomeAssistant::event_handler", "Websocket closed"); + log(LOG::INF, "Websocket closed"); return; } @@ -125,7 +125,7 @@ int HomeAssistant::connect() { context = lws_create_context(&info); if (!context) { - log(LOG::ERR, "HomeAssistant::connect", "error creating context"); + log(LOG::ERR, "error creating context"); return -1; } @@ -142,7 +142,7 @@ int HomeAssistant::connect() { websock = lws_client_connect_via_info(&i); if (!websock) { - log(LOG::ERR, "HomeAssistant::connect", "error creating lws client"); + log(LOG::ERR, "error creating lws client"); return -1; } return 0; diff --git a/src/sys.cpp b/src/sys.cpp index a5eb729..e9bb983 100644 --- a/src/sys.cpp +++ b/src/sys.cpp @@ -68,7 +68,7 @@ void sys::detectHwmon(sysSensors* s, const std::string& platform) { try { s->hwmon = getFirstDir("/sys/devices/platform/" + platform + "/hwmon"); } catch (...) { - log(LOG::ERR, "sys::detectHwmon", "Can't open sys hwmon. Module loaded? Kernel params added?"); + log(LOG::ERR, "Can't open sys hwmon. Module loaded? Kernel params added?"); return; } } diff --git a/src/utils.cpp b/src/utils.cpp index d831b87..f7c11d2 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -45,7 +45,7 @@ std::string pBytes(double bytes, bool isKbytes) { ssize_t readFile(const char* path, char* buffer, size_t maxlen) { int fd = open(path, O_RDONLY | O_CLOEXEC); if (fd < 0) { - log(LOG::ERR, "readFile2", "Error reading {}", path); + log(LOG::ERR, "Error reading {}", path); return 0; } ssize_t len = read(fd, buffer, maxlen - 1);