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