#include "stdint.h" #include #include "stdbool.h" #include "string.h" #include "sys_log.h" #include "sys_common.h" #define FW_LOG_DATA_LEN 1536 #define FW_LOG_FILE_NAME_LEN 32 #define MAX_BUF 128 static char s_cLogBuf[FW_LOG_DATA_LEN]; static uint8_t s_ucLogOut = true; ; static uint8_t s_ucLogLevel = FW_INFO_LEVEL; static int8_t* s_pcLogCacheFileName = NULL; static int8_t s_pcLogFileName[FW_LOG_FILE_NAME_LEN]; static int s_siLogFileLine = 0; log_print_callback_fp g_s_log_print_callback; int FW_GetFileLine(const int8_t* __file__, const int __line__) { s_siLogFileLine = __line__; if (s_pcLogCacheFileName != __file__) { int i = 0; int8_t * p = NULL; s_pcLogCacheFileName = (int8_t*)__file__; p = SYS_Strstr(__file__, (int8_t*)".c"); while (p != __file__) { if (*p == '\\' || *p == '/') { p ++; break; } p --; } while (*p != '\0') { if (i < FW_LOG_FILE_NAME_LEN) { s_pcLogFileName[i++] = *p++; } else { s_pcLogFileName[0] = 0; i = 0; break; } } s_pcLogFileName[i] = 0; } return true; } static void FW_Log(int level, const char* fmt, va_list ap) { int8_t level_text[10] = {0}; memset(s_cLogBuf, 0, FW_LOG_DATA_LEN); switch(level) { case FW_DEBUG_LEVEL: SYS_Strcpy(level_text, (int8_t*)"D"); break; case FW_INFO_LEVEL: SYS_Strcpy(level_text, (int8_t*)"I"); break; case FW_WARN_LEVEL: SYS_Strcpy(level_text, (int8_t*)"W"); break; case FW_ERROR_LEVEL: SYS_Strcpy(level_text, (int8_t*)"E"); break; default: SYS_Strcpy(level_text, (int8_t*)"F"); break; } HAL_Sprintf(s_cLogBuf, (const char* )"[%s][%s:%d]", level_text, s_pcLogFileName, s_siLogFileLine); HAL_Vsnprintf(s_cLogBuf + strlen(s_cLogBuf), MAX_BUF + 256, fmt, ap); strcat(s_cLogBuf, (const char*)"\r\n"); g_s_log_print_callback((uint8_t* )s_cLogBuf, strlen(s_cLogBuf)); } void _FW_LogDebug(const char* fmt, ...) { va_list ap; if ((s_ucLogLevel >= FW_DEBUG_LEVEL) && s_ucLogOut) { va_start(ap, fmt); FW_Log(FW_DEBUG_LEVEL, fmt, ap); va_end(ap); } } void _FW_LogInfo(const char* fmt, ...) { va_list ap; if ((s_ucLogLevel >= FW_INFO_LEVEL) && s_ucLogOut) { va_start(ap, fmt); FW_Log(FW_INFO_LEVEL, fmt, ap); va_end(ap); } } void _FW_LogWarn(const char* fmt, ...) { va_list ap; if ((s_ucLogLevel >= FW_WARN_LEVEL) && s_ucLogOut) { va_start(ap, fmt); FW_Log(FW_WARN_LEVEL, fmt, ap); va_end(ap); } } void _FW_LogError(const char* fmt, ...) { va_list ap; if ((s_ucLogLevel >= FW_ERROR_LEVEL) && s_ucLogOut) { va_start(ap, fmt); FW_Log(FW_ERROR_LEVEL, fmt, ap); va_end(ap); } } void _FW_LogFatal(const char* fmt, ...) { va_list ap; if ((s_ucLogLevel >= FW_FATAL_LEVEL) && s_ucLogOut) { va_start(ap, fmt); FW_Log(FW_FATAL_LEVEL, fmt, ap); va_end(ap); } } void Sys_LogPrintCallbackRegister(log_print_callback_fp fp) { if(NULL != fp) { g_s_log_print_callback = fp; } }