src/timer.c
author etisserant
Mon, 02 Jul 2007 18:22:58 +0200
changeset 236 905677ed00f3
parent 215 f49e5a6b7804
child 470 86ff6646b721
permissions -rwxr-xr-x
Full preliminary implementation of TPDO transmit type:
- SYNC (N) (1-240)
- RTR only + SYNC (252)
- RTR only (253)
- EVENT, with timer and inhibit time (254 and 255)

User app have to call sendPDOevent(d) to eventually signal mapped data changes.
Callbacks added to 0x140N, TPDO comm parameters for on the fly timers values change.
TestMasterSlave updated.
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;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    62
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    63
	/* in order to decide new timer setting we have to run over all timer rows */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    64
	for(i=0; i <= last_timer_raw + 1 && i < MAX_NB_TIMER; i++)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    65
	{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    66
		s_timer_entry *row = (timers+i);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    67
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    68
		if (callback && 	/* if something to store */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    69
		   row->state == TIMER_FREE) /* and empty row */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    70
		{	/* just store */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    71
			row->callback = callback;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    72
			row->d = d;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    73
			row->id = id;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    74
			row->val = value;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    75
			row->interval = period;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    76
			row->state = TIMER_ARMED;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    77
			row_number = i;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    78
			break;
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
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    81
	
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    82
	if (row_number != TIMER_NONE) /* if successfull **/
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    83
	{
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    84
		TIMEVAL real_timer_value;
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    85
		TIMEVAL elapsed_time;
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    86
		
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    87
		if (row_number == last_timer_raw + 1) last_timer_raw++;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    88
		
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    89
		/* 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
    90
		real_timer_value = min_val(value, TIMEVAL_MAX);
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
    91
		elapsed_time = getElapsedTime();
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    92
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    93
		/*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
    94
		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
    95
		{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    96
			total_sleep_time = elapsed_time + real_timer_value;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    97
			setTimer(real_timer_value);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
    98
		}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
    99
		/*printf("SetAlarm() return %d\n", row_number); */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   100
		return row_number;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   101
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   102
	return TIMER_NONE;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   103
}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   104
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   105
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   106
**  -----  Use this to remove an alarm ----                                                                                             
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   107
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   108
** @param handle                                                                                   
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   109
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   110
** @return                                                                                         
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   111
**/  
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   112
TIMER_HANDLE DelAlarm(TIMER_HANDLE handle)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   113
{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   114
	/* 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
   115
	MSG_WAR(0x3320, "DelAlarm. handle = ", handle);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   116
	if(handle != TIMER_NONE)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   117
	{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   118
		if(handle == last_timer_raw) 
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   119
			last_timer_raw--;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   120
		timers[handle].state = TIMER_FREE; 		
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   121
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   122
	else {
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   123
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   124
	return TIMER_NONE;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   125
}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   126
208
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   127
/*!                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   128
** ------  TimeDispatch is called on each timer expiration ----                                                                                                
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   129
**                                                                                                 
05d95c45b388 Manual convertion -> latex -> pdf
nico
parents: 167
diff changeset
   130
**/  
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   131
void TimeDispatch()
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   132
{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   133
	TIMER_HANDLE i;
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   134
	TIMEVAL next_wakeup = TIMEVAL_MAX; /* used to compute when should normaly occur next wakeup */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   135
	/* First run : change timer state depending on time */
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   136
	/* Get time since timer signal */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   137
	TIMEVAL overrun = getElapsedTime();
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   138
	
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   139
	TIMEVAL real_total_sleep_time = total_sleep_time + overrun;
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
   140
	/*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
   141
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   142
	for(i=0; i <= last_timer_raw; i++)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   143
	{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   144
		s_timer_entry *row = (timers+i);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   145
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   146
		if (row->state & TIMER_ARMED) /* if row is active */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   147
		{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   148
			if (row->val <= real_total_sleep_time) /* to be trigged */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   149
			{
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
   150
				/*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
   151
				if (!row->interval) /* if simply outdated */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   152
				{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   153
					row->state = TIMER_TRIG; /* ask for trig */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   154
				}
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   155
				else /* or period have expired */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   156
				{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   157
					/* set val as interval, with overrun correction */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   158
					row->val = row->interval - (overrun % row->interval);
71
95cd3376cc9f compilator compatitibility
frdupin
parents: 48
diff changeset
   159
					row->state = TIMER_TRIG_PERIOD; /* ask for trig, periodic */
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   160
					/* Check if this new timer value is the soonest */
167
b2f8b91d89b5 Removed compilation warnings with some GCC.
etisserant
parents: 149
diff changeset
   161
					next_wakeup = min_val(row->val,next_wakeup);
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   162
				}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   163
			}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   164
			else
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   165
			{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   166
				/* Each armed timer value in decremented. */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   167
				row->val -= real_total_sleep_time;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   168
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   169
				/* Check if this new timer value is the soonest */
167
b2f8b91d89b5 Removed compilation warnings with some GCC.
etisserant
parents: 149
diff changeset
   170
				next_wakeup = min_val(row->val,next_wakeup);
38
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
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   174
	
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   175
	/* Remember how much time we should sleep. */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   176
	total_sleep_time = next_wakeup;
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   177
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   178
	/* Set timer to soonest occurence */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   179
	setTimer(next_wakeup);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   180
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   181
	/* Then trig them or not. */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   182
	for(i=0; i<=last_timer_raw; i++)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   183
	{
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   184
		s_timer_entry *row = (timers+i);
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   185
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   186
		if (row->state & TIMER_TRIG)
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   187
		{
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   188
			row->state &= ~TIMER_TRIG; /* reset trig state (will be free if not periodic) */
149
fe50ada8020b Changes in the API:
etisserant
parents: 71
diff changeset
   189
			if(row->callback)
215
f49e5a6b7804 Manual and Documentation finish
nico
parents: 208
diff changeset
   190
				(*row->callback)(row->d, row->id); /* trig ! */
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   191
		}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   192
	}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   193
}
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 0
diff changeset
   194