summaryrefslogtreecommitdiff
path: root/src/BLEDevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/BLEDevice.cpp')
-rw-r--r--src/BLEDevice.cpp154
1 files changed, 97 insertions, 57 deletions
diff --git a/src/BLEDevice.cpp b/src/BLEDevice.cpp
index 97d02b1..a701459 100644
--- a/src/BLEDevice.cpp
+++ b/src/BLEDevice.cpp
@@ -39,7 +39,7 @@ static const char* LOG_TAG = "BLEDevice";
BLEServer* BLEDevice::m_pServer = nullptr;
BLEScan* BLEDevice::m_pScan = nullptr;
BLEClient* BLEDevice::m_pClient = nullptr;
-
+bool initialized = false;
/**
* @brief Create a new instance of a client.
* @return A new instance of the client.
@@ -147,20 +147,28 @@ void BLEDevice::gapEventHandler(
BLEDevice::m_pServer->handleGAPEvent(event, param);
}
+ if (BLEDevice::m_pClient != nullptr) {
+ BLEDevice::m_pClient->handleGAPEvent(event, param);
+ }
+
if (BLEDevice::m_pScan != nullptr) {
- BLEDevice::getScan()->gapEventHandler(event, param);
+ BLEDevice::getScan()->handleGAPEvent(event, param);
}
} // gapEventHandler
/**
* @brief Retrieve the Scan object that we use for scanning.
- * @return The scanning object reference.
+ * @return The scanning object reference. This is a singleton object. The caller should not
+ * try and release/delete it.
*/
BLEScan* BLEDevice::getScan() {
+ //ESP_LOGD(LOG_TAG, ">> getScan");
if (m_pScan == nullptr) {
m_pScan = new BLEScan();
+ //ESP_LOGD(LOG_TAG, " - creating a new scan object");
}
+ //ESP_LOGD(LOG_TAG, "<< getScan: Returning object at 0x%x", (uint32_t)m_pScan);
return m_pScan;
} // getScan
@@ -170,70 +178,102 @@ BLEScan* BLEDevice::getScan() {
* @param deviceName The device name of the device.
*/
void BLEDevice::init(std::string deviceName) {
- esp_err_t 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);
- if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_bt_controller_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
- return;
- }
+ if(!initialized){
+ initialized = true;
+ esp_err_t errRc = ::nvs_flash_init();
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "nvs_flash_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
- errRc = esp_bt_controller_enable(ESP_BT_MODE_BTDM);
- if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_bt_controller_enable: 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);
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_bt_controller_init: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
+#ifndef CLASSIC_BT_ENABLED
+ // esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); //FIXME waiting for response from esp-idf issue
+ errRc = esp_bt_controller_enable(ESP_BT_MODE_BLE);
+ //errRc = esp_bt_controller_enable(ESP_BT_MODE_BTDM);
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_bt_controller_enable: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
+#else
+ errRc = esp_bt_controller_enable(ESP_BT_MODE_BTDM);
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_bt_controller_enable: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
+#endif
+ 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_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;
+ }
- 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);
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_ble_gap_register_callback: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
- errRc = esp_ble_gap_register_callback(BLEDevice::gapEventHandler);
- if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_ble_gap_register_callback: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
- return;
- }
+ errRc = esp_ble_gattc_register_callback(BLEDevice::gattClientEventHandler);
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_ble_gattc_register_callback: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
- errRc = esp_ble_gattc_register_callback(BLEDevice::gattClientEventHandler);
- if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_ble_gattc_register_callback: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
- return;
- }
+ errRc = esp_ble_gatts_register_callback(BLEDevice::gattServerEventHandler);
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_ble_gatts_register_callback: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ }
- errRc = esp_ble_gatts_register_callback(BLEDevice::gattServerEventHandler);
- if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_ble_gatts_register_callback: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
- return;
+ errRc = ::esp_ble_gap_set_device_name(deviceName.c_str());
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_ble_gap_set_device_name: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ };
+
+ esp_ble_io_cap_t iocap = ESP_IO_CAP_NONE;
+ errRc = ::esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &iocap, sizeof(uint8_t));
+ if (errRc != ESP_OK) {
+ ESP_LOGE(LOG_TAG, "esp_ble_gap_set_security_param: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
+ return;
+ };
}
+ vTaskDelay(200/portTICK_PERIOD_MS); // Delay for 200 msecs as a workaround to an apparent Arduino environment issue.
+} // init
- errRc = ::esp_ble_gap_set_device_name(deviceName.c_str());
- if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_ble_gap_set_device_name: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
- return;
- };
- esp_ble_io_cap_t iocap = ESP_IO_CAP_NONE;
- errRc = ::esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &iocap, sizeof(uint8_t));
+/**
+ * @brief Set the transmission power.
+ * The power level can be one of:
+ * * ESP_PWR_LVL_N14
+ * * ESP_PWR_LVL_N11
+ * * ESP_PWR_LVL_N8
+ * * ESP_PWR_LVL_N5
+ * * ESP_PWR_LVL_N2
+ * * ESP_PWR_LVL_P1
+ * * ESP_PWR_LVL_P4
+ * * ESP_PWR_LVL_P7
+ * @param [in] powerLevel.
+ */
+/* STATIC */ void BLEDevice::setPower(esp_power_level_t powerLevel) {
+ ESP_LOGD(LOG_TAG, ">> setPower: %d", powerLevel);
+ esp_err_t errRc = ::esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, powerLevel);
if (errRc != ESP_OK) {
- ESP_LOGE(LOG_TAG, "esp_ble_gap_set_security_param: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
- return;
+ ESP_LOGE(LOG_TAG, "esp_ble_tx_power_set: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
};
-
- vTaskDelay(200/portTICK_PERIOD_MS); // Delay for 200 msecs as a workaround to an apparent Arduino environment issue.
-} // init
-
+ ESP_LOGD(LOG_TAG, "<< setPower");
+} // setPower
#endif // CONFIG_BT_ENABLED