AdvertDataHelpers.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #pragma once
  2. #include <stddef.h>
  3. #include <stdint.h>
  4. #include <Mesh.h>
  5. #define ADV_TYPE_NONE 0
  6. #define ADV_TYPE_CHAT 1
  7. #define ADV_TYPE_REPEATER 2
  8. #define ADV_TYPE_ROOM 3
  9. //FUTURE: 4..15
  10. #define ADV_LATLON_MASK 0x10
  11. #define ADV_BATTERY_MASK 0x20
  12. #define ADV_TEMPERATURE_MASK 0x40
  13. #define ADV_NAME_MASK 0x80
  14. class AdvertDataBuilder {
  15. uint8_t _type;
  16. const char* _name;
  17. int32_t _lat, _lon;
  18. public:
  19. AdvertDataBuilder(uint8_t adv_type) : _type(adv_type), _name(NULL), _lat(0), _lon(0) { }
  20. AdvertDataBuilder(uint8_t adv_type, const char* name) : _type(adv_type), _name(name), _lat(0), _lon(0) { }
  21. AdvertDataBuilder(uint8_t adv_type, const char* name, double lat, double lon) :
  22. _type(adv_type), _name(name), _lat(lat * 1E6), _lon(lon * 1E6) { }
  23. /**
  24. * \brief encode the given advertisement data.
  25. * \param app_data dest array, must be MAX_ADVERT_DATA_SIZE
  26. * \returns the encoded length in bytes
  27. */
  28. uint8_t encodeTo(uint8_t app_data[]);
  29. };
  30. class AdvertDataParser {
  31. uint8_t _flags;
  32. bool _valid;
  33. char _name[MAX_ADVERT_DATA_SIZE];
  34. int32_t _lat, _lon;
  35. public:
  36. AdvertDataParser(const uint8_t app_data[], uint8_t app_data_len);
  37. bool isValid() const { return _valid; }
  38. uint8_t getType() const { return _flags & 0x0F; }
  39. bool hasName() const { return _name[0] != 0; }
  40. const char* getName() const { return _name; }
  41. bool hasLatLon() const { return !(_lat == 0 && _lon == 0); }
  42. int32_t getIntLat() const { return _lat; }
  43. int32_t getIntLon() const { return _lon; }
  44. double getLat() const { return ((double)_lat) / 1000000.0; }
  45. double getLon() const { return ((double)_lon) / 1000000.0; }
  46. };
  47. class AdvertTimeHelper {
  48. public:
  49. static void formatRelativeTimeDiff(char dest[], int32_t seconds_from_now, bool short_fmt);
  50. };