diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/BLEClient.cpp | 2 | ||||
-rw-r--r-- | src/BLEDevice.cpp | 35 | ||||
-rw-r--r-- | src/BLEScan.cpp | 29 | ||||
-rw-r--r-- | src/BLEScan.h | 3 | ||||
-rw-r--r-- | src/BLEServer.cpp | 9 | ||||
-rw-r--r-- | src/BLEServer.h | 2 | ||||
-rw-r--r-- | src/BLEService.cpp | 78 | ||||
-rw-r--r-- | src/BLEService.h | 4 | ||||
-rw-r--r-- | src/BLEServiceMap.cpp | 9 |
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 */ |