00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <applicfg.h>
00027 #include "timer.h"
00028
00029
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;
00034
00035 #define min_val(a,b) ((a<b)?a:b)
00036
00037
00038 TIMER_HANDLE SetAlarm(CO_Data* d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period)
00039 {
00040
00041 TIMER_HANDLE i;
00042 TIMER_HANDLE row_number = TIMER_NONE;
00043
00044
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 &&
00050 row->state == TIMER_FREE)
00051 {
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)
00064 {
00065 TIMEVAL real_timer_value;
00066 TIMEVAL elapsed_time;
00067
00068 if (row_number == last_timer_raw + 1) last_timer_raw++;
00069
00070
00071 real_timer_value = min_val(value, TIMEVAL_MAX);
00072 elapsed_time = getElapsedTime();
00073
00074
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);
00079 }
00080
00081 return row_number;
00082 }
00083 return TIMER_NONE;
00084 }
00085
00086
00087 TIMER_HANDLE DelAlarm(TIMER_HANDLE handle)
00088 {
00089
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
00104 void TimeDispatch()
00105 {
00106 TIMER_HANDLE i;
00107 TIMEVAL next_wakeup = TIMEVAL_MAX;
00108
00109
00110 TIMEVAL overrun = getElapsedTime();
00111
00112 TIMEVAL real_total_sleep_time = total_sleep_time + overrun;
00113
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)
00120 {
00121 if (row->val <= real_total_sleep_time)
00122 {
00123
00124 if (!row->interval)
00125 {
00126 row->state = TIMER_TRIG;
00127 }
00128 else
00129 {
00130
00131 row->val = row->interval - (overrun % row->interval);
00132 row->state = TIMER_TRIG_PERIOD;
00133
00134 next_wakeup = min_val(row->val,next_wakeup);
00135 }
00136 }
00137 else
00138 {
00139
00140 row->val -= real_total_sleep_time;
00141
00142
00143 next_wakeup = min_val(row->val,next_wakeup);
00144 }
00145 }
00146 }
00147
00148
00149 total_sleep_time = next_wakeup;
00150
00151
00152 setTimer(next_wakeup);
00153
00154
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;
00162 if(row->callback)
00163 (*row->callback)(row->d, row->id);
00164 }
00165 }
00166 }
00167