Use hardware channel activity detection for checking interference
This commit is contained in:
committed by
Wessel Nieboer
parent
fb726e48c2
commit
952d12c8b9
@@ -255,7 +255,7 @@ float MyMesh::getAirtimeBudgetFactor() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int MyMesh::getInterferenceThreshold() const {
|
int MyMesh::getInterferenceThreshold() const {
|
||||||
return 0; // disabled for now, until currentRSSI() problem is resolved
|
return 1; // non-zero enables hardware CAD (Channel Activity Detection) before TX
|
||||||
}
|
}
|
||||||
|
|
||||||
int MyMesh::calcRxDelay(float score, uint32_t air_time) const {
|
int MyMesh::calcRxDelay(float score, uint32_t air_time) const {
|
||||||
|
|||||||
@@ -871,7 +871,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
||||||
_prefs.flood_advert_interval = 12; // 12 hours
|
_prefs.flood_advert_interval = 12; // 12 hours
|
||||||
_prefs.flood_max = 64;
|
_prefs.flood_max = 64;
|
||||||
_prefs.interference_threshold = 0; // disabled
|
_prefs.interference_threshold = 1; // non-zero enables hardware CAD before TX
|
||||||
|
|
||||||
// bridge defaults
|
// bridge defaults
|
||||||
_prefs.bridge_enabled = 1; // enabled
|
_prefs.bridge_enabled = 1; // enabled
|
||||||
|
|||||||
@@ -622,7 +622,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
|
||||||
_prefs.flood_advert_interval = 12; // 12 hours
|
_prefs.flood_advert_interval = 12; // 12 hours
|
||||||
_prefs.flood_max = 64;
|
_prefs.flood_max = 64;
|
||||||
_prefs.interference_threshold = 0; // disabled
|
_prefs.interference_threshold = 1; // non-zero enables hardware CAD before TX
|
||||||
#ifdef ROOM_PASSWORD
|
#ifdef ROOM_PASSWORD
|
||||||
StrHelper::strncpy(_prefs.guest_password, ROOM_PASSWORD, sizeof(_prefs.guest_password));
|
StrHelper::strncpy(_prefs.guest_password, ROOM_PASSWORD, sizeof(_prefs.guest_password));
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -723,7 +723,7 @@ SensorMesh::SensorMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::Millise
|
|||||||
_prefs.flood_advert_interval = 0; // disabled
|
_prefs.flood_advert_interval = 0; // disabled
|
||||||
_prefs.disable_fwd = true;
|
_prefs.disable_fwd = true;
|
||||||
_prefs.flood_max = 64;
|
_prefs.flood_max = 64;
|
||||||
_prefs.interference_threshold = 0; // disabled
|
_prefs.interference_threshold = 1; // non-zero enables hardware CAD before TX
|
||||||
|
|
||||||
// GPS defaults
|
// GPS defaults
|
||||||
_prefs.gps_enabled = 0;
|
_prefs.gps_enabled = 0;
|
||||||
|
|||||||
@@ -168,10 +168,17 @@ void RadioLibWrapper::onSendFinished() {
|
|||||||
state = STATE_IDLE;
|
state = STATE_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t RadioLibWrapper::performChannelScan() {
|
||||||
|
return _radio->scanChannel();
|
||||||
|
}
|
||||||
|
|
||||||
bool RadioLibWrapper::isChannelActive() {
|
bool RadioLibWrapper::isChannelActive() {
|
||||||
return _threshold == 0
|
if (_threshold == 0) return false; // interference check is disabled
|
||||||
? false // interference check is disabled
|
|
||||||
: getCurrentRSSI() > _noise_floor + _threshold;
|
int16_t result = performChannelScan();
|
||||||
|
// scanChannel() leaves radio in standby — restart RX regardless of result
|
||||||
|
startRecv();
|
||||||
|
return (result == RADIOLIB_LORA_DETECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
float RadioLibWrapper::getLastRSSI() const {
|
float RadioLibWrapper::getLastRSSI() const {
|
||||||
|
|||||||
@@ -31,13 +31,14 @@ public:
|
|||||||
bool isInRecvMode() const override;
|
bool isInRecvMode() const override;
|
||||||
bool isChannelActive();
|
bool isChannelActive();
|
||||||
|
|
||||||
bool isReceiving() override {
|
bool isReceiving() override {
|
||||||
if (isReceivingPacket()) return true;
|
if (isReceivingPacket()) return true;
|
||||||
|
|
||||||
return isChannelActive();
|
return isChannelActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual float getCurrentRSSI() =0;
|
virtual float getCurrentRSSI() =0;
|
||||||
|
virtual int16_t performChannelScan();
|
||||||
|
|
||||||
int getNoiseFloor() const override { return _noise_floor; }
|
int getNoiseFloor() const override { return _noise_floor; }
|
||||||
void triggerNoiseFloorCalibrate(int threshold) override;
|
void triggerNoiseFloorCalibrate(int threshold) override;
|
||||||
|
|||||||
Reference in New Issue
Block a user