This program utilizes the mcr20 Thread Shield on the FRDM-K64F MCU which is a two-part workspace (HVAC Server (RX)/Probe(TX)) to handle low temperature events read at the probe(s) to prevent pipes from freezing.
Dependencies: fsl_phy_mcr20a fsl_smac mbed-rtos mbed
Fork of mcr20_wireless_uart by
main.cpp@29:be24c0c29f17, 2017-03-30 (annotated)
- Committer:
- haircules
- Date:
- Thu Mar 30 20:22:35 2017 +0000
- Revision:
- 29:be24c0c29f17
- Parent:
- 27:1eb29717bfd9
SmartPipe HVAC Server
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sam_grove | 0:01fb291427ce | 1 | #include "mbed.h" |
cotigac | 18:b02fc0e53df8 | 2 | #include "rtos.h" |
sam_grove | 2:3e7685cfb2a7 | 3 | |
FSL\B36402 |
23:6f13fea3cace | 4 | #include "Phy.h" |
cotigac | 19:71b793021c78 | 5 | #include "SMAC_Interface.h" |
cotigac | 19:71b793021c78 | 6 | #include "SMAC_Config.h" |
andreikovacs | 27:1eb29717bfd9 | 7 | #include "MemManager.h" |
andreikovacs | 27:1eb29717bfd9 | 8 | #include "circular_buffer.h" |
cotigac | 19:71b793021c78 | 9 | |
andreikovacs | 27:1eb29717bfd9 | 10 | char * const cu8FreescaleLogo[]={ |
andreikovacs | 27:1eb29717bfd9 | 11 | "\f\r\n", |
andreikovacs | 27:1eb29717bfd9 | 12 | "\n\r\n\r\n\r #\n", |
andreikovacs | 27:1eb29717bfd9 | 13 | "\r ###\n", |
andreikovacs | 27:1eb29717bfd9 | 14 | "\r ### *\n", |
andreikovacs | 27:1eb29717bfd9 | 15 | "\r # ***\n", |
andreikovacs | 27:1eb29717bfd9 | 16 | "\r *** #\n", |
andreikovacs | 27:1eb29717bfd9 | 17 | "\r * ###\n", |
andreikovacs | 27:1eb29717bfd9 | 18 | "\r ###\n", |
andreikovacs | 27:1eb29717bfd9 | 19 | "\r * #\n", |
andreikovacs | 27:1eb29717bfd9 | 20 | "\r ***\n", |
andreikovacs | 27:1eb29717bfd9 | 21 | "\r *** #\n", |
andreikovacs | 27:1eb29717bfd9 | 22 | "\r # * ###\n", |
andreikovacs | 27:1eb29717bfd9 | 23 | "\r ### ###\n", |
andreikovacs | 27:1eb29717bfd9 | 24 | "\r ### * # F R E E S C A L E\n", |
andreikovacs | 27:1eb29717bfd9 | 25 | "\r # ***\n", |
andreikovacs | 27:1eb29717bfd9 | 26 | "\r *** S E M I C O N D U C T O R\n", |
andreikovacs | 27:1eb29717bfd9 | 27 | "\r # *\n", |
andreikovacs | 27:1eb29717bfd9 | 28 | "\r ### 2 0 1 5\n", |
andreikovacs | 27:1eb29717bfd9 | 29 | "\r ###\n", |
andreikovacs | 27:1eb29717bfd9 | 30 | "\r # Wireless Uart Demo\r\n\n", |
andreikovacs | 27:1eb29717bfd9 | 31 | NULL |
andreikovacs | 27:1eb29717bfd9 | 32 | }; |
andreikovacs | 26:56ca40dcfae1 | 33 | |
FSL\B36402 |
23:6f13fea3cace | 34 | #define gMcps_Cnf_EVENT_c (1<<1) |
FSL\B36402 |
23:6f13fea3cace | 35 | #define gMcps_Ind_EVENT_c (1<<2) |
FSL\B36402 |
23:6f13fea3cace | 36 | #define gMlme_EdCnf_EVENT_c (1<<3) |
FSL\B36402 |
23:6f13fea3cace | 37 | #define gMlme_CcaCnf_EVENT_c (1<<4) |
FSL\B36402 |
23:6f13fea3cace | 38 | #define gMlme_TimeoutInd_EVENT_c (1<<5) |
FSL\B36402 |
23:6f13fea3cace | 39 | #define gWUSelf_EVENT_c (1<<6) |
FSL\B36402 |
23:6f13fea3cace | 40 | |
andreikovacs | 27:1eb29717bfd9 | 41 | #define gDefaultBaudRate_UART_c 115200UL |
andreikovacs | 27:1eb29717bfd9 | 42 | |
haircules | 29:be24c0c29f17 | 43 | #define BUF_SIZE 3 |
haircules | 29:be24c0c29f17 | 44 | |
andreikovacs | 27:1eb29717bfd9 | 45 | Serial uart(USBTX, USBRX); |
andreikovacs | 27:1eb29717bfd9 | 46 | CircularBuffer uartBuf; |
andreikovacs | 27:1eb29717bfd9 | 47 | |
haircules | 29:be24c0c29f17 | 48 | |
cotigac | 19:71b793021c78 | 49 | #ifdef VERBOSE |
cotigac | 19:71b793021c78 | 50 | static bool_t bCCAFailed; |
cotigac | 19:71b793021c78 | 51 | static bool_t bACKFailed; |
cotigac | 19:71b793021c78 | 52 | #endif |
FSL\B36402 |
23:6f13fea3cace | 53 | uint32_t gTaskEventFlags; |
haircules | 29:be24c0c29f17 | 54 | int low_temp_flag = 0; |
haircules | 29:be24c0c29f17 | 55 | int heat_state = 0; |
cotigac | 19:71b793021c78 | 56 | static uint8_t gau8TxDataBuffer[gMaxSmacSDULength_c + sizeof(rxPacket_t)]; |
sam_grove | 25:f40bc034cd8b | 57 | txPacket_t *gAppTxPacket; |
sam_grove | 25:f40bc034cd8b | 58 | rxPacket_t *gAppRxPacket; |
cotigac | 19:71b793021c78 | 59 | static txContextConfig_t txConfigContext; |
cotigac | 19:71b793021c78 | 60 | |
andreikovacs | 27:1eb29717bfd9 | 61 | |
andreikovacs | 27:1eb29717bfd9 | 62 | void PrintMenu(char * const pu8Menu[]) |
andreikovacs | 27:1eb29717bfd9 | 63 | { |
andreikovacs | 27:1eb29717bfd9 | 64 | uint8_t u8Index = 0; |
andreikovacs | 27:1eb29717bfd9 | 65 | while(pu8Menu[u8Index]){ |
andreikovacs | 27:1eb29717bfd9 | 66 | uart.printf(pu8Menu[u8Index]); |
andreikovacs | 27:1eb29717bfd9 | 67 | u8Index++; |
andreikovacs | 27:1eb29717bfd9 | 68 | } |
andreikovacs | 27:1eb29717bfd9 | 69 | } |
andreikovacs | 27:1eb29717bfd9 | 70 | |
andreikovacs | 27:1eb29717bfd9 | 71 | |
cotigac | 19:71b793021c78 | 72 | void InitProject(void); |
FSL\B36402 |
23:6f13fea3cace | 73 | void InitApp(void); |
FSL\B36402 |
23:6f13fea3cace | 74 | |
cotigac | 19:71b793021c78 | 75 | extern smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance); |
cotigac | 19:71b793021c78 | 76 | extern smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance); |
cotigac | 19:71b793021c78 | 77 | |
andreikovacs | 27:1eb29717bfd9 | 78 | DigitalOut led1(LED_GREEN); |
haircules | 29:be24c0c29f17 | 79 | DigitalOut led2(LED_RED); |
haircules | 29:be24c0c29f17 | 80 | DigitalOut led3(LED_BLUE); |
cotigac | 18:b02fc0e53df8 | 81 | InterruptIn sw2(SW2); |
cotigac | 18:b02fc0e53df8 | 82 | uint32_t button_pressed; |
haircules | 29:be24c0c29f17 | 83 | uint8_t timer; |
haircules | 29:be24c0c29f17 | 84 | char temp[] = {'1','0','0'}; /*initialize temp to safe value*/ |
cotigac | 18:b02fc0e53df8 | 85 | Thread *thread2; |
FSL\B36402 |
23:6f13fea3cace | 86 | Thread *eventsThread; |
haircules | 29:be24c0c29f17 | 87 | Thread *timerThread; |
sam_grove | 2:3e7685cfb2a7 | 88 | |
andreikovacs | 27:1eb29717bfd9 | 89 | void uartSetBaudRate(uint32_t b) |
andreikovacs | 27:1eb29717bfd9 | 90 | { |
andreikovacs | 27:1eb29717bfd9 | 91 | uart.baud(b); |
andreikovacs | 27:1eb29717bfd9 | 92 | } |
andreikovacs | 27:1eb29717bfd9 | 93 | |
haircules | 29:be24c0c29f17 | 94 | /*ISR for sw2*/ |
cotigac | 18:b02fc0e53df8 | 95 | void sw2_press(void) |
cotigac | 18:b02fc0e53df8 | 96 | { |
cotigac | 18:b02fc0e53df8 | 97 | thread2->signal_set(0x1); |
haircules | 29:be24c0c29f17 | 98 | /*Toggle Blue LED*/ |
haircules | 29:be24c0c29f17 | 99 | led3 = !led3; |
haircules | 29:be24c0c29f17 | 100 | |
haircules | 29:be24c0c29f17 | 101 | } |
haircules | 29:be24c0c29f17 | 102 | |
haircules | 29:be24c0c29f17 | 103 | void timer_thread(void const *argument) |
haircules | 29:be24c0c29f17 | 104 | { |
haircules | 29:be24c0c29f17 | 105 | while (true) { |
haircules | 29:be24c0c29f17 | 106 | |
haircules | 29:be24c0c29f17 | 107 | Thread::wait(1000); |
haircules | 29:be24c0c29f17 | 108 | /*Kick heat on (turn on Red LED) if temp drops below |
haircules | 29:be24c0c29f17 | 109 | threshold and heat is not already on*/ |
haircules | 29:be24c0c29f17 | 110 | if((atoi(temp) <= 37) && (heat_state != 1)) |
haircules | 29:be24c0c29f17 | 111 | { |
haircules | 29:be24c0c29f17 | 112 | low_temp_flag = 1; |
haircules | 29:be24c0c29f17 | 113 | eventsThread->signal_set(0x1); |
haircules | 29:be24c0c29f17 | 114 | } |
haircules | 29:be24c0c29f17 | 115 | |
haircules | 29:be24c0c29f17 | 116 | /*Normal temp, turn off heat*/ |
haircules | 29:be24c0c29f17 | 117 | if(atoi(temp) > 37) |
haircules | 29:be24c0c29f17 | 118 | { |
haircules | 29:be24c0c29f17 | 119 | /*Turn off Red LED*/ |
haircules | 29:be24c0c29f17 | 120 | led2 = 1; |
haircules | 29:be24c0c29f17 | 121 | |
haircules | 29:be24c0c29f17 | 122 | /*Set heat_state to off*/ |
haircules | 29:be24c0c29f17 | 123 | heat_state = 0; |
haircules | 29:be24c0c29f17 | 124 | } |
haircules | 29:be24c0c29f17 | 125 | } |
cotigac | 18:b02fc0e53df8 | 126 | } |
sam_grove | 2:3e7685cfb2a7 | 127 | |
cotigac | 18:b02fc0e53df8 | 128 | void led_thread(void const *argument) |
cotigac | 18:b02fc0e53df8 | 129 | { |
cotigac | 18:b02fc0e53df8 | 130 | while (true) { |
haircules | 29:be24c0c29f17 | 131 | //led1 = !led1; |
andreikovacs | 27:1eb29717bfd9 | 132 | Thread::wait(200); |
sam_grove | 2:3e7685cfb2a7 | 133 | } |
sam_grove | 2:3e7685cfb2a7 | 134 | } |
sam_grove | 2:3e7685cfb2a7 | 135 | |
cotigac | 18:b02fc0e53df8 | 136 | void button_thread(void const *argument) |
sam_grove | 2:3e7685cfb2a7 | 137 | { |
cotigac | 18:b02fc0e53df8 | 138 | while (true) { |
cotigac | 18:b02fc0e53df8 | 139 | Thread::signal_wait(0x1); |
cotigac | 18:b02fc0e53df8 | 140 | button_pressed++; |
cotigac | 18:b02fc0e53df8 | 141 | } |
sam_grove | 2:3e7685cfb2a7 | 142 | } |
sam_grove | 2:3e7685cfb2a7 | 143 | |
FSL\B36402 |
23:6f13fea3cace | 144 | void events_thread(void const *argument) |
FSL\B36402 |
23:6f13fea3cace | 145 | { |
andreikovacs | 27:1eb29717bfd9 | 146 | uint8_t rcvd = 0, c = 0; |
FSL\B36402 |
23:6f13fea3cace | 147 | |
FSL\B36402 |
23:6f13fea3cace | 148 | while (true) |
FSL\B36402 |
23:6f13fea3cace | 149 | { |
haircules | 29:be24c0c29f17 | 150 | /*Wait for signal*/ |
FSL\B36402 |
23:6f13fea3cace | 151 | Thread::signal_wait(0x1); |
haircules | 29:be24c0c29f17 | 152 | |
haircules | 29:be24c0c29f17 | 153 | /*If packet has been sent, reenable recieving mode*/ |
FSL\B36402 |
23:6f13fea3cace | 154 | if(gMcps_Cnf_EVENT_c == (gTaskEventFlags & gMcps_Cnf_EVENT_c)) |
FSL\B36402 |
23:6f13fea3cace | 155 | { |
haircules | 29:be24c0c29f17 | 156 | /*Reenable RX requests*/ |
FSL\B36402 |
23:6f13fea3cace | 157 | MLMERXEnableRequest(gAppRxPacket, 0); |
FSL\B36402 |
23:6f13fea3cace | 158 | |
FSL\B36402 |
23:6f13fea3cace | 159 | } |
FSL\B36402 |
23:6f13fea3cace | 160 | |
haircules | 29:be24c0c29f17 | 161 | /*If a packet has been recieved, rcvd gets data*/ |
FSL\B36402 |
23:6f13fea3cace | 162 | if(gMcps_Ind_EVENT_c == (gTaskEventFlags & gMcps_Ind_EVENT_c)) |
FSL\B36402 |
23:6f13fea3cace | 163 | { |
haircules | 29:be24c0c29f17 | 164 | |
haircules | 29:be24c0c29f17 | 165 | for(int i = 0; i <= gAppRxPacket->u8DataLength; i++) |
haircules | 29:be24c0c29f17 | 166 | { |
haircules | 29:be24c0c29f17 | 167 | rcvd = gAppRxPacket->smacPdu.smacPdu[i]; |
haircules | 29:be24c0c29f17 | 168 | |
haircules | 29:be24c0c29f17 | 169 | /*Add received data to temp*/ |
haircules | 29:be24c0c29f17 | 170 | temp[i] = rcvd; |
haircules | 29:be24c0c29f17 | 171 | |
haircules | 29:be24c0c29f17 | 172 | } |
haircules | 29:be24c0c29f17 | 173 | |
haircules | 29:be24c0c29f17 | 174 | printf("Node Temp: %dF\n\r",atoi(temp)); |
haircules | 29:be24c0c29f17 | 175 | |
haircules | 29:be24c0c29f17 | 176 | /*Reenable RX requests*/ |
FSL\B36402 |
23:6f13fea3cace | 177 | MLMERXEnableRequest(gAppRxPacket, 0); |
FSL\B36402 |
23:6f13fea3cace | 178 | |
andreikovacs | 27:1eb29717bfd9 | 179 | |
FSL\B36402 |
23:6f13fea3cace | 180 | } |
FSL\B36402 |
23:6f13fea3cace | 181 | |
FSL\B36402 |
23:6f13fea3cace | 182 | if(gMlme_TimeoutInd_EVENT_c == (gTaskEventFlags & gMlme_TimeoutInd_EVENT_c)) |
FSL\B36402 |
23:6f13fea3cace | 183 | { |
andreikovacs | 27:1eb29717bfd9 | 184 | uart.printf("MlmeTimeoutInd: \r\n"); |
FSL\B36402 |
23:6f13fea3cace | 185 | } |
FSL\B36402 |
23:6f13fea3cace | 186 | |
FSL\B36402 |
23:6f13fea3cace | 187 | if(gMlme_EdCnf_EVENT_c == (gTaskEventFlags & gMlme_EdCnf_EVENT_c)) |
FSL\B36402 |
23:6f13fea3cace | 188 | { |
andreikovacs | 27:1eb29717bfd9 | 189 | uart.printf("EdCnf: \r\n"); |
FSL\B36402 |
23:6f13fea3cace | 190 | } |
FSL\B36402 |
23:6f13fea3cace | 191 | |
FSL\B36402 |
23:6f13fea3cace | 192 | if(gMlme_CcaCnf_EVENT_c == (gTaskEventFlags & gMlme_CcaCnf_EVENT_c)) |
FSL\B36402 |
23:6f13fea3cace | 193 | { |
andreikovacs | 27:1eb29717bfd9 | 194 | uart.printf("CcaCnf: \r\n"); |
FSL\B36402 |
23:6f13fea3cace | 195 | } |
FSL\B36402 |
23:6f13fea3cace | 196 | |
haircules | 29:be24c0c29f17 | 197 | /*If there is something on the buffer, load packet and send*/ |
FSL\B36402 |
23:6f13fea3cace | 198 | if(gWUSelf_EVENT_c == (gTaskEventFlags & gWUSelf_EVENT_c)) |
FSL\B36402 |
23:6f13fea3cace | 199 | { |
haircules | 29:be24c0c29f17 | 200 | |
haircules | 29:be24c0c29f17 | 201 | /*Set Data Length to number of items on uartBuf*/ |
haircules | 29:be24c0c29f17 | 202 | gAppTxPacket->u8DataLength = uartBuf.getCount(); |
haircules | 29:be24c0c29f17 | 203 | |
haircules | 29:be24c0c29f17 | 204 | /*Load TX packets until uartBuf is empty*/ |
haircules | 29:be24c0c29f17 | 205 | for(int i = 0; uartBuf.getCount() > 0; i++) |
andreikovacs | 27:1eb29717bfd9 | 206 | { |
haircules | 29:be24c0c29f17 | 207 | uartBuf.getFromBuffer(&c); |
haircules | 29:be24c0c29f17 | 208 | gAppTxPacket->smacPdu.smacPdu[i] = c; |
haircules | 29:be24c0c29f17 | 209 | } |
haircules | 29:be24c0c29f17 | 210 | /*Disable RX requests (block incoming packets)*/ |
andreikovacs | 27:1eb29717bfd9 | 211 | (void)MLMERXDisableRequest(); |
haircules | 29:be24c0c29f17 | 212 | /*Generate request to send data packet*/ |
andreikovacs | 27:1eb29717bfd9 | 213 | (void)MCPSDataRequest(gAppTxPacket); |
haircules | 29:be24c0c29f17 | 214 | |
haircules | 29:be24c0c29f17 | 215 | printf("Data Sent\n\r"); |
haircules | 29:be24c0c29f17 | 216 | |
haircules | 29:be24c0c29f17 | 217 | /*Toggle Red LED after transmission*/ |
haircules | 29:be24c0c29f17 | 218 | led2 = !led2; |
haircules | 29:be24c0c29f17 | 219 | |
haircules | 29:be24c0c29f17 | 220 | } |
haircules | 29:be24c0c29f17 | 221 | |
haircules | 29:be24c0c29f17 | 222 | if(low_temp_flag) |
haircules | 29:be24c0c29f17 | 223 | { |
haircules | 29:be24c0c29f17 | 224 | printf("WARNING: Node detected temp below safe threshold\n\r"); |
haircules | 29:be24c0c29f17 | 225 | printf("Suspect Node temp: %dF\n\r",atoi(temp)); |
haircules | 29:be24c0c29f17 | 226 | printf("Turning on heat..\n\r"); |
haircules | 29:be24c0c29f17 | 227 | |
haircules | 29:be24c0c29f17 | 228 | /*Simulate heat by turning on red LED*/ |
haircules | 29:be24c0c29f17 | 229 | led2 = 0; |
haircules | 29:be24c0c29f17 | 230 | |
haircules | 29:be24c0c29f17 | 231 | /*Lower low_temp_flag*/ |
haircules | 29:be24c0c29f17 | 232 | low_temp_flag = 0; |
haircules | 29:be24c0c29f17 | 233 | |
haircules | 29:be24c0c29f17 | 234 | /*Set head_state to on*/ |
haircules | 29:be24c0c29f17 | 235 | heat_state = 1; |
FSL\B36402 |
23:6f13fea3cace | 236 | } |
andreikovacs | 27:1eb29717bfd9 | 237 | |
FSL\B36402 |
23:6f13fea3cace | 238 | gTaskEventFlags = 0; |
FSL\B36402 |
23:6f13fea3cace | 239 | } |
FSL\B36402 |
23:6f13fea3cace | 240 | } |
FSL\B36402 |
23:6f13fea3cace | 241 | |
sam_grove | 2:3e7685cfb2a7 | 242 | int main() |
haircules | 29:be24c0c29f17 | 243 | { |
haircules | 29:be24c0c29f17 | 244 | led1 = 1;/*Turn off Green LED*/ |
haircules | 29:be24c0c29f17 | 245 | led2 = 1;/*Turn off Red LED*/ |
haircules | 29:be24c0c29f17 | 246 | led3 = 1;/*Turn off Blue LED*/ |
haircules | 29:be24c0c29f17 | 247 | |
andreikovacs | 26:56ca40dcfae1 | 248 | MEM_Init(); |
cotigac | 18:b02fc0e53df8 | 249 | Thread thread(led_thread); |
cotigac | 18:b02fc0e53df8 | 250 | thread2 = new Thread(button_thread); |
FSL\B36402 |
23:6f13fea3cace | 251 | eventsThread = new Thread(events_thread); |
haircules | 29:be24c0c29f17 | 252 | timerThread = new Thread(timer_thread); |
FSL\B36402 |
23:6f13fea3cace | 253 | Phy_Init(); |
cotigac | 19:71b793021c78 | 254 | InitSmac(); |
andreikovacs | 27:1eb29717bfd9 | 255 | |
andreikovacs | 27:1eb29717bfd9 | 256 | uartSetBaudRate(gDefaultBaudRate_UART_c); |
andreikovacs | 27:1eb29717bfd9 | 257 | |
FSL\B36402 |
23:6f13fea3cace | 258 | //Tell SMAC who to call when it needs to pass a message to the application thread. |
FSL\B36402 |
23:6f13fea3cace | 259 | Smac_RegisterSapHandlers((SMAC_APP_MCPS_SapHandler_t)smacToAppMcpsSap,(SMAC_APP_MLME_SapHandler_t)smacToAppMlmeSap,0); |
FSL\B36402 |
23:6f13fea3cace | 260 | |
FSL\B36402 |
23:6f13fea3cace | 261 | InitApp(); |
andreikovacs | 27:1eb29717bfd9 | 262 | |
andreikovacs | 27:1eb29717bfd9 | 263 | PrintMenu(cu8FreescaleLogo); |
FSL\B36402 |
23:6f13fea3cace | 264 | |
cotigac | 18:b02fc0e53df8 | 265 | button_pressed = 0; |
cotigac | 18:b02fc0e53df8 | 266 | sw2.fall(&sw2_press); |
andreikovacs | 27:1eb29717bfd9 | 267 | while (true) |
haircules | 29:be24c0c29f17 | 268 | { |
haircules | 29:be24c0c29f17 | 269 | /*Set signal for eventsThread if anything on uartBuf to be sent*/ |
andreikovacs | 27:1eb29717bfd9 | 270 | if ( uartBuf.getCount() ) |
andreikovacs | 27:1eb29717bfd9 | 271 | { |
andreikovacs | 27:1eb29717bfd9 | 272 | gTaskEventFlags |= gWUSelf_EVENT_c; |
andreikovacs | 27:1eb29717bfd9 | 273 | eventsThread->signal_set(0x1); |
haircules | 29:be24c0c29f17 | 274 | |
andreikovacs | 27:1eb29717bfd9 | 275 | } |
andreikovacs | 27:1eb29717bfd9 | 276 | Thread::yield(); |
sam_grove | 2:3e7685cfb2a7 | 277 | } |
sam_grove | 2:3e7685cfb2a7 | 278 | } |
cotigac | 19:71b793021c78 | 279 | |
FSL\B36402 |
23:6f13fea3cace | 280 | void InitApp() |
FSL\B36402 |
23:6f13fea3cace | 281 | { |
FSL\B36402 |
23:6f13fea3cace | 282 | gAppTxPacket = (txPacket_t*)gau8TxDataBuffer; //Map TX packet to buffer |
FSL\B36402 |
23:6f13fea3cace | 283 | gAppRxPacket = (rxPacket_t*)MEM_BufferAlloc(gMaxSmacSDULength_c + sizeof(rxPacket_t)); |
FSL\B36402 |
23:6f13fea3cace | 284 | |
FSL\B36402 |
23:6f13fea3cace | 285 | InitProject(); |
FSL\B36402 |
23:6f13fea3cace | 286 | |
FSL\B36402 |
23:6f13fea3cace | 287 | SMACFillHeader(&(gAppTxPacket->smacHeader), gDefaultAddress_c); |
FSL\B36402 |
23:6f13fea3cace | 288 | |
FSL\B36402 |
23:6f13fea3cace | 289 | (void)MLMEPAOutputAdjust(gDefaultOutputPower_c); |
FSL\B36402 |
23:6f13fea3cace | 290 | (void)MLMESetChannelRequest(gDefaultChannelNumber_c); |
FSL\B36402 |
23:6f13fea3cace | 291 | (void)MLMEConfigureTxContext(&txConfigContext); |
FSL\B36402 |
23:6f13fea3cace | 292 | //AppDelayTmr = TMR_AllocateTimer(); |
FSL\B36402 |
23:6f13fea3cace | 293 | gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c; |
FSL\B36402 |
23:6f13fea3cace | 294 | (void)MLMERXEnableRequest(gAppRxPacket, 0); |
FSL\B36402 |
23:6f13fea3cace | 295 | } |
FSL\B36402 |
23:6f13fea3cace | 296 | |
FSL\B36402 |
23:6f13fea3cace | 297 | /* (Management) Sap handler for managing timeout indication and ED confirm |
FSL\B36402 |
23:6f13fea3cace | 298 | This is running in INTERRUPT context, so need to send messages to one of the task */ |
cotigac | 19:71b793021c78 | 299 | smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance) |
cotigac | 19:71b793021c78 | 300 | { |
cotigac | 19:71b793021c78 | 301 | switch(pMsg->msgType) |
cotigac | 19:71b793021c78 | 302 | { |
FSL\B36402 |
23:6f13fea3cace | 303 | case gMlmeEdCnf_c: |
FSL\B36402 |
23:6f13fea3cace | 304 | gTaskEventFlags |= gMlme_EdCnf_EVENT_c; |
FSL\B36402 |
23:6f13fea3cace | 305 | break; |
FSL\B36402 |
23:6f13fea3cace | 306 | case gMlmeCcaCnf_c: |
FSL\B36402 |
23:6f13fea3cace | 307 | gTaskEventFlags |= gMlme_CcaCnf_EVENT_c; |
FSL\B36402 |
23:6f13fea3cace | 308 | break; |
FSL\B36402 |
23:6f13fea3cace | 309 | case gMlmeTimeoutInd_c: |
FSL\B36402 |
23:6f13fea3cace | 310 | gTaskEventFlags |= gMlme_TimeoutInd_EVENT_c; |
FSL\B36402 |
23:6f13fea3cace | 311 | break; |
FSL\B36402 |
23:6f13fea3cace | 312 | default: |
FSL\B36402 |
23:6f13fea3cace | 313 | break; |
cotigac | 19:71b793021c78 | 314 | } |
FSL\B36402 |
23:6f13fea3cace | 315 | eventsThread->signal_set(0x1); |
cotigac | 19:71b793021c78 | 316 | MEM_BufferFree(pMsg); |
cotigac | 19:71b793021c78 | 317 | return gErrorNoError_c; |
cotigac | 19:71b793021c78 | 318 | } |
cotigac | 19:71b793021c78 | 319 | |
FSL\B36402 |
23:6f13fea3cace | 320 | /* (Data) Sap handler for managing data confirm and data indication |
FSL\B36402 |
23:6f13fea3cace | 321 | This is running in INTERRUPT context, so need to send messages to one of the task */ |
cotigac | 19:71b793021c78 | 322 | smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance) |
FSL\B36402 |
23:6f13fea3cace | 323 | { |
FSL\B36402 |
23:6f13fea3cace | 324 | switch(pMsg->msgType) |
cotigac | 19:71b793021c78 | 325 | { |
FSL\B36402 |
23:6f13fea3cace | 326 | case gMcpsDataInd_c: |
FSL\B36402 |
23:6f13fea3cace | 327 | if(pMsg->msgData.dataInd.pRxPacket->rxStatus == rxSuccessStatus_c) |
FSL\B36402 |
23:6f13fea3cace | 328 | { |
FSL\B36402 |
23:6f13fea3cace | 329 | gTaskEventFlags |= gMcps_Ind_EVENT_c; |
FSL\B36402 |
23:6f13fea3cace | 330 | } |
FSL\B36402 |
23:6f13fea3cace | 331 | break; |
FSL\B36402 |
23:6f13fea3cace | 332 | |
FSL\B36402 |
23:6f13fea3cace | 333 | case gMcpsDataCnf_c: |
FSL\B36402 |
23:6f13fea3cace | 334 | #ifdef VERBOSE |
FSL\B36402 |
23:6f13fea3cace | 335 | if(pMsg->msgData.dataCnf.status == gErrorChannelBusy_c) |
FSL\B36402 |
23:6f13fea3cace | 336 | { |
FSL\B36402 |
23:6f13fea3cace | 337 | bCCAFailed = TRUE; |
FSL\B36402 |
23:6f13fea3cace | 338 | } |
FSL\B36402 |
23:6f13fea3cace | 339 | |
FSL\B36402 |
23:6f13fea3cace | 340 | if(pMsg->msgData.dataCnf.status == gErrorNoAck_c) |
FSL\B36402 |
23:6f13fea3cace | 341 | { |
FSL\B36402 |
23:6f13fea3cace | 342 | bACKFailed = TRUE; |
FSL\B36402 |
23:6f13fea3cace | 343 | } |
cotigac | 19:71b793021c78 | 344 | #endif |
FSL\B36402 |
23:6f13fea3cace | 345 | |
FSL\B36402 |
23:6f13fea3cace | 346 | gTaskEventFlags |= gMcps_Cnf_EVENT_c; |
FSL\B36402 |
23:6f13fea3cace | 347 | break; |
FSL\B36402 |
23:6f13fea3cace | 348 | |
FSL\B36402 |
23:6f13fea3cace | 349 | default: |
FSL\B36402 |
23:6f13fea3cace | 350 | break; |
FSL\B36402 |
23:6f13fea3cace | 351 | } |
FSL\B36402 |
23:6f13fea3cace | 352 | eventsThread->signal_set(0x1); |
FSL\B36402 |
23:6f13fea3cace | 353 | MEM_BufferFree(pMsg); |
FSL\B36402 |
23:6f13fea3cace | 354 | |
FSL\B36402 |
23:6f13fea3cace | 355 | return gErrorNoError_c; |
cotigac | 19:71b793021c78 | 356 | } |
cotigac | 19:71b793021c78 | 357 | |
cotigac | 19:71b793021c78 | 358 | void InitProject(void) |
cotigac | 19:71b793021c78 | 359 | { |
cotigac | 19:71b793021c78 | 360 | /*Global Data init*/ |
cotigac | 19:71b793021c78 | 361 | #ifdef VERBOSE |
cotigac | 19:71b793021c78 | 362 | bACKFailed = FALSE; |
cotigac | 19:71b793021c78 | 363 | bCCAFailed = FALSE; |
cotigac | 19:71b793021c78 | 364 | #endif |
FSL\B36402 |
23:6f13fea3cace | 365 | |
FSL\B36402 |
23:6f13fea3cace | 366 | gTaskEventFlags = 0; |
FSL\B36402 |
23:6f13fea3cace | 367 | |
cotigac | 19:71b793021c78 | 368 | txConfigContext.autoAck = FALSE; |
cotigac | 19:71b793021c78 | 369 | txConfigContext.ccaBeforeTx = FALSE; |
cotigac | 19:71b793021c78 | 370 | txConfigContext.retryCountAckFail = 0; |
cotigac | 19:71b793021c78 | 371 | txConfigContext.retryCountCCAFail = 0; |
FSL\B36402 |
23:6f13fea3cace | 372 | } |