2.4.1. hid按键
本案例为基于 HID 的键盘设备,可以用来媒体播放,上下曲暂停音量的控制,支持安卓和 IOS 的双系统,并且支持 BLE 工作模式。
2.4.1.1. hid按键case应用配置
先配置板级(apps/demo/hid/board/bd47/board_config.h)
#ifndef BOARD_CONFIG_H #define BOARD_CONFIG_H #define CONFIG_BOARD_AW31N_DEMO #include "board_aw31n_demo_cfg.h" #endif
配置app选择:在工程代码中找到对应的文件(apps/demo/hid/include/app_config.h)进行APP选择
//app case 选择,只选1,要配置对应的board_config.h #define CONFIG_APP_KEYBOARD 1//hid按键 ,default case #define CONFIG_APP_KEYFOB 0//自拍器, #define CONFIG_APP_MOUSE_SINGLE 0//单模切换 需搭配CONFIG_BOARD_AW313A_MOUSE板级 #define CONFIG_APP_KEYPAGE 0//翻页器 #define CONFIG_APP_REMOTE_CONTROL 0//遥控器,需搭配CONFIG_BOARD_AW31A_RC板级 #define CONFIG_APP_IDLE 0//IDLE
编译下载代码、接线、复位设备,再使用手机搜索设备进行连接。
开发者可以操作板子上面的按键去控制手机:媒体播放,上下曲暂停音量的控制(需要打开手机的播歌软件)。
至此恭喜你已经完成case的下载与测试
。
Note
若出现无法进行:媒体播放,上下曲暂停音量的控制。开发者应该确保手机蓝牙是否正常连接、查看ad key接线是否接上,如还是无法成功,请先查阅 FAQ汇总,可能你的答案已经存在。
2.4.1.2. 主要代码说明
hid代码数据发送模块:
自定义的键盘描述符(上发给手机的包格式就是按照hidkey_report_map里面的格式进行上发给手机)如下所示(app_keyboard.c):
static const u8 hidkey_report_map[] = { 0x05, 0x0C, // Usage Page (Consumer) 0x09, 0x01, // Usage (Consumer Control) 0xA1, 0x01, // Collection (Application) 0x85, 0x01, // Report ID (1) 0x09, 0xE9, // Usage (Volume Increment) 0x09, 0xEA, // Usage (Volume Decrement) 0x09, 0xCD, // Usage (Play/Pause) 0x09, 0xE2, // Usage (Mute) 0x09, 0xB6, // Usage (Scan Previous Track) 0x09, 0xB5, // Usage (Scan Next Track) 0x09, 0xB3, // Usage (Fast Forward) 0x09, 0xB4, // Usage (Rewind) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x75, 0x01, // Report Size (1) 0x95, 0x10, // Report Count (16) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0xC0, // End Collection // 35 bytes };
根据不同的按键值和按键类型,调用
ble_hid_data_send
进行数据发送。部分发送函数入下(app_keyboard.c):static void hidkey_app_key_deal_test(u8 key_type, u8 key_value) { u16 key_msg = 0; u16 key_msg_up = 0; #if HID_TEST_KEEP_SEND_EN if (key_type == KEY_EVENT_LONG && key_value == TCFG_ADKEY_VALUE0) { test_keep_send_start = !test_keep_send_start; log_info("test_keep_send_start=%d\n", test_keep_send_start); return; } #endif #if TCFG_LED_ENABLE led_operate(LED_KEY_UP); #endif if (key_type == KEY_EVENT_CLICK) { key_msg = hid_key_click_table[key_value]; } else if (key_type == KEY_EVENT_HOLD) { key_msg = hid_key_hold_table[key_value]; } else if (key_type == KEY_EVENT_UP) { log_info("key_up_val = %02x\n", key_value); ble_hid_data_send(1, (u8 *)&key_msg_up, 2); return; } if (key_msg) { log_info("key_msg = %02x\n", key_msg); ble_hid_data_send(1, (u8 *)&key_msg, 2); if (KEY_EVENT_HOLD != key_type) { ble_hid_data_send(1, (u8 *)&key_msg_up, 2); } return; } if (key_type == KEY_EVENT_DOUBLE_CLICK && key_value == TCFG_ADKEY_VALUE1) { if (ble_hid_is_connected()) { le_hogp_disconnect(); } le_hogp_set_pair_allow(); return; } if (key_type == KEY_EVENT_TRIPLE_CLICK && (key_value == TCFG_ADKEY_VALUE3 || key_value == TCFG_ADKEY_VALUE0)) { hidkey_set_soft_poweroff(); return; } }
2.4.1.3. case默认应用资源(默认使用AW31N DEMO开发板)
Note
demo默认占用外设资源如下,具体可以查看board_aw31n_demo_cfg.h
I/O口占用情况
PA口 I/O
默认占用情况
PA0
IOKEY1
PA1
IOKEY2
PA3
默认打印UART0引脚
PA8
adkey检测引脚
PA9
LED控制引脚
硬件定时器占用情况
定时器
默认占用情况
TIMER0
暂无使用
TIMER1
暂无使用
TIMER2
暂无使用
TIMER3
暂无使用
串口占用情况
串口
默认占用情况
UART0
SDK打印
UART1
暂无使用
UART2
暂无使用
2.4.1.4. case默认应用功能现象
(默认使用AW31N DEMO开发板 LED-PA9 ADKEY-PA8)
操作
现象结果
连接,使用手机后台进行绑定操作
能够成功绑定连接
K1单击
播放暂停
K1三击
软关机,进 入软关机后任意按键从软关机唤醒设备
K2单击
上一曲
K2双击
设备主动断 开并且清除配对,此时手机无法主动回 连成功,需重新主动绑定配对才能控制
K3单击
音量减
K3长按
音量持续减
K4单击
下一曲
K5单击
音量加
K5长按
音量持续加
LED现象
ble未连接闪亮
LED现象
ble连上后灭
LED现象
连接过程长亮
LED现象
按键点亮
电量检测
低电提示 ,低电关机,低电10s后将打开低电提 醒,灯快速闪烁,60s后将进入软关机