Biblioteca de log colorido em terminal VT100/ANSI para firmwares em C, com suporte a níveis de log (TRACE, DEBUG, INFO, WARN) e formato estendido com %b para exibir valores binários. Foi pensada para uso em ambientes como Raspberry Pi Pico (via pico_stdlib), mas pode ser reaproveitada em qualquer projeto C que escreva em stdout.
- Objetivo: simplificar o uso de logs estruturados em projetos embarcados, com cores por nível e filtragem em tempo de compilação.
- Saída: mensagens com prefixos (
[INFO],[DEBUG], etc.) e códigos de cor VT100/ANSI. - Formato: compatível com
printf, incluindo%d,%u,%x,%p,%s,%ce o extra%b(binário).
log_vt100.h– API pública (tipos, macros de nível e configuração).log_vt100.c– implementação do formatador e escrita emprintf.
typedef enum {
LOG_LEVEL_TRACE = 0,
LOG_LEVEL_DEBUG = 1,
LOG_LEVEL_INFO = 2,
LOG_LEVEL_WARN = 3,
} log_level_t;void log_set_level(log_level_t level);
void log_write(log_level_t level, const char *fmt, ...);log_set_levelpermite alterar o nível de log em tempo de execução.log_writeé a função base usada pelos macros (LOG_TRACE,LOG_DEBUG, etc.).
LOG_TRACE("valor=%d", v);
LOG_DEBUG("Inicializando modulo");
LOG_INFO("Estado: %u", status);
LOG_WARN("Falha: codigo=%d", err);A configuração é feita via #define antes de incluir log_vt100.h (em geral em um header global do projeto):
// Nível padrão (se log_set_level nao for chamado)
#define LOG_DEFAULT_LEVEL LOG_LEVEL_INFO
// Verbosidade de compilacao
// -1: nenhum log; 0: apenas WARN;
// 1: INFO+WARN; 2: DEBUG+; 3: TRACE+
#define LOG_LEVEL 2
// Opcional: tag do modulo (na versao atual, reservado para extensoes futuras)
#define LOG_TAG "MAIN"
#include "log_vt100.h"LOG_LEVEL< 0: desliga todos os logs (útil para builds de producao sensiveis a desempenho).LOG_LEVEL>= 0:LOG_WARNsempre ativo; demais níveis dependem do valor deLOG_LEVEL.
A biblioteca usa os seguintes códigos de cor:
TRACE– cinza (\x1b[90m)DEBUG– azul (\x1b[34m)INFO– verde (\x1b[32m)WARN– amarelo (\x1b[33m)
Cada linha termina com \x1b[0m para resetar o estilo do terminal.
log_vt100 adiciona o especificador %b para imprimir inteiros sem sinal em binario:
uint32_t flags = 0b101100;
LOG_DEBUG("flags em binario: %b", flags);
// Saida aproximada: [DEBUG] flags em binario: 101100Quando o formatador detecta %b, ele usa um caminho de formatacao proprio, mantendo os demais especificadores compatíveis com printf.
Exemplo de integracao (conforme CMakeLists.txt desta lib):
add_library(log_vt100 STATIC
log_vt100.c
)
target_include_directories(log_vt100 PUBLIC
${CMAKE_CURRENT_LIST_DIR}
)
target_link_libraries(log_vt100
pico_stdlib
)Em um projeto que usa esta biblioteca:
add_executable(meu_firmware
main.c
# outros fontes
)
target_link_libraries(meu_firmware
pico_stdlib
log_vt100
)E em main.c:
#include "pico/stdlib.h"
#define LOG_LEVEL 2
#include "log_vt100.h"
int main() {
stdio_init_all();
LOG_INFO("Sistema inicializado");
uint32_t mask = 0x0F;
LOG_DEBUG("mask=0x%X (%b)", mask, mask);
while (true) {
LOG_TRACE("loop");
sleep_ms(1000);
}
}Quando usada junto ao workspace Keyboard-Menu---workspace, esta biblioteca pode:
- Exibir logs estruturados de tarefas FreeRTOS (teclado, menu, OLED, etc.).
- Mostrar mascaras de bits (por exemplo, de grupos de eventos) em formato binario com
%b. - Facilitar o debug de estados internos sem depender de depurador.
Basta garantir que o executável do exemplo esteja linkado com log_vt100 e incluir log_vt100.h nos módulos onde você deseja logar.
Consulte LICENSE no repositório para detalhes de uso e redistribuição.
- Nome: Carlos Delfino
- GitHub: https://github.com/carlosdelfino
- Site: https://carlosdelfino.eti.br
- E-mail: [email protected]