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