Skip to content
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

Merged
merged 2 commits into from
Nov 11, 2019
Merged

Conversation

rgot-org
Copy link
Contributor

@rgot-org rgot-org commented Nov 11, 2019

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

@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.

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;
}
```
@rgot-org rgot-org changed the title Update esp32-hal-bt.c Update esp32-hal-bt.c to correct BluetoothSerial crash when restart Nov 11, 2019
@rgot-org rgot-org changed the title Update esp32-hal-bt.c to correct BluetoothSerial crash when restart correct BluetoothSerial crash when restart Nov 11, 2019
@rgot-org rgot-org changed the title correct BluetoothSerial crash when restart Fix BluetoothSerial crash when restart Nov 11, 2019
log_e("BT deint failed");
return false;
}
while (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED);
Copy link
Member

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.

Copy link
Contributor Author

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
@me-no-dev
Copy link
Member

much better :)

@me-no-dev me-no-dev merged commit cec3fca into espressif:master Nov 11, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants