36
36
#endif
37
37
38
38
#include "shared-bindings/bleio/ScanEntry.h"
39
+ #include "shared-bindings/bleio/Service.h"
40
+ #include "shared-bindings/bleio/UUID.h"
39
41
#include "shared-module/bleio/Device.h"
40
42
#include "py/objstr.h"
41
43
#include "py/runtime.h"
@@ -89,7 +91,6 @@ static volatile bool m_write_done;
89
91
90
92
static volatile ble_drv_adv_evt_callback_t adv_event_handler ;
91
93
static volatile ble_drv_gattc_evt_callback_t gattc_event_handler ;
92
- static volatile ble_drv_disc_add_service_callback_t disc_add_service_handler ;
93
94
static volatile ble_drv_disc_add_char_callback_t disc_add_char_handler ;
94
95
static volatile ble_drv_gattc_char_data_callback_t gattc_char_data_handle ;
95
96
@@ -799,22 +800,18 @@ void ble_drv_disconnect(bleio_device_obj_t *device) {
799
800
sd_ble_gap_disconnect (device -> conn_handle , BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION );
800
801
}
801
802
802
- bool ble_drv_discover_services (bleio_device_obj_t * device , uint16_t start_handle , ble_drv_disc_add_service_callback_t cb ) {
803
- BLE_DRIVER_LOG ("Discover primary services. Conn handle: 0x" HEX2_FMT "\n" , device -> conn_handle );
804
-
803
+ bool ble_drv_discover_services (bleio_device_obj_t * device , uint16_t start_handle ) {
805
804
mp_gattc_disc_service_observer = device ;
806
- disc_add_service_handler = cb ;
807
805
808
806
m_primary_service_found = false;
809
807
810
- uint32_t err_code ;
811
- err_code = sd_ble_gattc_primary_services_discover ( device -> conn_handle , start_handle , NULL );
812
- if ( err_code != 0 ) {
813
- return false ;
808
+ uint32_t err_code = sd_ble_gattc_primary_services_discover ( device -> conn_handle , start_handle , NULL ) ;
809
+ if ( err_code != NRF_SUCCESS ) {
810
+ nlr_raise ( mp_obj_new_exception_msg_varg ( & mp_type_OSError ,
811
+ "Failed to discover serivices. status: 0x" HEX2_FMT , ( uint16_t ) err_code )) ;
814
812
}
815
813
816
- // busy loop until last service has been iterated
817
- while (disc_add_service_handler != NULL ) {
814
+ while (mp_gattc_disc_service_observer != NULL ) {
818
815
#ifdef MICROPY_VM_HOOK_LOOP
819
816
MICROPY_VM_HOOK_LOOP
820
817
#endif
@@ -840,7 +837,6 @@ bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_o
840
837
return false;
841
838
}
842
839
843
- // busy loop until last service has been iterated
844
840
while (disc_add_char_handler != NULL ) {
845
841
#ifdef MICROPY_VM_HOOK_LOOP
846
842
MICROPY_VM_HOOK_LOOP
@@ -874,7 +870,39 @@ STATIC void on_adv_report(ble_gap_evt_adv_report_t *report) {
874
870
}
875
871
}
876
872
877
- static void ble_evt_handler (ble_evt_t * p_ble_evt ) {
873
+ STATIC void on_primary_srv_discovery_rsp (ble_gattc_evt_prim_srvc_disc_rsp_t * response ) {
874
+ BLE_DRIVER_LOG (">>> service count: %d\n" , response -> count );
875
+
876
+ for (size_t i = 0 ; i < response -> count ; ++ i ) {
877
+ const ble_gattc_service_t * gattc_service = & response -> services [i ];
878
+
879
+ bleio_service_obj_t * service = m_new_obj (bleio_service_obj_t );
880
+ service -> base .type = & bleio_service_type ;
881
+ service -> char_list = mp_obj_new_list (0 , NULL );
882
+ service -> start_handle = gattc_service -> handle_range .start_handle ;
883
+ service -> end_handle = gattc_service -> handle_range .end_handle ;
884
+ service -> handle = gattc_service -> handle_range .start_handle ;
885
+ service -> device = mp_gattc_disc_service_observer ;
886
+
887
+ bleio_uuid_obj_t * uuid = m_new_obj (bleio_uuid_obj_t );
888
+ uuid -> base .type = & bleio_uuid_type ;
889
+ uuid -> type = (gattc_service -> uuid .type == BLE_UUID_TYPE_BLE ) ? UUID_TYPE_16BIT : UUID_TYPE_128BIT ;
890
+ uuid -> value [0 ] = gattc_service -> uuid .uuid & 0xFF ;
891
+ uuid -> value [1 ] = gattc_service -> uuid .uuid >> 8 ;
892
+ service -> uuid = uuid ;
893
+
894
+ mp_obj_list_append (mp_gattc_disc_service_observer -> service_list , service );
895
+ }
896
+
897
+ if (response -> count > 0 ) {
898
+ m_primary_service_found = true;
899
+ }
900
+
901
+ // mark end of service discovery
902
+ mp_gattc_disc_service_observer = NULL ;
903
+ }
904
+
905
+ STATIC void ble_evt_handler (ble_evt_t * p_ble_evt ) {
878
906
printf ("%s - 0x%02X\r\n" , __func__ , p_ble_evt -> header .evt_id );
879
907
880
908
switch (p_ble_evt -> header .evt_id ) {
@@ -952,28 +980,7 @@ static void ble_evt_handler(ble_evt_t * p_ble_evt) {
952
980
break ;
953
981
954
982
case BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP :
955
- BLE_DRIVER_LOG ("BLE EVT PRIMARY SERVICE DISCOVERY RESPONSE\n" );
956
- BLE_DRIVER_LOG (">>> service count: %d\n" , p_ble_evt -> evt .gattc_evt .params .prim_srvc_disc_rsp .count );
957
-
958
- for (uint16_t i = 0 ; i < p_ble_evt -> evt .gattc_evt .params .prim_srvc_disc_rsp .count ; i ++ ) {
959
- ble_gattc_service_t * p_service = & p_ble_evt -> evt .gattc_evt .params .prim_srvc_disc_rsp .services [i ];
960
-
961
- ble_drv_service_data_t service ;
962
- service .uuid_type = p_service -> uuid .type ;
963
- service .uuid = p_service -> uuid .uuid ;
964
- service .start_handle = p_service -> handle_range .start_handle ;
965
- service .end_handle = p_service -> handle_range .end_handle ;
966
-
967
- disc_add_service_handler (mp_gattc_disc_service_observer , & service );
968
- }
969
-
970
- if (p_ble_evt -> evt .gattc_evt .params .prim_srvc_disc_rsp .count > 0 ) {
971
- m_primary_service_found = true;
972
- }
973
-
974
- // mark end of service discovery
975
- disc_add_service_handler = NULL ;
976
-
983
+ on_primary_srv_discovery_rsp (& p_ble_evt -> evt .gattc_evt .params .prim_srvc_disc_rsp );
977
984
break ;
978
985
979
986
case BLE_GATTC_EVT_CHAR_DISC_RSP :
0 commit comments