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

debugging sd_ble_gatts_hvx

Hi

I am trying to get to the bottom of a problem I am having with sending a buffer of data on connection and indication enable. Here's what I do: I have a process running, which is capturing sensor data every 10 seconds, and keeping it in a circular buffer. When a master connects, I want to send the circular buffer to the master app. I am doing that by triggering on the event that the CCCD is written to enable indications (I am using indication because I want to make sure that the values end up in the app). When this CCCD write is happening, I send the first item in my circular buffer, and then use the BLE_GATTS_EVT_HVC event to see if I have gotten a confirmation, just as in the health thermometer example.

I am running into a number of problems

  • when I trigger on the CCCD write and immediately do a sd_ble_gatts_hvx, I get an error 8 (illegal state); if I start a timer and do the same after 10 ms, then it is ok
  • I sometimes also have a BLE_ERROR_GATTS_SYS_ATTR_MISSING error, how can I avoid that? when should I normally do a sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0) (i do not use bonding)

I have the impression that timing issues or race conditions are causing my problems, can anyone give me hint on how to solve this?

Parents
  • Yes, the best time to set it is immediately after connection. It is not until you actually connect that you know if this device is a known device or not, and the peer expects the GATTS CCCD/SCCD states to be preserved between connections. On connection, all CCCD states have value "?", and the BLE_GATTS_EVT_SYS_ATTR_MISSING event should only occur if a) the peer tries to read a CCCD state that is "?" or b) the stack tries to do an operation that depends on the state of the CCCD (indicate/notify) when the value is "?". A write will not trigger this, because the "?" value is just overwritten then.

Reply
  • Yes, the best time to set it is immediately after connection. It is not until you actually connect that you know if this device is a known device or not, and the peer expects the GATTS CCCD/SCCD states to be preserved between connections. On connection, all CCCD states have value "?", and the BLE_GATTS_EVT_SYS_ATTR_MISSING event should only occur if a) the peer tries to read a CCCD state that is "?" or b) the stack tries to do an operation that depends on the state of the CCCD (indicate/notify) when the value is "?". A write will not trigger this, because the "?" value is just overwritten then.

Children
No Data
Related