From ab7509f8b6d4c69157d7bbf761d436fa5c234471 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 8 Apr 2025 11:47:42 +0200 Subject: [PATCH 1/5] Make handleNotify and handleInd return written bytes per peer --- src/utility/ATT.cpp | 8 ++++---- src/utility/ATT.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/utility/ATT.cpp b/src/utility/ATT.cpp index 5d920a32..ba717543 100644 --- a/src/utility/ATT.cpp +++ b/src/utility/ATT.cpp @@ -598,7 +598,7 @@ BLEDevice ATTClass::central() return BLEDevice(); } -bool ATTClass::handleNotify(uint16_t handle, const uint8_t* value, int length) +int ATTClass::handleNotify(uint16_t handle, const uint8_t* value, int length) { int numNotifications = 0; @@ -626,10 +626,10 @@ bool ATTClass::handleNotify(uint16_t handle, const uint8_t* value, int length) numNotifications++; } - return (numNotifications > 0); + return (numNotifications > 0) ? length : 0; } -bool ATTClass::handleInd(uint16_t handle, const uint8_t* value, int length) +int ATTClass::handleInd(uint16_t handle, const uint8_t* value, int length) { int numIndications = 0; @@ -666,7 +666,7 @@ bool ATTClass::handleInd(uint16_t handle, const uint8_t* value, int length) numIndications++; } - return (numIndications > 0); + return (numIndications > 0) ? length : 0; } void ATTClass::error(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]) diff --git a/src/utility/ATT.h b/src/utility/ATT.h index c9f007f9..9cf203a6 100644 --- a/src/utility/ATT.h +++ b/src/utility/ATT.h @@ -83,8 +83,8 @@ class ATTClass { virtual BLEDevice central(); - virtual bool handleNotify(uint16_t handle, const uint8_t* value, int length); - virtual bool handleInd(uint16_t handle, const uint8_t* value, int length); + virtual int handleNotify(uint16_t handle, const uint8_t* value, int length); + virtual int handleInd(uint16_t handle, const uint8_t* value, int length); virtual void setEventHandler(BLEDeviceEvent event, BLEDeviceEventHandler eventHandler); From 1619dd00f7d46d1532da5c1a469129f91e7f11eb Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 8 Apr 2025 15:17:47 +0200 Subject: [PATCH 2/5] BLE.setAdvertisedServiceData: adopt _valueLength limit --- src/local/BLELocalCharacteristic.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/local/BLELocalCharacteristic.cpp b/src/local/BLELocalCharacteristic.cpp index 207425bd..83cb0142 100644 --- a/src/local/BLELocalCharacteristic.cpp +++ b/src/local/BLELocalCharacteristic.cpp @@ -126,9 +126,7 @@ int BLELocalCharacteristic::writeValue(const uint8_t value[], int length) if (_broadcast) { uint16_t serviceUuid = GATT.serviceUuidForCharacteristic(this); - - BLE.setAdvertisedServiceData(serviceUuid, value, length); - + BLE.setAdvertisedServiceData(serviceUuid, value, _valueLength); if (!ATT.connected() && GAP.advertising()) { BLE.advertise(); } From 5d221551f367c18538714c3015467d3c8531e02f Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 8 Apr 2025 15:18:45 +0200 Subject: [PATCH 3/5] writeValue: return the number of bytes written/stored in buffer --- src/local/BLELocalCharacteristic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/local/BLELocalCharacteristic.cpp b/src/local/BLELocalCharacteristic.cpp index 83cb0142..dc8a819d 100644 --- a/src/local/BLELocalCharacteristic.cpp +++ b/src/local/BLELocalCharacteristic.cpp @@ -132,7 +132,7 @@ int BLELocalCharacteristic::writeValue(const uint8_t value[], int length) } } - return 1; + return _valueLength; } int BLELocalCharacteristic::writeValue(const char* value) From 2a4e4b58faae9c3ec04e26c0925310ccc47899bd Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 10 Apr 2025 15:04:56 +0200 Subject: [PATCH 4/5] Add writeValue tests --- extras/test/CMakeLists.txt | 1 + .../test_characteristic/test_writeValue.cpp | 165 ++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 extras/test/src/test_characteristic/test_writeValue.cpp diff --git a/extras/test/CMakeLists.txt b/extras/test/CMakeLists.txt index a90fc5aa..5e66e18b 100644 --- a/extras/test/CMakeLists.txt +++ b/extras/test/CMakeLists.txt @@ -100,6 +100,7 @@ set(TEST_TARGET_CHARACTERISTIC_SRCS # Test files ${COMMON_TEST_SRCS} src/test_characteristic/test_permissions.cpp + src/test_characteristic/test_writeValue.cpp # DUT files ${DUT_SRCS} # Fake classes files diff --git a/extras/test/src/test_characteristic/test_writeValue.cpp b/extras/test/src/test_characteristic/test_writeValue.cpp new file mode 100644 index 00000000..9ada440a --- /dev/null +++ b/extras/test/src/test_characteristic/test_writeValue.cpp @@ -0,0 +1,165 @@ +/* + This file is part of the ArduinoBLE library. + Copyright (c) 2018 Arduino SA. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include + +#define private public +#define protected public + +#include "FakeBLELocalDevice.h" +#include "BLEAdvertisingData.h" +#include "BLETypedCharacteristics.h" +#include "BLELocalCharacteristic.h" +#include "BLEStringCharacteristic.h" +#include "BLEProperty.h" + + +TEST_CASE("Test characteristic writeValue", "[ArduinoBLE::BLECharacteristic]") +{ + WHEN("Create a bool characteristic") + { + BLEBoolCharacteristic boolCharacteristic("Bool", BLERead | BLEIndicate | BLEWrite); + bool v = false;; + int written = boolCharacteristic.writeValue(v); + REQUIRE( written == sizeof(bool) ); + } + + WHEN("Create a boolean characteristic") + { + BLEBooleanCharacteristic booleanCharacteristic("Boolean", BLERead | BLEIndicate | BLEWrite); + bool v = false; + int written = booleanCharacteristic.writeValue(v); + REQUIRE( written == sizeof(bool) ); + } + + WHEN("Create a char characteristic") + { + BLECharCharacteristic charCharacteristic("Char", BLERead | BLEIndicate | BLEWrite); + char v = 'a'; + int written = charCharacteristic.writeValue(v); + REQUIRE( written == sizeof(char) ); + } + + WHEN("Create a unsigned char characteristic") + { + BLEUnsignedCharCharacteristic unsignedCharCharacteristic("UnsignedChar", BLERead | BLEIndicate | BLEWrite); + unsigned char v = 0x01; + int written = unsignedCharCharacteristic.writeValue(v); + REQUIRE( written == sizeof(unsigned char) ); + } + + WHEN("Create a byte characteristic") + { + BLEByteCharacteristic byteCharacteristic("Byte", BLERead | BLEIndicate | BLEWrite); + byte v = 0x01; + int written = byteCharacteristic.writeValue(v); + REQUIRE( written == sizeof(byte) ); + } + + WHEN("Create a short characteristic") + { + BLEShortCharacteristic shortCharacteristic("Short", BLERead | BLEIndicate | BLEWrite); + short v = -1; + int written = shortCharacteristic.writeValue(v); + REQUIRE( written == sizeof(short) ); + } + + WHEN("Create a unsigned short characteristic") + { + BLEUnsignedShortCharacteristic unsignedShortCharacteristic("UnsignedShort", BLERead | BLEIndicate | BLEWrite); + unsigned short v = 1; + int written = unsignedShortCharacteristic.writeValue(v); + REQUIRE( written == sizeof(unsigned short) ); + } + + WHEN("Create a word characteristic") + { + BLEWordCharacteristic wordCharacteristic("Word", BLERead | BLEIndicate | BLEWrite); + word v = -1; + int written = wordCharacteristic.writeValue(v); + REQUIRE( written == sizeof(word) ); + } + + WHEN("Create a int characteristic") + { + BLEIntCharacteristic intCharacteristic("Int", BLERead | BLEIndicate | BLEWrite); + int v = -1; + int written = intCharacteristic.writeValue(v); + REQUIRE( written == sizeof(int) ); + } + + WHEN("Create a unsigned int characteristic") + { + BLEUnsignedIntCharacteristic unsignedIntCharacteristic("UnsignedInt", BLERead | BLEIndicate | BLEWrite); + unsigned int v = 1; + int written = unsignedIntCharacteristic.writeValue(v); + REQUIRE( written == sizeof(unsigned int) ); + } + + WHEN("Create a long characteristic") + { + BLELongCharacteristic longCharacteristic("Long", BLERead | BLEIndicate | BLEWrite); + long v = -1; + int written = longCharacteristic.writeValue(v); + REQUIRE( written == sizeof(long) ); + } + + WHEN("Create a unsigned long characteristic") + { + BLEUnsignedLongCharacteristic unsignedLongCharacteristic("UnsignedLong", BLERead | BLEIndicate | BLEWrite); + unsigned long v = 1; + int written = unsignedLongCharacteristic.writeValue(v); + REQUIRE( written == sizeof(unsigned long) ); + } + + WHEN("Create a float characteristic") + { + BLEFloatCharacteristic floatCharacteristic("Float", BLERead | BLEIndicate | BLEWrite); + float v = -1.0f; + int written = floatCharacteristic.writeValue(v); + REQUIRE( written == sizeof(float) ); + } + + WHEN("Create a double characteristic") + { + BLEDoubleCharacteristic doubleCharacteristic("Double", BLERead | BLEIndicate | BLEWrite); + double v = -1.0; + int written = doubleCharacteristic.writeValue(v); + REQUIRE( written == sizeof(double) ); + } + + WHEN("Create a string characteristic") + { + const int maxStringLength = 64; + BLEStringCharacteristic stringCharacteristic("String", BLERead | BLEIndicate | BLEWrite, maxStringLength); + const char* v = "Hello"; + int written = stringCharacteristic.writeValue(v); + REQUIRE( written == min(strlen(v), maxStringLength) ); + } + + WHEN("Create a too long string characteristic") + { + const int maxStringLength = 4; + BLEStringCharacteristic stringCharacteristic("String", BLERead | BLEIndicate | BLEWrite, maxStringLength); + const char* v = "Hello"; + int written = stringCharacteristic.writeValue(v); + REQUIRE( written == min(strlen(v), maxStringLength) ); + } + +} From 240c74fa55583eae30f103aa0be0c66a39146b88 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 10 Apr 2025 15:47:02 +0200 Subject: [PATCH 5/5] test: check broadcast handleInt and handleNotify with no peers --- .../test_characteristic/test_writeValue.cpp | 256 ++++++++++++++++-- 1 file changed, 240 insertions(+), 16 deletions(-) diff --git a/extras/test/src/test_characteristic/test_writeValue.cpp b/extras/test/src/test_characteristic/test_writeValue.cpp index 9ada440a..6c7e1cd1 100644 --- a/extras/test/src/test_characteristic/test_writeValue.cpp +++ b/extras/test/src/test_characteristic/test_writeValue.cpp @@ -34,132 +34,356 @@ TEST_CASE("Test characteristic writeValue", "[ArduinoBLE::BLECharacteristic]") { WHEN("Create a bool characteristic") { - BLEBoolCharacteristic boolCharacteristic("Bool", BLERead | BLEIndicate | BLEWrite); + BLEBoolCharacteristic boolCharacteristic("Bool", BLEBroadcast| BLEIndicate | BLENotify ); bool v = false;; int written = boolCharacteristic.writeValue(v); REQUIRE( written == sizeof(bool) ); + + boolCharacteristic.broadcast(); + written = boolCharacteristic.writeValue(v); + REQUIRE( written == sizeof(bool) ); + + BLEDevice device; + boolCharacteristic.local()->writeCccdValue(device, 0x002); + written = boolCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + boolCharacteristic.local()->writeCccdValue(device, 0x001); + written = boolCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a boolean characteristic") { - BLEBooleanCharacteristic booleanCharacteristic("Boolean", BLERead | BLEIndicate | BLEWrite); + BLEBooleanCharacteristic booleanCharacteristic("Boolean", BLEBroadcast| BLEIndicate | BLENotify); bool v = false; int written = booleanCharacteristic.writeValue(v); REQUIRE( written == sizeof(bool) ); + + booleanCharacteristic.broadcast(); + written = booleanCharacteristic.writeValue(v); + REQUIRE( written == sizeof(bool) ); + + BLEDevice device; + booleanCharacteristic.local()->writeCccdValue(device, 0x002); + written = booleanCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + booleanCharacteristic.local()->writeCccdValue(device, 0x001); + written = booleanCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a char characteristic") { - BLECharCharacteristic charCharacteristic("Char", BLERead | BLEIndicate | BLEWrite); + BLECharCharacteristic charCharacteristic("Char", BLEBroadcast| BLEIndicate | BLENotify); char v = 'a'; int written = charCharacteristic.writeValue(v); REQUIRE( written == sizeof(char) ); + + charCharacteristic.broadcast(); + written = charCharacteristic.writeValue(v); + REQUIRE( written == sizeof(char) ); + + BLEDevice device; + charCharacteristic.local()->writeCccdValue(device, 0x002); + written = charCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + charCharacteristic.local()->writeCccdValue(device, 0x001); + written = charCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a unsigned char characteristic") { - BLEUnsignedCharCharacteristic unsignedCharCharacteristic("UnsignedChar", BLERead | BLEIndicate | BLEWrite); + BLEUnsignedCharCharacteristic unsignedCharCharacteristic("UnsignedChar", BLEBroadcast| BLEIndicate | BLENotify); unsigned char v = 0x01; int written = unsignedCharCharacteristic.writeValue(v); REQUIRE( written == sizeof(unsigned char) ); + + unsignedCharCharacteristic.broadcast(); + written = unsignedCharCharacteristic.writeValue(v); + REQUIRE( written == sizeof(unsigned char) ); + + BLEDevice device; + unsignedCharCharacteristic.local()->writeCccdValue(device, 0x002); + written = unsignedCharCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + unsignedCharCharacteristic.local()->writeCccdValue(device, 0x001); + written = unsignedCharCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a byte characteristic") { - BLEByteCharacteristic byteCharacteristic("Byte", BLERead | BLEIndicate | BLEWrite); + BLEByteCharacteristic byteCharacteristic("Byte", BLEBroadcast| BLEIndicate | BLENotify); byte v = 0x01; int written = byteCharacteristic.writeValue(v); REQUIRE( written == sizeof(byte) ); + + byteCharacteristic.broadcast(); + written = byteCharacteristic.writeValue(v); + REQUIRE( written == sizeof(byte) ); + + BLEDevice device; + byteCharacteristic.local()->writeCccdValue(device, 0x002); + written = byteCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + byteCharacteristic.local()->writeCccdValue(device, 0x001); + written = byteCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a short characteristic") { - BLEShortCharacteristic shortCharacteristic("Short", BLERead | BLEIndicate | BLEWrite); + BLEShortCharacteristic shortCharacteristic("Short", BLEBroadcast| BLEIndicate | BLENotify); short v = -1; int written = shortCharacteristic.writeValue(v); REQUIRE( written == sizeof(short) ); + + shortCharacteristic.broadcast(); + written = shortCharacteristic.writeValue(v); + REQUIRE( written == sizeof(short) ); + + BLEDevice device; + shortCharacteristic.local()->writeCccdValue(device, 0x002); + written = shortCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + shortCharacteristic.local()->writeCccdValue(device, 0x001); + written = shortCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a unsigned short characteristic") { - BLEUnsignedShortCharacteristic unsignedShortCharacteristic("UnsignedShort", BLERead | BLEIndicate | BLEWrite); + BLEUnsignedShortCharacteristic unsignedShortCharacteristic("UnsignedShort", BLEBroadcast| BLEIndicate | BLENotify); unsigned short v = 1; int written = unsignedShortCharacteristic.writeValue(v); REQUIRE( written == sizeof(unsigned short) ); + + unsignedShortCharacteristic.broadcast(); + written = unsignedShortCharacteristic.writeValue(v); + REQUIRE( written == sizeof(unsigned short) ); + + BLEDevice device; + unsignedShortCharacteristic.local()->writeCccdValue(device, 0x002); + written = unsignedShortCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + unsignedShortCharacteristic.local()->writeCccdValue(device, 0x001); + written = unsignedShortCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a word characteristic") { - BLEWordCharacteristic wordCharacteristic("Word", BLERead | BLEIndicate | BLEWrite); + BLEWordCharacteristic wordCharacteristic("Word", BLEBroadcast| BLEIndicate | BLENotify); word v = -1; int written = wordCharacteristic.writeValue(v); REQUIRE( written == sizeof(word) ); + + wordCharacteristic.broadcast(); + written = wordCharacteristic.writeValue(v); + REQUIRE( written == sizeof(word) ); + + BLEDevice device; + wordCharacteristic.local()->writeCccdValue(device, 0x002); + written = wordCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + wordCharacteristic.local()->writeCccdValue(device, 0x001); + written = wordCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a int characteristic") { - BLEIntCharacteristic intCharacteristic("Int", BLERead | BLEIndicate | BLEWrite); + BLEIntCharacteristic intCharacteristic("Int", BLEBroadcast| BLEIndicate | BLENotify); int v = -1; int written = intCharacteristic.writeValue(v); REQUIRE( written == sizeof(int) ); + + intCharacteristic.broadcast(); + written = intCharacteristic.writeValue(v); + REQUIRE( written == sizeof(int) ); + + BLEDevice device; + intCharacteristic.local()->writeCccdValue(device, 0x002); + written = intCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + intCharacteristic.local()->writeCccdValue(device, 0x001); + written = intCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a unsigned int characteristic") { - BLEUnsignedIntCharacteristic unsignedIntCharacteristic("UnsignedInt", BLERead | BLEIndicate | BLEWrite); + BLEUnsignedIntCharacteristic unsignedIntCharacteristic("UnsignedInt", BLEBroadcast| BLEIndicate | BLENotify); unsigned int v = 1; int written = unsignedIntCharacteristic.writeValue(v); REQUIRE( written == sizeof(unsigned int) ); + + unsignedIntCharacteristic.broadcast(); + written = unsignedIntCharacteristic.writeValue(v); + REQUIRE( written == sizeof(unsigned int) ); + + BLEDevice device; + unsignedIntCharacteristic.local()->writeCccdValue(device, 0x002); + written = unsignedIntCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + unsignedIntCharacteristic.local()->writeCccdValue(device, 0x001); + written = unsignedIntCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a long characteristic") { - BLELongCharacteristic longCharacteristic("Long", BLERead | BLEIndicate | BLEWrite); + BLELongCharacteristic longCharacteristic("Long", BLEBroadcast| BLEIndicate | BLENotify); long v = -1; int written = longCharacteristic.writeValue(v); REQUIRE( written == sizeof(long) ); + + longCharacteristic.broadcast(); + written = longCharacteristic.writeValue(v); + REQUIRE( written == sizeof(long) ); + + BLEDevice device; + longCharacteristic.local()->writeCccdValue(device, 0x002); + written = longCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + longCharacteristic.local()->writeCccdValue(device, 0x001); + written = longCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a unsigned long characteristic") { - BLEUnsignedLongCharacteristic unsignedLongCharacteristic("UnsignedLong", BLERead | BLEIndicate | BLEWrite); + BLEUnsignedLongCharacteristic unsignedLongCharacteristic("UnsignedLong", BLEBroadcast| BLEIndicate | BLENotify); unsigned long v = 1; int written = unsignedLongCharacteristic.writeValue(v); REQUIRE( written == sizeof(unsigned long) ); + + unsignedLongCharacteristic.broadcast(); + written = unsignedLongCharacteristic.writeValue(v); + REQUIRE( written == sizeof(unsigned long) ); + + BLEDevice device; + unsignedLongCharacteristic.local()->writeCccdValue(device, 0x002); + written = unsignedLongCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + unsignedLongCharacteristic.local()->writeCccdValue(device, 0x001); + written = unsignedLongCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a float characteristic") { - BLEFloatCharacteristic floatCharacteristic("Float", BLERead | BLEIndicate | BLEWrite); + BLEFloatCharacteristic floatCharacteristic("Float", BLEBroadcast| BLEIndicate | BLENotify); float v = -1.0f; int written = floatCharacteristic.writeValue(v); REQUIRE( written == sizeof(float) ); + + floatCharacteristic.broadcast(); + written = floatCharacteristic.writeValue(v); + REQUIRE( written == sizeof(float) ); + + BLEDevice device; + floatCharacteristic.local()->writeCccdValue(device, 0x002); + written = floatCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + floatCharacteristic.local()->writeCccdValue(device, 0x001); + written = floatCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a double characteristic") { - BLEDoubleCharacteristic doubleCharacteristic("Double", BLERead | BLEIndicate | BLEWrite); + BLEDoubleCharacteristic doubleCharacteristic("Double", BLEBroadcast| BLEIndicate | BLENotify); double v = -1.0; int written = doubleCharacteristic.writeValue(v); REQUIRE( written == sizeof(double) ); + + doubleCharacteristic.broadcast(); + written = doubleCharacteristic.writeValue(v); + REQUIRE( written == sizeof(double) ); + + BLEDevice device; + doubleCharacteristic.local()->writeCccdValue(device, 0x002); + written = doubleCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + doubleCharacteristic.local()->writeCccdValue(device, 0x001); + written = doubleCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a string characteristic") { const int maxStringLength = 64; - BLEStringCharacteristic stringCharacteristic("String", BLERead | BLEIndicate | BLEWrite, maxStringLength); + BLEStringCharacteristic stringCharacteristic("String", BLEBroadcast| BLEIndicate | BLENotify, maxStringLength); const char* v = "Hello"; int written = stringCharacteristic.writeValue(v); REQUIRE( written == min(strlen(v), maxStringLength) ); + + stringCharacteristic.broadcast(); + written = stringCharacteristic.writeValue(v); + REQUIRE( written == min(strlen(v), maxStringLength) ); + + BLEDevice device; + stringCharacteristic.local()->writeCccdValue(device, 0x002); + written = stringCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + stringCharacteristic.local()->writeCccdValue(device, 0x001); + written = stringCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } WHEN("Create a too long string characteristic") { const int maxStringLength = 4; - BLEStringCharacteristic stringCharacteristic("String", BLERead | BLEIndicate | BLEWrite, maxStringLength); + BLEStringCharacteristic stringCharacteristic("String", BLEBroadcast| BLEIndicate | BLENotify, maxStringLength); const char* v = "Hello"; int written = stringCharacteristic.writeValue(v); REQUIRE( written == min(strlen(v), maxStringLength) ); + + stringCharacteristic.broadcast(); + written = stringCharacteristic.writeValue(v); + REQUIRE( written == min(strlen(v), maxStringLength) ); + + BLEDevice device; + stringCharacteristic.local()->writeCccdValue(device, 0x002); + written = stringCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); + stringCharacteristic.local()->writeCccdValue(device, 0x001); + written = stringCharacteristic.writeValue(v); + /* No peers connected */ + REQUIRE( written == 0 ); } }