ESP32-S3 BLE: set up Characteristic properly during discovery
This commit is contained in:
parent
af1b8799a4
commit
567c273e46
@ -284,15 +284,21 @@ STATIC void _new_connection(uint16_t conn_handle) {
|
|||||||
esp_ble_tx_power_set(conn_handle, ESP_PWR_LVL_N0);
|
esp_ble_tx_power_set(conn_handle, ESP_PWR_LVL_N0);
|
||||||
|
|
||||||
|
|
||||||
// Find an empty connection. One must always be available because the SD has the same
|
// Find an empty connection. One should always be available because the SD has the same
|
||||||
// total connection limit.
|
// total connection limit.
|
||||||
bleio_connection_internal_t *connection;
|
bleio_connection_internal_t *connection = NULL;
|
||||||
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
connection = &bleio_connections[i];
|
connection = &bleio_connections[i];
|
||||||
if (connection->conn_handle == BLEIO_HANDLE_INVALID) {
|
if (connection->conn_handle == BLEIO_HANDLE_INVALID) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shouldn't happen, but just return if no connection available.
|
||||||
|
if (!connection) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
connection->conn_handle = conn_handle;
|
connection->conn_handle = conn_handle;
|
||||||
connection->connection_obj = mp_const_none;
|
connection->connection_obj = mp_const_none;
|
||||||
connection->pair_status = PAIR_NOT_PAIRED;
|
connection->pair_status = PAIR_NOT_PAIRED;
|
||||||
|
@ -50,7 +50,25 @@ void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self,
|
|||||||
self->props = props;
|
self->props = props;
|
||||||
self->read_perm = read_perm;
|
self->read_perm = read_perm;
|
||||||
self->write_perm = write_perm;
|
self->write_perm = write_perm;
|
||||||
common_hal_bleio_characteristic_set_value(self, initial_value_bufinfo);
|
|
||||||
|
if (initial_value_bufinfo != NULL) {
|
||||||
|
// Copy the initial value if it's on the heap. Otherwise it's internal and we may not be able
|
||||||
|
// to allocate.
|
||||||
|
self->current_value_len = initial_value_bufinfo->len;
|
||||||
|
if (gc_alloc_possible()) {
|
||||||
|
if (gc_nbytes(initial_value_bufinfo->buf) > 0) {
|
||||||
|
uint8_t *initial_value = m_malloc(self->current_value_len);
|
||||||
|
self->current_value_alloc = self->current_value_len;
|
||||||
|
memcpy(initial_value, initial_value_bufinfo->buf, self->current_value_len);
|
||||||
|
self->current_value = initial_value;
|
||||||
|
} else {
|
||||||
|
self->current_value_alloc = 0;
|
||||||
|
self->current_value = initial_value_bufinfo->buf;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self->current_value = initial_value_bufinfo->buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (gc_alloc_possible()) {
|
if (gc_alloc_possible()) {
|
||||||
self->descriptor_list = mp_obj_new_list(0, NULL);
|
self->descriptor_list = mp_obj_new_list(0, NULL);
|
||||||
|
@ -63,7 +63,7 @@ int bleio_connection_event_cb(struct ble_gap_event *event, void *connection_in)
|
|||||||
connection->pair_status = PAIR_NOT_PAIRED;
|
connection->pair_status = PAIR_NOT_PAIRED;
|
||||||
|
|
||||||
#if CIRCUITPY_VERBOSE_BLE
|
#if CIRCUITPY_VERBOSE_BLE
|
||||||
mp_printf(&mp_plat_print, "disconnected %02x\n", event->disconnect.reason);
|
mp_printf(&mp_plat_print, "event->disconnect.reason: 0x%x\n", event->disconnect.reason);
|
||||||
#endif
|
#endif
|
||||||
if (connection->connection_obj != mp_const_none) {
|
if (connection->connection_obj != mp_const_none) {
|
||||||
bleio_connection_obj_t *obj = connection->connection_obj;
|
bleio_connection_obj_t *obj = connection->connection_obj;
|
||||||
@ -209,6 +209,7 @@ STATIC int _discovered_characteristic_cb(uint16_t conn_handle,
|
|||||||
_last_discovery_status = error->status;
|
_last_discovery_status = error->status;
|
||||||
xTaskNotifyGive(discovery_task);
|
xTaskNotifyGive(discovery_task);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
// If any of these memory allocations fail, we set _last_discovery_status
|
// If any of these memory allocations fail, we set _last_discovery_status
|
||||||
// and let the process continue.
|
// and let the process continue.
|
||||||
@ -233,11 +234,14 @@ STATIC int _discovered_characteristic_cb(uint16_t conn_handle,
|
|||||||
((chr->properties & BLE_GATT_CHR_PROP_WRITE_NO_RSP) != 0 ? CHAR_PROP_WRITE_NO_RESPONSE : 0);
|
((chr->properties & BLE_GATT_CHR_PROP_WRITE_NO_RSP) != 0 ? CHAR_PROP_WRITE_NO_RESPONSE : 0);
|
||||||
|
|
||||||
// Call common_hal_bleio_characteristic_construct() to initialize some fields and set up evt handler.
|
// Call common_hal_bleio_characteristic_construct() to initialize some fields and set up evt handler.
|
||||||
|
mp_buffer_info_t mp_const_empty_bytes_bufinfo;
|
||||||
|
mp_get_buffer_raise(mp_const_empty_bytes, &mp_const_empty_bytes_bufinfo, MP_BUFFER_READ);
|
||||||
|
|
||||||
common_hal_bleio_characteristic_construct(
|
common_hal_bleio_characteristic_construct(
|
||||||
characteristic, service, chr->val_handle, uuid,
|
characteristic, service, chr->val_handle, uuid,
|
||||||
props, SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
|
props, SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
|
||||||
0, false, // max_length, fixed_length: values don't matter for gattc
|
0, false, // max_length, fixed_length: values don't matter for gattc
|
||||||
mp_const_empty_bytes,
|
&mp_const_empty_bytes_bufinfo,
|
||||||
NULL);
|
NULL);
|
||||||
// Set def_handle directly since it is only used in discovery.
|
// Set def_handle directly since it is only used in discovery.
|
||||||
characteristic->def_handle = chr->def_handle;
|
characteristic->def_handle = chr->def_handle;
|
||||||
@ -260,6 +264,7 @@ STATIC int _discovered_descriptor_cb(uint16_t conn_handle,
|
|||||||
_last_discovery_status = error->status;
|
_last_discovery_status = error->status;
|
||||||
}
|
}
|
||||||
xTaskNotifyGive(discovery_task);
|
xTaskNotifyGive(discovery_task);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
// If any of these memory allocations fail, we set _last_discovery_status
|
// If any of these memory allocations fail, we set _last_discovery_status
|
||||||
// and let the process continue.
|
// and let the process continue.
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
#ifndef MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H
|
#ifndef MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H
|
||||||
#define MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H
|
#define MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H
|
||||||
|
|
||||||
|
// Enable for debugging.
|
||||||
|
// #define CIRCUITPY_VERBOSE_BLE (1)
|
||||||
|
|
||||||
#define MICROPY_NLR_THUMB (0)
|
#define MICROPY_NLR_THUMB (0)
|
||||||
|
|
||||||
#define MICROPY_USE_INTERNAL_PRINTF (0)
|
#define MICROPY_USE_INTERNAL_PRINTF (0)
|
||||||
|
@ -470,7 +470,9 @@ void background_callback_run_all(void);
|
|||||||
#error "boot counter requires CIRCUITPY_NVM enabled"
|
#error "boot counter requires CIRCUITPY_NVM enabled"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CIRCUITPY_VERBOSE_BLE
|
||||||
#define CIRCUITPY_VERBOSE_BLE 0
|
#define CIRCUITPY_VERBOSE_BLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// Display the Blinka logo in the REPL on displayio displays.
|
// Display the Blinka logo in the REPL on displayio displays.
|
||||||
#ifndef CIRCUITPY_REPL_LOGO
|
#ifndef CIRCUITPY_REPL_LOGO
|
||||||
|
Loading…
Reference in New Issue
Block a user