doc/doxygen/html/timers__unix_8c-source.html
author etisserant
Mon, 02 Jul 2007 18:22:58 +0200
changeset 236 905677ed00f3
parent 215 f49e5a6b7804
child 240 34654679f262
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.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>CanFestival: drivers/timers_unix/timers_unix.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.1 -->
<div class="tabs">
  <ul>
    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
    <li id="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="dirs.html"><span>Directories</span></a></li>
  </ul></div>
<div class="tabs">
  <ul>
    <li><a href="files.html"><span>File&nbsp;List</span></a></li>
    <li><a href="globals.html"><span>Globals</span></a></li>
  </ul></div>
<div class="nav">
<a class="el" href="dir_d58fb241e647de6212c31ecccf9cbace.html">drivers</a>&nbsp;&raquo&nbsp;<a class="el" href="dir_48aec78d2c68f8c6a53202ad028bcb76.html">timers_unix</a></div>
<h1>timers_unix.c</h1><a href="timers__unix_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00002"></a>00002 
<a name="l00003"></a>00003 <span class="preprocessor">#include &lt;sys/time.h&gt;</span>
<a name="l00004"></a>00004 <span class="preprocessor">#include &lt;pthread.h&gt;</span> 
<a name="l00005"></a>00005 <span class="preprocessor">#include &lt;signal.h&gt;</span>
<a name="l00006"></a>00006 
<a name="l00007"></a>00007 <span class="preprocessor">#include "<a class="code" href="win32_2applicfg_8h.html">applicfg.h</a>"</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include "<a class="code" href="timer_8h.html">timer.h</a>"</span>
<a name="l00009"></a>00009 
<a name="l00010"></a><a class="code" href="timers__unix_8c.html#93ad8a5a5e353192bfa45ae850df337f">00010</a> pthread_mutex_t <a class="code" href="timers__unix_8c.html#93ad8a5a5e353192bfa45ae850df337f">CanFestival_mutex</a> = PTHREAD_MUTEX_INITIALIZER;
<a name="l00011"></a>00011 
<a name="l00012"></a><a class="code" href="timers__unix_8c.html#ef197e4f64855d2ac4ccbc40595d6bdd">00012</a> <a class="code" href="timers__unix_2timerscfg_8h.html#07c1b78efc83716fac9e31b9862f7e60">TASK_HANDLE</a> <a class="code" href="timers__unix_8c.html#ef197e4f64855d2ac4ccbc40595d6bdd">TimerLoopThread</a>;
<a name="l00013"></a>00013 
<a name="l00014"></a><a class="code" href="timers__unix_8c.html#9b886230a6b35bdd1532a27ee7400d10">00014</a> <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="timers__unix_8c.html#9b886230a6b35bdd1532a27ee7400d10">last_time_set</a> = <a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>;
<a name="l00015"></a>00015 
<a name="l00016"></a><a class="code" href="timers__unix_8c.html#bcf9307062fc6f0a7906547a892e38df">00016</a> <span class="keyword">struct </span>timeval <a class="code" href="timers__unix_8c.html#bcf9307062fc6f0a7906547a892e38df">last_sig</a>;
<a name="l00017"></a>00017 
<a name="l00018"></a><a class="code" href="timers__unix_8c.html#1a1e2de3a80567484c9b4d4f20d5a3d0">00018</a> timer_t <a class="code" href="timers__unix_8c.html#1a1e2de3a80567484c9b4d4f20d5a3d0">timer</a>;
<a name="l00019"></a>00019 
<a name="l00020"></a><a class="code" href="timers__driver_8h.html#d7fee43b8a44cf8b7036853593044037">00020</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#d7fee43b8a44cf8b7036853593044037">EnterMutex</a>(<span class="keywordtype">void</span>)
<a name="l00021"></a>00021 {
<a name="l00022"></a>00022         pthread_mutex_lock(&amp;<a class="code" href="timers__unix_8c.html#93ad8a5a5e353192bfa45ae850df337f">CanFestival_mutex</a>); 
<a name="l00023"></a>00023 }
<a name="l00024"></a>00024 
<a name="l00025"></a><a class="code" href="timers__driver_8h.html#73d9a4eb941fb20cf6b597840510394b">00025</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#73d9a4eb941fb20cf6b597840510394b">LeaveMutex</a>(<span class="keywordtype">void</span>)
<a name="l00026"></a>00026 {
<a name="l00027"></a>00027         pthread_mutex_unlock(&amp;<a class="code" href="timers__unix_8c.html#93ad8a5a5e353192bfa45ae850df337f">CanFestival_mutex</a>);
<a name="l00028"></a>00028 }
<a name="l00029"></a>00029 
<a name="l00030"></a><a class="code" href="timers__unix_8c.html#4cd19302f57b08fc0403a05017332735">00030</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#4cd19302f57b08fc0403a05017332735">timer_notify</a>(sigval_t val)
<a name="l00031"></a>00031 {
<a name="l00032"></a>00032         gettimeofday(&amp;<a class="code" href="timers__unix_8c.html#bcf9307062fc6f0a7906547a892e38df">last_sig</a>,NULL);
<a name="l00033"></a>00033         <a class="code" href="timers__unix_8c.html#d7fee43b8a44cf8b7036853593044037">EnterMutex</a>();
<a name="l00034"></a>00034         <a class="code" href="timer_8c.html#fa75192a3238525618f8cb83004930cc">TimeDispatch</a>();
<a name="l00035"></a>00035         <a class="code" href="timers__unix_8c.html#73d9a4eb941fb20cf6b597840510394b">LeaveMutex</a>();
<a name="l00036"></a>00036 <span class="comment">//      printf("getCurrentTime() return=%u\n", p.tv_usec);</span>
<a name="l00037"></a>00037 }
<a name="l00038"></a>00038 
<a name="l00039"></a><a class="code" href="timers__unix_8c.html#02922529b60419a94afe8f369dda070b">00039</a> <span class="keywordtype">void</span> <a class="code" href="canOpenDriver_8c.html#02922529b60419a94afe8f369dda070b">initTimer</a>(<span class="keywordtype">void</span>)
<a name="l00040"></a>00040 {
<a name="l00041"></a>00041         <span class="keyword">struct </span>sigevent sigev;
<a name="l00042"></a>00042 
<a name="l00043"></a>00043         <span class="comment">// Take first absolute time ref.</span>
<a name="l00044"></a>00044         gettimeofday(&amp;<a class="code" href="timers__unix_8c.html#bcf9307062fc6f0a7906547a892e38df">last_sig</a>,NULL);
<a name="l00045"></a>00045 
<a name="l00046"></a>00046         memset (&amp;sigev, 0, <span class="keyword">sizeof</span> (<span class="keyword">struct</span> sigevent));
<a name="l00047"></a>00047         sigev.sigev_value.sival_int = 0;
<a name="l00048"></a>00048         sigev.sigev_notify = SIGEV_THREAD;
<a name="l00049"></a>00049         sigev.sigev_notify_attributes = NULL;
<a name="l00050"></a>00050         sigev.sigev_notify_function = <a class="code" href="timers__unix_8c.html#4cd19302f57b08fc0403a05017332735">timer_notify</a>;
<a name="l00051"></a>00051 
<a name="l00052"></a>00052         timer_create (CLOCK_REALTIME, &amp;sigev, &amp;<a class="code" href="timers__unix_8c.html#1a1e2de3a80567484c9b4d4f20d5a3d0">timer</a>);
<a name="l00053"></a>00053 }
<a name="l00054"></a>00054 
<a name="l00055"></a><a class="code" href="timers__driver_8h.html#8758484f3cebb0cd44bb247c3f23d5e3">00055</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#8758484f3cebb0cd44bb247c3f23d5e3">StopTimerLoop</a>(<span class="keywordtype">void</span>)
<a name="l00056"></a>00056 {
<a name="l00057"></a>00057         <a class="code" href="timers__unix_8c.html#d7fee43b8a44cf8b7036853593044037">EnterMutex</a>();
<a name="l00058"></a>00058         timer_delete (<a class="code" href="timers__unix_8c.html#1a1e2de3a80567484c9b4d4f20d5a3d0">timer</a>);
<a name="l00059"></a>00059         <a class="code" href="timers__unix_8c.html#73d9a4eb941fb20cf6b597840510394b">LeaveMutex</a>();
<a name="l00060"></a>00060 }
<a name="l00061"></a>00061 
<a name="l00062"></a><a class="code" href="timers__driver_8h.html#c9e1731843825eb55e7a94894e6a8ec5">00062</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#c9e1731843825eb55e7a94894e6a8ec5">StartTimerLoop</a>(<a class="code" href="timer_8h.html#f7d102e060339d3730ceae5fea03691b">TimerCallback_t</a> init_callback)
<a name="l00063"></a>00063 {
<a name="l00064"></a>00064         <a class="code" href="canOpenDriver_8c.html#02922529b60419a94afe8f369dda070b">initTimer</a>();
<a name="l00065"></a>00065         <a class="code" href="timers__unix_8c.html#d7fee43b8a44cf8b7036853593044037">EnterMutex</a>();
<a name="l00066"></a>00066         <span class="comment">// At first, TimeDispatch will call init_callback.</span>
<a name="l00067"></a>00067         <a class="code" href="timer_8c.html#11c2616d78f06ed9144ef662f757b128">SetAlarm</a>(NULL, 0, init_callback, 0, 0);
<a name="l00068"></a>00068         <a class="code" href="timers__unix_8c.html#73d9a4eb941fb20cf6b597840510394b">LeaveMutex</a>();
<a name="l00069"></a>00069 }
<a name="l00070"></a>00070 
<a name="l00071"></a><a class="code" href="timers__driver_8h.html#3e8cb5b8159f655ee0bac1ea1d2358d4">00071</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#a3a7df911baa20b01c4374a9677a154a">CreateReceiveTask</a>(<a class="code" href="unix_2applicfg_8h.html#7ef59f941603c6680e74fc335523f17e">CAN_PORT</a> port, <a class="code" href="timers__unix_2timerscfg_8h.html#07c1b78efc83716fac9e31b9862f7e60">TASK_HANDLE</a>* Thread, <span class="keywordtype">void</span>* ReceiveLoopPtr)
<a name="l00072"></a>00072 {
<a name="l00073"></a>00073         pthread_create(Thread, NULL, ReceiveLoopPtr, (<span class="keywordtype">void</span>*)port);
<a name="l00074"></a>00074 }
<a name="l00075"></a>00075 
<a name="l00076"></a><a class="code" href="timers__driver_8h.html#c492d1b5ebd2d99020e72c137beda878">00076</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#4b2486891ee01e06e2deead4cf963727">WaitReceiveTaskEnd</a>(<a class="code" href="timers__unix_2timerscfg_8h.html#07c1b78efc83716fac9e31b9862f7e60">TASK_HANDLE</a> Thread)
<a name="l00077"></a>00077 {
<a name="l00078"></a>00078         pthread_kill(Thread, SIGTERM);
<a name="l00079"></a>00079         pthread_join(Thread, NULL);
<a name="l00080"></a>00080 }
<a name="l00081"></a>00081 
<a name="l00082"></a><a class="code" href="timers__unix_8c.html#016587a4d6fc754357c47c9df9f0bde4">00082</a> <span class="preprocessor">#define maxval(a,b) ((a&gt;b)?a:b)</span>
<a name="l00083"></a><a class="code" href="timer_8h.html#b8d05dee70f04b5c5190ab00e84da106">00083</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#b8d05dee70f04b5c5190ab00e84da106">setTimer</a>(<a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> value)
<a name="l00084"></a>00084 {
<a name="l00085"></a>00085 <span class="comment">//      printf("setTimer(TIMEVAL value=%d)\n", value);</span>
<a name="l00086"></a>00086         <span class="comment">// TIMEVAL is us whereas setitimer wants ns...</span>
<a name="l00087"></a>00087         <span class="keywordtype">long</span> tv_nsec = 1000 * (<a class="code" href="timers__unix_8c.html#016587a4d6fc754357c47c9df9f0bde4">maxval</a>(value,1)%1000000);
<a name="l00088"></a>00088         time_t tv_sec = value/1000000;
<a name="l00089"></a>00089         <span class="keyword">struct </span>itimerspec timerValues;
<a name="l00090"></a>00090         timerValues.it_value.tv_sec = tv_sec;
<a name="l00091"></a>00091         timerValues.it_value.tv_nsec = tv_nsec;
<a name="l00092"></a>00092         timerValues.it_interval.tv_sec = 0;
<a name="l00093"></a>00093         timerValues.it_interval.tv_nsec = 0;
<a name="l00094"></a>00094 
<a name="l00095"></a>00095         timer_settime (<a class="code" href="timers__unix_8c.html#1a1e2de3a80567484c9b4d4f20d5a3d0">timer</a>, 0, &amp;timerValues, NULL);
<a name="l00096"></a>00096 }
<a name="l00097"></a>00097 
<a name="l00098"></a><a class="code" href="timers__unix_8c.html#4dccc204d52176bd547ab34d6858f5ba">00098</a> <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="canOpenDriver_8c.html#24dbe63e88d184388542037d16a8208d">getElapsedTime</a>(<span class="keywordtype">void</span>)
<a name="l00099"></a>00099 {
<a name="l00100"></a>00100         <span class="keyword">struct </span>timeval p;
<a name="l00101"></a>00101         gettimeofday(&amp;p,NULL);
<a name="l00102"></a>00102 <span class="comment">//      printf("getCurrentTime() return=%u\n", p.tv_usec);</span>
<a name="l00103"></a>00103         <span class="keywordflow">return</span> (p.tv_sec - <a class="code" href="timers__unix_8c.html#bcf9307062fc6f0a7906547a892e38df">last_sig</a>.tv_sec)* 1000000 + p.tv_usec - <a class="code" href="timers__unix_8c.html#bcf9307062fc6f0a7906547a892e38df">last_sig</a>.tv_usec;
<a name="l00104"></a>00104 }
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Fri Jun 8 08:51:38 2007 for CanFestival by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address>
</body>
</html>