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 NXP

Committer:
FSL\B36402
Date:
Sat Apr 25 01:10:45 2015 -0500
Revision:
24:088286081619
Parent:
23:6f13fea3cace
Child:
25:f40bc034cd8b
minor updates, IAR working

Who changed what in which revision?

UserRevisionLine numberNew 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"
cotigac 19:71b793021c78 7
FSL\B36402 23:6f13fea3cace 8 #define gMcps_Cnf_EVENT_c (1<<1)
FSL\B36402 23:6f13fea3cace 9 #define gMcps_Ind_EVENT_c (1<<2)
FSL\B36402 23:6f13fea3cace 10 #define gMlme_EdCnf_EVENT_c (1<<3)
FSL\B36402 23:6f13fea3cace 11 #define gMlme_CcaCnf_EVENT_c (1<<4)
FSL\B36402 23:6f13fea3cace 12 #define gMlme_TimeoutInd_EVENT_c (1<<5)
FSL\B36402 23:6f13fea3cace 13 #define gWUSelf_EVENT_c (1<<6)
FSL\B36402 23:6f13fea3cace 14
cotigac 19:71b793021c78 15 #ifdef VERBOSE
cotigac 19:71b793021c78 16 static bool_t bCCAFailed;
cotigac 19:71b793021c78 17 static bool_t bACKFailed;
cotigac 19:71b793021c78 18 #endif
FSL\B36402 23:6f13fea3cace 19 uint32_t gTaskEventFlags;
cotigac 19:71b793021c78 20 static uint8_t gau8TxDataBuffer[gMaxSmacSDULength_c + sizeof(rxPacket_t)];
cotigac 19:71b793021c78 21 static txPacket_t *gAppTxPacket;
cotigac 19:71b793021c78 22 static rxPacket_t *gAppRxPacket;
cotigac 19:71b793021c78 23 static txContextConfig_t txConfigContext;
cotigac 19:71b793021c78 24
cotigac 19:71b793021c78 25 void InitProject(void);
FSL\B36402 23:6f13fea3cace 26 void InitApp(void);
FSL\B36402 23:6f13fea3cace 27
cotigac 19:71b793021c78 28 extern smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance);
cotigac 19:71b793021c78 29 extern smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance);
cotigac 19:71b793021c78 30
cotigac 18:b02fc0e53df8 31 DigitalOut led1(LED1);
cotigac 18:b02fc0e53df8 32 InterruptIn sw2(SW2);
cotigac 18:b02fc0e53df8 33 uint32_t button_pressed;
cotigac 18:b02fc0e53df8 34 Thread *thread2;
FSL\B36402 23:6f13fea3cace 35 Thread *eventsThread;
sam_grove 2:3e7685cfb2a7 36
cotigac 18:b02fc0e53df8 37 void sw2_press(void)
cotigac 18:b02fc0e53df8 38 {
cotigac 18:b02fc0e53df8 39 thread2->signal_set(0x1);
cotigac 18:b02fc0e53df8 40 }
sam_grove 2:3e7685cfb2a7 41
cotigac 18:b02fc0e53df8 42 void led_thread(void const *argument)
cotigac 18:b02fc0e53df8 43 {
cotigac 18:b02fc0e53df8 44 while (true) {
cotigac 18:b02fc0e53df8 45 led1 = !led1;
cotigac 18:b02fc0e53df8 46 Thread::wait(1000);
sam_grove 2:3e7685cfb2a7 47 }
sam_grove 2:3e7685cfb2a7 48 }
sam_grove 2:3e7685cfb2a7 49
cotigac 18:b02fc0e53df8 50 void button_thread(void const *argument)
sam_grove 2:3e7685cfb2a7 51 {
cotigac 18:b02fc0e53df8 52 while (true) {
cotigac 18:b02fc0e53df8 53 Thread::signal_wait(0x1);
cotigac 18:b02fc0e53df8 54 button_pressed++;
cotigac 18:b02fc0e53df8 55 }
sam_grove 2:3e7685cfb2a7 56 }
sam_grove 2:3e7685cfb2a7 57
FSL\B36402 23:6f13fea3cace 58 void events_thread(void const *argument)
FSL\B36402 23:6f13fea3cace 59 {
FSL\B36402 23:6f13fea3cace 60 uint8_t rcvd = 0;
FSL\B36402 23:6f13fea3cace 61
FSL\B36402 23:6f13fea3cace 62 while (true)
FSL\B36402 23:6f13fea3cace 63 {
FSL\B36402 23:6f13fea3cace 64 Thread::signal_wait(0x1);
FSL\B36402 23:6f13fea3cace 65
FSL\B36402 23:6f13fea3cace 66 if(gMcps_Cnf_EVENT_c == (gTaskEventFlags & gMcps_Cnf_EVENT_c))
FSL\B36402 23:6f13fea3cace 67 {
FSL\B36402 23:6f13fea3cace 68 //get back in RX
FSL\B36402 23:6f13fea3cace 69 MLMERXEnableRequest(gAppRxPacket, 0);
FSL\B36402 23:6f13fea3cace 70
FSL\B36402 23:6f13fea3cace 71 //printf("McpsDataCnf: Packet sent\r\n");
FSL\B36402 24:088286081619 72 //fflush(stdout);
FSL\B36402 23:6f13fea3cace 73 }
FSL\B36402 23:6f13fea3cace 74
FSL\B36402 23:6f13fea3cace 75 if(gMcps_Ind_EVENT_c == (gTaskEventFlags & gMcps_Ind_EVENT_c))
FSL\B36402 23:6f13fea3cace 76 {
FSL\B36402 23:6f13fea3cace 77 rcvd = gAppRxPacket->smacPdu.smacPdu[0];
FSL\B36402 23:6f13fea3cace 78
FSL\B36402 23:6f13fea3cace 79 //get back in RX
FSL\B36402 23:6f13fea3cace 80 //gAppRxPacket = (rxPacket_t*)MEM_BufferAlloc(gMaxSmacSDULength_c + sizeof(rxPacket_t));
FSL\B36402 23:6f13fea3cace 81 //gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c;
FSL\B36402 23:6f13fea3cace 82 MLMERXEnableRequest(gAppRxPacket, 0);
FSL\B36402 23:6f13fea3cace 83
FSL\B36402 23:6f13fea3cace 84 printf("McpsDataInd: Received %d\r\n", rcvd);
FSL\B36402 24:088286081619 85 fflush(stdout);
FSL\B36402 23:6f13fea3cace 86 }
FSL\B36402 23:6f13fea3cace 87
FSL\B36402 23:6f13fea3cace 88 if(gMlme_TimeoutInd_EVENT_c == (gTaskEventFlags & gMlme_TimeoutInd_EVENT_c))
FSL\B36402 23:6f13fea3cace 89 {
FSL\B36402 24:088286081619 90 printf("MlmeTimeoutInd: \r\n");
FSL\B36402 24:088286081619 91 fflush(stdout);
FSL\B36402 23:6f13fea3cace 92 }
FSL\B36402 23:6f13fea3cace 93
FSL\B36402 23:6f13fea3cace 94 if(gMlme_EdCnf_EVENT_c == (gTaskEventFlags & gMlme_EdCnf_EVENT_c))
FSL\B36402 23:6f13fea3cace 95 {
FSL\B36402 24:088286081619 96 printf("EdCnf: \r\n");
FSL\B36402 24:088286081619 97 fflush(stdout);
FSL\B36402 23:6f13fea3cace 98 }
FSL\B36402 23:6f13fea3cace 99
FSL\B36402 23:6f13fea3cace 100 if(gMlme_CcaCnf_EVENT_c == (gTaskEventFlags & gMlme_CcaCnf_EVENT_c))
FSL\B36402 23:6f13fea3cace 101 {
FSL\B36402 24:088286081619 102 printf("CcaCnf: \r\n");
FSL\B36402 24:088286081619 103 fflush(stdout);
FSL\B36402 23:6f13fea3cace 104 }
FSL\B36402 23:6f13fea3cace 105
FSL\B36402 23:6f13fea3cace 106 if(gWUSelf_EVENT_c == (gTaskEventFlags & gWUSelf_EVENT_c))
FSL\B36402 23:6f13fea3cace 107 {
FSL\B36402 23:6f13fea3cace 108
FSL\B36402 23:6f13fea3cace 109 }
FSL\B36402 23:6f13fea3cace 110
FSL\B36402 23:6f13fea3cace 111 gTaskEventFlags = 0;
FSL\B36402 23:6f13fea3cace 112 }
FSL\B36402 23:6f13fea3cace 113 }
FSL\B36402 23:6f13fea3cace 114
sam_grove 2:3e7685cfb2a7 115 int main()
sam_grove 2:3e7685cfb2a7 116 {
cotigac 18:b02fc0e53df8 117 Thread thread(led_thread);
cotigac 18:b02fc0e53df8 118 thread2 = new Thread(button_thread);
FSL\B36402 23:6f13fea3cace 119 eventsThread = new Thread(events_thread);
FSL\B36402 23:6f13fea3cace 120
FSL\B36402 23:6f13fea3cace 121 Phy_Init();
cotigac 19:71b793021c78 122 InitSmac();
cotigac 19:71b793021c78 123
FSL\B36402 23:6f13fea3cace 124 //Tell SMAC who to call when it needs to pass a message to the application thread.
FSL\B36402 23:6f13fea3cace 125 Smac_RegisterSapHandlers((SMAC_APP_MCPS_SapHandler_t)smacToAppMcpsSap,(SMAC_APP_MLME_SapHandler_t)smacToAppMlmeSap,0);
FSL\B36402 23:6f13fea3cace 126
FSL\B36402 23:6f13fea3cace 127 InitApp();
FSL\B36402 23:6f13fea3cace 128
cotigac 18:b02fc0e53df8 129 button_pressed = 0;
cotigac 18:b02fc0e53df8 130 sw2.fall(&sw2_press);
cotigac 18:b02fc0e53df8 131 while (true) {
cotigac 18:b02fc0e53df8 132 Thread::wait(5000);
FSL\B36402 24:088286081619 133
FSL\B36402 23:6f13fea3cace 134 gAppTxPacket->smacPdu.smacPdu[0] = (uint8_t)button_pressed;
FSL\B36402 23:6f13fea3cace 135 gAppTxPacket->u8DataLength = 1;
FSL\B36402 23:6f13fea3cace 136 (void)MLMERXDisableRequest();
FSL\B36402 23:6f13fea3cace 137 (void)MCPSDataRequest(gAppTxPacket);
FSL\B36402 24:088286081619 138
cotigac 18:b02fc0e53df8 139 printf("SW2 was pressed (last 5 seconds): %d \r\n", button_pressed);
cotigac 18:b02fc0e53df8 140 fflush(stdout);
cotigac 18:b02fc0e53df8 141 button_pressed = 0;
sam_grove 2:3e7685cfb2a7 142 }
sam_grove 2:3e7685cfb2a7 143 }
cotigac 19:71b793021c78 144
FSL\B36402 23:6f13fea3cace 145 void InitApp()
FSL\B36402 23:6f13fea3cace 146 {
FSL\B36402 23:6f13fea3cace 147 gAppTxPacket = (txPacket_t*)gau8TxDataBuffer; //Map TX packet to buffer
FSL\B36402 23:6f13fea3cace 148 gAppRxPacket = (rxPacket_t*)MEM_BufferAlloc(gMaxSmacSDULength_c + sizeof(rxPacket_t));
FSL\B36402 23:6f13fea3cace 149
FSL\B36402 23:6f13fea3cace 150 InitProject();
FSL\B36402 23:6f13fea3cace 151
FSL\B36402 23:6f13fea3cace 152 SMACFillHeader(&(gAppTxPacket->smacHeader), gDefaultAddress_c);
FSL\B36402 23:6f13fea3cace 153
FSL\B36402 23:6f13fea3cace 154 (void)MLMEPAOutputAdjust(gDefaultOutputPower_c);
FSL\B36402 23:6f13fea3cace 155 (void)MLMESetChannelRequest(gDefaultChannelNumber_c);
FSL\B36402 23:6f13fea3cace 156 (void)MLMEConfigureTxContext(&txConfigContext);
FSL\B36402 23:6f13fea3cace 157 //AppDelayTmr = TMR_AllocateTimer();
FSL\B36402 23:6f13fea3cace 158 gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c;
FSL\B36402 23:6f13fea3cace 159 (void)MLMERXEnableRequest(gAppRxPacket, 0);
FSL\B36402 23:6f13fea3cace 160 }
FSL\B36402 23:6f13fea3cace 161
FSL\B36402 23:6f13fea3cace 162 /* (Management) Sap handler for managing timeout indication and ED confirm
FSL\B36402 23:6f13fea3cace 163 This is running in INTERRUPT context, so need to send messages to one of the task */
cotigac 19:71b793021c78 164 smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance)
cotigac 19:71b793021c78 165 {
cotigac 19:71b793021c78 166 switch(pMsg->msgType)
cotigac 19:71b793021c78 167 {
FSL\B36402 23:6f13fea3cace 168 case gMlmeEdCnf_c:
FSL\B36402 23:6f13fea3cace 169 gTaskEventFlags |= gMlme_EdCnf_EVENT_c;
FSL\B36402 23:6f13fea3cace 170 break;
FSL\B36402 23:6f13fea3cace 171 case gMlmeCcaCnf_c:
FSL\B36402 23:6f13fea3cace 172 gTaskEventFlags |= gMlme_CcaCnf_EVENT_c;
FSL\B36402 23:6f13fea3cace 173 break;
FSL\B36402 23:6f13fea3cace 174 case gMlmeTimeoutInd_c:
FSL\B36402 23:6f13fea3cace 175 gTaskEventFlags |= gMlme_TimeoutInd_EVENT_c;
FSL\B36402 23:6f13fea3cace 176 break;
FSL\B36402 23:6f13fea3cace 177 default:
FSL\B36402 23:6f13fea3cace 178 break;
cotigac 19:71b793021c78 179 }
FSL\B36402 23:6f13fea3cace 180 eventsThread->signal_set(0x1);
cotigac 19:71b793021c78 181 MEM_BufferFree(pMsg);
cotigac 19:71b793021c78 182 return gErrorNoError_c;
cotigac 19:71b793021c78 183 }
cotigac 19:71b793021c78 184
FSL\B36402 23:6f13fea3cace 185 /* (Data) Sap handler for managing data confirm and data indication
FSL\B36402 23:6f13fea3cace 186 This is running in INTERRUPT context, so need to send messages to one of the task */
cotigac 19:71b793021c78 187 smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance)
FSL\B36402 23:6f13fea3cace 188 {
FSL\B36402 23:6f13fea3cace 189 switch(pMsg->msgType)
cotigac 19:71b793021c78 190 {
FSL\B36402 23:6f13fea3cace 191 case gMcpsDataInd_c:
FSL\B36402 23:6f13fea3cace 192 if(pMsg->msgData.dataInd.pRxPacket->rxStatus == rxSuccessStatus_c)
FSL\B36402 23:6f13fea3cace 193 {
FSL\B36402 23:6f13fea3cace 194 gTaskEventFlags |= gMcps_Ind_EVENT_c;
FSL\B36402 23:6f13fea3cace 195 }
FSL\B36402 23:6f13fea3cace 196 break;
FSL\B36402 23:6f13fea3cace 197
FSL\B36402 23:6f13fea3cace 198 case gMcpsDataCnf_c:
FSL\B36402 23:6f13fea3cace 199 #ifdef VERBOSE
FSL\B36402 23:6f13fea3cace 200 if(pMsg->msgData.dataCnf.status == gErrorChannelBusy_c)
FSL\B36402 23:6f13fea3cace 201 {
FSL\B36402 23:6f13fea3cace 202 bCCAFailed = TRUE;
FSL\B36402 23:6f13fea3cace 203 }
FSL\B36402 23:6f13fea3cace 204
FSL\B36402 23:6f13fea3cace 205 if(pMsg->msgData.dataCnf.status == gErrorNoAck_c)
FSL\B36402 23:6f13fea3cace 206 {
FSL\B36402 23:6f13fea3cace 207 bACKFailed = TRUE;
FSL\B36402 23:6f13fea3cace 208 }
cotigac 19:71b793021c78 209 #endif
FSL\B36402 23:6f13fea3cace 210
FSL\B36402 23:6f13fea3cace 211 gTaskEventFlags |= gMcps_Cnf_EVENT_c;
FSL\B36402 23:6f13fea3cace 212 break;
FSL\B36402 23:6f13fea3cace 213
FSL\B36402 23:6f13fea3cace 214 default:
FSL\B36402 23:6f13fea3cace 215 break;
FSL\B36402 23:6f13fea3cace 216 }
FSL\B36402 23:6f13fea3cace 217
FSL\B36402 23:6f13fea3cace 218 eventsThread->signal_set(0x1);
FSL\B36402 23:6f13fea3cace 219 MEM_BufferFree(pMsg);
FSL\B36402 23:6f13fea3cace 220
FSL\B36402 23:6f13fea3cace 221 return gErrorNoError_c;
cotigac 19:71b793021c78 222 }
cotigac 19:71b793021c78 223
cotigac 19:71b793021c78 224 void InitProject(void)
cotigac 19:71b793021c78 225 {
cotigac 19:71b793021c78 226 /*Global Data init*/
cotigac 19:71b793021c78 227 #ifdef VERBOSE
cotigac 19:71b793021c78 228 bACKFailed = FALSE;
cotigac 19:71b793021c78 229 bCCAFailed = FALSE;
cotigac 19:71b793021c78 230 #endif
FSL\B36402 23:6f13fea3cace 231
FSL\B36402 23:6f13fea3cace 232 gTaskEventFlags = 0;
FSL\B36402 23:6f13fea3cace 233
cotigac 19:71b793021c78 234 txConfigContext.autoAck = FALSE;
cotigac 19:71b793021c78 235 txConfigContext.ccaBeforeTx = FALSE;
cotigac 19:71b793021c78 236 txConfigContext.retryCountAckFail = 0;
cotigac 19:71b793021c78 237 txConfigContext.retryCountCCAFail = 0;
FSL\B36402 23:6f13fea3cace 238 }