src/timer.c
author etisserant
Sat, 28 Jun 2008 18:43:15 +0200
changeset 492 b919a24a45cb
parent 470 86ff6646b721
child 522 e69d5903a5b2
permissions -rwxr-xr-x
Fixed automatic SDO server creation for slave
Automatic PDO creation for slave
Remove PDO from EDS when mapping not defined
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     1
/*
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     2
This file is part of CanFestival, a library implementing CanOpen Stack. 
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     3
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     4
Copyright (C): Edouard TISSERANT and Francis DUPIN
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     5
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     6
See COPYING file for copyrights details.
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     7
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     8
This library is free software; you can redistribute it and/or
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
     9
modify it under the terms of the GNU Lesser General Public
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    10
License as published by the Free Software Foundation; either
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    11
version 2.1 of the License, or (at your option) any later version.
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    12
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    13
This library is distributed in the hope that it will be useful,
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    14
but WITHOUT ANY WARRANTY; without even the implied warranty of
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    16
Lesser General Public License for more details.
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    17
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    18
You should have received a copy of the GNU Lesser General Public
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    19
License along with this library; if not, write to the Free Software
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    20
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    21
*/
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    22
/*!
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    23
** @file   timer.c
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    24
** @author Edouard TISSERANT and Francis DUPIN
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    25
** @date   Tue Jun  5 09:32:32 2007
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    26
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    27
** @brief
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    28
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    29
**
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    30
*/
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    31
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    32
/* #define DEBUG_WAR_CONSOLE_ON */
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    33
/* #define DEBUG_ERR_CONSOLE_ON */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    34
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    35
#include <applicfg.h>
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    36
#include "timer.h"
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    37
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    38
/*  ---------  The timer table --------- */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    39
s_timer_entry timers[MAX_NB_TIMER] = {{TIMER_FREE, NULL, NULL, 0, 0, 0},};
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    40
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    41
TIMEVAL total_sleep_time = TIMEVAL_MAX;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    42
TIMER_HANDLE last_timer_raw = -1;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    43
167
b2f8b91d89b5 Removed compilation warnings with some GCC.
etisserant
parents: 149
diff changeset
    44
#define min_val(a,b) ((a<b)?a:b)
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    45
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    46
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    47
** -------  Use this to declare a new alarm ------                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    48
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    49
** @param d                                                                                        
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    50
** @param id                                                                                       
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    51
** @param callback                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    52
** @param value                                                                                    
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    53
** @param period                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    54
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    55
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
    56
**/   
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    57
TIMER_HANDLE SetAlarm(CO_Data* d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    58
{
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    59
	/*printf("SetAlarm(UNS32 id=%d, TimerCallback_t callback=%x, TIMEVAL value=%d, TIMEVAL period=%d)\n", id, callback, value, period); */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    60
	TIMER_HANDLE i;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    61
	TIMER_HANDLE row_number = TIMER_NONE;
470
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
    62
	s_timer_entry *row;
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    63
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    64
	/* in order to decide new timer setting we have to run over all timer rows */
470
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
    65
	for(i=0, row=timers; i <= last_timer_raw + 1 && i < MAX_NB_TIMER; i++, row++)
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    66
	{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    67
		if (callback && 	/* if something to store */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    68
		   row->state == TIMER_FREE) /* and empty row */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    69
		{	/* just store */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    70
			row->callback = callback;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    71
			row->d = d;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    72
			row->id = id;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    73
			row->val = value;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    74
			row->interval = period;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    75
			row->state = TIMER_ARMED;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    76
			row_number = i;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    77
			break;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    78
		}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    79
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    80
	
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    81
	if (row_number != TIMER_NONE) /* if successfull **/
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    82
	{
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    83
		TIMEVAL real_timer_value;
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    84
		TIMEVAL elapsed_time;
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    85
		
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    86
		if (row_number == last_timer_raw + 1) last_timer_raw++;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    87
		
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    88
		/* set next wakeup alarm if new entry is sooner than others, or if it is alone */
167
b2f8b91d89b5 Removed compilation warnings with some GCC.
etisserant
parents: 149
diff changeset
    89
		real_timer_value = min_val(value, TIMEVAL_MAX);
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    90
		elapsed_time = getElapsedTime();
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    91
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    92
		/*printf("elapsed_time=%d real_timer_value=%d total_sleep_time=%d\n", elapsed_time, real_timer_value, total_sleep_time); */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    93
		if (total_sleep_time > elapsed_time && total_sleep_time - elapsed_time > real_timer_value)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    94
		{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    95
			total_sleep_time = elapsed_time + real_timer_value;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    96
			setTimer(real_timer_value);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    97
		}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    98
		/*printf("SetAlarm() return %d\n", row_number); */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    99
		return row_number;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   100
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   101
	return TIMER_NONE;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   102
}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   103
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   104
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   105
**  -----  Use this to remove an alarm ----                                                                                             
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   106
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   107
** @param handle                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   108
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   109
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   110
**/  
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   111
TIMER_HANDLE DelAlarm(TIMER_HANDLE handle)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   112
{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   113
	/* Quick and dirty. system timer will continue to be trigged, but no action will be preformed. */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   114
	MSG_WAR(0x3320, "DelAlarm. handle = ", handle);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   115
	if(handle != TIMER_NONE)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   116
	{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   117
		if(handle == last_timer_raw) 
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   118
			last_timer_raw--;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   119
		timers[handle].state = TIMER_FREE; 		
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   120
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   121
	return TIMER_NONE;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   122
}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   123
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   124
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   125
** ------  TimeDispatch is called on each timer expiration ----                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   126
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   127
**/  
470
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   128
void TimeDispatch(void)
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   129
{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   130
	TIMER_HANDLE i;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   131
	TIMEVAL next_wakeup = TIMEVAL_MAX; /* used to compute when should normaly occur next wakeup */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   132
	/* First run : change timer state depending on time */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   133
	/* Get time since timer signal */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   134
	TIMEVAL overrun = getElapsedTime();
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   135
	
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   136
	TIMEVAL real_total_sleep_time = total_sleep_time + overrun;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
   137
	/*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   138
470
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   139
	s_timer_entry *row;
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   140
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   141
	for(i=0, row = timers; i <= last_timer_raw; i++, row++)
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   142
	{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   143
		if (row->state & TIMER_ARMED) /* if row is active */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   144
		{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   145
			if (row->val <= real_total_sleep_time) /* to be trigged */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   146
			{
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
   147
				/*printf("row->val(%d) <= (%d)real_total_sleep_time\n", row->val, real_total_sleep_time); */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   148
				if (!row->interval) /* if simply outdated */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   149
				{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   150
					row->state = TIMER_TRIG; /* ask for trig */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   151
				}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   152
				else /* or period have expired */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   153
				{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   154
					/* set val as interval, with overrun correction */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   155
					row->val = row->interval - (overrun % row->interval);
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
   156
					row->state = TIMER_TRIG_PERIOD; /* ask for trig, periodic */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   157
					/* Check if this new timer value is the soonest */
470
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   158
					if(row->val < next_wakeup)
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   159
						next_wakeup = row->val;   
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   160
				}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   161
			}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   162
			else
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   163
			{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   164
				/* Each armed timer value in decremented. */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   165
				row->val -= real_total_sleep_time;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   166
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   167
				/* Check if this new timer value is the soonest */
470
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   168
				if(row->val < next_wakeup)
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   169
					next_wakeup = row->val;   
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   170
			}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   171
		}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   172
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   173
	
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   174
	/* Remember how much time we should sleep. */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   175
	total_sleep_time = next_wakeup;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   176
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   177
	/* Set timer to soonest occurence */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   178
	setTimer(next_wakeup);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   179
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   180
	/* Then trig them or not. */
470
86ff6646b721 Applied Edwards timer.c optimization patch.
etisserant
parents: 215
diff changeset
   181
	for(i=0, row = timers; i<=last_timer_raw; i++, row++)
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   182
	{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   183
		if (row->state & TIMER_TRIG)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   184
		{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   185
			row->state &= ~TIMER_TRIG; /* reset trig state (will be free if not periodic) */
149
fe50ada8020b Changes in the API:
etisserant
parents: 71
diff changeset
   186
			if(row->callback)
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   187
				(*row->callback)(row->d, row->id); /* trig ! */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   188
		}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   189
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   190
}