rllib  1
rlcanopenclient.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 "rlcanopenclient.h"
00017 
00018 rlCanClient::rlCanClient(int _port, char* _remoteadress, int _boardnr)
00019             :rlCanOpenClient(_port, _remoteadress)
00020 {
00021   boardnr = _boardnr;
00022   rlCanOpenClient::connect();
00023 }
00024 
00025 rlCanClient::~rlCanClient()
00026 {
00027   rlCanOpenClient::disconnect();
00028 }
00029 
00030 int rlCanClient::sdo_read(int _nodeid, int _objectindex, int _subindex, rlCanOpenTypes &_sdo_data) 
00031 {
00032   int ret = rlCanOpenClient::sdo_read(boardnr, _nodeid, _objectindex, _subindex, _sdo_data);
00033   if(ret != 1) rlCanOpenClient::connect();
00034   return ret;
00035 }
00036 
00037 int rlCanClient::sdo_write(int _nodeid,int _objectindex, int _subindex, rlCanOpenTypes &_sdo_data) 
00038 {
00039   int ret = rlCanOpenClient::sdo_write(boardnr, _nodeid, _objectindex, _subindex, _sdo_data);
00040   if(ret != 1) rlCanOpenClient::connect();
00041   return ret;
00042 }
00043 
00044 int rlCanClient::pdo_receive(int _nodeid, int _pdonr, int _mappingnr, rlCanOpenTypes &_pdo_data)
00045 {
00046   int ret = rlCanOpenClient::pdo_receive(boardnr, _nodeid, _pdonr, _mappingnr, _pdo_data);
00047   if(ret != 1) rlCanOpenClient::connect();
00048   return ret;
00049 }
00050 
00051 int rlCanClient::pdo_receive(int _nodeid, int _pdonr, rlCanOpenTypes &_pdo_data)
00052 {
00053   int ret = rlCanOpenClient::pdo_receive(boardnr, _nodeid, _pdonr, _pdo_data);
00054   if(ret != 1) rlCanOpenClient::connect();
00055   return ret;
00056 }
00057 
00058 int rlCanClient::pdo_transmit(int _nodeid, int _pdonr, int _mappingnr, rlCanOpenTypes &_pdo_data)
00059 {
00060   int ret = rlCanOpenClient::pdo_receive(boardnr, _nodeid, _pdonr, _mappingnr, _pdo_data);
00061   if(ret != 1) rlCanOpenClient::connect();
00062   return ret;
00063 }
00064 
00065 int rlCanClient::pdo_transmit(int _nodeid, int _pdonr, rlCanOpenTypes &_pdo_data)
00066 {
00067   int ret = rlCanOpenClient::pdo_receive(boardnr, _nodeid, _pdonr, _pdo_data);
00068   if(ret != 1) rlCanOpenClient::connect();
00069   return ret;
00070 }
00071 
00072 int rlCanClient::sendNMTCommand(int _nodeid, unsigned char _cmd, bool &returnstate)
00073 {
00074   int ret = rlCanOpenClient::sendNMTCommand(boardnr, _nodeid, _cmd, returnstate);
00075   if(ret != 1) rlCanOpenClient::connect();
00076   return ret;
00077 }
00078 
00079 int rlCanClient::restartBoard(int _restarttype, bool &returnstate)
00080 {
00081   int ret = rlCanOpenClient::restartBoard(boardnr, _restarttype, returnstate);
00082   if(ret != 1) rlCanOpenClient::connect();
00083   return ret;
00084 }
00085 
00086 int rlCanClient::getNodeState(int _nodeid, rlCanOpenTypes &_data)
00087 {
00088   int ret = rlCanOpenClient::getNodeState(boardnr, _nodeid, _data);
00089   if(ret != 1) rlCanOpenClient::connect();
00090   return ret;
00091 }
00092 
00093 //#########################################################################################
00094 
00096 rlCanOpenClient::rlCanOpenClient()
00097 {
00098    connected = false;   
00099    //cout<<"rlCanOpenClient Konstrukter erfolgreich aufgerufen\n";
00100    port=5000;      
00101    strcpy(remoteadress, "localhost");
00102    pid=getpid();
00103    client_timeout=1000;
00104    socket = new rlSocket(remoteadress,port,1);
00105 }
00106 
00108 rlCanOpenClient::rlCanOpenClient(int _port, char* _remoteadress)
00109 {
00110    connected = false;   
00111    //cout<<"Konstrukter erfolgreich aufgerufen\n";
00112    port=_port;
00113    pid=getpid();
00114    client_timeout=1000;
00115    strcpy(remoteadress, _remoteadress);
00116    socket = new rlSocket(remoteadress,port,1);
00117 }
00118 
00120 rlCanOpenClient::~rlCanOpenClient()
00121 {
00122   //printf("Destruktor rlCanOpenClient\n");
00123   if (connected == true){       
00124     disconnect();
00125   }
00126   if (socket!=0){
00127     delete socket;
00128   }
00129 }
00130 
00132 int rlCanOpenClient::connect()
00133 {  
00134   
00135   socket->setAdr(remoteadress);
00136   socket->setPort(port);
00137   socket->setActive(1);
00138   
00139   socket->connect();
00140   connected=socket->isConnected();
00141 
00142   if(socket->isConnected() == 0) {
00143     printf("no connection to server!\n"); 
00144     return 0;
00145   }
00146   cout<<"connection established...\n";
00147   return 1;
00148 }
00149 
00151 int rlCanOpenClient::disconnect()
00152 {
00153   if (socket!=NULL){
00154     printf("disconnection...\n");
00155     socket->disconnect();
00156     connected=false;
00157   }
00158   return 1;     
00159 }
00160 
00161 
00163 int rlCanOpenClient::sdo_read(int _boardnr, 
00164                               int _nodeid,
00165                               int _objectindex, 
00166                               int _subindex, 
00167                               rlCanOpenTypes &_sdo_data)
00168 {
00169   int ret;
00170   IPCMSGSTRUCT message;
00171   if (connected){
00172     message.msgtype = MSG_SDO_READ;
00173     message.transfertype = MSG_SEND;
00174     message.processid = pid;
00175     message.boardid = _boardnr;          
00176     message.nodeid=_nodeid;     
00177     message.objectindex=_objectindex;
00178     message.subindex=_subindex;   
00179     
00180     if(socket->isConnected() == 0)
00181       if ( connect() == 0 )
00182         return 0;
00183     
00184     socket->write((void*) &message, sizeof(message));         
00185     
00186     ret = socket->read((void*) &message,sizeof(message),client_timeout);
00187     if(ret <= 0)  // timeout
00188     {
00189       return 0;
00190     }
00191     _sdo_data.getIpcMsg(message);
00192   }
00193   else
00194   {
00195     return 0;
00196   }
00197   return 1; 
00198 }
00199 
00201 int rlCanOpenClient::sdo_write(int _boardnr, 
00202                                int _nodeid,
00203                                int _objectindex, 
00204                                int _subindex, 
00205                                rlCanOpenTypes &_sdo_data)
00206 {
00207   int ret;
00208   IPCMSGSTRUCT message;
00209   if (connected){
00210     message = _sdo_data.createIpcMsg();
00211     message.msgtype = MSG_SDO_WRITE;
00212     message.transfertype = MSG_SEND;
00213     message.processid = pid;
00214     message.boardid = _boardnr;          
00215     message.nodeid=_nodeid;     
00216     message.objectindex=_objectindex;
00217     message.subindex=_subindex;   
00218 
00219     if(socket->isConnected() == 0)
00220       if ( connect() == 0 )
00221         return 0;
00222 
00223     
00224     socket->write((void*) &message, sizeof(message));         
00225     
00226     // recieve answer to check if write was successfull
00227     ret = socket->read((void*) &message,sizeof(message),client_timeout);
00228     if(ret <= 0)  // timeout
00229     {
00230       return 0;
00231     }
00232     _sdo_data.getIpcMsg(message);
00233   }
00234   else
00235   {
00236     return 0;
00237   }
00238   return 1; 
00239 }
00240 
00242 int rlCanOpenClient::pdo_receive(int _boardnr, 
00243                                  int _nodeid,
00244                                  int _pdonr, 
00245                                  int _mappingnr, 
00246                                  rlCanOpenTypes &_pdo_data)
00247 {
00248   int ret;
00249   IPCMSGSTRUCT message;
00250   if (connected){
00251     message.msgtype = MSG_PDO_RECEIVE;
00252     message.transfertype = MSG_SEND;
00253     message.processid = pid;
00254     message.boardid = _boardnr;          
00255     message.nodeid=_nodeid;     
00256     message.objectindex=0;
00257     message.subindex=0;  
00258     message.pdoid=_pdonr;
00259     message.mappingid=_mappingnr;  
00260 
00261     if(socket->isConnected() == 0)
00262       if ( connect() == 0 )
00263         return 0;
00264 
00265     socket->write((void*) &message, sizeof(message));         
00266     ret = socket->read((void*) &message,sizeof(message),client_timeout);
00267     if(ret <= 0)  // timeout
00268     {
00269       return 0;
00270     }
00271     _pdo_data.getIpcMsg(message);
00272   }
00273   else
00274   {
00275     return 0;
00276   }
00277   return 1;  
00278 }
00279 
00281 int rlCanOpenClient::pdo_receive(int _boardnr, 
00282                                  int _nodeid,
00283                                  int _pdonr, 
00284                                  rlCanOpenTypes &_pdo_data)
00285 {
00286   int ret = pdo_receive(_boardnr, _nodeid, _pdonr, -1, _pdo_data);
00287   return ret;
00288 }
00289 
00290 
00292 int rlCanOpenClient::pdo_transmit(int _boardnr, 
00293                                   int _nodeid,
00294                                   int _pdonr, 
00295                                   int _mappingnr, 
00296                                   rlCanOpenTypes &_pdo_data)
00297 {
00298   int ret;
00299   IPCMSGSTRUCT message;
00300   if (connected){
00301     message = _pdo_data.createIpcMsg(); 
00302     message.msgtype = MSG_PDO_TRANSMIT;
00303     message.transfertype = MSG_SEND;
00304     message.processid = pid;
00305     message.boardid = _boardnr;          
00306     message.nodeid=_nodeid;     
00307     message.objectindex=0;
00308     message.subindex=0;  
00309     message.pdoid=_pdonr;
00310     message.mappingid=_mappingnr;  
00311 
00312     if(socket->isConnected() == 0)
00313       if ( connect() == 0 )
00314         return 0;
00315 
00316     socket->write((void*) &message, sizeof(message));         
00317     ret = socket->read((void*) &message,sizeof(message),client_timeout);
00318     if(ret <= 0)  // timeout
00319     {
00320       return 0;
00321     }
00322     _pdo_data.getIpcMsg(message);
00323   }
00324   else
00325   {
00326     return 0;
00327   }
00328   return 1;  
00329 }
00330 
00331 
00333 int rlCanOpenClient::pdo_transmit(int _boardnr, 
00334                                   int _nodeid,
00335                                   int _pdonr, 
00336                                   rlCanOpenTypes &_pdo_data)
00337 {
00338   return pdo_transmit(_boardnr, _nodeid, _pdonr, -1, _pdo_data);
00339 }
00340 
00342 int rlCanOpenClient::sendNMTCommand(int _boardnr, 
00343                                     int _nodeid, 
00344                                     unsigned char _cmd, 
00345                                     bool &returnstate){
00346   int ret;
00347   IPCMSGSTRUCT message;
00348   if (connected){
00349     message.mtext[0] = _cmd;    
00350     message.msgtype = MSG_NMT_TRANSMIT;
00351     message.transfertype = MSG_SEND;
00352     message.processid = pid;
00353     message.boardid = _boardnr;          
00354     message.nodeid=_nodeid;     
00355     message.objectindex=0;
00356     message.subindex=0;  
00357     message.pdoid=0;
00358     message.mappingid=0;  
00359 
00360     if(socket->isConnected() == 0)
00361       if ( connect() == 0 )
00362         return 0;
00363 
00364     socket->write((void*) &message, sizeof(message));         
00365     ret = socket->read((void*) &message,sizeof(message),client_timeout);
00366     if(ret <= 0)  // timeout
00367     {
00368       return 0;
00369     }
00370   }
00371   else
00372   {
00373     return 0;
00374   }
00375   returnstate = (bool) message.transfertype;
00376   return 1;  
00377 }
00378 
00379 
00381 int rlCanOpenClient::restartBoard(int _boardnr, 
00382                                   int _restarttype, 
00383                                   bool &returnstate){
00384   int ret;
00385   IPCMSGSTRUCT message;
00386   if (connected){
00387     message.mtext[0] = (char) _restarttype;     
00388     message.msgtype = MSG_RESTART_BOARD;
00389     message.transfertype = MSG_SEND;
00390     message.processid = pid;
00391     message.boardid = _boardnr;          
00392     message.nodeid=0;     
00393     message.objectindex=0;
00394     message.subindex=0;  
00395     message.pdoid=0;
00396     message.mappingid=0;  
00397 
00398     if(socket->isConnected() == 0)
00399       if ( connect() == 0 )
00400         return 0;
00401 
00402     socket->write((void*) &message, sizeof(message));         
00403     ret = socket->read((void*) &message,sizeof(message),client_timeout);
00404     if(ret <= 0)  // timeout
00405     {
00406       return 0;
00407     }
00408   }
00409   else
00410   {
00411     return 0;
00412   }
00413   returnstate = (bool) message.transfertype;
00414   return 1;  
00415 }
00416 
00418 int rlCanOpenClient::getNodeState(int _boardnr, 
00419                                   int _nodeid,
00420                                   rlCanOpenTypes &_data){
00421   int ret;
00422   IPCMSGSTRUCT message;
00423   if (connected){
00424     message = _data.createIpcMsg();             
00425     message.msgtype = MSG_GET_NODE_STATE;
00426     message.transfertype = MSG_SEND;
00427     message.processid = pid;
00428     message.boardid = _boardnr;          
00429     message.nodeid=_nodeid;     
00430     message.objectindex=0;
00431     message.subindex=0;  
00432     message.pdoid=0;
00433     message.mappingid=0;  
00434 
00435     if(socket->isConnected() == 0)
00436       if ( connect() == 0 )
00437         return 0;
00438 
00439     socket->write((void*) &message, sizeof(message));         
00440     ret = socket->read((void*) &message,sizeof(message),client_timeout);
00441     if(ret <= 0)  // timeout
00442     {
00443       return 0;
00444     }
00445     _data.getIpcMsg(message);
00446   }
00447   else
00448   {
00449     return 0;
00450   }
00451   return 1;  
00452 }
00453 
00454 void rlCanOpenClient::setPort(int _port){
00455   port = _port;
00456 }
00457   
00458 void rlCanOpenClient::setAdr(char* _adr){
00459   strcpy(remoteadress, _adr); 
00460 }