From 3af6b3c3e2f57e1a0447e81a9de50ba7f8c36b2b Mon Sep 17 00:00:00 2001 From: Abhishek Sagar Date: Tue, 27 Oct 2020 04:43:13 -0700 Subject: [PATCH] Added API to get the timer state - running or not. --- WheelTimer/libtimer/Course/timerlib.c | 48 ++++++++++++++++++++++ WheelTimer/libtimer/Course/timerlib_test.c | 2 +- WheelTimer/libtimer/timerlib.c | 14 +++++++ WheelTimer/libtimer/timerlib.h | 4 ++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/WheelTimer/libtimer/Course/timerlib.c b/WheelTimer/libtimer/Course/timerlib.c index 57d0ade..d008e95 100644 --- a/WheelTimer/libtimer/Course/timerlib.c +++ b/WheelTimer/libtimer/Course/timerlib.c @@ -55,6 +55,15 @@ timer_callback_wrapper(union sigval arg){ Timer_t *timer = (Timer_t *)(arg.sival_ptr); + + if((timer->timer_state) == TIMER_RESUMED){ + + if(timer->sec_exp_timer != 0){ + timer->timer_state = TIMER_RUNNING; + } + } + + /* invoke the user provided callback fn */ (timer->cb)(timer, timer->user_arg); } @@ -120,3 +129,42 @@ start_timer(Timer_t *timer){ timer_set_state(timer, TIMER_RUNNING); } +unsigned long +timer_get_time_remaining_in_mill_sec(Timer_t *timer){ + + struct itimerspec remaining_time; + + memset(&remaining_time, 0, sizeof(struct itimerspec)); + + timer_gettime(timer->posix_timer, &remaining_time); + + return timespec_to_millisec(&remaining_time.it_value); +} + + +void +pause_timer(Timer_t *timer){ + + timer->time_remaining = + timer_get_time_remaining_in_mill_sec(timer); + + timer_fill_itimerspec(&timer->ts.it_value, 0); + timer_fill_itimerspec(&timer->ts.it_interval, 0); + + resurrect_timer(timer); + + timer_set_state(timer, TIMER_PAUSED); +} + +void +resume_timer(Timer_t *timer){ + + assert(timer_get_current_state(timer) == TIMER_PAUSED); + + timer_fill_itimerspec(&timer->ts.it_value, timer->time_remaining); + timer_fill_itimerspec(&timer->ts.it_interval, timer->sec_exp_timer); + timer->time_remaining = 0; + + resurrect_timer(timer); + timer_set_state(timer, TIMER_RESUMED); +} diff --git a/WheelTimer/libtimer/Course/timerlib_test.c b/WheelTimer/libtimer/Course/timerlib_test.c index 219a5c1..5cb59e1 100644 --- a/WheelTimer/libtimer/Course/timerlib_test.c +++ b/WheelTimer/libtimer/Course/timerlib_test.c @@ -58,7 +58,7 @@ main(int argc, char **argv){ case 8: //print_timer(timer); break; - deafault: ; + default: ; } } pause(); diff --git a/WheelTimer/libtimer/timerlib.c b/WheelTimer/libtimer/timerlib.c index 4d0ad3c..0ff9aac 100644 --- a/WheelTimer/libtimer/timerlib.c +++ b/WheelTimer/libtimer/timerlib.c @@ -302,3 +302,17 @@ print_timer(Timer_t *timer){ timer_get_current_state(timer)); } +bool +is_timer_running(Timer_t *timer){ + + TIMER_STATE_T timer_state; + + timer_state = timer_get_current_state(timer); + + if(timer_state == TIMER_RUNNING || + timer_state == TIMER_RESUMED) { + return true; + } + return false; +} + diff --git a/WheelTimer/libtimer/timerlib.h b/WheelTimer/libtimer/timerlib.h index df7d2d7..9078f48 100644 --- a/WheelTimer/libtimer/timerlib.h +++ b/WheelTimer/libtimer/timerlib.h @@ -137,4 +137,8 @@ timespec_to_millisec( void timer_fill_itimerspec(struct timespec *ts, unsigned long msec); + +bool +is_timer_running(Timer_t *timer); + #endif /* __TIMER_WRAP__ */