全志XR806芯片 如何创建自定义状态回调函数?

问题背景
XR_MCU的SDK中,audio,wlan,Fs等模块被引用时,已经根据状态,设置好了回调函数,但是有客户不清楚如何利用SDK自身资源,创建自己应用模块的状态回调函数。

问题描述
如何创建自定义状态回调函数。

问题分析
状态回调函数依赖于SDK的framework框架,且已经为用户预留了自定义回调函数的框架,audio,bt,fs,net的状态回调框架都是完全公开的,参照编写即可。

解决方法

1 添加自定义状态回调类型
在project\common\framework\sys_ctrl\sys_ctrl.h文件中,修改ctrl_msg_type结构体,在CTRL_MSG_TYPE_USER后添加自定义类型,如CTRL_MSG_TYPE_TEST。

typedef enum ctrl_msg_type{
	CTRL_MSG_TYPE_SYSTEM = 0,
	CTRL_MSG_TYPE_NETWORK,
	CTRL_MSG_TYPE_VKEY,
	CTRL_MSG_TYPE_VOLUME,
	CTRL_MSG_TYPE_SDCARD,
	CTRL_MSG_TYPE_FS,
	CTRL_MSG_TYPE_AUDIO,
	CTRL_MSG_TYPE_HANDLER,

	/* message defined by user starts from CTRL_MSG_TYPE_USER */
	CTRL_MSG_TYPE_USER = 0x100,
        CTRL_MSG_TYPE_TEST, //自主添加的回调函数
} ctrl_msg_type;

2 创建回调函数
在.h文件中添加状态类型

enum test_status {
	TEST_MSG_STATE_FIRSR,        //状态1
	TEST_MSG_STATE_SECOND,        //状态2
	TEST_MSG_STATE_UNDEFINE,
};

在.c文件中添加实体函数

/* 处理状态变化 */
static void test_ctrl_msg_process(uint32_t event, uint32_t data, void *arg)
{
	switch (EVENT_SUBTYPE(event)) {
	case TEST_MSG_STATE_FIRSR:
		test_act_first(data);
		break;
	case TEST_MSG_STATE_SECOND:
		test_act_second(data);
		break;
	default:
		break;
	}
}
/* 创建回调函数 */
int test_init(void)
{
	observer_base *base = sys_callback_observer_create(CTRL_MSG_TYPE_TEST,    //监控event类型
	                                                   0xFFFF,                //监控类型可分类,可参考fs_ctrl.h    
	                                                   test_ctrl_msg_process, //回调函数
	                                                   NULL);
	if (base == NULL) {
		printf("create fail\n");
		return -1;
	}
        /* 挂载到观察链表 */
	if (sys_ctrl_attach(base) != 0) {
		printf("attach fail\n");
		return -1;
	}
}

3 发送状态
当线程中状态发生变化时,通过project\common\framework\sys_ctrl\sys_ctrl.h中定义的API,会调用步骤2中设置好的回调函数。
常规用法

/* 实体 */
int sys_event_send(uint16_t type, uint16_t subtype, uint32_t data, uint32_t wait_ms);
/* 例,其中wait_ms为队列等待超时时间,队列深度默认为6 */
sys_event_send(CTRL_MSG_TYPE_TEST,TEST_MSG_STATE_FIRSR,0,0);

特殊用法,发送完成后自动释放数据

/* 实体 */
int sys_event_send_with_free(uint16_t type, uint16_t subtype, void *data, uint32_t wait_ms);
/* 例,其中data是希望传输到回调函数的数据,使用该API能在传输完成后释放内存 */
struct STtest *testdata = malloc(sizeof(*testdata));
memset(testdata,0,sizeof(*testdata);
testdata = dataget(testdata) //数据赋值
sys_event_send_with_free(CTRL_MSG_TYPE_TEST,TEST_MSG_STATE_FIRSR,testdata ,0);//发送完成后会自动释放数据

特殊用法,自定义销毁方式

/* 实体 */
int sys_event_send_with_destruct(uint16_t type, uint16_t subtype, void *data, void (*destruct)(event_msg *), uint32_t wait_ms)

该API和sys_event_send_with_free差异点为,sys_event_send_with_free执行完回调后,会固定执行free(data),但是sys_event_send_with_destruct在执行完回调后,继续执行destruct函数,destruct函数由用户自主编写,可以选择销毁data,也可以选择特殊处理。

原贴链接:https://bbs.aw-ol.com/topic/744
全志在线开发者交流企鹅群(客服机器人24小时在线解答):498263967
资源获取、问题讨论可以到全志在线开发者社区进行:https://www.aw-ol.com/
全志及开发者最新动态可以关注全志在线微信公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值