123
Diff: sx127x_lora.cpp
- Revision:
- 10:7382c260c4b1
- Parent:
- 9:ae1a71ccd730
- Child:
- 12:bda42457c34a
diff -r ae1a71ccd730 -r 7382c260c4b1 sx127x_lora.cpp --- a/sx127x_lora.cpp Thu Feb 26 23:31:36 2015 +0000 +++ b/sx127x_lora.cpp Fri Feb 27 22:50:18 2015 +0000 @@ -147,17 +147,50 @@ else return 0; } +float SX127x_lora::get_symbol_period() +{ + float khz = 0; + + if (m_xcvr.type == SX1276) { + switch (RegModemConfig.sx1276bits.Bw) { + case 0: khz = 7.8; break; + case 1: khz = 10.4; break; + case 2: khz = 15.6; break; + case 3: khz = 20.8; break; + case 4: khz = 31.25; break; + case 5: khz = 41.7; break; + case 6: khz = 62.5; break; + case 7: khz = 125; break; + case 8: khz = 250; break; + case 9: khz = 500; break; + } + } else if (m_xcvr.type == SX1272) { + switch (RegModemConfig.sx1272bits.Bw) { + case 0: khz = 125; break; + case 1: khz = 250; break; + case 2: khz = 500; break; + } + } + + // return symbol duration in milliseconds + return (1 << RegModemConfig2.sx1276bits.SpreadingFactor) / khz; +} void SX127x_lora::setBw(uint8_t bw) { if (!m_xcvr.RegOpMode.bits.LongRangeMode) return; - if (m_xcvr.type == SX1276) + if (m_xcvr.type == SX1276) { RegModemConfig.sx1276bits.Bw = bw; - else if (m_xcvr.type == SX1272) { + if (get_symbol_period() > 16) + RegModemConfig3.sx1276bits.LowDataRateOptimize = 1; + else + RegModemConfig3.sx1276bits.LowDataRateOptimize = 0; + m_xcvr.write_reg(REG_LR_MODEMCONFIG3, RegModemConfig3.octet); + } else if (m_xcvr.type == SX1272) { RegModemConfig.sx1272bits.Bw = bw; - if (RegModemConfig2.sx1272bits.SpreadingFactor > 10) + if (get_symbol_period() > 16) RegModemConfig.sx1272bits.LowDataRateOptimize = 1; else RegModemConfig.sx1272bits.LowDataRateOptimize = 0; @@ -210,13 +243,13 @@ m_xcvr.write_reg(REG_LR_MODEMCONFIG2, RegModemConfig2.octet); if (m_xcvr.type == SX1272) { - if (sf > 10 && RegModemConfig.sx1272bits.Bw == 0) // if bw=125KHz and sf11 or sf12 + if (get_symbol_period() > 16) RegModemConfig.sx1272bits.LowDataRateOptimize = 1; else RegModemConfig.sx1272bits.LowDataRateOptimize = 0; m_xcvr.write_reg(REG_LR_MODEMCONFIG, RegModemConfig.octet); } else if (m_xcvr.type == SX1276) { - if (sf > 10 && RegModemConfig.sx1276bits.Bw == 0) // if bw=125KHz and sf11 or sf12 + if (get_symbol_period() > 16) RegModemConfig3.sx1276bits.LowDataRateOptimize = 1; else RegModemConfig3.sx1276bits.LowDataRateOptimize = 0;