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(const ConfigLoRa_t& cfg) { 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, cfg.syncWord, cfg.preambleLength); 12 0 : RADIOLIB_ASSERT(state); 13 : 14 : // configure publicly accessible settings 15 0 : state = setBandwidth(cfg.bandwidth); 16 0 : RADIOLIB_ASSERT(state); 17 : 18 0 : state = setFrequency(cfg.frequency); 19 0 : RADIOLIB_ASSERT(state); 20 : 21 0 : state = setSpreadingFactor(cfg.spreadingFactor); 22 0 : RADIOLIB_ASSERT(state); 23 : 24 0 : state = setCodingRate(cfg.codingRate); 25 0 : RADIOLIB_ASSERT(state); 26 : 27 0 : state = setOutputPower(cfg.power); 28 0 : RADIOLIB_ASSERT(state); 29 : 30 0 : state = setGain(this->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 : return(state); 36 : } 37 : 38 0 : int16_t SX1276::beginFSK(const ConfigFSK_t& cfg) { 39 : // execute common part 40 0 : const uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X }; 41 0 : int16_t state = SX127x::beginFSK(versions, 3, cfg.frequencyDeviation, cfg.receiverBandwidth, cfg.preambleLength); 42 0 : RADIOLIB_ASSERT(state); 43 : 44 : // configure settings not accessible by API 45 0 : state = configFSK(); 46 0 : RADIOLIB_ASSERT(state); 47 : 48 : // configure publicly accessible settings 49 0 : state = setFrequency(cfg.frequency); 50 0 : RADIOLIB_ASSERT(state); 51 : 52 0 : state = setBitRate(cfg.bitRate); 53 0 : RADIOLIB_ASSERT(state); 54 : 55 0 : state = setOutputPower(cfg.power); 56 0 : RADIOLIB_ASSERT(state); 57 : 58 0 : if(this->enableOOK) { 59 0 : state = setDataShapingOOK(RADIOLIB_SHAPING_NONE); 60 0 : RADIOLIB_ASSERT(state); 61 : } else { 62 0 : state = setDataShaping(RADIOLIB_SHAPING_NONE); 63 0 : RADIOLIB_ASSERT(state); 64 : } 65 : 66 : // set publicly accessible settings that are not a part of begin method 67 0 : state = setCRC(true); 68 0 : return(state); 69 : } 70 : 71 1 : int16_t SX1276::setFrequency(uint32_t 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 >= RADIOLIB_UNIT_MEGA(137)) && (freq <= RADIOLIB_UNIT_MEGA(175))) || 77 0 : ((freq >= RADIOLIB_UNIT_MEGA(395)) && (freq <= RADIOLIB_UNIT_MEGA(525))) || 78 0 : ((freq >= RADIOLIB_UNIT_MEGA(862)) && (freq <= RADIOLIB_UNIT_MEGA(1020))))) { 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 : ConfigLoRa_t cfg; 94 0 : return(this->begin(cfg)); 95 : } break; 96 0 : case(ModemType_t::RADIOLIB_MODEM_FSK): { 97 0 : ConfigFSK_t cfg; 98 0 : return(this->beginFSK(cfg)); 99 : } break; 100 1 : default: 101 1 : return(RADIOLIB_ERR_WRONG_MODEM); 102 : } 103 : } 104 : 105 : #endif