32#define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0]))
37#define RX_SHIFT_TO_LSB (3U * CHAR_BIT)
47#define TX_PIO_CYCLES_PER_BIT 8U
52#define US_PER_SECOND 1000000U
57#define FLUSH_LOG_BEFORE_REBOOT_MS 200U
72#if UINT64_MAX == ULONG_MAX
74#elif UINT64_MAX == ULLONG_MAX
77#error "Unsupported uint64_t format"
81#define UINT32_ALL_ONES UINT32_MAX
151#define LOG(level, fmt, ...) \
155 const log_level_t _log_level = (level); \
156 if (get_loglevel() >= _log_level) \
158 log_write(_log_level, (fmt), ##__VA_ARGS__); \
162#define LOG_PLAIN(...) LOG(LOG_LEVEL_PLAIN, __VA_ARGS__)
163#define LOG_ERROR(...) LOG(LOG_LEVEL_ERROR, __VA_ARGS__)
164#define LOG_INFO(...) LOG(LOG_LEVEL_INFO, __VA_ARGS__)
165#define LOG_DEBUG(...) LOG(LOG_LEVEL_DEBUG, __VA_ARGS__)
166#define LOG_TRACE(...) LOG(LOG_LEVEL_TRACE, __VA_ARGS__)
168#define PRINT_FRAME_HEX(label, payload_ptr, length) \
171 LOG_DEBUG("%s", (label)); \
172 for (size_t _i = 0; _i < (length); _i++) \
174 LOG_DEBUG("%02X ", (unsigned)(payload_ptr)[_i]); \
void log_write(log_level_t level, const char *fmt,...)
Emit one formatted log message if level is enabled.
log_level_t get_loglevel(void)
Get current global log level.
static const char * log_level_tag(log_level_t level)
Get printable tag for a log level.
void log_core1_drain(void)
bool log_take_emitted_flag(void)
Atomically read and clear "log emitted" flag.
uint32_t log_take_dropped_count(void)
void set_loglevel(log_level_t level)
Set current global log level.
log_level_t
Log verbosity levels.
uint32_t log_get_high_water_mark(void)