diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index d4e64325..aeb1e618 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -87,6 +87,14 @@ int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t powe state = setSyncWord(syncWord, sizeof(syncWord)); RADIOLIB_ASSERT(state); + // set default data shaping + state = setDataShaping(0); + RADIOLIB_ASSERT(state); + + // set default encoding + state = setEncoding(0); + RADIOLIB_ASSERT(state); + return(ERR_NONE); } @@ -116,6 +124,9 @@ int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) { } } + // set mode to standby + standby(); + // clear interrupt flags clearIRQFlags(); @@ -656,6 +667,45 @@ int16_t RF69::setPromiscuousMode(bool promiscuous) { return(state); } +int16_t RF69::setDataShaping(float sh) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set data shaping + sh *= 10.0; + if(abs(sh - 0.0) <= 0.001) { + state = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_NO_SHAPING, 1, 0); + } else if(abs(sh - 3.0) <= 0.001) { + state = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_FSK_GAUSSIAN_0_3, 1, 0); + } else if(abs(sh - 5.0) <= 0.001) { + state = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_FSK_GAUSSIAN_0_5, 1, 0); + } else if(abs(sh - 10.0) <= 0.001) { + state = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_FSK_GAUSSIAN_1_0, 1, 0); + } else { + return(ERR_INVALID_DATA_SHAPING); + } + return(state); +} + +int16_t RF69::setEncoding(uint8_t encoding) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set encoding + switch(encoding) { + case 0: + return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_DC_FREE_NONE, 6, 5)); + case 1: + return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_DC_FREE_MANCHESTER, 6, 5)); + case 2: + return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_DC_FREE_WHITENING, 6, 5)); + default: + return(ERR_INVALID_ENCODING); + } +} + int16_t RF69::config() { int16_t state = ERR_NONE; diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h index 94644e1b..6c5333fe 100644 --- a/src/modules/RF69/RF69.h +++ b/src/modules/RF69/RF69.h @@ -772,6 +772,25 @@ class RF69: public PhysicalLayer { */ int16_t setPromiscuousMode(bool promiscuous = true); + /*! + \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. + Allowed values are 0.3, 0.5 or 1.0. Set to 0 to disable data shaping. + + \param sh Gaussian shaping bandwidth-time product that will be used for data shaping + + \returns \ref status_codes + */ + int16_t setDataShaping(float sh); + + /*! + \brief Sets transmission encoding. + + \param encoding Encoding to be used. Set to 0 for NRZ, 1 for Manchester and 2 for whitening. + + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding); + #ifndef RADIOLIB_GODMODE protected: #endif