mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
* companion: new 'advert_loc_policy' pref. Defaults to ADVERT_LOC_NONE (ie. do Not share location in adverts)
This commit is contained in:
parent
4f9207f3eb
commit
9df3c8c663
7 changed files with 49 additions and 11 deletions
|
|
@ -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_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.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((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.read((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
|
||||||
|
|
||||||
file.close();
|
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_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.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((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.write((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
|
|
|
||||||
|
|
@ -698,7 +698,7 @@ void MyMesh::handleCmdFrame(size_t len) {
|
||||||
memcpy(&out_frame[i], &lon, 4);
|
memcpy(&out_frame[i], &lon, 4);
|
||||||
i += 4;
|
i += 4;
|
||||||
out_frame[i++] = 0; // reserved
|
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) |
|
out_frame[i++] = (_prefs.telemetry_mode_env << 4) | (_prefs.telemetry_mode_loc << 2) |
|
||||||
(_prefs.telemetry_mode_base); // v5+
|
(_prefs.telemetry_mode_base); // v5+
|
||||||
out_frame[i++] = _prefs.manual_add_contacts;
|
out_frame[i++] = _prefs.manual_add_contacts;
|
||||||
|
|
@ -840,7 +840,12 @@ void MyMesh::handleCmdFrame(size_t len) {
|
||||||
writeErrFrame(ERR_CODE_ILLEGAL_ARG);
|
writeErrFrame(ERR_CODE_ILLEGAL_ARG);
|
||||||
}
|
}
|
||||||
} else if (cmd_frame[0] == CMD_SEND_SELF_ADVERT) {
|
} 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 (pkt) {
|
||||||
if (len >= 2 && cmd_frame[1] == 1) { // optional param (1 = flood, 0 = zero hop)
|
if (len >= 2 && cmd_frame[1] == 1) { // optional param (1 = flood, 0 = zero hop)
|
||||||
sendFlood(pkt);
|
sendFlood(pkt);
|
||||||
|
|
@ -914,7 +919,12 @@ void MyMesh::handleCmdFrame(size_t len) {
|
||||||
} else if (cmd_frame[0] == CMD_EXPORT_CONTACT) {
|
} else if (cmd_frame[0] == CMD_EXPORT_CONTACT) {
|
||||||
if (len < 1 + PUB_KEY_SIZE) {
|
if (len < 1 + PUB_KEY_SIZE) {
|
||||||
// export SELF
|
// 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) {
|
if (pkt) {
|
||||||
pkt->header |= ROUTE_TYPE_FLOOD; // would normally be sent in this mode
|
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_base = cmd_frame[2] & 0x03; // v5+
|
||||||
_prefs.telemetry_mode_loc = (cmd_frame[2] >> 2) & 0x03;
|
_prefs.telemetry_mode_loc = (cmd_frame[2] >> 2) & 0x03;
|
||||||
_prefs.telemetry_mode_env = (cmd_frame[2] >> 4) & 0x03;
|
_prefs.telemetry_mode_env = (cmd_frame[2] >> 4) & 0x03;
|
||||||
|
|
||||||
|
if (len >= 4) {
|
||||||
|
_prefs.advert_loc_policy = cmd_frame[3];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
savePrefs();
|
savePrefs();
|
||||||
writeOKFrame();
|
writeOKFrame();
|
||||||
|
|
@ -1478,7 +1492,12 @@ void MyMesh::loop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MyMesh::advert() {
|
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) {
|
if (pkt) {
|
||||||
sendZeroHop(pkt);
|
sendZeroHop(pkt);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,9 @@
|
||||||
#define TELEM_MODE_ALLOW_FLAGS 1 // use contact.flags
|
#define TELEM_MODE_ALLOW_FLAGS 1 // use contact.flags
|
||||||
#define TELEM_MODE_ALLOW_ALL 2
|
#define TELEM_MODE_ALLOW_ALL 2
|
||||||
|
|
||||||
|
#define ADVERT_LOC_NONE 0
|
||||||
|
#define ADVERT_LOC_SHARE 1
|
||||||
|
|
||||||
struct NodePrefs { // persisted to file
|
struct NodePrefs { // persisted to file
|
||||||
float airtime_factor;
|
float airtime_factor;
|
||||||
char node_name[32];
|
char node_name[32];
|
||||||
|
|
@ -20,4 +23,5 @@ struct NodePrefs { // persisted to file
|
||||||
uint8_t telemetry_mode_env;
|
uint8_t telemetry_mode_env;
|
||||||
float rx_delay_base;
|
float rx_delay_base;
|
||||||
uint32_t ble_pin;
|
uint32_t ble_pin;
|
||||||
|
uint8_t advert_loc_policy;
|
||||||
};
|
};
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
uint8_t AdvertDataBuilder::encodeTo(uint8_t app_data[]) {
|
uint8_t AdvertDataBuilder::encodeTo(uint8_t app_data[]) {
|
||||||
app_data[0] = _type;
|
app_data[0] = _type;
|
||||||
int i = 1;
|
int i = 1;
|
||||||
if (!(_lat == 0 && _lon == 0)) {
|
if (_has_loc) {
|
||||||
app_data[0] |= ADV_LATLON_MASK;
|
app_data[0] |= ADV_LATLON_MASK;
|
||||||
memcpy(&app_data[i], &_lat, 4); i += 4;
|
memcpy(&app_data[i], &_lat, 4); i += 4;
|
||||||
memcpy(&app_data[i], &_lon, 4); i += 4;
|
memcpy(&app_data[i], &_lon, 4); i += 4;
|
||||||
|
|
|
||||||
|
|
@ -17,15 +17,16 @@
|
||||||
|
|
||||||
class AdvertDataBuilder {
|
class AdvertDataBuilder {
|
||||||
uint8_t _type;
|
uint8_t _type;
|
||||||
|
bool _has_loc;
|
||||||
const char* _name;
|
const char* _name;
|
||||||
int32_t _lat, _lon;
|
int32_t _lat, _lon;
|
||||||
uint16_t _extra1 = 0;
|
uint16_t _extra1 = 0;
|
||||||
uint16_t _extra2 = 0;
|
uint16_t _extra2 = 0;
|
||||||
public:
|
public:
|
||||||
AdvertDataBuilder(uint8_t adv_type) : _type(adv_type), _name(NULL), _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), _lat(0), _lon(0) { }
|
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) :
|
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 setFeat1(uint16_t extra) { _extra1 = extra; }
|
||||||
void setFeat2(uint16_t extra) { _extra2 = extra; }
|
void setFeat2(uint16_t extra) { _extra2 = extra; }
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,17 @@
|
||||||
#define TXT_ACK_DELAY 200
|
#define TXT_ACK_DELAY 200
|
||||||
#endif
|
#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) {
|
mesh::Packet* BaseChatMesh::createSelfAdvert(const char* name, double lat, double lon) {
|
||||||
uint8_t app_data[MAX_ADVERT_DATA_SIZE];
|
uint8_t app_data[MAX_ADVERT_DATA_SIZE];
|
||||||
uint8_t app_data_len;
|
uint8_t app_data_len;
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,8 @@ protected:
|
||||||
void checkConnections();
|
void checkConnections();
|
||||||
|
|
||||||
public:
|
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 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);
|
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);
|
bool sendGroupMessage(uint32_t timestamp, mesh::GroupChannel& channel, const char* sender_name, const char* text, int text_len);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue