2.4.3. 翻页器

Note

本APP基于HID开发,主要用于浏览当下火爆的抖音等小视频的上下翻页、左右菜单切换、暂停等操作。首先选择需要用到的应用本案例选择,然后进行对应的支持板级选择,具体参考下文的步骤。通过软件编译下载到对应的开发板,打开手机蓝牙进行连接,进入视频浏览界面操作对应按键即可。

2.4.3.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                   0//自拍器,
#define CONFIG_APP_MOUSE_SINGLE             0//单模切换 需搭配CONFIG_BOARD_AW313A_MOUSE板级
#define CONFIG_APP_KEYPAGE                  1//翻页器
#define CONFIG_APP_REMOTE_CONTROL           0//遥控器,需搭配CONFIG_BOARD_AW31A_RC板级
#define CONFIG_APP_IDLE                     0//IDLE
  1. 打开ADKEY(apps/demo/hid/board/bd47/board aw31n demo cfg.h)

//*********************************************************************************//
//                                 adkey 配置                                      //
//*********************************************************************************//
#define AD_KEY_IO                               IO_PORTA_08 // 可用的IO见adc_ch_io_table
#define KEY_AD_EN                                       ENABLE           //<AD按键使能

2.4.3.2. 主要代码说明

static void keypage_key_operate(key_op op)
{
    switch (op) {
    case KEY_UP:
        if (REMOTE_IS_IOS()) {
            keypage_send_packect((uint8_t *)key_up_before, sizeof(key_up_before), REPROT_INFO_LEN0);
        } else {
            keypage_send_packect((uint8_t *)key_up_click, sizeof(key_up_click), REPROT_INFO_LEN1);
        }
        break;

    case KEY_DOWN:
        if (REMOTE_IS_IOS()) {
            keypage_send_packect((uint8_t *)key_down_before, sizeof(key_down_before), REPROT_INFO_LEN0);
        } else {
            keypage_send_packect((uint8_t *)key_down_click, sizeof(key_down_click), REPROT_INFO_LEN1);
        }
        break;

    case KEY_LEFT:
        if (REMOTE_IS_IOS()) {
            keypage_send_packect((uint8_t *)key_left_before, sizeof(key_left_before), REPROT_INFO_LEN0);
        } else {
            keypage_send_packect((uint8_t *)key_left_click, sizeof(key_left_click), REPROT_INFO_LEN1);
        }
        break;

    case KEY_RIGHT:
        if (REMOTE_IS_IOS()) {
            keypage_send_packect((uint8_t *)key_right_before, sizeof(key_right_before), REPROT_INFO_LEN0);
        } else {
            keypage_send_packect((uint8_t *)key_right_click, sizeof(key_right_click), REPROT_INFO_LEN1);
        }
        break;

    case KEY_PP_PRESS:
        if (REMOTE_IS_IOS()) {
            keypage_send_packect((uint8_t *)key_pp_release_before, sizeof(key_pp_release_before), REPROT_INFO_LEN0);
            keypage_connect_reset_xy(NULL);
        } else {
            keypage_send_packect((uint8_t *)key_pp_press, sizeof(key_pp_press), REPROT_INFO_LEN1);
            keypage_send_packect((uint8_t *)key_pp_release, sizeof(key_pp_release), REPROT_INFO_LEN1);
        }
        break;

    case KEY_ONE_PRESS:
        if (REMOTE_IS_IOS()) {
            keypage_send_packect((uint8_t *)key_one_press_before, sizeof(key_one_press_before), REPROT_INFO_LEN0);
            keypage_send_packect((uint8_t *)key_one_release_before, sizeof(key_one_release_before), REPROT_INFO_LEN0);
        } else {
            keypage_send_packect((uint8_t *)key_one_press, sizeof(key_one_press), REPROT_INFO_LEN1);
            keypage_send_packect((uint8_t *)key_one_release, sizeof(key_one_release), REPROT_INFO_LEN1);
        }
        break;

    default:
        log_info("Error key op!");
        break;
    }
}


/*************************************************************************************************/
/*!
*  \brief      按键事件处理
*
*  \param      [in]
*
*  \return
*
*  \note
*/
/*************************************************************************************************/
static void keypage_app_key_deal_test(uint8_t key_type, uint8_t key_value)
{
    uint16_t key_msg = 0;
    log_info("app_key_evnet: %d,%d\n", key_type, key_value);

#if TCFG_LED_ENABLE
    led_operate(LED_KEY_UP);
#endif

    if (key_type == KEY_EVENT_CLICK) {
        switch (key_value) {
        case 0:
            keypage_key_operate(KEY_UP);
            break;

        case 1:
            keypage_key_operate(KEY_DOWN);
            break;

        case 2:
            keypage_key_operate(KEY_LEFT);
            break;

        case 3:
            keypage_key_operate(KEY_RIGHT);
            break;

        case 4:
            keypage_key_operate(KEY_PP_PRESS);
            break;

        case 5:
            keypage_key_operate(KEY_ONE_PRESS);
            break;

        default:
            break;
        }

    }
    .....
    }

Note

keypage_key_operate()函数主要是对按键操作的处理,根据不同的按键操作,发送不同的数据包。 keypage_app_key_deal_test()函数主要是对按键事件的处理,根据不同的按键事件,调用不同的按键操作函数。

  • 增加处理公共消息

    • 跟据识别不同的手机系统,来切换描述符(app_keypage.c)。

      static int keypage_common_event_handler(struct device_event *bt)
      {
          log_info("----%s reason %x %x", __FUNCTION__, bt->event, bt->value);
      
          switch (bt->event) {
          case COMMON_EVENT_BLE_REMOTE_TYPE:
              log_info(" COMMON_EVENT_BLE_REMOTE_TYPE,%d \n", bt->value);
              keypage_remote_type = bt->value;
              if (keypage_remote_type == REMOTE_DEV_IOS) {
                  le_hogp_set_ReportMap((uint8_t *)keypage_report_map_ios, sizeof(keypage_report_map_ios));
              } else {
                  le_hogp_set_ReportMap((uint8_t *)keypage_report_map, sizeof(keypage_report_map));
              }
              break;
      
          case COMMON_EVENT_SHUTDOWN_DISABLE:
              keypage_auto_shutdown_disable();
              break;
      
          default:
              break;
      
          }
          return 0;
      }
      

2.4.3.3. case默认应用资源(默认使用AW31N DEMO开发板)

Note

demo默认占用外设资源如下,具体可以查看board_aw31n_demo_cfg.h

I/O口占用情况

PA口 I/O

默认占用情况

PA3

默认打印UART0引脚

PA8

adkey检测引脚

PA9

LED控制引脚

硬件定时器占用情况

定时器

默认占用情况

TIMER0

暂无使用

TIMER1

暂无使用

TIMER2

暂无使用

TIMER3

暂无使用

串口占用情况

串口

默认占用情况

UART0

SDK打印

UART1

暂无使用

UART2

暂无使用

2.4.3.4. case默认应用功能现象

(默认使用AW31N DEMO开发板 LED-PA9 ADKEY-PA8)

操作

现象结果

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

能够成功绑定连接

连接后 打开抖音等短视频竖屏app,K1单击

下滑

K2单击

上滑

K3单击

左滑

K4单击

右滑

K5单击

暂停和播放

k5双击

点赞

LED现象

ble未连接闪亮

LED现象

ble连上后灭

LED现象

连接过程长亮

LED现象

按键点亮

电量检测

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