From 68d385ed02f67232941b7efa420db9427b31e7c8 Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Sun, 9 Apr 2023 01:00:50 +0200 Subject: [PATCH 1/8] esp32-hal-bt.c free Bluetooth LE memory if CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY is set BLE memory can be released if bluetooth-classic - only is requested --- cores/esp32/esp32-hal-bt.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index d17a761bebd..0719f4ca7f9 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -20,10 +20,10 @@ bool btInUse(){ return true; } #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) +#ifdef CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY #define BT_MODE ESP_BT_MODE_CLASSIC_BT +#elif defined(CONFIG_BTDM_CONTROLLER_MODE_BTDM) +#define BT_MODE ESP_BT_MODE_BTDM #else #define BT_MODE ESP_BT_MODE_BLE #endif @@ -34,6 +34,12 @@ bool btStarted(){ bool btStart(){ esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); +#ifdef CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY + esp_bt_controller_mem_release(ESP_BT_MODE_BLE); +#endif + // esp_bt_controller_enable(MODE) This mode must be equal as the mode in “cfg” of esp_bt_controller_init(). + cfg.mode=BT_MODE; + if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){ return true; } From 8fafe6a316c488504d16c1489b6923d02b1ce2a9 Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Sun, 9 Apr 2023 01:09:52 +0200 Subject: [PATCH 2/8] tStart( add error output --- cores/esp32/esp32-hal-bt.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index 0719f4ca7f9..b51d77eba86 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -43,13 +43,17 @@ bool btStart(){ 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){ - esp_bt_controller_init(&cfg); + 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 (esp_bt_controller_enable(BT_MODE)) { - log_e("BT Enable failed"); + if((ret = esp_bt_controller_enable(BT_MODE)) != ESP_OK) { + log_e("BT Enable mode=%d failed %s", BT_MODE, esp_err_to_name(ret)); return false; } } From 7d176db5fa8b6b1c0063b43c3db6c9601e958dcd Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Sun, 9 Apr 2023 10:29:29 +0200 Subject: [PATCH 3/8] ble mem_release only for esp32 --- cores/esp32/esp32-hal-bt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index b51d77eba86..f7c960ad824 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -34,11 +34,13 @@ bool btStarted(){ bool btStart(){ esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); +#if CONFIG_IDF_TARGET_ESP32 #ifdef CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY esp_bt_controller_mem_release(ESP_BT_MODE_BLE); #endif // esp_bt_controller_enable(MODE) This mode must be equal as the mode in “cfg” of esp_bt_controller_init(). cfg.mode=BT_MODE; +#endif if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){ return true; From 1bf51062b6b81e45cbda6e4363dfc2a388142555 Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Mon, 10 Apr 2023 22:15:33 +0200 Subject: [PATCH 4/8] disable BLE with BT_MODE define --- cores/esp32/esp32-hal-bt.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index f7c960ad824..d36d801f756 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -20,13 +20,15 @@ bool btInUse(){ return true; } #include "esp_bt.h" -#ifdef CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY -#define BT_MODE ESP_BT_MODE_CLASSIC_BT -#elif defined(CONFIG_BTDM_CONTROLLER_MODE_BTDM) +#ifndef BT_MODE +#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 +#endif bool btStarted(){ return (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED); @@ -34,13 +36,13 @@ bool btStarted(){ bool btStart(){ esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); -#if CONFIG_IDF_TARGET_ESP32 -#ifdef CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY +#if BT_MODE == ESP_BT_MODE_CLASSIC_BT + // esp_bt_controller_enable(MODE) This mode must be equal as the mode in “cfg” of esp_bt_controller_init(). esp_bt_controller_mem_release(ESP_BT_MODE_BLE); +#elif BT_MODE == ESP_BT_MODE_BLE + esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); #endif - // esp_bt_controller_enable(MODE) This mode must be equal as the mode in “cfg” of esp_bt_controller_init(). cfg.mode=BT_MODE; -#endif if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){ return true; From a7d9795348f27d432d912cb0d52fd001273e33ce Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Wed, 12 Apr 2023 22:45:32 +0200 Subject: [PATCH 5/8] BluetoothSerial add begin()+disableBLE; add memrelease --- .../BluetoothSerial/src/BluetoothSerial.cpp | 40 ++++++++++++------- .../BluetoothSerial/src/BluetoothSerial.h | 3 +- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/libraries/BluetoothSerial/src/BluetoothSerial.cpp b/libraries/BluetoothSerial/src/BluetoothSerial.cpp index 96c95c6df60..6691727586f 100644 --- a/libraries/BluetoothSerial/src/BluetoothSerial.cpp +++ b/libraries/BluetoothSerial/src/BluetoothSerial.cpp @@ -430,7 +430,7 @@ static void esp_bt_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *pa char peer_bdname[ESP_BT_GAP_MAX_BDNAME_LEN + 1]; for (int i = 0; i < param->disc_res.num_prop; i++) { switch(param->disc_res.prop[i].type) { - case ESP_BT_GAP_DEV_PROP_EIR: + case ESP_BT_GAP_DEV_PROP_EIR: if (get_name_from_eir((uint8_t*)param->disc_res.prop[i].val, peer_bdname, &peer_bdname_len)) { log_i("ESP_BT_GAP_DISC_RES_EVT : EIR : %s : %d", peer_bdname, peer_bdname_len); if (strlen(_remote_name) == peer_bdname_len @@ -589,7 +589,7 @@ static void esp_bt_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *pa } } -static bool _init_bt(const char *deviceName) +static bool _init_bt(const char *deviceName, bt_mode mode) { if(!_bt_event_group){ _bt_event_group = xEventGroupCreate(); @@ -641,7 +641,7 @@ static bool _init_bt(const char *deviceName) } } - if (!btStarted() && !btStart()){ + if (!btStarted() && !btStartMode(mode)){ log_e("initialize controller failed"); return false; } @@ -774,11 +774,10 @@ static bool waitForSDPRecord(int timeout) { return (xEventGroupWaitBits(_bt_event_group, BT_SDP_COMPLETED, pdFALSE, pdTRUE, xTicksToWait) & BT_SDP_COMPLETED) != 0; } -/* +/** * Serial Bluetooth Arduino * - * */ - + */ BluetoothSerial::BluetoothSerial() { local_name = "ESP32"; //default bluetooth name @@ -792,13 +791,13 @@ BluetoothSerial::~BluetoothSerial(void) /** * @Param isMaster set to true if you want to connect to an other device */ -bool BluetoothSerial::begin(String localName, bool isMaster) +bool BluetoothSerial::begin(String localName, bool isMaster, bool disableBLE) { _isMaster = isMaster; if (localName.length()){ local_name = localName; } - return _init_bt(local_name.c_str()); + return _init_bt(local_name.c_str(), disableBLE ? BT_MODE_CLASSIC_BT : BT_MODE_BTDM); } int BluetoothSerial::available(void) @@ -869,6 +868,14 @@ void BluetoothSerial::end() _stop_bt(); } +/** + * free additional ~30kB ram, reset is required to enable BT again + */ +void BluetoothSerial::memrelease() +{ + esp_bt_mem_release(ESP_BT_MODE_BTDM); +} + void BluetoothSerial::onConfirmRequest(ConfirmRequestCb cb) { confirm_request_callback = cb; @@ -895,10 +902,11 @@ esp_err_t BluetoothSerial::register_callback(esp_spp_cb_t callback) void BluetoothSerial::enableSSP() { _enableSSP = true; } -/* - * Set default parameters for Legacy Pairing - * Use fixed pin code -*/ + +/** + * Set default parameters for Legacy Pairing + * Use fixed pin code + */ bool BluetoothSerial::setPin(const char *pin) { log_i("pin: %s", pin); bool isEmpty = !(pin && *pin); @@ -952,11 +960,13 @@ bool BluetoothSerial::connect(String remoteName) } /** - * @Param channel: specify channel or 0 for auto-detect - * @Param sec_mask: + * Connect to an other bluetooth device + * + * @param channel specify channel or 0 for auto-detect + * @param sec_mask * ESP_SPP_SEC_ENCRYPT|ESP_SPP_SEC_AUTHENTICATE * ESP_SPP_SEC_NONE - * @Param role: + * @param role * ESP_SPP_ROLE_MASTER master can handle up to 7 connections to slaves * ESP_SPP_ROLE_SLAVE can only have one connection to a master */ diff --git a/libraries/BluetoothSerial/src/BluetoothSerial.h b/libraries/BluetoothSerial/src/BluetoothSerial.h index 32d6ed0d64b..6148db6e738 100644 --- a/libraries/BluetoothSerial/src/BluetoothSerial.h +++ b/libraries/BluetoothSerial/src/BluetoothSerial.h @@ -39,7 +39,7 @@ class BluetoothSerial: public Stream BluetoothSerial(void); ~BluetoothSerial(void); - bool begin(String localName=String(), bool isMaster=false); + bool begin(String localName=String(), bool isMaster=false, bool disableBLE=false); bool begin(unsigned long baud){//compatibility return begin(); } @@ -51,6 +51,7 @@ class BluetoothSerial: public Stream size_t write(const uint8_t *buffer, size_t size); void flush(); void end(void); + void memrelease(); void setTimeout(int timeoutMS); void onData(BluetoothSerialDataCb cb); esp_err_t register_callback(esp_spp_cb_t callback); From 7b715f108d3f13f9e0a16f823831c131f69769f9 Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Wed, 12 Apr 2023 22:47:26 +0200 Subject: [PATCH 6/8] btStart with BT_MODE parameter --- cores/esp32/esp32-hal-bt.c | 32 ++++++++++++++++++++++++-------- cores/esp32/esp32-hal-bt.h | 3 +++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index d36d801f756..36d81dd3342 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -20,7 +20,6 @@ bool btInUse(){ return true; } #include "esp_bt.h" -#ifndef BT_MODE #ifdef CONFIG_BTDM_CONTROLLER_MODE_BTDM #define BT_MODE ESP_BT_MODE_BTDM #elif defined(CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY) @@ -28,21 +27,38 @@ bool btInUse(){ return true; } #else #define BT_MODE ESP_BT_MODE_BLE #endif -#endif bool btStarted(){ return (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED); } -bool btStart(){ +bool btStart() { + return btStartMode(BT_MODE); +} + +bool btStartMode(bt_mode mode){ + esp_bt_mode_t esp_bt_mode; +#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_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); -#if BT_MODE == ESP_BT_MODE_CLASSIC_BT // 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); -#elif BT_MODE == ESP_BT_MODE_BLE - esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); + } +#else +// other esp variants dont support BT-classic / DM. + esp_bt_mode=BT_MODE; #endif - cfg.mode=BT_MODE; if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){ return true; @@ -56,7 +72,7 @@ bool btStart(){ 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(BT_MODE)) != ESP_OK) { + 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; } diff --git a/cores/esp32/esp32-hal-bt.h b/cores/esp32/esp32-hal-bt.h index 56222da3182..aa7db8ae04c 100644 --- a/cores/esp32/esp32-hal-bt.h +++ b/cores/esp32/esp32-hal-bt.h @@ -21,8 +21,11 @@ extern "C" { #endif +typedef enum {BT_MODE_DEFAULT, BT_MODE_BLE, BT_MODE_CLASSIC_BT, BT_MODE_BTDM } bt_mode; + bool btStarted(); bool btStart(); +bool btStartMode(bt_mode mode); bool btStop(); #ifdef __cplusplus From 853b6d2dd5915446d7ece327bfeb923636b5437a Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Wed, 12 Apr 2023 22:58:27 +0200 Subject: [PATCH 7/8] beautification --- cores/esp32/esp32-hal-bt.c | 4 ++-- libraries/BluetoothSerial/src/BluetoothSerial.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cores/esp32/esp32-hal-bt.c b/cores/esp32/esp32-hal-bt.c index 36d81dd3342..76ecbc5a4d6 100644 --- a/cores/esp32/esp32-hal-bt.c +++ b/cores/esp32/esp32-hal-bt.c @@ -38,6 +38,7 @@ bool btStart() { 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; @@ -49,11 +50,10 @@ bool btStartMode(bt_mode mode){ default: esp_bt_mode=BT_MODE; break; } - esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); // 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); + esp_bt_controller_mem_release(ESP_BT_MODE_BLE); } #else // other esp variants dont support BT-classic / DM. diff --git a/libraries/BluetoothSerial/src/BluetoothSerial.cpp b/libraries/BluetoothSerial/src/BluetoothSerial.cpp index 6691727586f..4f2e06fb3d4 100644 --- a/libraries/BluetoothSerial/src/BluetoothSerial.cpp +++ b/libraries/BluetoothSerial/src/BluetoothSerial.cpp @@ -789,7 +789,8 @@ BluetoothSerial::~BluetoothSerial(void) } /** - * @Param isMaster set to true if you want to connect to an other device + * @param isMaster set to true if you want to connect to an other device + * @param disableBLE if BLE is not used, its ram can be freed to get +10kB free ram */ bool BluetoothSerial::begin(String localName, bool isMaster, bool disableBLE) { From e813e6db82e3c378067507230331995790645c0a Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Thu, 12 Oct 2023 18:44:05 +0200 Subject: [PATCH 8/8] Update BluetoothSerial.cpp fix wrong merges --- libraries/BluetoothSerial/src/BluetoothSerial.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/libraries/BluetoothSerial/src/BluetoothSerial.cpp b/libraries/BluetoothSerial/src/BluetoothSerial.cpp index 4bfaed065a7..b1a884cd3ac 100644 --- a/libraries/BluetoothSerial/src/BluetoothSerial.cpp +++ b/libraries/BluetoothSerial/src/BluetoothSerial.cpp @@ -438,20 +438,6 @@ static void esp_bt_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *pa char peer_bdname[ESP_BT_GAP_MAX_BDNAME_LEN + 1]; for (int i = 0; i < param->disc_res.num_prop; i++) { switch(param->disc_res.prop[i].type) { - case ESP_BT_GAP_DEV_PROP_EIR: - if (get_name_from_eir((uint8_t*)param->disc_res.prop[i].val, peer_bdname, &peer_bdname_len)) { - log_i("ESP_BT_GAP_DISC_RES_EVT : EIR : %s : %d", peer_bdname, peer_bdname_len); - if (strlen(_remote_name) == peer_bdname_len - && strncmp(peer_bdname, _remote_name, peer_bdname_len) == 0) { - log_v("ESP_BT_GAP_DISC_RES_EVT : SPP_START_DISCOVERY_EIR : %s", peer_bdname, peer_bdname_len); - _isRemoteAddressSet = true; - memcpy(_peer_bd_addr, param->disc_res.bda, ESP_BD_ADDR_LEN); - esp_bt_gap_cancel_discovery(); - esp_spp_start_discovery(_peer_bd_addr); - } - } - break; - case ESP_BT_GAP_DEV_PROP_BDNAME: // Enum 1 - Bluetooth device name, value type is int8_t [] peer_bdname_len = param->disc_res.prop[i].len; memcpy(peer_bdname, param->disc_res.prop[i].val, peer_bdname_len);