gps_cli: gps advert to control advert location policy

This commit is contained in:
Florent
2025-10-11 19:00:02 +02:00
parent f6064b41e9
commit bf1da43d7d
5 changed files with 72 additions and 8 deletions
+10 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 {