You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

118 lines
3.0 KiB

/*
* logger.c
*
* Created on: Jul 4, 2021
* Author: Andreas Berthoud
*/
#include <stdarg.h>
#include <string.h>
#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);
}