src/timer.c
changeset 522 e69d5903a5b2
parent 470 86ff6646b721
child 576 b4bc22764a39
equal deleted inserted replaced
521:731bbe1b67b4 522:e69d5903a5b2
    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 */