From de27dfacb6a4bf2a98fdf8e6d42f4718121a2bdf Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Tue, 21 Jan 2025 13:37:32 +1100 Subject: [PATCH] * basic CAD before TX, for sx126x wrappers --- src/Dispatcher.cpp | 2 +- src/helpers/CustomSX1262Wrapper.h | 9 ++++++++- src/helpers/CustomSX1268Wrapper.h | 9 ++++++++- src/helpers/RadioLibWrappers.cpp | 5 +++++ src/helpers/RadioLibWrappers.h | 2 ++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index 6e964558..d1fdcfbc 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -121,7 +121,7 @@ void Dispatcher::checkRecv() { void Dispatcher::checkSend() { if (_mgr->getOutboundCount() == 0) return; // nothing waiting to send if (!millisHasNowPassed(next_tx_time)) return; // still in 'radio silence' phase (from airtime budget setting) - if (_radio->isReceiving()) return; // check if radio is currently mid-receive + if (_radio->isReceiving()) return; // LBT - check if radio is currently mid-receive, or if channel activity outbound = _mgr->getNextOutbound(_ms->getMillis()); if (outbound) { diff --git a/src/helpers/CustomSX1262Wrapper.h b/src/helpers/CustomSX1262Wrapper.h index 9959fbf8..cb85d4ea 100644 --- a/src/helpers/CustomSX1262Wrapper.h +++ b/src/helpers/CustomSX1262Wrapper.h @@ -6,7 +6,14 @@ class CustomSX1262Wrapper : public RadioLibWrapper { public: CustomSX1262Wrapper(CustomSX1262& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } - bool isReceiving() override { return ((CustomSX1262 *)_radio)->isReceiving(); } + bool isReceiving() override { + if (((CustomSX1262 *)_radio)->isReceiving()) return true; + + idle(); // put sx126x into standby + // do some basic CAD (blocks for ~12780 micros (on SF 10)!) + if (((CustomSX1262 *)_radio)->scanChannel() == RADIOLIB_LORA_DETECTED) return true; + return false; + } float getLastRSSI() const override { return ((CustomSX1262 *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomSX1262 *)_radio)->getSNR(); } }; diff --git a/src/helpers/CustomSX1268Wrapper.h b/src/helpers/CustomSX1268Wrapper.h index 4331a38b..2ed6e822 100644 --- a/src/helpers/CustomSX1268Wrapper.h +++ b/src/helpers/CustomSX1268Wrapper.h @@ -6,7 +6,14 @@ class CustomSX1268Wrapper : public RadioLibWrapper { public: CustomSX1268Wrapper(CustomSX1268& radio, mesh::MainBoard& board) : RadioLibWrapper(radio, board) { } - bool isReceiving() override { return ((CustomSX1268 *)_radio)->isReceiving(); } + bool isReceiving() override { + if (((CustomSX1268 *)_radio)->isReceiving()) return true; + + idle(); // put sx126x into standby + // do some basic CAD (blocks for ~12780 micros (on SF 10)!) + if (((CustomSX1268 *)_radio)->scanChannel() == RADIOLIB_LORA_DETECTED) return true; + return false; + } float getLastRSSI() const override { return ((CustomSX1268 *)_radio)->getRSSI(); } float getLastSNR() const override { return ((CustomSX1268 *)_radio)->getSNR(); } }; diff --git a/src/helpers/RadioLibWrappers.cpp b/src/helpers/RadioLibWrappers.cpp index 74d21812..ef035638 100644 --- a/src/helpers/RadioLibWrappers.cpp +++ b/src/helpers/RadioLibWrappers.cpp @@ -30,6 +30,11 @@ void RadioLibWrapper::begin() { } } +void RadioLibWrapper::idle() { + _radio->standby(); + state = STATE_IDLE; // need another startReceive() +} + int RadioLibWrapper::recvRaw(uint8_t* bytes, int sz) { if (state & STATE_INT_READY) { int len = _radio->getPacketLength(); diff --git a/src/helpers/RadioLibWrappers.h b/src/helpers/RadioLibWrappers.h index 13288464..4af18304 100644 --- a/src/helpers/RadioLibWrappers.h +++ b/src/helpers/RadioLibWrappers.h @@ -9,6 +9,8 @@ protected: mesh::MainBoard* _board; uint32_t n_recv, n_sent; + void idle(); + public: RadioLibWrapper(PhysicalLayer& radio, mesh::MainBoard& board) : _radio(&radio), _board(&board) { n_recv = n_sent = 0; }