00001 /** \addtogroup sys 00002 * @{ */ 00003 00004 /** 00005 * \defgroup etimer Event timers 00006 * 00007 * Event timers provides a way to generate timed events. An event 00008 * timer will post an event to the process that set the timer when the 00009 * event timer expires. 00010 * 00011 * An event timer is declared as a \c struct \c etimer and all access 00012 * to the event timer is made by a pointer to the declared event 00013 * timer. 00014 * 00015 * \sa \ref timer "Simple timer library" 00016 * \sa \ref clock "Clock library" (used by the timer library) 00017 * 00018 * @{ 00019 */ 00020 00021 00022 /** 00023 * \file 00024 * Event timer header file. 00025 * \author 00026 * Adam Dunkels <adam@sics.se> 00027 */ 00028 00029 /* 00030 * Copyright (c) 2004, Swedish Institute of Computer Science. 00031 * All rights reserved. 00032 * 00033 * Redistribution and use in source and binary forms, with or without 00034 * modification, are permitted provided that the following conditions 00035 * are met: 00036 * 1. Redistributions of source code must retain the above copyright 00037 * notice, this list of conditions and the following disclaimer. 00038 * 2. Redistributions in binary form must reproduce the above copyright 00039 * notice, this list of conditions and the following disclaimer in the 00040 * documentation and/or other materials provided with the distribution. 00041 * 3. Neither the name of the Institute nor the names of its contributors 00042 * may be used to endorse or promote products derived from this software 00043 * without specific prior written permission. 00044 * 00045 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 00046 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00047 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00048 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 00049 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00050 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00051 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00052 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00053 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00054 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00055 * SUCH DAMAGE. 00056 * 00057 * This file is part of the Contiki operating system. 00058 * 00059 * Author: Adam Dunkels <adam@sics.se> 00060 * 00061 * $Id: etimer.h,v 1.3 2008/02/07 23:04:35 oliverschmidt Exp $ 00062 */ 00063 #ifndef __ETIMER_H__ 00064 #define __ETIMER_H__ 00065 00066 #include "sys/timer.h" 00067 #include "sys/process.h" 00068 00069 /** 00070 * A timer. 00071 * 00072 * This structure is used for declaring a timer. The timer must be set 00073 * with etimer_set() before it can be used. 00074 * 00075 * \hideinitializer 00076 */ 00077 struct etimer { 00078 struct timer timer; 00079 struct etimer *next; 00080 struct process *p; 00081 }; 00082 00083 /** 00084 * \name Functions called from application programs 00085 * @{ 00086 */ 00087 00088 /** 00089 * \brief Set an event timer. 00090 * \param et A pointer to the event timer 00091 * \param interval The interval before the timer expires. 00092 * 00093 * This function is used to set an event timer for a time 00094 * sometime in the future. When the event timer expires, 00095 * the event PROCESS_EVENT_TIMER will be posted to the 00096 * process that called the etimer_set() function. 00097 * 00098 */ 00099 CCIF void etimer_set(struct etimer *et, clock_time_t interval); 00100 00101 /** 00102 * \brief Reset an event timer with the same interval as was 00103 * previously set. 00104 * \param et A pointer to the event timer. 00105 * 00106 * This function resets the event timer with the same 00107 * interval that was given to the event timer with the 00108 * etimer_set() function. The start point of the interval 00109 * is the exact time that the event timer last 00110 * expired. Therefore, this function will cause the timer 00111 * to be stable over time, unlike the etimer_restart() 00112 * function. 00113 * 00114 * \sa etimer_restart() 00115 */ 00116 CCIF void etimer_reset(struct etimer *et); 00117 00118 /** 00119 * \brief Restart an event timer from the current point in time 00120 * \param et A pointer to the event timer. 00121 * 00122 * This function restarts the event timer with the same 00123 * interval that was given to the etimer_set() 00124 * function. The event timer will start at the current 00125 * time. 00126 * 00127 * \note A periodic timer will drift if this function is 00128 * used to reset it. For periodic timers, use the 00129 * etimer_reset() function instead. 00130 * 00131 * \sa etimer_reset() 00132 */ 00133 void etimer_restart(struct etimer *et); 00134 00135 /** 00136 * \brief Adjust the expiration time for an event timer 00137 * \param et A pointer to the event timer. 00138 * \param td The time difference to adjust the expiration time with. 00139 * 00140 * This function is used to adjust the time the event 00141 * timer will expire. It can be used to synchronize 00142 * periodic timers without the need to restart the timer 00143 * or change the timer interval. 00144 * 00145 * \note This function should only be used for small 00146 * adjustments. For large adjustments use etimer_set() 00147 * instead. 00148 * 00149 * \note A periodic timer will drift unless the 00150 * etimer_reset() function is used. 00151 * 00152 * \sa etimer_set() 00153 * \sa etimer_reset() 00154 */ 00155 void etimer_adjust(struct etimer *et, int td); 00156 00157 /** 00158 * \brief Get the expiration time for the event timer. 00159 * \param et A pointer to the event timer 00160 * \return The expiration time for the event timer. 00161 * 00162 * This function returns the expiration time for an event timer. 00163 */ 00164 clock_time_t etimer_expiration_time(struct etimer *et); 00165 00166 /** 00167 * \brief Get the start time for the event timer. 00168 * \param et A pointer to the event timer 00169 * \return The start time for the event timer. 00170 * 00171 * This function returns the start time (when the timer 00172 * was last set) for an event timer. 00173 */ 00174 clock_time_t etimer_start_time(struct etimer *et); 00175 00176 /** 00177 * \brief Check if an event timer has expired. 00178 * \param et A pointer to the event timer 00179 * \return Non-zero if the timer has expired, zero otherwise. 00180 * 00181 * This function tests if an event timer has expired and 00182 * returns true or false depending on its status. 00183 */ 00184 CCIF int etimer_expired(struct etimer *et); 00185 00186 /** 00187 * \brief Stop a pending event timer. 00188 * \param et A pointer to the pending event timer. 00189 * 00190 * This function stops an event timer that has previously 00191 * been set with etimer_set() or etimer_reset(). After 00192 * this function has been called, the event timer will not 00193 * emit any event when it expires. 00194 * 00195 */ 00196 void etimer_stop(struct etimer *et); 00197 00198 /** @} */ 00199 00200 /** 00201 * \name Functions called from timer interrupts, by the system 00202 * @{ 00203 */ 00204 00205 /** 00206 * \brief Make the event timer aware that the clock has changed 00207 * 00208 * This function is used to inform the event timer module 00209 * that the system clock has been updated. Typically, this 00210 * function would be called from the timer interrupt 00211 * handler when the clock has ticked. 00212 */ 00213 void etimer_request_poll(void); 00214 00215 /** 00216 * \brief Check if there are any non-expired event timers. 00217 * \return True if there are active event timers, false if there are 00218 * no active timers. 00219 * 00220 * This function checks if there are any active event 00221 * timers that have not expired. 00222 */ 00223 int etimer_pending(void); 00224 00225 /** 00226 * \brief Get next event timer expiration time. 00227 * \return Next expiration time of all pending event timers. 00228 * If there are no pending event timers this function 00229 * returns 0. 00230 * 00231 * This functions returns next expiration time of all 00232 * pending event timers. 00233 */ 00234 clock_time_t etimer_next_expiration_time(void); 00235 00236 00237 /** @} */ 00238 00239 PROCESS_NAME(etimer_process); 00240 #endif /* __ETIMER_H__ */ 00241 /** @} */ 00242 /** @} */