表盘
表盘是挂载在平铺应用上面的一个子应用,由‘wf_fwk’进行管理。
注册一个内置表盘
WF_REGISTER(priority, id, name, thumb_img, ptr_size)
priority : 表盘优先级,表盘在选择时按照优先级从高(数值小)到低排列,内置表盘的顺序可以动态调整,修改管理链表(”wf_list_get()“)中的优先级即可。
id : 表盘名字,字符串,框架调度该应用时使用,需要保证唯一性
name : 表盘显示标题,多语言字符串,仅作显示用
thumb_img : 表盘缩略图,编辑时使用
ptr_size : 表盘全局内存大小,该内存由框架申请释放,页面可以直接使用,通过‘WF_GET_NODE_MEM_PTR’获取
注意事项
帧率
对于nor方案,为了提高表盘指针渲染效率,需要把指针放入缓存中,使用’app_cache_copy_alloc‘对指针图片进行缓存操作,需要注意缓存空间分PSRAM/SRAM,SRAM足够的条件下可以将秒针放入SRAM(CACHE_SRAM),其他旋转速度慢的直接放入PSRAM(CACHE_PSRAM)即可
nand方案图片资源已经在PSRAM上,无需再重复缓存,仅在SRAM足够的条件下,缓存秒针即可
指针动画功能(clock_pointer_anim_create),开启后激活表盘时指针可以从之前的位置通过一个动画旋转到当前时刻
状态机
由于表盘是平铺的一个子应用,其状态机跟平铺应用是一致的
示例
创建一个优先级是3的simple表盘
static rt_int32_t on_init(void *param)
{
p_clk_simple = (clock_simple_t *)WF_GET_NODE_MEM_PTR();
RT_ASSERT(p_clk_simple);
...
return RT_EOK;
}
static rt_int32_t on_pause(void *param)
{
...
return RT_EOK;
}
static rt_int32_t on_resume(void *param)
{
...
return RT_EOK;
}
static rt_int32_t on_deinit(void *param)
{
...
p_clk_simple = NULL;
return RT_EOK;
}
static const wf_ops_t ops =
{
.init = on_init,
.pause = on_pause,
.resume = on_resume,
.deinit = on_deinit,
};
BUILTIN_WF_REGISTER(3, wf_simple, app_get_strid(key_clk_simple, "Simple"), \
&ops, APP_GET_THUM(tn), 0);
注册一个外置表盘
注册流程
1,代码第一行定义DYN_WF宏,申明此表盘是外置表盘,资源通过外置方式获取
#define DYN_WF
2,注册函数定义,函数类型为
typedef void(*module_init_func_t)(void);
如注册函数名wf_register_func,函数的实现必须调用表盘的wf_register注册接口,将注册信息记录到链表,
wf_register(const char*id, const char* title, const wf_ops_t *ops, const void *thumbnail)
id : 表盘名称
title : 表盘标题,用以显示用
entry : 表盘消息处理地址
thumbnail : 表盘缩略图已经由框架固定,此处填写NULL即可
3,模块初始化和清除回调 将注册函数插入模块初始化中,模块的清除回调典型为NULL
MODULE_INIT_DEF(wf_register_func)
MODULE_CLEANUP_DEF(NULL)
示例
#define DYN_WF
#include "global.h"
#define _MODULE_NAME_ 'wf_simple' /*外置表盘在模拟器中使用时需要定义'_MODULE_NAME_',值必须和外置表盘APP_ID相同*/
#include "app_module.h" /*资源使用接口的头文件包含*/
static rt_int32_t on_init(void *param)
{
...
return RT_EOK;
}
static rt_int32_t on_pause(void *param)
{
...
return RT_EOK;
}
static rt_int32_t on_resume(void *param)
{
...
return RT_EOK;
}
static rt_int32_t on_deinit(void *param)
{
...
return RT_EOK;
}
static const wf_ops_t ops =
{
.init = on_init,
.pause = on_pause,
.resume = on_resume,
.deinit = on_deinit,
};
void wf_simple_register(void)
{
wf_register("wf_simple", app_get_str(key_str_simple,"Simple"), &ops, NULL);
}
/*模拟器调试使用*/
BUILTIN_WF_REGISTER(3, wf_simple, app_get_strid(key_clk_simple, "Simple"), \
&ops, APP_GET_THUM(tn), 0);
MODULE_INIT_DEF(wf_simple_register)
MODULE_CLEANUP_DEF(NULL)