#pragma once #include #include #include #include #include "pico/time.h" #include "ring_buffer.h" struct log_entry { uint32_t timestamp_us; std::string message; }; inline ring_buffer g_debug_log; inline void dlog(std::string_view msg) { g_debug_log.push_overwrite(log_entry{static_cast(time_us_32()), std::string(msg)}); } inline void dlog_if_slow(std::string_view label, uint32_t threshold_us, std::function fn) { uint32_t t0 = time_us_32(); fn(); uint32_t elapsed = time_us_32() - t0; if (elapsed > threshold_us) dlog(std::string(label) + " " + std::to_string(elapsed) + "us"); } inline std::vector dlog_drain() { std::vector result; uint16_t n = g_debug_log.used(); result.reserve(n); for (uint16_t i = 0; i < n; i++) { log_entry e; g_debug_log.peek(std::span{&e, 1}); result.push_back(std::move(e)); g_debug_log.consume(1); } return result; }