⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ledonenddevice.c

📁 zbee potocol 無線通訊測試.平台:microchip 18f452 與 cc2420 zbee 晶片.含coord端與rfd端
💻 C
字号:
#include "LedOnEndDevice.h"
#include "zAPS.h"
#include "Console.h"

static ROM char * const LED_Send_Msg = "LED message sending...\r\n";
static ROM char * const LED_OK_Msg = "LED ok.\r\n";
static ROM char * const LED_TimeOut_Msg = "LED timeout.\r\n";

typedef enum _LED_STATE
{
    LED_IDLE = 0,
    LED_WAIT
} LED_STATE;

static LED_STATE sendState;
static LED_STATE receiveState;

static EP_HANDLE hLED_S;
static EP_HANDLE hLED_D;

//BYTE dataMSG;
static receiveBuf[20];
static sendBuf[20];
static sendCount;
BYTE sendMSG;

static TICK lastTick;

// Once we request data from coordinator, we must receive response within this time.
//#define MAX_UPDATE_WAIT (TICK_SECOND*1/20)
#define MAX_UPDATE_WAIT (TICK_SECOND*1)

void LEDInit(void)
{
    hLED_S = APSOpenEP(EP_LED_S,
                       PICDEMZ_LED_CLUSTER_ID,
                       0,
                       FALSE);
                       
    hLED_D = APSOpenEP(EP_LED_D,
                       PICDEMZ_LED_CLUSTER_ID,
                       0,
                       FALSE);
                       
    sendMSG = FALSE;
    sendState = LED_IDLE;
    receiveState = LED_IDLE; 
}

BOOL LED_SendTask(void)
{
    //WORD_VAL attribID;
    //BYTE transID;
    //BYTE transTag;

    if (ConsoleIsGetReady())
    {
        // Get the key value.
        //dataMSG = ConsoleGet();
        sendCount = ConsoleGetString(sendBuf, sizeof(sendBuf)-1);
        //ConsolePut(dataMSG);
        sendMSG = TRUE;
    }
    
    switch(sendState)
    {
        case LED_IDLE:  
            
             APSSetEP(hLED_D);
            
             if ( APSIsPutReady() && sendMSG )
             {
                   sendMSG = FALSE;

                          
                   //ConsolePutROMString(LED_Send_Msg); 

                   //APSBeginMSG(sizeof(dataMSG));
                   if(sendCount <= 0)
        			return TRUE;
        		
        	   APSBeginMSG(sendCount);
                   // Now load the entire command structure
                   //APSPutArray((BYTE*)&dataMSG, sizeof(dataMSG));
		   APSPutArray(sendBuf, sendCount);
		   
                   // Send it.
                   APSSend();
                          
                   sendState = LED_WAIT;
                   
                   return TRUE;
             }

        break;

        case LED_WAIT:
             if ( APSIsConfirmed() )
             {
                   APSRemoveFrame();
                   sendState = LED_IDLE;
                   //ConsolePutROMString(LED_OK_Msg); 
                   return TRUE;
             }
             else if ( APSIsTimedOut() )
             {
                   APSRemoveFrame();
                   sendState = LED_IDLE;
                   //ConsolePutROMString(LED_TimeOut_Msg);
                   return TRUE;
             }
        break;
    }
    
    
    // Task is complete.
    return FALSE;	
}	

BOOL LED_ReceiveTask(void)
{
    WORD_VAL attribID;
    BYTE transID;
    BYTE dataLen;


    APSSetEP(hLED_S);

    if ( APSIsGetReady() )
    {
    	     // In MSG service, first two bytes are the transid, and length of payload to follow.
             transID = APSGet();
             dataLen = APSGet();
             //dataMSG = APSGet();
             //ConsolePut(dataMSG);
             if(dataLen > 19)
                     dataLen = 19;
             APSGetArray(receiveBuf, dataLen);
             ConsolePutString(receiveBuf);
                          
             // After processing, you must discard current data packet.
             APSDiscardRx();
             receiveState = LED_IDLE;
             return TRUE;       
    }   
    
    switch(receiveState)
    {
        case LED_IDLE:  
             // Request for lamp update.
             if ( APSIsPutReady() )
             {
                     MACPoll();
                     receiveState = LED_WAIT;
                     lastTick = TickGet();
                     return TRUE;
             }
           
        break;
        case LED_WAIT:
             // We must receive update within this time or else forget about it.
             // You may want to retry before giving up.
             if ( TickGetDiff(TickGet(), lastTick) >= MAX_UPDATE_WAIT ||
        	 MACIsPollDone() )
             {
                     receiveState = LED_IDLE;
                     return TRUE;
             }
        break;
    }
    
    
    // Task is complete.
    return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -