nico@207: nico@207:
nico@207:00001 #include <stdlib.h> nico@207: 00002 nico@207: 00003 #include <sys/time.h> nico@207: 00004 #include <pthread.h> nico@207: 00005 #include <signal.h> nico@207: 00006 nico@207: 00007 #include "applicfg.h" nico@207: 00008 #include "timer.h" nico@207: 00009 nico@207: 00010 pthread_mutex_t CanFestival_mutex = PTHREAD_MUTEX_INITIALIZER; nico@207: 00011 nico@207: 00012 TASK_HANDLE TimerLoopThread; nico@207: 00013 nico@207: 00014 TIMEVAL last_time_set = TIMEVAL_MAX; nico@207: 00015 nico@207: 00016 struct timeval last_sig; nico@207: 00017 nico@207: 00018 timer_t timer; nico@207: 00019 nico@207: 00020 void EnterMutex(void) nico@207: 00021 { nico@207: 00022 pthread_mutex_lock(&CanFestival_mutex); nico@207: 00023 } nico@207: 00024 nico@207: 00025 void LeaveMutex(void) nico@207: 00026 { nico@207: 00027 pthread_mutex_unlock(&CanFestival_mutex); nico@207: 00028 } nico@207: 00029 nico@207: 00030 void timer_notify(sigval_t val) nico@207: 00031 { nico@207: 00032 gettimeofday(&last_sig,NULL); nico@207: 00033 EnterMutex(); nico@207: 00034 TimeDispatch(); nico@207: 00035 LeaveMutex(); nico@207: 00036 // printf("getCurrentTime() return=%u\n", p.tv_usec); nico@207: 00037 } nico@207: 00038 nico@207: 00039 void initTimer(void) nico@207: 00040 { nico@207: 00041 struct sigevent sigev; nico@207: 00042 nico@207: 00043 // Take first absolute time ref. nico@207: 00044 gettimeofday(&last_sig,NULL); nico@207: 00045 nico@207: 00046 memset (&sigev, 0, sizeof (struct sigevent)); nico@207: 00047 sigev.sigev_value.sival_int = 0; nico@207: 00048 sigev.sigev_notify = SIGEV_THREAD; nico@207: 00049 sigev.sigev_notify_attributes = NULL; nico@207: 00050 sigev.sigev_notify_function = timer_notify; nico@207: 00051 nico@207: 00052 timer_create (CLOCK_REALTIME, &sigev, &timer); nico@207: 00053 } nico@207: 00054 nico@207: 00055 void StopTimerLoop(void) nico@207: 00056 { nico@207: 00057 EnterMutex(); nico@207: 00058 timer_delete (timer); nico@207: 00059 LeaveMutex(); nico@207: 00060 } nico@207: 00061 nico@207: 00062 void StartTimerLoop(TimerCallback_t init_callback) nico@207: 00063 { nico@207: 00064 initTimer(); nico@207: 00065 EnterMutex(); nico@207: 00066 // At first, TimeDispatch will call init_callback. nico@207: 00067 SetAlarm(NULL, 0, init_callback, 0, 0); nico@207: 00068 LeaveMutex(); nico@207: 00069 } nico@207: 00070 nico@207: 00071 void CreateReceiveTask(CAN_PORT port, TASK_HANDLE* Thread, void* ReceiveLoopPtr) nico@207: 00072 { nico@207: 00073 pthread_create(Thread, NULL, ReceiveLoopPtr, (void*)port); nico@207: 00074 } nico@207: 00075 nico@207: 00076 void WaitReceiveTaskEnd(TASK_HANDLE Thread) nico@207: 00077 { nico@207: 00078 pthread_kill(Thread, SIGTERM); nico@207: 00079 pthread_join(Thread, NULL); nico@207: 00080 } nico@207: 00081 nico@207: 00082 #define maxval(a,b) ((a>b)?a:b) nico@207: 00083 void setTimer(TIMEVAL value) nico@207: 00084 { nico@207: 00085 // printf("setTimer(TIMEVAL value=%d)\n", value); nico@207: 00086 // TIMEVAL is us whereas setitimer wants ns... nico@207: 00087 long tv_nsec = 1000 * (maxval(value,1)%1000000); nico@207: 00088 time_t tv_sec = value/1000000; nico@207: 00089 struct itimerspec timerValues; nico@207: 00090 timerValues.it_value.tv_sec = tv_sec; nico@207: 00091 timerValues.it_value.tv_nsec = tv_nsec; nico@207: 00092 timerValues.it_interval.tv_sec = 0; nico@207: 00093 timerValues.it_interval.tv_nsec = 0; nico@207: 00094 nico@207: 00095 timer_settime (timer, 0, &timerValues, NULL); nico@207: 00096 } nico@207: 00097 nico@207: 00098 TIMEVAL getElapsedTime(void) nico@207: 00099 { nico@207: 00100 struct timeval p; nico@207: 00101 gettimeofday(&p,NULL); nico@207: 00102 // printf("getCurrentTime() return=%u\n", p.tv_usec); nico@207: 00103 return (p.tv_sec - last_sig.tv_sec)* 1000000 + p.tv_usec - last_sig.tv_usec; nico@207: 00104 } nico@207: