Radio communication with NRF24

Dependents:   F030

Committer:
gume
Date:
Fri Oct 06 20:17:36 2017 +0000
Revision:
0:9f5a444886a8
Initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gume 0:9f5a444886a8 1 #ifndef __SSRADIO_H__
gume 0:9f5a444886a8 2 #define __SSRADIO_H__
gume 0:9f5a444886a8 3
gume 0:9f5a444886a8 4 //#define SERIAL_DEBUG 1
gume 0:9f5a444886a8 5
gume 0:9f5a444886a8 6 #include "RF24.h"
gume 0:9f5a444886a8 7 #include "NodeConfig.h"
gume 0:9f5a444886a8 8
gume 0:9f5a444886a8 9 #define QUEUELEN 3
gume 0:9f5a444886a8 10
gume 0:9f5a444886a8 11 typedef union _Packet {
gume 0:9f5a444886a8 12 struct __attribute__((packed)) {
gume 0:9f5a444886a8 13 uint16_t address; // Source address
gume 0:9f5a444886a8 14 uint8_t type; // Type. MSB signals extended type (+1 byte). Not implemented yet.
gume 0:9f5a444886a8 15 uint8_t counter; // Packet counter
gume 0:9f5a444886a8 16 uint8_t payload[28];
gume 0:9f5a444886a8 17 } fields;
gume 0:9f5a444886a8 18 uint8_t raw[32];
gume 0:9f5a444886a8 19 } Packet;
gume 0:9f5a444886a8 20
gume 0:9f5a444886a8 21 class SSRadio {
gume 0:9f5a444886a8 22
gume 0:9f5a444886a8 23 protected:
gume 0:9f5a444886a8 24 NodeConfig *config;
gume 0:9f5a444886a8 25 RF24 rf24;
gume 0:9f5a444886a8 26
gume 0:9f5a444886a8 27 void (*onReceiveData)(uint8_t *data, uint16_t type, uint8_t len);
gume 0:9f5a444886a8 28 void (*onConnect)();
gume 0:9f5a444886a8 29 void (*onDisconnect)();
gume 0:9f5a444886a8 30
gume 0:9f5a444886a8 31 uint16_t txCounter;
gume 0:9f5a444886a8 32 uint16_t rxCounter;
gume 0:9f5a444886a8 33
gume 0:9f5a444886a8 34 uint8_t packetRx[32];
gume 0:9f5a444886a8 35 long lastSync; // millis when the last Sync was received
gume 0:9f5a444886a8 36 int8_t sendSlot; // Transmission slot, when synced
gume 0:9f5a444886a8 37 int8_t freeSlot; // Free (for everyone) slot, when synced
gume 0:9f5a444886a8 38 uint8_t slot_ms; // Slot size in ms
gume 0:9f5a444886a8 39
gume 0:9f5a444886a8 40 void receiveSyncFrame(uint8_t *frame, uint8_t size);
gume 0:9f5a444886a8 41 void receiveDataFrame(uint8_t *frame, uint8_t size);
gume 0:9f5a444886a8 42
gume 0:9f5a444886a8 43 uint16_t myAddress;
gume 0:9f5a444886a8 44 uint64_t gatewayAddress;
gume 0:9f5a444886a8 45
gume 0:9f5a444886a8 46 uint8_t txQueue[QUEUELEN * 30]; // 1 length + 1 type + 28 payload
gume 0:9f5a444886a8 47 uint8_t rxQueue[QUEUELEN * 30];
gume 0:9f5a444886a8 48 uint8_t txQueueLength;
gume 0:9f5a444886a8 49 uint8_t rxQueueLength;
gume 0:9f5a444886a8 50
gume 0:9f5a444886a8 51 public:
gume 0:9f5a444886a8 52 SSRadio(SPI *spi, NodeConfig *nc);
gume 0:9f5a444886a8 53
gume 0:9f5a444886a8 54 void init();
gume 0:9f5a444886a8 55 void loop();
gume 0:9f5a444886a8 56
gume 0:9f5a444886a8 57 void useIRQ(uint16_t irqPin);
gume 0:9f5a444886a8 58
gume 0:9f5a444886a8 59 bool isRunning(); // RF24 is connected or not
gume 0:9f5a444886a8 60 bool isConnected(); // There is a GW nearby
gume 0:9f5a444886a8 61 bool isScheduled(); // Sending is scheduled by the GW
gume 0:9f5a444886a8 62 bool isAvailableData(); // Available data
gume 0:9f5a444886a8 63
gume 0:9f5a444886a8 64 bool sendData(uint8_t *data, uint16_t type, uint8_t len); // Send data to GW
gume 0:9f5a444886a8 65 bool instantData(uint8_t *data, uint16_t type, uint8_t len); // Send data to GW immediately
gume 0:9f5a444886a8 66 bool receiveData(uint8_t *data, uint16_t &type, uint8_t &len); // Receive data from GW
gume 0:9f5a444886a8 67 void setSlotSize(uint8_t slot_ms);
gume 0:9f5a444886a8 68
gume 0:9f5a444886a8 69 // Callbacks
gume 0:9f5a444886a8 70 void setOnReceiveData(void (*onReceiveData)(uint8_t *data, uint16_t type, uint8_t len));
gume 0:9f5a444886a8 71 void setOnConnect(void (*onConnect)());
gume 0:9f5a444886a8 72 void setOnDisconnect(void (*onDisconnect)());
gume 0:9f5a444886a8 73 };
gume 0:9f5a444886a8 74
gume 0:9f5a444886a8 75 #endif // __SSRADIO_H__