drivers/timers_win32/timers_win32.c
author greg
Mon, 27 Jul 2009 09:18:04 +0200
changeset 578 eb67d9aa714f
parent 577 0bb82be64630
child 591 513f5ec8b628
permissions -rw-r--r--
add install/uninstall rules in Makefile.in
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     1
/*
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     2
This file is part of CanFestival, a library implementing CanOpen Stack.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     3
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     4
Copyright (C): Edouard TISSERANT and Francis DUPIN
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     5
Copyright (C) Win32 Port Leonid Tochinski
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     6
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     7
See COPYING file for copyrights details.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     8
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
     9
This library is free software; you can redistribute it and/or
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    10
modify it under the terms of the GNU Lesser General Public
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    11
License as published by the Free Software Foundation; either
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    12
version 2.1 of the License, or (at your option) any later version.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    13
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    14
This library is distributed in the hope that it will be useful,
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    15
but WITHOUT ANY WARRANTY; without even the implied warranty of
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    17
Lesser General Public License for more details.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    18
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    19
You should have received a copy of the GNU Lesser General Public
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    20
License along with this library; if not, write to the Free Software
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    21
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    22
*/
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    23
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    24
#include <windows.h>
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    25
#include <stdlib.h>
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    26
#include <sys/timeb.h>
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    27
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 575
diff changeset
    28
extern "C"
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 575
diff changeset
    29
{
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    30
#include "applicfg.h"
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    31
#include "can_driver.h"
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    32
#include "timer.h"
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    33
#include "timers_driver.h"
577
0bb82be64630 add extern \"C\" to keep compatibilty with C++
greg
parents: 575
diff changeset
    34
};
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    35
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    36
struct _timeb timebuffer;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    37
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    38
/* Synchronization Object Implementation */
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    39
CRITICAL_SECTION CanFestival_mutex;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    40
HANDLE timer_thread = NULL;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    41
HANDLE timer = NULL;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    42
575
18db803e593f fix warning when compile
greg
parents: 571
diff changeset
    43
int stop_timer=0;
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    44
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    45
static TimerCallback_t init_callback;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    46
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    47
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    48
void EnterMutex(void)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    49
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    50
	EnterCriticalSection(&CanFestival_mutex);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    51
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    52
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    53
void LeaveMutex(void)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    54
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    55
	LeaveCriticalSection(&CanFestival_mutex);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    56
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    57
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    58
// --------------- CAN Receive Thread Implementation ---------------
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    59
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    60
void CreateReceiveTask(CAN_HANDLE fd0, TASK_HANDLE* Thread, void* ReceiveLoopPtr)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    61
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    62
	unsigned long thread_id = 0;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    63
	*Thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReceiveLoopPtr, fd0, 0, &thread_id);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    64
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    65
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    66
void WaitReceiveTaskEnd(TASK_HANDLE *Thread)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    67
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    68
	WaitForSingleObject(*Thread, INFINITE);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    69
	CloseHandle(*Thread);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    70
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    71
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    72
int TimerThreadLoop(void)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    73
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    74
	EnterMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    75
	// At first, TimeDispatch will call init_callback.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    76
	SetAlarm(NULL, 0, init_callback, 0, 0);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    77
	LeaveMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    78
571
6eddab0b7ca8 fix method to exit properly the Timer Loop
greg
parents: 556
diff changeset
    79
	while(!stop_timer)
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    80
	{
571
6eddab0b7ca8 fix method to exit properly the Timer Loop
greg
parents: 556
diff changeset
    81
		WaitForSingleObject(timer, INFINITE);
6eddab0b7ca8 fix method to exit properly the Timer Loop
greg
parents: 556
diff changeset
    82
		if(stop_timer)
6eddab0b7ca8 fix method to exit properly the Timer Loop
greg
parents: 556
diff changeset
    83
			break;
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    84
		_ftime(&timebuffer);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    85
		EnterMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    86
		TimeDispatch();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    87
		LeaveMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    88
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    89
	return 0;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    90
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    91
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    92
void TimerInit(void)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    93
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    94
	LARGE_INTEGER liDueTime;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    95
	liDueTime.QuadPart = 0;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    96
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    97
	InitializeCriticalSection(&CanFestival_mutex);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
    98
571
6eddab0b7ca8 fix method to exit properly the Timer Loop
greg
parents: 556
diff changeset
    99
	timer = CreateWaitableTimer(NULL, FALSE, NULL);
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   100
	if(NULL == timer)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   101
    {
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   102
        printf("CreateWaitableTimer failed (%d)\n", GetLastError());
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   103
    }
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   104
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   105
	// Take first absolute time ref in milliseconds.
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   106
	_ftime(&timebuffer);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   107
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   108
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   109
void TimerCleanup(void)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   110
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   111
	DeleteCriticalSection(&CanFestival_mutex);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   112
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   113
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   114
void StopTimerLoop(TimerCallback_t exitfunction)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   115
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   116
	EnterMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   117
	exitfunction(NULL,0);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   118
	LeaveMutex();
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   119
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   120
	stop_timer = 1;
571
6eddab0b7ca8 fix method to exit properly the Timer Loop
greg
parents: 556
diff changeset
   121
	setTimer(0);
6eddab0b7ca8 fix method to exit properly the Timer Loop
greg
parents: 556
diff changeset
   122
	WaitForSingleObject(timer_thread, INFINITE);
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   123
	CloseHandle(timer);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   124
	CloseHandle(timer_thread);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   125
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   126
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   127
void StartTimerLoop(TimerCallback_t _init_callback)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   128
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   129
	unsigned long timer_thread_id;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   130
	stop_timer = 0;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   131
	init_callback = _init_callback;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   132
	timer_thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimerThreadLoop, NULL, 0, &timer_thread_id);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   133
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   134
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   135
/* Set the next alarm */
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   136
void setTimer(TIMEVAL value)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   137
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   138
	if(value == TIMEVAL_MAX)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   139
		CancelWaitableTimer(timer);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   140
	else
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   141
	{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   142
		LARGE_INTEGER liDueTime;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   143
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   144
		/* arg 2 of SetWaitableTimer take 100 ns interval */
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   145
		liDueTime.QuadPart = -value;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   146
		//printf("SetTimer(%llu)\n", value);
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   147
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   148
		if (!SetWaitableTimer(timer, &liDueTime, 0, NULL, NULL, FALSE))
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   149
		{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   150
			printf("SetWaitableTimer failed (%d)\n", GetLastError());
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   151
		}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   152
	}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   153
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   154
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   155
/* Get the elapsed time since the last occured alarm */
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   156
TIMEVAL getElapsedTime(void)
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   157
{
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   158
	struct _timeb timetmp;
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   159
	_ftime(&timetmp);
571
6eddab0b7ca8 fix method to exit properly the Timer Loop
greg
parents: 556
diff changeset
   160
	return (timetmp.time - timebuffer.time) * 10000000 + (timetmp.millitm - timebuffer.millitm) * 10000;
556
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   161
}
8296acd119a9 Rewrite win32 code (C only)
greg
parents:
diff changeset
   162