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