etisserant@0: #include etisserant@0: etisserant@0: #include etisserant@32: #include etisserant@0: #include etisserant@0: etisserant@0: #include "applicfg.h" etisserant@0: #include "can_driver.h" etisserant@0: #include "timer.h" etisserant@0: etisserant@0: pthread_mutex_t CanFestival_mutex = PTHREAD_MUTEX_INITIALIZER; etisserant@0: etisserant@32: TASK_HANDLE TimerLoopThread; etisserant@32: etisserant@0: TIMEVAL last_time_set = TIMEVAL_MAX; etisserant@0: etisserant@0: struct timeval last_sig; etisserant@0: etisserant@32: timer_t timer; etisserant@0: etisserant@0: void EnterMutex(void) etisserant@0: { etisserant@0: pthread_mutex_lock(&CanFestival_mutex); etisserant@0: } etisserant@0: etisserant@0: void LeaveMutex(void) etisserant@0: { etisserant@0: pthread_mutex_unlock(&CanFestival_mutex); etisserant@0: } etisserant@0: etisserant@32: void timer_notify(int val) etisserant@32: { etisserant@32: gettimeofday(&last_sig,NULL); etisserant@32: EnterMutex(); etisserant@32: TimeDispatch(); etisserant@32: LeaveMutex(); etisserant@32: // printf("getCurrentTime() return=%u\n", p.tv_usec); etisserant@32: } etisserant@32: etisserant@32: void initTimer(void) etisserant@32: { etisserant@32: struct sigevent sigev; etisserant@32: etisserant@32: // Take first absolute time ref. etisserant@32: gettimeofday(&last_sig,NULL); etisserant@32: etisserant@32: memset (&sigev, 0, sizeof (struct sigevent)); etisserant@32: sigev.sigev_value.sival_int = 0; etisserant@32: sigev.sigev_notify = SIGEV_THREAD; etisserant@32: sigev.sigev_notify_attributes = NULL; etisserant@32: sigev.sigev_notify_function = timer_notify; etisserant@32: etisserant@32: timer_create (CLOCK_REALTIME, &sigev, &timer); etisserant@32: } etisserant@32: etisserant@32: void StopTimerLoop(void) etisserant@32: { etisserant@32: timer_delete (timer); etisserant@32: } etisserant@32: etisserant@32: void StartTimerLoop(TimerCallback_t init_callback) etisserant@0: { etisserant@0: initTimer(); etisserant@0: // At first, TimeDispatch will call init_callback. etisserant@0: SetAlarm(NULL, 0, init_callback, 0, 0); etisserant@0: } etisserant@0: etisserant@0: void ReceiveLoop(void* arg) etisserant@0: { etisserant@0: canReceiveLoop((CAN_HANDLE)arg); etisserant@0: } etisserant@0: etisserant@0: void CreateReceiveTask(CAN_HANDLE fd0, TASK_HANDLE* Thread) etisserant@0: { etisserant@0: pthread_create(Thread, NULL, (void *)&ReceiveLoop, (void*)fd0); etisserant@0: } etisserant@0: lbessard@35: void WaitReceiveTaskEnd(TASK_HANDLE *Thread) etisserant@0: { lbessard@35: pthread_kill(*Thread, SIGTERM); lbessard@35: pthread_join(*Thread, NULL); etisserant@0: } etisserant@0: etisserant@48: #define maxval(a,b) ((a>b)?a:b) etisserant@0: void setTimer(TIMEVAL value) etisserant@0: { etisserant@0: // printf("setTimer(TIMEVAL value=%d)\n", value); etisserant@32: // TIMEVAL is us whereas setitimer wants ns... etisserant@38: long tv_nsec = 1000 * (maxval(value,1)%1000000); etisserant@32: time_t tv_sec = value/1000000; etisserant@32: struct itimerspec timerValues; etisserant@32: timerValues.it_value.tv_sec = tv_sec; etisserant@32: timerValues.it_value.tv_nsec = tv_nsec; etisserant@0: timerValues.it_interval.tv_sec = 0; etisserant@32: timerValues.it_interval.tv_nsec = 0; etisserant@32: etisserant@32: timer_settime (timer, 0, &timerValues, NULL); etisserant@0: } etisserant@0: etisserant@0: TIMEVAL getElapsedTime(void) etisserant@0: { etisserant@0: struct timeval p; etisserant@0: gettimeofday(&p,NULL); etisserant@0: // printf("getCurrentTime() return=%u\n", p.tv_usec); etisserant@0: return (p.tv_sec - last_sig.tv_sec)* 1000000 + p.tv_usec - last_sig.tv_usec; etisserant@0: }