فهرست منبع

* Bug fix: hasName(), missing return :-(
* refactored methods to AdvertDataHelper.cpp

Scott Powell 1 سال پیش
والد
کامیت
e78aa66d57
2فایلهای تغییر یافته به همراه59 افزوده شده و 52 حذف شده
  1. 53 0
      src/helpers/AdvertDataHelpers.cpp
  2. 6 52
      src/helpers/AdvertDataHelpers.h

+ 53 - 0
src/helpers/AdvertDataHelpers.cpp

@@ -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;
+    }
+  }

+ 6 - 52
src/helpers/AdvertDataHelpers.h

@@ -2,11 +2,12 @@
 
 #include <stddef.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_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); }