* new Dispatcher::getCADFailRetryDelay()

This commit is contained in:
Scott Powell
2025-02-27 04:05:50 +11:00
parent be2af61dfe
commit 06d8ae8d19
13 changed files with 55 additions and 15 deletions

View File

@@ -20,7 +20,7 @@
/* ------------------------------ Config -------------------------------- */
#define FIRMWARE_VER_TEXT "v5 (build: 25 Feb 2025)"
#define FIRMWARE_VER_TEXT "v6 (build: 27 Feb 2025)"
#ifndef LORA_FREQ
#define LORA_FREQ 915.0

View File

@@ -20,7 +20,7 @@
/* ------------------------------ Config -------------------------------- */
#define FIRMWARE_VER_TEXT "v5 (build: 25 Feb 2025)"
#define FIRMWARE_VER_TEXT "v6 (build: 27 Feb 2025)"
#ifndef LORA_FREQ
#define LORA_FREQ 915.0

View File

@@ -26,6 +26,10 @@ int Dispatcher::calcRxDelay(float score, uint32_t air_time) const {
return (int) ((pow(10, 0.85f - score) - 1.0) * air_time);
}
uint32_t Dispatcher::getCADFailRetryDelay() const {
return 200;
}
void Dispatcher::loop() {
if (outbound) { // waiting for outbound send to be completed
if (_radio->isSendComplete()) {
@@ -165,7 +169,10 @@ void Dispatcher::processRecvPacket(Packet* pkt) {
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; // LBT - check if radio is currently mid-receive, or if channel activity
if (_radio->isReceiving()) { // LBT - check if radio is currently mid-receive, or if channel activity
next_tx_time = futureMillis(getCADFailRetryDelay());
return;
}
outbound = _mgr->getNextOutbound(_ms->getMillis());
if (outbound) {

View File

@@ -124,6 +124,7 @@ protected:
virtual float getAirtimeBudgetFactor() const;
virtual int calcRxDelay(float score, uint32_t air_time) const;
virtual uint32_t getCADFailRetryDelay() const;
public:
void begin();

View File

@@ -23,6 +23,10 @@ uint32_t Mesh::getDirectRetransmitDelay(const Packet* packet) {
return 0; // by default, no delay
}
uint32_t Mesh::getCADFailRetryDelay() const {
return _rng->nextInt(1, 4)*120;
}
int Mesh::searchPeersByHash(const uint8_t* hash) {
return 0; // not found
}

View File

@@ -58,6 +58,8 @@ class Mesh : public Dispatcher {
protected:
DispatcherAction onRecvPacket(Packet* pkt) override;
virtual uint32_t getCADFailRetryDelay() const override;
/**
* \brief Decide what to do with received packet, ie. discard, forward, or hold
*/

View File

@@ -12,8 +12,11 @@ public:
idle(); // put sx126x into standby
// do some basic CAD (blocks for ~12780 micros (on SF 10)!)
bool activity = (((CustomLLCC68 *)_radio)->scanChannel() == RADIOLIB_LORA_DETECTED);
idle();
if (activity) {
startRecv();
} else {
idle();
}
return activity;
}
float getLastRSSI() const override { return ((CustomLLCC68 *)_radio)->getRSSI(); }

View File

@@ -12,8 +12,11 @@ public:
idle(); // put sx126x into standby
// do some basic CAD (blocks for ~12780 micros (on SF 10)!)
bool activity = (((CustomLR1110 *)_radio)->scanChannel() == RADIOLIB_LORA_DETECTED);
idle();
if (activity) {
startRecv();
} else {
idle();
}
return activity;
}

View File

@@ -13,8 +13,11 @@ public:
idle(); // put sx126x into standby
// do some basic CAD (blocks for ~12780 micros (on SF 10)!)
bool activity = (((CustomSX1262 *)_radio)->scanChannel() == RADIOLIB_LORA_DETECTED);
idle();
if (activity) {
startRecv();
} else {
idle();
}
return activity;
}
float getLastRSSI() const override { return ((CustomSX1262 *)_radio)->getRSSI(); }

View File

@@ -12,8 +12,11 @@ public:
idle(); // put sx126x into standby
// do some basic CAD (blocks for ~12780 micros (on SF 10)!)
bool activity = (((CustomSX1268 *)_radio)->scanChannel() == RADIOLIB_LORA_DETECTED);
idle();
if (activity) {
startRecv();
} else {
idle();
}
return activity;
}
float getLastRSSI() const override { return ((CustomSX1268 *)_radio)->getRSSI(); }

View File

@@ -12,8 +12,11 @@ public:
idle(); // put into standby
// do some basic CAD (blocks for ~12780 micros (on SF 10)!)
bool activity = (((CustomSX1276 *)_radio)->tryScanChannel() == RADIOLIB_PREAMBLE_DETECTED);
idle();
if (activity) {
startRecv();
} else {
idle();
}
return activity;
}
float getLastRSSI() const override { return ((CustomSX1276 *)_radio)->getRSSI(); }

View File

@@ -35,6 +35,15 @@ void RadioLibWrapper::idle() {
state = STATE_IDLE; // need another startReceive()
}
void RadioLibWrapper::startRecv() {
int err = _radio->startReceive();
if (err == RADIOLIB_ERR_NONE) {
state = STATE_RX;
} else {
MESH_DEBUG_PRINTLN("RadioLibWrapper: error: startReceive(%d)", err);
}
}
int RadioLibWrapper::recvRaw(uint8_t* bytes, int sz) {
if (state & STATE_INT_READY) {
int len = _radio->getPacketLength();
@@ -54,10 +63,11 @@ int RadioLibWrapper::recvRaw(uint8_t* bytes, int sz) {
if (state != STATE_RX) {
int err = _radio->startReceive();
if (err != RADIOLIB_ERR_NONE) {
if (err == RADIOLIB_ERR_NONE) {
state = STATE_RX;
} else {
MESH_DEBUG_PRINTLN("RadioLibWrapper: error: startReceive(%d)", err);
}
state = STATE_RX;
}
return 0;
}

View File

@@ -10,6 +10,7 @@ protected:
uint32_t n_recv, n_sent;
void idle();
void startRecv();
float packetScoreInt(float snr, int sf, int packet_len);
public: