Jonathan Jones
/
Radios
Radio Structures in OOP
modules/CommLink/CommLink.h@6:4a3dbfbc30f1, 2015-01-15 (annotated)
- Committer:
- jjones646
- Date:
- Thu Jan 15 07:15:33 2015 +0000
- Revision:
- 6:4a3dbfbc30f1
- Parent:
- 5:146523a0d1f4
socket interface confirmed working.
Who changed what in which revision?
User | Revision | Line number | New 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 | 5:146523a0d1f4 | 16 | #define COMM_LINK_SIGNAL_TX_TRIGGER 0x02 |
jjones646 | 5:146523a0d1f4 | 17 | #define COMM_LINK_SIGNAL_RX_TRIGGER 0x04 |
jjones646 | 5:146523a0d1f4 | 18 | #define COMM_LINK_SIGNAL_MODULE_LINKED 0x08 |
jjones646 | 3:dc7e9c6bc26c | 19 | #define COMM_LINK_BUFFER_SIZE 64 |
jjones646 | 3:dc7e9c6bc26c | 20 | |
jjones646 | 2:7d523bdd2f50 | 21 | |
jjones646 | 2:7d523bdd2f50 | 22 | class CommLink |
jjones646 | 2:7d523bdd2f50 | 23 | { |
jjones646 | 2:7d523bdd2f50 | 24 | public: |
jjones646 | 6:4a3dbfbc30f1 | 25 | // Constructors |
jjones646 | 2:7d523bdd2f50 | 26 | CommLink(); |
jjones646 | 3:dc7e9c6bc26c | 27 | CommLink(PinName, PinName, PinName, PinName = NC, PinName = NC); |
jjones646 | 3:dc7e9c6bc26c | 28 | |
jjones646 | 2:7d523bdd2f50 | 29 | // Deconstructor |
jjones646 | 6:4a3dbfbc30f1 | 30 | virtual ~CommLink() {}; // Don't forget to include deconstructor implementation in derived classes that frees memory |
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 | 6:4a3dbfbc30f1 | 37 | virtual void reset(void) = 0; |
jjones646 | 6:4a3dbfbc30f1 | 38 | virtual int32_t selfTest(void) = 0; |
jjones646 | 2:7d523bdd2f50 | 39 | virtual bool isConnected(void) = 0; |
jjones646 | 5:146523a0d1f4 | 40 | |
jjones646 | 6:4a3dbfbc30f1 | 41 | void setModule(CommModule&); |
jjones646 | 6:4a3dbfbc30f1 | 42 | void sendPacket(RTP_t*); |
jjones646 | 6:4a3dbfbc30f1 | 43 | void receivePacket(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 | 5:146523a0d1f4 | 49 | void ISR(void); |
jjones646 | 3:dc7e9c6bc26c | 50 | void toggle_cs(void); |
jjones646 | 6:4a3dbfbc30f1 | 51 | void ready(void); // Always call CommLink::ready() after derived class is ready for communication |
jjones646 | 5:146523a0d1f4 | 52 | void setup_spi(void); |
jjones646 | 3:dc7e9c6bc26c | 53 | |
jjones646 | 2:7d523bdd2f50 | 54 | // The data queues for temporarily holding received packets and packets that need to be transmitted |
jjones646 | 2:7d523bdd2f50 | 55 | osMailQId _txQueue; |
jjones646 | 2:7d523bdd2f50 | 56 | osMailQId _rxQueue; |
jjones646 | 2:7d523bdd2f50 | 57 | |
jjones646 | 3:dc7e9c6bc26c | 58 | // ============== PIN NAMES ============== |
jjones646 | 3:dc7e9c6bc26c | 59 | // SPI bus pins |
jjones646 | 3:dc7e9c6bc26c | 60 | PinName _miso_pin; |
jjones646 | 3:dc7e9c6bc26c | 61 | PinName _mosi_pin; |
jjones646 | 3:dc7e9c6bc26c | 62 | PinName _sck_pin; |
jjones646 | 3:dc7e9c6bc26c | 63 | PinName _cs_pin; // CS pin |
jjones646 | 3:dc7e9c6bc26c | 64 | PinName _int_pin; // Interrupt pin |
jjones646 | 4:989d51f3e6ef | 65 | |
jjones646 | 3:dc7e9c6bc26c | 66 | // ============== PIN OBJECTS ============== |
jjones646 | 3:dc7e9c6bc26c | 67 | SPI *_spi; // SPI pointer |
jjones646 | 3:dc7e9c6bc26c | 68 | DigitalOut *_cs; // Chip Select pointer |
jjones646 | 3:dc7e9c6bc26c | 69 | InterruptIn *_int_in; // Interrupt pin |
jjones646 | 3:dc7e9c6bc26c | 70 | |
jjones646 | 2:7d523bdd2f50 | 71 | private: |
jjones646 | 2:7d523bdd2f50 | 72 | // Used to help define the class's threads in the constructor |
jjones646 | 2:7d523bdd2f50 | 73 | friend void define_thread(osThreadDef_t&, void(*task)(void const *arg), osPriority, uint32_t, unsigned char*); |
jjones646 | 4:989d51f3e6ef | 74 | |
jjones646 | 6:4a3dbfbc30f1 | 75 | // Data queues |
jjones646 | 3:dc7e9c6bc26c | 76 | MailHelper<RTP_t, COMM_LINK_TX_QUEUE_SIZE> _txQueueHelper; |
jjones646 | 3:dc7e9c6bc26c | 77 | MailHelper<RTP_t, COMM_LINK_RX_QUEUE_SIZE> _rxQueueHelper; |
jjones646 | 5:146523a0d1f4 | 78 | |
jjones646 | 2:7d523bdd2f50 | 79 | // Thread definitions and IDs |
jjones646 | 2:7d523bdd2f50 | 80 | osThreadDef_t _txDef; |
jjones646 | 2:7d523bdd2f50 | 81 | osThreadDef_t _rxDef; |
jjones646 | 2:7d523bdd2f50 | 82 | osThreadId _txID; |
jjones646 | 2:7d523bdd2f50 | 83 | osThreadId _rxID; |
jjones646 | 6:4a3dbfbc30f1 | 84 | |
jjones646 | 6:4a3dbfbc30f1 | 85 | // The working threads for handeling RX/TX data queue operations |
jjones646 | 6:4a3dbfbc30f1 | 86 | static void txThread(void const*); |
jjones646 | 6:4a3dbfbc30f1 | 87 | static void rxThread(void const*); |
jjones646 | 4:989d51f3e6ef | 88 | |
jjones646 | 6:4a3dbfbc30f1 | 89 | // Methods for initializing a transceiver's pins for communication |
jjones646 | 6:4a3dbfbc30f1 | 90 | void setup(void); |
jjones646 | 6:4a3dbfbc30f1 | 91 | void setup_pins(PinName = NC, PinName = NC, PinName = NC, PinName = NC, PinName = NC); |
jjones646 | 6:4a3dbfbc30f1 | 92 | void setup_cs(void); |
jjones646 | 6:4a3dbfbc30f1 | 93 | void setup_interrupt(void); |
jjones646 | 6:4a3dbfbc30f1 | 94 | |
jjones646 | 6:4a3dbfbc30f1 | 95 | // Used for tracking the number of link-level communication interfaces |
jjones646 | 6:4a3dbfbc30f1 | 96 | static unsigned int _nbr_links; |
jjones646 | 6:4a3dbfbc30f1 | 97 | |
jjones646 | 6:4a3dbfbc30f1 | 98 | //typedef void(*func_p)(void const*); |
jjones646 | 6:4a3dbfbc30f1 | 99 | //nc_p _rx_handle; |
jjones646 | 6:4a3dbfbc30f1 | 100 | |
jjones646 | 6:4a3dbfbc30f1 | 101 | uint8_t buf[COMM_LINK_BUFFER_SIZE]; |
jjones646 | 6:4a3dbfbc30f1 | 102 | |
jjones646 | 6:4a3dbfbc30f1 | 103 | CommModule *_comm_module; |
jjones646 | 6:4a3dbfbc30f1 | 104 | |
jjones646 | 2:7d523bdd2f50 | 105 | }; |
jjones646 | 2:7d523bdd2f50 | 106 | |
jjones646 | 2:7d523bdd2f50 | 107 | #endif // COMMUNICATION_LINK_H |