Fork from RFM69 for little changes specific to get the library working with my setup.
Fork of RFM69 by
RFM69.h@1:59f91670db51, 2018-06-09 (annotated)
- Committer:
- samulinyman
- Date:
- Sat Jun 09 14:12:37 2018 +0000
- Revision:
- 1:59f91670db51
- Parent:
- 0:db6e4ce9dc02
Changes;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
br549 | 0:db6e4ce9dc02 | 1 | // ********************************************************************************** |
br549 | 0:db6e4ce9dc02 | 2 | // Driver definition for HopeRF RFM69W/RFM69HW/RFM69CW/RFM69HCW, Semtech SX1231/1231H |
br549 | 0:db6e4ce9dc02 | 3 | // ********************************************************************************** |
br549 | 0:db6e4ce9dc02 | 4 | // Copyright Felix Rusu (2014), felix@lowpowerlab.com |
br549 | 0:db6e4ce9dc02 | 5 | // http://lowpowerlab.com/ |
br549 | 0:db6e4ce9dc02 | 6 | // ********************************************************************************** |
br549 | 0:db6e4ce9dc02 | 7 | // License |
br549 | 0:db6e4ce9dc02 | 8 | // ********************************************************************************** |
br549 | 0:db6e4ce9dc02 | 9 | // This program is free software; you can redistribute it |
br549 | 0:db6e4ce9dc02 | 10 | // and/or modify it under the terms of the GNU General |
br549 | 0:db6e4ce9dc02 | 11 | // Public License as published by the Free Software |
br549 | 0:db6e4ce9dc02 | 12 | // Foundation; either version 3 of the License, or |
br549 | 0:db6e4ce9dc02 | 13 | // (at your option) any later version. |
br549 | 0:db6e4ce9dc02 | 14 | // |
br549 | 0:db6e4ce9dc02 | 15 | // This program is distributed in the hope that it will |
br549 | 0:db6e4ce9dc02 | 16 | // be useful, but WITHOUT ANY WARRANTY; without even the |
br549 | 0:db6e4ce9dc02 | 17 | // implied warranty of MERCHANTABILITY or FITNESS FOR A |
br549 | 0:db6e4ce9dc02 | 18 | // PARTICULAR PURPOSE. See the GNU General Public |
br549 | 0:db6e4ce9dc02 | 19 | // License for more details. |
br549 | 0:db6e4ce9dc02 | 20 | // |
br549 | 0:db6e4ce9dc02 | 21 | // You should have received a copy of the GNU General |
br549 | 0:db6e4ce9dc02 | 22 | // Public License along with this program. |
br549 | 0:db6e4ce9dc02 | 23 | // If not, see <http://www.gnu.org/licenses/>. |
br549 | 0:db6e4ce9dc02 | 24 | // |
br549 | 0:db6e4ce9dc02 | 25 | // Licence can be viewed at |
br549 | 0:db6e4ce9dc02 | 26 | // http://www.gnu.org/licenses/gpl-3.0.txt |
br549 | 0:db6e4ce9dc02 | 27 | // |
br549 | 0:db6e4ce9dc02 | 28 | // Please maintain this license information along with authorship |
br549 | 0:db6e4ce9dc02 | 29 | // and copyright notices in any redistribution of this code |
br549 | 0:db6e4ce9dc02 | 30 | // ********************************************************************************** |
br549 | 0:db6e4ce9dc02 | 31 | #ifndef RFM69_h |
br549 | 0:db6e4ce9dc02 | 32 | #define RFM69_h |
br549 | 0:db6e4ce9dc02 | 33 | #include <mbed.h> // assumes Arduino IDE v1.0 or greater |
br549 | 0:db6e4ce9dc02 | 34 | |
br549 | 0:db6e4ce9dc02 | 35 | #define RF69_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 - 2 bytes crc) |
br549 | 0:db6e4ce9dc02 | 36 | //#define RF69_SPI_CS SS // SS is the SPI slave select pin, for instance D10 on ATmega328 |
br549 | 0:db6e4ce9dc02 | 37 | |
br549 | 0:db6e4ce9dc02 | 38 | #define CSMA_LIMIT -90 // upper RX signal sensitivity threshold in dBm for carrier sense access |
br549 | 0:db6e4ce9dc02 | 39 | #define RF69_MODE_SLEEP 0 // XTAL OFF |
br549 | 0:db6e4ce9dc02 | 40 | #define RF69_MODE_STANDBY 1 // XTAL ON |
br549 | 0:db6e4ce9dc02 | 41 | #define RF69_MODE_SYNTH 2 // PLL ON |
br549 | 0:db6e4ce9dc02 | 42 | #define RF69_MODE_RX 3 // RX MODE |
br549 | 0:db6e4ce9dc02 | 43 | #define RF69_MODE_TX 4 // TX MODE |
br549 | 0:db6e4ce9dc02 | 44 | |
br549 | 0:db6e4ce9dc02 | 45 | // available frequency bands |
br549 | 0:db6e4ce9dc02 | 46 | #define RF69_315MHZ 31 // non trivial values to avoid misconfiguration |
br549 | 0:db6e4ce9dc02 | 47 | #define RF69_433MHZ 43 |
br549 | 0:db6e4ce9dc02 | 48 | #define RF69_868MHZ 86 |
br549 | 0:db6e4ce9dc02 | 49 | #define RF69_915MHZ 91 |
br549 | 0:db6e4ce9dc02 | 50 | |
br549 | 0:db6e4ce9dc02 | 51 | #define null 0 |
br549 | 0:db6e4ce9dc02 | 52 | #define COURSE_TEMP_COEF -90 // puts the temperature reading in the ballpark, user can fine tune the returned value |
br549 | 0:db6e4ce9dc02 | 53 | #define RF69_BROADCAST_ADDR 255 |
br549 | 0:db6e4ce9dc02 | 54 | #define RF69_CSMA_LIMIT_MS 1000 |
br549 | 0:db6e4ce9dc02 | 55 | #define RF69_TX_LIMIT_MS 1000 |
br549 | 0:db6e4ce9dc02 | 56 | #define RF69_FSTEP 61.03515625 // == FXOSC / 2^19 = 32MHz / 2^19 (p13 in datasheet) |
br549 | 0:db6e4ce9dc02 | 57 | |
br549 | 0:db6e4ce9dc02 | 58 | class RFM69 { |
br549 | 0:db6e4ce9dc02 | 59 | public: |
br549 | 0:db6e4ce9dc02 | 60 | static volatile uint8_t DATA[RF69_MAX_DATA_LEN]; // recv/xmit buf, including header & crc bytes |
br549 | 0:db6e4ce9dc02 | 61 | static volatile uint8_t DATALEN; |
br549 | 0:db6e4ce9dc02 | 62 | static volatile uint8_t SENDERID; |
br549 | 0:db6e4ce9dc02 | 63 | static volatile uint8_t TARGETID; // should match _address |
br549 | 0:db6e4ce9dc02 | 64 | static volatile uint8_t PAYLOADLEN; |
br549 | 0:db6e4ce9dc02 | 65 | static volatile uint8_t ACK_REQUESTED; |
br549 | 0:db6e4ce9dc02 | 66 | static volatile uint8_t ACK_RECEIVED; // should be polled immediately after sending a packet with ACK request |
br549 | 0:db6e4ce9dc02 | 67 | static volatile int16_t RSSI; // most accurate RSSI during reception (closest to the reception) |
br549 | 0:db6e4ce9dc02 | 68 | static volatile uint8_t _mode; // should be protected? |
br549 | 0:db6e4ce9dc02 | 69 | |
br549 | 0:db6e4ce9dc02 | 70 | RFM69(PinName mosi, PinName miso, PinName sclk, PinName slaveSelectPin, PinName interrupt); |
br549 | 0:db6e4ce9dc02 | 71 | |
br549 | 0:db6e4ce9dc02 | 72 | bool initialize(uint8_t freqBand, uint8_t ID, uint8_t networkID=1); |
br549 | 0:db6e4ce9dc02 | 73 | void setAddress(uint8_t addr); |
br549 | 0:db6e4ce9dc02 | 74 | void setNetwork(uint8_t networkID); |
br549 | 0:db6e4ce9dc02 | 75 | bool canSend(); |
br549 | 0:db6e4ce9dc02 | 76 | void send(uint8_t toAddress, const void* buffer, uint8_t bufferSize, bool requestACK=false); |
br549 | 0:db6e4ce9dc02 | 77 | bool sendWithRetry(uint8_t toAddress, const void* buffer, uint8_t bufferSize, uint8_t retries=2, uint8_t retryWaitTime=40); // 40ms roundtrip req for 61byte packets |
br549 | 0:db6e4ce9dc02 | 78 | bool receiveDone(); |
br549 | 0:db6e4ce9dc02 | 79 | bool ACKReceived(uint8_t fromNodeID); |
br549 | 0:db6e4ce9dc02 | 80 | bool ACKRequested(); |
br549 | 0:db6e4ce9dc02 | 81 | void sendACK(const void* buffer = "", uint8_t bufferSize=0); |
br549 | 0:db6e4ce9dc02 | 82 | uint32_t getFrequency(); |
br549 | 0:db6e4ce9dc02 | 83 | void setFrequency(uint32_t freqHz); |
br549 | 0:db6e4ce9dc02 | 84 | void encrypt(const char* key); |
br549 | 0:db6e4ce9dc02 | 85 | // void setCS(uint8_t newSPISlaveSelect); |
br549 | 0:db6e4ce9dc02 | 86 | int16_t readRSSI(bool forceTrigger=false); |
br549 | 0:db6e4ce9dc02 | 87 | void promiscuous(bool onOff=true); |
br549 | 0:db6e4ce9dc02 | 88 | void setHighPower(bool onOFF=true); // has to be called after initialize() for RFM69HW |
br549 | 0:db6e4ce9dc02 | 89 | void setPowerLevel(uint8_t level); // reduce/increase transmit power level |
br549 | 0:db6e4ce9dc02 | 90 | void sleep(); |
br549 | 0:db6e4ce9dc02 | 91 | uint8_t readTemperature(int8_t calFactor=0); // get CMOS temperature (8bit) |
br549 | 0:db6e4ce9dc02 | 92 | void rcCalibration(); // calibrate the internal RC oscillator for use in wide temperature variations - see datasheet section [4.3.5. RC Timer Accuracy] |
samulinyman | 1:59f91670db51 | 93 | int16_t noise(); |
br549 | 0:db6e4ce9dc02 | 94 | |
br549 | 0:db6e4ce9dc02 | 95 | // allow hacking registers by making these public |
br549 | 0:db6e4ce9dc02 | 96 | uint8_t readReg(uint8_t addr); |
br549 | 0:db6e4ce9dc02 | 97 | void writeReg(uint8_t addr, uint8_t val); |
br549 | 0:db6e4ce9dc02 | 98 | void readAllRegs(); |
br549 | 0:db6e4ce9dc02 | 99 | |
br549 | 0:db6e4ce9dc02 | 100 | protected: |
br549 | 0:db6e4ce9dc02 | 101 | void isr0(); |
br549 | 0:db6e4ce9dc02 | 102 | void virtual interruptHandler(); |
br549 | 0:db6e4ce9dc02 | 103 | void sendFrame(uint8_t toAddress, const void* buffer, uint8_t size, bool requestACK=false, bool sendACK=false); |
br549 | 0:db6e4ce9dc02 | 104 | |
br549 | 0:db6e4ce9dc02 | 105 | static RFM69* selfPointer; |
br549 | 0:db6e4ce9dc02 | 106 | DigitalOut _slaveSelectPin; |
br549 | 0:db6e4ce9dc02 | 107 | InterruptIn _interrupt; |
br549 | 0:db6e4ce9dc02 | 108 | uint8_t _address; |
br549 | 0:db6e4ce9dc02 | 109 | Timer t; |
br549 | 0:db6e4ce9dc02 | 110 | bool _promiscuousMode; |
br549 | 0:db6e4ce9dc02 | 111 | uint8_t _powerLevel; |
br549 | 0:db6e4ce9dc02 | 112 | bool _isRFM69HW; |
br549 | 0:db6e4ce9dc02 | 113 | SPI _spi; |
br549 | 0:db6e4ce9dc02 | 114 | void receiveBegin(); |
br549 | 0:db6e4ce9dc02 | 115 | void setMode(uint8_t mode); |
br549 | 0:db6e4ce9dc02 | 116 | void setHighPowerRegs(bool onOff); |
br549 | 0:db6e4ce9dc02 | 117 | void select(); |
br549 | 0:db6e4ce9dc02 | 118 | void unselect(); |
br549 | 0:db6e4ce9dc02 | 119 | }; |
br549 | 0:db6e4ce9dc02 | 120 | |
br549 | 0:db6e4ce9dc02 | 121 | #endif |