This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRF52810 HID Mouse enter error code, the device will restart when running mouse_movement_send

void m_mouse_movement_send(int16_t x_delta, int16_t y_delta)
{
    ret_code_t err_code;

    if (m_in_boot_mode)
    {
        x_delta = MIN(x_delta, 0x00ff);
        y_delta = MIN(y_delta, 0x00ff);

        err_code = ble_hids_boot_mouse_inp_rep_send(&m_hids,
                                                    0x00,
                                                    (int8_t)x_delta,
                                                    (int8_t)y_delta,
                                                    0,
                                                    NULL);
    }
    else
    {
        uint8_t buffer[INPUT_REP_MOVEMENT_LEN];

        APP_ERROR_CHECK_BOOL(INPUT_REP_MOVEMENT_LEN == 3);

        x_delta = MIN(x_delta, 0x0fff);
        y_delta = MIN(y_delta, 0x0fff);

        buffer[0] = x_delta & 0x00ff;
        buffer[1] = ((y_delta & 0x000f) << 4) | ((x_delta & 0x0f00) >> 8);
        buffer[2] = (y_delta & 0x0ff0) >> 4;

        err_code = ble_hids_inp_rep_send(&m_hids,
                                         INPUT_REP_MOVEMENT_INDEX,
                                         INPUT_REP_MOVEMENT_LEN,
                                         buffer);
    }

    if ((err_code != NRF_SUCCESS) &&
        (err_code != NRF_ERROR_INVALID_STATE) &&
        (err_code != NRF_ERROR_RESOURCES) &&
        (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
       )
    {
        APP_ERROR_HANDLER(err_code);
    }
}

I created a 500ms timer to send mouse movement as follows.

m_mouse_movement_send(5,0); 

When the device runs there, the device will restart. The error code is NRF_ERROR_FORBIDDEN.

    if ((err_code != NRF_SUCCESS) &&
        (err_code != NRF_ERROR_INVALID_STATE) &&
        (err_code != NRF_ERROR_RESOURCES) &&
        (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
       )
    {
        APP_ERROR_HANDLER(err_code);
    }

When i add the NRF_ERROR_FORBIDDEN handle, the device runs normally.

    if ((err_code != NRF_SUCCESS) &&
        (err_code != NRF_ERROR_BUSY) &&
        (err_code != NRF_ERROR_RESOURCES) &&
        (err_code != NRF_ERROR_FORBIDDEN) &&
        (err_code != NRF_ERROR_INVALID_STATE) &&
        (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING)
       )
    {
        APP_ERROR_HANDLER(err_code);
    }

By the way, the hid_init is behind th services_init.

Parents
  • Hi Taylor,

    I met almost the same problem. It seems that when the interval between using "mouse_movement_send()" is less than around 500ms, the error just ocurrs. When it's set longer, the error disappears. However, the solution you mentioned in the reply does works for me too. I have no idea about the relationship with security level, since params in hids_init() about CCCD are already set SEC_JUST_WORK.

Reply
  • Hi Taylor,

    I met almost the same problem. It seems that when the interval between using "mouse_movement_send()" is less than around 500ms, the error just ocurrs. When it's set longer, the error disappears. However, the solution you mentioned in the reply does works for me too. I have no idea about the relationship with security level, since params in hids_init() about CCCD are already set SEC_JUST_WORK.

Children
No Data
Related