doc/doxygen/html/timers__win32_8cpp-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/win32/timers_win32.cpp 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_e67188945a11754d0713bc6f89228027.html">win32</a></div>
<h1>timers_win32.cpp</h1><a href="timers__win32_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">This file is part of CanFestival, a library implementing CanOpen Stack.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment">Copyright (C): Edouard TISSERANT and Francis DUPIN</span>
<a name="l00005"></a>00005 <span class="comment">Copyright (C) Win32 Port Leonid Tochinski</span>
<a name="l00006"></a>00006 <span class="comment"></span>
<a name="l00007"></a>00007 <span class="comment">See COPYING file for copyrights details.</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment">This library is free software; you can redistribute it and/or</span>
<a name="l00010"></a>00010 <span class="comment">modify it under the terms of the GNU Lesser General Public</span>
<a name="l00011"></a>00011 <span class="comment">License as published by the Free Software Foundation; either</span>
<a name="l00012"></a>00012 <span class="comment">version 2.1 of the License, or (at your option) any later version.</span>
<a name="l00013"></a>00013 <span class="comment"></span>
<a name="l00014"></a>00014 <span class="comment">This library is distributed in the hope that it will be useful,</span>
<a name="l00015"></a>00015 <span class="comment">but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00016"></a>00016 <span class="comment">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00017"></a>00017 <span class="comment">Lesser General Public License for more details.</span>
<a name="l00018"></a>00018 <span class="comment"></span>
<a name="l00019"></a>00019 <span class="comment">You should have received a copy of the GNU Lesser General Public</span>
<a name="l00020"></a>00020 <span class="comment">License along with this library; if not, write to the Free Software</span>
<a name="l00021"></a>00021 <span class="comment">Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</span>
<a name="l00022"></a>00022 <span class="comment">*/</span>
<a name="l00023"></a>00023 
<a name="l00024"></a>00024 
<a name="l00025"></a>00025 
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;windows.h&gt;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00028"></a>00028 
<a name="l00029"></a>00029 <span class="keyword">extern</span> <span class="stringliteral">"C"</span>
<a name="l00030"></a>00030 {
<a name="l00031"></a>00031 <span class="preprocessor">#include "<a class="code" href="win32_2applicfg_8h.html">applicfg.h</a>"</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include "<a class="code" href="can__driver_8h.html">can_driver.h</a>"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "<a class="code" href="timer_8h.html">timer.h</a>"</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include "<a class="code" href="timers__driver_8h.html">timers_driver.h</a>"</span>
<a name="l00035"></a>00035 };
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="comment">// --------------- Synchronization Object Implementation ---------------</span>
<a name="l00038"></a><a class="code" href="classccritical__section.html">00038</a> <span class="keyword">class </span><a class="code" href="classccritical__section.html">ccritical_section</a>
<a name="l00039"></a>00039    {
<a name="l00040"></a>00040    <span class="keyword">public</span>:
<a name="l00041"></a><a class="code" href="classccritical__section.html#b373df4a1457e4d91117ae8dd052f152">00041</a>       <a class="code" href="classccritical__section.html#b373df4a1457e4d91117ae8dd052f152">ccritical_section</a>()
<a name="l00042"></a>00042          {
<a name="l00043"></a>00043          ::InitializeCriticalSection(&amp;<a class="code" href="classccritical__section.html#102f1ff74ca1adffa1868c3b9d5fb7bb">m_cs</a>);
<a name="l00044"></a>00044          }
<a name="l00045"></a><a class="code" href="classccritical__section.html#9afc8d8a935bb51b02e9ef9bc7241466">00045</a>       <a class="code" href="classccritical__section.html#9afc8d8a935bb51b02e9ef9bc7241466">~ccritical_section</a>()
<a name="l00046"></a>00046          {
<a name="l00047"></a>00047          ::DeleteCriticalSection(&amp;<a class="code" href="classccritical__section.html#102f1ff74ca1adffa1868c3b9d5fb7bb">m_cs</a>);
<a name="l00048"></a>00048          }
<a name="l00049"></a><a class="code" href="classccritical__section.html#94af8f7f73229ecc82a303be7e2b0ad0">00049</a>       <span class="keywordtype">void</span> <a class="code" href="classccritical__section.html#94af8f7f73229ecc82a303be7e2b0ad0">enter</a>()
<a name="l00050"></a>00050          {
<a name="l00051"></a>00051          ::EnterCriticalSection(&amp;<a class="code" href="classccritical__section.html#102f1ff74ca1adffa1868c3b9d5fb7bb">m_cs</a>);
<a name="l00052"></a>00052          }
<a name="l00053"></a><a class="code" href="classccritical__section.html#e1f542404005a2f0696ced6c52a8ce3b">00053</a>       <span class="keywordtype">void</span> <a class="code" href="classccritical__section.html#e1f542404005a2f0696ced6c52a8ce3b">leave</a>()
<a name="l00054"></a>00054          {
<a name="l00055"></a>00055          ::LeaveCriticalSection(&amp;<a class="code" href="classccritical__section.html#102f1ff74ca1adffa1868c3b9d5fb7bb">m_cs</a>);
<a name="l00056"></a>00056          }
<a name="l00057"></a>00057    <span class="keyword">private</span>:
<a name="l00058"></a><a class="code" href="classccritical__section.html#102f1ff74ca1adffa1868c3b9d5fb7bb">00058</a>       CRITICAL_SECTION <a class="code" href="classccritical__section.html#102f1ff74ca1adffa1868c3b9d5fb7bb">m_cs</a>;
<a name="l00059"></a>00059    };
<a name="l00060"></a>00060 
<a name="l00061"></a>00061 <span class="keyword">static</span> <a class="code" href="classccritical__section.html">ccritical_section</a> g_cs;
<a name="l00062"></a>00062 
<a name="l00063"></a>00063 
<a name="l00064"></a><a class="code" href="timers__win32_8cpp.html#d7fee43b8a44cf8b7036853593044037">00064</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#d7fee43b8a44cf8b7036853593044037">EnterMutex</a>(<span class="keywordtype">void</span>)
<a name="l00065"></a>00065    {
<a name="l00066"></a>00066    g_cs.<a class="code" href="classccritical__section.html#94af8f7f73229ecc82a303be7e2b0ad0">enter</a>();
<a name="l00067"></a>00067    }
<a name="l00068"></a>00068 
<a name="l00069"></a><a class="code" href="timers__win32_8cpp.html#73d9a4eb941fb20cf6b597840510394b">00069</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#73d9a4eb941fb20cf6b597840510394b">LeaveMutex</a>(<span class="keywordtype">void</span>)
<a name="l00070"></a>00070    {
<a name="l00071"></a>00071    g_cs.<a class="code" href="classccritical__section.html#e1f542404005a2f0696ced6c52a8ce3b">leave</a>();
<a name="l00072"></a>00072    }
<a name="l00073"></a>00073 <span class="comment">// --------------- Synchronization Object Implementation ---------------</span>
<a name="l00074"></a>00074 
<a name="l00075"></a>00075 
<a name="l00076"></a>00076 <span class="comment">// --------------- CAN Receive Thread Implementation ---------------</span>
<a name="l00077"></a>00077 
<a name="l00078"></a><a class="code" href="timers__win32_8cpp.html#998a8436651e6990d3922ebdc3eebf8b">00078</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#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a> fd0, <a class="code" href="timers__unix_2timerscfg_8h.html#07c1b78efc83716fac9e31b9862f7e60">TASK_HANDLE</a>* Thread, <span class="keywordtype">void</span>* ReceiveLoopPtr)
<a name="l00079"></a>00079    {
<a name="l00080"></a>00080    <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> thread_id = 0;
<a name="l00081"></a>00081    *Thread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReceiveLoopPtr, fd0, 0, &amp;thread_id);
<a name="l00082"></a>00082    }
<a name="l00083"></a>00083 
<a name="l00084"></a><a class="code" href="timers__win32_8cpp.html#4b2486891ee01e06e2deead4cf963727">00084</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="l00085"></a>00085    {
<a name="l00086"></a>00086    ::WaitForSingleObject(Thread, INFINITE);
<a name="l00087"></a>00087    ::CloseHandle(Thread);
<a name="l00088"></a>00088    <span class="comment">//*Thread = NULL;</span>
<a name="l00089"></a>00089    }
<a name="l00090"></a>00090 <span class="comment">// --------------- CAN Receive Thread Implementation ---------------</span>
<a name="l00091"></a>00091 
<a name="l00092"></a>00092 
<a name="l00093"></a>00093 <span class="comment">// --------------- Timer Thread Implementation ---------------</span>
<a name="l00094"></a><a class="code" href="classclass__timers.html">00094</a> <span class="keyword">class </span><a class="code" href="classclass__timers.html">class_timers</a>
<a name="l00095"></a>00095    {
<a name="l00096"></a>00096    <span class="keyword">public</span>:
<a name="l00097"></a>00097       <a class="code" href="classclass__timers.html#924a91ae96d721dd432136351c925d9f">class_timers</a>();
<a name="l00098"></a>00098       <a class="code" href="classclass__timers.html#6fd261041314ddd3ada9537530d02afd">~class_timers</a>();
<a name="l00099"></a>00099       <span class="keywordtype">void</span> <a class="code" href="classclass__timers.html#d857a63670354f41759f68d4ea29a0f5">start_timer_thread</a>();
<a name="l00100"></a>00100       <span class="keywordtype">void</span> <a class="code" href="classclass__timers.html#e0066fac671c6adb997d6c075487af89">resume_timer_thread</a>();
<a name="l00101"></a>00101       <span class="keywordtype">void</span> <a class="code" href="classclass__timers.html#a78d9f5ab159ec6b11b4dc4c8f351697">stop_timer_thread</a>();
<a name="l00102"></a>00102       <span class="keywordtype">void</span> <a class="code" href="classclass__timers.html#a27df6346a38fb25acc394cb7998a3f8">set_timer</a>(<a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> value);
<a name="l00103"></a>00103       <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="classclass__timers.html#0fa5bd5d1d4012bf9eef3ffabe990dfb">get_elapsed_time</a>();
<a name="l00104"></a>00104    <span class="keyword">private</span>:
<a name="l00105"></a>00105       <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="classclass__timers.html#e4fe19b5b56b72ce2601d74f6519bd0b">get_timer</a>() <span class="keyword">const</span>;   
<a name="l00106"></a>00106       <span class="keyword">static</span> DWORD WINAPI <a class="code" href="classclass__timers.html#a68dd5b6225b3519b4bc2a0280683c87">timer_loop_thread_proc</a>(<span class="keywordtype">void</span>* arg);
<a name="l00107"></a>00107    <span class="keyword">private</span>:
<a name="l00108"></a><a class="code" href="classclass__timers.html#01c07cb9949b61fce137e60a54d001b9">00108</a>       <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="classclass__timers.html#01c07cb9949b61fce137e60a54d001b9">m_last_occured_alarm_time</a>;
<a name="l00109"></a><a class="code" href="classclass__timers.html#d45784e3a40494a35d5684ab8df0bfc9">00109</a>       <span class="keyword">volatile</span> <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="classclass__timers.html#d45784e3a40494a35d5684ab8df0bfc9">m_last_alarm_set_time</a>;
<a name="l00110"></a><a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">00110</a>       HANDLE <a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a>;
<a name="l00111"></a><a class="code" href="classclass__timers.html#957a0cc71456a57fd5cb640122fe924a">00111</a>       <span class="keyword">volatile</span> <span class="keywordtype">bool</span> <a class="code" href="classclass__timers.html#957a0cc71456a57fd5cb640122fe924a">m_continue_timer_loop</a>;
<a name="l00112"></a><a class="code" href="classclass__timers.html#5fdc6eb0abb2689d078b333b083bfcb0">00112</a>       <span class="keywordtype">bool</span> <a class="code" href="classclass__timers.html#5fdc6eb0abb2689d078b333b083bfcb0">m_use_hi_res_timer</a>;
<a name="l00113"></a><a class="code" href="classclass__timers.html#5bf844fdbe2e70ab6e3e832f688d382b">00113</a>       <span class="keywordtype">double</span> <a class="code" href="classclass__timers.html#5bf844fdbe2e70ab6e3e832f688d382b">m_counts_per_usec</a>;
<a name="l00114"></a>00114    };
<a name="l00115"></a>00115 
<a name="l00116"></a><a class="code" href="classclass__timers.html#924a91ae96d721dd432136351c925d9f">00116</a> <a class="code" href="classclass__timers.html#924a91ae96d721dd432136351c925d9f">class_timers::class_timers</a>() : m_last_occured_alarm_time(<a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>),
<a name="l00117"></a>00117       m_last_alarm_set_time(<a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>),
<a name="l00118"></a>00118       m_timer_thread(0),
<a name="l00119"></a>00119       m_continue_timer_loop(false),
<a name="l00120"></a>00120       m_use_hi_res_timer(false),
<a name="l00121"></a>00121       m_counts_per_usec(0.)
<a name="l00122"></a>00122    {
<a name="l00123"></a>00123    <span class="comment">// initialize hi resolution timer</span>
<a name="l00124"></a>00124    LARGE_INTEGER counts_per_sec = {0, 0};
<a name="l00125"></a>00125    <span class="keywordflow">if</span> (::QueryPerformanceFrequency(&amp;counts_per_sec) &amp;&amp; counts_per_sec.QuadPart &gt; 0)
<a name="l00126"></a>00126       {
<a name="l00127"></a>00127       <a class="code" href="classclass__timers.html#5fdc6eb0abb2689d078b333b083bfcb0">m_use_hi_res_timer</a> = <span class="keyword">true</span>;
<a name="l00128"></a>00128       <a class="code" href="classclass__timers.html#5bf844fdbe2e70ab6e3e832f688d382b">m_counts_per_usec</a> = counts_per_sec.QuadPart / 1000000.;
<a name="l00129"></a>00129       }
<a name="l00130"></a>00130    <a class="code" href="classclass__timers.html#5fdc6eb0abb2689d078b333b083bfcb0">m_use_hi_res_timer</a> = <span class="keyword">true</span>;
<a name="l00131"></a>00131    }
<a name="l00132"></a>00132 
<a name="l00133"></a><a class="code" href="classclass__timers.html#6fd261041314ddd3ada9537530d02afd">00133</a> <a class="code" href="classclass__timers.html#6fd261041314ddd3ada9537530d02afd">class_timers::~class_timers</a>()
<a name="l00134"></a>00134    {
<a name="l00135"></a>00135    <a class="code" href="classclass__timers.html#a78d9f5ab159ec6b11b4dc4c8f351697">stop_timer_thread</a>();
<a name="l00136"></a>00136    }
<a name="l00137"></a>00137 
<a name="l00138"></a>00138 <span class="comment">// time is in micro seconds</span>
<a name="l00139"></a><a class="code" href="classclass__timers.html#e4fe19b5b56b72ce2601d74f6519bd0b">00139</a> <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="classclass__timers.html#e4fe19b5b56b72ce2601d74f6519bd0b">class_timers::get_timer</a>()<span class="keyword"> const</span>
<a name="l00140"></a>00140 <span class="keyword">   </span>{
<a name="l00141"></a>00141    <span class="keywordflow">if</span> (<a class="code" href="classclass__timers.html#5fdc6eb0abb2689d078b333b083bfcb0">m_use_hi_res_timer</a>)
<a name="l00142"></a>00142       {
<a name="l00143"></a>00143       LARGE_INTEGER performance_count = {0, 0};
<a name="l00144"></a>00144       ::QueryPerformanceCounter(&amp;performance_count);
<a name="l00145"></a>00145       <span class="keywordflow">return</span> (<a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a>)(performance_count.QuadPart / <a class="code" href="classclass__timers.html#5bf844fdbe2e70ab6e3e832f688d382b">m_counts_per_usec</a>);
<a name="l00146"></a>00146       }
<a name="l00147"></a>00147    <span class="comment">// hi-res timer is unavailable</span>
<a name="l00148"></a>00148    <span class="keywordflow">return</span> 1000 * ::GetTickCount();
<a name="l00149"></a>00149    }
<a name="l00150"></a>00150 
<a name="l00151"></a><a class="code" href="classclass__timers.html#a68dd5b6225b3519b4bc2a0280683c87">00151</a> DWORD WINAPI <a class="code" href="classclass__timers.html#a68dd5b6225b3519b4bc2a0280683c87">class_timers::timer_loop_thread_proc</a>(<span class="keywordtype">void</span>* arg)
<a name="l00152"></a>00152    {
<a name="l00153"></a>00153    <a class="code" href="classclass__timers.html">class_timers</a>* This = reinterpret_cast&lt;class_timers*&gt;(arg);
<a name="l00154"></a>00154    <span class="keywordflow">while</span> (This-&gt;<a class="code" href="classclass__timers.html#957a0cc71456a57fd5cb640122fe924a">m_continue_timer_loop</a>)
<a name="l00155"></a>00155       {
<a name="l00156"></a>00156       <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> cur_time = This-&gt;<a class="code" href="classclass__timers.html#e4fe19b5b56b72ce2601d74f6519bd0b">get_timer</a>();
<a name="l00157"></a>00157       <span class="keywordflow">if</span> (cur_time &gt;= This-&gt;<a class="code" href="classclass__timers.html#d45784e3a40494a35d5684ab8df0bfc9">m_last_alarm_set_time</a>)
<a name="l00158"></a>00158          {
<a name="l00159"></a>00159          This-&gt;<a class="code" href="classclass__timers.html#01c07cb9949b61fce137e60a54d001b9">m_last_occured_alarm_time</a> = cur_time;
<a name="l00160"></a>00160          This-&gt;<a class="code" href="classclass__timers.html#d45784e3a40494a35d5684ab8df0bfc9">m_last_alarm_set_time</a> = <a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>;         
<a name="l00161"></a>00161          <a class="code" href="timers__unix_8c.html#d7fee43b8a44cf8b7036853593044037">EnterMutex</a>();
<a name="l00162"></a>00162          <a class="code" href="timer_8c.html#fa75192a3238525618f8cb83004930cc">TimeDispatch</a>();
<a name="l00163"></a>00163          <a class="code" href="timers__unix_8c.html#73d9a4eb941fb20cf6b597840510394b">LeaveMutex</a>();
<a name="l00164"></a>00164          }
<a name="l00165"></a>00165       <span class="keywordflow">else</span>
<a name="l00166"></a>00166          {
<a name="l00167"></a>00167          ::Sleep(1);
<a name="l00168"></a>00168          }
<a name="l00169"></a>00169       }
<a name="l00170"></a>00170    <span class="keywordflow">return</span> 0;
<a name="l00171"></a>00171    }
<a name="l00172"></a>00172 
<a name="l00173"></a><a class="code" href="classclass__timers.html#d857a63670354f41759f68d4ea29a0f5">00173</a> <span class="keywordtype">void</span> <a class="code" href="classclass__timers.html#d857a63670354f41759f68d4ea29a0f5">class_timers::start_timer_thread</a>()
<a name="l00174"></a>00174    {
<a name="l00175"></a>00175    <span class="keywordflow">if</span> (<a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a> == 0)
<a name="l00176"></a>00176       {
<a name="l00177"></a>00177       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> thread_id = 0;
<a name="l00178"></a>00178       <a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a> = ::CreateThread(NULL, 0, &amp;<a class="code" href="classclass__timers.html#a68dd5b6225b3519b4bc2a0280683c87">timer_loop_thread_proc</a>, <span class="keyword">this</span>, CREATE_SUSPENDED, &amp;thread_id);
<a name="l00179"></a>00179       <a class="code" href="classclass__timers.html#d45784e3a40494a35d5684ab8df0bfc9">m_last_alarm_set_time</a> = <a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>;
<a name="l00180"></a>00180       <a class="code" href="classclass__timers.html#01c07cb9949b61fce137e60a54d001b9">m_last_occured_alarm_time</a> = <a class="code" href="classclass__timers.html#e4fe19b5b56b72ce2601d74f6519bd0b">get_timer</a>();
<a name="l00181"></a>00181       }
<a name="l00182"></a>00182    }
<a name="l00183"></a>00183 
<a name="l00184"></a><a class="code" href="classclass__timers.html#e0066fac671c6adb997d6c075487af89">00184</a> <span class="keywordtype">void</span> <a class="code" href="classclass__timers.html#e0066fac671c6adb997d6c075487af89">class_timers::resume_timer_thread</a>()
<a name="l00185"></a>00185    {
<a name="l00186"></a>00186    <span class="keywordflow">if</span> (<a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a>)
<a name="l00187"></a>00187       {
<a name="l00188"></a>00188       <a class="code" href="classclass__timers.html#957a0cc71456a57fd5cb640122fe924a">m_continue_timer_loop</a> = <span class="keyword">true</span>;
<a name="l00189"></a>00189       ::ResumeThread(<a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a>);
<a name="l00190"></a>00190       }
<a name="l00191"></a>00191    }
<a name="l00192"></a>00192 
<a name="l00193"></a><a class="code" href="classclass__timers.html#a78d9f5ab159ec6b11b4dc4c8f351697">00193</a> <span class="keywordtype">void</span> <a class="code" href="classclass__timers.html#a78d9f5ab159ec6b11b4dc4c8f351697">class_timers::stop_timer_thread</a>()
<a name="l00194"></a>00194    {
<a name="l00195"></a>00195    <span class="keywordflow">if</span> (<a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a>)
<a name="l00196"></a>00196       {
<a name="l00197"></a>00197       <a class="code" href="classclass__timers.html#957a0cc71456a57fd5cb640122fe924a">m_continue_timer_loop</a> = <span class="keyword">false</span>;
<a name="l00198"></a>00198       ::WaitForSingleObject(<a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a>, INFINITE);
<a name="l00199"></a>00199       ::CloseHandle(<a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a>);
<a name="l00200"></a>00200       <a class="code" href="classclass__timers.html#8d08585f4ba63c21b4636863499b9e05">m_timer_thread</a> = 0;
<a name="l00201"></a>00201       }
<a name="l00202"></a>00202    }
<a name="l00203"></a>00203 
<a name="l00204"></a><a class="code" href="classclass__timers.html#a27df6346a38fb25acc394cb7998a3f8">00204</a> <span class="keywordtype">void</span> <a class="code" href="classclass__timers.html#a27df6346a38fb25acc394cb7998a3f8">class_timers::set_timer</a>(<a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> value)
<a name="l00205"></a>00205    {
<a name="l00206"></a>00206    <a class="code" href="classclass__timers.html#d45784e3a40494a35d5684ab8df0bfc9">m_last_alarm_set_time</a> = (value == <a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>) ? <a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a> : <a class="code" href="classclass__timers.html#e4fe19b5b56b72ce2601d74f6519bd0b">get_timer</a>() + value;
<a name="l00207"></a>00207    }
<a name="l00208"></a>00208 
<a name="l00209"></a>00209 <span class="comment">// elapsed time since last occured alarm</span>
<a name="l00210"></a><a class="code" href="classclass__timers.html#0fa5bd5d1d4012bf9eef3ffabe990dfb">00210</a> <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="classclass__timers.html#0fa5bd5d1d4012bf9eef3ffabe990dfb">class_timers::get_elapsed_time</a>()
<a name="l00211"></a>00211    {
<a name="l00212"></a>00212    <span class="keywordflow">return</span> <a class="code" href="classclass__timers.html#e4fe19b5b56b72ce2601d74f6519bd0b">get_timer</a>() - <a class="code" href="classclass__timers.html#01c07cb9949b61fce137e60a54d001b9">m_last_occured_alarm_time</a>;
<a name="l00213"></a>00213    }
<a name="l00214"></a>00214 
<a name="l00215"></a>00215 <span class="comment">// ----------------------------------------------------------</span>
<a name="l00216"></a>00216 
<a name="l00217"></a>00217 <span class="keyword">static</span> <a class="code" href="classclass__timers.html">class_timers</a> s_timers;
<a name="l00218"></a>00218 
<a name="l00219"></a><a class="code" href="timers__win32_8cpp.html#c9e1731843825eb55e7a94894e6a8ec5">00219</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="l00220"></a>00220    {
<a name="l00221"></a>00221    s_timers.<a class="code" href="classclass__timers.html#d857a63670354f41759f68d4ea29a0f5">start_timer_thread</a>();
<a name="l00222"></a>00222    <span class="comment">// At first, TimeDispatch will call init_callback.</span>
<a name="l00223"></a>00223    <span class="keywordflow">if</span> (init_callback != NULL)
<a name="l00224"></a>00224       <a class="code" href="timer_8c.html#11c2616d78f06ed9144ef662f757b128">SetAlarm</a>(NULL, 0, init_callback, (<a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a>)0, (<a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a>)0);
<a name="l00225"></a>00225    s_timers.<a class="code" href="classclass__timers.html#e0066fac671c6adb997d6c075487af89">resume_timer_thread</a>();
<a name="l00226"></a>00226    }
<a name="l00227"></a>00227 
<a name="l00228"></a><a class="code" href="timers__win32_8cpp.html#8758484f3cebb0cd44bb247c3f23d5e3">00228</a> <span class="keywordtype">void</span> <a class="code" href="timers__unix_8c.html#8758484f3cebb0cd44bb247c3f23d5e3">StopTimerLoop</a>(<span class="keywordtype">void</span>)
<a name="l00229"></a>00229    {
<a name="l00230"></a>00230    s_timers.<a class="code" href="classclass__timers.html#a78d9f5ab159ec6b11b4dc4c8f351697">stop_timer_thread</a>();
<a name="l00231"></a>00231    }
<a name="l00232"></a>00232 
<a name="l00233"></a><a class="code" href="timers__win32_8cpp.html#b8d05dee70f04b5c5190ab00e84da106">00233</a> <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="l00234"></a>00234    {
<a name="l00235"></a>00235    s_timers.<a class="code" href="classclass__timers.html#a27df6346a38fb25acc394cb7998a3f8">set_timer</a>(value);
<a name="l00236"></a>00236    }
<a name="l00237"></a>00237 
<a name="l00238"></a><a class="code" href="timers__win32_8cpp.html#4dccc204d52176bd547ab34d6858f5ba">00238</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="l00239"></a>00239    {
<a name="l00240"></a>00240    <span class="keywordflow">return</span> s_timers.<a class="code" href="classclass__timers.html#0fa5bd5d1d4012bf9eef3ffabe990dfb">get_elapsed_time</a>();
<a name="l00241"></a>00241    }
</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>