58 { |
58 { |
59 /*printf("SetAlarm(UNS32 id=%d, TimerCallback_t callback=%x, TIMEVAL value=%d, TIMEVAL period=%d)\n", id, callback, value, period); */ |
59 /*printf("SetAlarm(UNS32 id=%d, TimerCallback_t callback=%x, TIMEVAL value=%d, TIMEVAL period=%d)\n", id, callback, value, period); */ |
60 TIMER_HANDLE i; |
60 TIMER_HANDLE i; |
61 TIMER_HANDLE row_number = TIMER_NONE; |
61 TIMER_HANDLE row_number = TIMER_NONE; |
62 |
62 |
63 /** in order to decide new timer setting we have to run over all timer rows */ |
63 /* in order to decide new timer setting we have to run over all timer rows */ |
64 for(i=0; i <= last_timer_raw + 1 && i < MAX_NB_TIMER; i++) |
64 for(i=0; i <= last_timer_raw + 1 && i < MAX_NB_TIMER; i++) |
65 { |
65 { |
66 s_timer_entry *row = (timers+i); |
66 s_timer_entry *row = (timers+i); |
67 |
67 |
68 if (callback && /** if something to store */ |
68 if (callback && /* if something to store */ |
69 row->state == TIMER_FREE) /** and empty row */ |
69 row->state == TIMER_FREE) /* and empty row */ |
70 { /** just store */ |
70 { /* just store */ |
71 row->callback = callback; |
71 row->callback = callback; |
72 row->d = d; |
72 row->d = d; |
73 row->id = id; |
73 row->id = id; |
74 row->val = value; |
74 row->val = value; |
75 row->interval = period; |
75 row->interval = period; |
77 row_number = i; |
77 row_number = i; |
78 break; |
78 break; |
79 } |
79 } |
80 } |
80 } |
81 |
81 |
82 if (row_number != TIMER_NONE) /** if successfull **/ |
82 if (row_number != TIMER_NONE) /* if successfull **/ |
83 { |
83 { |
84 TIMEVAL real_timer_value; |
84 TIMEVAL real_timer_value; |
85 TIMEVAL elapsed_time; |
85 TIMEVAL elapsed_time; |
86 |
86 |
87 if (row_number == last_timer_raw + 1) last_timer_raw++; |
87 if (row_number == last_timer_raw + 1) last_timer_raw++; |
88 |
88 |
89 /** set next wakeup alarm if new entry is sooner than others, or if it is alone */ |
89 /* set next wakeup alarm if new entry is sooner than others, or if it is alone */ |
90 real_timer_value = min_val(value, TIMEVAL_MAX); |
90 real_timer_value = min_val(value, TIMEVAL_MAX); |
91 elapsed_time = getElapsedTime(); |
91 elapsed_time = getElapsedTime(); |
92 |
92 |
93 /**printf("elapsed_time=%d real_timer_value=%d total_sleep_time=%d\n", elapsed_time, real_timer_value, total_sleep_time); */ |
93 /*printf("elapsed_time=%d real_timer_value=%d total_sleep_time=%d\n", elapsed_time, real_timer_value, total_sleep_time); */ |
94 if (total_sleep_time > elapsed_time && total_sleep_time - elapsed_time > real_timer_value) |
94 if (total_sleep_time > elapsed_time && total_sleep_time - elapsed_time > real_timer_value) |
95 { |
95 { |
96 total_sleep_time = elapsed_time + real_timer_value; |
96 total_sleep_time = elapsed_time + real_timer_value; |
97 setTimer(real_timer_value); |
97 setTimer(real_timer_value); |
98 } |
98 } |
99 /**printf("SetAlarm() return %d\n", row_number); */ |
99 /*printf("SetAlarm() return %d\n", row_number); */ |
100 return row_number; |
100 return row_number; |
101 } |
101 } |
102 return TIMER_NONE; |
102 return TIMER_NONE; |
103 } |
103 } |
104 |
104 |
129 ** |
129 ** |
130 **/ |
130 **/ |
131 void TimeDispatch() |
131 void TimeDispatch() |
132 { |
132 { |
133 TIMER_HANDLE i; |
133 TIMER_HANDLE i; |
134 TIMEVAL next_wakeup = TIMEVAL_MAX; /** used to compute when should normaly occur next wakeup */ |
134 TIMEVAL next_wakeup = TIMEVAL_MAX; /* used to compute when should normaly occur next wakeup */ |
135 /** First run : change timer state depending on time */ |
135 /* First run : change timer state depending on time */ |
136 /** Get time since timer signal */ |
136 /* Get time since timer signal */ |
137 TIMEVAL overrun = getElapsedTime(); |
137 TIMEVAL overrun = getElapsedTime(); |
138 |
138 |
139 TIMEVAL real_total_sleep_time = total_sleep_time + overrun; |
139 TIMEVAL real_total_sleep_time = total_sleep_time + overrun; |
140 /*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */ |
140 /*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */ |
141 |
141 |
142 for(i=0; i <= last_timer_raw; i++) |
142 for(i=0; i <= last_timer_raw; i++) |
143 { |
143 { |
144 s_timer_entry *row = (timers+i); |
144 s_timer_entry *row = (timers+i); |
145 |
145 |
146 if (row->state & TIMER_ARMED) /** if row is active */ |
146 if (row->state & TIMER_ARMED) /* if row is active */ |
147 { |
147 { |
148 if (row->val <= real_total_sleep_time) /** to be trigged */ |
148 if (row->val <= real_total_sleep_time) /* to be trigged */ |
149 { |
149 { |
150 /*printf("row->val(%d) <= (%d)real_total_sleep_time\n", row->val, real_total_sleep_time); */ |
150 /*printf("row->val(%d) <= (%d)real_total_sleep_time\n", row->val, real_total_sleep_time); */ |
151 if (!row->interval) /** if simply outdated */ |
151 if (!row->interval) /* if simply outdated */ |
152 { |
152 { |
153 row->state = TIMER_TRIG; /** ask for trig */ |
153 row->state = TIMER_TRIG; /* ask for trig */ |
154 } |
154 } |
155 else /** or period have expired */ |
155 else /* or period have expired */ |
156 { |
156 { |
157 /** set val as interval, with overrun correction */ |
157 /* set val as interval, with overrun correction */ |
158 row->val = row->interval - (overrun % row->interval); |
158 row->val = row->interval - (overrun % row->interval); |
159 row->state = TIMER_TRIG_PERIOD; /* ask for trig, periodic */ |
159 row->state = TIMER_TRIG_PERIOD; /* ask for trig, periodic */ |
160 /** Check if this new timer value is the soonest */ |
160 /* Check if this new timer value is the soonest */ |
161 next_wakeup = min_val(row->val,next_wakeup); |
161 next_wakeup = min_val(row->val,next_wakeup); |
162 } |
162 } |
163 } |
163 } |
164 else |
164 else |
165 { |
165 { |
166 /** Each armed timer value in decremented. */ |
166 /* Each armed timer value in decremented. */ |
167 row->val -= real_total_sleep_time; |
167 row->val -= real_total_sleep_time; |
168 |
168 |
169 /** Check if this new timer value is the soonest */ |
169 /* Check if this new timer value is the soonest */ |
170 next_wakeup = min_val(row->val,next_wakeup); |
170 next_wakeup = min_val(row->val,next_wakeup); |
171 } |
171 } |
172 } |
172 } |
173 } |
173 } |
174 |
174 |
175 /** Remember how much time we should sleep. */ |
175 /* Remember how much time we should sleep. */ |
176 total_sleep_time = next_wakeup; |
176 total_sleep_time = next_wakeup; |
177 |
177 |
178 /** Set timer to soonest occurence */ |
178 /* Set timer to soonest occurence */ |
179 setTimer(next_wakeup); |
179 setTimer(next_wakeup); |
180 |
180 |
181 /** Then trig them or not. */ |
181 /* Then trig them or not. */ |
182 for(i=0; i<=last_timer_raw; i++) |
182 for(i=0; i<=last_timer_raw; i++) |
183 { |
183 { |
184 s_timer_entry *row = (timers+i); |
184 s_timer_entry *row = (timers+i); |
185 |
185 |
186 if (row->state & TIMER_TRIG) |
186 if (row->state & TIMER_TRIG) |
187 { |
187 { |
188 row->state &= ~TIMER_TRIG; /** reset trig state (will be free if not periodic) */ |
188 row->state &= ~TIMER_TRIG; /* reset trig state (will be free if not periodic) */ |
189 if(row->callback) |
189 if(row->callback) |
190 (*row->callback)(row->d, row->id); /** trig ! */ |
190 (*row->callback)(row->d, row->id); /* trig ! */ |
191 } |
191 } |
192 } |
192 } |
193 } |
193 } |
194 |
194 |