diff -r 6efc85c5493e -r 1c1e3599d66a doc/doxygen/html/can__peak__win32_8c-source.html --- a/doc/doxygen/html/can__peak__win32_8c-source.html Mon Feb 11 11:00:12 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,279 +0,0 @@ - -
-00001 /* -00002 This file is part of CanFestival, a library implementing CanOpen Stack. -00003 -00004 Copyright (C): Edouard TISSERANT and Francis DUPIN -00005 -00006 See COPYING file for copyrights details. -00007 -00008 This library is free software; you can redistribute it and/or -00009 modify it under the terms of the GNU Lesser General Public -00010 License as published by the Free Software Foundation; either -00011 version 2.1 of the License, or (at your option) any later version. -00012 -00013 This library is distributed in the hope that it will be useful, -00014 but WITHOUT ANY WARRANTY; without even the implied warranty of -00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -00016 Lesser General Public License for more details. -00017 -00018 You should have received a copy of the GNU Lesser General Public -00019 License along with this library; if not, write to the Free Software -00020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -00021 */ -00022 -00023 #if defined(WIN32) && !defined(__CYGWIN__) -00024 #define usleep(micro) Sleep(micro%1000 ? (micro/1000) + 1 : (micro/1000)) -00025 #else -00026 #include <stdio.h> -00027 #include <string.h> -00028 #include <errno.h> -00029 #include <fcntl.h> -00030 #endif -00031 -00032 #include "cancfg.h" -00033 #include "can_driver.h" -00034 -00035 #ifndef extra_PCAN_init_params -00036 #define extra_PCAN_init_params -00037 #else -00038 #define extra_PCAN_init_params\ -00039 ,getenv("PCANHwType") ? strtol(getenv("PCANHwType"),NULL,0):0\ -00040 ,getenv("PCANIO_Port") ? strtol(getenv("PCANIO_Port"),NULL,0):0\ -00041 ,getenv("PCANInterupt") ? strtol(getenv("PCANInterupt"),NULL,0):0 -00042 #endif -00043 -00044 static s_BOARD *first_board = NULL; -00045 #ifdef PCAN2_HEADER_ -00046 static s_BOARD *second_board = NULL; -00047 #endif -00048 -00049 //pthread_mutex_t PeakCan_mutex = PTHREAD_MUTEX_INITIALIZER; -00050 -00051 // Define for rtr CAN message -00052 #define CAN_INIT_TYPE_ST_RTR MSGTYPE_STANDARD | MSGTYPE_RTR -00053 -00054 /***************************************************************************/ -00055 int TranslateBaudeRate(char* optarg){ -00056 if(!strcmp( optarg, "1M")) return CAN_BAUD_1M; -00057 if(!strcmp( optarg, "500K")) return CAN_BAUD_500K; -00058 if(!strcmp( optarg, "250K")) return CAN_BAUD_250K; -00059 if(!strcmp( optarg, "125K")) return CAN_BAUD_125K; -00060 if(!strcmp( optarg, "100K")) return CAN_BAUD_100K; -00061 if(!strcmp( optarg, "50K")) return CAN_BAUD_50K; -00062 if(!strcmp( optarg, "20K")) return CAN_BAUD_20K; -00063 if(!strcmp( optarg, "10K")) return CAN_BAUD_10K; -00064 if(!strcmp( optarg, "5K")) return CAN_BAUD_5K; -00065 if(!strcmp( optarg, "none")) return 0; -00066 return 0x0000; -00067 } -00068 -00069 void -00070 canInit (s_BOARD *board) -00071 { -00072 int baudrate; -00073 -00074 #ifdef PCAN2_HEADER_ -00075 // if not the first handler -00076 if(second_board == (s_BOARD *)board) -00077 if(baudrate = TranslateBaudeRate(board->baudrate)) -00078 CAN2_Init (baudrate, -00079 CAN_INIT_TYPE_ST extra_PCAN_init_params); -00080 #endif -00081 if(first_board == (s_BOARD *)board) -00082 if(baudrate = TranslateBaudeRate(board->baudrate)) -00083 CAN_Init (baudrate, -00084 CAN_INIT_TYPE_ST extra_PCAN_init_params); -00085 } -00086 -00087 /*********functions which permit to communicate with the board****************/ -00088 UNS8 -00089 canReceive_driver (CAN_HANDLE fd0, Message * m) -00090 { -00091 UNS8 data; -00092 TPCANMsg peakMsg; -00093 -00094 DWORD Res; -00095 -00096 do{ -00097 // We read the queue looking for messages. -00098 // -00099 //pthread_mutex_lock (&PeakCan_mutex); -00100 #ifdef PCAN2_HEADER_ -00101 // if not the first handler -00102 if(second_board == (s_BOARD *)fd0) -00103 Res = CAN2_Read (&peakMsg); -00104 else -00105 #endif -00106 if(first_board == (s_BOARD *)fd0) -00107 Res = CAN_Read (&peakMsg); -00108 else -00109 Res = CAN_ERR_BUSOFF; -00110 -00111 // A message was received -00112 // We process the message(s) -00113 // -00114 if (Res == CAN_ERR_OK) -00115 { -00116 // if something different that 11bit or rtr... problem -00117 if (peakMsg.MSGTYPE & ~(MSGTYPE_STANDARD | MSGTYPE_RTR)) -00118 { -00119 if (peakMsg.MSGTYPE == CAN_ERR_BUSOFF) -00120 { -00121 printf ("!!! Peak board read : re-init\n"); -00122 canInit((s_BOARD*) fd0); -00123 usleep (10000); -00124 } -00125 -00126 // If status, return status if 29bit, return overrun -00127 //pthread_mutex_unlock (&PeakCan_mutex); -00128 return peakMsg.MSGTYPE == -00129 MSGTYPE_STATUS ? peakMsg.DATA[2] : CAN_ERR_OVERRUN; -00130 } -00131 m->cob_id.w = peakMsg.ID; -00132 if (peakMsg.MSGTYPE == CAN_INIT_TYPE_ST) /* bits of MSGTYPE_ */ -00133 m->rtr = 0; -00134 else -00135 m->rtr = 1; -00136 m->len = peakMsg.LEN; /* count of data bytes (0..8) */ -00137 for (data = 0; data < peakMsg.LEN; data++) -00138 m->data[data] = peakMsg.DATA[data]; /* data bytes, up to 8 */ -00139 -00140 }else{ -00141 //pthread_mutex_unlock (&PeakCan_mutex); -00142 //if (Res != CAN_ERR_OK) -00143 //{ -00144 if (! -00145 (Res & CAN_ERR_QRCVEMPTY || Res & CAN_ERR_BUSLIGHT -00146 || Res & CAN_ERR_BUSHEAVY)) -00147 { -00148 printf ("canReceive returned error (%d)\n", Res); -00149 return 1; -00150 } -00151 usleep (1000); -00152 } -00153 }while(Res != CAN_ERR_OK); -00154 return 0; -00155 } -00156 -00157 /***************************************************************************/ -00158 UNS8 -00159 canSend_driver (CAN_HANDLE fd0, Message * m) -00160 { -00161 UNS8 data; -00162 TPCANMsg peakMsg; -00163 peakMsg.ID = m->cob_id.w; /* 11/29 bit code */ -00164 if (m->rtr == 0) -00165 peakMsg.MSGTYPE = CAN_INIT_TYPE_ST; /* bits of MSGTYPE_ */ -00166 else -00167 { -00168 peakMsg.MSGTYPE = CAN_INIT_TYPE_ST_RTR; /* bits of MSGTYPE_ */ -00169 } -00170 peakMsg.LEN = m->len; -00171 /* count of data bytes (0..8) */ -00172 for (data = 0; data < m->len; data++) -00173 peakMsg.DATA[data] = m->data[data]; /* data bytes, up to 8 */ -00174 do -00175 { -00176 #ifdef PCAN2_HEADER_ -00177 // if not the first handler -00178 if(second_board == (s_BOARD *)fd0) -00179 errno = CAN2_Write (&peakMsg); -00180 else -00181 #endif -00182 if(first_board == (s_BOARD *)fd0) -00183 errno = CAN_Write (&peakMsg); -00184 else -00185 goto fail; -00186 if (errno) -00187 { -00188 if (errno == CAN_ERR_BUSOFF) -00189 { -00190 printf ("!!! Peak board write : re-init\n"); -00191 canInit((s_BOARD*)fd0); -00192 usleep (10000); -00193 } -00194 usleep (1000); -00195 } -00196 } -00197 while (errno != CAN_ERR_OK); -00198 return 0; -00199 fail: -00200 return 1; -00201 } -00202 -00203 /***************************************************************************/ -00204 CAN_HANDLE -00205 canOpen_driver (s_BOARD * board) -00206 { -00207 #ifdef PCAN2_HEADER_ -00208 if(first_board != NULL && second_board != NULL) -00209 #else -00210 if(first_board != NULL) -00211 #endif -00212 { -00213 fprintf (stderr, "Open failed.\n"); -00214 fprintf (stderr, -00215 "can_peak_win32.c: no more can port available with this pcan library\n"); -00216 fprintf (stderr, -00217 "can_peak_win32.c: please link another executable with another pcan lib\n"); -00218 return NULL; -00219 } -00220 -00221 #ifdef PCAN2_HEADER_ -00222 if(first_board == NULL) -00223 first_board = board; -00224 else -00225 second_board = board; -00226 #else -00227 first_board = board; -00228 #endif -00229 -00230 canInit(board); -00231 -00232 return (CAN_HANDLE)board; -00233 } -00234 -00235 /***************************************************************************/ -00236 int -00237 canClose_driver (CAN_HANDLE fd0) -00238 { -00239 #ifdef PCAN2_HEADER_ -00240 // if not the first handler -00241 if(second_board == (s_BOARD *)fd0) -00242 { -00243 CAN2_Close (); -00244 second_board = (s_BOARD *)NULL; -00245 }else -00246 #endif -00247 if(first_board == (s_BOARD *)fd0) -00248 { -00249 CAN_Close (); -00250 first_board = (s_BOARD *)NULL; -00251 } -00252 return 0; -00253 } -