Skip to content

Commit 35b9191

Browse files
committed
Don't operate directly on bleio objects in shared-bindings: use common_hal
routines instead. Changes made but not yet tested.
1 parent 1356819 commit 35b9191

34 files changed

Lines changed: 294 additions & 113 deletions

ports/nrf/common-hal/bleio/Broadcaster.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
* THE SOFTWARE.
2626
*/
2727

28-
#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H
29-
#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H
28+
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_BROADCASTER_H
29+
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_BROADCASTER_H
3030

3131
#include "ble.h"
3232

@@ -44,4 +44,4 @@ typedef struct {
4444

4545
} bleio_broadcaster_obj_t;
4646

47-
#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H
47+
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_BROADCASTER_H

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,11 @@ void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self,
237237

238238
}
239239

240-
void common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self) {
240+
void common_hal_bleio_characteristic_set_service(bleio_characteristic_obj_t *self, bleio_service_obj_t *service) {
241+
self->service = service;
242+
}
243+
244+
mp_obj_t common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self) {
241245
switch (common_hal_bleio_device_get_gatt_role(self->service->device)) {
242246
case GATT_ROLE_CLIENT:
243247
gattc_read(self);
@@ -251,6 +255,8 @@ void common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self)
251255
mp_raise_RuntimeError(translate("bad GATT role"));
252256
break;
253257
}
258+
259+
return self->value_data;
254260
}
255261

256262
void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) {
@@ -285,3 +291,11 @@ void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self,
285291
break;
286292
}
287293
}
294+
295+
bleio_uuid_obj_t *common_hal_bleio_characteristic_get_uuid(bleio_characteristic_obj_t *self) {
296+
return self->uuid;
297+
}
298+
299+
bleio_characteristic_properties_t common_hal_bleio_characteristic_get_properties(bleio_characteristic_obj_t *self) {
300+
return self->props;
301+
}

ports/nrf/common-hal/bleio/Characteristic.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
* THE SOFTWARE.
2525
*/
2626

27-
#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H
28-
#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H
27+
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTIC_H
28+
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTIC_H
2929

3030
#include "shared-module/bleio/Characteristic.h"
31-
#include "shared-module/bleio/Service.h"
31+
#include "common-hal/bleio/Service.h"
3232
#include "common-hal/bleio/UUID.h"
3333

3434
typedef struct {
@@ -43,4 +43,4 @@ typedef struct {
4343
uint16_t sccd_handle;
4444
} bleio_characteristic_obj_t;
4545

46-
#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H
46+
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTIC_H

ports/nrf/common-hal/bleio/CharacteristicBuffer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
* THE SOFTWARE.
2525
*/
2626

27-
#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
28-
#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
27+
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
28+
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
2929

3030
#include "nrf_soc.h"
3131

@@ -40,4 +40,4 @@ typedef struct {
4040
ringbuf_t ringbuf;
4141
} bleio_characteristic_buffer_obj_t;
4242

43-
#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H
43+
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res
323323
bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t);
324324
service->base.type = &bleio_service_type;
325325
service->device = device;
326-
service->char_list = mp_obj_new_list(0, NULL);
326+
service->characteristic_list = mp_obj_new_list(0, NULL);
327327
service->start_handle = gattc_service->handle_range.start_handle;
328328
service->end_handle = gattc_service->handle_range.end_handle;
329329
service->handle = gattc_service->handle_range.start_handle;
@@ -366,7 +366,7 @@ STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio
366366
characteristic->handle = gattc_char->handle_value;
367367
characteristic->service = m_char_discovery_service;
368368

369-
mp_obj_list_append(m_char_discovery_service->char_list, MP_OBJ_FROM_PTR(characteristic));
369+
mp_obj_list_append(m_char_discovery_service->characteristic_list, MP_OBJ_FROM_PTR(characteristic));
370370
}
371371

372372
if (response->count > 0) {
@@ -491,9 +491,9 @@ void common_hal_bleio_device_add_service(bleio_device_obj_t *device, bleio_servi
491491
mp_raise_OSError_msg(translate("Failed to add service"));
492492
}
493493

494-
const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(service->char_list);
495-
for (size_t i = 0; i < char_list->len; ++i) {
496-
bleio_characteristic_obj_t *characteristic = char_list->items[i];
494+
const mp_obj_list_t *characteristic_list = MP_OBJ_TO_PTR(service->characteristic_list);
495+
for (size_t i = 0; i < characteristic_list->len; ++i) {
496+
bleio_characteristic_obj_t *characteristic = characteristic_list->items[i];
497497
common_hal_bleio_service_add_characteristic(service, characteristic);
498498
}
499499
}
@@ -583,8 +583,8 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) {
583583

584584
bool found_char = discover_characteristics(device, service, service->start_handle);
585585
while (found_char) {
586-
const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(service->char_list);
587-
const bleio_characteristic_obj_t *characteristic = char_list->items[char_list->len - 1];
586+
const mp_obj_list_t *characteristic_list = MP_OBJ_TO_PTR(service->characteristic_list);
587+
const bleio_characteristic_obj_t *characteristic = characteristic_list->items[characteristic_list->len - 1];
588588

589589
const uint16_t next_handle = characteristic->handle + 1;
590590
if (next_handle >= service->end_handle) {

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,15 @@
3333
#include "ble_hci.h"
3434
#include "nrf_soc.h"
3535
#include "py/gc.h"
36+
#include "py/objlist.h"
3637
#include "py/objstr.h"
3738
#include "py/runtime.h"
3839
#include "shared-bindings/bleio/Adapter.h"
3940
#include "shared-bindings/bleio/Characteristic.h"
4041
#include "shared-bindings/bleio/Peripheral.h"
4142
#include "shared-bindings/bleio/Service.h"
4243
#include "shared-bindings/bleio/UUID.h"
44+
#include "common-hal/bleio/Service.h"
4345

4446
#define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS)
4547
#define BLE_MAX_CONN_INTERVAL MSEC_TO_UNITS(300, UNIT_0_625_MS)
@@ -117,19 +119,23 @@ STATIC void peripheral_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
117119
}
118120
}
119121

120-
void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self) {
122+
void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self, mp_obj_list_t *service_list, mp_obj_t name) {
121123
common_hal_bleio_adapter_set_enabled(true);
122124

125+
self->service_list = service_list;
126+
self->name = name;
127+
123128
self->gatt_role = GATT_ROLE_SERVER;
124129
self->conn_handle = BLE_CONN_HANDLE_INVALID;
125130
self->adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
126131

127132
// Add all the services.
128133

129-
mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list);
130134
for (size_t service_idx = 0; service_idx < service_list->len; ++service_idx) {
131135
bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[service_idx]);
132136

137+
common_hal_bleio_service_set_device(service, MP_OBJ_FROM_PTR(self));
138+
133139
ble_uuid_t uuid;
134140
bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid);
135141

@@ -149,10 +155,18 @@ void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self) {
149155
}
150156

151157

158+
mp_obj_list_t *common_hal_bleio_peripheral_get_service_list(bleio_peripheral_obj_t *self) {
159+
return self->service_list;
160+
}
161+
152162
bool common_hal_bleio_peripheral_get_connected(bleio_peripheral_obj_t *self) {
153163
return self->conn_handle != BLE_CONN_HANDLE_INVALID;
154164
}
155165

166+
mp_obj_t common_hal_bleio_peripheral_get_name(bleio_peripheral_obj_t *self) {
167+
return self->name;
168+
}
169+
156170
void common_hal_bleio_peripheral_start_advertising(bleio_peripheral_obj_t *self, bool connectable, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo) {
157171

158172
// interval value has already been validated.

ports/nrf/common-hal/bleio/Peripheral.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@
2525
* THE SOFTWARE.
2626
*/
2727

28-
#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H
29-
#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H
28+
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_PERIPHERAL_H
29+
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_PERIPHERAL_H
3030

3131
#include <stdbool.h>
3232

3333
#include "ble.h"
3434

35+
#include "py/obj.h"
36+
#include "py/objlist.h"
37+
3538
#include "shared-module/bleio/__init__.h"
3639
#include "shared-module/bleio/Address.h"
3740

@@ -40,8 +43,7 @@ typedef struct {
4043
mp_obj_t name;
4144
gatt_role_t gatt_role;
4245
volatile uint16_t conn_handle;
43-
mp_obj_t service_list;
44-
mp_obj_t notif_handler;
46+
mp_obj_list_t *service_list;
4547
mp_obj_t conn_handler;
4648
// The advertising data and scan response buffers are held by us, not by the SD, so we must
4749
// maintain them and not change it. If we need to change the contents during advertising,
@@ -52,4 +54,4 @@ typedef struct {
5254

5355
} bleio_peripheral_obj_t;
5456

55-
#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H
57+
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_PERIPHERAL_H

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "ble_drv.h"
3131
#include "ble_gap.h"
3232
#include "py/mphal.h"
33+
#include "py/objlist.h"
3334
#include "py/runtime.h"
3435
#include "shared-bindings/bleio/Adapter.h"
3536
#include "shared-bindings/bleio/ScanEntry.h"
@@ -68,6 +69,10 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *scanner_in) {
6869
}
6970
}
7071

72+
void common_hal_bleio_scanner_construct(bleio_scanner_obj_t *self) {
73+
self->adv_reports = mp_obj_new_list(0, NULL);
74+
}
75+
7176
void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_float_t timeout, mp_float_t interval, mp_float_t window) {
7277
common_hal_bleio_adapter_set_enabled(true);
7378
ble_drv_add_event_handler(on_ble_evt, self);
@@ -78,7 +83,8 @@ void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_float_t timeout
7883
.scan_phys = BLE_GAP_PHY_1MBPS,
7984
};
8085

81-
common_hal_bleio_adapter_set_enabled(true);
86+
// Empty the advertising reports list.
87+
mp_obj_list_clear(self->adv_reports);
8288

8389
uint32_t err_code;
8490
err_code = sd_ble_gap_scan_start(&scan_params, &m_scan_buffer);
@@ -90,3 +96,7 @@ void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_float_t timeout
9096
mp_hal_delay_ms(timeout * 1000);
9197
sd_ble_gap_scan_stop();
9298
}
99+
100+
mp_obj_t common_hal_bleio_scanner_get_adv_reports(bleio_scanner_obj_t *self) {
101+
return self->adv_reports;
102+
}
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*
44
* The MIT License (MIT)
55
*
6+
* Copyright (c) 2019 Dan Halbert for Adafruit Industries
67
* Copyright (c) 2018 Artur Pacholec
78
*
89
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -24,16 +25,16 @@
2425
* THE SOFTWARE.
2526
*/
2627

27-
#ifndef MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANNER_H
28-
#define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANNER_H
28+
#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_SCANNER_H
29+
#define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_SCANNER_H
2930

3031
#include "py/obj.h"
3132

3233
typedef struct {
3334
mp_obj_base_t base;
34-
mp_obj_t adv_reports;
35+
mp_obj_t adv_reports; // List of reports.
3536
uint16_t interval;
3637
uint16_t window;
3738
} bleio_scanner_obj_t;
3839

39-
#endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SCANNER_H
40+
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_SCANNER_H

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,46 @@
2929
#include "py/runtime.h"
3030
#include "common-hal/bleio/__init__.h"
3131
#include "common-hal/bleio/Characteristic.h"
32+
#include "shared-bindings/bleio/Characteristic.h"
3233
#include "shared-bindings/bleio/Service.h"
3334
#include "shared-bindings/bleio/Adapter.h"
3435

35-
void common_hal_bleio_service_construct(bleio_service_obj_t *self) {
36+
void common_hal_bleio_service_construct(bleio_service_obj_t *self, bleio_uuid_obj_t *uuid, mp_obj_list_t *characteristic_list, bool is_secondary) {
37+
self->device = mp_const_none;
38+
self->handle = 0xFFFF;
39+
self->uuid = uuid;
40+
self->characteristic_list = characteristic_list;
41+
self->is_secondary = is_secondary;
42+
43+
for (size_t characteristic_idx = 0; characteristic_idx < characteristic_list->len; ++characteristic_idx) {
44+
bleio_characteristic_obj_t *characteristic = MP_OBJ_TO_PTR(characteristic_list->items[characteristic_idx]);
45+
common_hal_bleio_characteristic_set_service(characteristic, self);
46+
}
47+
48+
}
49+
50+
bleio_uuid_obj_t *common_hal_bleio_service_get_uuid(bleio_service_obj_t *self) {
51+
return self->uuid;
52+
}
53+
54+
mp_obj_list_t *common_hal_bleio_service_get_characteristic_list(bleio_service_obj_t *self) {
55+
return self->characteristic_list;
56+
}
57+
58+
bool common_hal_bleio_service_get_is_secondary(bleio_service_obj_t *self) {
59+
return self->is_secondary;
60+
}
61+
62+
void common_hal_bleio_service_set_device(bleio_service_obj_t *self, mp_obj_t device) {
63+
self->device = device;
3664
}
3765

3866
// Call this after the Service has been added to the Peripheral.
3967
void common_hal_bleio_service_add_all_characteristics(bleio_service_obj_t *self) {
4068
// Add all the characteristics.
41-
const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(self->char_list);
42-
for (size_t char_idx = 0; char_idx < char_list->len; ++char_idx) {
43-
bleio_characteristic_obj_t *characteristic = char_list->items[char_idx];
69+
const mp_obj_list_t *characteristic_list = MP_OBJ_TO_PTR(self->characteristic_list);
70+
for (size_t characteristic_idx = 0; characteristic_idx < characteristic_list->len; ++characteristic_idx) {
71+
bleio_characteristic_obj_t *characteristic = characteristic_list->items[characteristic_idx];
4472

4573
ble_gatts_char_md_t char_md = {
4674
.char_props.broadcast = characteristic->props.broadcast,

0 commit comments

Comments
 (0)