-
Notifications
You must be signed in to change notification settings - Fork 7.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix BluetoothSerial crash when restart #3471
Conversation
BluetoothSerial crash when restart: this is because the BT controller remains in state ESP_BT_CONTROLLER_STATUS_INITED instead of state ESP_BT_CONTROLLER_STATUS_IDLE after the end() method. in file esp_bt.h it is specified > @brief Enable BT controller. > Due to a known issue, you cannot call esp_bt_controller_enable() a second time > to change the controller mode dynamically. To change controller mode, call > esp_bt_controller_disable() and then call esp_bt_controller_enable() with the new mode. after **esp_bt_controller_disable()** the controller remains in state INITED so we do call the **esp_bt_controller_deinit()** function to put the controller into state IDLE. i have modified the **esp32-hal-bt.c** file line 57 and next (i have insert the esp_bt_controller_deinit() function so the controller go into Idle state) ```c++ bool btStop(){ if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE){ log_i("bt stopped"); return true; } if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){ log_i("bt enabled"); if (esp_bt_controller_disable()) { log_e("BT Disable failed"); return false; } while(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED); } if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED){ log_i("inited"); if (esp_bt_controller_deinit()) { log_e("BT deint failed"); return false; } while (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED); return true; } log_e("BT Stop failed"); return false; } ```
cores/esp32/esp32-hal-bt.c
Outdated
log_e("BT deint failed"); | ||
return false; | ||
} | ||
while (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
waiting without delay and timeout is not a good idea. Please add delay in the while loop and also do not wait more than the time that it makes sense. Currently you will spin indefinitely and not having a delay there might not allow other tasks to run.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok i have remove the while loop. In fact the state change immediately. however i've add a vTaskdelay(1) for security
remove while to avoid infinite loop
much better :) |
Fix BluetoothSerial crash when restart : this is because the BT controller remains in state ESP_BT_CONTROLLER_STATUS_INITED instead of state ESP_BT_CONTROLLER_STATUS_IDLE after the end() method.
in file esp_bt.h it is specified
after esp_bt_controller_disable() the controller remains in state INITED so we do call the esp_bt_controller_deinit() function to put the controller into state IDLE.