2. HID DEMO说明
2.1. 工程介绍
通用Human Interface Devices(HID)工程,一般做蓝牙从机连接手机/电脑/蓝牙主机,使用领域:hid按键、自拍器、 鼠标、键盘、翻页器、
2.2. 配置使用
以下的DEMO的配置与说明均使用CodeBlocks进行演示。
2.2.1. 打开工程
按照 :SDK工程编译与下载 下载官方SDK。
通过 :开发准备说明 知道自己手中的芯片是哪个型号(比方说我手上的是AW31N系列,对应即是bd47的板级)。
去到AW31N_sdk_release_v1.0.0/apps/demo/hid/board/bd47目录下,双击AW31N_hid.cbp打开工程。
2.2.2. 配置板级
打开工程后,使用快捷键Alt + g 搜索board_config.h文件并双击打开。一般选择默认的板级(不同的板级有不同的开发需求)。
Note
板级配置选择是单选,只能选择一个板级。
2.2.3. 选择case(默认选择hid按键示例)
使用快捷键Alt + g 打开app_config.h,配置CONFIG_APP_KEYBOARD使能。
下载代码后,根据代码将按键接线和log接线连接好。
代码配置如下:
Note
需要注意的是,上图的代码配置是默认配置,若开发者想更换按照需求更换即可(更换AD key时需要注意IO是否具有AD功能),
同时board_AW31N_demo_cfg.h里面包含基本所有模块的宏开关,开发者应该特别重视
。重新上电可查看log(baud:1000000)。至此恭喜你已经完成从安装到下载的全部步骤
下一步根据自己选择的case进行相关开发,默认选择“hid按键”
2.3. hid应用运行流程介绍
以hid按键case为例,hid的代码结构如下,同时参考启动流程了解: :SDK启动流程 。
Note
以下只是为演示代码流程,开发者不用去修改代码。以下示例是用默认CONFIG_APP_KEYBOARD例子进行说明,其他例子流程参考如下流程理解。
APP 注册运行:打开app_main.c,里面的app_main()函数即做app的注册和运行
#if (CONFIG_APP_MOUSE) it.name = "mouse"; it.action = ACTION_MOUSE_MAIN; #elif(CONFIG_APP_KEYFOB) it.name = "keyfob"; it.action = ACTION_KEYFOB; #elif(CONFIG_APP_KEYBOARD) it.name = "hid_key"; start_app(&it); }
首先会在 app_main.c 函数中添加 hid_key 应用分支,然后进行应用注册
REGISTER_APPLICATION(app_hid) = { .name = "hid_key", .action = ACTION_HID_MAIN, .ops = &app_hid_ops, .state = APP_STA_DESTROY, };
按照上述代码进行APP注册,执行配置好的app。之后进入APP_state_machine(app_keyboard.c文件里),根据状态机的不同状态执行不同的分支,第一次执行时进入APP_STA_CREATE分支后再进入APP_STA_START分支,执行对应的app_start()。开始执行app_start()在该函数内进行时钟初始化,进行蓝牙模式选择,等一些初始化操作。
REGISTER_LP_TARGET(app_hidkey_lp_target) = { .name = "app_hidkey_deal", .is_idle = hidkey_app_idle_query, }; static const struct application_operation app_hidkey_ops = { .state_machine = hidkey_state_machine, .event_handler = hidkey_event_handler, };
hie_key应用注册以后,进行以上的app_hid_ops进行处理。分为两个模块hidkey_state_machine和hidkey_event_handler。
执行流程大致如下,对应函数位于app_keyboard.c文件:hidkey_state_machine()-app_start()。主要根据应用的状态进行时钟初始化,蓝牙名设置,读取配置信息。
hidkey_event_handler(struct application *app, struct sys_event *event)-hidkey_key_event_handler(sys_event *event)—>hidkey_key_deal_test(key_type,key_value)—->hidkey_key_deal_test(key_msg)。
事件处理流程大致如上所示。hidkey_event_handler()根据传入的第二个参数事件类型,选择对应的处理分支,此处选择执行按键事件,然后调用按键事件处理函数根据事件的按键值和按键类型进行对应的事件处理。
简易示意图如下: