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

Revision:
23:6f13fea3cace
Parent:
19:71b793021c78
Child:
24:088286081619
--- a/main.cpp	Fri Apr 24 22:54:35 2015 +0000
+++ b/main.cpp	Sat Apr 25 00:50:20 2015 -0500
@@ -1,25 +1,30 @@
 #include "mbed.h"
 #include "rtos.h"
 
+#include "Phy.h"
 #include "SMAC_Interface.h"
 #include "SMAC_Config.h"
 
-static uint8_t mAppSer;
-static uint8_t timePassed;       
+#define gMcps_Cnf_EVENT_c        (1<<1)
+#define gMcps_Ind_EVENT_c        (1<<2)
+#define gMlme_EdCnf_EVENT_c      (1<<3)
+#define gMlme_CcaCnf_EVENT_c     (1<<4)
+#define gMlme_TimeoutInd_EVENT_c (1<<5)
+#define gWUSelf_EVENT_c          (1<<6)
+
 #ifdef VERBOSE
 static bool_t bCCAFailed;
 static bool_t bACKFailed;
 #endif
-static bool_t bTxDone;
-static bool_t bRxDone;
-static bool_t evKeyPressed;
-static bool_t bTxInProgress;
+uint32_t gTaskEventFlags;
 static uint8_t gau8TxDataBuffer[gMaxSmacSDULength_c  + sizeof(rxPacket_t)];  
 static txPacket_t *gAppTxPacket;
 static rxPacket_t *gAppRxPacket;
 static txContextConfig_t txConfigContext;
 
 void InitProject(void);
+void InitApp(void);
+
 extern smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance);
 extern smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance);
 
@@ -27,6 +32,7 @@
 InterruptIn sw2(SW2);
 uint32_t button_pressed;
 Thread *thread2;
+Thread *eventsThread;
 
 void sw2_press(void)
 {
@@ -49,91 +55,163 @@
     }
 }
 
+void events_thread(void const *argument)
+{
+    uint8_t rcvd = 0;
+
+    while (true)
+    {
+        Thread::signal_wait(0x1);
+
+        if(gMcps_Cnf_EVENT_c == (gTaskEventFlags & gMcps_Cnf_EVENT_c))
+        {
+            //get back in RX
+            MLMERXEnableRequest(gAppRxPacket, 0); 
+
+            //printf("McpsDataCnf: Packet sent\r\n");
+        }
+        
+        if(gMcps_Ind_EVENT_c == (gTaskEventFlags & gMcps_Ind_EVENT_c))
+        {
+            rcvd = gAppRxPacket->smacPdu.smacPdu[0];
+
+            //get back in RX
+            //gAppRxPacket = (rxPacket_t*)MEM_BufferAlloc(gMaxSmacSDULength_c + sizeof(rxPacket_t));
+            //gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c;
+            MLMERXEnableRequest(gAppRxPacket, 0);
+
+            printf("McpsDataInd: Received %d\r\n", rcvd);
+        }
+        
+        if(gMlme_TimeoutInd_EVENT_c == (gTaskEventFlags & gMlme_TimeoutInd_EVENT_c))
+        {
+            //printf("MlmeTimeoutInd: \r\n");
+        }
+        
+        if(gMlme_EdCnf_EVENT_c == (gTaskEventFlags & gMlme_EdCnf_EVENT_c))
+        {
+            //printf("EdCnf: \r\n");
+        }
+        
+        if(gMlme_CcaCnf_EVENT_c == (gTaskEventFlags & gMlme_CcaCnf_EVENT_c))
+        {
+            //printf("CcaCnf: \r\n");
+        }
+        
+        if(gWUSelf_EVENT_c == (gTaskEventFlags & gWUSelf_EVENT_c))
+        {
+
+        }
+
+        gTaskEventFlags = 0;
+    }
+}
+
 int main()
 {
     Thread thread(led_thread);
     thread2 = new Thread(button_thread);
-    
+    eventsThread = new Thread(events_thread);
+
+    Phy_Init();
     InitSmac();
-    Smac_RegisterSapHandlers((SMAC_APP_MCPS_SapHandler_t)smacToAppMcpsSap,(SMAC_APP_MLME_SapHandler_t)smacToAppMlmeSap,0);
-    
-    InitProject();
-
-    gAppTxPacket = (txPacket_t*)gau8TxDataBuffer;   //Map TX packet to buffer
-    gAppRxPacket = (rxPacket_t*)MEM_BufferAlloc(gMaxSmacSDULength_c + sizeof(rxPacket_t));
 
-    SMACFillHeader(&(gAppTxPacket->smacHeader), gDefaultAddress_c);                  
-    
-    (void)MLMEPAOutputAdjust(gDefaultOutputPower_c);
-    (void)MLMESetChannelRequest(gDefaultChannelNumber_c);         
-    (void)MLMEConfigureTxContext(&txConfigContext);
-    gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c;
-    (void)MLMERXEnableRequest(gAppRxPacket, 0);
-    
+    //Tell SMAC who to call when it needs to pass a message to the application thread.
+    Smac_RegisterSapHandlers((SMAC_APP_MCPS_SapHandler_t)smacToAppMcpsSap,(SMAC_APP_MLME_SapHandler_t)smacToAppMlmeSap,0);
+
+    InitApp();
+	    
     button_pressed = 0;
     sw2.fall(&sw2_press);
     while (true) {
         Thread::wait(5000);
+        gAppTxPacket->smacPdu.smacPdu[0] = (uint8_t)button_pressed;
+        gAppTxPacket->u8DataLength = 1;
+        (void)MLMERXDisableRequest();
+        (void)MCPSDataRequest(gAppTxPacket);
         printf("SW2 was pressed (last 5 seconds): %d \r\n", button_pressed);
         fflush(stdout);
         button_pressed = 0;
     }
 }
 
+void InitApp()
+{
+  gAppTxPacket = (txPacket_t*)gau8TxDataBuffer;   //Map TX packet to buffer
+  gAppRxPacket = (rxPacket_t*)MEM_BufferAlloc(gMaxSmacSDULength_c + sizeof(rxPacket_t));
+  
+  InitProject();
+  
+  SMACFillHeader(&(gAppTxPacket->smacHeader), gDefaultAddress_c);                  
+  
+  (void)MLMEPAOutputAdjust(gDefaultOutputPower_c);
+  (void)MLMESetChannelRequest(gDefaultChannelNumber_c);         
+  (void)MLMEConfigureTxContext(&txConfigContext);
+  //AppDelayTmr = TMR_AllocateTimer();
+  gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c;
+  (void)MLMERXEnableRequest(gAppRxPacket, 0);
+}
+
+/* (Management) Sap handler for managing timeout indication and ED confirm
+   This is running in INTERRUPT context, so need to send messages to one of the task */
 smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance)
 {
   switch(pMsg->msgType)
   {
-  case gMlmeEdCnf_c:
-    printf("EdCnf: \r\n");
-     //(void)OSA_EventSet(&gTaskEvent, gMlme_EdCnf_EVENT_c);
-    break;
-  case gMlmeCcaCnf_c:
-    printf("CcaCnf: \r\n");
-    //(void)OSA_EventSet(&gTaskEvent, gMlme_CcaCnf_EVENT_c);
-    break;
-  case gMlmeTimeoutInd_c:
-    printf("MlmeTimeoutInd: \r\n");
-     //(void)OSA_EventSet(&gTaskEvent, gMlme_TimeoutInd_EVENT_c);
-     break;
-  default:
-    break;
+    case gMlmeEdCnf_c:
+        gTaskEventFlags |= gMlme_EdCnf_EVENT_c;
+        break;
+    case gMlmeCcaCnf_c:
+        gTaskEventFlags |= gMlme_CcaCnf_EVENT_c;
+        break;
+    case gMlmeTimeoutInd_c:
+        gTaskEventFlags |= gMlme_TimeoutInd_EVENT_c;
+        break;
+    default:
+        break;
   }
+  eventsThread->signal_set(0x1);
   MEM_BufferFree(pMsg);
   return gErrorNoError_c;
 }
 
-//(Data) Sap handler for managing data confirm and data indication
+/* (Data) Sap handler for managing data confirm and data indication
+   This is running in INTERRUPT context, so need to send messages to one of the task */
 smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance)
-{
-  switch(pMsg->msgType)
-  {
-  case gMcpsDataInd_c:
-    if(pMsg->msgData.dataInd.pRxPacket->rxStatus == rxSuccessStatus_c)
-    {
-      printf("McpsDataInd: \r\n");
-      //(void)OSA_EventSet(&gTaskEvent, gMcps_Ind_EVENT_c);
-    }
-    break;
-  case gMcpsDataCnf_c:
-#ifdef VERBOSE
-    if(pMsg->msgData.dataCnf.status == gErrorChannelBusy_c)
+{  
+    switch(pMsg->msgType)
     {
-      bCCAFailed = TRUE;
-    }
-    if(pMsg->msgData.dataCnf.status == gErrorNoAck_c)
-    {
-      bACKFailed = TRUE;
-    }
+        case gMcpsDataInd_c:
+            if(pMsg->msgData.dataInd.pRxPacket->rxStatus == rxSuccessStatus_c)
+            {       
+                gTaskEventFlags |= gMcps_Ind_EVENT_c;
+            }
+            break;
+
+        case gMcpsDataCnf_c:
+#ifdef VERBOSE
+            if(pMsg->msgData.dataCnf.status == gErrorChannelBusy_c)
+            {
+                bCCAFailed = TRUE;
+            }
+
+            if(pMsg->msgData.dataCnf.status == gErrorNoAck_c)
+            {
+                bACKFailed = TRUE;
+            }
 #endif
-    printf("McpsDataCnf: \r\n");
-    //(void)OSA_EventSet(&gTaskEvent, gMcps_Cnf_EVENT_c);
-    break;
-  default:
-    break;
-  }
-  MEM_BufferFree(pMsg);
-  return gErrorNoError_c;
+
+            gTaskEventFlags |= gMcps_Cnf_EVENT_c;
+            break;
+
+        default:
+            break;
+    }
+    
+    eventsThread->signal_set(0x1);
+    MEM_BufferFree(pMsg);
+
+    return gErrorNoError_c;
 }
 
 void InitProject(void)
@@ -143,11 +221,11 @@
   bACKFailed                        = FALSE;
   bCCAFailed                        = FALSE;
 #endif
-  bTxInProgress                     = FALSE;
-  bTxDone                           = FALSE;
-  evKeyPressed                      = FALSE;
+
+  gTaskEventFlags = 0;
+
   txConfigContext.autoAck           = FALSE;
   txConfigContext.ccaBeforeTx       = FALSE;
   txConfigContext.retryCountAckFail = 0;
   txConfigContext.retryCountCCAFail = 0;
-}
\ No newline at end of file
+}