From c32ec18b727e5155fd25990605fc6a0f519ad3b9 Mon Sep 17 00:00:00 2001 From: Matt Powell Date: Mon, 7 Apr 2025 22:38:09 -0500 Subject: [PATCH 1/2] Add getMTU to BLEDevice --- src/BLEDevice.cpp | 5 +++++ src/BLEDevice.h | 1 + src/local/BLELocalDevice.cpp | 11 +++++++++++ src/local/BLELocalDevice.h | 1 + 4 files changed, 18 insertions(+) diff --git a/src/BLEDevice.cpp b/src/BLEDevice.cpp index e9ca9b99..ce30ea8f 100644 --- a/src/BLEDevice.cpp +++ b/src/BLEDevice.cpp @@ -261,6 +261,11 @@ int BLEDevice::rssi() return _rssi; } +uint16_t BLEDevice::getMTU() const +{ + return ATT.mtu(ATT.connectionHandle(_addressType, _address)); +} + bool BLEDevice::connect() { return ATT.connect(_addressType, _address); diff --git a/src/BLEDevice.h b/src/BLEDevice.h index bf710744..bc51f52e 100644 --- a/src/BLEDevice.h +++ b/src/BLEDevice.h @@ -68,6 +68,7 @@ class BLEDevice { int manufacturerData(uint8_t value[], int length) const; virtual int rssi(); + virtual uint16_t getMTU() const; bool connect(); bool discoverAttributes(); diff --git a/src/local/BLELocalDevice.cpp b/src/local/BLELocalDevice.cpp index 5792353f..6bcdbdf7 100644 --- a/src/local/BLELocalDevice.cpp +++ b/src/local/BLELocalDevice.cpp @@ -283,6 +283,17 @@ int BLELocalDevice::rssi() return 127; } +uint16_t BLELocalDevice::getMTU() +{ + BLEDevice central = ATT.central(); + + if (central) { + return central.getMTU(); + } + + return -1; +} + bool BLELocalDevice::setAdvertisedServiceUuid(const char* advertisedServiceUuid) { return _advertisingData.setAdvertisedServiceUuid(advertisedServiceUuid); diff --git a/src/local/BLELocalDevice.h b/src/local/BLELocalDevice.h index 6c45c063..cf9f1929 100644 --- a/src/local/BLELocalDevice.h +++ b/src/local/BLELocalDevice.h @@ -47,6 +47,7 @@ class BLELocalDevice { virtual String address() const; virtual int rssi(); + virtual uint16_t getMTU(); virtual bool setAdvertisedServiceUuid(const char* advertisedServiceUuid); virtual bool setAdvertisedService(const BLEService& service); From 26001eeffbf3601816a8e24992a3dde8de0e8efb Mon Sep 17 00:00:00 2001 From: Matt Powell Date: Tue, 8 Apr 2025 17:55:16 -0500 Subject: [PATCH 2/2] Allow changing value size after initialization --- src/BLECharacteristic.cpp | 12 ++++++++++++ src/BLECharacteristic.h | 1 + src/BLEDevice.h | 1 + src/local/BLELocalCharacteristic.cpp | 14 ++++++++++++++ src/local/BLELocalCharacteristic.h | 1 + src/utility/ATT.cpp | 6 ++++++ src/utility/ATT.h | 2 +- 7 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/BLECharacteristic.cpp b/src/BLECharacteristic.cpp index bfaee3ff..66cfe50a 100644 --- a/src/BLECharacteristic.cpp +++ b/src/BLECharacteristic.cpp @@ -109,6 +109,18 @@ uint8_t BLECharacteristic::properties() const return 0; } +bool BLECharacteristic::setValueSize(uint16_t valueSize) { + if (_local) { + return _local->setValueSize(valueSize); + } + + if (_remote) { + //_remote->setValueLength(); + } + + return false; +} + int BLECharacteristic::valueSize() const { if (_local) { diff --git a/src/BLECharacteristic.h b/src/BLECharacteristic.h index da9721e0..3e3baffb 100644 --- a/src/BLECharacteristic.h +++ b/src/BLECharacteristic.h @@ -54,6 +54,7 @@ class BLECharacteristic { uint8_t properties() const; + bool setValueSize(uint16_t valueSize); int valueSize() const; const uint8_t* value() const; int valueLength() const; diff --git a/src/BLEDevice.h b/src/BLEDevice.h index bc51f52e..274889be 100644 --- a/src/BLEDevice.h +++ b/src/BLEDevice.h @@ -28,6 +28,7 @@ enum BLEDeviceEvent { BLEConnected = 0, BLEDisconnected = 1, BLEDiscovered = 2, + BLEMtuChanged = 3, BLEDeviceLastEvent }; diff --git a/src/local/BLELocalCharacteristic.cpp b/src/local/BLELocalCharacteristic.cpp index 207425bd..b97b7fde 100644 --- a/src/local/BLELocalCharacteristic.cpp +++ b/src/local/BLELocalCharacteristic.cpp @@ -89,6 +89,20 @@ uint8_t BLELocalCharacteristic::permissions() const { return _permissions; } +bool BLELocalCharacteristic::setValueSize(uint16_t valueSize) { + if (valueSize == _valueSize) { + return true; + } + + if (_valueLength > 0 && valueSize < _valueLength) { + return false; + } + + _value = (uint8_t*)realloc(_value, valueSize); + _valueSize = valueSize; + return true; +} + int BLELocalCharacteristic::valueSize() const { return _valueSize; diff --git a/src/local/BLELocalCharacteristic.h b/src/local/BLELocalCharacteristic.h index 331cdd5c..57b91b23 100644 --- a/src/local/BLELocalCharacteristic.h +++ b/src/local/BLELocalCharacteristic.h @@ -42,6 +42,7 @@ class BLELocalCharacteristic : public BLELocalAttribute { uint8_t properties() const; uint8_t permissions() const; + bool setValueSize(uint16_t valueSize); int valueSize() const; const uint8_t* value() const; int valueLength() const; diff --git a/src/utility/ATT.cpp b/src/utility/ATT.cpp index 9367cfbf..7876d8c8 100644 --- a/src/utility/ATT.cpp +++ b/src/utility/ATT.cpp @@ -689,6 +689,9 @@ void ATTClass::mtuReq(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]) for (int i = 0; i < ATT_MAX_PEERS; i++) { if (_peers[i].connectionHandle == connectionHandle) { _peers[i].mtu = mtu; + if (_eventHandlers[BLEMtuChanged]) { + _eventHandlers[BLEMtuChanged](BLEDevice(_peers[i].addressType, _peers[i].address)); + } break; } } @@ -722,6 +725,9 @@ void ATTClass::mtuResp(uint16_t connectionHandle, uint8_t dlen, uint8_t data[]) for (int i = 0; i < ATT_MAX_PEERS; i++) { if (_peers[i].connectionHandle == connectionHandle) { _peers[i].mtu = mtu; + // if (_eventHandlers[BLEMtuChanged]) { + // _eventHandlers[BLEMtuChanged](BLEDevice(_peers[i].addressType, _peers[i].address)); + // } break; } } diff --git a/src/utility/ATT.h b/src/utility/ATT.h index c9f007f9..f4a2efbd 100644 --- a/src/utility/ATT.h +++ b/src/utility/ATT.h @@ -169,7 +169,7 @@ class ATTClass { uint8_t length; } _pendingResp; - BLEDeviceEventHandler _eventHandlers[2]; + BLEDeviceEventHandler _eventHandlers[BLEDeviceLastEvent]; }; extern ATTClass& ATT;