rllib  1
rlcannode.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 "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 }