From 18f6fb9002a130c381ca4e41ec01f54c5e370d00 Mon Sep 17 00:00:00 2001 From: thekurtovic <40248206+thekurtovic@users.noreply.github.com> Date: Fri, 15 Nov 2024 16:09:33 -0500 Subject: [PATCH 1/6] NimBLEDevice::get/setPower support full power range. --- src/NimBLEDevice.cpp | 90 ++++++++++++++++++++++++++++++-------------- src/NimBLEDevice.h | 10 ++++- 2 files changed, 69 insertions(+), 31 deletions(-) diff --git a/src/NimBLEDevice.cpp b/src/NimBLEDevice.cpp index e88a4fb1..7f3f1382 100644 --- a/src/NimBLEDevice.cpp +++ b/src/NimBLEDevice.cpp @@ -421,47 +421,42 @@ std::vector NimBLEDevice::getConnectedClients() { /* TRANSMIT POWER */ /* -------------------------------------------------------------------------- */ +# ifdef ESP_PLATFORM +/** + * @brief Get the transmission power. + * @return The power level currently used in esp_power_level_t. + */ +esp_power_level_t NimBLEDevice::getPowerLevel() { + return esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_DEFAULT); +} // getPowerLevel + /** * @brief Set the transmission power. - * @param [in] dbm The power level to set in dBm. + * @param [in] powerLevel The power level to set in esp_power_level_t.. * @return True if the power level was set successfully. */ -bool NimBLEDevice::setPower(int8_t dbm) { - NIMBLE_LOGD(LOG_TAG, ">> setPower: %d", dbm); -# ifdef ESP_PLATFORM +bool NimBLEDevice::setPower(esp_power_level_t powerLevel) { + NIMBLE_LOGD(LOG_TAG, ">> setPower: %d", powerLevel); # ifndef CONFIG_IDF_TARGET_ESP32P4 - if (dbm >= 9) { - dbm = ESP_PWR_LVL_P9; - } else if (dbm >= 6) { - dbm = ESP_PWR_LVL_P6; - } else if (dbm >= 3) { - dbm = ESP_PWR_LVL_P3; - } else if (dbm >= 0) { - dbm = ESP_PWR_LVL_N0; - } else if (dbm >= -3) { - dbm = ESP_PWR_LVL_N3; - } else if (dbm >= -6) { - dbm = ESP_PWR_LVL_N6; - } else if (dbm >= -9) { - dbm = ESP_PWR_LVL_N9; - } else if (dbm >= -12) { - dbm = ESP_PWR_LVL_N12; - } else { - NIMBLE_LOGE(LOG_TAG, "Unsupported power level"); - return false; - } - esp_err_t errRc = esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, (esp_power_level_t)dbm); + esp_err_t errRc = esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, powerLevel); if (errRc != ESP_OK) { NIMBLE_LOGE(LOG_TAG, "esp_ble_tx_power_set: rc=%d", errRc); } return errRc == ESP_OK; # else - return 0xFF; // CONFIG_IDF_TARGET_ESP32P4 + return false; // CONFIG_IDF_TARGET_ESP32P4 # endif - -# else +} // setPower +#else +/** + * @brief Set the transmission power. + * @param [in] dbm The power level to set in dBm. + * @return True if the power level was set successfully. + */ +bool NimBLEDevice::setPower(int8_t dbm) { + NIMBLE_LOGD(LOG_TAG, ">> setPower: %d", dbm); ble_hci_vs_set_tx_pwr_cp cmd{dbm}; ble_hci_vs_set_tx_pwr_rp rsp{0}; int rc = ble_hs_hci_send_vs_cmd(BLE_HCI_OCF_VS_SET_TX_PWR, &cmd, sizeof(cmd), &rsp, sizeof(rsp)); @@ -472,8 +467,8 @@ bool NimBLEDevice::setPower(int8_t dbm) { NIMBLE_LOGD(LOG_TAG, "TX power set to %d dBm\n", rsp.tx_power); return true; -# endif } // setPower +#endif /** * @brief Get the transmission power. @@ -483,6 +478,16 @@ int NimBLEDevice::getPower() { # ifdef ESP_PLATFORM # ifndef CONFIG_IDF_TARGET_ESP32P4 switch (esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_DEFAULT)) { +# ifndef CONFIG_IDF_TARGET_ESP32 + case ESP_PWR_LVL_N24: + return -24; + case ESP_PWR_LVL_N21: + return -21; + case ESP_PWR_LVL_N18: + return -18; + case ESP_PWR_LVL_N15: + return -15; +# endif case ESP_PWR_LVL_N12: return -12; case ESP_PWR_LVL_N9: @@ -499,6 +504,33 @@ int NimBLEDevice::getPower() { return 6; case ESP_PWR_LVL_P9: return 9; +# ifndef CONFIG_IDF_TARGET_ESP32 + case ESP_PWR_LVL_P12: + return 12; + case ESP_PWR_LVL_P15: + return 15; +# ifdef CONFIG_IDF_TARGET_ESP32H2 + case ESP_PWR_LVL_P16: + return 16; + case ESP_PWR_LVL_P17: + return 17; + case ESP_PWR_LVL_P19: + return 19; +# endif + case ESP_PWR_LVL_P18: + return 18; +# if defined(CONFIG_IDF_TARGET_ESP32S3) \ + || defined(CONFIG_IDF_TARGET_ESP32H2) + case ESP_PWR_LVL_P20: + return 20; +# endif +# if defined(CONFIG_IDF_TARGET_ESP32C2) \ + || defined(CONFIG_IDF_TARGET_ESP32C3) \ + || defined(CONFIG_IDF_TARGET_ESP32C6) + case ESP_PWR_LVL_P21: + return 21; +# endif +# endif default: return 0xFF; } diff --git a/src/NimBLEDevice.h b/src/NimBLEDevice.h index 7be94f17..b836e48c 100644 --- a/src/NimBLEDevice.h +++ b/src/NimBLEDevice.h @@ -114,8 +114,6 @@ class NimBLEDevice { static bool onWhiteList(const NimBLEAddress& address); static size_t getWhiteListCount(); static NimBLEAddress getWhiteListAddress(size_t index); - static bool setPower(int8_t dbm); - static int getPower(); static bool setOwnAddrType(uint8_t type); static bool setOwnAddr(const NimBLEAddress& addr); static bool setOwnAddr(const uint8_t* addr); @@ -135,6 +133,14 @@ class NimBLEDevice { static void onReset(int reason); static void onSync(void); static void host_task(void* param); + static int getPower(); + +# if defined(ESP_PLATFORM) + static esp_power_level_t getPowerLevel(); + static bool setPower(esp_power_level_t powerLevel); +# else + static bool setPower(int8_t dbm); +# endif # if CONFIG_BT_NIMBLE_EXT_ADV static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask); From d3c363c65bbc6ae6a4026c6415421b32f2e995b8 Mon Sep 17 00:00:00 2001 From: thekurtovic <40248206+thekurtovic@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:51:03 -0500 Subject: [PATCH 2/6] Account for differences in IDF version. --- src/NimBLEDevice.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/NimBLEDevice.cpp b/src/NimBLEDevice.cpp index 7f3f1382..31e5d359 100644 --- a/src/NimBLEDevice.cpp +++ b/src/NimBLEDevice.cpp @@ -479,15 +479,21 @@ int NimBLEDevice::getPower() { # ifndef CONFIG_IDF_TARGET_ESP32P4 switch (esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_DEFAULT)) { # ifndef CONFIG_IDF_TARGET_ESP32 +# if ESP_IDF_VERSION <= ESP_IDF_VERSION_VAL(4,4,2) + case ESP_PWR_LVL_N27: + return -27; +# endif +# if !defined(CONFIG_IDF_TARGET_ESP32C6) || (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,0)) case ESP_PWR_LVL_N24: return -24; case ESP_PWR_LVL_N21: return -21; case ESP_PWR_LVL_N18: return -18; +# endif +# endif case ESP_PWR_LVL_N15: return -15; -# endif case ESP_PWR_LVL_N12: return -12; case ESP_PWR_LVL_N9: @@ -509,7 +515,7 @@ int NimBLEDevice::getPower() { return 12; case ESP_PWR_LVL_P15: return 15; -# ifdef CONFIG_IDF_TARGET_ESP32H2 +# if defined(CONFIG_IDF_TARGET_ESP32H2) && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5,1,0) && ESP_IDF_VERSION <= ESP_IDF_VERSION_VAL(5,1,1) case ESP_PWR_LVL_P16: return 16; case ESP_PWR_LVL_P17: @@ -519,16 +525,15 @@ int NimBLEDevice::getPower() { # endif case ESP_PWR_LVL_P18: return 18; -# if defined(CONFIG_IDF_TARGET_ESP32S3) \ - || defined(CONFIG_IDF_TARGET_ESP32H2) - case ESP_PWR_LVL_P20: - return 20; -# endif -# if defined(CONFIG_IDF_TARGET_ESP32C2) \ - || defined(CONFIG_IDF_TARGET_ESP32C3) \ - || defined(CONFIG_IDF_TARGET_ESP32C6) +# if !defined(CONFIG_IDF_TARGET_ESP32H2) \ + || (defined(CONFIG_IDF_TARGET_ESP32C6) && ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,0)) \ + && !(defined(CONFIG_IDF_TARGET_ESP32C3) && (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,5) || ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5,4,0))) \ + && !(defined(CONFIG_IDF_TARGET_ESP32C2) && (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,0) || ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,1))) case ESP_PWR_LVL_P21: return 21; +# else + case ESP_PWR_LVL_P20: + return 20; # endif # endif default: From 5182ca1970ef3ae20292c7545cac5c9bea9156af Mon Sep 17 00:00:00 2001 From: thekurtovic <40248206+thekurtovic@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:10:44 -0500 Subject: [PATCH 3/6] Re: Account for differences in IDF version. --- src/NimBLEDevice.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/NimBLEDevice.cpp b/src/NimBLEDevice.cpp index 31e5d359..d54529ed 100644 --- a/src/NimBLEDevice.cpp +++ b/src/NimBLEDevice.cpp @@ -491,9 +491,9 @@ int NimBLEDevice::getPower() { case ESP_PWR_LVL_N18: return -18; # endif -# endif case ESP_PWR_LVL_N15: return -15; +# endif case ESP_PWR_LVL_N12: return -12; case ESP_PWR_LVL_N9: @@ -525,15 +525,16 @@ int NimBLEDevice::getPower() { # endif case ESP_PWR_LVL_P18: return 18; -# if !defined(CONFIG_IDF_TARGET_ESP32H2) \ - || (defined(CONFIG_IDF_TARGET_ESP32C6) && ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,0)) \ - && !(defined(CONFIG_IDF_TARGET_ESP32C3) && (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,5) || ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5,4,0))) \ - && !(defined(CONFIG_IDF_TARGET_ESP32C2) && (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,0) || ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,1))) - case ESP_PWR_LVL_P21: - return 21; -# else +# if defined(CONFIG_IDF_TARGET_ESP32H2) \ + || (defined(CONFIG_IDF_TARGET_ESP32C6) && ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(5,1,0)) \ + || (defined(CONFIG_IDF_TARGET_ESP32C2) && ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(5,2,0)) \ + || ((defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3)) \ + && (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,5) || ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5,4,0))) case ESP_PWR_LVL_P20: return 20; +# else + case ESP_PWR_LVL_P21: + return 21; # endif # endif default: From 4541337db0022f7b990a94489e0c2b4783fb45da Mon Sep 17 00:00:00 2001 From: h2zero Date: Mon, 2 Dec 2024 12:19:35 -0700 Subject: [PATCH 4/6] Calculate power level instead of using conditional checks. --- src/NimBLEDevice.cpp | 99 +++++++++++--------------------------------- src/NimBLEDevice.h | 5 +-- 2 files changed, 26 insertions(+), 78 deletions(-) diff --git a/src/NimBLEDevice.cpp b/src/NimBLEDevice.cpp index d54529ed..0d23e7b5 100644 --- a/src/NimBLEDevice.cpp +++ b/src/NimBLEDevice.cpp @@ -435,27 +435,29 @@ esp_power_level_t NimBLEDevice::getPowerLevel() { * @param [in] powerLevel The power level to set in esp_power_level_t.. * @return True if the power level was set successfully. */ -bool NimBLEDevice::setPower(esp_power_level_t powerLevel) { - NIMBLE_LOGD(LOG_TAG, ">> setPower: %d", powerLevel); -# ifndef CONFIG_IDF_TARGET_ESP32P4 - +bool NimBLEDevice::setPowerLevel(esp_power_level_t powerLevel) { +# ifdef CONFIG_IDF_TARGET_ESP32P4 + return false; +# else esp_err_t errRc = esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, powerLevel); if (errRc != ESP_OK) { NIMBLE_LOGE(LOG_TAG, "esp_ble_tx_power_set: rc=%d", errRc); } return errRc == ESP_OK; -# else - return false; // CONFIG_IDF_TARGET_ESP32P4 # endif -} // setPower -#else +} // setPowerLevel + +# endif /** * @brief Set the transmission power. * @param [in] dbm The power level to set in dBm. * @return True if the power level was set successfully. */ bool NimBLEDevice::setPower(int8_t dbm) { +# ifdef ESP_PLATFORM + return setPowerLevel(static_cast(dbm / 3 + ESP_PWR_LVL_N0)); +# else NIMBLE_LOGD(LOG_TAG, ">> setPower: %d", dbm); ble_hci_vs_set_tx_pwr_cp cmd{dbm}; ble_hci_vs_set_tx_pwr_rp rsp{0}; @@ -467,8 +469,8 @@ bool NimBLEDevice::setPower(int8_t dbm) { NIMBLE_LOGD(LOG_TAG, "TX power set to %d dBm\n", rsp.tx_power); return true; +# endif } // setPower -#endif /** * @brief Get the transmission power. @@ -476,74 +478,21 @@ bool NimBLEDevice::setPower(int8_t dbm) { */ int NimBLEDevice::getPower() { # ifdef ESP_PLATFORM -# ifndef CONFIG_IDF_TARGET_ESP32P4 - switch (esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_DEFAULT)) { -# ifndef CONFIG_IDF_TARGET_ESP32 -# if ESP_IDF_VERSION <= ESP_IDF_VERSION_VAL(4,4,2) - case ESP_PWR_LVL_N27: - return -27; -# endif -# if !defined(CONFIG_IDF_TARGET_ESP32C6) || (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,0)) - case ESP_PWR_LVL_N24: - return -24; - case ESP_PWR_LVL_N21: - return -21; - case ESP_PWR_LVL_N18: - return -18; -# endif - case ESP_PWR_LVL_N15: - return -15; -# endif - case ESP_PWR_LVL_N12: - return -12; - case ESP_PWR_LVL_N9: - return -9; - case ESP_PWR_LVL_N6: - return -6; - case ESP_PWR_LVL_N3: - return -3; - case ESP_PWR_LVL_N0: - return 0; - case ESP_PWR_LVL_P3: - return 3; - case ESP_PWR_LVL_P6: - return 6; - case ESP_PWR_LVL_P9: - return 9; -# ifndef CONFIG_IDF_TARGET_ESP32 - case ESP_PWR_LVL_P12: - return 12; - case ESP_PWR_LVL_P15: - return 15; -# if defined(CONFIG_IDF_TARGET_ESP32H2) && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5,1,0) && ESP_IDF_VERSION <= ESP_IDF_VERSION_VAL(5,1,1) - case ESP_PWR_LVL_P16: - return 16; - case ESP_PWR_LVL_P17: - return 17; - case ESP_PWR_LVL_P19: - return 19; -# endif - case ESP_PWR_LVL_P18: - return 18; -# if defined(CONFIG_IDF_TARGET_ESP32H2) \ - || (defined(CONFIG_IDF_TARGET_ESP32C6) && ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(5,1,0)) \ - || (defined(CONFIG_IDF_TARGET_ESP32C2) && ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(5,2,0)) \ - || ((defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3)) \ - && (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5,1,5) || ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5,4,0))) - case ESP_PWR_LVL_P20: - return 20; -# else - case ESP_PWR_LVL_P21: - return 21; -# endif -# endif - default: - return 0xFF; - } -# else - return 0xFF; // CONFIG_IDF_TARGET_ESP32P4 does not support esp_ble_tx_power_get +# ifdef CONFIG_IDF_TARGET_ESP32P4 + return -127; // CONFIG_IDF_TARGET_ESP32P4 does not support esp_ble_tx_power_get # endif + int pwr = esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_DEFAULT); + if (pwr < ESP_PWR_LVL_N0) { + return -3 * (ESP_PWR_LVL_N0 - pwr); + } + + if (pwr > ESP_PWR_LVL_N0 && pwr != ESP_PWR_LVL_INVALID) { + return (pwr - ESP_PWR_LVL_N0) * 3; + } + + return 0; + # else return ble_phy_txpwr_get(); # endif diff --git a/src/NimBLEDevice.h b/src/NimBLEDevice.h index b836e48c..52c5420f 100644 --- a/src/NimBLEDevice.h +++ b/src/NimBLEDevice.h @@ -134,12 +134,11 @@ class NimBLEDevice { static void onSync(void); static void host_task(void* param); static int getPower(); + static bool setPower(int8_t dbm); # if defined(ESP_PLATFORM) static esp_power_level_t getPowerLevel(); - static bool setPower(esp_power_level_t powerLevel); -# else - static bool setPower(int8_t dbm); + static bool setPowerLevel(esp_power_level_t powerLevel); # endif # if CONFIG_BT_NIMBLE_EXT_ADV From b35ee1794055725b72d90c4a5bc65832f3808905 Mon Sep 17 00:00:00 2001 From: h2zero Date: Mon, 2 Dec 2024 12:31:02 -0700 Subject: [PATCH 5/6] Remove ESP_PWR_LVL_INVALID check --- src/NimBLEDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NimBLEDevice.cpp b/src/NimBLEDevice.cpp index 0d23e7b5..69f312db 100644 --- a/src/NimBLEDevice.cpp +++ b/src/NimBLEDevice.cpp @@ -487,7 +487,7 @@ int NimBLEDevice::getPower() { return -3 * (ESP_PWR_LVL_N0 - pwr); } - if (pwr > ESP_PWR_LVL_N0 && pwr != ESP_PWR_LVL_INVALID) { + if (pwr > ESP_PWR_LVL_N0) { return (pwr - ESP_PWR_LVL_N0) * 3; } From 9f3b0e9a5c35c1bd7c598d5debb9dae46ce518ae Mon Sep 17 00:00:00 2001 From: h2zero Date: Mon, 2 Dec 2024 15:06:39 -0700 Subject: [PATCH 6/6] Fixup/cleanup * Add powerType parameter to getPowerLevel and setPowerLevel. --- src/NimBLEDevice.cpp | 29 ++++++++++++++++++----------- src/NimBLEDevice.h | 4 ++-- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/NimBLEDevice.cpp b/src/NimBLEDevice.cpp index 69f312db..fc62b303 100644 --- a/src/NimBLEDevice.cpp +++ b/src/NimBLEDevice.cpp @@ -426,20 +426,24 @@ std::vector NimBLEDevice::getConnectedClients() { * @brief Get the transmission power. * @return The power level currently used in esp_power_level_t. */ -esp_power_level_t NimBLEDevice::getPowerLevel() { - return esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_DEFAULT); +esp_power_level_t NimBLEDevice::getPowerLevel(esp_ble_power_type_t powerType) { +# ifdef CONFIG_IDF_TARGET_ESP32P4 + return 0xFF; // CONFIG_IDF_TARGET_ESP32P4 does not support esp_ble_tx_power_get +# else + return esp_ble_tx_power_get(powerType); +# endif } // getPowerLevel /** * @brief Set the transmission power. - * @param [in] powerLevel The power level to set in esp_power_level_t.. + * @param [in] powerLevel The power level to set in esp_power_level_t. * @return True if the power level was set successfully. */ -bool NimBLEDevice::setPowerLevel(esp_power_level_t powerLevel) { +bool NimBLEDevice::setPowerLevel(esp_power_level_t powerLevel, esp_ble_power_type_t powerType) { # ifdef CONFIG_IDF_TARGET_ESP32P4 - return false; + return false; // CONFIG_IDF_TARGET_ESP32P4 does not support esp_ble_tx_power_set # else - esp_err_t errRc = esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, powerLevel); + esp_err_t errRc = esp_ble_tx_power_set(powerType, powerLevel); if (errRc != ESP_OK) { NIMBLE_LOGE(LOG_TAG, "esp_ble_tx_power_set: rc=%d", errRc); } @@ -456,6 +460,9 @@ bool NimBLEDevice::setPowerLevel(esp_power_level_t powerLevel) { */ bool NimBLEDevice::setPower(int8_t dbm) { # ifdef ESP_PLATFORM + if (dbm % 3 == 2) { + dbm++; // round up to the next multiple of 3 to be able to target 20dbm + } return setPowerLevel(static_cast(dbm / 3 + ESP_PWR_LVL_N0)); # else NIMBLE_LOGD(LOG_TAG, ">> setPower: %d", dbm); @@ -475,24 +482,24 @@ bool NimBLEDevice::setPower(int8_t dbm) { /** * @brief Get the transmission power. * @return The power level currently used in dbm. + * @note ESP32S3 only returns 0xFF as of IDF 5, so this function will return 20dbm. */ int NimBLEDevice::getPower() { # ifdef ESP_PLATFORM # ifdef CONFIG_IDF_TARGET_ESP32P4 - return -127; // CONFIG_IDF_TARGET_ESP32P4 does not support esp_ble_tx_power_get -# endif - + return 0xFF; // CONFIG_IDF_TARGET_ESP32P4 does not support esp_ble_tx_power_get +# else int pwr = esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_DEFAULT); if (pwr < ESP_PWR_LVL_N0) { return -3 * (ESP_PWR_LVL_N0 - pwr); } if (pwr > ESP_PWR_LVL_N0) { - return (pwr - ESP_PWR_LVL_N0) * 3; + return std::min((pwr - ESP_PWR_LVL_N0) * 3, 20); } return 0; - +# endif # else return ble_phy_txpwr_get(); # endif diff --git a/src/NimBLEDevice.h b/src/NimBLEDevice.h index 52c5420f..add0fec7 100644 --- a/src/NimBLEDevice.h +++ b/src/NimBLEDevice.h @@ -137,8 +137,8 @@ class NimBLEDevice { static bool setPower(int8_t dbm); # if defined(ESP_PLATFORM) - static esp_power_level_t getPowerLevel(); - static bool setPowerLevel(esp_power_level_t powerLevel); + static esp_power_level_t getPowerLevel(esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); + static bool setPowerLevel(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT); # endif # if CONFIG_BT_NIMBLE_EXT_ADV