54 ** |
54 ** |
55 ** @return |
55 ** @return |
56 **/ |
56 **/ |
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 TIMER_HANDLE row_number; |
60 TIMER_HANDLE i; |
|
61 TIMER_HANDLE row_number = TIMER_NONE; |
|
62 s_timer_entry *row; |
60 s_timer_entry *row; |
63 |
61 |
64 /* in order to decide new timer setting we have to run over all timer rows */ |
62 /* in order to decide new timer setting we have to run over all timer rows */ |
65 for(i=0, row=timers; i <= last_timer_raw + 1 && i < MAX_NB_TIMER; i++, row++) |
63 for(row_number=0, row=timers; row_number <= last_timer_raw + 1 && row_number < MAX_NB_TIMER; row_number++, row++) |
66 { |
64 { |
67 if (callback && /* if something to store */ |
65 if (callback && /* if something to store */ |
68 row->state == TIMER_FREE) /* and empty row */ |
66 row->state == TIMER_FREE) /* and empty row */ |
69 { /* just store */ |
67 { /* just store */ |
|
68 TIMEVAL real_timer_value; |
|
69 TIMEVAL elapsed_time; |
|
70 |
|
71 if (row_number == last_timer_raw + 1) last_timer_raw++; |
|
72 |
|
73 elapsed_time = getElapsedTime(); |
|
74 /* set next wakeup alarm if new entry is sooner than others, or if it is alone */ |
|
75 real_timer_value = value > elapsed_time ? value - elapsed_time : 0; |
|
76 real_timer_value = min_val(real_timer_value, TIMEVAL_MAX); |
|
77 |
|
78 if (total_sleep_time > elapsed_time && total_sleep_time - elapsed_time > real_timer_value) |
|
79 { |
|
80 total_sleep_time = elapsed_time + real_timer_value; |
|
81 setTimer(real_timer_value); |
|
82 } |
70 row->callback = callback; |
83 row->callback = callback; |
71 row->d = d; |
84 row->d = d; |
72 row->id = id; |
85 row->id = id; |
73 row->val = value; |
86 row->val = value + elapsed_time; |
74 row->interval = period; |
87 row->interval = period; |
75 row->state = TIMER_ARMED; |
88 row->state = TIMER_ARMED; |
76 row_number = i; |
89 return row_number; |
77 break; |
|
78 } |
90 } |
79 } |
91 } |
80 |
92 |
81 if (row_number != TIMER_NONE) /* if successfull **/ |
|
82 { |
|
83 TIMEVAL real_timer_value; |
|
84 TIMEVAL elapsed_time; |
|
85 |
|
86 if (row_number == last_timer_raw + 1) last_timer_raw++; |
|
87 |
|
88 /* set next wakeup alarm if new entry is sooner than others, or if it is alone */ |
|
89 real_timer_value = min_val(value, TIMEVAL_MAX); |
|
90 elapsed_time = getElapsedTime(); |
|
91 |
|
92 /*printf("elapsed_time=%d real_timer_value=%d total_sleep_time=%d\n", elapsed_time, real_timer_value, total_sleep_time); */ |
|
93 if (total_sleep_time > elapsed_time && total_sleep_time - elapsed_time > real_timer_value) |
|
94 { |
|
95 total_sleep_time = elapsed_time + real_timer_value; |
|
96 setTimer(real_timer_value); |
|
97 } |
|
98 /*printf("SetAlarm() return %d\n", row_number); */ |
|
99 return row_number; |
|
100 } |
|
101 return TIMER_NONE; |
93 return TIMER_NONE; |
102 } |
94 } |
103 |
95 |
104 /*! |
96 /*! |
105 ** ----- Use this to remove an alarm ---- |
97 ** ----- Use this to remove an alarm ---- |
122 } |
114 } |
123 |
115 |
124 /*! |
116 /*! |
125 ** ------ TimeDispatch is called on each timer expiration ---- |
117 ** ------ TimeDispatch is called on each timer expiration ---- |
126 ** |
118 ** |
127 **/ |
119 **/ |
|
120 int tdcount=0; |
128 void TimeDispatch(void) |
121 void TimeDispatch(void) |
129 { |
122 { |
130 TIMER_HANDLE i; |
123 TIMER_HANDLE i; |
131 TIMEVAL next_wakeup = TIMEVAL_MAX; /* used to compute when should normaly occur next wakeup */ |
124 TIMEVAL next_wakeup = TIMEVAL_MAX; /* used to compute when should normaly occur next wakeup */ |
132 /* First run : change timer state depending on time */ |
125 /* First run : change timer state depending on time */ |
133 /* Get time since timer signal */ |
126 /* Get time since timer signal */ |
134 TIMEVAL overrun = getElapsedTime(); |
127 TIMEVAL overrun = getElapsedTime(); |
135 |
128 |
136 TIMEVAL real_total_sleep_time = total_sleep_time + overrun; |
129 TIMEVAL real_total_sleep_time = total_sleep_time + overrun; |
137 /*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */ |
|
138 |
130 |
139 s_timer_entry *row; |
131 s_timer_entry *row; |
140 |
132 |
141 for(i=0, row = timers; i <= last_timer_raw; i++, row++) |
133 for(i=0, row = timers; i <= last_timer_raw; i++, row++) |
142 { |
134 { |
143 if (row->state & TIMER_ARMED) /* if row is active */ |
135 if (row->state & TIMER_ARMED) /* if row is active */ |
144 { |
136 { |
145 if (row->val <= real_total_sleep_time) /* to be trigged */ |
137 if (row->val <= real_total_sleep_time) /* to be trigged */ |
146 { |
138 { |
147 /*printf("row->val(%d) <= (%d)real_total_sleep_time\n", row->val, real_total_sleep_time); */ |
|
148 if (!row->interval) /* if simply outdated */ |
139 if (!row->interval) /* if simply outdated */ |
149 { |
140 { |
150 row->state = TIMER_TRIG; /* ask for trig */ |
141 row->state = TIMER_TRIG; /* ask for trig */ |
151 } |
142 } |
152 else /* or period have expired */ |
143 else /* or period have expired */ |