sx127x.h
  1  // Copyright Sandeep Mistry, Mark Qvist and Jacob Eva.
  2  // Licensed under the MIT license.
  3  
  4  #ifndef SX1276_H
  5  #define SX1276_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_BUSY_PIN  -1
 15  
 16  #define PA_OUTPUT_RFO_PIN      0
 17  #define PA_OUTPUT_PA_BOOST_PIN 1
 18  
 19  #define RSSI_OFFSET 157
 20  
 21  // Modem status flags
 22  #define SIG_DETECT 0x01
 23  #define SIG_SYNCED 0x02
 24  #define RX_ONGOING 0x04
 25  
 26  class sx127x : public Stream {
 27  public:
 28    sx127x();
 29  
 30    int begin(long frequency);
 31    void end();
 32  
 33    int beginPacket(int implicitHeader = false);
 34    int endPacket();
 35  
 36    int parsePacket(int size = 0);
 37    int packetRssi();
 38    int packetRssi(uint8_t pkt_snr_raw);
 39    int currentRssi();
 40    uint8_t packetRssiRaw();
 41    uint8_t currentRssiRaw();
 42    uint8_t packetSnrRaw();
 43    float packetSnr();
 44    long packetFrequencyError();
 45  
 46    // from Print
 47    virtual size_t write(uint8_t byte);
 48    virtual size_t write(const uint8_t *buffer, size_t size);
 49  
 50    // from Stream
 51    virtual int available();
 52    virtual int read();
 53    virtual int peek();
 54    virtual void flush();
 55  
 56    void onReceive(void(*callback)(int));
 57  
 58    void receive(int size = 0);
 59    void standby();
 60    void sleep();
 61  
 62    bool preInit();
 63    uint8_t getTxPower();
 64    void setTxPower(int level, int outputPin = PA_OUTPUT_PA_BOOST_PIN);
 65    uint32_t getFrequency();
 66    void setFrequency(unsigned long frequency);
 67    void setSpreadingFactor(int sf);
 68    long getSignalBandwidth();
 69    void setSignalBandwidth(long sbw);
 70    void setCodingRate4(int denominator);
 71    void setPreambleLength(long preamble_symbols);
 72    void setSyncWord(uint8_t sw);
 73    bool dcd();
 74    void enableCrc();
 75    void disableCrc();
 76    void enableTCXO();
 77    void disableTCXO();
 78  
 79    byte random();
 80  
 81    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);
 82    void setSPIFrequency(uint32_t frequency);
 83  
 84  private:
 85    void explicitHeaderMode();
 86    void implicitHeaderMode();
 87  
 88    void handleDio0Rise();
 89  
 90    uint8_t readRegister(uint8_t address);
 91    void writeRegister(uint8_t address, uint8_t value);
 92    uint8_t singleTransfer(uint8_t address, uint8_t value);
 93  
 94    static void onDio0Rise();
 95  
 96    void handleLowDataRate();
 97    void optimizeModemSensitivity();
 98  
 99  private:
100    SPISettings _spiSettings;
101    int _ss;
102    int _reset;
103    int _dio0;
104    int _busy;
105    long _frequency;
106    int _packetIndex;
107    int _implicitHeaderMode;
108    bool _preinit_done;
109    void (*_onReceive)(int);
110  };
111  
112  extern sx127x sx127x_modem;
113  
114  #endif