5502879a5b
This is very much still work in progress and much more will change before the final 2.0.0 Some APIs have changed. New libraries have been added. LittleFS included. Co-authored-by: Seon Rozenblum <seonr@3sprockets.com> Co-authored-by: Me No Dev <me-no-dev@users.noreply.github.com> Co-authored-by: geeksville <kevinh@geeksville.com> Co-authored-by: Mike Dunston <m_dunston@comcast.net> Co-authored-by: Unexpected Maker <seon@unexpectedmaker.com> Co-authored-by: Seon Rozenblum <seonr@3sprockets.com> Co-authored-by: microDev <70126934+microDev1@users.noreply.github.com> Co-authored-by: tobozo <tobozo@users.noreply.github.com> Co-authored-by: bobobo1618 <bobobo1618@users.noreply.github.com> Co-authored-by: lorol <lorolouis@gmail.com> Co-authored-by: geeksville <kevinh@geeksville.com> Co-authored-by: Limor "Ladyada" Fried <limor@ladyada.net> Co-authored-by: Sweety <switi.mhaiske@espressif.com> Co-authored-by: Loick MAHIEUX <loick111@gmail.com> Co-authored-by: Larry Bernstone <lbernstone@gmail.com> Co-authored-by: Valerii Koval <valeros@users.noreply.github.com> Co-authored-by: 快乐的我531 <2302004040@qq.com> Co-authored-by: chegewara <imperiaonline4@gmail.com> Co-authored-by: Clemens Kirchgatterer <clemens@1541.org> Co-authored-by: Aron Rubin <aronrubin@gmail.com> Co-authored-by: Pete Lewis <601236+lewispg228@users.noreply.github.com>
205 lines
5.7 KiB
C++
205 lines
5.7 KiB
C++
/*
|
|
* BLERemoteDescriptor.cpp
|
|
*
|
|
* Created on: Jul 8, 2017
|
|
* Author: kolban
|
|
*/
|
|
#include "sdkconfig.h"
|
|
#if defined(CONFIG_BLUEDROID_ENABLED)
|
|
#include <sstream>
|
|
#include "BLERemoteDescriptor.h"
|
|
#include "GeneralUtils.h"
|
|
#include "esp32-hal-log.h"
|
|
|
|
BLERemoteDescriptor::BLERemoteDescriptor(
|
|
uint16_t handle,
|
|
BLEUUID uuid,
|
|
BLERemoteCharacteristic* pRemoteCharacteristic) {
|
|
|
|
m_handle = handle;
|
|
m_uuid = uuid;
|
|
m_pRemoteCharacteristic = pRemoteCharacteristic;
|
|
m_auth = ESP_GATT_AUTH_REQ_NONE;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Retrieve the handle associated with this remote descriptor.
|
|
* @return The handle associated with this remote descriptor.
|
|
*/
|
|
uint16_t BLERemoteDescriptor::getHandle() {
|
|
return m_handle;
|
|
} // getHandle
|
|
|
|
|
|
/**
|
|
* @brief Get the characteristic that owns this descriptor.
|
|
* @return The characteristic that owns this descriptor.
|
|
*/
|
|
BLERemoteCharacteristic* BLERemoteDescriptor::getRemoteCharacteristic() {
|
|
return m_pRemoteCharacteristic;
|
|
} // getRemoteCharacteristic
|
|
|
|
|
|
/**
|
|
* @brief Retrieve the UUID associated this remote descriptor.
|
|
* @return The UUID associated this remote descriptor.
|
|
*/
|
|
BLEUUID BLERemoteDescriptor::getUUID() {
|
|
return m_uuid;
|
|
} // getUUID
|
|
|
|
void BLERemoteDescriptor::gattClientEventHandler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t* evtParam) {
|
|
switch(event) {
|
|
case ESP_GATTC_READ_DESCR_EVT:
|
|
if (evtParam->read.handle != getHandle())
|
|
break;
|
|
m_semaphoreReadDescrEvt.give();
|
|
break;
|
|
|
|
case ESP_GATTC_WRITE_DESCR_EVT:
|
|
if (evtParam->write.handle != getHandle())
|
|
break;
|
|
m_semaphoreWriteDescrEvt.give();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
std::string BLERemoteDescriptor::readValue() {
|
|
log_v(">> readValue: %s", toString().c_str());
|
|
|
|
// Check to see that we are connected.
|
|
if (!getRemoteCharacteristic()->getRemoteService()->getClient()->isConnected()) {
|
|
log_e("Disconnected");
|
|
return std::string();
|
|
}
|
|
|
|
m_semaphoreReadDescrEvt.take("readValue");
|
|
|
|
// Ask the BLE subsystem to retrieve the value for the remote hosted characteristic.
|
|
esp_err_t errRc = ::esp_ble_gattc_read_char_descr(
|
|
m_pRemoteCharacteristic->getRemoteService()->getClient()->getGattcIf(),
|
|
m_pRemoteCharacteristic->getRemoteService()->getClient()->getConnId(), // The connection ID to the BLE server
|
|
getHandle(), // The handle of this characteristic
|
|
m_auth); // Security
|
|
|
|
if (errRc != ESP_OK) {
|
|
log_e("esp_ble_gattc_read_char: rc=%d %s", errRc, GeneralUtils::errorToString(errRc));
|
|
return "";
|
|
}
|
|
|
|
// Block waiting for the event that indicates that the read has completed. When it has, the std::string found
|
|
// in m_value will contain our data.
|
|
m_semaphoreReadDescrEvt.wait("readValue");
|
|
|
|
log_v("<< readValue(): length: %d", m_value.length());
|
|
return m_value;
|
|
} // readValue
|
|
|
|
|
|
uint8_t BLERemoteDescriptor::readUInt8() {
|
|
std::string value = readValue();
|
|
if (value.length() >= 1) {
|
|
return (uint8_t) value[0];
|
|
}
|
|
return 0;
|
|
} // readUInt8
|
|
|
|
|
|
uint16_t BLERemoteDescriptor::readUInt16() {
|
|
std::string value = readValue();
|
|
if (value.length() >= 2) {
|
|
return *(uint16_t*) value.data();
|
|
}
|
|
return 0;
|
|
} // readUInt16
|
|
|
|
|
|
uint32_t BLERemoteDescriptor::readUInt32() {
|
|
std::string value = readValue();
|
|
if (value.length() >= 4) {
|
|
return *(uint32_t*) value.data();
|
|
}
|
|
return 0;
|
|
} // readUInt32
|
|
|
|
|
|
/**
|
|
* @brief Return a string representation of this BLE Remote Descriptor.
|
|
* @retun A string representation of this BLE Remote Descriptor.
|
|
*/
|
|
std::string BLERemoteDescriptor::toString() {
|
|
char val[6];
|
|
snprintf(val, sizeof(val), "%d", getHandle());
|
|
std::string res = "handle: ";
|
|
res += val;
|
|
res += ", uuid: " + getUUID().toString();
|
|
return res;
|
|
} // toString
|
|
|
|
|
|
/**
|
|
* @brief Write data to the BLE Remote Descriptor.
|
|
* @param [in] data The data to send to the remote descriptor.
|
|
* @param [in] length The length of the data to send.
|
|
* @param [in] response True if we expect a response.
|
|
*/
|
|
void BLERemoteDescriptor::writeValue(uint8_t* data, size_t length, bool response) {
|
|
log_v(">> writeValue: %s", toString().c_str());
|
|
// Check to see that we are connected.
|
|
if (!getRemoteCharacteristic()->getRemoteService()->getClient()->isConnected()) {
|
|
log_e("Disconnected");
|
|
return;
|
|
}
|
|
|
|
m_semaphoreWriteDescrEvt.take("writeValue");
|
|
|
|
esp_err_t errRc = ::esp_ble_gattc_write_char_descr(
|
|
m_pRemoteCharacteristic->getRemoteService()->getClient()->getGattcIf(),
|
|
m_pRemoteCharacteristic->getRemoteService()->getClient()->getConnId(),
|
|
getHandle(),
|
|
length, // Data length
|
|
data, // Data
|
|
response ? ESP_GATT_WRITE_TYPE_RSP : ESP_GATT_WRITE_TYPE_NO_RSP,
|
|
m_auth
|
|
);
|
|
if (errRc != ESP_OK) {
|
|
log_e("esp_ble_gattc_write_char_descr: %d", errRc);
|
|
}
|
|
|
|
m_semaphoreWriteDescrEvt.wait("writeValue");
|
|
log_v("<< writeValue");
|
|
} // writeValue
|
|
|
|
|
|
/**
|
|
* @brief Write data represented as a string to the BLE Remote Descriptor.
|
|
* @param [in] newValue The data to send to the remote descriptor.
|
|
* @param [in] response True if we expect a response.
|
|
*/
|
|
void BLERemoteDescriptor::writeValue(std::string newValue, bool response) {
|
|
writeValue((uint8_t*) newValue.data(), newValue.length(), response);
|
|
} // writeValue
|
|
|
|
|
|
/**
|
|
* @brief Write a byte value to the Descriptor.
|
|
* @param [in] The single byte to write.
|
|
* @param [in] True if we expect a response.
|
|
*/
|
|
void BLERemoteDescriptor::writeValue(uint8_t newValue, bool response) {
|
|
writeValue(&newValue, 1, response);
|
|
} // writeValue
|
|
|
|
/**
|
|
* @brief Set authentication request type for characteristic
|
|
* @param [in] auth Authentication request type.
|
|
*/
|
|
void BLERemoteDescriptor::setAuth(esp_gatt_auth_req_t auth) {
|
|
m_auth = auth;
|
|
}
|
|
|
|
#endif /* CONFIG_BLUEDROID_ENABLED */
|