Skip to content

Commit 561d289

Browse files
author
Scott Powell
committed
Companion: new 'manual_add_contacts' pref. New PUSH_CODE_NEW_ADVERT frames
1 parent 2de87d1 commit 561d289

File tree

3 files changed

+47
-14
lines changed

3 files changed

+47
-14
lines changed

examples/companion_radio/main.cpp

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ static uint32_t _atoi(const char* sp) {
113113
#define CMD_IMPORT_CONTACT 18
114114
#define CMD_REBOOT 19
115115
#define CMD_GET_BATTERY_VOLTAGE 20
116-
#define CMD_SET_TUNING_PARAMS 21
116+
#define CMD_SET_OTHER_PARAMS 21
117117
#define CMD_DEVICE_QEURY 22
118118
#define CMD_EXPORT_PRIVATE_KEY 23
119119
#define CMD_IMPORT_PRIVATE_KEY 24
@@ -164,6 +164,7 @@ static uint32_t _atoi(const char* sp) {
164164
#define PUSH_CODE_STATUS_RESPONSE 0x87
165165
#define PUSH_CODE_LOG_RX_DATA 0x88
166166
#define PUSH_CODE_TRACE_DATA 0x89
167+
#define PUSH_CODE_NEW_ADVERT 0x8A
167168

168169
#define ERR_CODE_UNSUPPORTED_CMD 1
169170
#define ERR_CODE_NOT_FOUND 2
@@ -184,7 +185,7 @@ struct NodePrefs { // persisted to file
184185
uint8_t sf;
185186
uint8_t cr;
186187
uint8_t reserved1;
187-
uint8_t reserved2;
188+
uint8_t manual_add_contacts;
188189
float bw;
189190
uint8_t tx_power_dbm;
190191
uint8_t unused[3];
@@ -499,11 +500,19 @@ class MyMesh : public BaseChatMesh {
499500
}
500501
}
501502

503+
bool isAutoAddEnabled() const override {
504+
return (_prefs.manual_add_contacts & 1) == 0;
505+
}
506+
502507
void onDiscoveredContact(ContactInfo& contact, bool is_new) override {
503508
if (_serial->isConnected()) {
504-
out_frame[0] = PUSH_CODE_ADVERT;
505-
memcpy(&out_frame[1], contact.id.pub_key, PUB_KEY_SIZE);
506-
_serial->writeFrame(out_frame, 1 + PUB_KEY_SIZE);
509+
if (!isAutoAddEnabled() && is_new) {
510+
writeContactRespFrame(PUSH_CODE_NEW_ADVERT, contact);
511+
} else {
512+
out_frame[0] = PUSH_CODE_ADVERT;
513+
memcpy(&out_frame[1], contact.id.pub_key, PUB_KEY_SIZE);
514+
_serial->writeFrame(out_frame, 1 + PUB_KEY_SIZE);
515+
}
507516
} else {
508517
soundBuzzer();
509518
}
@@ -750,7 +759,7 @@ class MyMesh : public BaseChatMesh {
750759
file.read((uint8_t *) &_prefs.sf, sizeof(_prefs.sf)); // 60
751760
file.read((uint8_t *) &_prefs.cr, sizeof(_prefs.cr)); // 61
752761
file.read((uint8_t *) &_prefs.reserved1, sizeof(_prefs.reserved1)); // 62
753-
file.read((uint8_t *) &_prefs.reserved2, sizeof(_prefs.reserved2)); // 63
762+
file.read((uint8_t *) &_prefs.manual_add_contacts, sizeof(_prefs.manual_add_contacts)); // 63
754763
file.read((uint8_t *) &_prefs.bw, sizeof(_prefs.bw)); // 64
755764
file.read((uint8_t *) &_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68
756765
file.read((uint8_t *) _prefs.unused, sizeof(_prefs.unused)); // 69
@@ -851,7 +860,7 @@ class MyMesh : public BaseChatMesh {
851860
file.write((uint8_t *) &_prefs.sf, sizeof(_prefs.sf)); // 60
852861
file.write((uint8_t *) &_prefs.cr, sizeof(_prefs.cr)); // 61
853862
file.write((uint8_t *) &_prefs.reserved1, sizeof(_prefs.reserved1)); // 62
854-
file.write((uint8_t *) &_prefs.reserved2, sizeof(_prefs.reserved2)); // 63
863+
file.write((uint8_t *) &_prefs.manual_add_contacts, sizeof(_prefs.manual_add_contacts)); // 63
855864
file.write((uint8_t *) &_prefs.bw, sizeof(_prefs.bw)); // 64
856865
file.write((uint8_t *) &_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68
857866
file.write((uint8_t *) _prefs.unused, sizeof(_prefs.unused)); // 69
@@ -892,12 +901,15 @@ class MyMesh : public BaseChatMesh {
892901
out_frame[i++] = MAX_LORA_TX_POWER;
893902
memcpy(&out_frame[i], self_id.pub_key, PUB_KEY_SIZE); i += PUB_KEY_SIZE;
894903

895-
int32_t lat, lon, alt = 0;
904+
int32_t lat, lon;
896905
lat = (_prefs.node_lat * 1000000.0);
897906
lon = (_prefs.node_lon * 1000000.0);
898907
memcpy(&out_frame[i], &lat, 4); i += 4;
899908
memcpy(&out_frame[i], &lon, 4); i += 4;
900-
memcpy(&out_frame[i], &alt, 4); i += 4;
909+
out_frame[i++] = 0; // reserved
910+
out_frame[i++] = 0; // reserved
911+
out_frame[i++] = 0; // reserved
912+
out_frame[i++] = _prefs.manual_add_contacts;
901913

902914
uint32_t freq = _prefs.freq * 1000;
903915
memcpy(&out_frame[i], &freq, 4); i += 4;
@@ -1172,13 +1184,16 @@ class MyMesh : public BaseChatMesh {
11721184
radio_set_tx_power(_prefs.tx_power_dbm);
11731185
writeOKFrame();
11741186
}
1175-
} else if (cmd_frame[0] == CMD_SET_TUNING_PARAMS) {
1187+
} else if (cmd_frame[0] == CMD_SET_OTHER_PARAMS) {
11761188
int i = 1;
11771189
uint32_t rx, af;
11781190
memcpy(&rx, &cmd_frame[i], 4); i += 4;
11791191
memcpy(&af, &cmd_frame[i], 4); i += 4;
11801192
_prefs.rx_delay_base = ((float)rx) / 1000.0f;
11811193
_prefs.airtime_factor = ((float)af) / 1000.0f;
1194+
if (i < len) {
1195+
_prefs.manual_add_contacts = cmd_frame[i++];
1196+
}
11821197
savePrefs();
11831198
writeOKFrame();
11841199
} else if (cmd_frame[0] == CMD_REBOOT && memcmp(&cmd_frame[1], "reboot", 6) == 0) {

src/helpers/BaseChatMesh.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,29 @@ void BaseChatMesh::onAdvertRecv(mesh::Packet* packet, const mesh::Identity& id,
3131
}
3232
}
3333

34+
// save a copy of raw advert packet (to support "Share..." function)
35+
int plen = packet->writeTo(temp_buf);
36+
putBlobByKey(id.pub_key, PUB_KEY_SIZE, temp_buf, plen);
37+
3438
bool is_new = false;
3539
if (from == NULL) {
40+
if (!isAutoAddEnabled()) {
41+
ContactInfo ci;
42+
memset(&ci, 0, sizeof(ci));
43+
ci.id = id;
44+
ci.out_path_len = -1; // initially out_path is unknown
45+
StrHelper::strncpy(ci.name, parser.getName(), sizeof(ci.name));
46+
ci.type = parser.getType();
47+
if (parser.hasLatLon()) {
48+
ci.gps_lat = parser.getIntLat();
49+
ci.gps_lon = parser.getIntLon();
50+
}
51+
ci.last_advert_timestamp = timestamp;
52+
ci.lastmod = getRTCClock()->getCurrentTime();
53+
onDiscoveredContact(ci, true); // let UI know
54+
return;
55+
}
56+
3657
is_new = true;
3758
if (num_contacts < MAX_CONTACTS) {
3859
from = &contacts[num_contacts++];
@@ -50,10 +71,6 @@ void BaseChatMesh::onAdvertRecv(mesh::Packet* packet, const mesh::Identity& id,
5071
}
5172
}
5273

53-
// save a copy of raw advert packet (to support "Share..." function)
54-
int plen = packet->writeTo(temp_buf);
55-
putBlobByKey(id.pub_key, PUB_KEY_SIZE, temp_buf, plen);
56-
5774
// update
5875
StrHelper::strncpy(from->name, parser.getName(), sizeof(from->name));
5976
from->type = parser.getType();

src/helpers/BaseChatMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class BaseChatMesh : public mesh::Mesh {
103103
}
104104

105105
// 'UI' concepts, for sub-classes to implement
106+
virtual bool isAutoAddEnabled() const { return true; }
106107
virtual void onDiscoveredContact(ContactInfo& contact, bool is_new) = 0;
107108
virtual bool processAck(const uint8_t *data) = 0;
108109
virtual void onContactPathUpdated(const ContactInfo& contact) = 0;

0 commit comments

Comments
 (0)