Browse Source

gps_cli: gps advert to control advert location policy

Florent 10 tháng trước cách đây
mục cha
commit
bf1da43d7d

+ 10 - 2
examples/simple_repeater/MyMesh.cpp

@@ -289,8 +289,16 @@ mesh::Packet *MyMesh::createSelfAdvert() {
   uint8_t app_data[MAX_ADVERT_DATA_SIZE];
   uint8_t app_data_len;
   {
-    AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, _prefs.node_lat, _prefs.node_lon);
-    app_data_len = builder.encodeTo(app_data);
+    if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name);
+        app_data_len = builder.encodeTo(app_data);
+    } else if (_prefs.advert_loc_policy == ADVERT_LOC_SHARE) {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, sensors.node_lat, sensors.node_lon);
+        app_data_len = builder.encodeTo(app_data);
+    } else {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, _prefs.node_lat, _prefs.node_lon);
+        app_data_len = builder.encodeTo(app_data);
+    }
   }
 
   return createAdvert(self_id, app_data, app_data_len);

+ 10 - 2
examples/simple_room_server/MyMesh.cpp

@@ -116,8 +116,16 @@ mesh::Packet *MyMesh::createSelfAdvert() {
   uint8_t app_data[MAX_ADVERT_DATA_SIZE];
   uint8_t app_data_len;
   {
-    AdvertDataBuilder builder(ADV_TYPE_ROOM, _prefs.node_name, _prefs.node_lat, _prefs.node_lon);
-    app_data_len = builder.encodeTo(app_data);
+    if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name);
+        app_data_len = builder.encodeTo(app_data);
+    } else if (_prefs.advert_loc_policy == ADVERT_LOC_SHARE) {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, sensors.node_lat, sensors.node_lon);
+        app_data_len = builder.encodeTo(app_data);
+    } else {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, _prefs.node_lat, _prefs.node_lon);
+        app_data_len = builder.encodeTo(app_data);
+    }
   }
 
   return createAdvert(self_id, app_data, app_data_len);

+ 10 - 2
examples/simple_sensor/SensorMesh.cpp

@@ -241,8 +241,16 @@ mesh::Packet* SensorMesh::createSelfAdvert() {
   uint8_t app_data[MAX_ADVERT_DATA_SIZE];
   uint8_t app_data_len;
   {
-    AdvertDataBuilder builder(ADV_TYPE_SENSOR, _prefs.node_name, _prefs.node_lat, _prefs.node_lon);
-    app_data_len = builder.encodeTo(app_data);
+    if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name);
+        app_data_len = builder.encodeTo(app_data);
+    } else if (_prefs.advert_loc_policy == ADVERT_LOC_SHARE) {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, sensors.node_lat, sensors.node_lon);
+        app_data_len = builder.encodeTo(app_data);
+    } else {
+        AdvertDataBuilder builder(ADV_TYPE_REPEATER, _prefs.node_name, _prefs.node_lat, _prefs.node_lon);
+        app_data_len = builder.encodeTo(app_data);
+    }
   }
 
   return createAdvert(self_id, app_data, app_data_len);

+ 37 - 2
src/helpers/CommonCLI.cpp

@@ -67,7 +67,10 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
     file.read(pad, 4);                                                                             // 152
     file.read((uint8_t *)&_prefs->gps_enabled, sizeof(_prefs->gps_enabled));                       // 156
     file.read((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval));                     // 157
-    // 161
+    if (file.read((uint8_t *)&_prefs->advert_loc_policy, sizeof (_prefs->advert_loc_policy)) == -1) {
+      _prefs->advert_loc_policy = ADVERT_LOC_PREFS; // default value
+    }                                                                                               // 161
+    // 162
 
     // sanitise bad pref values
     _prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
@@ -89,6 +92,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
     _prefs->bridge_channel = constrain(_prefs->bridge_channel, 0, 14);
 
     _prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1);
+    _prefs->advert_loc_policy = constrain(_prefs->advert_loc_policy, 0, 2);
 
     file.close();
   }
@@ -142,7 +146,8 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
     file.write(pad, 4);                                                                             // 152
     file.write((uint8_t *)&_prefs->gps_enabled, sizeof(_prefs->gps_enabled));                       // 156
     file.write((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval));                     // 157
-    // 161
+    file.write((uint8_t *)&_prefs->advert_loc_policy, sizeof(_prefs->advert_loc_policy));           // 161
+    // 162
 
     file.close();
   }
@@ -585,6 +590,36 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
       _prefs->node_lon = sensors.node_lon;
       savePrefs();
       strcpy(reply, "ok");
+    } else if (memcmp(command, "gps advert", 10) == 0) {
+      if (strlen(command) == 10) {
+        switch (_prefs->advert_loc_policy) {
+          case ADVERT_LOC_NONE:
+            strcpy(reply, "> none");
+            break;
+          case ADVERT_LOC_PREFS:
+            strcpy(reply, "> prefs");
+            break;
+          case ADVERT_LOC_SHARE:
+            strcpy(reply, "> share");
+            break;
+          default:
+            strcpy(reply, "error");
+        }
+      } else if (memcmp(command+11, "none", 4) == 0) {
+        _prefs->advert_loc_policy = ADVERT_LOC_NONE;
+        savePrefs();
+        strcpy(reply, "ok");
+      } else if (memcmp(command+11, "share", 5) == 0) {
+        _prefs->advert_loc_policy = ADVERT_LOC_SHARE;
+        savePrefs();
+        strcpy(reply, "ok");
+      } else if (memcmp(command+11, "prefs", 4) == 0) {
+        _prefs->advert_loc_policy = ADVERT_LOC_PREFS;
+        savePrefs();
+        strcpy(reply, "ok");
+      } else {
+        strcpy(reply, "error");
+      }
     } else if (memcmp(command, "gps", 3) == 0) {
       LocationProvider * l = sensors.getLocationProvider();
       if (l != NULL) {

+ 5 - 0
src/helpers/CommonCLI.h

@@ -8,6 +8,10 @@
 #define WITH_BRIDGE
 #endif
 
+#define ADVERT_LOC_NONE       0
+#define ADVERT_LOC_SHARE      1
+#define ADVERT_LOC_PREFS      2
+
 struct NodePrefs { // persisted to file
   float airtime_factor;
   char node_name[32];
@@ -41,6 +45,7 @@ struct NodePrefs { // persisted to file
   // Gps settings
   uint8_t gps_enabled;
   uint32_t gps_interval; // in seconds
+  uint8_t advert_loc_policy;
 };
 
 class CommonCLICallbacks {