doc/doxygen/html/can__peak__win32_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/can_peak_win32/can_peak_win32.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_cd779dce9851c080a65607e200b2368c.html">can_peak_win32</a></div>
<h1>can_peak_win32.c</h1><a href="can__peak__win32_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="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="preprocessor">#if defined(WIN32) &amp;&amp; !defined(__CYGWIN__)</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#define usleep(micro) Sleep(micro%1000 ? (micro/1000) + 1 : (micro/1000))</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;string.h&gt;</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;errno.h&gt;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;fcntl.h&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#endif</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span>
<a name="l00032"></a>00032 <span class="preprocessor">#include "cancfg.h"</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include "<a class="code" href="can__driver_8h.html">can_driver.h</a>"</span>
<a name="l00034"></a>00034 
<a name="l00035"></a>00035 <span class="preprocessor">#ifndef extra_PCAN_init_params</span>
<a name="l00036"></a><a class="code" href="can__peak__win32_8c.html#6c15c0d426ae2e61f69f3119d3fe486b">00036</a> <span class="preprocessor"></span><span class="preprocessor">        #define extra_PCAN_init_params </span>
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">        #define extra_PCAN_init_params\</span>
<a name="l00039"></a>00039 <span class="preprocessor">                ,getenv("PCANHwType") ? strtol(getenv("PCANHwType"),NULL,0):0\</span>
<a name="l00040"></a>00040 <span class="preprocessor">                ,getenv("PCANIO_Port") ? strtol(getenv("PCANIO_Port"),NULL,0):0\</span>
<a name="l00041"></a>00041 <span class="preprocessor">                ,getenv("PCANInterupt") ? strtol(getenv("PCANInterupt"),NULL,0):0</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00043"></a>00043 <span class="preprocessor"></span>
<a name="l00044"></a>00044 <span class="keyword">static</span> <a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *first_board = NULL;
<a name="l00045"></a>00045 <span class="preprocessor">#ifdef PCAN2_HEADER_</span>
<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="keyword">static</span> <a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *second_board = NULL;
<a name="l00047"></a>00047 <span class="preprocessor">#endif</span>
<a name="l00048"></a>00048 <span class="preprocessor"></span>
<a name="l00049"></a>00049 <span class="comment">//pthread_mutex_t PeakCan_mutex = PTHREAD_MUTEX_INITIALIZER;</span>
<a name="l00050"></a>00050 
<a name="l00051"></a>00051 <span class="comment">// Define for rtr CAN message</span>
<a name="l00052"></a><a class="code" href="can__peak__win32_8c.html#44ef8a15c3be0d9b410c0c21709a12c2">00052</a> <span class="preprocessor">#define CAN_INIT_TYPE_ST_RTR MSGTYPE_STANDARD | MSGTYPE_RTR</span>
<a name="l00053"></a>00053 <span class="preprocessor"></span>
<a name="l00054"></a>00054 <span class="comment">/***************************************************************************/</span>
<a name="l00055"></a><a class="code" href="can__peak__win32_8c.html#6820d7fa32e6e79d432c6003e4c15c32">00055</a> <span class="keywordtype">int</span> <a class="code" href="can__peak__linux_8c.html#6820d7fa32e6e79d432c6003e4c15c32">TranslateBaudeRate</a>(<span class="keywordtype">char</span>* <a class="code" href="TestMasterSlave_2getopt_8c.html#db50a0eab9fed92fc3bfc7dfa4f2c410">optarg</a>){
<a name="l00056"></a>00056         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"1M"</span>)) <span class="keywordflow">return</span> CAN_BAUD_1M;
<a name="l00057"></a>00057         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"500K"</span>)) <span class="keywordflow">return</span> CAN_BAUD_500K;
<a name="l00058"></a>00058         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"250K"</span>)) <span class="keywordflow">return</span> CAN_BAUD_250K;
<a name="l00059"></a>00059         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"125K"</span>)) <span class="keywordflow">return</span> CAN_BAUD_125K;
<a name="l00060"></a>00060         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"100K"</span>)) <span class="keywordflow">return</span> CAN_BAUD_100K;
<a name="l00061"></a>00061         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"50K"</span>)) <span class="keywordflow">return</span> CAN_BAUD_50K;
<a name="l00062"></a>00062         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"20K"</span>)) <span class="keywordflow">return</span> CAN_BAUD_20K;
<a name="l00063"></a>00063         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"10K"</span>)) <span class="keywordflow">return</span> CAN_BAUD_10K;
<a name="l00064"></a>00064         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"5K"</span>)) <span class="keywordflow">return</span> CAN_BAUD_5K;
<a name="l00065"></a>00065         <span class="keywordflow">if</span>(!strcmp( optarg, <span class="stringliteral">"none"</span>)) <span class="keywordflow">return</span> 0;
<a name="l00066"></a>00066         <span class="keywordflow">return</span> 0x0000;
<a name="l00067"></a>00067 }
<a name="l00068"></a>00068 
<a name="l00069"></a>00069 <span class="keywordtype">void</span>
<a name="l00070"></a><a class="code" href="can__peak__win32_8c.html#9f623ce2d3a68e90dfdb1ff0d54a9b57">00070</a> <a class="code" href="can__peak__win32_8c.html#9f623ce2d3a68e90dfdb1ff0d54a9b57">canInit</a> (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *board)
<a name="l00071"></a>00071 {
<a name="l00072"></a>00072         <span class="keywordtype">int</span> baudrate;
<a name="l00073"></a>00073         
<a name="l00074"></a>00074 <span class="preprocessor">#ifdef PCAN2_HEADER_</span>
<a name="l00075"></a>00075 <span class="preprocessor"></span>        <span class="comment">// if not the first handler</span>
<a name="l00076"></a>00076         <span class="keywordflow">if</span>(second_board == (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)board)
<a name="l00077"></a>00077                 <span class="keywordflow">if</span>(baudrate = <a class="code" href="can__peak__linux_8c.html#6820d7fa32e6e79d432c6003e4c15c32">TranslateBaudeRate</a>(board-&gt;<a class="code" href="structstruct__s__BOARD.html#5316679ded23cf846c63c06ab51a4646">baudrate</a>))
<a name="l00078"></a>00078                         CAN2_Init (baudrate,
<a name="l00079"></a>00079                           CAN_INIT_TYPE_ST <a class="code" href="can__peak__win32_8c.html#6c15c0d426ae2e61f69f3119d3fe486b">extra_PCAN_init_params</a>);
<a name="l00080"></a>00080 <span class="preprocessor">#endif</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span>        <span class="keywordflow">if</span>(first_board == (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)board)
<a name="l00082"></a>00082                 <span class="keywordflow">if</span>(baudrate = <a class="code" href="can__peak__linux_8c.html#6820d7fa32e6e79d432c6003e4c15c32">TranslateBaudeRate</a>(board-&gt;<a class="code" href="structstruct__s__BOARD.html#5316679ded23cf846c63c06ab51a4646">baudrate</a>))
<a name="l00083"></a>00083                         CAN_Init (baudrate,
<a name="l00084"></a>00084                           CAN_INIT_TYPE_ST extra_PCAN_init_params);
<a name="l00085"></a>00085 }
<a name="l00086"></a>00086 
<a name="l00087"></a>00087 <span class="comment">/*********functions which permit to communicate with the board****************/</span>
<a name="l00088"></a>00088 <a class="code" href="hcs12_2applicfg_8h.html#539234687760592d01a8b0d3357bc00e">UNS8</a>
<a name="l00089"></a><a class="code" href="can__peak__win32_8c.html#6b3248e95acf2b08d1fd8b42610cc5a6">00089</a> <a class="code" href="can__lincan_8c.html#6b3248e95acf2b08d1fd8b42610cc5a6">canReceive_driver</a> (<a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a> fd0, <a class="code" href="structMessage.html">Message</a> * m)
<a name="l00090"></a>00090 {
<a name="l00091"></a>00091         <a class="code" href="hcs12_2applicfg_8h.html#539234687760592d01a8b0d3357bc00e">UNS8</a> data;
<a name="l00092"></a>00092         TPCANMsg peakMsg;
<a name="l00093"></a>00093 
<a name="l00094"></a>00094         DWORD Res;
<a name="l00095"></a>00095 
<a name="l00096"></a>00096         <span class="keywordflow">do</span>{
<a name="l00097"></a>00097                 <span class="comment">// We read the queue looking for messages.</span>
<a name="l00098"></a>00098                 <span class="comment">// </span>
<a name="l00099"></a>00099                 <span class="comment">//pthread_mutex_lock (&amp;PeakCan_mutex);</span>
<a name="l00100"></a>00100 <span class="preprocessor">#ifdef PCAN2_HEADER_</span>
<a name="l00101"></a>00101 <span class="preprocessor"></span>                <span class="comment">// if not the first handler</span>
<a name="l00102"></a>00102                 <span class="keywordflow">if</span>(second_board == (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)fd0)
<a name="l00103"></a>00103                         Res = CAN2_Read (&amp;peakMsg);
<a name="l00104"></a>00104                 <span class="keywordflow">else</span>
<a name="l00105"></a>00105 <span class="preprocessor">#endif</span>
<a name="l00106"></a>00106 <span class="preprocessor"></span>                <span class="keywordflow">if</span>(first_board == (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)fd0)
<a name="l00107"></a>00107                         Res = CAN_Read (&amp;peakMsg);
<a name="l00108"></a>00108                 <span class="keywordflow">else</span>
<a name="l00109"></a>00109                         Res = CAN_ERR_BUSOFF;
<a name="l00110"></a>00110         
<a name="l00111"></a>00111                 <span class="comment">// A message was received</span>
<a name="l00112"></a>00112                 <span class="comment">// We process the message(s)</span>
<a name="l00113"></a>00113                 <span class="comment">// </span>
<a name="l00114"></a>00114                 <span class="keywordflow">if</span> (Res == CAN_ERR_OK)
<a name="l00115"></a>00115                 {
<a name="l00116"></a>00116                         <span class="comment">// if something different that 11bit or rtr... problem</span>
<a name="l00117"></a>00117                         <span class="keywordflow">if</span> (peakMsg.MSGTYPE &amp; ~(MSGTYPE_STANDARD | MSGTYPE_RTR))
<a name="l00118"></a>00118                         {
<a name="l00119"></a>00119                                 <span class="keywordflow">if</span> (peakMsg.MSGTYPE == CAN_ERR_BUSOFF)
<a name="l00120"></a>00120                                 {
<a name="l00121"></a>00121                                         printf (<span class="stringliteral">"!!! Peak board read : re-init\n"</span>);
<a name="l00122"></a>00122                                         <a class="code" href="can__peak__win32_8c.html#9f623ce2d3a68e90dfdb1ff0d54a9b57">canInit</a>((<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a>*) fd0);
<a name="l00123"></a>00123                                         usleep (10000);
<a name="l00124"></a>00124                                 }
<a name="l00125"></a>00125         
<a name="l00126"></a>00126                                 <span class="comment">// If status, return status if 29bit, return overrun</span>
<a name="l00127"></a>00127                                 <span class="comment">//pthread_mutex_unlock (&amp;PeakCan_mutex);</span>
<a name="l00128"></a>00128                                 <span class="keywordflow">return</span> peakMsg.MSGTYPE ==
<a name="l00129"></a>00129                                         MSGTYPE_STATUS ? peakMsg.DATA[2] : CAN_ERR_OVERRUN;
<a name="l00130"></a>00130                         }
<a name="l00131"></a>00131                         m-&gt;<a class="code" href="structMessage.html#c5d40bde75d015beb48293c052a218b5">cob_id</a>.<a class="code" href="structSHORT__CAN.html#614e1c6a40f1261e2b15ad69b19e9698">w</a> = peakMsg.ID;
<a name="l00132"></a>00132                         <span class="keywordflow">if</span> (peakMsg.MSGTYPE == CAN_INIT_TYPE_ST)        <span class="comment">/* bits of MSGTYPE_ */</span>
<a name="l00133"></a>00133                                 m-&gt;<a class="code" href="structMessage.html#41c5a4e7eaeb2c2ae1af2b2c83129615">rtr</a> = 0;
<a name="l00134"></a>00134                         <span class="keywordflow">else</span>
<a name="l00135"></a>00135                                 m-&gt;<a class="code" href="structMessage.html#41c5a4e7eaeb2c2ae1af2b2c83129615">rtr</a> = 1;
<a name="l00136"></a>00136                         m-&gt;<a class="code" href="structMessage.html#d1dd9a88dda088ff4c7073d49613613d">len</a> = peakMsg.LEN;   <span class="comment">/* count of data bytes (0..8) */</span>
<a name="l00137"></a>00137                         <span class="keywordflow">for</span> (data = 0; data &lt; peakMsg.LEN; data++)
<a name="l00138"></a>00138                                 m-&gt;<a class="code" href="structMessage.html#229865b09691e658677ba76f2d82ce89">data</a>[data] = peakMsg.DATA[data];     <span class="comment">/* data bytes, up to 8 */</span>
<a name="l00139"></a>00139         
<a name="l00140"></a>00140                 }<span class="keywordflow">else</span>{
<a name="l00141"></a>00141                 <span class="comment">//pthread_mutex_unlock (&amp;PeakCan_mutex);</span>
<a name="l00142"></a>00142                 <span class="comment">//if (Res != CAN_ERR_OK)</span>
<a name="l00143"></a>00143                 <span class="comment">//{</span>
<a name="l00144"></a>00144                         <span class="keywordflow">if</span> (!
<a name="l00145"></a>00145                                 (Res &amp; CAN_ERR_QRCVEMPTY || Res &amp; CAN_ERR_BUSLIGHT
<a name="l00146"></a>00146                                  || Res &amp; CAN_ERR_BUSHEAVY))
<a name="l00147"></a>00147                         {
<a name="l00148"></a>00148                                 printf (<span class="stringliteral">"canReceive returned error (%d)\n"</span>, Res);
<a name="l00149"></a>00149                                 <span class="keywordflow">return</span> 1;
<a name="l00150"></a>00150                         }
<a name="l00151"></a>00151                         usleep (1000);          
<a name="l00152"></a>00152                 }
<a name="l00153"></a>00153         }<span class="keywordflow">while</span>(Res != CAN_ERR_OK);
<a name="l00154"></a>00154         <span class="keywordflow">return</span> 0;
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156 
<a name="l00157"></a>00157 <span class="comment">/***************************************************************************/</span>
<a name="l00158"></a>00158 <a class="code" href="hcs12_2applicfg_8h.html#539234687760592d01a8b0d3357bc00e">UNS8</a>
<a name="l00159"></a><a class="code" href="can__peak__win32_8c.html#def95aee49efa13dd047d0b3b5507ad3">00159</a> <a class="code" href="can__lincan_8c.html#def95aee49efa13dd047d0b3b5507ad3">canSend_driver</a> (<a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a> fd0, <a class="code" href="structMessage.html">Message</a> * m)
<a name="l00160"></a>00160 {
<a name="l00161"></a>00161         <a class="code" href="hcs12_2applicfg_8h.html#539234687760592d01a8b0d3357bc00e">UNS8</a> data;
<a name="l00162"></a>00162         TPCANMsg peakMsg;
<a name="l00163"></a>00163         peakMsg.ID = m-&gt;<a class="code" href="structMessage.html#c5d40bde75d015beb48293c052a218b5">cob_id</a>.<a class="code" href="structSHORT__CAN.html#614e1c6a40f1261e2b15ad69b19e9698">w</a>;       <span class="comment">/* 11/29 bit code */</span>
<a name="l00164"></a>00164         <span class="keywordflow">if</span> (m-&gt;<a class="code" href="structMessage.html#41c5a4e7eaeb2c2ae1af2b2c83129615">rtr</a> == 0)
<a name="l00165"></a>00165                 peakMsg.MSGTYPE = CAN_INIT_TYPE_ST;     <span class="comment">/* bits of MSGTYPE_ */</span>
<a name="l00166"></a>00166         <span class="keywordflow">else</span>
<a name="l00167"></a>00167         {
<a name="l00168"></a>00168                 peakMsg.MSGTYPE = <a class="code" href="can__peak__linux_8c.html#44ef8a15c3be0d9b410c0c21709a12c2">CAN_INIT_TYPE_ST_RTR</a>; <span class="comment">/* bits of MSGTYPE_ */</span>
<a name="l00169"></a>00169         }
<a name="l00170"></a>00170         peakMsg.LEN = m-&gt;<a class="code" href="structMessage.html#d1dd9a88dda088ff4c7073d49613613d">len</a>;
<a name="l00171"></a>00171         <span class="comment">/* count of data bytes (0..8) */</span>
<a name="l00172"></a>00172         <span class="keywordflow">for</span> (data = 0; data &lt; m-&gt;<a class="code" href="structMessage.html#d1dd9a88dda088ff4c7073d49613613d">len</a>; data++)
<a name="l00173"></a>00173                 peakMsg.DATA[data] = m-&gt;<a class="code" href="structMessage.html#229865b09691e658677ba76f2d82ce89">data</a>[data];     <span class="comment">/* data bytes, up to 8 */</span>
<a name="l00174"></a>00174         <span class="keywordflow">do</span>
<a name="l00175"></a>00175         {
<a name="l00176"></a>00176 #ifdef PCAN2_HEADER_
<a name="l00177"></a>00177                 <span class="comment">// if not the first handler</span>
<a name="l00178"></a>00178                 <span class="keywordflow">if</span>(second_board == (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)fd0)
<a name="l00179"></a>00179                         errno = CAN2_Write (&amp;peakMsg);
<a name="l00180"></a>00180                 <span class="keywordflow">else</span> 
<a name="l00181"></a>00181 <span class="preprocessor">#endif</span>
<a name="l00182"></a>00182 <span class="preprocessor"></span>                <span class="keywordflow">if</span>(first_board == (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)fd0)
<a name="l00183"></a>00183                         errno = CAN_Write (&amp;peakMsg);
<a name="l00184"></a>00184                 <span class="keywordflow">else</span> 
<a name="l00185"></a>00185                         <span class="keywordflow">goto</span> fail;
<a name="l00186"></a>00186                 <span class="keywordflow">if</span> (errno)
<a name="l00187"></a>00187                 {
<a name="l00188"></a>00188                         <span class="keywordflow">if</span> (errno == CAN_ERR_BUSOFF)
<a name="l00189"></a>00189                         {
<a name="l00190"></a>00190                                 printf (<span class="stringliteral">"!!! Peak board write : re-init\n"</span>);
<a name="l00191"></a>00191                                 <a class="code" href="can__peak__win32_8c.html#9f623ce2d3a68e90dfdb1ff0d54a9b57">canInit</a>((<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a>*)fd0);
<a name="l00192"></a>00192                                 usleep (10000);
<a name="l00193"></a>00193                         }
<a name="l00194"></a>00194                         usleep (1000);
<a name="l00195"></a>00195                 }
<a name="l00196"></a>00196         }
<a name="l00197"></a>00197         <span class="keywordflow">while</span> (errno != CAN_ERR_OK);
<a name="l00198"></a>00198         <span class="keywordflow">return</span> 0;
<a name="l00199"></a>00199 fail:
<a name="l00200"></a>00200         <span class="keywordflow">return</span> 1;
<a name="l00201"></a>00201 }
<a name="l00202"></a>00202 
<a name="l00203"></a>00203 <span class="comment">/***************************************************************************/</span>
<a name="l00204"></a>00204 <a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a>
<a name="l00205"></a><a class="code" href="can__peak__win32_8c.html#945403aba7f36acbd2e7160ade361bab">00205</a> <a class="code" href="can__lincan_8c.html#945403aba7f36acbd2e7160ade361bab">canOpen_driver</a> (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> * board)
<a name="l00206"></a>00206 {
<a name="l00207"></a>00207 <span class="preprocessor">#ifdef PCAN2_HEADER_</span>
<a name="l00208"></a>00208 <span class="preprocessor"></span>        <span class="keywordflow">if</span>(first_board != NULL &amp;&amp; second_board != NULL)
<a name="l00209"></a>00209 <span class="preprocessor">#else</span>
<a name="l00210"></a>00210 <span class="preprocessor"></span>        <span class="keywordflow">if</span>(first_board != NULL)
<a name="l00211"></a>00211 <span class="preprocessor">#endif</span>
<a name="l00212"></a>00212 <span class="preprocessor"></span>        {
<a name="l00213"></a>00213                 fprintf (stderr, <span class="stringliteral">"Open failed.\n"</span>);
<a name="l00214"></a>00214                 fprintf (stderr,
<a name="l00215"></a>00215                                  <span class="stringliteral">"can_peak_win32.c: no more can port available with this pcan library\n"</span>);
<a name="l00216"></a>00216                 fprintf (stderr,
<a name="l00217"></a>00217                                  <span class="stringliteral">"can_peak_win32.c: please link another executable with another pcan lib\n"</span>);
<a name="l00218"></a>00218                 <span class="keywordflow">return</span> NULL;
<a name="l00219"></a>00219         }
<a name="l00220"></a>00220 
<a name="l00221"></a>00221 <span class="preprocessor">#ifdef PCAN2_HEADER_</span>
<a name="l00222"></a>00222 <span class="preprocessor"></span>        <span class="keywordflow">if</span>(first_board == NULL)
<a name="l00223"></a>00223                 first_board = board;
<a name="l00224"></a>00224         <span class="keywordflow">else</span>
<a name="l00225"></a>00225                 second_board = board; 
<a name="l00226"></a>00226 <span class="preprocessor">#else</span>
<a name="l00227"></a>00227 <span class="preprocessor"></span>        first_board = board;
<a name="l00228"></a>00228 <span class="preprocessor">#endif</span>
<a name="l00229"></a>00229 <span class="preprocessor"></span>
<a name="l00230"></a>00230         <a class="code" href="can__peak__win32_8c.html#9f623ce2d3a68e90dfdb1ff0d54a9b57">canInit</a>(board);
<a name="l00231"></a>00231         
<a name="l00232"></a>00232         <span class="keywordflow">return</span> (<a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a>)board;
<a name="l00233"></a>00233 }
<a name="l00234"></a>00234 
<a name="l00235"></a>00235 <span class="comment">/***************************************************************************/</span>
<a name="l00236"></a>00236 <span class="keywordtype">int</span>
<a name="l00237"></a><a class="code" href="can__peak__win32_8c.html#76e6a915d0e40a23b863198b2aaa5545">00237</a> <a class="code" href="can__lincan_8c.html#76e6a915d0e40a23b863198b2aaa5545">canClose_driver</a> (<a class="code" href="unix_2applicfg_8h.html#712c7b28987b12b8d400df19c92d0f5e">CAN_HANDLE</a> fd0)
<a name="l00238"></a>00238 {
<a name="l00239"></a>00239 <span class="preprocessor">#ifdef PCAN2_HEADER_</span>
<a name="l00240"></a>00240 <span class="preprocessor"></span>        <span class="comment">// if not the first handler</span>
<a name="l00241"></a>00241         <span class="keywordflow">if</span>(second_board == (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)fd0)
<a name="l00242"></a>00242         {
<a name="l00243"></a>00243                 CAN2_Close ();
<a name="l00244"></a>00244                 second_board = (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)NULL;
<a name="l00245"></a>00245         }<span class="keywordflow">else</span>   
<a name="l00246"></a>00246 <span class="preprocessor">#endif</span>
<a name="l00247"></a>00247 <span class="preprocessor"></span>        <span class="keywordflow">if</span>(first_board == (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)fd0)
<a name="l00248"></a>00248         {
<a name="l00249"></a>00249                 CAN_Close ();
<a name="l00250"></a>00250                 first_board = (<a class="code" href="structstruct__s__BOARD.html">s_BOARD</a> *)NULL;
<a name="l00251"></a>00251         }
<a name="l00252"></a>00252         <span class="keywordflow">return</span> 0;
<a name="l00253"></a>00253 }
</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>