diff -r 2cb34a4ac65a -r 6b5a4c21e061 doc/doxygen/html/timer_8c-source.html --- a/doc/doxygen/html/timer_8c-source.html Tue Jun 05 17:34:33 2007 +0200 +++ b/doc/doxygen/html/timer_8c-source.html Tue Jun 05 18:43:21 2007 +0200 @@ -36,153 +36,134 @@ 00019 License along with this library; if not, write to the Free Software 00020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00021 */ -00022 -00023 /* #define DEBUG_WAR_CONSOLE_ON */ -00024 /* #define DEBUG_ERR_CONSOLE_ON */ -00025 -00026 #include <applicfg.h> -00027 #include "timer.h" -00028 -00029 /* --------- The timer table --------- */ -00030 s_timer_entry timers[MAX_NB_TIMER] = {{TIMER_FREE, NULL, NULL, 0, 0, 0},}; -00031 -00032 TIMEVAL total_sleep_time = TIMEVAL_MAX; -00033 TIMER_HANDLE last_timer_raw = -1; +00032 /* #define DEBUG_WAR_CONSOLE_ON */ +00033 /* #define DEBUG_ERR_CONSOLE_ON */ 00034 -00035 #define min_val(a,b) ((a<b)?a:b) -00036 -00037 /* --------- Use this to declare a new alarm --------- */ -00038 TIMER_HANDLE SetAlarm(CO_Data* d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period) -00039 { -00040 /*printf("SetAlarm(UNS32 id=%d, TimerCallback_t callback=%x, TIMEVAL value=%d, TIMEVAL period=%d)\n", id, callback, value, period); */ -00041 TIMER_HANDLE i; -00042 TIMER_HANDLE row_number = TIMER_NONE; +00035 #include <applicfg.h> +00036 #include "timer.h" +00037 +00038 /* --------- The timer table --------- */ +00039 s_timer_entry timers[MAX_NB_TIMER] = {{TIMER_FREE, NULL, NULL, 0, 0, 0},}; +00040 +00041 TIMEVAL total_sleep_time = TIMEVAL_MAX; +00042 TIMER_HANDLE last_timer_raw = -1; 00043 -00044 /* in order to decide new timer setting we have to run over all timer rows */ -00045 for(i=0; i <= last_timer_raw + 1 && i < MAX_NB_TIMER; i++) -00046 { -00047 s_timer_entry *row = (timers+i); -00048 -00049 if (callback && /* if something to store */ -00050 row->state == TIMER_FREE) /* and empty row */ -00051 { /* just store */ -00052 row->callback = callback; -00053 row->d = d; -00054 row->id = id; -00055 row->val = value; -00056 row->interval = period; -00057 row->state = TIMER_ARMED; -00058 row_number = i; -00059 break; -00060 } -00061 } -00062 -00063 if (row_number != TIMER_NONE) /* if successfull **/ -00064 { -00065 TIMEVAL real_timer_value; -00066 TIMEVAL elapsed_time; -00067 -00068 if (row_number == last_timer_raw + 1) last_timer_raw++; -00069 -00070 /* set next wakeup alarm if new entry is sooner than others, or if it is alone */ -00071 real_timer_value = min_val(value, TIMEVAL_MAX); -00072 elapsed_time = getElapsedTime(); -00073 -00074 /*printf("elapsed_time=%d real_timer_value=%d total_sleep_time=%d\n", elapsed_time, real_timer_value, total_sleep_time); */ -00075 if (total_sleep_time > elapsed_time && total_sleep_time - elapsed_time > real_timer_value) -00076 { -00077 total_sleep_time = elapsed_time + real_timer_value; -00078 setTimer(real_timer_value); +00044 #define min_val(a,b) ((a<b)?a:b) +00045 +00057 TIMER_HANDLE SetAlarm(CO_Data* d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period) +00058 { +00059 /*printf("SetAlarm(UNS32 id=%d, TimerCallback_t callback=%x, TIMEVAL value=%d, TIMEVAL period=%d)\n", id, callback, value, period); */ +00060 TIMER_HANDLE i; +00061 TIMER_HANDLE row_number = TIMER_NONE; +00062 +00064 for(i=0; i <= last_timer_raw + 1 && i < MAX_NB_TIMER; i++) +00065 { +00066 s_timer_entry *row = (timers+i); +00067 +00068 if (callback && +00069 row->state == TIMER_FREE) +00070 { +00071 row->callback = callback; +00072 row->d = d; +00073 row->id = id; +00074 row->val = value; +00075 row->interval = period; +00076 row->state = TIMER_ARMED; +00077 row_number = i; +00078 break; 00079 } -00080 /*printf("SetAlarm() return %d\n", row_number); */ -00081 return row_number; -00082 } -00083 return TIMER_NONE; -00084 } -00085 -00086 /* --------- Use this to remove an alarm --------- */ -00087 TIMER_HANDLE DelAlarm(TIMER_HANDLE handle) -00088 { -00089 /* Quick and dirty. system timer will continue to be trigged, but no action will be preformed. */ -00090 MSG_WAR(0x3320, "DelAlarm. handle = ", handle); -00091 if(handle != TIMER_NONE) -00092 { -00093 if(handle == last_timer_raw) -00094 last_timer_raw--; -00095 timers[handle].state = TIMER_FREE; -00096 } -00097 else { -00098 } -00099 return TIMER_NONE; -00100 } -00101 -00102 -00103 /* --------- TimeDispatch is called on each timer expiration --------- */ -00104 void TimeDispatch() -00105 { -00106 TIMER_HANDLE i; -00107 TIMEVAL next_wakeup = TIMEVAL_MAX; /* used to compute when should normaly occur next wakeup */ -00108 /* First run : change timer state depending on time */ -00109 /* Get time since timer signal */ -00110 TIMEVAL overrun = getElapsedTime(); -00111 -00112 TIMEVAL real_total_sleep_time = total_sleep_time + overrun; -00113 /*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */ -00114 -00115 for(i=0; i <= last_timer_raw; i++) -00116 { -00117 s_timer_entry *row = (timers+i); -00118 -00119 if (row->state & TIMER_ARMED) /* if row is active */ -00120 { -00121 if (row->val <= real_total_sleep_time) /* to be trigged */ -00122 { -00123 /*printf("row->val(%d) <= (%d)real_total_sleep_time\n", row->val, real_total_sleep_time); */ -00124 if (!row->interval) /* if simply outdated */ -00125 { -00126 row->state = TIMER_TRIG; /* ask for trig */ -00127 } -00128 else /* or period have expired */ -00129 { -00130 /* set val as interval, with overrun correction */ -00131 row->val = row->interval - (overrun % row->interval); -00132 row->state = TIMER_TRIG_PERIOD; /* ask for trig, periodic */ -00133 /* Check if this new timer value is the soonest */ -00134 next_wakeup = min_val(row->val,next_wakeup); -00135 } -00136 } -00137 else -00138 { -00139 /* Each armed timer value in decremented. */ -00140 row->val -= real_total_sleep_time; +00080 } +00081 +00082 if (row_number != TIMER_NONE) +00083 { +00084 TIMEVAL real_timer_value; +00085 TIMEVAL elapsed_time; +00086 +00087 if (row_number == last_timer_raw + 1) last_timer_raw++; +00088 +00090 real_timer_value = min_val(value, TIMEVAL_MAX); +00091 elapsed_time = getElapsedTime(); +00092 +00094 if (total_sleep_time > elapsed_time && total_sleep_time - elapsed_time > real_timer_value) +00095 { +00096 total_sleep_time = elapsed_time + real_timer_value; +00097 setTimer(real_timer_value); +00098 } +00100 return row_number; +00101 } +00102 return TIMER_NONE; +00103 } +00104 +00112 TIMER_HANDLE DelAlarm(TIMER_HANDLE handle) +00113 { +00115 MSG_WAR(0x3320, "DelAlarm. handle = ", handle); +00116 if(handle != TIMER_NONE) +00117 { +00118 if(handle == last_timer_raw) +00119 last_timer_raw--; +00120 timers[handle].state = TIMER_FREE; +00121 } +00122 else { +00123 } +00124 return TIMER_NONE; +00125 } +00126 +00131 void TimeDispatch() +00132 { +00133 TIMER_HANDLE i; +00134 TIMEVAL next_wakeup = TIMEVAL_MAX; +00137 TIMEVAL overrun = getElapsedTime(); +00138 +00139 TIMEVAL real_total_sleep_time = total_sleep_time + overrun; +00140 /*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */ 00141 -00142 /* Check if this new timer value is the soonest */ -00143 next_wakeup = min_val(row->val,next_wakeup); -00144 } -00145 } -00146 } -00147 -00148 /* Remember how much time we should sleep. */ -00149 total_sleep_time = next_wakeup; -00150 -00151 /* Set timer to soonest occurence */ -00152 setTimer(next_wakeup); -00153 -00154 /* Then trig them or not. */ -00155 for(i=0; i<=last_timer_raw; i++) -00156 { -00157 s_timer_entry *row = (timers+i); -00158 -00159 if (row->state & TIMER_TRIG) -00160 { -00161 row->state &= ~TIMER_TRIG; /* reset trig state (will be free if not periodic) */ -00162 if(row->callback) -00163 (*row->callback)(row->d, row->id); /* trig ! */ -00164 } -00165 } -00166 } -00167 -