85 lines
2.8 KiB
C
85 lines
2.8 KiB
C
// rtt_log.c
|
|
|
|
#include "log.h"
|
|
|
|
#include "SEGGER_RTT.h"
|
|
#include "stdio.h"
|
|
#include <stdarg.h>
|
|
|
|
#if !defined(SEGGER_RTT_H)
|
|
#error \
|
|
"SEGGER_RTT.h not included. Please include SEGGER RTT library in your project."
|
|
#endif
|
|
|
|
#ifndef RTT_CTRL_TEXT_BLACK
|
|
#define RTT_CTRL_TEXT_BLACK "\x1B[2;30m"
|
|
#define RTT_CTRL_TEXT_RED "\x1B[2;31m"
|
|
#define RTT_CTRL_TEXT_GREEN "\x1B[2;32m"
|
|
#define RTT_CTRL_TEXT_YELLOW "\x1B[2;33m"
|
|
#define RTT_CTRL_TEXT_BLUE "\x1B[2;34m"
|
|
#define RTT_CTRL_TEXT_MAGENTA "\x1B[2;35m"
|
|
#define RTT_CTRL_TEXT_CYAN "\x1B[2;36m"
|
|
#define RTT_CTRL_TEXT_WHITE "\x1B[2;37m"
|
|
#define RTT_CTRL_TEXT_BRIGHT_BLACK "\x1B[1;30m"
|
|
#define RTT_CTRL_TEXT_BRIGHT_RED "\x1B[1;31m"
|
|
#define RTT_CTRL_TEXT_BRIGHT_GREEN "\x1B[1;32m"
|
|
#define RTT_CTRL_TEXT_BRIGHT_YELLOW "\x1B[1;33m"
|
|
#define RTT_CTRL_TEXT_BRIGHT_BLUE "\x1B[1;34m"
|
|
#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "\x1B[1;35m"
|
|
#define RTT_CTRL_TEXT_BRIGHT_CYAN "\x1B[1;36m"
|
|
#define RTT_CTRL_TEXT_BRIGHT_WHITE "\x1B[1;37m"
|
|
#define RTT_CTRL_BG_BLACK "\x1B[24;40m"
|
|
#define RTT_CTRL_BG_RED "\x1B[24;41m"
|
|
#define RTT_CTRL_BG_GREEN "\x1B[24;42m"
|
|
#define RTT_CTRL_BG_YELLOW "\x1B[24;43m"
|
|
#define RTT_CTRL_BG_BLUE "\x1B[24;44m"
|
|
#define RTT_CTRL_BG_MAGENTA "\x1B[24;45m"
|
|
#define RTT_CTRL_BG_CYAN "\x1B[24;46m"
|
|
#define RTT_CTRL_BG_WHITE "\x1B[24;47m"
|
|
#define RTT_CTRL_RESET "\x1B[0m"
|
|
#endif
|
|
|
|
static const char *level_prefixes[] = {"[DEBUG] ", "[INFO] ", "[WARN] ",
|
|
"[ERROR] "};
|
|
|
|
static const char *level_colors[] = {
|
|
RTT_CTRL_TEXT_BRIGHT_BLUE, // DEBUG: 青色
|
|
RTT_CTRL_TEXT_BRIGHT_GREEN, // INFO: 亮绿色
|
|
RTT_CTRL_TEXT_BRIGHT_YELLOW, // WARNING: 亮黄色
|
|
RTT_CTRL_TEXT_BRIGHT_RED // ERROR: 亮红色
|
|
};
|
|
|
|
static const char *(*timestamp_cb)(void) = NULL;
|
|
|
|
extern uint32_t HAL_GetTick(void);
|
|
|
|
void rtt_log_init(void)
|
|
{
|
|
SEGGER_RTT_Init();
|
|
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0,
|
|
SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
|
|
SEGGER_RTT_ConfigDownBuffer(0, NULL, NULL, 0,
|
|
SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
|
|
// timestamp_cb = hal_systick_timestamp;
|
|
}
|
|
|
|
void rtt_log(LogLevel level, const char *format, ...)
|
|
{
|
|
const int buffer_index = 0;
|
|
uint32_t time_ms = HAL_GetTick();
|
|
uint32_t seconds = time_ms / 1000;
|
|
uint32_t ms = time_ms % 1000;
|
|
uint32_t minutes = seconds / 60;
|
|
SEGGER_RTT_printf(buffer_index, "[%02lu:%02lu.%03lu]", minutes % 60,
|
|
seconds % 60, ms);
|
|
SEGGER_RTT_printf(buffer_index, "%s", level_colors[level]);
|
|
|
|
SEGGER_RTT_printf(buffer_index, "%s", level_prefixes[level]);
|
|
|
|
va_list args;
|
|
va_start(args, format);
|
|
SEGGER_RTT_vprintf(buffer_index, format, &args);
|
|
va_end(args);
|
|
SEGGER_RTT_printf(buffer_index, "%s\r\n", RTT_CTRL_RESET);
|
|
}
|