summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/BLEClient.cpp2
-rw-r--r--src/BLEDevice.cpp35
-rw-r--r--src/BLEScan.cpp29
-rw-r--r--src/BLEScan.h3
-rw-r--r--src/BLEServer.cpp9
-rw-r--r--src/BLEServer.h2
-rw-r--r--src/BLEService.cpp78
-rw-r--r--src/BLEService.h4
-rw-r--r--src/BLEServiceMap.cpp9
9 files changed, 147 insertions, 24 deletions
diff --git a/src/BLEClient.cpp b/src/BLEClient.cpp
index f09cf91..141cf0f 100644
--- a/src/BLEClient.cpp
+++ b/src/BLEClient.cpp
@@ -112,7 +112,7 @@ bool BLEClient::connect(BLEAddress address) {
getGattcIf(),
*getPeerAddress().getNative(), // address
BLE_ADDR_TYPE_PUBLIC, // Note: This was added on 2018-04-03 when the latest ESP-IDF was detected to have changed the signature.
- true // direct connection
+ 1 // direct connection
);
if (errRc != ESP_OK) {
ESP_LOGE(LOG_TAG, "esp_ble_gattc_open: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
diff --git a/src/BLEDevice.cpp b/src/BLEDevice.cpp
index 1c6e6bb..6aa7c6e 100644
--- a/src/BLEDevice.cpp
+++ b/src/BLEDevice.cpp
@@ -331,14 +331,21 @@ uint16_t BLEDevice::m_localMTU = 23;
if(!initialized){
initialized = true; // Set the initialization flag to ensure we are only initialized once.
- esp_err_t errRc = ::nvs_flash_init();
+ esp_err_t errRc = ESP_OK;
+#ifdef ARDUINO_ARCH_ESP32
+ if (!btStart()) {
+ errRc = ESP_FAIL;
+ return;
+ }
+#else
+ errRc = ::nvs_flash_init();
if (errRc != ESP_OK) {
ESP_LOGE(LOG_TAG, "nvs_flash_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
return;
}
- esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
- errRc = esp_bt_controller_init(&bt_cfg);
+ esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
+ errRc = esp_bt_controller_init(&bt_cfg);
if (errRc != ESP_OK) {
ESP_LOGE(LOG_TAG, "esp_bt_controller_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
return;
@@ -359,17 +366,23 @@ uint16_t BLEDevice::m_localMTU = 23;
return;
}
#endif
+#endif
- errRc = esp_bluedroid_init();
- if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_bluedroid_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
- return;
+ esp_bluedroid_status_t bt_state = esp_bluedroid_get_status();
+ if (bt_state == ESP_BLUEDROID_STATUS_UNINITIALIZED){
+ errRc = esp_bluedroid_init();
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_bluedroid_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
}
- errRc = esp_bluedroid_enable();
- if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_bluedroid_enable: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
- return;
+ if (bt_state != ESP_BLUEDROID_STATUS_ENABLED){
+ errRc = esp_bluedroid_enable();
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_bluedroid_enable: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
}
errRc = esp_ble_gap_register_callback(BLEDevice::gapEventHandler);
diff --git a/src/BLEScan.cpp b/src/BLEScan.cpp
index 73086c6..3046b7c 100644
--- a/src/BLEScan.cpp
+++ b/src/BLEScan.cpp
@@ -189,16 +189,14 @@ void BLEScan::setWindow(uint16_t windowMSecs) {
/**
* @brief Start scanning.
* @param [in] duration The duration in seconds for which to scan.
- * @param [in] scanCompleteCB A function to be called when scanning has completed. This can
- * be supplied as nullptr (the default) in which case the call to start will block until scanning has
- * been completed.
- * @return The BLEScanResults. Only applicable if we are waiting for results.
+ * @param [in] scanCompleteCB A function to be called when scanning has completed.
+ * @return True if scan started or false if there was an error.
*/
-BLEScanResults BLEScan::start(uint32_t duration, void (*scanCompleteCB)(BLEScanResults)) {
+bool BLEScan::start(uint32_t duration, void (*scanCompleteCB)(BLEScanResults)) {
ESP_LOGD(LOG_TAG, ">> start(duration=%d)", duration);
- m_scanCompleteCB = scanCompleteCB; // Save the callback to be invoked when the scan completes.
m_semaphoreScanEnd.take(std::string("start"));
+ m_scanCompleteCB = scanCompleteCB; // Save the callback to be invoked when the scan completes.
m_scanResults.m_vectorAdvertisedDevices.clear();
@@ -207,7 +205,7 @@ BLEScanResults BLEScan::start(uint32_t duration, void (*scanCompleteCB)(BLEScanR
if (errRc != ESP_OK) {
ESP_LOGE(LOG_TAG, "esp_ble_gap_set_scan_params: err: %d, text: %s", errRc, GeneralUtils::errorToString(errRc));
m_semaphoreScanEnd.give();
- return m_scanResults;
+ return false;
}
errRc = ::esp_ble_gap_start_scanning(duration);
@@ -215,16 +213,25 @@ BLEScanResults BLEScan::start(uint32_t duration, void (*scanCompleteCB)(BLEScanR
if (errRc != ESP_OK) {
ESP_LOGE(LOG_TAG, "esp_ble_gap_start_scanning: err: %d, text: %s", errRc, GeneralUtils::errorToString(errRc));
m_semaphoreScanEnd.give();
- return m_scanResults;
+ return false;
}
m_stopped = false;
- if (m_scanCompleteCB == nullptr) {
+ ESP_LOGD(LOG_TAG, "<< start()");
+ return true;
+} // start
+
+
+/**
+ * @brief Start scanning and block until scanning has been completed.
+ * @param [in] duration The duration in seconds for which to scan.
+ * @return The BLEScanResults.
+ */
+BLEScanResults BLEScan::start(uint32_t duration) {
+ if(start(duration, nullptr)) {
m_semaphoreScanEnd.wait("start"); // Wait for the semaphore to release.
}
-
- ESP_LOGD(LOG_TAG, "<< start()");
return m_scanResults;
} // start
diff --git a/src/BLEScan.h b/src/BLEScan.h
index 3e53ce6..76c7c7c 100644
--- a/src/BLEScan.h
+++ b/src/BLEScan.h
@@ -53,7 +53,8 @@ public:
bool wantDuplicates = false);
void setInterval(uint16_t intervalMSecs);
void setWindow(uint16_t windowMSecs);
- BLEScanResults start(uint32_t duration, void (*scanCompleteCB)(BLEScanResults) = nullptr);
+ bool start(uint32_t duration, void (*scanCompleteCB)(BLEScanResults));
+ BLEScanResults start(uint32_t duration);
void stop();
private:
diff --git a/src/BLEServer.cpp b/src/BLEServer.cpp
index 8fbdd43..d5c9de6 100644
--- a/src/BLEServer.cpp
+++ b/src/BLEServer.cpp
@@ -11,6 +11,7 @@
#include <esp_bt.h>
#include <esp_bt_main.h>
#include <esp_gap_ble_api.h>
+//#include <esp_gatts_api.h>
#include "BLEDevice.h"
#include "BLEServer.h"
#include "BLEService.h"
@@ -322,6 +323,14 @@ void BLEServer::setCallbacks(BLEServerCallbacks* pCallbacks) {
m_pServerCallbacks = pCallbacks;
} // setCallbacks
+/*
+ * Remove service
+ */
+void BLEServer::removeService(BLEService *service) {
+ service->stop();
+ service->executeDelete();
+ m_serviceMap.removeService(service);
+}
/**
* @brief Start advertising.
diff --git a/src/BLEServer.h b/src/BLEServer.h
index 6c71679..95c55d5 100644
--- a/src/BLEServer.h
+++ b/src/BLEServer.h
@@ -42,6 +42,7 @@ public:
std::string toString();
BLEService* getFirst();
BLEService* getNext();
+ void removeService(BLEService *service);
private:
std::map<uint16_t, BLEService*> m_handleMap;
@@ -61,6 +62,7 @@ public:
BLEAdvertising* getAdvertising();
void setCallbacks(BLEServerCallbacks* pCallbacks);
void startAdvertising();
+ void removeService(BLEService *service);
private:
diff --git a/src/BLEService.cpp b/src/BLEService.cpp
index 6636ca5..340ea56 100644
--- a/src/BLEService.cpp
+++ b/src/BLEService.cpp
@@ -92,6 +92,28 @@ void BLEService::executeCreate(BLEServer *pServer) {
/**
+ * @brief Delete the service.
+ * Delete the service.
+ * @return N/A.
+ */
+
+void BLEService::executeDelete() {
+ ESP_LOGD(LOG_TAG, ">> executeDelete()");
+ m_semaphoreDeleteEvt.take("executeDelete"); // Take the mutex and release at event ESP_GATTS_DELETE_EVT
+
+ esp_err_t errRc = ::esp_ble_gatts_delete_service( getHandle() );
+
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_ble_gatts_delete_service: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
+
+ m_semaphoreDeleteEvt.wait("executeDelete");
+ ESP_LOGD(LOG_TAG, "<< executeDelete");
+} // executeDelete
+
+
+/**
* @brief Dump details of this BLE GATT service.
* @return N/A.
*/
@@ -154,6 +176,34 @@ void BLEService::start() {
/**
+ * @brief Stop the service.
+ * @return Stop the service.
+ */
+void BLEService::stop() {
+// We ask the BLE runtime to start the service and then create each of the characteristics.
+// We start the service through its local handle which was returned in the ESP_GATTS_CREATE_EVT event
+// obtained as a result of calling esp_ble_gatts_create_service().
+//
+ ESP_LOGD(LOG_TAG, ">> stop(): Stopping service (esp_ble_gatts_stop_service): %s", toString().c_str());
+ if (m_handle == NULL_HANDLE) {
+ ESP_LOGE(LOG_TAG, "<< !!! We attempted to stop a service but don't know its handle!");
+ return;
+ }
+
+ m_semaphoreStopEvt.take("stop");
+ esp_err_t errRc = ::esp_ble_gatts_stop_service(m_handle);
+
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "<< esp_ble_gatts_stop_service: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
+ m_semaphoreStopEvt.wait("stop");
+
+ ESP_LOGD(LOG_TAG, "<< stop()");
+} // start
+
+
+/**
* @brief Set the handle associated with this service.
* @param [in] handle The handle associated with the service.
*/
@@ -278,6 +328,19 @@ void BLEService::handleGATTServerEvent(
break;
} // ESP_GATTS_START_EVT
+ // ESP_GATTS_STOP_EVT
+ //
+ // stop:
+ // esp_gatt_status_t status
+ // uint16_t service_handle
+ //
+ case ESP_GATTS_STOP_EVT: {
+ if (param->stop.service_handle == getHandle()) {
+ m_semaphoreStopEvt.give();
+ }
+ break;
+ } // ESP_GATTS_STOP_EVT
+
// ESP_GATTS_CREATE_EVT
// Called when a new service is registered as having been created.
@@ -299,6 +362,21 @@ void BLEService::handleGATTServerEvent(
break;
} // ESP_GATTS_CREATE_EVT
+
+ // ESP_GATTS_DELETE_EVT
+ // Called when a service is deleted.
+ //
+ // delete:
+ // * esp_gatt_status_t status
+ // * uint16_t service_handle
+ //
+ case ESP_GATTS_DELETE_EVT: {
+ if (param->del.service_handle == getHandle()) {
+ m_semaphoreDeleteEvt.give();
+ }
+ break;
+ } // ESP_GATTS_DELETE_EVT
+
default: {
break;
} // Default
diff --git a/src/BLEService.h b/src/BLEService.h
index 79958f3..93b4b2c 100644
--- a/src/BLEService.h
+++ b/src/BLEService.h
@@ -57,11 +57,13 @@ public:
BLECharacteristic* createCharacteristic(BLEUUID uuid, uint32_t properties);
void dump();
void executeCreate(BLEServer* pServer);
+ void executeDelete();
BLECharacteristic* getCharacteristic(const char* uuid);
BLECharacteristic* getCharacteristic(BLEUUID uuid);
BLEUUID getUUID();
BLEServer* getServer();
void start();
+ void stop();
std::string toString();
uint16_t getHandle();
uint8_t m_id = 0;
@@ -82,7 +84,9 @@ private:
BLEUUID m_uuid;
FreeRTOS::Semaphore m_semaphoreCreateEvt = FreeRTOS::Semaphore("CreateEvt");
+ FreeRTOS::Semaphore m_semaphoreDeleteEvt = FreeRTOS::Semaphore("DeleteEvt");
FreeRTOS::Semaphore m_semaphoreStartEvt = FreeRTOS::Semaphore("StartEvt");
+ FreeRTOS::Semaphore m_semaphoreStopEvt = FreeRTOS::Semaphore("StopEvt");
uint32_t m_numHandles;
diff --git a/src/BLEServiceMap.cpp b/src/BLEServiceMap.cpp
index 96811ad..dd828fa 100644
--- a/src/BLEServiceMap.cpp
+++ b/src/BLEServiceMap.cpp
@@ -120,4 +120,13 @@ BLEService* BLEServiceMap::getNext() {
return pRet;
} // getNext
+/**
+ * @brief Removes service from maps.
+ * @return N/A.
+ */
+void BLEServiceMap::removeService(BLEService *service){
+ m_handleMap.erase(service->getHandle());
+ m_uuidMap.erase(service);
+} // removeService
+
#endif /* CONFIG_BT_ENABLED */