2 This file is part of CanFestival, a library implementing CanOpen Stack.
4 Copyright (C): Edouard TISSERANT and Francis DUPIN
6 See COPYING file for copyrights details.
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #ifndef NOT_USE_DYNAMIC_LOADING
27 #define DLL_CALL(funcname) (* funcname##_driver)
28 #define FCT_PTR_INIT =NULL
31 *(void **) (&name##_driver) = dlsym(handle, #name"_driver");\
32 if ((error = dlerror()) != NULL) {\
33 fprintf (stderr, "%s\n", error);\
34 UnLoadCanDriver(handle);\
38 #else /*NOT_USE_DYNAMIC_LOADING*/
40 /*Function call is direct*/
41 #define DLL_CALL(funcname) funcname##_driver
43 #endif /*NOT_USE_DYNAMIC_LOADING*/
46 #include "canfestival.h"
47 #include "timers_driver.h"
49 #define MAX_NB_CAN_PORTS 16
54 TASK_HANDLE receiveTask;
58 #include "can_driver.h"
60 /*Declares the funtion pointers for dll binding or simple protos*/
61 /*UNS8 DLL_CALL(canReceive)(CAN_HANDLE, Message *);
62 UNS8 DLL_CALL(canSend)(CAN_HANDLE, Message *);
63 CAN_HANDLE DLL_CALL(canOpen)(s_BOARD *);
64 int DLL_CALL(canClose)(CAN_HANDLE);
66 CANPort canports[MAX_NB_CAN_PORTS] = {{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,},{0,}};
68 #ifndef NOT_USE_DYNAMIC_LOADING
71 UNS8 UnLoadCanDriver(LIB_HANDLE handle)
83 /*Loads the dll and get funcs ptr*/
84 LIB_HANDLE LoadCanDriver(char* driver_name)
86 LIB_HANDLE handle = NULL;
92 handle = dlopen(driver_name, RTLD_LAZY);
96 fprintf (stderr, "%s\n", dlerror());
113 /*Not needed -- canReceiveLoop calls _canReceive directly *//*
114 UNS8 canReceive(CAN_PORT port, Message *m)
116 return DLL_CALL(canReceive)(port->fd, Message *m);
120 UNS8 canSend(CAN_PORT port, Message *m)
125 res = DLL_CALL(canSend)(((CANPort*)port)->fd, m);
132 void canReceiveLoop(CAN_PORT port)
137 if (DLL_CALL(canReceive)(((CANPort*)port)->fd, &m) != 0)
141 canDispatch(((CANPort*)port)->d, &m);
145 CAN_PORT canOpen(s_BOARD *board, CO_Data * d)
148 for(i=0; i < MAX_NB_CAN_PORTS; i++)
150 if(!canports[i].used)
154 #ifndef NOT_USE_DYNAMIC_LOADING
155 if (&DLL_CALL(canOpen)==NULL) {
156 fprintf(stderr,"CanOpen : Can Driver dll not loaded\n");
160 CAN_HANDLE fd0 = DLL_CALL(canOpen)(board);
162 canports[i].used = 1;
163 canports[i].fd = fd0;
166 CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, &canReceiveLoop);
169 d->canHandle = (CAN_PORT)&canports[i];
171 return (CAN_PORT)&canports[i];
173 fprintf(stderr,"CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate);
178 int canClose(CO_Data * d)
181 ((CANPort*)d->canHandle)->used = 0;
182 CANPort* tmp = (CANPort*)d->canHandle;
186 int res = DLL_CALL(canClose)(tmp->fd);
188 WaitReceiveTaskEnd(tmp->receiveTask);