* Bug fix: hasName(), missing return :-(
* refactored methods to AdvertDataHelper.cpp
This commit is contained in:
53
src/helpers/AdvertDataHelpers.cpp
Normal file
53
src/helpers/AdvertDataHelpers.cpp
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#include <helpers/AdvertDataHelpers.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <Mesh.h>
|
||||||
|
|
||||||
#define ADV_TYPE_NONE 0 // unknown
|
#define ADV_TYPE_NONE 0
|
||||||
#define ADV_TYPE_CHAT 1
|
#define ADV_TYPE_CHAT 1
|
||||||
#define ADV_TYPE_REPEATER 2
|
#define ADV_TYPE_REPEATER 2
|
||||||
#define ADV_TYPE_ROOM 3 // New kid on the block!
|
#define ADV_TYPE_ROOM 3
|
||||||
//FUTURE: 4..15
|
//FUTURE: 4..15
|
||||||
|
|
||||||
#define ADV_LATLON_MASK 0x10
|
#define ADV_LATLON_MASK 0x10
|
||||||
@@ -29,25 +30,7 @@ public:
|
|||||||
* \param app_data dest array, must be MAX_ADVERT_DATA_SIZE
|
* \param app_data dest array, must be MAX_ADVERT_DATA_SIZE
|
||||||
* \returns the encoded length in bytes
|
* \returns the encoded length in bytes
|
||||||
*/
|
*/
|
||||||
uint8_t encodeTo(uint8_t app_data[]) {
|
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class AdvertDataParser {
|
class AdvertDataParser {
|
||||||
@@ -56,41 +39,12 @@ class AdvertDataParser {
|
|||||||
char _name[MAX_ADVERT_DATA_SIZE];
|
char _name[MAX_ADVERT_DATA_SIZE];
|
||||||
int32_t _lat, _lon;
|
int32_t _lat, _lon;
|
||||||
public:
|
public:
|
||||||
AdvertDataParser(const uint8_t app_data[], uint8_t app_data_len) {
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isValid() const { return _valid; }
|
bool isValid() const { return _valid; }
|
||||||
uint8_t getType() const { return _flags & 0x0F; }
|
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; }
|
const char* getName() const { return _name; }
|
||||||
|
|
||||||
bool hasLatLon() const { return !(_lat == 0 && _lon == 0); }
|
bool hasLatLon() const { return !(_lat == 0 && _lon == 0); }
|
||||||
|
|||||||
Reference in New Issue
Block a user