Forráskód Böngészése

* companion: new 'advert_loc_policy' pref. Defaults to ADVERT_LOC_NONE (ie. do Not share location in adverts)

Scott Powell 1 éve
szülő
commit
9df3c8c663

+ 4 - 2
examples/companion_radio/DataStore.cpp

@@ -139,7 +139,8 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
     file.read((uint8_t *)&_prefs.telemetry_mode_loc, sizeof(_prefs.telemetry_mode_loc));   // 70
     file.read((uint8_t *)&_prefs.telemetry_mode_env, sizeof(_prefs.telemetry_mode_env));   // 71
     file.read((uint8_t *)&_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base));             // 72
-    file.read(pad, 4);                                                                     // 76
+    file.read((uint8_t *)&_prefs.advert_loc_policy, sizeof(_prefs.advert_loc_policy));     // 76
+    file.read(pad, 3);                                                                     // 77
     file.read((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin));                         // 80
 
     file.close();
@@ -168,7 +169,8 @@ void DataStore::savePrefs(const NodePrefs& _prefs, double node_lat, double node_
     file.write((uint8_t *)&_prefs.telemetry_mode_loc, sizeof(_prefs.telemetry_mode_loc));   // 70
     file.write((uint8_t *)&_prefs.telemetry_mode_env, sizeof(_prefs.telemetry_mode_env));   // 71
     file.write((uint8_t *)&_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base));             // 72
-    file.write(pad, 4);                                                                     // 76
+    file.write((uint8_t *)&_prefs.advert_loc_policy, sizeof(_prefs.advert_loc_policy));     // 76
+    file.write(pad, 3);                                                                     // 77
     file.write((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin));                         // 80
 
     file.close();

+ 23 - 4
examples/companion_radio/MyMesh.cpp

@@ -698,7 +698,7 @@ void MyMesh::handleCmdFrame(size_t len) {
     memcpy(&out_frame[i], &lon, 4);
     i += 4;
     out_frame[i++] = 0; // reserved
-    out_frame[i++] = 0; // reserved
+    out_frame[i++] = _prefs.advert_loc_policy;
     out_frame[i++] = (_prefs.telemetry_mode_env << 4) | (_prefs.telemetry_mode_loc << 2) |
                      (_prefs.telemetry_mode_base); // v5+
     out_frame[i++] = _prefs.manual_add_contacts;
@@ -840,7 +840,12 @@ void MyMesh::handleCmdFrame(size_t len) {
       writeErrFrame(ERR_CODE_ILLEGAL_ARG);
     }
   } else if (cmd_frame[0] == CMD_SEND_SELF_ADVERT) {
-    auto pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
+    mesh::Packet* pkt;
+    if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
+      pkt = createSelfAdvert(_prefs.node_name);
+    } else {
+      pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
+    }
     if (pkt) {
       if (len >= 2 && cmd_frame[1] == 1) { // optional param (1 = flood, 0 = zero hop)
         sendFlood(pkt);
@@ -914,7 +919,12 @@ void MyMesh::handleCmdFrame(size_t len) {
   } else if (cmd_frame[0] == CMD_EXPORT_CONTACT) {
     if (len < 1 + PUB_KEY_SIZE) {
       // export SELF
-      auto pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
+      mesh::Packet* pkt;
+      if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
+        pkt = createSelfAdvert(_prefs.node_name);
+      } else {
+        pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
+      }
       if (pkt) {
         pkt->header |= ROUTE_TYPE_FLOOD; // would normally be sent in this mode
 
@@ -1008,6 +1018,10 @@ void MyMesh::handleCmdFrame(size_t len) {
       _prefs.telemetry_mode_base = cmd_frame[2] & 0x03; // v5+
       _prefs.telemetry_mode_loc = (cmd_frame[2] >> 2) & 0x03;
       _prefs.telemetry_mode_env = (cmd_frame[2] >> 4) & 0x03;
+
+      if (len >= 4) {
+        _prefs.advert_loc_policy = cmd_frame[3];
+      }
     }
     savePrefs();
     writeOKFrame();
@@ -1478,7 +1492,12 @@ void MyMesh::loop() {
 }
 
 bool MyMesh::advert() {
-  auto pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
+  mesh::Packet* pkt;
+  if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
+    pkt = createSelfAdvert(_prefs.node_name);
+  } else {
+    pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
+  }
   if (pkt) {
     sendZeroHop(pkt);
     return true;

+ 4 - 0
examples/companion_radio/NodePrefs.h

@@ -5,6 +5,9 @@
 #define TELEM_MODE_ALLOW_FLAGS     1     // use contact.flags
 #define TELEM_MODE_ALLOW_ALL       2
 
+#define ADVERT_LOC_NONE       0
+#define ADVERT_LOC_SHARE      1
+
 struct NodePrefs {  // persisted to file
   float airtime_factor;
   char node_name[32];
@@ -20,4 +23,5 @@ struct NodePrefs {  // persisted to file
   uint8_t telemetry_mode_env;
   float rx_delay_base;
   uint32_t ble_pin;
+  uint8_t  advert_loc_policy;
 };

+ 1 - 1
src/helpers/AdvertDataHelpers.cpp

@@ -3,7 +3,7 @@
   uint8_t AdvertDataBuilder::encodeTo(uint8_t app_data[]) {
     app_data[0] = _type;
     int i = 1;
-    if (!(_lat == 0 && _lon == 0)) {
+    if (_has_loc) {
       app_data[0] |= ADV_LATLON_MASK;
       memcpy(&app_data[i], &_lat, 4); i += 4;
       memcpy(&app_data[i], &_lon, 4); i += 4;

+ 4 - 3
src/helpers/AdvertDataHelpers.h

@@ -17,15 +17,16 @@
 
 class AdvertDataBuilder {
   uint8_t _type;
+  bool _has_loc;
   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) : _type(adv_type), _name(NULL), _has_loc(false) { }
+  AdvertDataBuilder(uint8_t adv_type, const char* name) : _type(adv_type), _name(name), _has_loc(false) { }
   AdvertDataBuilder(uint8_t adv_type, const char* name, double lat, double lon) : 
-      _type(adv_type), _name(name), _lat(lat * 1E6), _lon(lon * 1E6)  { }
+      _type(adv_type), _name(name), _has_loc(true), _lat(lat * 1E6), _lon(lon * 1E6)  { }
 
   void setFeat1(uint16_t extra) { _extra1 = extra; }
   void setFeat2(uint16_t extra) { _extra2 = extra; }

+ 11 - 0
src/helpers/BaseChatMesh.cpp

@@ -9,6 +9,17 @@
   #define TXT_ACK_DELAY     200
 #endif
 
+mesh::Packet* BaseChatMesh::createSelfAdvert(const char* name) {
+  uint8_t app_data[MAX_ADVERT_DATA_SIZE];
+  uint8_t app_data_len;
+  {
+    AdvertDataBuilder builder(ADV_TYPE_CHAT, name);
+    app_data_len = builder.encodeTo(app_data);
+  }
+
+  return createAdvert(self_id, app_data, app_data_len);
+}
+
 mesh::Packet* BaseChatMesh::createSelfAdvert(const char* name, double lat, double lon) {
   uint8_t app_data[MAX_ADVERT_DATA_SIZE];
   uint8_t app_data_len;

+ 2 - 1
src/helpers/BaseChatMesh.h

@@ -127,7 +127,8 @@ protected:
   void checkConnections();
 
 public:
-  mesh::Packet* createSelfAdvert(const char* name, double lat=0.0, double lon=0.0);
+  mesh::Packet* createSelfAdvert(const char* name);
+  mesh::Packet* createSelfAdvert(const char* name, double lat, double lon);
   int  sendMessage(const ContactInfo& recipient, uint32_t timestamp, uint8_t attempt, const char* text, uint32_t& expected_ack, uint32_t& est_timeout);
   int  sendCommandData(const ContactInfo& recipient, uint32_t timestamp, uint8_t attempt, const char* text, uint32_t& est_timeout);
   bool sendGroupMessage(uint32_t timestamp, mesh::GroupChannel& channel, const char* sender_name, const char* text, int text_len);