feat: "add log flies"

This commit is contained in:
ShallowGreen123
2022-10-01 22:55:04 +08:00
parent 0300e33fa2
commit 843c35ff18
7 changed files with 743 additions and 10 deletions

View File

@@ -54,8 +54,8 @@
<ClCompile Include="LVGL.Simulator.cpp" />
<ClCompile Include="lvgl_mydemo\data\dataModel.c" />
<ClCompile Include="lvgl_mydemo\data\gui_scr_mgr.c" />
<ClCompile Include="lvgl_mydemo\log\drv_log.c" />
<ClCompile Include="lvgl_mydemo\log\lib_log.c" />
<ClCompile Include="lvgl_mydemo\lib\drv_log.c" />
<ClCompile Include="lvgl_mydemo\lib\lib_log.c" />
<ClCompile Include="lvgl_mydemo\lvgl_app.c" />
<ClCompile Include="lvgl_mydemo\screen\gui_main_scr.c" />
<ClCompile Include="lvgl_mydemo\screen\gui_test1_scr.c" />

View File

@@ -39,14 +39,14 @@
<ClCompile Include="lvgl_mydemo\screen\gui_test1_scr.c">
<Filter>lvgl_mydemo\srceen</Filter>
</ClCompile>
<ClCompile Include="lvgl_mydemo\log\drv_log.c">
<Filter>lvgl_mydemo\log</Filter>
</ClCompile>
<ClCompile Include="lvgl_mydemo\data\gui_scr_mgr.c">
<Filter>lvgl_mydemo\data</Filter>
</ClCompile>
<ClCompile Include="lvgl_mydemo\log\lib_log.c">
<Filter>lvgl_mydemo\log</Filter>
<ClCompile Include="lvgl_mydemo\lib\drv_log.c">
<Filter>lvgl_mydemo\lib</Filter>
</ClCompile>
<ClCompile Include="lvgl_mydemo\lib\lib_log.c">
<Filter>lvgl_mydemo\lib</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@@ -80,8 +80,8 @@
<Filter Include="lvgl_mydemo\assert\image">
<UniqueIdentifier>{5aec906d-b671-4778-9999-6dcadc840600}</UniqueIdentifier>
</Filter>
<Filter Include="lvgl_mydemo\log">
<UniqueIdentifier>{7c5bcdd0-7a51-46f7-804e-ed1f4371645d}</UniqueIdentifier>
<Filter Include="lvgl_mydemo\lib">
<UniqueIdentifier>{125c5bdc-13e9-45ed-bf0d-f844505c20ca}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,59 @@
/************************************************************************
* FilePath : drv_log.c
* Author : GX.Duan
* Date : 2022-09-21 22:22:33
* LastEditTime : 2022-09-30 22:29:58
* LastEditors : ShallowGreen123 2608653986@qq.com
* Copyright (c): 2022 by GX.Duan, All Rights Reserved.
* Github : https://github.com/ShallowGreen123/lvgl_mydemo
************************************************************************/
#define __DRV_LOG_C__
/*********************************************************************************
* INCLUDES
* *******************************************************************************/
#include "drv_log.h"
/*********************************************************************************
* DEFINES
* *******************************************************************************/
/*********************************************************************************
* MACROS
* *******************************************************************************/
/*********************************************************************************
* TYPEDEFS
* *******************************************************************************/
/*********************************************************************************
* STATIC FUNCTION
* *******************************************************************************/
/*********************************************************************************
* GLOBAL FUNCTION
* *******************************************************************************/
void Drv_LogPrintf(void *str)
{
printf("\033[1;32m%s\n", (uint8_t *)str);
}
void Drv_LogColorPrintf(void *str, void *prefix)
{
char type = *((char *)prefix + 1);
char *color_str = NULL;
/* clang-format off */
switch (type) {
case 'V': printf(RTT_CTRL_TEXT_BRIGHT_YELLOW); break;
case 'D': printf(RTT_CTRL_TEXT_BRIGHT_GREEN); break;
case 'I': printf(RTT_CTRL_TEXT_BRIGHT_WHITE); break;
case 'W': printf(RTT_CTRL_TEXT_BRIGHT_YELLOW); break;
case 'E': printf(RTT_CTRL_TEXT_BRIGHT_RED); break;
case 'X' :printf(RTT_CTRL_TEXT_BRIGHT_MAGENTA); break;
default:
break;
}
/* clang-format on */
printf("%s\n", (uint8_t *)str);
printf(RTT_CTRL_RESET);
}

View File

@@ -0,0 +1,81 @@
/************************************************************************
* FilePath : drv_log.h
* Author : GX.Duan
* Date : 2022-09-21 22:22:43
* LastEditTime : 2022-10-01 22:23:17
* LastEditors : ShallowGreen123 2608653986@qq.com
* Copyright (c): 2022 by GX.Duan, All Rights Reserved.
* Github : https://github.com/ShallowGreen123/lvgl_mydemo
************************************************************************/
#ifndef DRV_LOG_H
#define DRV_LOG_H
/*********************************************************************************
* INCLUDES
* *******************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdint.h>
/*********************************************************************************
* DEFINES
* *******************************************************************************/
#ifdef __DRV_LOG_C__
# define DEF_EXTERN
#else
# define DEF_EXTERN extern
#endif
/*********************************************************************************
* MACROS
* *******************************************************************************/
#define RTT_CTRL_RESET "\x1B[0m" // Reset to default colors
#define RTT_CTRL_CLEAR "\x1B[2J" // Clear screen, reposition cursor to top left
#define RTT_CTRL_TEXT_BLACK "\x1B[2;30m"
#define RTT_CTRL_TEXT_RED "\x1B[2;31m"
#define RTT_CTRL_TEXT_GREEN "\x1B[2;32m"
#define RTT_CTRL_TEXT_YELLOW "\x1B[2;33m"
#define RTT_CTRL_TEXT_BLUE "\x1B[2;34m"
#define RTT_CTRL_TEXT_MAGENTA "\x1B[2;35m"
#define RTT_CTRL_TEXT_CYAN "\x1B[2;36m"
#define RTT_CTRL_TEXT_WHITE "\x1B[2;37m"
#define RTT_CTRL_TEXT_BRIGHT_BLACK "\x1B[1;30m"
#define RTT_CTRL_TEXT_BRIGHT_RED "\x1B[1;31m"
#define RTT_CTRL_TEXT_BRIGHT_GREEN "\x1B[1;32m"
#define RTT_CTRL_TEXT_BRIGHT_YELLOW "\x1B[1;33m"
#define RTT_CTRL_TEXT_BRIGHT_BLUE "\x1B[1;34m"
#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "\x1B[1;35m"
#define RTT_CTRL_TEXT_BRIGHT_CYAN "\x1B[1;36m"
#define RTT_CTRL_TEXT_BRIGHT_WHITE "\x1B[1;37m"
#define RTT_CTRL_BG_BLACK "\x1B[24;40m"
#define RTT_CTRL_BG_RED "\x1B[24;41m"
#define RTT_CTRL_BG_GREEN "\x1B[24;42m"
#define RTT_CTRL_BG_YELLOW "\x1B[24;43m"
#define RTT_CTRL_BG_BLUE "\x1B[24;44m"
#define RTT_CTRL_BG_MAGENTA "\x1B[24;45m"
#define RTT_CTRL_BG_CYAN "\x1B[24;46m"
#define RTT_CTRL_BG_WHITE "\x1B[24;47m"
#define RTT_CTRL_BG_BRIGHT_BLACK "\x1B[4;40m"
#define RTT_CTRL_BG_BRIGHT_RED "\x1B[4;41m"
#define RTT_CTRL_BG_BRIGHT_GREEN "\x1B[4;42m"
#define RTT_CTRL_BG_BRIGHT_YELLOW "\x1B[4;43m"
#define RTT_CTRL_BG_BRIGHT_BLUE "\x1B[4;44m"
#define RTT_CTRL_BG_BRIGHT_MAGENTA "\x1B[4;45m"
#define RTT_CTRL_BG_BRIGHT_CYAN "\x1B[4;46m"
#define RTT_CTRL_BG_BRIGHT_WHITE "\x1B[4;47m"
/*********************************************************************************
* TYPEDEFS
* *******************************************************************************/
/*********************************************************************************
* GLOBAL PROTOTYPES
* *******************************************************************************/
DEF_EXTERN void Drv_LogPrintf(void *str);
DEF_EXTERN void Drv_LogColorPrintf(void *str, void *prefix);
#endif /* DRV_LOG_H */

View File

@@ -0,0 +1,464 @@
/************************************************************************
* FilePath : log.c
* Author : GX.Duan
* Date : 2022-09-18 20:31:59
* LastEditTime : 2022-09-18 20:33:48
* LastEditors : ShallowGreen123 2608653986@qq.com
* Copyright (c): 2022 by GX.Duan, All Rights Reserved.
* Github : https://github.com/ShallowGreen123/lvgl_mydemo
************************************************************************/
#define DEF_LIB_TRACE_MODULE
/*********************************************************************************
* INCLUDES
* *******************************************************************************/
#include "lib_log.h"
#include "drv_log.h"
#include "../../lvgl/lvgl.h"
/*********************************************************************************
* DEFINES
* *******************************************************************************/
#define DEF_LIB_TRACE_CIRCULAR_Q_REM_SIZE(q) (q->QBufSize - q->UsedSize)
#define DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, pos) ((0xFF & q->QBuf[pos]) | ((0xFF & q->QBuf[pos + 1]) << 8))
#define DEF_LIB_TRACE_MSG_Q_SIZE 4096
#define DEF_LIB_TRACE_MAX_WRITER_NBR 5
// #define DEF_LIB_TRACE_TIME_HANDLE &hlptim5
// #define DEF_LIB_TRACE_TIME_PERIOD 65535U
// #define DEF_LIB_TRACE_TIME_MS(x) (((x)*25000) / 128)
// #define DEF_LIB_TRACE_MAX_TIMEOUT_MS 335
// #define DEF_LIB_TRACE_USED_OS false
/*********************************************************************************
* MACROS
* *******************************************************************************/
/*********************************************************************************
* TYPEDEFS
* *******************************************************************************/
typedef struct lib_log_circular_q_handle_t {
uint8_t *QBuf;
uint32_t QBufSize;
uint32_t FirstElement;
uint32_t LastElement;
uint32_t ElementCnt;
uint32_t UsedSize;
} LIB_TRACE_CIRCULAR_Q_HANDLE_T;
typedef struct lib_log_writer_handle_t {
uint8_t *LastLogElement;
uint32_t LastSeqNbr;
Lib_LogWr_Fn Wr;
bool PerifRdy;
} LIB_TRACE_WRITER_HANDLE_T;
typedef struct lib_log_handle_t {
bool InitDone;
uint32_t RdSeqNbr;
uint32_t WrSeqNbr;
LIB_TRACE_CIRCULAR_Q_HANDLE_T Q;
uint8_t WorkBuf[DEF_LIB_TRACE_MAX_MSG_SIZE];
LIB_TRACE_WRITER_HANDLE_T WriterArray[DEF_LIB_TRACE_MAX_WRITER_NBR];
} LIB_TRACE_HANDLE_T;
//
static uint8_t Lib_LogQBuf[DEF_LIB_TRACE_MSG_Q_SIZE];
static uint32_t Lib_LogSeqNbr = 0;
static LIB_TRACE_HANDLE_T Lib_LogHdl;
static volatile bool Lib_LogProcReq = false;
/*********************************************************************************
* STATIC FUNCTION
* *******************************************************************************/
static int32_t Lib_LogCircularQInit(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint8_t *q_buf, uint32_t q_buf_size);
static bool Lib_LogCircularQChkSpace(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint16_t need_size);
static uint8_t *Lib_LogCircularQPush(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint8_t *element, uint16_t element_size);
static uint8_t *Lib_LogCircularQPop(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint16_t *element_size);
static uint8_t *Lib_LogCircularQPeek(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint16_t *element_size);
static uint8_t *Lib_LogCircularQPeekAfterElement(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint8_t *element, uint16_t *element_size);
static int32_t Lib_LogCircularQClear(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q);
static uint32_t Lib_LogCircularQGetElementNbr(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q);
static int32_t Lib_LogCircularQInit(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint8_t *q_buf, uint32_t q_buf_size)
{
q->QBuf = q_buf;
q->QBufSize = q_buf_size;
q->FirstElement = 0;
q->LastElement = 0;
q->ElementCnt = 0;
q->UsedSize = 0;
return 0;
}
static bool Lib_LogCircularQChkSpace(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint16_t need_size)
{
uint16_t sto_size = need_size + sizeof(uint16_t);
uint32_t last_element_sto_size = 0;
uint32_t buf_pos = 0;
if (DEF_LIB_TRACE_CIRCULAR_Q_REM_SIZE(q) < sto_size) {
return false;
}
if (q->ElementCnt > 0) {
last_element_sto_size = DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, q->LastElement) + sizeof(uint16_t);
buf_pos = q->LastElement + last_element_sto_size;
if (q->LastElement >= q->FirstElement) {
if ((q->QBufSize - buf_pos < sto_size) && (q->FirstElement < sto_size)) {
return false;
}
} else if (q->FirstElement - buf_pos < sto_size) {
return false;
}
}
return true;
}
static uint8_t *Lib_LogCircularQPush(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint8_t *element, uint16_t element_size)
{
uint16_t sto_size = element_size + sizeof(uint16_t);
uint32_t last_element_sto_size = 0;
uint32_t buf_pos = 0;
if (element == NULL || element_size == 0) {
return NULL;
}
if (DEF_LIB_TRACE_CIRCULAR_Q_REM_SIZE(q) < sto_size) {
// No enough space to store this element
return NULL;
}
if (q->ElementCnt > 0) {
last_element_sto_size = DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, q->LastElement) + sizeof(uint16_t);
buf_pos = q->LastElement + last_element_sto_size;
if (q->LastElement >= q->FirstElement) {
if ((q->QBufSize - buf_pos < sto_size) && (q->FirstElement < sto_size)) {
// No enough space to store this element
return NULL;
}
if (q->QBufSize - buf_pos < sto_size) {
// Mark eof as unused
q->QBuf[buf_pos] = 0xFF;
q->QBuf[buf_pos + 1] = 0xFF;
buf_pos = 0;
}
} else if (q->FirstElement - buf_pos < sto_size) {
// No enough space to store this element
return NULL;
}
}
q->LastElement = buf_pos;
// Store size
q->QBuf[buf_pos++] = 0xFF & element_size;
q->QBuf[buf_pos++] = (0xFF00 & element_size) >> 8;
// Store data
memcpy((void *)&q->QBuf[buf_pos], element, element_size);
q->UsedSize += sto_size;
q->ElementCnt++;
return element;
}
static uint8_t *Lib_LogCircularQPop(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint16_t *element_size)
{
uint8_t *data;
uint16_t sto_size;
if (q->ElementCnt == 0) {
return NULL;
}
*element_size = DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, q->FirstElement);
sto_size = *element_size + sizeof(uint16_t);
data = &q->QBuf[q->FirstElement + sizeof(uint16_t)];
q->FirstElement += sto_size;
if (DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, q->FirstElement) == 0xFFFF) {
// Eof mark
q->FirstElement = 0;
}
q->UsedSize -= sto_size;
q->ElementCnt--;
return data;
}
static uint8_t *Lib_LogCircularQPeek(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint16_t *element_size)
{
if (q->ElementCnt == 0) {
return NULL;
}
*element_size = DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, q->FirstElement);
return &q->QBuf[q->FirstElement + sizeof(uint16_t)];
}
static uint8_t *Lib_LogCircularQPeekAfterElement(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q, uint8_t *element, uint16_t *element_size)
{
uint16_t size;
uint32_t offset = element - q->QBuf - 2;
if ((q->ElementCnt == 0) || (q->LastElement == offset)) {
return NULL;
}
size = DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, offset);
offset += (size + sizeof(uint16_t));
size = DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, offset);
if (size == 0xFFFF) {
offset = 0;
size = DEF_LIB_TRACE_CIRCULAR_Q_ELEMENT_SIZE(q, offset);
}
*element_size = size;
return &q->QBuf[offset + sizeof(uint16_t)];
}
static int32_t Lib_LogCircularQClear(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q)
{
q->FirstElement = 0;
q->LastElement = 0;
q->ElementCnt = 0;
q->UsedSize = 0;
return 0;
}
static uint32_t Lib_LogCircularQGetElementNbr(LIB_TRACE_CIRCULAR_Q_HANDLE_T *q)
{
return q->ElementCnt;
}
static inline void Lib_LogIntLock(void)
{
// IntLockFun();
}
static inline void Lib_LogIntUnlock(void)
{
// UnlockFun();
}
static inline uint32_t Lib_LogGetTs(void)
{
// return GetTick();
return lv_tick_get();
}
static void Lib_LogStartProcReq(void)
{
Lib_LogProcReq = true;
}
/*********************************************************************************
* GLOBAL FUNCTION
* *******************************************************************************/
void Lib_LogInit(void)
{
memset((void *)&Lib_LogHdl, 0, sizeof(Lib_LogHdl));
Lib_LogCircularQInit(&Lib_LogHdl.Q, Lib_LogQBuf, sizeof(Lib_LogQBuf));
Lib_LogHdl.InitDone = true;
#if !(DEF_LIB_TRACE_FORCE_PRINTF)
Drv_LogSetupPrintf();
#endif
}
LIB_TRACE_WRITER_HDLR_T Lib_LogRegistWriter(Lib_LogWr_Fn wr_fnct)
{
uint32_t i;
Lib_LogIntLock();
for (i = 0; i < DEF_LIB_TRACE_MAX_WRITER_NBR; i++) {
if (Lib_LogHdl.WriterArray[i].Wr == NULL) {
Lib_LogHdl.WriterArray[i].Wr = wr_fnct;
Lib_LogHdl.WriterArray[i].LastSeqNbr = Lib_LogHdl.RdSeqNbr;
Lib_LogHdl.WriterArray[i].PerifRdy = true;
Lib_LogIntUnlock();
return (LIB_TRACE_WRITER_HDLR_T)(&Lib_LogHdl.WriterArray[i]);
}
}
Lib_LogIntUnlock();
return NULL;
}
bool Lib_LogUnregistWriter(LIB_TRACE_WRITER_HDLR_T writer_hdl)
{
uint32_t i;
Lib_LogIntLock();
for (i = 0; i < DEF_LIB_TRACE_MAX_WRITER_NBR; i++) {
if (&Lib_LogHdl.WriterArray[i] == writer_hdl) {
Lib_LogHdl.WriterArray[i].Wr = NULL;
Lib_LogHdl.WriterArray[i].LastSeqNbr = 0;
Lib_LogHdl.WriterArray[i].PerifRdy = false;
Lib_LogIntUnlock();
return true;
}
}
Lib_LogIntUnlock();
return false;
}
void Lib_LogWrDone(LIB_TRACE_WRITER_HDLR_T writer_hdl)
{
if (writer_hdl == NULL) {
return;
}
Lib_LogIntLock();
((LIB_TRACE_WRITER_HANDLE_T *)writer_hdl)->PerifRdy = true;
Lib_LogIntUnlock();
Lib_LogStartProcReq();
}
void Lib_LogPrintf(uint8_t lv, const char *fmt, ...)
{
LIB_TRACE_ITEM_HANDLE_T *log_element;
LIB_TRACE_CIRCULAR_Q_HANDLE_T *queue = &Lib_LogHdl.Q;
char *prefix;
va_list args;
int32_t ret;
uint32_t ts;
uint16_t element_size;
uint16_t tmp_size;
if (!Lib_LogHdl.InitDone) {
return;
}
switch (lv) {
case TRACE_LV_V:
prefix = "[V]";
break;
case TRACE_LV_DBG:
prefix = "[D]";
break;
case TRACE_LV_INFO:
prefix = "[I]";
break;
case TRACE_LV_WARN:
prefix = "[W]";
break;
case TRACE_LV_ERR:
prefix = "[E]";
break;
default:
prefix = "[X]";
break;
}
Lib_LogIntLock();
log_element = (LIB_TRACE_ITEM_HANDLE_T *)Lib_LogHdl.WorkBuf;
va_start(args, fmt);
ts = Lib_LogGetTs();
ret = snprintf((char *)log_element->Buf, DEF_LIB_TRACE_MAX_MSG_SIZE, "(%u) %s ", ts, prefix);
ret += vsnprintf((char *)log_element->Buf + ret, DEF_LIB_TRACE_MAX_MSG_SIZE - ret, fmt, args);
ret++; /* for terminating null character */
va_end(args);
if (ret > 0) {
log_element->Lv = lv;
log_element->Len = ret;
log_element->Ts = ts;
log_element->SeqNbr = Lib_LogSeqNbr++;
element_size = ret + sizeof(LIB_TRACE_ITEM_HANDLE_T);
while (!Lib_LogCircularQChkSpace(queue, element_size)) {
Lib_LogCircularQPop(queue, &tmp_size);
Lib_LogHdl.RdSeqNbr++;
}
Lib_LogCircularQPush(queue, (uint8_t *)log_element, element_size);
Lib_LogHdl.WrSeqNbr = log_element->SeqNbr;
Lib_LogStartProcReq();
}
Lib_LogIntUnlock();
#if DEF_LIB_TRACE_FORCE_PRINTF
#endif
#if DEF_LOG_COLOR_PRINT_EN
Drv_LogColorPrintf(log_element->Buf, prefix);
#else
Drv_LogPrintf(log_element->Buf);
#endif
}
void Lib_LogHexArray(uint8_t *data, uint32_t len)
{
uint8_t buf[DEF_LIB_TRACE_HEX_ARRAY_LINE_LEN * DEF_LIB_TRACE_HEX_ARRAY_ITEM_LEN + 1];
uint8_t remain = len;
uint8_t *p = data;
uint8_t dump_len;
uint8_t i;
while (remain > 0) {
if (remain > DEF_LIB_TRACE_HEX_ARRAY_LINE_LEN) {
dump_len = DEF_LIB_TRACE_HEX_ARRAY_LINE_LEN;
} else {
dump_len = remain;
}
for (i = 0; i < dump_len; i++) {
snprintf((char *)buf + i * DEF_LIB_TRACE_HEX_ARRAY_ITEM_LEN, sizeof(buf) - i * DEF_LIB_TRACE_HEX_ARRAY_ITEM_LEN, "%02X, ", *p++);
}
TRACE_I("%s\n", buf);
remain -= dump_len;
}
}
void Lib_LogProc(void)
{
LIB_TRACE_WRITER_HANDLE_T *writer;
uint8_t *element;
uint16_t element_size;
uint32_t i;
if (!Lib_LogProcReq) {
return;
}
Lib_LogProcReq = false;
for (i = 0; i < DEF_LIB_TRACE_MAX_WRITER_NBR; i++) {
Lib_LogIntLock();
writer = &Lib_LogHdl.WriterArray[i];
if ((writer->Wr == NULL) || (!writer->PerifRdy)) {
Lib_LogIntUnlock();
continue;
}
if ((!writer->LastLogElement) || (writer->LastSeqNbr < Lib_LogHdl.RdSeqNbr)) {
writer->LastSeqNbr = Lib_LogHdl.RdSeqNbr;
element = Lib_LogCircularQPeek(&Lib_LogHdl.Q, &element_size);
Lib_LogIntUnlock();
if (element) {
writer->PerifRdy = false;
if (writer->Wr((LIB_TRACE_ITEM_HANDLE_T *)element)) {
writer->LastLogElement = element;
} else {
writer->PerifRdy = true;
}
Lib_LogProcReq = true;
}
} else {
element = Lib_LogCircularQPeekAfterElement(&Lib_LogHdl.Q, writer->LastLogElement, &element_size);
Lib_LogIntUnlock();
if (element) {
writer->PerifRdy = false;
if (writer->Wr((LIB_TRACE_ITEM_HANDLE_T *)element)) {
writer->LastSeqNbr++;
writer->LastLogElement = element;
} else {
writer->PerifRdy = true;
}
Lib_LogProcReq = true;
}
}
}
}

View File

@@ -0,0 +1,129 @@
/************************************************************************
* FilePath : log.h
* Author : GX.Duan
* Date : 2022-09-18 17:49:09
* LastEditTime : 2022-09-21 21:55:55
* LastEditors : ShallowGreen123 2608653986@qq.com
* Copyright (c): 2022 by GX.Duan, All Rights Reserved.
* Github : https://github.com/ShallowGreen123/lvgl_mydemo
************************************************************************/
#ifndef __LIB_TRACE_H__
#define __LIB_TRACE_H__
/*********************************************************************************
* INCLUDES
* *******************************************************************************/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
/*********************************************************************************
* DEFINES
* *******************************************************************************/
#ifdef DEF_LIB_TRACE_MODULE
# define DEF_LIB_TRACE_EXT
#else
# define DEF_LIB_TRACE_EXT extern
#endif
#if defined(_WIN32)
# ifndef __packed
# define __packed
# endif
# ifndef __aligned
# define __aligned(x) __declspec(align(x))
# endif
#else /* _WIN32 */
# include <sys/cdefs.h>
#endif /* _WIN32 */
/*********************************************************************************
* MACROS
* *******************************************************************************/
#define TRACE_LV_NONE 0
#define TRACE_LV_ERR 1
#define TRACE_LV_WARN 2
#define TRACE_LV_INFO 3
#define TRACE_LV_DBG 4
#define TRACE_LV_V 5
#define DEF_DBG_LV TRACE_LV_DBG
#define DEF_LIB_TRACE_FORCE_PRINTF 1
#define DEF_LOG_COLOR_PRINT_EN 1
#define DEF_LIB_TRACE_MAX_MSG_SIZE 256
#define DEF_LIB_TRACE_HEX_ARRAY_LINE_LEN 32
#define DEF_LIB_TRACE_HEX_ARRAY_ITEM_LEN 4
//////////////////////////
#if (DEF_DBG_LV >= TRACE_LV_V)
# define TRACE_V(FMT, ...) Lib_LogPrintf(TRACE_LV_V, FMT, ##__VA_ARGS__)
#else
# define TRACE_V(FMT, ...)
#endif
#if (DEF_DBG_LV >= TRACE_LV_DBG)
# define TRACE_D(FMT, ...) Lib_LogPrintf(TRACE_LV_DBG, FMT, ##__VA_ARGS__)
#else
# define TRACE_D(FMT, ...)
#endif
#if (DEF_DBG_LV >= TRACE_LV_INFO)
# define TRACE_I(FMT, ...) Lib_LogPrintf(TRACE_LV_INFO, FMT, ##__VA_ARGS__)
#else
# define TRACE_I(FMT, ...)
#endif
#if (DEF_DBG_LV >= TRACE_LV_WARN)
# define TRACE_W(FMT, ...) Lib_LogPrintf(TRACE_LV_WARN, FMT, ##__VA_ARGS__)
#else
# define TRACE_W(FMT, ...)
#endif
#if (DEF_DBG_LV >= TRACE_LV_ERR)
# define TRACE_E(FMT, ...) Lib_LogPrintf(TRACE_LV_ERR, FMT, ##__VA_ARGS__)
#else
# define TRACE_E(FMT, ...)
#endif
#if (DEF_DBG_LV >= TRACE_LV_INFO)
# define TRACE_HEX_ARRAY(data, data_len) Lib_LogHexArray((uint8_t *)(data), (uint32_t)(data_len))
#endif
/*********************************************************************************
* TYPEDEFS
* *******************************************************************************/
typedef struct lib_log_item_handle_t {
uint8_t Lv;
uint16_t Len;
uint32_t Ts;
uint32_t SeqNbr;
uint8_t Buf[0];
} __packed LIB_TRACE_ITEM_HANDLE_T;
typedef bool (*Lib_LogWr_Fn)(LIB_TRACE_ITEM_HANDLE_T *item);
typedef void *LIB_TRACE_WRITER_HDLR_T;
/*********************************************************************************
* GLOBAL PROTOTYPES
* *******************************************************************************/
DEF_LIB_TRACE_EXT void Lib_LogInit(void);
DEF_LIB_TRACE_EXT LIB_TRACE_WRITER_HDLR_T Lib_LogRegistWriter(Lib_LogWr_Fn wr_fnct);
DEF_LIB_TRACE_EXT bool Lib_LogUnregistWriter(LIB_TRACE_WRITER_HDLR_T writer_hdl);
DEF_LIB_TRACE_EXT void Lib_LogWrDone(LIB_TRACE_WRITER_HDLR_T writer_hdl);
DEF_LIB_TRACE_EXT void Lib_LogPrintf(uint8_t lv, const char *fmt, ...);
DEF_LIB_TRACE_EXT void Lib_LogHexArray(uint8_t *data, uint32_t len);
DEF_LIB_TRACE_EXT void Lib_LogProc(void);
#endif /* __LIB_TRACE_H__ */

View File

@@ -15,7 +15,7 @@
* *******************************************************************************/
#include "../lvgl/lvgl.h"
#include <stdio.h>
#include "log/lib_log.h"
#include "lib/lib_log.h"
#include "data/dataModel.h"
#include "data/gui_scr_mgr.h"