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

📄 app.c

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 C
字号:
/*
****************************************************************************
*              宁波中科集成电路设计中心  版权所有 Copyright 2005
*						http:\\www.nbicc.com
*文件名:  route.c
*程序员:  黄亮	huangliang@nbicc.com
*主要内容  路由算法
*更新时间: 2005年11月17日
*如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
****************************************************************************
*/


#include "type.h"
#include "message.h"
#include "global.h"
#include "sensor.h"
#include "timer.h"
#include "os.h"
#include "uartDebug.h"
#include "app.h"
#include "led.h"
#include "mac.h"
#include "route.h"
#include "dataqueue.h"
static result_t ROUTEGetADCDataStart(void);
static void SendSensorData(uint16_t localsensordata);
static void routehandlepkt(uint8_t type, OSMACMsgPtr receivemsg) ;
static void routeReceiveSENSOR(OSMACMsgPtr receivemsg) ;
static void sendreceivesensor(void);  //转发传感数据
static bool CheckPassed(uint8_t src,uint16_t networkseq);
static void InRecord(uint8_t src,uint16_t networkseq);
enum sensortype {
  LIGHT = 1,
  TEMP = 2
};

/******************全局变量声明*************************************  */
uint16_t sensordatabuff[10];
uint8_t  sensordataflag;
OSMACMsg routesensor;
OSMACMsgPtr routesensormsgptr;
uint16_t sensorseq;   //应用层数据包号
uint16_t networkseq;  //网络层数据包号
uint8_t  recordflag;
uint8_t  LifeTime;//作为保存接收到的数据包的生存时间的相当于缓存的数据变量
SensorMsg forwardsensor;

OSMACMsg uartMsg;
//网络层的包冗余剔除



/******************************************************* 
          全局函数声明
 ******************************************  */
result_t Init(void) {
	////下面是配置节点的一些数据,需要在节点初始化之前定义,因为
	//有些数据是在初始化的时候直接赋值给相关的寄存器
    POWERLEVEL = 0X01; //射频的功率
    
    OS_LOCAL_ADDRESS =1; //本地节点的地址
    OS_BCAST_ADDR = 0xEE;  //广播地址

    ACK_ON = 1;  //使用ack机制,建议不要使用,1表示开启,0表示关闭
    ACKTIME = 4;  //ack等待时间=ACKTIME*32ms
    //选择4的理由是和发送成功时的一样的,尽量假设数据包成功,ACK不成功

	//////////
    LedInit();
	LedRedOff();
	LedGreenOff();
	LedYellowOff();
    
	SensorPhoOStdControlInit();
	TimerStdControlInit();
	// 初始化UART debugging
	uartDebug_init();
	MACInit();
    RoutInit();

    for(sensordataflag = 0 ; sensordataflag < LOCALDATABUFFSIZE ; sensordataflag ++){
	sensordatabuff[sensordataflag] = 0xFFFF;
	}
	for(recordflag = 0 ; sensordataflag < PASSED; sensordataflag ++){
	RecordPassed[recordflag].src = INVALID_NODE_ID;
	RecordPassed[recordflag].networkseq = 0;
	}
	sensordataflag = 0;
	recordflag = 0;
	sensorseq = 0;
	networkseq = 0;

	routesensormsgptr = &routesensor;
    
    return SUCCESS;
}

result_t Start(void) { 
    
	SensorPhoOStdControlStart();
	ROUTEGetADCDataStart();
	
	TimerTimerStart(0, TIMER_REPEAT, 4000); //定时路由任务
	
	return SUCCESS;
		
}

static result_t ROUTEGetADCDataStart(void) {
    
    TimerTimerStart(1, TIMER_REPEAT, 1200); //定时采集数据
	return SUCCESS;
}


result_t Timer0_0_Fired(void) {
	// 添加时间事件
	OSPostTask(routeTimerTask); //更新邻居表 选择父节点 发送广播包
    return SUCCESS;
}


result_t Timer0_1_Fired(void) {
    //采集光数据
    SensorExternalPhotoADCGetData();
	return SUCCESS;
}


result_t SensordataReady(uint16_t data) {
    //采集好数据以后,执行发送数据任务 
    if( data <= 0x0180){  
    sensordatabuff[sensordataflag] = data;
	sensordataflag = (sensordataflag + 1)%LOCALDATABUFFSIZE;
	}

	return SUCCESS;
}

result_t LocalDataIn(void){
    uint8_t i;
	i = (sensordataflag + 1)%LOCALDATABUFFSIZE;
	for( ; i != sensordataflag ; ){
		if(sensordatabuff[i] != 0xFFFF) {
		SendSensorData(sensordatabuff[i]); 
		sensordatabuff[i] = 0xFFFF;
		return 1;
		}
	i = (i + 1)%LOCALDATABUFFSIZE;
	}
	return 0;
}
/***********************************************************
                    以下为内部函数
 **********************************************************/

static void SendSensorData(uint16_t localsensordata) {
	//发送采集到的数据,暂为空
	SensorMsg *sensordata;
	SHopMsgPtr sHopMsg;
    uint8_t i;
    uint8_t length;

	if (OS_LOCAL_ADDRESS == 1) {
		return;
	}
   
		sHopMsg = (SHopMsgPtr )routesensormsgptr->data;
		sHopMsg->type = SENSOR;
		sHopMsg->seq = networkseq;
		sHopMsg->lifetime = 3;// 允许的循环路由的次数
		
		sensordata = (SensorMsg *) (sHopMsg->data);
	    sensordata->sensorseq = sensorseq;
		sensordata->reading = localsensordata;
		sensordata->type = LIGHT; //传感数据为光数据 
		sensordata->src = OS_LOCAL_ADDRESS;
		sensorseq++;//应用层数据包号自增
		for (i = 0; i < MAXPASS; i++) {
	    	sensordata->passnode[i] = 0;  		
		}

		sensordata->passnode[0] = OS_LOCAL_ADDRESS;
		
		length = SHOP_HEADER_LEN + sizeof(SensorMsg);

		InLocalMsgQueue(SENSOR,length, routesensormsgptr);			
}


result_t routeSendSENSORDone(OSMACMsgPtr msg) {
	networkseq++; //网络层数据包号自增
	RouteChangeV(msg->toAddr);
	return SUCCESS;
}

/***************************************************************
                  接收部分函数
  *******************************************************/
result_t ReceiveDone(OSMACMsgPtr packet) {  //与底层接口函数
    uint8_t type;
	SHopMsgPtr sHopMsg;
	sHopMsg = (SHopMsgPtr )packet->data;
    
 		type = sHopMsg->type;
		if( packet->group == 0x01) {
		routehandlepkt(type, packet);
		     }

    return 1; 
   
}

static void routehandlepkt(uint8_t type, OSMACMsgPtr receivemsg) {
		
    switch (type) {
    case BROADCAST: 
      routeReceiveBroadcast(receivemsg);
      break;

	case SENSOR:
      routeReceiveSENSOR(receivemsg);
	  break;
    }
}

static void routeReceiveSENSOR(OSMACMsgPtr receivemsg) {
	SHopMsgPtr sHopMsg;
	SensorMsg *sensordata;
    uint8_t i;
	uint8_t j;

	uartMsg = *receivemsg;

    if (receivemsg->fromAddr == OS_LOCAL_ADDRESS) {
		return ;
	}

	if (OS_LOCAL_ADDRESS != 1) {
		sHopMsg = (SHopMsgPtr )receivemsg->data;
		sensordata = (SensorMsg *) (sHopMsg->data);
		if((CheckPassed(receivemsg->fromAddr,sHopMsg->seq)) == 0){ //没有记录过
			if(((sHopMsg->lifetime)&0xF0) == 0){
			LifeTime = sHopMsg->lifetime;
			}else{
			LifeTime = ((sHopMsg->lifetime)&0x0F) - 1;
			}
					
			forwardsensor.sensorseq = sensordata->sensorseq;
			forwardsensor.reading = sensordata->reading;
			forwardsensor.type = sensordata->type;
			forwardsensor.src = sensordata->src;
			
			for (i = 0; i < MAXPASS; i++) {
				forwardsensor.passnode[i] = sensordata->passnode[i];
			}
			j = 0;
			for (i = 0; i < MAXPASS; i++) {
				if (sensordata->passnode[i] != 0) {
					j = j+1;
				} else {
					break;
				}
			}
			if( j < MAXPASS ){ //越界检查
			forwardsensor.passnode[j] = OS_LOCAL_ADDRESS;
			}
			InRecord(receivemsg->fromAddr,sHopMsg->seq);//登记
			OSPostTask(sendreceivesensor);	
		}
	} else {
		//如果是SINK节点,则写到后台
		LedRedToggle(); //红灯亮,表示基站接收到传感数据包
		uartDebug_txPacket(&uartMsg);
	}
}


static void sendreceivesensor(void) {
    SHopMsgPtr sHopMsg;
  	SensorMsg *sensordata;
    uint8_t length;

    sHopMsg = (SHopMsgPtr )routesensormsgptr->data;
	sHopMsg->type = SENSOR;
	sHopMsg->seq = networkseq;
	sHopMsg->lifetime = LifeTime;
    sensordata = (SensorMsg *) (sHopMsg->data);
	*sensordata = forwardsensor;

	length = SHOP_HEADER_LEN + sizeof(SensorMsg);
	InQueue(SENSOR,  length, routesensormsgptr);
}

static bool CheckPassed(uint8_t src,uint16_t networkseq){
    uint8_t i;
	for(i = 0 ; i < PASSED ; i++){
	if((RecordPassed[i].src == src)&&(RecordPassed[1].networkseq == networkseq)) return 1;
	}
	return 0;
}

static void InRecord(uint8_t src,uint16_t networkseq){
   RecordPassed[recordflag].src = src;
   RecordPassed[recordflag].networkseq = networkseq;
   recordflag = (recordflag + 1)%PASSED;

}

⌨️ 快捷键说明

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