App - 指一個(gè)應(yīng)用程序的GUI部分,即MVC模型中的View部分,它是page的集合。支持內(nèi)置App以及動(dòng)態(tài)安裝App。
Page - 指一個(gè)顯示頁(yè)面,允許用戶在上面創(chuàng)建控件、注冊(cè)輸入設(shè)備處理、鏈接數(shù)據(jù)服務(wù)并顯示,(注意這不是lv_page)。每個(gè)page擁有獨(dú)立的lv_screen,狀態(tài)處理回調(diào)函數(shù),以及轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
lv_screen - littleVGL上的虛擬屏幕,一個(gè)物理LCD上同一時(shí)間只能顯示一個(gè)lv_screen的內(nèi)容,輸入設(shè)備只能操作當(dāng)前顯示的lv_screen
AppA、AppB各有3個(gè)page,分別表示為A1~A3,B1~B3 下圖顯示了各種調(diào)度情況下各Page的最終狀態(tài)(注意此處忽略了過(guò)渡態(tài))
typedef struct
{
lv_obj_t *title_text;
lv_obj_t *img_arrow;
lv_img_dsc_t *p_img_arrow_dsc;
datac_handle_t srv_handle;
uint32_t last_degree;
} app_compass_t;
static app_compass_t *p_compass = NULL;
static void compass_request_data(void)
{
}
{
{
case MSG_SERVICE_SUBSCRIBE_RSP:
{
RT_ASSERT(rsp);
if (rsp->result < 0)
{
p_compass->srv_handle = DATA_CONN_INVALID_ID;
}
else
{
compass_request_data();
}
break;
}
case MSG_SRV_COMPASS_CUR_VAL_GET_RSP:
{
compass_data_t *
data = (compass_data_t *)arg->
data;
{
{
uint32_t degree = (3600 -
data->azimuth * 10);
if(degree != p_compass->last_degree)
{
char text_buf[20];
lv_img_set_angle(p_compass->img_arrow, degree);
sprintf(text_buf, "%d d", degree);
lv_label_set_text(p_compass->title_text, text_buf);
p_compass->last_degree = degree;
}
}
}
compass_request_data();
}
break;
default:
break;
}
return 0;
}
static void on_start(void)
{
if (NULL != p_compass)
rt_free(p_compass);
p_compass = rt_malloc(sizeof(app_compass_t));
memset(p_compass, 0, sizeof(app_compass_t));
{
lv_obj_t *obj;
obj = lv_img_create(lv_scr_act(), NULL);
lv_img_set_src(obj, LV_EXT_IMG_GET(compass_bg));
lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0);
obj = lv_img_create(lv_scr_act(), NULL);
p_compass->img_arrow = obj;
obj = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(obj, "230 d");
lv_obj_align(obj, NULL, LV_ALIGN_IN_TOP_LEFT, 10, 10);
p_compass->title_text = obj;
}
compass_data_callback, 0);
}
static void on_pause(void)
{
lv_img_set_src(p_compass->img_arrow, NULL);
if(NULL != p_compass->p_img_arrow_dsc)
{
lv_img_buf_free(p_compass->p_img_arrow_dsc);
p_compass->p_img_arrow_dsc = NULL;
}
}
static void on_resume(void)
{
const lv_img_dsc_t *org_img;
org_img = LV_EXT_IMG_GET(compass_arrow);
p_compass->p_img_arrow_dsc = lv_img_buf_alloc(org_img->header.w,
org_img->header.h,
org_img->header.cf);
memcpy((void *)p_compass->p_img_arrow_dsc->data, org_img->data, org_img->data_size);
lv_img_set_src(p_compass->img_arrow, p_compass->p_img_arrow_dsc);
lv_obj_align(p_compass->img_arrow, NULL, LV_ALIGN_CENTER, 0, 0);
}
static void on_stop(void)
{
if (DATA_CONN_INVALID_ID != p_compass->srv_handle)
{
p_compass->srv_handle = DATA_CONN_INVALID_ID;
}
if (NULL != p_compass)
{
rt_free(p_compass);
p_compass = NULL;
}
}
{
switch (msg)
{
on_start();
break;
on_resume();
break;
on_pause();
break;
on_stop();
break;
default:
break;
}
}
static int app_main(int argc, char *argv[])
{
gui_app_regist_msg_handler(argv[0], msg_handler);
return 0;
}