diff -r 8b3faaf3715e -r 2390b409eb93 runtime/plc_Linux_main.c --- a/runtime/plc_Linux_main.c Fri Jun 27 09:38:16 2008 +0200 +++ b/runtime/plc_Linux_main.c Fri Jun 27 16:21:22 2008 +0200 @@ -2,14 +2,46 @@ #include #include #include +#include +void PLC_GetTime(IEC_TIME *CURRENT_TIME) +{ + clock_gettime(CLOCK_REALTIME, CURRENT_TIME); +} void PLC_timer_notify(sigval_t val) { - clock_gettime(CLOCK_REALTIME, &__CURRENT_TIME); + PLC_GetTime(&__CURRENT_TIME); __run(); } +timer_t PLC_timer; + +void PLC_SetTimer(long long next, long long period) +{ + struct itimerspec timerValues; + /* + printf("SetTimer(%lld,%lld)\n",next, period); + */ + memset (&timerValues, 0, sizeof (struct itimerspec)); + { +#ifdef __lldiv_t_defined + lldiv_t nxt_div = lldiv(next, 1000000000); + lldiv_t period_div = lldiv(period, 1000000000); + timerValues.it_value.tv_sec = nxt_div.quot; + timerValues.it_value.tv_nsec = nxt_div.rem; + timerValues.it_interval.tv_sec = period_div.quot; + timerValues.it_interval.tv_nsec = period_div.rem; +#else + timerValues.it_value.tv_sec = next / 1000000000; + timerValues.it_value.tv_nsec = next % 1000000000; + timerValues.it_interval.tv_sec = period / 1000000000; + timerValues.it_interval.tv_nsec = period % 1000000000; +#endif + } + timer_settime (PLC_timer, 0, &timerValues, NULL); +} + void catch_signal(int sig) { signal(SIGTERM, catch_signal); @@ -19,36 +51,30 @@ int main(int argc,char **argv) { - timer_t timer; struct sigevent sigev; - long tv_nsec = 1000000 * (maxval(common_ticktime__,1)%1000); - time_t tv_sec = common_ticktime__/1000; - struct itimerspec timerValues; + /* Translate PLC's microseconds to Ttick nanoseconds */ + Ttick = 1000000 * maxval(common_ticktime__,1); memset (&sigev, 0, sizeof (struct sigevent)); - memset (&timerValues, 0, sizeof (struct itimerspec)); sigev.sigev_value.sival_int = 0; sigev.sigev_notify = SIGEV_THREAD; sigev.sigev_notify_attributes = NULL; sigev.sigev_notify_function = PLC_timer_notify; - timerValues.it_value.tv_sec = tv_sec; - timerValues.it_value.tv_nsec = tv_nsec; - timerValues.it_interval.tv_sec = tv_sec; - timerValues.it_interval.tv_nsec = tv_nsec; + timer_create (CLOCK_REALTIME, &sigev, &PLC_timer); if( __init(argc,argv) == 0 ){ - timer_create (CLOCK_REALTIME, &sigev, &timer); - timer_settime (timer, 0, &timerValues, NULL); + PLC_SetTimer(Ttick,Ttick); /* install signal handler for manual break */ signal(SIGTERM, catch_signal); signal(SIGINT, catch_signal); - + /* Wait some signal */ pause(); - - timer_delete (timer); + /* Stop the PLC */ + PLC_SetTimer(0,0); } __cleanup(); + timer_delete (PLC_timer); return 0; }