blob: 910a401c70eef57cf482a75e6d869b70d89c3010 [file] [log] [blame]
/**
******************************************************************************
* @file stm_logging.c
* @author MCD Application Team
* @brief This file contains all the defines and functions used for logging
* on Application examples.
*
******************************************************************************
* @attention
*
* Copyright (c) 2019-2021 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/**
* @file
* This file implements logging functions to used in Application examples.
*
*/
#include <ctype.h>
#include <inttypes.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "app_conf.h"
#include "stm_logging.h"
#define LOG_PARSE_BUFFER_SIZE 256U
#define LOG_TIMESTAMP_ENABLE 0
#define LOG_REGION_ENABLE 1U
#define LOG_RTT_COLOR_ENABLE 1U
#if (LOG_RTT_COLOR_ENABLE == 1U)
#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
#define RTT_COLOR_CODE_RED "\x1b[0;91m"
#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
#else /* LOG_RTT_COLOR_ENABLE == 1 */
#define RTT_COLOR_CODE_DEFAULT ""
#define RTT_COLOR_CODE_RED ""
#define RTT_COLOR_CODE_GREEN ""
#define RTT_COLOR_CODE_YELLOW ""
#define RTT_COLOR_CODE_CYAN ""
#endif /* LOG_RTT_COLOR_ENABLE == 1 */
#if (CFG_DEBUG_TRACE != 0)
/**
* Function for outputting code region string.
*
* @param[inout] aLogString Pointer to log buffer.
* @param[in] aMaxSize Maximum size of log buffer.
* @param[in] otLogRegion The region ID.
*
* @returns String with a log level color value.
*/
static inline uint16_t logRegion(char * aLogString, uint16_t aMaxSize, appliLogRegion_t aLogRegion)
{
char logRegionString[30U];
switch (aLogRegion)
{
case APPLI_LOG_REGION_GENERAL:
strcpy(logRegionString, "[M4 APPLICATION]");
break;
case APPLI_LOG_REGION_OPENTHREAD_API:
strcpy(logRegionString, "[M4 OPENTHREAD API]");
break;
case APPLI_LOG_REGION_OT_API_LINK:
strcpy(logRegionString, "[M4 LINK API]");
break;
case APPLI_LOG_REGION_OT_API_INSTANCE:
strcpy(logRegionString, "[M4 INSTANCE API]");
break;
case APPLI_LOG_REGION_OT_API_MESSAGE:
strcpy(logRegionString, "[M4 MESSAGE API]");
break;
default:
strcpy(logRegionString, "[M4]");
break;
}
return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
}
#endif /* CFG_DEBUG_TRACE */
#if (LOG_RTT_COLOR_ENABLE == 1U)
#if (CFG_DEBUG_TRACE != 0)
/**
* Function for getting color of a given level log.
*
* @param[in] aLogLevel The log level.
*
* @returns String with a log level color value.
*/
static inline const char * levelToString(appliLogLevel_t aLogLevel)
{
switch (aLogLevel)
{
case LOG_LEVEL_CRIT:
return RTT_COLOR_CODE_RED;
case LOG_LEVEL_WARN:
return RTT_COLOR_CODE_YELLOW;
case LOG_LEVEL_INFO:
return RTT_COLOR_CODE_GREEN;
case LOG_LEVEL_DEBG:
default:
return RTT_COLOR_CODE_DEFAULT;
}
}
#endif /* CFG_DEBUG_TRACE */
#if (CFG_DEBUG_TRACE != 0)
/**
* Function for printing log level.
*
* @param[inout] aLogString Pointer to log buffer.
* @param[in] aMaxSize Maximum size of log buffer.
* @param[in] aLogLevel Log level.
*
* @returns Number of bytes successfully written to the log buffer.
*/
static inline uint16_t logLevel(char * aLogString, uint16_t aMaxSize, appliLogLevel_t aLogLevel)
{
return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
}
#endif /* CFG_DEBUG_TRACE */
#endif /* LOG_RTT_COLOR_ENABLE */
#if (LOG_TIMESTAMP_ENABLE == 1U)
/**
* Function for printing actual timestamp.
*
* @param[inout] aLogString Pointer to the log buffer.
* @param[in] aMaxSize Maximum size of the log buffer.
*
* @returns Number of bytes successfully written to the log buffer.
*/
static inline uint16_t logTimestamp(char * aLogString, uint16_t aMaxSize)
{
return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT, otPlatAlarmMilliGetNow());
}
#endif /* LOG_TIMESTAMP_ENABLE */
/**
* Function for printing application log
*
* @param[in] aLogLevel Log level.
* @param[in] aLogRegion The region ID.
* @param[in] aFormat User string format.
*
* @returns Number of bytes successfully written to the log buffer.
*/
void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char * aFormat, ...)
{
#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
uint16_t length = 0;
char logString[LOG_PARSE_BUFFER_SIZE + 1U];
#if (LOG_TIMESTAMP_ENABLE == 1U)
length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
#endif
#if (LOG_RTT_COLOR_ENABLE == 1U)
/* Add level information */
length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length), aLogLevel);
#endif
#if (LOG_REGION_ENABLE == 1U)
/* Add Region information */
length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length), aLogRegion);
#endif
/* Parse user string */
va_list paramList;
va_start(paramList, aFormat);
length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length), aFormat, paramList);
logString[length++] = '\r';
logString[length++] = '\n';
logString[length++] = 0;
va_end(paramList);
if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
{
printf("%s", logString);
}
else
{
/* Print nothing */
}
#endif /* CFG_DEBUG_TRACE */
}