@@ -74,24 +74,20 @@ uint16_t BLEGatt::readCharByUuid(uint16_t conn_hdl, BLEUuid bleuuid, void* buffe
7474 return (count < 0 ) ? 0 : count;
7575}
7676
77- // bool BLEGatt::waitForIndicateConfirm(uint16_t conn_hdl)
78- // {
79- // while( _adamsg.isWaiting() )
80- // {
81- // // TODO multiple peripherals
82- // delay( Bluefruit.connInterval() );
83- // }
84- //
85- // _adamsg.begin(true);
86- // _adamsg.prepare(NULL, 0);
87- //
88- // // Wait for HVC event
89- // int32_t result = _adamsg.waitUntilComplete(BLE_GENERIC_TIMEOUT);
90- //
91- // _adamsg.stop();
92- //
93- // return (result == 0);
94- // }
77+ bool BLEGatt::waitForIndicateConfirm (uint16_t conn_hdl)
78+ {
79+ BLEGap::gap_peer_t * peer = Bluefruit.Gap ._get_peer (conn_hdl);
80+
81+ // hvi confirm semaphore is created on the fly
82+ peer->indicate_confirm_sem = xSemaphoreCreateBinary ();
83+
84+ xSemaphoreTake (peer->indicate_confirm_sem , portMAX_DELAY);
85+
86+ vSemaphoreDelete (peer->indicate_confirm_sem );
87+ peer->indicate_confirm_sem = NULL ;
88+
89+ return peer->hvc_received ;
90+ }
9591
9692void BLEGatt::_eventHandler (ble_evt_t * evt)
9793{
@@ -204,25 +200,51 @@ void BLEGatt::_eventHandler(ble_evt_t* evt)
204200 }
205201
206202 // GATTC Read Characteristic by UUID procedure
207- if ( evt_id == BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP )
203+ switch ( evt_id )
208204 {
209- ble_gattc_evt_char_val_by_uuid_read_rsp_t * rd_rsp = &evt->evt .gattc_evt .params .char_val_by_uuid_read_rsp ;
205+ case BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP:
206+ {
207+ ble_gattc_evt_char_val_by_uuid_read_rsp_t * rd_rsp = &evt->evt .gattc_evt .params .char_val_by_uuid_read_rsp ;
208+
209+ if (rd_rsp->count )
210+ {
211+ #if SD_VER < 500
212+ _adamsg.feed (rd_rsp->handle_value [0 ].p_value , rd_rsp->value_len );
213+ #else
214+ ble_gattc_handle_value_t hdl_value;
215+
216+ if ( ERROR_NONE == sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter (&evt->evt .gattc_evt , &hdl_value) )
217+ {
218+ _adamsg.feed (hdl_value.p_value , rd_rsp->value_len );
219+ }
220+ #endif
221+
222+ _adamsg.complete ();
223+ }
224+ }
210225
211- if (rd_rsp-> count )
226+ case BLE_GATTS_EVT_HVC:
212227 {
213- #if SD_VER < 500
214- _adamsg.feed (rd_rsp->handle_value [0 ].p_value , rd_rsp->value_len );
215- #else
216- ble_gattc_handle_value_t hdl_value;
228+ LOG_LV2 (" GATTS" , " Confirm received handle = 0x%04X" , evt->evt .gatts_evt .params .hvc .handle );
229+ BLEGap::gap_peer_t * peer = Bluefruit.Gap ._get_peer (evt_conn_hdl);
217230
218- if ( ERROR_NONE == sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter (&evt->evt .gattc_evt , &hdl_value) )
219- {
220- _adamsg.feed (hdl_value.p_value , rd_rsp->value_len );
221- }
222- #endif
231+ if ( peer->indicate_confirm_sem ) xSemaphoreGive (peer->indicate_confirm_sem );
232+ peer->hvc_received = true ;
233+ }
234+ break ;
223235
224- _adamsg.complete ();
236+ case BLE_GATTS_EVT_TIMEOUT:
237+ {
238+ LOG_LV2 (" GATTS" , " Timeout Source = %d" , evt->evt .gatts_evt .params .timeout .src );
239+
240+ BLEGap::gap_peer_t * peer = Bluefruit.Gap ._get_peer (evt_conn_hdl);
241+
242+ if ( peer->indicate_confirm_sem ) xSemaphoreGive (peer->indicate_confirm_sem );
243+ peer->hvc_received = false ;
225244 }
245+ break ;
246+
247+ default : break ;
226248 }
227249}
228250
0 commit comments