|
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 "rlcutil.h" 00017 #include "rlcannode.h" 00018 00019 00020 //--------------------------------------------------------------------------- 00021 rlCanNode::rlCanNode() 00022 { 00023 rlDebugPrintf("\n Constructer clear"); 00024 } 00025 //--------------------------------------------------------------------------- 00027 rlCanNode::rlCanNode 00028 (int boardnr, int nodeid, RCS_MESSAGETELEGRAM_10& _telegramm){ 00029 nodeID = nodeid; 00030 boardID = boardnr; 00031 readConfigurationMessage(_telegramm); 00032 rlDebugPrintf("Initialising new node...\n BoardNr. %d NodeId %d Productstr %s ...", 00033 boardnr, nodeid, abDeviceName.ascii()); 00034 00035 ini = getEDS(abDeviceName); 00036 00037 if (ini!=0){ 00038 rlDebugPrintf(" SUCCESS! \n "); 00039 rlDebugPrintf(" ProductName=%s \n ", ini->text("DeviceInfo","ProductName")); 00040 rlDebugPrintf(" Filename=%s \n ", ini->text("FileInfo","FileName")); 00041 rlDebugPrintf("Lege Objektverzeichnis an: "); 00042 objdir = new ObjDir(ini); 00043 } 00044 else 00045 { 00046 rlDebugPrintf("ERROR!\n NO EDS FILE FOUND FOR \"%s\"!\n", abDeviceName.ascii()); 00047 objdir = 0; 00048 } 00049 00050 if (objdir){ 00051 // observe the adress for pdo mapping in OV 00052 unsigned int i,adr; 00053 adr = TRANSMIT_PDO_MAPPING_STARTADRESS; 00054 00055 rlDebugPrintf(" PDO Gr�en:transmit PDOs: %d receive PDOs: %d\n", 00056 pdoList[DIRECTION_TRANSMIT].size(),pdoList[DIRECTION_RECEIVE].size()); 00057 00058 for (i = 0; i< pdoList[DIRECTION_TRANSMIT].size();i++) 00059 { 00060 while(objdir->OVAdressExists(adr,0) == 0) 00061 { 00062 adr++; 00063 00064 if (adr>TRANSMIT_PDO_MAPPING_MAXADRESS) { 00065 adr=0; 00066 rlDebugPrintf("ERROR IN EDS FILE: errorous number of Mapping entries\n"); 00067 break; 00068 } 00069 } 00070 pdoList[DIRECTION_TRANSMIT][i]->mappingOvAdress = adr; 00071 00072 adr++; 00073 } 00074 00075 adr = RECEIVE_PDO_MAPPING_STARTADRESS ; 00076 for (i = 0; i< pdoList[DIRECTION_RECEIVE].size();i++) 00077 { 00078 while(objdir->OVAdressExists(adr,0) == 0) 00079 { 00080 adr++; 00081 00082 if (adr>RECEIVE_PDO_MAPPING_MAXADRESS) { 00083 adr=0; 00084 rlDebugPrintf("ERROR IN EDS FILE: errorous number of Mapping entries\n"); 00085 break; 00086 } 00087 } 00088 pdoList[DIRECTION_RECEIVE][i]->mappingOvAdress = adr; 00089 adr++; 00090 00091 } 00092 } 00093 00094 } 00095 //--------------------------------------------------------------------------- 00097 rlCanNode::~rlCanNode(){ 00098 rlDebugPrintf("Destructor rlCanNode\n"); 00099 if (ini!=0){ 00100 delete ini; 00101 } 00102 if (objdir!=0){ 00103 delete objdir; 00104 } 00105 } 00106 00107 //--------------------------------------------------------------------------- 00109 rlIniFile* rlCanNode::getEDS(const char* _productstr){ 00110 rlIniFile* _ini; 00111 // get eds dir 00112 QString dirname(getenv("EdsDir")); 00113 if (dirname.isEmpty()){ 00114 dirname = "./"; 00115 } 00116 QString productname(_productstr); 00117 QDir edsdir(dirname); 00118 edsdir.setNameFilter("*.EDS; *.eds"); 00119 QStringList::Iterator dirit; 00120 QStringList dirlist; 00121 dirlist = edsdir.entryList(); 00122 _ini = new rlIniFile(); 00123 for ( dirit = dirlist.begin(); dirit != dirlist.end(); ++dirit ) { 00124 int searchval; 00125 00126 QString exportname; 00127 00128 edslocation = dirname + *dirit; 00129 _ini->read(edslocation.ascii()); 00130 exportname =QString(_ini->text("DeviceInfo","ProductName")); 00131 searchval = exportname.contains(productname, false); 00132 if (searchval == 1){ 00133 return _ini; 00134 } 00135 } 00136 delete _ini; 00137 return 0; 00138 } 00139 00140 //--------------------------------------------------------------------------- 00142 void rlCanNode::readConfigurationMessage(RCS_MESSAGETELEGRAM_10& _message) 00143 { 00144 00145 int i; 00146 00147 usIdentNumber = (unsigned short) (_message.d[2]+_message.d[1]*pow(256,1)); 00148 usVendorIdent = (unsigned short) (_message.d[4]+_message.d[3]*pow(256,1)); 00149 00150 for(i=0;i<32;i++) 00151 { 00152 abVendorName+=_message.d[5+i]; 00153 abDeviceName+=_message.d[37+i]; 00154 abDescription+=_message.d[69+i]; 00155 } 00156 00157 bMasterAddress = _message.d[101]; 00158 bSettings = _message.d[102]; 00159 pdocount = _message.d[117]; 00160 00161 //transmit_pdoList.resize(pdocount); 00162 00163 int startadress=118; // start index of pdos in buffer 00164 int k = 0; 00165 int tpdocounter = 0; 00166 int rpdocounter = 0; 00167 00168 for(i=1;i<=int(pdocount);i++) 00169 { 00170 rlCanPDO *tempPDO = new rlCanPDO; 00171 tempPDO->bPDOSize = _message.d[startadress+k+1]; 00172 tempPDO->bDataPosition = _message.d[startadress+k+2]; 00173 tempPDO->usPDOAddress = (unsigned short) 00174 (_message.d[startadress+k+3]*pow(256,0) 00175 + _message.d[startadress+k+4]); 00176 00177 if ((_message.d[startadress+k] & DATA_DIRECTION_MASK) == DIRECTION_INPUT) 00178 { 00179 rlDebugPrintf("\n tranceive pdo found ................\n"); 00180 tpdocounter++; 00181 tempPDO->bPDODirection = DIRECTION_TRANSMIT; // => Tranceive PDO 00182 pdoList[DIRECTION_TRANSMIT].resize(pdoList[DIRECTION_TRANSMIT].size()+1); 00183 pdoList[DIRECTION_TRANSMIT].insert(tpdocounter-1,tempPDO); 00184 } 00185 else if( 00186 (_message.d[startadress+k] & DATA_DIRECTION_MASK) == DIRECTION_OUTPUT) 00187 { 00188 rlDebugPrintf("\n receive pdo found ................"); 00189 rpdocounter++; 00190 tempPDO->bPDODirection = DIRECTION_RECEIVE; // => receive PDO 00191 pdoList[DIRECTION_RECEIVE].resize(pdoList[DIRECTION_RECEIVE].size()+1); 00192 pdoList[DIRECTION_RECEIVE].insert(rpdocounter-1,tempPDO); 00193 } 00194 k=k+5; 00195 } 00196 00197 } 00198 00200 void rlCanNode::showConfiguration() 00201 { 00202 cout<<"\n\n******** Configuration Board " 00203 <<boardID<<" Node "<<nodeID <<" ********"; 00204 00205 cout<<"\n IdentNumber :" << usIdentNumber; 00206 cout<<"\n VendorIdent :" <<usVendorIdent; 00207 cout<<"\n Vendor Name :"<<abVendorName; 00208 cout<<"\n Device Name :"<<abDeviceName; 00209 cout<<"\n Description :"<<abDescription; 00210 cout<<"\n PDO count :"<<int(pdocount); 00211 cout<<"\n Master Adress :"<<int(bMasterAddress); 00212 cout<<"\n Settings :"<<int(bSettings); 00213 00214 cout<<"\n\n - - - - PDOs -> - - - - -"; 00215 unsigned int j; 00216 for (j = 1;j<=pdoList[DIRECTION_TRANSMIT].size();j++) 00217 { 00218 cout<<"\n+ PDO No. "<<j; 00219 cout<<"\nPDO Direction :Send PDO"; 00220 printf("\nPDO Size :%i",pdoList[DIRECTION_TRANSMIT][j-1]->bPDOSize); 00221 printf("\nData Position :%i",pdoList[DIRECTION_TRANSMIT][j-1]->bDataPosition); 00222 printf("\nPDO Adress :%i",pdoList[DIRECTION_TRANSMIT][j-1]->usPDOAddress); 00223 } 00224 00225 for (j = 1;j<=pdoList[DIRECTION_RECEIVE].size();j++) 00226 { 00227 cout<<"\n+ PDO No. "<<j; 00228 cout<<"\nPDO Direction :Receive PDO"; 00229 printf("\nPDO Size :%i",pdoList[DIRECTION_RECEIVE][j-1]->bPDOSize); 00230 printf("\nData Position :%i",pdoList[DIRECTION_RECEIVE][j-1]->bDataPosition); 00231 printf("\nPDO Adress :%i",pdoList[DIRECTION_RECEIVE][j-1]->usPDOAddress); 00232 } 00233 00234 cout<<"\n **********************************************\n\n"; 00235 } 00236 00237 //--------------------------------------------------------------------------- 00239 int rlCanNode::getNodeID() 00240 { 00241 return nodeID; 00242 } 00243 //--------------------------------------------------------------------------- 00245 int rlCanNode::getBoardID() 00246 { 00247 return boardID; 00248 } 00249 //--------------------------------------------------------------------------- 00250 int rlCanNode::objecttype(int objindex, int subindex) 00251 { 00252 QString edsbuffer; 00253 bool ok; 00254 int typenr; 00255 if (objdir != 0) { 00256 edsbuffer = objdir->get_objparameter(ObjDir::DATATYPE, objindex, subindex); 00257 } 00258 else 00259 { 00260 return rlCanOpenTypes::RL_NOTYPE; 00261 } 00262 00263 if (edsbuffer == "ERROR"){ 00264 return rlCanOpenTypes::RL_NOTYPE; 00265 } 00266 edsbuffer.remove("0x"); 00267 typenr = edsbuffer.toInt(&ok, 16); 00268 if (!ok){ 00269 return rlCanOpenTypes::RL_NOTYPE; 00270 } 00271 else 00272 { 00273 return typenr; 00274 00275 } 00276 } 00277 00278 //--------------------------------------------------------------------------- 00280 int rlCanNode::getPdoCount() 00281 { 00282 return pdocount; 00283 } 00285 int rlCanNode::getReceivePdoCount() 00286 { 00287 return pdoList[DIRECTION_RECEIVE].size(); 00288 } 00290 int rlCanNode::getTransmitPdoCount() 00291 { 00292 return pdoList[DIRECTION_TRANSMIT].size(); 00293 } 00295 bool rlCanNode::hasMapping(){ 00296 if (objdir==0) return false; 00297 else return true; 00298 }
1.7.5.1