RFM69_LowPowerLab/RFM69.h

92 lines
3.3 KiB
C
Raw Normal View History

2013-06-20 22:06:39 +01:00
// Driver definition for HopeRF RFM69W/RFM69HW, Semtech SX1231/1231H
// Creative Commons Attrib Share-Alike License
// If you want to use/extend this library please abide with the license terms: http://creativecommons.org/licenses/by-sa/3.0/
// 2013-06-14 (C) felix@lowpowerlab.com
#ifndef RFM69_h
#define RFM69_h
#include <Arduino.h> //assumes Arduino IDE v1.0 or greater
#define MAX_DATA_LEN 61 // to take advantage of the built in AES/CRC we want to limit the frame size to the internal FIFO size (66 bytes - 3 bytes overhead)
#define SPI_CS SS // SS is the SPI slave select pin, for instance D10 on atmega328
#define RF69_IRQ_PIN 2 // INT0 on AVRs should be connected to DIO0
// ex on Atmega328 it's D2
#define CSMA_LIMIT -100 // upper RX signal sensitivity threshold in dBm for carrier sense access
#define RF69_MODE_SLEEP 0 // XTAL OFF
#define RF69_MODE_STANDBY 1 // XTAL ON
#define RF69_MODE_SYNTH 2 // PLL ON
#define RF69_MODE_RX 3 // RX MODE
#define RF69_MODE_TX 4 // TX MODE
//available frequency bands
#define RF69_315MHZ 31 // non trivial values to avoid misconfiguration
#define RF69_433MHZ 43
#define RF69_868MHZ 86
#define RF69_915MHZ 91
#define null 0
class RFM69 {
public:
volatile byte DATA[MAX_DATA_LEN]; // recv/xmit buf, including hdr & crc bytes
volatile byte DATALEN;
volatile byte SENDERID;
volatile byte TARGETID; //should match _address
volatile byte PAYLOADLEN;
volatile byte ACK_REQUESTED;
volatile byte ACK_RECEIVED; /// Should be polled immediately after sending a packet with ACK request
RFM69(byte slaveSelectPin=SPI_CS, byte interruptPin=RF69_IRQ_PIN, bool isRFM69HW=false) {
_slaveSelectPin = slaveSelectPin;
_interruptPin = interruptPin;
_mode = RF69_MODE_STANDBY;
_promiscuousMode = false;
_powerLevel = 31;
_isRFM69HW = isRFM69HW;
}
bool initialize(byte ID, byte freqBand, byte networkID=1);
void setAddress(byte addr);
bool canSend();
void send(byte toAddress, const void* buffer, byte bufferSize, bool requestACK=false);
bool sendWithRetry(byte toAddress, const void* buffer, byte bufferSize, byte attempts=3, byte retryWaitTime=15);
bool receiveDone();
bool ACKReceived(byte fromNodeID);
void sendACK(const void* buffer = "", uint8_t bufferSize=0);
void setFrequency(uint32_t FRF);
void encrypt(const char* key);
void setCS(byte newSPISlaveSelect);
int readRSSI(bool forceTrigger=false);
void promiscuous(bool onOff=true);
void setHighPower(bool onOFF=true); //for RFM69HW
void sleep();
// allow hacking registers by making these public
byte readReg(byte addr);
void writeReg(byte addr, byte val);
void readAllRegs();
protected:
static void isr0();
void interruptHandler();
void sendFrame(byte toAddress, const void* buffer, byte size, bool requestACK=false, bool sendACK=false);
static RFM69* selfPointer;
byte _slaveSelectPin;
byte _interruptPin;
byte _mode;
byte _address;
byte _powerLevel;
bool _promiscuousMode;
bool _isRFM69HW;
void receiveBegin();
void setMode(byte mode);
void setPowerLevel(byte mode);
void setHighPowerRegs(bool onOff);
void select();
void unselect();
};
#endif