diff --git a/examples/companion_radio/DataStore.cpp b/examples/companion_radio/DataStore.cpp index 2a16d5a1..21092fa3 100644 --- a/examples/companion_radio/DataStore.cpp +++ b/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(); diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index d996d752..23223622 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/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; diff --git a/examples/companion_radio/NodePrefs.h b/examples/companion_radio/NodePrefs.h index 4fd0fd3b..bf4739e4 100644 --- a/examples/companion_radio/NodePrefs.h +++ b/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; }; \ No newline at end of file diff --git a/src/helpers/AdvertDataHelpers.cpp b/src/helpers/AdvertDataHelpers.cpp index 88253f61..0e05620e 100644 --- a/src/helpers/AdvertDataHelpers.cpp +++ b/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; diff --git a/src/helpers/AdvertDataHelpers.h b/src/helpers/AdvertDataHelpers.h index 14815eac..100ccb12 100644 --- a/src/helpers/AdvertDataHelpers.h +++ b/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; } diff --git a/src/helpers/BaseChatMesh.cpp b/src/helpers/BaseChatMesh.cpp index 4649040e..271f28da 100644 --- a/src/helpers/BaseChatMesh.cpp +++ b/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; diff --git a/src/helpers/BaseChatMesh.h b/src/helpers/BaseChatMesh.h index de73ea78..53cd5018 100644 --- a/src/helpers/BaseChatMesh.h +++ b/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);