/ RNode_Firmware_CE_G2 / sx128x.h
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