#pragma once #include class CustomSTM32WLx : public STM32WLx { uint32_t _preambleMillis = 66; uint32_t _maxPayloadMillis = 3934; uint32_t _activityAt = 0; bool _headerSeen = false; public: CustomSTM32WLx(STM32WLx_Module *mod) : STM32WLx(mod) { } int16_t startReceive() override { // include the PREAMBLE_DETECTED irq bit in reported flags return STM32WLx::startReceive(RADIOLIB_SX126X_RX_TIMEOUT_INF, RADIOLIB_IRQ_RX_DEFAULT_FLAGS | (1UL << RADIOLIB_IRQ_PREAMBLE_DETECTED), RADIOLIB_IRQ_RX_DEFAULT_MASK, 0); } bool isReceiving() { 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 && _headerSeen) { // something cleared the header flag, reset our state. _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) { clearIrqFlags(RADIOLIB_SX126X_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 setPreambleMillis(uint32_t preambleMillis) { _preambleMillis = preambleMillis; MESH_DEBUG_PRINTLN("Set _preambleMillis=%u", _preambleMillis); } void setMaxPayloadMillis(uint32_t payloadMillis) { _maxPayloadMillis = payloadMillis; MESH_DEBUG_PRINTLN("Set _maxPayloadMillis=%u", _maxPayloadMillis); } };