Add Reliable Packet Transmission with Addressing

This commit is contained in:
2024-11-13 17:03:07 +03:00
parent 9395706524
commit d3aa5954f0
7 changed files with 1474 additions and 1287 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.vscode

22
LICENSE Normal file
View File

@ -0,0 +1,22 @@
MIT License
Copyright (c) 2021 Stuart Robinson
Copyright (c) 2024 Hasan Albinsaid
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

7
README.md Normal file
View File

@ -0,0 +1,7 @@
# SX128x Arduino Library
This repository is based on the [StuartsProjects](https://github.com/StuartsProjects/SX12XX-LoRa) repository (as of the March 2024 commit) and focuses exclusively on the SX128x library, with additional features and improvements.
### Additional Features
- **Reliable Packet Transmission with Addressing**:
New functions `transmitReliableAutoACK_addr` and `receiveReliableAutoACK_addr` have been added to enhance reliable communication with built-in addressing support.

View File

@ -38,9 +38,11 @@ CRCCCITTSX KEYWORD2
CRCCCITT KEYWORD2
printSXBufferASCII KEYWORD2
receiveAddressed KEYWORD2
destAddr KEYWORD2
getByteSXBuffer KEYWORD2
startWriteSXBuffer KEYWORD2
transmitAddressed KEYWORD2
srcAddr KEYWORD2
startReadSXBuffer KEYWORD2
endReadSXBuffer KEYWORD2
readBuffer KEYWORD2

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,13 @@
#ifndef SX128XLT_h
#define SX128XLT_h
#include "Arduino.h"
#include <Arduino.h>
#include <SX128XLT_Definitions.h>
class SX128XLT
{
class SX128XLT {
public:
public:
SX128XLT();
bool begin(int8_t pinNSS, int8_t pinNRESET, int8_t pinRFBUSY, int8_t pinDIO1, int8_t pinDIO2, int8_t pinDIO3, int8_t pinRXEN, int8_t pinTXEN, uint8_t device);
@ -20,27 +19,26 @@ class SX128XLT {
void rxEnable();
void txEnable();
void checkBusy();
bool config();
void readRegisters( uint16_t address, uint8_t *buffer, uint16_t size );
uint8_t readRegister( uint16_t address );
void writeRegisters( uint16_t address, uint8_t *buffer, uint16_t size );
void writeRegister( uint16_t address, uint8_t value );
void writeCommand(uint8_t Opcode, uint8_t *buffer, uint16_t size );
void readCommand( uint8_t Opcode, uint8_t *buffer, uint16_t size );
void readRegisters(uint16_t address, uint8_t *buffer, uint16_t size);
uint8_t readRegister(uint16_t address);
void writeRegisters(uint16_t address, uint8_t *buffer, uint16_t size);
void writeRegister(uint16_t address, uint8_t value);
void writeCommand(uint8_t Opcode, uint8_t *buffer, uint16_t size);
void readCommand(uint8_t Opcode, uint8_t *buffer, uint16_t size);
void resetDevice();
bool checkDevice();
void setupLoRa(uint32_t frequency, int32_t offset, uint8_t modParam1, uint8_t modParam2, uint8_t modParam3);
void setMode(uint8_t modeconfig);
void setRegulatorMode(uint8_t mode);
void setPacketType(uint8_t PacketType);
void setRfFrequency( uint32_t frequency, int32_t offset );
void setRfFrequency(uint32_t frequency, int32_t offset);
void setBufferBaseAddress(uint8_t txBaseAddress, uint8_t rxBaseAddress);
void setModulationParams(uint8_t modParam1, uint8_t modParam2, uint8_t modParam3);
void setPacketParams(uint8_t packetParam1, uint8_t packetParam2, uint8_t packetParam3, uint8_t packetParam4, uint8_t packetParam5, uint8_t packetParam6, uint8_t packetParam7);
void setPacketParams(uint8_t packetParam1, uint8_t packetParam2, uint8_t packetParam3, uint8_t packetParam4, uint8_t packetParam5);
void setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask );
void setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask);
void setHighSensitivity();
void setLowPowerRX();
void printModemSettings();
@ -59,7 +57,7 @@ class SX128XLT {
uint8_t transmitIRQ(uint8_t *txbuffer, uint8_t size, uint16_t timeout, int8_t txpower, uint8_t wait);
void setTxParams(int8_t TXpower, uint8_t RampTime);
void setTx(uint16_t timeout);
void clearIrqStatus( uint16_t irq );
void clearIrqStatus(uint16_t irq);
uint16_t readIrqStatus();
void printIrqStatus();
uint16_t CRCCCITT(uint8_t *buffer, uint32_t size, uint16_t start);
@ -88,9 +86,8 @@ class SX128XLT {
void setPeriodBase(uint8_t value);
uint8_t getPeriodBase();
//***************************************************************************
//Start direct access SX buffer routines
// Start direct access SX buffer routines
//***************************************************************************
void startWriteSXBuffer(uint8_t ptr);
uint8_t endWriteSXBuffer();
@ -121,18 +118,17 @@ class SX128XLT {
uint8_t transmitSXBuffer(uint8_t startaddr, uint8_t length, uint16_t timeout, int8_t txpower, uint8_t wait);
uint8_t transmitSXBufferIRQ(uint8_t startaddr, uint8_t length, uint16_t timeout, int8_t txpower, uint8_t wait);
void writeBuffer(uint8_t *txbuffer, uint8_t size);
//void writeBuffer(uint8_t *txbuffer, uint8_t startaddr, uint8_t size);
// void writeBuffer(uint8_t *txbuffer, uint8_t startaddr, uint8_t size);
uint8_t receiveSXBuffer(uint8_t startaddr, uint16_t timeout, uint8_t wait);
uint8_t receiveSXBufferIRQ(uint8_t startaddr, uint16_t timeout, uint8_t wait );
uint8_t receiveSXBufferIRQ(uint8_t startaddr, uint16_t timeout, uint8_t wait);
uint8_t readBuffer(uint8_t *rxbuffer);
//uint8_t readBuffer(uint8_t *rxbuffer, uint8_t startaddr, uint8_t len);
// uint8_t readBuffer(uint8_t *rxbuffer, uint8_t startaddr, uint8_t len);
void printSXBufferHEX(uint8_t start, uint8_t end);
void writeBufferChar(char *txbuffer, uint8_t size);
uint8_t readBufferChar(char *rxbuffer);
//***************************************************************************
//Start ranging routines
// Start ranging routines
//***************************************************************************
void setRangingSlaveAddress(uint32_t address);
void setRangingSlaveAddress(uint32_t address, uint8_t bits);
@ -141,7 +137,7 @@ class SX128XLT {
void setRangingRole(uint8_t role);
double getRangingDistance(uint8_t resultType, int32_t regval, float adjust);
uint32_t getRangingResultRegValue(uint8_t resultType);
int32_t complement2( uint32_t num, uint8_t bitCnt );
int32_t complement2(uint32_t num, uint8_t bitCnt);
bool setupRanging(uint32_t frequency, int32_t offset, uint8_t modParam1, uint8_t modParam2, uint8_t modParam3, uint32_t address, uint8_t role);
bool transmitRanging(uint32_t address, uint16_t timeout, int8_t txpower, uint8_t wait);
uint8_t receiveRanging(uint32_t address, uint16_t timeout, int8_t txpower, uint8_t wait);
@ -150,21 +146,26 @@ class SX128XLT {
uint16_t getSetCalibrationValue();
int16_t getRangingRSSI();
//*******************************************************************************
//Reliable RX\TX routines
// Reliable RX\TX routines
//*******************************************************************************
uint8_t transmitReliable(uint8_t *txbuffer, uint8_t size, uint16_t networkID, uint32_t txtimeout, int8_t txpower, uint8_t wait);
uint8_t receiveReliable(uint8_t *rxbuffer, uint8_t size, uint16_t networkID, uint32_t rxtimeout, uint8_t wait );
uint8_t receiveReliable(uint8_t *rxbuffer, uint8_t size, uint16_t networkID, uint32_t rxtimeout, uint8_t wait);
uint8_t transmitReliableAutoACK(uint8_t *txbuffer, uint8_t size, uint16_t networkID, uint32_t acktimeout, uint32_t txtimeout, int8_t txpower, uint8_t wait);
uint8_t receiveReliableAutoACK(uint8_t *rxbuffer, uint8_t size, uint16_t networkID, uint32_t ackdelay, int8_t txpower, uint32_t rxtimeout, uint8_t wait );
uint8_t receiveReliableAutoACK(uint8_t *rxbuffer, uint8_t size, uint16_t networkID, uint32_t ackdelay, int8_t txpower, uint32_t rxtimeout, uint8_t wait);
uint8_t transmitReliableAutoACK_addr(uint8_t *txbuffer, uint8_t size, uint16_t networkID, uint16_t destAddr, uint16_t srcAddr, uint32_t acktimeout, uint32_t txtimeout, int8_t txpower, uint8_t wait);
uint8_t receiveReliableAutoACK_addr(uint8_t *rxbuffer, uint8_t size, uint16_t networkID, uint16_t destAddr, uint32_t ackdelay, int8_t txpower, uint32_t rxtimeout, uint8_t wait, uint16_t *srcAddr = nullptr);
uint8_t sendReliableACK(uint16_t networkID, uint16_t payloadcrc, int8_t txpower);
uint8_t sendReliableACK(uint8_t *txbuffer, uint8_t size, uint16_t networkID, uint16_t payloadcrc, int8_t txpower);
uint8_t waitReliableACK(uint16_t networkID, uint16_t payloadcrc, uint32_t acktimeout);
uint8_t waitReliableACK(uint8_t *rxbuffer, uint8_t size, uint16_t networkID, uint16_t payloadcrc, uint32_t acktimeout);
uint8_t sendReliableACK_addr(uint16_t networkID, uint16_t srcAddr, uint16_t destAddr, uint16_t payloadcrc, int8_t txpower);
uint8_t waitReliableACK_addr(uint16_t networkID, uint16_t destAddr, uint16_t srcAddr, uint16_t payloadcrc, uint32_t acktimeout);
void printASCIIArray(uint8_t *buffer, uint8_t size);
uint8_t getReliableConfig(uint8_t bitread);
@ -194,10 +195,10 @@ class SX128XLT {
uint8_t transmitSXReliable(uint8_t startaddr, uint8_t length, uint16_t networkID, uint32_t txtimeout, int8_t txpower, uint8_t wait);
uint8_t transmitSXReliableIRQ(uint8_t startaddr, uint8_t length, uint16_t networkID, uint32_t txtimeout, int8_t txpower, uint8_t wait);
uint8_t receiveSXReliable(uint8_t startaddr, uint16_t networkID, uint32_t rxtimeout, uint8_t wait );
uint8_t receiveSXReliableIRQ(uint8_t startaddr, uint16_t networkID, uint32_t rxtimeout, uint8_t wait );
uint8_t receiveSXReliable(uint8_t startaddr, uint16_t networkID, uint32_t rxtimeout, uint8_t wait);
uint8_t receiveSXReliableIRQ(uint8_t startaddr, uint16_t networkID, uint32_t rxtimeout, uint8_t wait);
uint8_t transmitSXReliableAutoACK(uint8_t startaddr, uint8_t length, uint16_t networkID, uint32_t acktimeout, uint32_t txtimeout, int8_t txpower, uint8_t wait);
uint8_t receiveSXReliableAutoACK(uint8_t startaddr, uint16_t networkID, uint32_t ackdelay, int8_t txpower, uint32_t rxtimeout, uint8_t wait );
uint8_t receiveSXReliableAutoACK(uint8_t startaddr, uint16_t networkID, uint32_t ackdelay, int8_t txpower, uint32_t rxtimeout, uint8_t wait);
uint8_t waitSXReliableACK(uint8_t startaddr, uint16_t networkID, uint16_t payloadcrc, uint32_t acktimeout);
uint8_t waitSXReliableACKIRQ(uint8_t startaddr, uint16_t networkID, uint16_t payloadcrc, uint32_t acktimeout);
uint8_t sendSXReliableACK(uint8_t startaddr, uint8_t length, uint16_t networkID, uint16_t payloadcrc, int8_t txpower);
@ -206,54 +207,51 @@ class SX128XLT {
uint8_t readReliableFlags();
//*******************************************************************************
//Data Transfer functions
// Data Transfer functions
//*******************************************************************************
uint8_t transmitDT(uint8_t *header, uint8_t headersize, uint8_t *dataarray, uint8_t datasize, uint16_t networkID, uint32_t txtimeout, int8_t txpower, uint8_t wait);
uint8_t waitACKDT(uint8_t *header, uint8_t headersize, uint32_t acktimeout);
uint8_t receiveDT(uint8_t *header, uint8_t headersize, uint8_t *dataarray, uint8_t datasize, uint16_t networkID, uint32_t rxtimeout, uint8_t wait );
uint8_t receiveDT(uint8_t *header, uint8_t headersize, uint8_t *dataarray, uint8_t datasize, uint16_t networkID, uint32_t rxtimeout, uint8_t wait);
uint8_t sendACKDT(uint8_t *header, uint8_t headersize, int8_t txpower);
uint8_t transmitDTIRQ(uint8_t *header, uint8_t headersize, uint8_t *dataarray, uint8_t datasize, uint16_t networkID, uint32_t txtimeout, int8_t txpower, uint8_t wait);
uint8_t waitACKDTIRQ(uint8_t *header, uint8_t headersize, uint32_t acktimeout);
uint8_t receiveDTIRQ(uint8_t *header, uint8_t headersize, uint8_t *dataarray, uint8_t datasize, uint16_t networkID, uint32_t rxtimeout, uint8_t wait );
uint8_t receiveDTIRQ(uint8_t *header, uint8_t headersize, uint8_t *dataarray, uint8_t datasize, uint16_t networkID, uint32_t rxtimeout, uint8_t wait);
uint8_t sendACKDTIRQ(uint8_t *header, uint8_t headersize, int8_t txpower);
private:
private:
int8_t _NSS, _NRESET, _RFBUSY, _DIO1, _DIO2, _DIO3;
int8_t _RXEN, _TXEN;
uint8_t _RXPacketL; //length of packet received
uint8_t _RXPacketType; //type number of received packet
uint8_t _RXDestination; //destination address of received packet
uint8_t _RXSource; //source address of received packet
//int8_t _PacketRSSI; //RSSI of received packet - removed November 2021, not used
//int8_t _PacketSNR; //signal to noise ratio of received packet - removed November 2021, not used
int8_t _TXPacketL; //transmitted packet length
uint8_t _RXcount; //used to keep track of the bytes read from SX1280 buffer during readFloat() etc
uint8_t _TXcount; //used to keep track of the bytes written to SX1280 buffer during writeFloat() etc
uint8_t _OperatingMode; //current operating mode
bool _rxtxpinmode = false; //set to true if RX and TX pin mode is used.
uint8_t _RXPacketL; // length of packet received
uint8_t _RXPacketType; // type number of received packet
uint8_t _RXDestination; // destination address of received packet
uint8_t _RXSource; // source address of received packet
// int8_t _PacketRSSI; //RSSI of received packet - removed November 2021, not used
// int8_t _PacketSNR; //signal to noise ratio of received packet - removed November 2021, not used
int8_t _TXPacketL; // transmitted packet length
uint8_t _RXcount; // used to keep track of the bytes read from SX1280 buffer during readFloat() etc
uint8_t _TXcount; // used to keep track of the bytes written to SX1280 buffer during writeFloat() etc
uint8_t _OperatingMode; // current operating mode
bool _rxtxpinmode = false; // set to true if RX and TX pin mode is used.
uint8_t _Device; //saved device type
uint8_t _TXDonePin; //the pin that will indicate TX done
uint8_t _RXDonePin; //the pin that will indicate RX done
uint8_t _Device; // saved device type
uint8_t _TXDonePin; // the pin that will indicate TX done
uint8_t _RXDonePin; // the pin that will indicate RX done
uint8_t _PERIODBASE = PERIODBASE_01_MS;
uint8_t savedRegulatorMode;
uint8_t savedPacketType;
uint32_t savedFrequency;
int32_t savedOffset;
uint8_t savedModParam1, savedModParam2, savedModParam3; //sequence is spreading factor, bandwidth, coding rate
uint8_t savedModParam1, savedModParam2, savedModParam3; // sequence is spreading factor, bandwidth, coding rate
uint8_t savedPacketParam1, savedPacketParam2, savedPacketParam3, savedPacketParam4, savedPacketParam5, savedPacketParam6, savedPacketParam7;
uint16_t savedIrqMask, savedDio1Mask, savedDio2Mask, savedDio3Mask;
int8_t savedTXPower;
uint16_t savedCalibration;
uint32_t savedFrequencyReg;
uint8_t _ReliableErrors; //Reliable status byte
uint8_t _ReliableFlags; //Reliable flags byte
uint8_t _ReliableConfig; //Reliable config byte
uint8_t _ReliableErrors; // Reliable status byte
uint8_t _ReliableFlags; // Reliable flags byte
uint8_t _ReliableConfig; // Reliable config byte
};
#endif

View File

@ -405,6 +405,7 @@ const double CH_freq[] = {0E6,
#define ReliableTimeout 0x04 // bit number set in _ReliableErrors when there is a timeout error
#define SegmentSequenceError 0x05 // bit number set in _ReliableErrors when there is a segment sequence error
#define FileError 0x06 // bit number set in _ReliableErrors when there ia a file (SD) error
#define ReliableAddrError 0x07 // bit number set in _ReliableErrors when there is intended Address is incorrect
// These are the bit numbers which when set indicate reliable status flags, variable _ReliableFlags
#define ReliableACKSent 0x00 // bit number set in _ReliableFlags when there is a ACK sent