ESP8266 ILI9341 display support code with printf sources, wire-frame viewer and custom fonts  1.0
ESP8266ILI9341DisplayProject
timer.c
Go to the documentation of this file.
1 
25 #include "user_config.h"
26 
27 #ifdef AVR
28 #include <stdlib.h>
29 #define HAVE_HIRES_TIMER /*< We can read a high resolution hardware timer */
30 #endif
31 
32 #include "printf/mathio.h"
33 
34 #include "lib/time.h"
35 #include "lib/timer.h"
36 
38 volatile ts_t __clock;
39 
42 
43 static int timers_enabled = 0;
44 static int timers_configured = 0;
45 
48 
49 
60 int set_timers(void (*handler)(void), int timer)
61 {
62  int i;
63  int ret = -1;
64 
65  if(!handler)
66  return -1;
67 
68  for(i=0;i<MAX_TIMER_CNT;++i)
69  {
70 
71  // already assigned
72  if(timer_irq[i].user_timer_handler == handler)
73  ret = i;
74 
75  if(!timer_irq[i].user_timer_handler)
76  {
77  timer_irq[i].timer = 0; // Set to disable
78  timer_irq[i].user_timer_handler = handler;
79  timer_irq[i].timer = 1; // Set if enabled, 0 if not
80  ret = i;
81  break;
82  }
83  }
84  if(ret == -1)
85  printf("set_timers: No more timers!\n");
86 
87  return(ret);
88 }
89 
90 
100 int kill_timer( int timer )
101 {
102  int ret = -1;
103  if(timer >= 0 && timer <= MAX_TIMER_CNT)
104  {
105  timer_irq[timer].timer = 0; // Disable
106  timer_irq[timer].user_timer_handler = 0;
107  ret = timer;
108  }
109  return(ret);
110 }
111 
112 
116 MEMSPACE
118 {
119  int i;
120  for(i=0; i < MAX_TIMER_CNT; i++)
121  {
122  timer_irq[i].timer = 0; // Disable
123  timer_irq[i].user_timer_handler = 0;
124  }
125 }
126 
127 
134 MEMSPACE
136 {
137  a->tv_nsec = a->tv_nsec - b->tv_nsec;
138  if (a->tv_nsec < 0L)
139  {
140  a->tv_nsec += 1000000000L;
141  a->tv_sec --;
142  }
143  a->tv_sec = a->tv_sec - b->tv_sec;
144 }
145 
146 
153 static char _ts_to_str[32];
154 MEMSPACE
155 char * ts_to_str(ts_t *val)
156 {
157  snprintf(_ts_to_str,31,"%ld.%09ld", val->tv_sec, val->tv_nsec);
158  return( _ts_to_str );
159 }
160 
166 MEMSPACE
167 void display_ts(ts_t *val)
168 {
169  printf("[Seconds: %s]\n", ts_to_str(val) );
170 }
171 
172 
177 
183 MEMSPACE
185 {
186  clock_gettime(0, (ts_t *) &__clock_elapsed);
187 }
188 
189 
199 MEMSPACE
200 void clock_elapsed_end(char *msg)
201 {
202  ts_t current;
203 
204  clock_gettime(0, (ts_t *) &current);
205 
206  subtract_timespec((ts_t *) &current, (ts_t *) &__clock_elapsed);
207 
208  if(msg && *msg)
209  printf("[%s Time:%s]\n", msg, ts_to_str((ts_t *) &current) );
210  else
211  printf("[Time:%s]\n", ts_to_str((ts_t *) &current) );
212 }
213 
220 MEMSPACE
222 {
223  struct timespec ts;
224  ts.tv_nsec = 0;
225  ts.tv_sec = 0;
226  clock_settime(0, &ts);
227  __tzone.tz_minuteswest = 0;
228  __tzone.tz_dsttime = 0;
229 }
230 
234 MEMSPACE
236 {
238  {
240  timers_enabled = 0;
241  }
242 }
243 
247 MEMSPACE
249 {
251  {
253  timers_enabled = 1;
254  }
255 }
256 
262 {
263  int i;
264 
265  for(i=0; i < MAX_TIMER_CNT; i++)
266  {
267  if(timer_irq[i].timer && timer_irq[i].user_timer_handler != NULL)
268  (*timer_irq[i].user_timer_handler)();
269  }
270 }
271 
276 void clock_task(void)
277 {
278  __clock.tv_nsec += 1000000;
279  if(__clock.tv_nsec >= 1000000000L)
280  {
281  __clock.tv_sec++;
282  __clock.tv_nsec = 0;
283  }
284 }
285 
290 //
292 MEMSPACE
294 {
295  printf("Timers init called\n");
296 
297  if(!timers_configured)
298  {
300  timers_configured = 1;
301  timers_enabled = 0;
302  printf("Timers configured\n");
303  }
304 
306 
307  clock_clear();
308  printf("Clock Init\n");
309 
311  if(set_timers(clock_task,1) == -1)
312  printf("Clock task init failed\n");
313  printf("Clock Installed\n");
314 
315  enable_timers();
316 
317  printf("Timers enabled\n");
318 }
319 
320 
328 MEMSPACE
329 int clock_getres(clockid_t clk_id, struct timespec *res)
330 {
331  res->tv_sec = 0;
333  return(0);
334 }
335 
336 
344 MEMSPACE
345 int clock_settime(clockid_t clk_id, const struct timespec *ts)
346 {
347  if(clk_id)
348  return(-1);
349 
350  while(1)
351  {
352  __clock.tv_nsec = ts->tv_nsec;
353  __clock.tv_sec = ts->tv_sec;
354 
355  if(ts->tv_nsec != __clock.tv_nsec || ts->tv_sec != __clock.tv_sec)
356  continue;
357  break;
358  }
359 
360  return(0);
361 }
362 
363 #if ! defined(HAVE_HIRES_TIMER)
364 
375 //TODO try to use system_get_time() to get microsecond offsets
376 MEMSPACE
377 int clock_gettime(clockid_t clk_id, struct timespec *ts)
378 {
379  ts->tv_nsec = 0;
380  ts->tv_sec = 0;
381 
382  while(1)
383  {
384  ts->tv_nsec = __clock.tv_nsec;
385  ts->tv_sec = __clock.tv_sec;
386  if(ts->tv_nsec != __clock.tv_nsec || ts->tv_sec != __clock.tv_sec)
387  continue;
388  break;
389  }
390  return(0);
391 }
392 
393 #endif
int tz_dsttime
Definition: time.h:81
uint8_t timer
Definition: timer.h:38
TIMERS timer_irq[MAX_TIMER_CNT]
array or user timers
Definition: timer.c:47
void execute_timers()
Execute all user timers at SYSTEM_HZ rate. Called by system task.
Definition: timer.c:261
Master include file for project Includes all project includes and defines here.
MEMSPACE void display_ts(ts_t *val)
timespec structure in seconds.nanoseconds.
Definition: timer.c:167
Common Linux/POSIX time functions.
MEMSPACE void install_timers_isr(void)
MEMSPACE int kill_timer(int timer)
Delete "Kill" one user timer task.
Definition: timer.c:100
uint16_t clockid_t
type of clockid_t.
Definition: time.h:38
void clock_task(void)
1000HZ timer task
Definition: timer.c:276
MEMSPACE void clock_elapsed_begin()
Store current struct timespec in __clock_elapsed.
Definition: timer.c:184
MEMSPACE int set_timers(void(*handler)(void), int timer)
Install a user timer task.
Definition: timer.c:60
MEMSPACE void delete_all_timers()
Clear ALL user timer tasks.
Definition: timer.c:117
time_t tv_sec
Definition: time.h:90
timer functions
#define snprintf(s, size, format, args...)
Definition: cpu.h:81
void(* user_timer_handler)(void)
Definition: timer.h:37
static int timers_enabled
Definition: timer.c:43
MEMSPACE void clock_clear()
clear time and timezone to 0.
Definition: timer.c:221
#define SYSTEM_TASK_TIC_NS
System task in HZ.
Definition: timer.h:47
MEMSPACE int clock_settime(clockid_t clk_id, const struct timespec *ts)
Set system clock using seconds and nonoseconds - POSIX function.
Definition: timer.c:345
MEMSPACE void disable_timers()
Disable all timer tasks.
Definition: timer.c:235
long tv_nsec
Definition: time.h:91
#define NULL
Definition: cpu.h:55
static char _ts_to_str[32]
timespec structure in seconds.nanoseconds in string.
Definition: timer.c:153
static int timers_configured
Definition: timer.c:44
Math IO functions, and verious conversion code with floating point support.
volatile ts_t __clock
System Clock Time.
Definition: timer.c:38
MEMSPACE void enable_system_task(void)
MEMSPACE void clock_elapsed_end(char *msg)
Subtract and display time difference from clock_elapesed_begin().
Definition: timer.c:200
MEMSPACE char * ts_to_str(ts_t *val)
Definition: timer.c:155
#define MEMSPACE
Definition: cpu.h:25
static ts_t __clock_elapsed
Used for elapsed time calculations.
Definition: timer.c:176
MEMSPACE int printf(const char *format,...)
MEMSPACE void init_timers()
Setup all timers tasksi and enable interrupts.
Definition: timer.c:293
user timer struct
Definition: timer.h:35
POSIX timespec.
Definition: time.h:88
#define L(x)
Definition: cal_dex.c:54
MEMSPACE void disable_system_task(void)
tz_t __tzone
System Time Zone.
Definition: timer.c:41
MEMSPACE void subtract_timespec(ts_t *a, ts_t *b)
subtract a-= b timespec * structures.
Definition: timer.c:135
#define MAX_TIMER_CNT
Number of user timer tasks.
Definition: timer.h:29
MEMSPACE int clock_getres(clockid_t clk_id, struct timespec *res)
Read clock time resolution into struct timepec *ts - POSIX function.
Definition: timer.c:329
POSIX timezone.
Definition: time.h:78
MEMSPACE int clock_gettime(clockid_t clk_id, struct timespec *ts)
Generic clock_gettime() function WITHOUT high resolution.
Definition: timer.c:377
int tz_minuteswest
Definition: time.h:80
MEMSPACE void enable_timers()
Enable timer tasks.
Definition: timer.c:248