[SX127x] Sync with LoRaLib v7.1.0

pull/13/head
jgromes 2018-12-26 11:36:30 +01:00
rodzic 2edddf18ea
commit 5b4685ac8d
7 zmienionych plików z 68 dodań i 17 usunięć

Wyświetl plik

@ -77,6 +77,7 @@ setFrequencyDeviation KEYWORD2
setNodeAddress KEYWORD2
setBroadcastAddress KEYWORD2
disableAddressFiltering KEYWORD2
setDataShaping KEYWORD2
# RF69-specific
setAESKey KEYWORD2
@ -151,6 +152,7 @@ ERR_INVALID_FREQUENCY_DEVIATION LITERAL1
ERR_INVALID_BIT_RATE_BW_RATIO LITERAL1
ERR_INVALID_RX_BANDWIDTH LITERAL1
ERR_INVALID_SYNC_WORD LITERAL1
ERR_INVALID_DATA_SHAPING LITERAL1
ERR_AT_FAILED LITERAL1
ERR_URL_MALFORMED LITERAL1

Wyświetl plik

@ -87,6 +87,7 @@
#define ERR_INVALID_BIT_RATE_BW_RATIO -103
#define ERR_INVALID_RX_BANDWIDTH -104
#define ERR_INVALID_SYNC_WORD -105
#define ERR_INVALID_DATA_SHAPING -106
// ESP8266 status codes
#define ERR_AT_FAILED -201

Wyświetl plik

@ -58,7 +58,7 @@ int16_t SX1272::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync
return(state);
}
int16_t SX1272::beginFSK(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t currentLimit) {
int16_t SX1272::beginFSK(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t currentLimit, float sh) {
// execute common part
int16_t state = SX127x::beginFSK(SX1272_CHIP_VERSION, br, rxBw, freqDev, currentLimit);
if(state != ERR_NONE) {
@ -82,6 +82,11 @@ int16_t SX1272::beginFSK(float freq, float br, float rxBw, float freqDev, int8_t
return(state);
}
state = setDataShaping(sh);
if(state != ERR_NONE) {
return(state);
}
return(state);
}
@ -257,6 +262,30 @@ int16_t SX1272::setGain(uint8_t gain) {
return(state);
}
int16_t SX1272::setDataShaping(float sh) {
// check active modem
if(getActiveModem() != SX127X_FSK_OOK) {
return(ERR_WRONG_MODEM);
}
// set mode to standby
int16_t state = SX127x::standby();
// set data shaping
if(abs(sh - 0.0) <= 0.001) {
state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_NO_SHAPING, 4, 3);
} else if(abs(sh - 0.3) <= 0.001) {
state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_FSK_GAUSSIAN_0_3, 4, 3);
} else if(abs(sh - 0.5) <= 0.001) {
state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_FSK_GAUSSIAN_0_5, 4, 3);
} else if(abs(sh - 1.0) <= 0.001) {
state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_FSK_GAUSSIAN_1_0, 4, 3);
} else {
return(ERR_INVALID_DATA_SHAPING);
}
return(state);
}
int8_t SX1272::getRSSI() {
// check active modem
if(getActiveModem() != SX127X_LORA) {
@ -337,12 +366,6 @@ int16_t SX1272::configFSK() {
return(state);
}
// set data shaping
state = _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1272_FSK_GAUSSIAN_0_3, 6, 5);
if(state != ERR_NONE) {
return(state);
}
// set fast PLL hop
state = _mod->SPIsetRegValue(SX1272_REG_PLL_HOP, SX127X_FAST_HOP_ON, 7, 7);

Wyświetl plik

@ -90,7 +90,7 @@ class SX1272: public SX127x {
// basic methods
int16_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0);
int16_t beginFSK(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13, uint8_t currentLimit = 100);
int16_t beginFSK(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13, uint8_t currentLimit = 100, float sh = 0.3);
// configuration methods
int16_t setFrequency(float freq);
@ -99,6 +99,7 @@ class SX1272: public SX127x {
int16_t setCodingRate(uint8_t cr);
int16_t setOutputPower(int8_t power);
int16_t setGain(uint8_t gain);
int16_t setDataShaping(float sh);
int8_t getRSSI();
protected:

Wyświetl plik

@ -51,7 +51,7 @@ int16_t SX1278::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync
return(state);
}
int16_t SX1278::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t currentLimit) {
int16_t SX1278::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t currentLimit, float sh) {
// execute common part
int16_t state = SX127x::beginFSK(SX1278_CHIP_VERSION, br, freqDev, rxBw, currentLimit);
if(state != ERR_NONE) {
@ -75,6 +75,11 @@ int16_t SX1278::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t
return(state);
}
state = setDataShaping(sh);
if(state != ERR_NONE) {
return(state);
}
return(state);
}
@ -327,6 +332,30 @@ int16_t SX1278::setGain(uint8_t gain) {
return(state);
}
int16_t SX1278::setDataShaping(float sh) {
// check active modem
if(getActiveModem() != SX127X_FSK_OOK) {
return(ERR_WRONG_MODEM);
}
// set mode to standby
int16_t state = SX127x::standby();
// set data shaping
if(abs(sh - 0.0) <= 0.001) {
state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_NO_SHAPING, 6, 5);
} else if(abs(sh - 0.3) <= 0.001) {
state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_FSK_GAUSSIAN_0_3, 6, 5);
} else if(abs(sh - 0.5) <= 0.001) {
state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_FSK_GAUSSIAN_0_5, 6, 5);
} else if(abs(sh - 1.0) <= 0.001) {
state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_FSK_GAUSSIAN_1_0, 6, 5);
} else {
return(ERR_INVALID_DATA_SHAPING);
}
return(state);
}
int8_t SX1278::getRSSI() {
// check active modem
if(getActiveModem() != SX127X_LORA) {
@ -414,12 +443,6 @@ int16_t SX1278::configFSK() {
return(state);
}
// set data shaping
state = _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_FSK_GAUSSIAN_0_3, 6, 5);
if(state != ERR_NONE) {
return(state);
}
// set fast PLL hop
state = _mod->SPIsetRegValue(SX1278_REG_PLL_HOP, SX127X_FAST_HOP_ON, 7, 7);

Wyświetl plik

@ -99,7 +99,7 @@ class SX1278: public SX127x {
// basic methods
int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0);
int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 125.0, int8_t power = 13, uint8_t currentLimit = 100);
int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 125.0, int8_t power = 13, uint8_t currentLimit = 100, float sh = 0.3);
// configuration methods
int16_t setFrequency(float freq);
@ -108,6 +108,7 @@ class SX1278: public SX127x {
int16_t setCodingRate(uint8_t cr);
int16_t setOutputPower(int8_t power);
int16_t setGain(uint8_t gain);
int16_t setDataShaping(float sh);
int8_t getRSSI();
protected:

Wyświetl plik

@ -136,7 +136,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) {
}
float ih = (float)_mod->SPIgetRegValue(SX127X_REG_MODEM_CONFIG_1, 0, 0);
float crc = (float)(_mod->SPIgetRegValue(SX127X_REG_MODEM_CONFIG_2, 2, 2) >> 2);
float n_pre = (float)_mod->SPIgetRegValue(SX127X_REG_PREAMBLE_LSB);
float n_pre = (float)((_mod->SPIgetRegValue(SX127X_REG_PREAMBLE_MSB) << 8) | _mod->SPIgetRegValue(SX127X_REG_PREAMBLE_LSB));
float n_pay = 8.0 + max(ceil((8.0 * (float)len - 4.0 * (float)_sf + 28.0 + 16.0 * crc - 20.0 * ih)/(4.0 * (float)_sf - 8.0 * de)) * (float)_cr, 0.0);
uint32_t timeout = ceil(symbolLength * (n_pre + n_pay + 4.25) * 1.5);