Skip to content

Commit a55489f

Browse files
authored
Add a workaround for esp32s3 and esp32c3 tx power bug (#252)
* Add a workaround for esp32s3 and esp32c3 tx power bug This adds a workaround to get the tx power when the function returns error due to a bug introduced in some versions of esp-idf. * Added error checking, return value will be 0xFF if there was an error.
1 parent b5b4666 commit a55489f

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/NimBLEDevice.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -425,10 +425,19 @@ std::vector<NimBLEClient*> NimBLEDevice::getConnectedClients() {
425425
# ifndef CONFIG_IDF_TARGET_ESP32P4
426426
/**
427427
* @brief Get the transmission power.
428-
* @return The power level currently used in esp_power_level_t.
428+
* @return The power level currently used in esp_power_level_t or a negative value on error.
429429
*/
430430
esp_power_level_t NimBLEDevice::getPowerLevel(esp_ble_power_type_t powerType) {
431-
return esp_ble_tx_power_get(powerType);
431+
esp_power_level_t pwr = esp_ble_tx_power_get(powerType);
432+
433+
# if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3)
434+
// workaround for bug when "enhanced tx power" was added
435+
if (pwr == 0xFF) {
436+
pwr = esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_CONN_HDL3);
437+
}
438+
# endif
439+
440+
return pwr;
432441
} // getPowerLevel
433442

434443
/**
@@ -479,15 +488,19 @@ bool NimBLEDevice::setPower(int8_t dbm) {
479488

480489
/**
481490
* @brief Get the transmission power.
482-
* @return The power level currently used in dbm.
483-
* @note ESP32S3 only returns 0xFF as of IDF 5, so this function will return 20dbm.
491+
* @return The power level currently used in dbm or 0xFF on error.
484492
*/
485493
int NimBLEDevice::getPower() {
486494
# ifdef ESP_PLATFORM
487495
# ifdef CONFIG_IDF_TARGET_ESP32P4
488496
return 0xFF; // CONFIG_IDF_TARGET_ESP32P4 does not support esp_ble_tx_power_get
489497
# else
490-
int pwr = esp_ble_tx_power_get(ESP_BLE_PWR_TYPE_DEFAULT);
498+
int pwr = getPowerLevel();
499+
if (pwr < 0) {
500+
NIMBLE_LOGE(LOG_TAG, "esp_ble_tx_power_get failed rc=%d", pwr);
501+
return 0xFF;
502+
}
503+
491504
if (pwr < ESP_PWR_LVL_N0) {
492505
return -3 * (ESP_PWR_LVL_N0 - pwr);
493506
}

0 commit comments

Comments
 (0)