页面数据刷新

一、数据刷新机制

1、主动刷新

使用lvgl的timer定时刷新。在定时回调函数中主动获取数据源然后设置到页面上更新显示。

示例:创建一个文本显示步数值,通过timer定时一秒更新一次显示内容
lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data);
timer_xcb: 触发更新时要执行的回调函数
period: 刷新时间周期,单位毫秒
user_data: 传递的自定义数据,可以在回调函数中使用\

lv_obj_t *label = NULL;

static void refresh_timer_cb(lv_timer_t *timer)
{
	step_info_t *step = (step_info_t *) app_rt_info_get(RT_STEP);
	lv_label_set_text_fmt(label, "%d", step->step);
}
static void on_start(void)
{
	/*创建一个文本控件*/
	label = lv_label_create(lv_scr_act());
	/*设置文本的字号大小和字体颜色*/
	lv_ext_set_local_font(label, FONT_SMALL, lv_color_make(0xBE, 0xBE, 0xBE));
	/*创建一个timer,每秒更新一次显示内容*/
	lv_timer_create(refresh_timer_cb, 1000, NULL);
}
static void on_resume(void)
{
	/*主动更新当前显示的步数值*/
	step_info_t *step = (step_info_t *) app_rt_info_get(RT_STEP);
	lv_label_set_text_fmt(label, "%d", step->step);
}

2、被动刷新

使用思澈平台提供的数据订阅机制进行被动刷新。给控件绑定一个数据ID, 当此ID对应的数据在底层更新以后,把更新的信息通知到UI,让UI触发刷新事件进而更新显示内容。

示例:创建一个文本显示步数值,通过数据订阅更新显示内容
int lv_obj_data_subscribe(lv_obj_t *obj, uint16_t idx, lv_obj_datasubs_cb_t cb);
obj: 控件指针
idx: 数据ID,所有的ID必须是唯一的
cb: 触发更新时要执行的回调函数\

lv_obj_t *label = NULL;

static void refresh_subsdata_cb(lv_obj_t *obj, lv_obj_datasubs_t *data)
{
	step_info_t *step = (step_info_t *)app_db_get_rt_data(RT_STEP);
	lv_label_set_text_fmt(obj, "%d", step->step);
}

static void on_start(void)
{
	/*创建一个文本控件*/
	label = lv_label_create(lv_scr_act());
	/*设置文本的字号大小和字体颜色*/
	lv_ext_set_local_font(label, FONT_SMALL, lv_color_make(0xBE, 0xBE, 0xBE));
	/*给文本绑定步数值的ID,用于步数值的更新显示*/
	lv_obj_data_subscribe(label, SENSOR_APP_RT_STEP, refresh_subsdata_cb);
}
static void on_resume(void)
{
	/*主动更新当前显示的步数值*/
	step_info_t *step = (step_info_t *) app_rt_info_get(RT_STEP);
	lv_label_set_text_fmt(label, "%d", step->step);
}

此模式下需要在数据源发生变化时往上层进行主动通知,以步数为例。在文件sensor_app_adaptor.c中添加如下代码:

void sensor_app_lv_customize_process(hl_if_data_t *msg)
{
	switch ((uint16_t)msg->sub_type)
	{
		case SENSOR_APP_RT_STEP_INFO_IND:
		{
#ifdef APP_DATA_NOTIFY
			sensor_rt_data_step_notify(msg);
#endif
			app_db_set_rt_data(RT_STEP, (void *)msg->data, msg->data_len);
			break;
		}
	}
}

在app_data_notify.c中添加一下代码,即可完成底层通知流程:

void sensor_rt_data_step_notify(hl_if_data_t *msg)
{
	step_info_t *step = (step_info_t *)msg->data;
	lv_obj_datasubs_notify(SENSOR_APP_RT_STEP, LV_EVENT_REFRESH, &step->step, sizeof(uint32_t));
}

二、唤醒状态数据如何刷新

当系统处于唤醒状态,主动刷新和被动刷新均可使用。

三、睡眠状态数据如何刷新

当系统处于睡眠状态,此时UI线程已经停止工作,主动刷新的timer已经停止运行, 被动刷新的数据订阅机制也停止运行了。但是sensor数据的更新不受影响,仍然会将更新的值保存到app db中。所以在唤醒的时候需要主动的刷新一下显示内容。