drivers/timers_unix/timers_unix.c
author etisserant
Mon, 02 Jul 2007 18:22:58 +0200
changeset 236 905677ed00f3
parent 149 fe50ada8020b
child 401 2c90876b9751
permissions -rw-r--r--
Full preliminary implementation of TPDO transmit type:
- SYNC (N) (1-240)
- RTR only + SYNC (252)
- RTR only (253)
- EVENT, with timer and inhibit time (254 and 255)

User app have to call sendPDOevent(d) to eventually signal mapped data changes.
Callbacks added to 0x140N, TPDO comm parameters for on the fly timers values change.
TestMasterSlave updated.
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     1
#include <stdlib.h>
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     2
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     3
#include <sys/time.h>
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
     4
#include <pthread.h> 
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     5
#include <signal.h>
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     6
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     7
#include "applicfg.h"
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     8
#include "timer.h"
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
     9
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    10
pthread_mutex_t CanFestival_mutex = PTHREAD_MUTEX_INITIALIZER;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    11
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    12
TASK_HANDLE TimerLoopThread;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    13
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    14
TIMEVAL last_time_set = TIMEVAL_MAX;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    15
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    16
struct timeval last_sig;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    17
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    18
timer_t timer;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    19
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    20
void EnterMutex(void)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    21
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    22
	pthread_mutex_lock(&CanFestival_mutex); 
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    23
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    24
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    25
void LeaveMutex(void)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    26
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    27
	pthread_mutex_unlock(&CanFestival_mutex);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    28
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    29
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 48
diff changeset
    30
void timer_notify(sigval_t val)
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    31
{
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    32
	gettimeofday(&last_sig,NULL);
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    33
	EnterMutex();
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    34
	TimeDispatch();
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    35
	LeaveMutex();
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    36
//	printf("getCurrentTime() return=%u\n", p.tv_usec);
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    37
}
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    38
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    39
void initTimer(void)
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    40
{
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    41
	struct sigevent sigev;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    42
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    43
	// Take first absolute time ref.
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    44
	gettimeofday(&last_sig,NULL);
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    45
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    46
	memset (&sigev, 0, sizeof (struct sigevent));
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    47
	sigev.sigev_value.sival_int = 0;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    48
	sigev.sigev_notify = SIGEV_THREAD;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    49
	sigev.sigev_notify_attributes = NULL;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    50
	sigev.sigev_notify_function = timer_notify;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    51
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    52
	timer_create (CLOCK_REALTIME, &sigev, &timer);
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    53
}
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    54
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    55
void StopTimerLoop(void)
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    56
{
149
fe50ada8020b Changes in the API:
etisserant
parents: 145
diff changeset
    57
	EnterMutex();
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    58
	timer_delete (timer);
149
fe50ada8020b Changes in the API:
etisserant
parents: 145
diff changeset
    59
	LeaveMutex();
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    60
}
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    61
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    62
void StartTimerLoop(TimerCallback_t init_callback)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    63
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    64
	initTimer();
149
fe50ada8020b Changes in the API:
etisserant
parents: 145
diff changeset
    65
	EnterMutex();
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    66
	// At first, TimeDispatch will call init_callback.
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    67
	SetAlarm(NULL, 0, init_callback, 0, 0);
149
fe50ada8020b Changes in the API:
etisserant
parents: 145
diff changeset
    68
	LeaveMutex();
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    69
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    70
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 48
diff changeset
    71
void CreateReceiveTask(CAN_PORT port, TASK_HANDLE* Thread, void* ReceiveLoopPtr)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    72
{
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 48
diff changeset
    73
	pthread_create(Thread, NULL, ReceiveLoopPtr, (void*)port);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    74
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    75
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 48
diff changeset
    76
void WaitReceiveTaskEnd(TASK_HANDLE Thread)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    77
{
145
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 48
diff changeset
    78
	pthread_kill(Thread, SIGTERM);
e747d2e26af0 Win32 Native support and dynamicaly loaded CAN drivers for Linux, Cygwin and Win32.
etisserant
parents: 48
diff changeset
    79
	pthread_join(Thread, NULL);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    80
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    81
48
adc6572caf5d minval/maxval macro operators precedence fix. Thanks Luis Jim?nez.
etisserant
parents: 38
diff changeset
    82
#define maxval(a,b) ((a>b)?a:b)
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    83
void setTimer(TIMEVAL value)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    84
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    85
//	printf("setTimer(TIMEVAL value=%d)\n", value);
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    86
	// TIMEVAL is us whereas setitimer wants ns...
38
9b5bb1dcb4f5 Cygwin port. Still untested. Compiles and link.
etisserant
parents: 35
diff changeset
    87
	long tv_nsec = 1000 * (maxval(value,1)%1000000);
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    88
	time_t tv_sec = value/1000000;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    89
	struct itimerspec timerValues;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    90
	timerValues.it_value.tv_sec = tv_sec;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    91
	timerValues.it_value.tv_nsec = tv_nsec;
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    92
	timerValues.it_interval.tv_sec = 0;
32
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    93
	timerValues.it_interval.tv_nsec = 0;
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    94
8afa33692372 SDO callbacks.
etisserant
parents: 0
diff changeset
    95
 	timer_settime (timer, 0, &timerValues, NULL);
0
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    96
}
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    97
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    98
TIMEVAL getElapsedTime(void)
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
    99
{
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   100
	struct timeval p;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   101
	gettimeofday(&p,NULL);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   102
//	printf("getCurrentTime() return=%u\n", p.tv_usec);
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   103
	return (p.tv_sec - last_sig.tv_sec)* 1000000 + p.tv_usec - last_sig.tv_usec;
4472ee7c6c3e Commit a new cvs repo.
etisserant
parents:
diff changeset
   104
}