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

📄 wxldemo.c

📁 本程序是基于Zigbee协议的无线温度传感器网络系统
💻 C
字号:
/*
  V0.1 Initial Release   10/July/2006
  *2006/08/16 WXL 2.0
*/


#include "wx_lrwpan.h"


UINT16 ping_cnt;//接收一个16位数据用
UINT32 my_timer;//用于超时计数
LADDR_UNION dstADDR;//发送的数据数组

typedef enum _PP_STATE_ENUM {
	PP_STATE_IDLE,
	PP_STATE_SEND,
	PP_STATE_WAIT_FOR_TX
}PP_STATE_ENUM;

PP_STATE_ENUM ppState; //RFD三状态定义
BYTE payload[2];//发送的数据数组


#ifdef LRWPAN_RFD

void SendData(void )
{
        static INT16U count = 0;//计数变量,用以廷时
        UINT16 temperature;//温度值
	apsFSM();////应用层处理函数

	switch (ppState) {

			case  PP_STATE_IDLE://空闲状态
				if(++count == 1000)//每一千次发送一次数据
                                {
                                        ppState = PP_STATE_SEND;
                                        count = 0;
                                }
				break;

			case PP_STATE_SEND://发送数据状态
                                {

                                        payload[0] = ScanKey();//读按键值

                                        temperature = ReadTc77();//读温度值
                                        temperature >>= 7;//转换成每度
                                        payload[1] = temperature;//载入传送数组

					ppState = PP_STATE_WAIT_FOR_TX;
					aplSendMSG (APS_DSTMODE_SHORT,//以网络地址发送
						&dstADDR,
						2,
						0,
						1,
						&payload[0],//数据
						2,  //数据长度
						apsGenTSN(),
						FALSE);  //不需要应用层应答
					ppState = PP_STATE_WAIT_FOR_TX;
                                }
				break;

			case PP_STATE_WAIT_FOR_TX://等待发送数据完成
				if (apsBusy()) break; //如果没有完成则继续发送
				if (aplGetStatus() == LRWPAN_STATUS_SUCCESS)
                                {
					ppState = PP_STATE_IDLE;//发送成功切换到空闲状态
				}
                                else
                                {
					ppState = PP_STATE_SEND;//发送不成功,重新发送
				}
				break;
	}
}

#endif





void main (void){

	my_timer = 0;
	halInit();
	evbInit();//CC2430初始化
#ifdef LRWPAN_COORDINATOR
        Bk1KeyInit();//初始化按键
        InitLcd();//初始化液晶
        TurnOnDisp();//开机画面显示
        ClearScreen();//清屏
#else

        InitSensorIO();//初始化I/O口
        SensorPowerOn();//打开传感器电源
#endif

	aplInit();  //初始化协议栈
	conPrintConfig();
	ENABLE_GLOBAL_INTERRUPT();  //使能中断


	EVB_LED1_OFF();
	EVB_LED2_OFF();

#ifdef LRWPAN_COORDINATOR

	aplFormNetwork();//格式化一个新的网络
	while(apsBusy()) {apsFSM();}//等待格式化网络完成
	conPrintROMString("Network formed, waiting for RX\n");
        Print6(7,3,"Network formed!",1);
	EVB_LED1_ON();
#else
	do {
		aplJoinNetwork();//加入网络
		while(apsBusy()) {apsFSM();}  //等待加入网络完成
		if (aplGetStatus() == LRWPAN_STATUS_SUCCESS) {//如果加入网络成功
			EVB_LED1_ON();

			conPrintROMString("Network Join succeeded!\n");
			conPrintROMString("My ShortAddress is: ");
			conPrintUINT16(aplGetMyShortAddress());//串口输出网络地址
			conPCRLF();
			conPrintROMString("Parent LADDR: ")
			conPrintLADDR(aplGetParentLongAddress());//串口输出物理地址
			conPrintROMString(", Parent SADDR: ");
			conPrintUINT16(aplGetParentShortAddress());
			conPCRLF();
			break;
		}else {//加入网络失败
			conPrintROMString("Network Join FAILED! Waiting, then trying again\n");
			my_timer= halGetMACTimer();
			//wait for 2 seconds
			while ((halMACTimerNowDelta(my_timer))< MSECS_TO_MACTICKS(2*1000));
		}
	} while(1);

#endif

#ifdef LRWPAN_COORDINATOR//网络协调器

	aplSetMacMaxFrameRetries(0);

	while (1) {
		apsFSM();//应用层处理函数
	}
#endif

#ifdef LRWPAN_RFD//RFD节点

	dstADDR.saddr = 0; //RFD发送数据的目的地址为网络协调器
	ppState = PP_STATE_SEND;
        aplSetMacMaxFrameRetries(0);
        while (1) {
		SendData();//发送按键值和温度值函数
	}

#endif




#ifdef LRWPAN_ROUTER//路由节点
	DEBUG_PRINTNEIGHBORS(DBG_INFO);
	conPrintROMString("Router, doing its thing.!\n");
	while(1) {
		apsFSM();//应用层处理函数
	}
#endif


}

//########## Callbacks ##########

//callback for anytime the Zero Endpoint RX handles a command
//user can use the APS functions to access the arguments
//and take additional action is desired.
//the callback occurs after the ZEP has already taken
//its action.
LRWPAN_STATUS_ENUM  usrZepRxCallback(void){

#ifdef LRWPAN_COORDINATOR
	if (aplGetRxCluster() == ZEP_END_DEVICE_ANNOUNCE) {
		//a new end device has announced itself, print out the
		//the neightbor table and address map
		dbgPrintNeighborTable();
	}
#endif
 return LRWPAN_STATUS_SUCCESS;
}

//callback from APS when packet is received
//user must do something with data as it is freed
//within the stack upon return.
LRWPAN_STATUS_ENUM  usrRxPacketCallback(void) {

	BYTE len, *ptr;
#ifdef LRWPAN_COORDINATOR
        INT8U Temperature, KeyValue;
        JOYSTICK_DIRECTION x;
#endif

	conPrintROMString("User Data Packet Received: \n");
	conPrintROMString("SrcSADDR: ");
	conPrintUINT16(aplGetRxSrcSADDR());//串口输出发送数据的节点地址
	conPrintROMString(", DstEp: ");
	conPrintUINT8(aplGetRxDstEp());
	conPrintROMString(", Cluster: ");
	conPrintUINT8(aplGetRxCluster());
	conPrintROMString(", MsgLen: ");
	len = aplGetRxMsgLen();//串口输出数据长度
	conPrintUINT8(len);
	conPrintROMString(",RSSI: ");
	conPrintUINT8(aplGetRxRSSI());//串口输出RSSI值
	conPCRLF();
	conPrintROMString("PingCnt: ");
	ptr = aplGetRxMsgData();
	ping_cnt = *ptr;
	ptr++;
	ping_cnt += ((UINT16)*ptr)<<8;
	conPrintUINT16(ping_cnt);//串口输出接收到的数据
	conPCRLF();
	
#ifdef LRWPAN_COORDINATOR
	x = Bk1ScanKey();//扫描按键
	KeyValue = ping_cnt;//读出按键值
	Temperature = ping_cnt>>8;//读出温度值
	switch(aplGetRxSrcSADDR())
	{
		case 0x1699://如果是加入网络的第一个节点
			if(KeyValue == 0x24)//
			{
				Print6(2,3,"1#:Help me!",1);//显示需要帮助
			}
			Print6(3,3,"1#Temperature:",1);
			Printn(3,87,Temperature,0,2);//显示温度值
			if(x == OK)   //按OK键清除信息
			{
				Print6(2,3,"            ",1);//清除求助信息
			}
			break;
		case 0x169A://如果是加入网络的第二个节点
			if(KeyValue == 0x24)
			{
				Print6(4,3,"2#:Help me!",1);//显示需要帮助
			}
			Print6(5,3,"2#Temperature:",1);
			Printn(5,87,Temperature,0,2);//显示温度值
			if(x == CANCEL)//按CANCEL键清除信息
			{
				Print6(4,3,"            ",1);//清除求助信息
			}
			break;
	}
#endif
	return LRWPAN_STATUS_SUCCESS;
}


#ifdef LRWPAN_FFD
//Callback to user level to see if OK for this node
//to join - implement Access Control Lists here based
//upon IEEE address if desired
BOOL usrJoinVerifyCallback(LADDR *ptr, BYTE capinfo){\

#if 0      //set this to '1' if you want to test through a router
//only accept routers.
//only let routers join us if we are coord
#ifdef LRWPAN_COORDINATOR
if (LRWPAN_GET_CAPINFO_DEVTYPE(capinfo)) {
	//this is a router, let it join
	conPrintROMString("Accepting router\n");
	return TRUE;
}else {
	conPrintROMString("Rejecting non-router\n");
	return FALSE;
}
#else
return TRUE;
#endif

#else

return TRUE;

#endif

}

BOOL usrJoinNotifyCallback(LADDR *ptr){

	//allow anybody to join

	conPrintROMString("Node joined: ");
	conPrintLADDR(ptr);
        ClearScreen();
#ifdef LRWPAN_COORDINATOR
        Print8(0,29,"--COORD-- ",1);
        Print6(6,3,"Node joined: ",1);
        LcdPrintLADDR(ptr,6,81);
#endif
	conPCRLF();
	DEBUG_PRINTNEIGHBORS(DBG_INFO);
	return TRUE;
}
#endif

//called when the slow timer interrupt occurs
#ifdef LRWPAN_ENABLE_SLOW_TIMER
void usrSlowTimerInt(void ) {}
#endif


//general interrupt callback , when this is called depends on the HAL layer.
void usrIntCallback(void){}

⌨️ 快捷键说明

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