diff --git a/include/HDLog.h b/include/HDLog.h index fc4b5b7..f9e5fe0 100644 --- a/include/HDLog.h +++ b/include/HDLog.h @@ -86,7 +86,7 @@ #endif #define InitLogData() HDLogInit(NULL) -enum eLogLevel { +typedef enum eLogLevel { kLogLevelSwitch = 0, ///< 日志开关 kLogLevelColor, ///< 彩色日志 kLogLevelDebug, ///< 常规调试信息 @@ -96,7 +96,19 @@ enum eLogLevel { kLogLevelHeap, ///< 打印堆大小信息 kLogLevelTrace, ///< trace级别日志 kLogLevelMax, -}; +} eLogLevel; + +typedef uint8_t (*HDLogFlashOpt_t)(uint8_t isWrite, eLogLevel level, uint8_t value); +/** + * @brief 设置日志flash读写调用, 注: 配置后必须调用 HDLogOptFlashInit, 否则日志项将处于全开状态 + * @param call 日志flash读写调用 + */ +void HDLogSetOptFlashCall(HDLogFlashOpt_t call); + +/** + * @brief 日志flash初始化, 调用后触发日志flash回调 + */ +void HDLogOptFlashInit(); /** * @brief 日志初始化 diff --git a/src/HDLog.c b/src/HDLog.c index 82f5156..e710461 100644 --- a/src/HDLog.c +++ b/src/HDLog.c @@ -57,6 +57,7 @@ static HBIT_DEFINE(sLogItem, kLogLevelMax); static uint32_t (*sGetTime)() = NULL; static HDLogGetTaskType_t sGetCurrTask = NULL; static HDLogGetStackSizeType_t sGetCurrStackSize = NULL; +static HDLogFlashOpt_t sFlashCall = NULL; #if USE_SYS_CHECK_HEAP static HDLogGetStackSizeType_t sGetCurrHeapSize = NULL; #endif @@ -190,20 +191,56 @@ static void LogShell(HSHELL_FUNC_ARGS) uint8_t lastStatus = HBitGet(sLogItem, key); HBitSet(sLogItem, key, arg1); HSHELL_PRINTFL("logStatus[%d]->[%d]", lastStatus, HBitGet(sLogItem, key)); + if (sFlashCall != NULL) + { + sFlashCall(1, key, arg1); + } +} + +void HDLogSetOptFlashCall(HDLogFlashOpt_t call) +{ + sFlashCall = call; +} + +void HDLogOptFlashInit() +{ + if (sFlashCall == NULL) + { + return ; + } + + for (int i = 0; i < kLogLevelMax; ++i) + { + uint8_t enable = sFlashCall(0, i, 0); + HBitSet(sLogItem, i, enable); + } } void HDLogInit(uint32_t (*getTime)()) { sGetTime = getTime; HSHellRegister(sLogMatch, sizeof(sLogMatch) / sizeof(HShellMatch), LogShell, 1); - HBitSet(sLogItem, kLogLevelSwitch, 1); - HBitSet(sLogItem, kLogLevelDebug, 1); - HBitSet(sLogItem, kLogLevelError, 1); - HBitSet(sLogItem, kLogLevelHex, 0); - HBitSet(sLogItem, kLogLevelStack, 1); + if (sFlashCall == NULL) + { + HBitSet(sLogItem, kLogLevelSwitch, 1); + HBitSet(sLogItem, kLogLevelDebug, 1); + HBitSet(sLogItem, kLogLevelError, 1); + HBitSet(sLogItem, kLogLevelHex, 0); + HBitSet(sLogItem, kLogLevelStack, 1); #ifdef USE_RTOS - HBitSet(sLogItem, kLogLevelHeap, 1); + HBitSet(sLogItem, kLogLevelHeap, 1); #endif + } + else + { + // 如果配置了flash调用, 全部打开, 延后读取, 避免flash未初始化 + for (int i = 0; i < kLogLevelMax; ++i) + { + HBitSet(sLogItem, i, 1); + } + + HBitSet(sLogItem, kLogLevelColor, 0); + } #if USE_RTOS_LOG_LOCK if (sLogMutex == NULL)