Skip to content

Commit 98aa8c5

Browse files
committed
nrf: Remove the ble drv specific service struct
1 parent 3df7dea commit 98aa8c5

File tree

3 files changed

+48
-69
lines changed

3 files changed

+48
-69
lines changed

ports/nrf/common-hal/bleio/Device.c

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,6 @@ STATIC void gattc_event_handler(bleio_device_obj_t *device, uint16_t event_id, u
5454
m_disc_evt_received = true;
5555
}
5656

57-
STATIC void disc_add_service(bleio_device_obj_t *device, ble_drv_service_data_t * service_data) {
58-
bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t);
59-
service->base.type = &bleio_service_type;
60-
61-
bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t);
62-
uuid->base.type = &bleio_uuid_type;
63-
uuid->type = (service_data->uuid_type == BLE_UUID_TYPE_BLE) ? UUID_TYPE_16BIT : UUID_TYPE_128BIT;
64-
uuid->value[0] = service_data->uuid & 0xFF;
65-
uuid->value[1] = service_data->uuid >> 8;
66-
67-
service->char_list = mp_obj_new_list(0, NULL);
68-
service->uuid = uuid;
69-
service->device = device;
70-
service->handle = service_data->start_handle;
71-
service->start_handle = service_data->start_handle;
72-
service->end_handle = service_data->end_handle;
73-
74-
mp_obj_list_append(device->service_list, service);
75-
}
76-
7757
STATIC void disc_add_char(bleio_service_obj_t *service, ble_drv_char_data_t *chara_data) {
7858
bleio_characteristic_obj_t *chara = m_new_obj(bleio_characteristic_obj_t);
7959
chara->base.type = &bleio_characteristic_type;
@@ -102,7 +82,6 @@ STATIC void disc_add_char(bleio_service_obj_t *service, ble_drv_char_data_t *cha
10282
mp_obj_list_append(service->char_list, MP_OBJ_FROM_PTR(chara));
10383
}
10484

105-
10685
void common_hal_bleio_device_start_advertising(bleio_device_obj_t *device, bleio_advertisement_data_t *adv_data) {
10786
if (adv_data->connectable) {
10887
ble_drv_gap_event_handler_set(device, gap_event_handler);
@@ -124,21 +103,22 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) {
124103
ble_drv_connect(device);
125104

126105
while (device->conn_handle == BLE_CONN_HANDLE_INVALID) {
127-
run_background_tasks();
128-
// __asm volatile ("wfi");
106+
#ifdef MICROPY_VM_HOOK_LOOP
107+
MICROPY_VM_HOOK_LOOP
108+
#endif
129109
}
130110

131111
ble_drv_gattc_event_handler_set(device, gattc_event_handler);
132112

133113
// TODO: read name
134114

135115
// find services
136-
bool found_service = ble_drv_discover_services(device, BLE_GATT_HANDLE_START, disc_add_service);
116+
bool found_service = ble_drv_discover_services(device, BLE_GATT_HANDLE_START);
137117
while (found_service) {
138118
const mp_obj_list_t *service_list = MP_OBJ_TO_PTR(device->service_list);
139119
const bleio_service_obj_t *service = service_list->items[service_list->len - 1];
140120

141-
found_service = ble_drv_discover_services(device, service->end_handle + 1, disc_add_service);
121+
found_service = ble_drv_discover_services(device, service->end_handle + 1);
142122
}
143123

144124
// find characteristics in each service

ports/nrf/drivers/bluetooth/ble_drv.c

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
#endif
3737

3838
#include "shared-bindings/bleio/ScanEntry.h"
39+
#include "shared-bindings/bleio/Service.h"
40+
#include "shared-bindings/bleio/UUID.h"
3941
#include "shared-module/bleio/Device.h"
4042
#include "py/objstr.h"
4143
#include "py/runtime.h"
@@ -89,7 +91,6 @@ static volatile bool m_write_done;
8991

9092
static volatile ble_drv_adv_evt_callback_t adv_event_handler;
9193
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;
9394
static volatile ble_drv_disc_add_char_callback_t disc_add_char_handler;
9495
static volatile ble_drv_gattc_char_data_callback_t gattc_char_data_handle;
9596

@@ -799,22 +800,18 @@ void ble_drv_disconnect(bleio_device_obj_t *device) {
799800
sd_ble_gap_disconnect(device->conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
800801
}
801802

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) {
805804
mp_gattc_disc_service_observer = device;
806-
disc_add_service_handler = cb;
807805

808806
m_primary_service_found = false;
809807

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));
814812
}
815813

816-
// busy loop until last service has been iterated
817-
while (disc_add_service_handler != NULL) {
814+
while (mp_gattc_disc_service_observer != NULL) {
818815
#ifdef MICROPY_VM_HOOK_LOOP
819816
MICROPY_VM_HOOK_LOOP
820817
#endif
@@ -840,7 +837,6 @@ bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_o
840837
return false;
841838
}
842839

843-
// busy loop until last service has been iterated
844840
while (disc_add_char_handler != NULL) {
845841
#ifdef MICROPY_VM_HOOK_LOOP
846842
MICROPY_VM_HOOK_LOOP
@@ -874,7 +870,39 @@ STATIC void on_adv_report(ble_gap_evt_adv_report_t *report) {
874870
}
875871
}
876872

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) {
878906
printf("%s - 0x%02X\r\n", __func__, p_ble_evt->header.evt_id);
879907

880908
switch (p_ble_evt->header.evt_id) {
@@ -952,28 +980,7 @@ static void ble_evt_handler(ble_evt_t * p_ble_evt) {
952980
break;
953981

954982
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);
977984
break;
978985

979986
case BLE_GATTC_EVT_CHAR_DISC_RSP:

ports/nrf/drivers/bluetooth/ble_drv.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,6 @@
3939
#include "shared-module/bleio/Scanner.h"
4040
#include "shared-module/bleio/Service.h"
4141

42-
typedef struct {
43-
uint16_t uuid;
44-
uint8_t uuid_type;
45-
uint16_t start_handle;
46-
uint16_t end_handle;
47-
} ble_drv_service_data_t;
48-
4942
typedef struct {
5043
uint16_t uuid;
5144
uint8_t uuid_type;
@@ -65,7 +58,6 @@ typedef void (*ble_drv_gap_evt_callback_t)(bleio_device_obj_t *device, uint16_t
6558
typedef void (*ble_drv_gatts_evt_callback_t)(bleio_device_obj_t *device, uint16_t event_id, uint16_t attr_handle, uint16_t length, uint8_t * data);
6659
typedef void (*ble_drv_gattc_evt_callback_t)(bleio_device_obj_t *device, uint16_t event_id, uint16_t attr_handle, uint16_t length, uint8_t * data);
6760
typedef void (*ble_drv_adv_evt_callback_t)(bleio_scanner_obj_t *scanner, bleio_scanentry_obj_t *entry);
68-
typedef void (*ble_drv_disc_add_service_callback_t)(bleio_device_obj_t *device, ble_drv_service_data_t * p_service_data);
6961
typedef void (*ble_drv_disc_add_char_callback_t)(bleio_service_obj_t *service, ble_drv_char_data_t * p_desc_data);
7062
typedef void (*ble_drv_gattc_char_data_callback_t)(bleio_characteristic_obj_t *self, uint16_t length, uint8_t * p_data);
7163

@@ -115,7 +107,7 @@ void ble_drv_connect(bleio_device_obj_t *device);
115107

116108
void ble_drv_disconnect(bleio_device_obj_t *device);
117109

118-
bool ble_drv_discover_services(bleio_device_obj_t *device, uint16_t start_handle, ble_drv_disc_add_service_callback_t cb);
110+
bool ble_drv_discover_services(bleio_device_obj_t *device, uint16_t start_handle);
119111

120112
bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_obj_t *service, uint16_t start_handle, ble_drv_disc_add_char_callback_t cb);
121113

0 commit comments

Comments
 (0)