📄 ledonenddevice.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 + -