Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
Loading...
Searching...
No Matches
sys_time.c
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#include "mcu_periph/sys_time.h"
31#include "mcu.h"
32
33// check the number of timers against max tid_t value
34#include "limits.h"
35#if (SYS_TIME_NB_TIMER >= SCHAR_MAX)
36 WARNING("Too many sys timers (SYS_TIME_NB_TIMER >= SCHAR_MAX). Consider increasing the size of tid_d type (currently int8_t")
37#endif
38
40
42
44{
46 for (tid_t i = 0; i < SYS_TIME_NB_TIMER; i++) {
47 if (!sys_time.timer[i].in_use) {
48 sys_time.timer[i].cb = cb;
49 sys_time.timer[i].elapsed = false;
52 sys_time.timer[i].in_use = true;
53 return i;
54 }
55 }
56 return -1;
57}
58
60{
61 if (timer >=0 && timer < SYS_TIME_NB_TIMER) {
62 for (tid_t i = 0; i < SYS_TIME_NB_TIMER; i++) {
63 if (!sys_time.timer[i].in_use && (timer < i)) { // timer should be already registered
64 sys_time.timer[i].cb = cb;
65 sys_time.timer[i].elapsed = false;
66 sys_time.timer[i].end_time = sys_time.timer[timer].end_time + sys_time_ticks_of_sec(offset); // add offset to end time
67 sys_time.timer[i].duration = sys_time.timer[timer].duration; // copy duration
68 sys_time.timer[i].in_use = true;
69 return i;
70 }
71 }
72 }
73 return -1;
74}
75
77{
78 sys_time.timer[id].in_use = false;
79 sys_time.timer[id].cb = NULL;
80 sys_time.timer[id].elapsed = false;
81 sys_time.timer[id].end_time = 0;
82 sys_time.timer[id].duration = 0;
83}
84
85// FIXME: race condition ??
86void sys_time_update_timer(tid_t id, float duration)
87{
90}
91
92#if USE_SHELL
93#include "modules/core/shell.h"
94#include "printf.h"
95#include "string.h"
96
97static void cmd_sys_time(shell_stream_t *sh, int argc, const char * const argv[])
98{
99 (void) argv;
100 if (argc > 0) {
101 chprintf(sh, "Usage: sys_time\r\n");
102 return;
103 }
104
105 chprintf(sh, "Current sys_time\r\n");
106 chprintf(sh, " nb_sec: %lu\r\n", sys_time.nb_sec);
107 chprintf(sh, " nb_sec_rem: %lu\r\n", sys_time.nb_sec_rem);
108 chprintf(sh, " nb_tick: %lu\r\n", sys_time.nb_tick);
109 chprintf(sh, "Registered timers\r\n");
110 for (tid_t i = 0; i < SYS_TIME_NB_TIMER; i++) {
111 if (sys_time.timer[i].in_use) {
112 chprintf(sh, "id: %d, duration: %lu, end_time: %lu, cb: 0x%lx\r\n", i,
114 }
115 }
116}
117#endif
118
120{
121 sys_time.nb_sec = 0;
123 sys_time.nb_tick = 0;
124
127
128 for (unsigned int i = 0; i < SYS_TIME_NB_TIMER; i++) {
129 sys_time.timer[i].in_use = false;
130 sys_time.timer[i].cb = NULL;
131 sys_time.timer[i].elapsed = false;
132 sys_time.timer[i].end_time = 0;
133 sys_time.timer[i].duration = 0;
134 }
135
137
138#if USE_SHELL
139 shell_add_entry("sys_time", cmd_sys_time);
140#endif
141}
void sys_time_arch_init(void)
static const float offset[]
int start_time
Definition gps_sirf.c:192
void chprintf(BaseSequentialStream *lchp, const char *fmt,...)
Definition printf.c:395
uint16_t foo
Definition main_demo5.c:58
Arch independent mcu ( Micro Controller Unit ) utilities.
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
Mini printf-like functionality.
void shell_add_entry(char *cmd_name, shell_cmd_t *cmd)
Add dynamic entry.
Definition shell_arch.c:92
BaseSequentialStream shell_stream_t
Definition shell_arch.h:31
void sys_time_init(void)
Definition sys_time.c:119
void sys_time_update_timer(tid_t id, float duration)
Update the duration until a timer elapses.
Definition sys_time.c:86
tid_t sys_time_register_timer(float duration, sys_time_cb cb)
Register a new system timer.
Definition sys_time.c:43
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
void sys_time_cancel_timer(tid_t id)
Cancel a system timer by id.
Definition sys_time.c:76
Architecture independent timing functions.
volatile uint32_t nb_tick
SYS_TIME_TICKS since startup.
Definition sys_time.h:74
uint32_t ticks_per_sec
sys_time ticks per second (SYS_TIME_FREQUENCY)
Definition sys_time.h:78
#define SYS_TIME_FREQUENCY
(Default) sys_time timer frequency in Hz.
Definition sys_time.h:56
static uint32_t sys_time_ticks_of_sec(float seconds)
Definition sys_time.h:147
volatile uint32_t nb_sec
full seconds since startup
Definition sys_time.h:72
void(* sys_time_cb)(uint8_t id)
Definition sys_time.h:61
uint32_t duration
in SYS_TIME_TICKS
Definition sys_time.h:68
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
sys_time_cb cb
Definition sys_time.h:65
#define SYS_TIME_NB_TIMER
Definition sys_time.h:44
uint32_t end_time
in SYS_TIME_TICKS
Definition sys_time.h:67
struct sys_time_timer timer[SYS_TIME_NB_TIMER]
Definition sys_time.h:75
volatile bool elapsed
Definition sys_time.h:66
int8_t tid_t
sys_time timer id type
Definition sys_time.h:60
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.