📄 wxldemo.c
字号:
/*
V0.1 Initial Release 10/July/2006
*2006/08/16 WXL 2.0
*/
#include "config.h"
#include "wx_lrwpan.h"
UINT16 ping_cnt;//接收一个16位数据用
UINT32 my_timer;//用于超时计数
LADDR_UNION dstADDR;//发送的数据数组
INT8U num;
int Beattime;
int RatePerd;
int f=0;
int x;
/*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 ==5)//每一千次发送一次数据
{
ppState = PP_STATE_SEND;
// count = 0;
}
break;
case PP_STATE_SEND://发送数据状态
{
payload[1]=payload[0];
payload[0] = ScanKey();//读按键值
//temperature = ReadTc77();//读温度值
//temperature >>= 7;//转换成每度
//payload[1] = temperature;//载入传送数组
if(payload[0]!=payload[1])
{
halPutch(payload[0]);
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 Int0Interrupt(void) interrupt 0 //外中断0中断服务程序
{
Beattime=RatePerd;
RatePerd=0;
f=1;
}
void Time0Interrupt(void) interrupt 1 //定时器0中断服务程序
{
TH0=0x1c;
TL0=0x18;
RatePerd++;
}
void InitSystem(void) //系统变量初始化
{
RatePerd=0;
Beattime=0;
ET0=1;
IT0=1;
EX0=1;
TMOD=0x01;
TH0=0x1c;
TL0=0x18;
TF0=0;
TR0=1;
EA=1;
}
/****************************
T1初始化
****************************/
void InitT1(void)
{
T1CCTL0 = 0X44;
//T1CCTL0 (0xE5)
//T1 ch0 中断使能
//比较模式
T1CC0H = 0x1f;
T1CC0L = 0xbd;
//0x1fbd = 8125(D)
T1CTL |= 0X02;
//start count
//在这里没有分频。
//使用比较模式 MODE = 10(B)
/*P0DIR=0; //0号端口方向
P0SEL=0X03;//0号端口功能中断使能
//P0DIR=0;
P0INP=0;//0号端口输入模式
P2INP&=0Xdf;//
PICTL=0X09;//端口中断控制*/
IEN1 |= 0X22;
IEN0 |= 0X80;
//开T1中断
//TCON=0x0D;
}
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
IRCON &= ~0x02;//清中断标示
RatePerd++;
if(RatePerd == 100)
{
RatePerd = 0;
//timetemp = 1; //second ++
// led1 = ~led1; // for test
P1_1=~P1_1;
}
}
#pragma vector=P0INT_VECTOR
__interrupt void INT0_Server(void)
{
//Beattime=RatePerd;
//RatePerd=0;
//f=1;
P1_0=~P1_0;
P0IFG=0;//0号端口响应外中断
P0IF=0;
}
void InitClock(void)
{
CLKCON = 0X28;
//TICKSPD = 101 定时器计数时钟源
//CLKSPD = 000 和波特率有关
//两个时钟源选用晶振
while(!(SLEEP&0X40));
//等晶振稳定
}
void main (void){
InitClock();
InitT1();
P0DIR=0; //0号端口方向
P0SEL=0X03;//0号端口功能中断使能
//P0DIR=0;
P0INP=0;//0号端口输入模式
P2INP&=0Xdf;//
PICTL=0X09;//端口中断控制
// InitUART0();
// InitIO();
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");
// x=100/Beattime;
//printf("x");
//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();//发送按键值和温度值函数
apsFSM();
if(++num ==5)//每五次发送一次数据
{
// payload[1]=payload[0];
// payload[0] = ScanKey();//读按键值
if(f==1)
{
payload[0]=100/Beattime;
aplSendMSG (APS_DSTMODE_SHORT,//以网络地址发送
&dstADDR,
2,
0,
1,
&payload[0],//数据
2, //数据长度
apsGenTSN(),
FALSE); //不需要应用层应答
f=0;
}
// num=0;
}
}
#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 += ((UINT8)*ptr)<<8;
conPrintUINT8(ping_cnt);//串口输出接收到的数据
conPCRLF();
#ifdef LRWPAN_COORDINATOR
//x = Bk1ScanKey();//扫描按键
//KeyValue = ping_cnt;//读出按键值
//Temperature = ping_cnt>>8;//读出温度值
switch(aplGetRxSrcSADDR())
{
case 0x1699://如果是加入网络的第一个节点
switch((INT8U)*aplGetRxMsgData())
{
case 0x25:
EVB_LED2_ON();
break;
case 0x22:
EVB_LED2_OFF();
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 + -