Hello, I am studying the peripheral/ble_app_uart and peripheral/ble_app/template examples to understand the proper way to build a peripheral with our own set of services and characteristics. I'm also studying this tutorial:
One thing I don't understand is the purpose of the on_connect function in ble_nus. It says that it is checking 'the hosts CCCD value to inform of readiness to send data using the RX characteristic' and then it is performing a sd_ble_gatts_value_get. I don't really understand the purpose of these two things, and it's not explained in the tutorial. Do I need to do something like this when setting up my own characteristics?
Thanks!
/**@brief Function for handling the @ref BLE_GAP_EVT_CONNECTED event from the SoftDevice. * * @param[in] p_nus Nordic UART Service structure. * @param[in] p_ble_evt Pointer to the event received from BLE stack. */ static void on_connect(ble_nus_t * p_nus, ble_evt_t const * p_ble_evt) { ret_code_t err_code; ble_nus_evt_t evt; ble_gatts_value_t gatts_val; uint8_t cccd_value[2]; ble_nus_client_context_t * p_client = NULL; err_code = blcm_link_ctx_get(p_nus->p_link_ctx_storage, p_ble_evt->evt.gap_evt.conn_handle, (void *) &p_client); if (err_code != NRF_SUCCESS) { NRF_LOG_ERROR("Link context for 0x%02X connection handle could not be fetched.", p_ble_evt->evt.gap_evt.conn_handle); } /* Check the hosts CCCD value to inform of readiness to send data using the RX characteristic */ memset(&gatts_val, 0, sizeof(ble_gatts_value_t)); gatts_val.p_value = cccd_value; gatts_val.len = sizeof(cccd_value); gatts_val.offset = 0; err_code = sd_ble_gatts_value_get(p_ble_evt->evt.gap_evt.conn_handle, p_nus->tx_handles.cccd_handle, &gatts_val); if ((err_code == NRF_SUCCESS) && (p_nus->data_handler != NULL) && ble_srv_is_notification_enabled(gatts_val.p_value)) { if (p_client != NULL) { p_client->is_notification_enabled = true; } memset(&evt, 0, sizeof(ble_nus_evt_t)); evt.type = BLE_NUS_EVT_COMM_STARTED; evt.p_nus = p_nus; evt.conn_handle = p_ble_evt->evt.gap_evt.conn_handle; evt.p_link_ctx = p_client; p_nus->data_handler(&evt); } }