93 */ |
94 */ |
94 LIB_HANDLE LoadCanDriver(const char* driver_name) |
95 LIB_HANDLE LoadCanDriver(const char* driver_name) |
95 { |
96 { |
96 LIB_HANDLE handle = NULL; |
97 LIB_HANDLE handle = NULL; |
97 char *error; |
98 char *error; |
98 |
99 |
99 |
100 |
100 if(handle==NULL) |
101 if(handle==NULL) |
101 { |
102 { |
102 handle = dlopen(driver_name, RTLD_LAZY); |
103 handle = dlopen(driver_name, RTLD_LAZY); |
103 } |
104 } |
104 |
105 |
105 if (!handle) { |
106 if (!handle) { |
106 fprintf (stderr, "%s\n", dlerror()); |
107 fprintf (stderr, "%s\n", dlerror()); |
107 return NULL; |
108 return NULL; |
108 } |
109 } |
109 |
110 |
110 /*Get function ptr*/ |
111 /*Get function ptr*/ |
111 DLSYM(canReceive) |
112 DLSYM(canReceive) |
112 DLSYM(canSend) |
113 DLSYM(canSend) |
113 DLSYM(canOpen) |
114 DLSYM(canOpen) |
114 DLSYM(canChangeBaudRate) |
115 DLSYM(canChangeBaudRate) |
176 for(i=0; i < MAX_NB_CAN_PORTS; i++) |
184 for(i=0; i < MAX_NB_CAN_PORTS; i++) |
177 { |
185 { |
178 if(!canports[i].used) |
186 if(!canports[i].used) |
179 break; |
187 break; |
180 } |
188 } |
181 |
189 |
182 #ifndef NOT_USE_DYNAMIC_LOADING |
190 #ifndef NOT_USE_DYNAMIC_LOADING |
183 if (&DLL_CALL(canOpen)==NULL) { |
191 if (&DLL_CALL(canOpen)==NULL) { |
184 fprintf(stderr,"CanOpen : Can Driver dll not loaded\n"); |
192 fprintf(stderr,"CanOpen : Can Driver dll not loaded\n"); |
185 return NULL; |
193 return NULL; |
186 } |
194 } |
187 #endif |
195 #endif |
188 CAN_HANDLE fd0 = DLL_CALL(canOpen)(board); |
196 CAN_HANDLE fd0 = DLL_CALL(canOpen)(board); |
189 if(fd0){ |
197 if(fd0){ |
190 canports[i].used = 1; |
198 canports[i].used = 1; |
191 canports[i].fd = fd0; |
199 canports[i].fd = fd0; |
192 canports[i].d = d; |
200 canports[i].d = d; |
193 d->canHandle = (CAN_PORT)&canports[i]; |
201 d->canHandle = (CAN_PORT)&canports[i]; |
194 CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, &canReceiveLoop); |
202 CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, &canReceiveLoop); |
195 return (CAN_PORT)&canports[i]; |
203 return (CAN_PORT)&canports[i]; |
196 }else{ |
204 }else{ |
197 MSG("CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate); |
205 MSG("CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate); |
198 return NULL; |
206 return NULL; |
205 * @return success or error |
213 * @return success or error |
206 */ |
214 */ |
207 int canClose(CO_Data * d) |
215 int canClose(CO_Data * d) |
208 { |
216 { |
209 UNS8 res; |
217 UNS8 res; |
210 |
218 |
211 ((CANPort*)d->canHandle)->used = 0; |
219 ((CANPort*)d->canHandle)->used = 0; |
212 CANPort* tmp = (CANPort*)d->canHandle; |
220 CANPort* tmp = (CANPort*)d->canHandle; |
213 d->canHandle = NULL; |
221 |
214 |
222 // kill receiver task before port is closed and handle set to NULL |
|
223 WaitReceiveTaskEnd(&tmp->receiveTask); |
|
224 |
215 // close CAN port |
225 // close CAN port |
216 res = DLL_CALL(canClose)(tmp->fd); |
226 res = DLL_CALL(canClose)(tmp->fd); |
217 |
227 |
218 // kill receiver task |
228 d->canHandle = NULL; |
219 WaitReceiveTaskEnd(&tmp->receiveTask); |
229 |
220 |
|
221 return res; |
230 return res; |
222 } |
231 } |
223 |
232 |
224 |
233 |
225 /** |
234 /** |