Radio Structures in OOP

Dependencies:   mbed mbed-rtos

Committer:
jjones646
Date:
Sat Jan 03 11:04:31 2015 +0000
Revision:
4:989d51f3e6ef
Parent:
3:dc7e9c6bc26c
Child:
5:146523a0d1f4
adding separate methods for setting rx/tx callback functions with both regular and object functions and methods.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jjones646 2:7d523bdd2f50 1 #ifndef COMMUNICATION_LINK_H
jjones646 2:7d523bdd2f50 2 #define COMMUNICATION_LINK_H
jjones646 2:7d523bdd2f50 3
jjones646 3:dc7e9c6bc26c 4
jjones646 2:7d523bdd2f50 5 #include "mbed.h"
jjones646 2:7d523bdd2f50 6 #include "cmsis_os.h"
jjones646 2:7d523bdd2f50 7 #include "RTP.h"
jjones646 2:7d523bdd2f50 8 #include "ThreadHelper.h"
jjones646 3:dc7e9c6bc26c 9 #include "MailHelper.h"
jjones646 3:dc7e9c6bc26c 10 #include "CommModule.h"
jjones646 3:dc7e9c6bc26c 11
jjones646 2:7d523bdd2f50 12
jjones646 2:7d523bdd2f50 13 #define COMM_LINK_TX_QUEUE_SIZE 3
jjones646 2:7d523bdd2f50 14 #define COMM_LINK_RX_QUEUE_SIZE 3
jjones646 3:dc7e9c6bc26c 15 #define COMM_LINK_SIGNAL_START_THREAD 0x01
jjones646 3:dc7e9c6bc26c 16 #define COMM_LINK_SIGNAL_INTERRUPT_TRIGGER 0x02
jjones646 3:dc7e9c6bc26c 17 #define COMM_LINK_SIGNAL_MODULE_LINKED 0x04
jjones646 3:dc7e9c6bc26c 18 #define COMM_LINK_BUFFER_SIZE 64
jjones646 3:dc7e9c6bc26c 19
jjones646 2:7d523bdd2f50 20
jjones646 2:7d523bdd2f50 21 class CommLink
jjones646 2:7d523bdd2f50 22 {
jjones646 2:7d523bdd2f50 23 public:
jjones646 2:7d523bdd2f50 24 // Default constructor
jjones646 2:7d523bdd2f50 25 CommLink();
jjones646 2:7d523bdd2f50 26
jjones646 3:dc7e9c6bc26c 27 CommLink(PinName, PinName, PinName, PinName = NC, PinName = NC);
jjones646 3:dc7e9c6bc26c 28
jjones646 2:7d523bdd2f50 29 // Deconstructor
jjones646 4:989d51f3e6ef 30 virtual ~CommLink() {};
jjones646 2:7d523bdd2f50 31
jjones646 2:7d523bdd2f50 32 // Class constants for the data queue sizes
jjones646 2:7d523bdd2f50 33 static const int TX_QUEUE_SIZE;
jjones646 2:7d523bdd2f50 34 static const int RX_QUEUE_SIZE;
jjones646 2:7d523bdd2f50 35
jjones646 2:7d523bdd2f50 36 // The pure virtual methods for making CommLink an abstract class
jjones646 2:7d523bdd2f50 37 virtual uint32_t reset(void) = 0;
jjones646 2:7d523bdd2f50 38 virtual uint32_t selfTest(void) = 0;
jjones646 2:7d523bdd2f50 39 virtual bool isConnected(void) = 0;
jjones646 4:989d51f3e6ef 40
jjones646 3:dc7e9c6bc26c 41 void module(CommModule&);
jjones646 4:989d51f3e6ef 42 void triggerReceive(void);
jjones646 3:dc7e9c6bc26c 43 void write_tx_queue(RTP_t*);
jjones646 2:7d523bdd2f50 44
jjones646 2:7d523bdd2f50 45 protected:
jjones646 3:dc7e9c6bc26c 46 virtual int32_t sendData(uint8_t*, uint8_t) = 0; // write data out to the radio device using SPI
jjones646 3:dc7e9c6bc26c 47 virtual int32_t getData(uint8_t*, uint8_t*) = 0; // read data in from the radio device using SPI
jjones646 4:989d51f3e6ef 48
jjones646 3:dc7e9c6bc26c 49 virtual void ISR(void);
jjones646 3:dc7e9c6bc26c 50 void toggle_cs(void);
jjones646 3:dc7e9c6bc26c 51 void ready(void);
jjones646 3:dc7e9c6bc26c 52
jjones646 2:7d523bdd2f50 53 // The data queues for temporarily holding received packets and packets that need to be transmitted
jjones646 2:7d523bdd2f50 54 osMailQId _txQueue;
jjones646 2:7d523bdd2f50 55 osMailQId _rxQueue;
jjones646 2:7d523bdd2f50 56
jjones646 3:dc7e9c6bc26c 57 // ============== PIN NAMES ==============
jjones646 3:dc7e9c6bc26c 58 // SPI bus pins
jjones646 3:dc7e9c6bc26c 59 PinName _miso_pin;
jjones646 3:dc7e9c6bc26c 60 PinName _mosi_pin;
jjones646 3:dc7e9c6bc26c 61 PinName _sck_pin;
jjones646 3:dc7e9c6bc26c 62 PinName _cs_pin; // CS pin
jjones646 3:dc7e9c6bc26c 63 PinName _int_pin; // Interrupt pin
jjones646 4:989d51f3e6ef 64
jjones646 3:dc7e9c6bc26c 65 // ============== PIN OBJECTS ==============
jjones646 3:dc7e9c6bc26c 66 SPI *_spi; // SPI pointer
jjones646 3:dc7e9c6bc26c 67 DigitalOut *_cs; // Chip Select pointer
jjones646 3:dc7e9c6bc26c 68 InterruptIn *_int_in; // Interrupt pin
jjones646 3:dc7e9c6bc26c 69
jjones646 2:7d523bdd2f50 70 private:
jjones646 2:7d523bdd2f50 71 // Used to help define the class's threads in the constructor
jjones646 2:7d523bdd2f50 72 friend void define_thread(osThreadDef_t&, void(*task)(void const *arg), osPriority, uint32_t, unsigned char*);
jjones646 4:989d51f3e6ef 73
jjones646 3:dc7e9c6bc26c 74 MailHelper<RTP_t, COMM_LINK_TX_QUEUE_SIZE> _txQueueHelper;
jjones646 3:dc7e9c6bc26c 75 MailHelper<RTP_t, COMM_LINK_RX_QUEUE_SIZE> _rxQueueHelper;
jjones646 2:7d523bdd2f50 76
jjones646 2:7d523bdd2f50 77 // The working threads for handeling rx and tx data queues
jjones646 2:7d523bdd2f50 78 static void txThread(void const*);
jjones646 2:7d523bdd2f50 79 static void rxThread(void const*);
jjones646 2:7d523bdd2f50 80
jjones646 3:dc7e9c6bc26c 81 // methods for initializing the pins
jjones646 3:dc7e9c6bc26c 82 void setup(void);
jjones646 3:dc7e9c6bc26c 83 void setup_pins(PinName = NC, PinName = NC, PinName = NC, PinName = NC, PinName = NC);
jjones646 3:dc7e9c6bc26c 84 void setup_spi(void);
jjones646 3:dc7e9c6bc26c 85 void setup_cs(void);
jjones646 3:dc7e9c6bc26c 86 void setup_interrupt(void);
jjones646 4:989d51f3e6ef 87
jjones646 3:dc7e9c6bc26c 88 typedef void(*func_p)(void const*);
jjones646 3:dc7e9c6bc26c 89 func_p _rx_handle;
jjones646 4:989d51f3e6ef 90
jjones646 4:989d51f3e6ef 91 static unsigned int _nbr_links;
jjones646 4:989d51f3e6ef 92
jjones646 3:dc7e9c6bc26c 93 uint8_t buf[COMM_LINK_BUFFER_SIZE];
jjones646 3:dc7e9c6bc26c 94
jjones646 2:7d523bdd2f50 95 // Thread definitions and IDs
jjones646 2:7d523bdd2f50 96 osThreadDef_t _txDef;
jjones646 2:7d523bdd2f50 97 osThreadDef_t _rxDef;
jjones646 2:7d523bdd2f50 98 osThreadId _txID;
jjones646 2:7d523bdd2f50 99 osThreadId _rxID;
jjones646 4:989d51f3e6ef 100
jjones646 4:989d51f3e6ef 101 public:
jjones646 3:dc7e9c6bc26c 102 void sendPacket(RTP_t*);
jjones646 3:dc7e9c6bc26c 103 void receivePacket(RTP_t*);
jjones646 2:7d523bdd2f50 104 };
jjones646 2:7d523bdd2f50 105
jjones646 2:7d523bdd2f50 106 #endif // COMMUNICATION_LINK_H