diff --git a/libraries/CurieBLE/src/BLECharacteristic.cpp b/libraries/CurieBLE/src/BLECharacteristic.cpp index f8432b11..62d8a777 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.cpp +++ b/libraries/CurieBLE/src/BLECharacteristic.cpp @@ -367,14 +367,14 @@ bool BLECharacteristic::canUnsubscribe() return retVar; } -bool BLECharacteristic::read() +bool BLECharacteristic::read(bool blocked) { bool retVar = false; BLECharacteristicImp *characteristicImp = getImplementation(); if (NULL != characteristicImp) { - retVar = characteristicImp->read(); + retVar = characteristicImp->read(blocked); } return retVar; } diff --git a/libraries/CurieBLE/src/BLECharacteristic.h b/libraries/CurieBLE/src/BLECharacteristic.h index c1887c73..fdf66b42 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.h +++ b/libraries/CurieBLE/src/BLECharacteristic.h @@ -321,7 +321,7 @@ class BLECharacteristic: public BLEAttributeWithValue * * @note Only for GATT client. Schedule read request to the GATT server */ - virtual bool read(); + virtual bool read(bool blocked = false); /** * @brief Write the charcteristic value diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.cpp b/libraries/CurieBLE/src/internal/BLECallbacks.cpp index b6234750..7bd3e8ea 100644 --- a/libraries/CurieBLE/src/internal/BLECallbacks.cpp +++ b/libraries/CurieBLE/src/internal/BLECallbacks.cpp @@ -145,7 +145,7 @@ uint8_t profile_read_rsp_process(bt_conn_t *conn, const void *data, uint16_t length) { - if (NULL == data) + if (NULL == data && 0 != length) { return BT_GATT_ITER_STOP; } diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp index a5a60c57..30e3df1b 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp @@ -593,9 +593,10 @@ bt_uuid_t* BLECharacteristicImp::getClientCharacteristicConfigUuid(void) return (bt_uuid_t*) &_gatt_ccc_uuid; } -bool BLECharacteristicImp::read() +bool BLECharacteristicImp::read(bool blocked) { int retval = 0; + bool ret_bool; bt_conn_t* conn = NULL; if (true == BLEUtils::isLocalBLE(_ble_device)) @@ -633,8 +634,18 @@ bool BLECharacteristicImp::read() if (0 == retval) { _reading = true; + ret_bool = true; + + // Block the call + if (blocked == true) + { + while (_reading == true ) + { + delay(5); + } + } } - return _reading; + return ret_bool; } bool BLECharacteristicImp::write(const unsigned char value[], diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h index c6cee5ab..5c9af969 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h @@ -146,18 +146,18 @@ class BLECharacteristicImp: public BLEAttribute{ /** * @brief Schedule the read request to read the characteristic in peripheral * - * @param[in] none + * @param[in] blocked Flag the call is blocked or un-blocked * * @return bool Indicate the success or error * - * @note Only for central device + * @note Only for GATT client + * Default it is un-block call */ - bool read(); + bool read(bool blocked = false); /** * @brief Schedule the write request to update the characteristic in peripheral * - * @param[in] peripheral The peripheral device that want to be updated * @param[in] value New value to set, as a byte array. Data is stored in internal copy. * @param[in] length Length, in bytes, of valid data in the array to write. * Must not exceed maxLength set for this characteristic. @@ -324,7 +324,7 @@ class BLECharacteristicImp: public BLEAttribute{ bt_gatt_subscribe_params_t _sub_params; bool _subscribed; - bool _reading; + volatile bool _reading; bt_gatt_read_params_t _read_params; // GATT read parameter typedef LinkNode BLEDescriptorLinkNodeHeader;