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
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);
|
|
}
|
|
|