diff --git a/LVGL.Simulator/LVGL.Simulator.vcxproj b/LVGL.Simulator/LVGL.Simulator.vcxproj
index 8aac746..5813950 100644
--- a/LVGL.Simulator/LVGL.Simulator.vcxproj
+++ b/LVGL.Simulator/LVGL.Simulator.vcxproj
@@ -54,8 +54,8 @@
-
-
+
+
diff --git a/LVGL.Simulator/LVGL.Simulator.vcxproj.filters b/LVGL.Simulator/LVGL.Simulator.vcxproj.filters
index c29e27d..731b700 100644
--- a/LVGL.Simulator/LVGL.Simulator.vcxproj.filters
+++ b/LVGL.Simulator/LVGL.Simulator.vcxproj.filters
@@ -39,14 +39,14 @@
lvgl_mydemo\srceen
-
- lvgl_mydemo\log
-
lvgl_mydemo\data
-
- lvgl_mydemo\log
+
+ lvgl_mydemo\lib
+
+
+ lvgl_mydemo\lib
@@ -80,8 +80,8 @@
{5aec906d-b671-4778-9999-6dcadc840600}
-
- {7c5bcdd0-7a51-46f7-804e-ed1f4371645d}
+
+ {125c5bdc-13e9-45ed-bf0d-f844505c20ca}
\ No newline at end of file
diff --git a/LVGL.Simulator/lvgl_mydemo/lib/drv_log.c b/LVGL.Simulator/lvgl_mydemo/lib/drv_log.c
new file mode 100644
index 0000000..dac416c
--- /dev/null
+++ b/LVGL.Simulator/lvgl_mydemo/lib/drv_log.c
@@ -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);
+}
diff --git a/LVGL.Simulator/lvgl_mydemo/lib/drv_log.h b/LVGL.Simulator/lvgl_mydemo/lib/drv_log.h
new file mode 100644
index 0000000..96fa847
--- /dev/null
+++ b/LVGL.Simulator/lvgl_mydemo/lib/drv_log.h
@@ -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
+#include
+#include
+
+/*********************************************************************************
+ * 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 */
\ No newline at end of file
diff --git a/LVGL.Simulator/lvgl_mydemo/lib/lib_log.c b/LVGL.Simulator/lvgl_mydemo/lib/lib_log.c
new file mode 100644
index 0000000..7477598
--- /dev/null
+++ b/LVGL.Simulator/lvgl_mydemo/lib/lib_log.c
@@ -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;
+ }
+ }
+ }
+}
diff --git a/LVGL.Simulator/lvgl_mydemo/lib/lib_log.h b/LVGL.Simulator/lvgl_mydemo/lib/lib_log.h
new file mode 100644
index 0000000..c094913
--- /dev/null
+++ b/LVGL.Simulator/lvgl_mydemo/lib/lib_log.h
@@ -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
+#include
+#include
+#include
+#include
+
+/*********************************************************************************
+ * 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
+#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__ */
\ No newline at end of file
diff --git a/LVGL.Simulator/lvgl_mydemo/lvgl_app.h b/LVGL.Simulator/lvgl_mydemo/lvgl_app.h
index bbb9589..2b19677 100644
--- a/LVGL.Simulator/lvgl_mydemo/lvgl_app.h
+++ b/LVGL.Simulator/lvgl_mydemo/lvgl_app.h
@@ -15,7 +15,7 @@
* *******************************************************************************/
#include "../lvgl/lvgl.h"
#include
-#include "log/lib_log.h"
+#include "lib/lib_log.h"
#include "data/dataModel.h"
#include "data/gui_scr_mgr.h"