Files
MeshCore-Solo/src/helpers/radiolib/CustomLR1110.h
T

82 lines
2.9 KiB
C++
Raw Normal View History

2025-02-14 09:54:06 +01:00
#pragma once
#include <RadioLib.h>
#include "MeshCore.h"
2025-02-14 09:54:06 +01:00
class CustomLR1110 : public LR1110 {
2026-07-17 21:45:31 +10:00
uint32_t _preambleMillis = 66;
uint32_t _maxPayloadMillis = 3934;
uint32_t _activityAt = 0;
bool _headerSeen = false;
2026-03-13 13:48:36 +01:00
bool _rx_boosted = false;
2025-02-14 09:54:06 +01:00
public:
CustomLR1110(Module *mod) : LR1110(mod) { }
2025-10-12 16:09:57 +01:00
size_t getPacketLength(bool update) override {
size_t len = LR1110::getPacketLength(update);
2025-10-24 20:12:02 +01:00
if (len == 0 && getIrqStatus() & RADIOLIB_LR11X0_IRQ_HEADER_ERR) {
2026-01-03 18:54:48 -07:00
// we've just received a corrupted packet
2025-10-24 20:12:02 +01:00
// this may have triggered a bug causing subsequent packets to be shifted
// call standby() to return radio to known-good state
// recvRaw will call startReceive() to restart rx
MESH_DEBUG_PRINTLN("LR1110: got header err, calling standby()");
standby();
2025-10-12 16:09:57 +01:00
}
return len;
}
2025-10-25 22:12:30 +01:00
float getFreqMHz() const { return freqMHz; }
2026-03-13 13:48:36 +01:00
int16_t setRxBoostedGainMode(bool en) {
_rx_boosted = en;
return LR1110::setRxBoostedGainMode(en);
}
bool getRxBoostedGainMode() const { return _rx_boosted; }
2025-02-14 09:54:06 +01:00
bool isReceiving() {
2026-07-17 21:45:31 +10:00
uint32_t irq = getIrqStatus();
bool preamble = irq & RADIOLIB_LR11X0_IRQ_PREAMBLE_DETECTED; // bit 4
bool header = irq & RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID; // bit 5
bool hdrErr = irq & RADIOLIB_LR11X0_IRQ_HEADER_ERR; // bit 6
uint32_t now = millis();
if (hdrErr) {
clearIrqState(RADIOLIB_LR11X0_IRQ_PREAMBLE_DETECTED | RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID | RADIOLIB_LR11X0_IRQ_HEADER_ERR);
_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);
clearIrqState(RADIOLIB_LR11X0_IRQ_PREAMBLE_DETECTED | RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID | RADIOLIB_LR11X0_IRQ_HEADER_ERR);
_activityAt = 0; _headerSeen = false;
return false;
}
return true;
}
if (preamble) {
if (_activityAt == 0) _activityAt = now;
if (now - _activityAt > _preambleMillis) {
clearIrqState(RADIOLIB_LR11X0_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) {
2026-07-17 21:45:31 +10:00
MESH_DEBUG_PRINTLN("Setting _preambleMillis=%u, _maxPacketMillis=%u", maxPacketMillis.preambleMillis, maxPacketMillis.payloadMillis);
_preambleMillis = maxPacketMillis.preambleMillis;
_maxPayloadMillis = maxPacketMillis.payloadMillis;
2025-02-14 09:54:06 +01:00
}
uint8_t getSpreadingFactor() const { return spreadingFactor; }
2025-02-14 09:54:06 +01:00
};