fix reset logic to not do pin ops or heap ops at bad times
This commit is contained in:
parent
44c9c43cd1
commit
d0ffdda5bb
@ -268,20 +268,22 @@ void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enable
|
|||||||
supervisor_disable_tick();
|
supervisor_disable_tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop any current activity; reset to known state.
|
// Enabling or disabling: stop any current activity; reset to known state.
|
||||||
check_hci_error(hci_reset());
|
check_hci_error(hci_reset());
|
||||||
self->now_advertising = false;
|
self->now_advertising = false;
|
||||||
self->extended_advertising = false;
|
self->extended_advertising = false;
|
||||||
self->circuitpython_advertising = false;
|
self->circuitpython_advertising = false;
|
||||||
self->advertising_timeout_msecs = 0;
|
self->advertising_timeout_msecs = 0;
|
||||||
|
|
||||||
// Reset list of known attributes.
|
if (enabled) {
|
||||||
// Indices into the list are handles. Handle 0x0000 designates an invalid handle,
|
// Reset list of known attributes.
|
||||||
// so store None there to skip it.
|
// Indices into the list are handles. Handle 0x0000 designates an invalid handle,
|
||||||
self->attributes = mp_obj_new_list(0, NULL);
|
// so store None there to skip it.
|
||||||
bleio_adapter_add_attribute(self, mp_const_none);
|
self->attributes = mp_obj_new_list(0, NULL);
|
||||||
self->last_added_service_handle = BLE_GATT_HANDLE_INVALID;
|
bleio_adapter_add_attribute(self, mp_const_none);
|
||||||
self->last_added_characteristic_handle = BLE_GATT_HANDLE_INVALID;
|
self->last_added_service_handle = BLE_GATT_HANDLE_INVALID;
|
||||||
|
self->last_added_characteristic_handle = BLE_GATT_HANDLE_INVALID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self) {
|
bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self) {
|
||||||
@ -392,9 +394,11 @@ mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t*
|
|||||||
void common_hal_bleio_adapter_stop_scan(bleio_adapter_obj_t *self) {
|
void common_hal_bleio_adapter_stop_scan(bleio_adapter_obj_t *self) {
|
||||||
check_enabled(self);
|
check_enabled(self);
|
||||||
|
|
||||||
check_hci_error(hci_le_set_scan_enable(BT_HCI_LE_SCAN_DISABLE, BT_HCI_LE_SCAN_FILTER_DUP_DISABLE));
|
// If not already scanning, no problem.
|
||||||
shared_module_bleio_scanresults_set_done(self->scan_results, true);
|
if (hci_le_set_scan_enable(BT_HCI_LE_SCAN_DISABLE, BT_HCI_LE_SCAN_FILTER_DUP_DISABLE) == HCI_OK) {
|
||||||
self->scan_results = NULL;
|
shared_module_bleio_scanresults_set_done(self->scan_results, true);
|
||||||
|
self->scan_results = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// typedef struct {
|
// typedef struct {
|
||||||
@ -782,14 +786,13 @@ void bleio_adapter_gc_collect(bleio_adapter_obj_t* adapter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void bleio_adapter_reset(bleio_adapter_obj_t* adapter) {
|
void bleio_adapter_reset(bleio_adapter_obj_t* adapter) {
|
||||||
|
|
||||||
if (!common_hal_bleio_adapter_get_enabled(adapter)) {
|
if (!common_hal_bleio_adapter_get_enabled(adapter)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
common_hal_bleio_adapter_stop_scan(adapter);
|
// Adapter will be reset.
|
||||||
if (adapter->now_advertising) {
|
common_hal_bleio_adapter_set_enabled(adapter, false);
|
||||||
common_hal_bleio_adapter_stop_advertising(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
adapter->connection_objs = NULL;
|
adapter->connection_objs = NULL;
|
||||||
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
|
||||||
@ -801,6 +804,7 @@ void bleio_adapter_reset(bleio_adapter_obj_t* adapter) {
|
|||||||
}
|
}
|
||||||
connection->connection_obj = mp_const_none;
|
connection->connection_obj = mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bleio_adapter_background(bleio_adapter_obj_t* adapter) {
|
void bleio_adapter_background(bleio_adapter_obj_t* adapter) {
|
||||||
|
2
main.c
2
main.c
@ -212,6 +212,8 @@ bool maybe_run_list(const char ** filenames, pyexec_result_t* exec_result) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cleanup_after_vm(supervisor_allocation* heap) {
|
void cleanup_after_vm(supervisor_allocation* heap) {
|
||||||
|
// Reset port-independent devices, like CIRCUITPY_BLEIO_HCI.
|
||||||
|
reset_devices();
|
||||||
// Turn off the display and flush the fileystem before the heap disappears.
|
// Turn off the display and flush the fileystem before the heap disappears.
|
||||||
#if CIRCUITPY_DISPLAYIO
|
#if CIRCUITPY_DISPLAYIO
|
||||||
reset_displays();
|
reset_displays();
|
||||||
|
Loading…
Reference in New Issue
Block a user