#pragma once #include #include "MeshCore.h" class CustomLR1110 : public LR1110 { uint32_t _preambleMillis = 66; uint32_t _maxPayloadMillis = 3934; uint32_t _activityAt = 0; bool _headerSeen = false; bool _rx_boosted = false; public: CustomLR1110(Module *mod) : LR1110(mod) { } size_t getPacketLength(bool update) override { size_t len = LR1110::getPacketLength(update); if (len == 0 && getIrqStatus() & RADIOLIB_LR11X0_IRQ_HEADER_ERR) { // we've just received a corrupted packet // 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(); } return len; } float getFreqMHz() const { return freqMHz; } int16_t setRxBoostedGainMode(bool en) { _rx_boosted = en; return LR1110::setRxBoostedGainMode(en); } bool getRxBoostedGainMode() const { return _rx_boosted; } bool isReceiving() { 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) { MESH_DEBUG_PRINTLN("Setting _preambleMillis=%u, _maxPacketMillis=%u", maxPacketMillis.preambleMillis, maxPacketMillis.payloadMillis); _preambleMillis = maxPacketMillis.preambleMillis; _maxPayloadMillis = maxPacketMillis.payloadMillis; } uint8_t getSpreadingFactor() const { return spreadingFactor; } };