Browse Source

Use hardware channel activity detection for checking interference

pull/1727/head
Wessel Nieboer 4 months ago
parent
commit
4f9a091671
No known key found for this signature in database GPG Key ID: 929C8E45E33B5FD2
  1. 2
      examples/companion_radio/MyMesh.cpp
  2. 2
      examples/simple_repeater/MyMesh.cpp
  3. 2
      examples/simple_room_server/MyMesh.cpp
  4. 2
      examples/simple_sensor/SensorMesh.cpp
  5. 13
      src/helpers/radiolib/RadioLibWrappers.cpp
  6. 3
      src/helpers/radiolib/RadioLibWrappers.h

2
examples/companion_radio/MyMesh.cpp

@ -259,7 +259,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 {

2
examples/simple_repeater/MyMesh.cpp

@ -892,7 +892,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
_prefs.flood_max = 64; _prefs.flood_max = 64;
_prefs.flood_max_unscoped = 64; _prefs.flood_max_unscoped = 64;
_prefs.flood_max_advert = 8; _prefs.flood_max_advert = 8;
_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

2
examples/simple_room_server/MyMesh.cpp

@ -649,7 +649,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
_prefs.flood_max = 64; _prefs.flood_max = 64;
_prefs.flood_max_unscoped = 64; _prefs.flood_max_unscoped = 64;
_prefs.flood_max_advert = 8; _prefs.flood_max_advert = 8;
_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

2
examples/simple_sensor/SensorMesh.cpp

@ -725,7 +725,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;

13
src/helpers/radiolib/RadioLibWrappers.cpp

@ -178,10 +178,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 {

3
src/helpers/radiolib/RadioLibWrappers.h

@ -32,7 +32,7 @@ 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();
@ -46,6 +46,7 @@ public:
virtual uint8_t getSpreadingFactor() const { return LORA_SF; } virtual uint8_t getSpreadingFactor() const { return LORA_SF; }
static uint16_t preambleLengthForSF(uint8_t sf) { return sf <= 8 ? 32 : 16; } static uint16_t preambleLengthForSF(uint8_t sf) { return sf <= 8 ? 32 : 16; }
void updatePreamble(uint8_t sf) { _preamble_sf = sf; _radio->setPreambleLength(preambleLengthForSF(sf)); } void updatePreamble(uint8_t sf) { _preamble_sf = sf; _radio->setPreambleLength(preambleLengthForSF(sf)); }
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;

Loading…
Cancel
Save