2.4.4. hid遥控器

  • 本案例为基于 HID 的遥控设备,可以用来媒体播放,上下曲暂停音量的控制,支持BLE工作模式。

  • 并且添加了遥控器的红外控制功能,可以通过红外遥控器控制海信电视开机,音量等功能。需要搭配遥控器样机使用

2.4.4.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
#define CONFIG_BOARD_AW31A_RC
// #define CONFIG_BOARD_AW313A_MOUSE

#include "board_aw31n_demo_cfg.h"
#include "board_aw312a_rc_cfg.h"
#include "board_aw313a_mouse_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                  0//翻页器
#define CONFIG_APP_REMOTE_CONTROL           1//遥控器,需搭配CONFIG_BOARD_AW31A_RC板级
#define CONFIG_APP_IDLE                     0//IDLE
  1. 配置io按键,矩阵按键,红外IO口

//*********************************************************************************//
//                                 iokey 配置                                      //
//*********************************************************************************//
#define KEY_IO_EN                           ENABLE                  //<IO按键使能
#define MOUSE_KEY_SCAN_MODE                 DISABLE_THIS_MOUDLE

#define TCFG_IOKEY_CONNECT_WAY                      ONE_PORT_TO_LOW         //按键一端接低电平一端接IO
#define TCFG_IOKEY_POWER_ONE_PORT                   IO_PORTA_11             //IO按键端口
#define TCFG_IOKEY_POWER_ONE_PORT_VALUE             0x0A                     //power port键值


//*********************************************************************************//
//                                 matrix key 配置                                 //
//*********************************************************************************//
#define KEY_MATRIX_EN                       ENABLE
#define MATRIX_KEY_ROW1                     IO_PORTA_00
#define MATRIX_KEY_ROW2                     IO_PORTA_01
#define MATRIX_KEY_ROW3                     IO_PORTA_02

#define MATRIX_KEY_ROL1                     IO_PORTA_08
#define MATRIX_KEY_ROL2                     IO_PORTA_09
#define MATRIX_KEY_ROL3                     IO_PORTA_04

//*********************************************************************************//
//                                 irkey 配置                                      //
//*********************************************************************************//
#define TCFG_IR_ENABLE                      ENABLE
#define IR_KEY_IO                                   IO_PORTA_10
#define IR_WORK_FRQ                         38000
#define IR_WORK_DUTY                        5000
  • 编译下载代码、接线、复位设备,再使用手机搜索设备进行连接。

  • 开发者可以操作板子上面的按键去控制手机:媒体播放,上下曲暂停音量的控制(需要打开手机的播歌软件)(蓝牙控制)。

  • 同时可以测试红外遥控器控制海信电视开机,音量等功能(红外控制)。

Note

若出现无法进行:媒体播放,上下曲暂停音量的控制。开发者应该确保手机蓝牙是否正常连接。

2.4.4.2. 主要代码说明

  • 根据不同的按键值和按键类型,进行数据发送。部分发送函数入下(app_remote_control.c):

    const u8 hidrc_ir_cmd_tab[] = { // 红外cmd码表,匹配海信电视
        0x14, // menu
        0x16, // up
        0,
        /* 0x19, // left */
        /* 0x18, // right */
        0x43, // vol down
        0x15, // confirm
        0x44, // vol up
        0x48, // return
        0x17, // down
        0x94, // main page
        0,
        0x0d, // power
    };
    
    
    /*************************************************************************************************/
    /*!
    *  \brief     发送红外数据
    *
    *  \param      [in]cmd:操作码 is_long:是否持续发送
    *
    *  \return
    *
    *  \note
    */
    /*************************************************************************************************/
    #if TCFG_IR_ENABLE
    static void hidrc_send_ir_key(uint8_t cmd, uint8_t is_long)
    {
        ir_encode_tx(0, cmd, is_long);
    }
    
    static void hidrc_ir_key_deal(uint8_t key_value, uint8_t key_type)
    {
        // ir test
        uint8_t cmd = hidrc_ir_cmd_tab[key_value];
        if (!cmd) {
            return;
        }
    
        // use ble control if connected,except power cmd
        if (cmd != IR_POWER_CMD_VALUE && ble_hid_is_connected()) {
            return;
        }
    
        if (key_type == KEY_EVENT_CLICK) {
            hidrc_send_ir_key(cmd, 0);
        } else if (key_type == KEY_EVENT_HOLD) {
            hidrc_send_ir_key(cmd, 1);
        } else if (key_type == KEY_EVENT_UP) {
            ir_encode_repeat_stop();
        } else {
            ;
        }
    }
    #endif
    /*************************************************************************************************/
    /*!
    *  \brief      按键处理
    *
    *  \param      [in]
    *
    *  \return
    *
    *  \note
    */
    /*************************************************************************************************/
    static void hidrc_app_key_deal_test(uint8_t key_type, uint8_t key_value)
    {
        uint16_t key_msg = 0;
        uint16_t key_msg_up = 0;
    
    #if TCFG_IR_ENABLE
        hidrc_ir_key_deal(key_value, key_type);
    #endif
    
    #if TCFG_LED_ENABLE
        led_operate(LED_KEY_UP);
    #endif
    
        if (key_type == KEY_EVENT_CLICK) {
            key_msg = hidrc_click_table[key_value];
        } else if (key_type == KEY_EVENT_HOLD) {
            key_msg = hidrc_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, (uint8_t *)&key_msg_up, 2);
            return;
        }
    
        if (key_msg) {
            log_info("key_msg = %02x\n", key_msg);
            ble_hid_data_send(1, (uint8_t *)&key_msg, 2);
            if (KEY_EVENT_HOLD != key_type) {
                ble_hid_data_send(1, (uint8_t *)&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)) {
            hidrc_set_soft_poweroff();
            return;
        }
    }
    

Note

以上代码为红外发送和按键发送的函数,通过不同的按键值发送不同的蓝牙包和红外控制码,开发者可以根据自己的需求进行修改。

2.4.4.3. case默认应用资源(默认使用YK1LA AW312A V1.1 遥控器DEMO板)

Note

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

I/O口占用情况

PA口 I/O

默认占用情况

IODP

默认打印UART0引脚

PA0

MATRIX_KEY_ROW1

PA1

MATRIX_KEY_ROW2

PA2

MATRIX_KEY_ROW3

PA3

LED1

PA4

MATRIX_KEY_ROL3

PA8

MATRIX_KEY_ROL1

PA9

MATRIX_KEY_ROL2

PA10

IRKEY

PA11

IOKEY1

硬件定时器占用情况

定时器

默认占用情况

TIMER0

红外发送pwm波定时器(仅在开启红外功能)

TIMER1

红外发送定时器(仅在开启红外功能)

TIMER2

暂无使用

TIMER3

暂无使用

串口占用情况

串口

默认占用情况

UART0

SDK打印

UART1

暂无使用

UART2

暂无使用

2.4.4.4. case默认应用功能现象

(默认使用YK1LA AW312A V1.1 遥控器DEMO板)

操作

现象结果

蓝牙按键控制静音

控制手机音乐静音

蓝牙按键控制上

上一首歌曲

蓝牙按键控制下

下一首歌曲

蓝牙按键控制确认

播放/暂停

蓝牙按键控制音量+(可长按控制)

控制音量

蓝牙按键控制音量-(可长按控制)

控制音量

红外按键控制(配合海信电视测试)电源

正确控制电视

红外按键控制(配合海信电视测试)菜单

正确控制电视

红外按键控制(配合海信电视测试)菜单按 三下进入软关机,(除左,右按键任意按键可以唤醒)

正确控制电视

红外按键控制(配合海信电视测试)上

正确控制电视

红外按键控制(配合海信电视测试)下

正确控制电视

红外按键控制(配合海信电视测试)确认

正确控制电视

红外 按键控制(配合海信电视测试)音量-(可长按控制)

正确控制电视

红外 按键控制(配合海信电视测试)音量+(可长按控制)

正确控制电视

红外按键控制(配合海信电视测试)主页

正确控制电视

红外按键控制(配合海信电视测试)返回

正确控制电视