Skip to content

Commit 9df3c8c

Browse files
author
Scott Powell
committed
* companion: new 'advert_loc_policy' pref. Defaults to ADVERT_LOC_NONE (ie. do Not share location in adverts)
1 parent 4f9207f commit 9df3c8c

File tree

7 files changed

+49
-11
lines changed

7 files changed

+49
-11
lines changed

examples/companion_radio/DataStore.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
139139
file.read((uint8_t *)&_prefs.telemetry_mode_loc, sizeof(_prefs.telemetry_mode_loc)); // 70
140140
file.read((uint8_t *)&_prefs.telemetry_mode_env, sizeof(_prefs.telemetry_mode_env)); // 71
141141
file.read((uint8_t *)&_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base)); // 72
142-
file.read(pad, 4); // 76
142+
file.read((uint8_t *)&_prefs.advert_loc_policy, sizeof(_prefs.advert_loc_policy)); // 76
143+
file.read(pad, 3); // 77
143144
file.read((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
144145

145146
file.close();
@@ -168,7 +169,8 @@ void DataStore::savePrefs(const NodePrefs& _prefs, double node_lat, double node_
168169
file.write((uint8_t *)&_prefs.telemetry_mode_loc, sizeof(_prefs.telemetry_mode_loc)); // 70
169170
file.write((uint8_t *)&_prefs.telemetry_mode_env, sizeof(_prefs.telemetry_mode_env)); // 71
170171
file.write((uint8_t *)&_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base)); // 72
171-
file.write(pad, 4); // 76
172+
file.write((uint8_t *)&_prefs.advert_loc_policy, sizeof(_prefs.advert_loc_policy)); // 76
173+
file.write(pad, 3); // 77
172174
file.write((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
173175

174176
file.close();

examples/companion_radio/MyMesh.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ void MyMesh::handleCmdFrame(size_t len) {
698698
memcpy(&out_frame[i], &lon, 4);
699699
i += 4;
700700
out_frame[i++] = 0; // reserved
701-
out_frame[i++] = 0; // reserved
701+
out_frame[i++] = _prefs.advert_loc_policy;
702702
out_frame[i++] = (_prefs.telemetry_mode_env << 4) | (_prefs.telemetry_mode_loc << 2) |
703703
(_prefs.telemetry_mode_base); // v5+
704704
out_frame[i++] = _prefs.manual_add_contacts;
@@ -840,7 +840,12 @@ void MyMesh::handleCmdFrame(size_t len) {
840840
writeErrFrame(ERR_CODE_ILLEGAL_ARG);
841841
}
842842
} else if (cmd_frame[0] == CMD_SEND_SELF_ADVERT) {
843-
auto pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
843+
mesh::Packet* pkt;
844+
if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
845+
pkt = createSelfAdvert(_prefs.node_name);
846+
} else {
847+
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
848+
}
844849
if (pkt) {
845850
if (len >= 2 && cmd_frame[1] == 1) { // optional param (1 = flood, 0 = zero hop)
846851
sendFlood(pkt);
@@ -914,7 +919,12 @@ void MyMesh::handleCmdFrame(size_t len) {
914919
} else if (cmd_frame[0] == CMD_EXPORT_CONTACT) {
915920
if (len < 1 + PUB_KEY_SIZE) {
916921
// export SELF
917-
auto pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
922+
mesh::Packet* pkt;
923+
if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
924+
pkt = createSelfAdvert(_prefs.node_name);
925+
} else {
926+
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
927+
}
918928
if (pkt) {
919929
pkt->header |= ROUTE_TYPE_FLOOD; // would normally be sent in this mode
920930

@@ -1008,6 +1018,10 @@ void MyMesh::handleCmdFrame(size_t len) {
10081018
_prefs.telemetry_mode_base = cmd_frame[2] & 0x03; // v5+
10091019
_prefs.telemetry_mode_loc = (cmd_frame[2] >> 2) & 0x03;
10101020
_prefs.telemetry_mode_env = (cmd_frame[2] >> 4) & 0x03;
1021+
1022+
if (len >= 4) {
1023+
_prefs.advert_loc_policy = cmd_frame[3];
1024+
}
10111025
}
10121026
savePrefs();
10131027
writeOKFrame();
@@ -1478,7 +1492,12 @@ void MyMesh::loop() {
14781492
}
14791493

14801494
bool MyMesh::advert() {
1481-
auto pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
1495+
mesh::Packet* pkt;
1496+
if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
1497+
pkt = createSelfAdvert(_prefs.node_name);
1498+
} else {
1499+
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
1500+
}
14821501
if (pkt) {
14831502
sendZeroHop(pkt);
14841503
return true;

examples/companion_radio/NodePrefs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
#define TELEM_MODE_ALLOW_FLAGS 1 // use contact.flags
66
#define TELEM_MODE_ALLOW_ALL 2
77

8+
#define ADVERT_LOC_NONE 0
9+
#define ADVERT_LOC_SHARE 1
10+
811
struct NodePrefs { // persisted to file
912
float airtime_factor;
1013
char node_name[32];
@@ -20,4 +23,5 @@ struct NodePrefs { // persisted to file
2023
uint8_t telemetry_mode_env;
2124
float rx_delay_base;
2225
uint32_t ble_pin;
26+
uint8_t advert_loc_policy;
2327
};

src/helpers/AdvertDataHelpers.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
uint8_t AdvertDataBuilder::encodeTo(uint8_t app_data[]) {
44
app_data[0] = _type;
55
int i = 1;
6-
if (!(_lat == 0 && _lon == 0)) {
6+
if (_has_loc) {
77
app_data[0] |= ADV_LATLON_MASK;
88
memcpy(&app_data[i], &_lat, 4); i += 4;
99
memcpy(&app_data[i], &_lon, 4); i += 4;

src/helpers/AdvertDataHelpers.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@
1717

1818
class AdvertDataBuilder {
1919
uint8_t _type;
20+
bool _has_loc;
2021
const char* _name;
2122
int32_t _lat, _lon;
2223
uint16_t _extra1 = 0;
2324
uint16_t _extra2 = 0;
2425
public:
25-
AdvertDataBuilder(uint8_t adv_type) : _type(adv_type), _name(NULL), _lat(0), _lon(0) { }
26-
AdvertDataBuilder(uint8_t adv_type, const char* name) : _type(adv_type), _name(name), _lat(0), _lon(0) { }
26+
AdvertDataBuilder(uint8_t adv_type) : _type(adv_type), _name(NULL), _has_loc(false) { }
27+
AdvertDataBuilder(uint8_t adv_type, const char* name) : _type(adv_type), _name(name), _has_loc(false) { }
2728
AdvertDataBuilder(uint8_t adv_type, const char* name, double lat, double lon) :
28-
_type(adv_type), _name(name), _lat(lat * 1E6), _lon(lon * 1E6) { }
29+
_type(adv_type), _name(name), _has_loc(true), _lat(lat * 1E6), _lon(lon * 1E6) { }
2930

3031
void setFeat1(uint16_t extra) { _extra1 = extra; }
3132
void setFeat2(uint16_t extra) { _extra2 = extra; }

src/helpers/BaseChatMesh.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@
99
#define TXT_ACK_DELAY 200
1010
#endif
1111

12+
mesh::Packet* BaseChatMesh::createSelfAdvert(const char* name) {
13+
uint8_t app_data[MAX_ADVERT_DATA_SIZE];
14+
uint8_t app_data_len;
15+
{
16+
AdvertDataBuilder builder(ADV_TYPE_CHAT, name);
17+
app_data_len = builder.encodeTo(app_data);
18+
}
19+
20+
return createAdvert(self_id, app_data, app_data_len);
21+
}
22+
1223
mesh::Packet* BaseChatMesh::createSelfAdvert(const char* name, double lat, double lon) {
1324
uint8_t app_data[MAX_ADVERT_DATA_SIZE];
1425
uint8_t app_data_len;

src/helpers/BaseChatMesh.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ class BaseChatMesh : public mesh::Mesh {
127127
void checkConnections();
128128

129129
public:
130-
mesh::Packet* createSelfAdvert(const char* name, double lat=0.0, double lon=0.0);
130+
mesh::Packet* createSelfAdvert(const char* name);
131+
mesh::Packet* createSelfAdvert(const char* name, double lat, double lon);
131132
int sendMessage(const ContactInfo& recipient, uint32_t timestamp, uint8_t attempt, const char* text, uint32_t& expected_ack, uint32_t& est_timeout);
132133
int sendCommandData(const ContactInfo& recipient, uint32_t timestamp, uint8_t attempt, const char* text, uint32_t& est_timeout);
133134
bool sendGroupMessage(uint32_t timestamp, mesh::GroupChannel& channel, const char* sender_name, const char* text, int text_len);

0 commit comments

Comments
 (0)