[SX127x] Added fixed packet mode for FSK modem

pull/75/head
jgromes 2019-11-22 13:30:02 +01:00
rodzic 57fab02e20
commit 05d6a1c1c8
2 zmienionych plików z 72 dodań i 3 usunięć

Wyświetl plik

@ -42,6 +42,9 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi
// set preamble length
state = SX127x::setPreambleLength(preambleLength);
if(state != ERR_NONE) {
return(state);
}
// initalize internal variables
_dataRate = 0.0;
@ -129,6 +132,15 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB
// set default encoding
state = setEncoding(0);
if(state != ERR_NONE) {
return(state);
}
// set default packet length mode
state = variablePacketLengthMode();
if (state != ERR_NONE) {
return(state);
}
return(state);
}
@ -413,7 +425,7 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
int16_t modem = getActiveModem();
if(modem == SX127X_LORA) {
// check packet length
if(len >= 256) {
if(len >= SX127X_MAX_PACKET_LENGTH) {
return(ERR_PACKET_TOO_LONG);
}
@ -443,7 +455,7 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
} else if(modem == SX127X_FSK_OOK) {
// check packet length
if(len >= 64) {
if(len >= SX127X_MAX_PACKET_LENGTH_FSK) {
return(ERR_PACKET_TOO_LONG);
}
@ -905,6 +917,14 @@ size_t SX127x::getPacketLength(bool update) {
return(_packetLength);
}
int16_t SX127x::fixedPacketLengthMode(uint8_t len) {
return(SX127x::setPacketMode(SX127X_PACKET_FIXED, len));
}
int16_t SX127x::variablePacketLengthMode(uint8_t maxLen) {
return(SX127x::setPacketMode(SX127X_PACKET_VARIABLE, maxLen));
}
int16_t SX127x::setRSSIConfig(uint8_t smoothingSamples, int8_t offset) {
// check active modem
if(getActiveModem() != SX127X_FSK_OOK) {
@ -1006,6 +1026,34 @@ int16_t SX127x::configFSK() {
return(state);
}
int16_t SX127x::setPacketMode(uint8_t mode, uint8_t len) {
// check packet length
if (len > SX127X_MAX_PACKET_LENGTH_FSK) {
return(ERR_PACKET_TOO_LONG);
}
// check active modem
if(getActiveModem() != SX127X_FSK_OOK) {
return(ERR_WRONG_MODEM);
}
// set to fixed packet length
int16_t state = _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, mode, 7, 7);
if(state != ERR_NONE) {
return(state);
}
// set length to register
state = _mod->SPIsetRegValue(SX127X_REG_PAYLOAD_LENGTH_FSK, len);
if(state != ERR_NONE) {
return(state);
}
// update cached value
_packetLengthConfig = mode;
return(state);
}
bool SX127x::findChip(uint8_t ver) {
uint8_t i = 0;
bool flagFound = false;

Wyświetl plik

@ -9,7 +9,8 @@
// SX127x physical layer properties
#define SX127X_CRYSTAL_FREQ 32.0
#define SX127X_DIV_EXPONENT 19
#define SX127X_MAX_PACKET_LENGTH 256
#define SX127X_MAX_PACKET_LENGTH 255
#define SX127X_MAX_PACKET_LENGTH_FSK 64
// SX127x series common LoRa registers
#define SX127X_REG_FIFO 0x00
@ -842,6 +843,24 @@ class SX127x: public PhysicalLayer {
*/
size_t getPacketLength(bool update = true);
/*!
\brief Set modem in fixed packet length mode. Available in FSK mode only.
\param len Packet length.
\returns \ref status_codes
*/
int16_t fixedPacketLengthMode(uint8_t len = SX127X_MAX_PACKET_LENGTH_FSK);
/*!
\brief Set modem in variable packet length mode. Available in FSK mode only.
\param len Maximum packet length.
\returns \ref status_codes
*/
int16_t variablePacketLengthMode(uint8_t maxLen = SX127X_MAX_PACKET_LENGTH_FSK);
/*!
\brief Sets RSSI measurement configuration in FSK mode.
@ -885,6 +904,7 @@ class SX127x: public PhysicalLayer {
int16_t configFSK();
int16_t getActiveModem();
int16_t directMode();
int16_t setPacketMode(uint8_t mode, uint8_t len);
#ifndef RADIOLIB_GODMODE
private:
@ -892,6 +912,7 @@ class SX127x: public PhysicalLayer {
float _dataRate;
size_t _packetLength;
bool _packetLengthQueried; // FSK packet length is the first byte in FIFO, length can only be queried once
uint8_t _packetLengthConfig;
bool findChip(uint8_t ver);
int16_t setMode(uint8_t mode);