亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? trickletimerimplp.nc

?? tinyos-2.x.rar
?? NC
字號(hào):
// $Id: TrickleTimerImplP.nc,v 1.6 2009/07/16 13:00:08 mmaroti Exp $
/*
 * "Copyright (c) 2006 Stanford University. 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, the following two paragraphs and the author appear in all
 * copies of this software.
 * 
 * IN NO EVENT SHALL STANFORD UNIVERSITY 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 STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 * 
 * STANFORD UNIVERSITY 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 STANFORD UNIVERSITY
 * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
 * ENHANCEMENTS, OR MODIFICATIONS."
 */

/*
 * Module that provides a service instance of trickle timers. For
 * details on the working of the parameters, please refer to Levis et
 * al., "A Self-Regulating Algorithm for Code Maintenance and
 * Propagation in Wireless Sensor Networks," NSDI 2004.
 *
 * @param l Lower bound of the time period in seconds.
 * @param h Upper bound of the time period in seconds.
 * @param k Redundancy constant.
 * @param count How many timers to provide.
 *
 * @author Philip Levis
 * @author Gilman Tolle
 * @date   Jan 7 2006
 */ 

#include <Timer.h>

generic module TrickleTimerImplP(uint16_t low,
				 uint16_t high,
				 uint8_t k,
				 uint8_t count,
				 uint8_t scale) {
  provides {
    interface Init;
    interface TrickleTimer[uint8_t id];
  }
  uses {
    interface Timer<TMilli>;
    interface BitVector as Pending;
    interface BitVector as Changed;
    interface Random;
    interface Leds;
  }
}
implementation {

  typedef struct {
    uint16_t period;
    uint32_t time;
    uint32_t remainder;
    uint8_t count;
  } trickle_t;

  trickle_t trickles[count];
  
  void adjustTimer();
  void generateTime(uint8_t id);
  
  command error_t Init.init() {
    int i;
    for (i = 0; i < count; i++) {
      trickles[i].period = high;
      trickles[i].count = 0;
      trickles[i].time = 0;
      trickles[i].remainder = 0;
    }
    atomic {
      call Pending.clearAll();
      call Changed.clearAll();
    }
    return SUCCESS;
  }

  /**
   * Start a trickle timer. Reset the counter to 0.
   */
  command error_t TrickleTimer.start[uint8_t id]() {
    if (trickles[id].time != 0) {
      return EBUSY;
    }
    trickles[id].time = 0;
    trickles[id].remainder = 0;
    trickles[id].count = 0;
    generateTime(id);
    atomic {
      call Changed.set(id);
    }
    adjustTimer();
    dbg("Trickle", "Starting trickle timer %hhu @ %s\n", id, sim_time_string());
    return SUCCESS;
  }

  /**
   * Stop the trickle timer. This call sets the timer period to H.
   */
  command void TrickleTimer.stop[uint8_t id]() {
    trickles[id].time = 0;
    trickles[id].period = high;
    adjustTimer();
    dbg("Trickle", "Stopping trickle timer %hhu @ %s\n", id, sim_time_string());
  }

  /**
   * Reset the timer period to L. If called while the timer is running,
   * then a new interval (of length L) begins immediately.
   */
  command void TrickleTimer.reset[uint8_t id]() {
    trickles[id].period = low;
    trickles[id].count = 0;
    if (trickles[id].time != 0) {
      dbg("Trickle", "Resetting running trickle timer %hhu @ %s\n", id, sim_time_string());
      atomic {
	call Changed.set(id);
      }
      trickles[id].time = 0;
      trickles[id].remainder = 0;
      generateTime(id);
      adjustTimer();
    } else {
      dbg("Trickle", "Resetting  trickle timer %hhu @ %s\n", id, sim_time_string());
    }
  }

  /**
   * Increment the counter C. When an interval ends, C is set to 0.
   */
  command void TrickleTimer.incrementCounter[uint8_t id]() {
    trickles[id].count++;
  }

  task void timerTask() {
    uint8_t i;
    for (i = 0; i < count; i++) {
      bool fire = FALSE;
      atomic {
	if (call Pending.get(i)) {
	  call Pending.clear(i);
	  fire = TRUE;
	}
      }
      if (fire) {
	dbg("Trickle", "Firing trickle timer %hhu @ %s\n", i, sim_time_string());
	signal TrickleTimer.fired[i]();
	post timerTask();
	return;
      }
    }
  }
  
  /**
   * The trickle timer has fired. Signaled if C &gt; K.
   */
  event void Timer.fired() {
    uint8_t i;
    uint32_t dt = call Timer.getdt();

    for (i = 0; i < count; i++) {
      uint32_t remaining = trickles[i].time;
      if (remaining != 0) {
	remaining -= dt;
	if (remaining == 0) {
	  if (trickles[i].count < k) {
	    atomic {
	      call Pending.set(i);
	    }
	    post timerTask();
	  }

	  generateTime(i);
	    
	  /* Note that this logic is not the exact trickle algorithm.
	   * Rather than C being reset at the beginning of an interval,
	   * it is being reset at a firing point. This means that the
	   * listening period, rather than of length tau/2, is in the
	   * range [tau/2, tau]. 
	   */
	  trickles[i].count = 0;
	}
	else {
	  trickles[i].time = remaining;
	}
      }
    }
    adjustTimer();
  }

  // This is where all of the work is done!
  void adjustTimer() {
    uint8_t i;
    uint32_t lowest = 0;
    bool set = FALSE;

    // How much time has elapsed on the current timer
    // since it was scheduled? This value is needed because
    // the time remaining of a running timer is its time
    // value minus time elapsed.
    uint32_t elapsed = (call Timer.getNow() - call Timer.gett0());
	
    for (i = 0; i < count; i++) {
      uint32_t timeRemaining = trickles[i].time;
      if (timeRemaining != 0) {
	atomic {
	  if (!call Changed.get(i)) {
	    call Changed.clear(i);
	    timeRemaining -= elapsed;
	  }
	}
	if (!set) {
	  lowest = timeRemaining;
	  set = TRUE;
	}
	else if (timeRemaining < lowest) {
	  lowest = timeRemaining;
	}
      }
    }
    if (set) {
      uint32_t timerVal = lowest;
      timerVal = timerVal;
      dbg("Trickle", "Starting time with time %u.\n", timerVal);
      call Timer.startOneShot(timerVal);
    }
    else {
      call Timer.stop();
    }
  }

  /* Generate a new firing time for a timer. if the timer was already
   * running (time != 0), then double the period.
   */
  void generateTime(uint8_t id) {
    uint32_t newTime;
    uint16_t rval;
    
    if (trickles[id].time != 0) {
      trickles[id].period *= 2;
      if (trickles[id].period > high) {
	trickles[id].period = high;
      }
    }
    
    trickles[id].time = trickles[id].remainder;
    
    newTime = trickles[id].period;
    newTime = newTime << (scale - 1);

    rval = call Random.rand16() % (trickles[id].period << (scale - 1));
    newTime += rval;
    
    trickles[id].remainder = (((uint32_t)trickles[id].period) << scale) - newTime;
    trickles[id].time += newTime;
    dbg("Trickle,TrickleTimes", "Generated time for %hhu with period %hu (%u) is %u (%i + %hu)\n", id, trickles[id].period, (uint32_t)trickles[id].period << scale, trickles[id].time, (trickles[id].period << (scale - 1)), rval);
  }

 default event void TrickleTimer.fired[uint8_t id]() {
   return;
 }
}

  

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产1区2区| 欧美精品xxxxbbbb| 在线免费观看日本一区| 欧美日韩你懂得| 日韩精品在线一区| 国产免费观看久久| 亚洲午夜电影在线观看| 国产一区在线不卡| 91社区在线播放| 欧美一区二区三区免费观看视频| 日韩美女在线视频| 亚洲欧美日韩国产成人精品影院 | 成人激情动漫在线观看| 在线欧美日韩国产| 精品国产伦一区二区三区观看方式| 中文字幕av资源一区| 亚洲香肠在线观看| 国产精品18久久久久久vr | 亚洲综合一二区| 九九**精品视频免费播放| 成人国产精品免费观看视频| 欧美日韩成人一区| 中文成人综合网| 免费欧美高清视频| 91国产福利在线| 久久久久久久av麻豆果冻| 一区二区免费看| 粉嫩高潮美女一区二区三区| 欧美精三区欧美精三区| 国产精品久久久久7777按摩 | 欧美视频一区二区三区| www国产亚洲精品久久麻豆| 亚洲老司机在线| 国产一区免费电影| 欧美日韩三级视频| 最近日韩中文字幕| 国产精品中文字幕日韩精品| 欧美日精品一区视频| 国产亚洲精品资源在线26u| 午夜久久久久久| 91视频精品在这里| 国产日韩欧美a| 天堂影院一区二区| 色婷婷久久久亚洲一区二区三区 | 国产真实乱偷精品视频免| 欧美无人高清视频在线观看| 国产精品午夜在线观看| 国产在线国偷精品免费看| 欧美视频一区在线| 亚洲免费观看高清完整版在线观看熊| 国产成人精品网址| 欧美成人精品1314www| 亚洲国产一区二区三区青草影视| a级精品国产片在线观看| 精品国产麻豆免费人成网站| 天堂资源在线中文精品| 日本精品一级二级| 亚洲乱码国产乱码精品精小说| 国产成人精品亚洲日本在线桃色| 精品国产乱码久久久久久久久| 无码av中文一区二区三区桃花岛| 91黄色免费观看| 自拍偷在线精品自拍偷无码专区 | 最新热久久免费视频| 国产成人免费9x9x人网站视频| 精品播放一区二区| 青青青伊人色综合久久| 欧美妇女性影城| 天堂久久一区二区三区| 欧美精品乱码久久久久久按摩| 亚洲国产视频直播| 欧美三级欧美一级| 亚洲第四色夜色| 欧美日韩1区2区| 视频一区在线播放| 制服丝袜亚洲色图| 麻豆精品在线看| 精品少妇一区二区三区视频免付费| 奇米四色…亚洲| 日韩免费视频一区| 国精产品一区一区三区mba视频| 日韩欧美国产成人一区二区| 美国毛片一区二区三区| 日韩欧美www| 国产一区二区三区黄视频| 久久久影视传媒| 不卡的av网站| 亚洲天堂成人网| 欧美视频日韩视频| 日韩电影在线免费| 久久综合色天天久久综合图片| 国产很黄免费观看久久| 国产精品久久久久久妇女6080| 色哟哟一区二区| 丝袜亚洲另类欧美综合| 日韩三级电影网址| 国产suv一区二区三区88区| 中文字幕佐山爱一区二区免费| 日本高清不卡aⅴ免费网站| 亚洲国产成人tv| 精品欧美乱码久久久久久| 国产精品影音先锋| 亚洲视频每日更新| 欧美精品电影在线播放| 国产一区二区三区| 亚洲天堂2014| 91麻豆精品国产无毒不卡在线观看| 开心九九激情九九欧美日韩精美视频电影| 久久综合视频网| 日本精品一级二级| 精一区二区三区| ●精品国产综合乱码久久久久| 欧美视频完全免费看| 国产在线不卡一区| 亚洲综合色自拍一区| 精品盗摄一区二区三区| 99久久综合国产精品| 偷拍一区二区三区| 久久久久高清精品| 一本色道**综合亚洲精品蜜桃冫| 免费美女久久99| 亚洲女厕所小便bbb| 欧美一二三四区在线| 99久久精品免费观看| 日本色综合中文字幕| 中文字幕亚洲不卡| 日韩午夜中文字幕| 日本韩国视频一区二区| 麻豆91精品视频| 亚洲男人天堂av网| 久久综合精品国产一区二区三区| 色婷婷av一区二区三区软件 | 欧美一区三区四区| www.亚洲人| 久久精品国产一区二区三| 中文字幕亚洲欧美在线不卡| 日韩精品一区二区三区视频播放 | 亚洲男人天堂一区| 久久久久国产精品麻豆| 欧美久久久一区| 一本久久综合亚洲鲁鲁五月天 | 久久久精品蜜桃| 欧美日韩一区小说| 成人午夜视频免费看| 秋霞午夜av一区二区三区| 亚洲天堂网中文字| 国产三级一区二区| 欧美一区二区成人6969| 色婷婷久久99综合精品jk白丝| 国产不卡视频一区| 蜜臀av在线播放一区二区三区| 亚洲制服欧美中文字幕中文字幕| 久久―日本道色综合久久| 欧美一区二区三区视频| 在线视频亚洲一区| www.亚洲国产| 国产寡妇亲子伦一区二区| 蜜乳av一区二区三区| 亚洲一级在线观看| 1000部国产精品成人观看| 国产日韩一级二级三级| 欧美mv日韩mv| 欧美一卡二卡在线| 欧美三级视频在线观看| 色婷婷综合中文久久一本| 99久久精品情趣| 波多野结衣亚洲| 粉嫩13p一区二区三区| 国产一区二区美女| 精品系列免费在线观看| 青青国产91久久久久久 | 日韩一区二区免费在线电影| 在线观看免费一区| 色综合中文字幕国产 | 亚洲精品一线二线三线| 91精品欧美一区二区三区综合在| 在线观看日韩电影| 日本韩国欧美一区二区三区| 色婷婷久久久综合中文字幕| 色婷婷激情久久| 欧美午夜免费电影| 欧美巨大另类极品videosbest | 日本视频中文字幕一区二区三区| 亚洲成人精品影院| 亚洲成人激情自拍| 五月婷婷久久综合| 午夜视频在线观看一区二区| 亚洲国产精品视频| 亚洲成人一区二区在线观看| 亚洲国产视频一区| 日韩—二三区免费观看av| 七七婷婷婷婷精品国产| 久久97超碰国产精品超碰| 久久成人av少妇免费| 国产专区综合网| 成人18精品视频| 色综合久久久久| 欧美日韩三级在线| 欧美va亚洲va香蕉在线| 久久亚洲精精品中文字幕早川悠里|