@@ -325,10 +325,11 @@ bool connection_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
325325}
326326
327327void bleio_connection_clear (bleio_connection_internal_t * self ) {
328- self -> remote_service_list = NULL ;
328+ mp_obj_list_clear ( MP_OBJ_FROM_PTR ( self -> remote_service_list )) ;
329329
330330 self -> conn_handle = BLE_CONN_HANDLE_INVALID ;
331331 self -> pair_status = PAIR_NOT_PAIRED ;
332+ self -> is_central = false;
332333 bonding_clear_keys (& self -> bonding_keys );
333334}
334335
@@ -452,8 +453,6 @@ STATIC bool discover_next_descriptors(bleio_connection_internal_t* connection, b
452453}
453454
454455STATIC void on_primary_srv_discovery_rsp (ble_gattc_evt_prim_srvc_disc_rsp_t * response , bleio_connection_internal_t * connection ) {
455- bleio_service_obj_t * tail = connection -> remote_service_list ;
456-
457456 for (size_t i = 0 ; i < response -> count ; ++ i ) {
458457 ble_gattc_service_t * gattc_service = & response -> services [i ];
459458
@@ -481,12 +480,10 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res
481480 service -> uuid = NULL ;
482481 }
483482
484- service -> next = tail ;
485- tail = service ;
483+ mp_obj_list_append ( MP_OBJ_FROM_PTR ( connection -> remote_service_list ),
484+ MP_OBJ_FROM_PTR ( service )) ;
486485 }
487486
488- connection -> remote_service_list = tail ;
489-
490487 if (response -> count > 0 ) {
491488 m_discovery_successful = true;
492489 }
@@ -528,7 +525,8 @@ STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio
528525 GATT_MAX_DATA_LENGTH , false, // max_length, fixed_length: values may not matter for gattc
529526 NULL );
530527
531- mp_obj_list_append (m_char_discovery_service -> characteristic_list , MP_OBJ_FROM_PTR (characteristic ));
528+ mp_obj_list_append (MP_OBJ_FROM_PTR (m_char_discovery_service -> characteristic_list ),
529+ MP_OBJ_FROM_PTR (characteristic ));
532530 }
533531
534532 if (response -> count > 0 ) {
@@ -584,7 +582,8 @@ STATIC void on_desc_discovery_rsp(ble_gattc_evt_desc_disc_rsp_t *response, bleio
584582 GATT_MAX_DATA_LENGTH , false, mp_const_empty_bytes );
585583 descriptor -> handle = gattc_desc -> handle ;
586584
587- mp_obj_list_append (m_desc_discovery_characteristic -> descriptor_list , MP_OBJ_FROM_PTR (descriptor ));
585+ mp_obj_list_append (MP_OBJ_FROM_PTR (m_desc_discovery_characteristic -> descriptor_list ),
586+ MP_OBJ_FROM_PTR (descriptor ));
588587 }
589588
590589 if (response -> count > 0 ) {
@@ -625,7 +624,7 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
625624 ble_drv_add_event_handler (discovery_on_ble_evt , self );
626625
627626 // Start over with an empty list.
628- self -> remote_service_list = NULL ;
627+ self -> remote_service_list = mp_obj_new_list ( 0 , NULL ) ;
629628
630629 if (service_uuids_whitelist == mp_const_none ) {
631630 // List of service UUID's not given, so discover all available services.
@@ -637,7 +636,9 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
637636
638637 // Get the most recently discovered service, and then ask for services
639638 // whose handles start after the last attribute handle inside that service.
640- const bleio_service_obj_t * service = self -> remote_service_list ;
639+ // There must be at least one if discover_next_services() returned true.
640+ const bleio_service_obj_t * service =
641+ self -> remote_service_list -> items [self -> remote_service_list -> len - 1 ];
641642 next_service_start_handle = service -> end_handle + 1 ;
642643 }
643644 } else {
@@ -661,11 +662,10 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
661662 }
662663
663664
664- bleio_service_obj_t * service = self -> remote_service_list ;
665- while ( service != NULL ) {
665+ for ( size_t i = 0 ; i < self -> remote_service_list -> len ; i ++ ) {
666+ bleio_service_obj_t * service = MP_OBJ_TO_PTR ( self -> remote_service_list -> items [ i ]);
666667 // Skip the service if it had an unknown (unregistered) UUID.
667668 if (service -> uuid == NULL ) {
668- service = service -> next ;
669669 continue ;
670670 }
671671
@@ -677,9 +677,9 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
677677 while (next_char_start_handle <= service -> end_handle &&
678678 discover_next_characteristics (self , service , next_char_start_handle )) {
679679
680-
681680 // Get the most recently discovered characteristic, and then ask for characteristics
682681 // whose handles start after the last attribute handle inside that characteristic.
682+ // There must be at least one if discover_next_characteristics() returned true.
683683 const bleio_characteristic_obj_t * characteristic =
684684 MP_OBJ_TO_PTR (service -> characteristic_list -> items [service -> characteristic_list -> len - 1 ]);
685685
@@ -717,24 +717,26 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
717717 next_desc_start_handle , next_desc_end_handle )) {
718718 // Get the most recently discovered descriptor, and then ask for descriptors
719719 // whose handles start after that descriptor's handle.
720- const bleio_descriptor_obj_t * descriptor = characteristic -> descriptor_list ;
720+ // There must be at least one if discover_next_descriptors() returned true.
721+ const bleio_descriptor_obj_t * descriptor =
722+ characteristic -> descriptor_list -> items [characteristic -> descriptor_list -> len - 1 ];
721723 next_desc_start_handle = descriptor -> handle + 1 ;
722724 }
723725 }
724- service = service -> next ;
725726 }
726727
727728 // This event handler is no longer needed.
728729 ble_drv_remove_event_handler (discovery_on_ble_evt , self );
729-
730730}
731731
732732mp_obj_tuple_t * common_hal_bleio_connection_discover_remote_services (bleio_connection_obj_t * self , mp_obj_t service_uuids_whitelist ) {
733733 discover_remote_services (self -> connection , service_uuids_whitelist );
734734 bleio_connection_ensure_connected (self );
735735 // Convert to a tuple and then clear the list so the callee will take ownership.
736- mp_obj_tuple_t * services_tuple = service_linked_list_to_tuple (self -> connection -> remote_service_list );
737- self -> connection -> remote_service_list = NULL ;
736+ mp_obj_tuple_t * services_tuple =
737+ mp_obj_new_tuple (self -> connection -> remote_service_list -> len ,
738+ self -> connection -> remote_service_list -> items );
739+ mp_obj_list_clear (MP_OBJ_FROM_PTR (self -> connection -> remote_service_list ));
738740
739741 return services_tuple ;
740742}
0 commit comments