Browse Source
Use hardware channel activity detection for checking interference
pull/1727/head
Wessel Nieboer
4 months ago
No known key found for this signature in database
GPG Key ID: 929C8E45E33B5FD2
6 changed files with
16 additions and
8 deletions
-
examples/companion_radio/MyMesh.cpp
-
examples/simple_repeater/MyMesh.cpp
-
examples/simple_room_server/MyMesh.cpp
-
examples/simple_sensor/SensorMesh.cpp
-
src/helpers/radiolib/RadioLibWrappers.cpp
-
src/helpers/radiolib/RadioLibWrappers.h
|
|
@ -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 { |
|
|
|
|
|
@ -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
|
|
|
|
|
|
@ -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 |
|
|
|
|
|
@ -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; |
|
|
|
|
|
@ -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 { |
|
|
|
|
|
@ -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; |
|
|
|