/* * logger.c * * Created on: Jul 4, 2021 * Author: Andreas Berthoud */ #include #include #include "usbd_cdc_if.h" #include "logger.h" #define BUFFER_MAX 512 #define COMMAND_HEADER_SIZE 4 #define LOG_COMMAND_HEADER_SIZE 1 #define HEADER_SIZE (COMMAND_HEADER_SIZE + LOG_COMMAND_HEADER_SIZE) #define MESSAGE_BUFFER_START (COMMAND_HEADER_SIZE + LOG_COMMAND_HEADER_SIZE) #define MAX_LOG_MESSAGE_SIZE (BUFFER_MAX - COMMAND_HEADER_SIZE - LOG_COMMAND_HEADER_SIZE - 1) #define min(a,b) \ ({ __typeof__ (a) _a = (a); \ __typeof__ (b) _b = (b); \ _a < _b ? _a : _b; }) typedef struct { uint8_t LOG_LEVEL_DEBUG; uint8_t LOG_LEVEL_INFO; uint8_t LOG_LEVEL_WARNING; uint8_t LOG_LEVEL_ERROR; } LOGGER_SEVERTITY_T; LOGGER_SEVERTITY_T LOGGER_SEVERTITY = { .LOG_LEVEL_DEBUG = 10, .LOG_LEVEL_INFO = 20, .LOG_LEVEL_WARNING = 30, .LOG_LEVEL_ERROR = 40, }; /* * A command is 4 bytes long * * | 1 byte | 2 bytes | 1 byte | N bytes | 1 byte | * | command ID | length N | reserved | data | stop byte | * */ /* * command length = N * | 1 byte | N-1 bytes | * | severtity | message | * */ char buffer[BUFFER_MAX]; void log_message(uint8_t severtiy) { int message_length = min(strlen(buffer + MESSAGE_BUFFER_START), MAX_LOG_MESSAGE_SIZE); int command_length = message_length + 1; buffer[0] = 0xFF; // log command buffer[1] = (command_length & 0x0000FF00) >> 8; buffer[2] = command_length & 0x000000FF; buffer[3] = 0x00; // reserved buffer[4] = severtiy; buffer[5 + message_length] = 0xFF; // stop byte CDC_Transmit_FS((uint8_t*)buffer, (uint16_t)(HEADER_SIZE + message_length + 1)); } void log_debug(const char * format, int nargs, ...) { va_list args; va_start(args, nargs); vsnprintf( buffer + MESSAGE_BUFFER_START, MAX_LOG_MESSAGE_SIZE, format, args ); va_end(args); log_message(LOGGER_SEVERTITY.LOG_LEVEL_DEBUG); } void log_info(const char * format, int nargs, ...) { va_list args; va_start(args, nargs); vsnprintf( buffer + MESSAGE_BUFFER_START, MAX_LOG_MESSAGE_SIZE, format, args ); va_end(args); log_message(LOGGER_SEVERTITY.LOG_LEVEL_INFO); } void log_warning(const char * format, int nargs, ...) { va_list args; va_start(args, nargs); vsnprintf( buffer + MESSAGE_BUFFER_START, MAX_LOG_MESSAGE_SIZE, format, args ); va_end(args); log_message(LOGGER_SEVERTITY.LOG_LEVEL_WARNING); } void log_error(const char * format, int nargs, ...) { va_list args; va_start(args, nargs); vsnprintf( buffer + MESSAGE_BUFFER_START, MAX_LOG_MESSAGE_SIZE, format, args ); va_end(args); log_message(LOGGER_SEVERTITY.LOG_LEVEL_ERROR); }