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

📄 am_route.c

📁 无线传感器网络操作系统源代码
💻 C
字号:
/*									tab:4 * * * "Copyright (c) 2000 and The Regents of the University  * of California.  All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. *  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Authors:		Jason Hill, Joe Polastre * Last Modified:       1/28/02 * *///this components explores routing topology and then broadcasts back// light readings.#include "tos.h"#include "dbg.h"#include "AM_ROUTE.h"extern short TOS_LOCAL_ADDRESS;#define NO_PARENT ((short) 0xffff)#define TOS_FRAME_TYPE ROUTE_obj_frameTOS_FRAME_BEGIN(ROUTE_obj_frame) {  short route;  char set;  short shortdata[15];  TOS_Msg route_buf;	  TOS_Msg data_buf;	  TOS_MsgPtr msg;  char data_send_pending;  char route_send_pending;  int prev;  char count;}TOS_FRAME_END(ROUTE_obj_frame);char TOS_COMMAND(AM_ROUTE_INIT)(){  //initialize sub components   TOS_CALL_COMMAND(ROUTE_SUB_INIT)();   VAR(msg) = &VAR(route_buf);   VAR(data_send_pending) = 0;   VAR(route_send_pending) = 0;#ifdef BASE_STATION   {     int i;     short* blah = (short*)(VAR(data_buf).data);	       //set beacon rate for route updates to be sent: 255/128 of a second     TOS_COMMAND(ROUTE_SUB_CLOCK_INIT)(255,0x06);     dbg(DBG_BOOT, ("AM_ROUTE: base route set to 0x7e\n"));          //route to base station is over UART.     VAR(route) = TOS_UART_ADDR;     VAR(set) = 1;     for (i = 0; i < 15; i++) {       blah[i] = 0;     }     blah[0] = 1;     blah[1] = TOS_LOCAL_ADDRESS;   }#else   //set rate for sampling: 255/256 of a second   TOS_COMMAND(ROUTE_SUB_CLOCK_INIT)(255,0x05);   VAR(set) = 0;   VAR(route) = NO_PARENT;   VAR(count) = 0;#endif   return 1;}char TOS_COMMAND(AM_ROUTE_START)(){  return 1;}TOS_MsgPtr TOS_MSG_EVENT(ROUTE_UPDATE)(TOS_MsgPtr msg){  short* data = (short*)(msg->data);  TOS_MsgPtr tmp;    //Array Bound Check.    if (data[0] < (int)(DATA_LENGTH/2)){        // if we see our parent again before the next period,    // reset the period clock    if((VAR(set) > 0) && (VAR(route) == data[(int)data[0]]))    {      //toggle LED2 when update is received.      TOS_CALL_COMMAND(ROUTE_LED2_TOGGLE)();      VAR(set) = 8;      data[0] ++;      //create a update packet to be sent out.      data[(int)data[0]] = TOS_LOCAL_ADDRESS;            dbg(DBG_USR1, ("route set to %x\n", VAR(route)));      //send the update packet.      if (VAR(route_send_pending) == 0){	TOS_CALL_COMMAND(ROUTE_SUB_SEND_MSG)(TOS_BCAST_ADDR,AM_MSG(ROUTE_UPDATE),msg);	VAR(route_send_pending) = 1;	tmp = VAR(msg);	VAR(msg) = msg;	return tmp;      } else{	return msg;      }    }    //if route hasn't already been set this period...    if(VAR(set) == 0){      //toggle LED2 when update is received.      TOS_CALL_COMMAND(ROUTE_LED2_TOGGLE)();      //record route      VAR(route) = data[(int)data[0]];      VAR(set) = 8;      data[0] ++;      //create a update packet to be sent out.      data[(int)data[0]] = TOS_LOCAL_ADDRESS;            dbg(DBG_USR1, ("route set to %x\n", VAR(route)));      //send the update packet.      if (VAR(route_send_pending) == 0){	TOS_CALL_COMMAND(ROUTE_SUB_SEND_MSG)(TOS_BCAST_ADDR,AM_MSG(ROUTE_UPDATE),msg);	VAR(route_send_pending) = 1;	tmp = VAR(msg);	VAR(msg) = msg;	return tmp;      } else{	return msg;      }    }    else {      dbg(DBG_USR1, ("route already set to %x\n", VAR(route)));    }  }  return msg;}TOS_MsgPtr TOS_MSG_EVENT(DATA_MSG)(TOS_MsgPtr msg){  short* data = (short*)(msg->data);  TOS_MsgPtr tmp;    //this handler forwards packets traveling to the base.  //if a route is known, forward the packet towards the base.  if ((VAR(route) != NO_PARENT) && (VAR(set) > 0)){    //update the packet.    data[5] = data[4];    data[4] = data[3];    data[3] = data[2];    data[2] = data[1];    data[1] = TOS_LOCAL_ADDRESS;    dbg(DBG_USR1, ("routing to home %x\n", VAR(route)));    //send the packet.    if (VAR(route_send_pending) == 0){      if (TOS_CALL_COMMAND(ROUTE_SUB_SEND_MSG)(VAR(route),AM_MSG(DATA_MSG),msg))      {        TOS_CALL_COMMAND(ROUTE_LED3_TOGGLE)();	VAR(route_send_pending) = 1;      }      tmp = VAR(msg);      VAR(msg) = msg;      return tmp;    }  }  return msg;}void TOS_EVENT(AM_ROUTE_SUB_CLOCK)(){  dbg(DBG_USR2, ("route clock\n"));#ifdef BASE_STATION  //if is the base, then it should send out the route update.  if (VAR(data_send_pending) == 0){    if (TOS_CALL_COMMAND(ROUTE_SUB_SEND_MSG)(TOS_BCAST_ADDR,AM_MSG(ROUTE_UPDATE),&VAR(data_buf)))    {      TOS_CALL_COMMAND(ROUTE_LED1_TOGGLE)();      VAR(data_send_pending) = 1;    }  }#else  //decrement the set var to know when a period is over.  if(VAR(set) > 0) VAR(set) --;#endif}char TOS_EVENT(ROUTE_SUB_DATA_READY)(int data){  return 1;}char TOS_COMMAND(ROUTE_SEND_PACKET)(char* data){  if (VAR(set) > 0) {    int i;    char* chrtmp = (char*)(VAR(data_buf).data);    short* tmp = (short*)(VAR(data_buf).data);    for (i=0; i < 5; i++)      {	tmp[i] = 0;      }    for (i=10; i < DATA_LENGTH; i++)      {	chrtmp[i] = data[i-10];      }    tmp[0] = TOS_LOCAL_ADDRESS;    tmp[1] = TOS_LOCAL_ADDRESS;    VAR(msg) = &(VAR(data_buf));    if (VAR(data_send_pending) == 0) {      if (TOS_CALL_COMMAND(ROUTE_SUB_SEND_MSG)(VAR(route),AM_MSG(DATA_MSG),VAR(msg)))      {        VAR(data_send_pending) = 1;      }      return 1;    }    else {      return 0;    }  }  return 0;}char TOS_EVENT(ROUTE_SEND_DONE)(TOS_MsgPtr data){  VAR(route_send_pending) = 0;   VAR(data_send_pending) = 0;  return 1;}

⌨️ 快捷键说明

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