Line data Source code
1 : #include "SX1273.h" 2 : #if !RADIOLIB_EXCLUDE_SX127X 3 : 4 1 : SX1273::SX1273(Module* mod) : SX1272(mod) { 5 : 6 1 : } 7 : 8 0 : int16_t SX1273::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 : uint8_t version = RADIOLIB_SX1272_CHIP_VERSION; 11 0 : int16_t state = SX127x::begin(&version, 1, 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 1 : int16_t SX1273::setSpreadingFactor(uint8_t sf) { 41 : uint8_t newSpreadingFactor; 42 : 43 : // check allowed spreading factor values 44 1 : switch(sf) { 45 0 : case 6: 46 0 : newSpreadingFactor = RADIOLIB_SX127X_SF_6; 47 0 : break; 48 0 : case 7: 49 0 : newSpreadingFactor = RADIOLIB_SX127X_SF_7; 50 0 : break; 51 0 : case 8: 52 0 : newSpreadingFactor = RADIOLIB_SX127X_SF_8; 53 0 : break; 54 0 : case 9: 55 0 : newSpreadingFactor = RADIOLIB_SX127X_SF_9; 56 0 : break; 57 1 : default: 58 1 : return(RADIOLIB_ERR_INVALID_SPREADING_FACTOR); 59 : } 60 : 61 : // set spreading factor and if successful, save the new setting 62 0 : int16_t state = setSpreadingFactorRaw(newSpreadingFactor); 63 0 : if(state == RADIOLIB_ERR_NONE) { 64 0 : SX127x::spreadingFactor = sf; 65 : } 66 : 67 0 : return(state); 68 : } 69 : 70 1 : int16_t SX1273::setDataRate(DataRate_t dr, ModemType_t modem) { 71 : // get the current modem 72 : ModemType_t currentModem; 73 1 : int16_t state = this->getModem(¤tModem); 74 1 : RADIOLIB_ASSERT(state); 75 : 76 : // switch over if the requested modem is different 77 1 : if(modem != RADIOLIB_MODEM_NONE && modem != currentModem) { 78 0 : state = this->standby(); 79 0 : RADIOLIB_ASSERT(state); 80 0 : state = this->setModem(modem); 81 0 : RADIOLIB_ASSERT(state); 82 : } 83 : 84 1 : if(modem == RADIOLIB_MODEM_NONE) { 85 1 : modem = currentModem; 86 : } 87 : 88 : // select interpretation based on modem 89 1 : if(modem == RADIOLIB_MODEM_FSK) { 90 : // set the bit rate 91 0 : state = this->setBitRate(dr.fsk.bitRate); 92 0 : RADIOLIB_ASSERT(state); 93 : 94 : // set the frequency deviation 95 0 : state = this->setFrequencyDeviation(dr.fsk.freqDev); 96 : 97 1 : } else if(modem == RADIOLIB_MODEM_LORA) { 98 : // set the spreading factor 99 1 : state = this->setSpreadingFactor(dr.lora.spreadingFactor); 100 1 : RADIOLIB_ASSERT(state); 101 : 102 : // set the bandwidth 103 0 : state = this->setBandwidth(dr.lora.bandwidth); 104 : } 105 : 106 0 : return(state); 107 : } 108 : 109 1 : int16_t SX1273::checkDataRate(DataRate_t dr, ModemType_t modem) { 110 1 : int16_t state = RADIOLIB_ERR_UNKNOWN; 111 : 112 : // retrieve modem if not supplied 113 1 : if(modem == RADIOLIB_MODEM_NONE) { 114 1 : state = this->getModem(&modem); 115 1 : RADIOLIB_ASSERT(state); 116 : } 117 : 118 : // select interpretation based on modem 119 1 : if(modem == RADIOLIB_MODEM_FSK) { 120 0 : RADIOLIB_CHECK_RANGE(dr.fsk.bitRate, 0.5f, 300.0f, RADIOLIB_ERR_INVALID_BIT_RATE); 121 0 : if(!((dr.fsk.freqDev + dr.fsk.bitRate/2.0f <= 250.0f) && (dr.fsk.freqDev <= 200.0f))) { 122 0 : return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); 123 : } 124 0 : return(RADIOLIB_ERR_NONE); 125 : 126 1 : } else if(modem == RADIOLIB_MODEM_LORA) { 127 1 : RADIOLIB_CHECK_RANGE(dr.lora.spreadingFactor, 6, 9, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); 128 0 : RADIOLIB_CHECK_RANGE(dr.lora.bandwidth, 100.0f, 510.0f, RADIOLIB_ERR_INVALID_BANDWIDTH); 129 0 : RADIOLIB_CHECK_RANGE(dr.lora.codingRate, 4, 8, RADIOLIB_ERR_INVALID_CODING_RATE); 130 0 : return(RADIOLIB_ERR_NONE); 131 : 132 : } 133 : 134 0 : return(state); 135 : } 136 : 137 1 : int16_t SX1273::setModem(ModemType_t modem) { 138 1 : switch(modem) { 139 0 : case(ModemType_t::RADIOLIB_MODEM_LORA): { 140 0 : return(this->begin()); 141 : } break; 142 0 : case(ModemType_t::RADIOLIB_MODEM_FSK): { 143 0 : return(this->beginFSK()); 144 : } break; 145 1 : default: 146 1 : return(RADIOLIB_ERR_WRONG_MODEM); 147 : } 148 : } 149 : 150 : #endif