|
|
|
@ -3,10 +3,12 @@ |
|
|
|
#include <RadioLib.h> |
|
|
|
#include "MeshCore.h" |
|
|
|
|
|
|
|
#define SX126X_IRQ_HEADER_VALID 0b0000010000 // 4 4 valid LoRa header received
|
|
|
|
#define SX126X_IRQ_PREAMBLE_DETECTED 0x04 |
|
|
|
|
|
|
|
class CustomSX1262 : public SX1262 { |
|
|
|
uint32_t _preambleMillis = 66; |
|
|
|
uint32_t _maxPayloadMillis = 3934; |
|
|
|
uint32_t _activityAt = 0; |
|
|
|
bool _headerSeen = false; |
|
|
|
|
|
|
|
public: |
|
|
|
CustomSX1262(Module *mod) : SX1262(mod) { } |
|
|
|
|
|
|
|
@ -99,9 +101,46 @@ class CustomSX1262 : public SX1262 { |
|
|
|
} |
|
|
|
|
|
|
|
bool isReceiving() { |
|
|
|
uint16_t irq = getIrqFlags(); |
|
|
|
bool detected = (irq & SX126X_IRQ_HEADER_VALID) || (irq & SX126X_IRQ_PREAMBLE_DETECTED); |
|
|
|
return detected; |
|
|
|
uint32_t irq = getIrqFlags(); |
|
|
|
bool preamble = irq & RADIOLIB_SX126X_IRQ_PREAMBLE_DETECTED; // bit 2
|
|
|
|
bool header = irq & RADIOLIB_SX126X_IRQ_HEADER_VALID; // bit 4
|
|
|
|
bool hdrErr = irq & RADIOLIB_SX126X_IRQ_HEADER_ERR; // bit 5
|
|
|
|
uint32_t now = millis(); |
|
|
|
if (hdrErr) { |
|
|
|
clearIrqFlags(RADIOLIB_SX126X_IRQ_PREAMBLE_DETECTED | RADIOLIB_SX126X_IRQ_HEADER_VALID | RADIOLIB_SX126X_IRQ_HEADER_ERR | RADIOLIB_SX126X_IRQ_SYNC_WORD_VALID); |
|
|
|
_activityAt = 0; |
|
|
|
_headerSeen = false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (header) { |
|
|
|
if (!_headerSeen) { _headerSeen = true; _activityAt = now; }; |
|
|
|
if (now - _activityAt > _maxPayloadMillis) { |
|
|
|
MESH_DEBUG_PRINTLN("Clearing header IRQ after %ums", _maxPayloadMillis); |
|
|
|
clearIrqFlags(RADIOLIB_SX126X_IRQ_PREAMBLE_DETECTED | RADIOLIB_SX126X_IRQ_HEADER_VALID | RADIOLIB_SX126X_IRQ_HEADER_ERR | RADIOLIB_SX126X_IRQ_SYNC_WORD_VALID); |
|
|
|
_activityAt = 0; _headerSeen = false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
if (preamble) { |
|
|
|
if (_activityAt == 0) _activityAt = now; |
|
|
|
if (now - _activityAt > _preambleMillis) { |
|
|
|
clearIrqStatus(RADIOLIB_IRQ_PREAMBLE_DETECTED); |
|
|
|
_activityAt = 0; |
|
|
|
MESH_DEBUG_PRINTLN("Clearing preamble IRQ after %ums", _preambleMillis); |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
_activityAt = 0; _headerSeen = false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
void setMaxPacketMillis(PacketMillis maxPacketMillis) { |
|
|
|
MESH_DEBUG_PRINTLN("Setting _preambleMillis=%u, _maxPacketMillis=%u", maxPacketMillis.preambleMillis, maxPacketMillis.payloadMillis); |
|
|
|
_preambleMillis = maxPacketMillis.preambleMillis; |
|
|
|
_maxPayloadMillis = maxPacketMillis.payloadMillis; |
|
|
|
} |
|
|
|
|
|
|
|
bool getRxBoostedGainMode() { |
|
|
|
|