2018-04-05 12:10:42 -04:00
|
|
|
// Copyright (c) Sandeep Mistry. All rights reserved.
|
2020-05-21 06:41:39 -04:00
|
|
|
// Licensed under the MIT license.
|
|
|
|
|
2023-01-13 18:11:02 -05:00
|
|
|
// Modifications and additions copyright 2023 by Mark Qvist
|
2020-05-21 06:41:39 -04:00
|
|
|
// Obviously still under the MIT license.
|
2018-04-05 12:10:42 -04:00
|
|
|
|
|
|
|
#ifndef LORA_H
|
|
|
|
#define LORA_H
|
|
|
|
|
|
|
|
#include <Arduino.h>
|
|
|
|
#include <SPI.h>
|
2024-01-19 05:08:55 -05:00
|
|
|
#include "Modem.h"
|
2018-04-05 12:10:42 -04:00
|
|
|
|
|
|
|
#define LORA_DEFAULT_SS_PIN 10
|
|
|
|
#define LORA_DEFAULT_RESET_PIN 9
|
|
|
|
#define LORA_DEFAULT_DIO0_PIN 2
|
2024-01-19 05:08:55 -05:00
|
|
|
#define LORA_DEFAULT_RXEN_PIN -1
|
|
|
|
#define LORA_DEFAULT_BUSY_PIN -1
|
2018-04-05 12:10:42 -04:00
|
|
|
|
|
|
|
#define PA_OUTPUT_RFO_PIN 0
|
|
|
|
#define PA_OUTPUT_PA_BOOST_PIN 1
|
|
|
|
|
2019-11-07 09:26:21 -05:00
|
|
|
#define RSSI_OFFSET 157
|
|
|
|
|
2018-04-05 12:10:42 -04:00
|
|
|
class LoRaClass : public Stream {
|
|
|
|
public:
|
|
|
|
LoRaClass();
|
|
|
|
|
|
|
|
int begin(long frequency);
|
|
|
|
void end();
|
|
|
|
|
|
|
|
int beginPacket(int implicitHeader = false);
|
|
|
|
int endPacket();
|
|
|
|
|
|
|
|
int parsePacket(int size = 0);
|
|
|
|
int packetRssi();
|
2022-10-28 18:52:51 -04:00
|
|
|
int currentRssi();
|
2018-06-27 08:08:16 -04:00
|
|
|
uint8_t packetRssiRaw();
|
2022-10-28 18:52:51 -04:00
|
|
|
uint8_t currentRssiRaw();
|
2020-05-21 06:41:39 -04:00
|
|
|
uint8_t packetSnrRaw();
|
2018-04-05 12:10:42 -04:00
|
|
|
float packetSnr();
|
|
|
|
long packetFrequencyError();
|
|
|
|
|
|
|
|
// from Print
|
|
|
|
virtual size_t write(uint8_t byte);
|
|
|
|
virtual size_t write(const uint8_t *buffer, size_t size);
|
|
|
|
|
|
|
|
// from Stream
|
|
|
|
virtual int available();
|
|
|
|
virtual int read();
|
|
|
|
virtual int peek();
|
|
|
|
virtual void flush();
|
|
|
|
|
|
|
|
void onReceive(void(*callback)(int));
|
|
|
|
|
|
|
|
void receive(int size = 0);
|
|
|
|
void idle();
|
|
|
|
void sleep();
|
|
|
|
|
2023-01-07 10:35:07 -05:00
|
|
|
bool preInit();
|
|
|
|
uint8_t getTxPower();
|
2018-04-05 12:10:42 -04:00
|
|
|
void setTxPower(int level, int outputPin = PA_OUTPUT_PA_BOOST_PIN);
|
2018-06-20 10:32:30 -04:00
|
|
|
uint32_t getFrequency();
|
2018-04-05 12:10:42 -04:00
|
|
|
void setFrequency(long frequency);
|
|
|
|
void setSpreadingFactor(int sf);
|
|
|
|
long getSignalBandwidth();
|
|
|
|
void setSignalBandwidth(long sbw);
|
|
|
|
void setCodingRate4(int denominator);
|
|
|
|
void setPreambleLength(long length);
|
|
|
|
void setSyncWord(int sw);
|
2018-04-26 09:52:43 -04:00
|
|
|
uint8_t modemStatus();
|
2018-04-05 12:10:42 -04:00
|
|
|
void enableCrc();
|
|
|
|
void disableCrc();
|
2023-06-07 14:49:26 -04:00
|
|
|
void enableTCXO();
|
|
|
|
void disableTCXO();
|
2018-04-05 12:10:42 -04:00
|
|
|
|
2024-01-19 05:08:55 -05:00
|
|
|
#if MODEM == SX1262
|
|
|
|
void enableAntenna();
|
|
|
|
void disableAntenna();
|
|
|
|
void loraMode();
|
|
|
|
void waitOnBusy();
|
|
|
|
void executeOpcode(uint8_t opcode, uint8_t *buffer, uint8_t size);
|
|
|
|
void executeOpcodeRead(uint8_t opcode, uint8_t *buffer, uint8_t size);
|
|
|
|
void writeBuffer(const uint8_t* buffer, size_t size);
|
|
|
|
void readBuffer(uint8_t* buffer, size_t size);
|
|
|
|
void setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, int ldro);
|
|
|
|
void setPacketParams(long preamble, uint8_t headermode, uint8_t length, uint8_t crc);
|
|
|
|
#endif
|
|
|
|
|
2018-04-05 12:10:42 -04:00
|
|
|
// deprecated
|
|
|
|
void crc() { enableCrc(); }
|
|
|
|
void noCrc() { disableCrc(); }
|
|
|
|
|
|
|
|
byte random();
|
|
|
|
|
2024-01-19 05:08:55 -05:00
|
|
|
void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN, int rxen = LORA_DEFAULT_RXEN_PIN, int busy = LORA_DEFAULT_BUSY_PIN);
|
2018-04-05 12:10:42 -04:00
|
|
|
void setSPIFrequency(uint32_t frequency);
|
|
|
|
|
|
|
|
void dumpRegisters(Stream& out);
|
|
|
|
|
|
|
|
private:
|
|
|
|
void explicitHeaderMode();
|
|
|
|
void implicitHeaderMode();
|
|
|
|
|
|
|
|
void handleDio0Rise();
|
|
|
|
|
2024-01-19 05:08:55 -05:00
|
|
|
#if MODEM == SX1276 || MODEM == SX1278
|
|
|
|
uint8_t readRegister(uint8_t address);
|
|
|
|
void writeRegister(uint8_t address, uint8_t value);
|
|
|
|
uint8_t singleTransfer(uint8_t address, uint8_t value);
|
|
|
|
#elif MODEM == SX1262
|
|
|
|
uint8_t readRegister(uint16_t address);
|
|
|
|
void writeRegister(uint16_t address, uint8_t value);
|
|
|
|
uint8_t singleTransfer(uint8_t opcode, uint16_t address, uint8_t value);
|
|
|
|
#endif
|
2018-04-05 12:10:42 -04:00
|
|
|
|
|
|
|
static void onDio0Rise();
|
|
|
|
|
2019-10-14 17:16:30 -04:00
|
|
|
void handleLowDataRate();
|
2023-04-22 01:56:46 -04:00
|
|
|
void optimizeModemSensitivity();
|
2019-10-14 17:16:30 -04:00
|
|
|
|
2018-04-05 12:10:42 -04:00
|
|
|
private:
|
|
|
|
SPISettings _spiSettings;
|
|
|
|
int _ss;
|
|
|
|
int _reset;
|
|
|
|
int _dio0;
|
2024-01-19 05:08:55 -05:00
|
|
|
int _rxen;
|
|
|
|
int _busy;
|
2018-04-05 12:10:42 -04:00
|
|
|
long _frequency;
|
2024-01-19 05:08:55 -05:00
|
|
|
int _txp;
|
|
|
|
uint8_t _sf;
|
|
|
|
uint8_t _bw;
|
|
|
|
uint8_t _cr;
|
|
|
|
uint8_t _ldro;
|
2018-04-05 12:10:42 -04:00
|
|
|
int _packetIndex;
|
2024-01-19 05:08:55 -05:00
|
|
|
int _preambleLength;
|
2018-04-05 12:10:42 -04:00
|
|
|
int _implicitHeaderMode;
|
2024-01-19 05:08:55 -05:00
|
|
|
int _payloadLength;
|
|
|
|
int _crcMode;
|
2018-04-05 12:10:42 -04:00
|
|
|
void (*_onReceive)(int);
|
|
|
|
};
|
|
|
|
|
|
|
|
extern LoRaClass LoRa;
|
|
|
|
|
2024-01-19 05:08:55 -05:00
|
|
|
#endif
|