From bc5650068db85e166241919d0b6724703138e4d9 Mon Sep 17 00:00:00 2001 From: lianggao Date: Wed, 18 Jan 2017 15:23:13 +0800 Subject: [PATCH] Jira 795, read() is blocking selectable, git 383 Mods: 1. Add an input parameter to BLECharacteristic::read() for blocking call selection. 2. By default, read() is a blocking call. File changes: 1. libraries/CurieBLE/src/BLECharacteristic.cpp: - Method read() added blocking selection. 2. libraries/CurieBLE/src/BLECharacteristic.h: - Prototype for read(), default is blocking. 3. libraries/CurieBLE/src/internal/BLECallbacks.cpp: - Added parameter checking in profile_read_rsp_process(). 4. libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp - The implementation of read() added waiting for resp if blocking is selected. 5. libraries/CurieBLE/src/internal/BLECharacteristicImp.h: - prototyping. --- libraries/CurieBLE/src/BLECharacteristic.cpp | 4 ++-- libraries/CurieBLE/src/BLECharacteristic.h | 3 ++- .../CurieBLE/src/internal/BLECallbacks.cpp | 2 +- .../src/internal/BLECharacteristicImp.cpp | 18 +++++++++++++++--- .../src/internal/BLECharacteristicImp.h | 10 +++++----- 5 files changed, 25 insertions(+), 12 deletions(-) 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..0ca0cf53 100644 --- a/libraries/CurieBLE/src/BLECharacteristic.h +++ b/libraries/CurieBLE/src/BLECharacteristic.h @@ -320,8 +320,9 @@ class BLECharacteristic: public BLEAttributeWithValue * @return bool true - Success, false - Failed * * @note Only for GATT client. Schedule read request to the GATT server + * Arduino requests to have read, by default, be blocking. */ - virtual bool read(); + virtual bool read(bool blocked = true); /** * @brief Write the charcteristic value diff --git a/libraries/CurieBLE/src/internal/BLECallbacks.cpp b/libraries/CurieBLE/src/internal/BLECallbacks.cpp index 568c54f8..be86552c 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 23e55f20..71318bc9 100644 --- a/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp +++ b/libraries/CurieBLE/src/internal/BLECharacteristicImp.cpp @@ -595,9 +595,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 = false; bt_conn_t* conn = NULL; if (true == BLEUtils::isLocalBLE(_ble_device)) @@ -631,12 +632,23 @@ bool BLECharacteristicImp::read() // Send read request retval = bt_gatt_read(conn, &_read_params); - bt_conn_unref(conn); if (0 == retval) { _reading = true; + ret_bool = true; + + // Block the call + if (blocked == true) + { + while (_reading == true && ret_bool) + { + delay(5); + ret_bool = _ble_device.connected(); + } + } } - return _reading; + bt_conn_unref(conn); + return ret_bool; } void BLECharacteristicImp::writeResponseReceived(struct bt_conn *conn, diff --git a/libraries/CurieBLE/src/internal/BLECharacteristicImp.h b/libraries/CurieBLE/src/internal/BLECharacteristicImp.h index 1066992c..d690d600 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 block call as per Arduino request */ - bool read(); + bool read(bool blocked = true); /** * @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. @@ -328,7 +328,7 @@ class BLECharacteristicImp: public BLEAttribute{ bt_gatt_subscribe_params_t _sub_params; bool _subscribed; - bool _reading; + volatile bool _reading; static volatile bool _gattc_writing; bt_gatt_read_params_t _read_params; // GATT read parameter