?? command.c
字號:
#include ".\zigbee\unet.h"
ADDR_LIST stAddrList;
MAC_COMMAND stCommandCFM;
extern unsigned char UART_FLAG;
extern unsigned char ucRecvBuff[250];
unsigned char UART_LEN;
extern short NetPlay_NetStatus;
//UINT8 LEDSTATUS = 0;
void SendData();
void unet_proc(void);
void WaitMS (UINT16 count)
{
short i;
while(count--)
for(i=0; i<5000; i++);
}
/****************************************************************************************
* Function:
* Description: 請求網絡的地址列表功能函數
* Syntax:
* Modify:
* parameter: 無
* Returns: 成功標志
* Notes:
* Date: 2007-04-06
* Author: ZijianWang
****************************************************************************************/
unsigned char ReqAddrList()
{
unsigned char i;
MCP_ADDR_LIST_REQ *AddrPtr;
if( UnetSys.Coordinator == 0 )
{
AddrPtr = (MCP_ADDR_LIST_REQ *) RF_TX_BUFF;
AddrPtr->Header.val = 0x8823;
AddrPtr->SrcPID = UnetSys.JoinPID;
AddrPtr->SrcAddr = UnetSys.NwkAddr;
AddrPtr->DstAddr = 0;//UnetSys.JoinParent;
AddrPtr->DstPID = UnetSys.JoinPID;
AddrPtr->Seqnum = UnetSys.MacDSN;
UnetSys.MacDSN++;
AddrPtr->COMM_ID = MT_ADDR_LIST_REQ;
//AssoPtr->Cap.val = 0xca;
AddrPtr->Cap = 0x0;
i = 0;
while(!UzTx(RF_TX_BUFF, sizeof(MCP_ADDR_LIST_REQ))) // Send request
{
WaitMS(20);
i++;
if(i>4)
{
return RETRY_EXCEED;
}
}
usProtocolRecv = 500;
while(( usProtocolRecv != 0 )&& ( stCommandCFM.cfm.RecvAddrListRsp != 1 ))
{// Wait RecvAddrList response
unet_proc();
}
if( usProtocolRecv == 0 )
{
return RETRY_EXCEED;
}
stCommandCFM.cfm.RecvAddrListRsp = 0;
}
for(i=0;i<stAddrList.ucAddrCont;i++) //判斷自己是否還在協調器的地址列表中
{
if(stAddrList.MACAddress[i] == UnetSys.NwkAddr )
{
break;
}
}
if( i == stAddrList.ucAddrCont ) //相等說明沒有在列表中找到自己的地址
{
UnetSys.Flag.JoinNetwork = 0;
INIT_UNET();
while(JOIN_UNET(UNET_PAN_ID, UNET_CHANNEL) != SUCCESS);
}
return SUCCESS;
}
/****************************************************************************************
* Function:
* Description: 發送地址列表命令幀
* Syntax:
* Modify:
* parameter: 無
* Returns: 成功標志
* Notes:
* Date: 2007-04-06
* Author: ZijianWang
****************************************************************************************/
unsigned char SendAddrList( unsigned short DstAddr )
{
unsigned char Length;
MCP_ADDR_LIST_RSP *AddrPtr;
AddrPtr = (MCP_ADDR_LIST_RSP *) RF_TX_BUFF;
AddrPtr->Header.val = 0x8823;
AddrPtr->SrcPID = UnetSys.JoinPID;
AddrPtr->SrcAddr = UnetSys.NwkAddr;
AddrPtr->DstAddr = DstAddr;//UnetSys.JoinParent;
AddrPtr->DstPID = UnetSys.JoinPID;
AddrPtr->Seqnum = UnetSys.MacDSN;
UnetSys.MacDSN++;
AddrPtr->COMM_ID = MT_ADDR_LIST_RSP;
//AssoPtr->Cap.val = 0xca;
AddrPtr->AddrCont = stAddrList.ucAddrCont;
Length = stAddrList.ucAddrCont * 2;
MSG_Copy(&RF_TX_BUFF[sizeof(MCP_ADDR_LIST_REQ)], (UINT8 *) stAddrList.MACAddress, Length);
if(UzTx(RF_TX_BUFF, sizeof(MCP_ADDR_LIST_REQ) + Length)) return SUCCESS;
return FAILURE;
}
/****************************************************************************************
* Function:
* Description: 處理接收到的地址列表響應命令幀
* Syntax:
* Modify:
* parameter: 無
* Returns: 成功標志
* Notes:
* Date: 2007-04-06
* Author: ZijianWang
****************************************************************************************/
void unet_rx_addrlist_rsp( MCP_ADDR_LIST_RSP * pAddrList )
{
unsigned char Length;
Length = pAddrList->AddrCont * 2;
stAddrList.ucAddrCont = pAddrList->AddrCont;
MSG_Copy( (UINT8 *)stAddrList.MACAddress, ((UINT8 *)pAddrList)+sizeof(MCP_ADDR_LIST_RSP), Length);
stCommandCFM.cfm.RecvAddrListRsp = 1;
}
/****************************************************************************************
* Function:
* Description: 釋放一個節點的數據庫,重新連接鏈表
* Syntax:
* Modify:
* parameter: unsigned char number 要釋放的數據庫在鏈表中的位置
* Returns: 無
* Notes:
* Date: 2007-04-06
* Author: ZijianWang
****************************************************************************************/
void FreeChild( unsigned char number )
{
unsigned char i;
CHILD_LIST *currently, **pre;
currently = UnetSys.ChildHead;
pre = &(UnetSys.ChildHead);
for(i=0;i<number;i++)
{
pre = &(currently->Next);
currently = currently->Next;
}
*pre = currently->Next;
if(currently->Cap & 0x02)
{
UnetSys.JoinRouterCnt--;
}
else
{
UnetSys.JoinEndevCnt--;
}
MM_Free( currently );
}
/****************************************************************************************
* Function:
* Description: 檢查網絡中各節點是否還在
* Syntax:
* Modify:
* parameter: 無
* Returns: 無
* Notes:
* Date: 2007-04-06
* Author: ZijianWang
****************************************************************************************/
void ChackChild()
{
unsigned char i,j,k,State;
if( UnetSys.Coordinator == 0 ) //非協調器主動請求地址列表
{
if( usAddrREQTimer == 0 )
{
usAddrREQTimer = 5000;
State = FAILURE;
for(i=0;i<3;i++)
{
if( State != SUCCESS )
{
State = ReqAddrList();
}
else
{
break;
}
}
if(i == 3) //說明3次都沒有收到協調的應答,則斷開連接
{
INIT_UNET();
// while(JOIN_UNET(UNET_PAN_ID, UNET_CHANNEL) != SUCCESS);
NetPlay_NetStatus = 0;
}
}
}
else //協調器判斷是否有節點超時,該刪除
{
for(i=0;i<stAddrList.ucAddrCont;i++)
{
if( stAddrList.LifeTime[i] == 0 )
{
for(k=i+1;k<stAddrList.ucAddrCont;k++)
{
stAddrList.LifeTime[k-1] = stAddrList.LifeTime[k];
stAddrList.MACAddress[k-1] = stAddrList.MACAddress[k];
for(j=0;j<8;j++)
{
stAddrList.Name[k-1][j] = stAddrList.Name[k][j];
}
}
stAddrList.ucAddrCont --;
FreeChild(i);//釋放空間
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -