📄 diptricklemillip.nc
字号:
// $Id: DipTrickleMilliP.nc,v 1.1 2008/01/03 21:30:35 kaisenl 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>#include <Dip.h>module DipTrickleMilliP { provides { interface Init; interface DipTrickleTimer as TrickleTimer; } uses { interface Timer<TMilli> as PeriodicIntervalTimer; interface Timer<TMilli> as SingleEventTimer; interface Random; interface Leds; }}implementation { uint32_t period; command error_t Init.init() { period = DIP_TAU_HIGH; return SUCCESS; } /** * Start a trickle timer. Reset the counter to 0. */ command error_t TrickleTimer.start() { call PeriodicIntervalTimer.startOneShot(period); dbg("DipTrickleMilliP", "Starting trickle timer @ %s\n", sim_time_string()); return SUCCESS; } /** * Stop the trickle timer. This call sets the timer period to H. */ command void TrickleTimer.stop() { call PeriodicIntervalTimer.stop(); dbg("DipTrickleMilliP", "Stopping trickle timer @ %s\n", 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() { period = DIP_TAU_LOW; call PeriodicIntervalTimer.stop(); call PeriodicIntervalTimer.startOneShot(period); dbg("DipTrickleMilliP", "Resetting trickle timer @ %s\n", sim_time_string()); } command void TrickleTimer.maxInterval() { period = DIP_TAU_HIGH; } /** * The trickle timer has fired. Signaled if C > K. */ event void PeriodicIntervalTimer.fired() { uint32_t dtfire; dtfire = (call Random.rand16() % (period / 2)) + (period / 2); dbg("DipTrickleMilliP", "Scheduling Trickle event with %u\n", dtfire); call SingleEventTimer.startOneShot(dtfire); period = signal TrickleTimer.requestWindowSize(); call PeriodicIntervalTimer.startOneShot(period); //call Leds.led0Toggle(); } event void SingleEventTimer.fired() { dbg("Trickle", "Firing Trickle Event Timer\n"); signal TrickleTimer.fired(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -