drivers/timers_unix/timers_unix.c
changeset 0 4472ee7c6c3e
child 32 8afa33692372
equal deleted inserted replaced
-1:000000000000 0:4472ee7c6c3e
       
     1 #include <stdlib.h>
       
     2 
       
     3 #include <sys/time.h>
       
     4 #include <signal.h>
       
     5 #include <pthread.h> 
       
     6 
       
     7 #include "applicfg.h"
       
     8 #include "can_driver.h"
       
     9 #include "timer.h"
       
    10 
       
    11 pthread_mutex_t CanFestival_mutex = PTHREAD_MUTEX_INITIALIZER;
       
    12 
       
    13 TIMEVAL last_time_set = TIMEVAL_MAX;
       
    14 
       
    15 struct timeval last_sig;
       
    16 
       
    17 char stop_timer=0;
       
    18 
       
    19 void sig(int val)
       
    20 {
       
    21 	signal( SIGALRM, sig);
       
    22 	gettimeofday(&last_sig,NULL);
       
    23 //	printf("getCurrentTime() return=%u\n", p.tv_usec);
       
    24 }
       
    25 
       
    26 void initTimer(void)
       
    27 {
       
    28 	gettimeofday(&last_sig,NULL);
       
    29 	signal( SIGALRM, sig);
       
    30 	stop_timer = 0;
       
    31 }
       
    32 
       
    33 void stopTimer(void)
       
    34 {
       
    35 	stop_timer = 1;
       
    36 	kill(0, SIGALRM);	
       
    37 }
       
    38 
       
    39 void EnterMutex(void)
       
    40 {
       
    41 	pthread_mutex_lock(&CanFestival_mutex); 
       
    42 }
       
    43 
       
    44 void LeaveMutex(void)
       
    45 {
       
    46 	pthread_mutex_unlock(&CanFestival_mutex);
       
    47 }
       
    48 
       
    49 void TimerLoop(TimerCallback_t init_callback)
       
    50 {
       
    51 	initTimer();
       
    52 	// At first, TimeDispatch will call init_callback.
       
    53 	SetAlarm(NULL, 0, init_callback, 0, 0);
       
    54 	while (!stop_timer) {
       
    55 		EnterMutex();
       
    56 		TimeDispatch();
       
    57 		LeaveMutex();
       
    58 		pause();
       
    59 	}
       
    60 }
       
    61 
       
    62 void ReceiveLoop(void* arg)
       
    63 {
       
    64 	canReceiveLoop((CAN_HANDLE)arg);
       
    65 }
       
    66 
       
    67 void CreateReceiveTask(CAN_HANDLE fd0, TASK_HANDLE* Thread)
       
    68 {
       
    69 	pthread_create(Thread, NULL, (void *)&ReceiveLoop, (void*)fd0);
       
    70 }
       
    71 
       
    72 void WaitReceiveTaskEnd(TASK_HANDLE Thread)
       
    73 {
       
    74 	pthread_join(Thread, NULL);
       
    75 }
       
    76 
       
    77 #define max(a,b) a>b?a:b
       
    78 void setTimer(TIMEVAL value)
       
    79 {
       
    80 //	printf("setTimer(TIMEVAL value=%d)\n", value);
       
    81 	struct itimerval timerValues;
       
    82 	struct itimerval timerV = {{0,0},{0,0}};
       
    83 	timerValues.it_value.tv_sec = 0;
       
    84 	timerValues.it_value.tv_usec = max(value,1);
       
    85 	timerValues.it_interval.tv_sec = 0;
       
    86 	timerValues.it_interval.tv_usec = 0;
       
    87 	setitimer(ITIMER_REAL, &timerValues, &timerV);
       
    88 }
       
    89 
       
    90 TIMEVAL getElapsedTime(void)
       
    91 {
       
    92 	struct timeval p;
       
    93 	gettimeofday(&p,NULL);
       
    94 //	printf("getCurrentTime() return=%u\n", p.tv_usec);
       
    95 	return (p.tv_sec - last_sig.tv_sec)* 1000000 + p.tv_usec - last_sig.tv_usec;
       
    96 }