Merge pull request #498 from loopj/fix-rf69-setrxbandwidth
Fix setRxBandwidth by calculating mantissa and exponent, rather than comparing floats
This commit is contained in:
commit
2264b04380
1 changed files with 17 additions and 84 deletions
|
@ -457,93 +457,26 @@ int16_t RF69::setRxBandwidth(float rxBw) {
|
|||
return(RADIOLIB_ERR_INVALID_BIT_RATE_BW_RATIO);
|
||||
}
|
||||
|
||||
// check allowed bandwidth values
|
||||
uint8_t bwMant, bwExp;
|
||||
if(rxBw == 2.6) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_24;
|
||||
bwExp = 7;
|
||||
} else if(rxBw == 3.1) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_20;
|
||||
bwExp = 7;
|
||||
} else if(rxBw == 3.9) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_16;
|
||||
bwExp = 7;
|
||||
} else if(rxBw == 5.2) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_24;
|
||||
bwExp = 6;
|
||||
} else if(rxBw == 6.3) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_20;
|
||||
bwExp = 6;
|
||||
} else if(rxBw == 7.8) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_16;
|
||||
bwExp = 6;
|
||||
} else if(rxBw == 10.4) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_24;
|
||||
bwExp = 5;
|
||||
} else if(rxBw == 12.5) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_20;
|
||||
bwExp = 5;
|
||||
} else if(rxBw == 15.6) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_16;
|
||||
bwExp = 5;
|
||||
} else if(rxBw == 20.8) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_24;
|
||||
bwExp = 4;
|
||||
} else if(rxBw == 25.0) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_20;
|
||||
bwExp = 4;
|
||||
} else if(rxBw == 31.3) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_16;
|
||||
bwExp = 4;
|
||||
} else if(rxBw == 41.7) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_24;
|
||||
bwExp = 3;
|
||||
} else if(rxBw == 50.0) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_20;
|
||||
bwExp = 3;
|
||||
} else if(rxBw == 62.5) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_16;
|
||||
bwExp = 3;
|
||||
} else if(rxBw == 83.3) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_24;
|
||||
bwExp = 2;
|
||||
} else if(rxBw == 100.0) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_20;
|
||||
bwExp = 2;
|
||||
} else if(rxBw == 125.0) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_16;
|
||||
bwExp = 2;
|
||||
} else if(rxBw == 166.7) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_24;
|
||||
bwExp = 1;
|
||||
} else if(rxBw == 200.0) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_20;
|
||||
bwExp = 1;
|
||||
} else if(rxBw == 250.0) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_16;
|
||||
bwExp = 1;
|
||||
} else if(rxBw == 333.3) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_24;
|
||||
bwExp = 0;
|
||||
} else if(rxBw == 400.0) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_20;
|
||||
bwExp = 0;
|
||||
} else if(rxBw == 500.0) {
|
||||
bwMant = RADIOLIB_RF69_RX_BW_MANT_16;
|
||||
bwExp = 0;
|
||||
} else {
|
||||
return(RADIOLIB_ERR_INVALID_RX_BANDWIDTH);
|
||||
}
|
||||
|
||||
// set mode to standby
|
||||
setMode(RADIOLIB_RF69_STANDBY);
|
||||
int16_t state = setMode(RADIOLIB_RF69_STANDBY);
|
||||
RADIOLIB_ASSERT(state);
|
||||
|
||||
// calculate exponent and mantissa values for receiver bandwidth
|
||||
for(int8_t e = 7; e >= 0; e--) {
|
||||
for(int8_t m = 2; m >= 0; m--) {
|
||||
float point = (RADIOLIB_RF69_CRYSTAL_FREQ * 1000000.0)/(((4 * m) + 16) * ((uint32_t)1 << (e + 2)));
|
||||
if(fabs(rxBw - (point / 1000.0)) <= 0.1) {
|
||||
// set Rx bandwidth
|
||||
int16_t state = _mod->SPIsetRegValue(RADIOLIB_RF69_REG_RX_BW, RADIOLIB_RF69_DCC_FREQ | bwMant | bwExp, 7, 0);
|
||||
state = _mod->SPIsetRegValue(RADIOLIB_RF69_REG_RX_BW, (m << 3) | e, 4, 0);
|
||||
if(state == RADIOLIB_ERR_NONE) {
|
||||
RF69::_rxBw = rxBw;
|
||||
}
|
||||
return(state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(RADIOLIB_ERR_INVALID_RX_BANDWIDTH);
|
||||
}
|
||||
|
||||
int16_t RF69::setFrequencyDeviation(float freqDev) {
|
||||
|
|
Loading…
Add table
Reference in a new issue