2.4.1. hid按键

  • 本案例为基于 HID 的键盘设备,可以用来媒体播放,上下曲暂停音量的控制,支持安卓和 IOS 的双系统,并且支持 BLE 工作模式。

2.4.1.1. hid按键case应用配置

  1. 先配置板级(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
  1. 配置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后将进入软关机