32#define PX_LOG_CFG_TRACE_DATA_BYTES_PER_ROW 16
45static void inline px_log_putchar(
char data)
47#ifdef PX_LOG_CFG_PUTCHAR
49 PX_LOG_CFG_PUTCHAR(data);
56static void px_log_print_str(
const char * data)
60 px_log_putchar(*data++);
64static void inline px_log_print_hex04(uint8_t data)
72 data += (uint8_t)
'A' - 10;
74 px_log_putchar((
char)data);
77static void inline px_log_print_hex08(uint8_t data)
83#ifdef PX_COMPILER_GCC_AVR
84static void px_log_print_str_P(
const char * data)
90 c = px_pgm_rd_char(data++);
99static void px_log_printf_vargs_P(
const char * format, va_list args)
108 len = strlen(px_log_buf);
109 if((len != 0) && (px_log_buf[len - 1] ==
'\t'))
111 px_log_buf[len - 1] =
'\0';
114 px_log_print_str(px_log_buf);
117static void px_log_printf_P(
const char * format, ...)
121 va_start(args, format);
122 px_log_printf_vargs_P(format, args);
128static void px_log_printf_vargs(
const char * format, va_list args)
137 len = strlen(px_log_buf);
138 if((len != 0) && (px_log_buf[len - 1] ==
'\t'))
140 px_log_buf[len - 1] =
'\0';
143 px_log_print_str(px_log_buf);
146static void px_log_printf(
const char * format, ...)
150 va_start(args, format);
151 px_log_printf_vargs(format, args);
164 px_log_print_str(PX_LOG_FG_RED
"E");
172 px_log_print_str(PX_LOG_FG_YELLOW
"W");
178 case PX_LOG_LEVEL_INFO:
180 px_log_print_str(PX_LOG_FG_GREEN
"I");
188 px_log_print_str(PX_LOG_FG_BLUE
"D");
196 px_log_print_str(PX_LOG_FG_CYAN
"V");
209#ifdef PX_LOG_CFG_TIMESTAMP
211 PX_LOG_CFG_TIMESTAMP(px_log_buf);
215 px_log_print_str(px_log_buf);
221 px_log_print_str(PX_LOG_CR);
225#ifdef PX_COMPILER_GCC_AVR
226 px_log_print_str_P(name);
227 px_log_printf_P(PX_PGM_STR(
" %04u : "), line);
229 px_log_printf(
"%s %04u : ", name, line);
233static void px_log_terminate(
const char * format)
235#ifdef PX_COMPILER_GCC_AVR
236 size_t len = strlen_P(format);
237 if((len == 0) || px_pgm_rd_char(format + len - 1) !=
'\t')
240 px_log_putchar(
'\n');
243 size_t len = strlen(format);
244 if((len == 0) || format[len - 1] !=
'\t')
247 px_log_putchar(
'\n');
274 va_start(args, format);
275#ifdef PX_COMPILER_GCC_AVR
276 px_log_printf_vargs_P(format, args);
278 px_log_printf_vargs(format, args);
282 px_log_terminate(format);
299 va_start(args, format);
300#ifdef PX_COMPILER_GCC_AVR
301 px_log_printf_vargs_P(format, args);
303 px_log_printf_vargs(format, args);
307 px_log_terminate(format);
323 px_log_report_log_prefix(PX_LOG_LEVEL_INFO, name, line);
325 va_start(args, format);
326#ifdef PX_COMPILER_GCC_AVR
327 px_log_printf_vargs_P(format, args);
329 px_log_printf_vargs(format, args);
333 px_log_terminate(format);
351 va_start(args, format);
352#ifdef PX_COMPILER_GCC_AVR
353 px_log_printf_vargs_P(format, args);
355 px_log_printf_vargs(format, args);
359 px_log_terminate(format);
377 va_start(args, format);
378#ifdef PX_COMPILER_GCC_AVR
379 px_log_printf_vargs_P(format, args);
381 px_log_printf_vargs(format, args);
385 px_log_terminate(format);
393#ifdef PX_COMPILER_GCC_AVR
394 px_log_printf_P(PX_PGM_STR(
"ASSERT"));
396 px_log_printf(
"ASSERT");
407 va_start(args, format);
408#ifdef PX_COMPILER_GCC_AVR
409 px_log_printf_vargs_P(format, args);
411 px_log_printf_vargs(format, args);
424 const uint8_t * data_u8 = (
const uint8_t *)data;
426 for(i = 0; i < nr_of_bytes; i++)
428 px_log_print_hex08(*data_u8++);
436 const uint8_t * row_data;
439 for(i = 0; i < nr_of_bytes; i+= PX_LOG_CFG_TRACE_DATA_BYTES_PER_ROW)
442 if( (i != 0) && ((i % (PX_LOG_CFG_TRACE_DATA_BYTES_PER_ROW * 4)) == 0) )
445 px_log_putchar(
'\n');
448 row_data = &((
const uint8_t *)data)[i];
450 for(j = 0; j < PX_LOG_CFG_TRACE_DATA_BYTES_PER_ROW; j++)
453 if((j != 0) && ((j % 4) == 0))
459 if((i + j) < nr_of_bytes)
462 px_log_print_hex08(row_data[j]);
468#ifdef PX_COMPILER_GCC_AVR
469 px_log_print_str_P(PX_PGM_STR(
" "));
471 px_log_print_str(
" ");
476 for(j = 0; j < PX_LOG_CFG_TRACE_DATA_BYTES_PER_ROW; j++)
479 if((i + j) < nr_of_bytes)
482 if( (row_data[j] >= 32) && (row_data[j] <= 127) )
485 px_log_putchar(row_data[j]);
499 px_log_putchar(
'\n');
#define PX_U8_LO4(data)
Extract the low 4 bits of a 8-bit value.
#define PX_U8_HI4(data)
Extract the high 4 bits of a 8-bit value.
void _px_log_log_info(const char *name, uint16_t line, const char *format,...)
Output info info: module name, line and variable argument user format string.
void _px_log_assert(const char *name, uint16_t line)
Report that an assertion has failed and block indefinitely.
void _px_log_trace(const char *format,...)
Output a user format string.
#define PX_LOG_CFG_BUF_SIZE
Debug output string buffer size.
void _px_log_log_warning(const char *name, uint16_t line, const char *format,...)
Output warning info: module name, line and variable argument user format string.
PX_ATTR_WEAK bool px_log_filter(px_log_level_t level, const char *name)
Run time log filter.
void _px_log_log_verbose(const char *name, uint16_t line, const char *format,...)
Output verbose info: module name, line and variable argument user format string.
void _px_log_trace_hexdump(const void *data, size_t nr_of_bytes)
Output the content of a buffer as a spaced table of HEX values and ASCII characters.
px_log_level_t
Log message level ordered in increasing verbosity.
void _px_log_log_error(const char *name, uint16_t line, const char *format,...)
Output error info: module name, line and variable argument user format string.
void _px_log_trace_char(char c)
Output a character.
void _px_log_log_debug(const char *name, uint16_t line, const char *format,...)
Output debug info: module name, line and variable argument user format string.
void _px_log_trace_data(const void *data, size_t nr_of_bytes)
Output the content of a buffer as an array of HEX values.
@ PX_LOG_LEVEL_ERROR
Critical errors.
@ PX_LOG_LEVEL_WARNING
Warnings.
@ PX_LOG_LEVEL_VERBOSE
Extra details for debugging which can flood normal output.
@ PX_LOG_LEVEL_DEBUG
Extra info for debugging that's not required for normal use.