Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions examples/companion_radio/MyMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1111,11 +1111,12 @@ void MyMesh::handleCmdFrame(size_t len) {
writeErrFrame(ERR_CODE_ILLEGAL_ARG);
}
} else if (cmd_frame[0] == CMD_SEND_SELF_ADVERT) {
uint16_t caps = _prefs.client_repeat ? ADVERT_CAP_REPEAT : 0;
mesh::Packet* pkt;
if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
pkt = createSelfAdvert(_prefs.node_name);
pkt = createSelfAdvert(_prefs.node_name, caps);
} else {
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon, caps);
}
if (pkt) {
if (len >= 2 && cmd_frame[1] == 1) { // optional param (1 = flood, 0 = zero hop)
Expand Down Expand Up @@ -1193,11 +1194,12 @@ void MyMesh::handleCmdFrame(size_t len) {
} else if (cmd_frame[0] == CMD_EXPORT_CONTACT) {
if (len < 1 + PUB_KEY_SIZE) {
// export SELF
uint16_t caps = _prefs.client_repeat ? ADVERT_CAP_REPEAT : 0;
mesh::Packet* pkt;
if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
pkt = createSelfAdvert(_prefs.node_name);
pkt = createSelfAdvert(_prefs.node_name, caps);
} else {
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon, caps);
}
if (pkt) {
pkt->header |= ROUTE_TYPE_FLOOD; // would normally be sent in this mode
Expand Down Expand Up @@ -2041,11 +2043,12 @@ void MyMesh::loop() {
}

bool MyMesh::advert() {
uint16_t caps = _prefs.client_repeat ? ADVERT_CAP_REPEAT : 0;
mesh::Packet* pkt;
if (_prefs.advert_loc_policy == ADVERT_LOC_NONE) {
pkt = createSelfAdvert(_prefs.node_name);
pkt = createSelfAdvert(_prefs.node_name, caps);
} else {
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon, caps);
}
if (pkt) {
sendZeroHop(pkt);
Expand Down
3 changes: 2 additions & 1 deletion examples/simple_repeater/MyMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,8 @@ int MyMesh::handleRequest(ClientInfo *sender, uint32_t sender_timestamp, uint8_t

mesh::Packet *MyMesh::createSelfAdvert() {
uint8_t app_data[MAX_ADVERT_DATA_SIZE];
uint8_t app_data_len = _cli.buildAdvertData(ADV_TYPE_REPEATER, app_data);
uint16_t caps = _prefs.disable_fwd ? 0 : ADVERT_CAP_REPEAT;
uint8_t app_data_len = _cli.buildAdvertData(ADV_TYPE_REPEATER, app_data, caps);

return createAdvert(self_id, app_data, app_data_len);
}
Expand Down
3 changes: 2 additions & 1 deletion examples/simple_room_server/MyMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ bool MyMesh::processAck(const uint8_t *data) {

mesh::Packet *MyMesh::createSelfAdvert() {
uint8_t app_data[MAX_ADVERT_DATA_SIZE];
uint8_t app_data_len = _cli.buildAdvertData(ADV_TYPE_ROOM, app_data);
uint16_t caps = _prefs.disable_fwd ? 0 : ADVERT_CAP_REPEAT;
uint8_t app_data_len = _cli.buildAdvertData(ADV_TYPE_ROOM, app_data, caps);

return createAdvert(self_id, app_data, app_data_len);
}
Expand Down
12 changes: 6 additions & 6 deletions src/helpers/AdvertDataHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
memcpy(&app_data[i], &_lat, 4); i += 4;
memcpy(&app_data[i], &_lon, 4); i += 4;
}
if (_extra1) {
app_data[0] |= ADV_FEAT1_MASK;
memcpy(&app_data[i], &_extra1, 2); i += 2;
if (_caps) {
app_data[0] |= ADV_CAPS_MASK;
memcpy(&app_data[i], &_caps, 2); i += 2;
}
if (_extra2) {
app_data[0] |= ADV_FEAT2_MASK;
Expand All @@ -31,15 +31,15 @@
_lat = _lon = 0;
_flags = app_data[0];
_valid = false;
_extra1 = _extra2 = 0;
_caps = _extra2 = 0;

int i = 1;
if (_flags & ADV_LATLON_MASK) {
memcpy(&_lat, &app_data[i], 4); i += 4;
memcpy(&_lon, &app_data[i], 4); i += 4;
}
if (_flags & ADV_FEAT1_MASK) {
memcpy(&_extra1, &app_data[i], 2); i += 2;
if (_flags & ADV_CAPS_MASK) {
memcpy(&_caps, &app_data[i], 2); i += 2;
}
if (_flags & ADV_FEAT2_MASK) {
memcpy(&_extra2, &app_data[i], 2); i += 2;
Expand Down
15 changes: 9 additions & 6 deletions src/helpers/AdvertDataHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,27 @@
//FUTURE: 5..15

#define ADV_LATLON_MASK 0x10
#define ADV_FEAT1_MASK 0x20 // FUTURE
#define ADV_CAPS_MASK 0x20
#define ADV_FEAT2_MASK 0x40 // FUTURE
#define ADV_NAME_MASK 0x80

// Capability bits (ADV_CAPS_MASK bitmask)
#define ADVERT_CAP_REPEAT 0x0001 // node forwards packets

class AdvertDataBuilder {
uint8_t _type;
bool _has_loc;
const char* _name;
int32_t _lat, _lon;
uint16_t _extra1 = 0;
uint16_t _caps = 0;
uint16_t _extra2 = 0;
public:
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) :
AdvertDataBuilder(uint8_t adv_type, const char* name, double lat, double lon) :
_type(adv_type), _name(name), _has_loc(true), _lat(lat * 1E6), _lon(lon * 1E6) { }

void setFeat1(uint16_t extra) { _extra1 = extra; }
void setCapabilities(uint16_t caps) { _caps = caps; }
void setFeat2(uint16_t extra) { _extra2 = extra; }

/**
Expand All @@ -45,14 +48,14 @@ class AdvertDataParser {
bool _valid;
char _name[MAX_ADVERT_DATA_SIZE];
int32_t _lat, _lon;
uint16_t _extra1;
uint16_t _caps;
uint16_t _extra2;
public:
AdvertDataParser(const uint8_t app_data[], uint8_t app_data_len);

bool isValid() const { return _valid; }
uint8_t getType() const { return _flags & 0x0F; }
uint16_t getFeat1() const { return _extra1; }
uint16_t getCapabilities() const { return _caps; }
uint16_t getFeat2() const { return _extra2; }

bool hasName() const { return _name[0] != 0; }
Expand Down
6 changes: 4 additions & 2 deletions src/helpers/BaseChatMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,24 @@ void BaseChatMesh::sendFloodScoped(const mesh::GroupChannel& channel, mesh::Pack
sendFlood(pkt, delay_millis);
}

mesh::Packet* BaseChatMesh::createSelfAdvert(const char* name) {
mesh::Packet* BaseChatMesh::createSelfAdvert(const char* name, uint16_t caps) {
uint8_t app_data[MAX_ADVERT_DATA_SIZE];
uint8_t app_data_len;
{
AdvertDataBuilder builder(ADV_TYPE_CHAT, name);
if (caps) builder.setCapabilities(caps);
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, uint16_t caps) {
uint8_t app_data[MAX_ADVERT_DATA_SIZE];
uint8_t app_data_len;
{
AdvertDataBuilder builder(ADV_TYPE_CHAT, name, lat, lon);
if (caps) builder.setCapabilities(caps);
app_data_len = builder.encodeTo(app_data);
}

Expand Down
4 changes: 2 additions & 2 deletions src/helpers/BaseChatMesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ class BaseChatMesh : public mesh::Mesh {
void checkConnections();

public:
mesh::Packet* createSelfAdvert(const char* name);
mesh::Packet* createSelfAdvert(const char* name, double lat, double lon);
mesh::Packet* createSelfAdvert(const char* name, uint16_t caps = 0);
mesh::Packet* createSelfAdvert(const char* name, double lat, double lon, uint16_t caps = 0);
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);
Expand Down
5 changes: 4 additions & 1 deletion src/helpers/CommonCLI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,15 +183,18 @@ void CommonCLI::savePrefs() {
_callbacks->savePrefs();
}

uint8_t CommonCLI::buildAdvertData(uint8_t node_type, uint8_t* app_data) {
uint8_t CommonCLI::buildAdvertData(uint8_t node_type, uint8_t* app_data, uint16_t caps) {
if (_prefs->advert_loc_policy == ADVERT_LOC_NONE) {
AdvertDataBuilder builder(node_type, _prefs->node_name);
if (caps) builder.setCapabilities(caps);
return builder.encodeTo(app_data);
} else if (_prefs->advert_loc_policy == ADVERT_LOC_SHARE) {
AdvertDataBuilder builder(node_type, _prefs->node_name, _sensors->node_lat, _sensors->node_lon);
if (caps) builder.setCapabilities(caps);
return builder.encodeTo(app_data);
} else {
AdvertDataBuilder builder(node_type, _prefs->node_name, _prefs->node_lat, _prefs->node_lon);
if (caps) builder.setCapabilities(caps);
return builder.encodeTo(app_data);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/helpers/CommonCLI.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,5 +110,5 @@ class CommonCLI {
void loadPrefs(FILESYSTEM* _fs);
void savePrefs(FILESYSTEM* _fs);
void handleCommand(uint32_t sender_timestamp, const char* command, char* reply);
uint8_t buildAdvertData(uint8_t node_type, uint8_t* app_data);
uint8_t buildAdvertData(uint8_t node_type, uint8_t* app_data, uint16_t caps = 0);
};