// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "esp32-hal-bt.h" #if SOC_BT_SUPPORTED #ifdef CONFIG_BT_ENABLED #if CONFIG_IDF_TARGET_ESP32 bool btInUse(){ return true; } #else // user may want to change it to free resources __attribute__((weak)) bool btInUse(){ return true; } #endif #include "esp_bt.h" #ifdef CONFIG_BTDM_CONTROLLER_MODE_BTDM #define BT_MODE ESP_BT_MODE_BTDM #elif defined(CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY) #define BT_MODE ESP_BT_MODE_CLASSIC_BT #else #define BT_MODE ESP_BT_MODE_BLE #endif bool btStarted(){ return (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED); } bool btStart() { return btStartMode(BT_MODE); } bool btStartMode(bt_mode mode){ esp_bt_mode_t esp_bt_mode; esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); #if CONFIG_IDF_TARGET_ESP32 switch(mode) { case BT_MODE_BLE: esp_bt_mode=ESP_BT_MODE_BLE; break; case BT_MODE_CLASSIC_BT: esp_bt_mode=ESP_BT_MODE_CLASSIC_BT; break; case BT_MODE_BTDM: esp_bt_mode=ESP_BT_MODE_BTDM; break; default: esp_bt_mode=BT_MODE; break; } // esp_bt_controller_enable(MODE) This mode must be equal as the mode in “cfg” of esp_bt_controller_init(). cfg.mode=esp_bt_mode; if(cfg.mode == ESP_BT_MODE_CLASSIC_BT) { esp_bt_controller_mem_release(ESP_BT_MODE_BLE); } #else // other esp variants dont support BT-classic / DM. esp_bt_mode=BT_MODE; #endif if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){ return true; } esp_err_t ret; if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE){ if((ret = esp_bt_controller_init(&cfg)) != ESP_OK) { log_e("initialize controller failed: %s", esp_err_to_name(ret)); return false; } while(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE){} } if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED){ if((ret = esp_bt_controller_enable(esp_bt_mode)) != ESP_OK) { log_e("BT Enable mode=%d failed %s", BT_MODE, esp_err_to_name(ret)); return false; } } if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){ return true; } log_e("BT Start failed"); return false; } bool btStop(){ if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE){ return true; } if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_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){ if (esp_bt_controller_deinit()) { log_e("BT deint failed"); return false; } vTaskDelay(1); if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_IDLE) { return false; } return true; } log_e("BT Stop failed"); return false; } #else // CONFIG_BT_ENABLED bool btStarted() { return false; } bool btStart() { return false; } bool btStop() { return false; } #endif /* CONFIG_BT_ENABLED */ #endif /* SOC_BT_SUPPORTED */