Line data Source code
1 : #include "SX1276.h" 2 : #if !RADIOLIB_EXCLUDE_SX127X 3 : 4 1 : SX1276::SX1276(Module* mod) : SX1278(mod) { 5 : 6 1 : } 7 : 8 0 : int16_t SX1276::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) { 9 : // execute common part 10 0 : const uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; 11 0 : int16_t state = SX127x::begin(versions, 3, syncWord, preambleLength); 12 0 : RADIOLIB_ASSERT(state); 13 : 14 : // configure publicly accessible settings 15 0 : state = setBandwidth(bw); 16 0 : RADIOLIB_ASSERT(state); 17 : 18 0 : state = setFrequency(freq); 19 0 : RADIOLIB_ASSERT(state); 20 : 21 0 : state = setSpreadingFactor(sf); 22 0 : RADIOLIB_ASSERT(state); 23 : 24 0 : state = setCodingRate(cr); 25 0 : RADIOLIB_ASSERT(state); 26 : 27 0 : state = setOutputPower(power); 28 0 : RADIOLIB_ASSERT(state); 29 : 30 0 : state = setGain(gain); 31 0 : RADIOLIB_ASSERT(state); 32 : 33 : // set publicly accessible settings that are not a part of begin method 34 0 : state = setCRC(true); 35 0 : RADIOLIB_ASSERT(state); 36 : 37 0 : return(state); 38 : } 39 : 40 0 : int16_t SX1276::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, bool enableOOK) { 41 : // execute common part 42 0 : const uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; 43 0 : int16_t state = SX127x::beginFSK(versions, 3, freqDev, rxBw, preambleLength, enableOOK); 44 0 : RADIOLIB_ASSERT(state); 45 : 46 : // configure settings not accessible by API 47 0 : state = configFSK(); 48 0 : RADIOLIB_ASSERT(state); 49 : 50 : // configure publicly accessible settings 51 0 : state = setFrequency(freq); 52 0 : RADIOLIB_ASSERT(state); 53 : 54 0 : state = setBitRate(br); 55 0 : RADIOLIB_ASSERT(state); 56 : 57 0 : state = setOutputPower(power); 58 0 : RADIOLIB_ASSERT(state); 59 : 60 0 : if(enableOOK) { 61 0 : state = setDataShapingOOK(RADIOLIB_SHAPING_NONE); 62 0 : RADIOLIB_ASSERT(state); 63 : } else { 64 0 : state = setDataShaping(RADIOLIB_SHAPING_NONE); 65 0 : RADIOLIB_ASSERT(state); 66 : } 67 : 68 0 : return(state); 69 : } 70 : 71 1 : int16_t SX1276::setFrequency(float freq) { 72 : // NOTE: The datasheet specifies Band 2 as 410-525 MHz, but the hardware has been 73 : // verified to work down to ~395 MHz. The lower bound is set here to 395 MHz to 74 : // accommodate real-world use cases (e.g. TinyGS satellites, radiosondes) while 75 : // adding a small margin below the 400 MHz practical limit. 76 1 : if(!(((freq >= 137.0f) && (freq <= 175.0f)) || 77 1 : ((freq >= 395.0f) && (freq <= 525.0f)) || 78 1 : ((freq >= 862.0f) && (freq <= 1020.0f)))) { 79 1 : return(RADIOLIB_ERR_INVALID_FREQUENCY); 80 : } 81 : 82 : // set frequency and if successful, save the new setting 83 0 : int16_t state = SX127x::setFrequencyRaw(freq); 84 0 : if(state == RADIOLIB_ERR_NONE) { 85 0 : SX127x::frequency = freq; 86 : } 87 0 : return(state); 88 : } 89 : 90 1 : int16_t SX1276::setModem(ModemType_t modem) { 91 1 : switch(modem) { 92 0 : case(ModemType_t::RADIOLIB_MODEM_LORA): { 93 0 : return(this->begin()); 94 : } break; 95 0 : case(ModemType_t::RADIOLIB_MODEM_FSK): { 96 0 : return(this->beginFSK()); 97 : } break; 98 1 : default: 99 1 : return(RADIOLIB_ERR_WRONG_MODEM); 100 : } 101 : } 102 : 103 : #endif