Jonathan Jones
/
Radios
Radio Structures in OOP
modules/CommModule/CommModule.cpp@2:7d523bdd2f50, 2014-12-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |