Skip to content

Commit 36054c2

Browse files
committed
Dynamic CAD sensitivity
Probe every 4 seconds to measure actual channel activity. If channel seems busy we adjust CAD to be less sensitive. If channel seems empty maximum CAD sensitivity.
1 parent 64e8e24 commit 36054c2

14 files changed

Lines changed: 111 additions & 2 deletions

File tree

examples/simple_repeater/MyMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
216216
void removeNeighbor(const uint8_t* pubkey, int key_len) override;
217217
void formatStatsReply(char *reply) override;
218218
void formatRadioStatsReply(char *reply) override;
219+
mesh::Radio* getRadio() override { return _radio; }
219220
void formatPacketStatsReply(char *reply) override;
220221
void startRegionsLoad() override;
221222
bool saveRegions() override;

examples/simple_room_server/MyMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
212212
}
213213
void formatStatsReply(char *reply) override;
214214
void formatRadioStatsReply(char *reply) override;
215+
mesh::Radio* getRadio() override { return _radio; }
215216
void formatPacketStatsReply(char *reply) override;
216217
void startRegionsLoad() override;
217218
bool saveRegions() override;

examples/simple_sensor/SensorMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class SensorMesh : public mesh::Mesh, public CommonCLICallbacks {
7373
}
7474
void formatStatsReply(char *reply) override;
7575
void formatRadioStatsReply(char *reply) override;
76+
mesh::Radio* getRadio() override { return _radio; }
7677
void formatPacketStatsReply(char *reply) override;
7778
mesh::LocalIdentity& getSelfId() override { return self_id; }
7879
void saveIdentity(const mesh::LocalIdentity& new_id) override;

src/Dispatcher.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ class Radio {
6767

6868
virtual void setCADEnabled(bool enable) { }
6969

70+
/**
71+
* \brief query CAD auto-calibration state.
72+
* \param peak_offset current detPeak offset above the radio's default
73+
* \param hits/count ambient CAD detections in the last evaluated probe window
74+
* \returns false if this radio doesn't support CAD detPeak tuning.
75+
*/
76+
virtual bool getCADCalibState(uint8_t& peak_offset, uint8_t& hits, uint8_t& count) const { return false; }
77+
7078
virtual void resetAGC() { }
7179

7280
virtual bool isInRecvMode() const = 0;

src/Mesh.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ uint8_t Mesh::getExtraAckTransmitCount() const {
2727
}
2828

2929
uint32_t Mesh::getCADFailRetryDelay() const {
30-
return _rng->nextInt(1, 4)*120;
30+
return 120 + _rng->nextInt(0, 241); // continuous 120..360ms, so nearby nodes don't retry in lock-step
3131
}
3232

3333
int Mesh::searchPeersByHash(const uint8_t* hash) {

src/helpers/CommonCLI.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,13 @@ void CommonCLI::handleGetCmd(uint32_t sender_timestamp, char* command, char* rep
811811
} else if (memcmp(config, "int.thresh", 10) == 0) {
812812
sprintf(reply, "> %d", (uint32_t) _prefs->interference_threshold);
813813
} else if (memcmp(config, "cad", 3) == 0) {
814-
sprintf(reply, "> %s", _prefs->cad_enabled ? "on" : "off");
814+
uint8_t peak_offset, hits, count;
815+
mesh::Radio* radio = _callbacks->getRadio();
816+
if (_prefs->cad_enabled && radio != NULL && radio->getCADCalibState(peak_offset, hits, count)) {
817+
sprintf(reply, "> on (detPeak +%d, ambient %d/%d)", (int)peak_offset, (int)hits, (int)count);
818+
} else {
819+
sprintf(reply, "> %s", _prefs->cad_enabled ? "on" : "off");
820+
}
815821
} else if (memcmp(config, "agc.reset.interval", 18) == 0) {
816822
sprintf(reply, "> %d", ((uint32_t) _prefs->agc_reset_interval) * 4);
817823
} else if (memcmp(config, "multi.acks", 10) == 0) {

src/helpers/CommonCLI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class CommonCLICallbacks {
8181
virtual void eraseLogFile() = 0;
8282
virtual void dumpLogFile() = 0;
8383
virtual void setTxPower(int8_t power_dbm) = 0;
84+
virtual mesh::Radio* getRadio() { return NULL; }
8485
virtual void formatNeighborsReply(char *reply) = 0;
8586
virtual void removeNeighbor(const uint8_t* pubkey, int key_len) {
8687
// no op by default

src/helpers/radiolib/CustomLLCC68Wrapper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class CustomLLCC68Wrapper : public RadioLibWrapper {
3030
return packetScoreInt(snr, sf, packet_len);
3131
}
3232
uint8_t getSpreadingFactor() const override { return ((CustomLLCC68 *)_radio)->spreadingFactor; }
33+
uint8_t getCADDetPeakBase() const override { return getSpreadingFactor() + 13; } // Semtech DS.SX1261-2 recommended detPeak
3334

3435
void doResetAGC() override { sx126xResetAGC((SX126x *)_radio); }
3536

src/helpers/radiolib/CustomLR1110Wrapper.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ class CustomLR1110Wrapper : public RadioLibWrapper {
4040
float getLastSNR() const override { return ((CustomLR1110 *)_radio)->getSNR(); }
4141

4242
uint8_t getSpreadingFactor() const override { return ((CustomLR1110 *)_radio)->getSpreadingFactor(); }
43+
uint8_t getCADDetPeakBase() const override {
44+
// RadioLib LR11x0 default detPeak per SF5..12 (different scale than SX126x)
45+
static const uint8_t detPeakValues[8] = { 48, 48, 50, 55, 55, 59, 61, 65 };
46+
uint8_t sf = getSpreadingFactor();
47+
return (sf >= 5 && sf <= 12) ? detPeakValues[sf - 5] : 0;
48+
}
4349

4450
bool setRxBoostedGainMode(bool en) override {
4551
return ((CustomLR1110 *)_radio)->setRxBoostedGainMode(en) == RADIOLIB_ERR_NONE;

src/helpers/radiolib/CustomSTM32WLxWrapper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class CustomSTM32WLxWrapper : public RadioLibWrapper {
3131
return packetScoreInt(snr, sf, packet_len);
3232
}
3333
uint8_t getSpreadingFactor() const override { return ((CustomSTM32WLx *)_radio)->spreadingFactor; }
34+
uint8_t getCADDetPeakBase() const override { return getSpreadingFactor() + 13; } // Semtech DS.SX1261-2 recommended detPeak
3435

3536
void doResetAGC() override { sx126xResetAGC((SX126x *)_radio); }
3637
};

0 commit comments

Comments
 (0)