|
rllib
1
|
00001 /*************************************************************************** 00002 rlcanopen.cpp - description 00003 ------------------- 00004 begin : Tue March 03 2004 00005 copyright : (C) 2004 by Marc Br�tigam, Christian Wilmes, Rainer Lehrig 00006 email : lehrig@t-online.de 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This library is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as * 00013 * published by the Free Software Foundation * 00014 * * 00015 ***************************************************************************/ 00016 #include "rlcanopendaemon.h" 00017 00021 void sdo_read(rlCanOpenDaemon *_daemonptr, 00022 rlSocket* _socket, 00023 IPCMSGSTRUCT* _message){ 00024 rlCanOpenTypes cifmsg; 00025 _daemonptr->daemon_thread.lock(); 00026 _daemonptr->nodes->sdo_read(_message->boardid, 00027 _message->nodeid, 00028 _message->objectindex, 00029 _message->subindex, cifmsg); 00030 _daemonptr->daemon_thread.unlock(); 00031 *_message = cifmsg.createIpcMsg(); 00032 _message->msgtype=MSG_SDO_READ; _message->transfertype=MSG_RECEIVE; 00033 _socket->write((void*) _message, sizeof(*_message)); 00034 } 00035 00039 void sdo_write(rlCanOpenDaemon *_daemonptr, 00040 rlSocket* _socket, 00041 IPCMSGSTRUCT* _message){ 00042 rlCanOpenTypes cifmsg; 00043 cifmsg.getIpcMsg(*_message); 00044 _daemonptr->daemon_thread.lock(); 00045 _daemonptr->nodes->sdo_write(_message->boardid, 00046 _message->nodeid, 00047 _message->objectindex, 00048 _message->subindex, cifmsg); 00049 _daemonptr->daemon_thread.unlock(); 00050 *_message = cifmsg.createIpcMsg(); 00051 _message->msgtype=MSG_SDO_WRITE; _message->transfertype=MSG_RECEIVE; 00052 _socket->write((void*) _message, sizeof(*_message)); 00053 } 00054 00058 void pdo_receive(rlCanOpenDaemon *_daemonptr, 00059 rlSocket* _socket, 00060 IPCMSGSTRUCT* _message){ 00061 int returnvalue; 00062 rlCanOpenTypes cifmsg; 00063 cifmsg.getIpcMsg(*_message); 00064 _daemonptr->daemon_thread.lock(); 00065 if (_message->mappingid==-1){ 00066 returnvalue=_daemonptr->nodes->pdo_receive(_message->boardid, 00067 _message->nodeid, 00068 _message->pdoid, 00069 cifmsg); 00070 } 00071 else 00072 { 00073 returnvalue=_daemonptr->nodes->pdo_receive(_message->boardid, 00074 _message->nodeid, 00075 _message->pdoid, 00076 _message->mappingid, 00077 cifmsg); 00078 } 00079 _daemonptr->daemon_thread.unlock(); 00080 *_message = cifmsg.createIpcMsg(); 00081 _message->msgtype=MSG_PDO_RECEIVE; _message->transfertype=returnvalue; 00082 _socket->write((void*) _message, sizeof(*_message)); 00083 } 00084 00088 void pdo_transmit(rlCanOpenDaemon *_daemonptr, 00089 rlSocket* _socket, 00090 IPCMSGSTRUCT* _message){ 00091 int returnvalue; 00092 rlCanOpenTypes cifmsg; 00093 cifmsg.getIpcMsg(*_message); 00094 _daemonptr->daemon_thread.lock(); 00095 if (_message->mappingid==-1){ 00096 returnvalue=_daemonptr->nodes->pdo_transmit(_message->boardid, 00097 _message->nodeid, 00098 _message->pdoid, 00099 cifmsg); 00100 } 00101 else 00102 { 00103 returnvalue=_daemonptr->nodes->pdo_transmit(_message->boardid, 00104 _message->nodeid, 00105 _message->pdoid, 00106 _message->mappingid, 00107 cifmsg); 00108 } 00109 _daemonptr->daemon_thread.unlock(); 00110 *_message = cifmsg.createIpcMsg(); 00111 _message->msgtype=MSG_PDO_TRANSMIT; _message->transfertype=returnvalue; 00112 _socket->write((void*) _message, sizeof(*_message)); 00113 } 00114 00118 void nmt_transmit(rlCanOpenDaemon *_daemonptr, 00119 rlSocket* _socket, 00120 IPCMSGSTRUCT* _message){ 00121 char returnvalue; 00122 _daemonptr->daemon_thread.lock(); 00123 returnvalue=_daemonptr->nodes->sendNMTCommand(_message->boardid, 00124 _message->nodeid, 00125 _message->mtext[0]); 00126 _daemonptr->daemon_thread.unlock(); 00127 _message->msgtype=MSG_PDO_TRANSMIT; _message->transfertype=returnvalue; 00128 _socket->write((void*) _message, sizeof(*_message)); 00129 } 00130 00134 void restart_board(rlCanOpenDaemon *_daemonptr, 00135 rlSocket* _socket, 00136 IPCMSGSTRUCT* _message){ 00137 char returnvalue; 00138 _daemonptr->daemon_thread.lock(); 00139 returnvalue=_daemonptr->nodes->restartBoard(_message->boardid, 00140 (int) _message->mtext[0]); 00141 _daemonptr->daemon_thread.unlock(); 00142 _message->msgtype=MSG_PDO_TRANSMIT; _message->transfertype=returnvalue; 00143 _socket->write((void*) _message, sizeof(*_message)); 00144 } 00145 00149 void getNodeState(rlCanOpenDaemon *_daemonptr, 00150 rlSocket* _socket, 00151 IPCMSGSTRUCT* _message){ 00152 int returnvalue; 00153 rlCanOpenTypes cifmsg; 00154 cifmsg.getIpcMsg(*_message); 00155 _daemonptr->daemon_thread.lock(); 00156 returnvalue=_daemonptr->nodes->getNodeState(_message->boardid, 00157 _message->nodeid, 00158 cifmsg); 00159 _daemonptr->daemon_thread.unlock(); 00160 *_message = cifmsg.createIpcMsg(); 00161 _message->msgtype=MSG_GET_NODE_STATE; _message->transfertype=returnvalue; 00162 _socket->write((void*) _message, sizeof(*_message)); 00163 } 00164 00172 static void *clientconnection(void *arg) 00173 { 00174 //cout<<"\n client connection established...\n"; 00175 00176 rlCanOpenTypes cifmsg; 00177 THREAD_PARAM *p = (THREAD_PARAM *) arg; 00178 THREADTRANSFER *tr = (THREADTRANSFER*)p->user; 00179 IPCMSGSTRUCT message; 00180 int socketdescr = tr->socketdescr; 00181 rlCanOpenDaemon *daemonptr = tr->daemonptr; 00182 int ret; 00183 rlSocket socket(socketdescr); 00184 00185 rlDebugPrintf("client connection established...\n"); 00186 while(socket.isConnected()) 00187 { 00188 ret = socket.read((void*) &message, sizeof(message)); 00189 if(ret <= 0) break; 00190 if ((message.msgtype==MSG_SDO_READ)&&(message.transfertype==MSG_SEND)){ 00191 sdo_read(daemonptr, &socket, &message); 00192 } 00193 if ((message.msgtype==MSG_SDO_WRITE)&&(message.transfertype==MSG_SEND)){ 00194 sdo_write(daemonptr, &socket, &message); 00195 } 00196 if ((message.msgtype==MSG_PDO_RECEIVE)&&(message.transfertype==MSG_SEND)){ 00197 pdo_receive(daemonptr, &socket, &message); 00198 } 00199 if ((message.msgtype==MSG_PDO_TRANSMIT)&&(message.transfertype==MSG_SEND)){ 00200 pdo_transmit(daemonptr, &socket, &message); 00201 } 00202 if ((message.msgtype==MSG_NMT_TRANSMIT)&&(message.transfertype==MSG_SEND)){ 00203 nmt_transmit(daemonptr, &socket, &message); 00204 } 00205 if ((message.msgtype==MSG_RESTART_BOARD)&&(message.transfertype==MSG_SEND)){ 00206 restart_board(daemonptr, &socket, &message); 00207 } 00208 if ((message.msgtype==MSG_GET_NODE_STATE)&&(message.transfertype==MSG_SEND)){ 00209 getNodeState(daemonptr, &socket, &message); 00210 } 00211 00212 } 00213 rlDebugPrintf("client disconnect...\n"); 00214 //cout<<"\n client disconnect...\n"; 00215 return NULL; 00216 } 00217 00218 00221 static void *listenerthread(void *arg) 00222 { 00223 00224 // socketdescriptor; 00225 int socketdescr; 00226 // parameter struct for accessing function parameters 00227 THREAD_PARAM *p = (THREAD_PARAM *) arg; 00228 // new parameter struct for passing parameters to handler thread 00229 THREADTRANSFER tr; 00230 rlCanOpenDaemon *daemonptr = (rlCanOpenDaemon*) p->user; 00231 tr.daemonptr = daemonptr; 00232 int port = daemonptr->getPort(); 00233 // wait for connections with accept(); 00234 rlDebugPrintf("\n starting listener on port %d...\n", port); 00235 // initialize socket with daemonport 00236 rlSocket s("localhost",port,0); 00237 // listener main loop 00238 while(1){ 00239 socketdescr = s.connect(); 00240 if(socketdescr == -1) break; 00241 tr.socketdescr = socketdescr; 00242 daemonptr->daemon_thread.create(clientconnection, &tr); 00243 // wait for clientconnection to save socketdescriptor 00244 rlsleep(100); 00245 } 00246 rlDebugPrintf("\n killing listener...\n"); 00247 return NULL; 00248 } 00249 00250 00251 00253 rlCanOpenDaemon::rlCanOpenDaemon(){ 00254 nodes = new rlCanOpen(); 00255 port = 5000; 00256 } 00257 00259 rlCanOpenDaemon::rlCanOpenDaemon(int _port, char* _iniFileName){ 00260 if (_iniFileName!=0){ 00261 nodes = new rlCanOpen(_iniFileName); 00262 } 00263 else{ 00264 nodes = new rlCanOpen(); 00265 } 00266 port = _port; 00267 00268 00269 } 00270 00272 rlCanOpenDaemon::~rlCanOpenDaemon(){ 00273 rlDebugPrintf("destruktor rlCanOpenDaemon\n"); 00274 if (nodes!=0){ 00275 delete nodes; 00276 } 00277 } 00278 00280 int rlCanOpenDaemon::getPort(){ 00281 return port; 00282 } 00283 00285 00288 void rlCanOpenDaemon::start(){ 00289 daemon_thread.create(listenerthread, this); 00290 /* NO NO this has to be done by the user RL 17.06.2004 00291 while(1){ 00292 rlsleep(100); 00293 } 00294 */ 00295 } 00296 00297
1.7.5.1