From 1093646a75b2b61c04d612464fbb3b32c2606eb9 Mon Sep 17 00:00:00 2001
From: FidelSch <honoratofidel@protonmail.com>
Date: Mon, 20 Jan 2025 14:55:02 -0300
Subject: [PATCH 1/2] fix: BLEAdvertising methods return error codes

Some methods returned void even if they could produce an error, in which case they failed silently. They now return the corresponding error code.
---
 libraries/BLE/src/BLEAdvertising.cpp | 33 ++++++++++++++++------------
 libraries/BLE/src/BLEAdvertising.h   | 10 ++++-----
 2 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/libraries/BLE/src/BLEAdvertising.cpp b/libraries/BLE/src/BLEAdvertising.cpp
index 2d71c4d7478..861aaf04503 100644
--- a/libraries/BLE/src/BLEAdvertising.cpp
+++ b/libraries/BLE/src/BLEAdvertising.cpp
@@ -183,7 +183,7 @@ void BLEAdvertising::setScanFilter(bool scanRequestWhitelistOnly, bool connectWh
  * @brief Set the advertisement data that is to be published in a regular advertisement.
  * @param [in] advertisementData The data to be advertised.
  */
-void BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) {
+esp_err_t BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) {
   log_v(">> setAdvertisementData");
   esp_err_t errRc = ::esp_ble_gap_config_adv_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length());
   if (errRc != ESP_OK) {
@@ -191,13 +191,14 @@ void BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementDat
   }
   m_customAdvData = true;  // Set the flag that indicates we are using custom advertising data.
   log_v("<< setAdvertisementData");
+  return errRc;
 }  // setAdvertisementData
 
 /**
  * @brief Set the advertisement data that is to be published in a scan response.
  * @param [in] advertisementData The data to be advertised.
  */
-void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) {
+esp_err_t BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) {
   log_v(">> setScanResponseData");
   esp_err_t errRc = ::esp_ble_gap_config_scan_rsp_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length());
   if (errRc != ESP_OK) {
@@ -205,6 +206,7 @@ void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData
   }
   m_customScanResponseData = true;  // Set the flag that indicates we are using custom scan response data.
   log_v("<< setScanResponseData");
+  return errRc;
 }  // setScanResponseData
 
 /**
@@ -212,7 +214,7 @@ void BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData
  * Start advertising.
  * @return N/A.
  */
-void BLEAdvertising::start() {
+esp_err_t BLEAdvertising::start() {
   log_v(">> start: customAdvData: %d, customScanResponseData: %d", m_customAdvData, m_customScanResponseData);
 
   // We have a vector of service UUIDs that we wish to advertise.  In order to use the
@@ -225,7 +227,7 @@ void BLEAdvertising::start() {
     m_advData.p_service_uuid = (uint8_t *)malloc(m_advData.service_uuid_len);
     if (!m_advData.p_service_uuid) {
       log_e(">> start failed: out of memory");
-      return;
+      return ESP_ERR_NO_MEM;
     }
 
     uint8_t *p = m_advData.p_service_uuid;
@@ -250,7 +252,7 @@ void BLEAdvertising::start() {
     errRc = ::esp_ble_gap_config_adv_data(&m_advData);
     if (errRc != ESP_OK) {
       log_e("<< esp_ble_gap_config_adv_data: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
-      return;
+      return errRc;
     }
   }
 
@@ -266,7 +268,7 @@ void BLEAdvertising::start() {
     errRc = ::esp_ble_gap_config_adv_data(&m_scanRespData);
     if (errRc != ESP_OK) {
       log_e("<< esp_ble_gap_config_adv_data (Scan response): rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
-      return;
+      return errRc;
     }
   }
 
@@ -279,9 +281,10 @@ void BLEAdvertising::start() {
   errRc = ::esp_ble_gap_start_advertising(&m_advParams);
   if (errRc != ESP_OK) {
     log_e("<< esp_ble_gap_start_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
-    return;
+  } else {
+    log_v("<< start");
   }
-  log_v("<< start");
+  return errRc;
 }  // start
 
 /**
@@ -289,14 +292,15 @@ void BLEAdvertising::start() {
  * Stop advertising.
  * @return N/A.
  */
-void BLEAdvertising::stop() {
+esp_err_t BLEAdvertising::stop() {
   log_v(">> stop");
   esp_err_t errRc = ::esp_ble_gap_stop_advertising();
   if (errRc != ESP_OK) {
     log_e("esp_ble_gap_stop_advertising: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
-    return;
+  } else {
+    log_v("<< stop");
   }
-  log_v("<< stop");
+  return errRc;
 }  // stop
 
 /**
@@ -306,16 +310,17 @@ void BLEAdvertising::stop() {
  * Set BLE address.
  */
 
-void BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) {
+esp_err_t BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) {
   log_v(">> setPrivateAddress");
 
   m_advParams.own_addr_type = type;
   esp_err_t errRc = esp_ble_gap_set_rand_addr((uint8_t *)addr);
   if (errRc != ESP_OK) {
     log_e("esp_ble_gap_set_rand_addr: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
-    return;
+  } else {
+    log_v("<< setPrivateAddress");
   }
-  log_v("<< setPrivateAddress");
+  return errRc;
 }  // setPrivateAddress
 
 /**
diff --git a/libraries/BLE/src/BLEAdvertising.h b/libraries/BLE/src/BLEAdvertising.h
index 9da70a3d9ca..4e678a91513 100644
--- a/libraries/BLE/src/BLEAdvertising.h
+++ b/libraries/BLE/src/BLEAdvertising.h
@@ -54,18 +54,18 @@ class BLEAdvertising {
   bool removeServiceUUID(int index);
   bool removeServiceUUID(BLEUUID serviceUUID);
   bool removeServiceUUID(const char *serviceUUID);
-  void start();
-  void stop();
+  esp_err_t start();
+  esp_err_t stop();
   void setAppearance(uint16_t appearance);
   void setAdvertisementType(esp_ble_adv_type_t adv_type);
   void setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map);
   void setMaxInterval(uint16_t maxinterval);
   void setMinInterval(uint16_t mininterval);
-  void setAdvertisementData(BLEAdvertisementData &advertisementData);
+  esp_err_t setAdvertisementData(BLEAdvertisementData &advertisementData);
   void setScanFilter(bool scanRequestWhitelistOnly, bool connectWhitelistOnly);
-  void setScanResponseData(BLEAdvertisementData &advertisementData);
+  esp_err_t setScanResponseData(BLEAdvertisementData &advertisementData);
   void setPrivateAddress(esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
-  void setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
+  esp_err_t setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
 
   void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param);
   void setMinPreferred(uint16_t);

From b6b798b22815c35189ae2f9b4a9eebd539d92853 Mon Sep 17 00:00:00 2001
From: FidelSch <honoratofidel@gmail.com>
Date: Mon, 24 Mar 2025 19:24:45 -0300
Subject: [PATCH 2/2] fix: methods which could error out return bool

Changed from returning esp_error_t, in order to be more arduino compatible.
---
 libraries/BLE/src/BLEAdvertising.cpp | 27 +++++++++++++--------------
 libraries/BLE/src/BLEAdvertising.h   | 10 +++++-----
 2 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/libraries/BLE/src/BLEAdvertising.cpp b/libraries/BLE/src/BLEAdvertising.cpp
index 861aaf04503..fe39a69c206 100644
--- a/libraries/BLE/src/BLEAdvertising.cpp
+++ b/libraries/BLE/src/BLEAdvertising.cpp
@@ -183,7 +183,7 @@ void BLEAdvertising::setScanFilter(bool scanRequestWhitelistOnly, bool connectWh
  * @brief Set the advertisement data that is to be published in a regular advertisement.
  * @param [in] advertisementData The data to be advertised.
  */
-esp_err_t BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) {
+bool BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertisementData) {
   log_v(">> setAdvertisementData");
   esp_err_t errRc = ::esp_ble_gap_config_adv_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length());
   if (errRc != ESP_OK) {
@@ -191,14 +191,14 @@ esp_err_t BLEAdvertising::setAdvertisementData(BLEAdvertisementData &advertiseme
   }
   m_customAdvData = true;  // Set the flag that indicates we are using custom advertising data.
   log_v("<< setAdvertisementData");
-  return errRc;
+  return ESP_OK == errRc;
 }  // setAdvertisementData
 
 /**
  * @brief Set the advertisement data that is to be published in a scan response.
  * @param [in] advertisementData The data to be advertised.
  */
-esp_err_t BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) {
+bool BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisementData) {
   log_v(">> setScanResponseData");
   esp_err_t errRc = ::esp_ble_gap_config_scan_rsp_data_raw((uint8_t *)advertisementData.getPayload().c_str(), advertisementData.getPayload().length());
   if (errRc != ESP_OK) {
@@ -206,7 +206,7 @@ esp_err_t BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisemen
   }
   m_customScanResponseData = true;  // Set the flag that indicates we are using custom scan response data.
   log_v("<< setScanResponseData");
-  return errRc;
+  return ESP_OK == errRc;
 }  // setScanResponseData
 
 /**
@@ -214,7 +214,7 @@ esp_err_t BLEAdvertising::setScanResponseData(BLEAdvertisementData &advertisemen
  * Start advertising.
  * @return N/A.
  */
-esp_err_t BLEAdvertising::start() {
+bool BLEAdvertising::start() {
   log_v(">> start: customAdvData: %d, customScanResponseData: %d", m_customAdvData, m_customScanResponseData);
 
   // We have a vector of service UUIDs that we wish to advertise.  In order to use the
@@ -227,7 +227,7 @@ esp_err_t BLEAdvertising::start() {
     m_advData.p_service_uuid = (uint8_t *)malloc(m_advData.service_uuid_len);
     if (!m_advData.p_service_uuid) {
       log_e(">> start failed: out of memory");
-      return ESP_ERR_NO_MEM;
+      return false;
     }
 
     uint8_t *p = m_advData.p_service_uuid;
@@ -252,7 +252,7 @@ esp_err_t BLEAdvertising::start() {
     errRc = ::esp_ble_gap_config_adv_data(&m_advData);
     if (errRc != ESP_OK) {
       log_e("<< esp_ble_gap_config_adv_data: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
-      return errRc;
+      return false;
     }
   }
 
@@ -268,7 +268,7 @@ esp_err_t BLEAdvertising::start() {
     errRc = ::esp_ble_gap_config_adv_data(&m_scanRespData);
     if (errRc != ESP_OK) {
       log_e("<< esp_ble_gap_config_adv_data (Scan response): rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
-      return errRc;
+      return false;
     }
   }
 
@@ -284,7 +284,7 @@ esp_err_t BLEAdvertising::start() {
   } else {
     log_v("<< start");
   }
-  return errRc;
+  return ESP_OK == errRc;
 }  // start
 
 /**
@@ -292,7 +292,7 @@ esp_err_t BLEAdvertising::start() {
  * Stop advertising.
  * @return N/A.
  */
-esp_err_t BLEAdvertising::stop() {
+bool BLEAdvertising::stop() {
   log_v(">> stop");
   esp_err_t errRc = ::esp_ble_gap_stop_advertising();
   if (errRc != ESP_OK) {
@@ -300,7 +300,7 @@ esp_err_t BLEAdvertising::stop() {
   } else {
     log_v("<< stop");
   }
-  return errRc;
+  return ESP_OK == errRc;
 }  // stop
 
 /**
@@ -309,8 +309,7 @@ esp_err_t BLEAdvertising::stop() {
  * @param [in] Bluetooth address type.
  * Set BLE address.
  */
-
-esp_err_t BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) {
+bool BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type) {
   log_v(">> setPrivateAddress");
 
   m_advParams.own_addr_type = type;
@@ -320,7 +319,7 @@ esp_err_t BLEAdvertising::setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type
   } else {
     log_v("<< setPrivateAddress");
   }
-  return errRc;
+  return ESP_OK == errRc;
 }  // setPrivateAddress
 
 /**
diff --git a/libraries/BLE/src/BLEAdvertising.h b/libraries/BLE/src/BLEAdvertising.h
index 4e678a91513..1e573ac814f 100644
--- a/libraries/BLE/src/BLEAdvertising.h
+++ b/libraries/BLE/src/BLEAdvertising.h
@@ -54,18 +54,18 @@ class BLEAdvertising {
   bool removeServiceUUID(int index);
   bool removeServiceUUID(BLEUUID serviceUUID);
   bool removeServiceUUID(const char *serviceUUID);
-  esp_err_t start();
-  esp_err_t stop();
+  bool start();
+  bool stop();
   void setAppearance(uint16_t appearance);
   void setAdvertisementType(esp_ble_adv_type_t adv_type);
   void setAdvertisementChannelMap(esp_ble_adv_channel_t channel_map);
   void setMaxInterval(uint16_t maxinterval);
   void setMinInterval(uint16_t mininterval);
-  esp_err_t setAdvertisementData(BLEAdvertisementData &advertisementData);
+  bool setAdvertisementData(BLEAdvertisementData &advertisementData);
   void setScanFilter(bool scanRequestWhitelistOnly, bool connectWhitelistOnly);
-  esp_err_t setScanResponseData(BLEAdvertisementData &advertisementData);
+  bool setScanResponseData(BLEAdvertisementData &advertisementData);
   void setPrivateAddress(esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
-  esp_err_t setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
+  bool setDeviceAddress(esp_bd_addr_t addr, esp_ble_addr_type_t type = BLE_ADDR_TYPE_RANDOM);
 
   void handleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param);
   void setMinPreferred(uint16_t);