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

main.cpp

Committer:
cotigac
Date:
2015-04-04
Revision:
19:71b793021c78
Parent:
18:b02fc0e53df8
Child:
23:6f13fea3cace

File content as of revision 19:71b793021c78:

#include "mbed.h"
#include "rtos.h"

#include "SMAC_Interface.h"
#include "SMAC_Config.h"

static uint8_t mAppSer;
static uint8_t timePassed;       
#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;
static uint8_t gau8TxDataBuffer[gMaxSmacSDULength_c  + sizeof(rxPacket_t)];  
static txPacket_t *gAppTxPacket;
static rxPacket_t *gAppRxPacket;
static txContextConfig_t txConfigContext;

void InitProject(void);
extern smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance);
extern smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance);

DigitalOut led1(LED1);
InterruptIn sw2(SW2);
uint32_t button_pressed;
Thread *thread2;

void sw2_press(void)
{
    thread2->signal_set(0x1);
}

void led_thread(void const *argument)
{
    while (true) {
        led1 = !led1;
        Thread::wait(1000);
    }
}

void button_thread(void const *argument)
{
    while (true) {
        Thread::signal_wait(0x1);
        button_pressed++;
    }
}

int main()
{
    Thread thread(led_thread);
    thread2 = new Thread(button_thread);
    
    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);
    
    button_pressed = 0;
    sw2.fall(&sw2_press);
    while (true) {
        Thread::wait(5000);
        printf("SW2 was pressed (last 5 seconds): %d \r\n", button_pressed);
        fflush(stdout);
        button_pressed = 0;
    }
}

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;
  }
  MEM_BufferFree(pMsg);
  return gErrorNoError_c;
}

//(Data) Sap handler for managing data confirm and data indication
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)
    {
      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;
}

void InitProject(void)
{   
  /*Global Data init*/
#ifdef VERBOSE
  bACKFailed                        = FALSE;
  bCCAFailed                        = FALSE;
#endif
  bTxInProgress                     = FALSE;
  bTxDone                           = FALSE;
  evKeyPressed                      = FALSE;
  txConfigContext.autoAck           = FALSE;
  txConfigContext.ccaBeforeTx       = FALSE;
  txConfigContext.retryCountAckFail = 0;
  txConfigContext.retryCountCCAFail = 0;
}