Radio Structures in OOP

Dependencies:   mbed mbed-rtos

Committer:
jjones646
Date:
Sun Dec 28 06:05:17 2014 +0000
Revision:
2:7d523bdd2f50
Child:
3:dc7e9c6bc26c
outlining communication implementations

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jjones646 2:7d523bdd2f50 1 #include "CommModule.h"
jjones646 2:7d523bdd2f50 2 #include "ThreadHelper.h"
jjones646 2:7d523bdd2f50 3
jjones646 2:7d523bdd2f50 4 // Set the class's constants for streamlined use in other areas of the code
jjones646 2:7d523bdd2f50 5 const int CommModule::TX_QUEUE_SIZE = COMM_MODULE_TX_QUEUE_SIZE;
jjones646 2:7d523bdd2f50 6 const int CommModule::RX_QUEUE_SIZE = COMM_MODULE_RX_QUEUE_SIZE;
jjones646 2:7d523bdd2f50 7 const int CommModule::NBR_PORTS = COMM_MODULE_NBR_PORTS;
jjones646 2:7d523bdd2f50 8
jjones646 2:7d523bdd2f50 9 // Default constructor
jjones646 2:7d523bdd2f50 10 CommModule::CommModule()
jjones646 2:7d523bdd2f50 11 {
jjones646 2:7d523bdd2f50 12 // [X] - 2 - Setup everything for RTP packets
jjones646 2:7d523bdd2f50 13
jjones646 2:7d523bdd2f50 14 // [X] - 3 - Set the default radio link
jjones646 2:7d523bdd2f50 15
jjones646 2:7d523bdd2f50 16 // [] - 4 - Define the tx/rx task threads and start their operations
jjones646 2:7d523bdd2f50 17
jjones646 2:7d523bdd2f50 18 // [] - 4 - Setup the services for all of the ports (sockets)
jjones646 2:7d523bdd2f50 19
jjones646 2:7d523bdd2f50 20 // Define the data queues [THESE ARE MACROS]
jjones646 2:7d523bdd2f50 21 osMailQDef(_txQueue_, COMM_MODULE_TX_QUEUE_SIZE, RTP_t);
jjones646 2:7d523bdd2f50 22 osMailQDef(_rxQueue_, COMM_MODULE_RX_QUEUE_SIZE, RTP_t);
jjones646 2:7d523bdd2f50 23
jjones646 2:7d523bdd2f50 24 // [THIS CURRENTLY CAUSES AN MBED RUNTIME ERROR]
jjones646 2:7d523bdd2f50 25 // Create the data queues
jjones646 2:7d523bdd2f50 26 //_txQueue = osMailCreate(osMailQ(_txQueue_), NULL);
jjones646 2:7d523bdd2f50 27 //_rxQueue = osMailCreate(osMailQ(_rxQueue_), NULL);
jjones646 2:7d523bdd2f50 28
jjones646 2:7d523bdd2f50 29 // Outline the thread definitions
jjones646 2:7d523bdd2f50 30 define_thread(_txDef, &CommModule::txThread);
jjones646 2:7d523bdd2f50 31 define_thread(_rxDef, &CommModule::rxThread);
jjones646 2:7d523bdd2f50 32
jjones646 2:7d523bdd2f50 33 // Create the thread and pass it a pointer to the created object
jjones646 2:7d523bdd2f50 34 _txID = osThreadCreate(&_txDef, (void*)this);
jjones646 2:7d523bdd2f50 35 _rxID = osThreadCreate(&_rxDef, (void*)this);
jjones646 2:7d523bdd2f50 36
jjones646 2:7d523bdd2f50 37 // Set the default hardware link to nothing
jjones646 2:7d523bdd2f50 38 _link = NULL;
jjones646 2:7d523bdd2f50 39 }
jjones646 2:7d523bdd2f50 40
jjones646 2:7d523bdd2f50 41 void CommModule::txThread(void const *arg)
jjones646 2:7d523bdd2f50 42 {
jjones646 2:7d523bdd2f50 43 CommModule *inst = (CommModule*)arg;
jjones646 2:7d523bdd2f50 44
jjones646 2:7d523bdd2f50 45 // Only continue past this point once at least one (1) hardware link is initialized
jjones646 2:7d523bdd2f50 46
jjones646 2:7d523bdd2f50 47 while(1) {
jjones646 2:7d523bdd2f50 48 // When a new RTP packet is put in the tx queue, begin operations (does nothing if no new data in queue)
jjones646 2:7d523bdd2f50 49 osEvent evt = osMailGet(inst->_txQueue, osWaitForever);
jjones646 2:7d523bdd2f50 50
jjones646 2:7d523bdd2f50 51 if (evt.status == osEventMail) {
jjones646 2:7d523bdd2f50 52
jjones646 2:7d523bdd2f50 53 // Get a pointer to the packet's memory location
jjones646 2:7d523bdd2f50 54 RTP_t *packet = (RTP_t*)evt.value.p;
jjones646 2:7d523bdd2f50 55
jjones646 2:7d523bdd2f50 56 // Send the packet on the active communication link
jjones646 2:7d523bdd2f50 57 inst->_link->sendPacket(packet);
jjones646 2:7d523bdd2f50 58
jjones646 2:7d523bdd2f50 59 // Release the allocated memory once data is sent
jjones646 2:7d523bdd2f50 60 osMailFree(inst->_txQueue, packet);
jjones646 2:7d523bdd2f50 61 }
jjones646 2:7d523bdd2f50 62 }
jjones646 2:7d523bdd2f50 63 }
jjones646 2:7d523bdd2f50 64
jjones646 2:7d523bdd2f50 65 void CommModule::rxThread(void const *arg)
jjones646 2:7d523bdd2f50 66 {
jjones646 2:7d523bdd2f50 67 CommModule *inst = (CommModule*)arg;
jjones646 2:7d523bdd2f50 68
jjones646 2:7d523bdd2f50 69 // Only continue past this point once at least one (1) hardware link is initialized
jjones646 2:7d523bdd2f50 70
jjones646 2:7d523bdd2f50 71 // RTP_t p;
jjones646 2:7d523bdd2f50 72 while(1) {
jjones646 2:7d523bdd2f50 73
jjones646 2:7d523bdd2f50 74 // Wait until new data is placed in the class's rxQueue from a CommLink class
jjones646 2:7d523bdd2f50 75
jjones646 2:7d523bdd2f50 76 /*
jjones646 2:7d523bdd2f50 77 // Read a new packet from the active interface
jjones646 2:7d523bdd2f50 78 link->receivePacket(&p);
jjones646 2:7d523bdd2f50 79
jjones646 2:7d523bdd2f50 80 if (p.port) {
jjones646 2:7d523bdd2f50 81 // write the received packet to it's respective port's queue
jjones646 2:7d523bdd2f50 82 // rxQueue[p.port]
jjones646 2:7d523bdd2f50 83 }
jjones646 2:7d523bdd2f50 84
jjones646 2:7d523bdd2f50 85 if (callbacks[p.port]) {
jjones646 2:7d523bdd2f50 86 // call the respective port's function for executing the correct task
jjones646 2:7d523bdd2f50 87 // callbacks[p.port](&p);
jjones646 2:7d523bdd2f50 88 }
jjones646 2:7d523bdd2f50 89 */
jjones646 2:7d523bdd2f50 90
jjones646 2:7d523bdd2f50 91 }
jjones646 2:7d523bdd2f50 92 }
jjones646 2:7d523bdd2f50 93
jjones646 2:7d523bdd2f50 94
jjones646 2:7d523bdd2f50 95 void CommModule::setLink(CommLink *link)
jjones646 2:7d523bdd2f50 96 {
jjones646 2:7d523bdd2f50 97 // Update the currently active hardware communication link
jjones646 2:7d523bdd2f50 98 _link = link;
jjones646 2:7d523bdd2f50 99 }
jjones646 2:7d523bdd2f50 100
jjones646 2:7d523bdd2f50 101 void CommModule::openSocket(uint8_t portNbr, void(*task)(void const *arg))
jjones646 2:7d523bdd2f50 102 {
jjones646 2:7d523bdd2f50 103 // [] - 1 - Associate the given port number with the passed function pointer (set this in the class's variables)
jjones646 2:7d523bdd2f50 104
jjones646 2:7d523bdd2f50 105 // [] - 2 - The function pointer should be called when a packet of its respective port number is received
jjones646 2:7d523bdd2f50 106 }
jjones646 2:7d523bdd2f50 107
jjones646 2:7d523bdd2f50 108 void CommModule::send(RTP_t& p)
jjones646 2:7d523bdd2f50 109 {
jjones646 2:7d523bdd2f50 110 // [] - 1 - Place the passed packet into the txQueue
jjones646 2:7d523bdd2f50 111
jjones646 2:7d523bdd2f50 112 // [] - 2 - Ensure that proper threads know that new information is available in the queue
jjones646 2:7d523bdd2f50 113 }