[SX127x] Added fixed packet mode for FSK modem
This commit is contained in:
parent
57fab02e20
commit
05d6a1c1c8
2 changed files with 72 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue