/**@brief Function for creating a message for writing to the CCCD. */ static uint32_t cccd_configure(uint16_t conn_handle, uint16_t cccd_handle, bool enable) { uint8_t buf[BLE_CCCD_VALUE_LEN]; buf[0] = enable ? BLE_GATT_HVX_NOTIFICATION : 0; buf[1] = 0; const ble_gattc_write_params_t write_params = { .write_op = BLE_GATT_OP_WRITE_REQ, .flags = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE, .handle = cccd_handle, .offset = 0, .len = sizeof(buf), .p_value = buf }; return sd_ble_gattc_write(conn_handle, &write_params); } uint32_t ble_nus_c_rx_notif_enable(ble_nus_c_t * p_ble_nus_c) { VERIFY_PARAM_NOT_NULL(p_ble_nus_c); if ( (p_ble_nus_c->conn_handle == BLE_CONN_HANDLE_INVALID) ||(p_ble_nus_c->handles.nus_rx_cccd_handle == BLE_GATT_HANDLE_INVALID) ) { return NRF_ERROR_INVALID_STATE; } return cccd_configure(p_ble_nus_c->conn_handle,p_ble_nus_c->handles.nus_rx_cccd_handle, true); }
uint32_t ble_hrs_c_hrm_notif_enable(ble_hrs_c_t * p_ble_hrs_c) { VERIFY_PARAM_NOT_NULL(p_ble_hrs_c); return cccd_configure(p_ble_hrs_c->conn_handle, p_ble_hrs_c->peer_hrs_db.hrm_cccd_handle, true); }
uint32_t ble_bas_c_bl_notif_enable(ble_bas_c_t * p_ble_bas_c) { if (p_ble_bas_c == NULL) { return NRF_ERROR_NULL; } return cccd_configure(p_ble_bas_c->conn_handle, p_ble_bas_c->bl_cccd_handle, true); }
uint32_t ble_ans_c_enable_notif_unread_alert(const ble_ans_c_t * p_ans) { if ( p_ans->conn_handle == BLE_CONN_HANDLE_INVALID) { return NRF_ERROR_INVALID_STATE; } return cccd_configure(p_ans->conn_handle, p_ans->service.unread_alert_cccd.handle, true); }
uint32_t ble_bas_c_bl_notif_enable(ble_bas_c_t * p_ble_bas_c) { VERIFY_PARAM_NOT_NULL(p_ble_bas_c); if (p_ble_bas_c->conn_handle == BLE_CONN_HANDLE_INVALID) { return NRF_ERROR_INVALID_STATE; } return cccd_configure(p_ble_bas_c->conn_handle, p_ble_bas_c->peer_bas_db.bl_cccd_handle, true); }
uint32_t ble_ancs_c_data_source_notif_disable(const ble_ancs_c_t * p_ancs) { return cccd_configure(p_ancs->conn_handle, m_service.data_source.handle_cccd, false); }
uint32_t ble_ancs_c_data_source_notif_enable(const ble_ancs_c_t * p_ancs) { LOG("[ANCS]: Enable Data Source notifications. Writing to handle: %i \n\r", m_service.data_source.handle_cccd); return cccd_configure(p_ancs->conn_handle, m_service.data_source.handle_cccd, true); }
uint32_t ble_ans_c_disable_notif_unread_alert(const ble_ans_c_t * p_ans) { return cccd_configure(p_ans->conn_handle, m_service.unread_alert_status.handle_cccd, false); }
uint32_t ble_ans_c_disable_notif_new_alert(const ble_ans_c_t * p_ans) { return cccd_configure(p_ans->conn_handle, m_service.new_alert.handle_cccd, false); }
uint32_t ble_ancs_c_data_source_notif_enable(const ble_ancs_c_t * p_ancs) { NRF_LOG_INFO("Enable Data Source notifications. Writing to handle: %i \r\n", p_ancs->service.data_source_cccd.handle); return cccd_configure(p_ancs->conn_handle, p_ancs->service.data_source_cccd.handle, true); }
uint32_t ble_ancs_c_notif_source_notif_disable(const ble_ancs_c_t * p_ancs) { return cccd_configure(p_ancs->conn_handle, p_ancs->service.notif_source_cccd.handle, false); }
uint32_t ble_ancs_c_enable_notif_notification_source(const ble_ancs_c_t * p_ancs) { return cccd_configure(p_ancs->conn_handle, m_service.notification_source.handle_cccd, true); }
uint32_t ble_bas_c_bl_notif_enable(ble_bas_c_t * p_ble_bas_c) { VERIFY_PARAM_NOT_NULL(p_ble_bas_c); return cccd_configure(p_ble_bas_c->conn_handle, p_ble_bas_c->bl_cccd_handle, true); }
/**@brief Function for creating a message for writing to the CCCD. */ static uint32_t cccd_configure(uint16_t conn_handle, uint16_t cccd_handle, bool enable) { uint8_t buf[BLE_CCCD_VALUE_LEN]; buf[0] = enable ? BLE_GATT_HVX_NOTIFICATION : 0; buf[1] = 0; const ble_gattc_write_params_t write_params = { .write_op = BLE_GATT_OP_WRITE_REQ, .flags = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE, .handle = cccd_handle, .offset = 0, .len = sizeof(buf), .p_value = buf }; return sd_ble_gattc_write(conn_handle, &write_params); } uint32_t ble_nus_c_rx_notif_enable(ble_nus_c_t * p_ble_nus_c) { if (p_ble_nus_c == NULL) { return NRF_ERROR_NULL; } if ( (p_ble_nus_c->conn_handle == BLE_CONN_HANDLE_INVALID) ||(p_ble_nus_c->nus_rx_cccd_handle == BLE_GATT_HANDLE_INVALID) ) { return NRF_ERROR_INVALID_STATE; } return cccd_configure(p_ble_nus_c->conn_handle,p_ble_nus_c->nus_rx_cccd_handle, true); } uint32_t ble_nus_c_string_send(ble_nus_c_t * p_ble_nus_c, uint8_t * p_string, uint16_t length) { if (p_ble_nus_c == NULL) { return NRF_ERROR_NULL; } if (length > BLE_NUS_MAX_DATA_LEN) { return NRF_ERROR_INVALID_PARAM; } if ( p_ble_nus_c->conn_handle == BLE_CONN_HANDLE_INVALID) { return NRF_ERROR_INVALID_STATE; } const ble_gattc_write_params_t write_params = { .write_op = BLE_GATT_OP_WRITE_CMD, .flags = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE, .handle = p_ble_nus_c->nus_tx_handle, .offset = 0, .len = length, .p_value = p_string }; return sd_ble_gattc_write(p_ble_nus_c->conn_handle, &write_params); }