2.4.2. 自拍杆

Note

本案例主要用于蓝牙自拍器实现,进行以下配置后,打开手机蓝牙连接设备可进行对应的拍照操作。

2.4.2.1. 自拍杆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                 0//hid按键 ,default case
#define CONFIG_APP_KEYFOB                   1//自拍器,
#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
  1. 需要打开iokey配置(apps/demo/hid/board/bd47/board aw31n demo cfg.h)

//*********************************************************************************//
//                                 iokey 配置                                      //
//*********************************************************************************//
#define KEY_IO_EN                           ENABLE                  //<IO按键使能
#define MOUSE_KEY_SCAN_MODE                 DISABLE_THIS_MOUDLE
#define TCFG_IOKEY_POWER_CONNECT_WAY                ONE_PORT_TO_LOW    //按键一端接低电平一端接IO

#define TCFG_IOKEY_POWER_ONE_PORT                   IO_PORTA_00        //IO按键端口
#define TCFG_IOKEY_POWER_ONE_PORT_VALUE             0x0                //power port键值
#define TCFG_IOKEY_PREV_CONNECT_WAY                 ONE_PORT_TO_LOW  //按键一端接低电平一端接IO
#define TCFG_IOKEY_PREV_ONE_PORT                    IO_PORTA_01
#define TCFG_IOKEY_PREV_ONE_PORT_VALUE              0x1              //prev port键值
  • 开发者可以操作板子IO key1、IO key2实现蓝牙自拍器的功能。

2.4.2.2. 主要代码说明

  • 数据发送:

    • KEYFOB 属于 HID 设备范畴,数据的定义与发送要根据 HID 设备描述符的内容进行确定,由下 图的描述符可知,该描述符是一个用户自定义描述符,可以组合实现各种需要的功能,一共有两个 Input 实体描述符。其中每个功能按键对应一个 bit,一共 11bit,剩余一个 13bit 的常数输入实体,所以 自定义描述符的数据包长度位 3byte.如果用户需要在自拍器的基础上增加不同按键类型的事件,可 以在下面的描述符中先添加该功能,然后在按键处理函数分支进行对应的按键值和按键类型的设置, 来实现对应的功能。

    • 用户自定义的描述符组成本案例的 KEYFOB 描述符,实现对应的按键功能(app_keyfob.c)。

      static const u8 keyfob_report_map[] = {
          //通用按键
          0x05, 0x0C,        // Usage Page (Consumer)
          0x09, 0x01,        // Usage (Consumer Control)
          0xA1, 0x01,        // Collection (Application)
          0x85, 0x03,        //   Report ID (3)
          0x15, 0x00,        //   Logical Minimum (0)
          0x25, 0x01,        //   Logical Maximum (1)
          0x75, 0x01,        //   Report Size (1)
          0x95, 0x0B,        //   Report Count (11)
          0x0A, 0x23, 0x02,  //   Usage (AC Home)
          0x0A, 0x21, 0x02,  //   Usage (AC Search)
          0x0A, 0xB1, 0x01,  //   Usage (AL Screen Saver)
          0x09, 0xB8,        //   Usage (Eject)
          0x09, 0xB6,        //   Usage (Scan Previous Track)
          0x09, 0xCD,        //   Usage (Play/Pause)
          0x09, 0xB5,        //   Usage (Scan Next Track)
          0x09, 0xE2,        //   Usage (Mute)
          0x09, 0xEA,        //   Usage (Volume Decrement)
          0x09, 0xE9,        //   Usage (Volume Increment)
          0x09, 0x30,        //   Usage (Power)
          0x0A, 0xAE, 0x01,  //   Usage (AL Keyboard Layout)
          0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
          0x95, 0x01,        //   Report Count (1)
          0x75, 0x0D,        //   Report Size (13)
          0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
          0xC0,              // End Collection
      
          // 119 bytes
      };
      
    • 下列即发送模块,发送的数据是按照上面的 HID 设备描述符 格式进行发送的(app_keyfob.c)。

      /*************************************************************************************************/
      /*!
      *  \brief     按键发送数据
      *
      *  \param      [in] key_value:按键值 mode: 按键类型
      *
      *  \return
      *
      *  \note
      */
      /*************************************************************************************************/
      static void keyfob_send_value(uint8_t key_value, u8 mode)
      {
          if (key_value == KEY_BIG_ID) {
              if (mode == KEYFOB_CLICK || mode == KEYFOB_CLICK_HOLD) {
                  ble_hid_data_send(KEYFOB_REPORT_ID, (uint8_t *)keyfob_big_press, sizeof(keyfob_big_press));
              }
              if (mode == KEYFOB_CLICK || mode == KEYFOB_CLICK_UP) {
                  ble_hid_data_send(KEYFOB_REPORT_ID, (uint8_t *)keyfob_big_null, sizeof(keyfob_big_null));
              }
          } else if (key_value == KEY_SMALL_ID) {
              if (mode == KEYFOB_CLICK || mode == KEYFOB_CLICK_HOLD) {
                  ble_hid_data_send(KEYFOB_REPORT_ID, (uint8_t *)keyfob_small_press, sizeof(keyfob_small_press));
              }
              if (mode == KEYFOB_CLICK || mode == KEYFOB_CLICK_UP) {
                  ble_hid_data_send(KEYFOB_REPORT_ID, (uint8_t *)keyfob_small_null, sizeof(keyfob_small_null));
              }
          }
      
      }
      

2.4.2.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.2.4. case默认应用功能现象

(默认使用AW31N DEMO开发板 LED-PA9 IOKEY1-PA0 IOKEY2-PA1)

操作

现象结果

连接,使用手机后 台进行绑定操作,name为AW31N_HID

能够成功绑定连接

连接后打开摄像头,K1单击

拍照1

k1三击

软关机,进入软 关机后任意IO按键从软关机唤醒设备

连接后打开摄像头,K1长按

连拍

连接后打开摄像头,K2单击

拍照2

LED现象

ble未连接闪亮

LED现象

ble连上后灭

LED现象

连接过程长亮

LED现象

按键点亮

电量检测

低电提示,低 电关机,低电10s后将打开低电提醒 ,灯快速闪烁,60s后将进入软关机