doc/doxygen/html/timer_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: src/timer.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_c0a169d39c08973f879fd54f07b9e9f7.html">src</a></div>
<h1>timer.c</h1><a href="timer_8c.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"></span>
<a name="l00006"></a>00006 <span class="comment">See COPYING file for copyrights details.</span>
<a name="l00007"></a>00007 <span class="comment"></span>
<a name="l00008"></a>00008 <span class="comment">This library is free software; you can redistribute it and/or</span>
<a name="l00009"></a>00009 <span class="comment">modify it under the terms of the GNU Lesser General Public</span>
<a name="l00010"></a>00010 <span class="comment">License as published by the Free Software Foundation; either</span>
<a name="l00011"></a>00011 <span class="comment">version 2.1 of the License, or (at your option) any later version.</span>
<a name="l00012"></a>00012 <span class="comment"></span>
<a name="l00013"></a>00013 <span class="comment">This library is distributed in the hope that it will be useful,</span>
<a name="l00014"></a>00014 <span class="comment">but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00015"></a>00015 <span class="comment">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00016"></a>00016 <span class="comment">Lesser General Public License for more details.</span>
<a name="l00017"></a>00017 <span class="comment"></span>
<a name="l00018"></a>00018 <span class="comment">You should have received a copy of the GNU Lesser General Public</span>
<a name="l00019"></a>00019 <span class="comment">License along with this library; if not, write to the Free Software</span>
<a name="l00020"></a>00020 <span class="comment">Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</span>
<a name="l00021"></a>00021 <span class="comment">*/</span>
<a name="l00032"></a>00032 <span class="comment">/* #define DEBUG_WAR_CONSOLE_ON */</span>
<a name="l00033"></a>00033 <span class="comment">/* #define DEBUG_ERR_CONSOLE_ON */</span>
<a name="l00034"></a>00034 
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;<a class="code" href="win32_2applicfg_8h.html">applicfg.h</a>&gt;</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include "<a class="code" href="timer_8h.html">timer.h</a>"</span>
<a name="l00037"></a>00037 
<a name="l00038"></a>00038 <span class="comment">/*  ---------  The timer table --------- */</span>
<a name="l00039"></a><a class="code" href="timer_8c.html#a74e2cf2504bfd18b12f112c7aaad845">00039</a> <a class="code" href="structstruct__s__timer__entry.html">s_timer_entry</a> <a class="code" href="timer_8c.html#a74e2cf2504bfd18b12f112c7aaad845">timers</a>[<a class="code" href="config_8h.html#cbb0f0858383466430c5fcd448391d16">MAX_NB_TIMER</a>] = {{TIMER_FREE, NULL, NULL, 0, 0, 0},};
<a name="l00040"></a>00040 
<a name="l00041"></a><a class="code" href="timer_8c.html#5e9651eed13d70bcce9bdf3489a72a3d">00041</a> <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> <a class="code" href="timer_8c.html#5e9651eed13d70bcce9bdf3489a72a3d">total_sleep_time</a> = <a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>;
<a name="l00042"></a><a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">00042</a> <a class="code" href="timer_8h.html#146f546340de2a44ab2f63681d40de95">TIMER_HANDLE</a> <a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">last_timer_raw</a> = -1;
<a name="l00043"></a>00043 
<a name="l00044"></a><a class="code" href="timer_8c.html#8536312cebeeea3a23dc0027800122c9">00044</a> <span class="preprocessor">#define min_val(a,b) ((a&lt;b)?a:b)</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span>
<a name="l00057"></a><a class="code" href="timer_8h.html#11c2616d78f06ed9144ef662f757b128">00057</a> <a class="code" href="timer_8h.html#146f546340de2a44ab2f63681d40de95">TIMER_HANDLE</a> <a class="code" href="timer_8c.html#11c2616d78f06ed9144ef662f757b128">SetAlarm</a>(<a class="code" href="structstruct__CO__Data.html">CO_Data</a>* <a class="code" href="structstruct__s__timer__entry.html#c08f4de0f4a517ce2bb72f18251cd13c">d</a>, <a class="code" href="hcs12_2applicfg_8h.html#889a782714194ae2f780002d25d6e0be">UNS32</a> <span class="keywordtype">id</span>, <a class="code" href="timer_8h.html#f7d102e060339d3730ceae5fea03691b">TimerCallback_t</a> <a class="code" href="structstruct__s__timer__entry.html#3aaad06b3f938b7af91b790a4dd30669">callback</a>, <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> value, <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> period)
<a name="l00058"></a>00058 {
<a name="l00059"></a>00059         <span class="comment">/*printf("SetAlarm(UNS32 id=%d, TimerCallback_t callback=%x, TIMEVAL value=%d, TIMEVAL period=%d)\n", id, callback, value, period); */</span>
<a name="l00060"></a>00060         <a class="code" href="timer_8h.html#146f546340de2a44ab2f63681d40de95">TIMER_HANDLE</a> i;
<a name="l00061"></a>00061         <a class="code" href="timer_8h.html#146f546340de2a44ab2f63681d40de95">TIMER_HANDLE</a> row_number = TIMER_NONE;
<a name="l00062"></a>00062 
<a name="l00063"></a>00063         <span class="comment">/* in order to decide new timer setting we have to run over all timer rows */</span>
<a name="l00064"></a>00064         <span class="keywordflow">for</span>(i=0; i &lt;= <a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">last_timer_raw</a> + 1 &amp;&amp; i &lt; <a class="code" href="config_8h.html#cbb0f0858383466430c5fcd448391d16">MAX_NB_TIMER</a>; i++)
<a name="l00065"></a>00065         {
<a name="l00066"></a>00066                 <a class="code" href="structstruct__s__timer__entry.html">s_timer_entry</a> *row = (<a class="code" href="timer_8c.html#a74e2cf2504bfd18b12f112c7aaad845">timers</a>+i);
<a name="l00067"></a>00067 
<a name="l00068"></a>00068                 <span class="keywordflow">if</span> (callback &amp;&amp;         <span class="comment">/* if something to store */</span>
<a name="l00069"></a>00069                    row-&gt;state == TIMER_FREE) <span class="comment">/* and empty row */</span>
<a name="l00070"></a>00070                 {       <span class="comment">/* just store */</span>
<a name="l00071"></a>00071                         row-&gt;callback = callback;
<a name="l00072"></a>00072                         row-&gt;d = <a class="code" href="structstruct__s__timer__entry.html#c08f4de0f4a517ce2bb72f18251cd13c">d</a>;
<a name="l00073"></a>00073                         row-&gt;id = <span class="keywordtype">id</span>;
<a name="l00074"></a>00074                         row-&gt;val = value;
<a name="l00075"></a>00075                         row-&gt;interval = period;
<a name="l00076"></a>00076                         row-&gt;state = TIMER_ARMED;
<a name="l00077"></a>00077                         row_number = i;
<a name="l00078"></a>00078                         <span class="keywordflow">break</span>;
<a name="l00079"></a>00079                 }
<a name="l00080"></a>00080         }
<a name="l00081"></a>00081         
<a name="l00082"></a>00082         <span class="keywordflow">if</span> (row_number != TIMER_NONE) <span class="comment">/* if successfull **/</span>
<a name="l00083"></a>00083         {
<a name="l00084"></a>00084                 <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> real_timer_value;
<a name="l00085"></a>00085                 <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> elapsed_time;
<a name="l00086"></a>00086                 
<a name="l00087"></a>00087                 <span class="keywordflow">if</span> (row_number == <a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">last_timer_raw</a> + 1) <a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">last_timer_raw</a>++;
<a name="l00088"></a>00088                 
<a name="l00089"></a>00089                 <span class="comment">/* set next wakeup alarm if new entry is sooner than others, or if it is alone */</span>
<a name="l00090"></a>00090                 real_timer_value = <a class="code" href="timer_8c.html#8536312cebeeea3a23dc0027800122c9">min_val</a>(value, <a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>);
<a name="l00091"></a>00091                 elapsed_time = <a class="code" href="canOpenDriver_8c.html#24dbe63e88d184388542037d16a8208d">getElapsedTime</a>();
<a name="l00092"></a>00092 
<a name="l00093"></a>00093                 <span class="comment">/*printf("elapsed_time=%d real_timer_value=%d total_sleep_time=%d\n", elapsed_time, real_timer_value, total_sleep_time); */</span>
<a name="l00094"></a>00094                 <span class="keywordflow">if</span> (<a class="code" href="timer_8c.html#5e9651eed13d70bcce9bdf3489a72a3d">total_sleep_time</a> &gt; elapsed_time &amp;&amp; <a class="code" href="timer_8c.html#5e9651eed13d70bcce9bdf3489a72a3d">total_sleep_time</a> - elapsed_time &gt; real_timer_value)
<a name="l00095"></a>00095                 {
<a name="l00096"></a>00096                         <a class="code" href="timer_8c.html#5e9651eed13d70bcce9bdf3489a72a3d">total_sleep_time</a> = elapsed_time + real_timer_value;
<a name="l00097"></a>00097                         <a class="code" href="timers__unix_8c.html#b8d05dee70f04b5c5190ab00e84da106">setTimer</a>(real_timer_value);
<a name="l00098"></a>00098                 }
<a name="l00099"></a>00099                 <span class="comment">/*printf("SetAlarm() return %d\n", row_number); */</span>
<a name="l00100"></a>00100                 <span class="keywordflow">return</span> row_number;
<a name="l00101"></a>00101         }
<a name="l00102"></a>00102         <span class="keywordflow">return</span> TIMER_NONE;
<a name="l00103"></a>00103 }
<a name="l00104"></a>00104 
<a name="l00112"></a><a class="code" href="timer_8h.html#991b3cfaac2f201b14d5530f75985c21">00112</a> <a class="code" href="timer_8h.html#146f546340de2a44ab2f63681d40de95">TIMER_HANDLE</a> <a class="code" href="timer_8c.html#991b3cfaac2f201b14d5530f75985c21">DelAlarm</a>(<a class="code" href="timer_8h.html#146f546340de2a44ab2f63681d40de95">TIMER_HANDLE</a> handle)
<a name="l00113"></a>00113 {
<a name="l00114"></a>00114         <span class="comment">/* Quick and dirty. system timer will continue to be trigged, but no action will be preformed. */</span>
<a name="l00115"></a>00115         <a class="code" href="hcs12_2applicfg_8h.html#5f4e5133c4c3113931684d3aba518bba">MSG_WAR</a>(0x3320, <span class="stringliteral">"DelAlarm. handle = "</span>, handle);
<a name="l00116"></a>00116         <span class="keywordflow">if</span>(handle != TIMER_NONE)
<a name="l00117"></a>00117         {
<a name="l00118"></a>00118                 <span class="keywordflow">if</span>(handle == <a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">last_timer_raw</a>) 
<a name="l00119"></a>00119                         <a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">last_timer_raw</a>--;
<a name="l00120"></a>00120                 <a class="code" href="timer_8c.html#a74e2cf2504bfd18b12f112c7aaad845">timers</a>[handle].<a class="code" href="structstruct__s__timer__entry.html#a58939661154282941a8b289d6019064">state</a> = TIMER_FREE;              
<a name="l00121"></a>00121         }
<a name="l00122"></a>00122         <span class="keywordflow">else</span> {
<a name="l00123"></a>00123         }
<a name="l00124"></a>00124         <span class="keywordflow">return</span> TIMER_NONE;
<a name="l00125"></a>00125 }
<a name="l00126"></a>00126 
<a name="l00131"></a><a class="code" href="timer_8h.html#9e5fb60f13faab8705899c5806754864">00131</a> <span class="keywordtype">void</span> <a class="code" href="timer_8c.html#fa75192a3238525618f8cb83004930cc">TimeDispatch</a>()
<a name="l00132"></a>00132 {
<a name="l00133"></a>00133         <a class="code" href="timer_8h.html#146f546340de2a44ab2f63681d40de95">TIMER_HANDLE</a> i;
<a name="l00134"></a>00134         <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> next_wakeup = <a class="code" href="hcs12_2applicfg_8h.html#35b2fd1a5f6b88bf3842ba3663e6f85e">TIMEVAL_MAX</a>; <span class="comment">/* used to compute when should normaly occur next wakeup */</span>
<a name="l00135"></a>00135         <span class="comment">/* First run : change timer state depending on time */</span>
<a name="l00136"></a>00136         <span class="comment">/* Get time since timer signal */</span>
<a name="l00137"></a>00137         <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> overrun = <a class="code" href="canOpenDriver_8c.html#24dbe63e88d184388542037d16a8208d">getElapsedTime</a>();
<a name="l00138"></a>00138         
<a name="l00139"></a>00139         <a class="code" href="hcs12_2applicfg_8h.html#6ae11f09e1ebf40f3562857272fab8bf">TIMEVAL</a> real_total_sleep_time = <a class="code" href="timer_8c.html#5e9651eed13d70bcce9bdf3489a72a3d">total_sleep_time</a> + overrun;
<a name="l00140"></a>00140         <span class="comment">/*printf("total_sleep_time %d + overrun %d\n", total_sleep_time , overrun); */</span>
<a name="l00141"></a>00141 
<a name="l00142"></a>00142         <span class="keywordflow">for</span>(i=0; i &lt;= <a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">last_timer_raw</a>; i++)
<a name="l00143"></a>00143         {
<a name="l00144"></a>00144                 <a class="code" href="structstruct__s__timer__entry.html">s_timer_entry</a> *row = (<a class="code" href="timer_8c.html#a74e2cf2504bfd18b12f112c7aaad845">timers</a>+i);
<a name="l00145"></a>00145 
<a name="l00146"></a>00146                 <span class="keywordflow">if</span> (row-&gt;state &amp; TIMER_ARMED) <span class="comment">/* if row is active */</span>
<a name="l00147"></a>00147                 {
<a name="l00148"></a>00148                         if (row-&gt;val &lt;= real_total_sleep_time) <span class="comment">/* to be trigged */</span>
<a name="l00149"></a>00149                         {
<a name="l00150"></a>00150                                 <span class="comment">/*printf("row-&gt;val(%d) &lt;= (%d)real_total_sleep_time\n", row-&gt;val, real_total_sleep_time); */</span>
<a name="l00151"></a>00151                                 if (!row-&gt;interval) <span class="comment">/* if simply outdated */</span>
<a name="l00152"></a>00152                                 {
<a name="l00153"></a>00153                                         row-&gt;state = TIMER_TRIG; <span class="comment">/* ask for trig */</span>
<a name="l00154"></a>00154                                 }
<a name="l00155"></a>00155                                 <span class="keywordflow">else</span> <span class="comment">/* or period have expired */</span>
<a name="l00156"></a>00156                                 {
<a name="l00157"></a>00157                                         <span class="comment">/* set val as interval, with overrun correction */</span>
<a name="l00158"></a>00158                                         row-&gt;val = row-&gt;interval - (overrun % row-&gt;interval);
<a name="l00159"></a>00159                                         row-&gt;state = TIMER_TRIG_PERIOD; <span class="comment">/* ask for trig, periodic */</span>
<a name="l00160"></a>00160                                         <span class="comment">/* Check if this new timer value is the soonest */</span>
<a name="l00161"></a>00161                                         next_wakeup = <a class="code" href="timer_8c.html#8536312cebeeea3a23dc0027800122c9">min_val</a>(row-&gt;val,next_wakeup);
<a name="l00162"></a>00162                                 }
<a name="l00163"></a>00163                         }
<a name="l00164"></a>00164                         <span class="keywordflow">else</span>
<a name="l00165"></a>00165                         {
<a name="l00166"></a>00166                                 <span class="comment">/* Each armed timer value in decremented. */</span>
<a name="l00167"></a>00167                                 row-&gt;val -= real_total_sleep_time;
<a name="l00168"></a>00168 
<a name="l00169"></a>00169                                 <span class="comment">/* Check if this new timer value is the soonest */</span>
<a name="l00170"></a>00170                                 next_wakeup = <a class="code" href="timer_8c.html#8536312cebeeea3a23dc0027800122c9">min_val</a>(row-&gt;val,next_wakeup);
<a name="l00171"></a>00171                         }
<a name="l00172"></a>00172                 }
<a name="l00173"></a>00173         }
<a name="l00174"></a>00174         
<a name="l00175"></a>00175         <span class="comment">/* Remember how much time we should sleep. */</span>
<a name="l00176"></a>00176         <a class="code" href="timer_8c.html#5e9651eed13d70bcce9bdf3489a72a3d">total_sleep_time</a> = next_wakeup;
<a name="l00177"></a>00177 
<a name="l00178"></a>00178         <span class="comment">/* Set timer to soonest occurence */</span>
<a name="l00179"></a>00179         <a class="code" href="timers__unix_8c.html#b8d05dee70f04b5c5190ab00e84da106">setTimer</a>(next_wakeup);
<a name="l00180"></a>00180 
<a name="l00181"></a>00181         <span class="comment">/* Then trig them or not. */</span>
<a name="l00182"></a>00182         <span class="keywordflow">for</span>(i=0; i&lt;=<a class="code" href="timer_8c.html#1dab7b9a29bdee8b1931f8ea90685c6f">last_timer_raw</a>; i++)
<a name="l00183"></a>00183         {
<a name="l00184"></a>00184                 <a class="code" href="structstruct__s__timer__entry.html">s_timer_entry</a> *row = (<a class="code" href="timer_8c.html#a74e2cf2504bfd18b12f112c7aaad845">timers</a>+i);
<a name="l00185"></a>00185 
<a name="l00186"></a>00186                 <span class="keywordflow">if</span> (row-&gt;state &amp; TIMER_TRIG)
<a name="l00187"></a>00187                 {
<a name="l00188"></a>00188                         row-&gt;state &amp;= ~TIMER_TRIG; <span class="comment">/* reset trig state (will be free if not periodic) */</span>
<a name="l00189"></a>00189                         <span class="keywordflow">if</span>(row-&gt;callback)
<a name="l00190"></a>00190                                 (*row-&gt;callback)(row-&gt;d, row-&gt;id); <span class="comment">/* trig ! */</span>
<a name="l00191"></a>00191                 }
<a name="l00192"></a>00192         }
<a name="l00193"></a>00193 }
<a name="l00194"></a>00194 
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Fri Jun 8 08:51:39 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>