Skip to content

Commit 19e8d72

Browse files
committed
Allow setting advertising parameters multiple time
If the new value for the parameter is not valid, because too large, then the old value will remain the actual value of the parameter.
1 parent d03c74c commit 19e8d72

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

src/BLEAdvertisingData.cpp

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ BLEAdvertisingData::BLEAdvertisingData() :
2626
_rawData(NULL),
2727
_rawDataLength(0),
2828
_advertisedServiceUuid(NULL),
29+
_advertisedServiceUuidLength(0),
2930
_manufacturerData(NULL),
3031
_manufacturerDataLength(0),
3132
_manufacturerCompanyId(0),
@@ -43,10 +44,11 @@ BLEAdvertisingData::~BLEAdvertisingData()
4344
{
4445
}
4546

46-
inline bool BLEAdvertisingData::updateRemainingLength(int fieldLength)
47+
inline bool BLEAdvertisingData::updateRemainingLength(int oldFieldLength, int newFieldLength)
4748
{
48-
if (fieldLength <= _remainingLength) {
49-
_remainingLength -= fieldLength;
49+
int updatedRemaining = _remainingLength + (oldFieldLength - newFieldLength);
50+
if (updatedRemaining >= 0) {
51+
_remainingLength = updatedRemaining;
5052
return true;
5153
}
5254
return false;
@@ -75,6 +77,7 @@ void BLEAdvertisingData::clear()
7577
_manufacturerDataLength = 0;
7678
_hasManufacturerCompanyId = false;
7779
_advertisedServiceUuid = NULL;
80+
_advertisedServiceUuidLength = 0;
7881
_serviceData = NULL;
7982
_serviceDataLength = 0;
8083
}
@@ -92,6 +95,7 @@ void BLEAdvertisingData::copy(const BLEAdvertisingData& adv)
9295
_manufacturerCompanyId = adv._manufacturerCompanyId;
9396
_hasManufacturerCompanyId = adv._hasManufacturerCompanyId;
9497
_advertisedServiceUuid = adv._advertisedServiceUuid;
98+
_advertisedServiceUuidLength = adv._advertisedServiceUuidLength;
9599
_serviceDataUuid = adv._serviceDataUuid;
96100
_serviceData = adv._serviceData;
97101
_serviceDataLength = adv._serviceDataLength;
@@ -106,9 +110,11 @@ BLEAdvertisingData& BLEAdvertisingData::operator=(const BLEAdvertisingData &othe
106110
bool BLEAdvertisingData::setAdvertisedServiceUuid(const char* advertisedServiceUuid)
107111
{
108112
BLEUuid uuid(advertisedServiceUuid);
109-
bool success = updateRemainingLength(uuid.length() + AD_FIELD_OVERHEAD);
113+
int previousLength = (_advertisedServiceUuidLength > 0) ? (_advertisedServiceUuidLength + AD_FIELD_OVERHEAD) : 0;
114+
bool success = updateRemainingLength(previousLength, (uuid.length() + AD_FIELD_OVERHEAD));
110115
if (success) {
111116
_advertisedServiceUuid = advertisedServiceUuid;
117+
_advertisedServiceUuidLength = uuid.length();
112118
}
113119
return success;
114120
}
@@ -120,7 +126,14 @@ bool BLEAdvertisingData::setAdvertisedService(const BLEService& service)
120126

121127
bool BLEAdvertisingData::setManufacturerData(const uint8_t manufacturerData[], int manufacturerDataLength)
122128
{
123-
bool success = updateRemainingLength(manufacturerDataLength + AD_FIELD_OVERHEAD);
129+
int previousLength = 0;
130+
if (_manufacturerDataLength) {
131+
previousLength = _manufacturerDataLength + AD_FIELD_OVERHEAD;
132+
if (_hasManufacturerCompanyId) {
133+
previousLength += sizeof(_manufacturerCompanyId);
134+
}
135+
}
136+
bool success = updateRemainingLength(previousLength, (manufacturerDataLength + AD_FIELD_OVERHEAD));
124137
if (success) {
125138
_manufacturerData = manufacturerData;
126139
_manufacturerDataLength = manufacturerDataLength;
@@ -131,7 +144,14 @@ bool BLEAdvertisingData::setManufacturerData(const uint8_t manufacturerData[], i
131144

132145
bool BLEAdvertisingData::setManufacturerData(const uint16_t companyId, const uint8_t manufacturerData[], int manufacturerDataLength)
133146
{
134-
bool success = updateRemainingLength(manufacturerDataLength + sizeof(companyId) + AD_FIELD_OVERHEAD);
147+
int previousLength = 0;
148+
if (_manufacturerDataLength) {
149+
previousLength = _manufacturerDataLength + AD_FIELD_OVERHEAD;
150+
if (_hasManufacturerCompanyId) {
151+
previousLength += sizeof(_manufacturerCompanyId);
152+
}
153+
}
154+
bool success = updateRemainingLength(previousLength, (manufacturerDataLength + sizeof(companyId) + AD_FIELD_OVERHEAD));
135155
if (success) {
136156
_manufacturerData = manufacturerData;
137157
_manufacturerDataLength = manufacturerDataLength;
@@ -143,7 +163,8 @@ bool BLEAdvertisingData::setManufacturerData(const uint16_t companyId, const uin
143163

144164
bool BLEAdvertisingData::setAdvertisedServiceData(uint16_t uuid, const uint8_t data[], int length)
145165
{
146-
bool success = updateRemainingLength(length + sizeof(uuid) + AD_FIELD_OVERHEAD);
166+
int previousLength = (_serviceDataLength > 0) ? (_serviceDataLength + sizeof(uuid) + AD_FIELD_OVERHEAD) : 0;
167+
bool success = updateRemainingLength(previousLength, (length + sizeof(uuid) + AD_FIELD_OVERHEAD));
147168
if (success) {
148169
_serviceDataUuid = uuid;
149170
_serviceData = data;
@@ -154,7 +175,8 @@ bool BLEAdvertisingData::setAdvertisedServiceData(uint16_t uuid, const uint8_t d
154175

155176
bool BLEAdvertisingData::setLocalName(const char *localName)
156177
{
157-
bool success = updateRemainingLength(strlen(localName) + AD_FIELD_OVERHEAD);
178+
int previousLength = (_localName && strlen(_localName) > 0) ? (strlen(_localName) + AD_FIELD_OVERHEAD) : 0;
179+
bool success = updateRemainingLength(previousLength, (strlen(localName) + AD_FIELD_OVERHEAD));
158180
if (success) {
159181
_localName = localName;
160182
}
@@ -183,7 +205,8 @@ bool BLEAdvertisingData::setRawData(const BLEAdvertisingRawData& rawData)
183205

184206
bool BLEAdvertisingData::setFlags(uint8_t flags)
185207
{
186-
bool success = updateRemainingLength(sizeof(flags) + AD_FIELD_OVERHEAD);
208+
int previousLength = (_hasFlags) ? (sizeof(_flags) + AD_FIELD_OVERHEAD) : 0;
209+
bool success = updateRemainingLength(previousLength, (sizeof(flags) + AD_FIELD_OVERHEAD));
187210
if (success) {
188211
_hasFlags = true;
189212
_flags = flags;

src/BLEAdvertisingData.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class BLEAdvertisingData {
8080
bool hasFlags() const;
8181

8282
private:
83-
bool updateRemainingLength(int fieldLength);
83+
bool updateRemainingLength(int oldFieldLength, int newFieldLength);
8484

8585
bool addAdvertisedServiceUuid(const char* advertisedServiceUuid);
8686
bool addManufacturerData(const uint8_t manufacturerData[], int manufacturerDataLength);
@@ -111,6 +111,7 @@ class BLEAdvertisingData {
111111
bool _hasManufacturerCompanyId;
112112

113113
const char* _advertisedServiceUuid;
114+
int _advertisedServiceUuidLength;
114115
uint16_t _serviceDataUuid;
115116
const uint8_t* _serviceData;
116117
int _serviceDataLength;

0 commit comments

Comments
 (0)