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.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..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 }; @@ -68,6 +69,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/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/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); 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;