From e78aa66d57869349cce03127c20a6dc982ab4423 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Fri, 24 Jan 2025 19:45:45 +1100 Subject: [PATCH] * Bug fix: hasName(), missing return :-( * refactored methods to AdvertDataHelper.cpp --- src/helpers/AdvertDataHelpers.cpp | 53 ++++++++++++++++++++++++++++ src/helpers/AdvertDataHelpers.h | 58 ++++--------------------------- 2 files changed, 59 insertions(+), 52 deletions(-) create mode 100644 src/helpers/AdvertDataHelpers.cpp diff --git a/src/helpers/AdvertDataHelpers.cpp b/src/helpers/AdvertDataHelpers.cpp new file mode 100644 index 00000000..9a4aefb5 --- /dev/null +++ b/src/helpers/AdvertDataHelpers.cpp @@ -0,0 +1,53 @@ +#include + + uint8_t AdvertDataBuilder::encodeTo(uint8_t app_data[]) { + app_data[0] = _type; + int i = 1; + if (!(_lat == 0 && _lon == 0)) { + app_data[0] |= ADV_LATLON_MASK; + memcpy(&app_data[i], &_lat, 4); i += 4; + memcpy(&app_data[i], &_lon, 4); i += 4; + } + // TODO: BATTERY encoding + // TODO: TEMPERATURE encoding + if (_name && *_name != 0) { + app_data[0] |= ADV_NAME_MASK; + const char* sp = _name; + while (*sp && i < MAX_ADVERT_DATA_SIZE) { + app_data[i++] = *sp++; + } + } + return i; + } + + AdvertDataParser::AdvertDataParser(const uint8_t app_data[], uint8_t app_data_len) { + _name[0] = 0; + _lat = _lon = 0; + _flags = app_data[0]; + _valid = false; + + 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_BATTERY_MASK) { + /* TODO: somewhere to store battery volts? */ i += 2; + } + if (_flags & ADV_TEMPERATURE_MASK) { + /* TODO: somewhere to store temperature? */ i += 2; + } + + if (app_data_len >= i) { + int nlen = 0; + if (_flags & ADV_NAME_MASK) { + nlen = app_data_len - i; // remainder of app_data + } + if (nlen > 0) { + memcpy(_name, &app_data[i], nlen); + _name[nlen] = 0; // set null terminator + MESH_DEBUG_PRINTLN("AdvertDataParser: _flags=%u, _name=%s", (uint32_t)_flags, _name); + } + _valid = true; + } + } diff --git a/src/helpers/AdvertDataHelpers.h b/src/helpers/AdvertDataHelpers.h index 985e28bc..1c8f3517 100644 --- a/src/helpers/AdvertDataHelpers.h +++ b/src/helpers/AdvertDataHelpers.h @@ -2,11 +2,12 @@ #include #include +#include -#define ADV_TYPE_NONE 0 // unknown +#define ADV_TYPE_NONE 0 #define ADV_TYPE_CHAT 1 #define ADV_TYPE_REPEATER 2 -#define ADV_TYPE_ROOM 3 // New kid on the block! +#define ADV_TYPE_ROOM 3 //FUTURE: 4..15 #define ADV_LATLON_MASK 0x10 @@ -29,25 +30,7 @@ public: * \param app_data dest array, must be MAX_ADVERT_DATA_SIZE * \returns the encoded length in bytes */ - uint8_t encodeTo(uint8_t app_data[]) { - app_data[0] = _type; - int i = 1; - if (!(_lat == 0 && _lon == 0)) { - app_data[0] |= ADV_LATLON_MASK; - memcpy(&app_data[i], &_lat, 4); i += 4; - memcpy(&app_data[i], &_lon, 4); i += 4; - } - // TODO: BATTERY encoding - // TODO: TEMPERATURE encoding - if (_name && *_name != 0) { - app_data[0] |= ADV_NAME_MASK; - const char* sp = _name; - while (*sp && i < MAX_ADVERT_DATA_SIZE) { - app_data[i++] = *sp++; - } - } - return i; - } + uint8_t encodeTo(uint8_t app_data[]); }; class AdvertDataParser { @@ -56,41 +39,12 @@ class AdvertDataParser { char _name[MAX_ADVERT_DATA_SIZE]; int32_t _lat, _lon; public: - AdvertDataParser(const uint8_t app_data[], uint8_t app_data_len) { - _name[0] = 0; - _lat = _lon = 0; - _flags = app_data[0]; - _valid = false; - - 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_BATTERY_MASK) { - /* TODO: somewhere to store battery volts? */ i += 2; - } - if (_flags & ADV_TEMPERATURE_MASK) { - /* TODO: somewhere to store temperature? */ i += 2; - } - - if (app_data_len >= i) { - int nlen = 0; - if (_flags & ADV_NAME_MASK) { - nlen = app_data_len - i; // remainder of app_data - } - if (nlen > 0) { - memcpy(_name, &app_data[i], nlen); - _name[nlen] = 0; // set null terminator - } - _valid = true; - } - } + AdvertDataParser(const uint8_t app_data[], uint8_t app_data_len); bool isValid() const { return _valid; } uint8_t getType() const { return _flags & 0x0F; } - bool hasName() const { _name[0] != 0; } + bool hasName() const { return _name[0] != 0; } const char* getName() const { return _name; } bool hasLatLon() const { return !(_lat == 0 && _lon == 0); }