|
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 "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 }
1.7.5.1