Double MSP (TLM and MAVLink) throughput for Gemini hardware (#3037)
[ExpressLRS.git] / src / lib / SX127xDriver / SX127x.h
blobefb6f1b7e13564fa556e4a26d1fccb3ae552de2b
1 #pragma once
3 #include "SX127xRegs.h"
4 #include "SX127xHal.h"
5 #include "SX12xxDriverCommon.h"
7 #ifdef PLATFORM_ESP8266
8 #include <cstdint>
9 #endif
11 #define RADIO_SNR_SCALE 4
13 class SX127xDriver: public SX12xxDriverCommon
16 public:
17 static SX127xDriver *instance;
19 ///////////Radio Variables////////
20 bool headerExplMode;
21 bool crcEnabled;
23 //// Parameters ////
24 uint16_t timeoutSymbols;
25 ///////////////////////////////////
27 ////////////////Configuration Functions/////////////
28 SX127xDriver();
29 bool Begin(uint32_t minimumFrequency, uint32_t maximumFrequency);
30 void End();
31 bool DetectChip(SX12XX_Radio_Number_t radioNumber);
32 void Config(uint8_t bw, uint8_t sf, uint8_t cr, uint32_t freq, uint8_t preambleLen, uint8_t syncWord, bool InvertIQ, uint8_t _PayloadLength, uint32_t interval);
33 void Config(uint8_t bw, uint8_t sf, uint8_t cr, uint32_t freq, uint8_t preambleLen, bool InvertIQ, uint8_t _PayloadLength, uint32_t interval);
34 void SetMode(SX127x_RadioOPmodes mode, SX12XX_Radio_Number_t radioNumber);
35 void SetTxIdleMode() { SetMode(SX127x_OPMODE_STANDBY, SX12XX_Radio_All); } // set Idle mode used when switching from RX to TX
36 void ConfigLoraDefaults();
38 void startCWTest(uint32_t freq, SX12XX_Radio_Number_t radioNumber);
39 void cwRepeat(SX12XX_Radio_Number_t radioNumber);
41 void SetBandwidthCodingRate(SX127x_Bandwidth bw, SX127x_CodingRate cr);
42 void SetCRCMode(bool on); //false for off
43 void SetSyncWord(uint8_t syncWord);
44 void SetOutputPower(uint8_t Power);
45 void SetPreambleLength(uint8_t PreambleLen);
46 void SetSpreadingFactor(SX127x_SpreadingFactor sf);
47 void SetRxTimeoutUs(uint32_t interval);
49 uint32_t GetCurrBandwidth();
50 uint32_t GetCurrBandwidthNormalisedShifted();
52 #define FREQ_STEP 61.03515625
53 void SetFrequencyHz(uint32_t freq, SX12XX_Radio_Number_t radioNumber);
54 void SetFrequencyReg(uint32_t freq, SX12XX_Radio_Number_t radioNumber = SX12XX_Radio_All);
55 bool FrequencyErrorAvailable() const { return true; }
56 int32_t GetFrequencyError();
57 bool GetFrequencyErrorbool(SX12XX_Radio_Number_t radioNumber);
58 void SetPPMoffsetReg(int32_t offset, SX12XX_Radio_Number_t radioNumber);
60 ////////////////////////////////////////////////////
62 /////////////////Utility Funcitons//////////////////
63 uint8_t GetIrqFlags(SX12XX_Radio_Number_t radioNumber);
64 void ClearIrqFlags(SX12XX_Radio_Number_t radioNumber);
66 //////////////RX related Functions/////////////////
68 //uint8_t RunCAD();
70 uint8_t UnsignedGetLastPacketRSSI(SX12XX_Radio_Number_t radioNumber);
71 int8_t GetLastPacketRSSI(SX12XX_Radio_Number_t radioNumber);
72 int8_t GetLastPacketSNRRaw(SX12XX_Radio_Number_t radioNumber);
73 int8_t GetCurrRSSI(SX12XX_Radio_Number_t radioNumber);
74 void GetLastPacketStats();
75 void CheckForSecondPacket();
77 ////////////Non-blocking TX related Functions/////////////////
78 void TXnb(uint8_t * data, uint8_t size, bool sendGeminiBuffer, uint8_t * dataGemini, SX12XX_Radio_Number_t radioNumber);
79 /////////////Non-blocking RX related Functions///////////////
80 void RXnb();
82 private:
83 // constant used for no power change pending
84 // must not be a valid power register value
85 static const int16_t PWRPENDING_NONE = -1;
87 SX127x_Bandwidth currBW;
88 SX127x_SpreadingFactor currSF;
89 SX127x_CodingRate currCR;
90 SX127x_RadioOPmodes currOpmode;
91 SX127x_ModulationModes ModFSKorLoRa;
92 uint8_t currSyncWord;
93 uint8_t currPreambleLen;
94 uint8_t pwrCurrent;
95 int16_t pwrPending;
96 uint8_t lowFrequencyMode;
98 static void IsrCallback_1();
99 static void IsrCallback_2();
100 static void IsrCallback(SX12XX_Radio_Number_t radioNumber);
101 bool RXnbISR(SX12XX_Radio_Number_t radioNumber); // ISR for non-blocking RX routine
102 void TXnbISR(); // ISR for non-blocking TX routine
103 void CommitOutputPower();