Skip to content

Commit 5881b04

Browse files
author
Scott Powell
committed
* companion: optional double ACKs, new prefs.multi_acks
1 parent 6bc8dd2 commit 5881b04

File tree

5 files changed

+23
-9
lines changed

5 files changed

+23
-9
lines changed

examples/companion_radio/DataStore.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
154154
file.read((uint8_t *)&_prefs.freq, sizeof(_prefs.freq)); // 56
155155
file.read((uint8_t *)&_prefs.sf, sizeof(_prefs.sf)); // 60
156156
file.read((uint8_t *)&_prefs.cr, sizeof(_prefs.cr)); // 61
157-
file.read((uint8_t *)&_prefs.reserved1, sizeof(_prefs.reserved1)); // 62
157+
file.read(pad, 1); // 62
158158
file.read((uint8_t *)&_prefs.manual_add_contacts, sizeof(_prefs.manual_add_contacts)); // 63
159159
file.read((uint8_t *)&_prefs.bw, sizeof(_prefs.bw)); // 64
160160
file.read((uint8_t *)&_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68
@@ -163,7 +163,8 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
163163
file.read((uint8_t *)&_prefs.telemetry_mode_env, sizeof(_prefs.telemetry_mode_env)); // 71
164164
file.read((uint8_t *)&_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base)); // 72
165165
file.read((uint8_t *)&_prefs.advert_loc_policy, sizeof(_prefs.advert_loc_policy)); // 76
166-
file.read(pad, 3); // 77
166+
file.read((uint8_t *)&_prefs.multi_acks, sizeof(_prefs.multi_acks)); // 77
167+
file.read(pad, 2); // 78
167168
file.read((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
168169

169170
file.close();
@@ -184,7 +185,7 @@ void DataStore::savePrefs(const NodePrefs& _prefs, double node_lat, double node_
184185
file.write((uint8_t *)&_prefs.freq, sizeof(_prefs.freq)); // 56
185186
file.write((uint8_t *)&_prefs.sf, sizeof(_prefs.sf)); // 60
186187
file.write((uint8_t *)&_prefs.cr, sizeof(_prefs.cr)); // 61
187-
file.write((uint8_t *)&_prefs.reserved1, sizeof(_prefs.reserved1)); // 62
188+
file.write(pad, 1); // 62
188189
file.write((uint8_t *)&_prefs.manual_add_contacts, sizeof(_prefs.manual_add_contacts)); // 63
189190
file.write((uint8_t *)&_prefs.bw, sizeof(_prefs.bw)); // 64
190191
file.write((uint8_t *)&_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68
@@ -193,7 +194,8 @@ void DataStore::savePrefs(const NodePrefs& _prefs, double node_lat, double node_
193194
file.write((uint8_t *)&_prefs.telemetry_mode_env, sizeof(_prefs.telemetry_mode_env)); // 71
194195
file.write((uint8_t *)&_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base)); // 72
195196
file.write((uint8_t *)&_prefs.advert_loc_policy, sizeof(_prefs.advert_loc_policy)); // 76
196-
file.write(pad, 3); // 77
197+
file.write((uint8_t *)&_prefs.multi_acks, sizeof(_prefs.multi_acks)); // 77
198+
file.write(pad, 2); // 78
197199
file.write((uint8_t *)&_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
198200

199201
file.close();

examples/companion_radio/MyMesh.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ int MyMesh::calcRxDelay(float score, uint32_t air_time) const {
210210
return (int)((pow(_prefs.rx_delay_base, 0.85f - score) - 1.0) * air_time);
211211
}
212212

213+
uint8_t MyMesh::getExtraAckTransmitCount() const {
214+
return _prefs.multi_acks;
215+
}
216+
213217
void MyMesh::logRxRaw(float snr, float rssi, const uint8_t raw[], int len) {
214218
if (_serial->isConnected() && len + 3 <= MAX_FRAME_SIZE) {
215219
int i = 0;
@@ -719,7 +723,7 @@ void MyMesh::handleCmdFrame(size_t len) {
719723
i += 4;
720724
memcpy(&out_frame[i], &lon, 4);
721725
i += 4;
722-
out_frame[i++] = 0; // reserved
726+
out_frame[i++] = _prefs.multi_acks; // new v7+
723727
out_frame[i++] = _prefs.advert_loc_policy;
724728
out_frame[i++] = (_prefs.telemetry_mode_env << 4) | (_prefs.telemetry_mode_loc << 2) |
725729
(_prefs.telemetry_mode_base); // v5+
@@ -1050,6 +1054,9 @@ void MyMesh::handleCmdFrame(size_t len) {
10501054

10511055
if (len >= 4) {
10521056
_prefs.advert_loc_policy = cmd_frame[3];
1057+
if (len >= 5) {
1058+
_prefs.multi_acks = cmd_frame[4];
1059+
}
10531060
}
10541061
}
10551062
savePrefs();

examples/companion_radio/MyMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class MyMesh : public BaseChatMesh, public DataStoreHost {
9797
float getAirtimeBudgetFactor() const override;
9898
int getInterferenceThreshold() const override;
9999
int calcRxDelay(float score, uint32_t air_time) const override;
100+
uint8_t getExtraAckTransmitCount() const override;
100101

101102
void logRxRaw(float snr, float rssi, const uint8_t raw[], int len) override;
102103
bool isAutoAddEnabled() const override;

examples/companion_radio/NodePrefs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ struct NodePrefs { // persisted to file
1414
float freq;
1515
uint8_t sf;
1616
uint8_t cr;
17-
uint8_t reserved1;
17+
uint8_t multi_acks;
1818
uint8_t manual_add_contacts;
1919
float bw;
2020
uint8_t tx_power_dbm;

src/helpers/BaseChatMesh.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,15 @@ void BaseChatMesh::sendAckTo(const ContactInfo& dest, uint32_t ack_hash) {
3636
mesh::Packet* ack = createAck(ack_hash);
3737
if (ack) sendFlood(ack, TXT_ACK_DELAY);
3838
} else {
39-
mesh::Packet* a1 = createMultiAck(ack_hash, 1);
40-
if (a1) sendDirect(a1, dest.out_path, dest.out_path_len, TXT_ACK_DELAY);
39+
uint32_t d = TXT_ACK_DELAY;
40+
if (getExtraAckTransmitCount() > 0) {
41+
mesh::Packet* a1 = createMultiAck(ack_hash, 1);
42+
if (a1) sendDirect(a1, dest.out_path, dest.out_path_len, d);
43+
d += 300;
44+
}
4145

4246
mesh::Packet* a2 = createAck(ack_hash);
43-
if (a2) sendDirect(a2, dest.out_path, dest.out_path_len, TXT_ACK_DELAY + 300);
47+
if (a2) sendDirect(a2, dest.out_path, dest.out_path_len, d);
4448
}
4549
}
4650

0 commit comments

Comments
 (0)