4141#include "shared-bindings/bleio/UUID.h"
4242
4343static bleio_service_obj_t * m_char_discovery_service ;
44+ static volatile bool m_discovery_in_process ;
4445static volatile bool m_discovery_successful ;
4546
4647STATIC bool discover_next_services (bleio_central_obj_t * self , uint16_t start_handle ) {
4748 m_discovery_successful = false;
49+ m_discovery_in_process = true;
4850
4951 uint32_t err_code = sd_ble_gattc_primary_services_discover (self -> conn_handle , start_handle , NULL );
5052 if (err_code != NRF_SUCCESS ) {
5153 mp_raise_OSError_msg (translate ("Failed to discover services" ));
5254 }
5355
54- // Serialize discovery.
55- err_code = sd_mutex_acquire (& m_discovery_mutex );
56- if (err_code != NRF_SUCCESS ) {
57- mp_raise_OSError_msg (translate ("Failed to acquire mutex" ));
58- }
59-
60- // Wait for someone else to release m_discovery_mutex.
61- while (sd_mutex_acquire (& m_discovery_mutex ) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN ) {
62- #ifdef MICROPY_VM_HOOK_LOOP
63- MICROPY_VM_HOOK_LOOP
64- #endif
65- }
66-
67- err_code = sd_mutex_release (& m_discovery_mutex );
68- if (err_code != NRF_SUCCESS ) {
69- mp_raise_OSError_msg (translate ("Failed to release mutex" ));
56+ // Wait for a discovery event.
57+ while (m_discovery_in_process ) {
58+ MICROPY_VM_HOOK_LOOP ;
7059 }
71-
7260 return m_discovery_successful ;
7361}
7462
@@ -80,26 +68,17 @@ STATIC bool discover_next_characteristics(bleio_central_obj_t *self, bleio_servi
8068 handle_range .end_handle = service -> end_handle ;
8169
8270 m_discovery_successful = false;
71+ m_discovery_in_process = true;
8372
8473 uint32_t err_code = sd_ble_gattc_characteristics_discover (self -> conn_handle , & handle_range );
8574 if (err_code != NRF_SUCCESS ) {
8675 return false;
8776 }
8877
89- err_code = sd_mutex_acquire (& m_discovery_mutex );
90- if (err_code != NRF_SUCCESS ) {
91- mp_raise_OSError_msg (translate ("Failed to acquire mutex" ));
92- }
93-
94- while (sd_mutex_acquire (& m_discovery_mutex ) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN ) {
78+ // Wait for a discovery event.
79+ while (m_discovery_in_process ) {
9580 MICROPY_VM_HOOK_LOOP ;
9681 }
97-
98- err_code = sd_mutex_release (& m_discovery_mutex );
99- if (err_code != NRF_SUCCESS ) {
100- mp_raise_OSError_msg (translate ("Failed to release mutex" ));
101- }
102-
10382 return m_discovery_successful ;
10483}
10584
@@ -109,7 +88,7 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res
10988
11089 bleio_service_obj_t * service = m_new_obj (bleio_service_obj_t );
11190 service -> base .type = & bleio_service_type ;
112- service -> device = central ;
91+ service -> device = MP_OBJ_FROM_PTR ( central ) ;
11392 service -> characteristic_list = mp_obj_new_list (0 , NULL );
11493 service -> start_handle = gattc_service -> handle_range .start_handle ;
11594 service -> end_handle = gattc_service -> handle_range .end_handle ;
@@ -125,11 +104,7 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res
125104 if (response -> count > 0 ) {
126105 m_discovery_successful = true;
127106 }
128-
129- const uint32_t err_code = sd_mutex_release (& m_discovery_mutex );
130- if (err_code != NRF_SUCCESS ) {
131- mp_raise_OSError_msg (translate ("Failed to release mutex" ));
132- }
107+ m_discovery_in_process = false;
133108}
134109
135110STATIC void on_char_discovery_rsp (ble_gattc_evt_char_disc_rsp_t * response , bleio_central_obj_t * central ) {
@@ -159,11 +134,7 @@ STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio
159134 if (response -> count > 0 ) {
160135 m_discovery_successful = true;
161136 }
162-
163- const uint32_t err_code = sd_mutex_release (& m_discovery_mutex );
164- if (err_code != NRF_SUCCESS ) {
165- mp_raise_OSError_msg (translate ("Failed to release mutex" ));
166- }
137+ m_discovery_in_process = false;
167138}
168139
169140STATIC void on_ble_evt (ble_evt_t * ble_evt , void * central_in ) {
@@ -189,6 +160,8 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *central_in) {
189160
190161 case BLE_GAP_EVT_DISCONNECTED :
191162 central -> conn_handle = BLE_CONN_HANDLE_INVALID ;
163+ m_discovery_successful = false;
164+ m_discovery_in_process = false;
192165 break ;
193166
194167 case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP :
@@ -220,10 +193,22 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *central_in) {
220193 }
221194}
222195
196+ void common_hal_bleio_central_construct (bleio_central_obj_t * self , bleio_address_obj_t * address ) {
197+ common_hal_bleio_adapter_set_enabled (true);
198+
199+ self -> service_list = mp_obj_new_list (0 , NULL );
200+ self -> gatt_role = GATT_ROLE_CLIENT ;
201+ self -> conn_handle = BLE_CONN_HANDLE_INVALID ;
202+ }
203+
223204void common_hal_bleio_central_connect (bleio_central_obj_t * self , mp_float_t timeout ) {
224205 common_hal_bleio_adapter_set_enabled (true);
225206 ble_drv_add_event_handler (on_ble_evt , self );
226207
208+ ble_gap_addr_t addr ;
209+ addr .addr_type = self -> address .type ;
210+ memcpy (addr .addr , self -> address .bytes , NUM_BLEIO_ADDRESS_BYTES );
211+
227212 ble_gap_scan_params_t scan_params = {
228213 .interval = MSEC_TO_UNITS (100 , UNIT_0_625_MS ),
229214 .window = MSEC_TO_UNITS (100 , UNIT_0_625_MS ),
@@ -241,7 +226,7 @@ void common_hal_bleio_central_connect(bleio_central_obj_t *self, mp_float_t time
241226
242227 self -> attempting_to_connect = true;
243228
244- uint32_t err_code = sd_ble_gap_connect (& scan_params , & m_scan_buffer );
229+ uint32_t err_code = sd_ble_gap_connect (& addr , & scan_params , & conn_params , BLE_CONN_CFG_TAG_CUSTOM );
245230
246231 if (err_code != NRF_SUCCESS ) {
247232 mp_raise_OSError_msg_varg (translate ("Failed to start connecting, error 0x%04x" ), err_code );
@@ -266,7 +251,7 @@ void common_hal_bleio_central_connect(bleio_central_obj_t *self, mp_float_t time
266251 next_start_handle = BLE_GATT_HANDLE_START ;
267252
268253 while (1 ) {
269- if (!discover_next_services (self , discovery_start_handle )) {
254+ if (!discover_next_services (self , next_start_handle )) {
270255 break ;
271256 }
272257
@@ -310,3 +295,7 @@ void common_hal_bleio_central_connect(bleio_central_obj_t *self, mp_float_t time
310295void common_hal_bleio_central_disconnect (bleio_central_obj_t * self ) {
311296 sd_ble_gap_disconnect (self -> conn_handle , BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION );
312297}
298+
299+ mp_obj_t common_hal_bleio_central_get_remote_services (bleio_central_obj_t * self ) {
300+ return self -> service_list ;
301+ }
0 commit comments