sx128x.h
  1  // Copyright Sandeep Mistry, Mark Qvist and Jacob Eva.
  2  // Licensed under the MIT license.
  3  
  4  #ifndef SX128X_H
  5  #define SX128X_H
  6  
  7  #include <Arduino.h>
  8  #include <SPI.h>
  9  #include "Modem.h"
 10  
 11  #define LORA_DEFAULT_SS_PIN     10
 12  #define LORA_DEFAULT_RESET_PIN  9
 13  #define LORA_DEFAULT_DIO0_PIN   2
 14  #define LORA_DEFAULT_RXEN_PIN  -1
 15  #define LORA_DEFAULT_TXEN_PIN  -1
 16  #define LORA_DEFAULT_BUSY_PIN  -1
 17  #define LORA_MODEM_TIMEOUT_MS   15E3
 18  #define PA_OUTPUT_RFO_PIN       0
 19  #define PA_OUTPUT_PA_BOOST_PIN  1
 20  #define RSSI_OFFSET             157
 21  
 22  class sx128x : public Stream {
 23  public:
 24    sx128x();
 25  
 26    int begin(unsigned long frequency);
 27    void end();
 28    void reset();
 29  
 30    int beginPacket(int implicitHeader = false);
 31    int endPacket();
 32  
 33    int parsePacket(int size = 0);
 34    int packetRssi();
 35    int packetRssi(uint8_t pkt_snr_raw);
 36    int currentRssi();
 37    uint8_t packetRssiRaw();
 38    uint8_t currentRssiRaw();
 39    uint8_t packetSnrRaw();
 40    float packetSnr();
 41    long packetFrequencyError();
 42  
 43    // from Print
 44    virtual size_t write(uint8_t byte);
 45    virtual size_t write(const uint8_t *buffer, size_t size);
 46  
 47    // from Stream
 48    virtual int available();
 49    virtual int read();
 50    virtual int peek();
 51    virtual void flush();
 52  
 53    void onReceive(void(*callback)(int));
 54  
 55    void receive(int size = 0);
 56    void standby();
 57    void sleep();
 58  
 59    bool preInit();
 60    uint8_t getTxPower();
 61    void setTxPower(int level, int outputPin = PA_OUTPUT_PA_BOOST_PIN);
 62    uint32_t getFrequency();
 63    void setFrequency(uint32_t frequency);
 64    void setSpreadingFactor(int sf);
 65    uint8_t getSpreadingFactor();
 66    uint32_t getSignalBandwidth();
 67    void setSignalBandwidth(uint32_t sbw);
 68    void setCodingRate4(int denominator);
 69    uint8_t getCodingRate4();
 70    void setPreambleLength(long preamble_symbols);
 71    void setSyncWord(int sw);
 72    bool dcd();
 73    void clearIRQStatus();
 74    void enableCrc();
 75    void disableCrc();
 76    void enableTCXO();
 77    void disableTCXO();
 78  
 79    void txAntEnable();
 80    void rxAntEnable();
 81    void loraMode();
 82    void waitOnBusy();
 83    void executeOpcode(uint8_t opcode, uint8_t *buffer, uint8_t size);
 84    void executeOpcodeRead(uint8_t opcode, uint8_t *buffer, uint8_t size);
 85    void writeBuffer(const uint8_t* buffer, size_t size);
 86    void readBuffer(uint8_t* buffer, size_t size);
 87    void setPacketParams(uint32_t target_preamble_symbols, uint8_t headermode, uint8_t payload_length, uint8_t crc);
 88    void setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr);
 89  
 90    void crc() { enableCrc(); }
 91    void noCrc() { disableCrc(); }
 92  
 93    void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN, int busy = LORA_DEFAULT_BUSY_PIN, int rxen = LORA_DEFAULT_RXEN_PIN, int txen = LORA_DEFAULT_TXEN_PIN);
 94    void setSPIFrequency(uint32_t frequency);
 95  
 96    void dumpRegisters(Stream& out);
 97  
 98  private:
 99    void explicitHeaderMode();
100    void implicitHeaderMode();
101  
102    bool getPacketValidity();
103    void handleDio0Rise();
104  
105    uint8_t readRegister(uint16_t address);
106    void writeRegister(uint16_t address, uint8_t value);
107    uint8_t singleTransfer(uint8_t opcode, uint16_t address, uint8_t value);
108  
109    static void onDio0Rise();
110  
111    void handleLowDataRate();
112    void optimizeModemSensitivity();
113  
114  private:
115    SPISettings _spiSettings;
116    int _ss;
117    int _reset;
118    int _dio0;
119    int _rxen;
120    int _txen;
121    int _busy;
122    int _modem;
123    unsigned long _frequency;
124    int _txp;
125    uint8_t _sf;
126    uint8_t _bw;
127    uint8_t _cr;
128    int _packetIndex;
129    uint32_t _preambleLength;
130    int _implicitHeaderMode;
131    int _payloadLength;
132    int _crcMode;
133    int _fifo_tx_addr_ptr;
134    int _fifo_rx_addr_ptr;
135    uint8_t _packet[256];
136    bool _preinit_done;
137    bool _tcxo;
138    bool _radio_online;
139    int _rxPacketLength;
140    uint32_t _bitrate;
141    void (*_receive_callback)(int);
142  };
143  
144  extern sx128x sx128x_modem;
145  
146  #endif