mcu_ab568x/userboot240328/app/platform/gui/components/components.c
2025-05-30 18:03:10 +08:00

239 lines
6.4 KiB
C

#include "include.h"
#define TRACE_EN 1
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
compo_cb_t compo_cb AT(.disp.compo);
static u8 compos_buf[COMPO_BUF_SIZE] AT(.disp.buf); //Components Buf
//获取组件结构体Size
static int compo_get_size(int type)
{
int compo_size;
switch (type) {
case COMPO_TYPE_FORM:
compo_size = sizeof(compo_form_t);
break;
case COMPO_TYPE_PICTUREBOX:
compo_size = sizeof(compo_picturebox_t);
break;
case COMPO_TYPE_TEXTBOX:
compo_size = sizeof(compo_textbox_t);
break;
case COMPO_TYPE_SHAPE:
compo_size = sizeof(compo_shape_t);
break;
case COMPO_TYPE_BUTTON:
compo_size = sizeof(compo_button_t);
break;
case COMPO_TYPE_NUMBER:
compo_size = sizeof(compo_number_t);
break;
case COMPO_TYPE_DATETIME:
compo_size = sizeof(compo_datetime_t);
break;
case COMPO_TYPE_LISTBOX:
compo_size = sizeof(compo_listbox_t);
break;
case COMPO_TYPE_ICONLIST:
compo_size = sizeof(compo_iconlist_t);
break;
case COMPO_TYPE_ROTARY:
compo_size = sizeof(compo_rotary_t);
break;
default:
TRACE("Unknow Compo Type: %d\n", type);
halt(HALT_GUI_COMPO_UNKNOW_TYPE);
return 0;
}
return compo_size;
}
//查询当前compo buf
bool compo_in_buf0(void *compo)
{
u8 *compo_buf = compo;
if (compo_buf >= compo_cb.buf0 && compo_buf < compo_cb.buf0 + compo_cb.buf0_size) {
return true;
} else if (compo_buf >= compo_cb.buf1 && compo_buf < compo_cb.buf1 + compo_cb.buf1_size) {
return false;
} else {
halt(HALT_GUI_COMPO_PTR);
return false;
}
}
//获取第一个
void *compo_get_head(void)
{
return compo_pool_get_bottom();
}
//获取下一个
component_t *compo_get_next(component_t *compo)
{
if (compo == NULL) {
halt(HALT_GUI_COMPO_GET_NEXT);
}
int compo_size = compo_get_size(compo->type);
u8* compo_next = (u8 *)compo + compo_size;
if (compo_in_buf0(compo)) {
if (compo_next < (u8 *)compo_cb.buf0 + compo_cb.buf0_pos) {
return (component_t *)compo_next;
} else if (compo_cb.top_num == 1 && compo_cb.buf1_pos > 0) {
return (component_t *)compo_cb.buf1;
} else {
return NULL;
}
} else {
if (compo_next < (u8 *)compo_cb.buf1 + compo_cb.buf1_pos) {
return (component_t *)compo_next;
} else if (compo_cb.top_num == 0 && compo_cb.buf0_pos > 0) {
return (component_t *)compo_cb.buf0;
} else {
return NULL;
}
}
}
//新建一个组件
void *compo_create(compo_form_t *parent, u8 type)
{
if (parent == NULL) {
halt(HALT_GUI_COMPO_CREATE);
}
component_t *compo;
int compo_size = compo_get_size(type);
u8 *parent_buf = (u8 *)parent;
if (parent_buf == compo_cb.buf0) {
if (compo_cb.buf0_pos + compo_size > compo_cb.buf0_size) {
TRACE("Compo Size Exceed\n");
halt(HALT_GUI_COMPO_BUF_EXCEED);
}
compo = (component_t *)(compo_cb.buf0 + compo_cb.buf0_pos);
compo_cb.buf0_pos += compo_size;
} else if (parent_buf == compo_cb.buf1) {
if (compo_cb.buf1_pos + compo_size > compo_cb.buf1_size) {
TRACE("Compo Size Exceed\n");
halt(HALT_GUI_COMPO_BUF_EXCEED);
}
compo = (component_t *)(compo_cb.buf1 + compo_cb.buf1_pos);
compo_cb.buf1_pos += compo_size;
} else {
halt(HALT_GUI_COMPO_CREATE);
return NULL;
}
memset(compo, 0, compo_size);
compo->type = type;
return compo;
}
//设置组件ID
void compo_setid(void *compo, u16 id)
{
if (compo == NULL) {
halt(HALT_GUI_COMPO_POOL_SETID);
}
((component_t *)compo)->id = id;
}
//新建一个组件池
void *compo_pool_create(bool flag_top)
{
compo_form_t *frm;
if (compo_cb.buf0_pos == 0) {
compo_cb.buf0_pos = sizeof(compo_form_t);
compo_cb.top_num = flag_top ? 0 : 1;
frm = (compo_form_t *)compo_cb.buf0;
} else if (compo_cb.buf1_pos == 0) {
compo_cb.buf1_pos = sizeof(compo_form_t);
compo_cb.top_num = flag_top ? 1 : 0;
frm = (compo_form_t *)compo_cb.buf1;
} else {
halt(HALT_GUI_COMPO_POOL_CREATE);
return NULL;
}
memset(frm, 0, sizeof(compo_form_t));
return frm;
}
//清空组件池
void compo_pool_clear(compo_form_t *compo)
{
u8 *compo_buf = (u8 *)compo;
if (compo_cb.buf0 == compo_buf) {
compo_cb.buf0_pos = 0;
} else if (compo_cb.buf1 == compo_buf) {
compo_cb.buf1_pos = 0;
} else {
halt(HALT_GUI_COMPO_POOL_CLEAR);
}
}
//获取组件池顶上一个
compo_form_t *compo_pool_get_top(void)
{
if (compo_cb.top_num == 0) {
if (compo_cb.buf0_pos >= sizeof(compo_form_t)) {
return (compo_form_t *)compo_cb.buf0;
}
if (compo_cb.buf1_pos >= sizeof(compo_form_t)) {
return (compo_form_t *)compo_cb.buf1;
}
} else {
if (compo_cb.buf1_pos >= sizeof(compo_form_t)) {
return (compo_form_t *)compo_cb.buf1;
}
if (compo_cb.buf0_pos >= sizeof(compo_form_t)) {
return (compo_form_t *)compo_cb.buf0;
}
}
return NULL;
}
//获取组件池底下一个
compo_form_t *compo_pool_get_bottom(void)
{
if (compo_cb.top_num == 0) {
if (compo_cb.buf1_pos >= sizeof(compo_form_t)) {
return (compo_form_t *)compo_cb.buf1;
}
if (compo_cb.buf0_pos >= sizeof(compo_form_t)) {
return (compo_form_t *)compo_cb.buf0;
}
} else {
if (compo_cb.buf0_pos >= sizeof(compo_form_t)) {
return (compo_form_t *)compo_cb.buf0;
}
if (compo_cb.buf1_pos >= sizeof(compo_form_t)) {
return (compo_form_t *)compo_cb.buf1;
}
}
return NULL;
}
//初始化组件Buffer
void compos_init(void)
{
memset(&compo_cb, 0, sizeof(compo_cb));
compo_cb.buf0 = compos_buf;
compo_cb.buf0_size = COMPO_BUF_SIZE / 2;
compo_cb.buf1 = compos_buf + COMPO_BUF_SIZE / 2;
compo_cb.buf1_size = COMPO_BUF_SIZE / 2;
}