greg@205: #include greg@205: #include greg@205: #include greg@205: #include greg@205: greg@205: long AtomicCompareExchange(long* atomicvar,long exchange, long compared) greg@205: { greg@205: return InterlockedCompareExchange(atomicvar, exchange, compared); greg@205: } greg@205: greg@205: //long AtomicExchange(long* atomicvar,long exchange) greg@205: //{ greg@205: // return InterlockedExchange(atomicvar, exchange); greg@205: //} greg@205: greg@205: struct _timeb timetmp; greg@205: void PLC_GetTime(IEC_TIME *CURRENT_TIME) greg@205: { greg@205: _ftime(&timetmp); greg@205: greg@205: (*CURRENT_TIME).tv_sec = timetmp.time; greg@205: (*CURRENT_TIME).tv_nsec = timetmp.millitm * 1000000; greg@205: } greg@205: greg@205: void PLC_timer_notify() greg@205: { greg@205: PLC_GetTime(&__CURRENT_TIME); greg@205: __run(); greg@205: } greg@205: greg@205: HANDLE PLC_timer = NULL; greg@205: void PLC_SetTimer(long long next, long long period) greg@205: { greg@205: LARGE_INTEGER liDueTime; greg@205: /* arg 2 of SetWaitableTimer take 100 ns interval*/ greg@205: liDueTime.QuadPart = next / (-100); greg@205: greg@205: /* greg@205: printf("SetTimer(%lld,%lld)\n",next, period); greg@205: */ greg@205: greg@205: if (!SetWaitableTimer(PLC_timer, &liDueTime, common_ticktime__, NULL, NULL, 0)) greg@205: { greg@205: printf("SetWaitableTimer failed (%d)\n", GetLastError()); greg@205: } greg@205: if (WaitForSingleObject(PLC_timer, INFINITE) != WAIT_OBJECT_0) greg@205: { greg@205: printf("WaitForSingleObject failed (%d)\n", GetLastError()); greg@205: } greg@205: PLC_timer_notify(); greg@205: } greg@205: greg@205: int main(int argc,char **argv) greg@205: { greg@205: /* Translate PLC's microseconds to Ttick nanoseconds */ greg@205: Ttick = 1000000 * maxval(common_ticktime__,1); greg@205: greg@205: /* Create a waitable timer */ greg@205: PLC_timer = CreateWaitableTimer(NULL, FALSE, "WaitableTimer"); greg@205: if(NULL == PLC_timer) greg@205: { greg@205: printf("CreateWaitableTimer failed (%d)\n", GetLastError()); greg@205: return 1; greg@205: } greg@205: greg@205: if( __init(argc,argv) == 0 ) greg@205: { greg@205: printf("Tick Time : %d ms\n", common_ticktime__); greg@205: while(1) greg@205: { greg@205: // Set a timer greg@205: PLC_SetTimer(Ttick,Ttick); greg@205: if (kbhit()) greg@205: { greg@205: printf("Finishing\n"); greg@205: break; greg@205: } greg@205: } greg@205: PLC_SetTimer(0,0); greg@205: } greg@205: __cleanup(); greg@205: CloseHandle(PLC_timer); greg@205: greg@205: return 0; greg@205: }