Hello.
I connected the Image transfer service (running on a nrf52840) to another nrf52840 running a modified BLE_NUS_C service.
However, a BLE packet won't be send out, because the function ble_its_img_info_send(&m_its, &image_info) (lined below) will be aborted because of the check:
if ((!p_its->is_info_char_notification_enabled)) { printf("Failed with NRF_ERROR_INVALID_STATE, because \"is_info_char_notification_enabled\"==false\n"); return NRF_ERROR_INVALID_STATE; }
uint32_t ble_its_img_info_send(ble_its_t * p_its, ble_its_img_info_t * img_info) { uint8_t data_buf[1 + sizeof(ble_its_img_info_t)]; ble_gatts_hvx_params_t hvx_params; VERIFY_PARAM_NOT_NULL(p_its); if ((p_its->conn_handle == BLE_CONN_HANDLE_INVALID)) { printf("Failed: BLE_CONN_HANDLE_INVALIDn"); return NRF_ERROR_INVALID_STATE; } if ((!p_its->is_info_char_notification_enabled)) { printf("Failed with NRF_ERROR_INVALID_STATE, because \"is_info_char_notification_enabled\"==false\n"); return NRF_ERROR_INVALID_STATE; } uint16_t length = 1 + sizeof(ble_its_img_info_t); data_buf[0] = 1; memcpy(&data_buf[1], img_info, sizeof(ble_its_img_info_t)); memset(&hvx_params, 0, sizeof(hvx_params)); hvx_params.handle = p_its->img_info_handles.value_handle; hvx_params.p_data = data_buf; hvx_params.p_len = &length; hvx_params.type = BLE_GATT_HVX_NOTIFICATION; return sd_ble_gatts_hvx(p_its->conn_handle, &hvx_params); }
When searching for the is_info_char_notification_enabled variable/flag, it is controlled in the on_write() function triggered by the BLE_GATTS_EVT_WRITE event.
/**@brief Function for handling the @ref BLE_GATTS_EVT_WRITE event from the S110 SoftDevice. * * @param[in] p_its Nordic UART Service structure. * @param[in] p_ble_evt Pointer to the event received from BLE stack. */ static void on_write(ble_its_t * p_its, ble_evt_t const * p_ble_evt) { ble_gatts_evt_write_t const * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write; if ( (p_evt_write->handle == p_its->tx_handles.cccd_handle) && (p_evt_write->len == 2) ) { if (ble_srv_is_notification_enabled(p_evt_write->data)) { p_its->is_notification_enabled = true; } else { p_its->is_notification_enabled = false; } } else if ( (p_evt_write->handle == p_its->img_info_handles.cccd_handle) && (p_evt_write->len == 2) ) { if (ble_srv_is_notification_enabled(p_evt_write->data)) { printf("CHAR NOTIFICATION ENABLED\n"); p_its->is_info_char_notification_enabled = true; //HERE } else { printf("CHAR NOTIFICATION DISABLED\n"); p_its->is_info_char_notification_enabled = false; } } else if ( (p_evt_write->handle == p_its->rx_handles.value_handle) && (p_its->data_handler != NULL) ) { p_its->data_handler(p_its, p_evt_write->data, p_evt_write->len); } else { // Do Nothing. This event is not relevant for this service. } }
What does this variable/flag mean?
What is missing that it won't be set when connecting to my BLE_NUS_C service, however, it is working when connecting to the Image_Transfer_Demo Andoid APP?
How can I solve that?
Thnaks!