57 TIMER_HANDLE SetAlarm(CO_Data* d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period) |
57 TIMER_HANDLE SetAlarm(CO_Data* d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period) |
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 s_timer_entry *row; |
62 |
63 |
63 /* in order to decide new timer setting we have to run over all timer rows */ |
64 /* 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++) |
65 for(i=0, row=timers; i <= last_timer_raw + 1 && i < MAX_NB_TIMER; i++, row++) |
65 { |
66 { |
66 s_timer_entry *row = (timers+i); |
|
67 |
|
68 if (callback && /* if something to store */ |
67 if (callback && /* if something to store */ |
69 row->state == TIMER_FREE) /* and empty row */ |
68 row->state == TIMER_FREE) /* and empty row */ |
70 { /* just store */ |
69 { /* just store */ |
71 row->callback = callback; |
70 row->callback = callback; |
72 row->d = d; |
71 row->d = d; |
117 { |
116 { |
118 if(handle == last_timer_raw) |
117 if(handle == last_timer_raw) |
119 last_timer_raw--; |
118 last_timer_raw--; |
120 timers[handle].state = TIMER_FREE; |
119 timers[handle].state = TIMER_FREE; |
121 } |
120 } |
122 else { |
|
123 } |
|
124 return TIMER_NONE; |
121 return TIMER_NONE; |
125 } |
122 } |
126 |
123 |
127 /*! |
124 /*! |
128 ** ------ TimeDispatch is called on each timer expiration ---- |
125 ** ------ TimeDispatch is called on each timer expiration ---- |
129 ** |
126 ** |
130 **/ |
127 **/ |
131 void TimeDispatch() |
128 void TimeDispatch(void) |
132 { |
129 { |
133 TIMER_HANDLE i; |
130 TIMER_HANDLE i; |
134 TIMEVAL next_wakeup = TIMEVAL_MAX; /* used to compute when should normaly occur next wakeup */ |
131 TIMEVAL next_wakeup = TIMEVAL_MAX; /* used to compute when should normaly occur next wakeup */ |
135 /* First run : change timer state depending on time */ |
132 /* First run : change timer state depending on time */ |
136 /* Get time since timer signal */ |
133 /* Get time since timer signal */ |
137 TIMEVAL overrun = getElapsedTime(); |
134 TIMEVAL overrun = getElapsedTime(); |
138 |
135 |
139 TIMEVAL real_total_sleep_time = total_sleep_time + overrun; |
136 TIMEVAL real_total_sleep_time = total_sleep_time + overrun; |
140 /*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */ |
137 /*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */ |
141 |
138 |
142 for(i=0; i <= last_timer_raw; i++) |
139 s_timer_entry *row; |
|
140 |
|
141 for(i=0, row = timers; i <= last_timer_raw; i++, row++) |
143 { |
142 { |
144 s_timer_entry *row = (timers+i); |
|
145 |
|
146 if (row->state & TIMER_ARMED) /* if row is active */ |
143 if (row->state & TIMER_ARMED) /* if row is active */ |
147 { |
144 { |
148 if (row->val <= real_total_sleep_time) /* to be trigged */ |
145 if (row->val <= real_total_sleep_time) /* to be trigged */ |
149 { |
146 { |
150 /*printf("row->val(%d) <= (%d)real_total_sleep_time\n", row->val, real_total_sleep_time); */ |
147 /*printf("row->val(%d) <= (%d)real_total_sleep_time\n", row->val, real_total_sleep_time); */ |
156 { |
153 { |
157 /* set val as interval, with overrun correction */ |
154 /* set val as interval, with overrun correction */ |
158 row->val = row->interval - (overrun % row->interval); |
155 row->val = row->interval - (overrun % row->interval); |
159 row->state = TIMER_TRIG_PERIOD; /* ask for trig, periodic */ |
156 row->state = TIMER_TRIG_PERIOD; /* ask for trig, periodic */ |
160 /* Check if this new timer value is the soonest */ |
157 /* Check if this new timer value is the soonest */ |
161 next_wakeup = min_val(row->val,next_wakeup); |
158 if(row->val < next_wakeup) |
|
159 next_wakeup = row->val; |
162 } |
160 } |
163 } |
161 } |
164 else |
162 else |
165 { |
163 { |
166 /* Each armed timer value in decremented. */ |
164 /* Each armed timer value in decremented. */ |
167 row->val -= real_total_sleep_time; |
165 row->val -= real_total_sleep_time; |
168 |
166 |
169 /* Check if this new timer value is the soonest */ |
167 /* Check if this new timer value is the soonest */ |
170 next_wakeup = min_val(row->val,next_wakeup); |
168 if(row->val < next_wakeup) |
|
169 next_wakeup = row->val; |
171 } |
170 } |
172 } |
171 } |
173 } |
172 } |
174 |
173 |
175 /* Remember how much time we should sleep. */ |
174 /* Remember how much time we should sleep. */ |
177 |
176 |
178 /* Set timer to soonest occurence */ |
177 /* Set timer to soonest occurence */ |
179 setTimer(next_wakeup); |
178 setTimer(next_wakeup); |
180 |
179 |
181 /* Then trig them or not. */ |
180 /* Then trig them or not. */ |
182 for(i=0; i<=last_timer_raw; i++) |
181 for(i=0, row = timers; i<=last_timer_raw; i++, row++) |
183 { |
182 { |
184 s_timer_entry *row = (timers+i); |
|
185 |
|
186 if (row->state & TIMER_TRIG) |
183 if (row->state & TIMER_TRIG) |
187 { |
184 { |
188 row->state &= ~TIMER_TRIG; /* reset trig state (will be free if not periodic) */ |
185 row->state &= ~TIMER_TRIG; /* reset trig state (will be free if not periodic) */ |
189 if(row->callback) |
186 if(row->callback) |
190 (*row->callback)(row->d, row->id); /* trig ! */ |
187 (*row->callback)(row->d, row->id); /* trig ! */ |
191 } |
188 } |
192 } |
189 } |
193 } |
190 } |
194 |
|