etisserant@0: #include etisserant@0: etisserant@0: #include etisserant@0: #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@0: TIMEVAL last_time_set = TIMEVAL_MAX; etisserant@0: etisserant@0: struct timeval last_sig; etisserant@0: etisserant@0: char stop_timer=0; etisserant@0: etisserant@0: void sig(int val) etisserant@0: { etisserant@0: signal( SIGALRM, sig); etisserant@0: gettimeofday(&last_sig,NULL); etisserant@0: // printf("getCurrentTime() return=%u\n", p.tv_usec); etisserant@0: } etisserant@0: etisserant@0: void initTimer(void) etisserant@0: { etisserant@0: gettimeofday(&last_sig,NULL); etisserant@0: signal( SIGALRM, sig); etisserant@0: stop_timer = 0; etisserant@0: } etisserant@0: etisserant@0: void stopTimer(void) etisserant@0: { etisserant@0: stop_timer = 1; etisserant@0: kill(0, SIGALRM); etisserant@0: } 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@0: void TimerLoop(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: while (!stop_timer) { etisserant@0: EnterMutex(); etisserant@0: TimeDispatch(); etisserant@0: LeaveMutex(); etisserant@0: pause(); etisserant@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: etisserant@0: void WaitReceiveTaskEnd(TASK_HANDLE Thread) etisserant@0: { etisserant@0: pthread_join(Thread, NULL); etisserant@0: } etisserant@0: etisserant@0: #define max(a,b) a>b?a:b etisserant@0: void setTimer(TIMEVAL value) etisserant@0: { etisserant@0: // printf("setTimer(TIMEVAL value=%d)\n", value); etisserant@0: struct itimerval timerValues; etisserant@0: struct itimerval timerV = {{0,0},{0,0}}; etisserant@0: timerValues.it_value.tv_sec = 0; etisserant@0: timerValues.it_value.tv_usec = max(value,1); etisserant@0: timerValues.it_interval.tv_sec = 0; etisserant@0: timerValues.it_interval.tv_usec = 0; etisserant@0: setitimer(ITIMER_REAL, &timerValues, &timerV); 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: }