Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

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

    其它全志芯片讨论区
    xr806 xr872 faq 技术支持
    1
    1
    204
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 8 last edited by

      问题背景
      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,也可以选择特殊处理。

      1 Reply Last reply Reply Quote Share 0
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2022 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策