equal
deleted
inserted
replaced
1 /* |
1 /* |
2 This file is part of CanFestival, a library implementing CanOpen Stack. |
2 This file is part of CanFestival, a library implementing CanOpen Stack. |
3 |
3 |
4 Copyright (C): Edouard TISSERANT and Francis DUPIN |
4 Copyright (C): Edouard TISSERANT and Francis DUPIN |
5 Copyright (C) Win32 Port Leonid Tochinski |
5 Copyright (C) Win32 Port Leonid Tochinski |
|
6 Modified by: Jaroslav Fojtik |
6 |
7 |
7 See COPYING file for copyrights details. |
8 See COPYING file for copyrights details. |
8 |
9 |
9 This library is free software; you can redistribute it and/or |
10 This library is free software; you can redistribute it and/or |
10 modify it under the terms of the GNU Lesser General Public |
11 modify it under the terms of the GNU Lesser General Public |
153 } |
154 } |
154 return 1; /* NOT OK */ |
155 return 1; /* NOT OK */ |
155 } |
156 } |
156 |
157 |
157 /***************************************************************************/ |
158 /***************************************************************************/ |
158 void canReceiveLoop(CAN_PORT port) |
159 DWORD canReceiveLoop(CAN_PORT port) |
159 { |
160 { |
160 Message m; |
161 Message m; |
161 while(((CANPort*)port)->used) |
162 while(((CANPort*)port)->used) |
162 { |
163 { |
163 if(m_canReceive(((CANPort*)port)->fd, &m) != 0) break; |
164 if(m_canReceive(((CANPort*)port)->fd, &m) != 0) continue; |
164 EnterMutex(); |
165 EnterMutex(); |
165 canDispatch(((CANPort*)port)->d, &m); |
166 canDispatch(((CANPort*)port)->d, &m); |
166 LeaveMutex(); |
167 LeaveMutex(); |
167 } |
168 } |
|
169 return 0; |
168 } |
170 } |
169 |
171 |
170 /***************************************************************************/ |
172 /***************************************************************************/ |
171 CAN_HANDLE canOpen(s_BOARD *board, CO_Data * d) |
173 CAN_HANDLE canOpen(s_BOARD *board, CO_Data * d) |
172 { |
174 { |
173 int i; |
175 int i; |
174 CAN_HANDLE fd0; |
176 CAN_HANDLE fd0; |
|
177 |
|
178 |
|
179 /* Fix of multiple opening one data set, added by J.Fojtik. */ |
|
180 if(d->canHandle) |
|
181 { |
|
182 canClose(d); |
|
183 } |
175 |
184 |
176 for(i=0; i < MAX_NB_CAN_PORTS; i++) |
185 for(i=0; i < MAX_NB_CAN_PORTS; i++) |
177 { |
186 { |
178 if(!canports[i].used) |
187 if(!canports[i].used) |
179 break; |
188 break; |
205 } |
214 } |
206 |
215 |
207 /***************************************************************************/ |
216 /***************************************************************************/ |
208 int canClose(CO_Data * d) |
217 int canClose(CO_Data * d) |
209 { |
218 { |
210 UNS8 res = 1; |
219 UNS8 res; |
211 CANPort* tmp; |
220 CANPort* tmp; |
212 |
221 |
213 if((CANPort*)d->canHandle) |
|
214 { |
|
215 ((CANPort*)d->canHandle)->used = 0; |
|
216 } |
|
217 |
|
218 tmp = (CANPort*)d->canHandle; |
222 tmp = (CANPort*)d->canHandle; |
219 |
223 |
220 if(tmp) |
224 if(tmp) |
221 { |
225 { |
222 // kill receiver task before port is closed and handle set to NULL |
226 d->canHandle = NULL; |
|
227 |
|
228 // close CAN port |
|
229 res = m_canClose(tmp->fd); |
|
230 |
|
231 // kill receiver task |
223 WaitReceiveTaskEnd(&tmp->receiveTask); |
232 WaitReceiveTaskEnd(&tmp->receiveTask); |
224 |
233 |
225 // close CAN port |
234 // release used flag as a last step. |
226 res = m_canClose(tmp->fd); |
235 tmp->used = 0; |
227 } |
236 } |
228 |
237 else res = 255; |
229 d->canHandle = NULL; |
238 |
230 |
239 return res; |
231 return res; |
|
232 } |
240 } |
233 |
241 |
234 UNS8 canChangeBaudRate(CAN_PORT port, char* baud) |
242 UNS8 canChangeBaudRate(CAN_PORT port, char* baud) |
235 { |
243 { |
236 if(port){ |
244 if(port){ |