如何实现蓝牙遥控器按键唤醒首键不丢失

最近在做如何实现在蓝牙遥控器中实现回链。按键唤醒后,首键不丢失。

使用的nordic 52832 v1.1的官方SDK。


1、实现按键唤醒。

在sr3_config_pca20023.中,设定keyboard作为唤醒资源,见下图:

如何实现蓝牙遥控器按键唤醒首键不丢失_第1张图片


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中)


下面试验了下,是可以实现最初目标的。


你可能感兴趣的:(如何实现蓝牙遥控器按键唤醒首键不丢失)