Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
sys_time.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (C) 2009-2011 The Paparazzi Team
4  *
5  * This file is part of paparazzi.
6  *
7  * paparazzi is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * paparazzi is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with paparazzi; see the file COPYING. If not, write to
19  * the Free Software Foundation, 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  *
22  */
23 
30 #ifndef SYS_TIME_H
31 #define SYS_TIME_H
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 #include <inttypes.h>
38 #include <stdlib.h>
39 #include "std.h"
40 
41 #include BOARD_CONFIG
42 
43 #ifndef SYS_TIME_NB_TIMER
44 #define SYS_TIME_NB_TIMER 16
45 #endif
46 
47 
52 #ifndef SYS_TIME_FREQUENCY
53 #if defined PERIODIC_FREQUENCY
54 #define SYS_TIME_FREQUENCY (2 * PERIODIC_FREQUENCY)
55 #else /* !defined PERIODIC_FREQUENCY */
56 #define SYS_TIME_FREQUENCY 1000
57 #endif
58 #endif
59 
60 typedef int8_t tid_t;
61 typedef void (*sys_time_cb)(uint8_t id);
62 
64  bool in_use;
66  volatile bool elapsed;
69 };
70 
71 struct sys_time {
72  volatile uint32_t nb_sec;
73  volatile uint32_t nb_sec_rem;
74  volatile uint32_t nb_tick;
76 
77  float resolution;
81 };
82 
83 extern struct sys_time sys_time;
84 
85 
86 extern void sys_time_init(void);
87 
94 extern tid_t sys_time_register_timer(float duration, sys_time_cb cb);
95 
104 
109 extern void sys_time_cancel_timer(tid_t id);
110 
116 extern void sys_time_update_timer(tid_t id, float duration);
117 
123 static inline bool sys_time_check_and_ack_timer(tid_t id)
124 {
125  if ((id < SYS_TIME_NB_TIMER) && (id >= 0)) {
126  if (sys_time.timer[id].elapsed) {
127  sys_time.timer[id].elapsed = false;
128  return true;
129  }
130  }
131  return false;
132 }
133 
138 static inline float get_sys_time_float(void)
139 {
140  return (float)(sys_time.nb_sec + (float)(sys_time.nb_sec_rem) / sys_time.cpu_ticks_per_sec);
141 }
142 
143 
144 /*
145  * Convenience functions to convert between seconds and sys_time ticks.
146  */
147 static inline uint32_t sys_time_ticks_of_sec(float seconds)
148 {
149  return (uint32_t)(seconds * sys_time.ticks_per_sec + 0.5);
150 }
151 
153 {
154  return msec * sys_time.ticks_per_sec / 1000;
155 }
156 
158 {
159  return usec * sys_time.ticks_per_sec / 1000000;
160 }
161 
163 {
164  return (float)ticks * sys_time.resolution;
165 }
166 
168 {
169  return ticks * 1000 / sys_time.ticks_per_sec;
170 }
171 
173 {
174  return ticks * 1000 / sys_time.ticks_per_sec * 1000;
175 }
176 
177 
178 
179 /*
180  * Convenience functions to convert between seconds and CPU ticks.
181  */
182 static inline uint32_t cpu_ticks_of_sec(float seconds)
183 {
184  return (uint32_t)(seconds * sys_time.cpu_ticks_per_sec + 0.5);
185 }
186 
188 {
189  return usec * (sys_time.cpu_ticks_per_sec / 1000000);
190 }
191 
193 {
194  return usec * ((int32_t)sys_time.cpu_ticks_per_sec / 1000000);
195 }
196 
198 {
199  return nsec * (sys_time.cpu_ticks_per_sec / 1000000) / 1000;
200 }
201 
203 {
204  return cpu_ticks / (sys_time.cpu_ticks_per_sec / 1000);
205 }
206 
208 {
209  return cpu_ticks / (sys_time.cpu_ticks_per_sec / 1000000);
210 }
211 
213 {
214  return cpu_ticks / (sys_time.cpu_ticks_per_sec / 1000000) / 1000;
215 }
216 
217 
218 
219 #define USEC_OF_SEC(sec) ((sec) * 1e6)
220 
221 #include "mcu_periph/sys_time_arch.h"
222 
223 /* architecture specific init implementation */
224 extern void sys_time_arch_init(void);
225 
226 /* Generic timer macros */
227 #define SysTimeTimerStart(_t) { _t = get_sys_time_usec(); }
228 #define SysTimeTimer(_t) ( get_sys_time_usec() - (_t))
229 #define SysTimeTimerStop(_t) { _t = ( get_sys_time_usec() - (_t)); }
230 
231 #ifdef __cplusplus
232 }
233 #endif
234 
235 #endif /* SYS_TIME_H */
static uint32_t cpu_ticks
Definition: sys_time_arch.c:49
static const float offset[]
int ticks
Definition: gps_sirf.c:193
volatile uint32_t nb_tick
SYS_TIME_TICKS since startup.
Definition: sys_time.h:74
static uint32_t msec_of_cpu_ticks(uint32_t cpu_ticks)
Definition: sys_time.h:202
uint32_t ticks_per_sec
sys_time ticks per second (SYS_TIME_FREQUENCY)
Definition: sys_time.h:78
void sys_time_init(void)
Definition: sys_time.c:119
static uint32_t nsec_of_cpu_ticks(uint32_t cpu_ticks)
Definition: sys_time.h:212
static uint32_t sys_time_ticks_of_sec(float seconds)
Definition: sys_time.h:147
void sys_time_update_timer(tid_t id, float duration)
Update the duration until a timer elapses.
Definition: sys_time.c:86
volatile uint32_t nb_sec
full seconds since startup
Definition: sys_time.h:72
tid_t sys_time_register_timer(float duration, sys_time_cb cb)
Register a new system timer.
Definition: sys_time.c:43
void(* sys_time_cb)(uint8_t id)
Definition: sys_time.h:61
uint32_t cpu_ticks_per_sec
cpu ticks per second
Definition: sys_time.h:80
uint32_t duration
in SYS_TIME_TICKS
Definition: sys_time.h:68
static uint32_t sys_time_ticks_of_usec(uint32_t usec)
Definition: sys_time.h:157
tid_t sys_time_register_timer_offset(tid_t timer, float offset, sys_time_cb cb)
Register a new system timer with an fixed offset from another one.
Definition: sys_time.c:59
static bool sys_time_check_and_ack_timer(tid_t id)
Check if timer has elapsed.
Definition: sys_time.h:123
uint32_t resolution_cpu_ticks
sys_time_timer resolution in cpu ticks
Definition: sys_time.h:79
volatile uint32_t nb_sec_rem
remainder of seconds since startup in CPU_TICKS
Definition: sys_time.h:73
float resolution
sys_time_timer resolution in seconds
Definition: sys_time.h:77
static uint32_t cpu_ticks_of_usec(uint32_t usec)
Definition: sys_time.h:187
void sys_time_arch_init(void)
Initialize SysTick.
Definition: sys_time_arch.c:52
sys_time_cb cb
Definition: sys_time.h:65
#define SYS_TIME_NB_TIMER
Definition: sys_time.h:44
static uint32_t msec_of_sys_time_ticks(uint32_t ticks)
Definition: sys_time.h:167
static uint32_t cpu_ticks_of_nsec(uint32_t nsec)
Definition: sys_time.h:197
static uint32_t sys_time_ticks_of_msec(uint32_t msec)
Definition: sys_time.h:152
uint32_t end_time
in SYS_TIME_TICKS
Definition: sys_time.h:67
void sys_time_cancel_timer(tid_t id)
Cancel a system timer by id.
Definition: sys_time.c:76
static uint32_t cpu_ticks_of_sec(float seconds)
Definition: sys_time.h:182
struct sys_time_timer timer[SYS_TIME_NB_TIMER]
Definition: sys_time.h:75
static uint32_t usec_of_cpu_ticks(uint32_t cpu_ticks)
Definition: sys_time.h:207
static float sec_of_sys_time_ticks(uint32_t ticks)
Definition: sys_time.h:162
static uint32_t usec_of_sys_time_ticks(uint32_t ticks)
Definition: sys_time.h:172
volatile bool elapsed
Definition: sys_time.h:66
static float get_sys_time_float(void)
Get the time in seconds since startup.
Definition: sys_time.h:138
int8_t tid_t
sys_time timer id type
Definition: sys_time.h:60
static int32_t signed_cpu_ticks_of_usec(int32_t usec)
Definition: sys_time.h:192
int int32_t
Typedef defining 32 bit int type.
Definition: vl53l1_types.h:83
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
Definition: vl53l1_types.h:78
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98
signed char int8_t
Typedef defining 8 bit char type.
Definition: vl53l1_types.h:103