Fixed ISerialBus interface and added device and register address fields so that future i2c and SPI devices can be addressed, to. Added i2c HAL. Tested, working.
The update on the interface required FunctionStatus and the logger to be updated, too
This commit is contained in:
@@ -1,83 +0,0 @@
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
/// \file gpio.h
|
||||
/// \brief File description
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// vbchaos software design
|
||||
//
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
/// $Revision: $
|
||||
/// $Author: $
|
||||
/// $Date: $
|
||||
// (c) 2023 vbchaos
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef MAIN_INC_GPIO_H_
|
||||
#define MAIN_INC_GPIO_H_
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Include files
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// CompilerIncludes
|
||||
// All include files that are provided by the compiler directly
|
||||
|
||||
|
||||
|
||||
// ProjectIncludes
|
||||
// All include files that are provided by the project
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Constant and macro definitions
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Type definitions.
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GPIO_DIRECTION_INPUT = 0,
|
||||
GPIO_DIRECTION_OUTPUT = 1
|
||||
} GPIO_Direction_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GPIO_VALUE_LOW = 0,
|
||||
GPIO_VALUE_HIGH = 1
|
||||
} GPIO_Value_t;
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Function declarations
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
class GPIO
|
||||
{
|
||||
public:
|
||||
|
||||
GPIO(int number, GPIO_Direction_t direction);
|
||||
|
||||
bool SetOutput(GPIO_Value_t value);
|
||||
|
||||
GPIO_Value_t GetInput(void);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
int number;
|
||||
|
||||
GPIO_Direction_t direction;
|
||||
|
||||
GPIO_Value_t value = GPIO_VALUE_LOW;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* MAIN_INC_GPIO_H_ */
|
||||
@@ -1,196 +0,0 @@
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
/// \file logger.h
|
||||
/// \brief File description
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// vbchaos software design
|
||||
//
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
/// $Revision: $
|
||||
/// $Author: $
|
||||
/// $Date: $
|
||||
// (c) 2023 vbchaos
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef MAIN_INC_LOGGER_H_
|
||||
#define MAIN_INC_LOGGER_H_
|
||||
|
||||
/**
|
||||
* Logger implementation
|
||||
* \defgroup Logger
|
||||
* \brief Implementation of a non-blocking logger for debug purpose
|
||||
* \ingroup Platform
|
||||
*
|
||||
* A non-blocking logger that implements its own task with very low (unimportant)
|
||||
* priority
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Include files
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// CompilerIncludes
|
||||
// All include files that are provided by the compiler directly
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
// ProjectIncludes
|
||||
// All include files that are provided by the project
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "freertos/queue.h"
|
||||
#include "freertos/semphr.h"
|
||||
|
||||
#include "driver/uart_select.h"
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Constant and macro definitions
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_ERROR(...) \
|
||||
Logger::Logger_log(__FILE__, __func__, __LINE__, LOGTYPE_ERROR, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs a success
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_SUCCESS(...) \
|
||||
Logger::Logger_log(__FILE__, __func__, __LINE__, LOGTYPE_SUCCESS, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_WARNING(...) \
|
||||
Logger::Logger_log(__FILE__, __func__, __LINE__, LOGTYPE_WARNING, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_INFO(...) \
|
||||
Logger::Logger_log(__FILE__, __func__, __LINE__, LOGTYPE_INFO, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_DEBUG(...) \
|
||||
Logger::Logger_log(__FILE__, __func__, __LINE__, LOGTYPE_DEBUG, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_PRINT(...) \
|
||||
Logger::Logger_log("", "", 0, LOGTYPE_PRINT, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_ERROR_ISR(...) \
|
||||
Logger::Logger_logISR(__FILE__, __func__, __LINE__, LOGTYPE_ERROR, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs a success
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_SUCCESS_ISR(...) \
|
||||
Logger::Logger_logISR(__FILE__, __func__, __LINE__, LOGTYPE_ERROR, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_WARNING_ISR(...) \
|
||||
Logger::Logger_logISR(__FILE__, __func__, __LINE__, LOGTYPE_WARNING, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_INFO_ISR(...) \
|
||||
Logger::Logger_logISR(__FILE__, __func__, __LINE__, LOGTYPE_INFO, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_DEBUG_ISR(a, ...) \
|
||||
Logger::Logger_logISR(a, __FILE__, __func__, __LINE__, LOGTYPE_DEBUG, ##__VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Logs an error
|
||||
* \memberof Logger
|
||||
*/
|
||||
#define LOGGER_PRINT_ISR(a, ...) \
|
||||
Logger::Logger_logISR(a, "", "", 0, LOGTYPE_PRINT, ##__VA_ARGS__)
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Type definitions.
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LOGTYPE_PRINT, /**< Raw print */
|
||||
LOGTYPE_DEBUG, /**< Debug information only; will not be stored on SD-card */
|
||||
LOGTYPE_INFO, /**< Informational messages of important events */
|
||||
LOGTYPE_WARNING, /**< Recoverable fault */
|
||||
LOGTYPE_SUCCESS, /**< A specific success message */
|
||||
LOGTYPE_ERROR /**< Unrecoverable fault */
|
||||
} LogType;
|
||||
|
||||
|
||||
struct LogQueueItem
|
||||
{
|
||||
char fileName[32];
|
||||
char functionName[32];
|
||||
char context[128];
|
||||
int lineNumber;
|
||||
LogType logType;
|
||||
};
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Function declarations
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class Logger
|
||||
{
|
||||
public:
|
||||
static uart_port_t uartPort;
|
||||
static int queuesize;
|
||||
static QueueHandle_t logQueue;
|
||||
|
||||
Logger(int queuesize, uart_port_t uartPort);
|
||||
|
||||
static void Logger_log(const char* fileName, const char* functionName, int lineNumber, LogType logType, const char* format, ...);
|
||||
|
||||
static void Logger_logISR(struct Logger* self, const char* fileName, const char* functionName, int lineNumber, LogType logType, const char* context);
|
||||
|
||||
private:
|
||||
static TaskHandle_t logTaskHandle;
|
||||
|
||||
static void loggerTask(void* parameters);
|
||||
|
||||
static void composeLogQueueItem(struct LogQueueItem* logQueueItem, const char* fileName, const char* functionName,
|
||||
int lineNumber, LogType logType, const char* context);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* MAIN_INC_LOGGER_H_ */
|
||||
@@ -1,106 +0,0 @@
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
/// \file gpio.cpp
|
||||
/// \brief Description
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// vbchaos software design
|
||||
//
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
/// $Revision: $
|
||||
/// $Author: $
|
||||
/// $Date: $
|
||||
// (c) 2023 vbchaos
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Include files
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
#include <gpio.h>
|
||||
#include "driver/gpio.h"
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Constant and macro definitions
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Type definitions
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// File-scope variables
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Function declarations
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Function definitions
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
GPIO::GPIO(int number, GPIO_Direction_t direction)
|
||||
{
|
||||
this->number = number;
|
||||
this->direction = direction;
|
||||
|
||||
//zero-initialize the config structure.
|
||||
gpio_config_t io_conf = {};
|
||||
//disable interrupt
|
||||
io_conf.intr_type = GPIO_INTR_DISABLE;
|
||||
//set as output mode
|
||||
io_conf.mode = (this->direction == GPIO_DIRECTION_OUTPUT) ? GPIO_MODE_OUTPUT : GPIO_MODE_INPUT;
|
||||
//bit mask of the pins that you want to set
|
||||
io_conf.pin_bit_mask = (1ULL << this->number);
|
||||
//disable pull-down mode
|
||||
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
|
||||
//disable pull-up mode
|
||||
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
|
||||
//configure GPIO with the given settings
|
||||
ESP_ERROR_CHECK(gpio_config(&io_conf));
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool GPIO::SetOutput(GPIO_Value_t value)
|
||||
{
|
||||
bool returnValue = false;
|
||||
|
||||
if (this->direction == GPIO_DIRECTION_OUTPUT)
|
||||
{
|
||||
ESP_ERROR_CHECK(gpio_set_level((gpio_num_t)this->number, (uint32_t)value));
|
||||
this->value = value;
|
||||
returnValue = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
returnValue = false;
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
GPIO_Value_t GPIO::GetInput(void)
|
||||
{
|
||||
if (gpio_get_level((gpio_num_t)this->number))
|
||||
{
|
||||
this->value = GPIO_VALUE_HIGH;
|
||||
}
|
||||
else
|
||||
{
|
||||
this->value = GPIO_VALUE_LOW;
|
||||
}
|
||||
|
||||
return this->value;
|
||||
}
|
||||
|
||||
@@ -1,254 +0,0 @@
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
/// \file logger.cpp
|
||||
/// \brief Description
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// vbchaos software design
|
||||
//
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
/// $Revision: $
|
||||
/// $Author: $
|
||||
/// $Date: $
|
||||
// (c) 2023 vbchaos
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Include files
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "logger.h"
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Constant and macro definitions
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
#define ENABLE_SERIAL_LOGGING
|
||||
//#undef ENABLE_SERIAL_LOGGING
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Type definitions
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// File-scope variables
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Function declarations
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
// Function definitions
|
||||
// --------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
TaskHandle_t Logger::logTaskHandle = NULL;
|
||||
uart_port_t Logger::uartPort = 0;
|
||||
QueueHandle_t Logger::logQueue = NULL;
|
||||
int Logger::queuesize = 0;
|
||||
|
||||
Logger::Logger(int queuesize, uart_port_t uartPort)
|
||||
{
|
||||
Logger::uartPort = uartPort;
|
||||
Logger::queuesize = queuesize;
|
||||
logQueue = xQueueCreate(queuesize, sizeof(struct LogQueueItem));
|
||||
|
||||
xTaskCreate(loggerTask, (const char*)"loggerTask", 3072, NULL, 3, &logTaskHandle);
|
||||
|
||||
}
|
||||
|
||||
void Logger::Logger_log(const char* fileName, const char* functionName, int lineNumber, LogType logType, const char* format, ...)
|
||||
{
|
||||
#if defined(ENABLE_SERIAL_LOGGING)
|
||||
static int nrLostMessages = 0;
|
||||
static bool overflowRecovery = false;
|
||||
int nrOfMessages;
|
||||
struct LogQueueItem logQueueItem;
|
||||
va_list ap;
|
||||
|
||||
nrOfMessages = uxQueueMessagesWaiting(Logger::logQueue);
|
||||
|
||||
if((nrOfMessages == queuesize - 1) && !overflowRecovery)
|
||||
{
|
||||
// Queue almost full, only one entry left. Log a warning instead
|
||||
composeLogQueueItem(&logQueueItem, __FILE__, __func__, __LINE__, LOGTYPE_WARNING, "Log queue overflow");
|
||||
(void)xQueueSend(logQueue, &logQueueItem, 0);
|
||||
|
||||
overflowRecovery = true;
|
||||
nrLostMessages = 1;
|
||||
}
|
||||
else if((nrOfMessages == 0) && overflowRecovery)
|
||||
{
|
||||
// Queue empty again after an overflow
|
||||
char str[128];
|
||||
snprintf(str, sizeof(str) / sizeof(str[0]), "%d messages lost", nrLostMessages);
|
||||
composeLogQueueItem(&logQueueItem, __FILE__, __func__, __LINE__, LOGTYPE_WARNING, str);
|
||||
(void)xQueueSend(logQueue, &logQueueItem, 0);
|
||||
|
||||
overflowRecovery = false;
|
||||
}
|
||||
else if(!overflowRecovery)
|
||||
{
|
||||
// Normal behaviour, queue not full
|
||||
char str[128];
|
||||
va_start(ap, format);
|
||||
vsnprintf(str, sizeof(str) / sizeof(str[0]), format, ap);
|
||||
va_end(ap);
|
||||
|
||||
composeLogQueueItem(&logQueueItem, fileName, functionName, lineNumber, logType, str);
|
||||
(void)xQueueSend(logQueue, &logQueueItem, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Count number of lost messages
|
||||
++nrLostMessages;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void Logger_logISR(struct Logger* self, const char* fileName, const char* functionName, int lineNumber, LogType logType, const char* context)
|
||||
{
|
||||
#if defined(ENABLE_LOGGING)
|
||||
if (self->initialized)
|
||||
{
|
||||
struct LogQueueItem logQueueItem;
|
||||
portBASE_TYPE higherPriorityTaskWoken = pdFALSE;
|
||||
|
||||
composeLogQueueItem(&logQueueItem, fileName, functionName, lineNumber, logType, context);
|
||||
|
||||
if(xQueueSendFromISR(self->logQueue, &logQueueItem, &higherPriorityTaskWoken) != pdTRUE)
|
||||
{
|
||||
// Queue failed
|
||||
}
|
||||
|
||||
portEND_SWITCHING_ISR(higherPriorityTaskWoken);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#if defined(ENABLE_SERIAL_LOGGING)
|
||||
void Logger::composeLogQueueItem(struct LogQueueItem* logQueueItem, const char* fileName, const char* functionName,
|
||||
int lineNumber, LogType logType, const char* context)
|
||||
{
|
||||
const size_t fileNameSize = sizeof(logQueueItem->fileName) / sizeof(logQueueItem->fileName[0]);
|
||||
const size_t functionNameSize = sizeof(logQueueItem->functionName) / sizeof(logQueueItem->functionName[0]);
|
||||
const size_t contextSize = sizeof(logQueueItem->context) / sizeof(logQueueItem->context[0]);
|
||||
|
||||
logQueueItem->logType = logType;
|
||||
strncpy(&(logQueueItem->context[0]), context, contextSize);
|
||||
logQueueItem->context[contextSize - 1] = '\0';
|
||||
|
||||
if(logType != LOGTYPE_PRINT)
|
||||
{
|
||||
int fileNameIndex = 0;
|
||||
|
||||
// If filename starts with "src/", strip this part
|
||||
if((fileName[0] == 's') &&
|
||||
(fileName[1] == 'r') &&
|
||||
(fileName[2] == 'c') &&
|
||||
(fileName[3] == '/'))
|
||||
{
|
||||
fileNameIndex = 4;
|
||||
}
|
||||
|
||||
// It is known that the strncpy use can potentially truncate the source string, meaning
|
||||
// that the target string size is smaller then the original string
|
||||
// This is not a problem in this particular case, so the compiler warning is disabled
|
||||
// for this situation
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wstringop-truncation"
|
||||
// All logtypes except LOGTYPE_PRINT need filename, functionname and linenumber.
|
||||
strncpy(&(logQueueItem->fileName[0]), &fileName[fileNameIndex], fileNameSize);
|
||||
strncpy(&(logQueueItem->functionName[0]), functionName, functionNameSize);
|
||||
#pragma GCC diagnostic pop
|
||||
logQueueItem->lineNumber = lineNumber;
|
||||
|
||||
// Fix terminating null byte in strncpy in case string to be copied is too long
|
||||
logQueueItem->fileName[fileNameSize - 1] = '\0';
|
||||
logQueueItem->functionName[functionNameSize - 1] = '\0';
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void Logger::loggerTask(void* parameters)
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
struct LogQueueItem logQueueItem;
|
||||
|
||||
xQueueReceive(logQueue, &logQueueItem, portMAX_DELAY);
|
||||
|
||||
if(logQueueItem.logType == LOGTYPE_PRINT)
|
||||
{
|
||||
// Raw print
|
||||
#if defined(ENABLE_SERIAL_LOGGING)
|
||||
uart_write_bytes(uartPort, logQueueItem.context, strlen(logQueueItem.context));
|
||||
#endif
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(ENABLE_SERIAL_LOGGING)
|
||||
char str[256];
|
||||
char* vt100Prefix = "";
|
||||
const char* vt100Postfix = "\033[0m";
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_SERIAL_LOGGING)
|
||||
if(logQueueItem.logType == LOGTYPE_INFO)
|
||||
{
|
||||
vt100Prefix = "\033[33m";
|
||||
}
|
||||
else if(logQueueItem.logType == LOGTYPE_WARNING)
|
||||
{
|
||||
vt100Prefix = "\033[35m";
|
||||
}
|
||||
else if(logQueueItem.logType == LOGTYPE_ERROR)
|
||||
{
|
||||
vt100Prefix = "\033[31m";
|
||||
}
|
||||
else if(logQueueItem.logType == LOGTYPE_SUCCESS)
|
||||
{
|
||||
vt100Prefix = "\033[32m";
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int seconds = 0;
|
||||
|
||||
#if defined(ENABLE_SERIAL_LOGGING)
|
||||
// Formatted print
|
||||
snprintf(str, sizeof(str) / sizeof(str[0]), "%s[%s] %09d %s, %s, %d: %s%s\n\r",
|
||||
vt100Prefix,
|
||||
(logQueueItem.logType == LOGTYPE_DEBUG) ? "DBG" :
|
||||
(logQueueItem.logType == LOGTYPE_INFO) ? "INF" :
|
||||
(logQueueItem.logType == LOGTYPE_SUCCESS) ? "SCS" :
|
||||
(logQueueItem.logType == LOGTYPE_WARNING) ? "WRN" : "ERR",
|
||||
seconds,
|
||||
logQueueItem.fileName,
|
||||
logQueueItem.functionName,
|
||||
logQueueItem.lineNumber,
|
||||
logQueueItem.context,
|
||||
vt100Postfix);
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_SERIAL_LOGGING)
|
||||
uart_write_bytes(uartPort, str, strlen(str));
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
Reference in New Issue
Block a user