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
112 #define smaller_timespec(t1, t2) \
114 (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec && \
115 (t1)->tv_nsec < (t2)->tv_nsec) \
118 #define smaller_or_equal_timespec(t1, t2) \
120 (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec && \
121 (t1)->tv_nsec <= (t2)->tv_nsec) \
124 #define incr_timespec(t1, t2) \
126 (t1)->tv_sec += (t2)->tv_sec; \
127 (t1)->tv_nsec += (t2)->tv_nsec; \
128 if ((t1)->tv_nsec >= 1000000000) { \
130 (t1)->tv_nsec -= 1000000000; \
134 #define decr_timespec(t1, t2) \
136 if ((t1)->tv_nsec < (t2)->tv_nsec) { \
137 (t1)->tv_sec -= (t2)->tv_sec + 1; \
138 (t1)->tv_nsec = (t1)->tv_nsec + 1000000000 - (t2)->tv_nsec; \
140 (t1)->tv_sec -= (t2)->tv_sec; \
141 (t1)->tv_nsec -= (t2)->tv_nsec; \
145 #define add_timespec( sum , t1 , t2 ) \
147 (sum)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \
148 (sum)->tv_nsec = (t1)->tv_nsec + (t2)->tv_nsec; \
149 if ((sum)->tv_nsec >= 1000000000) { \
151 (sum)->tv_nsec -= 1000000000; \
155 #define float_to_timespec( f1 , t1 ) \
157 (t1)->tv_sec = (int)(f1), \
158 (t1)->tv_nsec = (int)(((f1)-(float)((t1)->tv_sec))*1000000000.0), \
162 #define float_to_timespec_value(f1, t1) \
164 (t1).tv_sec = (int)(f1), \
165 (t1).tv_nsec = (int)(((f1)-(float)((t1).tv_sec))*1000000000.0), \
173 static inline struct timespec msec2timespec(long msec)
175 struct timespec result = {-1, -1};
178 result.tv_sec = msec/1000;
179 result.tv_nsec = (msec % 1000) * 1000000;
182 result.tv_nsec = msec * 1000000;
188 static inline long timespec2msec(const struct timespec *timespec)
191 return (timespec->tv_sec % 2147482) * 1000 + timespec->tv_nsec/1000000;
195 #define HOURS_IN_MSECS 3600000
196 #define MINUTES_IN_MSECS 60000
198 #define HOURS_IN_TS 1000000
199 #define MINUTES_IN_TS 100000
201 static inline long timespec2msects(const struct timespec *timespec)
203 long msec_total = -1;
207 long remainder_msecs = -1;
210 msec_total = (timespec->tv_sec % 2147482) * 1000 + timespec->tv_nsec/1000000;
212 hours = msec_total / HOURS_IN_MSECS;
213 minutes = (msec_total % HOURS_IN_MSECS) / MINUTES_IN_MSECS;
214 remainder_msecs = ( (msec_total % HOURS_IN_MSECS) % MINUTES_IN_MSECS);
216 timestamp = hours*HOURS_IN_TS + minutes*MINUTES_IN_TS + remainder_msecs;
222 //------------------------//
223 // timespec_lessthan_msec //
224 //------------------------//
226 static inline int timespec_lessthan_msec(struct timespec *timespec, long msec)
228 struct timespec msec_timespec = {0, 0};
230 msec_timespec = msec2timespec(msec);
231 return smaller_timespec(timespec, &msec_timespec);
234 //---------------------//
235 // msec_addto_timespec //
236 //---------------------//
238 static inline void msec_addto_timespec(long msec, struct timespec *timespec)
240 struct timespec msec_timespec = {0, 0};
242 msec_timespec = msec2timespec(msec);
243 incr_timespec(timespec, &msec_timespec);
246 //--------------------------//
247 // t2d (timespec to double) //
248 //--------------------------//
250 static inline double t2d(struct timespec time)
252 return time.tv_nsec*0.000000001 + (double)time.tv_sec;
255 //--------------------------//
256 // d2t (double to timespec) //
257 //--------------------------//
259 static inline struct timespec d2t(double time)
263 tmp.tv_sec = (long) time;
264 tmp.tv_nsec = (long)((time - (double)tmp.tv_sec) * 1000000000);
269 #endif /* _MARTE_MISC_TIMESPEC_OPERATIONS_H_ */