fun: Add common data structures and logging systems
This commit is contained in:
3
LVGL.Simulator/.vscode/settings.json
vendored
3
LVGL.Simulator/.vscode/settings.json
vendored
@@ -4,7 +4,8 @@
|
|||||||
"gui_main_scr.h": "c",
|
"gui_main_scr.h": "c",
|
||||||
"stdio.h": "c",
|
"stdio.h": "c",
|
||||||
"gui_log.h": "c",
|
"gui_log.h": "c",
|
||||||
"lvgl.h": "c"
|
"lvgl.h": "c",
|
||||||
|
"lvgl_app.h": "c"
|
||||||
},
|
},
|
||||||
"C_Cpp.errorSquiggles": "Disabled"
|
"C_Cpp.errorSquiggles": "Disabled"
|
||||||
}
|
}
|
||||||
@@ -54,8 +54,11 @@
|
|||||||
<ClCompile Include="LVGL.Simulator.cpp" />
|
<ClCompile Include="LVGL.Simulator.cpp" />
|
||||||
<ClCompile Include="lvgl_mydemo\data\dataModel.c" />
|
<ClCompile Include="lvgl_mydemo\data\dataModel.c" />
|
||||||
<ClCompile Include="lvgl_mydemo\data\gui_scr_mgr.c" />
|
<ClCompile Include="lvgl_mydemo\data\gui_scr_mgr.c" />
|
||||||
|
<ClCompile Include="lvgl_mydemo\lib\data_struct\linklist_malloc.c" />
|
||||||
|
<ClCompile Include="lvgl_mydemo\lib\data_struct\queue_malloc.c" />
|
||||||
|
<ClCompile Include="lvgl_mydemo\lib\data_struct\stack_malloc.c" />
|
||||||
<ClCompile Include="lvgl_mydemo\lib\drv_log.c" />
|
<ClCompile Include="lvgl_mydemo\lib\drv_log.c" />
|
||||||
<ClCompile Include="lvgl_mydemo\lib\lib_log.c" />
|
<ClCompile Include="lvgl_mydemo\lib\lib_sys_log.c" />
|
||||||
<ClCompile Include="lvgl_mydemo\lvgl_app.c" />
|
<ClCompile Include="lvgl_mydemo\lvgl_app.c" />
|
||||||
<ClCompile Include="lvgl_mydemo\screen\gui_main_scr.c" />
|
<ClCompile Include="lvgl_mydemo\screen\gui_main_scr.c" />
|
||||||
<ClCompile Include="lvgl_mydemo\screen\gui_test1_scr.c" />
|
<ClCompile Include="lvgl_mydemo\screen\gui_test1_scr.c" />
|
||||||
|
|||||||
@@ -45,7 +45,16 @@
|
|||||||
<ClCompile Include="lvgl_mydemo\lib\drv_log.c">
|
<ClCompile Include="lvgl_mydemo\lib\drv_log.c">
|
||||||
<Filter>lvgl_mydemo\lib</Filter>
|
<Filter>lvgl_mydemo\lib</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="lvgl_mydemo\lib\lib_log.c">
|
<ClCompile Include="lvgl_mydemo\lib\data_struct\linklist_malloc.c">
|
||||||
|
<Filter>lvgl_mydemo\lib\data_struct</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="lvgl_mydemo\lib\data_struct\queue_malloc.c">
|
||||||
|
<Filter>lvgl_mydemo\lib\data_struct</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="lvgl_mydemo\lib\data_struct\stack_malloc.c">
|
||||||
|
<Filter>lvgl_mydemo\lib\data_struct</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="lvgl_mydemo\lib\lib_sys_log.c">
|
||||||
<Filter>lvgl_mydemo\lib</Filter>
|
<Filter>lvgl_mydemo\lib</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -83,5 +92,8 @@
|
|||||||
<Filter Include="lvgl_mydemo\lib">
|
<Filter Include="lvgl_mydemo\lib">
|
||||||
<UniqueIdentifier>{125c5bdc-13e9-45ed-bf0d-f844505c20ca}</UniqueIdentifier>
|
<UniqueIdentifier>{125c5bdc-13e9-45ed-bf0d-f844505c20ca}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="lvgl_mydemo\lib\data_struct">
|
||||||
|
<UniqueIdentifier>{aff205ae-5bf7-43e9-af94-55de0a04480b}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
310
LVGL.Simulator/lvgl_mydemo/lib/data_struct/linklist_malloc.c
Normal file
310
LVGL.Simulator/lvgl_mydemo/lib/data_struct/linklist_malloc.c
Normal file
@@ -0,0 +1,310 @@
|
|||||||
|
|
||||||
|
#include "linklist_malloc.h"
|
||||||
|
|
||||||
|
#if DEF_TEST_MALLOC_LINKLIST
|
||||||
|
#include <string.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// define
|
||||||
|
#define DEF_NODE_P_SIZE (sizeof(_node_p_ *) + sizeof(_node_p_ *))
|
||||||
|
#define DEF_PREV_NODE_OFFS(ll_p) (ll_p->size)
|
||||||
|
#define DEF_NEXT_NODE_OFFS(ll_p) (ll_p->size + sizeof(_node_p_ *))
|
||||||
|
|
||||||
|
static void list_node_p_set_prev(linklist2_t *p, _node_p_ *act, _node_p_ *prev);
|
||||||
|
static void list_node_p_set_next(linklist2_t *p, _node_p_ *act, _node_p_ *next);
|
||||||
|
|
||||||
|
// doubel linklist code
|
||||||
|
|
||||||
|
void list_init_2(linklist2_t *p, uint32_t size) {
|
||||||
|
#ifdef DEF_BYTE_ALIGN_8
|
||||||
|
size = (size + 7) & (~0x7);
|
||||||
|
#else
|
||||||
|
size = (size + 3) & (~0x3);
|
||||||
|
#endif
|
||||||
|
p->head = NULL;
|
||||||
|
p->tail = NULL;
|
||||||
|
p->size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *list_ins_head_2(linklist2_t *list) {
|
||||||
|
_node_p_ *new_node = DEF_MALLOC(list->size + DEF_NODE_P_SIZE);
|
||||||
|
|
||||||
|
if (new_node == NULL) return NULL;
|
||||||
|
|
||||||
|
list_node_p_set_prev(list, new_node, NULL);
|
||||||
|
list_node_p_set_next(list, new_node, list->head);
|
||||||
|
|
||||||
|
if (list->head != NULL) {
|
||||||
|
list_node_p_set_prev(list, list->head, new_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
list->head = new_node;
|
||||||
|
if (list->tail == NULL) {
|
||||||
|
list->tail = new_node;
|
||||||
|
}
|
||||||
|
return new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *list_ins_prev_2(linklist2_t *list, void *act) {
|
||||||
|
_node_p_ *new_node;
|
||||||
|
|
||||||
|
if (list == NULL || act == NULL) return NULL;
|
||||||
|
|
||||||
|
if (list_get_head_2(list) == act) {
|
||||||
|
new_node = list_ins_head_2(list);
|
||||||
|
if (new_node == NULL) return NULL;
|
||||||
|
} else {
|
||||||
|
new_node = DEF_MALLOC(list->size + DEF_NODE_P_SIZE);
|
||||||
|
if (new_node == NULL) return NULL;
|
||||||
|
|
||||||
|
_node_p_ *prev;
|
||||||
|
prev = list_get_prev_2(list, act);
|
||||||
|
list_node_p_set_next(list, prev, new_node);
|
||||||
|
list_node_p_set_prev(list, new_node, prev);
|
||||||
|
list_node_p_set_prev(list, act, new_node);
|
||||||
|
list_node_p_set_next(list, new_node, act);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *list_ins_tail_2(linklist2_t *list) {
|
||||||
|
_node_p_ *new_node;
|
||||||
|
|
||||||
|
new_node = DEF_MALLOC(list->size + DEF_NODE_P_SIZE);
|
||||||
|
|
||||||
|
if (new_node == NULL) return NULL;
|
||||||
|
|
||||||
|
list_node_p_set_next(list, new_node, NULL);
|
||||||
|
list_node_p_set_prev(list, new_node, list->tail);
|
||||||
|
|
||||||
|
if (list->tail != NULL) {
|
||||||
|
list_node_p_set_next(list, list->tail, new_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
list->tail = new_node;
|
||||||
|
if (list->head == NULL) {
|
||||||
|
list->head = new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_remove_node_2(linklist2_t *list, void *node) {
|
||||||
|
if (node == NULL) return;
|
||||||
|
|
||||||
|
if (list_get_head_2(list) == node) {
|
||||||
|
list->head = list_get_next_2(list, node);
|
||||||
|
if (list->head == NULL) {
|
||||||
|
list->tail = NULL;
|
||||||
|
} else {
|
||||||
|
list_node_p_set_prev(list, list->head, NULL);
|
||||||
|
}
|
||||||
|
} else if (list_get_tail_2(list) == node) {
|
||||||
|
list->tail = list_get_prev_2(list, node);
|
||||||
|
if (list->tail == NULL) {
|
||||||
|
list->head = NULL;
|
||||||
|
} else {
|
||||||
|
list_node_p_set_next(list, list->tail, NULL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_node_p_ *prev = list_get_prev_2(list, node);
|
||||||
|
_node_p_ *next = list_get_next_2(list, node);
|
||||||
|
|
||||||
|
list_node_p_set_next(list, prev, next);
|
||||||
|
list_node_p_set_prev(list, next, prev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_clear_2(linklist2_t *list) {
|
||||||
|
void *i;
|
||||||
|
void *i_next;
|
||||||
|
|
||||||
|
i = list_get_head_2(list);
|
||||||
|
i_next = NULL;
|
||||||
|
|
||||||
|
while (i != NULL) {
|
||||||
|
i_next = list_get_next_2(list, i);
|
||||||
|
|
||||||
|
list_remove_node_2(list, i);
|
||||||
|
DEF_FREE(i);
|
||||||
|
|
||||||
|
i = i_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_chg_list_2(linklist2_t *ll_ori_p, linklist2_t *ll_new_p, void *node, bool head) {
|
||||||
|
list_remove_node_2(ll_ori_p, node);
|
||||||
|
|
||||||
|
if (head) {
|
||||||
|
list_node_p_set_prev(ll_new_p, node, NULL);
|
||||||
|
list_node_p_set_next(ll_new_p, node, ll_new_p->head);
|
||||||
|
|
||||||
|
if (ll_new_p != NULL) {
|
||||||
|
list_node_p_set_prev(ll_new_p, ll_new_p->head, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
ll_new_p->head = node;
|
||||||
|
if (ll_new_p->tail == NULL) {
|
||||||
|
ll_new_p->tail = node;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// set node as tail
|
||||||
|
list_node_p_set_next(ll_new_p, node, NULL);
|
||||||
|
list_node_p_set_prev(ll_new_p, node, ll_new_p->tail);
|
||||||
|
|
||||||
|
if (ll_new_p->tail != NULL) {
|
||||||
|
list_node_p_set_next(ll_new_p, ll_new_p->tail, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
ll_new_p->tail = node;
|
||||||
|
if (ll_new_p->head == NULL) {
|
||||||
|
ll_new_p->head = node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *list_get_head_2(const linklist2_t *list) {
|
||||||
|
if (list == NULL) return NULL;
|
||||||
|
return list->head;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *list_get_tail_2(const linklist2_t *list) {
|
||||||
|
if (list == NULL) return NULL;
|
||||||
|
return list->tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *list_get_next_2(const linklist2_t *list, const void *n_act) {
|
||||||
|
if (list == NULL || n_act == NULL) return NULL;
|
||||||
|
const _node_p_ *next_n = n_act;
|
||||||
|
next_n += DEF_NEXT_NODE_OFFS(list);
|
||||||
|
return *((_node_p_ **)next_n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *list_get_prev_2(const linklist2_t *list, const void *n_act) {
|
||||||
|
if (list == NULL || n_act == NULL) return NULL;
|
||||||
|
const _node_p_ *prev_n = n_act;
|
||||||
|
prev_n += DEF_PREV_NODE_OFFS(list);
|
||||||
|
return *((_node_p_ **)prev_n);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t list_get_len_2(const linklist2_t *list) {
|
||||||
|
uint32_t len = 0;
|
||||||
|
void *node;
|
||||||
|
|
||||||
|
for (node = list_get_head_2; node != NULL; node = list_get_next_2(list, node)) {
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool list_is_empty_2(linklist2_t *list) {
|
||||||
|
if (list == NULL) return true;
|
||||||
|
|
||||||
|
if (list->head == NULL && list->tail == NULL) return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* staic */
|
||||||
|
static void list_node_p_set_prev(linklist2_t *p, _node_p_ *act, _node_p_ *prev) {
|
||||||
|
if (act == NULL) return;
|
||||||
|
|
||||||
|
uint8_t *act8 = (uint8_t *)act;
|
||||||
|
|
||||||
|
act8 += DEF_PREV_NODE_OFFS(p);
|
||||||
|
|
||||||
|
_node_p_ **act_node_p_p = (_node_p_ **)act8;
|
||||||
|
_node_p_ **prev_node_p_p = (_node_p_ **)&prev;
|
||||||
|
|
||||||
|
*act_node_p_p = *prev_node_p_p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void list_node_p_set_next(linklist2_t *p, _node_p_ *act, _node_p_ *next) {
|
||||||
|
if (act == NULL) return;
|
||||||
|
|
||||||
|
uint8_t *act8 = (uint8_t *)act;
|
||||||
|
|
||||||
|
act8 += DEF_NEXT_NODE_OFFS(p);
|
||||||
|
|
||||||
|
_node_p_ **act_node_p_p = (_node_p_ **)act8;
|
||||||
|
_node_p_ **next_node_p_p = (_node_p_ **)&next;
|
||||||
|
*act_node_p_p = *next_node_p_p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************** test ******************************************/
|
||||||
|
#if DEF_TEST_MALLOC_LINKLIST
|
||||||
|
|
||||||
|
// test
|
||||||
|
typedef struct info {
|
||||||
|
int id;
|
||||||
|
int age;
|
||||||
|
char name[16];
|
||||||
|
float soc;
|
||||||
|
} INFO;
|
||||||
|
|
||||||
|
typedef struct image {
|
||||||
|
int id;
|
||||||
|
int w;
|
||||||
|
int h;
|
||||||
|
struct pos {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
} IMAGE;
|
||||||
|
|
||||||
|
linklist2_t list_info;
|
||||||
|
linklist2_t list_image;
|
||||||
|
|
||||||
|
//
|
||||||
|
int main() {
|
||||||
|
list_init_2(&list_info, sizeof(struct info));
|
||||||
|
list_init_2(&list_image, sizeof(struct image));
|
||||||
|
|
||||||
|
// info
|
||||||
|
INFO *info1 = list_ins_head_2(&list_info);
|
||||||
|
INFO *info2 = list_ins_head_2(&list_info);
|
||||||
|
if (info1 != NULL) {
|
||||||
|
info1->id = 0;
|
||||||
|
info1->age = 23;
|
||||||
|
strcpy(info1->name, "ZhangSan");
|
||||||
|
info1->soc = 19.3;
|
||||||
|
}
|
||||||
|
if (info2 != NULL) {
|
||||||
|
info2->id = 1;
|
||||||
|
info2->age = 25;
|
||||||
|
strcpy(info2->name, "LiSi");
|
||||||
|
info2->soc = 56.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
INFO *i;
|
||||||
|
_LV_LL_READ(&list_info, i) {
|
||||||
|
printf("id=%d, age=%d, name=%s, soc=%.2f\n", i->id, i->age, i->name, i->soc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// image
|
||||||
|
IMAGE *img1 = list_ins_head_2(&list_image);
|
||||||
|
IMAGE *img2 = list_ins_head_2(&list_image);
|
||||||
|
if (img1 != NULL) {
|
||||||
|
img1->id = 0;
|
||||||
|
img1->w = 100;
|
||||||
|
img1->h = 101;
|
||||||
|
img1->x = 50;
|
||||||
|
img1->y = 51;
|
||||||
|
}
|
||||||
|
if (img2 != NULL) {
|
||||||
|
img2->id = 1;
|
||||||
|
img2->w = 200;
|
||||||
|
img2->h = 201;
|
||||||
|
img2->x = 250;
|
||||||
|
img2->y = 251;
|
||||||
|
}
|
||||||
|
IMAGE *m;
|
||||||
|
_LV_LL_READ_BACK(&list_image, m) {
|
||||||
|
printf("id=%d, w=%d, h=%d, x=%d, y=%d\n", m->id, m->w, m->h, m->x, m->y);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
46
LVGL.Simulator/lvgl_mydemo/lib/data_struct/linklist_malloc.h
Normal file
46
LVGL.Simulator/lvgl_mydemo/lib/data_struct/linklist_malloc.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#ifndef __LINKLIST_H__
|
||||||
|
#define __LINKLIST_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
// define
|
||||||
|
#define DEF_BYTE_ALIGN_8 0
|
||||||
|
#define DEF_BYTE_ALIGN_4 1
|
||||||
|
// config
|
||||||
|
#define DEF_LIST_ALIGN_MODE DEF_BYTE_ALIGN_8
|
||||||
|
#define DEF_MALLOC(s) malloc(s)
|
||||||
|
#define DEF_FREE(s) free(s)
|
||||||
|
#define DEF_TEST_MALLOC_LINKLIST 0
|
||||||
|
|
||||||
|
//
|
||||||
|
typedef uint8_t _node_p_;
|
||||||
|
|
||||||
|
typedef struct _linklist2 {
|
||||||
|
uint32_t size;
|
||||||
|
_node_p_ *head;
|
||||||
|
_node_p_ *tail;
|
||||||
|
} linklist2_t;
|
||||||
|
|
||||||
|
void list_init_2(linklist2_t *p, uint32_t size);
|
||||||
|
void *list_ins_head_2(linklist2_t *list);
|
||||||
|
void *list_ins_prev_2(linklist2_t *list, void *act);
|
||||||
|
void *list_ins_tail_2(linklist2_t *list);
|
||||||
|
void list_remove_node_2(linklist2_t *list, void *node);
|
||||||
|
void list_clear_2(linklist2_t *list);
|
||||||
|
void list_chg_list_2(linklist2_t *ll_ori_p, linklist2_t *ll_new_p, void *node, bool head);
|
||||||
|
void *list_get_head_2(const linklist2_t *list);
|
||||||
|
void *list_get_tail_2(const linklist2_t *list);
|
||||||
|
void *list_get_next_2(const linklist2_t *list, const void *n_act);
|
||||||
|
void *list_get_prev_2(const linklist2_t *list, const void *n_act);
|
||||||
|
uint32_t list_get_len_2(const linklist2_t *list);
|
||||||
|
bool list_is_empty_2(linklist2_t *list);
|
||||||
|
|
||||||
|
#define _LV_LL_READ(list, i) for (i = list_get_head_2(list); i != NULL; i = list_get_next_2(list, i))
|
||||||
|
#define _LV_LL_READ_BACK(list, i) for (i = list_get_tail_2(list); i != NULL; i = list_get_prev_2(list, i))
|
||||||
|
|
||||||
|
#endif
|
||||||
209
LVGL.Simulator/lvgl_mydemo/lib/data_struct/queue_malloc.c
Normal file
209
LVGL.Simulator/lvgl_mydemo/lib/data_struct/queue_malloc.c
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#include "queue_malloc.h"
|
||||||
|
|
||||||
|
#define DEF_QUEUE_VAL_LEN_INVAILD 0xFFFF // 队列元素的长度为 0XFFFF 时,为无效值
|
||||||
|
#define DEF_QUEUE_RESERVE_SIZE(q) (q->bufSize - q->usedSize)
|
||||||
|
#define DEF_QUEUE_GET_VAL_SIZE(q, pos) ((0xFF & q->buf[pos]) | ((0xFF & q->buf[pos + 1]) << 8))
|
||||||
|
#define DEF_QUEUE_SET_VAL_SIZE(q, pos, val) \
|
||||||
|
do { \
|
||||||
|
q->buf[pos++] = 0xFF & val; \
|
||||||
|
q->buf[pos++] = (0xFF00 & val) >> 8; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
void QueueMallocInit(queue_t *q, uint8_t *buf, uint32_t buf_size)
|
||||||
|
{
|
||||||
|
if (q != NULL) {
|
||||||
|
q->init = true;
|
||||||
|
q->buf = buf;
|
||||||
|
q->bufSize = buf_size;
|
||||||
|
q->front = 0;
|
||||||
|
q->tail = 0;
|
||||||
|
q->elemCnt = 0;
|
||||||
|
q->usedSize = 0;
|
||||||
|
memset(q->buf, 0, q->bufSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *QueueMallocInput(queue_t *q, void *val, val_size valSize)
|
||||||
|
{
|
||||||
|
uint32_t bufPos = 0;
|
||||||
|
uint32_t needSize = valSize + sizeof(val_size);
|
||||||
|
|
||||||
|
if (q->init == false || val == NULL || valSize == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DEF_QUEUE_RESERVE_SIZE(q) < valSize) { // 没有足够的空间保存这个数据
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (q->elemCnt > 0) {
|
||||||
|
bufPos = q->tail + DEF_QUEUE_GET_VAL_SIZE(q, q->tail);
|
||||||
|
if (q->tail >= q->front) { // tail 在 front 后面,队列还没有循环
|
||||||
|
if (((q->bufSize - bufPos) < needSize) && (q->front < needSize)) {
|
||||||
|
return NULL; // 空间虽然足够,但是一部分在头,一部分在末尾,不连续
|
||||||
|
}
|
||||||
|
if (q->bufSize - bufPos < needSize) {
|
||||||
|
DEF_QUEUE_SET_VAL_SIZE(q, bufPos, DEF_QUEUE_VAL_LEN_INVAILD);
|
||||||
|
bufPos = 0;
|
||||||
|
}
|
||||||
|
} else { // front 在 tail 后面,队列已经循环
|
||||||
|
if (q->front - bufPos < needSize) {
|
||||||
|
return NULL; // 没有空间
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
q->tail = bufPos;
|
||||||
|
DEF_QUEUE_SET_VAL_SIZE(q, bufPos, needSize); // bufPos 会 +2,偏移 sizeof(valSize)
|
||||||
|
|
||||||
|
memcpy((void *)&q->buf[bufPos], val, valSize); // 保存数据 val
|
||||||
|
|
||||||
|
q->usedSize += needSize;
|
||||||
|
q->elemCnt++;
|
||||||
|
|
||||||
|
return (void *)&q->buf[bufPos];
|
||||||
|
}
|
||||||
|
|
||||||
|
void *QueueMallocOutput(queue_t *q, val_size *size)
|
||||||
|
{
|
||||||
|
void *value;
|
||||||
|
uint32_t dataSize;
|
||||||
|
|
||||||
|
if (q->init == false || q->elemCnt == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size) {
|
||||||
|
*size = DEF_QUEUE_GET_VAL_SIZE(q, q->front);
|
||||||
|
}
|
||||||
|
dataSize = DEF_QUEUE_GET_VAL_SIZE(q, q->front) + sizeof(val_size);
|
||||||
|
value = &q->buf[q->front + sizeof(val_size)];
|
||||||
|
|
||||||
|
q->front += dataSize;
|
||||||
|
|
||||||
|
if (DEF_QUEUE_GET_VAL_SIZE(q, q->front) == DEF_QUEUE_VAL_LEN_INVAILD) {
|
||||||
|
q->front = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
q->usedSize -= dataSize;
|
||||||
|
q->elemCnt--;
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QueueMallocSpaceChk(queue_t *q, val_size size)
|
||||||
|
{
|
||||||
|
uint32_t bufPos = 0;
|
||||||
|
uint32_t needSize = size + sizeof(val_size);
|
||||||
|
|
||||||
|
if (q->init == false || (DEF_QUEUE_RESERVE_SIZE(q) < needSize)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (q->elemCnt > 0) {
|
||||||
|
if (q->tail >= q->front) {
|
||||||
|
bufPos = q->tail + DEF_QUEUE_GET_VAL_SIZE(q, q->tail);
|
||||||
|
if ((q->bufSize - bufPos < needSize) && (q->front < needSize)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (q->front - bufPos < needSize) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *QueueMallocPeek(queue_t *q, val_size *size)
|
||||||
|
{
|
||||||
|
if (q->init == false || q->elemCnt == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size) {
|
||||||
|
*size = DEF_QUEUE_GET_VAL_SIZE(q, q->front);
|
||||||
|
}
|
||||||
|
return (void *)&q->buf[q->front + sizeof(val_size)];
|
||||||
|
}
|
||||||
|
|
||||||
|
void *QueueMallocPeekAfter(queue_t *q, void *cur_item, val_size *size)
|
||||||
|
{
|
||||||
|
uint32_t bufPos = (uint8_t *)cur_item - q->buf - sizeof(val_size);
|
||||||
|
uint32_t itemSize;
|
||||||
|
|
||||||
|
if (q->init == false || q->elemCnt == 0 || q->tail == bufPos) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bufPos = bufPos + DEF_QUEUE_GET_VAL_SIZE(q, bufPos);
|
||||||
|
itemSize = DEF_QUEUE_GET_VAL_SIZE(q, bufPos);
|
||||||
|
if (itemSize == DEF_QUEUE_VAL_LEN_INVAILD) {
|
||||||
|
bufPos = 0;
|
||||||
|
itemSize = DEF_QUEUE_GET_VAL_SIZE(q, bufPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size) {
|
||||||
|
*size = itemSize;
|
||||||
|
}
|
||||||
|
return (void *)&q->buf[bufPos + sizeof(val_size)];
|
||||||
|
}
|
||||||
|
|
||||||
|
void QueueMallocClear(queue_t *q)
|
||||||
|
{
|
||||||
|
q->front = 0;
|
||||||
|
q->tail = 0;
|
||||||
|
q->elemCnt = 0;
|
||||||
|
q->usedSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t QueueMallocGetCnt(queue_t *q)
|
||||||
|
{
|
||||||
|
return q->elemCnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************** test ***************************************/
|
||||||
|
#if DEF_TEST_MALLOC_QUEUE
|
||||||
|
|
||||||
|
// test
|
||||||
|
queue_t que1;
|
||||||
|
//
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int v = 100;
|
||||||
|
int *p;
|
||||||
|
|
||||||
|
char str[12] = "hello!";
|
||||||
|
char *sp;
|
||||||
|
// init
|
||||||
|
QueueMallocInit(&que1);
|
||||||
|
|
||||||
|
// push
|
||||||
|
sp = QueueMallocInput(&que1, str, strlen(str) + 1);
|
||||||
|
printf("str = %s, used=%d/%d, tail=%d\n", sp, que1.usedSize, que1.bufSize, que1.tail);
|
||||||
|
|
||||||
|
p = QueueMallocInput(&que1, &v, sizeof(int));
|
||||||
|
if (p)
|
||||||
|
printf("v = %d, used=%d/%d, tail=%d\n", *p, que1.usedSize, que1.bufSize, que1.tail);
|
||||||
|
|
||||||
|
v = 200;
|
||||||
|
if (QueueMallocSpaceChk(&que1, sizeof(int))) {
|
||||||
|
p = QueueMallocInput(&que1, &v, sizeof(int));
|
||||||
|
printf("v = %d, used=%d/%d, tail=%d\n", *p, que1.usedSize, que1.bufSize, que1.tail);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("******* pop *****\n");
|
||||||
|
// pop
|
||||||
|
uint16_t size;
|
||||||
|
sp = QueueMallocOutput(&que1, &size);
|
||||||
|
printf("size=%d, str=%s, cnt=%d\n", size, sp, QueueMallocGetCnt(&que1));
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
QueueMallocPeek(&que1, &size);
|
||||||
|
printf("size=%d, cnt=%d\n", size, QueueMallocGetCnt(&que1));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
37
LVGL.Simulator/lvgl_mydemo/lib/data_struct/queue_malloc.h
Normal file
37
LVGL.Simulator/lvgl_mydemo/lib/data_struct/queue_malloc.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#ifndef __QUEUE_MALLOC_H__
|
||||||
|
#define __QUEUE_MALLOC_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
// config
|
||||||
|
#define DEF_TEST_MALLOC_QUEUE 0
|
||||||
|
|
||||||
|
//
|
||||||
|
typedef uint16_t val_size; // 两个字节记录数据长度
|
||||||
|
|
||||||
|
typedef struct _queue_ {
|
||||||
|
bool init;
|
||||||
|
uint8_t *buf;
|
||||||
|
uint32_t bufSize;
|
||||||
|
uint32_t front;
|
||||||
|
uint32_t tail;
|
||||||
|
uint32_t elemCnt;
|
||||||
|
uint32_t usedSize;
|
||||||
|
} queue_t;
|
||||||
|
|
||||||
|
void QueueMallocInit(queue_t *q, uint8_t *buf, uint32_t buf_size);
|
||||||
|
void *QueueMallocInput(queue_t *q, void *val, val_size valSize);
|
||||||
|
void *QueueMallocOutput(queue_t *q, val_size *size);
|
||||||
|
bool QueueMallocSpaceChk(queue_t *q, val_size size);
|
||||||
|
void *QueueMallocPeek(queue_t *q, val_size *size);
|
||||||
|
void *QueueMallocPeekAfter(queue_t *q, void *cur_item, val_size *size);
|
||||||
|
void QueueMallocClear(queue_t *q);
|
||||||
|
uint32_t QueueMallocGetCnt(queue_t *q);
|
||||||
|
|
||||||
|
#endif
|
||||||
158
LVGL.Simulator/lvgl_mydemo/lib/data_struct/stack_malloc.c
Normal file
158
LVGL.Simulator/lvgl_mydemo/lib/data_struct/stack_malloc.c
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
|
||||||
|
#include "stack_malloc.h"
|
||||||
|
#if DEF_TEST_MALLOC_STACK
|
||||||
|
#include <string.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DEF_STACK_NODE_NEXT_OFFS(s) (s->size)
|
||||||
|
#define DEF_STACK_NODE_P_SIZE (sizeof(stack_node_p *))
|
||||||
|
#define DEF_STACK_NODE_SIZE(s) (s->size + sizeof(stack_node_p *))
|
||||||
|
|
||||||
|
static void StackMallocSetNext(stack_t *s, stack_node *act, stack_node *next) {
|
||||||
|
uint8_t *act8 = (uint8_t *)act;
|
||||||
|
act8 += DEF_STACK_NODE_NEXT_OFFS(s);
|
||||||
|
|
||||||
|
stack_node_p **act_node_next = (stack_node_p **)act8;
|
||||||
|
stack_node_p **next_node_p = (stack_node_p **)&next;
|
||||||
|
|
||||||
|
*act_node_next = *next_node_p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StackMallocInit(stack_t *s, uint32_t size) {
|
||||||
|
if (s == NULL) return;
|
||||||
|
|
||||||
|
#ifdef DEF_BYTE_ALIGN_8
|
||||||
|
size = (size + 7) & (~0x7);
|
||||||
|
#else
|
||||||
|
size = (size + 3) & (~0x3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s->size = size;
|
||||||
|
if (s != NULL) {
|
||||||
|
s->head = DEF_STACK_MALLOC(DEF_STACK_NODE_SIZE(s));
|
||||||
|
s->tail = s->head;
|
||||||
|
if (s->head != NULL) {
|
||||||
|
StackMallocSetNext(s, s->head, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *StackMallocGetNext(stack_t *s) {
|
||||||
|
const stack_node_p *head = (stack_node_p *)s->head;
|
||||||
|
head += DEF_STACK_NODE_NEXT_OFFS(s);
|
||||||
|
return *((stack_node_p **)head);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *StackMallocPush(stack_t *s) {
|
||||||
|
stack_node *new_node;
|
||||||
|
|
||||||
|
new_node = DEF_STACK_MALLOC(s->size + DEF_STACK_NODE_P_SIZE);
|
||||||
|
|
||||||
|
if (new_node != NULL) {
|
||||||
|
StackMallocSetNext(s, new_node, s->head);
|
||||||
|
s->head = new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StackMallocEmpty(stack_t *s) {
|
||||||
|
if (s->head == s->tail) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StackMallocPop(stack_t *s, void *data) {
|
||||||
|
stack_node *next_node;
|
||||||
|
stack_node *old_node;
|
||||||
|
|
||||||
|
if (StackMallocEmpty(s)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
old_node = s->head;
|
||||||
|
s->head = StackMallocGetNext(s);
|
||||||
|
|
||||||
|
if (data != NULL) {
|
||||||
|
memcpy(data, old_node, DEF_STACK_NODE_SIZE(s));
|
||||||
|
}
|
||||||
|
DEF_STACK_FREE(old_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************** test ***************************************/
|
||||||
|
#if DEF_TEST_MALLOC_STACK
|
||||||
|
|
||||||
|
typedef struct info {
|
||||||
|
int id;
|
||||||
|
int age;
|
||||||
|
char name[16];
|
||||||
|
float soc;
|
||||||
|
} INFO;
|
||||||
|
|
||||||
|
typedef struct image {
|
||||||
|
int id;
|
||||||
|
int w;
|
||||||
|
int h;
|
||||||
|
struct pos {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
} IMAGE;
|
||||||
|
|
||||||
|
stack_t stack_info;
|
||||||
|
stack_t stack_image;
|
||||||
|
//
|
||||||
|
int main() {
|
||||||
|
StackMallocInit(&stack_info, sizeof(INFO));
|
||||||
|
StackMallocInit(&stack_image, sizeof(IMAGE));
|
||||||
|
|
||||||
|
// info
|
||||||
|
INFO *info1 = StackMallocPush(&stack_info);
|
||||||
|
INFO *info2 = StackMallocPush(&stack_info);
|
||||||
|
if (info1 != NULL) {
|
||||||
|
info1->id = 0;
|
||||||
|
info1->age = 23;
|
||||||
|
strcpy(info1->name, "ZhangSan");
|
||||||
|
info1->soc = 19.3;
|
||||||
|
}
|
||||||
|
if (info2 != NULL) {
|
||||||
|
info2->id = 1;
|
||||||
|
info2->age = 25;
|
||||||
|
strcpy(info2->name, "LiSi");
|
||||||
|
info2->soc = 56.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!StackMallocEmpty(&stack_info)) {
|
||||||
|
INFO i;
|
||||||
|
StackMallocPop(&stack_info, &i);
|
||||||
|
printf("id=%d, age=%d, name=%s, soc=%.2f\n", i.id, i.age, i.name, i.soc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// image
|
||||||
|
IMAGE *img1 = StackMallocPush(&stack_image);
|
||||||
|
IMAGE *img2 = StackMallocPush(&stack_image);
|
||||||
|
if (img1 != NULL) {
|
||||||
|
img1->id = 0;
|
||||||
|
img1->w = 100;
|
||||||
|
img1->h = 101;
|
||||||
|
img1->x = 50;
|
||||||
|
img1->y = 51;
|
||||||
|
}
|
||||||
|
if (img2 != NULL) {
|
||||||
|
img2->id = 1;
|
||||||
|
img2->w = 200;
|
||||||
|
img2->h = 201;
|
||||||
|
img2->x = 250;
|
||||||
|
img2->y = 251;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!StackMallocEmpty(&stack_image)) {
|
||||||
|
IMAGE m;
|
||||||
|
StackMallocPop(&stack_image, &m);
|
||||||
|
printf("id=%d, w=%d, h=%d, x=%d, y=%d\n", m.id, m.w, m.h, m.x, m.y);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
36
LVGL.Simulator/lvgl_mydemo/lib/data_struct/stack_malloc.h
Normal file
36
LVGL.Simulator/lvgl_mydemo/lib/data_struct/stack_malloc.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef __STATIC_MALLOC_H__
|
||||||
|
#define __STATIC_MALLOC_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
// define
|
||||||
|
#define DEF_BYTE_ALIGN_8 0
|
||||||
|
#define DEF_BYTE_ALIGN_4 1
|
||||||
|
// config
|
||||||
|
#define DEF_LIST_ALIGN_MODE DEF_BYTE_ALIGN_8
|
||||||
|
#define DEF_STACK_MALLOC(size) malloc(size)
|
||||||
|
#define DEF_STACK_FREE(p) free(p)
|
||||||
|
#define DEF_TEST_MALLOC_STACK 0
|
||||||
|
|
||||||
|
//
|
||||||
|
typedef uint8_t stack_node_p;
|
||||||
|
|
||||||
|
typedef struct _stack_node_ {
|
||||||
|
stack_node_p *data;
|
||||||
|
stack_node_p *next;
|
||||||
|
} stack_node;
|
||||||
|
|
||||||
|
typedef struct _stack_ {
|
||||||
|
uint32_t size;
|
||||||
|
stack_node *head;
|
||||||
|
stack_node *tail;
|
||||||
|
} stack_t;
|
||||||
|
|
||||||
|
void StackMallocInit(stack_t *s, uint32_t size);
|
||||||
|
void *StackMallocPush(stack_t *s);
|
||||||
|
void StackMallocPop(stack_t *s, void *data);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,464 +0,0 @@
|
|||||||
/************************************************************************
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
/************************************************************************
|
|
||||||
* 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__ */
|
|
||||||
208
LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.c
Normal file
208
LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.c
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
|
||||||
|
#include "lib_sys_log.h"
|
||||||
|
#include "data_struct/queue_malloc.h"
|
||||||
|
|
||||||
|
typedef struct lib_log_writer_handle_t {
|
||||||
|
void *LastLogElement;
|
||||||
|
uint32_t LastSeqNbr;
|
||||||
|
Lib_LogWr_Fn Wr;
|
||||||
|
bool PerifRdy;
|
||||||
|
} LIB_LOG_WRITER_T;
|
||||||
|
|
||||||
|
typedef struct lib_log_handle_t {
|
||||||
|
bool InitDone;
|
||||||
|
uint32_t RdSeqNbr;
|
||||||
|
uint32_t WrSeqNbr;
|
||||||
|
queue_t Queue;
|
||||||
|
uint8_t WorkBuf[DEF_LIB_LOG_MAX_MSG_SIZE];
|
||||||
|
LIB_LOG_WRITER_T WriterArray[DEF_LIB_LOG_MAX_WRITER_NBR];
|
||||||
|
} LIB_LOG_HANDLE_T;
|
||||||
|
|
||||||
|
static LIB_LOG_HANDLE_T Lib_LogHdl;
|
||||||
|
static uint8_t Lib_LogBuff[DEF_LIB_LOG_MSG_Q_SIZE];
|
||||||
|
static uint32_t Lib_LogSeqNbr = 0;
|
||||||
|
static volatile bool Lib_LogProcReq = false;
|
||||||
|
|
||||||
|
/********** static ************/
|
||||||
|
static inline void Lib_LogLock(void)
|
||||||
|
{
|
||||||
|
// LockFun();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void Lib_LogUnlock(void)
|
||||||
|
{
|
||||||
|
// UnlockFun();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t Lib_LogGetTs(void)
|
||||||
|
{
|
||||||
|
// return GetTick();
|
||||||
|
return lv_tick_get();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Lib_LogStartProcReq(void)
|
||||||
|
{
|
||||||
|
Lib_LogProcReq = true;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
void Lib_LogInit(void)
|
||||||
|
{
|
||||||
|
QueueMallocInit(&Lib_LogHdl.Queue, Lib_LogBuff, sizeof(Lib_LogBuff));
|
||||||
|
Lib_LogHdl.InitDone = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lib_LogPrintf(uint8_t level, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
LIB_LOG_ITEM_T *log_item;
|
||||||
|
queue_t *que = &Lib_LogHdl.Queue;
|
||||||
|
char *prefix;
|
||||||
|
va_list args;
|
||||||
|
uint32_t ts;
|
||||||
|
int32_t ret;
|
||||||
|
uint32_t log_item_size;
|
||||||
|
|
||||||
|
if (!Lib_LogHdl.InitDone) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* clang-format off */
|
||||||
|
switch (level) {
|
||||||
|
case DEF_LIB_LOG_NONE: prefix = "[N]"; break;
|
||||||
|
case DEF_LIB_LOG_ERR : prefix = "[E]"; break;
|
||||||
|
case DEF_LIB_LOG_WARN: prefix = "[W]"; break;
|
||||||
|
case DEF_LIB_LOG_INFO: prefix = "[I]"; break;
|
||||||
|
case DEF_LIB_LOG_DBG : prefix = "[D]"; break;
|
||||||
|
default: prefix = ""; break;
|
||||||
|
}
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
Lib_LogLock();
|
||||||
|
log_item = (LIB_LOG_ITEM_T *)Lib_LogHdl.WorkBuf;
|
||||||
|
va_start(args, fmt);
|
||||||
|
ts = Lib_LogGetTs();
|
||||||
|
ret = snprintf((char *)log_item->Buf, DEF_LIB_LOG_MAX_MSG_SIZE, "(%u) %s", ts, prefix);
|
||||||
|
ret += vsnprintf((char *)log_item->Buf + ret, DEF_LIB_LOG_MAX_MSG_SIZE - ret, fmt, args);
|
||||||
|
ret++;
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
if (ret > 0) {
|
||||||
|
log_item->Lv = level;
|
||||||
|
log_item->Len = ret;
|
||||||
|
log_item->Ts = ts;
|
||||||
|
log_item->SeqNbr = Lib_LogSeqNbr++;
|
||||||
|
log_item_size = ret + sizeof(LIB_LOG_ITEM_T);
|
||||||
|
while (!QueueMallocSpaceChk(que, log_item_size)) {
|
||||||
|
QueueMallocOutput(que, NULL);
|
||||||
|
Lib_LogHdl.RdSeqNbr++;
|
||||||
|
}
|
||||||
|
QueueMallocInput(que, log_item, log_item_size);
|
||||||
|
Lib_LogHdl.WrSeqNbr = log_item->SeqNbr;
|
||||||
|
Lib_LogNeedWr();
|
||||||
|
}
|
||||||
|
Lib_LogUnlock();
|
||||||
|
|
||||||
|
#if DEF_LIB_LOG_PRINTF
|
||||||
|
printf("%s\n", log_item->Buf);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lib_LogHexArray(uint8_t *data, uint32_t len)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LIB_LOG_WR_T Lib_LogRegistWriter(Lib_LogWr_Fn wr_fnct)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
Lib_LogLock();
|
||||||
|
for (i = 0; i < DEF_LIB_LOG_MAX_WRITER_NBR; i++) {
|
||||||
|
if (Lib_LogHdl.WriterArray[i].Wr == NULL) {
|
||||||
|
Lib_LogHdl.WriterArray[i].Wr = wr_fnct;
|
||||||
|
Lib_LogHdl.WriterArray[i].PerifRdy = true;
|
||||||
|
Lib_LogHdl.WriterArray[i].LastSeqNbr = Lib_LogHdl.RdSeqNbr;
|
||||||
|
Lib_LogUnlock();
|
||||||
|
return (LIB_LOG_WR_T *)(&Lib_LogHdl.WriterArray[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Lib_LogUnlock();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Lib_LogUnregistWriter(LIB_LOG_WR_T writer_hdl)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
Lib_LogLock();
|
||||||
|
for (i = 0; i < DEF_LIB_LOG_MAX_WRITER_NBR; i++) {
|
||||||
|
if (Lib_LogHdl.WriterArray[i].Wr == writer_hdl) {
|
||||||
|
Lib_LogHdl.WriterArray[i].Wr = NULL;
|
||||||
|
Lib_LogHdl.WriterArray[i].PerifRdy = false;
|
||||||
|
Lib_LogHdl.WriterArray[i].LastSeqNbr = 0;
|
||||||
|
Lib_LogUnlock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Lib_LogUnlock();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lib_LogNeedWr(void)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
Lib_LogLock();
|
||||||
|
for (i = 0; i < DEF_LIB_LOG_MAX_WRITER_NBR; i++) {
|
||||||
|
if (Lib_LogHdl.WriterArray[i].Wr != NULL) {
|
||||||
|
Lib_LogHdl.WriterArray[i].PerifRdy = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Lib_LogUnlock();
|
||||||
|
Lib_LogStartProcReq();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lib_LogLoop(void)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
LIB_LOG_WRITER_T *write;
|
||||||
|
LIB_LOG_ITEM_T *log_item;
|
||||||
|
|
||||||
|
if (!Lib_LogProcReq) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Lib_LogProcReq = false;
|
||||||
|
|
||||||
|
for (i = 0; i < DEF_LIB_LOG_MAX_WRITER_NBR; i++) {
|
||||||
|
Lib_LogLock();
|
||||||
|
write = &Lib_LogHdl.WriterArray[i];
|
||||||
|
if (write->Wr == NULL || write->PerifRdy == false) {
|
||||||
|
Lib_LogUnlock();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (write->LastLogElement == NULL || write->LastSeqNbr < Lib_LogHdl.RdSeqNbr) { // 第一次写
|
||||||
|
write->LastSeqNbr = Lib_LogHdl.RdSeqNbr;
|
||||||
|
log_item = QueueMallocPeek(&Lib_LogHdl.Queue, NULL);
|
||||||
|
Lib_LogUnlock();
|
||||||
|
if (log_item) {
|
||||||
|
write->PerifRdy = false;
|
||||||
|
if (write->Wr(log_item)) {
|
||||||
|
write->LastLogElement = log_item;
|
||||||
|
} else {
|
||||||
|
write->PerifRdy = true;
|
||||||
|
}
|
||||||
|
Lib_LogProcReq = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log_item = QueueMallocPeekAfter(&Lib_LogHdl.Queue, write->LastLogElement, NULL);
|
||||||
|
Lib_LogUnlock();
|
||||||
|
if (log_item) {
|
||||||
|
write->PerifRdy = false;
|
||||||
|
if (write->Wr(log_item)) {
|
||||||
|
write->LastLogElement = log_item;
|
||||||
|
write->LastSeqNbr++;
|
||||||
|
} else {
|
||||||
|
write->PerifRdy = true;
|
||||||
|
}
|
||||||
|
Lib_LogProcReq = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
122
LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.h
Normal file
122
LVGL.Simulator/lvgl_mydemo/lib/lib_sys_log.h
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
#ifndef __DEF_LIB_LOG_H__
|
||||||
|
#define __DEF_LIB_LOG_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_LOG_EXT
|
||||||
|
#else
|
||||||
|
# define DEF_LIB_LOG_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 DEF_LIB_LOG_NONE 0
|
||||||
|
#define DEF_LIB_LOG_ERR 1
|
||||||
|
#define DEF_LIB_LOG_WARN 2
|
||||||
|
#define DEF_LIB_LOG_INFO 3
|
||||||
|
#define DEF_LIB_LOG_DBG 4
|
||||||
|
#define DEF_LIB_LOG_V 5
|
||||||
|
// config
|
||||||
|
#define DEF_LIB_LOG_LEVEL DEF_LIB_LOG_DBG
|
||||||
|
|
||||||
|
#define DEF_LIB_LOG_PRINTF 0
|
||||||
|
#define DEF_LIB_LOG_COLOR_PRINT_EN 1
|
||||||
|
|
||||||
|
#define DEF_LIB_LOG_MSG_Q_SIZE 4096
|
||||||
|
#define DEF_LIB_LOG_MAX_MSG_SIZE 256
|
||||||
|
#define DEF_LIB_LOG_MAX_WRITER_NBR 5
|
||||||
|
|
||||||
|
#define DEF_LIB_LOG_HEX_ARRAY_LINE_LEN 32
|
||||||
|
#define DEF_LIB_LOG_HEX_ARRAY_ITEM_LEN 4
|
||||||
|
|
||||||
|
//////////////////////////
|
||||||
|
#if (DEF_LIB_LOG_LEVEL >= DEF_LIB_LOG_V)
|
||||||
|
# define TRACE_V(FMT, ...) Lib_LogPrintf(DEF_LIB_LOG_V, FMT, ##__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
# define TRACE_V(FMT, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEF_LIB_LOG_LEVEL >= DEF_LIB_LOG_DBG)
|
||||||
|
# define TRACE_D(FMT, ...) Lib_LogPrintf(DEF_LIB_LOG_DBG, FMT, ##__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
# define TRACE_D(FMT, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEF_LIB_LOG_LEVEL >= DEF_LIB_LOG_INFO)
|
||||||
|
# define TRACE_I(FMT, ...) Lib_LogPrintf(DEF_LIB_LOG_INFO, FMT, ##__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
# define TRACE_I(FMT, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEF_LIB_LOG_LEVEL >= DEF_LIB_LOG_WARN)
|
||||||
|
# define TRACE_W(FMT, ...) Lib_LogPrintf(DEF_LIB_LOG_WARN, FMT, ##__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
# define TRACE_W(FMT, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEF_LIB_LOG_LEVEL >= DEF_LIB_LOG_ERR)
|
||||||
|
# define TRACE_E(FMT, ...) Lib_LogPrintf(DEF_LIB_LOG_ERR, FMT, ##__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
# define TRACE_E(FMT, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (DEF_LIB_LOG_LEVEL >= DEF_LIB_LOG_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_LOG_ITEM_T;
|
||||||
|
|
||||||
|
typedef bool (*Lib_LogWr_Fn)(LIB_LOG_ITEM_T *item);
|
||||||
|
|
||||||
|
typedef void *LIB_LOG_WR_T;
|
||||||
|
|
||||||
|
/*********************************************************************************
|
||||||
|
* GLOBAL PROTOTYPES
|
||||||
|
* *******************************************************************************/
|
||||||
|
DEF_LIB_LOG_EXT void Lib_LogInit(void);
|
||||||
|
|
||||||
|
DEF_LIB_LOG_EXT void Lib_LogPrintf(uint8_t lv, const char *fmt, ...);
|
||||||
|
|
||||||
|
DEF_LIB_LOG_EXT void Lib_LogHexArray(uint8_t *data, uint32_t len);
|
||||||
|
|
||||||
|
DEF_LIB_LOG_EXT LIB_LOG_WR_T Lib_LogRegistWriter(Lib_LogWr_Fn wr_fnct);
|
||||||
|
|
||||||
|
DEF_LIB_LOG_EXT bool Lib_LogUnregistWriter(LIB_LOG_WR_T writer_hdl);
|
||||||
|
|
||||||
|
DEF_LIB_LOG_EXT void Lib_LogNeedWr(void);
|
||||||
|
|
||||||
|
DEF_LIB_LOG_EXT void Lib_LogLoop(void);
|
||||||
|
|
||||||
|
#endif /* __DEF_LIB_LOG_H__ */
|
||||||
@@ -33,20 +33,27 @@ static void log_write_timer_cb(lv_timer_t *t)
|
|||||||
{
|
{
|
||||||
LV_UNUSED(t);
|
LV_UNUSED(t);
|
||||||
|
|
||||||
TRACE_V("Hello wrold!");
|
Lib_LogLoop();
|
||||||
TRACE_D("Hello wrold!");
|
|
||||||
TRACE_I("Hello wrold!");
|
|
||||||
TRACE_E("Hello wrold!");
|
|
||||||
TRACE_W("Hello wrold!");
|
|
||||||
|
|
||||||
Lib_LogProc();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool log_write_to_file(LIB_TRACE_ITEM_HANDLE_T *item)
|
static bool log_write_to_file(LIB_LOG_ITEM_T *item)
|
||||||
{
|
{
|
||||||
TRACE_D("item info = %s", item->Buf);
|
printf("File %s\n", item->Buf);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool log_write_to_flash(LIB_LOG_ITEM_T *item)
|
||||||
|
{
|
||||||
|
printf("Flash %s\n", item->Buf);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool log_write_to_sd(LIB_LOG_ITEM_T *item)
|
||||||
|
{
|
||||||
|
printf("Sd %s\n", item->Buf);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* GLOBAL FUNCTION
|
* GLOBAL FUNCTION
|
||||||
* *******************************************************************************/
|
* *******************************************************************************/
|
||||||
@@ -54,12 +61,19 @@ static bool log_write_to_file(LIB_TRACE_ITEM_HANDLE_T *item)
|
|||||||
void lvgl_app_init(void)
|
void lvgl_app_init(void)
|
||||||
{
|
{
|
||||||
Lib_LogInit();
|
Lib_LogInit();
|
||||||
Lib_LogRegistWriter(log_write_to_file);
|
|
||||||
|
Lib_LogRegistWriter(log_write_to_file); // 模拟写日志到文件
|
||||||
|
Lib_LogRegistWriter(log_write_to_flash); // 模拟写日志到Flash
|
||||||
|
Lib_LogRegistWriter(log_write_to_sd); // 模拟写日志到SD卡
|
||||||
|
|
||||||
|
Lib_LogUnregistWriter(log_write_to_sd);
|
||||||
|
|
||||||
DataModelInit();
|
DataModelInit();
|
||||||
|
|
||||||
ScrMgrInit();
|
ScrMgrInit();
|
||||||
ScrMgrSwitchScr(GUI_MIAN_SCR_ID, true);
|
ScrMgrSwitchScr(GUI_MIAN_SCR_ID, true);
|
||||||
|
|
||||||
lv_timer_create(log_write_timer_cb, 3000, NULL);
|
TRACE_W("Hello wrold!");
|
||||||
|
|
||||||
|
lv_timer_create(log_write_timer_cb, 50, NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
* *******************************************************************************/
|
* *******************************************************************************/
|
||||||
#include "../lvgl/lvgl.h"
|
#include "../lvgl/lvgl.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "lib/lib_log.h"
|
#include "lib/lib_sys_log.h"
|
||||||
#include "data/dataModel.h"
|
#include "data/dataModel.h"
|
||||||
#include "data/gui_scr_mgr.h"
|
#include "data/gui_scr_mgr.h"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user