199 lines
5.1 KiB
C
Raw Permalink Normal View History

2020-10-28 19:40:08 +01:00
#include <main.h>
#include <usart.h>
2020-11-03 10:05:45 +01:00
#include <show.h>
2020-10-29 15:44:13 +01:00
#include <PontCoopScheduler.h>
2020-11-17 10:50:23 +01:00
#include <logger.h>
#include <ringbuffer.h>
#include <wizHelper.h>
#include <socket.h>
2020-11-27 13:27:24 +01:00
#include <config.h>
2020-10-28 19:40:08 +01:00
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
2020-10-29 20:50:50 +01:00
#include <stdarg.h>
2020-10-29 14:30:55 +01:00
#include <stdio.h>
2020-11-17 15:15:28 +01:00
#ifdef LOGGER_OUTPUT_BY_INTERRUPT
#include <stm32f103xe.h>
#endif //LOGGER_OUTPUT_BY_INTERRUPT
2020-10-29 14:30:55 +01:00
2020-11-17 15:17:46 +01:00
#ifndef LOGGER_OUTPUT_BY_INTERRUPT
#include <stm32f1xx_hal_uart.h>
#endif //LOGGER_OUTPUT_BY_INTERRUPT
2020-10-29 14:30:55 +01:00
2020-11-30 19:03:43 +01:00
#define LOGBUFFER_SIZE 4096
2020-11-17 12:42:53 +01:00
#define MSGBUFFER_SIZE 256
2020-10-29 14:30:55 +01:00
2020-11-27 13:27:24 +01:00
static t_configBlock *config;
2020-11-17 10:36:45 +01:00
extern const uint8_t SYSLOG_SOCK;
2020-11-27 13:27:24 +01:00
uint8_t syslogAddr[4];
2020-11-17 10:36:45 +01:00
uint8_t singleOctetTXBuffer;
2020-10-29 14:30:55 +01:00
static ringbuffer_t logBuffer;
2020-11-27 13:27:24 +01:00
void logInit() {
config = getConfig();
2020-10-29 14:30:55 +01:00
ringbufferInit(&logBuffer, LOGBUFFER_SIZE);
}
void logFree() {
ringbufferFree(&logBuffer);
}
2020-11-17 15:15:28 +01:00
#ifdef LOGGER_OUTPUT_BY_INTERRUPT
void debugTxCpltCallback(UART_HandleTypeDef *huart) {
int c = ringbufferGetOne(&logBuffer);
if (c > 0) {
singleOctetTXBuffer = (uint8_t) c;
HAL_UART_Transmit_IT(&debugUart, &singleOctetTXBuffer, 1);
2020-10-29 14:30:55 +01:00
}
2020-11-17 15:15:28 +01:00
}
#endif //LOGGER_OUTPUT_BY_INTERRUPT
#ifndef LOGGER_OUTPUT_BY_INTERRUPT
int logExec() {
int c = -1;
if (__HAL_UART_GET_FLAG(&debugUart, UART_FLAG_TXE)) { // is the TX channel free
c = ringbufferGetOne(&logBuffer);
if (c > 0) {
// transfer to TX channel
uint8_t cc = (uint8_t) c;
HAL_UART_Transmit(&debugUart, &cc, 1, HAL_MAX_DELAY);
}
}
return c;
2020-10-29 14:30:55 +01:00
}
2020-11-17 15:15:28 +01:00
#endif //LOGGER_OUTPUT_BY_INTERRUPT
2020-10-29 14:30:55 +01:00
2020-11-17 10:50:23 +01:00
void syslog(char *msg) {
static uint8_t state = 0;
int8_t res8 = 0;
2020-11-27 12:49:03 +01:00
int32_t res32 = 0;
2020-11-17 10:52:49 +01:00
if (isNetworkAvailable()) {
switch (state) {
case 0:
res8 = socket(SYSLOG_SOCK, Sn_MR_UDP, 514, SF_IO_NONBLOCK);
2020-11-27 12:49:03 +01:00
if (res8 != SYSLOG_SOCK) {
break;
2020-11-17 10:52:49 +01:00
}
2020-11-27 12:49:03 +01:00
state = 1;
// no break
2020-11-17 10:52:49 +01:00
case 1:
2020-11-27 13:27:24 +01:00
if (! wizDnsQuery(config->syslogServerName, syslogAddr)) {
2020-11-27 12:49:03 +01:00
disconnect(SYSLOG_SOCK);
state = 0;
break;
}
2020-11-27 12:50:45 +01:00
state = 2;
// no break
case 2:
2020-11-27 12:49:03 +01:00
res32 = sendto(SYSLOG_SOCK, (uint8_t*)msg, strlen(msg), syslogAddr, 514);
if (res32 != strlen(msg)) {
disconnect(SYSLOG_SOCK);
state = 0;
}
2020-11-17 10:52:49 +01:00
break;
}
2020-11-17 10:50:23 +01:00
}
}
2020-11-17 10:36:45 +01:00
static int innerLogMsg(const char *pre, const char *post, bool syslogToo, const char *format, va_list vl) {
const static char SYSLOG_HEADER[] = "<133>1 ";
2020-11-17 11:28:43 +01:00
#define MAX_PREFIX_SIZE 20
2020-10-29 14:30:55 +01:00
int res = -1;
2020-11-17 11:28:43 +01:00
char msgBuffer[MSGBUFFER_SIZE+MAX_PREFIX_SIZE];
char *bufferStart;
2020-11-20 11:23:44 +01:00
2020-11-17 11:28:43 +01:00
memset(msgBuffer, 0, MSGBUFFER_SIZE+MAX_PREFIX_SIZE);
uint16_t syslogHeaderSize = strlen(SYSLOG_HEADER);
uint16_t preSize = (pre) ? strlen(pre) : 0;
uint16_t prefixSize = (syslogHeaderSize > preSize) ? syslogHeaderSize : preSize;
if (prefixSize > MAX_PREFIX_SIZE) {
return -1;
2020-11-03 17:30:01 +01:00
}
2020-11-17 11:28:43 +01:00
bufferStart = msgBuffer + prefixSize;
2020-10-29 20:50:50 +01:00
2020-11-17 11:28:43 +01:00
int vcnt = vsnprintf(bufferStart, MSGBUFFER_SIZE, format, vl);
2020-10-29 20:50:50 +01:00
if (vcnt < MSGBUFFER_SIZE) {
2020-11-17 12:02:20 +01:00
if (syslogToo) {
2020-11-17 11:28:43 +01:00
memcpy(bufferStart - syslogHeaderSize, SYSLOG_HEADER, syslogHeaderSize);
syslog(bufferStart - syslogHeaderSize);
}
if (pre) {
memcpy(bufferStart - preSize, pre, preSize);
}
2020-11-03 17:30:01 +01:00
if (post) {
2020-11-17 11:28:43 +01:00
strcat(bufferStart - preSize, post);
2020-11-03 17:30:01 +01:00
}
2020-11-17 15:15:28 +01:00
#ifdef LOGGER_OUTPUT_BY_INTERRUPT
HAL_NVIC_DisableIRQ(UART4_IRQn);
2020-11-17 15:15:28 +01:00
#endif //LOGGER_OUTPUT_BY_INTERRUPT
2020-11-17 11:28:43 +01:00
res = ringbufferPut(&logBuffer, (uint8_t*) (bufferStart - preSize), strlen(bufferStart - preSize));
2020-11-17 15:15:28 +01:00
#ifdef LOGGER_OUTPUT_BY_INTERRUPT
HAL_NVIC_EnableIRQ(UART4_IRQn);
2020-11-17 15:15:28 +01:00
#endif //LOGGER_OUTPUT_BY_INTERRUPT
2020-11-17 15:15:28 +01:00
#ifdef LOGGER_OUTPUT_BY_INTERRUPT
debugTxCpltCallback(NULL);
2020-11-20 11:23:44 +01:00
#endif //LOGGER_OUTPUT_BY_INTERRUPT
2020-10-28 19:40:08 +01:00
}
2020-11-17 11:28:43 +01:00
2020-10-29 14:30:55 +01:00
return res;
2020-10-28 19:40:08 +01:00
}
2020-11-03 17:30:01 +01:00
int logMsg(const char *format, ...) {
va_list vl;
va_start(vl, format);
2020-11-17 10:36:45 +01:00
int res = innerLogMsg(NULL, "\r\n", false, format, vl);
2020-11-03 17:30:01 +01:00
va_end(vl);
return res;
}
2020-11-17 12:01:15 +01:00
int coloredMsg(const t_logColor color, bool syslogToo, const char *format, ...) {
2020-11-03 17:57:03 +01:00
const static char POST[] = "\x1b[0m\r\n";
const static char HIGH[] = "\x1b[1m";
const static char RED[] = "\x1b[31;1m";
const static char GREEN[] = "\x1b[32;1m";
const static char BLUE[] = "\x1b[34;1m";
2020-11-03 18:02:36 +01:00
const static char YELLOW[] = "\x1b[33;1m";
2020-11-03 17:57:03 +01:00
const char *pre = NULL;
switch (color) {
case LOG_HIGH:
pre = HIGH;
break;
case LOG_RED:
pre = RED;
break;
case LOG_BLUE:
pre = BLUE;
break;
case LOG_GREEN:
pre = GREEN;
break;
2020-11-03 18:02:36 +01:00
case LOG_YELLOW:
pre = YELLOW;
break;
2020-11-20 11:23:44 +01:00
case LOG_NORMAL:
pre = NULL;
break;
2020-11-03 17:57:03 +01:00
}
va_list vl;
va_start(vl, format);
2020-11-17 12:01:15 +01:00
int res = innerLogMsg(pre, POST, syslogToo, format, vl);
2020-11-03 17:57:03 +01:00
va_end(vl);
return res;
}
2020-11-03 17:30:01 +01:00