| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #pragma once
- #include <Mesh.h>
- #include <RadioLib.h>
- class RadioLibWrapper : public mesh::Radio {
- protected:
- PhysicalLayer* _radio;
- mesh::MainBoard* _board;
- uint32_t n_recv, n_sent, n_recv_errors;
- int16_t _noise_floor, _threshold;
- uint16_t _num_floor_samples;
- int32_t _floor_sample_sum;
- uint8_t _preamble_sf;
- void idle();
- void startRecv();
- float packetScoreInt(float snr, int sf, int packet_len);
- virtual bool isReceivingPacket() =0;
- virtual void doResetAGC();
- public:
- RadioLibWrapper(PhysicalLayer& radio, mesh::MainBoard& board) : _radio(&radio), _board(&board), _preamble_sf(0) { n_recv = n_sent = 0; }
- void begin() override;
- virtual void powerOff() { _radio->sleep(); }
- int recvRaw(uint8_t* bytes, int sz) override;
- uint32_t getEstAirtimeFor(int len_bytes) override;
- bool startSendRaw(const uint8_t* bytes, int len) override;
- bool isSendComplete() override;
- void onSendFinished() override;
- bool isInRecvMode() const override;
- bool isChannelActive();
- bool isReceiving() override {
- if (isReceivingPacket()) return true;
- return isChannelActive();
- }
- virtual void setParams(float freq, float bw, uint8_t sf, uint8_t cr) = 0;
- uint32_t getRngSeed();
- void setTxPower(int8_t dbm);
- virtual float getCurrentRSSI() =0;
- virtual uint8_t getSpreadingFactor() const { return LORA_SF; }
- static uint16_t preambleLengthForSF(uint8_t sf) { return sf <= 8 ? 32 : 16; }
- void updatePreamble(uint8_t sf) { _preamble_sf = sf; _radio->setPreambleLength(preambleLengthForSF(sf)); }
- int getNoiseFloor() const override { return _noise_floor; }
- void triggerNoiseFloorCalibrate(int threshold) override;
- void resetAGC() override;
- void loop() override;
- uint32_t getPacketsRecv() const { return n_recv; }
- uint32_t getPacketsRecvErrors() const { return n_recv_errors; }
- uint32_t getPacketsSent() const { return n_sent; }
- void resetStats() { n_recv = n_sent = n_recv_errors = 0; }
- virtual float getLastRSSI() const override;
- virtual float getLastSNR() const override;
- float packetScore(float snr, int packet_len) override { return packetScoreInt(snr, 10, packet_len); } // assume sf=10
- virtual void setRxBoostedGainMode(bool) { }
- virtual bool getRxBoostedGainMode() const { return false; }
- };
- /**
- * \brief an RNG impl using the noise from the LoRa radio as entropy.
- * NOTE: this is VERY SLOW! Use only for things like creating new LocalIdentity
- */
- class RadioNoiseListener : public mesh::RNG {
- PhysicalLayer* _radio;
- public:
- RadioNoiseListener(PhysicalLayer& radio): _radio(&radio) { }
- void random(uint8_t* dest, size_t sz) override {
- for (int i = 0; i < sz; i++) {
- dest[i] = _radio->randomByte() ^ (::random(0, 256) & 0xFF);
- }
- }
- };
|