1 // -----------------------------------------------------------------------
2 // Copyright (C) 2006 - 2007 FRESCOR consortium partners:
4 // Universidad de Cantabria, SPAIN
5 // University of York, UK
6 // Scuola Superiore Sant'Anna, ITALY
7 // Kaiserslautern University, GERMANY
8 // Univ. Politécnica Valencia, SPAIN
9 // Czech Technical University in Prague, CZECH REPUBLIC
11 // Thales Communication S.A. FRANCE
12 // Visual Tools S.A. SPAIN
13 // Rapita Systems Ltd UK
16 // See http://www.frescor.org for a link to partners' websites
18 // FRESCOR project (FP6/2005/IST/5-034026) is funded
19 // in part by the European Union Sixth Framework Programme
20 // The European Union is not liable of any use that may be
24 // based on previous work (FSF) done in the FIRST project
26 // Copyright (C) 2005 Mälardalen University, SWEDEN
27 // Scuola Superiore S.Anna, ITALY
28 // Universidad de Cantabria, SPAIN
29 // University of York, UK
31 // FSF API web pages: http://marte.unican.es/fsf/docs
32 // http://shark.sssup.it/contrib/first/docs/
34 // This file is part of FRSH API
36 // FRSH API is free software; you can redistribute it and/or modify
37 // it under the terms of the GNU General Public License as published by
38 // the Free Software Foundation; either version 2, or (at your option)
41 // FRSH API is distributed in the hope that it will be useful, but
42 // WITHOUT ANY WARRANTY; without even the implied warranty of
43 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
44 // General Public License for more details.
46 // You should have received a copy of the GNU General Public License
47 // distributed with FRSH API; see file COPYING. If not, write to the
48 // Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
51 // As a special exception, if you include this header file into source
52 // files to be compiled, this header file does not by itself cause
53 // the resulting executable to be covered by the GNU General Public
54 // License. This exception does not however invalidate any other
55 // reasons why the executable file might be covered by the GNU General
57 // -----------------------------------------------------------------------
58 /*-----------------------------------------------------------------------
61 * 't i m e s p e c _ o p e r a t i o n s'
65 * File 'timespec_operations.h' by MAR.
66 * (july 2002) transformed into macros by Jul.
67 * Some basic operations with the type 'timespec'.
69 * ----------------------------------------------------------------------
70 * Copyright (C) 2001 Universidad de Cantabria, SPAIN
72 * Authors: Mario Aldea Rivas aldeam@ctr.unican.es
73 * Michael Gonzalez Harbour mgh@ctr.unican.es
75 * MaRTE OS is free software; you can redistribute it and/or modify it
76 * under the terms of the GNU General Public License as published by the
77 * Free Software Foundation; either version 2, or (at your option) any
80 * MaRTE OS is distributed in the hope that it will be useful, but
81 * WITHOUT ANY WARRANTY; without even the implied warranty of
82 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
83 * General Public License for more details.
85 * You should have received a copy of the GNU General Public License
86 * distributed with MaRTE OS; see file COPYING. If not, write to the
87 * Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
90 * As a special exception, if you link this unit with other files to
91 * produce an executable, this unit does not by itself cause the
92 * resulting executable to be covered by the GNU General Public License.
93 * This exception does not however invalidate any other reasons why the
94 * executable file might be covered by the GNU Public License.
96 *---------------------------------------------------------------------------*/
97 // 16-Jul-2007 SANGORRIN corrections to msec_addto_timespec and msec2timespec
98 // 23-Jul-2007 SANGORRIN moved t2d and d2t from frsh_time_operations
99 // (TODO: test for __ALL__ the functions)
100 // -----------------------------------------------------------------------
102 #ifndef _MARTE_MISC_TIMESPEC_OPERATIONS_H_
103 #define _MARTE_MISC_TIMESPEC_OPERATIONS_H_
106 * @file timespec_operations.h
109 #include <time.h> // for timespec
110 #include <string.h> // for memset
114 #define smaller_timespec(t1, t2) \
116 (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec && \
117 (t1)->tv_nsec < (t2)->tv_nsec) \
120 #define smaller_or_equal_timespec(t1, t2) \
122 (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec && \
123 (t1)->tv_nsec <= (t2)->tv_nsec) \
126 #define incr_timespec(t1, t2) \
128 (t1)->tv_sec += (t2)->tv_sec; \
129 (t1)->tv_nsec += (t2)->tv_nsec; \
130 if ((t1)->tv_nsec >= 1000000000) { \
132 (t1)->tv_nsec -= 1000000000; \
136 #define decr_timespec(t1, t2) \
138 if ((t1)->tv_nsec < (t2)->tv_nsec) { \
139 (t1)->tv_sec -= (t2)->tv_sec + 1; \
140 (t1)->tv_nsec = (t1)->tv_nsec + 1000000000 - (t2)->tv_nsec; \
142 (t1)->tv_sec -= (t2)->tv_sec; \
143 (t1)->tv_nsec -= (t2)->tv_nsec; \
147 #define add_timespec( sum , t1 , t2 ) \
149 (sum)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \
150 (sum)->tv_nsec = (t1)->tv_nsec + (t2)->tv_nsec; \
151 if ((sum)->tv_nsec >= 1000000000) { \
153 (sum)->tv_nsec -= 1000000000; \
157 #define float_to_timespec( f1 , t1 ) \
159 (t1)->tv_sec = (int)(f1), \
160 (t1)->tv_nsec = (int)(((f1)-(float)((t1)->tv_sec))*1000000000.0), \
164 #define float_to_timespec_value(f1, t1) \
166 (t1).tv_sec = (int)(f1), \
167 (t1).tv_nsec = (int)(((f1)-(float)((t1).tv_sec))*1000000000.0), \
175 static inline struct timespec msec2timespec(long msec)
177 struct timespec result = {-1, -1};
180 result.tv_sec = msec/1000;
181 result.tv_nsec = (msec % 1000) * 1000000;
184 result.tv_nsec = msec * 1000000;
190 static inline long timespec2msec(const struct timespec *timespec)
193 return (timespec->tv_sec % 2147482) * 1000 + timespec->tv_nsec/1000000;
197 #define HOURS_IN_MSECS 3600000
198 #define MINUTES_IN_MSECS 60000
200 #define HOURS_IN_TS 1000000
201 #define MINUTES_IN_TS 100000
203 static inline long timespec2msects(const struct timespec *timespec)
205 long msec_total = -1;
209 long remainder_msecs = -1;
212 msec_total = (timespec->tv_sec % 2147482) * 1000 + timespec->tv_nsec/1000000;
214 hours = msec_total / HOURS_IN_MSECS;
215 minutes = (msec_total % HOURS_IN_MSECS) / MINUTES_IN_MSECS;
216 remainder_msecs = ( (msec_total % HOURS_IN_MSECS) % MINUTES_IN_MSECS);
218 timestamp = hours*HOURS_IN_TS + minutes*MINUTES_IN_TS + remainder_msecs;
224 //------------------------//
225 // timespec_lessthan_msec //
226 //------------------------//
228 static inline int timespec_lessthan_msec(struct timespec *timespec, long msec)
230 struct timespec msec_timespec = {0, 0};
232 msec_timespec = msec2timespec(msec);
233 return smaller_timespec(timespec, &msec_timespec);
236 //---------------------//
237 // msec_addto_timespec //
238 //---------------------//
240 static inline void msec_addto_timespec(long msec, struct timespec *timespec)
242 struct timespec msec_timespec = {0, 0};
244 msec_timespec = msec2timespec(msec);
245 incr_timespec(timespec, &msec_timespec);
248 //--------------------------//
249 // t2d (timespec to double) //
250 //--------------------------//
252 static inline double t2d(struct timespec time)
254 return time.tv_nsec*0.000000001 + (double)time.tv_sec;
257 //--------------------------//
258 // d2t (double to timespec) //
259 //--------------------------//
261 static inline struct timespec d2t(double time)
265 tmp.tv_sec = (long) time;
266 tmp.tv_nsec = (long)((time - (double)tmp.tv_sec) * 1000000000);
273 #endif /* _MARTE_MISC_TIMESPEC_OPERATIONS_H_ */