From 5d0a8d9d7cdd069d108ddbf863f9b1a58592f257 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Mon, 19 May 2025 23:21:57 +1000 Subject: [PATCH] * AdvertDataHelpers: reverting parsing logic, but changed meanings of 'battery' and 'temperature' to just two generic uint16 'feature' properties --- src/helpers/AdvertDataHelpers.cpp | 17 ++++++++++++++++- src/helpers/AdvertDataHelpers.h | 12 ++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/helpers/AdvertDataHelpers.cpp b/src/helpers/AdvertDataHelpers.cpp index f1aff21f..88253f61 100644 --- a/src/helpers/AdvertDataHelpers.cpp +++ b/src/helpers/AdvertDataHelpers.cpp @@ -8,6 +8,14 @@ memcpy(&app_data[i], &_lat, 4); i += 4; memcpy(&app_data[i], &_lon, 4); i += 4; } + if (_extra1) { + app_data[0] |= ADV_FEAT1_MASK; + memcpy(&app_data[i], &_extra1, 2); i += 2; + } + if (_extra2) { + app_data[0] |= ADV_FEAT2_MASK; + memcpy(&app_data[i], &_extra2, 2); i += 2; + } if (_name && *_name != 0) { app_data[0] |= ADV_NAME_MASK; const char* sp = _name; @@ -23,12 +31,19 @@ _lat = _lon = 0; _flags = app_data[0]; _valid = false; - + _extra1 = _extra2 = 0; + int i = 1; if (_flags & ADV_LATLON_MASK) { memcpy(&_lat, &app_data[i], 4); i += 4; memcpy(&_lon, &app_data[i], 4); i += 4; } + if (_flags & ADV_FEAT1_MASK) { + memcpy(&_extra1, &app_data[i], 2); i += 2; + } + if (_flags & ADV_FEAT2_MASK) { + memcpy(&_extra2, &app_data[i], 2); i += 2; + } if (app_data_len >= i) { int nlen = 0; diff --git a/src/helpers/AdvertDataHelpers.h b/src/helpers/AdvertDataHelpers.h index f41996eb..14815eac 100644 --- a/src/helpers/AdvertDataHelpers.h +++ b/src/helpers/AdvertDataHelpers.h @@ -19,14 +19,16 @@ class AdvertDataBuilder { uint8_t _type; const char* _name; int32_t _lat, _lon; + uint16_t _extra1 = 0; + uint16_t _extra2 = 0; public: AdvertDataBuilder(uint8_t adv_type) : _type(adv_type), _name(NULL), _lat(0), _lon(0) { } AdvertDataBuilder(uint8_t adv_type, const char* name) : _type(adv_type), _name(name), _lat(0), _lon(0) { } AdvertDataBuilder(uint8_t adv_type, const char* name, double lat, double lon) : _type(adv_type), _name(name), _lat(lat * 1E6), _lon(lon * 1E6) { } - void setFeat1(bool enabled) { if (enabled) _type |= ADV_FEAT1_MASK; else _type &= ~ADV_FEAT1_MASK; } - void setFeat2(bool enabled) { if (enabled) _type |= ADV_FEAT2_MASK; else _type &= ~ADV_FEAT2_MASK; } + void setFeat1(uint16_t extra) { _extra1 = extra; } + void setFeat2(uint16_t extra) { _extra2 = extra; } /** * \brief encode the given advertisement data. @@ -41,13 +43,15 @@ class AdvertDataParser { bool _valid; char _name[MAX_ADVERT_DATA_SIZE]; int32_t _lat, _lon; + uint16_t _extra1; + uint16_t _extra2; public: AdvertDataParser(const uint8_t app_data[], uint8_t app_data_len); bool isValid() const { return _valid; } uint8_t getType() const { return _flags & 0x0F; } - bool hasFeat1() const { return (_flags & ADV_FEAT1_MASK) != 0; } - bool hasFeat2() const { return (_flags & ADV_FEAT2_MASK) != 0; } + uint16_t getFeat1() const { return _extra1; } + uint16_t getFeat2() const { return _extra2; } bool hasName() const { return _name[0] != 0; } const char* getName() const { return _name; }