Skip to content

Commit 6545aa9

Browse files
committed
nrf: Remove the ble drv specific characteristic struct
1 parent 98aa8c5 commit 6545aa9

File tree

3 files changed

+45
-80
lines changed

3 files changed

+45
-80
lines changed

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

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -54,34 +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_char(bleio_service_obj_t *service, ble_drv_char_data_t *chara_data) {
58-
bleio_characteristic_obj_t *chara = m_new_obj(bleio_characteristic_obj_t);
59-
chara->base.type = &bleio_characteristic_type;
60-
61-
bleio_uuid_obj_t * p_uuid = m_new_obj(bleio_uuid_obj_t);
62-
p_uuid->base.type = &bleio_uuid_type;
63-
64-
chara->uuid = p_uuid;
65-
66-
p_uuid->type = chara_data->uuid_type;
67-
p_uuid->value[0] = chara_data->uuid & 0xFF;
68-
p_uuid->value[1] = chara_data->uuid >> 8;
69-
70-
// add characteristic specific data from discovery
71-
chara->props.broadcast = chara_data->props.broadcast;
72-
chara->props.indicate = chara_data->props.indicate;
73-
chara->props.notify = chara_data->props.notify;
74-
chara->props.read = chara_data->props.read;
75-
chara->props.write = chara_data->props.write;
76-
chara->props.write_wo_resp = chara_data->props.write_wo_resp;
77-
chara->handle = chara_data->value_handle;
78-
79-
chara->service_handle = service->handle;
80-
chara->service = service;
81-
82-
mp_obj_list_append(service->char_list, MP_OBJ_FROM_PTR(chara));
83-
}
84-
8557
void common_hal_bleio_device_start_advertising(bleio_device_obj_t *device, bleio_advertisement_data_t *adv_data) {
8658
if (adv_data->connectable) {
8759
ble_drv_gap_event_handler_set(device, gap_event_handler);
@@ -126,7 +98,7 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) {
12698
for (size_t i = 0; i < service_list->len; ++i) {
12799
bleio_service_obj_t *service = service_list->items[i];
128100

129-
bool found_char = ble_drv_discover_characteristic(device, service, service->start_handle, disc_add_char);
101+
bool found_char = ble_drv_discover_characteristic(device, service, service->start_handle);
130102
while (found_char) {
131103
const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(service->char_list);
132104
const bleio_characteristic_obj_t *characteristic = char_list->items[char_list->len - 1];
@@ -136,7 +108,7 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) {
136108
break;
137109
}
138110

139-
found_char = ble_drv_discover_characteristic(device, service, next_handle, disc_add_char);
111+
found_char = ble_drv_discover_characteristic(device, service, next_handle);
140112
}
141113
}
142114
}

ports/nrf/drivers/bluetooth/ble_drv.c

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#define NRF52 // Needed for SD132 v2
3636
#endif
3737

38+
#include "shared-bindings/bleio/Characteristic.h"
3839
#include "shared-bindings/bleio/ScanEntry.h"
3940
#include "shared-bindings/bleio/Service.h"
4041
#include "shared-bindings/bleio/UUID.h"
@@ -91,7 +92,6 @@ static volatile bool m_write_done;
9192

9293
static volatile ble_drv_adv_evt_callback_t adv_event_handler;
9394
static volatile ble_drv_gattc_evt_callback_t gattc_event_handler;
94-
static volatile ble_drv_disc_add_char_callback_t disc_add_char_handler;
9595
static volatile ble_drv_gattc_char_data_callback_t gattc_char_data_handle;
9696

9797
static bleio_scanner_obj_t *mp_adv_observer;
@@ -820,11 +820,10 @@ bool ble_drv_discover_services(bleio_device_obj_t *device, uint16_t start_handle
820820
return m_primary_service_found;
821821
}
822822

823-
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) {
823+
bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_obj_t *service, uint16_t start_handle) {
824824
BLE_DRIVER_LOG("Discover characteristicts. Conn handle: 0x" HEX2_FMT "\n", device->conn_handle);
825825

826826
mp_gattc_disc_char_observer = service;
827-
disc_add_char_handler = cb;
828827

829828
ble_gattc_handle_range_t handle_range;
830829
handle_range.start_handle = start_handle;
@@ -837,7 +836,7 @@ bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_o
837836
return false;
838837
}
839838

840-
while (disc_add_char_handler != NULL) {
839+
while (mp_gattc_disc_char_observer != NULL) {
841840
#ifdef MICROPY_VM_HOOK_LOOP
842841
MICROPY_VM_HOOK_LOOP
843842
#endif
@@ -902,6 +901,44 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res
902901
mp_gattc_disc_service_observer = NULL;
903902
}
904903

904+
STATIC void on_characteristic_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response) {
905+
BLE_DRIVER_LOG(">>> characteristic count: %d\n", response->count);
906+
907+
for (size_t i = 0; i < response->count; ++i) {
908+
const ble_gattc_char_t *gattc_char = &response->chars[i];
909+
910+
bleio_characteristic_obj_t *characteristic = m_new_obj(bleio_characteristic_obj_t);
911+
characteristic->base.type = &bleio_characteristic_type;
912+
913+
bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t);
914+
uuid->base.type = &bleio_uuid_type;
915+
uuid->type = (gattc_char->uuid.type == BLE_UUID_TYPE_BLE) ? UUID_TYPE_16BIT : UUID_TYPE_128BIT;
916+
uuid->value[0] = gattc_char->uuid.uuid & 0xFF;
917+
uuid->value[1] = gattc_char->uuid.uuid >> 8;
918+
characteristic->uuid = uuid;
919+
920+
characteristic->props.broadcast = gattc_char->char_props.broadcast;
921+
characteristic->props.indicate = gattc_char->char_props.indicate;
922+
characteristic->props.notify = gattc_char->char_props.notify;
923+
characteristic->props.read = gattc_char->char_props.read;
924+
characteristic->props.write = gattc_char->char_props.write;
925+
characteristic->props.write_wo_resp = gattc_char->char_props.write_wo_resp;
926+
characteristic->handle = gattc_char->handle_value;
927+
928+
characteristic->service_handle = mp_gattc_disc_char_observer->handle;
929+
characteristic->service = mp_gattc_disc_char_observer;
930+
931+
mp_obj_list_append(mp_gattc_disc_char_observer->char_list, MP_OBJ_FROM_PTR(characteristic));
932+
}
933+
934+
if (response->count > 0) {
935+
m_characteristic_found = true;
936+
}
937+
938+
// mark end of characteristic discovery
939+
mp_gattc_disc_char_observer = NULL;
940+
}
941+
905942
STATIC void ble_evt_handler(ble_evt_t *p_ble_evt) {
906943
printf("%s - 0x%02X\r\n", __func__, p_ble_evt->header.evt_id);
907944

@@ -984,35 +1021,7 @@ STATIC void ble_evt_handler(ble_evt_t *p_ble_evt) {
9841021
break;
9851022

9861023
case BLE_GATTC_EVT_CHAR_DISC_RSP:
987-
BLE_DRIVER_LOG("BLE EVT CHAR DISCOVERY RESPONSE\n");
988-
BLE_DRIVER_LOG(">>> characteristic count: %d\n", p_ble_evt->evt.gattc_evt.params.char_disc_rsp.count);
989-
990-
for (uint16_t i = 0; i < p_ble_evt->evt.gattc_evt.params.char_disc_rsp.count; i++) {
991-
ble_gattc_char_t * p_char = &p_ble_evt->evt.gattc_evt.params.char_disc_rsp.chars[i];
992-
993-
ble_drv_char_data_t char_data;
994-
char_data.uuid_type = p_char->uuid.type;
995-
char_data.uuid = p_char->uuid.uuid;
996-
char_data.decl_handle = p_char->handle_decl;
997-
char_data.value_handle = p_char->handle_value;
998-
999-
char_data.props.broadcast = p_char->char_props.broadcast;
1000-
char_data.props.read = p_char->char_props.read;
1001-
char_data.props.write_wo_resp = p_char->char_props.write_wo_resp;
1002-
char_data.props.write = p_char->char_props.write;
1003-
char_data.props.notify = p_char->char_props.notify;
1004-
char_data.props.indicate = p_char->char_props.indicate;
1005-
1006-
disc_add_char_handler(mp_gattc_disc_char_observer, &char_data);
1007-
}
1008-
1009-
if (p_ble_evt->evt.gattc_evt.params.char_disc_rsp.count > 0) {
1010-
m_characteristic_found = true;
1011-
}
1012-
1013-
// mark end of characteristic discovery
1014-
disc_add_char_handler = NULL;
1015-
1024+
on_characteristic_discovery_rsp(&p_ble_evt->evt.gattc_evt.params.char_disc_rsp);
10161025
break;
10171026

10181027
case BLE_GATTC_EVT_READ_RSP:

ports/nrf/drivers/bluetooth/ble_drv.h

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,10 @@
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-
struct {
46-
bool broadcast : 1;
47-
bool read : 1;
48-
bool write_wo_resp : 1;
49-
bool write : 1;
50-
bool notify : 1;
51-
bool indicate : 1;
52-
} props;
53-
uint16_t decl_handle;
54-
uint16_t value_handle;
55-
} ble_drv_char_data_t;
56-
5742
typedef void (*ble_drv_gap_evt_callback_t)(bleio_device_obj_t *device, uint16_t event_id, uint16_t conn_handle, uint16_t length, uint8_t * data);
5843
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);
5944
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);
6045
typedef void (*ble_drv_adv_evt_callback_t)(bleio_scanner_obj_t *scanner, bleio_scanentry_obj_t *entry);
61-
typedef void (*ble_drv_disc_add_char_callback_t)(bleio_service_obj_t *service, ble_drv_char_data_t * p_desc_data);
6246
typedef void (*ble_drv_gattc_char_data_callback_t)(bleio_characteristic_obj_t *self, uint16_t length, uint8_t * p_data);
6347

6448
uint32_t ble_drv_stack_enable(void);
@@ -109,7 +93,7 @@ void ble_drv_disconnect(bleio_device_obj_t *device);
10993

11094
bool ble_drv_discover_services(bleio_device_obj_t *device, uint16_t start_handle);
11195

112-
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);
96+
bool ble_drv_discover_characteristic(bleio_device_obj_t *device, bleio_service_obj_t *service, uint16_t start_handle);
11397

11498
void ble_drv_discover_descriptors(void);
11599

0 commit comments

Comments
 (0)