Skip to content

Commit 7c8e092

Browse files
committed
Have CAD be a separate toggle (set cad on/off)
1 parent 099ef67 commit 7c8e092

15 files changed

Lines changed: 68 additions & 14 deletions

File tree

docs/cli_commands.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,20 @@ This document provides an overview of CLI commands that can be sent to MeshCore
578578

579579
---
580580

581+
#### Enable or disable hardware Channel Activity Detection (CAD)
582+
**Usage:**
583+
- `get cad`
584+
- `set cad <on|off>`
585+
586+
**Description:** When enabled, the radio performs a hardware Channel Activity Detection scan before transmitting and defers if the channel is busy. Runs independently of `int.thresh` — either, both, or none may be active.
587+
588+
**Parameters:**
589+
- `on|off`: Enable or disable hardware CAD
590+
591+
**Default:** `off`
592+
593+
---
594+
581595
#### View or change the AGC Reset Interval
582596
**Usage:**
583597
- `get agc.reset.interval`

examples/companion_radio/MyMesh.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,10 @@ float MyMesh::getAirtimeBudgetFactor() const {
259259
}
260260

261261
int MyMesh::getInterferenceThreshold() const {
262-
return 1; // non-zero enables hardware CAD (Channel Activity Detection) before TX
262+
return 0; // disabled for now, until currentRSSI() problem is resolved
263+
}
264+
bool MyMesh::getCADEnabled() const {
265+
return true; // hardware CAD before TX (no CLI toggle on companion; enabled by default)
263266
}
264267

265268
int MyMesh::calcRxDelay(float score, uint32_t air_time) const {

examples/companion_radio/MyMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class MyMesh : public BaseChatMesh, public DataStoreHost {
105105
protected:
106106
float getAirtimeBudgetFactor() const override;
107107
int getInterferenceThreshold() const override;
108+
bool getCADEnabled() const override;
108109
int calcRxDelay(float score, uint32_t air_time) const override;
109110
uint32_t getRetransmitDelay(const mesh::Packet *packet) override;
110111
uint32_t getDirectRetransmitDelay(const mesh::Packet *packet) override;

examples/simple_repeater/MyMesh.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,8 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
892892
_prefs.flood_max = 64;
893893
_prefs.flood_max_unscoped = 64;
894894
_prefs.flood_max_advert = 8;
895-
_prefs.interference_threshold = 1; // non-zero enables hardware CAD before TX
895+
_prefs.interference_threshold = 0; // disabled
896+
_prefs.cad_enabled = 0; // hardware CAD before TX (off by default; 'set cad on')
896897

897898
// bridge defaults
898899
_prefs.bridge_enabled = 1; // enabled

examples/simple_repeater/MyMesh.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
150150
int getInterferenceThreshold() const override {
151151
return _prefs.interference_threshold;
152152
}
153+
bool getCADEnabled() const override {
154+
return _prefs.cad_enabled;
155+
}
153156
int getAGCResetInterval() const override {
154157
return ((int)_prefs.agc_reset_interval) * 4000; // milliseconds
155158
}

examples/simple_room_server/MyMesh.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,8 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
649649
_prefs.flood_max = 64;
650650
_prefs.flood_max_unscoped = 64;
651651
_prefs.flood_max_advert = 8;
652-
_prefs.interference_threshold = 1; // non-zero enables hardware CAD before TX
652+
_prefs.interference_threshold = 0; // disabled
653+
_prefs.cad_enabled = 0; // hardware CAD before TX (off by default; 'set cad on')
653654
#ifdef ROOM_PASSWORD
654655
StrHelper::strncpy(_prefs.guest_password, ROOM_PASSWORD, sizeof(_prefs.guest_password));
655656
#endif

examples/simple_room_server/MyMesh.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
144144
int getInterferenceThreshold() const override {
145145
return _prefs.interference_threshold;
146146
}
147+
bool getCADEnabled() const override {
148+
return _prefs.cad_enabled;
149+
}
147150
int getAGCResetInterval() const override {
148151
return ((int)_prefs.agc_reset_interval) * 4000; // milliseconds
149152
}

examples/simple_sensor/SensorMesh.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,9 @@ uint32_t SensorMesh::getDirectRetransmitDelay(const mesh::Packet* packet) {
323323
int SensorMesh::getInterferenceThreshold() const {
324324
return _prefs.interference_threshold;
325325
}
326+
bool SensorMesh::getCADEnabled() const {
327+
return _prefs.cad_enabled;
328+
}
326329
int SensorMesh::getAGCResetInterval() const {
327330
return ((int)_prefs.agc_reset_interval) * 4000; // milliseconds
328331
}
@@ -725,7 +728,8 @@ SensorMesh::SensorMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::Millise
725728
_prefs.flood_advert_interval = 0; // disabled
726729
_prefs.disable_fwd = true;
727730
_prefs.flood_max = 64;
728-
_prefs.interference_threshold = 1; // non-zero enables hardware CAD before TX
731+
_prefs.interference_threshold = 0; // disabled
732+
_prefs.cad_enabled = 0; // hardware CAD before TX (off by default; 'set cad on')
729733

730734
// GPS defaults
731735
_prefs.gps_enabled = 0;

examples/simple_sensor/SensorMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class SensorMesh : public mesh::Mesh, public CommonCLICallbacks {
120120
uint32_t getRetransmitDelay(const mesh::Packet* packet) override;
121121
uint32_t getDirectRetransmitDelay(const mesh::Packet* packet) override;
122122
int getInterferenceThreshold() const override;
123+
bool getCADEnabled() const override;
123124
int getAGCResetInterval() const override;
124125
void onAnonDataRecv(mesh::Packet* packet, const uint8_t* secret, const mesh::Identity& sender, uint8_t* data, size_t len) override;
125126
int searchPeersByHash(const uint8_t* hash) override;

src/Dispatcher.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ uint32_t Dispatcher::getCADFailMaxDuration() const {
6666
void Dispatcher::loop() {
6767
if (millisHasNowPassed(next_floor_calib_time)) {
6868
_radio->triggerNoiseFloorCalibrate(getInterferenceThreshold());
69+
_radio->setCADEnabled(getCADEnabled());
6970
next_floor_calib_time = futureMillis(NOISE_FLOOR_CALIB_INTERVAL);
7071
}
7172
_radio->loop();

0 commit comments

Comments
 (0)