rllib  1
rlcanopen.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 
00017 //class to manage the nodes in a CanOpen network
00018 
00019 #include "rlcutil.h"
00020 #include "rlcanopen.h"
00021 
00022 #ifdef RLWIN32
00023 #include <windows.h>
00024 #include <math.h>
00025 #endif
00026 
00027 #include <time.h>
00028 
00029 rlCanOpen::rlCanOpen(char * _inifilename)
00030 {
00031   rlDebugPrintf("Constructer nodes class\n");
00032   read_inifile(_inifilename);
00033   if (enableLogging){
00034     freopen (logFileName.ascii(),"w",stdout); // redirekt stdout to textfile
00035   }
00036   ini();
00037 }
00038 
00039 
00040 rlCanOpen::rlCanOpen()
00041 {
00042   rlDebugPrintf("Constructer nodes class\n");
00043   read_inifile("./canopen.ini");
00044   if (enableLogging){
00045     FILE* fp;
00046     fp = freopen (logFileName.ascii(),"w",stdout); // redirekt stdout to textfile
00047     
00048     /* enable linebuffering in order to write every line to the file immediately */
00049     setvbuf ( fp , NULL , _IOFBF , 1024 ); 
00050   }
00051   ini();
00052 }
00053 //---------------------------------------------------------------------------
00054 rlCanOpen::~rlCanOpen()
00055 {
00056   rlDebugPrintf("destruktor rlCanOpen\n");
00057   for (int i=0;i<boardcount;i++)
00058     DevExitBoard(i);
00059 
00060 #ifdef RLWIN32
00061   DevCloseDriver(0);
00062 #else
00063   DevCloseDriver();
00064 #endif    
00065   if (enableLogging)    
00066     fclose (stdout);
00067   
00068 }
00069 //---------------------------------------------------------------------------
00071 bool rlCanOpen::ini()
00072 {
00073   messagenr = 0;
00074   nodelist.setAutoDelete(true);
00075 
00076   time_t rawtime;
00077   struct tm * timeinfo;
00078   time ( &rawtime );
00079   timeinfo = localtime ( &rawtime );
00080 
00081   sprintf(err_out_buf, "\nnew session startet: %s\n", asctime(timeinfo));
00082   rlDebugPrintf(err_out_buf);
00083  
00084   if (iniboards()){
00085     rlDebugPrintf("at least one board initialize!\n");
00086   }
00087   else
00088   {
00089     rlDebugPrintf("no board available or no board could be initialized correctly!\n");
00090     rlDebugPrintf("Programm -> Close\n");
00091     exit(0); 
00092   }
00093   
00094   // search for active nodes and create them
00095   
00096   createNodes();
00097   
00098  
00099   return 1;
00100 }
00101 //---------------------------------------------------------------------------
00103 int rlCanOpen::createNodes()
00104 {
00105  int nodeid;
00106   for (int boardid = 0;boardid<boardcount;boardid++)
00107   {
00108     setBoardActive(boardid);
00109     for(nodeid = 0; nodeid <= MAX_NODES; nodeid++)  // from node 0..127
00110       if (getNodeConfiguration(nodeid)) // writes received node-configuration 
00111                                         // into class-global message-struct
00112       {
00113         // new node found. insert it into the nodelist
00114         nodelist.resize( nodelist.size() + 1 );   
00115         
00116         // append the new node in the list
00117         nodelist.insert( nodelist.size()-1, 
00118                          new rlCanNode(boardid,nodeid,message));
00119         
00120        //append Mapping data                                  
00121         if (nodelist[nodelist.size()-1]->hasMapping()){
00122           if(!createMappingObjects(boardid,nodeid,DIRECTION_TRANSMIT))return 0;
00123           if(!createMappingObjects(boardid,nodeid,DIRECTION_RECEIVE))return 0;
00124         }
00125         else
00126         {
00127           rlDebugPrintf("WARNING: no Mapping available on node %d.", nodeid);
00128           rlDebugPrintf("Probably EDS file couldn't be found in EDS directory.\n");
00129         }
00130       }             
00131   }
00132   return 1;
00133 }
00134 
00135 //------------------------------------------------------------------------------
00137 int rlCanOpen::createMappingObjects(int _boardid,int _nodeid,int _pdoDirection)
00138 {
00139   int pdomax = 0;
00140   if (_pdoDirection == DIRECTION_RECEIVE)
00141     pdomax = nodelist[nodelist.size()-1]->getReceivePdoCount();
00142   else if(_pdoDirection == DIRECTION_TRANSMIT)
00143     pdomax = nodelist[nodelist.size()-1]->getTransmitPdoCount();
00144     
00145   for (int j = 1;j<=pdomax;j++)    //each receive/transmit pdo
00146   if(refreshMappingList(_boardid,_nodeid,j,_pdoDirection)==0) return 0;
00147   return 1;
00148 
00149 }   
00150 
00151 
00152 //---------------------------------------------------------------------------
00154 bool rlCanOpen::iniboards()
00155 {
00156   
00157   int currentboardcount=0;
00158   
00159   BOARD_INFO tBoardInfo;
00160 
00161 #ifdef RLWIN32
00162     if ( (sRet = DevOpenDriver(0)) == DRV_NO_ERROR) 
00163 #else
00164     if ( (sRet = DevOpenDriver()) == DRV_NO_ERROR) 
00165 #endif    
00166   {
00167     // Driver successfully opend, read board information
00168 #ifdef RLWIN32
00169     if ( (sRet = DevGetBoardInfo( 0, sizeof(tBoardInfo), &tBoardInfo)) != DRV_NO_ERROR) 
00170 #else
00171     if ( (sRet = DevGetBoardInfo( &tBoardInfo)) != DRV_NO_ERROR) 
00172 #endif    
00173           {
00174           // Function error
00175             rlDebugPrintf( "DevGetBoardInfo RetWert = %5d \n", sRet );
00176           } else 
00177           {
00178             // Information successfully read, save for further use
00179             // Check out which boards are available
00180             for ( int usIdx = 0; usIdx < MAX_DEV_BOARDS; usIdx++)
00181             {
00182               if ( tBoardInfo.tBoard[usIdx].usAvailable == TRUE) {
00183               // Board is configured, try to init the board
00184                 sRet = DevInitBoard(
00185 #ifdef RLWIN32
00186                 tBoardInfo.tBoard[usIdx].usBoardNumber, NULL);
00187 #else
00188                 tBoardInfo.tBoard[usIdx].usBoard);
00189 #endif    
00190                 if ( sRet != DRV_NO_ERROR) {
00191                   // Function error
00192                   rlDebugPrintf( "DevInitBoard RetWert = %5d \n", sRet );
00193                 } else {
00194                 // DEVICE is available and ready............
00195                 currentboardcount++;
00196                        }
00197               }
00198             }
00199           }
00200    }
00201   boardcount = currentboardcount;       
00202  
00203   if (currentboardcount!=0)
00204     return 1;   
00205   else
00206    return 0;    
00207 }
00208 
00209 //---------------------------------------------------------------------------
00211 int rlCanOpen::getBoardCount()
00212 {
00213   return boardcount;
00214 }  
00215 //---------------------------------------------------------------------------
00216 //* this function reads out the configuration of a specific node
00217 bool rlCanOpen::getNodeConfiguration(int _nodeID)
00218 {
00219   //build message       
00220   message.rx            = CAN_TASK; 
00221   message.tx            = USER_AT_HOST;
00222   message.ln            = 8;
00223   message.nr            =messagenr++; 
00224   message.a             =0; 
00225   message.f             =0;
00226   message.b             =CMDCODE_GET_CONFIGURATION;
00227   message.e             =0x00;  //fragmentation
00228   message.device_adr    =_nodeID;  
00229   message.data_area     =0; 
00230   message.data_adr      =0; 
00231   message.data_idx      =0; 
00232   message.data_cnt      =0; 
00233   message.data_type     =0; 
00234   message.function      =0;
00235   
00236   //put configuration request
00237   DevPutMessage(0, (MSG_STRUC *)&message,5000L) ;  
00238   
00239   //receive answer message
00240   sRet = DevGetMessage (  0,                       
00241                           sizeof(message),      
00242                           (MSG_STRUC *)&message,   
00243                           2000L );                 
00244 
00245   unsigned char msgnrlocal = messagenr -1;
00246   
00247   // receive correct answer 
00248   if((message.a == RESPONSE_CODE_GET_CONFIGURATION) && (message.nr == msgnrlocal))
00249     if (message.f == ERRCODE_NOERROR) // node active, no error
00250       if(message.e == 0x00) //configuration fits in the message
00251       {
00252         sprintf(err_out_buf, "Board %d node %d is active. No problems found\n", 
00253           getActiveBoard(), _nodeID);
00254         
00255         rlDebugPrintf(err_out_buf);
00256         return 1;
00257       }
00258       else
00259       {
00260          sprintf(err_out_buf, "Board %d node %d is active. \n", 
00261            getActiveBoard(), _nodeID);
00262            
00263          rlDebugPrintf(err_out_buf);
00264          rlDebugPrintf("Configuration data does not fit in one message,\n");
00265          rlDebugPrintf("so the current node does not include the complete data\n");
00266          rlDebugPrintf(" - multiplex configration data is not yet implemented!!! -\n");
00267          return 1;
00268       } 
00269     else return 0;
00270   else 
00271   {
00272     sprintf(err_out_buf, "---->message.a=%d, message.nr=%d unsere msg nr: %d\n", 
00273       message.a, message.nr, msgnrlocal);
00274       
00275     rlDebugPrintf(err_out_buf);
00276     sprintf(err_out_buf, "%s\n", "Communication ERROR!!!");
00277     rlDebugPrintf(err_out_buf);
00278     return 0;
00279   }
00280 }
00281 
00282 
00283 //---------------------------------------------------------------------------
00285 short rlCanOpen::setBoardActive(int _boardnr)
00286 {
00287                         
00288   if ( (sRet = DevSetHostState( _boardnr, HOST_READY, 0L) == DRV_NO_ERROR) )   
00289     activeboard = _boardnr;
00290  
00291   return sRet;
00292 }
00293 
00294 //---------------------------------------------------------------------------
00296 int rlCanOpen::getActiveBoard()
00297 {
00298   return activeboard;
00299 }                                                                                                                                                                                
00300 
00301 //---------------------------------------------------------------------------
00303 bool rlCanOpen::showNodeConfiguration(int _boardnr,int _nodeid)
00304 {
00305   for( unsigned int i = 0; i < nodelist.size(); i++)
00306   {
00307     if ((nodelist[i]->getNodeID() == _nodeid) && 
00308         (nodelist[i]->getBoardID() == _boardnr))
00309     {
00310       nodelist[i]->showConfiguration();
00311       return true;
00312       
00313     }           
00314   }
00315 
00316   return false; 
00317 } 
00318 //---------------------------------------------------------------------------
00320 bool rlCanOpen::showNodeConfiguration()
00321 {
00322   if(nodelist.size() == 0) return 0;
00323   for(unsigned int i = 0; i < nodelist.size(); i++)
00324   {
00325     nodelist[i]->showConfiguration();   
00326   }
00327    return 1;
00328 }
00329 //---------------------------------------------------------------------------
00330 
00332 int rlCanOpen::sdo_read( int _boardnr, 
00333                          int _nodeid,
00334                          int _objectindex, 
00335                          int _subindex, 
00336                          rlCanOpenTypes &_sdo_data)
00337 {
00338     int datalength;
00339     int canopentype;
00340     int nodeindex; 
00341     
00342     if (getNodeIndex(_boardnr,_nodeid,nodeindex)== 0) 
00343     {
00344       rlDebugPrintf("ERROR: specified node does not exist! SDO write failed!");
00345       rlDebugPrintf("BoardId: %d NodeId: %d Objektindex: %d Subindex: %d\n", 
00346         _boardnr, _nodeid, _objectindex, _subindex);
00347         
00348       _sdo_data.set_rlmsgerr(ERRCODE_INVALID_NODEID);
00349       return 0;
00350     }
00351 
00352 
00353     delmsg();
00354     setBoardActive(_boardnr);
00355     
00356     message.rx          = CAN_TASK; 
00357     message.tx          = USER_AT_HOST;
00358     message.ln          = 8;
00359     message.nr          = messagenr++; 
00360     message.a           = 0; 
00361     message.f           = 0;
00362     message.b           = CMDCODE_SDO_UPDOWNLOAD;
00363     message.e           = 0;
00364     message.device_adr  = _nodeid;  
00365     message.data_area   = 0; 
00366     message.data_adr    = _objectindex; 
00367     message.data_idx    = _subindex; 
00368     message.data_cnt    = 0; 
00369     message.data_type   = 0; 
00370     message.function    = TASK_TFC_READ; 
00371  
00372    if(DevPutMessage(0, (MSG_STRUC *)&message,5000L) != DRV_NO_ERROR) return 0;
00373    
00374    delmsg();
00375    // receive the answer
00376   
00377    sRet = DevGetMessage( getActiveBoard(),                       // Device Number            
00378                          sizeof(message), 
00379                          (MSG_STRUC *)&message,   // Pointer to user buffer  
00380                          2000L );                 // Timeout   
00381    unsigned char msgnrlocal;
00382    msgnrlocal = messagenr - 1;                       
00383    
00384    // receive correct answer   
00385    if((message.a == CMDCODE_SDO_UPDOWNLOAD)&&(message.nr == msgnrlocal)){ 
00386       _sdo_data.set_rlmsgerr(message.f);
00387       if (message.f == ERRCODE_NOERROR) // node active, no error
00388       {
00389         canopentype=getObjectType(_boardnr, _nodeid, _objectindex, _subindex);
00390         if (canopentype!=rlCanOpenTypes::RL_NOTYPE){
00391           _sdo_data.set_CanOpenType(canopentype);
00392           datalength = _sdo_data.getLength();
00393         }
00394         else 
00395         {
00396           _sdo_data.set_DaemonType(rlCanOpenTypes::RL_BUFFER);
00397           datalength = MAX_SDO_BUFFERSIZE;
00398         }
00399         _sdo_data.clearBuffer();   
00400         for(int i = 0; i < datalength; i++)
00401           _sdo_data.set_buffer(i, message.d[i]);         
00402         
00403         // if CanOpen-Type is a twistet integer (etc. 52Bit ) the value will be converted
00404         if ((is_twisted_type(canopentype)) && (nodelist[nodeindex]->hasMapping()))
00405           _sdo_data.translate_CanOpenType(canopentype);
00406         
00407         return 1;
00408       }
00409       else
00410       {
00411         rlDebugPrintf("message.f = %d  message.f = %x Hex \n", message.f, message.f);
00412       }
00413     }
00414     else
00415     {
00416       rlDebugPrintf("message.a = %d message.nr = %d vergleich mit: %d\n", 
00417          message.a, message.nr, msgnrlocal);
00418          
00419       _sdo_data.set_rlmsgerr(-1);
00420     }
00421     rlDebugPrintf("ERROR during read SDO message!");
00422     rlDebugPrintf("BoardId: %d NodeId: %d Obj: %x Sub: %x\n", 
00423       _boardnr, _nodeid, _objectindex, _subindex);
00424       
00425       
00426     return 0;
00427 }
00428 //---------------------------------------------------------------------------
00429 
00431 int rlCanOpen::sdo_write( int _boardnr, 
00432                           int _nodeid,
00433                           int _objectindex, 
00434                           int _subindex, 
00435                           rlCanOpenTypes &_sdo_data)
00436 {
00437     int length;
00438     int pdoid;
00439     length = _sdo_data.getLength();
00440     int nodeindex;
00441     if (getNodeIndex(_boardnr,_nodeid,nodeindex)== 0) 
00442     {
00443       rlDebugPrintf("ERROR: specified node does not exist! SDO write failed!");
00444       rlDebugPrintf("BoardId: %d NodeId: %d Objektindex: %d Subindex: %d\n", 
00445         _boardnr, _nodeid, _objectindex, _subindex);
00446       
00447       _sdo_data.set_rlmsgerr(ERRCODE_INVALID_NODEID);
00448       return 0;
00449     }
00450     
00451     // if CanOpen-Type is a twistet integer (etc. 52Bit ) the datalength must be adjusted
00452     int canopentype = getObjectType(_boardnr, _nodeid, _objectindex, _subindex);
00453    
00454     if ((is_twisted_type(canopentype)) && (nodelist[nodeindex]->hasMapping()))
00455       length = _sdo_data.get_CanOpenTypeLength(canopentype);
00456    
00457      for(int i = 0;i<length;i++)
00458         message.d[i] = _sdo_data.get_buffer(i);
00459 
00460     
00461     setBoardActive(_boardnr);
00462     
00463     message.rx          = CAN_TASK; 
00464     message.tx          = USER_AT_HOST;
00465     message.ln          = 8+ length;
00466     message.nr          = messagenr++; 
00467     message.a           = 0; 
00468     message.f           = 0;
00469     message.b           = CMDCODE_SDO_UPDOWNLOAD;
00470     message.e           = 0;
00471     message.device_adr  = _nodeid;  
00472     message.data_area   = 0; 
00473     message.data_adr    = _objectindex; 
00474     message.data_idx    = _subindex; 
00475     message.data_cnt    = length; 
00476     message.data_type   = 0; 
00477     message.function    = TASK_TFC_WRITE; 
00478     
00479     if(DevPutMessage(0, (MSG_STRUC *)&message,5000L) != DRV_NO_ERROR) return 0;
00480          
00481     
00482   // receive the answer
00483   
00484   sRet = DevGetMessage ( _boardnr,                // Device Number            
00485                          sizeof(message), 
00486                          (MSG_STRUC *)&message,   // Pointer to user buffer  
00487                          2000L );                 // Timeout   
00488    
00489    unsigned char msgnrlocal = messagenr - 1;
00490    
00491    // receive correct answer   
00492    if((message.a == CMDCODE_SDO_UPDOWNLOAD)&&(message.nr == msgnrlocal)){  
00493       _sdo_data.set_rlmsgerr(message.f);
00494       if (message.f == ERRCODE_NOERROR) // node active, no error
00495       {
00496         //check if the mapping has changed
00497         if( (_objectindex >= TRANSMIT_PDO_MAPPING_STARTADRESS) &&
00498             (_objectindex <= TRANSMIT_PDO_MAPPING_MAXADRESS) && 
00499             (nodelist[nodeindex]->hasMapping()) )
00500         { 
00501           rlDebugPrintf("Mapping has changed: boardid %d, nodeid %d, objectindex %x\n", 
00502             _boardnr, _nodeid, _objectindex);
00503             
00504           pdoid = getPdoID(_boardnr, _nodeid, _objectindex, DIRECTION_TRANSMIT);
00505           refreshMappingList(_boardnr,_nodeid,pdoid,DIRECTION_TRANSMIT);
00506         }
00507         else if ( (_objectindex >= RECEIVE_PDO_MAPPING_STARTADRESS) && 
00508                   (_objectindex <= RECEIVE_PDO_MAPPING_MAXADRESS) &&
00509                   (nodelist[nodeindex]->hasMapping()) )
00510         {
00511           rlDebugPrintf("Mapping has changed: boardid %d, nodeid %d, objectindex %x\n", 
00512             _boardnr, _nodeid, _objectindex);
00513           pdoid = getPdoID(_boardnr, _nodeid, _objectindex, DIRECTION_RECEIVE);
00514           refreshMappingList(_boardnr,_nodeid,pdoid,DIRECTION_RECEIVE);
00515         }
00516         return 1;
00517       }
00518       else
00519       {
00520         sprintf(err_out_buf, "message.f = %d  message.f = %x Hex \n", 
00521           message.f, message.f);
00522           
00523         rlDebugPrintf(err_out_buf);
00524         _sdo_data.set_rlmsgerr(message.f);
00525       }
00526     }
00527     else
00528     {
00529       _sdo_data.set_rlmsgerr(-1);
00530       sprintf(err_out_buf, "message.a = %d message.nr = %d vergleich mit: %d\n", 
00531         message.a, message.nr, msgnrlocal);
00532         
00533       rlDebugPrintf(err_out_buf);
00534     }
00535     rlDebugPrintf("ERROR during read SDO message!");
00536     rlDebugPrintf("BoardId: %d NodeId: %d Obj: %x Sub: %x\n", 
00537       _boardnr, _nodeid, _objectindex, _subindex);
00538       
00539     rlDebugPrintf(err_out_buf);
00540     return 0;
00541 }
00542 //---------------------------------------------------------------------------
00544 int rlCanOpen::pdo_receive( int _boardnr, 
00545                             int _nodeid,
00546                             int _pdonr, 
00547                             int _mappingnr, 
00548                             rlCanOpenTypes &_pdo_data)
00549 {
00550  
00551  int nodeindex;
00552  unsigned char buffer[8];
00553  
00554  if (getNodeIndex(_boardnr,_nodeid,nodeindex)== 0) 
00555  {
00556    rlDebugPrintf("ERROR: specified node does not exist! PDO receive failed!");
00557    rlDebugPrintf("BoardId: %d NodeId: %d PDO ID: %d Mappingnr: %d\n", 
00558      _boardnr, _nodeid, _pdonr, _mappingnr);
00559      
00560    _pdo_data.set_rlmsgerr(ERRCODE_INVALID_NODEID);
00561    return 0;
00562  }
00563  if (nodelist[nodeindex]->pdoList[DIRECTION_TRANSMIT].size() < (unsigned int) _pdonr){
00564    rlDebugPrintf("ERROR: specified PDO ID does not exist! PDO receive failed!");
00565    rlDebugPrintf("BoardId: %d NodeId: %d PDO ID: %d Mappingnr: %d\n", 
00566      _boardnr, _nodeid, _pdonr, _mappingnr);
00567    
00568    _pdo_data.set_rlmsgerr(ERRCODE_INVALID_PDOID);
00569    return 0;
00570  }
00571  else if (nodelist[nodeindex]->pdoList[DIRECTION_TRANSMIT][_pdonr -1]->mappingList.size() 
00572           < (unsigned int) _mappingnr){
00573    rlDebugPrintf("ERROR: specified Mappingnr does not exist! PDO receive failed!");
00574    rlDebugPrintf("BoardId: %d NodeId: %d PDO ID: %d Mappingnr: %d\n", 
00575      _boardnr, _nodeid, _pdonr, _mappingnr);
00576      
00577    _pdo_data.set_rlmsgerr(ERRCODE_INVALID_MAPID);
00578    return 0;
00579  }      
00580  
00581  // PDO No.1 has the index 0 !!!
00582  int pdosize = nodelist[nodeindex]->pdoList[DIRECTION_TRANSMIT][_pdonr-1]->bPDOSize;      
00583  int pdooffset = nodelist[nodeindex]->pdoList[DIRECTION_TRANSMIT][_pdonr-1]->usPDOAddress; 
00584  
00585  //cout<<"size ="<<pdosize<<" offset = "<<pdooffset<<"\n";
00586  
00587  if ( (sRet =  DevExchangeIO( _boardnr,   // Board NO
00588                       0,                  //offset send data
00589                       0,                  //Length of the send IO data
00590                       NULL,               //Pointer to the user send data buffer
00591                       pdooffset,          //Byte offset in the receive IO data area
00592                       pdosize,            //Length of the receive IO data
00593                       &buffer[0],         //Pointer to the user read data buffer
00594                       100L)               //timeout in milliseconds
00595       ) == DRV_NO_ERROR)
00596  {
00597    
00598    int length_in_byte = nodelist[nodeindex]->
00599          pdoList[DIRECTION_TRANSMIT][_pdonr-1]->mappingList[_mappingnr-1]->length/8;
00600            
00601    int position_in_byte = nodelist[nodeindex]->
00602          pdoList[DIRECTION_TRANSMIT][_pdonr-1]->mappingList[_mappingnr-1]->position/8; 
00603          
00604    _pdo_data.clearBuffer();
00605    
00606    for(int i = position_in_byte; i< length_in_byte+position_in_byte;i++)
00607    {
00608         _pdo_data.set_buffer(i-position_in_byte,buffer[i]);
00609    }
00610         
00611    _pdo_data.set_DaemonType( nodelist[nodeindex]->pdoList[DIRECTION_TRANSMIT][_pdonr-1]->
00612           mappingList[_mappingnr-1]->etype);
00613      
00614        
00615    _pdo_data.set_rlmsgerr(ERRCODE_NOERROR);
00616    
00617    
00618     // if CanOpen-Type is a twistet integer (etc. 52Bit ) the value will be converted
00619    int canopentype = nodelist[nodeindex]->pdoList[DIRECTION_TRANSMIT][_pdonr-1]->
00620           mappingList[_mappingnr-1]->canopentype;
00621            
00622    if (is_twisted_type(canopentype))
00623      _pdo_data.translate_CanOpenType(canopentype);   
00624    
00625    return 1;  
00626  }
00627  rlDebugPrintf("ERROR: PDO receive failed!");
00628  rlDebugPrintf("BoardId: %d NodeId: %d PDO ID: %d Mappingnr: %d\n", 
00629    _boardnr, _nodeid, _pdonr, _mappingnr);
00630  
00631  _pdo_data.set_rlmsgerr(ERRCODE_PDORCV_FAIL);
00632  
00633   return 0;     
00634 }
00635 //---------------------------------------------------------------------------
00637 int rlCanOpen::pdo_receive( int _boardnr, 
00638                             int _nodeid,
00639                             int _pdonr, 
00640                             rlCanOpenTypes &_pdo_data)
00641 {
00642    
00643    int nodeindex;
00644    if (getNodeIndex(_boardnr,_nodeid,nodeindex)== 0) 
00645    {
00646      sprintf(err_out_buf, "ERROR: specified node does not exist! PDO \
00647                            receive failed! BoardId: %d NodeId: %d PDO \
00648                            ID: %d\n", _boardnr, _nodeid, _pdonr);
00649      rlDebugPrintf(err_out_buf);
00650      
00651      //cout<<"ERROR: specified node does not exist!\n";
00652      _pdo_data.set_rlmsgerr(ERRCODE_INVALID_NODEID);
00653      return 0;
00654    }
00655    
00656    if (nodelist[nodeindex]->pdoList[DIRECTION_TRANSMIT].size() < (unsigned int) _pdonr){
00657      sprintf(err_out_buf, "ERROR: specified PDO ID does not exist! \
00658                            PDO receive failed! BoardId: %d NodeId: \
00659                            %d PDO ID: %d\n", _boardnr, _nodeid, _pdonr);
00660      rlDebugPrintf(err_out_buf);
00661 
00662      //cout<<"PDO ID does not exists!\n";
00663      _pdo_data.set_rlmsgerr(ERRCODE_INVALID_PDOID);
00664      return 0;
00665    }
00666    
00667    int pdosize = nodelist[nodeindex]->pdoList[DIRECTION_TRANSMIT][_pdonr-1]->bPDOSize;
00668    
00669    int pdooffset = nodelist[nodeindex]->
00670                                 pdoList[DIRECTION_TRANSMIT][_pdonr-1]->usPDOAddress;
00671    
00672    //cout<<"\nsize ="<<pdosize<<" offset = "<<pdooffset;
00673      
00674    if ( (sRet =  DevExchangeIO( _boardnr, // Board NO
00675                   0,                      //offset send data
00676                   0,                      //Length of the send IO data
00677                   NULL,                   //Pointer to the user send data buffer
00678                   pdooffset,              //Byte offset in the receive IO data area
00679                   pdosize,                //Length of the receive IO data
00680                   &_pdo_data.pdobuffer[0],//Pointer to the user read data buffer
00681                   100L)                   //timeout in milliseconds
00682         ) == DRV_NO_ERROR)
00683    {
00684      _pdo_data.pdobuf2buf();
00685      //rlDebugPrintf("PDO recieve successfull!\n");
00686      _pdo_data.set_rlmsgerr(ERRCODE_NOERROR);
00687      return 1;
00688    
00689    }
00690    sprintf(err_out_buf, "ERROR: PDO receive failed! \
00691                          BoardId: %d NodeId: %d PDO \
00692                          ID: %d\n", _boardnr, _nodeid, _pdonr);
00693    rlDebugPrintf(err_out_buf);
00694 
00695    //rlDebugPrintf("ERROR: PDO RECEIVE FAILED\n");
00696    _pdo_data.set_rlmsgerr(ERRCODE_PDORCV_FAIL);
00697      return 0;                          
00698 }
00699 
00700 
00701 //---------------------------------------------------------------------------
00703 int rlCanOpen::pdo_transmit( int _boardnr, 
00704                              int _nodeid,
00705                              int _pdonr, 
00706                              int _mappingnr, 
00707                              rlCanOpenTypes &_pdo_data)
00708 {
00709    int nodeindex;
00710    if (getNodeIndex(_boardnr,_nodeid,nodeindex)== 0) 
00711    {
00712      sprintf(err_out_buf, "ERROR: specified node does not exist! PDO transmit \
00713                            failed! BoardId: %d NodeId: %d PDO ID: %d Mappingnr:\
00714                             %d\n", _boardnr, _nodeid, _pdonr, _mappingnr);
00715      rlDebugPrintf(err_out_buf);
00716      _pdo_data.set_rlmsgerr(ERRCODE_INVALID_NODEID);
00717      return 0;
00718    }
00719    if (nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE].size() < (unsigned int) _pdonr){
00720      sprintf(err_out_buf, "ERROR: specified PDO ID does not exist! PDO transmit\
00721                            failed! BoardId: %d NodeId: %d PDO ID: %d Mappingnr:\
00722                             %d\n", _boardnr, _nodeid, _pdonr, _mappingnr);
00723      rlDebugPrintf(err_out_buf);
00724         
00725      //cout<<"PDO ID does not exists!\n";
00726      _pdo_data.set_rlmsgerr(ERRCODE_INVALID_PDOID);
00727      return 0;
00728    }
00729    else if (nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE][_pdonr -1]->mappingList.size()
00730               < (unsigned int) _mappingnr){
00731      sprintf(err_out_buf, "ERROR: specified mappingnr does not exist! PDO \
00732                            transmit failed! BoardId: %d NodeId: %d PDO \
00733                            ID: %d Mappingnr: %d\n", 
00734                            _boardnr, _nodeid, _pdonr, _mappingnr);
00735      rlDebugPrintf(err_out_buf);
00736 
00737      //cout<<"mapping ID does not exists!\n";
00738      _pdo_data.set_rlmsgerr(ERRCODE_INVALID_MAPID);
00739      return 0;
00740    }    
00741    
00742    // PDO No.1 has the index 0 !!!
00743    int pdosize = nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE][_pdonr-1]->bPDOSize; 
00744    int pdooffset = nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE][_pdonr-1]->usPDOAddress;
00745 
00746    int length_in_byte = nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE][_pdonr-1]->
00747                           mappingList[_mappingnr-1]->length/8;
00748                           
00749    int position_in_byte = nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE][_pdonr-1]->
00750                           mappingList[_mappingnr-1]->position/8; 
00751    
00752    if (_pdo_data.get_DaemonType() != (nodelist[nodeindex]->
00753                pdoList[DIRECTION_RECEIVE][_pdonr-1]->mappingList[_mappingnr-1]->etype))
00754    {  
00755      
00756      sprintf(err_out_buf, "ERROR: invalid type! Expected type: %d  Your Type:\
00757                             %d! PDO transmit failed! BoardId: %d NodeId: %d \
00758                             PDO ID: %d Mappingnr: %d\n", 
00759           nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE][_pdonr-1]->
00760             mappingList[_mappingnr-1]->etype, 
00761           _pdo_data.get_DaemonType(), _boardnr, _nodeid, _pdonr, _mappingnr);
00762        
00763        
00764      rlDebugPrintf(err_out_buf);
00765      _pdo_data.get_DaemonType();
00766      _pdo_data.set_rlmsgerr(ERRCODE_INVALID_RLTYPE);
00767      return 0;
00768    }
00769    
00770     _pdo_data.buf2pdobuf();
00771    
00772    // no conversion necessary. correct length in mapping list
00773 
00774    pdooffset = pdooffset + position_in_byte;
00775    pdosize = length_in_byte;
00776    
00777    
00778    
00779    //cout<<"size ="<<pdosize<<" offset = "<<pdooffset<<"\n";
00780    
00781    if ( (sRet =  DevExchangeIO( _boardnr,       // Board NO
00782                         pdooffset,              //offset send data
00783                         pdosize,                //Length of the send IO data
00784                         &_pdo_data.pdobuffer[0],//Pointer to the user send data buffer
00785                         0,                      //Byte offset in the receive IO data area
00786                         0,                      //Length of the receive IO data
00787                         NULL,                   //Pointer to the user read data buffer
00788                         100L)                   //timeout in milliseconds
00789         ) == DRV_NO_ERROR)
00790    {
00791      _pdo_data.set_rlmsgerr(0);
00792      //rlDebugPrintf("PDO transmit successful! \n");
00793      return 1;  
00794    }
00795    sprintf(err_out_buf, "ERROR: PDO transmit failed! BoardId: %d NodeId: %d \
00796                          PDO ID: %d Mappingnr: %d\n", 
00797                          _boardnr, _nodeid, _pdonr, _mappingnr);
00798    rlDebugPrintf(err_out_buf);
00799    
00800    _pdo_data.set_rlmsgerr(ERRCODE_PDOSND_FAIL);
00801    return 0;    
00802 }
00803 //---------------------------------------------------------------------------
00804 
00806 int rlCanOpen::pdo_transmit( int _boardnr, 
00807                              int _nodeid,
00808                              int _pdonr, 
00809                              rlCanOpenTypes &_pdo_data)
00810 {
00811    int nodeindex;
00812    _pdo_data.buf2pdobuf();
00813    
00814    if (getNodeIndex(_boardnr,_nodeid,nodeindex)== 0) 
00815    {
00816      sprintf(err_out_buf, "ERROR: specified node does not exist! PDO transmit\
00817                            failed! BoardId: %d NodeId: %d PDO ID: %d \n",
00818                             _boardnr, _nodeid, _pdonr);
00819                             
00820      rlDebugPrintf(err_out_buf);
00821      _pdo_data.set_rlmsgerr(ERRCODE_INVALID_NODEID);
00822      return 0;
00823    }
00824    if (nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE].size() < (unsigned int) _pdonr){
00825      sprintf(err_out_buf, "ERROR: specified PDO ID does not exist! PDO \
00826                            transmit failed! BoardId: %d NodeId: %d PDO \
00827                            ID: %d \n", _boardnr, _nodeid, _pdonr);
00828      rlDebugPrintf(err_out_buf);
00829      _pdo_data.set_rlmsgerr(ERRCODE_INVALID_PDOID);
00830      return 0;
00831    }
00832    
00833    int pdosize = nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE][_pdonr-1]->bPDOSize;
00834    int pdooffset = nodelist[nodeindex]->pdoList[DIRECTION_RECEIVE][_pdonr-1]->usPDOAddress; 
00835    
00836    if ( (sRet =  DevExchangeIO( _boardnr,       // Board NO
00837                         pdooffset,              //offset send data
00838                         pdosize,                //Length of the send IO data
00839                         &_pdo_data.pdobuffer[0],//Pointer to the user send data buffer
00840                         0,                      //Byte offset in the receive IO data area
00841                         0,                      //Length of the receive IO data
00842                         NULL,                   //Pointer to the user read data buffer
00843                         100L)                   //timeout in milliseconds
00844         ) == DRV_NO_ERROR)
00845    {
00846      _pdo_data.set_rlmsgerr(ERRCODE_NOERROR);
00847      return 1;
00848    }
00849    sprintf(err_out_buf, "ERROR: PDO transmit failed! BoardId: %d NodeId: %d \
00850                          PDO ID: %d \n", _boardnr, _nodeid, _pdonr);
00851    rlDebugPrintf(err_out_buf);
00852    
00853    _pdo_data.set_rlmsgerr(ERRCODE_PDOSND_FAIL);
00854     return 0;                           
00855 }
00856 
00857 //---------------------------------------------------------------------------
00859 void rlCanOpen::delmsg(){
00860   message.rx            =0;
00861   message.tx            =0;
00862   message.ln            =0;
00863   message.nr            =0;
00864   message.a             =0;
00865   message.f             =0;
00866   message.b             =0;
00867   message.e             =0;
00868   message.device_adr    =0;
00869   message.data_area     =0;
00870   message.data_adr      =0;
00871   message.data_idx      =0;
00872   message.data_cnt      =0;
00873   message.data_type     =0;
00874   message.function      =0;
00875   
00876   for (int i = 0; i < MAX_SDO_BUFFERSIZE; i++)
00877     message.d[i] = 0;
00878 
00879 }
00880 //---------------------------------------------------------------------------
00882 int rlCanOpen::getNodeIndex(int _boardnr,int _nodeid,int & _index)
00883 {
00884   for(unsigned int i = 0; i < nodelist.size(); i++)
00885   {
00886     if ((nodelist[i]->getNodeID() == _nodeid) && 
00887         (nodelist[i]->getBoardID() == _boardnr))
00888     {
00889       _index = i;
00890       return true;
00891     }           
00892   }
00893   return false; 
00894 }
00895 //---------------------------------------------------------------------------
00897 int rlCanOpen::getObjectType( int _boardnr, 
00898                               int _nodeid, 
00899                               int _objectindex, 
00900                               int _subindex)
00901 {
00902   int nodeindex;
00903   if (getNodeIndex(_boardnr, _nodeid, nodeindex)){
00904     if (nodelist[nodeindex]->hasMapping())
00905       return nodelist[nodeindex]->objecttype(_objectindex, _subindex);
00906     else
00907       return rlCanOpenTypes::RL_BUFFER;
00908   }
00909   else{
00910     return rlCanOpenTypes::RL_NOTYPE;
00911   }
00912 }
00913 
00914 //---------------------------------------------------------------------------
00917 int rlCanOpen::refreshMappingList( int _boardnr, 
00918                                    int _nodeid,
00919                                    int _pdoID,
00920                                    int _pdoDirection)
00921 {
00922   //rlDebugPrintf("refresh mappinglist1\n");
00923   int nodeindex;
00924   int madress=0;
00925   
00926    
00927     madress = nodelist[nodelist.size()-1]->
00928                 pdoList[_pdoDirection][_pdoID -1]->mappingOvAdress;
00929       
00930   if (getNodeIndex(_boardnr,_nodeid,nodeindex)== false) 
00931   {
00932     sprintf(err_out_buf, "ERROR: specified node does not exist! refresh \
00933                           mapping list failed! BoardId: %d NodeId: %d \
00934                           PDO ID: %d \n", _boardnr, _nodeid, _pdoID);
00935     rlDebugPrintf(err_out_buf);
00936     return 0;
00937   }
00938   
00939  
00940   if(nodelist[nodeindex]->pdoList[_pdoDirection].size() < (unsigned int) _pdoID)
00941   {
00942     sprintf(err_out_buf, "ERROR: PDO does not exist! refresh \
00943                           mapping list failed! BoardId: %d NodeId: %d \
00944                           PDO ID: %d \n", _boardnr, _nodeid, _pdoID);
00945     rlDebugPrintf(err_out_buf);
00946     return 0;
00947   }
00948    
00949   //append Mapping data                                 
00950   rlCanOpenTypes sdobuffer;                            
00951   int mappingcount;
00952   rlCanMapping * mappingobject; 
00953                                             
00954   //get mapping count                       
00955   if (sdo_read(_boardnr,_nodeid,madress,0,sdobuffer) == 0){
00956     sprintf(err_out_buf, "ERROR: read sdo data! refresh mapping list failed! \
00957                           BoardId: %d NodeId: %d PDO ID: %d \n", 
00958                           _boardnr, _nodeid, _pdoID);
00959     rlDebugPrintf(err_out_buf);
00960   }
00961   
00962   mappingcount = sdobuffer.get_uchar();   
00963   
00964   sprintf(err_out_buf, "Current mappingcount: %d\n", mappingcount);
00965   rlDebugPrintf(err_out_buf);                                           
00966   
00967   nodelist[nodeindex]->pdoList[_pdoDirection][_pdoID-1]->
00968                   mappingList.resize(mappingcount);
00969 
00970   int currentposition = 0;
00971   for (int mcount = 1; mcount <= mappingcount;mcount++)  //each mappingobject
00972   {
00973     mappingobject = new rlCanMapping;  //create new mappingobject in memory
00974     mappingobject->mappingId = mcount;
00975         
00976    
00977    if (sdo_read(_boardnr,_nodeid,madress,mcount,sdobuffer) == 0){
00978      sprintf(err_out_buf, "ERROR: read sdo data! refresh mapping list failed! \
00979                            BoardId: %d NodeId: %d PDO ID: %d \n", 
00980                            _boardnr, _nodeid, _pdoID);
00981      rlDebugPrintf(err_out_buf);
00982      //cout<<"Error during create Mappinglist!\n";
00983     }
00984        
00985     //get length of mapping object
00986     int mlength  = sdobuffer.get_buffer(0);
00987     mappingobject->length = mlength;
00988     
00989     //calculate the mapping position
00990     if (mcount>1)
00991       mappingobject->position = currentposition;         
00992     else       
00993       mappingobject->position = 0;           
00994     currentposition+=mlength;
00995     
00996     // get the ov adress of the current mapped object
00997     int mi  = (int) (sdobuffer.get_buffer(3)*pow(256,1) 
00998                                           + sdobuffer.get_buffer(2));
00999                                           
01000     unsigned char msi = sdobuffer.get_buffer(1);
01001         
01002     rlCanOpenTypes temptype;
01003     mappingobject->etype = temptype.canOpenType2DeamonType
01004                            (nodelist[nodelist.size()-1]->objecttype(mi, msi));
01005         
01006     // insert the mappingobject to mappinglist
01007     nodelist[nodeindex]->pdoList[_pdoDirection][_pdoID-1]->
01008                          mappingList.insert(mcount-1,mappingobject);
01009        
01010   }
01011   return 1;                                                   
01012 }                                                               
01013 //---------------------------------------------------------------------------
01015 int rlCanOpen::getPdoID( int _boardnr, 
01016                          int _nodeid, 
01017                          int _objektindex, 
01018                          int _direction){
01019   int pdomax=0;
01020   int nodeindex=0;
01021   int madress=0;
01022   // get index of node in nodelist depending on boardid and nodeid
01023   // index is stored in nodeindex variable
01024   getNodeIndex(_boardnr, _nodeid, nodeindex); 
01025   
01026   // get number of elements in particular PDO list
01027   if (_direction == DIRECTION_RECEIVE)
01028     pdomax = nodelist[nodeindex]->getReceivePdoCount();
01029   if (_direction == DIRECTION_TRANSMIT)
01030     pdomax = nodelist[nodeindex]->getTransmitPdoCount();
01031    
01032    /* iterate through every element of particular list until mapping 
01033       object adress matches given objectindex */
01034    for (int j=1;j<=pdomax;j++)  
01035    {                                                                                                    
01036       
01037      madress = nodelist[nodeindex]->pdoList[_direction][j-1]->mappingOvAdress;    
01038      if (madress == _objektindex)
01039        return j;  
01040    }
01041    return 0;
01042 }
01043 //---------------------------------------------------------------------------
01045 int rlCanOpen::getNodeState(int _boardnr, int _nodeid, rlCanOpenTypes &_data)
01046 { 
01047  
01048  setBoardActive(_boardnr);
01049  
01050  COM_ND_DIAGNOSTICS * diag;
01051  diag = (COM_ND_DIAGNOSTICS*) &message.d[0];
01052 
01053   message.rx = CAN_TASK         ;//receiver = user at HOST
01054   message.tx = USER_AT_HOST     ;// transmitter = USR_INTF-Task
01055   message.ln = 8                ;//length of message
01056   message.nr = messagenr++      ;//number of the message
01057   message.a  = 0                ;//no answer
01058   message.f  = 0                ;//error, status
01059   message.b  = CMDCODE_Node_Diag;//command = COM_Node_Diag
01060   message.e =0                  ;//extension
01061   message.device_adr = _nodeid  ;//k Rem_Adr
01062   message.data_area = 0         ;// data area, unused
01063   message.data_adr  = 0         ;//data address, unused
01064   message.data_idx  = 0         ;//data index, unused
01065   message.data_cnt  = 0         ;//data count, unused
01066   message.data_type = 5         ;// data type byte string
01067   message.function =  1         ;//function read
01068   
01069   
01070  if ( (sRet = DevPutMessage(_boardnr, (MSG_STRUC *)&message, 5000L)) 
01071        == DRV_NO_ERROR )
01072  {
01073    while( (sRet = DevGetMessage(_boardnr, sizeof(message), 
01074                                 (MSG_STRUC *)&message, 0)) 
01075           == DRV_DEV_GET_NO_MESSAGE )       
01076    {
01077      continue;
01078    }
01079    if ( sRet == DRV_NO_ERROR )
01080    {
01081      rlDebugPrintf("message successfully received\n");
01082      // continue;
01083    }
01084    else
01085    {
01086      rlDebugPrintf("Error  Message (f = %d))\n",message.f);
01087      rlDebugPrintf("\nDevGetMessage(%d, sizeof(message), &message, 500): %d\n",
01088              _boardnr, (int)sRet);
01089              
01090      return 0;
01091     } 
01092   }
01093   else
01094   {
01095     rlDebugPrintf("\nDevPutMessage(%d, &message, 5000): %d\n",_boardnr, (int)sRet);
01096     return 0;
01097   }   
01098   _data.set_nodestateFlags( diag->bNodeStatus_1.bNodeNoResponse, 
01099                             diag->bNodeStatus_1.bEmcyBuffOverflow,
01100                             diag->bNodeStatus_1.bPrmFault, 
01101                             diag->bNodeStatus_1.bGuardActive,
01102                             diag->bNodeStatus_1.bDeactivated );
01103                        
01104   _data.set_nodestate(diag->bNodeState);
01105   _data.set_nodeerror(diag->bActualError);
01106                        
01107   _data.set_DaemonType(rlCanOpenTypes::RL_NODESTATE);
01108   
01109   return 1;
01110 }
01111 
01112 //---------------------------------------------------------------------------
01114 int rlCanOpen::restartBoard(int _boardnr, int _restarttype)
01115 {
01116    //COLDSTART           2
01117    //WARMSTART           3
01118    //BOOTSTART           4
01119    
01120    if ( (sRet = DevReset(_boardnr, _restarttype, 5000L) != DRV_NO_ERROR ))
01121   {
01122     rlDebugPrintf("restart failed!\n");
01123     rlDebugPrintf("DevReset(%d, Restart, 5000): %d\n", _boardnr, sRet);
01124     return 0;
01125   }
01126   
01127    rlDebugPrintf("restart successfully\n");
01128    return 1;
01129 }
01130 //---------------------------------------------------------------------------
01132 int rlCanOpen::sendNMTCommand(int _boardnr, int _nodeid, unsigned char _cmd)
01133 {
01134   MSG_STRUC message;
01135   setBoardActive(_boardnr);
01136   
01137   message.rx = CAN_TASK         ;//receiver = user at HOST
01138   message.tx = USER_AT_HOST     ;// transmitter = USR_INTF-Task
01139   message.ln = 2                ;//length of message
01140   message.nr = messagenr++      ;//number of the message
01141   message.a  = 0                ;//no answer
01142   message.f  = 0                ;//error, status
01143   message.b  = CMD_NMT_Module_Protocol;//command = COM_Node_Diag
01144   message.e =  0                ;//extension
01145 
01146         // NMT Command specifier
01147         //1     Start Remote Node
01148         //2     Stop Remote Node
01149         //128   Enter Pre-Operational
01150         //129   Reset Node
01151         //130   Reset Communication
01152   message.data[0] = _cmd                ;//NMT Command specifier
01153   message.data[1] = _nodeid     ;//NodeID
01154   
01155    if ( (sRet = DevPutMessage(_boardnr, (MSG_STRUC *)&message, 5000L)) 
01156          == DRV_NO_ERROR )
01157  {
01158    while( (sRet = DevGetMessage(_boardnr, sizeof(message), 
01159                                (MSG_STRUC *)&message, 0)) 
01160            == DRV_DEV_GET_NO_MESSAGE )
01161    {
01162      continue;
01163    }
01164    if ( sRet == DRV_NO_ERROR )
01165    {
01166      rlDebugPrintf("NMT message successfully received\n");
01167      // continue;
01168    }
01169    else
01170    {
01171      rlDebugPrintf("Error  Message (f = %d))\n",message.f);
01172      rlDebugPrintf("\nDevGetMessage(%d, sizeof(message), &message, 500): %d\n",
01173              _boardnr, (int)sRet);
01174      
01175      return 0;
01176     }
01177   }
01178   else
01179   {
01180     rlDebugPrintf("\nDevPutMessage(NMT)(%d, &message, 5000): %d\n",_boardnr, (int)sRet);
01181     return 0;
01182   } /* if ( (sRet = DevPutMessage(...)) == DRV_NO_ERROR ) else */
01183   
01184   return 1;     
01185 }
01186 
01187 //---------------------------------------------------------------------------
01189 void rlCanOpen::read_inifile(const char* _filename){
01190   rlIniFile ini;   
01191   QString buffer;
01192   if (ini.read(_filename)!=-1){
01193     rlDebugPrintf("used inifile: %s\n", _filename);
01194     
01195     // read EDS directory location
01196     buffer=QString(ini.text("DIRECTORIES","EdsDir"));
01197     buffer.remove((char) ACSII_CODE_CARRIAGE_RETURN);
01198     rlDebugPrintf("EdsDir: %s\n", buffer.ascii());
01199     // store EDS directory location in environmet variable
01200 #ifdef RLWIN32
01201     SetEnvironmentVariable("EdsDir", buffer.ascii());
01202 #else
01203     setenv("EdsDir", buffer.ascii(), 1);
01204 #endif    
01205     
01206     // read Logfilename
01207     logFileName=QString(ini.text("DIRECTORIES","LogFileName"));
01208     logFileName.remove((char) ACSII_CODE_CARRIAGE_RETURN);
01209     rlDebugPrintf("Log Filename: %s\n", logFileName.ascii());
01210     
01211     // read loggin-option 
01212     buffer=QString(ini.text("OPTIONS","enableLoggin"));
01213     if (buffer.contains("yes", false)==1)
01214       enableLogging=true;  
01215     else
01216       enableLogging=false;  
01217   }
01218   else
01219   {
01220     logFileName=  "./outfile.txt";
01221     rlDebugPrintf("ERROR: INIFILE NOT FOUND\n");
01222   }
01223 }
01224 
01225 //-------------------------------------------------------------------------
01226 bool rlCanOpen::is_twisted_type(int _canopentype)
01227 {
01228   switch (_canopentype){
01229   
01230     case rlCanOpenTypes::INTEGER24_t :return true;  
01231     case rlCanOpenTypes::INTEGER40_t :return true;  
01232     case rlCanOpenTypes::INTEGER48_t :return true;  
01233     case rlCanOpenTypes::INTEGER56_t :return true;  
01234     case rlCanOpenTypes::UNSIGNED24_t:return true;  
01235     case rlCanOpenTypes::UNSIGNED40_t:return true;  
01236     case rlCanOpenTypes::UNSIGNED48_t:return true; 
01237     case rlCanOpenTypes::UNSIGNED56_t:return true;   
01238     default                          :return false;
01239   };
01240 
01241 }
01242