From 05d6a1c1c8e1fd27838d46f819adf7425aae9b79 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 22 Nov 2019 13:30:02 +0100 Subject: [PATCH] [SX127x] Added fixed packet mode for FSK modem --- src/modules/SX127x/SX127x.cpp | 52 +++++++++++++++++++++++++++++++++-- src/modules/SX127x/SX127x.h | 23 +++++++++++++++- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 771de33a..9347f44c 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -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; diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 956f3c49..c805f5f9 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -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);