Radio communication with NRF24

Dependents:   F030

Revision:
0:9f5a444886a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ssRadio.h	Fri Oct 06 20:17:36 2017 +0000
@@ -0,0 +1,75 @@
+#ifndef __SSRADIO_H__
+#define __SSRADIO_H__
+
+//#define SERIAL_DEBUG 1
+
+#include "RF24.h"
+#include "NodeConfig.h"
+
+#define QUEUELEN 3
+
+typedef union _Packet {
+  struct __attribute__((packed)) {
+    uint16_t address;     // Source address
+    uint8_t type;         // Type. MSB signals extended type (+1 byte). Not implemented yet.
+    uint8_t counter;      // Packet counter
+    uint8_t payload[28]; 
+  } fields;
+  uint8_t raw[32];
+} Packet;
+
+class SSRadio {
+
+protected:
+    NodeConfig *config;
+    RF24 rf24;
+    
+    void (*onReceiveData)(uint8_t *data, uint16_t type, uint8_t len);
+    void (*onConnect)();
+    void (*onDisconnect)();
+
+    uint16_t txCounter;
+    uint16_t rxCounter;
+    
+    uint8_t packetRx[32];
+    long lastSync;  // millis when the last Sync was received
+    int8_t sendSlot;    // Transmission slot, when synced
+    int8_t freeSlot;    // Free (for everyone) slot, when synced
+    uint8_t slot_ms;    // Slot size in ms
+    
+    void receiveSyncFrame(uint8_t *frame, uint8_t size);
+    void receiveDataFrame(uint8_t *frame, uint8_t size);
+    
+    uint16_t myAddress;
+    uint64_t gatewayAddress;
+    
+    uint8_t txQueue[QUEUELEN * 30]; // 1 length + 1 type + 28 payload
+    uint8_t rxQueue[QUEUELEN * 30];
+    uint8_t txQueueLength;
+    uint8_t rxQueueLength;
+    
+public:
+    SSRadio(SPI *spi, NodeConfig *nc);
+    
+    void init();
+    void loop();
+    
+    void useIRQ(uint16_t irqPin);
+    
+    bool isRunning();   // RF24 is connected or not
+    bool isConnected(); // There is a GW nearby
+    bool isScheduled(); // Sending is scheduled by the GW
+    bool isAvailableData(); // Available data
+    
+    bool sendData(uint8_t *data, uint16_t type, uint8_t len); // Send data to GW
+    bool instantData(uint8_t *data, uint16_t type, uint8_t len); // Send data to GW immediately
+    bool receiveData(uint8_t *data, uint16_t &type, uint8_t &len); // Receive data from GW
+    void setSlotSize(uint8_t slot_ms);
+    
+    // Callbacks
+    void setOnReceiveData(void (*onReceiveData)(uint8_t *data, uint16_t type, uint8_t len));
+    void setOnConnect(void (*onConnect)());
+    void setOnDisconnect(void (*onDisconnect)());
+};
+
+#endif // __SSRADIO_H__