2.4.4. hid遥控器
本案例为基于 HID 的遥控设备,可以用来媒体播放,上下曲暂停音量的控制,支持BLE工作模式。
并且添加了遥控器的红外控制功能,可以通过红外遥控器控制海信电视开机,音量等功能。需要搭配遥控器样机使用
2.4.4.1. hid遥控器case使用
先配置板级(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
配置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
配置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板)
操作 |
现象结果 |
---|---|
蓝牙按键控制静音 |
控制手机音乐静音 |
蓝牙按键控制上 |
上一首歌曲 |
蓝牙按键控制下 |
下一首歌曲 |
蓝牙按键控制确认 |
播放/暂停 |
蓝牙按键控制音量+(可长按控制) |
控制音量 |
蓝牙按键控制音量-(可长按控制) |
控制音量 |
红外按键控制(配合海信电视测试)电源 |
正确控制电视 |
红外按键控制(配合海信电视测试)菜单 |
正确控制电视 |
红外按键控制(配合海信电视测试)菜单按 三下进入软关机,(除左,右按键任意按键可以唤醒) |
正确控制电视 |
红外按键控制(配合海信电视测试)上 |
正确控制电视 |
红外按键控制(配合海信电视测试)下 |
正确控制电视 |
红外按键控制(配合海信电视测试)确认 |
正确控制电视 |
红外 按键控制(配合海信电视测试)音量-(可长按控制) |
正确控制电视 |
红外 按键控制(配合海信电视测试)音量+(可长按控制) |
正确控制电视 |
红外按键控制(配合海信电视测试)主页 |
正确控制电视 |
红外按键控制(配合海信电视测试)返回 |
正确控制电视 |