@@ -74,24 +74,20 @@ uint16_t BLEGatt::readCharByUuid(uint16_t conn_hdl, BLEUuid bleuuid, void* buffe
74
74
return (count < 0 ) ? 0 : count;
75
75
}
76
76
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
+ }
95
91
96
92
void BLEGatt::_eventHandler (ble_evt_t * evt)
97
93
{
@@ -204,25 +200,51 @@ void BLEGatt::_eventHandler(ble_evt_t* evt)
204
200
}
205
201
206
202
// GATTC Read Characteristic by UUID procedure
207
- if ( evt_id == BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP )
203
+ switch ( evt_id )
208
204
{
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
+ }
210
225
211
- if (rd_rsp-> count )
226
+ case BLE_GATTS_EVT_HVC:
212
227
{
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);
217
230
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 ;
223
235
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 ;
225
244
}
245
+ break ;
246
+
247
+ default : break ;
226
248
}
227
249
}
228
250
0 commit comments