最近在做如何实现在蓝牙遥控器中实现回链。按键唤醒后,首键不丢失。
使用的nordic 52832 v1.1的官方SDK。
1、实现按键唤醒。
在sr3_config_pca20023.中,设定keyboard作为唤醒资源,见下图:
2、实现首键得到(在m_keyboard.c文件中)
ret_code_t m_keyboard_init(bool *p_delete_bonds)
{
uint8_t pressed_keys[DRV_KEYBOARD_MAX_KEYS];
uint8_t number_of_pressed_keys;
bool keys_blocked;
ret_code_t status;
m_keyboard_enabled = false;
m_keyboard_state_len = 0;
memset(m_keyboard_state, 0, sizeof(m_keyboard_state));
/* Initialize keyboard driver */
status = drv_keyboard_init(m_keyboard_event_handler);
if (status != NRF_SUCCESS)
{
return status;
}
/* Perform initial keyboard scan. */
status = drv_keyboard_keys_get(pressed_keys, &number_of_pressed_keys, &keys_blocked);
if (status != NRF_SUCCESS)
{
return status;
}
m_keyboard_event_handler(pressed_keys, number_of_pressed_keys, keys_blocked);
if(number_of_pressed_keys>0)
{
Key_First = pressed_keys[0];
if(Key_First != NULL)
{
Key_First_on=1;
}
}
/* Check DELETE_BONDS key */
if (p_delete_bonds)
{
/* Check if the user requested a bonds removal. */
*p_delete_bonds = (keys_blocked == false) &&
(number_of_pressed_keys == 1) &&
(pressed_keys[0] == CONFIG_KBD_DELETE_BONDS_KEY_ID);
}
return NRF_SUCCESS;
}
我先得到首键的键值:uint8_t Key_First;
Key_First = pressed_keys[0];
然后设置来了一个标志位:bool Key_First_on;
然后通过判断,一旦得到了首个键值,就记录下来。
3、发送:
a、在m_coms.c中
判断一旦连接,即进入首键发送函数:
在static void m_coms_ble_evt_handler(void *p_event_data, uint16_t event_size)函数的case:case M_COMS_BLE_EVT_CONNECTED中,加入调用语句,具体如下:
case M_COMS_BLE_EVT_CONNECTED:
DBG1_EVT0("m_coms: M_COMS_BLE_EVT_CONNECTED");
m_coms_state = M_COMS_STATE_CONNECTED;
if(Key_First_on==1)
{
Key_First_In();
}
APP_ERROR_CHECK(event_send(EVT_SYSTEM_BT_CONN_STATE, BT_CONN_STATE_CONNECTED));
break;
b、在m_protocol_hid.c中加自己写的:
uint32_t Key_First_In(void)
{
uint32_t err_code;
getid0 = m_protocol_hid_key2usage(Key_First);
event_send(EVT_HID_REPORT_INPUT, getid0,1);
err_code = app_timer_start(s_Key_First, 800, NULL);
APP_ERROR_CHECK(err_code);
}
void Key_First_handler(void* p_context)
{
event_send(EVT_HID_REPORT_INPUT, getid0,0);
Key_First_on = 0;
}
uint32_t Key_First_init(void)
{
ret_code_t status;
status = app_timer_create(&s_Key_First,
APP_TIMER_MODE_SINGLE_SHOT,
Key_First_handler);
if (status != NRF_SUCCESS)
{
return status;
}
return status;
}
自己写的,可能有点问题。
(对了,初始化放到m_init.c中)
下面试验了下,是可以实现最初目标的。