rllib  1
rlcanopendaemon.cpp
Go to the documentation of this file.
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