From 6dcab7d2c7338b980ad60ed078ab05cd6b60739c Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Fri, 20 Dec 2019 16:32:54 +0100 Subject: [PATCH 001/135] [CC1101] Added setOOK(bool enableOOK) --- src/modules/CC1101/CC1101.cpp | 45 +++++++++++++++++++++++++++++++++-- src/modules/CC1101/CC1101.h | 10 ++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 285e5d64..5be2e21e 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -4,6 +4,7 @@ CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_E _mod = module; _packetLengthQueried = false; _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; + _modulation = CC1101_MOD_FORMAT_2_FSK; _syncWordLength = 2; } @@ -449,8 +450,20 @@ int16_t CC1101::setOutputPower(int8_t power) { return(ERR_INVALID_OUTPUT_POWER); } - // write raw power setting - return(SPIsetRegValue(CC1101_REG_PATABLE, powerRaw)); + if (_modulation == CC1101_MOD_FORMAT_ASK_OOK){ + // Amplitude modulation: + // PA_TABLE[0] is the power to be used when transmitting a 0 (no power) + // PA_TABLE[1] is the power to be used when transmitting a 1 (full power) + + byte paValues[2] = {0x00, powerRaw}; + SPIwriteRegisterBurst(CC1101_REG_PATABLE, paValues, 2); + return ERR_NONE; + + }else{ + // Freq modulation: + // PA_TABLE[0] is the power to be used when transmitting. + return(SPIsetRegValue(CC1101_REG_PATABLE, powerRaw)); + } } int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) { @@ -548,6 +561,34 @@ int16_t CC1101::disableAddressFiltering() { return(SPIsetRegValue(CC1101_REG_ADDR, 0x00)); } + +int16_t CC1101::setOOK(bool enableOOK) { + // Change modulation + if (enableOOK) { + _modulation = CC1101_MOD_FORMAT_ASK_OOK; + }else{ + _modulation = CC1101_MOD_FORMAT_2_FSK; + } + uint8_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, _modulation, 6, 4); + + // Change Front End TX Configuration + if (enableOOK){ + // PA_TABLE[0] is (by default) the power value used when transmitting a "0L". + // Set PA_TABLE[1] to be used when transmitting a "1L". + state |= SPIsetRegValue(CC1101_REG_FREND0, 1, 2, 0); + }else{ + // Reset FREND0 to default value. + state |= SPIsetRegValue(CC1101_REG_FREND0, 0, 2, 0); + } + + if (state != ERR_NONE) + return state; + + // Update PA_TABLE values according to the new _modulation. + return setOutputPower(_power); +} + + float CC1101::getRSSI() { float rssi; if(_rawRSSI >= 128) { diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 701abbe9..f349da20 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -742,6 +742,15 @@ class CC1101: public PhysicalLayer { */ int16_t disableAddressFiltering(); + /*! + \brief Enables/disables OOK modulation instead of FSK. + + \param enableOOK Enable (true) or disable (false) OOK. + + \returns \ref status_codes + */ + int16_t setOOK(bool enableOOK); + /*! \brief Gets RSSI (Recorded Signal Strength Indicator) of the last received packet. @@ -825,6 +834,7 @@ class CC1101: public PhysicalLayer { float _freq; uint8_t _rawRSSI; uint8_t _rawLQI; + uint8_t _modulation; size_t _packetLength; bool _packetLengthQueried; From 4272b0ff305d97403e1efa1fc4c94de8a0cc67a6 Mon Sep 17 00:00:00 2001 From: Marco Campinoti <42536065+IU5HKU@users.noreply.github.com> Date: Sun, 22 Dec 2019 22:07:46 +0100 Subject: [PATCH 002/135] Reorganized morsecode symbols array and updated the MorseClient::write(uint8_t b) method The whole idea was taken from the CubeSat way of doing morsecode, --- src/protocols/Morse/Morse.cpp | 205 +++++++++++++++++----------------- src/protocols/Morse/Morse.h | 6 +- 2 files changed, 107 insertions(+), 104 deletions(-) diff --git a/src/protocols/Morse/Morse.cpp b/src/protocols/Morse/Morse.cpp index 83137abf..e943199b 100644 --- a/src/protocols/Morse/Morse.cpp +++ b/src/protocols/Morse/Morse.cpp @@ -4,68 +4,79 @@ /*! \cond RADIOLIB_DOXYGEN_HIDDEN */ -struct Morse_t { - char c; // ASCII character - char m[7]; // Morse code representation -}; -/*! - \endcond -*/ -// array of all Morse code characters -const Morse_t MorseTable[MORSE_LENGTH] PROGMEM = { - {'A', ".-"}, - {'B',"-..."}, - {'C', "-.-."}, - {'D',"-.."}, - {'E',"."}, - {'F',"..-."}, - {'G',"--."}, - {'H',"...."}, - {'I',".."}, - {'J',".---"}, - {'K',"-.-"}, - {'L',".-.."}, - {'M',"--"}, - {'N',"-."}, - {'O',"---"}, - {'P',".--."}, - {'Q',"--.-"}, - {'R',".-."}, - {'S',"..."}, - {'T',"-"}, - {'U',"..-"}, - {'V',"...-"}, - {'W',".--"}, - {'X',"-..-"}, - {'Y',"-.--"}, - {'Z',"--.."}, - {'1',".----"}, - {'2',"..---"}, - {'3',"...--"}, - {'4',"....-"}, - {'5',"....."}, - {'6',"-...."}, - {'7',"--..."}, - {'8',"---.."}, - {'9',"----."}, - {'0',"-----"}, - {'.',".-.-.-"}, - {',',"--..--"}, - {':',"---..."}, - {'?',"..--.."}, - {'\'',".----."}, - {'-',"-....-"}, - {'/',"-..-."}, - {'(',"-.--."}, - {')',"-.--.-"}, - {'\"',".-..-."}, - {'=',"-...-"}, - {'+',".-.-."}, - {'@',".--.-."}, - {' ',"_"}, // space is used to separate words - {0x01,"-.-.-"}, // ASCII SOH (start of heading) is used as alias for start signal - {0x02,".-.-."} // ASCII EOT (end of transmission) is used as alias for stop signal +//---------------------------------------------------------------------------------------- +// In the below array we represent dots as 0 and dashes as 1, using a further bit as +// 'guard' who tell us when we must stop in decoding our symbols. +// Some bytes are zeroed because there isn't a morse code representation of that char. +// The ascii code of the letter is the search index into the array for the correspondent +// morse code representation. +//---------------------------------------------------------------------------------------- +const uint8_t morse_lookuptable[64] PROGMEM = { + 0b00, // space 0x00 + 0b1110101, // ! 117 + 0b1010010, // " 82 + 0b00, // # (doesn't exists)<-- + 0b11001000, // $ 200 + 0b00, // % (doesn't exists)<-- + 0b100010, // & 34 + 0b1011110, // ' 94 + 0b101101, // ( 45 + 0b1101101, // ) 109 + 0b00, // * (doesn't exists)<-- + 0b101010, // + 42 + 0b1110011, // , 115 + 0b1100001, // - 97 + 0b1101010, // . 106 + 0b101001, // / 41 + 0b111111, // 0 63 + 0b111110, // 1 62 + 0b111100, // 2 60 + 0b111000, // 3 56 + 0b110000, // 4 48 + 0b100000, // 5 32 + 0b100001, // 6 33 + 0b100011, // 7 35 + 0b100111, // 8 39 + 0b101111, // 9 47 + 0b1000111, // : 71 + 0b1101010, // ; 106 + 0b00, // < (doesn't exists)<-- + 0b110001, // = 49 + 0b00, // > (doesn't exists)<-- + 0b1001100, // ? 76 + 0b1010110, // @ 86 + 0b110, // A 6 + 0b10001, // B 17 + 0b10101, // C 21 + 0b1001, // D 9 + 0b10, // E 2 + 0b10100, // F 20 + 0b1011, // G 11 + 0b10000, // H 16 + 0b100, // I 4 + 0b11110, // J 30 + 0b1101, // K 13 + 0b10010, // L 18 + 0b111, // M 7 + 0b101, // N 5 + 0b1111, // O 15 + 0b10110, // P 22 + 0b11011, // Q 27 + 0b1010, // R 10 + 0b1000, // S 8 + 0b11, // T 3 + 0b1100, // U 12 + 0b11000, // V 24 + 0b1110, // W 14 + 0b11001, // X 25 + 0b11101, // Y 29 + 0b10011, // Z 19 + 0b00, // [ (doesn't exists)<-- + 0b00, // \ (doesn't exists)<-- + 0b00, // ] (doesn't exists)<-- + 0b00, // ^ (doesn't exists)<-- + 0b1101100 // _ 108 }; MorseClient::MorseClient(PhysicalLayer* phy) { @@ -106,52 +117,40 @@ size_t MorseClient::write(uint8_t* buff, size_t len) { } size_t MorseClient::write(uint8_t b) { - // find the correct Morse code in array - Morse_t mc; - bool found = false; - for(uint8_t pos = 0; pos < MORSE_LENGTH; pos++) { - memcpy_P(&mc, &MorseTable[pos], sizeof(Morse_t)); - if(mc.c == toupper(b)) { - found = true; - break; - } - } + + //Note: using toupper() you always find a char, because all possible chars are included in this array! + uint8_t ditdah_code = 0x00; - // check if the requested code was found in the array - if(found) { - RADIOLIB_DEBUG_PRINT(mc.c); - RADIOLIB_DEBUG_PRINT('\t'); - RADIOLIB_DEBUG_PRINTLN(mc.m); - - // iterate over Morse code representation and output appropriate tones - for(uint8_t i = 0; i < strlen(mc.m); i++) { - switch(mc.m[i]) { - case '.': - _phy->transmitDirect(_base); - delay(_dotLength); - break; - case '-': - _phy->transmitDirect(_base); - delay(_dotLength * 3); - break; - case '_': - // do nothing (word space) - break; - } - - // symbol space - _phy->standby(); - delay(_dotLength); - } - - // letter space - RADIOLIB_DEBUG_PRINTLN(); + if (b == ' ') { + RADIOLIB_DEBUG_PRINTLN('space'); // inter-words pause (space) + // symbol space + _phy->standby(); delay(_dotLength * 3); - - return(1); } - return(0); + ditdah_code = morse_lookuptable[(uint8_t)(toupper(b) - 32)]; // retrieve morse code from lookuptable + + //do it until 'guardbit' is reached + while (ditdah_code > GUARDBIT) { + if (ditdah_code & DAH) { + RADIOLIB_DEBUG_PRINT('-'); // tx a 'dah' + _phy->transmitDirect(_base); + delay(_dotLength * 3); + } + else{ + RADIOLIB_DEBUG_PRINT('.'); // tx a 'dit' + _phy->transmitDirect(_base); + delay(_dotLength); + } + ditdah_code >>= 1; // analyze next bit + } + + // letter space + RADIOLIB_DEBUG_PRINTLN(); + _phy->standby(); + delay(_dotLength); + + return(0); } size_t MorseClient::print(__FlashStringHelper* fstr) { diff --git a/src/protocols/Morse/Morse.h b/src/protocols/Morse/Morse.h index 317a8066..f482a6c0 100644 --- a/src/protocols/Morse/Morse.h +++ b/src/protocols/Morse/Morse.h @@ -4,7 +4,11 @@ #include "../../TypeDef.h" #include "../PhysicalLayer/PhysicalLayer.h" -#define MORSE_LENGTH 52 +//#define MORSE_LENGTH 52 +#define MORSE_LENGTH 64 +#define DIT 0b0 +#define DAH 0b1 +#define GUARDBIT 0b1 /*! \class MorseClient From 41f4848b9e4df7e098f92e911b179161c7dbc7eb Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 23 Dec 2019 14:25:34 +0100 Subject: [PATCH 003/135] [Morse] Formatting fixes, added missing symbol space --- .../Morse/Morse_Transmit/Morse_Transmit.ino | 2 +- src/protocols/Morse/Morse.cpp | 154 +++++------------- src/protocols/Morse/Morse.h | 80 ++++++++- 3 files changed, 121 insertions(+), 115 deletions(-) diff --git a/examples/Morse/Morse_Transmit/Morse_Transmit.ino b/examples/Morse/Morse_Transmit/Morse_Transmit.ino index 611ffd93..a835f8a5 100644 --- a/examples/Morse/Morse_Transmit/Morse_Transmit.ino +++ b/examples/Morse/Morse_Transmit/Morse_Transmit.ino @@ -104,7 +104,7 @@ void loop() { // floating point number // NOTE: When using println(), the transmission will be - // terminated with cross signal (.-.-.). + // terminated with end-of-work signal (...-.-). float f = -3.1415; morse.println(f, 3); diff --git a/src/protocols/Morse/Morse.cpp b/src/protocols/Morse/Morse.cpp index e943199b..0dbfd768 100644 --- a/src/protocols/Morse/Morse.cpp +++ b/src/protocols/Morse/Morse.cpp @@ -1,84 +1,5 @@ #include "Morse.h" -// structure to save data about character Morse code -/*! - \cond RADIOLIB_DOXYGEN_HIDDEN -*/ - -//---------------------------------------------------------------------------------------- -// In the below array we represent dots as 0 and dashes as 1, using a further bit as -// 'guard' who tell us when we must stop in decoding our symbols. -// Some bytes are zeroed because there isn't a morse code representation of that char. -// The ascii code of the letter is the search index into the array for the correspondent -// morse code representation. -//---------------------------------------------------------------------------------------- -const uint8_t morse_lookuptable[64] PROGMEM = { - 0b00, // space 0x00 - 0b1110101, // ! 117 - 0b1010010, // " 82 - 0b00, // # (doesn't exists)<-- - 0b11001000, // $ 200 - 0b00, // % (doesn't exists)<-- - 0b100010, // & 34 - 0b1011110, // ' 94 - 0b101101, // ( 45 - 0b1101101, // ) 109 - 0b00, // * (doesn't exists)<-- - 0b101010, // + 42 - 0b1110011, // , 115 - 0b1100001, // - 97 - 0b1101010, // . 106 - 0b101001, // / 41 - 0b111111, // 0 63 - 0b111110, // 1 62 - 0b111100, // 2 60 - 0b111000, // 3 56 - 0b110000, // 4 48 - 0b100000, // 5 32 - 0b100001, // 6 33 - 0b100011, // 7 35 - 0b100111, // 8 39 - 0b101111, // 9 47 - 0b1000111, // : 71 - 0b1101010, // ; 106 - 0b00, // < (doesn't exists)<-- - 0b110001, // = 49 - 0b00, // > (doesn't exists)<-- - 0b1001100, // ? 76 - 0b1010110, // @ 86 - 0b110, // A 6 - 0b10001, // B 17 - 0b10101, // C 21 - 0b1001, // D 9 - 0b10, // E 2 - 0b10100, // F 20 - 0b1011, // G 11 - 0b10000, // H 16 - 0b100, // I 4 - 0b11110, // J 30 - 0b1101, // K 13 - 0b10010, // L 18 - 0b111, // M 7 - 0b101, // N 5 - 0b1111, // O 15 - 0b10110, // P 22 - 0b11011, // Q 27 - 0b1010, // R 10 - 0b1000, // S 8 - 0b11, // T 3 - 0b1100, // U 12 - 0b11000, // V 24 - 0b1110, // W 14 - 0b11001, // X 25 - 0b11101, // Y 29 - 0b10011, // Z 19 - 0b00, // [ (doesn't exists)<-- - 0b00, // \ (doesn't exists)<-- - 0b00, // ] (doesn't exists)<-- - 0b00, // ^ (doesn't exists)<-- - 0b1101100 // _ 108 -}; - MorseClient::MorseClient(PhysicalLayer* phy) { _phy = phy; } @@ -97,7 +18,7 @@ int16_t MorseClient::begin(float base, uint8_t speed) { } size_t MorseClient::startSignal() { - return(MorseClient::write(0x01)); + return(MorseClient::write('_')); } size_t MorseClient::write(const char* str) { @@ -117,40 +38,55 @@ size_t MorseClient::write(uint8_t* buff, size_t len) { } size_t MorseClient::write(uint8_t b) { - - //Note: using toupper() you always find a char, because all possible chars are included in this array! - uint8_t ditdah_code = 0x00; - - if (b == ' ') { - RADIOLIB_DEBUG_PRINTLN('space'); // inter-words pause (space) - // symbol space - _phy->standby(); - delay(_dotLength * 3); + // check unprintable ASCII characters and boundaries + if((b < ' ') || (b == 0x60) || (b > 'z')) { + return(0); } - ditdah_code = morse_lookuptable[(uint8_t)(toupper(b) - 32)]; // retrieve morse code from lookuptable - - //do it until 'guardbit' is reached - while (ditdah_code > GUARDBIT) { - if (ditdah_code & DAH) { - RADIOLIB_DEBUG_PRINT('-'); // tx a 'dah' + // inter-word pause (space) + if(b == ' ') { + RADIOLIB_DEBUG_PRINTLN(F("space")); + _phy->standby(); + delay(4 * _dotLength); + return(1); + } + + // get morse code from lookup table + uint8_t code = pgm_read_byte(&MorseTable[(uint8_t)(toupper(b) - 32)]); + + // check unsupported characters + if(code == MORSE_UNSUPORTED) { + return(0); + } + + // iterate through codeword until guard bit is reached + while(code > MORSE_GUARDBIT) { + + // send dot or dash + if (code & MORSE_DASH) { + RADIOLIB_DEBUG_PRINT('-'); _phy->transmitDirect(_base); - delay(_dotLength * 3); - } - else{ - RADIOLIB_DEBUG_PRINT('.'); // tx a 'dit' + delay(3 * _dotLength); + } else { + RADIOLIB_DEBUG_PRINT('.'); _phy->transmitDirect(_base); delay(_dotLength); - } - ditdah_code >>= 1; // analyze next bit - } - - // letter space - RADIOLIB_DEBUG_PRINTLN(); - _phy->standby(); - delay(_dotLength); + } - return(0); + // symbol space + _phy->standby(); + delay(_dotLength); + + // move onto the next bit + code >>= 1; + } + + // letter space + _phy->standby(); + delay(2 * _dotLength); + RADIOLIB_DEBUG_PRINTLN(); + + return(1); } size_t MorseClient::print(__FlashStringHelper* fstr) { @@ -218,7 +154,7 @@ size_t MorseClient::print(double n, int digits) { } size_t MorseClient::println(void) { - return(MorseClient::write(0x02)); + return(MorseClient::write('^')); } size_t MorseClient::println(__FlashStringHelper* fstr) { diff --git a/src/protocols/Morse/Morse.h b/src/protocols/Morse/Morse.h index f482a6c0..66df3280 100644 --- a/src/protocols/Morse/Morse.h +++ b/src/protocols/Morse/Morse.h @@ -4,11 +4,81 @@ #include "../../TypeDef.h" #include "../PhysicalLayer/PhysicalLayer.h" -//#define MORSE_LENGTH 52 -#define MORSE_LENGTH 64 -#define DIT 0b0 -#define DAH 0b1 -#define GUARDBIT 0b1 +#define MORSE_DOT 0b0 +#define MORSE_DASH 0b1 +#define MORSE_GUARDBIT 0b1 +#define MORSE_UNSUPORTED 0xFF + +// Morse character table: - using codes defined in ITU-R M.1677-1 +// - Morse code representation is saved LSb first, using additional bit as guard +// - position in array corresponds ASCII code minus MORSE_ASCII_OFFSET +// - ASCII characters marked MORSE_UNSUPORTED do not have ITU-R M.1677-1 equivalent +static const uint8_t MorseTable[] PROGMEM = { + 0b00, // space + 0b110101, // ! (unsupported) + 0b1010010, // " + MORSE_UNSUPORTED, // # (unsupported) + MORSE_UNSUPORTED, // $ (unsupported) + MORSE_UNSUPORTED, // % (unsupported) + MORSE_UNSUPORTED, // & (unsupported) + 0b1011110, // ' + 0b101101, // ( + 0b1101101, // ) + MORSE_UNSUPORTED, // * (unsupported) + 0b101010, // + + 0b1110011, // , + 0b1100001, // - + 0b1101010, // . + 0b101001, // / + 0b111111, // 0 + 0b111110, // 1 + 0b111100, // 2 + 0b111000, // 3 + 0b110000, // 4 + 0b100000, // 5 + 0b100001, // 6 + 0b100011, // 7 + 0b100111, // 8 + 0b101111, // 9 + 0b1000111, // : + MORSE_UNSUPORTED, // ; (unsupported) + MORSE_UNSUPORTED, // < (unsupported) + 0b110001, // = + MORSE_UNSUPORTED, // > (unsupported) + 0b1001100, // ? + 0b1010110, // @ + 0b110, // A + 0b10001, // B + 0b10101, // C + 0b1001, // D + 0b10, // E + 0b10100, // F + 0b1011, // G + 0b10000, // H + 0b100, // I + 0b11110, // J + 0b1101, // K + 0b10010, // L + 0b111, // M + 0b101, // N + 0b1111, // O + 0b10110, // P + 0b11011, // Q + 0b1010, // R + 0b1000, // S + 0b11, // T + 0b1100, // U + 0b11000, // V + 0b1110, // W + 0b11001, // X + 0b11101, // Y + 0b10011, // Z + MORSE_UNSUPORTED, // [ (unsupported) + MORSE_UNSUPORTED, // \ (unsupported) + MORSE_UNSUPORTED, // ] (unsupported) + 0b1101000, // ^ (unsupported, used as alias for end of work) + 0b110101 // _ (unsupported, used as alias for starting signal) +}; /*! \class MorseClient From c857b512eeb9940ec7aee305c5e16a2e986fd818 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 24 Dec 2019 10:00:46 +0100 Subject: [PATCH 004/135] Added support for Sparkfun Apollo boards --- .travis.yml | 10 +++++++++- src/TypeDef.h | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0d669626..ba442413 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ env: - BOARD="esp32:esp32:esp32" - BOARD="STM32:stm32:GenF3:pnum=BLACKPILL_F303CC" - BOARD="esp8266:esp8266:generic:xtal=80,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=qio,eesz=512K" + - BOARD="SparkFun:apollo3:amap3redboard" - BOARD="arduino:samd:arduino_zero_native" - BOARD="arduino:sam:arduino_due_x" - BOARD="arduino:avr:uno" @@ -29,7 +30,12 @@ before_install: - sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # install 3rd party boards - - arduino --pref "boardsmanager.additional.urls=http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json,https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json" --save-prefs 2>&1 + - arduino --pref "boardsmanager.additional.urls= + http://arduino.esp8266.com/stable/package_esp8266com_index.json, + https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json, + https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json, + https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json + " --save-prefs 2>&1 - if [[ "$BOARD" =~ "esp8266:esp8266:" ]]; then arduino --install-boards esp8266:esp8266; export SKIP_PAT='(HTTP|MQTT).*ino'; @@ -41,6 +47,8 @@ before_install: arduino --install-boards arduino:samd; elif [[ "$BOARD" =~ "arduino:sam:" ]]; then arduino --install-boards arduino:sam; + elif [[ "$BOARD" =~ ":" ]]; then + arduino --install-boards ; fi # create directory to save the library and create symbolic link diff --git a/src/TypeDef.h b/src/TypeDef.h index 2f65269b..114ad305 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -61,7 +61,7 @@ /* * The following platforms do not support SoftwareSerial library. */ -#if defined(ESP32) || defined(SAMD_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__SAM3X8E__) +#if defined(ESP32) || defined(SAMD_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__SAM3X8E__) || defined(AM_PART_APOLLO3) #define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED #endif From 2052170bd08e7ec4de80a90262b31bfcda9bbfaa Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 24 Dec 2019 10:02:17 +0100 Subject: [PATCH 005/135] [Travis] Added missing board install --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ba442413..9a4e1427 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,8 +47,8 @@ before_install: arduino --install-boards arduino:samd; elif [[ "$BOARD" =~ "arduino:sam:" ]]; then arduino --install-boards arduino:sam; - elif [[ "$BOARD" =~ ":" ]]; then - arduino --install-boards ; + elif [[ "$BOARD" =~ "SparkFun:apollo3:" ]]; then + arduino --install-boards SparkFun:apollo3; fi # create directory to save the library and create symbolic link From a5cbd0e5a665cf5bb282f66b42bf67a99dc51615 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 24 Dec 2019 10:08:53 +0100 Subject: [PATCH 006/135] [Travis] Fixed formatting --- .travis.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9a4e1427..88e06691 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,12 +30,7 @@ before_install: - sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # install 3rd party boards - - arduino --pref "boardsmanager.additional.urls= - http://arduino.esp8266.com/stable/package_esp8266com_index.json, - https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json, - https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json, - https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json - " --save-prefs 2>&1 + - arduino --pref "boardsmanager.additional.urls=http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json,https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json,https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json" --save-prefs 2>&1 - if [[ "$BOARD" =~ "esp8266:esp8266:" ]]; then arduino --install-boards esp8266:esp8266; export SKIP_PAT='(HTTP|MQTT).*ino'; From b18a9d4abc931b5fd8c09a82088a9b8bbb599947 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 24 Dec 2019 11:03:25 +0100 Subject: [PATCH 007/135] [Travis] Removed Apollo3 from build matrix --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 88e06691..8e36b9cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ env: - BOARD="esp32:esp32:esp32" - BOARD="STM32:stm32:GenF3:pnum=BLACKPILL_F303CC" - BOARD="esp8266:esp8266:generic:xtal=80,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=qio,eesz=512K" - - BOARD="SparkFun:apollo3:amap3redboard" + # - BOARD="SparkFun:apollo3:amap3redboard" - BOARD="arduino:samd:arduino_zero_native" - BOARD="arduino:sam:arduino_due_x" - BOARD="arduino:avr:uno" From a1f94d9f16a9f780d67cdd89b515db5fe392d3cc Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 09:25:38 +0100 Subject: [PATCH 008/135] [SX126x] Set DIO2 to RF switch by default --- src/modules/SX126x/SX126x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 2e28ada5..901eb1a0 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -72,7 +72,7 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float } // set publicly accessible settings that are not a part of begin method - state = setDio2AsRfSwitch(false); + state = setDio2AsRfSwitch(true); return(state); } From 606e317958ff85cc8ff7756bb2e13baab8b46839 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:15:33 +0100 Subject: [PATCH 009/135] Changed to new approach to pin handling --- keywords.txt | 2 ++ src/Module.cpp | 82 ++++++++++++++++++++-------------------------- src/Module.h | 89 +++++++++++++++++++++++++++++++------------------- src/TypeDef.h | 25 +++----------- 4 files changed, 99 insertions(+), 99 deletions(-) diff --git a/keywords.txt b/keywords.txt index 329fcc9d..c4f652a2 100644 --- a/keywords.txt +++ b/keywords.txt @@ -171,6 +171,8 @@ shutdown KEYWORD2 # Constants (LITERAL1) ####################################### +RADIOLIB_PIN_UNUSED LITERAL1 + ERR_NONE LITERAL1 ERR_UNKNOWN LITERAL1 diff --git a/src/Module.cpp b/src/Module.cpp index 1f62f29e..d1b1f136 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -1,11 +1,11 @@ #include "Module.h" -Module::Module(int rx, int tx, HardwareSerial* useSer) { - _cs = -1; +Module::Module(int16_t rx, int16_t tx, HardwareSerial* useSer, int16_t rst) { + _cs = RADIOLIB_PIN_UNUSED; _rx = rx; _tx = tx; - _int0 = -1; - _int1 = -1; + _irq = RADIOLIB_PIN_UNUSED; + _rst = rst; #ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; @@ -15,22 +15,32 @@ Module::Module(int rx, int tx, HardwareSerial* useSer) { #endif } -Module::Module(int cs, int int0, int int1, SPIClass& spi, SPISettings spiSettings) { +Module::Module(int16_t cs, int16_t irq, int16_t rst, SPIClass& spi, SPISettings spiSettings) { _cs = cs; - _rx = -1; - _tx = -1; - _int0 = int0; - _int1 = int1; + _rx = RADIOLIB_PIN_UNUSED; + _tx = RADIOLIB_PIN_UNUSED; + _irq = irq; + _rst = rst; _spi = &spi; _spiSettings = spiSettings; } -Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISettings spiSettings, HardwareSerial* useSer) { +Module::Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio, SPIClass& spi, SPISettings spiSettings) { + _cs = cs; + _rx = gpio; + _tx = RADIOLIB_PIN_UNUSED; + _irq = irq; + _rst = rst; + _spi = &spi; + _spiSettings = spiSettings; +} + +Module::Module(int16_t cs, int16_t irq, int16_t rst, int16_t rx, int16_t tx, SPIClass& spi, SPISettings spiSettings, HardwareSerial* useSer) { _cs = cs; _rx = rx; _tx = tx; - _int0 = int0; - _int1 = int1; + _irq = irq; + _rst = rst; _spi = &spi; _spiSettings = spiSettings; @@ -42,22 +52,12 @@ Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISet #endif } -Module::Module(int cs, int int0, int int1, int int2, SPIClass& spi, SPISettings spiSettings) { - _cs = cs; - _rx = int2; - _tx = -1; - _int0 = int0; - _int1 = int1; - _spi = &spi; - _spiSettings = spiSettings; -} - -void Module::init(uint8_t interface, uint8_t gpio) { +void Module::init(uint8_t interface) { // select interface switch(interface) { case RADIOLIB_USE_SPI: - setPin(_cs, OUTPUT); - digitalWrite(_cs, HIGH); + Module::pinMode(_cs, OUTPUT); + Module::digitalWrite(_cs, HIGH); _spi->begin(); break; case RADIOLIB_USE_UART: @@ -70,22 +70,6 @@ void Module::init(uint8_t interface, uint8_t gpio) { case RADIOLIB_USE_I2C: break; } - - // select GPIO - switch(gpio) { - case RADIOLIB_INT_NONE: - break; - case RADIOLIB_INT_0: - setPin(_int0, INPUT); - break; - case RADIOLIB_INT_1: - setPin(_int1, INPUT); - break; - case RADIOLIB_INT_BOTH: - setPin(_int0, INPUT); - setPin(_int1, INPUT); - break; - } } void Module::term() { @@ -217,7 +201,7 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da _spi->beginTransaction(_spiSettings); // pull CS low - digitalWrite(_cs, LOW); + Module::digitalWrite(_cs, LOW); // send SPI register address with access command _spi->transfer(reg | cmd); @@ -247,14 +231,20 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da RADIOLIB_VERBOSE_PRINTLN(); // release CS - digitalWrite(_cs, HIGH); + Module::digitalWrite(_cs, HIGH); // end SPI transaction _spi->endTransaction(); } -void Module::setPin(int16_t pin, uint8_t mode) { - if(pin != -1) { - pinMode(pin, mode); +void Module::pinMode(int16_t pin, uint8_t mode) { + if(pin != RADIOLIB_PIN_UNUSED) { + ::pinMode(pin, mode); + } +} + +void Module::digitalWrite(int16_t pin, uint8_t value) { + if(pin != RADIOLIB_PIN_UNUSED) { + ::digitalWrite(pin, value); } } diff --git a/src/Module.h b/src/Module.h index f23df0ec..cb688435 100644 --- a/src/Module.h +++ b/src/Module.h @@ -25,12 +25,14 @@ class Module { \param rx Arduino pin to be used as Rx pin for SoftwareSerial communication. - \param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1 + \param serial HardwareSerial to be used on platforms that do not support SoftwareSerial. Defaults to Serial1. + + \param rst Arduino pin to be used as hardware reset for the module. Defaults to -1 (unused). */ #ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED - Module(int tx, int rx, HardwareSerial* useSer = &Serial1); + Module(int16_t tx, int16_t rx, HardwareSerial* serial = &Serial1, int16_t rst = -1); #else - Module(int tx, int rx, HardwareSerial* useSer = nullptr); + Module(int16_t tx, int16_t rx, HardwareSerial* serial = nullptr, int16_t rst = -1); #endif /*! @@ -38,41 +40,41 @@ class Module { \param cs Arduino pin to be used as chip select. - \param int0 Arduino pin to be used as interrupt/GPIO 0. + \param irq Arduino pin to be used as interrupt/GPIO. - \param int1 Arduino pin to be used as interrupt/GPIO 1. + \param rst Arduino pin to be used as hardware reset for the module. \param spi SPI interface to be used. Defaults to Arduino hardware SPI interface, can also use software SPI implementations. \param spiSettings SPI interface settings. Defaults to 2 MHz clock, MSB first, mode 0. */ - Module(int cs, int int0, int int1, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0)); + Module(int16_t cs, int16_t irq, int16_t rst, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0)); /*! \brief Extended SPI-based module constructor. \param cs Arduino pin to be used as chip select. - \param int0 Arduino pin to be used as interrupt/GPIO 0. + \param irq Arduino pin to be used as interrupt/GPIO. - \param int1 Arduino pin to be used as interrupt/GPIO 1. + \param rst Arduino pin to be used as hardware reset for the module. - \param int2 Arduino pin to be used as interrupt/GPIO 2. + \param gpio Arduino pin to be used as additional interrupt/GPIO. \param spi SPI interface to be used. Defaults to Arduino hardware SPI interface, can also use software SPI implementations. \param spiSettings SPI interface settings. Defaults to 2 MHz clock, MSB first, mode 0. */ - Module(int cs, int int0, int int1, int int2, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0)); + Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0)); /*! \brief Generic module constructor. \param cs Arduino pin to be used as chip select. - \param int0 Arduino pin to be used as interrupt/GPIO 0. + \param irq Arduino pin to be used as interrupt/GPIO. - \param int1 Arduino pin to be used as interrupt/GPIO 1. + \param rst Arduino pin to be used as hardware reset for the module. \param tx Arduino pin to be used as Tx pin for SoftwareSerial communication. @@ -85,9 +87,9 @@ class Module { \param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1 */ #ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED - Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0), HardwareSerial* useSer = &Serial1); + Module(int16_t cs, int16_t irq, int16_t rst, int16_t rx, int16_t tx, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0), HardwareSerial* serial = &Serial1); #else - Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0), HardwareSerial* useSer = nullptr); + Module(int16_t cs, int16_t irq, int16_t rst, int16_t rx, int16_t tx, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0), HardwareSerial* serial = nullptr); #endif @@ -128,10 +130,8 @@ class Module { \brief Initialize low-level module control. \param interface Interface to be used on the module. See \ref shield_config for details. - - \param gpio GPIO/interrupt pins to be used on the module. See \ref uart_config for details. */ - void init(uint8_t interface, uint8_t gpio); + void init(uint8_t interface); /*! \brief Terminate low-level module control. @@ -266,35 +266,42 @@ class Module { \returns Pin number of SPI chip select configured in the constructor. */ - int getCs() const { return(_cs); } + int16_t getCs() const { return(_cs); } /*! - \brief Access method to get the pin number of interrupt/GPIO 0. + \brief Access method to get the pin number of interrupt/GPIO. - \returns Pin number of interrupt/GPIO 0 configured in the constructor. + \returns Pin number of interrupt/GPIO configured in the constructor. */ - int getInt0() const { return(_int0); } + int16_t getIrq() const { return(_irq); } /*! - \brief Access method to get the pin number of interrupt/GPIO 1. + \brief Access method to get the pin number of hardware reset pin. - \returns Pin number of interrupt/GPIO 1 configured in the constructor. + \returns Pin number of hardware reset pin configured in the constructor. */ - int getInt1() const { return(_int1); } + int16_t getRst() const { return(_rst); } + + /*! + \brief Access method to get the pin number of second interrupt/GPIO. + + \returns Pin number of second interrupt/GPIO configured in the constructor. + */ + int16_t getGpio() const { return(_rx); } /*! \brief Access method to get the pin number of UART Rx. \returns Pin number of UART Rx configured in the constructor. */ - int getRx() const { return(_rx); } + int16_t getRx() const { return(_rx); } /*! \brief Access method to get the pin number of UART Rx. \returns Pin number of UART Rx configured in the constructor. */ - int getTx() const { return(_tx); } + int16_t getTx() const { return(_tx); } /*! \brief Access method to get the SPI interface. @@ -310,21 +317,37 @@ class Module { */ SPISettings getSpiSettings() const { return(_spiSettings); } + /*! + \brief Arduino core pinMode override that checks -1 as alias for unused pin. + + \param pin Pin to change the mode of. + + \param mode Which mode to set. + */ + static void pinMode(int16_t pin, uint8_t mode); + + /*! + \brief Arduino core digitalWrite override that checks -1 as alias for unused pin. + + \param pin Pin to write to. + + \param value Whether to set the pin high or low. + */ + static void digitalWrite(int16_t pin, uint8_t value); + #ifndef RADIOLIB_GODMODE private: #endif - int _cs; - int _tx; - int _rx; - int _int0; - int _int1; + int16_t _cs; + int16_t _tx; + int16_t _rx; + int16_t _irq; + int16_t _rst; SPIClass* _spi; SPISettings _spiSettings; uint32_t _ATtimeout = 15000; - - void setPin(int16_t pin, uint8_t mode); }; #endif diff --git a/src/TypeDef.h b/src/TypeDef.h index 114ad305..545359b7 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -65,6 +65,11 @@ #define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED #endif +/*! + \brief Alias for unused pin. +*/ +#define RADIOLIB_PIN_UNUSED (-1) + /*! \defgroup shield_config Shield Configuration @@ -86,26 +91,6 @@ */ #define RADIOLIB_USE_I2C 0x02 -/*! - \brief Do not use any interrupts/GPIOs. -*/ -#define RADIOLIB_INT_NONE 0x00 - -/*! - \brief Use interrupt/GPIO 0. -*/ -#define RADIOLIB_INT_0 0x01 - -/*! - \brief Use interrupt/GPIO 1. -*/ -#define RADIOLIB_INT_1 0x02 - -/*! - \brief Use both interrupts/GPIOs. -*/ -#define RADIOLIB_INT_BOTH 0x03 - /*! \} */ From 540867365cba0574bfb262e37994a92b1697c6df Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:16:31 +0100 Subject: [PATCH 010/135] [CC1101] Changed pin mapping --- .../CC1101/CC1101_Receive/CC1101_Receive.ino | 7 +++--- .../CC1101_Receive_Address.ino | 7 +++--- .../CC1101_Receive_Interrupt.ino | 7 +++--- .../CC1101_Settings/CC1101_Settings.ino | 14 ++++++----- .../CC1101_Transmit/CC1101_Transmit.ino | 7 +++--- .../CC1101_Transmit_Address.ino | 7 +++--- .../CC1101_Transmit_Interrupt.ino | 7 +++--- src/modules/CC1101/CC1101.cpp | 23 +++++++++++-------- 8 files changed, 46 insertions(+), 33 deletions(-) diff --git a/examples/CC1101/CC1101_Receive/CC1101_Receive.ino b/examples/CC1101/CC1101_Receive/CC1101_Receive.ino index 8c851088..57cd221b 100644 --- a/examples/CC1101/CC1101_Receive/CC1101_Receive.ino +++ b/examples/CC1101/CC1101_Receive/CC1101_Receive.ino @@ -17,10 +17,11 @@ #include // CC1101 has the following connections: -// NSS pin: 10 +// CS pin: 10 // GDO0 pin: 2 -// GDO2 pin: 3 -CC1101 cc = new Module(10, 2, 3); +// RST pin: unused +// GDO2 pin: 3 (optional) +CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino b/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino index 1f1aa5bf..95daa3b7 100644 --- a/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino +++ b/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino @@ -15,10 +15,11 @@ #include // CC1101 has the following connections: -// NSS pin: 10 +// CS pin: 10 // GDO0 pin: 2 -// GDO2 pin: 3 -CC1101 cc = new Module(10, 2, 3); +// RST pin: unused +// GDO2 pin: 3 (optional) +CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino b/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino index a4307ab4..2785fe4c 100644 --- a/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino +++ b/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino @@ -20,10 +20,11 @@ #include // CC1101 has the following connections: -// NSS pin: 10 +// CS pin: 10 // GDO0 pin: 2 -// GDO2 pin: 3 -CC1101 cc = new Module(10, 2, 3); +// RST pin: unused +// GDO2 pin: 3 (optional) +CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Settings/CC1101_Settings.ino b/examples/CC1101/CC1101_Settings/CC1101_Settings.ino index 7dca22ae..2f47ccb9 100644 --- a/examples/CC1101/CC1101_Settings/CC1101_Settings.ino +++ b/examples/CC1101/CC1101_Settings/CC1101_Settings.ino @@ -19,16 +19,18 @@ #include // CC1101 has the following connections: -// NSS pin: 10 +// CS pin: 10 // GDO0 pin: 2 -// GDO2 pin: 3 -CC1101 cc1 = new Module(10, 2, 3); +// RST pin: unused +// GDO2 pin: 3 (optional) +CC1101 cc1 = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // second CC1101 has different connections: -// NSS pin: 9 +// CS pin: 9 // GDO0 pin: 4 -// GDO2 pin: 5 -CC1101 cc2 = new Module(9, 4, 5); +// RST pin: unused +// GDO2 pin: 5 (optional) +CC1101 cc2 = new Module(9, 4, RADIOLIB_PIN_UNUSED, 53); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino b/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino index 87bde6e1..672bed0a 100644 --- a/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino +++ b/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino @@ -15,10 +15,11 @@ #include // CC1101 has the following connections: -// NSS pin: 10 +// CS pin: 10 // GDO0 pin: 2 -// GDO2 pin: 3 -CC1101 cc = new Module(10, 2, 3); +// RST pin: unused +// GDO2 pin: 3 (optional) +CC1101 cc1 = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino b/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino index b9e8a966..6c8205d5 100644 --- a/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino +++ b/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino @@ -15,10 +15,11 @@ #include // CC1101 has the following connections: -// NSS pin: 10 +// CS pin: 10 // GDO0 pin: 2 -// GDO2 pin: 3 -CC1101 cc = new Module(10, 2, 3); +// RST pin: unused +// GDO2 pin: 3 (optional) +CC1101 cc1 = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino b/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino index 14bf31eb..abfae5ac 100644 --- a/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino +++ b/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino @@ -16,10 +16,11 @@ #include // CC1101 has the following connections: -// NSS pin: 10 +// CS pin: 10 // GDO0 pin: 2 -// GDO2 pin: 3 -CC1101 cc = new Module(10, 2, 3); +// RST pin: unused +// GDO2 pin: 3 (optional) +CC1101 cc1 = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 5be2e21e..d0770ef0 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -13,7 +13,8 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po // set module properties _mod->SPIreadCommand = CC1101_CMD_READ; _mod->SPIwriteCommand = CC1101_CMD_WRITE; - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_0); + _mod->init(RADIOLIB_USE_SPI); + Module::pinMode(_mod->getIrq(), INPUT); // try to find the CC1101 chip uint8_t i = 0; @@ -110,10 +111,10 @@ int16_t CC1101::transmit(uint8_t* data, size_t len, uint8_t addr) { } // wait for transmission start - while(!digitalRead(_mod->getInt0())); + while(!digitalRead(_mod->getIrq())); // wait for transmission end - while(digitalRead(_mod->getInt0())); + while(digitalRead(_mod->getIrq())); // set mode to standby standby(); @@ -132,10 +133,10 @@ int16_t CC1101::receive(uint8_t* data, size_t len) { } // wait for sync word - while(!digitalRead(_mod->getInt0())); + while(!digitalRead(_mod->getIrq())); // wait for packet end - while(digitalRead(_mod->getInt0())); + while(digitalRead(_mod->getIrq())); // read packet data return(readData(data, len)); @@ -187,11 +188,15 @@ int16_t CC1101::packetMode() { } void CC1101::setGdo0Action(void (*func)(void), uint8_t dir) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt0()), func, dir); + attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, dir); } void CC1101::setGdo2Action(void (*func)(void), uint8_t dir) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt1()), func, dir); + if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + return; + } + Module::pinMode(_mod->getGpio(), INPUT); + attachInterrupt(digitalPinToInterrupt(_mod->getGpio()), func, dir); } int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) { @@ -808,9 +813,9 @@ void CC1101::SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, size_t len) { } void CC1101::SPIsendCommand(uint8_t cmd) { - digitalWrite(_mod->getCs(), LOW); + Module::digitalWrite(_mod->getCs(), LOW); SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); SPI.transfer(cmd); SPI.endTransaction(); - digitalWrite(_mod->getCs(), HIGH); + Module::digitalWrite(_mod->getCs(), HIGH); } From 0bc7208827c1eaeb4df6a8874f5d7ae21f46b358 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:17:01 +0100 Subject: [PATCH 011/135] [RF69] Changed pin mapping --- examples/RF69/RF69_Receive/RF69_Receive.ino | 4 +- .../RF69_Receive_AES/RF69_Receive_AES.ino | 4 +- .../RF69_Receive_Address.ino | 4 +- .../RF69_Receive_Interrupt.ino | 4 +- examples/RF69/RF69_Settings/RF69_Settings.ino | 8 +-- examples/RF69/RF69_Transmit/RF69_Transmit.ino | 4 +- .../RF69_Transmit_AES/RF69_Transmit_AES.ino | 4 +- .../RF69_Transmit_Address.ino | 4 +- .../RF69_Transmit_Interrupt.ino | 4 +- src/modules/RF69/RF69.cpp | 62 +++++++++++++------ src/modules/RF69/RF69.h | 9 ++- 11 files changed, 70 insertions(+), 41 deletions(-) diff --git a/examples/RF69/RF69_Receive/RF69_Receive.ino b/examples/RF69/RF69_Receive/RF69_Receive.ino index fb8b69bd..e45e45c0 100644 --- a/examples/RF69/RF69_Receive/RF69_Receive.ino +++ b/examples/RF69/RF69_Receive/RF69_Receive.ino @@ -17,9 +17,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino b/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino index cc5e074a..9fb3a5c6 100644 --- a/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino +++ b/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino @@ -13,9 +13,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino b/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino index c0444357..d1095ba3 100644 --- a/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino +++ b/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino @@ -15,9 +15,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino b/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino index a38ec020..e25dc64b 100644 --- a/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino +++ b/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino @@ -13,9 +13,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Settings/RF69_Settings.ino b/examples/RF69/RF69_Settings/RF69_Settings.ino index 1e5363ab..d4f5a158 100644 --- a/examples/RF69/RF69_Settings/RF69_Settings.ino +++ b/examples/RF69/RF69_Settings/RF69_Settings.ino @@ -19,15 +19,15 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf1 = new Module(10, 2, 3); // second CC1101 has different connections: -// NSS pin: 9 +// CS pin: 9 // DIO0 pin: 4 -// DIO1 pin: 5 +// RESET pin: 5 RF69 rf2 = new Module(9, 4, 5); // or using RadioShield diff --git a/examples/RF69/RF69_Transmit/RF69_Transmit.ino b/examples/RF69/RF69_Transmit/RF69_Transmit.ino index eb818b22..8e6fea55 100644 --- a/examples/RF69/RF69_Transmit/RF69_Transmit.ino +++ b/examples/RF69/RF69_Transmit/RF69_Transmit.ino @@ -15,9 +15,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino b/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino index b0b127ff..03f98a2e 100644 --- a/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino +++ b/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino @@ -13,9 +13,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino b/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino index 03b61a70..69e7d102 100644 --- a/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino +++ b/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino @@ -15,9 +15,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino b/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino index 684a9a9d..59dd02fb 100644 --- a/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino +++ b/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino @@ -16,9 +16,9 @@ #include // RF69 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 RF69 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 1f236485..bf1d83a9 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -14,7 +14,11 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT, int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { // set module properties - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_0); + _mod->init(RADIOLIB_USE_SPI); + Module::pinMode(_mod->getIrq(), INPUT); + + // reset the module + reset(); // try to find the RF69 chip uint8_t i = 0; @@ -101,15 +105,34 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe return(ERR_NONE); } +void RF69::reset() { + Module::pinMode(_mod->getRst(), OUTPUT); + Module::digitalWrite(_mod->getRst(), HIGH); + delayMicroseconds(100); + Module::digitalWrite(_mod->getRst(), LOW); + Module::pinMode(_mod->getRst(), INPUT); + delay(10); +} + int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) { + // calculate timeout (5ms + 500 % of expected time-on-air) + uint32_t timeout = 5000000 + (uint32_t)((((float)(len * 8)) / (_br * 1000.0)) * 5000000.0); + // start transmission int16_t state = startTransmit(data, len, addr); if(state != ERR_NONE) { return(state); } - // wait for transmission end - while(!digitalRead(_mod->getInt0())); + // wait for transmission end or timeout + uint32_t start = micros(); + while(!digitalRead(_mod->getIrq())) { + if(micros() - start > timeout) { + standby(); + clearIRQFlags(); + return(ERR_TX_TIMEOUT); + } + } // clear interrupt flags clearIRQFlags(); @@ -118,15 +141,20 @@ int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) { } int16_t RF69::receive(uint8_t* data, size_t len) { + // calculate timeout (500 ms + 400 full 64-byte packets at current bit rate) + uint32_t timeout = 500000 + (1.0/(_br*1000.0))*(RF69_MAX_PACKET_LENGTH*400.0); + // start reception - int16_t state = startReceive(true); + int16_t state = startReceive(); if(state != ERR_NONE) { return(state); } // wait for packet reception or timeout - while(!digitalRead(_mod->getInt0())) { - if(digitalRead(_mod->getInt1())) { + uint32_t start = micros(); + while(!digitalRead(_mod->getIrq())) { + if(micros() - start > timeout) { + standby(); clearIRQFlags(); return(ERR_RX_TIMEOUT); } @@ -208,20 +236,14 @@ int16_t RF69::disableAES() { return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_2, RF69_AES_OFF, 0, 0)); } -int16_t RF69::startReceive(bool timeout) { +int16_t RF69::startReceive() { // set mode to standby int16_t state = setMode(RF69_STANDBY); // set RX timeouts and DIO pin mapping - if(timeout) { - state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PAYLOAD_READY | RF69_DIO1_PACK_TIMEOUT, 7, 4); - state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START); - state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH); - } else { - state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PAYLOAD_READY, 7, 6); - state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START_OFF); - state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH_OFF); - } + state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PAYLOAD_READY, 7, 4); + state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START); + state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH); if(state != ERR_NONE) { return(state); } @@ -238,11 +260,15 @@ int16_t RF69::startReceive(bool timeout) { } void RF69::setDio0Action(void (*func)(void)) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt0()), func, RISING); + attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, RISING); } void RF69::setDio1Action(void (*func)(void)) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt1()), func, RISING); + if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + return; + } + Module::pinMode(_mod->getGpio(), INPUT); + attachInterrupt(digitalPinToInterrupt(_mod->getGpio()), func, RISING); } int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h index fbe8abb2..8f3a0a4c 100644 --- a/src/modules/RF69/RF69.h +++ b/src/modules/RF69/RF69.h @@ -464,6 +464,11 @@ class RF69: public PhysicalLayer { */ int16_t begin(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13); + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + */ + void reset(); + /*! \brief Blocking binary transmit method. Overloads for string-based transmissions are implemented in PhysicalLayer. @@ -581,11 +586,9 @@ class RF69: public PhysicalLayer { /*! \brief Interrupt-driven receive method. GDO0 will be activated when full packet is received. - \param timeout Enable module-driven timeout. Set to false for listen mode. - \returns \ref status_codes */ - int16_t startReceive(bool timeout = false); + int16_t startReceive(); /*! \brief Reads data received after calling startReceive method. From 9e2ed2ca6fcee3f0aed2e254dbac8b6a2f6842f4 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:17:14 +0100 Subject: [PATCH 012/135] [CC1101] Changed pin mapping --- examples/SX1231/SX1231_Receive/SX1231_Receive.ino | 6 +++--- examples/SX1231/SX1231_Transmit/SX1231_Transmit.ino | 4 ++-- src/modules/SX1231/SX1231.cpp | 4 +++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/examples/SX1231/SX1231_Receive/SX1231_Receive.ino b/examples/SX1231/SX1231_Receive/SX1231_Receive.ino index 8de99947..727de1e5 100644 --- a/examples/SX1231/SX1231_Receive/SX1231_Receive.ino +++ b/examples/SX1231/SX1231_Receive/SX1231_Receive.ino @@ -15,9 +15,9 @@ #include // SX1231 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 SX1231 rf = new Module(10, 2, 3); // or using RadioShield @@ -35,7 +35,7 @@ void setup() { // frequency deviation: 50.0 kHz // output power: 13 dBm // sync word: 0x2D01 - byte state = rf.begin(); + int state = rf.begin(); if (state == ERR_NONE) { Serial.println(F("success!")); } else { diff --git a/examples/SX1231/SX1231_Transmit/SX1231_Transmit.ino b/examples/SX1231/SX1231_Transmit/SX1231_Transmit.ino index b3376f2d..c781b02a 100644 --- a/examples/SX1231/SX1231_Transmit/SX1231_Transmit.ino +++ b/examples/SX1231/SX1231_Transmit/SX1231_Transmit.ino @@ -15,9 +15,9 @@ #include // SX1231 has the following connections: -// NSS pin: 10 +// CS pin: 10 // DIO0 pin: 2 -// DIO1 pin: 3 +// RESET pin: 3 SX1231 rf = new Module(10, 2, 3); // or using RadioShield diff --git a/src/modules/SX1231/SX1231.cpp b/src/modules/SX1231/SX1231.cpp index 7e1e93d4..e4cff588 100644 --- a/src/modules/SX1231/SX1231.cpp +++ b/src/modules/SX1231/SX1231.cpp @@ -6,7 +6,9 @@ SX1231::SX1231(Module* mod) : RF69(mod) { int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { // set module properties - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); + _mod->init(RADIOLIB_USE_SPI); + Module::pinMode(_mod->getIrq(), INPUT); + Module::pinMode(_mod->getRst(), OUTPUT); // try to find the SX1231 chip uint8_t i = 0; From 05b300408b0c8794e99675acaa6f6a2ff58386c4 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:17:34 +0100 Subject: [PATCH 013/135] [nRF24] Changed pin mapping --- .../nRF24/nRF24_Receive/nRF24_Receive.ino | 6 ++--- .../nRF24/nRF24_Transmit/nRF24_Transmit.ino | 6 ++--- src/modules/nRF24/nRF24.cpp | 24 +++++++++---------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/nRF24/nRF24_Receive/nRF24_Receive.ino b/examples/nRF24/nRF24_Receive/nRF24_Receive.ino index 785ce037..b5b5571e 100644 --- a/examples/nRF24/nRF24_Receive/nRF24_Receive.ino +++ b/examples/nRF24/nRF24_Receive/nRF24_Receive.ino @@ -17,9 +17,9 @@ #include // nRF24 has the following connections: -// NSS pin: 10 -// CE pin: 2 -// IRQ pin: 3 +// CS pin: 10 +// IRQ pin: 2 +// CE pin: 3 nRF24 nrf = new Module(10, 2, 3); // or using RadioShield diff --git a/examples/nRF24/nRF24_Transmit/nRF24_Transmit.ino b/examples/nRF24/nRF24_Transmit/nRF24_Transmit.ino index d6c19f05..89006b38 100644 --- a/examples/nRF24/nRF24_Transmit/nRF24_Transmit.ino +++ b/examples/nRF24/nRF24_Transmit/nRF24_Transmit.ino @@ -17,9 +17,9 @@ #include // nRF24 has the following connections: -// NSS pin: 10 -// CE pin: 2 -// IRQ pin: 3 +// CS pin: 10 +// IRQ pin: 2 +// CE pin: 3 nRF24 nrf = new Module(10, 2, 3); // or using RadioShield diff --git a/src/modules/nRF24/nRF24.cpp b/src/modules/nRF24/nRF24.cpp index 7dd2d5c9c..b7fc0b37 100644 --- a/src/modules/nRF24/nRF24.cpp +++ b/src/modules/nRF24/nRF24.cpp @@ -8,11 +8,11 @@ int16_t nRF24::begin(int16_t freq, int16_t dataRate, int8_t power, uint8_t addrW // set module properties _mod->SPIreadCommand = NRF24_CMD_READ; _mod->SPIwriteCommand = NRF24_CMD_WRITE; - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); + _mod->init(RADIOLIB_USE_SPI); - // override pin mode on INT0 (connected to nRF24 CE pin) - pinMode(_mod->getInt0(), OUTPUT); - digitalWrite(_mod->getInt0(), LOW); + // set pin mode on RST (connected to nRF24 CE pin) + Module::pinMode(_mod->getRst(), OUTPUT); + Module::digitalWrite(_mod->getRst(), LOW); // wait for minimum power-on reset duration delay(100); @@ -72,7 +72,7 @@ int16_t nRF24::standby() { // make sure carrier output is disabled _mod->SPIsetRegValue(NRF24_REG_RF_SETUP, NRF24_CONT_WAVE_OFF, 7, 7); _mod->SPIsetRegValue(NRF24_REG_RF_SETUP, NRF24_PLL_LOCK_OFF, 4, 4); - digitalWrite(_mod->getInt0(), LOW); + digitalWrite(_mod->getRst(), LOW); // use standby-1 mode return(_mod->SPIsetRegValue(NRF24_REG_CONFIG, NRF24_POWER_UP, 1, 1)); @@ -87,7 +87,7 @@ int16_t nRF24::transmit(uint8_t* data, size_t len, uint8_t addr) { // wait until transmission is finished uint32_t start = micros(); - while(digitalRead(_mod->getInt1())) { + while(digitalRead(_mod->getIrq())) { // check maximum number of retransmits if(getStatus(NRF24_MAX_RT)) { standby(); @@ -118,7 +118,7 @@ int16_t nRF24::receive(uint8_t* data, size_t len) { // wait for Rx_DataReady or timeout uint32_t start = micros(); - while(digitalRead(_mod->getInt1())) { + while(digitalRead(_mod->getIrq())) { // check timeout: 15 retries * 4ms (max Tx time as per datasheet) if(micros() - start >= 60000) { standby(); @@ -142,7 +142,7 @@ int16_t nRF24::transmitDirect(uint32_t frf) { int16_t state = _mod->SPIsetRegValue(NRF24_REG_CONFIG, NRF24_PTX, 0, 0); state |= _mod->SPIsetRegValue(NRF24_REG_RF_SETUP, NRF24_CONT_WAVE_ON, 7, 7); state |= _mod->SPIsetRegValue(NRF24_REG_RF_SETUP, NRF24_PLL_LOCK_ON, 4, 4); - digitalWrite(_mod->getInt0(), HIGH); + digitalWrite(_mod->getRst(), HIGH); return(state); } @@ -153,7 +153,7 @@ int16_t nRF24::receiveDirect() { } void nRF24::setIrqAction(void (*func)(void)) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt1()), func, FALLING); + attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, FALLING); } int16_t nRF24::startTransmit(uint8_t* data, size_t len, uint8_t addr) { @@ -193,9 +193,9 @@ int16_t nRF24::startTransmit(uint8_t* data, size_t len, uint8_t addr) { SPIwriteTxPayload(data, len); // CE high to start transmitting - digitalWrite(_mod->getInt0(), HIGH); + digitalWrite(_mod->getRst(), HIGH); delayMicroseconds(10); - digitalWrite(_mod->getInt0(), LOW); + digitalWrite(_mod->getRst(), LOW); return(state); } @@ -224,7 +224,7 @@ int16_t nRF24::startReceive() { SPItransfer(NRF24_CMD_FLUSH_RX); // CE high to start receiving - digitalWrite(_mod->getInt0(), HIGH); + digitalWrite(_mod->getRst(), HIGH); // wait to enter Rx state delayMicroseconds(130); From 6f0496e06e3177dbeb62fc6feede42e50be455ac Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:18:36 +0100 Subject: [PATCH 014/135] [XBee] Changed pin mapping --- examples/XBee/XBee_Receive/XBee_Receive.ino | 2 +- examples/XBee/XBee_Transmit/XBee_Transmit.ino | 2 +- .../XBee_Transparent/XBee_Transparent.ino | 2 +- src/modules/XBee/XBee.cpp | 23 +++++++++++-------- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/examples/XBee/XBee_Receive/XBee_Receive.ino b/examples/XBee/XBee_Receive/XBee_Receive.ino index 41921283..e5036026 100644 --- a/examples/XBee/XBee_Receive/XBee_Receive.ino +++ b/examples/XBee/XBee_Receive/XBee_Receive.ino @@ -18,7 +18,7 @@ // TX pin: 9 // RX pin: 8 // RESET pin: 3 -XBee bee = new Module(9, 8); +XBee bee = new Module(9, 8, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/XBee/XBee_Transmit/XBee_Transmit.ino b/examples/XBee/XBee_Transmit/XBee_Transmit.ino index 1123015d..1d7d8aa9 100644 --- a/examples/XBee/XBee_Transmit/XBee_Transmit.ino +++ b/examples/XBee/XBee_Transmit/XBee_Transmit.ino @@ -18,7 +18,7 @@ // TX pin: 9 // RX pin: 8 // RESET pin: 3 -XBee bee = new Module(9, 8); +XBee bee = new Module(9, 8, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/XBee/XBee_Transparent/XBee_Transparent.ino b/examples/XBee/XBee_Transparent/XBee_Transparent.ino index deb29061..f27108eb 100644 --- a/examples/XBee/XBee_Transparent/XBee_Transparent.ino +++ b/examples/XBee/XBee_Transparent/XBee_Transparent.ino @@ -20,7 +20,7 @@ // TX pin: 9 // RX pin: 8 // RESET pin: 3 -XBeeSerial bee = new Module(9, 8); +XBeeSerial bee = new Module(9, 8, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/src/modules/XBee/XBee.cpp b/src/modules/XBee/XBee.cpp index 87a93a8d..5c38a433 100644 --- a/src/modules/XBee/XBee.cpp +++ b/src/modules/XBee/XBee.cpp @@ -10,7 +10,7 @@ XBee::XBee(Module* mod) { int16_t XBee::begin(long speed) { // set module properties _mod->baudrate = speed; - _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_1); + _mod->init(RADIOLIB_USE_UART); // reset module reset(); @@ -52,11 +52,11 @@ int16_t XBee::begin(long speed) { } void XBee::reset() { - pinMode(_mod->getInt1(), OUTPUT); - digitalWrite(_mod->getInt1(), LOW); + pinMode(_mod->getRst(), OUTPUT); + digitalWrite(_mod->getRst(), LOW); delayMicroseconds(200); - digitalWrite(_mod->getInt1(), HIGH); - pinMode(_mod->getInt1(), INPUT); + digitalWrite(_mod->getRst(), HIGH); + pinMode(_mod->getRst(), INPUT); } int16_t XBee::transmit(uint8_t* dest, const char* payload, uint8_t radius) { @@ -189,7 +189,10 @@ int16_t XBeeSerial::begin(long speed) { // set module properties _mod->AtLineFeed = "\r"; _mod->baudrate = speed; - _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_NONE); + _mod->init(RADIOLIB_USE_UART); + + // reset module + reset(); // empty UART buffer (garbage data) _mod->ATemptyBuffer(); @@ -216,11 +219,11 @@ int16_t XBeeSerial::begin(long speed) { } void XBeeSerial::reset() { - pinMode(_mod->getInt1(), OUTPUT); - digitalWrite(_mod->getInt1(), LOW); + pinMode(_mod->getRst(), OUTPUT); + digitalWrite(_mod->getRst(), LOW); delayMicroseconds(200); - digitalWrite(_mod->getInt1(), HIGH); - pinMode(_mod->getInt1(), INPUT); + digitalWrite(_mod->getRst(), HIGH); + pinMode(_mod->getRst(), INPUT); } int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, const char* destinationAddressLow) { From b8459a58ade098968e4f4bc2480cddc28dfbe9bb Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:18:49 +0100 Subject: [PATCH 015/135] [ESP8266] Changed pin mapping --- src/modules/ESP8266/ESP8266.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/ESP8266/ESP8266.cpp b/src/modules/ESP8266/ESP8266.cpp index e3ff2fbb..ab50f640 100644 --- a/src/modules/ESP8266/ESP8266.cpp +++ b/src/modules/ESP8266/ESP8266.cpp @@ -9,7 +9,7 @@ int16_t ESP8266::begin(long speed) { // set module properties _mod->AtLineFeed = "\r\n"; _mod->baudrate = speed; - _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_NONE); + _mod->init(RADIOLIB_USE_UART); // empty UART buffer (garbage data) _mod->ATemptyBuffer(); From 7cc765debb19a2203824e568907f465e6a5f6d43 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:18:59 +0100 Subject: [PATCH 016/135] [HC05] Changed pin mapping --- src/modules/HC05/HC05.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/HC05/HC05.cpp b/src/modules/HC05/HC05.cpp index be54f672..2aecab76 100644 --- a/src/modules/HC05/HC05.cpp +++ b/src/modules/HC05/HC05.cpp @@ -1,11 +1,11 @@ #include "HC05.h" HC05::HC05(Module* mod) : ISerial(mod) { - + } void HC05::begin(long speed) { // set module properties _mod->baudrate = speed; - _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_NONE); + _mod->init(RADIOLIB_USE_UART); } From 47776c5acbdd3f3d0c1db56d44ea725524816194 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:19:10 +0100 Subject: [PATCH 017/135] [JDY08] Changed pin mapping --- src/modules/JDY08/JDY08.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/JDY08/JDY08.cpp b/src/modules/JDY08/JDY08.cpp index c4eee4a3..78bc596b 100644 --- a/src/modules/JDY08/JDY08.cpp +++ b/src/modules/JDY08/JDY08.cpp @@ -1,12 +1,12 @@ #include "JDY08.h" JDY08::JDY08(Module* mod) : ISerial(mod) { - + } void JDY08::begin(long speed) { // set module properties _mod->AtLineFeed = ""; _mod->baudrate = speed; - _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_NONE); + _mod->init(RADIOLIB_USE_UART); } From beb160f70507d78916406baca5fdd305423d0e52 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:19:54 +0100 Subject: [PATCH 018/135] [SX127x] Changed pin mapping and implemented reset --- .../SX127x_Channel_Activity_Detection.ino | 3 +- .../SX127x_FSK_Modem/SX127x_FSK_Modem.ino | 3 +- .../SX127x/SX127x_Receive/SX127x_Receive.ino | 3 +- .../SX127x_Receive_Interrupt.ino | 3 +- .../SX127x_Settings/SX127x_Settings.ino | 8 ++-- .../SX127x_Transmit/SX127x_Transmit.ino | 3 +- .../SX127x_Transmit_Interrupt.ino | 3 +- src/modules/SX127x/SX127x.cpp | 40 ++++++++++++++----- src/modules/SX127x/SX127x.h | 5 +++ 9 files changed, 51 insertions(+), 20 deletions(-) diff --git a/examples/SX127x/SX127x_Channel_Activity_Detection/SX127x_Channel_Activity_Detection.ino b/examples/SX127x/SX127x_Channel_Activity_Detection/SX127x_Channel_Activity_Detection.ino index cf54ed75..163f8273 100644 --- a/examples/SX127x/SX127x_Channel_Activity_Detection/SX127x_Channel_Activity_Detection.ino +++ b/examples/SX127x/SX127x_Channel_Activity_Detection/SX127x_Channel_Activity_Detection.ino @@ -19,8 +19,9 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 lora = new Module(10, 2, 3); +SX1278 lora = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX127x/SX127x_FSK_Modem/SX127x_FSK_Modem.ino b/examples/SX127x/SX127x_FSK_Modem/SX127x_FSK_Modem.ino index 1c8cd1da..f9c89154 100644 --- a/examples/SX127x/SX127x_FSK_Modem/SX127x_FSK_Modem.ino +++ b/examples/SX127x/SX127x_FSK_Modem/SX127x_FSK_Modem.ino @@ -19,8 +19,9 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 fsk = new Module(10, 2, 3); +SX1278 fsk = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX127x/SX127x_Receive/SX127x_Receive.ino b/examples/SX127x/SX127x_Receive/SX127x_Receive.ino index c3c3392e..5627bdc3 100644 --- a/examples/SX127x/SX127x_Receive/SX127x_Receive.ino +++ b/examples/SX127x/SX127x_Receive/SX127x_Receive.ino @@ -23,8 +23,9 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 lora = new Module(10, 2, 3); +SX1278 lora = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino b/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino index d204348b..fbc20651 100644 --- a/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino +++ b/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino @@ -24,8 +24,9 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 lora = new Module(10, 2, 3); +SX1278 lora = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX127x/SX127x_Settings/SX127x_Settings.ino b/examples/SX127x/SX127x_Settings/SX127x_Settings.ino index 63fbc9cc..681c76d2 100644 --- a/examples/SX127x/SX127x_Settings/SX127x_Settings.ino +++ b/examples/SX127x/SX127x_Settings/SX127x_Settings.ino @@ -23,14 +23,16 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 loraSX1278 = new Module(10, 2, 3); +SX1278 loraSX1278 = new Module(10, 2, 9, 3); // SX1272 has different connections: // NSS pin: 9 // DIO0 pin: 4 -// DIO1 pin: 5 -SX1272 loraSX1272 = new Module(9, 4, 5); +// RESET pin: 5 +// DIO1 pin: 6 +SX1272 loraSX1272 = new Module(9, 4, 5, 6); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX127x/SX127x_Transmit/SX127x_Transmit.ino b/examples/SX127x/SX127x_Transmit/SX127x_Transmit.ino index 2573a41d..d14e76f7 100644 --- a/examples/SX127x/SX127x_Transmit/SX127x_Transmit.ino +++ b/examples/SX127x/SX127x_Transmit/SX127x_Transmit.ino @@ -19,8 +19,9 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 lora = new Module(10, 2, 3); +SX1278 lora = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino b/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino index 08681c9e..8368a7d4 100644 --- a/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino +++ b/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino @@ -20,8 +20,9 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 lora = new Module(10, 2, 3); +SX1278 lora = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 9347f44c..23bd0785 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -7,7 +7,12 @@ SX127x::SX127x(Module* mod) : PhysicalLayer(SX127X_CRYSTAL_FREQ, SX127X_DIV_EXPO int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimit, uint16_t preambleLength) { // set module properties - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); + _mod->init(RADIOLIB_USE_SPI); + Module::pinMode(_mod->getIrq(), INPUT); + Module::pinMode(_mod->getGpio(), INPUT); + + // reset the module + reset(); // try to find the SX127x chip if(!SX127x::findChip(chipVersion)) { @@ -54,7 +59,11 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxBw, uint8_t currentLimit, uint16_t preambleLength, bool enableOOK) { // set module properties - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); + _mod->init(RADIOLIB_USE_SPI); + Module::pinMode(_mod->getIrq(), INPUT); + + // reset the module + reset(); // try to find the SX127x chip if(!SX127x::findChip(chipVersion)) { @@ -145,6 +154,15 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB return(state); } +void SX127x::reset() { + Module::pinMode(_mod->getRst(), OUTPUT); + Module::digitalWrite(_mod->getRst(), LOW); + delayMicroseconds(100); + Module::digitalWrite(_mod->getRst(), HIGH); + Module::pinMode(_mod->getRst(), INPUT); + delay(5); +} + int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { // set mode to standby int16_t state = setMode(SX127X_STANDBY); @@ -172,7 +190,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { // wait for packet transmission or timeout start = micros(); - while(!digitalRead(_mod->getInt0())) { + while(!digitalRead(_mod->getIrq())) { if(micros() - start > timeout) { clearIRQFlags(); return(ERR_TX_TIMEOUT); @@ -191,7 +209,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { // wait for transmission end or timeout start = micros(); - while(!digitalRead(_mod->getInt0())) { + while(!digitalRead(_mod->getIrq())) { if(micros() - start > timeout) { clearIRQFlags(); standby(); @@ -226,8 +244,8 @@ int16_t SX127x::receive(uint8_t* data, size_t len) { } // wait for packet reception or timeout (100 LoRa symbols) - while(!digitalRead(_mod->getInt0())) { - if(digitalRead(_mod->getInt1())) { + while(!digitalRead(_mod->getIrq())) { + if(digitalRead(_mod->getGpio())) { clearIRQFlags(); return(ERR_RX_TIMEOUT); } @@ -245,7 +263,7 @@ int16_t SX127x::receive(uint8_t* data, size_t len) { // wait for packet reception or timeout uint32_t start = micros(); - while(!digitalRead(_mod->getInt0())) { + while(!digitalRead(_mod->getIrq())) { if(micros() - start > timeout) { clearIRQFlags(); return(ERR_RX_TIMEOUT); @@ -281,8 +299,8 @@ int16_t SX127x::scanChannel() { } // wait for channel activity detected or timeout - while(!digitalRead(_mod->getInt0())) { - if(digitalRead(_mod->getInt1())) { + while(!digitalRead(_mod->getIrq())) { + if(digitalRead(_mod->getGpio())) { clearIRQFlags(); return(PREAMBLE_DETECTED); } @@ -411,11 +429,11 @@ int16_t SX127x::startReceive(uint8_t len, uint8_t mode) { } void SX127x::setDio0Action(void (*func)(void)) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt0()), func, RISING); + attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, RISING); } void SX127x::setDio1Action(void (*func)(void)) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt1()), func, RISING); + attachInterrupt(digitalPinToInterrupt(_mod->getGpio()), func, RISING); } int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index c805f5f9..2d1f0328 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -563,6 +563,11 @@ class SX127x: public PhysicalLayer { */ int16_t begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimit, uint16_t preambleLength); + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + */ + void reset(); + /*! \brief Initialization method for FSK modem. Will be called with appropriate parameters when calling FSK initialization method from derived class. From 55aff74a81d6dd682aad65c1d19fa3bf0b044c7e Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:21:21 +0100 Subject: [PATCH 019/135] [SX126x] Changed pin mapping, added reset, changed LoRa sync word to 1B --- .../SX126x_Channel_Activity_Detection.ino | 3 +- .../SX126x_FSK_Modem/SX126x_FSK_Modem.ino | 3 +- .../SX126x/SX126x_Receive/SX126x_Receive.ino | 4 +- .../SX126x_Receive_Interrupt.ino | 3 +- .../SX126x_Settings/SX126x_Settings.ino | 6 ++- .../SX126x_Transmit/SX126x_Transmit.ino | 5 +- .../SX126x_Transmit_Interrupt.ino | 3 +- src/modules/SX126x/SX1262.cpp | 2 +- src/modules/SX126x/SX1262.h | 4 +- src/modules/SX126x/SX1268.cpp | 2 +- src/modules/SX126x/SX1268.h | 4 +- src/modules/SX126x/SX126x.cpp | 52 +++++++++++++------ src/modules/SX126x/SX126x.h | 15 ++++-- 13 files changed, 68 insertions(+), 38 deletions(-) diff --git a/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino b/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino index bc26c988..62981785 100644 --- a/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino +++ b/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino @@ -18,8 +18,9 @@ // SX1262 has the following connections: // NSS pin: 10 // DIO1 pin: 2 +// NRST pin: 3 // BUSY pin: 9 -SX1262 lora = new Module(10, 2, 9); +SX1262 lora = new Module(10, 2, 3, 9); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino b/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino index 333e118f..8efb8e25 100644 --- a/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino +++ b/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino @@ -19,8 +19,9 @@ // SX1262 has the following connections: // NSS pin: 10 // DIO1 pin: 2 +// NRST pin: 3 // BUSY pin: 9 -SX1262 fsk = new Module(10, 2, 9); +SX1262 fsk = new Module(10, 2, 3, 9); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino index 4d6a7d34..cef823a6 100644 --- a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino +++ b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino @@ -23,9 +23,9 @@ // SX1262 has the following connections: // NSS pin: 10 // DIO1 pin: 2 -// DIO2 pin: 3 +// NRST pin: 3 // BUSY pin: 9 -SX1262 lora = new Module(10, 2, 9); +SX1262 lora = new Module(10, 2, 3, 9); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino index c4752735..c07fa9c7 100644 --- a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino +++ b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino @@ -24,8 +24,9 @@ // SX1262 has the following connections: // NSS pin: 10 // DIO1 pin: 2 +// NRST pin: 3 // BUSY pin: 9 -SX1262 lora = new Module(10, 2, 9); +SX1262 lora = new Module(10, 2, 3, 9); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX126x/SX126x_Settings/SX126x_Settings.ino b/examples/SX126x/SX126x_Settings/SX126x_Settings.ino index 7b2e8901..f26a590b 100644 --- a/examples/SX126x/SX126x_Settings/SX126x_Settings.ino +++ b/examples/SX126x/SX126x_Settings/SX126x_Settings.ino @@ -27,14 +27,16 @@ // SX1262 has the following connections: // NSS pin: 10 // DIO1 pin: 2 +// NRST pin: 3 // BUSY pin: 9 -SX1262 loraSX1262 = new Module(10, 2, 9); +SX1262 loraSX1262 = new Module(10, 2, 3, 9); // SX12628 has different connections: // NSS pin: 8 // DIO1 pin: 4 +// NRST pin: 5 // BUSY pin: 6 -SX1268 loraSX1268 = new Module(8, 4, 6); +SX1268 loraSX1268 = new Module(8, 4, 5, 6); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino b/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino index 2394b770..084e11a6 100644 --- a/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino +++ b/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino @@ -19,8 +19,9 @@ // SX1262 has the following connections: // NSS pin: 10 // DIO1 pin: 2 +// NRST pin: 3 // BUSY pin: 9 -SX1262 lora = new Module(10, 2, 9); +SX1262 lora = new Module(10, 2, 3, 9); // or using RadioShield // https://github.com/jgromes/RadioShield @@ -35,7 +36,7 @@ void setup() { // bandwidth: 125.0 kHz // spreading factor: 9 // coding rate: 7 - // sync word: 0x1424 (private network) + // sync word: 0x12 (private network) // output power: 14 dBm // current limit: 60 mA // preamble length: 8 symbols diff --git a/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino b/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino index 046ebbfd..2996f12c 100644 --- a/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino +++ b/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino @@ -20,8 +20,9 @@ // SX1262 has the following connections: // NSS pin: 10 // DIO1 pin: 2 +// NRST pin: 3 // BUSY pin: 9 -SX1262 lora = new Module(10, 2, 9); +SX1262 lora = new Module(10, 2, 3, 9); // save transmission state between loops int transmissionState = ERR_NONE; diff --git a/src/modules/SX126x/SX1262.cpp b/src/modules/SX126x/SX1262.cpp index 12e1c4b8..c7aee4ab 100644 --- a/src/modules/SX126x/SX1262.cpp +++ b/src/modules/SX126x/SX1262.cpp @@ -4,7 +4,7 @@ SX1262::SX1262(Module* mod) : SX126x(mod) { } -int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { +int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { // execute common part int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage); if(state != ERR_NONE) { diff --git a/src/modules/SX126x/SX1262.h b/src/modules/SX126x/SX1262.h index 513bc766..3f3b9cc5 100644 --- a/src/modules/SX126x/SX1262.h +++ b/src/modules/SX126x/SX1262.h @@ -32,7 +32,7 @@ class SX1262: public SX126x { \param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7). - \param syncWord 2-byte LoRa sync word. Defaults to SX126X_SYNC_WORD_PRIVATE (0x1424). + \param syncWord 2-byte LoRa sync word. Defaults to SX126X_SYNC_WORD_PRIVATE (0x12). \param power Output power in dBm. Defaults to 14 dBm. @@ -44,7 +44,7 @@ class SX1262: public SX126x { \returns \ref status_codes */ - int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint16_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6); + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6); /*! \brief Initialization method for FSK modem. diff --git a/src/modules/SX126x/SX1268.cpp b/src/modules/SX126x/SX1268.cpp index cb064702..f7588165 100644 --- a/src/modules/SX126x/SX1268.cpp +++ b/src/modules/SX126x/SX1268.cpp @@ -4,7 +4,7 @@ SX1268::SX1268(Module* mod) : SX126x(mod) { } -int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { +int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { // execute common part int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage); if(state != ERR_NONE) { diff --git a/src/modules/SX126x/SX1268.h b/src/modules/SX126x/SX1268.h index ccc0ce50..cb481705 100644 --- a/src/modules/SX126x/SX1268.h +++ b/src/modules/SX126x/SX1268.h @@ -35,7 +35,7 @@ class SX1268: public SX126x { \param cr LoRa coding rate denominator. Defaults to 7 (coding rate 4/7). - \param syncWord 2-byte LoRa sync word. Defaults to SX126X_SYNC_WORD_PRIVATE (0x1424). + \param syncWord 2-byte LoRa sync word. Defaults to SX126X_SYNC_WORD_PRIVATE (0x12). \param power Output power in dBm. Defaults to 14 dBm. @@ -47,7 +47,7 @@ class SX1268: public SX126x { \returns \ref status_codes */ - int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint16_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6); + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6); /*! \brief Initialization method for FSK modem. diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 901eb1a0..8dc93081 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -4,9 +4,14 @@ SX126x::SX126x(Module* mod) : PhysicalLayer(SX126X_CRYSTAL_FREQ, SX126X_DIV_EXPO _mod = mod; } -int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { +int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { // set module properties - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); + _mod->init(RADIOLIB_USE_SPI); + Module::pinMode(_mod->getIrq(), INPUT); + Module::pinMode(_mod->getGpio(), INPUT); + + // reset the module + reset(); // BW in kHz and SF are required in order to calculate LDRO for setModulationParams _bwKhz = bw; @@ -79,7 +84,11 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage) { // set module properties - _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); + _mod->init(RADIOLIB_USE_SPI); + Module::pinMode(_mod->getIrq(), INPUT); + + // reset the module + reset(); // initialize configuration variables (will be overwritten during public settings configuration) _br = 21333; // 48.0 kbps @@ -159,6 +168,15 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit return(state); } +void SX126x::reset() { + Module::pinMode(_mod->getRst(), OUTPUT); + Module::digitalWrite(_mod->getRst(), LOW); + delay(100); + Module::digitalWrite(_mod->getRst(), HIGH); + Module::pinMode(_mod->getRst(), INPUT); + delay(100); +} + int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { // set mode to standby int16_t state = standby(); @@ -199,7 +217,7 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { // wait for packet transmission or timeout uint32_t start = micros(); - while(!digitalRead(_mod->getInt0())) { + while(!digitalRead(_mod->getIrq())) { if(micros() - start > timeout) { clearIrqStatus(); return(ERR_TX_TIMEOUT); @@ -264,7 +282,7 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { // wait for packet reception or timeout uint32_t start = micros(); - while(!digitalRead(_mod->getInt0())) { + while(!digitalRead(_mod->getIrq())) { if(micros() - start > timeout) { fixImplicitTimeout(); clearIrqStatus(); @@ -333,7 +351,7 @@ int16_t SX126x::scanChannel() { } // wait for channel activity detected or timeout - while(!digitalRead(_mod->getInt0())); + while(!digitalRead(_mod->getIrq())); // check CAD result uint16_t cadResult = getIrqStatus(); @@ -370,7 +388,7 @@ int16_t SX126x::standby(uint8_t mode) { } void SX126x::setDio1Action(void (*func)(void)) { - attachInterrupt(digitalPinToInterrupt(_mod->getInt0()), func, RISING); + attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, RISING); } int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { @@ -438,7 +456,7 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { } // wait for BUSY to go low (= PA ramp up done) - while(digitalRead(_mod->getInt1())); + while(digitalRead(_mod->getGpio())); return(state); } @@ -660,14 +678,14 @@ int16_t SX126x::setCodingRate(uint8_t cr) { return(setModulationParams(_sf, _bw, _cr)); } -int16_t SX126x::setSyncWord(uint16_t syncWord) { +int16_t SX126x::setSyncWord(uint8_t syncWord) { // check active modem if(getPacketType() != SX126X_PACKET_TYPE_LORA) { return(ERR_WRONG_MODEM); } // update register - uint8_t data[2] = {(uint8_t)((syncWord >> 8) & 0xFF), (uint8_t)(syncWord & 0xFF)}; + uint8_t data[2] = {(uint8_t)((syncWord & 0xF0) | 0x04), (uint8_t)(((syncWord & 0x0F) << 4) | 0x04)}; return(writeRegister(SX126X_REG_LORA_SYNC_WORD_MSB, data, 2)); } @@ -1501,7 +1519,7 @@ int16_t SX126x::config(uint8_t modem) { // wait for calibration completion delay(5); - while(digitalRead(_mod->getInt1())); + while(digitalRead(_mod->getGpio())); return(ERR_NONE); } @@ -1537,7 +1555,7 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d // ensure BUSY is low (state meachine ready) RADIOLIB_VERBOSE_PRINTLN(F("Wait for BUSY ... ")); uint32_t start = millis(); - while(digitalRead(_mod->getInt1())) { + while(digitalRead(_mod->getGpio())) { if(millis() - start >= timeout) { return(ERR_SPI_CMD_TIMEOUT); } @@ -1604,11 +1622,11 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d if(waitForBusy) { delayMicroseconds(1); start = millis(); - while(digitalRead(_mod->getInt1())) { - if(millis() - start >= timeout) { - status = SX126X_STATUS_CMD_TIMEOUT; - break; - } + while(digitalRead(_mod->getGpio())) { + if(millis() - start >= timeout) { + status = SX126X_STATUS_CMD_TIMEOUT; + break; + } } } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 10e1184d..52d486f0 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -325,8 +325,8 @@ // SX126X SPI register variables //SX126X_REG_LORA_SYNC_WORD_MSB + LSB -#define SX126X_SYNC_WORD_PUBLIC 0x3444 -#define SX126X_SYNC_WORD_PRIVATE 0x1424 +#define SX126X_SYNC_WORD_PUBLIC 0x34 // actually 0x3444 NOTE: The low nibbles in each byte (0x_4_4) are masked out since apparently, they're reserved. +#define SX126X_SYNC_WORD_PRIVATE 0x12 // actually 0x1424 You couldn't make this up if you tried. /*! @@ -361,7 +361,7 @@ class SX126x: public PhysicalLayer { \param cr LoRa coding rate denominator. Allowed values range from 5 to 8. - \param syncWord 2-byte LoRa sync word. + \param syncWord 1-byte LoRa sync word. \param currentLimit Current protection limit in mA. @@ -371,7 +371,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage); + int16_t begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage); /*! \brief Initialization method for FSK modem. @@ -394,6 +394,11 @@ class SX126x: public PhysicalLayer { */ int16_t beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage); + /*! + \brief Reset method. Will reset the chip to the default state using RST pin. + */ + void reset(); + /*! \brief Blocking binary transmit method. Overloads for string-based transmissions are implemented in PhysicalLayer. @@ -571,7 +576,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t setSyncWord(uint16_t syncWord); + int16_t setSyncWord(uint8_t syncWord); /*! \brief Sets current protection limit. Can be set in 0.25 mA steps. From 7d0eab94abce141467fb53d94018d0f3c75dc8c5 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:22:42 +0100 Subject: [PATCH 020/135] [Morse] Updated example pin mapping --- examples/Morse/Morse_Transmit/Morse_Transmit.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/Morse/Morse_Transmit/Morse_Transmit.ino b/examples/Morse/Morse_Transmit/Morse_Transmit.ino index a835f8a5..6d71d1a4 100644 --- a/examples/Morse/Morse_Transmit/Morse_Transmit.ino +++ b/examples/Morse/Morse_Transmit/Morse_Transmit.ino @@ -19,8 +19,9 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 fsk = new Module(10, 2, 3); +SX1278 fsk = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield From 8e9ac59815e507b45ccbedb8b184bd21c6c22bf4 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:23:35 +0100 Subject: [PATCH 021/135] [RTTY] Updated example pin mapping --- examples/RTTY/RTTY_Transmit/RTTY_Transmit.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/RTTY/RTTY_Transmit/RTTY_Transmit.ino b/examples/RTTY/RTTY_Transmit/RTTY_Transmit.ino index 540f656a..da77ea5b 100644 --- a/examples/RTTY/RTTY_Transmit/RTTY_Transmit.ino +++ b/examples/RTTY/RTTY_Transmit/RTTY_Transmit.ino @@ -22,8 +22,9 @@ // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 +// RESET pin: 9 // DIO1 pin: 3 -SX1278 fsk = new Module(10, 2, 3); +SX1278 fsk = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield From e7c44f3e266c765258786568f67c4094b26e696f Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:27:28 +0100 Subject: [PATCH 022/135] [CC1101] Fixed incorrect variable name --- .../CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino | 2 +- .../CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino b/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino index 6c8205d5..1a5be8d8 100644 --- a/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino +++ b/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino @@ -19,7 +19,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc1 = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino b/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino index abfae5ac..6e07e0ca 100644 --- a/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino +++ b/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino @@ -20,7 +20,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc1 = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield From a38fb18e829c58481ed2bdf491fc0c39f023ae30 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 13:31:09 +0100 Subject: [PATCH 023/135] [CC1101] Fixed typo --- examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino b/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino index 672bed0a..fb686c2f 100644 --- a/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino +++ b/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino @@ -19,7 +19,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc1 = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); // or using RadioShield // https://github.com/jgromes/RadioShield From 8a471d082f2344b1fc7851a419a823300f9f4af1 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 14:07:37 +0100 Subject: [PATCH 024/135] Advanced version to 3.0.0 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index e7bb32d4..ad0dfbb0 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=2.0.1 +version=3.0.0 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino From fdb8993336a7b14b029fa1cab406782afd612677 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 27 Dec 2019 16:48:58 +0100 Subject: [PATCH 025/135] [SX126x] Added missing calls to standby --- src/modules/SX126x/SX126x.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 8dc93081..15c460b7 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -220,6 +220,7 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { while(!digitalRead(_mod->getIrq())) { if(micros() - start > timeout) { clearIrqStatus(); + standby(); return(ERR_TX_TIMEOUT); } } @@ -286,6 +287,7 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { if(micros() - start > timeout) { fixImplicitTimeout(); clearIrqStatus(); + standby(); return(ERR_RX_TIMEOUT); } } From dedcd4163f695289576f93aabfdd5f088054863b Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 29 Dec 2019 10:36:24 +0100 Subject: [PATCH 026/135] [CC1101] Added methods to clear GDO action --- src/modules/CC1101/CC1101.cpp | 11 +++++++++++ src/modules/CC1101/CC1101.h | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index d0770ef0..d9d7e048 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -191,6 +191,10 @@ void CC1101::setGdo0Action(void (*func)(void), uint8_t dir) { attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, dir); } +void CC1101::clearGdo0Action() { + detachInterrupt(digitalPinToInterrupt(_mod->getIrq())); +} + void CC1101::setGdo2Action(void (*func)(void), uint8_t dir) { if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { return; @@ -199,6 +203,13 @@ void CC1101::setGdo2Action(void (*func)(void), uint8_t dir) { attachInterrupt(digitalPinToInterrupt(_mod->getGpio()), func, dir); } +void CC1101::clearGdo2Action() { + if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + return; + } + detachInterrupt(digitalPinToInterrupt(_mod->getGpio())); +} + int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // check packet length if(len > CC1101_MAX_PACKET_LENGTH) { diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index f349da20..0568de8f 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -601,6 +601,11 @@ class CC1101: public PhysicalLayer { */ void setGdo0Action(void (*func)(void), uint8_t dir = FALLING); + /*! + \brief Clears interrupt service routine to call when GDO0 activates. + */ + void clearGdo0Action(); + /*! \brief Sets interrupt service routine to call when GDO2 activates. @@ -610,6 +615,11 @@ class CC1101: public PhysicalLayer { */ void setGdo2Action(void (*func)(void), uint8_t dir = FALLING); + /*! + \brief Clears interrupt service routine to call when GDO0 activates. + */ + void clearGdo2Action(); + /*! \brief Interrupt-driven binary transmit method. Overloads for string-based transmissions are implemented in PhysicalLayer. From 95e9de675961cbd0b6edd54aadb9c33a0f6cabc5 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 29 Dec 2019 10:36:38 +0100 Subject: [PATCH 027/135] [RF69] Added methods to clear DIO actions --- src/modules/RF69/RF69.cpp | 11 +++++++++++ src/modules/RF69/RF69.h | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index bf1d83a9..76150d4d 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -263,6 +263,10 @@ void RF69::setDio0Action(void (*func)(void)) { attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, RISING); } +void RF69::clearDio0Action() { + detachInterrupt(digitalPinToInterrupt(_mod->getIrq())); +} + void RF69::setDio1Action(void (*func)(void)) { if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { return; @@ -271,6 +275,13 @@ void RF69::setDio1Action(void (*func)(void)) { attachInterrupt(digitalPinToInterrupt(_mod->getGpio()), func, RISING); } +void RF69::clearDio1Action() { + if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + return; + } + detachInterrupt(digitalPinToInterrupt(_mod->getGpio())); +} + int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // check packet length if(len > RF69_MAX_PACKET_LENGTH) { diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h index 8f3a0a4c..4b35e817 100644 --- a/src/modules/RF69/RF69.h +++ b/src/modules/RF69/RF69.h @@ -562,6 +562,11 @@ class RF69: public PhysicalLayer { */ void setDio0Action(void (*func)(void)); + /*! + \brief Clears interrupt service routine to call when DIO0 activates. + */ + void clearDio0Action(); + /*! \brief Sets interrupt service routine to call when DIO1 activates. @@ -569,6 +574,11 @@ class RF69: public PhysicalLayer { */ void setDio1Action(void (*func)(void)); + /*! + \brief Clears interrupt service routine to call when DIO1 activates. + */ + void clearDio1Action(); + /*! \brief Interrupt-driven binary transmit method. Overloads for string-based transmissions are implemented in PhysicalLayer. From d00d07fe9c1370ee2a5240e3013a2b22447aad7e Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 29 Dec 2019 10:36:52 +0100 Subject: [PATCH 028/135] [SX127x] Added methods to clear DIO actions --- src/modules/SX127x/SX127x.cpp | 11 +++++++++++ src/modules/SX127x/SX127x.h | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 23bd0785..3098f63e 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -432,10 +432,21 @@ void SX127x::setDio0Action(void (*func)(void)) { attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, RISING); } +void SX127x::clearDio0Action() { + detachInterrupt(digitalPinToInterrupt(_mod->getIrq())); +} + void SX127x::setDio1Action(void (*func)(void)) { attachInterrupt(digitalPinToInterrupt(_mod->getGpio()), func, RISING); } +void SX127x::clearDio1Action() { + if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + return; + } + detachInterrupt(digitalPinToInterrupt(_mod->getGpio())); +} + int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // set mode to standby int16_t state = setMode(SX127X_STANDBY); diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 2d1f0328..26ea958c 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -672,6 +672,11 @@ class SX127x: public PhysicalLayer { */ void setDio0Action(void (*func)(void)); + /*! + \brief Clears interrupt service routine to call when DIO0 activates. + */ + void clearDio0Action(); + /*! \brief Set interrupt service routine function to call when DIO1 activates. @@ -679,6 +684,11 @@ class SX127x: public PhysicalLayer { */ void setDio1Action(void (*func)(void)); + /*! + \brief Clears interrupt service routine to call when DIO1 activates. + */ + void clearDio1Action(); + /*! \brief Interrupt-driven binary transmit method. Will start transmitting arbitrary binary data up to 255 bytes long using %LoRa or up to 63 bytes using FSK modem. From 460a050a63710a8f01e9e55f2513951d004ce0a4 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 29 Dec 2019 10:37:04 +0100 Subject: [PATCH 029/135] [SX126x] Added methods to clear DIO actions --- keywords.txt | 6 +++++- src/modules/SX126x/SX126x.cpp | 4 ++++ src/modules/SX126x/SX126x.h | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/keywords.txt b/keywords.txt index c4f652a2..3b5fdf0f 100644 --- a/keywords.txt +++ b/keywords.txt @@ -62,6 +62,8 @@ receiveDirect KEYWORD2 packetMode KEYWORD2 setDio0Action KEYWORD2 setDio1Action KEYWORD2 +clearDio0Action KEYWORD2 +clearDio1Action KEYWORD2 startTransmit KEYWORD2 startReceive KEYWORD2 readData KEYWORD2 @@ -107,7 +109,9 @@ setAmbientTemperature KEYWORD2 # CC1101-specific getLQI KEYWORD2 setGdo0Action KEYWORD2 -setGdo1Action KEYWORD2 +setGdo2Action KEYWORD2 +clearGdo0Action KEYWORD2 +clearGdo2Action KEYWORD2 # SX126x-specific setTCXO KEYWORD2 diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 15c460b7..ffd84d44 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -393,6 +393,10 @@ void SX126x::setDio1Action(void (*func)(void)) { attachInterrupt(digitalPinToInterrupt(_mod->getIrq()), func, RISING); } +void SX126x::clearDio1Action() { + detachInterrupt(digitalPinToInterrupt(_mod->getIrq())); +} + int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // suppress unused variable warning (void)addr; diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 52d486f0..ff282cca 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -481,6 +481,11 @@ class SX126x: public PhysicalLayer { */ void setDio1Action(void (*func)(void)); + /*! + \brief Clears interrupt service routine to call when DIO1 activates. + */ + void clearDio1Action(); + /*! \brief Interrupt-driven binary transmit method. Overloads for string-based transmissions are implemented in PhysicalLayer. From 02ac97b07ef4910aa41c162236bcf0fcb569aaff Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 29 Dec 2019 12:21:14 +0100 Subject: [PATCH 030/135] [SX126x] Added option to change sleep mode (cold/warm start) --- src/modules/SX126x/SX126x.cpp | 8 ++++++-- src/modules/SX126x/SX126x.h | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index ffd84d44..33d7fcb7 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -370,8 +370,12 @@ int16_t SX126x::scanChannel() { return(ERR_UNKNOWN); } -int16_t SX126x::sleep() { - uint8_t data[] = {SX126X_SLEEP_START_COLD | SX126X_SLEEP_RTC_OFF}; +int16_t SX126x::sleep(bool retainConfig) { + uint8_t sleepMode = SX126X_SLEEP_START_WARM; + if(!retainConfig) { + sleepMode = SX126X_SLEEP_START_COLD; + } + uint8_t data[] = {sleepMode | SX126X_SLEEP_RTC_OFF}; int16_t state = SPIwriteCommand(SX126X_CMD_SET_SLEEP, data, 1, false); // wait for SX126x to safely enter sleep mode diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index ff282cca..bfcccbfa 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -452,9 +452,11 @@ class SX126x: public PhysicalLayer { /*! \brief Sets the module to sleep mode. + \param retainConfig Set to true to retain configuration of the currently active modem ("warm start") or to false to discard current configuration ("cold start"). Defaults to true. + \returns \ref status_codes */ - int16_t sleep(); + int16_t sleep(bool retainConfig = true); /*! \brief Sets the module to standby mode (overload for PhysicalLayer compatibility, uses 13 MHz RC oscillator). From e745fe29887de08f9c2643952ad04572f0b29997 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 30 Dec 2019 20:07:04 +0100 Subject: [PATCH 031/135] [SX126x] Fixed narrowing conversion warning --- src/modules/SX126x/SX126x.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 33d7fcb7..00102db5 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -371,12 +371,11 @@ int16_t SX126x::scanChannel() { } int16_t SX126x::sleep(bool retainConfig) { - uint8_t sleepMode = SX126X_SLEEP_START_WARM; + uint8_t sleepMode = SX126X_SLEEP_START_WARM | SX126X_SLEEP_RTC_OFF; if(!retainConfig) { - sleepMode = SX126X_SLEEP_START_COLD; + sleepMode = SX126X_SLEEP_START_COLD | SX126X_SLEEP_RTC_OFF; } - uint8_t data[] = {sleepMode | SX126X_SLEEP_RTC_OFF}; - int16_t state = SPIwriteCommand(SX126X_CMD_SET_SLEEP, data, 1, false); + int16_t state = SPIwriteCommand(SX126X_CMD_SET_SLEEP, &sleepMode, 1, false); // wait for SX126x to safely enter sleep mode delayMicroseconds(500); From 25f9c73332141efd6eb9ee24ffc402bc9e977ad6 Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 2 Jan 2020 14:48:31 +0100 Subject: [PATCH 032/135] [SX126x] Improved reset procedure --- src/modules/SX126x/SX126x.cpp | 51 ++++++++++++++++++++++++++++------- src/modules/SX126x/SX126x.h | 7 ++++- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 00102db5..2dce29c0 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -10,9 +10,6 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float Module::pinMode(_mod->getIrq(), INPUT); Module::pinMode(_mod->getGpio(), INPUT); - // reset the module - reset(); - // BW in kHz and SF are required in order to calculate LDRO for setModulationParams _bwKhz = bw; _sf = sf; @@ -25,8 +22,14 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float _preambleLength = preambleLength; _tcxoDelay = 0; + // reset the module and verify startup + int16_t state = reset(); + if(state != ERR_NONE) { + return(state); + } + // set mode to standby - int16_t state = standby(); + state = standby(); if(state != ERR_NONE) { return(state); } @@ -87,9 +90,6 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit _mod->init(RADIOLIB_USE_SPI); Module::pinMode(_mod->getIrq(), INPUT); - // reset the module - reset(); - // initialize configuration variables (will be overwritten during public settings configuration) _br = 21333; // 48.0 kbps _freqDev = 52428; // 50.0 kHz @@ -100,8 +100,14 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit _preambleLengthFSK = preambleLength; _addrComp = SX126X_GFSK_ADDRESS_FILT_OFF; + // reset the module and verify startup + int16_t state = reset(); + if(state != ERR_NONE) { + return(state); + } + // set mode to standby - int16_t state = standby(); + state = standby(); if(state != ERR_NONE) { return(state); } @@ -168,13 +174,39 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit return(state); } -void SX126x::reset() { +int16_t SX126x::reset(bool verify) { + // run the reset sequence Module::pinMode(_mod->getRst(), OUTPUT); Module::digitalWrite(_mod->getRst(), LOW); delay(100); Module::digitalWrite(_mod->getRst(), HIGH); Module::pinMode(_mod->getRst(), INPUT); delay(100); + + // return immediately whe verification is disabled + if(!verify) { + return(ERR_NONE); + } + + // set mode to standby - SX126x often refuses first few commands after reset + uint32_t start = millis(); + while(true) { + // try to set mode to standby + int16_t state = standby(); + if(state == ERR_NONE) { + // standby command successful + return(ERR_NONE); + } + + // standby command failed, check timeout and try again + if(millis() - start >= 3000) { + // timed out, possibly incorrect wiring + return(state); + } + + // wait a bit to not spam the module + delay(10); + } } int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { @@ -1562,7 +1594,6 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d digitalWrite(_mod->getCs(), LOW); // ensure BUSY is low (state meachine ready) - RADIOLIB_VERBOSE_PRINTLN(F("Wait for BUSY ... ")); uint32_t start = millis(); while(digitalRead(_mod->getGpio())) { if(millis() - start >= timeout) { diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index bfcccbfa..d8cc8b70 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -396,8 +396,13 @@ class SX126x: public PhysicalLayer { /*! \brief Reset method. Will reset the chip to the default state using RST pin. + + \param verify Whether correct module startup should be verified. When set to true, RadioLib will attempt to verify the module has started correctly + by repeatedly issuing setStandby command. Enabled by default. + + \returns \ref status_codes */ - void reset(); + int16_t reset(bool verify = true); /*! \brief Blocking binary transmit method. From fd1623e382854e30f25509e9abcfe6f7e17788ab Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 2 Jan 2020 14:48:53 +0100 Subject: [PATCH 033/135] Added version macro --- keywords.txt | 1 + src/TypeDef.h | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/keywords.txt b/keywords.txt index 3b5fdf0f..150f81f9 100644 --- a/keywords.txt +++ b/keywords.txt @@ -176,6 +176,7 @@ shutdown KEYWORD2 ####################################### RADIOLIB_PIN_UNUSED LITERAL1 +RADIOLIB_VERSION LITERAL1 ERR_NONE LITERAL1 ERR_UNKNOWN LITERAL1 diff --git a/src/TypeDef.h b/src/TypeDef.h index 545359b7..90b417c5 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -1,11 +1,20 @@ #ifndef _RADIOLIB_TYPES_H #define _RADIOLIB_TYPES_H + #if ARDUINO >= 100 #include "Arduino.h" #else #error "Unsupported Arduino version (< 1.0.0)" #endif +// version definitions +#define RADIOLIB_VERSION_MAJOR (0x03) +#define RADIOLIB_VERSION_MINOR (0x00) +#define RADIOLIB_VERSION_PATCH (0x00) +#define RADIOLIB_VERSION_EXTRA (0x00) + +#define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) + /* * Uncomment to enable static-only memory management: no dynamic allocation will be performed. * Warning: Large static arrays will be created in some methods. It is not advised to send large packets in this mode. From b657bc35219d0928dfe585c1c076bca382619e30 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 3 Jan 2020 15:07:54 +0100 Subject: [PATCH 034/135] [SX126x] Fixed reset delay duration --- src/modules/SX126x/SX126x.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 2dce29c0..7514b163 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -178,10 +178,9 @@ int16_t SX126x::reset(bool verify) { // run the reset sequence Module::pinMode(_mod->getRst(), OUTPUT); Module::digitalWrite(_mod->getRst(), LOW); - delay(100); + delayMicroseconds(150); Module::digitalWrite(_mod->getRst(), HIGH); Module::pinMode(_mod->getRst(), INPUT); - delay(100); // return immediately whe verification is disabled if(!verify) { From 1b22d4c84efd159b5ec0430a2d3dc75c1ee1552b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Grome=C5=A1?= Date: Sun, 5 Jan 2020 18:30:47 +0100 Subject: [PATCH 035/135] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 2d4869ee..779c3533 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -11,7 +11,7 @@ assignees: '' Before submitting new issue, please check the [Wiki](https://github.com/jgromes/RadioLib/wiki) and the [API documentation](https://jgromes.github.io/RadioLib/). You might find a solution to your issue there. **Describe the bug** -A clear and concise description of what the bug is. +A clear and concise description of what the bug is. When applicable, please include debug mode output: uncomment [debug macro definitions in TypeDef.h](https://github.com/jgromes/RadioLib/blob/master/src/TypeDef.h#L36) and post the output. **To Reproduce** Minimal Arduino sketch to reproduce the behavior. Please user Markdown to style the code to make it readable (see [Markdown Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code)). From 9da1573df0c12a976e1532d8b040eba25e186ba8 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 6 Jan 2020 17:20:18 +0100 Subject: [PATCH 036/135] Renamed unused pin macro to NC --- keywords.txt | 2 +- src/Module.cpp | 32 +++++++++++++++++--------------- src/TypeDef.h | 6 ++++-- src/modules/CC1101/CC1101.cpp | 4 ++-- src/modules/RF69/RF69.cpp | 4 ++-- src/modules/SX127x/SX127x.cpp | 5 ++++- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/keywords.txt b/keywords.txt index 150f81f9..9aabb1c0 100644 --- a/keywords.txt +++ b/keywords.txt @@ -175,7 +175,7 @@ shutdown KEYWORD2 # Constants (LITERAL1) ####################################### -RADIOLIB_PIN_UNUSED LITERAL1 +NC LITERAL1 RADIOLIB_VERSION LITERAL1 ERR_NONE LITERAL1 diff --git a/src/Module.cpp b/src/Module.cpp index d1b1f136..27181535 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -1,10 +1,10 @@ #include "Module.h" Module::Module(int16_t rx, int16_t tx, HardwareSerial* useSer, int16_t rst) { - _cs = RADIOLIB_PIN_UNUSED; + _cs = NC; _rx = rx; _tx = tx; - _irq = RADIOLIB_PIN_UNUSED; + _irq = NC; _rst = rst; #ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED @@ -17,8 +17,8 @@ Module::Module(int16_t rx, int16_t tx, HardwareSerial* useSer, int16_t rst) { Module::Module(int16_t cs, int16_t irq, int16_t rst, SPIClass& spi, SPISettings spiSettings) { _cs = cs; - _rx = RADIOLIB_PIN_UNUSED; - _tx = RADIOLIB_PIN_UNUSED; + _rx = NC; + _tx = NC; _irq = irq; _rst = rst; _spi = &spi; @@ -28,7 +28,7 @@ Module::Module(int16_t cs, int16_t irq, int16_t rst, SPIClass& spi, SPISettings Module::Module(int16_t cs, int16_t irq, int16_t rst, int16_t gpio, SPIClass& spi, SPISettings spiSettings) { _cs = cs; _rx = gpio; - _tx = RADIOLIB_PIN_UNUSED; + _tx = NC; _irq = irq; _rst = rst; _spi = &spi; @@ -205,10 +205,16 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da // send SPI register address with access command _spi->transfer(reg | cmd); - RADIOLIB_VERBOSE_PRINT(reg | cmd, HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(reg | cmd, BIN); - RADIOLIB_VERBOSE_PRINT('\t'); + #ifdef RADIOLIB_VERBOSE + if(cmd == SPIwriteCommand) { + RADIOLIB_VERBOSE_PRINT('W'); + } else if(cmd == SPIreadCommand) { + RADIOLIB_VERBOSE_PRINT('R'); + } + RADIOLIB_VERBOSE_PRINT('\t') + RADIOLIB_VERBOSE_PRINT(reg, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + #endif // send data or get response if(cmd == SPIwriteCommand) { @@ -216,16 +222,12 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da _spi->transfer(dataOut[n]); RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX); RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(dataOut[n], BIN); - RADIOLIB_VERBOSE_PRINT('\t'); } } else if (cmd == SPIreadCommand) { for(size_t n = 0; n < numBytes; n++) { dataIn[n] = _spi->transfer(0x00); RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(dataIn[n], BIN); - RADIOLIB_VERBOSE_PRINT('\t'); } } RADIOLIB_VERBOSE_PRINTLN(); @@ -238,13 +240,13 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da } void Module::pinMode(int16_t pin, uint8_t mode) { - if(pin != RADIOLIB_PIN_UNUSED) { + if(pin != NC) { ::pinMode(pin, mode); } } void Module::digitalWrite(int16_t pin, uint8_t value) { - if(pin != RADIOLIB_PIN_UNUSED) { + if(pin != NC) { ::digitalWrite(pin, value); } } diff --git a/src/TypeDef.h b/src/TypeDef.h index 90b417c5..69ea2fc2 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -75,9 +75,11 @@ #endif /*! - \brief Alias for unused pin. + \brief Alias for unused pin, if not supplied by the Arduino core. */ -#define RADIOLIB_PIN_UNUSED (-1) +#ifndef NC +#define NC (-1) +#endif /*! \defgroup shield_config Shield Configuration diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index d9d7e048..6e3fc053 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -196,7 +196,7 @@ void CC1101::clearGdo0Action() { } void CC1101::setGdo2Action(void (*func)(void), uint8_t dir) { - if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + if(_mod->getGpio() != NC) { return; } Module::pinMode(_mod->getGpio(), INPUT); @@ -204,7 +204,7 @@ void CC1101::setGdo2Action(void (*func)(void), uint8_t dir) { } void CC1101::clearGdo2Action() { - if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + if(_mod->getGpio() != NC) { return; } detachInterrupt(digitalPinToInterrupt(_mod->getGpio())); diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 76150d4d..9f1b9544 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -268,7 +268,7 @@ void RF69::clearDio0Action() { } void RF69::setDio1Action(void (*func)(void)) { - if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + if(_mod->getGpio() != NC) { return; } Module::pinMode(_mod->getGpio(), INPUT); @@ -276,7 +276,7 @@ void RF69::setDio1Action(void (*func)(void)) { } void RF69::clearDio1Action() { - if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + if(_mod->getGpio() != NC) { return; } detachInterrupt(digitalPinToInterrupt(_mod->getGpio())); diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 3098f63e..60f63b2f 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -437,11 +437,14 @@ void SX127x::clearDio0Action() { } void SX127x::setDio1Action(void (*func)(void)) { + if(_mod->getGpio() != NC) { + return; + } attachInterrupt(digitalPinToInterrupt(_mod->getGpio()), func, RISING); } void SX127x::clearDio1Action() { - if(_mod->getGpio() != RADIOLIB_PIN_UNUSED) { + if(_mod->getGpio() != NC) { return; } detachInterrupt(digitalPinToInterrupt(_mod->getGpio())); From a4eeefada0d79cc96dc518b1e74a679082b3a4de Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 6 Jan 2020 17:20:43 +0100 Subject: [PATCH 037/135] [RF69] Moved reset to chip detection loop --- src/modules/RF69/RF69.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 9f1b9544..39ea1441 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -17,13 +17,14 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe _mod->init(RADIOLIB_USE_SPI); Module::pinMode(_mod->getIrq(), INPUT); - // reset the module - reset(); - // try to find the RF69 chip uint8_t i = 0; bool flagFound = false; while((i < 10) && !flagFound) { + // reset the module + reset(); + + // check version register uint8_t version = _mod->SPIreadRegister(RF69_REG_VERSION); if(version == 0x24) { flagFound = true; From cb5c8d63132177cf451d231ea2ce4f1044e2f4f5 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 6 Jan 2020 17:20:51 +0100 Subject: [PATCH 038/135] [SX127x] Moved reset to chip detection loop --- src/modules/SX127x/SX127x.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 60f63b2f..866b82ef 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -11,9 +11,6 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi Module::pinMode(_mod->getIrq(), INPUT); Module::pinMode(_mod->getGpio(), INPUT); - // reset the module - reset(); - // try to find the SX127x chip if(!SX127x::findChip(chipVersion)) { RADIOLIB_DEBUG_PRINTLN(F("No SX127x found!")); @@ -23,8 +20,13 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi RADIOLIB_DEBUG_PRINTLN(F("Found SX127x!")); } + // set mode to standby + int16_t state = standby(); + if(state != ERR_NONE) { + return(state); + } + // check active modem - int16_t state; if(getActiveModem() != SX127X_LORA) { // set LoRa mode state = setActiveModem(SX127X_LORA); @@ -1090,6 +1092,10 @@ bool SX127x::findChip(uint8_t ver) { uint8_t i = 0; bool flagFound = false; while((i < 10) && !flagFound) { + // reset the module + reset(); + + // check version register uint8_t version = _mod->SPIreadRegister(SX127X_REG_VERSION); if(version == ver) { flagFound = true; From e39c804c73f7308dfbc4f5e988570dca8d8e4690 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 6 Jan 2020 17:21:02 +0100 Subject: [PATCH 039/135] [SX126x] Fixed typo --- src/modules/SX126x/SX126x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 7514b163..57007104 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -182,7 +182,7 @@ int16_t SX126x::reset(bool verify) { Module::digitalWrite(_mod->getRst(), HIGH); Module::pinMode(_mod->getRst(), INPUT); - // return immediately whe verification is disabled + // return immediately when verification is disabled if(!verify) { return(ERR_NONE); } From 946621cabfbb468fb1b8f61f06d7514ec25aa282 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 6 Jan 2020 17:25:11 +0100 Subject: [PATCH 040/135] [CC1101] Fixed macro name in examples --- examples/CC1101/CC1101_Receive/CC1101_Receive.ino | 2 +- .../CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino | 2 +- .../CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino | 2 +- examples/CC1101/CC1101_Settings/CC1101_Settings.ino | 4 ++-- examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino | 2 +- .../CC1101_Transmit_Address/CC1101_Transmit_Address.ino | 2 +- .../CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/CC1101/CC1101_Receive/CC1101_Receive.ino b/examples/CC1101/CC1101_Receive/CC1101_Receive.ino index 57cd221b..7282bf00 100644 --- a/examples/CC1101/CC1101_Receive/CC1101_Receive.ino +++ b/examples/CC1101/CC1101_Receive/CC1101_Receive.ino @@ -21,7 +21,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, NC, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino b/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino index 95daa3b7..b1faf2a6 100644 --- a/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino +++ b/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino @@ -19,7 +19,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, NC, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino b/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino index 2785fe4c..756c7031 100644 --- a/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino +++ b/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino @@ -24,7 +24,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, NC, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Settings/CC1101_Settings.ino b/examples/CC1101/CC1101_Settings/CC1101_Settings.ino index 2f47ccb9..3854d675 100644 --- a/examples/CC1101/CC1101_Settings/CC1101_Settings.ino +++ b/examples/CC1101/CC1101_Settings/CC1101_Settings.ino @@ -23,14 +23,14 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc1 = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc1 = new Module(10, 2, NC, 3); // second CC1101 has different connections: // CS pin: 9 // GDO0 pin: 4 // RST pin: unused // GDO2 pin: 5 (optional) -CC1101 cc2 = new Module(9, 4, RADIOLIB_PIN_UNUSED, 53); +CC1101 cc2 = new Module(9, 4, NC, 53); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino b/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino index fb686c2f..8c9803aa 100644 --- a/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino +++ b/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino @@ -19,7 +19,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, NC, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino b/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino index 1a5be8d8..0f600f36 100644 --- a/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino +++ b/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino @@ -19,7 +19,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, NC, 3); // or using RadioShield // https://github.com/jgromes/RadioShield diff --git a/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino b/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino index 6e07e0ca..dfdb35f7 100644 --- a/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino +++ b/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino @@ -20,7 +20,7 @@ // GDO0 pin: 2 // RST pin: unused // GDO2 pin: 3 (optional) -CC1101 cc = new Module(10, 2, RADIOLIB_PIN_UNUSED, 3); +CC1101 cc = new Module(10, 2, NC, 3); // or using RadioShield // https://github.com/jgromes/RadioShield From 814949d1833c80c6b0e029da7ab82a9a7ebc1082 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 6 Jan 2020 17:40:13 +0100 Subject: [PATCH 041/135] Fixed incorrect NC macro check --- src/TypeDef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TypeDef.h b/src/TypeDef.h index 69ea2fc2..6236b2be 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -77,7 +77,7 @@ /*! \brief Alias for unused pin, if not supplied by the Arduino core. */ -#ifndef NC +#if !(defined(NC) || defined(ARDUINO_ARCH_STM32)) #define NC (-1) #endif From b8c1a73000608f54b710ef9a89d1421a13377e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Grome=C5=A1?= Date: Tue, 7 Jan 2020 11:25:07 +0100 Subject: [PATCH 042/135] Update README.md --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1c516610..af528946 100644 --- a/README.md +++ b/README.md @@ -31,17 +31,18 @@ RadioLib was originally created as a driver for [__RadioShield__](https://github * __Morse Code__ for modules: SX127x, RFM9x, SX126x, RF69, SX1231, CC1101 and nRF24L01 ### Supported platforms: -* __AVR__ - tested on Uno, Mega and Leonardo -* __ESP8266__ - tested NodeMCU and Wemos D1 -* __ESP32__ - tested on ESP-WROOM-32 -* __STM32__ - tested on Nucleo L452RE-P +* __AVR__ - tested with hardware on Uno, Mega and Leonardo +* __ESP8266__ - tested with hardware on NodeMCU and Wemos D1 +* __ESP32__ - tested with hardware on ESP-WROOM-32 +* __STM32__ - tested with hardware on Nucleo L452RE-P * __SAMD__ - Arduino Zero, Arduino MKR boards, M0 Pro etc. * __SAM__ - Arduino Due * __nRF52__ - Adafruit Bluefruit Feather etc. -* __Intel Curie__ - Arduino 101 -* __megaAVR__ - Arduino Uno WiFi Rev.2 etc. +* _Intel Curie_ - Arduino 101 +* _megaAVR_ - Arduino Uno WiFi Rev.2 etc. +* _Apollo3_ - SparkFun Artemis Redboard etc. -The list above is by no means exhaustive. Most of RadioLib code is independent of the used platform, so as long as your board is running some Arduino-compatible core, RadioLib should work. +The list above is by no means exhaustive. Most of RadioLib code is independent of the used platform, so as long as your board is running some Arduino-compatible core, RadioLib should work. Compilation of all examples is tested for all platoforms in __bold__ on each git push. Platforms in _italic_ are not tested on each push, but do compile and should be working. ### In development: * __SIM800C__ GSM module From d0b817adb990496f850b25fbe8a9e82211cc2280 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:22:38 +0000 Subject: [PATCH 043/135] Implement explicit mode support --- src/modules/SX126x/SX126x.cpp | 1 + src/modules/SX126x/SX126x.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 57007104..671b4dee 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -21,6 +21,7 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float _crcType = SX126X_LORA_CRC_ON; _preambleLength = preambleLength; _tcxoDelay = 0; + _headerType = SX126X_LORA_HEADER_EXPLICIT; // reset the module and verify startup int16_t state = reset(); diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index d8cc8b70..24b47e63 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -834,7 +834,7 @@ class SX126x: public PhysicalLayer { #endif Module* _mod; - uint8_t _bw, _sf, _cr, _ldro, _crcType; + uint8_t _bw, _sf, _cr, _ldro, _crcType, _headerType; uint16_t _preambleLength; float _bwKhz; From 1cce443ef1bdd8b6f490f66524953a36b35e60c8 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:37:58 +0000 Subject: [PATCH 044/135] define interface for implicit/explicit mode support --- src/modules/SX126x/SX126x.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 24b47e63..9d771e42 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -789,6 +789,20 @@ class SX126x: public PhysicalLayer { \returns Expected time-on-air in microseconds. */ uint32_t getTimeOnAir(size_t len); + + /*! + \brief Set implicit header mode for future reception/transmission. + + \returns \ref status_codes + */ + int16_t implicitHeader(); + + /*! + \brief Set explicit header mode for future reception/transmission. + + \returns \ref status_codes + */ + int16_t explicitHeader(); #ifndef RADIOLIB_GODMODE protected: #endif @@ -822,6 +836,7 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); int16_t setPacketMode(uint8_t mode, uint8_t len); + int16_t setHeaderType(uint8_t headerType) // fixes to errata int16_t fixSensitivity(); From 7ab5bf732812863ac87adeceb82cd1f801bd064f Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:45:40 +0000 Subject: [PATCH 045/135] setHeaderType --- src/modules/SX126x/SX126x.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 671b4dee..5b1e7ed1 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1346,6 +1346,19 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { return(state); } +int16_t SX126x::setHeaderType(uint8_t headerType) { + // set requested packet mode + int16_t state = setPacketParams(_preambleLength, _crcType, len); + + if(state != ERR_NONE) { + return(state); + } + + // update cached value + _headerType = headerType; + return(state); +} + int16_t SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro) { // calculate symbol length and enable low data rate optimization, if needed if(ldro == 0xFF) { From 28671fb01a161df1a473b4b236238ed541fd24a7 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:53:18 +0000 Subject: [PATCH 046/135] implement explicitHeader/implicitHeader --- src/modules/SX126x/SX126x.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 5b1e7ed1..2dfe1b14 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1170,6 +1170,14 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } +int16_t implicitHeader() { + return setHeaderType(SX126X_LORA_HEADER_IMPLICIT); +} + +int16_t explicitHeader() { + return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); +} + int16_t SX126x::setTCXO(float voltage, uint32_t delay) { // set mode to standby standby(); From 562ed02eab4eb8c28fe4cf815f9fdfa0c5542473 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:54:15 +0000 Subject: [PATCH 047/135] add missing parameter to setHeaderType --- src/modules/SX126x/SX126x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 2dfe1b14..2a7f9677 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1356,7 +1356,7 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { int16_t SX126x::setHeaderType(uint8_t headerType) { // set requested packet mode - int16_t state = setPacketParams(_preambleLength, _crcType, len); + int16_t state = setPacketParams(_preambleLength, _crcType, 0xFF, headerType); if(state != ERR_NONE) { return(state); From b85e7474b33fc899e451b357544ae6e39567d77c Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 15:16:52 +0000 Subject: [PATCH 048/135] specify _headerType with every call to setPacketParams --- src/modules/SX126x/SX126x.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 2a7f9677..32c928c3 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -450,7 +450,7 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { int16_t state = ERR_NONE; uint8_t modem = getPacketType(); if(modem == SX126X_PACKET_TYPE_LORA) { - state = setPacketParams(_preambleLength, _crcType, len); + state = setPacketParams(_preambleLength, _crcType, len, _headerType); } else if(modem == SX126X_PACKET_TYPE_GFSK) { state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType, len); } else { @@ -742,7 +742,7 @@ int16_t SX126x::setPreambleLength(uint16_t preambleLength) { uint8_t modem = getPacketType(); if(modem == SX126X_PACKET_TYPE_LORA) { _preambleLength = preambleLength; - return(setPacketParams(_preambleLength, _crcType)); + return(setPacketParams(_preambleLength, _crcType, 0xFF, _headerType)); } else if(modem == SX126X_PACKET_TYPE_GFSK) { _preambleLengthFSK = preambleLength; return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType)); @@ -1047,7 +1047,7 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool _crcType = SX126X_LORA_CRC_OFF; } - return(setPacketParams(_preambleLength, _crcType)); + return(setPacketParams(_preambleLength, _crcType, 0xFF, _headerType)); } return(ERR_UNKNOWN); From aee59b5bdd7a7d99173130e04be8cb5f38ea7c99 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 15:40:59 +0000 Subject: [PATCH 049/135] breaking change to interrupt RX method declaration : len required --- src/modules/SX126x/SX126x.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 9d771e42..bcdc165e 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -514,7 +514,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceive(uint32_t timeout = SX126X_RX_TIMEOUT_INF); + int16_t startReceive(size_t len, uint32_t timeout = SX126X_RX_TIMEOUT_INF); /*! \brief Interrupt-driven receive method where the device mostly sleeps and periodically wakes to listen. @@ -526,7 +526,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod); + int16_t startReceiveDutyCycle(size_t len, uint32_t rxPeriod, uint32_t sleepPeriod); /*! \brief Calls \ref startReceiveDutyCycle with rxPeriod and sleepPeriod set so the unit shouldn't miss any messages. @@ -539,7 +539,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceiveDutyCycleAuto(uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8); + int16_t startReceiveDutyCycleAuto(size_t len, uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8); /*! \brief Reads data received after calling startReceive method. From 54f058de0229abc1b9253ff222f4af83028142bb Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 16:04:46 +0000 Subject: [PATCH 050/135] Revert "breaking change to interrupt RX method declaration : len required" This reverts commit aee59b5bdd7a7d99173130e04be8cb5f38ea7c99. --- src/modules/SX126x/SX126x.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index bcdc165e..9d771e42 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -514,7 +514,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceive(size_t len, uint32_t timeout = SX126X_RX_TIMEOUT_INF); + int16_t startReceive(uint32_t timeout = SX126X_RX_TIMEOUT_INF); /*! \brief Interrupt-driven receive method where the device mostly sleeps and periodically wakes to listen. @@ -526,7 +526,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceiveDutyCycle(size_t len, uint32_t rxPeriod, uint32_t sleepPeriod); + int16_t startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod); /*! \brief Calls \ref startReceiveDutyCycle with rxPeriod and sleepPeriod set so the unit shouldn't miss any messages. @@ -539,7 +539,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceiveDutyCycleAuto(size_t len, uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8); + int16_t startReceiveDutyCycleAuto(uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8); /*! \brief Reads data received after calling startReceive method. From 51ce45220b77e74665e2251898d57ec77e59d21b Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 16:08:00 +0000 Subject: [PATCH 051/135] pass len as param to implicitHeader --- src/modules/SX126x/SX126x.cpp | 8 ++++---- src/modules/SX126x/SX126x.h | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 32c928c3..4b285fae 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1170,8 +1170,8 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -int16_t implicitHeader() { - return setHeaderType(SX126X_LORA_HEADER_IMPLICIT); +int16_t implicitHeader(size_t len) { + return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); } int16_t explicitHeader() { @@ -1354,9 +1354,9 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { return(state); } -int16_t SX126x::setHeaderType(uint8_t headerType) { +int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { // set requested packet mode - int16_t state = setPacketParams(_preambleLength, _crcType, 0xFF, headerType); + int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); if(state != ERR_NONE) { return(state); diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 9d771e42..a02a2104 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -795,11 +795,13 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t implicitHeader(); + int16_t implicitHeader(size_t len); /*! \brief Set explicit header mode for future reception/transmission. + \param len Payload length in bytes. **WILL BE GLOBALLY OVERRIDDEN BY transmit()** + \returns \ref status_codes */ int16_t explicitHeader(); @@ -836,7 +838,7 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); int16_t setPacketMode(uint8_t mode, uint8_t len); - int16_t setHeaderType(uint8_t headerType) + int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF) // fixes to errata int16_t fixSensitivity(); From b7d97341b47b32ac1a150032f8db29087e6883be Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 16:10:43 +0000 Subject: [PATCH 052/135] make header type a required param to setPacketParams --- src/modules/SX126x/SX126x.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index a02a2104..56563382 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -826,7 +826,7 @@ class SX126x: public PhysicalLayer { int16_t setTxParams(uint8_t power, uint8_t rampTime = SX126X_PA_RAMP_200U); int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro = 0xFF); int16_t setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t rxBw, uint32_t freqDev); - int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength = 0xFF, uint8_t headerType = SX126X_LORA_HEADER_EXPLICIT, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); + int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength = 0xFF, uint8_t headerType, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); int16_t setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t packetType = SX126X_GFSK_PACKET_VARIABLE, uint8_t payloadLength = 0xFF, uint8_t preambleDetectorLength = SX126X_GFSK_PREAMBLE_DETECT_16); int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00); uint8_t getStatus(); From 3bea627df499272f68b52d186e48693ff2891ec7 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 09:38:49 +0000 Subject: [PATCH 053/135] switch to recoding implicit length for use JIT --- src/modules/SX126x/SX126x.cpp | 24 +++++++----------------- src/modules/SX126x/SX126x.h | 7 ++++--- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 4b285fae..3088c9e8 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -22,6 +22,7 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float _preambleLength = preambleLength; _tcxoDelay = 0; _headerType = SX126X_LORA_HEADER_EXPLICIT; + _implicitLen = 0xFF; // reset the module and verify startup int16_t state = reset(); @@ -1170,12 +1171,14 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -int16_t implicitHeader(size_t len) { - return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); +void implicitHeader(size_t len) { + _headerType = SX126X_LORA_HEADER_IMPLICIT; + _implicitLen = len; } -int16_t explicitHeader() { - return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); +void explicitHeader() { + _headerType = SX126X_LORA_HEADER_EXPLICIT; + _implicitLen = 0xFF; } int16_t SX126x::setTCXO(float voltage, uint32_t delay) { @@ -1354,19 +1357,6 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { return(state); } -int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { - // set requested packet mode - int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); - - if(state != ERR_NONE) { - return(state); - } - - // update cached value - _headerType = headerType; - return(state); -} - int16_t SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro) { // calculate symbol length and enable low data rate optimization, if needed if(ldro == 0xFF) { diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 56563382..8aee4741 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -795,7 +795,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t implicitHeader(size_t len); + void implicitHeader(size_t len); /*! \brief Set explicit header mode for future reception/transmission. @@ -804,7 +804,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t explicitHeader(); + void explicitHeader(); #ifndef RADIOLIB_GODMODE protected: #endif @@ -838,7 +838,6 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); int16_t setPacketMode(uint8_t mode, uint8_t len); - int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF) // fixes to errata int16_t fixSensitivity(); @@ -864,6 +863,8 @@ class SX126x: public PhysicalLayer { uint32_t _tcxoDelay; + size_t _implicitLen; + int16_t config(uint8_t modem); // common low-level SPI interface From 870a135b152537ffc8cd15c7250b1b293ad8fe98 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 11:54:28 +0000 Subject: [PATCH 054/135] make sure _implicitLen is passed where appropriate --- src/modules/SX126x/SX126x.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 3088c9e8..c21dd404 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -743,7 +743,7 @@ int16_t SX126x::setPreambleLength(uint16_t preambleLength) { uint8_t modem = getPacketType(); if(modem == SX126X_PACKET_TYPE_LORA) { _preambleLength = preambleLength; - return(setPacketParams(_preambleLength, _crcType, 0xFF, _headerType)); + return(setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType)); } else if(modem == SX126X_PACKET_TYPE_GFSK) { _preambleLengthFSK = preambleLength; return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType)); @@ -1048,7 +1048,7 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool _crcType = SX126X_LORA_CRC_OFF; } - return(setPacketParams(_preambleLength, _crcType, 0xFF, _headerType)); + return(setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType)); } return(ERR_UNKNOWN); From 07429986c2f48ec19e118327a2a1eb53c3d4fbfe Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 14:11:28 +0000 Subject: [PATCH 055/135] set implicit params with extra SPI call where required --- src/modules/SX126x/SX126x.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index c21dd404..5d69eeb0 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -290,6 +290,14 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { float symbolLength = (float)(uint32_t(1) << _sf) / (float)_bwKhz; timeout = (uint32_t)(symbolLength * 100.0 * 1000.0); + // set implicit mode and expected len if applicable + if (_headerType == SX126X_LORA_HEADER_IMPLICIT) { + state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); + if(state != ERR_NONE) { + return(state); + } + } + } else if(modem == SX126X_PACKET_TYPE_GFSK) { // calculate timeout (500 % of expected time-one-air) size_t maxLen = len; @@ -600,6 +608,14 @@ int16_t SX126x::startReceiveCommon() { // clear interrupt flags state = clearIrqStatus(); + // set implicit mode and expected len if applicable + if (_headerType == SX126X_LORA_HEADER_IMPLICIT && getPacketType() == SX126X_PACKET_TYPE_LORA) { + state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); + if(state != ERR_NONE) { + return(state); + } + } + return(state); } From 8d2c98339f862e87acf8c8d6b8c040877f409511 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 14:20:42 +0000 Subject: [PATCH 056/135] fix default args, scoping --- src/modules/SX126x/SX126x.cpp | 4 ++-- src/modules/SX126x/SX126x.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 5d69eeb0..785c83d9 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1187,12 +1187,12 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -void implicitHeader(size_t len) { +void SX126x::implicitHeader(size_t len) { _headerType = SX126X_LORA_HEADER_IMPLICIT; _implicitLen = len; } -void explicitHeader() { +void SX126x::explicitHeader() { _headerType = SX126X_LORA_HEADER_EXPLICIT; _implicitLen = 0xFF; } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 8aee4741..6d6bd9d4 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -826,7 +826,7 @@ class SX126x: public PhysicalLayer { int16_t setTxParams(uint8_t power, uint8_t rampTime = SX126X_PA_RAMP_200U); int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro = 0xFF); int16_t setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t rxBw, uint32_t freqDev); - int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength = 0xFF, uint8_t headerType, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); + int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength, uint8_t headerType, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); int16_t setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t packetType = SX126X_GFSK_PACKET_VARIABLE, uint8_t payloadLength = 0xFF, uint8_t preambleDetectorLength = SX126X_GFSK_PREAMBLE_DETECT_16); int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00); uint8_t getStatus(); From a4e087daf585a8bf45e48af83c6a1f651b5ce0c5 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 14:31:21 +0000 Subject: [PATCH 057/135] edit getTimeOnAir to support implicit mode --- src/modules/SX126x/SX126x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 785c83d9..57427ca1 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1168,7 +1168,7 @@ uint32_t SX126x::getTimeOnAir(size_t len) { sfDivisor = 4*(_sf - 2); } const int8_t bitsPerCrc = 16; - const int8_t N_symbol_header = 20; + const int8_t N_symbol_header = _headerType == SX126X_LORA_HEADER_EXPLICIT ? 20 : 0; // numerator of equation in section 6.1.4 of SX1268 datasheet v1.1 (might not actually be bitcount, but it has len * 8) int16_t bitCount = (int16_t) 8 * len + _crcType * bitsPerCrc - 4 * _sf + sfCoeff2 + N_symbol_header; From c331abb7a9d4ba68ca52bf6824e2b2ef78b8b861 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 15:34:33 +0000 Subject: [PATCH 058/135] remove outdated comment --- src/modules/SX126x/SX126x.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 6d6bd9d4..6ad7b760 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -800,7 +800,7 @@ class SX126x: public PhysicalLayer { /*! \brief Set explicit header mode for future reception/transmission. - \param len Payload length in bytes. **WILL BE GLOBALLY OVERRIDDEN BY transmit()** + \param len Payload length in bytes. \returns \ref status_codes */ From 38eb3a4a3c5a6734ebb9628bb55c2d8ee2c8d974 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 09:51:06 +0000 Subject: [PATCH 059/135] add implicitHeader/explicitHeader to keywords --- keywords.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keywords.txt b/keywords.txt index 9aabb1c0..0970a21a 100644 --- a/keywords.txt +++ b/keywords.txt @@ -117,6 +117,8 @@ clearGdo2Action KEYWORD2 setTCXO KEYWORD2 setDio2AsRfSwitch KEYWORD2 getTimeOnAir KEYWORD2 +implicitHeader +explicitHeader setSyncBits KEYWORD2 setWhitening KEYWORD2 startReceiveDutyCycle KEYWORD2 From 3ac63e8c951959a9aeed1884ae1e34dbbc15e80a Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 09:55:35 +0000 Subject: [PATCH 060/135] remove redundant call to setPacketParams --- src/modules/SX126x/SX126x.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 57427ca1..ec267344 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -289,15 +289,6 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { // calculate timeout (100 LoRa symbols, the default for SX127x series) float symbolLength = (float)(uint32_t(1) << _sf) / (float)_bwKhz; timeout = (uint32_t)(symbolLength * 100.0 * 1000.0); - - // set implicit mode and expected len if applicable - if (_headerType == SX126X_LORA_HEADER_IMPLICIT) { - state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); - if(state != ERR_NONE) { - return(state); - } - } - } else if(modem == SX126X_PACKET_TYPE_GFSK) { // calculate timeout (500 % of expected time-one-air) size_t maxLen = len; From e441e101ff83ba1c9b5dbca28f7172d16492c89b Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 11:46:50 +0000 Subject: [PATCH 061/135] check modem type when header type set --- src/modules/SX126x/SX126x.cpp | 24 ++++++++++++++++++++---- src/modules/SX126x/SX126x.h | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index ec267344..4a274efd 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1179,13 +1179,11 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } void SX126x::implicitHeader(size_t len) { - _headerType = SX126X_LORA_HEADER_IMPLICIT; - _implicitLen = len; + return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); } void SX126x::explicitHeader() { - _headerType = SX126X_LORA_HEADER_EXPLICIT; - _implicitLen = 0xFF; + return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); } int16_t SX126x::setTCXO(float voltage, uint32_t delay) { @@ -1364,6 +1362,24 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { return(state); } +int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { + // check active modem + if(getPacketType() != SX126X_PACKET_TYPE_LORA) { + return(ERR_WRONG_MODEM); + } + // set requested packet mode + int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); + + if(state != ERR_NONE) { + return(state); + } + + // update cached value + _headerType = headerType; + _implicitLen = len; + return(state); +} + int16_t SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro) { // calculate symbol length and enable low data rate optimization, if needed if(ldro == 0xFF) { diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 6ad7b760..a17ac662 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -838,6 +838,7 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); int16_t setPacketMode(uint8_t mode, uint8_t len); + int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF); // fixes to errata int16_t fixSensitivity(); From 17e3f47c2fe11b834d29f81d2b01ea8d10361b75 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 12:14:56 +0000 Subject: [PATCH 062/135] correct return types --- src/modules/SX126x/SX126x.cpp | 6 ++++-- src/modules/SX126x/SX126x.h | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 4a274efd..6776dfb1 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1178,11 +1178,11 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -void SX126x::implicitHeader(size_t len) { +int16_t SX126x::implicitHeader(size_t len) { return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); } -void SX126x::explicitHeader() { +int16_t SX126x::explicitHeader() { return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); } @@ -1367,6 +1367,7 @@ int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { if(getPacketType() != SX126X_PACKET_TYPE_LORA) { return(ERR_WRONG_MODEM); } + // set requested packet mode int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); @@ -1377,6 +1378,7 @@ int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { // update cached value _headerType = headerType; _implicitLen = len; + return(state); } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index a17ac662..8267f4cc 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -795,7 +795,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - void implicitHeader(size_t len); + int16_t implicitHeader(size_t len); /*! \brief Set explicit header mode for future reception/transmission. @@ -804,7 +804,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - void explicitHeader(); + int16_t explicitHeader(); #ifndef RADIOLIB_GODMODE protected: #endif From 3adff36a1bf7bb8e73fb1142c9332dc4910b9886 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 12:17:47 +0000 Subject: [PATCH 063/135] add missing type specifiers --- keywords.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keywords.txt b/keywords.txt index 0970a21a..5feb6969 100644 --- a/keywords.txt +++ b/keywords.txt @@ -117,8 +117,8 @@ clearGdo2Action KEYWORD2 setTCXO KEYWORD2 setDio2AsRfSwitch KEYWORD2 getTimeOnAir KEYWORD2 -implicitHeader -explicitHeader +implicitHeader KEYWORD2 +explicitHeader KEYWORD2 setSyncBits KEYWORD2 setWhitening KEYWORD2 startReceiveDutyCycle KEYWORD2 From bc31827505096365b544064b17502fa8d4fa5652 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 15:22:57 +0100 Subject: [PATCH 064/135] Minor formatting fixes --- src/modules/SX126x/SX126x.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 6776dfb1..bc78ee7e 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -600,11 +600,11 @@ int16_t SX126x::startReceiveCommon() { state = clearIrqStatus(); // set implicit mode and expected len if applicable - if (_headerType == SX126X_LORA_HEADER_IMPLICIT && getPacketType() == SX126X_PACKET_TYPE_LORA) { - state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); - if(state != ERR_NONE) { - return(state); - } + if(_headerType == SX126X_LORA_HEADER_IMPLICIT && getPacketType() == SX126X_PACKET_TYPE_LORA) { + state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); + if(state != ERR_NONE) { + return(state); + } } return(state); @@ -1179,11 +1179,11 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } int16_t SX126x::implicitHeader(size_t len) { - return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); + return(setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len)); } int16_t SX126x::explicitHeader() { - return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); + return(setHeaderType(SX126X_LORA_HEADER_EXPLICIT)); } int16_t SX126x::setTCXO(float voltage, uint32_t delay) { @@ -1370,7 +1370,6 @@ int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { // set requested packet mode int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); - if(state != ERR_NONE) { return(state); } From 2332f2e3279447a3e9d1c209ebeba440e4ee1457 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:36:21 +0100 Subject: [PATCH 065/135] Added assert macro --- src/TypeDef.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/TypeDef.h b/src/TypeDef.h index 6236b2be..a77bf6fe 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -81,6 +81,11 @@ #define NC (-1) #endif +/*! + \brief A simple assert macro, will return on error. +*/ +#define RADIOLIB_ASSERT(STATEVAR) { if(STATEVAR != ERR_NONE) { return(STATEVAR); } } + /*! \defgroup shield_config Shield Configuration From ba1c483121f30002320cb363739f530b949dcccb Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:36:44 +0100 Subject: [PATCH 066/135] [CC1101] Added assert macro --- src/modules/CC1101/CC1101.cpp | 119 ++++++++++------------------------ 1 file changed, 36 insertions(+), 83 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 6e3fc053..3c2d8218 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -50,51 +50,34 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po // configure settings not accessible by API int16_t state = config(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure bitrate state = setBitRate(br); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default RX bandwidth state = setRxBandwidth(rxBw); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default frequency deviation state = setFrequencyDeviation(freqDev); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default TX output power state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set default packet length mode state = variablePacketLengthMode(); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default preamble lenght state = setPreambleLength(preambleLength); - if (state != ERR_NONE) { - return(state); - } // flush FIFOs SPIsendCommand(CC1101_CMD_FLUSH_RX); @@ -106,9 +89,7 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po int16_t CC1101::transmit(uint8_t* data, size_t len, uint8_t addr) { // start transmission int16_t state = startTransmit(data, len, addr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for transmission start while(!digitalRead(_mod->getIrq())); @@ -128,9 +109,7 @@ int16_t CC1101::transmit(uint8_t* data, size_t len, uint8_t addr) { int16_t CC1101::receive(uint8_t* data, size_t len) { // start reception int16_t state = startReceive(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for sync word while(!digitalRead(_mod->getIrq())); @@ -159,9 +138,7 @@ int16_t CC1101::transmitDirect(uint32_t frf) { // activate direct mode int16_t state = directMode(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // start transmitting SPIsendCommand(CC1101_CMD_TX); @@ -171,9 +148,7 @@ int16_t CC1101::transmitDirect(uint32_t frf) { int16_t CC1101::receiveDirect() { // activate direct mode int16_t state = directMode(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // start receiving SPIsendCommand(CC1101_CMD_RX); @@ -223,10 +198,8 @@ int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) { SPIsendCommand(CC1101_CMD_FLUSH_TX); // set GDO0 mapping - int state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_SYNC_WORD_SENT_OR_RECEIVED); - if(state != ERR_NONE) { - return(state); - } + int16_t state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_SYNC_WORD_SENT_OR_RECEIVED); + RADIOLIB_ASSERT(state); // optionally write packet length if (_packetLengthConfig == CC1101_LENGTH_CONFIG_VARIABLE) { @@ -257,9 +230,7 @@ int16_t CC1101::startReceive() { // set GDO0 mapping int state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_SYNC_WORD_SENT_OR_RECEIVED); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set mode to receive SPIsendCommand(CC1101_CMD_RX); @@ -498,15 +469,13 @@ int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) // enable sync word filtering int16_t state = enableSyncWordFiltering(maxErrBits); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set sync word register state = SPIsetRegValue(CC1101_REG_SYNC1, syncWord[0]); state |= SPIsetRegValue(CC1101_REG_SYNC0, syncWord[1]); - return (state); + return(state); } int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits) { @@ -558,9 +527,7 @@ int16_t CC1101::setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs) { // enable address filtering int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL1, numBroadcastAddrs + 0x01, 1, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set node address return(SPIsetRegValue(CC1101_REG_ADDR, nodeAddr)); @@ -569,9 +536,7 @@ int16_t CC1101::setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs) { int16_t CC1101::disableAddressFiltering() { // disable address filtering int16_t state = _mod->SPIsetRegValue(CC1101_REG_PKTCTRL1, CC1101_ADR_CHK_NONE, 1, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set node address to default (0x00) return(SPIsetRegValue(CC1101_REG_ADDR, 0x00)); @@ -580,28 +545,26 @@ int16_t CC1101::disableAddressFiltering() { int16_t CC1101::setOOK(bool enableOOK) { // Change modulation - if (enableOOK) { - _modulation = CC1101_MOD_FORMAT_ASK_OOK; - }else{ - _modulation = CC1101_MOD_FORMAT_2_FSK; - } - uint8_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, _modulation, 6, 4); + if(enableOOK) { + int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_ASK_OOK, 6, 4); + RADIOLIB_ASSERT(state); - // Change Front End TX Configuration - if (enableOOK){ // PA_TABLE[0] is (by default) the power value used when transmitting a "0L". // Set PA_TABLE[1] to be used when transmitting a "1L". - state |= SPIsetRegValue(CC1101_REG_FREND0, 1, 2, 0); - }else{ + state = SPIsetRegValue(CC1101_REG_FREND0, 1, 2, 0); + RADIOLIB_ASSERT(state); + + } else { + int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_2_FSK, 6, 4); + RADIOLIB_ASSERT(state); + // Reset FREND0 to default value. - state |= SPIsetRegValue(CC1101_REG_FREND0, 0, 2, 0); + state = SPIsetRegValue(CC1101_REG_FREND0, 0, 2, 0); + RADIOLIB_ASSERT(state); } - if (state != ERR_NONE) - return state; - // Update PA_TABLE values according to the new _modulation. - return setOutputPower(_power); + return(setOutputPower(_power)); } @@ -678,18 +641,14 @@ int16_t CC1101::setPromiscuousMode(bool promiscuous) { if (promiscuous == true) { // disable preamble and sync word filtering and insertion state = disableSyncWordFiltering(); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // disable CRC filtering state = setCrcFiltering(false); } else { // enable preamble and sync word filtering and insertion state = enableSyncWordFiltering(); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable CRC filtering state = setCrcFiltering(true); @@ -707,9 +666,7 @@ int16_t CC1101::config() { // enable automatic frequency synthesizer calibration int16_t state = SPIsetRegValue(CC1101_REG_MCSM0, CC1101_FS_AUTOCAL_IDLE_TO_RXTX, 5, 4); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set packet mode state = packetMode(); @@ -764,15 +721,11 @@ int16_t CC1101::setPacketMode(uint8_t mode, uint8_t len) { // set PKTCTRL0.LENGTH_CONFIG int16_t state = _mod->SPIsetRegValue(CC1101_REG_PKTCTRL0, mode, 1, 0); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set length to register state = _mod->SPIsetRegValue(CC1101_REG_PKTLEN, len); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // update the cached value _packetLengthConfig = mode; From 751fb6431c5b4ef39a06bad5680c2ef37c924e2c Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:36:53 +0100 Subject: [PATCH 067/135] [RF69] Added assert macro --- src/modules/RF69/RF69.cpp | 165 ++++++++++---------------------------- 1 file changed, 41 insertions(+), 124 deletions(-) diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 39ea1441..a5d42d0d 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -55,53 +55,37 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe // configure settings not accessible by API int16_t state = config(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure bitrate _rxBw = 125.0; state = setBitRate(br); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default RX bandwidth state = setRxBandwidth(rxBw); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default frequency deviation state = setFrequencyDeviation(freqDev); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default TX output power state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set default packet length mode state = variablePacketLengthMode(); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library uint8_t syncWord[] = {0x2D, 0x01}; state = setSyncWord(syncWord, sizeof(syncWord)); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); return(ERR_NONE); } @@ -121,9 +105,7 @@ int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) { // start transmission int16_t state = startTransmit(data, len, addr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for transmission end or timeout uint32_t start = micros(); @@ -147,9 +129,7 @@ int16_t RF69::receive(uint8_t* data, size_t len) { // start reception int16_t state = startReceive(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for packet reception or timeout uint32_t start = micros(); @@ -187,9 +167,7 @@ int16_t RF69::transmitDirect(uint32_t frf) { // activate direct mode int16_t state = directMode(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // start transmitting return(setMode(RF69_TX)); @@ -198,9 +176,7 @@ int16_t RF69::transmitDirect(uint32_t frf) { int16_t RF69::receiveDirect() { // activate direct mode int16_t state = directMode(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // start receiving return(setMode(RF69_RX)); @@ -209,16 +185,14 @@ int16_t RF69::receiveDirect() { int16_t RF69::directMode() { // set mode to standby int16_t state = setMode(RF69_STANDBY); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set DIO mapping state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO1_CONT_DCLK | RF69_DIO2_CONT_DATA, 5, 2); + RADIOLIB_ASSERT(state); // set continuous mode - state |= _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_CONTINUOUS_MODE_WITH_SYNC, 6, 5); - return(state); + return(_mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_CONTINUOUS_MODE_WITH_SYNC, 6, 5)); } int16_t RF69::packetMode() { @@ -245,9 +219,7 @@ int16_t RF69::startReceive() { state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PAYLOAD_READY, 7, 4); state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START); state |= _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // clear interrupt flags clearIRQFlags(); @@ -291,12 +263,11 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // set mode to standby int16_t state = setMode(RF69_STANDBY); + RADIOLIB_ASSERT(state); // set DIO pin mapping - state |= _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PACKET_SENT, 7, 6); - if(state != ERR_NONE) { - return(state); - } + state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PACKET_SENT, 7, 6); + RADIOLIB_ASSERT(state); // clear interrupt flags clearIRQFlags(); @@ -329,10 +300,7 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { int16_t RF69::readData(uint8_t* data, size_t len) { // set mdoe to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); // get packet length size_t length = len; if(len == RF69_MAX_PACKET_LENGTH) { @@ -558,9 +526,7 @@ int16_t RF69::setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits) { _syncWordLength = len; int16_t state = enableSyncWordFiltering(maxErrBits); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set sync word register _mod->SPIwriteRegisterBurst(RF69_REG_SYNC_VALUE_1, syncWord, len); @@ -570,9 +536,7 @@ int16_t RF69::setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits) { int16_t RF69::setNodeAddress(uint8_t nodeAddr) { // enable address filtering (node only) int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_ADDRESS_FILTERING_NODE, 2, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set node address return(_mod->SPIsetRegValue(RF69_REG_NODE_ADRS, nodeAddr)); @@ -581,9 +545,7 @@ int16_t RF69::setNodeAddress(uint8_t nodeAddr) { int16_t RF69::setBroadcastAddress(uint8_t broadAddr) { // enable address filtering (node + broadcast) int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_ADDRESS_FILTERING_NODE_BROADCAST, 2, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set broadcast address return(_mod->SPIsetRegValue(RF69_REG_BROADCAST_ADRS, broadAddr)); @@ -592,15 +554,11 @@ int16_t RF69::setBroadcastAddress(uint8_t broadAddr) { int16_t RF69::disableAddressFiltering() { // disable address filtering int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_ADDRESS_FILTERING_OFF, 2, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set node address to default (0x00) state = _mod->SPIsetRegValue(RF69_REG_NODE_ADRS, 0x00); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set broadcast address to default (0x00) return(_mod->SPIsetRegValue(RF69_REG_BROADCAST_ADRS, 0x00)); @@ -650,27 +608,17 @@ int16_t RF69::variablePacketLengthMode(uint8_t maxLen) { int16_t RF69::enableSyncWordFiltering(uint8_t maxErrBits) { // enable sync word recognition - int16_t state = _mod->SPIsetRegValue(RF69_REG_SYNC_CONFIG, RF69_SYNC_ON | RF69_FIFO_FILL_CONDITION_SYNC | (_syncWordLength - 1) << 3 | maxErrBits, 7, 0); - if(state != ERR_NONE) { - return(state); - } - - return(state); + return(_mod->SPIsetRegValue(RF69_REG_SYNC_CONFIG, RF69_SYNC_ON | RF69_FIFO_FILL_CONDITION_SYNC | (_syncWordLength - 1) << 3 | maxErrBits, 7, 0)); } int16_t RF69::disableSyncWordFiltering() { // disable preamble detection and generation int16_t state = _mod->SPIsetRegValue(RF69_REG_PREAMBLE_LSB, 0, 7, 0); state |= _mod->SPIsetRegValue(RF69_REG_PREAMBLE_MSB, 0, 7, 0); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // disable sync word detection and generation state = _mod->SPIsetRegValue(RF69_REG_SYNC_CONFIG, RF69_SYNC_OFF | RF69_FIFO_FILL_CONDITION, 7, 6); - if (state != ERR_NONE) { - return(state); - } return(state); } @@ -693,18 +641,14 @@ int16_t RF69::setPromiscuousMode(bool promiscuous) { if (promiscuous == true) { // disable preamble and sync word filtering and insertion state = disableSyncWordFiltering(); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // disable CRC filtering state = setCrcFiltering(false); } else { // enable preamble and sync word filtering and insertion state = enableSyncWordFiltering(); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable CRC filtering state = setCrcFiltering(true); @@ -718,76 +662,53 @@ int16_t RF69::config() { // set mode to STANDBY state = setMode(RF69_STANDBY); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set operation modes state = _mod->SPIsetRegValue(RF69_REG_OP_MODE, RF69_SEQUENCER_ON | RF69_LISTEN_OFF, 7, 6); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable over-current protection state = _mod->SPIsetRegValue(RF69_REG_OCP, RF69_OCP_ON, 4, 4); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set data mode, modulation type and shaping state = _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_PACKET_MODE | RF69_FSK, 6, 3); state |= _mod->SPIsetRegValue(RF69_REG_DATA_MODUL, RF69_FSK_GAUSSIAN_0_3, 1, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set RSSI threshold state = _mod->SPIsetRegValue(RF69_REG_RSSI_THRESH, RF69_RSSI_THRESHOLD, 7, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // reset FIFO flag _mod->SPIwriteRegister(RF69_REG_IRQ_FLAGS_2, RF69_IRQ_FIFO_OVERRUN); // disable ClkOut on DIO5 state = _mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_2, RF69_CLK_OUT_OFF, 2, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set packet configuration and disable encryption state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_VARIABLE | RF69_DC_FREE_NONE | RF69_CRC_ON | RF69_CRC_AUTOCLEAR_ON | RF69_ADDRESS_FILTERING_OFF, 7, 1); state |= _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_2, RF69_INTER_PACKET_RX_DELAY, 7, 4); state |= _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_2, RF69_AUTO_RX_RESTART_ON | RF69_AES_OFF, 1, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set payload length state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, RF69_PAYLOAD_LENGTH, 7, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set FIFO threshold state = _mod->SPIsetRegValue(RF69_REG_FIFO_THRESH, RF69_TX_START_CONDITION_FIFO_NOT_EMPTY | RF69_FIFO_THRESHOLD, 7, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set Rx timeouts state = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START, 7, 0); state = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH, 7, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable improved fading margin state = _mod->SPIsetRegValue(RF69_REG_TEST_DAGC, RF69_CONTINUOUS_DAGC_LOW_BETA_OFF, 7, 0); - if(state != ERR_NONE) { - return(state); - } return(ERR_NONE); } @@ -800,15 +721,11 @@ int16_t RF69::setPacketMode(uint8_t mode, uint8_t len) { // set to fixed packet length int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, mode, 7, 7); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set length to register state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, len); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // update the cached value _packetLengthConfig = mode; From be701ed1208f167dfa782f0f47af86a2f39c5b02 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:37:01 +0100 Subject: [PATCH 068/135] [RFM9x] Added assert macro --- src/modules/RFM9x/RFM95.cpp | 49 ++++++++++++------------------------- src/modules/RFM9x/RFM96.cpp | 49 ++++++++++++------------------------- src/modules/RFM9x/RFM97.cpp | 4 +-- 3 files changed, 34 insertions(+), 68 deletions(-) diff --git a/src/modules/RFM9x/RFM95.cpp b/src/modules/RFM9x/RFM95.cpp index 812d928c..72df63c4 100644 --- a/src/modules/RFM9x/RFM95.cpp +++ b/src/modules/RFM9x/RFM95.cpp @@ -7,47 +7,30 @@ RFM95::RFM95(Module* mod) : SX1278(mod) { int16_t RFM95::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, uint16_t preambleLength, uint8_t gain) { // execute common part int16_t state = SX127x::begin(RFM95_CHIP_VERSION, syncWord, currentLimit, preambleLength); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure settings not accessible by API state = config(); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setGain(gain); - if(state != ERR_NONE) { - return(state); - } - + return(state); } @@ -56,7 +39,7 @@ int16_t RFM95::setFrequency(float freq) { if((freq < 868.0) || (freq > 915.0)) { return(ERR_INVALID_FREQUENCY); } - + // set frequency return(SX127x::setFrequencyRaw(freq)); } diff --git a/src/modules/RFM9x/RFM96.cpp b/src/modules/RFM9x/RFM96.cpp index e346ee7c..1e045536 100644 --- a/src/modules/RFM9x/RFM96.cpp +++ b/src/modules/RFM9x/RFM96.cpp @@ -7,47 +7,30 @@ RFM96::RFM96(Module* mod) : SX1278(mod) { int16_t RFM96::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, uint16_t preambleLength, uint8_t gain) { // execute common part int16_t state = SX127x::begin(RFM9X_CHIP_VERSION, syncWord, currentLimit, preambleLength); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure settings not accessible by API state = config(); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setGain(gain); - if(state != ERR_NONE) { - return(state); - } - + return(state); } @@ -56,7 +39,7 @@ int16_t RFM96::setFrequency(float freq) { if((freq < 433.0) || (freq > 470.0)) { return(ERR_INVALID_FREQUENCY); } - + // set frequency return(SX127x::setFrequencyRaw(freq)); } diff --git a/src/modules/RFM9x/RFM97.cpp b/src/modules/RFM9x/RFM97.cpp index 8299d654..102fecf9 100644 --- a/src/modules/RFM9x/RFM97.cpp +++ b/src/modules/RFM9x/RFM97.cpp @@ -11,7 +11,7 @@ int16_t RFM97::setSpreadingFactor(uint8_t sf) { } uint8_t newSpreadingFactor; - + // check allowed spreading factor values switch(sf) { case 6: @@ -29,7 +29,7 @@ int16_t RFM97::setSpreadingFactor(uint8_t sf) { default: return(ERR_INVALID_SPREADING_FACTOR); } - + // set spreading factor and if successful, save the new setting int16_t state = SX1278::setSpreadingFactorRaw(newSpreadingFactor); if(state == ERR_NONE) { From 65e13696977977e25abc5bc00b101908c244bd8a Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:37:08 +0100 Subject: [PATCH 069/135] [SX1231] Added assert macro --- src/modules/SX1231/SX1231.cpp | 36 +++++++++-------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/src/modules/SX1231/SX1231.cpp b/src/modules/SX1231/SX1231.cpp index e4cff588..8c38e8cb 100644 --- a/src/modules/SX1231/SX1231.cpp +++ b/src/modules/SX1231/SX1231.cpp @@ -45,47 +45,33 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po // configure settings not accessible by API int16_t state = config(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure bitrate _rxBw = 125.0; state = setBitRate(br); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default RX bandwidth state = setRxBandwidth(rxBw); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default frequency deviation state = setFrequencyDeviation(freqDev); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure default TX output power state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library uint8_t syncWord[] = {0x2D, 0x01}; state = setSyncWord(syncWord, 2); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set default packet length mode state = variablePacketLengthMode(); @@ -97,15 +83,11 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po if(_chipRevision == SX1231_CHIP_REVISION_2_A) { // modify default OOK threshold value state = _mod->SPIsetRegValue(SX1231_REG_TEST_OOK, SX1231_OOK_DELTA_THRESHOLD); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable OCP with 95 mA limit state = _mod->SPIsetRegValue(RF69_REG_OCP, RF69_OCP_ON | RF69_OCP_TRIM, 4, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } return(ERR_NONE); From 5728bf4124305791aa5a3846cb91f58c288ebe33 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:37:21 +0100 Subject: [PATCH 070/135] [SX126x] Added assert macro --- src/modules/SX126x/SX1261.cpp | 16 +- src/modules/SX126x/SX1262.cpp | 48 ++---- src/modules/SX126x/SX1268.cpp | 48 ++---- src/modules/SX126x/SX126x.cpp | 286 +++++++++------------------------- 4 files changed, 99 insertions(+), 299 deletions(-) diff --git a/src/modules/SX126x/SX1261.cpp b/src/modules/SX126x/SX1261.cpp index 06e37d73..1b08605f 100644 --- a/src/modules/SX126x/SX1261.cpp +++ b/src/modules/SX126x/SX1261.cpp @@ -1,11 +1,11 @@ #include "SX1261.h" -SX1261::SX1261(Module* mod) +SX1261::SX1261(Module* mod) : SX1262(mod) { } -int16_t SX1261::setOutputPower(int8_t power) { +int16_t SX1261::setOutputPower(int8_t power) { // check allowed power range if (!((power >= -17) && (power <= 14))) { return(ERR_INVALID_OUTPUT_POWER); @@ -14,21 +14,15 @@ int16_t SX1261::setOutputPower(int8_t power) { // get current OCP configuration uint8_t ocp = 0; int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOptimalLowPowerPaConfig(&power); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set output power // TODO power ramp time configuration state = SX126x::setTxParams(power); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // restore OCP configuration return writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); diff --git a/src/modules/SX126x/SX1262.cpp b/src/modules/SX126x/SX1262.cpp index c7aee4ab..6078817b 100644 --- a/src/modules/SX126x/SX1262.cpp +++ b/src/modules/SX126x/SX1262.cpp @@ -7,25 +7,16 @@ SX1262::SX1262(Module* mod) : SX126x(mod) { int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { // execute common part int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = SX126x::fixPaClamping(); - if (state != ERR_NONE) { - return state; - } return(state); } @@ -33,25 +24,16 @@ int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync int16_t SX1262::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage) { // execute common part int16_t state = SX126x::beginFSK(br, freqDev, rxBw, currentLimit, preambleLength, dataShaping, tcxoVoltage); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = SX126x::fixPaClamping(); - if (state != ERR_NONE) { - return state; - } return(state); } @@ -84,9 +66,7 @@ int16_t SX1262::setFrequency(float freq, bool calibrate) { data[1] = SX126X_CAL_IMG_430_MHZ_2; } state = SX126x::calibrateImage(data); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } // set frequency @@ -102,25 +82,19 @@ int16_t SX1262::setOutputPower(int8_t power) { // get current OCP configuration uint8_t ocp = 0; int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // this function sets the optimal PA settings // and adjusts power based on the PA settings chosen // so that output power matches requested power. state = SX126x::setOptimalHiPowerPaConfig(&power); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set output power // TODO power ramp time configuration state = SX126x::setTxParams(power); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // restore OCP configuration - return writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); } diff --git a/src/modules/SX126x/SX1268.cpp b/src/modules/SX126x/SX1268.cpp index f7588165..c58651a5 100644 --- a/src/modules/SX126x/SX1268.cpp +++ b/src/modules/SX126x/SX1268.cpp @@ -7,50 +7,32 @@ SX1268::SX1268(Module* mod) : SX126x(mod) { int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { // execute common part int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = SX126x::fixPaClamping(); - if (state != ERR_NONE) { - return state; - } return(state); } int16_t SX1268::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage) { // execute common part int16_t state = SX126x::beginFSK(br, freqDev, rxBw, currentLimit, preambleLength, dataShaping, tcxoVoltage); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = SX126x::fixPaClamping(); - if (state != ERR_NONE) { - return state; - } return(state); } @@ -77,9 +59,7 @@ int16_t SX1268::setFrequency(float freq, bool calibrate) { data[1] = SX126X_CAL_IMG_430_MHZ_2; } state = SX126x::calibrateImage(data); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } // set frequency @@ -95,23 +75,17 @@ int16_t SX1268::setOutputPower(int8_t power) { // get current OCP configuration uint8_t ocp = 0; int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable optimal PA - this changes the value of power. state = SX126x::setOptimalHiPowerPaConfig(&power); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set output power // TODO power ramp time configuration state = SX126x::setTxParams(power); - if (state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // restore OCP configuration - return writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); } diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index bc78ee7e..de081201 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -26,60 +26,40 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float // reset the module and verify startup int16_t state = reset(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set mode to standby state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure settings not accessible by API state = config(SX126X_PACKET_TYPE_LORA); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set TCXO control, if requested if(tcxoVoltage > 0.0) { state = setTCXO(tcxoVoltage); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } // configure publicly accessible settings state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setSyncWord(syncWord); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setCurrentLimit(currentLimit); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setPreambleLength(preambleLength); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set publicly accessible settings that are not a part of begin method state = setDio2AsRfSwitch(true); @@ -104,72 +84,48 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit // reset the module and verify startup int16_t state = reset(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set mode to standby state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure settings not accessible by API state = config(SX126X_PACKET_TYPE_GFSK); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set TCXO control, if requested if(tcxoVoltage > 0.0) { state = setTCXO(tcxoVoltage); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } // configure publicly accessible settings state = setBitRate(br); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setFrequencyDeviation(freqDev); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setRxBandwidth(rxBw); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setCurrentLimit(currentLimit); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setDataShaping(dataShaping); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setPreambleLength(preambleLength); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set publicly accessible settings that are not a part of begin method uint8_t sync[] = {0x2D, 0x01}; state = setSyncWord(sync, 2); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setWhitening(true, 0x0100); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setDio2AsRfSwitch(false); @@ -213,9 +169,7 @@ int16_t SX126x::reset(bool verify) { int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // check packet length if(len > SX126X_MAX_PACKET_LENGTH) { @@ -244,9 +198,7 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { // start transmission state = startTransmit(data, len, addr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for packet transmission or timeout uint32_t start = micros(); @@ -264,9 +216,7 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { // clear interrupt flags state = clearIrqStatus(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set mode to standby to disable transmitter state = standby(); @@ -277,9 +227,7 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { int16_t SX126x::receive(uint8_t* data, size_t len) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); uint32_t timeout = 0; @@ -309,9 +257,7 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { // start reception uint32_t timeoutValue = (uint32_t)((float)timeout / 15.625); state = startReceive(timeoutValue); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for packet reception or timeout uint32_t start = micros(); @@ -326,9 +272,7 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { // timeout fix is recommended after any reception with active timeout state = fixImplicitTimeout(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // read the received data return(readData(data, len)); @@ -340,9 +284,7 @@ int16_t SX126x::transmitDirect(uint32_t frf) { if(frf != 0) { state = setRfFrequency(frf); } - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // start transmitting uint8_t data[] = {SX126X_CMD_NOP}; @@ -362,27 +304,19 @@ int16_t SX126x::scanChannel() { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set DIO pin mapping state = setDioIrqParams(SX126X_IRQ_CAD_DETECTED | SX126X_IRQ_CAD_DONE, SX126X_IRQ_CAD_DETECTED | SX126X_IRQ_CAD_DONE); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // clear interrupt flags state = clearIrqStatus(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set mode to CAD state = setCad(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for channel activity detected or timeout while(!digitalRead(_mod->getIrq())); @@ -456,45 +390,31 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { } else { return(ERR_UNKNOWN); } - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set DIO mapping state = setDioIrqParams(SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT, SX126X_IRQ_TX_DONE); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set buffer pointers state = setBufferBaseAddress(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // write packet to buffer state = writeBuffer(data, len); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // clear interrupt flags state = clearIrqStatus(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // fix sensitivity state = fixSensitivity(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // start transmission state = setTx(SX126X_TX_TIMEOUT_NONE); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for BUSY to go low (= PA ramp up done) while(digitalRead(_mod->getGpio())); @@ -504,9 +424,7 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { int16_t SX126x::startReceive(uint32_t timeout) { int16_t state = startReceiveCommon(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set mode to receive state = setRx(timeout); @@ -534,9 +452,7 @@ int16_t SX126x::startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod) { } int16_t state = startReceiveCommon(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); uint8_t data[6] = {(uint8_t)((rxPeriodRaw >> 16) & 0xFF), (uint8_t)((rxPeriodRaw >> 8) & 0xFF), (uint8_t)(rxPeriodRaw & 0xFF), (uint8_t)((sleepPeriodRaw >> 16) & 0xFF), (uint8_t)((sleepPeriodRaw >> 8) & 0xFF), (uint8_t)(sleepPeriodRaw & 0xFF)}; @@ -586,15 +502,11 @@ int16_t SX126x::startReceiveDutyCycleAuto(uint16_t senderPreambleLength, uint16_ int16_t SX126x::startReceiveCommon() { // set DIO mapping int16_t state = setDioIrqParams(SX126X_IRQ_RX_DONE | SX126X_IRQ_TIMEOUT | SX126X_IRQ_CRC_ERR | SX126X_IRQ_HEADER_ERR, SX126X_IRQ_RX_DONE); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set buffer pointers state = setBufferBaseAddress(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // clear interrupt flags state = clearIrqStatus(); @@ -602,9 +514,7 @@ int16_t SX126x::startReceiveCommon() { // set implicit mode and expected len if applicable if(_headerType == SX126X_LORA_HEADER_IMPLICIT && getPacketType() == SX126X_PACKET_TYPE_LORA) { state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } return(state); @@ -613,9 +523,7 @@ int16_t SX126x::startReceiveCommon() { int16_t SX126x::readData(uint8_t* data, size_t len) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // check integrity CRC uint16_t irq = getIrqStatus(); @@ -632,9 +540,7 @@ int16_t SX126x::readData(uint8_t* data, size_t len) { // read packet data state = readBuffer(data, length); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // clear interrupt flags state = clearIrqStatus(); @@ -909,9 +815,7 @@ int16_t SX126x::setSyncWord(uint8_t* syncWord, uint8_t len) { // write sync word int16_t state = writeRegister(SX126X_REG_SYNC_WORD_0, syncWord, len); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // update packet parameters _syncWordLength = len * 8; @@ -938,9 +842,7 @@ int16_t SX126x::setSyncBits(uint8_t *syncWord, uint8_t bitsLen) { // write sync word int16_t state = writeRegister(SX126X_REG_SYNC_WORD_0, syncWord, bytesLen); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // update packet parameters _syncWordLength = bitsLen; @@ -958,9 +860,7 @@ int16_t SX126x::setNodeAddress(uint8_t nodeAddr) { // enable address filtering (node only) _addrComp = SX126X_GFSK_ADDRESS_FILT_NODE; int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set node address state = writeRegister(SX126X_REG_NODE_ADDRESS, &nodeAddr, 1); @@ -977,9 +877,7 @@ int16_t SX126x::setBroadcastAddress(uint8_t broadAddr) { // enable address filtering (node and broadcast) _addrComp = SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST; int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set broadcast address state = writeRegister(SX126X_REG_BROADCAST_ADDRESS, &broadAddr, 1); @@ -1027,16 +925,12 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool } int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // write initial CRC value uint8_t data[2] = {(uint8_t)((initial >> 8) & 0xFF), (uint8_t)(initial & 0xFF)}; state = writeRegister(SX126X_REG_CRC_INITIAL_MSB, data, 2); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // write CRC polynomial value data[0] = (uint8_t)((polynomial >> 8) & 0xFF); @@ -1073,9 +967,7 @@ int16_t SX126x::setWhitening(bool enabled, uint16_t initial) { _whitening = SX126X_GFSK_WHITENING_OFF; state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } else { // enable whitening _whitening = SX126X_GFSK_WHITENING_ON; @@ -1086,21 +978,15 @@ int16_t SX126x::setWhitening(bool enabled, uint16_t initial) { // first read the actual value and mask 7 MSB which we can not change // if different value is written in 7 MSB, the Rx won't even work (tested on HW) state = readRegister(SX126X_REG_WHITENING_INITIAL_MSB, data, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); + data[0] = (data[0] & 0xFE) | (uint8_t)((initial >> 8) & 0x01); data[1] = (uint8_t)(initial & 0xFF); state = writeRegister(SX126X_REG_WHITENING_INITIAL_MSB, data, 2); - - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } return(state); } @@ -1353,9 +1239,7 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { // set requested packet mode int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, mode, len); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // update cached value _packetType = mode; @@ -1370,9 +1254,7 @@ int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { // set requested packet mode int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // update cached value _headerType = headerType; @@ -1463,9 +1345,7 @@ int16_t SX126x::fixSensitivity() { // read current sensitivity configuration uint8_t sensitivityConfig = 0; int16_t state = readRegister(SX126X_REG_SENSITIVITY_CONFIG, &sensitivityConfig, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // fix the value for LoRa with 500 kHz bandwidth if((getPacketType() == SX126X_PACKET_TYPE_LORA) && (abs(_bwKhz - 500.0) <= 0.001)) { @@ -1483,9 +1363,7 @@ int16_t SX126x::fixPaClamping() { // read current clamping configuration uint8_t clampConfig = 0; int16_t state = readRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); - if (state != ERR_NONE) { - return state; - } + RADIOLIB_ASSERT(state); // update with the new value clampConfig |= 0x1E; @@ -1499,16 +1377,12 @@ int16_t SX126x::fixImplicitTimeout() { // stop RTC counter uint8_t rtcStop = 0x00; int16_t state = writeRegister(SX126X_REG_RTC_STOP, &rtcStop, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // read currently active event uint8_t rtcEvent = 0; state = readRegister(SX126X_REG_RTC_EVENT, &rtcEvent, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // clear events rtcEvent |= 0x02; @@ -1522,9 +1396,7 @@ int16_t SX126x::fixInvertedIQ(uint8_t iqConfig) { // read current IQ configuration uint8_t iqConfigCurrent = 0; int16_t state = readRegister(SX126X_REG_IQ_CONFIG, &iqConfigCurrent, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set correct IQ configuration if(iqConfig == SX126X_LORA_IQ_STANDARD) { @@ -1542,29 +1414,21 @@ int16_t SX126x::config(uint8_t modem) { uint8_t data[7]; data[0] = SX126X_REGULATOR_DC_DC; int16_t state = SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // reset buffer base address state = setBufferBaseAddress(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set modem data[0] = modem; state = SPIwriteCommand(SX126X_CMD_SET_PACKET_TYPE, data, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set Rx/Tx fallback mode to STDBY_RC data[0] = SX126X_RX_TX_FALLBACK_MODE_STDBY_RC; state = SPIwriteCommand(SX126X_CMD_SET_RX_TX_FALLBACK_MODE, data, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set CAD parameters data[0] = SX126X_CAD_ON_8_SYMB; @@ -1575,23 +1439,17 @@ int16_t SX126x::config(uint8_t modem) { data[5] = 0x00; data[6] = 0x00; state = SPIwriteCommand(SX126X_CMD_SET_CAD_PARAMS, data, 7); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // clear IRQ state = clearIrqStatus(); state |= setDioIrqParams(SX126X_IRQ_NONE, SX126X_IRQ_NONE); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // calibrate all blocks data[0] = SX126X_CALIBRATE_ALL; state = SPIwriteCommand(SX126X_CMD_CALIBRATE, data, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for calibration completion delay(5); From acd78cb6bb9260a7bb233030d027f410b07c5dd9 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:37:31 +0100 Subject: [PATCH 071/135] [SX127x] Added assert macro --- src/modules/SX127x/SX1272.cpp | 54 +++------- src/modules/SX127x/SX1273.cpp | 61 ++++------- src/modules/SX127x/SX1276.cpp | 53 ++++----- src/modules/SX127x/SX1277.cpp | 61 ++++------- src/modules/SX127x/SX1278.cpp | 50 ++------- src/modules/SX127x/SX1279.cpp | 51 +++------ src/modules/SX127x/SX127x.cpp | 196 +++++++++------------------------- 7 files changed, 152 insertions(+), 374 deletions(-) diff --git a/src/modules/SX127x/SX1272.cpp b/src/modules/SX127x/SX1272.cpp index 1221bb27..1b31f25b 100644 --- a/src/modules/SX127x/SX1272.cpp +++ b/src/modules/SX127x/SX1272.cpp @@ -7,53 +7,34 @@ SX1272::SX1272(Module* mod) : SX127x(mod) { int16_t SX1272::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, uint16_t preambleLength, uint8_t gain) { // execute common part int16_t state = SX127x::begin(SX1272_CHIP_VERSION, syncWord, currentLimit, preambleLength); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure settings not accessible by API state = config(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // mitigation of receiver spurious response // see SX1272/73 Errata, section 2.2 for details state = _mod->SPIsetRegValue(0x31, 0b10000000, 7, 7); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setGain(gain); - if(state != ERR_NONE) { - return(state); - } return(state); } @@ -61,26 +42,17 @@ int16_t SX1272::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync int16_t SX1272::beginFSK(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t currentLimit, uint16_t preambleLength, bool enableOOK) { // execute common part int16_t state = SX127x::beginFSK(SX1272_CHIP_VERSION, br, rxBw, freqDev, currentLimit, preambleLength, enableOOK); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure settings not accessible by API state = configFSK(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } return(state); } @@ -429,9 +401,7 @@ int16_t SX1272::setCodingRateRaw(uint8_t newCodingRate) { int16_t SX1272::configFSK() { // configure common registers int16_t state = SX127x::configFSK(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set fast PLL hop state = _mod->SPIsetRegValue(SX1272_REG_PLL_HOP, SX127X_FAST_HOP_ON, 7, 7); diff --git a/src/modules/SX127x/SX1273.cpp b/src/modules/SX127x/SX1273.cpp index a6b7a99a..ee0a48fc 100644 --- a/src/modules/SX127x/SX1273.cpp +++ b/src/modules/SX127x/SX1273.cpp @@ -1,66 +1,47 @@ #include "SX1273.h" SX1273::SX1273(Module* mod) : SX1272(mod) { - + } int16_t SX1273::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, uint16_t preambleLength, uint8_t gain) { // execute common part int16_t state = SX127x::begin(SX1272_CHIP_VERSION, syncWord, currentLimit, preambleLength); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure settings not accessible by API state = config(); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // mitigation of receiver spurious response // see SX1272/73 Errata, section 2.2 for details state = _mod->SPIsetRegValue(0x31, 0b10000000, 7, 7); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setGain(gain); - if(state != ERR_NONE) { - return(state); - } - + return(state); } int16_t SX1273::setSpreadingFactor(uint8_t sf) { uint8_t newSpreadingFactor; - + // check allowed spreading factor values switch(sf) { case 6: @@ -78,12 +59,12 @@ int16_t SX1273::setSpreadingFactor(uint8_t sf) { default: return(ERR_INVALID_SPREADING_FACTOR); } - + // set spreading factor and if successful, save the new setting int16_t state = setSpreadingFactorRaw(newSpreadingFactor); if(state == ERR_NONE) { SX127x::_sf = sf; } - + return(state); } diff --git a/src/modules/SX127x/SX1276.cpp b/src/modules/SX127x/SX1276.cpp index eb7da074..40a141a4 100644 --- a/src/modules/SX127x/SX1276.cpp +++ b/src/modules/SX127x/SX1276.cpp @@ -1,53 +1,36 @@ #include "SX1276.h" SX1276::SX1276(Module* mod) : SX1278(mod) { - + } int16_t SX1276::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, uint16_t preambleLength, uint8_t gain) { // execute common part int16_t state = SX127x::begin(SX1278_CHIP_VERSION, syncWord, currentLimit, preambleLength); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure settings not accessible by API state = config(); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setGain(gain); - if(state != ERR_NONE) { - return(state); - } - + return(state); } @@ -56,7 +39,7 @@ int16_t SX1276::setFrequency(float freq) { if((freq < 137.0) || (freq > 1020.0)) { return(ERR_INVALID_FREQUENCY); } - + // SX1276/77/78 Errata fixes if(getActiveModem() == SX127X_LORA) { // sensitivity optimization for 500kHz bandwidth @@ -70,7 +53,7 @@ int16_t SX1276::setFrequency(float freq) { _mod->SPIwriteRegister(0x3a, 0x7F); } } - + // mitigation of receiver spurious response // see SX1276/77/78 Errata, section 2.3 for details if(abs(_bw - 7.8) <= 0.001) { @@ -119,7 +102,7 @@ int16_t SX1276::setFrequency(float freq) { _mod->SPIsetRegValue(0x31, 0b1000000, 7, 7); } } - + // set frequency return(SX127x::setFrequencyRaw(freq)); } diff --git a/src/modules/SX127x/SX1277.cpp b/src/modules/SX127x/SX1277.cpp index 406bf2c6..bed5a84e 100644 --- a/src/modules/SX127x/SX1277.cpp +++ b/src/modules/SX127x/SX1277.cpp @@ -1,53 +1,36 @@ #include "SX1277.h" SX1277::SX1277(Module* mod) : SX1278(mod) { - + } int16_t SX1277::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, uint16_t preambleLength, uint8_t gain) { // execute common part int16_t state = SX127x::begin(SX1278_CHIP_VERSION, syncWord, currentLimit, preambleLength); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure settings not accessible by API state = config(); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setGain(gain); - if(state != ERR_NONE) { - return(state); - } - + return(state); } @@ -56,7 +39,7 @@ int16_t SX1277::setFrequency(float freq) { if((freq < 137.0) || (freq > 1020.0)) { return(ERR_INVALID_FREQUENCY); } - + // SX1276/77/78 Errata fixes if(getActiveModem() == SX127X_LORA) { // sensitivity optimization for 500kHz bandwidth @@ -70,7 +53,7 @@ int16_t SX1277::setFrequency(float freq) { _mod->SPIwriteRegister(0x3a, 0x7F); } } - + // mitigation of receiver spurious response // see SX1276/77/78 Errata, section 2.3 for details if(abs(_bw - 7.8) <= 0.001) { @@ -119,14 +102,14 @@ int16_t SX1277::setFrequency(float freq) { _mod->SPIsetRegValue(0x31, 0b1000000, 7, 7); } } - + // set frequency and if successful, save the new setting return(SX127x::setFrequencyRaw(freq)); } int16_t SX1277::setSpreadingFactor(uint8_t sf) { uint8_t newSpreadingFactor; - + // check allowed spreading factor values switch(sf) { case 6: @@ -144,12 +127,12 @@ int16_t SX1277::setSpreadingFactor(uint8_t sf) { default: return(ERR_INVALID_SPREADING_FACTOR); } - + // set spreading factor and if successful, save the new setting int16_t state = SX1278::setSpreadingFactorRaw(newSpreadingFactor); if(state == ERR_NONE) { SX127x::_sf = sf; } - + return(state); } diff --git a/src/modules/SX127x/SX1278.cpp b/src/modules/SX127x/SX1278.cpp index f56392be..b2ab0b3c 100644 --- a/src/modules/SX127x/SX1278.cpp +++ b/src/modules/SX127x/SX1278.cpp @@ -7,46 +7,29 @@ SX1278::SX1278(Module* mod) : SX127x(mod) { int16_t SX1278::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, uint16_t preambleLength, uint8_t gain) { // execute common part int16_t state = SX127x::begin(SX1278_CHIP_VERSION, syncWord, currentLimit, preambleLength); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure settings not accessible by API state = config(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setGain(gain); - if(state != ERR_NONE) { - return(state); - } return(state); } @@ -54,26 +37,17 @@ int16_t SX1278::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync int16_t SX1278::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t currentLimit, uint16_t preambleLength, bool enableOOK) { // execute common part int16_t state = SX127x::beginFSK(SX1278_CHIP_VERSION, br, freqDev, rxBw, currentLimit, preambleLength, enableOOK); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure settings not accessible by API state = configFSK(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } return(state); } @@ -505,9 +479,7 @@ int16_t SX1278::setCodingRateRaw(uint8_t newCodingRate) { int16_t SX1278::configFSK() { // configure common registers int16_t state = SX127x::configFSK(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set fast PLL hop state = _mod->SPIsetRegValue(SX1278_REG_PLL_HOP, SX127X_FAST_HOP_ON, 7, 7); diff --git a/src/modules/SX127x/SX1279.cpp b/src/modules/SX127x/SX1279.cpp index 5e7fd2ea..3468b0b1 100644 --- a/src/modules/SX127x/SX1279.cpp +++ b/src/modules/SX127x/SX1279.cpp @@ -1,53 +1,36 @@ #include "SX1279.h" SX1279::SX1279(Module* mod) : SX1278(mod) { - + } int16_t SX1279::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, uint16_t preambleLength, uint8_t gain) { // execute common part int16_t state = SX127x::begin(SX1278_CHIP_VERSION, syncWord, currentLimit, preambleLength); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure settings not accessible by API state = config(); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + // configure publicly accessible settings state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setBandwidth(bw); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setSpreadingFactor(sf); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setCodingRate(cr); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); + state = setGain(gain); - if(state != ERR_NONE) { - return(state); - } - + return(state); } @@ -56,7 +39,7 @@ int16_t SX1279::setFrequency(float freq) { if((freq < 137.0) || (freq > 960.0)) { return(ERR_INVALID_FREQUENCY); } - + // set frequency return(SX127x::setFrequencyRaw(freq)); } diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 866b82ef..4b168bd3 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -22,36 +22,26 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // check active modem if(getActiveModem() != SX127X_LORA) { // set LoRa mode state = setActiveModem(SX127X_LORA); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } // set LoRa sync word state = SX127x::setSyncWord(syncWord); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set over current protection state = SX127x::setCurrentLimit(currentLimit); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set preamble length state = SX127x::setPreambleLength(preambleLength); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // initalize internal variables _dataRate = 0.0; @@ -81,77 +71,52 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB if(getActiveModem() != SX127X_FSK_OOK) { // set FSK mode state = setActiveModem(SX127X_FSK_OOK); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } // set bit rate state = SX127x::setBitRate(br); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set frequency deviation state = SX127x::setFrequencyDeviation(freqDev); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set receiver bandwidth state = SX127x::setRxBandwidth(rxBw); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set over current protection state = SX127x::setCurrentLimit(currentLimit); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set preamble length state = SX127x::setPreambleLength(preambleLength); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // default sync word value 0x2D01 is the same as the default in LowPowerLab RFM69 library uint8_t syncWord[] = {0x2D, 0x01}; state = setSyncWord(syncWord, 2); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // disable address filtering state = disableAddressFiltering(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable/disable OOK state = setOOK(enableOOK); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set default RSSI measurement config state = setRSSIConfig(2); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set default encoding state = setEncoding(0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set default packet length mode state = variablePacketLengthMode(); - if (state != ERR_NONE) { - return(state); - } return(state); } @@ -186,9 +151,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { // start transmission state = startTransmit(data, len, addr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for packet transmission or timeout start = micros(); @@ -205,9 +168,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { // start transmission state = startTransmit(data, len, addr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for transmission end or timeout start = micros(); @@ -241,9 +202,7 @@ int16_t SX127x::receive(uint8_t* data, size_t len) { if(modem == SX127X_LORA) { // set mode to receive state = startReceive(len, SX127X_RXSINGLE); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for packet reception or timeout (100 LoRa symbols) while(!digitalRead(_mod->getIrq())) { @@ -259,9 +218,7 @@ int16_t SX127x::receive(uint8_t* data, size_t len) { // set mode to receive state = startReceive(len, SX127X_RX); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for packet reception or timeout uint32_t start = micros(); @@ -287,18 +244,18 @@ int16_t SX127x::scanChannel() { // set mode to standby int16_t state = setMode(SX127X_STANDBY); + RADIOLIB_ASSERT(state); // set DIO pin mapping - state |= _mod->SPIsetRegValue(SX127X_REG_DIO_MAPPING_1, SX127X_DIO0_CAD_DONE | SX127X_DIO1_CAD_DETECTED, 7, 4); + state = _mod->SPIsetRegValue(SX127X_REG_DIO_MAPPING_1, SX127X_DIO0_CAD_DONE | SX127X_DIO1_CAD_DETECTED, 7, 4); + RADIOLIB_ASSERT(state); // clear interrupt flags clearIRQFlags(); // set mode to CAD - state |= setMode(SX127X_CAD); - if(state != ERR_NONE) { - return(state); - } + state = setMode(SX127X_CAD); + RADIOLIB_ASSERT(state); // wait for channel activity detected or timeout while(!digitalRead(_mod->getIrq())) { @@ -341,9 +298,7 @@ int16_t SX127x::transmitDirect(uint32_t FRF) { // activate direct mode int16_t state = directMode(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // start transmitting return(setMode(SX127X_TX)); @@ -357,9 +312,7 @@ int16_t SX127x::receiveDirect() { // activate direct mode int16_t state = directMode(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // start receiving return(setMode(SX127X_RX)); @@ -368,16 +321,14 @@ int16_t SX127x::receiveDirect() { int16_t SX127x::directMode() { // set mode to standby int16_t state = setMode(SX127X_STANDBY); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set DIO mapping state = _mod->SPIsetRegValue(SX127X_REG_DIO_MAPPING_1, SX127X_DIO1_CONT_DCLK | SX127X_DIO2_CONT_DATA, 5, 2); + RADIOLIB_ASSERT(state); // set continuous mode - state |= _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_2, SX127X_DATA_MODE_CONTINUOUS, 6, 6); - return(state); + return(_mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_2, SX127X_DATA_MODE_CONTINUOUS, 6, 6)); } int16_t SX127x::packetMode() { @@ -409,9 +360,7 @@ int16_t SX127x::startReceive(uint8_t len, uint8_t mode) { // set FIFO pointers state |= _mod->SPIsetRegValue(SX127X_REG_FIFO_RX_BASE_ADDR, SX127X_FIFO_RX_BASE_ADDR_MAX); state |= _mod->SPIsetRegValue(SX127X_REG_FIFO_ADDR_PTR, SX127X_FIFO_RX_BASE_ADDR_MAX); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); } else if(modem == SX127X_FSK_OOK) { // set DIO pin mapping @@ -481,9 +430,7 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // start transmission state |= setMode(SX127X_TX); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); return(ERR_NONE); @@ -513,9 +460,7 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // start transmission state |= setMode(SX127X_TX); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); return(ERR_NONE); } @@ -613,9 +558,7 @@ int16_t SX127x::setCurrentLimit(uint8_t currentLimit) { int16_t SX127x::setPreambleLength(uint16_t preambleLength) { // set mode to standby int16_t state = setMode(SX127X_STANDBY); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // check active modem uint8_t modem = getActiveModem(); @@ -727,9 +670,7 @@ int16_t SX127x::setBitRate(float br) { // set mode to STANDBY int16_t state = setMode(SX127X_STANDBY); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set bit rate uint16_t bitRate = (SX127X_CRYSTAL_FREQ * 1000.0) / br; @@ -756,9 +697,7 @@ int16_t SX127x::setFrequencyDeviation(float freqDev) { // set mode to STANDBY int16_t state = setMode(SX127X_STANDBY); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set allowed frequency deviation uint32_t base = 1; @@ -781,9 +720,7 @@ int16_t SX127x::setRxBandwidth(float rxBw) { // set mode to STANDBY int16_t state = setMode(SX127X_STANDBY); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // calculate exponent and mantissa values for(uint8_t e = 7; e >= 1; e--) { @@ -792,9 +729,7 @@ int16_t SX127x::setRxBandwidth(float rxBw) { if(abs(rxBw - ((point / 1000.0) + 0.05)) <= 0.5) { // set Rx bandwidth during AFC state = _mod->SPIsetRegValue(SX127X_REG_AFC_BW, (m << 3) | e, 4, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set Rx bandwidth state = _mod->SPIsetRegValue(SX127X_REG_RX_BW, (m << 3) | e, 4, 0); @@ -830,9 +765,7 @@ int16_t SX127x::setSyncWord(uint8_t* syncWord, size_t len) { // enable sync word recognition int16_t state = _mod->SPIsetRegValue(SX127X_REG_SYNC_CONFIG, SX127X_SYNC_ON, 4, 4); state |= _mod->SPIsetRegValue(SX127X_REG_SYNC_CONFIG, len - 1, 2, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set sync word _mod->SPIwriteRegisterBurst(SX127X_REG_SYNC_VALUE_1, syncWord, len); @@ -847,9 +780,7 @@ int16_t SX127x::setNodeAddress(uint8_t nodeAddr) { // enable address filtering (node only) int16_t state = _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, SX127X_ADDRESS_FILTERING_NODE, 2, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set node address return(_mod->SPIsetRegValue(SX127X_REG_NODE_ADRS, nodeAddr)); @@ -863,9 +794,7 @@ int16_t SX127x::setBroadcastAddress(uint8_t broadAddr) { // enable address filtering (node + broadcast) int16_t state = _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, SX127X_ADDRESS_FILTERING_NODE_BROADCAST, 2, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set broadcast address return(_mod->SPIsetRegValue(SX127X_REG_BROADCAST_ADRS, broadAddr)); @@ -879,15 +808,11 @@ int16_t SX127x::disableAddressFiltering() { // disable address filtering int16_t state = _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, SX127X_ADDRESS_FILTERING_OFF, 2, 1); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set node address to default (0x00) state = _mod->SPIsetRegValue(SX127X_REG_NODE_ADRS, 0x00); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set broadcast address to default (0x00) return(_mod->SPIsetRegValue(SX127X_REG_BROADCAST_ADRS, 0x00)); @@ -967,9 +892,7 @@ int16_t SX127x::setRSSIConfig(uint8_t smoothingSamples, int8_t offset) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // check provided values if(!(smoothingSamples <= 7)) { @@ -1014,9 +937,7 @@ int16_t SX127x::config() { int16_t SX127x::configFSK() { // set RSSI threshold int16_t state = _mod->SPIsetRegValue(SX127X_REG_RSSI_THRESH, SX127X_RSSI_THRESHOLD); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // reset FIFO flag _mod->SPIwriteRegister(SX127X_REG_IRQ_FLAGS_2, SX127X_FLAG_FIFO_OVERRUN); @@ -1024,38 +945,27 @@ int16_t SX127x::configFSK() { // set packet configuration state = _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, SX127X_PACKET_VARIABLE | SX127X_DC_FREE_WHITENING | SX127X_CRC_ON | SX127X_CRC_AUTOCLEAR_ON | SX127X_ADDRESS_FILTERING_OFF | SX127X_CRC_WHITENING_TYPE_CCITT, 7, 0); state |= _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_2, SX127X_DATA_MODE_PACKET | SX127X_IO_HOME_OFF, 6, 5); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set preamble polarity state =_mod->SPIsetRegValue(SX127X_REG_SYNC_CONFIG, SX127X_PREAMBLE_POLARITY_55, 5, 5); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set FIFO threshold state = _mod->SPIsetRegValue(SX127X_REG_FIFO_THRESH, SX127X_TX_START_FIFO_NOT_EMPTY, 7, 7); state |= _mod->SPIsetRegValue(SX127X_REG_FIFO_THRESH, SX127X_FIFO_THRESH, 5, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // disable Rx timeouts state = _mod->SPIsetRegValue(SX127X_REG_RX_TIMEOUT_1, SX127X_TIMEOUT_RX_RSSI_OFF); state |= _mod->SPIsetRegValue(SX127X_REG_RX_TIMEOUT_2, SX127X_TIMEOUT_RX_PREAMBLE_OFF); state |= _mod->SPIsetRegValue(SX127X_REG_RX_TIMEOUT_3, SX127X_TIMEOUT_SIGNAL_SYNC_OFF); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable preamble detector and set preamble length state = _mod->SPIsetRegValue(SX127X_REG_PREAMBLE_DETECT, SX127X_PREAMBLE_DETECTOR_ON | SX127X_PREAMBLE_DETECTOR_2_BYTE | SX127X_PREAMBLE_DETECTOR_TOL); state |= _mod->SPIsetRegValue(SX127X_REG_PREAMBLE_MSB_FSK, SX127X_PREAMBLE_SIZE_MSB); state |= _mod->SPIsetRegValue(SX127X_REG_PREAMBLE_LSB_FSK, SX127X_PREAMBLE_SIZE_LSB); - if(state != ERR_NONE) { - return(state); - } return(state); } @@ -1073,15 +983,11 @@ int16_t SX127x::setPacketMode(uint8_t mode, uint8_t len) { // set to fixed packet length int16_t state = _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, mode, 7, 7); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set length to register state = _mod->SPIsetRegValue(SX127X_REG_PAYLOAD_LENGTH_FSK, len); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // update cached value _packetLengthConfig = mode; From 016fb0d462dd932b957849683ded6d486702179b Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:37:37 +0100 Subject: [PATCH 072/135] [XBee] Added assert macro --- src/modules/XBee/XBee.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/modules/XBee/XBee.cpp b/src/modules/XBee/XBee.cpp index 5c38a433..e8c1ceb7 100644 --- a/src/modules/XBee/XBee.cpp +++ b/src/modules/XBee/XBee.cpp @@ -173,9 +173,7 @@ int16_t XBee::setPanId(uint8_t* panId) { // get response code int16_t state = readApiFrame(frameID, 4); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // confirm changes return(confirmChanges()); @@ -343,9 +341,7 @@ int16_t XBee::confirmChanges() { // get response code int16_t state = readApiFrame(frameID, 4); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // apply changes frameID = _frameID++; @@ -353,9 +349,6 @@ int16_t XBee::confirmChanges() { // get response code state = readApiFrame(frameID, 4); - if(state != ERR_NONE) { - return(state); - } return(state); } From 204e1c7a0c24a6d1a29fc92b4f746ff867c0ebdc Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 16:37:44 +0100 Subject: [PATCH 073/135] [nRF24] Added assert macro --- src/modules/nRF24/nRF24.cpp | 105 +++++++++--------------------------- 1 file changed, 25 insertions(+), 80 deletions(-) diff --git a/src/modules/nRF24/nRF24.cpp b/src/modules/nRF24/nRF24.cpp index b7fc0b37..67a9b0e3 100644 --- a/src/modules/nRF24/nRF24.cpp +++ b/src/modules/nRF24/nRF24.cpp @@ -27,39 +27,25 @@ int16_t nRF24::begin(int16_t freq, int16_t dataRate, int8_t power, uint8_t addrW // configure settings inaccessible by public API int16_t state = config(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set mode to standby state = standby(); - if(state != ERR_NONE) { - return(state); - } - + RADIOLIB_ASSERT(state); // set frequency state = setFrequency(freq); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set data rate state = setDataRate(dataRate); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set output power state = setOutputPower(power); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set address width state = setAddressWidth(addrWidth); - if(state != ERR_NONE) { - return(state); - } return(state); } @@ -81,9 +67,7 @@ int16_t nRF24::standby() { int16_t nRF24::transmit(uint8_t* data, size_t len, uint8_t addr) { // start transmission int16_t state = startTransmit(data, len, addr); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait until transmission is finished uint32_t start = micros(); @@ -112,9 +96,7 @@ int16_t nRF24::transmit(uint8_t* data, size_t len, uint8_t addr) { int16_t nRF24::receive(uint8_t* data, size_t len) { // start reception int16_t state = startReceive(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // wait for Rx_DataReady or timeout uint32_t start = micros(); @@ -167,9 +149,7 @@ int16_t nRF24::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable primary Tx mode state = _mod->SPIsetRegValue(NRF24_REG_CONFIG, NRF24_PTX, 0, 0); @@ -179,9 +159,7 @@ int16_t nRF24::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // enable Tx_DataSent interrupt state |= _mod->SPIsetRegValue(NRF24_REG_CONFIG, NRF24_MASK_TX_DS_IRQ_ON, 5, 5); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // flush Tx FIFO SPItransfer(NRF24_CMD_FLUSH_TX); @@ -203,22 +181,16 @@ int16_t nRF24::startTransmit(uint8_t* data, size_t len, uint8_t addr) { int16_t nRF24::startReceive() { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable primary Rx mode state = _mod->SPIsetRegValue(NRF24_REG_CONFIG, NRF24_PRX, 0, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable Rx_DataReady interrupt clearIRQ(); - state |= _mod->SPIsetRegValue(NRF24_REG_CONFIG, NRF24_MASK_RX_DR_IRQ_ON, 6, 6); - if(state != ERR_NONE) { - return(state); - } + state = _mod->SPIsetRegValue(NRF24_REG_CONFIG, NRF24_MASK_RX_DR_IRQ_ON, 6, 6); + RADIOLIB_ASSERT(state); // flush Rx FIFO SPItransfer(NRF24_CMD_FLUSH_RX); @@ -235,9 +207,7 @@ int16_t nRF24::startReceive() { int16_t nRF24::readData(uint8_t* data, size_t len) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // get packet length size_t length = len; @@ -265,9 +235,7 @@ int16_t nRF24::setFrequency(int16_t freq) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set frequency uint8_t freqRaw = freq - 2400; @@ -278,9 +246,7 @@ int16_t nRF24::setFrequency(int16_t freq) { int16_t nRF24::setDataRate(int16_t dataRate) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set data rate if(dataRate == 250) { @@ -302,9 +268,7 @@ int16_t nRF24::setDataRate(int16_t dataRate) { int16_t nRF24::setOutputPower(int8_t power) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // check allowed values uint8_t powerRaw = 0; @@ -333,9 +297,7 @@ int16_t nRF24::setOutputPower(int8_t power) { int16_t nRF24::setAddressWidth(uint8_t addrWidth) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set address width switch(addrWidth) { @@ -366,9 +328,7 @@ int16_t nRF24::setAddressWidth(uint8_t addrWidth) { int16_t nRF24::setTransmitPipe(uint8_t* addr) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set transmit address _mod->SPIwriteRegisterBurst(NRF24_REG_TX_ADDR, addr, _addrWidth); @@ -382,9 +342,7 @@ int16_t nRF24::setTransmitPipe(uint8_t* addr) { int16_t nRF24::setReceivePipe(uint8_t pipeNum, uint8_t* addr) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // write full pipe 0 - 1 address and enable the pipe switch(pipeNum) { @@ -406,9 +364,7 @@ int16_t nRF24::setReceivePipe(uint8_t pipeNum, uint8_t* addr) { int16_t nRF24::setReceivePipe(uint8_t pipeNum, uint8_t addrByte) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // write unique pipe 2 - 5 address and enable the pipe switch(pipeNum) { @@ -438,9 +394,7 @@ int16_t nRF24::setReceivePipe(uint8_t pipeNum, uint8_t addrByte) { int16_t nRF24::disablePipe(uint8_t pipeNum) { // set mode to standby int16_t state = standby(); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); switch(pipeNum) { case 0: @@ -530,27 +484,18 @@ void nRF24::clearIRQ() { int16_t nRF24::config() { // enable 16-bit CRC int16_t state = _mod->SPIsetRegValue(NRF24_REG_CONFIG, NRF24_CRC_ON | NRF24_CRC_16, 3, 2); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // set 15 retries and delay 1500 (5*250) us _mod->SPIsetRegValue(NRF24_REG_SETUP_RETR, (5 << 4) | 5); - if(state != ERR_NONE) { - return(state); - } // set features: dynamic payload on, payload with ACK packets off, dynamic ACK off state = _mod->SPIsetRegValue(NRF24_REG_FEATURE, NRF24_DPL_ON | NRF24_ACK_PAY_OFF | NRF24_DYN_ACK_OFF, 2, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // enable dynamic payloads state = _mod->SPIsetRegValue(NRF24_REG_DYNPD, NRF24_DPL_ALL_ON, 5, 0); - if(state != ERR_NONE) { - return(state); - } + RADIOLIB_ASSERT(state); // reset IRQ clearIRQ(); From c40f382ed61f0d71ac15cd56b49fd326959c4ed7 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 17:06:00 +0100 Subject: [PATCH 074/135] Advanced version to 3.1.0 --- library.properties | 2 +- src/TypeDef.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index ad0dfbb0..60f6f794 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.0.0 +version=3.1.0 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index a77bf6fe..e1f17912 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -9,7 +9,7 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) -#define RADIOLIB_VERSION_MINOR (0x00) +#define RADIOLIB_VERSION_MINOR (0x01) #define RADIOLIB_VERSION_PATCH (0x00) #define RADIOLIB_VERSION_EXTRA (0x00) From d892320637033dbf34fc1d607e50af7d9d9cf643 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 14 Jan 2020 18:08:45 +0100 Subject: [PATCH 075/135] [SX126x] Added option to set LoRa sync word control bits --- src/modules/SX126x/SX126x.cpp | 4 ++-- src/modules/SX126x/SX126x.h | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index de081201..a4cb9eee 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -633,14 +633,14 @@ int16_t SX126x::setCodingRate(uint8_t cr) { return(setModulationParams(_sf, _bw, _cr)); } -int16_t SX126x::setSyncWord(uint8_t syncWord) { +int16_t SX126x::setSyncWord(uint8_t syncWord, uint8_t controlBits) { // check active modem if(getPacketType() != SX126X_PACKET_TYPE_LORA) { return(ERR_WRONG_MODEM); } // update register - uint8_t data[2] = {(uint8_t)((syncWord & 0xF0) | 0x04), (uint8_t)(((syncWord & 0x0F) << 4) | 0x04)}; + uint8_t data[2] = {(uint8_t)((syncWord & 0xF0) | ((controlBits & 0xF0) >> 4)), (uint8_t)(((syncWord & 0x0F) << 4) | (controlBits & 0x0F))}; return(writeRegister(SX126X_REG_LORA_SYNC_WORD_MSB, data, 2)); } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 8267f4cc..a0173da5 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -586,9 +586,11 @@ class SX126x: public PhysicalLayer { \param syncWord LoRa sync word to be set. + \param controlBits Undocumented control bits, required for compatibility purposes. + \returns \ref status_codes */ - int16_t setSyncWord(uint8_t syncWord); + int16_t setSyncWord(uint8_t syncWord, uint8_t controlBits = 0x44); /*! \brief Sets current protection limit. Can be set in 0.25 mA steps. From b2b0511da359bfc39334bbc06faf2006fe758d63 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 19 Jan 2020 13:25:16 +0100 Subject: [PATCH 076/135] [CC1101] Added missing calls to yield --- src/modules/CC1101/CC1101.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 3c2d8218..220957b9 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -92,10 +92,14 @@ int16_t CC1101::transmit(uint8_t* data, size_t len, uint8_t addr) { RADIOLIB_ASSERT(state); // wait for transmission start - while(!digitalRead(_mod->getIrq())); + while(!digitalRead(_mod->getIrq())) { + yield(); + } // wait for transmission end - while(digitalRead(_mod->getIrq())); + while(digitalRead(_mod->getIrq())) { + yield(); + } // set mode to standby standby(); @@ -112,10 +116,14 @@ int16_t CC1101::receive(uint8_t* data, size_t len) { RADIOLIB_ASSERT(state); // wait for sync word - while(!digitalRead(_mod->getIrq())); + while(!digitalRead(_mod->getIrq())) { + yield(); + } // wait for packet end - while(digitalRead(_mod->getIrq())); + while(digitalRead(_mod->getIrq())) { + yield(); + } // read packet data return(readData(data, len)); From e890e4f474f4180e8b621bf7f7facf0edb9d2757 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 19 Jan 2020 13:25:25 +0100 Subject: [PATCH 077/135] [SX126x] Added missing calls to yield --- src/modules/SX126x/SX126x.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index a4cb9eee..e5afba14 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -319,7 +319,9 @@ int16_t SX126x::scanChannel() { RADIOLIB_ASSERT(state); // wait for channel activity detected or timeout - while(!digitalRead(_mod->getIrq())); + while(!digitalRead(_mod->getIrq())) { + yield(); + } // check CAD result uint16_t cadResult = getIrqStatus(); @@ -417,7 +419,9 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { RADIOLIB_ASSERT(state); // wait for BUSY to go low (= PA ramp up done) - while(digitalRead(_mod->getGpio())); + while(digitalRead(_mod->getGpio())) { + yield(); + } return(state); } @@ -1453,7 +1457,9 @@ int16_t SX126x::config(uint8_t modem) { // wait for calibration completion delay(5); - while(digitalRead(_mod->getGpio())); + while(digitalRead(_mod->getGpio())) { + yield(); + } return(ERR_NONE); } From 1e2c5c10e1f4ca78cc35c6e2e90e5279772975e6 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 19 Jan 2020 14:11:34 +0100 Subject: [PATCH 078/135] Advanced version to 3.1.1 --- library.properties | 2 +- src/TypeDef.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 60f6f794..5febcc00 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.1.0 +version=3.1.1 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index e1f17912..5d46b0bc 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -10,7 +10,7 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) #define RADIOLIB_VERSION_MINOR (0x01) -#define RADIOLIB_VERSION_PATCH (0x00) +#define RADIOLIB_VERSION_PATCH (0x01) #define RADIOLIB_VERSION_EXTRA (0x00) #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) From 75335bdff33dd75b28ff35b62ef55fd1eda1d0cf Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 21 Jan 2020 14:48:52 +0100 Subject: [PATCH 079/135] [SX126x] Added missing default packet mode in FSK --- src/modules/SX126x/SX126x.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index e5afba14..fde974a3 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -127,6 +127,9 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit state = setWhitening(true, 0x0100); RADIOLIB_ASSERT(state); + state = variablePacketLengthMode(SX126X_MAX_PACKET_LENGTH); + RADIOLIB_ASSERT(state); + state = setDio2AsRfSwitch(false); return(state); From 58640e280145dfb58b925b737b83a84b0b2ff362 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 21 Jan 2020 15:29:05 +0100 Subject: [PATCH 080/135] [SX126x] Added option to read data even after CRC error --- src/modules/SX126x/SX126x.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index fde974a3..9498544c 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -534,9 +534,10 @@ int16_t SX126x::readData(uint8_t* data, size_t len) { // check integrity CRC uint16_t irq = getIrqStatus(); + int16_t crcState = ERR_NONE; if((irq & SX126X_IRQ_CRC_ERR) || (irq & SX126X_IRQ_HEADER_ERR)) { clearIrqStatus(); - return(ERR_CRC_MISMATCH); + crcState = ERR_CRC_MISMATCH; } // get packet length @@ -552,6 +553,9 @@ int16_t SX126x::readData(uint8_t* data, size_t len) { // clear interrupt flags state = clearIrqStatus(); + // check if CRC failed - this is done after reading data to give user the option to keep them + RADIOLIB_ASSERT(crcState); + return(state); } From 15532bada1de598d322abcc94be02ef4955214e1 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 21 Jan 2020 17:48:18 +0100 Subject: [PATCH 081/135] Advanced version to 3.1.2 --- library.properties | 2 +- src/TypeDef.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 5febcc00..26f5e91e 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.1.1 +version=3.1.2 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index 5d46b0bc..05319344 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -10,7 +10,7 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) #define RADIOLIB_VERSION_MINOR (0x01) -#define RADIOLIB_VERSION_PATCH (0x01) +#define RADIOLIB_VERSION_PATCH (0x02) #define RADIOLIB_VERSION_EXTRA (0x00) #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) From e800a0584c101a538ed87c9fd9be87574476bbdd Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 26 Jan 2020 09:06:09 +0100 Subject: [PATCH 082/135] [SX126x] Added missing assertion --- src/modules/SX126x/SX126x.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 9498544c..6325b15e 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1302,7 +1302,8 @@ int16_t SX126x::setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t } int16_t SX126x::setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength, uint8_t headerType, uint8_t invertIQ) { - fixInvertedIQ(invertIQ); + int16_t state = fixInvertedIQ(invertIQ); + RADIOLIB_ASSERT(state); uint8_t data[6] = {(uint8_t)((preambleLength >> 8) & 0xFF), (uint8_t)(preambleLength & 0xFF), headerType, payloadLength, crcType, invertIQ}; return(SPIwriteCommand(SX126X_CMD_SET_PACKET_PARAMS, data, 6)); } From 2ef331ed9c61a4755a4af93e962dc244d2431d11 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 26 Jan 2020 15:11:41 +0100 Subject: [PATCH 083/135] [SX126x] Added public methods to set regulator mode --- keywords.txt | 2 ++ src/modules/SX126x/SX126x.cpp | 29 ++++++++++++++++++++--------- src/modules/SX126x/SX126x.h | 15 +++++++++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/keywords.txt b/keywords.txt index 5feb6969..9195919a 100644 --- a/keywords.txt +++ b/keywords.txt @@ -123,6 +123,8 @@ setSyncBits KEYWORD2 setWhitening KEYWORD2 startReceiveDutyCycle KEYWORD2 startReceiveDutyCycleAuto KEYWORD2 +setRegulatorLDO KEYWORD2 +setRegulatorDCDC KEYWORD2 # ESP8266 join KEYWORD2 diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 6325b15e..0b6c832c 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -63,6 +63,9 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float // set publicly accessible settings that are not a part of begin method state = setDio2AsRfSwitch(true); + RADIOLIB_ASSERT(state); + + state = setRegulatorDCDC(); return(state); } @@ -1076,11 +1079,19 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } int16_t SX126x::implicitHeader(size_t len) { - return(setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len)); + return(setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len)); } int16_t SX126x::explicitHeader() { - return(setHeaderType(SX126X_LORA_HEADER_EXPLICIT)); + return(setHeaderType(SX126X_LORA_HEADER_EXPLICIT)); +} + +int16_t SX126x::setRegulatorLDO() { + return(setRegulatorMode(SX126X_REGULATOR_LDO)); +} + +int16_t SX126x::setRegulatorDCDC() { + return(setRegulatorMode(SX126X_REGULATOR_DC_DC)); } int16_t SX126x::setTCXO(float voltage, uint32_t delay) { @@ -1320,6 +1331,11 @@ int16_t SX126x::setBufferBaseAddress(uint8_t txBaseAddress, uint8_t rxBaseAddres return(SPIwriteCommand(SX126X_CMD_SET_BUFFER_BASE_ADDRESS, data, 2)); } +int16_t SX126x::setRegulatorMode(uint8_t mode) { + uint8_t data[1] = {mode}; + return(SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1)); +} + uint8_t SX126x::getStatus() { uint8_t data = 0; SPIreadCommand(SX126X_CMD_GET_STATUS, &data, 1); @@ -1422,17 +1438,12 @@ int16_t SX126x::fixInvertedIQ(uint8_t iqConfig) { } int16_t SX126x::config(uint8_t modem) { - // set regulator mode - uint8_t data[7]; - data[0] = SX126X_REGULATOR_DC_DC; - int16_t state = SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1); - RADIOLIB_ASSERT(state); - // reset buffer base address - state = setBufferBaseAddress(); + int16_t state = setBufferBaseAddress(); RADIOLIB_ASSERT(state); // set modem + uint8_t data[7]; data[0] = modem; state = SPIwriteCommand(SX126X_CMD_SET_PACKET_TYPE, data, 1); RADIOLIB_ASSERT(state); diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index a0173da5..44504926 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -807,6 +807,20 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ int16_t explicitHeader(); + + /*! + \brief Set regulator mode to LDO. + + \returns \ref status_codes + */ + int16_t setRegulatorLDO(); + + /*! + \brief Set regulator mode to DC-DC. + + \returns \ref status_codes + */ + int16_t setRegulatorDCDC(); #ifndef RADIOLIB_GODMODE protected: #endif @@ -831,6 +845,7 @@ class SX126x: public PhysicalLayer { int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength, uint8_t headerType, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); int16_t setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t packetType = SX126X_GFSK_PACKET_VARIABLE, uint8_t payloadLength = 0xFF, uint8_t preambleDetectorLength = SX126X_GFSK_PREAMBLE_DETECT_16); int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00); + int16_t setRegulatorMode(uint8_t mode); uint8_t getStatus(); uint32_t getPacketStatus(); uint16_t getDeviceErrors(); From f316920babb8a4dda4e2b13392e4406a15cbad72 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 26 Jan 2020 15:19:08 +0100 Subject: [PATCH 084/135] [SX126x] Removed setOptimalHiPowerPaConfig --- src/modules/SX126x/SX1262.cpp | 6 ------ src/modules/SX126x/SX1268.cpp | 4 ---- src/modules/SX126x/SX126x.cpp | 24 ------------------------ src/modules/SX126x/SX126x.h | 1 - 4 files changed, 35 deletions(-) diff --git a/src/modules/SX126x/SX1262.cpp b/src/modules/SX126x/SX1262.cpp index 6078817b..06b2c12b 100644 --- a/src/modules/SX126x/SX1262.cpp +++ b/src/modules/SX126x/SX1262.cpp @@ -84,12 +84,6 @@ int16_t SX1262::setOutputPower(int8_t power) { int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); RADIOLIB_ASSERT(state); - // this function sets the optimal PA settings - // and adjusts power based on the PA settings chosen - // so that output power matches requested power. - state = SX126x::setOptimalHiPowerPaConfig(&power); - RADIOLIB_ASSERT(state); - // set output power // TODO power ramp time configuration state = SX126x::setTxParams(power); diff --git a/src/modules/SX126x/SX1268.cpp b/src/modules/SX126x/SX1268.cpp index c58651a5..fa449682 100644 --- a/src/modules/SX126x/SX1268.cpp +++ b/src/modules/SX126x/SX1268.cpp @@ -77,10 +77,6 @@ int16_t SX1268::setOutputPower(int8_t power) { int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); RADIOLIB_ASSERT(state); - // enable optimal PA - this changes the value of power. - state = SX126x::setOptimalHiPowerPaConfig(&power); - RADIOLIB_ASSERT(state); - // set output power // TODO power ramp time configuration state = SX126x::setTxParams(power); diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 0b6c832c..96712ac4 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1229,30 +1229,6 @@ int16_t SX126x::setTxParams(uint8_t power, uint8_t rampTime) { return(SPIwriteCommand(SX126X_CMD_SET_TX_PARAMS, data, 2)); } -int16_t SX126x::setOptimalHiPowerPaConfig(int8_t * inOutPower) { - // set PA config for optimal consumption as described in section 13-21 of SX1268 datasheet v1.1 - // the final column of Table 13-21 suggests that the value passed in SetTxParams - // is actually scaled depending on the parameters of setPaConfig - int16_t state; - if (*inOutPower >= 21) { - state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262_8, SX126X_PA_CONFIG_HP_MAX/*0x07*/); - } - else if (*inOutPower >= 18) { - state = SX126x::setPaConfig(0x03, SX126X_PA_CONFIG_SX1262_8, 0x05); - // datasheet instructs request 22 dBm for 20 dBm actual output power - *inOutPower += 2; - } else if (*inOutPower >= 15) { - state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262_8, 0x03); - // datasheet instructs request 22 dBm for 17 dBm actual output power - *inOutPower += 5; - } else { - state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262_8, 0x02); - // datasheet instructs request 22 dBm for 14 dBm actual output power. - *inOutPower += 8; - } - return state; -} - int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { // check active modem if(getPacketType() != SX126X_PACKET_TYPE_GFSK) { diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 44504926..9d7c4719 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -853,7 +853,6 @@ class SX126x: public PhysicalLayer { int16_t startReceiveCommon(); int16_t setFrequencyRaw(float freq); - int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); int16_t setPacketMode(uint8_t mode, uint8_t len); int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF); From b93aa3f38e24ffd47b784fd46c3cc1bfd3e383b7 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 26 Jan 2020 18:53:46 +0100 Subject: [PATCH 085/135] [SX126x] Added missing calls to setPaConfig --- src/modules/SX126x/SX1261.cpp | 23 ++++------------------- src/modules/SX126x/SX1261.h | 2 +- src/modules/SX126x/SX1262.cpp | 4 ++++ src/modules/SX126x/SX1262.h | 3 +++ src/modules/SX126x/SX1268.cpp | 4 ++++ 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/modules/SX126x/SX1261.cpp b/src/modules/SX126x/SX1261.cpp index 1b08605f..dcf34fac 100644 --- a/src/modules/SX126x/SX1261.cpp +++ b/src/modules/SX126x/SX1261.cpp @@ -1,7 +1,6 @@ #include "SX1261.h" -SX1261::SX1261(Module* mod) - : SX1262(mod) { +SX1261::SX1261(Module* mod): SX1262(mod) { } @@ -16,7 +15,8 @@ int16_t SX1261::setOutputPower(int8_t power) { int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); RADIOLIB_ASSERT(state); - state = setOptimalLowPowerPaConfig(&power); + // set PA config + state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1261, 0x00); RADIOLIB_ASSERT(state); // set output power @@ -25,20 +25,5 @@ int16_t SX1261::setOutputPower(int8_t power) { RADIOLIB_ASSERT(state); // restore OCP configuration - return writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); -} - -int16_t SX1261::setOptimalLowPowerPaConfig(int8_t* inOutPower) -{ - int16_t state; - if (*inOutPower > 10) { - state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1261, 0x00); - } - else { - state = SX126x::setPaConfig(0x01, SX126X_PA_CONFIG_SX1261, 0x00); - // changing the PaConfig means output power is now scaled so we get 3 dB less than requested. - // see datasheet table 13-21 and comments in setOptimalHiPowerPaConfig. - *inOutPower -= 3; - } - return state; + return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); } diff --git a/src/modules/SX126x/SX1261.h b/src/modules/SX126x/SX1261.h index 3331c1bc..2dca7ed1 100644 --- a/src/modules/SX126x/SX1261.h +++ b/src/modules/SX126x/SX1261.h @@ -35,7 +35,7 @@ class SX1261 : public SX1262 { #ifndef RADIOLIB_GODMODE private: #endif - int16_t setOptimalLowPowerPaConfig(int8_t* inOutPower); + }; diff --git a/src/modules/SX126x/SX1262.cpp b/src/modules/SX126x/SX1262.cpp index 06b2c12b..1ce7df83 100644 --- a/src/modules/SX126x/SX1262.cpp +++ b/src/modules/SX126x/SX1262.cpp @@ -84,6 +84,10 @@ int16_t SX1262::setOutputPower(int8_t power) { int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); RADIOLIB_ASSERT(state); + // set PA config + state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262); + RADIOLIB_ASSERT(state); + // set output power // TODO power ramp time configuration state = SX126x::setTxParams(power); diff --git a/src/modules/SX126x/SX1262.h b/src/modules/SX126x/SX1262.h index 3f3b9cc5..d4527227 100644 --- a/src/modules/SX126x/SX1262.h +++ b/src/modules/SX126x/SX1262.h @@ -5,6 +5,9 @@ #include "../../Module.h" #include "SX126x.h" +//SX126X_CMD_SET_PA_CONFIG +#define SX126X_PA_CONFIG_SX1262 0x00 + /*! \class SX1262 diff --git a/src/modules/SX126x/SX1268.cpp b/src/modules/SX126x/SX1268.cpp index fa449682..55f66d2c 100644 --- a/src/modules/SX126x/SX1268.cpp +++ b/src/modules/SX126x/SX1268.cpp @@ -77,6 +77,10 @@ int16_t SX1268::setOutputPower(int8_t power) { int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); RADIOLIB_ASSERT(state); + // set PA config + state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1268); + RADIOLIB_ASSERT(state); + // set output power // TODO power ramp time configuration state = SX126x::setTxParams(power); From 4231edee706759d29ef31f201e4110c7e2cf00f9 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 26 Jan 2020 18:54:38 +0100 Subject: [PATCH 086/135] [SX126x] Added missing call to setRegulator --- src/modules/SX126x/SX126x.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 96712ac4..23668161 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -134,6 +134,9 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit RADIOLIB_ASSERT(state); state = setDio2AsRfSwitch(false); + RADIOLIB_ASSERT(state); + + state = setRegulatorDCDC(); return(state); } From 362dde44b0bfb9da5316924a12a27f428bc84794 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 26 Jan 2020 18:55:04 +0100 Subject: [PATCH 087/135] [SX126x] Added SPI transaction delay for fast platforms --- src/modules/SX126x/SX126x.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 23668161..b3405914 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1605,6 +1605,13 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d RADIOLIB_VERBOSE_PRINTLN(); } RADIOLIB_VERBOSE_PRINTLN(); + #else + // some faster platforms require a short delay here + // not sure why, but it seems that long enough SPI transaction + // (e.g. setPacketParams for GFSK) will fail without it + #if defined(ARDUINO_ARCH_STM32) + delay(1); + #endif #endif // parse status From f336922013c62f7d050cf25743344fc95998928e Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 27 Jan 2020 09:13:39 +0100 Subject: [PATCH 088/135] [SX126x] Added missing OCP range check --- src/modules/SX126x/SX126x.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index b3405914..291cc715 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -662,6 +662,11 @@ int16_t SX126x::setSyncWord(uint8_t syncWord, uint8_t controlBits) { } int16_t SX126x::setCurrentLimit(float currentLimit) { + // check allowed range + if(!((currentLimit >= 0) && (currentLimit <= 140))) { + return(ERR_INVALID_CURRENT_LIMIT); + } + // calculate raw value uint8_t rawLimit = (uint8_t)(currentLimit / 2.5); From ff97f3957bc5cd92b5085827aaaf7aef508def93 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 27 Jan 2020 09:30:44 +0100 Subject: [PATCH 089/135] [SX126x] Added method to get currently configured OCP --- keywords.txt | 1 + src/modules/SX126x/SX126x.cpp | 9 +++++++++ src/modules/SX126x/SX126x.h | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/keywords.txt b/keywords.txt index 9195919a..d312388d 100644 --- a/keywords.txt +++ b/keywords.txt @@ -125,6 +125,7 @@ startReceiveDutyCycle KEYWORD2 startReceiveDutyCycleAuto KEYWORD2 setRegulatorLDO KEYWORD2 setRegulatorDCDC KEYWORD2 +getCurrentLimit KEYWORD2 # ESP8266 join KEYWORD2 diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 291cc715..2441615f 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -674,6 +674,15 @@ int16_t SX126x::setCurrentLimit(float currentLimit) { return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &rawLimit, 1)); } +float SX126x::getCurrentLimit() { + // get the raw value + uint8_t ocp = 0; + readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + + // return the actual value + return((float)ocp * 2.5); +} + int16_t SX126x::setPreambleLength(uint16_t preambleLength) { uint8_t modem = getPacketType(); if(modem == SX126X_PACKET_TYPE_LORA) { diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 9d7c4719..16c0e85b 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -601,6 +601,13 @@ class SX126x: public PhysicalLayer { */ int16_t setCurrentLimit(float currentLimit); + /*! + \brief Reads current protection limit. + + \returns Currently configured overcurrent protection limit in mA. + */ + float getCurrentLimit(); + /*! \brief Sets preamble length for LoRa or FSK modem. Allowed values range from 1 to 65535. From 030fa1001e8b960c99bd45d0eeb3a85c2f818fa2 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 28 Jan 2020 12:11:19 +0100 Subject: [PATCH 090/135] Advanced version to 3.2.0 --- library.properties | 2 +- src/TypeDef.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library.properties b/library.properties index 26f5e91e..4a8ad367 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.1.2 +version=3.2.0 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index 05319344..02c3ef68 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -9,8 +9,8 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) -#define RADIOLIB_VERSION_MINOR (0x01) -#define RADIOLIB_VERSION_PATCH (0x02) +#define RADIOLIB_VERSION_MINOR (0x02) +#define RADIOLIB_VERSION_PATCH (0x00) #define RADIOLIB_VERSION_EXTRA (0x00) #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) From 81fe2d09f814b265feb4600f9071540a257a363e Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Tue, 28 Jan 2020 14:12:16 +0000 Subject: [PATCH 091/135] [SX126x] Parameter to use LDO in begin() See https://github.com/jgromes/RadioLib/commit/4231edee706759d29ef31f201e4110c7e2cf00f9 for context. --- src/modules/SX126x/SX126x.cpp | 16 ++++++++++++---- src/modules/SX126x/SX126x.h | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 2441615f..1e659e6c 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -4,7 +4,7 @@ SX126x::SX126x(Module* mod) : PhysicalLayer(SX126X_CRYSTAL_FREQ, SX126X_DIV_EXPO _mod = mod; } -int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { +int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { // set module properties _mod->init(RADIOLIB_USE_SPI); Module::pinMode(_mod->getIrq(), INPUT); @@ -65,12 +65,16 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float state = setDio2AsRfSwitch(true); RADIOLIB_ASSERT(state); - state = setRegulatorDCDC(); + if (useRegulatorLDO) { + state = setRegulatorLDO(); + } else { + state = setRegulatorDCDC(); + } return(state); } -int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage) { +int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage, bool useRegulatorLDO) { // set module properties _mod->init(RADIOLIB_USE_SPI); Module::pinMode(_mod->getIrq(), INPUT); @@ -136,7 +140,11 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit state = setDio2AsRfSwitch(false); RADIOLIB_ASSERT(state); - state = setRegulatorDCDC(); + if (useRegulatorLDO) { + state = setRegulatorLDO(); + } else { + state = setRegulatorDCDC(); + } return(state); } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 16c0e85b..9c92a03e 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -369,9 +369,11 @@ class SX126x: public PhysicalLayer { \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 1.6 V, set to 0 to skip. + \param useRegulatorLDO use the LDO instead of DC-DC converter (default false). This is necessary for some modules such as the LAMBDA from RF solutions. + \returns \ref status_codes */ - int16_t begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage); + int16_t begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float currentLimit, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO = false); /*! \brief Initialization method for FSK modem. @@ -390,9 +392,11 @@ class SX126x: public PhysicalLayer { \param tcxoVoltage TCXO reference voltage to be set on DIO3. Defaults to 1.6 V, set to 0 to skip. + \param useRegulatorLDO use the LDO instead of DC-DC converter (default false). This is necessary for some modules such as the LAMBDA from RF solutions. + \returns \ref status_codes */ - int16_t beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage); + int16_t beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage, bool useRegulatorLDO = false); /*! \brief Reset method. Will reset the chip to the default state using RST pin. From ea85a663142591add23b761e31513efe4d7242f4 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Tue, 28 Jan 2020 15:01:14 +0000 Subject: [PATCH 092/135] [SX126x] Pass useRegulatorLDO to SX1262/SX1261/SX1268 --- src/modules/SX126x/SX1262.cpp | 8 ++++---- src/modules/SX126x/SX1262.h | 4 ++-- src/modules/SX126x/SX1268.cpp | 8 ++++---- src/modules/SX126x/SX1268.h | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/modules/SX126x/SX1262.cpp b/src/modules/SX126x/SX1262.cpp index 1ce7df83..3a9d211a 100644 --- a/src/modules/SX126x/SX1262.cpp +++ b/src/modules/SX126x/SX1262.cpp @@ -4,9 +4,9 @@ SX1262::SX1262(Module* mod) : SX126x(mod) { } -int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { +int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { // execute common part - int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage); + int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage, useRegulatorLDO); RADIOLIB_ASSERT(state); // configure publicly accessible settings @@ -21,9 +21,9 @@ int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync return(state); } -int16_t SX1262::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage) { +int16_t SX1262::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage, bool useRegulatorLDO) { // execute common part - int16_t state = SX126x::beginFSK(br, freqDev, rxBw, currentLimit, preambleLength, dataShaping, tcxoVoltage); + int16_t state = SX126x::beginFSK(br, freqDev, rxBw, currentLimit, preambleLength, dataShaping, tcxoVoltage, useRegulatorLDO); RADIOLIB_ASSERT(state); // configure publicly accessible settings diff --git a/src/modules/SX126x/SX1262.h b/src/modules/SX126x/SX1262.h index d4527227..e33f568b 100644 --- a/src/modules/SX126x/SX1262.h +++ b/src/modules/SX126x/SX1262.h @@ -47,7 +47,7 @@ class SX1262: public SX126x { \returns \ref status_codes */ - int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6); + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); /*! \brief Initialization method for FSK modem. @@ -72,7 +72,7 @@ class SX1262: public SX126x { \returns \ref status_codes */ - int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 156.2, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 16, float dataShaping = 0.5, float tcxoVoltage = 1.6); + int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 156.2, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 16, float dataShaping = 0.5, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); // configuration methods diff --git a/src/modules/SX126x/SX1268.cpp b/src/modules/SX126x/SX1268.cpp index 55f66d2c..b6daa489 100644 --- a/src/modules/SX126x/SX1268.cpp +++ b/src/modules/SX126x/SX1268.cpp @@ -4,9 +4,9 @@ SX1268::SX1268(Module* mod) : SX126x(mod) { } -int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage) { +int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, float currentLimit, uint16_t preambleLength, float tcxoVoltage, bool useRegulatorLDO) { // execute common part - int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage); + int16_t state = SX126x::begin(bw, sf, cr, syncWord, currentLimit, preambleLength, tcxoVoltage, useRegulatorLDO); RADIOLIB_ASSERT(state); // configure publicly accessible settings @@ -20,9 +20,9 @@ int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync return(state); } -int16_t SX1268::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage) { +int16_t SX1268::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, float currentLimit, uint16_t preambleLength, float dataShaping, float tcxoVoltage, bool useRegulatorLDO) { // execute common part - int16_t state = SX126x::beginFSK(br, freqDev, rxBw, currentLimit, preambleLength, dataShaping, tcxoVoltage); + int16_t state = SX126x::beginFSK(br, freqDev, rxBw, currentLimit, preambleLength, dataShaping, tcxoVoltage, useRegulatorLDO); RADIOLIB_ASSERT(state); // configure publicly accessible settings diff --git a/src/modules/SX126x/SX1268.h b/src/modules/SX126x/SX1268.h index cb481705..5b203b72 100644 --- a/src/modules/SX126x/SX1268.h +++ b/src/modules/SX126x/SX1268.h @@ -47,7 +47,7 @@ class SX1268: public SX126x { \returns \ref status_codes */ - int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6); + int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX126X_SYNC_WORD_PRIVATE, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 8, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); /*! \brief Initialization method for FSK modem. @@ -72,7 +72,7 @@ class SX1268: public SX126x { \returns \ref status_codes */ - int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 156.2, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 16, float dataShaping = 0.5, float tcxoVoltage = 1.6); + int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 156.2, int8_t power = 14, float currentLimit = 60.0, uint16_t preambleLength = 16, float dataShaping = 0.5, float tcxoVoltage = 1.6, bool useRegulatorLDO = false); // configuration methods From 05313b01c6e14c815b8e177ea51f6519a46a960d Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 28 Jan 2020 17:17:28 +0100 Subject: [PATCH 093/135] [SX126x] Added note about regulator mode to examples --- .../SX126x_Channel_Activity_Detection.ino | 1 + examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino | 1 + examples/SX126x/SX126x_Receive/SX126x_Receive.ino | 1 + .../SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino | 3 ++- examples/SX126x/SX126x_Settings/SX126x_Settings.ino | 1 + examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino | 1 + .../SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino | 1 + 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino b/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino index 62981785..a8953906 100644 --- a/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino +++ b/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino @@ -40,6 +40,7 @@ void setup() { // current limit: 60 mA // preamble length: 8 symbols // TCXO voltage: 1.6 V (set to 0 to not use TCXO) + // regulator: DC-DC (set to true to use LDO) // CRC: enabled int state = lora.begin(); if (state == ERR_NONE) { diff --git a/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino b/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino index 8efb8e25..e3e04627 100644 --- a/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino +++ b/examples/SX126x/SX126x_FSK_Modem/SX126x_FSK_Modem.ino @@ -41,6 +41,7 @@ void setup() { // preamble length: 16 bits // data shaping: Gaussian, BT = 0.5 // TCXO voltage: 1.6 V (set to 0 to not use TCXO) + // regulator: DC-DC (set to true to use LDO) // sync word: 0x2D 0x01 // CRC: enabled, CRC16 (CCIT) int state = fsk.beginFSK(); diff --git a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino index cef823a6..5546e618 100644 --- a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino +++ b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino @@ -45,6 +45,7 @@ void setup() { // current limit: 60 mA // preamble length: 8 symbols // TCXO voltage: 1.6 V (set to 0 to not use TCXO) + // regulator: DC-DC (set to true to use LDO) // CRC: enabled int state = lora.begin(); if (state == ERR_NONE) { diff --git a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino index c07fa9c7..e0cd16f6 100644 --- a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino +++ b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino @@ -46,6 +46,7 @@ void setup() { // current limit: 60 mA // preamble length: 8 symbols // TCXO voltage: 1.6 V (set to 0 to not use TCXO) + // regulator: DC-DC (set to true to use LDO) // CRC: enabled int state = lora.begin(); if (state == ERR_NONE) { @@ -119,7 +120,7 @@ void loop() { // you can also read received data as byte array /* byte byteArr[8]; - int state = lora.receive(byteArr, 8); + int state = lora.readData(byteArr, 8); */ if (state == ERR_NONE) { diff --git a/examples/SX126x/SX126x_Settings/SX126x_Settings.ino b/examples/SX126x/SX126x_Settings/SX126x_Settings.ino index f26a590b..92ef6d3b 100644 --- a/examples/SX126x/SX126x_Settings/SX126x_Settings.ino +++ b/examples/SX126x/SX126x_Settings/SX126x_Settings.ino @@ -56,6 +56,7 @@ void setup() { // current limit: 60 mA // preamble length: 8 symbols // TCXO voltage: 1.6 V (set to 0 to not use TCXO) + // regulator: DC-DC (set to true to use LDO) // CRC: enabled int state = loraSX1262.begin(); if (state == ERR_NONE) { diff --git a/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino b/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino index 084e11a6..574fdff3 100644 --- a/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino +++ b/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino @@ -41,6 +41,7 @@ void setup() { // current limit: 60 mA // preamble length: 8 symbols // TCXO voltage: 1.6 V (set to 0 to not use TCXO) + // regulator: DC-DC (set to true to use LDO) // CRC: enabled int state = lora.begin(); if (state == ERR_NONE) { diff --git a/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino b/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino index 2996f12c..d9a52053 100644 --- a/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino +++ b/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino @@ -41,6 +41,7 @@ void setup() { // current limit: 60 mA // preamble length: 8 symbols // TCXO voltage: 1.6 V (set to 0 to not use TCXO) + // regulator: DC-DC (set to true to use LDO) // CRC: enabled int state = lora.begin(); if (state == ERR_NONE) { From 7b10bd4e0f9327ef34a8c10b4fded1a61521332c Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 28 Jan 2020 17:18:02 +0100 Subject: [PATCH 094/135] Advanced version to 3.2.1 --- library.properties | 2 +- src/TypeDef.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 4a8ad367..208add37 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.2.0 +version=3.2.1 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index 02c3ef68..8590eb5c 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -10,7 +10,7 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) #define RADIOLIB_VERSION_MINOR (0x02) -#define RADIOLIB_VERSION_PATCH (0x00) +#define RADIOLIB_VERSION_PATCH (0x01) #define RADIOLIB_VERSION_EXTRA (0x00) #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) From c49323fa7829e7f09af53e5ddc33b09a2de58ef0 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Wed, 29 Jan 2020 15:00:36 +0000 Subject: [PATCH 095/135] Prevent spurious resets on some boards My receiver was failing to receive after a random amount of time (2 - 60 seconds). I discovered some power supply issues (DC-DC converter related) that turned out to be another cause of the same problem but only on some boards. The reset procedure for most of the boards that RadioLib can drive changes the pin mode of the reset line to an input after reset, effectively tri-stating the output. I had seen this but dismissed it after checking that the SX126x has a pullup on NRST meaning this was not an issue. The receiver I have produced uses a level converter to translate the 5v0 signals to 3v3. The level converters are not themselves pulled up or down, which means when a pin is connected in a high-impedance input state it will float around possibly randomly. This can cause spurious resets on my board, and possibly others. I remembered the reset procedure when I realised I could reproduce the problem by rubbing the board on my shirt, probably causing some ESD to trigger a change on the reset line. This PR simply removes the lines that change the pinmode to input after reset leaving it as an output which is hard-driven and the safest way. I assume that the current behaviour was chosen to decrease the chance of a conflict if used incorrectly. --- src/modules/RF69/RF69.cpp | 1 - src/modules/SX126x/SX126x.cpp | 1 - src/modules/SX127x/SX127x.cpp | 1 - src/modules/XBee/XBee.cpp | 1 - 4 files changed, 4 deletions(-) diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index a5d42d0d..48807f00 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -95,7 +95,6 @@ void RF69::reset() { Module::digitalWrite(_mod->getRst(), HIGH); delayMicroseconds(100); Module::digitalWrite(_mod->getRst(), LOW); - Module::pinMode(_mod->getRst(), INPUT); delay(10); } diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 1e659e6c..1f18a617 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -155,7 +155,6 @@ int16_t SX126x::reset(bool verify) { Module::digitalWrite(_mod->getRst(), LOW); delayMicroseconds(150); Module::digitalWrite(_mod->getRst(), HIGH); - Module::pinMode(_mod->getRst(), INPUT); // return immediately when verification is disabled if(!verify) { diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 4b168bd3..b645cbc3 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -126,7 +126,6 @@ void SX127x::reset() { Module::digitalWrite(_mod->getRst(), LOW); delayMicroseconds(100); Module::digitalWrite(_mod->getRst(), HIGH); - Module::pinMode(_mod->getRst(), INPUT); delay(5); } diff --git a/src/modules/XBee/XBee.cpp b/src/modules/XBee/XBee.cpp index e8c1ceb7..1e5d7a15 100644 --- a/src/modules/XBee/XBee.cpp +++ b/src/modules/XBee/XBee.cpp @@ -56,7 +56,6 @@ void XBee::reset() { digitalWrite(_mod->getRst(), LOW); delayMicroseconds(200); digitalWrite(_mod->getRst(), HIGH); - pinMode(_mod->getRst(), INPUT); } int16_t XBee::transmit(uint8_t* dest, const char* payload, uint8_t radius) { From 235fdb16376883b9d2091409c2f3c0e1da1c84d8 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 2 Feb 2020 11:13:23 +0100 Subject: [PATCH 096/135] [SX126x] Fixed implicit timeout workaround applied in explicit mode --- src/modules/SX126x/SX126x.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 1f18a617..46d311cb 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -286,9 +286,11 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { } } - // timeout fix is recommended after any reception with active timeout - state = fixImplicitTimeout(); - RADIOLIB_ASSERT(state); + // fix timeout in implicit LoRa mode + if(((_headerType == SX126X_LORA_HEADER_IMPLICIT) && (getPacketType() == SX126X_PACKET_TYPE_LORA))) { + state = fixImplicitTimeout(); + RADIOLIB_ASSERT(state); + } // read the received data return(readData(data, len)); @@ -1402,6 +1404,11 @@ int16_t SX126x::fixImplicitTimeout() { // fixes timeout in implicit header mode // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.3 for details + //check if we're in implicit LoRa mode + if(!((_headerType == SX126X_LORA_HEADER_IMPLICIT) && (getPacketType() == SX126X_PACKET_TYPE_LORA))) { + return(ERR_WRONG_MODEM); + } + // stop RTC counter uint8_t rtcStop = 0x00; int16_t state = writeRegister(SX126X_REG_RTC_STOP, &rtcStop, 1); From cfd6e3e10587a6855e6396378503c97010210037 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 2 Feb 2020 11:20:01 +0100 Subject: [PATCH 097/135] [SX126x] Fixed incorrect sync word in comments --- .../SX126x_Channel_Activity_Detection.ino | 2 +- examples/SX126x/SX126x_Receive/SX126x_Receive.ino | 2 +- .../SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino | 2 +- examples/SX126x/SX126x_Settings/SX126x_Settings.ino | 4 ++-- .../SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino b/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino index a8953906..99209b99 100644 --- a/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino +++ b/examples/SX126x/SX126x_Channel_Activity_Detection/SX126x_Channel_Activity_Detection.ino @@ -35,7 +35,7 @@ void setup() { // bandwidth: 125.0 kHz // spreading factor: 9 // coding rate: 7 - // sync word: 0x1424 (private network) + // sync word: 0x12 (private network) // output power: 14 dBm // current limit: 60 mA // preamble length: 8 symbols diff --git a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino index 5546e618..c95592f0 100644 --- a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino +++ b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino @@ -40,7 +40,7 @@ void setup() { // bandwidth: 125.0 kHz // spreading factor: 9 // coding rate: 7 - // sync word: 0x1424 (private network) + // sync word: 0x12 (private network) // output power: 14 dBm // current limit: 60 mA // preamble length: 8 symbols diff --git a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino index e0cd16f6..59d49f53 100644 --- a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino +++ b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino @@ -41,7 +41,7 @@ void setup() { // bandwidth: 125.0 kHz // spreading factor: 9 // coding rate: 7 - // sync word: 0x1424 (private network) + // sync word: 0x12 (private network) // output power: 14 dBm // current limit: 60 mA // preamble length: 8 symbols diff --git a/examples/SX126x/SX126x_Settings/SX126x_Settings.ino b/examples/SX126x/SX126x_Settings/SX126x_Settings.ino index 92ef6d3b..3c8a3e5e 100644 --- a/examples/SX126x/SX126x_Settings/SX126x_Settings.ino +++ b/examples/SX126x/SX126x_Settings/SX126x_Settings.ino @@ -51,7 +51,7 @@ void setup() { // bandwidth: 125.0 kHz // spreading factor: 9 // coding rate: 7 - // sync word: 0x1424 (private network) + // sync word: 0x12 (private network) // output power: 14 dBm // current limit: 60 mA // preamble length: 8 symbols @@ -76,7 +76,7 @@ void setup() { // bandwidth: 500.0 kHz // spreading factor: 6 // coding rate: 5 - // sync word: 0x3444 (public network) + // sync word: 0x34 (public network) // output power: 2 dBm // current limit: 50 mA // preamble length: 20 symbols diff --git a/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino b/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino index d9a52053..157f00a1 100644 --- a/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino +++ b/examples/SX126x/SX126x_Transmit_Interrupt/SX126x_Transmit_Interrupt.ino @@ -36,7 +36,7 @@ void setup() { // bandwidth: 125.0 kHz // spreading factor: 9 // coding rate: 7 - // sync word: 0x1424 (private network) + // sync word: 0x12 (private network) // output power: 14 dBm // current limit: 60 mA // preamble length: 8 symbols From 74f78ae2a25182a0d1e23f456debabd1f68a3525 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 2 Feb 2020 11:30:04 +0100 Subject: [PATCH 098/135] Advanced version to 3.2.2 --- library.properties | 2 +- src/TypeDef.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 208add37..57c360ae 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.2.1 +version=3.2.2 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index 8590eb5c..6de3bf35 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -10,7 +10,7 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) #define RADIOLIB_VERSION_MINOR (0x02) -#define RADIOLIB_VERSION_PATCH (0x01) +#define RADIOLIB_VERSION_PATCH (0x02) #define RADIOLIB_VERSION_EXTRA (0x00) #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) From d99e050b97e4e5e391999ae29ab9c5734a999eae Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 6 Feb 2020 13:30:51 +0100 Subject: [PATCH 099/135] [SX126x] Fixed SNR calculation for SNR les than 0 --- src/modules/SX126x/SX126x.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 46d311cb..7cea5d77 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1051,7 +1051,11 @@ float SX126x::getSNR() { // get last packet SNR from packet status uint32_t packetStatus = getPacketStatus(); uint8_t snrPkt = (packetStatus >> 8) & 0xFF; - return(snrPkt/4.0); + if(snrPkt < 128) { + return(snrPkt/4.0); + } else { + return((snrPkt - 256)/4.0); + } } size_t SX126x::getPacketLength(bool update) { From b382a280a2b1f26c04692db92e65e2aba72a2d2c Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 6 Feb 2020 14:07:00 +0100 Subject: [PATCH 100/135] Advanced version to 3.2.3 --- library.properties | 2 +- src/TypeDef.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 57c360ae..3a715a5c 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.2.2 +version=3.2.3 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index 6de3bf35..dc4dcd7c 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -10,7 +10,7 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) #define RADIOLIB_VERSION_MINOR (0x02) -#define RADIOLIB_VERSION_PATCH (0x02) +#define RADIOLIB_VERSION_PATCH (0x03) #define RADIOLIB_VERSION_EXTRA (0x00) #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) From 318de480abd12642121137a44477b3c2cf4e876e Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 7 Feb 2020 18:31:51 +0100 Subject: [PATCH 101/135] Reworked PhysicalLayer to accept frequency step directly --- src/modules/CC1101/CC1101.cpp | 2 +- src/modules/CC1101/CC1101.h | 3 ++- src/modules/RF69/RF69.cpp | 2 +- src/modules/RF69/RF69.h | 3 ++- src/modules/SX126x/SX126x.cpp | 2 +- src/modules/SX126x/SX126x.h | 3 ++- src/modules/SX127x/SX127x.cpp | 2 +- src/modules/SX127x/SX127x.h | 5 +++-- src/modules/nRF24/nRF24.cpp | 2 +- src/modules/nRF24/nRF24.h | 5 ++--- src/protocols/Morse/Morse.cpp | 2 +- src/protocols/PhysicalLayer/PhysicalLayer.cpp | 13 ++++------- src/protocols/PhysicalLayer/PhysicalLayer.h | 22 +++++-------------- src/protocols/RTTY/RTTY.cpp | 4 ++-- 14 files changed, 29 insertions(+), 41 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 220957b9..a094c09e 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -1,6 +1,6 @@ #include "CC1101.h" -CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_EXPONENT, CC1101_MAX_PACKET_LENGTH) { +CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_FREQUENCY_STEP_SIZE, CC1101_MAX_PACKET_LENGTH) { _mod = module; _packetLengthQueried = false; _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 0568de8f..3e8f3673 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -7,9 +7,10 @@ #include "../../protocols/PhysicalLayer/PhysicalLayer.h" // CC1101 physical layer properties +#define CC1101_FREQUENCY_STEP_SIZE 396.7285156 +#define CC1101_MAX_PACKET_LENGTH 63 #define CC1101_CRYSTAL_FREQ 26.0 #define CC1101_DIV_EXPONENT 16 -#define CC1101_MAX_PACKET_LENGTH 63 // CC1101 SPI commands #define CC1101_CMD_READ 0b10000000 diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 48807f00..11c50c7f 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -1,6 +1,6 @@ #include "RF69.h" -RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT, RF69_MAX_PACKET_LENGTH) { +RF69::RF69(Module* module) : PhysicalLayer(RF69_FREQUENCY_STEP_SIZE, RF69_MAX_PACKET_LENGTH) { _mod = module; _tempOffset = 0; diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h index 4b35e817..44f5020a 100644 --- a/src/modules/RF69/RF69.h +++ b/src/modules/RF69/RF69.h @@ -7,9 +7,10 @@ #include "../../protocols/PhysicalLayer/PhysicalLayer.h" // RF69 physical layer properties +#define RF69_FREQUENCY_STEP_SIZE 61.03515625 +#define RF69_MAX_PACKET_LENGTH 64 #define RF69_CRYSTAL_FREQ 32.0 #define RF69_DIV_EXPONENT 19 -#define RF69_MAX_PACKET_LENGTH 64 // RF69 register map #define RF69_REG_FIFO 0x00 diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 7cea5d77..2a9e4423 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1,6 +1,6 @@ #include "SX126x.h" -SX126x::SX126x(Module* mod) : PhysicalLayer(SX126X_CRYSTAL_FREQ, SX126X_DIV_EXPONENT, SX126X_MAX_PACKET_LENGTH) { +SX126x::SX126x(Module* mod) : PhysicalLayer(SX126X_FREQUENCY_STEP_SIZE, SX126X_MAX_PACKET_LENGTH) { _mod = mod; } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 9c92a03e..f28e7d92 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -7,9 +7,10 @@ #include "../../protocols/PhysicalLayer/PhysicalLayer.h" // SX126X physical layer properties +#define SX126X_FREQUENCY_STEP_SIZE 0.9536743164 +#define SX126X_MAX_PACKET_LENGTH 255 #define SX126X_CRYSTAL_FREQ 32.0 #define SX126X_DIV_EXPONENT 25 -#define SX126X_MAX_PACKET_LENGTH 255 // SX126X SPI commands // operational modes commands diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index b645cbc3..36e4f857 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1,6 +1,6 @@ #include "SX127x.h" -SX127x::SX127x(Module* mod) : PhysicalLayer(SX127X_CRYSTAL_FREQ, SX127X_DIV_EXPONENT, SX127X_MAX_PACKET_LENGTH) { +SX127x::SX127x(Module* mod) : PhysicalLayer(SX127X_FREQUENCY_STEP_SIZE, SX127X_MAX_PACKET_LENGTH) { _mod = mod; _packetLengthQueried = false; } diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 26ea958c..d48e9e30 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -7,10 +7,11 @@ #include "../../protocols/PhysicalLayer/PhysicalLayer.h" // SX127x physical layer properties -#define SX127X_CRYSTAL_FREQ 32.0 -#define SX127X_DIV_EXPONENT 19 +#define SX127X_FREQUENCY_STEP_SIZE 61.03515625 #define SX127X_MAX_PACKET_LENGTH 255 #define SX127X_MAX_PACKET_LENGTH_FSK 64 +#define SX127X_CRYSTAL_FREQ 32.0 +#define SX127X_DIV_EXPONENT 19 // SX127x series common LoRa registers #define SX127X_REG_FIFO 0x00 diff --git a/src/modules/nRF24/nRF24.cpp b/src/modules/nRF24/nRF24.cpp index 67a9b0e3..725e9265 100644 --- a/src/modules/nRF24/nRF24.cpp +++ b/src/modules/nRF24/nRF24.cpp @@ -1,6 +1,6 @@ #include "nRF24.h" -nRF24::nRF24(Module* mod) : PhysicalLayer(NRF24_CRYSTAL_FREQ, NRF24_DIV_EXPONENT, NRF24_MAX_PACKET_LENGTH) { +nRF24::nRF24(Module* mod) : PhysicalLayer(NRF24_FREQUENCY_STEP_SIZE, NRF24_MAX_PACKET_LENGTH) { _mod = mod; } diff --git a/src/modules/nRF24/nRF24.h b/src/modules/nRF24/nRF24.h index 1e1b3823..e7e536b5 100644 --- a/src/modules/nRF24/nRF24.h +++ b/src/modules/nRF24/nRF24.h @@ -6,9 +6,8 @@ #include "../../protocols/PhysicalLayer/PhysicalLayer.h" -// nRF24 physical layer properties (dummy only) -#define NRF24_CRYSTAL_FREQ 1.0 -#define NRF24_DIV_EXPONENT 0 +// nRF24 physical layer properties +#define NRF24_FREQUENCY_STEP_SIZE 1000000.0 #define NRF24_MAX_PACKET_LENGTH 32 // nRF24 SPI commands diff --git a/src/protocols/Morse/Morse.cpp b/src/protocols/Morse/Morse.cpp index 0dbfd768..6b3e0c16 100644 --- a/src/protocols/Morse/Morse.cpp +++ b/src/protocols/Morse/Morse.cpp @@ -6,7 +6,7 @@ MorseClient::MorseClient(PhysicalLayer* phy) { int16_t MorseClient::begin(float base, uint8_t speed) { // calculate 24-bit frequency - _base = (base * (uint32_t(1) << _phy->getDivExponent())) / _phy->getCrystalFreq(); + _base = (base * 1000000.0) / _phy->getFreqStep(); // calculate dot length (assumes PARIS as typical word) _dotLength = 1200 / speed; diff --git a/src/protocols/PhysicalLayer/PhysicalLayer.cpp b/src/protocols/PhysicalLayer/PhysicalLayer.cpp index 75425fd8..0fc34b5b 100644 --- a/src/protocols/PhysicalLayer/PhysicalLayer.cpp +++ b/src/protocols/PhysicalLayer/PhysicalLayer.cpp @@ -1,8 +1,7 @@ #include "PhysicalLayer.h" -PhysicalLayer::PhysicalLayer(float crysFreq, uint8_t divExp, size_t maxPacketLength) { - _crystalFreq = crysFreq; - _divExponent = divExp; +PhysicalLayer::PhysicalLayer(float freqStep, size_t maxPacketLength) { + _freqStep = freqStep; _maxPacketLength = maxPacketLength; } @@ -141,10 +140,6 @@ int16_t PhysicalLayer::receive(String& str, size_t len) { return(state); } -float PhysicalLayer::getCrystalFreq() { - return(_crystalFreq); -} - -uint8_t PhysicalLayer::getDivExponent() { - return(_divExponent); +float PhysicalLayer::getFreqStep() { + return(_freqStep); } diff --git a/src/protocols/PhysicalLayer/PhysicalLayer.h b/src/protocols/PhysicalLayer/PhysicalLayer.h index 38f2974d..93872ebd 100644 --- a/src/protocols/PhysicalLayer/PhysicalLayer.h +++ b/src/protocols/PhysicalLayer/PhysicalLayer.h @@ -18,13 +18,11 @@ class PhysicalLayer { /*! \brief Default constructor. - \param crysFreq Frequency of crystal oscillator inside the module in MHz. - - \param divExp Exponent of module frequency divider. + \param freqStep Frequency step of the synthesizer in Hz. \param maxPacketLength Maximum length of packet that can be received by the module- */ - PhysicalLayer(float crysFreq, uint8_t divExp, size_t maxPacketLength); + PhysicalLayer(float freqStep, size_t maxPacketLength); // basic methods @@ -193,18 +191,11 @@ class PhysicalLayer { virtual int16_t setFrequencyDeviation(float freqDev) = 0; /*! - \brief Gets the module crystal oscillator frequency that was set in constructor. + \brief Gets the module frequency step size that was set in constructor. - \returns Crystal oscillator frequency in MHz. + \returns Synthesizer frequency step size in Hz. */ - float getCrystalFreq(); - - /*! - \brief Gets the module frequency divider exponent that was set in constructor. - - \returns Frequency divider exponent. - */ - uint8_t getDivExponent(); + float getFreqStep(); /*! \brief Query modem for the packet length of received payload. @@ -218,8 +209,7 @@ class PhysicalLayer { #ifndef RADIOLIB_GODMODE private: #endif - float _crystalFreq; - uint8_t _divExponent; + float _freqStep; size_t _maxPacketLength; }; diff --git a/src/protocols/RTTY/RTTY.cpp b/src/protocols/RTTY/RTTY.cpp index 0ea4e06f..c5eebe6c 100644 --- a/src/protocols/RTTY/RTTY.cpp +++ b/src/protocols/RTTY/RTTY.cpp @@ -131,7 +131,7 @@ int16_t RTTYClient::begin(float base, uint32_t shift, uint16_t rate, uint8_t enc _bitDuration = (uint32_t)1000000/rate; // calculate module carrier frequency resolution - uint32_t step = round((_phy->getCrystalFreq() * 1000000) / (uint32_t(1) << _phy->getDivExponent())); + uint32_t step = round(_phy->getFreqStep()); // check minimum shift value if(shift < step / 2) { @@ -146,7 +146,7 @@ int16_t RTTYClient::begin(float base, uint32_t shift, uint16_t rate, uint8_t enc } // calculate 24-bit frequency - _base = (base * (uint32_t(1) << _phy->getDivExponent())) / _phy->getCrystalFreq(); + _base = (base * 1000000.0) / _phy->getFreqStep(); // set module frequency deviation to 0 int16_t state = _phy->setFrequencyDeviation(0); From 106012b323a03cd26fc319c4c19e5adc03ff6dd4 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 8 Feb 2020 08:42:25 +0100 Subject: [PATCH 102/135] [SX127x] Fixed incorrect OOK data shaping on SX1272 (#110) --- src/modules/SX127x/SX1272.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX127x/SX1272.cpp b/src/modules/SX127x/SX1272.cpp index 1b31f25b..d5bb554c 100644 --- a/src/modules/SX127x/SX1272.cpp +++ b/src/modules/SX127x/SX1272.cpp @@ -298,13 +298,13 @@ int16_t SX1272::setDataShapingOOK(uint8_t sh) { // set data shaping switch(sh) { case 0: - state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1272_NO_SHAPING, 4, 3); + state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_NO_SHAPING, 4, 3); break; case 1: - state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1272_OOK_FILTER_BR, 4, 3); + state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_OOK_FILTER_BR, 4, 3); break; case 2: - state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1272_OOK_FILTER_2BR, 4, 3); + state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_OOK_FILTER_2BR, 4, 3); break; default: state = ERR_INVALID_DATA_SHAPING; From 3bb70ff3614b21c3018480c7ad693679fadc0eec Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 11 Feb 2020 14:26:14 +0100 Subject: [PATCH 103/135] [CC1101] Swapped frequency deviation and rx bandwdith in begin method --- examples/CC1101/CC1101_Receive/CC1101_Receive.ino | 2 +- .../CC1101_Receive_Address/CC1101_Receive_Address.ino | 2 +- .../CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino | 4 ++-- examples/CC1101/CC1101_Settings/CC1101_Settings.ino | 6 +++--- examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino | 2 +- .../CC1101_Transmit_Address/CC1101_Transmit_Address.ino | 2 +- .../CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino | 6 +++--- src/modules/CC1101/CC1101.cpp | 2 +- src/modules/CC1101/CC1101.h | 6 +++--- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/CC1101/CC1101_Receive/CC1101_Receive.ino b/examples/CC1101/CC1101_Receive/CC1101_Receive.ino index 7282bf00..e36c1d9a 100644 --- a/examples/CC1101/CC1101_Receive/CC1101_Receive.ino +++ b/examples/CC1101/CC1101_Receive/CC1101_Receive.ino @@ -34,8 +34,8 @@ void setup() { Serial.print(F("[CC1101] Initializing ... ")); // carrier frequency: 868.0 MHz // bit rate: 4.8 kbps - // Rx bandwidth: 325.0 kHz // frequency deviation: 48.0 kHz + // Rx bandwidth: 325.0 kHz // sync word: 0xD391 int state = cc.begin(); if (state == ERR_NONE) { diff --git a/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino b/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino index b1faf2a6..4cbd10f2 100644 --- a/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino +++ b/examples/CC1101/CC1101_Receive_Address/CC1101_Receive_Address.ino @@ -32,8 +32,8 @@ void setup() { Serial.print(F("[CC1101] Initializing ... ")); // carrier frequency: 868.0 MHz // bit rate: 4.8 kbps - // Rx bandwidth: 325.0 kHz // frequency deviation: 48.0 kHz + // Rx bandwidth: 325.0 kHz // sync word: 0xD391 int state = cc.begin(); if (state == ERR_NONE) { diff --git a/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino b/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino index 756c7031..46f3279d 100644 --- a/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino +++ b/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino @@ -37,8 +37,8 @@ void setup() { Serial.print(F("[CC1101] Initializing ... ")); // carrier frequency: 868.0 MHz // bit rate: 4.8 kbps - // Rx bandwidth: 325.0 kHz // frequency deviation: 48.0 kHz + // Rx bandwidth: 325.0 kHz // sync word: 0xD391 int state = cc.begin(); if (state == ERR_NONE) { @@ -111,7 +111,7 @@ void loop() { // you can also read received data as byte array /* byte byteArr[8]; - int state = cc.receive(byteArr, 8); + int state = cc.readData(byteArr, 8); */ if (state == ERR_NONE) { diff --git a/examples/CC1101/CC1101_Settings/CC1101_Settings.ino b/examples/CC1101/CC1101_Settings/CC1101_Settings.ino index 3854d675..74b2b3b1 100644 --- a/examples/CC1101/CC1101_Settings/CC1101_Settings.ino +++ b/examples/CC1101/CC1101_Settings/CC1101_Settings.ino @@ -43,8 +43,8 @@ void setup() { Serial.print(F("[CC1101] Initializing ... ")); // carrier frequency: 868.0 MHz // bit rate: 4.8 kbps - // Rx bandwidth: 325.0 kHz // frequency deviation: 48.0 kHz + // Rx bandwidth: 325.0 kHz // sync word: 0xD391 int state = cc1.begin(); if (state == ERR_NONE) { @@ -59,10 +59,10 @@ void setup() { Serial.print(F("[CC1101] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 32.0 kbps - // Rx bandwidth: 250.0 kHz // frequency deviation: 60.0 kHz + // Rx bandwidth: 250.0 kHz // sync word: 0xD391 - state = cc2.begin(434.0, 32.0, 250.0, 60.0); + state = cc2.begin(434.0, 32.0, 60.0, 250.0); if (state == ERR_NONE) { Serial.println(F("success!")); } else { diff --git a/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino b/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino index 8c9803aa..104fe2bb 100644 --- a/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino +++ b/examples/CC1101/CC1101_Transmit/CC1101_Transmit.ino @@ -32,8 +32,8 @@ void setup() { Serial.print(F("[CC1101] Initializing ... ")); // carrier frequency: 868.0 MHz // bit rate: 4.8 kbps - // Rx bandwidth: 325.0 kHz // frequency deviation: 48.0 kHz + // Rx bandwidth: 325.0 kHz // sync word: 0xD391 int state = cc.begin(); if (state == ERR_NONE) { diff --git a/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino b/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino index 0f600f36..7e130920 100644 --- a/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino +++ b/examples/CC1101/CC1101_Transmit_Address/CC1101_Transmit_Address.ino @@ -32,8 +32,8 @@ void setup() { Serial.print(F("[CC1101] Initializing ... ")); // carrier frequency: 868.0 MHz // bit rate: 4.8 kbps - // Rx bandwidth: 325.0 kHz // frequency deviation: 48.0 kHz + // Rx bandwidth: 325.0 kHz // sync word: 0xD391 int state = cc.begin(); if (state == ERR_NONE) { diff --git a/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino b/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino index dfdb35f7..dde5d54d 100644 --- a/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino +++ b/examples/CC1101/CC1101_Transmit_Interrupt/CC1101_Transmit_Interrupt.ino @@ -36,8 +36,8 @@ void setup() { Serial.print(F("[CC1101] Initializing ... ")); // carrier frequency: 868.0 MHz // bit rate: 4.8 kbps - // Rx bandwidth: 325.0 kHz // frequency deviation: 48.0 kHz + // Rx bandwidth: 325.0 kHz // sync word: 0xD391 int state = cc.begin(); if (state == ERR_NONE) { @@ -63,7 +63,7 @@ void setup() { /* byte byteArr[] = {0x01, 0x23, 0x45, 0x56, 0x78, 0xAB, 0xCD, 0xEF}; - state = cc.transmit(byteArr, 8); + state = cc.startTransmit(byteArr, 8); */ } @@ -125,7 +125,7 @@ void loop() { /* byte byteArr[] = {0x01, 0x23, 0x45, 0x56, 0x78, 0xAB, 0xCD, 0xEF}; - int state = cc.transmit(byteArr, 8); + int state = cc.startTransmit(byteArr, 8); */ // we're ready to send more packets, diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index a094c09e..87304e4f 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -9,7 +9,7 @@ CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_FREQUENCY_STEP_SIZE, CC110 _syncWordLength = 2; } -int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t preambleLength) { +int16_t CC1101::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLength) { // set module properties _mod->SPIreadCommand = CC1101_CMD_READ; _mod->SPIwriteCommand = CC1101_CMD_WRITE; diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 3e8f3673..338e9bdb 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -525,17 +525,17 @@ class CC1101: public PhysicalLayer { \param br Bit rate to be used in kbps. Defaults to 4.8 kbps. - \param rxBw Receiver bandwidth in kHz. Defaults to 325.0 kHz. - \param freqDev Frequency deviation from carrier frequency in kHz Defaults to 48.0 kHz. + \param rxBw Receiver bandwidth in kHz. Defaults to 325.0 kHz. + \param power Output power in dBm. Defaults to 0 dBm. \param preambleLength Preamble Length in bytes. Defaults to 4 bytes. \returns \ref status_codes */ - int16_t begin(float freq = 868.0, float br = 4.8, float rxBw = 325.0, float freqDev = 48.0, int8_t power = 0, uint8_t preambleLength = 4); + int16_t begin(float freq = 868.0, float br = 4.8, float freqDev = 48.0, float rxBw = 325.0, int8_t power = 0, uint8_t preambleLength = 4); /*! \brief Blocking binary transmit method. From 32602307b741dce78c7e8da5f272d1f845b30e13 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 11 Feb 2020 14:27:00 +0100 Subject: [PATCH 104/135] [RF69] Swapped frequency deviation and rx bandwdith in begin method --- examples/RF69/RF69_Receive/RF69_Receive.ino | 2 +- examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino | 2 +- .../RF69/RF69_Receive_Address/RF69_Receive_Address.ino | 2 +- .../RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino | 4 ++-- examples/RF69/RF69_Settings/RF69_Settings.ino | 6 +++--- examples/RF69/RF69_Transmit/RF69_Transmit.ino | 2 +- examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino | 2 +- .../RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino | 2 +- .../RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino | 8 ++++---- src/modules/RF69/RF69.cpp | 2 +- src/modules/RF69/RF69.h | 6 +++--- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/examples/RF69/RF69_Receive/RF69_Receive.ino b/examples/RF69/RF69_Receive/RF69_Receive.ino index e45e45c0..597ee63e 100644 --- a/examples/RF69/RF69_Receive/RF69_Receive.ino +++ b/examples/RF69/RF69_Receive/RF69_Receive.ino @@ -33,8 +33,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf.begin(); diff --git a/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino b/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino index 9fb3a5c6..7c947cf0 100644 --- a/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino +++ b/examples/RF69/RF69_Receive_AES/RF69_Receive_AES.ino @@ -29,8 +29,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf.begin(); diff --git a/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino b/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino index d1095ba3..86e1ebbc 100644 --- a/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino +++ b/examples/RF69/RF69_Receive_Address/RF69_Receive_Address.ino @@ -31,8 +31,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf.begin(); diff --git a/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino b/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino index e25dc64b..2e8929ac 100644 --- a/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino +++ b/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino @@ -29,8 +29,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf.begin(); @@ -104,7 +104,7 @@ void loop() { // you can also read received data as byte array /* byte byteArr[8]; - int state = lora.receive(byteArr, 8); + int state = lora.readData(byteArr, 8); */ if (state == ERR_NONE) { diff --git a/examples/RF69/RF69_Settings/RF69_Settings.ino b/examples/RF69/RF69_Settings/RF69_Settings.ino index d4f5a158..2fee90ba 100644 --- a/examples/RF69/RF69_Settings/RF69_Settings.ino +++ b/examples/RF69/RF69_Settings/RF69_Settings.ino @@ -41,8 +41,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf1.begin(); @@ -58,11 +58,11 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 868.0 MHz // bit rate: 300.0 kbps - // Rx bandwidth: 250.0 kHz // frequency deviation: 60.0 kHz + // Rx bandwidth: 250.0 kHz // output power: 17 dBm // sync word: 0x2D01 - state = rf2.begin(868.0, 300.0, 250.0, 60.0, 17); + state = rf2.begin(868.0, 300.0, 60.0, 250.0, 17); if (state == ERR_NONE) { Serial.println(F("success!")); } else { diff --git a/examples/RF69/RF69_Transmit/RF69_Transmit.ino b/examples/RF69/RF69_Transmit/RF69_Transmit.ino index 8e6fea55..05879c0b 100644 --- a/examples/RF69/RF69_Transmit/RF69_Transmit.ino +++ b/examples/RF69/RF69_Transmit/RF69_Transmit.ino @@ -31,8 +31,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf.begin(); diff --git a/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino b/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino index 03f98a2e..a9ec4ff5 100644 --- a/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino +++ b/examples/RF69/RF69_Transmit_AES/RF69_Transmit_AES.ino @@ -29,8 +29,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf.begin(); diff --git a/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino b/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino index 69e7d102..b9b36870 100644 --- a/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino +++ b/examples/RF69/RF69_Transmit_Address/RF69_Transmit_Address.ino @@ -31,8 +31,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf.begin(); diff --git a/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino b/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino index 59dd02fb..0387849a 100644 --- a/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino +++ b/examples/RF69/RF69_Transmit_Interrupt/RF69_Transmit_Interrupt.ino @@ -35,8 +35,8 @@ void setup() { Serial.print(F("[RF69] Initializing ... ")); // carrier frequency: 434.0 MHz // bit rate: 48.0 kbps - // Rx bandwidth: 125.0 kHz // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz // output power: 13 dBm // sync word: 0x2D01 int state = rf.begin(); @@ -63,7 +63,7 @@ void setup() { /* byte byteArr[] = {0x01, 0x23, 0x45, 0x56, 0x78, 0xAB, 0xCD, 0xEF}; - state = rf.transmit(byteArr, 8); + state = rf.startTransmit(byteArr, 8); */ } @@ -121,11 +121,11 @@ void loop() { // 256 characters long transmissionState = rf.startTransmit("Hello World!"); - // you can also transmit byte array up to 256 bytes long + // you can also transmit byte array up to 64 bytes long /* byte byteArr[] = {0x01, 0x23, 0x45, 0x56, 0x78, 0xAB, 0xCD, 0xEF}; - int state = rf.transmit(byteArr, 8); + int state = rf.startTransmit(byteArr, 8); */ // we're ready to send more packets, diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 11c50c7f..d4e64325 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -12,7 +12,7 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_FREQUENCY_STEP_SIZE, RF69_MAX_PA _syncWordLength = 2; } -int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { +int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t power) { // set module properties _mod->init(RADIOLIB_USE_SPI); Module::pinMode(_mod->getIrq(), INPUT); diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h index 44f5020a..94644e1b 100644 --- a/src/modules/RF69/RF69.h +++ b/src/modules/RF69/RF69.h @@ -455,15 +455,15 @@ class RF69: public PhysicalLayer { \param br Bit rate to be used in kbps. Defaults to 48.0 kbps. - \param rxBw Receiver bandwidth in kHz. Defaults to 125.0 kHz. - \param freqDev Frequency deviation from carrier frequency in kHz Defaults to 50.0 kHz. + \param rxBw Receiver bandwidth in kHz. Defaults to 125.0 kHz. + \param power Output power in dBm. Defaults to 13 dBm. \returns \ref status_codes */ - int16_t begin(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13); + int16_t begin(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 125.0, int8_t power = 13); /*! \brief Reset method. Will reset the chip to the default state using RST pin. From 76dd7181461ddbb80a4739b6d372412542111125 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 11 Feb 2020 14:28:10 +0100 Subject: [PATCH 105/135] [PHY] Added data shaping and encoding interface methods --- src/protocols/PhysicalLayer/PhysicalLayer.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/protocols/PhysicalLayer/PhysicalLayer.h b/src/protocols/PhysicalLayer/PhysicalLayer.h index 93872ebd..a434bcb3 100644 --- a/src/protocols/PhysicalLayer/PhysicalLayer.h +++ b/src/protocols/PhysicalLayer/PhysicalLayer.h @@ -190,6 +190,24 @@ class PhysicalLayer { */ virtual int16_t setFrequencyDeviation(float freqDev) = 0; + /*! + \brief Sets GFSK data shaping. Only available in FSK mode. Must be implemented in module class. + + \param sh Shaping to be set. Set to zero to disable data shaping. + + \returns \ref status_codes + */ + virtual int16_t setDataShaping(float sh) = 0; + + /*! + \brief Sets FSK data encoding. Only available in FSK mode. Must be implemented in module class. + + \param enc Encoding to be used. Set to zero to for no encoding (NRZ). + + \returns \ref status_codes + */ + virtual int16_t setEncoding(uint8_t encoding) = 0; + /*! \brief Gets the module frequency step size that was set in constructor. From 13d7f9364c39898022e331539d53f26d7a79fa49 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 11 Feb 2020 14:28:23 +0100 Subject: [PATCH 106/135] [nRF24] Added data shaping and encoding dummy methods --- src/modules/nRF24/nRF24.cpp | 14 ++++++++++++++ src/modules/nRF24/nRF24.h | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/modules/nRF24/nRF24.cpp b/src/modules/nRF24/nRF24.cpp index 725e9265..14f9a943 100644 --- a/src/modules/nRF24/nRF24.cpp +++ b/src/modules/nRF24/nRF24.cpp @@ -473,6 +473,20 @@ int16_t nRF24::setAutoAck(uint8_t pipeNum, bool autoAckOn){ } } +int16_t nRF24::setDataShaping(float sh) { + // nRF24 is unable to set data shaping + // this method is implemented only for PhysicalLayer compatibility + (void)sh; + return(ERR_NONE); +} + +int16_t nRF24::setEncoding(uint8_t encoding) { + // nRF24 is unable to set encoding + // this method is implemented only for PhysicalLayer compatibility + (void)encoding; + return(ERR_NONE); +} + void nRF24::clearIRQ() { // clear status bits _mod->SPIsetRegValue(NRF24_REG_STATUS, NRF24_RX_DR | NRF24_TX_DS | NRF24_MAX_RT, 6, 4); diff --git a/src/modules/nRF24/nRF24.h b/src/modules/nRF24/nRF24.h index e7e536b5..6eafc342 100644 --- a/src/modules/nRF24/nRF24.h +++ b/src/modules/nRF24/nRF24.h @@ -440,6 +440,24 @@ class nRF24: public PhysicalLayer { */ int16_t setAutoAck(uint8_t pipeNum, bool autoAckOn = true); + /*! + \brief Dummy data shaping configuration method, to ensure PhysicalLayer compatibility. + + \param sh Ignored. + + \returns \ref status_codes + */ + int16_t setDataShaping(float sh); + + /*! + \brief Dummy encoding configuration method, to ensure PhysicalLayer compatibility. + + \param sh Ignored. + + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding); + #ifndef RADIOLIB_GODMODE private: #endif From 2a1b25ff61f71ac05b1581d942bd75a8178ae670 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 11 Feb 2020 14:28:42 +0100 Subject: [PATCH 107/135] [CC1101] Added data shaping and encoding methods --- src/modules/CC1101/CC1101.cpp | 50 +++++++++++++++++++++++++++++++++++ src/modules/CC1101/CC1101.h | 19 +++++++++++++ 2 files changed, 69 insertions(+) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 87304e4f..0fe197e0 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -78,6 +78,15 @@ int16_t CC1101::begin(float freq, float br, float freqDev, float rxBw, int8_t po // configure default preamble lenght state = setPreambleLength(preambleLength); + RADIOLIB_ASSERT(state); + + // set default data shaping + state = setDataShaping(0); + RADIOLIB_ASSERT(state); + + // set default encoding + state = setEncoding(2); + RADIOLIB_ASSERT(state); // flush FIFOs SPIsendCommand(CC1101_CMD_FLUSH_RX); @@ -665,6 +674,47 @@ int16_t CC1101::setPromiscuousMode(bool promiscuous) { return(state); } +int16_t CC1101::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(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_2_FSK, 6, 4); + } else if(abs(sh - 5.0) <= 0.001) { + state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_GFSK, 6, 4); + } else { + return(ERR_INVALID_DATA_SHAPING); + } + return(state); +} + +int16_t CC1101::setEncoding(uint8_t encoding) { + // set mode to standby + int16_t state = standby(); + RADIOLIB_ASSERT(state); + + // set encoding + switch(encoding) { + case 0: + state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MANCHESTER_EN_OFF, 3, 3); + RADIOLIB_ASSERT(state); + return(_mod->SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_OFF, 6, 6)); + case 1: + state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MANCHESTER_EN_ON, 3, 3); + RADIOLIB_ASSERT(state); + return(_mod->SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_OFF, 6, 6)); + case 2: + state = _mod->SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MANCHESTER_EN_OFF, 3, 3); + RADIOLIB_ASSERT(state); + return(_mod->SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_ON, 6, 6)); + default: + return(ERR_INVALID_ENCODING); + } +} + int16_t CC1101::config() { // Reset the radio. Registers may be dirty from previous usage. SPIsendCommand(CC1101_CMD_RESET); diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 338e9bdb..0d3e44d9 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -837,6 +837,25 @@ class CC1101: public PhysicalLayer { */ int16_t setPromiscuousMode(bool promiscuous = true); + /*! + \brief Sets Gaussian filter bandwidth-time product that will be used for data shaping. + Allowed value is 0.5. 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 private: #endif From c06d292bd225a15615e695140ce95df290af09bc Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 11 Feb 2020 14:28:55 +0100 Subject: [PATCH 108/135] [RF69] Added data shaping and encoding methods --- src/modules/RF69/RF69.cpp | 50 +++++++++++++++++++++++++++++++++++++++ src/modules/RF69/RF69.h | 19 +++++++++++++++ 2 files changed, 69 insertions(+) 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 From 4fa214a0fd6eefe31b00e1d92bf6a1763576659c Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 11 Feb 2020 14:29:19 +0100 Subject: [PATCH 109/135] [SX126x] Added data encoding method --- src/modules/SX126x/SX126x.cpp | 4 ++++ src/modules/SX126x/SX126x.h | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 2a9e4423..b089f247 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1124,6 +1124,10 @@ int16_t SX126x::setRegulatorDCDC() { return(setRegulatorMode(SX126X_REGULATOR_DC_DC)); } +int16_t SX126x::setEncoding(uint8_t encoding) { + return(setWhitening(encoding)); +} + int16_t SX126x::setTCXO(float voltage, uint32_t delay) { // set mode to standby standby(); diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index f28e7d92..df6e8028 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -833,6 +833,16 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ int16_t setRegulatorDCDC(); + + /*! + \brief Sets transmission encoding. Available in FSK mode only. Serves only as alias for PhysicalLayer compatibility. + + \param encoding Encoding to be used. Set to 0 for NRZ, and 2 for whitening. + + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding); + #ifndef RADIOLIB_GODMODE protected: #endif From ddb478afff2141cf0748aec65c455f4a1941b97c Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 14 Feb 2020 08:08:59 +0100 Subject: [PATCH 110/135] [AX25] Added AX.25 support --- README.md | 1 + examples/AX25/AX25_Frames/AX25_Frames.ino | 167 ++++++++ examples/AX25/AX25_Transmit/AX25_Transmit.ino | 88 ++++ keywords.txt | 12 + src/RadioLib.h | 1 + src/TypeDef.h | 23 ++ src/protocols/AX25/AX25.cpp | 382 ++++++++++++++++++ src/protocols/AX25/AX25.h | 292 +++++++++++++ 8 files changed, 966 insertions(+) create mode 100644 examples/AX25/AX25_Frames/AX25_Frames.ino create mode 100644 examples/AX25/AX25_Transmit/AX25_Transmit.ino create mode 100644 src/protocols/AX25/AX25.cpp create mode 100644 src/protocols/AX25/AX25.h diff --git a/README.md b/README.md index af528946..b3980dee 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ RadioLib was originally created as a driver for [__RadioShield__](https://github * __HTTP__ for modules: ESP8266 * __RTTY__ for modules: SX127x, RFM9x, SX126x, RF69, SX1231, CC1101 and nRF24L01 * __Morse Code__ for modules: SX127x, RFM9x, SX126x, RF69, SX1231, CC1101 and nRF24L01 +* __AX.25__ for modules: SX127x, RFM9x, SX126x, RF69, SX1231 and CC1101 ### Supported platforms: * __AVR__ - tested with hardware on Uno, Mega and Leonardo diff --git a/examples/AX25/AX25_Frames/AX25_Frames.ino b/examples/AX25/AX25_Frames/AX25_Frames.ino new file mode 100644 index 00000000..0d5ae5b6 --- /dev/null +++ b/examples/AX25/AX25_Frames/AX25_Frames.ino @@ -0,0 +1,167 @@ +/* + RadioLib AX.25 Frame Example + + This example shows how to send various + AX.25 frames using SX1278's FSK modem. + + Other modules that can be used for AX.25: + - SX127x/RFM9x + - RF69 + - SX1231 + - CC1101 + - SX126x + - nRF24 + + Using raw AX.25 frames requires some + knowledge of the protocol, refer to + AX25_Transmit for basic operation. + Frames shown in this example are not + exhaustive; all possible AX.25 frames + should be supported. +*/ + +// include the library +#include + +// SX1278 has the following connections: +// NSS pin: 10 +// DIO0 pin: 2 +// RESET pin: 9 +// DIO1 pin: 3 +SX1278 fsk = new Module(10, 2, 9, 3); + +// or using RadioShield +// https://github.com/jgromes/RadioShield +//SX1278 fsk = RadioShield.ModuleA; + +// create AX.25 client instance using the FSK module +AX25Client ax25(&fsk); + +void setup() { + Serial.begin(9600); + + // initialize SX1278 + Serial.print(F("[SX1278] Initializing ... ")); + // carrier frequency: 434.0 MHz + // bit rate: 1.2 kbps (1200 baud AFSK AX.25) + // frequency deviation: 0.5 kHz (1200 baud AFSK AX.25) + int state = fsk.beginFSK(434.0, 1.2, 0.5); + + // when using one of the non-LoRa modules for AX.25 + // (RF69, CC1101, etc.), use the basic begin() method + // int state = fsk.begin(); + + if(state == ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while(true); + } + + // initialize AX.25 client + Serial.print(F("[AX.25] Initializing ... ")); + // source station callsign: "N7LEM" + // source station SSID: 0 + // preamble length: 8 bytes + state = ax25.begin("N7LEM"); + if(state == ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while(true); + } +} + +void loop() { + // create AX.25 Unnumbered Information frame + // destination station callsign: "NJ7P" + // destination station SSID: 0 + // source station callsign: "N7LEM" + // source station SSID: 0 + // control field: UI, P/F not used, unnumbered frame + // protocol identifier: no layer 3 protocol implemented + // information field: "Hello World!" + AX25Frame frameUI("NJ7P", 0, "N7LEM", 0, AX25_CONTROL_U_UNNUMBERED_INFORMATION | + AX25_CONTROL_POLL_FINAL_DISABLED | AX25_CONTROL_UNNUMBERED_FRAME, + AX25_PID_NO_LAYER_3, "Hello World (unnumbered)!"); + + // send the frame + Serial.print(F("[AX.25] Sending UI frame ... ")); + int state = ax25.sendFrame(&frameUI); + if (state == ERR_NONE) { + // the packet was successfully transmitted + Serial.println(F("success!")); + + } else { + // some error occurred + Serial.print(F("failed, code ")); + Serial.println(state); + + } + + delay(1000); + + // create AX.25 Receive Ready frame + // destination station callsign: "NJ7P" + // destination station SSID: 0 + // source station callsign: "N7LEM" + // source station SSID: 0 + // control field: RR, P/F not used, supervisory frame + AX25Frame frameRR("NJ7P", 0, "N7LEM", 0, AX25_CONTROL_S_RECEIVE_READY | + AX25_CONTROL_POLL_FINAL_DISABLED | AX25_CONTROL_SUPERVISORY_FRAME); + + // set receive sequence number (0 - 7) + frameRR.setRecvSequence(0); + + // send the frame + Serial.print(F("[AX.25] Sending RR frame ... ")); + state = ax25.sendFrame(&frameRR); + if (state == ERR_NONE) { + // the packet was successfully transmitted + Serial.println(F("success!")); + + } else { + // some error occurred + Serial.print(F("failed, code ")); + Serial.println(state); + + } + + delay(1000); + + // create AX.25 Information frame + // destination station callsign: "NJ7P" + // destination station SSID: 0 + // source station callsign: "N7LEM" + // source station SSID: 0 + // control field: P/F not used, information frame + // protocol identifier: no layer 3 protocol implemented + // information field: "Hello World (numbered)!" + AX25Frame frameI("NJ7P", 0, "N7LEM", 0, AX25_CONTROL_POLL_FINAL_DISABLED | + AX25_CONTROL_INFORMATION_FRAME, AX25_PID_NO_LAYER_3, + "Hello World (numbered)!"); + + // set receive sequence number (0 - 7) + frameI.setRecvSequence(0); + + // set send sequence number (0 - 7) + frameI.setSendSequence(0); + + // send the frame + Serial.print(F("[AX.25] Sending I frame ... ")); + state = ax25.sendFrame(&frameI); + if (state == ERR_NONE) { + // the packet was successfully transmitted + Serial.println(F("success!")); + + } else { + // some error occurred + Serial.print(F("failed, code ")); + Serial.println(state); + + } + + delay(1000); +} diff --git a/examples/AX25/AX25_Transmit/AX25_Transmit.ino b/examples/AX25/AX25_Transmit/AX25_Transmit.ino new file mode 100644 index 00000000..fa97067d --- /dev/null +++ b/examples/AX25/AX25_Transmit/AX25_Transmit.ino @@ -0,0 +1,88 @@ +/* + RadioLib AX.25 Transmit Example + + This example sends AX.25 messages using + SX1278's FSK modem. + + Other modules that can be used for AX.25: + - SX127x/RFM9x + - RF69 + - SX1231 + - CC1101 + - SX126x + - nRF24 +*/ + +// include the library +#include + +// SX1278 has the following connections: +// NSS pin: 10 +// DIO0 pin: 2 +// RESET pin: 9 +// DIO1 pin: 3 +SX1278 fsk = new Module(10, 2, 9, 3); + +// or using RadioShield +// https://github.com/jgromes/RadioShield +//SX1278 fsk = RadioShield.ModuleA; + +// create AX.25 client instance using the FSK module +AX25Client ax25(&fsk); + +void setup() { + Serial.begin(9600); + + // initialize SX1278 + Serial.print(F("[SX1278] Initializing ... ")); + // carrier frequency: 434.0 MHz + // bit rate: 1.2 kbps (1200 baud AFSK AX.25) + // frequency deviation: 0.5 kHz (1200 baud AFSK AX.25) + int state = fsk.beginFSK(434.0, 1.2, 0.5); + + // when using one of the non-LoRa modules for AX.25 + // (RF69, CC1101, etc.), use the basic begin() method + // int state = fsk.begin(); + + if(state == ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while(true); + } + + // initialize AX.25 client + Serial.print(F("[AX.25] Initializing ... ")); + // source station callsign: "N7LEM" + // source station SSID: 0 + // preamble length: 8 bytes + state = ax25.begin("N7LEM"); + if(state == ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while(true); + } +} + +void loop() { + // send AX.25 unnumbered infomration frame + Serial.print(F("[AX.25] Sending UI frame ... ")); + // destination station callsign: "NJ7P" + // destination station SSID: 0 + int state = ax25.transmit("Hello World!", "NJ7P"); + if (state == ERR_NONE) { + // the packet was successfully transmitted + Serial.println(F("success!")); + + } else { + // some error occurred + Serial.print(F("failed, code ")); + Serial.println(state); + + } + + delay(1000); +} diff --git a/keywords.txt b/keywords.txt index d312388d..10f66074 100644 --- a/keywords.txt +++ b/keywords.txt @@ -39,6 +39,8 @@ HTTPClient KEYWORD1 RTTYClient KEYWORD1 MorseClient KEYWORD1 PagerClient KEYWORD1 +AX25Client KEYWORD1 +AX25Frame KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -176,6 +178,12 @@ getNumBytes KEYWORD2 sendSMS KEYWORD2 shutdown KEYWORD2 +# AX.25 +setRepeaters KEYWORD2 +setRecvSequence KEYWORD2 +setSendSequence KEYWORD2 +sendFrame KEYWORD2 + ####################################### # Constants (LITERAL1) ####################################### @@ -262,3 +270,7 @@ ERR_SPI_CMD_INVALID LITERAL1 ERR_SPI_CMD_FAILED LITERAL1 ERR_INVALID_SLEEP_PERIOD LITERAL1 ERR_INVALID_RX_PERIOD LITERAL1 + +ERR_INVALID_CALLSIGN LITERAL1 +ERR_INVALID_NUM_REPEATERS LITERAL1 +ERR_INVALID_REPEATER_CALLSIGN LITERAL1 diff --git a/src/RadioLib.h b/src/RadioLib.h index 538b9228..659ce3f8 100644 --- a/src/RadioLib.h +++ b/src/RadioLib.h @@ -67,6 +67,7 @@ // physical layer protocols #include "protocols/PhysicalLayer/PhysicalLayer.h" +#include "protocols/AX25/AX25.h" #include "protocols/Morse/Morse.h" #include "protocols/RTTY/RTTY.h" diff --git a/src/TypeDef.h b/src/TypeDef.h index dc4dcd7c..596516fa 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -540,6 +540,29 @@ */ #define ERR_INVALID_RX_PERIOD -709 +// AX.25-specific status codes + +/*! + \brief The provided callsign is invalid. + + The specified callsign is longer than 6 ASCII characters. +*/ +#define ERR_INVALID_CALLSIGN -801 + +/*! + \brief The provided repeater configuration is invalid. + + The specified number of repeaters does not match number of repeater IDs or their callsigns. +*/ +#define ERR_INVALID_NUM_REPEATERS -802 + +/*! + \brief One of the provided repeater callsigns is invalid. + + The specified callsign is longer than 6 ASCII characters. +*/ +#define ERR_INVALID_REPEATER_CALLSIGN -803 + /*! \} */ diff --git a/src/protocols/AX25/AX25.cpp b/src/protocols/AX25/AX25.cpp new file mode 100644 index 00000000..7c6a7933 --- /dev/null +++ b/src/protocols/AX25/AX25.cpp @@ -0,0 +1,382 @@ +#include "AX25.h" + +AX25Frame::AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control) +: AX25Frame(destCallsign, destSSID, srcCallsign, srcSSID, control, 0, NULL, 0) { + +} + +AX25Frame::AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, const char* info) + : AX25Frame(destCallsign, destSSID, srcCallsign, srcSSID, control, protocolID, (uint8_t*)info, strlen(info)) { + +} + +AX25Frame::AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, uint8_t* info, uint16_t infoLen) { + // destination callsign/SSID + memcpy(this->destCallsign, destCallsign, strlen(destCallsign)); + this->destCallsign[strlen(destCallsign)] = '\0'; + this->destSSID = destSSID; + + // source callsign/SSID + memcpy(this->srcCallsign, srcCallsign, strlen(srcCallsign)); + this->srcCallsign[strlen(srcCallsign)] = '\0'; + this->srcSSID = srcSSID; + + // set repeaters + this->numRepeaters = 0; + #ifndef RADIOLIB_STATIC_ONLY + this->repeaterCallsigns = NULL; + this->repeaterSSIDs = NULL; + #endif + + // control field + this->control = control; + + // sequence numbers + this->rcvSeqNumber = 0; + this->sendSeqNumber = 0; + + // PID field + this->protocolID = protocolID; + + // info field + this->infoLen = infoLen; + if(infoLen > 0) { + #ifndef RADIOLIB_STATIC_ONLY + this->info = new uint8_t[infoLen]; + #endif + memcpy(this->info, info, infoLen); + } +} + +AX25Frame::~AX25Frame() { + #ifndef RADIOLIB_STATIC_ONLY + // deallocate info field + if(infoLen > 0) { + delete[] this->info; + } + + // deallocate repeaters + if(this->numRepeaters > 0) { + for(uint8_t i = 0; i < this->numRepeaters; i++) { + delete[] this->repeaterCallsigns[i]; + } + delete[] this->repeaterCallsigns; + delete[] this->repeaterSSIDs; + } + #endif +} + +int16_t AX25Frame::setRepeaters(char** repeaterCallsigns, uint8_t* repeaterSSIDs, uint8_t numRepeaters) { + // check number of repeaters + if((numRepeaters < 1) || (numRepeaters > 8)) { + return(ERR_INVALID_NUM_REPEATERS); + } + + // check repeater configuration + if(!(((repeaterCallsigns == NULL) && (repeaterSSIDs == NULL) && (numRepeaters == 0)) || + ((repeaterCallsigns != NULL) && (repeaterSSIDs != NULL) && (numRepeaters != 0)))) { + return(ERR_INVALID_NUM_REPEATERS); + } + for(uint16_t i = 0; i < numRepeaters; i++) { + if(strlen(repeaterCallsigns[i]) > AX25_MAX_CALLSIGN_LEN) { + return(ERR_INVALID_REPEATER_CALLSIGN); + } + } + + // create buffers + #ifndef RADIOLIB_STATIC_ONLY + this->repeaterCallsigns = new char*[numRepeaters]; + for(uint8_t i = 0; i < numRepeaters; i++) { + this->repeaterCallsigns[i] = new char[strlen(repeaterCallsigns[i])]; + } + this->repeaterSSIDs = new uint8_t[numRepeaters]; + #endif + + // copy data + this->numRepeaters = numRepeaters; + for(uint8_t i = 0; i < numRepeaters; i++) { + memcpy(this->repeaterCallsigns[i], repeaterCallsigns[i], strlen(repeaterCallsigns[i])); + } + memcpy(this->repeaterSSIDs, repeaterSSIDs, numRepeaters); + + return(ERR_NONE); +} + +void AX25Frame::setRecvSequence(uint8_t seqNumber) { + this->rcvSeqNumber = seqNumber; +} + +void AX25Frame::setSendSequence(uint8_t seqNumber) { + this->sendSeqNumber = seqNumber; +} + +AX25Client::AX25Client(PhysicalLayer* phy) { + _phy = phy; +} + +int16_t AX25Client::begin(const char* srcCallsign, uint8_t srcSSID, uint8_t preambleLen) { + // set source SSID + _srcSSID = srcSSID; + + // check source callsign length (6 characters max) + if(strlen(srcCallsign) > AX25_MAX_CALLSIGN_LEN) { + return(ERR_INVALID_CALLSIGN); + } + + // copy callsign + memcpy(_srcCallsign, srcCallsign, strlen(srcCallsign)); + _srcCallsign[strlen(srcCallsign)] = '\0'; + + // save preamble length + _preambleLen = preambleLen; + + // disable physical layer data shaping and set encoding to NRZ + int16_t state = _phy->setDataShaping(0.0); + RADIOLIB_ASSERT(state); + + state = _phy->setEncoding(0); + return(state); +} + +int16_t AX25Client::transmit(const char* str, const char* destCallsign, uint8_t destSSID) { + // create control field + uint8_t controlField = AX25_CONTROL_U_UNNUMBERED_INFORMATION | AX25_CONTROL_POLL_FINAL_DISABLED | AX25_CONTROL_UNNUMBERED_FRAME; + + // build the frame + AX25Frame frame(destCallsign, destSSID, _srcCallsign, _srcSSID, controlField, AX25_PID_NO_LAYER_3, (uint8_t*)str, strlen(str)); + + // send Unnumbered Information frame + return(sendFrame(&frame)); +} + +int16_t AX25Client::sendFrame(AX25Frame* frame) { + // check destination callsign length (6 characters max) + if(strlen(frame->destCallsign) > AX25_MAX_CALLSIGN_LEN) { + return(ERR_INVALID_CALLSIGN); + } + + // check repeater configuration + #ifndef RADIOLIB_STATIC_ONLY + if(!(((frame->repeaterCallsigns == NULL) && (frame->repeaterSSIDs == NULL) && (frame->numRepeaters == 0)) || + ((frame->repeaterCallsigns != NULL) && (frame->repeaterSSIDs != NULL) && (frame->numRepeaters != 0)))) { + return(ERR_INVALID_NUM_REPEATERS); + } + for(uint16_t i = 0; i < frame->numRepeaters; i++) { + if(strlen(frame->repeaterCallsigns[i]) > AX25_MAX_CALLSIGN_LEN) { + return(ERR_INVALID_REPEATER_CALLSIGN); + } + } + #endif + + // calculate frame length without FCS (destination address, source address, repeater addresses, control, PID, info) + size_t frameBuffLen = ((2 + frame->numRepeaters)*(AX25_MAX_CALLSIGN_LEN + 1)) + 1 + 1 + frame->infoLen; + // create frame buffer without preamble, start or stop flags + #ifndef RADIOLIB_STATIC_ONLY + uint8_t* frameBuff = new uint8_t[frameBuffLen + 2]; + #else + uint8_t frameBuff[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + uint8_t* frameBuffPtr = frameBuff; + + // set destination callsign - all address field bytes are shifted by one bit to make room for HDLC address extension bit + memset(frameBuffPtr, ' ' << 1, AX25_MAX_CALLSIGN_LEN); + for(uint8_t i = 0; i < strlen(frame->destCallsign); i++) { + *(frameBuffPtr + i) = frame->destCallsign[i] << 1; + } + frameBuffPtr += AX25_MAX_CALLSIGN_LEN; + + // set destination SSID + *(frameBuffPtr++) = AX25_SSID_COMMAND_DEST | AX25_SSID_RESERVED_BITS | (frame->destSSID & 0x0F) << 1 | AX25_SSID_HDLC_EXTENSION_CONTINUE; + + // set source callsign - all address field bytes are shifted by one bit to make room for HDLC address extension bit + memset(frameBuffPtr, ' ' << 1, AX25_MAX_CALLSIGN_LEN); + for(uint8_t i = 0; i < strlen(frame->srcCallsign); i++) { + *(frameBuffPtr + i) = frame->srcCallsign[i] << 1; + } + frameBuffPtr += AX25_MAX_CALLSIGN_LEN; + + // set source SSID + *(frameBuffPtr++) = AX25_SSID_COMMAND_SOURCE | AX25_SSID_RESERVED_BITS | (frame->srcSSID & 0x0F) << 1 | AX25_SSID_HDLC_EXTENSION_END; + + // set repeater callsigns + for(uint16_t i = 0; i < frame->numRepeaters; i++) { + memset(frameBuffPtr, ' ' << 1, AX25_MAX_CALLSIGN_LEN); + for(uint8_t j = 0; j < strlen(frame->repeaterCallsigns[i]); j++) { + *(frameBuffPtr + j) = frame->repeaterCallsigns[i][j] << 1; + } + frameBuffPtr += AX25_MAX_CALLSIGN_LEN; + *(frameBuffPtr++) = AX25_SSID_HAS_NOT_BEEN_REPEATED | AX25_SSID_RESERVED_BITS | (frame->repeaterSSIDs[i] & 0x0F) << 1 | AX25_SSID_HDLC_EXTENSION_CONTINUE; + } + + // set HDLC extension end bit + *frameBuffPtr |= AX25_SSID_HDLC_EXTENSION_END; + + // set sequence numbers of the frames that have it + uint8_t controlField = frame->control; + if((frame->control & 0x01) == 0) { + // information frame, set both sequence numbers + controlField |= frame->rcvSeqNumber << 5; + controlField |= frame->sendSeqNumber << 1; + } else if((frame->control & 0x02) == 0) { + // supervisory frame, set only receive sequence number + controlField |= frame->rcvSeqNumber << 5; + } + + // set control field + *(frameBuffPtr++) = controlField; + + // set PID field of the frames that have it + if(frame->protocolID != 0x00) { + *(frameBuffPtr++) = frame->protocolID; + } + + // set info field of the frames that have it + if(frame->infoLen > 0) { + memcpy(frameBuffPtr, frame->info, frame->infoLen); + frameBuffPtr += frame->infoLen; + } + + // flip bit order + for(size_t i = 0; i < frameBuffLen; i++) { + frameBuff[i] = flipBits(frameBuff[i]); + } + + // calculate FCS + uint16_t fcs = getFrameCheckSequence(frameBuff, frameBuffLen); + *(frameBuffPtr++) = (uint8_t)((fcs >> 8) & 0xFF); + *(frameBuffPtr++) = (uint8_t)(fcs & 0xFF); + + // prepare buffer for the final frame (stuffed, with added preamble + flags and NRZI-encoded) + #ifndef RADIOLIB_STATIC_ONLY + // worst-case scenario: sequence of 1s, will have 120% of the original length, stuffed frame also includes both flags + uint8_t* stuffedFrameBuff = new uint8_t[_preambleLen + 1 + (6*frameBuffLen)/5 + 2]; + #else + uint8_t stuffedFrameBuff[RADIOLIB_STATIC_ARRAY_SIZE]; + #endif + + // stuff bits (skip preamble and both flags) + uint16_t stuffedFrameBuffLenBits = 8*(_preambleLen + 1); + uint8_t count = 0; + for(uint16_t i = 0; i < frameBuffLen + 2; i++) { + for(int8_t shift = 7; shift >= 0; shift--) { + uint16_t stuffedFrameBuffPos = stuffedFrameBuffLenBits + 7 - 2*(stuffedFrameBuffLenBits%8); + if((frameBuff[i] >> shift) & 0x01) { + // copy 1 and increment counter + SET_BIT_IN_ARRAY(stuffedFrameBuff, stuffedFrameBuffPos); + stuffedFrameBuffLenBits++; + count++; + + // check 5 consecutive 1s + if(count == 5) { + // get the new position in stuffed frame + stuffedFrameBuffPos = stuffedFrameBuffLenBits + 7 - 2*(stuffedFrameBuffLenBits%8); + + // insert 0 and reset counter + CLEAR_BIT_IN_ARRAY(stuffedFrameBuff, stuffedFrameBuffPos); + stuffedFrameBuffLenBits++; + count = 0; + } + + } else { + // copy 0 and reset counter + CLEAR_BIT_IN_ARRAY(stuffedFrameBuff, stuffedFrameBuffPos); + stuffedFrameBuffLenBits++; + count = 0; + } + + } + } + + // deallocate memory + #ifndef RADIOLIB_STATIC_ONLY + delete[] frameBuff; + #endif + + // set preamble bytes and start flag field + for(uint16_t i = 0; i < _preambleLen + 1; i++) { + stuffedFrameBuff[i] = AX25_FLAG; + } + + // get stuffed frame length in bytes + size_t stuffedFrameBuffLen = stuffedFrameBuffLenBits/8 + 1; + uint8_t trailingLen = stuffedFrameBuffLenBits % 8; + + // set end flag field (may be split into two bytes due to misalignment caused by extra stuffing bits) + if(trailingLen != 0) { + stuffedFrameBuffLen++; + stuffedFrameBuff[stuffedFrameBuffLen - 2] = AX25_FLAG >> trailingLen; + stuffedFrameBuff[stuffedFrameBuffLen - 1] = AX25_FLAG << (8 - trailingLen); + } else { + stuffedFrameBuff[stuffedFrameBuffLen - 1] = AX25_FLAG; + } + + // convert to NRZI + for(size_t i = _preambleLen + 1; i < stuffedFrameBuffLen*8; i++) { + size_t currBitPos = i + 7 - 2*(i%8); + size_t prevBitPos = (i - 1) + 7 - 2*((i - 1)%8); + if(TEST_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos)) { + // bit is 1, no change, copy previous bit + if(TEST_BIT_IN_ARRAY(stuffedFrameBuff, prevBitPos)) { + SET_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos); + } else { + CLEAR_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos); + } + + } else { + // bit is 0, transition, copy inversion of the previous bit + if(TEST_BIT_IN_ARRAY(stuffedFrameBuff, prevBitPos)) { + CLEAR_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos); + } else { + SET_BIT_IN_ARRAY(stuffedFrameBuff, currBitPos); + } + } + } + + // transmit + int16_t state = _phy->transmit(stuffedFrameBuff, stuffedFrameBuffLen); + + // deallocate memory + #ifndef RADIOLIB_STATIC_ONLY + delete[] stuffedFrameBuff; + #endif + + return(state); +} + +/* + CCITT CRC implementation based on https://github.com/kicksat/ax25 + + Licensed under Creative Commons Attribution-ShareAlike 4.0 International + https://creativecommons.org/licenses/by-sa/4.0/ +*/ +uint16_t AX25Client::getFrameCheckSequence(uint8_t* buff, size_t len) { + uint8_t outBit = 0; + uint16_t mask = 0x0000; + uint16_t shiftReg = CRC_CCITT_INIT; + + for(size_t i = 0; i < len; i++) { + for(uint8_t b = 0x80; b > 0x00; b /= 2) { + outBit = (shiftReg & 0x01) ? 0x01 : 0x00; + shiftReg >>= 1; + mask = XOR((buff[i] & b), outBit) ? CRC_CCITT_POLY_REVERSED : 0x0000; + shiftReg ^= mask; + } + } + + return(flipBits16(~shiftReg)); +} + +uint8_t AX25Client::flipBits(uint8_t b) { + b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; + b = (b & 0xCC) >> 2 | (b & 0x33) << 2; + b = (b & 0xAA) >> 1 | (b & 0x55) << 1; + return b; +} + +uint16_t AX25Client::flipBits16(uint16_t i) { + i = (i & 0xFF00) >> 8 | (i & 0x00FF) << 8; + i = (i & 0xF0F0) >> 4 | (i & 0x0F0F) << 4; + i = (i & 0xCCCC) >> 2 | (i & 0x3333) << 2; + i = (i & 0xAAAA) >> 1 | (i & 0x5555) << 1; + return i; +} diff --git a/src/protocols/AX25/AX25.h b/src/protocols/AX25/AX25.h new file mode 100644 index 00000000..f3e80c96 --- /dev/null +++ b/src/protocols/AX25/AX25.h @@ -0,0 +1,292 @@ +#ifndef _RADIOLIB_AX25_H +#define _RADIOLIB_AX25_H + +#include "../../TypeDef.h" +#include "../PhysicalLayer/PhysicalLayer.h" + +// macros to access bits in byte array, from http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html +#define SET_BIT_IN_ARRAY(A, k) ( A[(k/8)] |= (1 << (k%8)) ) +#define CLEAR_BIT_IN_ARRAY(A, k) ( A[(k/8)] &= ~(1 << (k%8)) ) +#define TEST_BIT_IN_ARRAY(A, k) ( A[(k/8)] & (1 << (k%8)) ) +#define GET_BIT_IN_ARRAY(A, k) ( (A[(k/8)] & (1 << (k%8))) ? 1 : 0 ) + +// CRC-CCITT calculation macros +#define XOR(A, B) ( ((A) || (B)) && !((A) && (B)) ) +#define CRC_CCITT_POLY 0x1021 // generator polynomial +#define CRC_CCITT_POLY_REVERSED 0x8408 // CRC_CCITT_POLY in reversed bit order +#define CRC_CCITT_INIT 0xFFFF // initial value + +// maximum callsign length in bytes +#define AX25_MAX_CALLSIGN_LEN 6 + +// flag field MSB LSB DESCRIPTION +#define AX25_FLAG 0b01111110 // 7 0 AX.25 frame start/end flag + +// address field +#define AX25_SSID_COMMAND_DEST 0b10000000 // 7 7 frame type: command (set in destination SSID) +#define AX25_SSID_COMMAND_SOURCE 0b00000000 // 7 7 command (set in source SSID) +#define AX25_SSID_RESPONSE_DEST 0b00000000 // 7 7 response (set in destination SSID) +#define AX25_SSID_RESPONSE_SOURCE 0b10000000 // 7 7 response (set in source SSID) +#define AX25_SSID_HAS_NOT_BEEN_REPEATED 0b00000000 // 7 7 not repeated yet (set in repeater SSID) +#define AX25_SSID_HAS_BEEN_REPEATED 0b10000000 // 7 7 repeated (set in repeater SSID) +#define AX25_SSID_RESERVED_BITS 0b01100000 // 6 5 reserved bits in SSID +#define AX25_SSID_HDLC_EXTENSION_CONTINUE 0b00000000 // 0 0 HDLC extension bit: next octet contains more address information +#define AX25_SSID_HDLC_EXTENSION_END 0b00000001 // 0 0 address field end + +// control field +#define AX25_CONTROL_U_SET_ASYNC_BAL_MODE 0b01101100 // 7 2 U frame type: set asynchronous balanced mode (connect request) +#define AX25_CONTROL_U_SET_ASYNC_BAL_MODE_EXT 0b00101100 // 7 2 set asynchronous balanced mode extended (connect request with module 128) +#define AX25_CONTROL_U_DISCONNECT 0b01000000 // 7 2 disconnect request +#define AX25_CONTROL_U_DISCONNECT_MODE 0b00001100 // 7 2 disconnect mode (system busy or disconnected) +#define AX25_CONTROL_U_UNNUMBERED_ACK 0b01100000 // 7 2 unnumbered acknowledge +#define AX25_CONTROL_U_FRAME_REJECT 0b10000100 // 7 2 frame reject +#define AX25_CONTROL_U_UNNUMBERED_INFORMATION 0b00000000 // 7 2 unnumbered information +#define AX25_CONTROL_U_EXHANGE_IDENTIFICATION 0b10101100 // 7 2 exchange ID +#define AX25_CONTROL_U_TEST 0b11100000 // 7 2 test +#define AX25_CONTROL_POLL_FINAL_ENABLED 0b00010000 // 4 4 control field poll/final bit: enabled +#define AX25_CONTROL_POLL_FINAL_DISABLED 0b00000000 // 4 4 disabled +#define AX25_CONTROL_S_RECEIVE_READY 0b00000000 // 3 2 S frame type: receive ready (system ready to receive) +#define AX25_CONTROL_S_RECEIVE_NOT_READY 0b00000100 // 3 2 receive not ready (TNC buffer full) +#define AX25_CONTROL_S_REJECT 0b00001000 // 3 2 reject (out of sequence or duplicate) +#define AX25_CONTROL_S_SELECTIVE_REJECT 0b00001100 // 3 2 selective reject (single frame repeat request) +#define AX25_CONTROL_INFORMATION_FRAME 0b00000000 // 0 0 frame type: information (I frame) +#define AX25_CONTROL_SUPERVISORY_FRAME 0b00000001 // 1 0 supervisory (S frame) +#define AX25_CONTROL_UNNUMBERED_FRAME 0b00000011 // 1 0 unnumbered (U frame) + +// protocol identifier field +#define AX25_PID_ISO_8208 0x01 +#define AX25_PID_TCP_IP_COMPRESSED 0x06 +#define AX25_PID_TCP_IP_UNCOMPRESSED 0x07 +#define AX25_PID_SEGMENTATION_FRAGMENT 0x08 +#define AX25_PID_TEXNET_DATAGRAM_PROTOCOL 0xC3 +#define AX25_PID_LINK_QUALITY_PROTOCOL 0xC4 +#define AX25_PID_APPLETALK 0xCA +#define AX25_PID_APPLETALK_ARP 0xCB +#define AX25_PID_ARPA_INTERNET_PROTOCOL 0xCC +#define AX25_PID_ARPA_ADDRESS_RESOLUTION 0xCD +#define AX25_PID_FLEXNET 0xCE +#define AX25_PID_NET_ROM 0xCF +#define AX25_PID_NO_LAYER_3 0xF0 +#define AX25_PID_ESCAPE_CHARACTER 0xFF + +/*! + \class AX25Frame + + \brief Abstraction of AX.25 frame format. +*/ +class AX25Frame { + public: + /*! + \brief Callsign of the destination station. + */ + char destCallsign[AX25_MAX_CALLSIGN_LEN + 1]; + + /*! + \brief SSID of the destination station. + */ + uint8_t destSSID; + + /*! + \brief Callsign of the source station. + */ + char srcCallsign[AX25_MAX_CALLSIGN_LEN + 1]; + + /*! + \brief SSID of the source station. + */ + uint8_t srcSSID; + + /*! + \brief Number of repeaters to be used. + */ + uint8_t numRepeaters; + + /*! + \brief The control field. + */ + uint8_t control; + + /*! + \brief The protocol identifier (PID) field. + */ + uint8_t protocolID; + + /*! + \brief Number of bytes in the information field. + */ + uint16_t infoLen; + + /*! + \brief Receive sequence number. + */ + uint8_t rcvSeqNumber; + + /*! + \brief Send sequence number. + */ + uint16_t sendSeqNumber; + + #ifndef RADIOLIB_STATIC_ONLY + uint8_t* info; + char** repeaterCallsigns; + uint8_t* repeaterSSIDs; + #else + uint8_t info[RADIOLIB_STATIC_ARRAY_SIZE]; + char repeaterCallsigns[8][AX25_MAX_CALLSIGN_LEN + 1]; + uint8_t repeaterSSIDs[8]; + #endif + + /*! + \brief Overloaded constructor, for frames without info field. + + \param destCallsign Callsign of the destination station. + + \param destSSID SSID of the destination station. + + \param srcCallsign Callsign of the source station. + + \param srcSSID SSID of the source station. + + \param control The control field. + */ + AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control); + + /*! + \brief Overloaded constructor, for frames with C-string info field. + + \param destCallsign Callsign of the destination station. + + \param destSSID SSID of the destination station. + + \param srcCallsign Callsign of the source station. + + \param srcSSID SSID of the source station. + + \param control The control field. + + \param protocolID The protocol identifier (PID) field. Set to zero if the frame doesn't have this field. + + \param info Information field, in the form of null-terminated C-string. + */ + AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, const char* info); + + /*! + \brief Default constructor. + + \param destCallsign Callsign of the destination station. + + \param destSSID SSID of the destination station. + + \param srcCallsign Callsign of the source station. + + \param srcSSID SSID of the source station. + + \param control The control field. + + \param protocolID The protocol identifier (PID) field. Set to zero if the frame doesn't have this field. + + \param info Information field, in the form of arbitrary binary buffer. + + \param infoLen Number of bytes in the information field. + */ + AX25Frame(const char* destCallsign, uint8_t destSSID, const char* srcCallsign, uint8_t srcSSID, uint8_t control, uint8_t protocolID, uint8_t* info, uint16_t infoLen); + + /*! + \brief Default destructor. + */ + ~AX25Frame(); + + /*! + \brief Method to set the repeater callsigns and SSIDs. + + \param repeaterCallsigns Array of repeater callsigns in the form of null-terminated C-strings. + + \param repeaterSSIDs Array of repeater SSIDs. + + \param numRepeaters Number of repeaters, maximum is 8. + + \returns \ref status_codes + */ + int16_t setRepeaters(char** repeaterCallsigns, uint8_t* repeaterSSIDs, uint8_t numRepeaters); + + /*! + \brief Method to set receive sequence number. + + \param seqNumber Sequence number to set, 0 to 7. + */ + void setRecvSequence(uint8_t seqNumber); + + /*! + \brief Method to set send sequence number. + + \param seqNumber Sequence number to set, 0 to 7. + */ + void setSendSequence(uint8_t seqNumber); +}; + +/*! + \class AX25Client + + \brief Client for AX25 communication. +*/ +class AX25Client { + public: + /*! + \brief Default constructor. + + \param phy Pointer to the wireless module providing PhysicalLayer communication. + */ + AX25Client(PhysicalLayer* phy); + + // basic methods + + /*! + \brief Initialization method. + + \param srcCallsign Callsign of the source station. + + \param srcSSID 4-bit SSID of the source station (in case there are more stations with the same callsign). Defaults to 0. + + \param preambleLen Number of "preamble" bytes (AX25_FLAG) sent ahead of the actual AX.25 frame. Does not include the first AX25_FLAG byte, which is considered part of the frame. Defaults to 8. + + \returns \ref status_codes + */ + int16_t begin(const char* srcCallsign, uint8_t srcSSID = 0x00, uint8_t preambleLen = 8); + + /*! + \brief Transmit unnumbered information (UI) frame. + + \param str Data to be sent. + + \param destCallsign Callsign of the destination station. + + \param destSSID 4-bit SSID of the destination station (in case there are more stations with the same callsign). Defaults to 0. + + \returns \ref status_codes + */ + int16_t transmit(const char* str, const char* destCallsign, uint8_t destSSID = 0x00); + + /*! + \brief Transmit arbitrary AX.25 frame. + + \param frame Frame to be sent. + + \returns \ref status_codes + */ + int16_t sendFrame(AX25Frame* frame); + +#ifndef RADIOLIB_GODMODE + private: +#endif + PhysicalLayer* _phy; + + char _srcCallsign[AX25_MAX_CALLSIGN_LEN + 1]; + uint8_t _srcSSID; + uint16_t _preambleLen; + + uint16_t getFrameCheckSequence(uint8_t* buff, size_t len); + uint8_t flipBits(uint8_t b); + uint16_t flipBits16(uint16_t i); +}; + +#endif From e68146bcde82a2021fa1181dc996fe5bd66dd95b Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 14 Feb 2020 08:39:10 +0100 Subject: [PATCH 111/135] Added missing Doxygen comments --- src/RadioLib.h | 1 + src/protocols/AX25/AX25.h | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/RadioLib.h b/src/RadioLib.h index 659ce3f8..1775fa0e 100644 --- a/src/RadioLib.h +++ b/src/RadioLib.h @@ -18,6 +18,7 @@ - PhysicalLayer protocols - RTTY (RTTYClient) - Morse Code (MorseClient) + - AX.25 (AX25Client) - TransportLayer protocols - HTTP (HTTPClient) - MQTT (MQTTClient) diff --git a/src/protocols/AX25/AX25.h b/src/protocols/AX25/AX25.h index f3e80c96..bfe322af 100644 --- a/src/protocols/AX25/AX25.h +++ b/src/protocols/AX25/AX25.h @@ -127,12 +127,34 @@ class AX25Frame { uint16_t sendSeqNumber; #ifndef RADIOLIB_STATIC_ONLY + /*! + \brief The info field. + */ uint8_t* info; + + /*! + \brief Array of repeater callsigns. + */ char** repeaterCallsigns; + + /*! + \brief Array of repeater SSIDs. + */ uint8_t* repeaterSSIDs; #else + /*! + \brief The info field. + */ uint8_t info[RADIOLIB_STATIC_ARRAY_SIZE]; + + /*! + \brief Array of repeater callsigns. + */ char repeaterCallsigns[8][AX25_MAX_CALLSIGN_LEN + 1]; + + /*! + \brief Array of repeater SSIDs. + */ uint8_t repeaterSSIDs[8]; #endif From ec9f1a835fa8b43e18abbf33f787cbbe8d269de6 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 14 Feb 2020 08:39:25 +0100 Subject: [PATCH 112/135] Bump version to 3.3.0 --- library.properties | 2 +- src/TypeDef.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library.properties b/library.properties index 3a715a5c..81829f5b 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.2.3 +version=3.3.0 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index 596516fa..fb5455ae 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -9,8 +9,8 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) -#define RADIOLIB_VERSION_MINOR (0x02) -#define RADIOLIB_VERSION_PATCH (0x03) +#define RADIOLIB_VERSION_MINOR (0x03) +#define RADIOLIB_VERSION_PATCH (0x00) #define RADIOLIB_VERSION_EXTRA (0x00) #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) From 4f9b72f7f69cb0e4f741600ec431b9d43344cdbb Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 16 Feb 2020 12:33:57 +0100 Subject: [PATCH 113/135] [CC1101] Fixed incorrect PA configuration in OOK mode --- src/modules/CC1101/CC1101.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 0fe197e0..06c9a98f 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -321,7 +321,7 @@ int16_t CC1101::setFrequency(float freq) { } // Update the TX power accordingly to new freq. (PA values depend on chosen freq) - return setOutputPower(_power); + return(setOutputPower(_power)); } int16_t CC1101::setBitRate(float br) { @@ -395,9 +395,6 @@ int16_t CC1101::setFrequencyDeviation(float freqDev) { } int16_t CC1101::setOutputPower(int8_t power) { - // Store the value. - _power = power; - // round to the known frequency settings uint8_t f; if(_freq < 374.0) { @@ -454,16 +451,19 @@ int16_t CC1101::setOutputPower(int8_t power) { return(ERR_INVALID_OUTPUT_POWER); } - if (_modulation == CC1101_MOD_FORMAT_ASK_OOK){ + // store the value + _power = power; + + if(_modulation == CC1101_MOD_FORMAT_ASK_OOK){ // Amplitude modulation: // PA_TABLE[0] is the power to be used when transmitting a 0 (no power) // PA_TABLE[1] is the power to be used when transmitting a 1 (full power) - byte paValues[2] = {0x00, powerRaw}; + uint8_t paValues[2] = {0x00, powerRaw}; SPIwriteRegisterBurst(CC1101_REG_PATABLE, paValues, 2); - return ERR_NONE; + return(ERR_NONE); - }else{ + } else { // Freq modulation: // PA_TABLE[0] is the power to be used when transmitting. return(SPIsetRegValue(CC1101_REG_PATABLE, powerRaw)); @@ -566,6 +566,9 @@ int16_t CC1101::setOOK(bool enableOOK) { int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_ASK_OOK, 6, 4); RADIOLIB_ASSERT(state); + // update current modulation + _modulation = CC1101_MOD_FORMAT_ASK_OOK; + // PA_TABLE[0] is (by default) the power value used when transmitting a "0L". // Set PA_TABLE[1] to be used when transmitting a "1L". state = SPIsetRegValue(CC1101_REG_FREND0, 1, 2, 0); @@ -575,6 +578,9 @@ int16_t CC1101::setOOK(bool enableOOK) { int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_2_FSK, 6, 4); RADIOLIB_ASSERT(state); + // update current modulation + _modulation = CC1101_MOD_FORMAT_2_FSK; + // Reset FREND0 to default value. state = SPIsetRegValue(CC1101_REG_FREND0, 0, 2, 0); RADIOLIB_ASSERT(state); From 9ca2499b451b4121d424e7aa9e873199ade8c829 Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 14:48:27 +0100 Subject: [PATCH 114/135] [CC1101] Fixed setRxBandwidth() --- src/modules/CC1101/CC1101.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 06c9a98f..52305737 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -357,14 +357,14 @@ int16_t CC1101::setRxBandwidth(float rxBw) { for(int8_t e = 3; e >= 0; e--) { for(int8_t m = 3; m >= 0; m --) { float point = (CC1101_CRYSTAL_FREQ * 1000000.0)/(8 * (m + 4) * ((uint32_t)1 << e)); - if(abs((rxBw * 1000.0) - point) <= 0.001) { + if(abs((rxBw * 1000.0) - point) <= 1000) { // set Rx channel filter bandwidth return(SPIsetRegValue(CC1101_REG_MDMCFG4, (e << 6) | (m << 4), 7, 4)); } } } - return(ERR_UNKNOWN); + return(ERR_INVALID_RX_BANDWIDTH); } int16_t CC1101::setFrequencyDeviation(float freqDev) { From 13a77dff2adaa3e88335eb6949fdb9513e454d2d Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 14:49:41 +0100 Subject: [PATCH 115/135] [CC1101] Persist modulation change after it's asserted --- src/modules/CC1101/CC1101.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 52305737..b4af2d0d 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -566,24 +566,24 @@ int16_t CC1101::setOOK(bool enableOOK) { int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_ASK_OOK, 6, 4); RADIOLIB_ASSERT(state); - // update current modulation - _modulation = CC1101_MOD_FORMAT_ASK_OOK; - // PA_TABLE[0] is (by default) the power value used when transmitting a "0L". // Set PA_TABLE[1] to be used when transmitting a "1L". state = SPIsetRegValue(CC1101_REG_FREND0, 1, 2, 0); RADIOLIB_ASSERT(state); + + // update current modulation + _modulation = CC1101_MOD_FORMAT_ASK_OOK; } else { int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_MOD_FORMAT_2_FSK, 6, 4); RADIOLIB_ASSERT(state); - // update current modulation - _modulation = CC1101_MOD_FORMAT_2_FSK; - // Reset FREND0 to default value. state = SPIsetRegValue(CC1101_REG_FREND0, 0, 2, 0); RADIOLIB_ASSERT(state); + + // update current modulation + _modulation = CC1101_MOD_FORMAT_2_FSK; } // Update PA_TABLE values according to the new _modulation. From c0f5ef922c3d96c13f96bee20df5e272b71e340f Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 14:50:23 +0100 Subject: [PATCH 116/135] [CC1101] Update cached len value. --- src/modules/CC1101/CC1101.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index b4af2d0d..2884ee0d 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -792,6 +792,7 @@ int16_t CC1101::setPacketMode(uint8_t mode, uint8_t len) { RADIOLIB_ASSERT(state); // update the cached value + _packetLength = len; _packetLengthConfig = mode; return(state); } From 293fba2656794a3c8141455841b2d6ff70f5abb5 Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 15:09:39 +0100 Subject: [PATCH 117/135] [CC1101] Added carrier sense as sync word qualifier --- src/modules/CC1101/CC1101.cpp | 21 ++++++++++++--------- src/modules/CC1101/CC1101.h | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 2884ee0d..380658bd 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -470,7 +470,7 @@ int16_t CC1101::setOutputPower(int8_t power) { } } -int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) { +int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits, bool requireCarrierSense) { if((maxErrBits > 1) || (len != 2)) { return(ERR_INVALID_SYNC_WORD); } @@ -485,7 +485,7 @@ int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) _syncWordLength = len; // enable sync word filtering - int16_t state = enableSyncWordFiltering(maxErrBits); + int16_t state = enableSyncWordFiltering(maxErrBits, requireCarrierSense); RADIOLIB_ASSERT(state); // set sync word register @@ -495,9 +495,9 @@ int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) return(state); } -int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits) { +int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits, bool requireCarrierSense) { uint8_t syncWord[] = { syncH, syncL }; - return(setSyncWord(syncWord, sizeof(syncWord), maxErrBits)); + return(setSyncWord(syncWord, sizeof(syncWord), maxErrBits, requireCarrierSense)); } int16_t CC1101::setPreambleLength(uint8_t preambleLength) { @@ -627,21 +627,24 @@ int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { return(setPacketMode(CC1101_LENGTH_CONFIG_VARIABLE, maxLen)); } -int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits) { +int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits, bool requireCarrierSense) { switch (maxErrBits){ case 0: // in 16 bit sync word, expect all 16 bits. - return (SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_16_16, 2, 0)); + return (SPIsetRegValue(CC1101_REG_MDMCFG2, + requireCarrierSense ? CC1101_SYNC_MODE_16_16_THR : CC1101_SYNC_MODE_16_16, 2, 0)); case 1: // in 16 bit sync word, expect at least 15 bits. - return (SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_15_16, 2, 0)); + return (SPIsetRegValue(CC1101_REG_MDMCFG2, + requireCarrierSense ? CC1101_SYNC_MODE_15_16_THR : CC1101_SYNC_MODE_15_16, 2, 0)); default: return (ERR_INVALID_SYNC_WORD); } } -int16_t CC1101::disableSyncWordFiltering() { - return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_NONE, 2, 0)); +int16_t CC1101::disableSyncWordFiltering(bool requireCarrierSense) { + return(SPIsetRegValue(CC1101_REG_MDMCFG2, + requireCarrierSense ? CC1101_SYNC_MODE_NONE_THR : CC1101_SYNC_MODE_NONE, 2, 0)); } int16_t CC1101::setCrcFiltering(bool crcOn) { diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 0d3e44d9..2486647f 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -709,9 +709,11 @@ class CC1101: public PhysicalLayer { \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes */ - int16_t setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits = 0); + int16_t setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits = 0, bool requireCarrierSense = false); /*! \brief Sets 1 or 2 bytes of sync word. @@ -722,9 +724,11 @@ class CC1101: public PhysicalLayer { \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes */ - int16_t setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0); + int16_t setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0, bool requireCarrierSense = false); /*! \brief Sets preamble length. @@ -808,16 +812,20 @@ class CC1101: public PhysicalLayer { \param numBits Sync word length in bits. + \param requireCarrierSense Require carrier sense above threshold in addition to sync word. + \returns \ref status_codes */ - int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0); + int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0, bool requireCarrierSense = false); /*! \brief Disable preamble and sync word filtering and generation. + \param requireCarrierSense Require carrier sense above threshold. + \returns \ref status_codes */ - int16_t disableSyncWordFiltering(); + int16_t disableSyncWordFiltering(bool requireCarrierSense = false); /*! \brief Enable CRC filtering and generation. From 965631aa47705dc74568faa03a00c67d57fbe17f Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 21:53:52 +0100 Subject: [PATCH 118/135] [CC1101] Transmit up to 255 bytes --- src/modules/CC1101/CC1101.cpp | 41 ++++++++++++++++++++++++++++++++--- src/modules/CC1101/CC1101.h | 7 ++++-- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 380658bd..3f02dbeb 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -218,24 +218,54 @@ int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) { int16_t state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_SYNC_WORD_SENT_OR_RECEIVED); RADIOLIB_ASSERT(state); + // data put on FIFO. + uint8_t dataSent = 0; + // optionally write packet length if (_packetLengthConfig == CC1101_LENGTH_CONFIG_VARIABLE) { + + // enforce variable len limit. + if (len > 254) { + return (ERR_PACKET_TOO_LONG); + } + SPIwriteRegister(CC1101_REG_FIFO, len); + dataSent += 1; } // check address filtering uint8_t filter = SPIgetRegValue(CC1101_REG_PKTCTRL1, 1, 0); if(filter != CC1101_ADR_CHK_NONE) { SPIwriteRegister(CC1101_REG_FIFO, addr); + dataSent += 1; } - // write packet to FIFO - SPIwriteRegisterBurst(CC1101_REG_FIFO, data, len); + // fill the FIFO. + uint8_t initialWrite = min(len, (CC1101_FIFO_SIZE - dataSent)); + SPIwriteRegisterBurst(CC1101_REG_FIFO, data, initialWrite); + dataSent += initialWrite; // set mode to transmit SPIsendCommand(CC1101_CMD_TX); - return(state); + // keep feeding the FIFO until the packet is over. + uint8_t bytesInFIFO; + while (dataSent < len) { + // get number of bytes in FIFO. + bytesInFIFO = SPIgetRegValue(CC1101_REG_TXBYTES, 6, 0); + + // if there's room then put other data. + if (bytesInFIFO < CC1101_FIFO_SIZE) { + uint8_t bytesToWrite = min(CC1101_FIFO_SIZE - bytesInFIFO, len - dataSent); + SPIwriteRegisterBurst(CC1101_REG_FIFO, &data[dataSent], bytesToWrite); + dataSent += bytesToWrite; + } else { + // wait for radio to send some data. + delay(1); + } + } + + return (state); } int16_t CC1101::startReceive() { @@ -851,3 +881,8 @@ void CC1101::SPIsendCommand(uint8_t cmd) { SPI.endTransaction(); Module::digitalWrite(_mod->getCs(), HIGH); } + +uint8_t CC1101::min(uint8_t a, uint8_t b) { + if (a < b) return a; + return b; +} \ No newline at end of file diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 2486647f..5d27c420 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -8,9 +8,10 @@ // CC1101 physical layer properties #define CC1101_FREQUENCY_STEP_SIZE 396.7285156 -#define CC1101_MAX_PACKET_LENGTH 63 +#define CC1101_MAX_PACKET_LENGTH 255 #define CC1101_CRYSTAL_FREQ 26.0 #define CC1101_DIV_EXPONENT 16 +#define CC1101_FIFO_SIZE 64 // CC1101 SPI commands #define CC1101_CMD_READ 0b10000000 @@ -168,7 +169,7 @@ #define CC1101_RX_ATTEN_6_DB 0b00010000 // 5 4 6 dB #define CC1101_RX_ATTEN_12_DB 0b00100000 // 5 4 12 dB #define CC1101_RX_ATTEN_18_DB 0b00110000 // 5 4 18 dB -#define CC1101_FIFO_THR 0b00000111 // 5 4 Rx FIFO threshold [bytes] = CC1101_FIFO_THR * 4; Tx FIFO threshold [bytes] = 65 - (CC1101_FIFO_THR * 4) +#define CC1101_FIFO_THR_TX_61_RX_4 0b00000000 // 3 0 TX fifo threshold: 61, RX fifo threshold: 4 // CC1101_REG_SYNC1 #define CC1101_SYNC_WORD_MSB 0xD3 // 7 0 sync word MSB @@ -884,6 +885,8 @@ class CC1101: public PhysicalLayer { uint8_t _syncWordLength; int8_t _power; + uint8_t min(uint8_t a, uint8_t b); + int16_t config(); int16_t directMode(); void getExpMant(float target, uint16_t mantOffset, uint8_t divExp, uint8_t expMax, uint8_t& exp, uint8_t& mant); From 54405ac0429ff09b9c868167695f055b8916b3f6 Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Sun, 16 Feb 2020 21:57:07 +0100 Subject: [PATCH 119/135] [CC1101] Receive up to 255 bytes --- src/modules/CC1101/CC1101.cpp | 81 ++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 3f02dbeb..192708cf 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -124,13 +124,8 @@ int16_t CC1101::receive(uint8_t* data, size_t len) { int16_t state = startReceive(); RADIOLIB_ASSERT(state); - // wait for sync word - while(!digitalRead(_mod->getIrq())) { - yield(); - } - - // wait for packet end - while(digitalRead(_mod->getIrq())) { + // wait for rx queue to exceed threshold. + while (!digitalRead(_mod->getIrq())) { yield(); } @@ -275,8 +270,9 @@ int16_t CC1101::startReceive() { // flush Rx FIFO SPIsendCommand(CC1101_CMD_FLUSH_RX); - // set GDO0 mapping - int state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_SYNC_WORD_SENT_OR_RECEIVED); + // set GDO0 mapping: Asserted when RX FIFO > 4 bytes. + int state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_RX_FIFO_FULL_OR_PKT_END); + state |= SPIsetRegValue(CC1101_REG_FIFOTHR, CC1101_FIFO_THR_TX_61_RX_4, 3, 0); RADIOLIB_ASSERT(state); // set mode to receive @@ -288,8 +284,8 @@ int16_t CC1101::startReceive() { int16_t CC1101::readData(uint8_t* data, size_t len) { // get packet length size_t length = len; - if(len == CC1101_MAX_PACKET_LENGTH) { - length = getPacketLength(); + if (len == CC1101_MAX_PACKET_LENGTH) { + length = getPacketLength(true); } // check address filtering @@ -298,31 +294,66 @@ int16_t CC1101::readData(uint8_t* data, size_t len) { SPIreadRegister(CC1101_REG_FIFO); } - // read packet data - SPIreadRegisterBurst(CC1101_REG_FIFO, length, data); + uint8_t bytesInFIFO = SPIgetRegValue(CC1101_REG_RXBYTES, 6, 0); + uint16_t readBytes = 0; + unsigned long lastPop = millis(); - // read RSSI byte - _rawRSSI = SPIgetRegValue(CC1101_REG_FIFO); + // keep reading from FIFO until we get all the packet. + while (readBytes < length) { + if (bytesInFIFO == 0) { + if (millis() - lastPop > 5) { + // readData was required to read a packet longer than the one received. + RADIOLIB_DEBUG_PRINT(F("No data for more than 5mS. Stop here.")); + break; + } else { + delay(1); + bytesInFIFO = SPIgetRegValue(CC1101_REG_RXBYTES, 6, 0); + continue; + } + } + + // read the minimum between "remaining length" and bytesInFifo + uint8_t bytesToRead = min(length - readBytes, bytesInFIFO); + SPIreadRegisterBurst(CC1101_REG_FIFO, bytesToRead, &(data[readBytes])); + readBytes += bytesToRead; + lastPop = millis(); + + // Get how many bytes are left in FIFO. + bytesInFIFO = SPIgetRegValue(CC1101_REG_RXBYTES, 6, 0); + } + + // add terminating null + data[readBytes] = 0; + + // check if status bytes are enabled (default: CC1101_APPEND_STATUS_ON) + bool isAppendStatus = SPIgetRegValue(CC1101_REG_PKTCTRL1, 2, 2) == CC1101_APPEND_STATUS_ON; + + // If status byte is enabled at least 2 bytes (2 status bytes + any following packet) will remain in FIFO. + if (bytesInFIFO >= 2 && isAppendStatus) { + // read RSSI byte + _rawRSSI = SPIgetRegValue(CC1101_REG_FIFO); // read LQI and CRC byte uint8_t val = SPIgetRegValue(CC1101_REG_FIFO); _rawLQI = val & 0x7F; - // add terminating null - data[length] = 0; - - // flush Rx FIFO - SPIsendCommand(CC1101_CMD_FLUSH_RX); + // check CRC + if (_crcOn && (val & 0b10000000) == 0b00000000) { + return (ERR_CRC_MISMATCH); + } + } // clear internal flag so getPacketLength can return the new packet length _packetLengthQueried = false; - // set mode to standby - standby(); + // Flush then standby according to RXOFF_MODE (default: CC1101_RXOFF_IDLE) + if (SPIgetRegValue(CC1101_REG_MCSM1, 3, 2) == CC1101_RXOFF_IDLE) { - // check CRC - if (_crcOn && (val & 0b10000000) == 0b00000000) { - return (ERR_CRC_MISMATCH); + // flush Rx FIFO + SPIsendCommand(CC1101_CMD_FLUSH_RX); + + // set mode to standby + standby(); } return(ERR_NONE); From 4f78d95738e9a425e1bf9fd44576d91933fcf7af Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Mon, 17 Feb 2020 12:45:19 +0100 Subject: [PATCH 120/135] [CC1101] Fixed interrupt direction. Tested: CC1101_Receive, CC1101_Receive_Interrupt, CC1101_Transmit, CC1101_Transmit_Interrupt --- src/modules/CC1101/CC1101.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 5d27c420..ecc1b4ef 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -599,9 +599,9 @@ class CC1101: public PhysicalLayer { \param func ISR to call. - \param dir Signal change direction. Defaults to FALLING. + \param dir Signal change direction. Defaults to RISING. */ - void setGdo0Action(void (*func)(void), uint8_t dir = FALLING); + void setGdo0Action(void (*func)(void), uint8_t dir = RISING); /*! \brief Clears interrupt service routine to call when GDO0 activates. From c23b9302b0c69e9ce8e63bb07fbb040f83614c4a Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Mon, 17 Feb 2020 13:15:43 +0100 Subject: [PATCH 121/135] [CC1101] Requested changes PR #114 --- src/modules/CC1101/CC1101.cpp | 20 +++++++------------- src/modules/CC1101/CC1101.h | 2 -- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 192708cf..8a04b36b 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -236,7 +236,7 @@ int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) { } // fill the FIFO. - uint8_t initialWrite = min(len, (CC1101_FIFO_SIZE - dataSent)); + uint8_t initialWrite = min((uint8_t)len, (uint8_t)(CC1101_FIFO_SIZE - dataSent)); SPIwriteRegisterBurst(CC1101_REG_FIFO, data, initialWrite); dataSent += initialWrite; @@ -244,14 +244,13 @@ int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) { SPIsendCommand(CC1101_CMD_TX); // keep feeding the FIFO until the packet is over. - uint8_t bytesInFIFO; while (dataSent < len) { // get number of bytes in FIFO. - bytesInFIFO = SPIgetRegValue(CC1101_REG_TXBYTES, 6, 0); + uint8_t bytesInFIFO = SPIgetRegValue(CC1101_REG_TXBYTES, 6, 0); // if there's room then put other data. if (bytesInFIFO < CC1101_FIFO_SIZE) { - uint8_t bytesToWrite = min(CC1101_FIFO_SIZE - bytesInFIFO, len - dataSent); + uint8_t bytesToWrite = min((uint8_t)(CC1101_FIFO_SIZE - bytesInFIFO), (uint8_t)(len - dataSent)); SPIwriteRegisterBurst(CC1101_REG_FIFO, &data[dataSent], bytesToWrite); dataSent += bytesToWrite; } else { @@ -271,7 +270,7 @@ int16_t CC1101::startReceive() { SPIsendCommand(CC1101_CMD_FLUSH_RX); // set GDO0 mapping: Asserted when RX FIFO > 4 bytes. - int state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_RX_FIFO_FULL_OR_PKT_END); + int16_t state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_RX_FIFO_FULL_OR_PKT_END); state |= SPIsetRegValue(CC1101_REG_FIFOTHR, CC1101_FIFO_THR_TX_61_RX_4, 3, 0); RADIOLIB_ASSERT(state); @@ -296,14 +295,14 @@ int16_t CC1101::readData(uint8_t* data, size_t len) { uint8_t bytesInFIFO = SPIgetRegValue(CC1101_REG_RXBYTES, 6, 0); uint16_t readBytes = 0; - unsigned long lastPop = millis(); + uint32_t lastPop = millis(); // keep reading from FIFO until we get all the packet. while (readBytes < length) { if (bytesInFIFO == 0) { if (millis() - lastPop > 5) { // readData was required to read a packet longer than the one received. - RADIOLIB_DEBUG_PRINT(F("No data for more than 5mS. Stop here.")); + RADIOLIB_DEBUG_PRINTLN(F("No data for more than 5mS. Stop here.")); break; } else { delay(1); @@ -313,7 +312,7 @@ int16_t CC1101::readData(uint8_t* data, size_t len) { } // read the minimum between "remaining length" and bytesInFifo - uint8_t bytesToRead = min(length - readBytes, bytesInFIFO); + uint8_t bytesToRead = min((uint8_t)(length - readBytes), bytesInFIFO); SPIreadRegisterBurst(CC1101_REG_FIFO, bytesToRead, &(data[readBytes])); readBytes += bytesToRead; lastPop = millis(); @@ -912,8 +911,3 @@ void CC1101::SPIsendCommand(uint8_t cmd) { SPI.endTransaction(); Module::digitalWrite(_mod->getCs(), HIGH); } - -uint8_t CC1101::min(uint8_t a, uint8_t b) { - if (a < b) return a; - return b; -} \ No newline at end of file diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index ecc1b4ef..714b2da4 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -885,8 +885,6 @@ class CC1101: public PhysicalLayer { uint8_t _syncWordLength; int8_t _power; - uint8_t min(uint8_t a, uint8_t b); - int16_t config(); int16_t directMode(); void getExpMant(float target, uint16_t mantOffset, uint8_t divExp, uint8_t expMax, uint8_t& exp, uint8_t& mant); From 90944a5b00593fd486600c97912387e6d744572b Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 18 Feb 2020 07:35:04 +0100 Subject: [PATCH 122/135] [RF69] Removed redundant null terminator --- src/modules/RF69/RF69.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index aeb1e618..6be42a38 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -326,9 +326,6 @@ int16_t RF69::readData(uint8_t* data, size_t len) { // read packet data _mod->SPIreadRegisterBurst(RF69_REG_FIFO, length, data); - // add terminating null - data[length] = 0; - // update RSSI lastPacketRSSI = -1.0 * (_mod->SPIgetRegValue(RF69_REG_RSSI_VALUE)/2.0); From 99a5a7d1e4eab132b9577ee837d58468d75989d7 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 18 Feb 2020 07:35:41 +0100 Subject: [PATCH 123/135] [nRF24] Removed redundant null terminator --- src/modules/nRF24/nRF24.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/modules/nRF24/nRF24.cpp b/src/modules/nRF24/nRF24.cpp index 14f9a943..3a91862d 100644 --- a/src/modules/nRF24/nRF24.cpp +++ b/src/modules/nRF24/nRF24.cpp @@ -218,9 +218,6 @@ int16_t nRF24::readData(uint8_t* data, size_t len) { // read packet data SPIreadRxPayload(data, length); - // add terminating null - data[length] = 0; - // clear interrupt clearIRQ(); From 885ca868a001c563ebc88aa40d9e1202cc04a23c Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 18 Feb 2020 13:36:06 +0100 Subject: [PATCH 124/135] [CC1101] Removed redundant null terminator --- src/modules/CC1101/CC1101.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 380658bd..022f5eff 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -278,9 +278,6 @@ int16_t CC1101::readData(uint8_t* data, size_t len) { uint8_t val = SPIgetRegValue(CC1101_REG_FIFO); _rawLQI = val & 0x7F; - // add terminating null - data[length] = 0; - // flush Rx FIFO SPIsendCommand(CC1101_CMD_FLUSH_RX); From a60837bb9d01e417b5205a36882489af1b6483b2 Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 20 Feb 2020 12:18:52 +0100 Subject: [PATCH 125/135] [CC1101] Removed old call to SPI end --- src/modules/CC1101/CC1101.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 022f5eff..a207bafb 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -42,7 +42,7 @@ int16_t CC1101::begin(float freq, float br, float freqDev, float rxBw, int8_t po if(!flagFound) { RADIOLIB_DEBUG_PRINTLN(F("No CC1101 found!")); - SPI.end(); + _mod->term(); return(ERR_CHIP_NOT_FOUND); } else { RADIOLIB_DEBUG_PRINTLN(F("Found CC1101! (match by CC1101_REG_VERSION == 0x14)")); From 3054d966a2cec6219c33d2b66bc6370f13a6412a Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 20 Feb 2020 12:19:00 +0100 Subject: [PATCH 126/135] [RF69] Removed old call to SPI end --- src/modules/RF69/RF69.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 6be42a38..b652a5fd 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -47,7 +47,7 @@ int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t powe if(!flagFound) { RADIOLIB_DEBUG_PRINTLN(F("No RF69 found!")); - SPI.end(); + _mod->term(); return(ERR_CHIP_NOT_FOUND); } else { RADIOLIB_DEBUG_PRINTLN(F("Found RF69! (match by RF69_REG_VERSION == 0x24)")); From 4459432998e457317f51c444731f228e4cc445e6 Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 20 Feb 2020 12:19:16 +0100 Subject: [PATCH 127/135] [SX1231] Removed old call to SPI end --- src/modules/SX1231/SX1231.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX1231/SX1231.cpp b/src/modules/SX1231/SX1231.cpp index 8c38e8cb..b7412bcb 100644 --- a/src/modules/SX1231/SX1231.cpp +++ b/src/modules/SX1231/SX1231.cpp @@ -37,7 +37,7 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po if(!flagFound) { RADIOLIB_DEBUG_PRINTLN(F("No SX1231 found!")); - SPI.end(); + _mod->term(); return(ERR_CHIP_NOT_FOUND); } else { RADIOLIB_DEBUG_PRINTLN(F("Found SX1231!")); From 1a75ff837e33b6f8621ebbe734e7b8eeb4727398 Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 20 Feb 2020 12:35:44 +0100 Subject: [PATCH 128/135] [Module] Fixed interface termination --- src/Module.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Module.cpp b/src/Module.cpp index 27181535..90075b07 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -73,8 +73,17 @@ void Module::init(uint8_t interface) { } void Module::term() { - // stop SPI - _spi->end(); + // stop hardware interface + switch(interface) { + case RADIOLIB_USE_SPI: + _spi->end(); + break; + case RADIOLIB_USE_UART: + ModuleSerial->end(baudrate, SERIAL_8N1, _rx, _tx); + break; + case RADIOLIB_USE_I2C: + break; + } } void Module::ATemptyBuffer() { From 16073f05ea0464152139e0ed1e695fc135c72c6f Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 20 Feb 2020 12:38:51 +0100 Subject: [PATCH 129/135] [Module] Fixed incorrect arguments --- src/Module.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Module.cpp b/src/Module.cpp index 90075b07..bce8abd4 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -73,16 +73,13 @@ void Module::init(uint8_t interface) { } void Module::term() { - // stop hardware interface - switch(interface) { - case RADIOLIB_USE_SPI: - _spi->end(); - break; - case RADIOLIB_USE_UART: - ModuleSerial->end(baudrate, SERIAL_8N1, _rx, _tx); - break; - case RADIOLIB_USE_I2C: - break; + // stop hardware interfaces + if(_spi != nullptr) { + _spi->end(); + } + + if(ModuleSerial != nullptr) { + ModuleSerial->end(); } } From 4426c9174d66946088eafcb164d3762f1a513305 Mon Sep 17 00:00:00 2001 From: 4m1g0 Date: Mon, 24 Feb 2020 15:50:07 +0100 Subject: [PATCH 130/135] [SX127x] Set OOK parameter before setting the bitrate to avoid reading undefined variable --- src/modules/SX127x/SX127x.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 36e4f857..73d796bf 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -74,6 +74,10 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB RADIOLIB_ASSERT(state); } + // enable/disable OOK + state = setOOK(enableOOK); + RADIOLIB_ASSERT(state); + // set bit rate state = SX127x::setBitRate(br); RADIOLIB_ASSERT(state); @@ -103,10 +107,6 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB state = disableAddressFiltering(); RADIOLIB_ASSERT(state); - // enable/disable OOK - state = setOOK(enableOOK); - RADIOLIB_ASSERT(state); - // set default RSSI measurement config state = setRSSIConfig(2); RADIOLIB_ASSERT(state); From 1a721715ea974c3410f12b0d2aaad7561ab3f42c Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 24 Feb 2020 16:41:21 +0100 Subject: [PATCH 131/135] Bump version to 3.3.1 --- library.properties | 2 +- src/TypeDef.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 81829f5b..bee08568 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=3.3.0 +version=3.3.1 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino diff --git a/src/TypeDef.h b/src/TypeDef.h index fb5455ae..8ed5b4ee 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -10,7 +10,7 @@ // version definitions #define RADIOLIB_VERSION_MAJOR (0x03) #define RADIOLIB_VERSION_MINOR (0x03) -#define RADIOLIB_VERSION_PATCH (0x00) +#define RADIOLIB_VERSION_PATCH (0x01) #define RADIOLIB_VERSION_EXTRA (0x00) #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MAJOR << 16) | (RADIOLIB_VERSION_MAJOR << 8) | (RADIOLIB_VERSION_EXTRA)) From 93981f1fcbae458ced7cc2e0f5859e6db00caf9d Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Wed, 26 Feb 2020 15:54:41 +0100 Subject: [PATCH 132/135] [nRF24] Added "isCarrierDetected()" --- src/modules/nRF24/nRF24.cpp | 4 ++++ src/modules/nRF24/nRF24.h | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/modules/nRF24/nRF24.cpp b/src/modules/nRF24/nRF24.cpp index 14f9a943..3bd01719 100644 --- a/src/modules/nRF24/nRF24.cpp +++ b/src/modules/nRF24/nRF24.cpp @@ -426,6 +426,10 @@ int16_t nRF24::getStatus(uint8_t mask) { return(_mod->SPIgetRegValue(NRF24_REG_STATUS) & mask); } +bool nRF24::isCarrierDetected() { + return(_mod->SPIgetRegValue(NRF24_REG_RPD, 0,0)) == 1; +} + int16_t nRF24::setFrequencyDeviation(float freqDev) { // nRF24 is unable to set frequency deviation // this method is implemented only for PhysicalLayer compatibility diff --git a/src/modules/nRF24/nRF24.h b/src/modules/nRF24/nRF24.h index 6eafc342..4528c949 100644 --- a/src/modules/nRF24/nRF24.h +++ b/src/modules/nRF24/nRF24.h @@ -392,6 +392,13 @@ class nRF24: public PhysicalLayer { */ int16_t getStatus(uint8_t mask = 0xFF); + /*! + \brief Checks if carrier was detected during last RX + + \returns Whatever the carrier was above threshold. + */ + bool isCarrierDetected(); + /*! \brief Dummy configuration method, to ensure PhysicalLayer compatibility. From 959f8751b0dbf03fbbc8f31d046d99d747838aed Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Wed, 26 Feb 2020 15:55:44 +0100 Subject: [PATCH 133/135] [nRF24] Minor fixes --- src/modules/nRF24/nRF24.cpp | 15 +++++++++------ src/modules/nRF24/nRF24.h | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/modules/nRF24/nRF24.cpp b/src/modules/nRF24/nRF24.cpp index 3bd01719..67985a72 100644 --- a/src/modules/nRF24/nRF24.cpp +++ b/src/modules/nRF24/nRF24.cpp @@ -233,14 +233,9 @@ int16_t nRF24::setFrequency(int16_t freq) { return(ERR_INVALID_FREQUENCY); } - // set mode to standby - int16_t state = standby(); - RADIOLIB_ASSERT(state); - // set frequency uint8_t freqRaw = freq - 2400; - state = _mod->SPIsetRegValue(NRF24_REG_RF_CH, freqRaw, 6, 0); - return(state); + return _mod->SPIsetRegValue(NRF24_REG_RF_CH, freqRaw, 6, 0); } int16_t nRF24::setDataRate(int16_t dataRate) { @@ -335,6 +330,7 @@ int16_t nRF24::setTransmitPipe(uint8_t* addr) { // set Rx pipe 0 address (for ACK) _mod->SPIwriteRegisterBurst(NRF24_REG_RX_ADDR_P0, addr, _addrWidth); + state |= _mod->SPIsetRegValue(NRF24_REG_EN_RXADDR, NRF24_P0_ON, 0, 0); return(state); } @@ -445,6 +441,13 @@ size_t nRF24::getPacketLength(bool update) { } int16_t nRF24::setCrcFiltering(bool crcOn) { + // Auto Ack needs to be disabled in order to disable CRC. + if (!crcOn) { + int16_t status = setAutoAck(false); + RADIOLIB_ASSERT(status) + } + + // Disable CRC return _mod->SPIsetRegValue(NRF24_REG_CONFIG, crcOn ? NRF24_CRC_ON : NRF24_CRC_OFF, 3, 3); } diff --git a/src/modules/nRF24/nRF24.h b/src/modules/nRF24/nRF24.h index 4528c949..3ca3ac75 100644 --- a/src/modules/nRF24/nRF24.h +++ b/src/modules/nRF24/nRF24.h @@ -127,7 +127,7 @@ // NRF24_REG_STATUS #define NRF24_RX_DR 0b01000000 // 6 6 Rx data ready #define NRF24_TX_DS 0b00100000 // 5 5 Tx data sent -#define NRF24_MAX_RT 0b00010000 // 4 4 maximum number of rentransmits reached (must be cleared to continue) +#define NRF24_MAX_RT 0b00010000 // 4 4 maximum number of retransmits reached (must be cleared to continue) #define NRF24_RX_FIFO_EMPTY 0b00001110 // 3 1 Rx FIFO is empty #define NRF24_RX_P_NO 0b00000000 // 3 1 number of data pipe that received data #define NRF24_TX_FIFO_FULL 0b00000001 // 0 0 Tx FIFO is full From c1e4be41b0875a8eed48632aa11c9746fd7526e1 Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Thu, 27 Feb 2020 20:11:47 +0100 Subject: [PATCH 134/135] [nRF24] Removed ambiguity, PR #119 --- src/modules/nRF24/nRF24.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/nRF24/nRF24.h b/src/modules/nRF24/nRF24.h index 3ca3ac75..70362dfe 100644 --- a/src/modules/nRF24/nRF24.h +++ b/src/modules/nRF24/nRF24.h @@ -445,7 +445,7 @@ class nRF24: public PhysicalLayer { \returns \ref status_codes */ - int16_t setAutoAck(uint8_t pipeNum, bool autoAckOn = true); + int16_t setAutoAck(uint8_t pipeNum, bool autoAckOn); /*! \brief Dummy data shaping configuration method, to ensure PhysicalLayer compatibility. From 1da981a7cd3f6cbb3e20ea3f88bd7cf1b9e625e4 Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Fri, 10 Apr 2020 12:26:16 +0200 Subject: [PATCH 135/135] [CC1101] Added bitrate caching. --- src/modules/CC1101/CC1101.cpp | 7 ++++++- src/modules/CC1101/CC1101.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index 8a04b36b..6b01a9d8 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -401,7 +401,12 @@ int16_t CC1101::setBitRate(float br) { // set bit rate value int16_t state = SPIsetRegValue(CC1101_REG_MDMCFG4, e, 3, 0); state |= SPIsetRegValue(CC1101_REG_MDMCFG3, m); - return(state); + + if (state == ERR_NONE) { + _br = br; + } + + return (state); } int16_t CC1101::setRxBandwidth(float rxBw) { diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index 714b2da4..56062f73 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -871,6 +871,7 @@ class CC1101: public PhysicalLayer { Module* _mod; float _freq; + float _br; uint8_t _rawRSSI; uint8_t _rawLQI; uint8_t _modulation;