From b02989e07a27a6e92a4fd3e35470050493be35d7 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 3 Jan 2025 21:58:59 +0100 Subject: [PATCH] Cleanup --- Utilities.h | 8 +- sx128x.cpp | 782 +++++++++++++++++++--------------------------------- sx128x.h | 5 +- 3 files changed, 286 insertions(+), 509 deletions(-) diff --git a/Utilities.h b/Utilities.h index 0bf15eb..aae8738 100644 --- a/Utilities.h +++ b/Utilities.h @@ -1214,13 +1214,7 @@ void setFrequency() { } } -uint8_t getRandom() { - if (radio_online) { - return LoRa->random(); - } else { - return 0x00; - } -} +uint8_t getRandom() { return random(0xFF); } void promisc_enable() { promisc = true; diff --git a/sx128x.cpp b/sx128x.cpp index c59752d..8e70d24 100644 --- a/sx128x.cpp +++ b/sx128x.cpp @@ -1,7 +1,7 @@ // Copyright (c) Sandeep Mistry. All rights reserved. // Licensed under the MIT license. -// Modifications and additions copyright 2024 by Mark Qvist +// Modifications and additions copyright 2024 by Mark Qvist & Jacob Eva // Obviously still under the MIT license. #include "sx128x.h" @@ -114,19 +114,12 @@ sx128x::sx128x() : bool ISR_VECT sx128x::getPacketValidity() { uint8_t buf[2]; - buf[0] = 0x00; buf[1] = 0x00; - executeOpcodeRead(OP_GET_IRQ_STATUS_8X, buf, 2); - executeOpcode(OP_CLEAR_IRQ_STATUS_8X, buf, 2); - - if ((buf[1] & IRQ_PAYLOAD_CRC_ERROR_MASK_8X) == 0) { - return true; - } else { - return false; - } + if ((buf[1] & IRQ_PAYLOAD_CRC_ERROR_MASK_8X) == 0) { return true; } + else { return false; } } void ISR_VECT sx128x::onDio0Rise() { @@ -162,42 +155,32 @@ void sx128x::handleDio0Rise() { } bool sx128x::preInit() { - // setup pins pinMode(_ss, OUTPUT); - // set SS high digitalWrite(_ss, HIGH); // todo: check if this change causes issues on any platforms #if MCU_VARIANT == MCU_ESP32 - if (pin_sclk != -1 && pin_miso != -1 && pin_mosi != -1 && pin_cs != -1) { - SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); - } else { - SPI.begin(); - } + if (pin_sclk != -1 && pin_miso != -1 && pin_mosi != -1 && pin_cs != -1) { + SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); + } else { + SPI.begin(); + } #else SPI.begin(); #endif - // check version (retry for up to 2 seconds) + // Detect modem (retry for up to 2 seconds) long start = millis(); - uint8_t version_msb; uint8_t version_lsb; - while (((millis() - start) < 2000) && (millis() >= start)) { - version_msb = readRegister(REG_FIRM_VER_MSB); version_lsb = readRegister(REG_FIRM_VER_LSB); - - if ((version_msb == 0xB7 && version_lsb == 0xA9) || (version_msb == 0xB5 && version_lsb == 0xA9)) { - break; - } + if ((version_msb == 0xB7 && version_lsb == 0xA9) || (version_msb == 0xB5 && version_lsb == 0xA9)) { break; } delay(100); } - if ((version_msb != 0xB7 || version_lsb != 0xA9) && (version_msb != 0xB5 || version_lsb != 0xA9)) { - return false; - } + if ((version_msb != 0xB7 || version_lsb != 0xA9) && (version_msb != 0xB5 || version_lsb != 0xA9)) { return false; } _preinit_done = true; return true; } @@ -205,144 +188,86 @@ bool sx128x::preInit() { uint8_t ISR_VECT sx128x::readRegister(uint16_t address) { return singleTransfer(OP_READ_REGISTER_8X, address, 0x00); } void sx128x::writeRegister(uint16_t address, uint8_t value) { singleTransfer(OP_WRITE_REGISTER_8X, address, value); } -uint8_t ISR_VECT sx128x::singleTransfer(uint8_t opcode, uint16_t address, uint8_t value) -{ +uint8_t ISR_VECT sx128x::singleTransfer(uint8_t opcode, uint16_t address, uint8_t value) { waitOnBusy(); - uint8_t response; - digitalWrite(_ss, LOW); SPI.beginTransaction(_spiSettings); SPI.transfer(opcode); SPI.transfer((address & 0xFF00) >> 8); SPI.transfer(address & 0x00FF); - if (opcode == OP_READ_REGISTER_8X) { - SPI.transfer(0x00); - } + if (opcode == OP_READ_REGISTER_8X) { SPI.transfer(0x00); } response = SPI.transfer(value); SPI.endTransaction(); - digitalWrite(_ss, HIGH); return response; } -void sx128x::rxAntEnable() -{ - if (_txen != -1) { - digitalWrite(_txen, LOW); - } - if (_rxen != -1) { - digitalWrite(_rxen, HIGH); - } +void sx128x::rxAntEnable() { + if (_txen != -1) { digitalWrite(_txen, LOW); } + if (_rxen != -1) { digitalWrite(_rxen, HIGH); } } -void sx128x::txAntEnable() -{ - if (_txen != -1) { - digitalWrite(_txen, HIGH); - } - if (_rxen != -1) { - digitalWrite(_rxen, LOW); - } +void sx128x::txAntEnable() { + if (_txen != -1) { digitalWrite(_txen, HIGH); } + if (_rxen != -1) { digitalWrite(_rxen, LOW); } } void sx128x::loraMode() { - // enable lora mode on the SX1262 chip uint8_t mode = MODE_LONG_RANGE_MODE_8X; executeOpcode(OP_PACKET_TYPE_8X, &mode, 1); } void sx128x::waitOnBusy() { - unsigned long time = millis(); - while (digitalRead(_busy) == HIGH) - { - if (millis() >= (time + 100)) { - break; - } - // do nothing - } + unsigned long time = millis(); + while (digitalRead(_busy) == HIGH) { + if (millis() >= (time + 100)) { break; } + } } -void sx128x::executeOpcode(uint8_t opcode, uint8_t *buffer, uint8_t size) -{ +void sx128x::executeOpcode(uint8_t opcode, uint8_t *buffer, uint8_t size) { waitOnBusy(); - digitalWrite(_ss, LOW); - SPI.beginTransaction(_spiSettings); SPI.transfer(opcode); - - for (int i = 0; i < size; i++) - { - SPI.transfer(buffer[i]); - } - + for (int i = 0; i < size; i++) { SPI.transfer(buffer[i]); } SPI.endTransaction(); - digitalWrite(_ss, HIGH); } -void sx128x::executeOpcodeRead(uint8_t opcode, uint8_t *buffer, uint8_t size) -{ +void sx128x::executeOpcodeRead(uint8_t opcode, uint8_t *buffer, uint8_t size) { waitOnBusy(); - digitalWrite(_ss, LOW); - SPI.beginTransaction(_spiSettings); SPI.transfer(opcode); SPI.transfer(0x00); - - for (int i = 0; i < size; i++) - { - buffer[i] = SPI.transfer(0x00); - } - + for (int i = 0; i < size; i++) { buffer[i] = SPI.transfer(0x00); } SPI.endTransaction(); - digitalWrite(_ss, HIGH); } -void sx128x::writeBuffer(const uint8_t* buffer, size_t size) -{ +void sx128x::writeBuffer(const uint8_t* buffer, size_t size) { waitOnBusy(); - digitalWrite(_ss, LOW); - SPI.beginTransaction(_spiSettings); SPI.transfer(OP_FIFO_WRITE_8X); SPI.transfer(_fifo_tx_addr_ptr); - - for (int i = 0; i < size; i++) - { - SPI.transfer(buffer[i]); - _fifo_tx_addr_ptr++; - } - + for (int i = 0; i < size; i++) { SPI.transfer(buffer[i]); _fifo_tx_addr_ptr++; } SPI.endTransaction(); - digitalWrite(_ss, HIGH); } -void sx128x::readBuffer(uint8_t* buffer, size_t size) -{ +void sx128x::readBuffer(uint8_t* buffer, size_t size) { waitOnBusy(); - digitalWrite(_ss, LOW); - SPI.beginTransaction(_spiSettings); SPI.transfer(OP_FIFO_READ_8X); SPI.transfer(_fifo_rx_addr_ptr); SPI.transfer(0x00); - - for (int i = 0; i < size; i++) - { - buffer[i] = SPI.transfer(0x00); - } - + for (int i = 0; i < size; i++) { buffer[i] = SPI.transfer(0x00); } SPI.endTransaction(); - digitalWrite(_ss, HIGH); } @@ -350,24 +275,19 @@ void sx128x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr) { // because there is no access to these registers on the sx1280, we have // to set all these parameters at once or not at all. uint8_t buf[3]; - buf[0] = sf << 4; buf[1] = bw; - buf[2] = cr; + buf[2] = cr; executeOpcode(OP_MODULATION_PARAMS_8X, buf, 3); - if (sf <= 6) { - writeRegister(0x925, 0x1E); - } else if (sf <= 8) { - writeRegister(0x925, 0x37); - } else if (sf >= 9) { - writeRegister(0x925, 0x32); - } + if (sf <= 6) { writeRegister(0x925, 0x1E); } + else if (sf <= 8) { writeRegister(0x925, 0x37); } + else if (sf >= 9) { writeRegister(0x925, 0x32); } writeRegister(0x093C, 0x1); } void sx128x::setPacketParams(uint32_t preamble, uint8_t headermode, uint8_t length, uint8_t crc) { - // because there is no access to these registers on the sx1280, we have + // Because there is no access to these registers on the sx1280, we have // to set all these parameters at once or not at all. uint8_t buf[7]; // calculate exponent and mantissa values for modem @@ -390,21 +310,16 @@ void sx128x::setPacketParams(uint32_t preamble, uint8_t headermode, uint8_t leng buf[1] = headermode; buf[2] = length; buf[3] = crc; - // standard IQ setting (no inversion) - buf[4] = 0x40; - // unused params - buf[5] = 0x00; + buf[4] = 0x40; // standard IQ setting (no inversion) + buf[5] = 0x00; // unused params buf[6] = 0x00; executeOpcode(OP_PACKET_PARAMS_8X, buf, 7); } -int sx128x::begin(unsigned long frequency) -{ +int sx128x::begin(unsigned long frequency) { if (_reset != -1) { pinMode(_reset, OUTPUT); - - // perform reset digitalWrite(_reset, LOW); delay(10); digitalWrite(_reset, HIGH); @@ -424,21 +339,16 @@ int sx128x::begin(unsigned long frequency) standby(); loraMode(); rxAntEnable(); - - Serial.printf("Setting freq to %d\r\n", _frequency); - Serial.printf("Should be %d\r\n", frequency); setFrequency(frequency); - // set LNA boost - // todo: implement this + // TODO: Implement LNA boost //writeRegister(REG_LNA, 0x96); setModulationParams(_sf, _bw, _cr); setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); - setTxPower(_txp); - // set base addresses + // Set base addresses uint8_t basebuf[2] = {0}; executeOpcode(OP_BUFFER_BASE_ADDR_8X, basebuf, 2); @@ -446,28 +356,19 @@ int sx128x::begin(unsigned long frequency) return 1; } -void sx128x::end() -{ - // put in sleep mode +void sx128x::end() { sleep(); - - // stop SPI SPI.end(); - _bitrate = 0; _radio_online = false; _preinit_done = false; } int sx128x::beginPacket(int implicitHeader) { - // put in standby mode standby(); - if (implicitHeader) { - implicitHeaderMode(); - } else { - explicitHeaderMode(); - } + if (implicitHeader) { implicitHeaderMode(); } + else { explicitHeaderMode(); } _payloadLength = 0; _fifo_tx_addr_ptr = 0; @@ -476,25 +377,22 @@ int sx128x::beginPacket(int implicitHeader) { return 1; } -int sx128x::endPacket() -{ +int sx128x::endPacket() { setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); - txAntEnable(); - // put in single TX mode + // Put in single TX mode uint8_t timeout[3] = {0}; executeOpcode(OP_TX_8X, timeout, 3); uint8_t buf[2]; - buf[0] = 0x00; buf[1] = 0x00; executeOpcodeRead(OP_GET_IRQ_STATUS_8X, buf, 2); + // Wait for TX done bool timed_out = false; uint32_t w_timeout = millis()+LORA_MODEM_TIMEOUT_MS; - // wait for TX done while ((millis() < w_timeout) && ((buf[1] & IRQ_TX_DONE_MASK_8X) == 0)) { buf[0] = 0x00; buf[1] = 0x00; @@ -510,33 +408,24 @@ int sx128x::endPacket() mask[1] = IRQ_TX_DONE_MASK_8X; executeOpcode(OP_CLEAR_IRQ_STATUS_8X, mask, 2); - if (timed_out) { - return 0; - } else { - return 1; - } + if (timed_out) { return 0; } + else { return 1; } } uint8_t sx128x::modemStatus() { - // imitate the register status from the sx1276 / 78 + // Imitate the register status from the sx1276 / 78 uint8_t buf[2] = {0}; - executeOpcodeRead(OP_GET_IRQ_STATUS_8X, buf, 2); - uint8_t clearbuf[2] = {0}; - uint8_t byte = 0x00; if ((buf[0] & IRQ_PREAMBLE_DET_MASK_8X) != 0) { byte = byte | 0x01 | 0x04; - // clear register after reading + // Clear register after reading clearbuf[0] = IRQ_PREAMBLE_DET_MASK_8X; } - if ((buf[1] & IRQ_HEADER_DET_MASK_8X) != 0) { - byte = byte | 0x02 | 0x04; - } - + if ((buf[1] & IRQ_HEADER_DET_MASK_8X) != 0) { byte = byte | 0x02 | 0x04; } executeOpcode(OP_CLEAR_IRQ_STATUS_8X, clearbuf, 2); return byte; @@ -563,7 +452,7 @@ uint8_t sx128x::packetRssiRaw() { } int ISR_VECT sx128x::packetRssi(uint8_t pkt_snr_raw) { - // may need more calculations here + // TODO: May need more calculations here uint8_t buf[5] = {0}; executeOpcodeRead(OP_PACKET_STATUS_8X, buf, 5); int pkt_rssi = -buf[0] / 2; @@ -582,79 +471,63 @@ float ISR_VECT sx128x::packetSnr() { return float(buf[1]) * 0.25; } -long sx128x::packetFrequencyError() -{ +long sx128x::packetFrequencyError() { + // TODO: implement this, page 120 of sx1280 datasheet int32_t freqError = 0; - // todo: implement this, page 120 of sx1280 datasheet const float fError = 0.0; return static_cast(fError); } -size_t sx128x::write(uint8_t byte) -{ - return write(&byte, sizeof(byte)); -} +void sx128x::flush() { } -size_t sx128x::write(const uint8_t *buffer, size_t size) -{ +int ISR_VECT sx128x::available() { return _rxPacketLength - _packetIndex; } + +size_t sx128x::write(uint8_t byte) { return write(&byte, sizeof(byte)); } + +size_t sx128x::write(const uint8_t *buffer, size_t size) { if ((_payloadLength + size) > MAX_PKT_LENGTH) { size = MAX_PKT_LENGTH - _payloadLength; } - // write data writeBuffer(buffer, size); _payloadLength = _payloadLength + size; return size; } -int ISR_VECT sx128x::available() -{ - return _rxPacketLength - _packetIndex; -} - -int ISR_VECT sx128x::read() -{ - if (!available()) { - return -1; - } +int ISR_VECT sx128x::read() { + if (!available()) { return -1; } - // if received new packet - if (_packetIndex == 0) { - uint8_t rxbuf[2] = {0}; - executeOpcodeRead(OP_RX_BUFFER_STATUS_8X, rxbuf, 2); - int size; - // If implicit header mode is enabled, read packet length as payload length instead. - // See SX1280 datasheet v3.2, page 92 - if (_implicitHeaderMode == 0x80) { - size = _payloadLength; - } else { - size = rxbuf[0]; - } - _fifo_rx_addr_ptr = rxbuf[1]; - - if (size > 255) { - size = 255; - } - - readBuffer(_packet, size); + // If received new packet + if (_packetIndex == 0) { + uint8_t rxbuf[2] = {0}; + executeOpcodeRead(OP_RX_BUFFER_STATUS_8X, rxbuf, 2); + int size; + + // If implicit header mode is enabled, read packet length as payload length instead. + // See SX1280 datasheet v3.2, page 92 + if (_implicitHeaderMode == 0x80) { + size = _payloadLength; + } else { + size = rxbuf[0]; } - uint8_t byte = _packet[_packetIndex]; - _packetIndex++; - return byte; -} + _fifo_rx_addr_ptr = rxbuf[1]; + if (size > 255) { size = 255; } -int sx128x::peek() -{ - if (!available()) { - return -1; + readBuffer(_packet, size); } + uint8_t byte = _packet[_packetIndex]; + _packetIndex++; + return byte; +} + +int sx128x::peek() { + if (!available()) { return -1; } uint8_t b = _packet[_packetIndex]; return b; } -void sx128x::flush() { } void sx128x::onReceive(void(*callback)(int)) { _onReceive = callback; @@ -662,10 +535,10 @@ void sx128x::onReceive(void(*callback)(int)) { if (callback) { pinMode(_dio0, INPUT); - // set preamble and header detection irqs, plus dio0 mask + // Set preamble and header detection irqs, plus dio0 mask uint8_t buf[8]; - // set irq masks, enable all + // Set irq masks, enable all buf[0] = 0xFF; buf[1] = 0xFF; @@ -680,11 +553,11 @@ void sx128x::onReceive(void(*callback)(int)) { buf[2] = 0x00; buf[3] = IRQ_RX_DONE_MASK_8X | IRQ_HEADER_ERROR_MASK_8X; - // set dio1 masks + // Set dio1 masks buf[4] = 0x00; buf[5] = 0x00; - // set dio2 masks + // Set dio2 masks buf[6] = 0x00; buf[7] = 0x00; @@ -704,12 +577,10 @@ void sx128x::onReceive(void(*callback)(int)) { } } -void sx128x::receive(int size) -{ +void sx128x::receive(int size) { if (size > 0) { implicitHeaderMode(); - - // tell radio payload length + // Tell radio payload length //_rxPacketLength = size; //_payloadLength = size; //setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); @@ -719,40 +590,20 @@ void sx128x::receive(int size) rxAntEnable(); - // On the SX1280, there is a bug which can cause the busy line - // to remain high if a high amount of packets are received when - // in continuous RX mode. This is documented as Errata 16.1 in - // the SX1280 datasheet v3.2 (page 149) - // Therefore, the modem is set to single RX mode below instead. - uint8_t mode[3] = {0}; // single RX mode - executeOpcode(OP_RX_8X, mode, 3); + // On the SX1280, there is a bug which can cause the busy line + // to remain high if a high amount of packets are received when + // in continuous RX mode. This is documented as Errata 16.1 in + // the SX1280 datasheet v3.2 (page 149) + // Therefore, the modem is set to single RX mode below instead. + uint8_t mode[3] = {0}; // single RX mode + executeOpcode(OP_RX_8X, mode, 3); } -void sx128x::standby() -{ +void sx128x::standby() { uint8_t byte; - if (_tcxo) { - // STDBY_XOSC - byte = 0x01; - } else { - // STDBY_RC - byte = 0x00; - } - executeOpcode(OP_STANDBY_8X, &byte, 1); -} - -void sx128x::sleep() -{ - uint8_t byte = 0x00; - executeOpcode(OP_SLEEP_8X, &byte, 1); -} - -void sx128x::enableTCXO() { - // todo: need to check how to implement on sx1280 -} - -void sx128x::disableTCXO() { - // todo: need to check how to implement on sx1280 + if (_tcxo) { byte = 0x01; } // STDBY_XOSC + else { byte = 0x00; } // STDBY_RC + executeOpcode(OP_STANDBY_8X, &byte, 1); } void sx128x::setPins(int ss, int reset, int dio0, int busy, int rxen, int txen) { @@ -766,213 +617,198 @@ void sx128x::setPins(int ss, int reset, int dio0, int busy, int rxen, int txen) void sx128x::setTxPower(int level, int outputPin) { uint8_t tx_buf[2]; - #if BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_21 - // RAK4631 with WisBlock SX1280 module (LIBSYS002) - if (level > 27) { - level = 27; - } else if (level < 0) { - level = 0; - } - _txp = level; - - int reg_value; + // RAK4631 with WisBlock SX1280 module (LIBSYS002) + #if BOARD_VARIANT == MODEL_13 || BOARD_VARIANT == MODEL_21 + if (level > 27) { level = 27; } + else if (level < 0) { level = 0; } - switch (level) { + _txp = level; + int reg_value; + switch (level) { case 0: - reg_value = -18; - break; + reg_value = -18; + break; case 1: - reg_value = -16; - break; + reg_value = -16; + break; case 2: - reg_value = -15; - break; + reg_value = -15; + break; case 3: - reg_value = -14; - break; + reg_value = -14; + break; case 4: - reg_value = -13; - break; + reg_value = -13; + break; case 5: - reg_value = -12; - break; + reg_value = -12; + break; case 6: - reg_value = -11; - break; + reg_value = -11; + break; case 7: - reg_value = -9; - break; + reg_value = -9; + break; case 8: - reg_value = -8; - break; + reg_value = -8; + break; case 9: - reg_value = -7; - break; + reg_value = -7; + break; case 10: - reg_value = -6; - break; + reg_value = -6; + break; case 11: - reg_value = -5; - break; + reg_value = -5; + break; case 12: - reg_value = -4; - break; + reg_value = -4; + break; case 13: - reg_value = -3; - break; + reg_value = -3; + break; case 14: - reg_value = -2; - break; + reg_value = -2; + break; case 15: - reg_value = -1; - break; + reg_value = -1; + break; case 16: - reg_value = 0; - break; + reg_value = 0; + break; case 17: - reg_value = 1; - break; + reg_value = 1; + break; case 18: - reg_value = 2; - break; + reg_value = 2; + break; case 19: - reg_value = 3; - break; + reg_value = 3; + break; case 20: - reg_value = 4; - break; + reg_value = 4; + break; case 21: - reg_value = 5; - break; + reg_value = 5; + break; case 22: - reg_value = 6; - break; + reg_value = 6; + break; case 23: - reg_value = 7; - break; + reg_value = 7; + break; case 24: - reg_value = 8; - break; + reg_value = 8; + break; case 25: - reg_value = 9; - break; + reg_value = 9; + break; case 26: - reg_value = 12; - break; + reg_value = 12; + break; case 27: - reg_value = 13; - break; + reg_value = 13; + break; default: - reg_value = 0; - break; - } - - tx_buf[0] = reg_value + 18; - tx_buf[1] = 0xE0; // ramping time - 20 microseconds + reg_value = 0; + break; + } - executeOpcode(OP_TX_PARAMS_8X, tx_buf, 2); + tx_buf[0] = reg_value + 18; + tx_buf[1] = 0xE0; // ramping time - 20 microseconds + executeOpcode(OP_TX_PARAMS_8X, tx_buf, 2); - #elif BOARD_VARIANT == MODEL_AC // T3S3 SX1280 PA + #elif BOARD_VARIANT == MODEL_AC if (level > 20) { level = 20; } else if (level < 0) { level = 0; } _txp = level; - int reg_value; - switch (level) { - /*case 0: - reg_value = -18; - break; - case 1: - reg_value = -17; - break; - case 2: - reg_value = -16; - break; - case 3: - reg_value = -15; - break; - case 4: - reg_value = -14; - break; - case 5: - reg_value = -13; - break; - case 6: - reg_value = -12; - break; - case 7: - reg_value = -10; - break; - case 8: - reg_value = -9; - break; - case 9: - reg_value = -8; - break; - case 10: - reg_value = -7; - break; - case 11: - reg_value = -6; - break; - case 12: - reg_value = -5; - break; - case 13: - reg_value = -4; - break; - case 14: - reg_value = -3; - break; - case 15: - reg_value = -2; - break; - case 16: - reg_value = -1; - break; - case 17: - reg_value = 0; - break; - case 18: - reg_value = 1; - break; - case 19: - reg_value = 2; - break;*/ - case 20: - reg_value = 3; - break; - default: - reg_value = 0; - break; + case 0: + reg_value = -18; + break; + case 1: + reg_value = -17; + break; + case 2: + reg_value = -16; + break; + case 3: + reg_value = -15; + break; + case 4: + reg_value = -14; + break; + case 5: + reg_value = -13; + break; + case 6: + reg_value = -12; + break; + case 7: + reg_value = -10; + break; + case 8: + reg_value = -9; + break; + case 9: + reg_value = -8; + break; + case 10: + reg_value = -7; + break; + case 11: + reg_value = -6; + break; + case 12: + reg_value = -5; + break; + case 13: + reg_value = -4; + break; + case 14: + reg_value = -3; + break; + case 15: + reg_value = -2; + break; + case 16: + reg_value = -1; + break; + case 17: + reg_value = 0; + break; + case 18: + reg_value = 1; + break; + case 19: + reg_value = 2; + break; + case 20: + reg_value = 3; + break; + default: + reg_value = 0; + break; } - tx_buf[0] = reg_value; tx_buf[1] = 0xE0; // ramping time - 20 microseconds - #else - // For SX1280 boards with no specific PA requirements - if (level > 13) { - level = 13; - } else if (level < -18) { - level = -18; - } + // For SX1280 boards with no specific PA requirements + #else + if (level > 13) { level = 13; } + else if (level < -18) { level = -18; } _txp = level; - tx_buf[0] = level + 18; tx_buf[1] = 0xE0; // ramping time - 20 microseconds #endif + executeOpcode(OP_TX_PARAMS_8X, tx_buf, 2); } -uint8_t sx128x::getTxPower() { - return _txp; -} - void sx128x::setFrequency(uint32_t frequency) { _frequency = frequency; uint8_t buf[3]; @@ -991,135 +827,85 @@ uint32_t sx128x::getFrequency() { } void sx128x::setSpreadingFactor(int sf) { - if (sf < 5) { - sf = 5; - } else if (sf > 12) { - sf = 12; - } - + if (sf < 5) { sf = 5; } + else if (sf > 12) { sf = 12; } _sf = sf; setModulationParams(sf, _bw, _cr); handleLowDataRate(); } -uint8_t sx128x::getSpreadingFactor() { return _sf; } - uint32_t sx128x::getSignalBandwidth() { int bw = _bw; switch (bw) { - case 0x34: return 203.125E3; - case 0x26: return 406.25E3; - case 0x18: return 812.5E3; - case 0x0A: return 1625E3; + case 0x34: return 203.125E3; + case 0x26: return 406.25E3; + case 0x18: return 812.5E3; + case 0x0A: return 1625E3; } return 0; } -void sx128x::handleLowDataRate(){ - // todo: do i need this?? -} +// TODO: Is this needed for SX1280? +void sx128x::handleLowDataRate() { } -void sx128x::optimizeModemSensitivity(){ - // todo: check if there's anything the sx1280 can do here -} - -void sx128x::setSignalBandwidth(uint32_t sbw) -{ - if (sbw <= 203.125E3) { - _bw = 0x34; - } else if (sbw <= 406.25E3) { - _bw = 0x26; - } else if (sbw <= 812.5E3) { - _bw = 0x18; - } else { - _bw = 0x0A; - } +// TODO: Check if there's anything the sx1280 can do here +void sx128x::optimizeModemSensitivity() { } - setModulationParams(_sf, _bw, _cr); +void sx128x::setSignalBandwidth(uint32_t sbw) { + if (sbw <= 203.125E3) { _bw = 0x34; } + else if (sbw <= 406.25E3) { _bw = 0x26; } + else if (sbw <= 812.5E3) { _bw = 0x18; } + else { _bw = 0x0A; } + setModulationParams(_sf, _bw, _cr); handleLowDataRate(); optimizeModemSensitivity(); } -void sx128x::setCodingRate4(int denominator) -{ - if (denominator < 5) { - denominator = 5; - } else if (denominator > 8) { - denominator = 8; - } - +// TODO: add support for new interleaving scheme, see page 117 of sx1280 datasheet +void sx128x::setCodingRate4(int denominator) { + if (denominator < 5) { denominator = 5; } + else if (denominator > 8) { denominator = 8; } _cr = denominator - 4; - - // todo: add support for new interleaving scheme, see page 117 of sx1280 - // datasheet - - // update cr values for sx1280's use - setModulationParams(_sf, _bw, _cr); } -uint8_t sx128x::getCodingRate4() -{ - return _cr + 4; -} +uint8_t sx128x::getCodingRate4() { return _cr + 4; } -void sx128x::setPreambleLength(long length) -{ +void sx128x::setPreambleLength(long length) { _preambleLength = length; setPacketParams(length, _implicitHeaderMode, _payloadLength, _crcMode); } -void sx128x::setSyncWord(int sw) -{ - // not implemented -} +// TODO: Implement +void sx128x::setSyncWord(int sw) { } -void sx128x::enableCrc() { - _crcMode = 0x20; - setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); -} +// TODO: need to check how to implement on sx1280 +void sx128x::enableTCXO() { } -void sx128x::disableCrc() { - _crcMode = 0; - setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); -} +// TODO: need to check how to implement on sx1280 +void sx128x::disableTCXO() { } -uint8_t sx128x::random() { - // todo: implement - return 0x4; //chosen by fair die roll - //guarenteed to be random - //https://xkcd.com/221/ -} +void sx128x::sleep() { uint8_t byte = 0x00; executeOpcode(OP_SLEEP_8X, &byte, 1); } -void sx128x::setSPIFrequency(uint32_t frequency) -{ - _spiSettings = SPISettings(frequency, MSBFIRST, SPI_MODE0); -} +uint8_t sx128x::getTxPower() { return _txp; } -void sx128x::dumpRegisters(Stream& out) -{ - for (int i = 0; i < 128; i++) { - out.print("0x"); - out.print(i, HEX); - out.print(": 0x"); - out.println(readRegister(i), HEX); - } -} +uint8_t sx128x::getSpreadingFactor() { return _sf; } -void sx128x::explicitHeaderMode() -{ - _implicitHeaderMode = 0; +void sx128x::enableCrc() { _crcMode = 0x20; setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); } - setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); -} +void sx128x::disableCrc() { _crcMode = 0; setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); } -void sx128x::implicitHeaderMode() -{ - _implicitHeaderMode = 0x80; - setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); +void sx128x::setSPIFrequency(uint32_t frequency) { _spiSettings = SPISettings(frequency, MSBFIRST, SPI_MODE0); } + +void sx128x::explicitHeaderMode() { _implicitHeaderMode = 0; setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); } + +void sx128x::implicitHeaderMode() { _implicitHeaderMode = 0x80; setPacketParams(_preambleLength, _implicitHeaderMode, _payloadLength, _crcMode); } + +void sx128x::dumpRegisters(Stream& out) { + for (int i = 0; i < 128; i++) { out.print("0x"); out.print(i, HEX); out.print(": 0x"); out.println(readRegister(i), HEX); } } sx128x sx128x_modem; \ No newline at end of file diff --git a/sx128x.h b/sx128x.h index 0652c91..86f3238 100644 --- a/sx128x.h +++ b/sx128x.h @@ -17,7 +17,7 @@ #define LORA_DEFAULT_RXEN_PIN -1 #define LORA_DEFAULT_TXEN_PIN -1 #define LORA_DEFAULT_BUSY_PIN -1 -#define LORA_MODEM_TIMEOUT_MS 5E3 +#define LORA_MODEM_TIMEOUT_MS 15E3 #define PA_OUTPUT_RFO_PIN 0 #define PA_OUTPUT_PA_BOOST_PIN 1 @@ -91,12 +91,9 @@ public: void setPacketParams(uint32_t preamble, uint8_t headermode, uint8_t length, uint8_t crc); void setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr); - // deprecated void crc() { enableCrc(); } void noCrc() { disableCrc(); } - byte random(); - void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN, int busy = LORA_DEFAULT_BUSY_PIN, int rxen = LORA_DEFAULT_RXEN_PIN, int txen = LORA_DEFAULT_TXEN_PIN); void setSPIFrequency(uint32_t frequency);