rllib  1
rlcanopentypes.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 #ifndef RLCANOPENTYPES
00017 #define RLCANOPENTYPES
00018 
00019 #include "rlcutil.h"
00020 #include "rlcanopentypes.h"
00021 
00022 
00024 rlCanOpenTypes::rlCanOpenTypes(){
00025   typenumber = RL_NOTYPE;
00026   rlmsgerr = 0;
00027   clearBuffer();
00028 }
00029 
00031 int rlCanOpenTypes::getLength()
00032 {
00033   switch(typenumber)   {                               
00034     case RL_INT:       return 4;
00035     case RL_FLOAT:     return 4;
00036     case RL_DOUBLE:    return 8;
00037     case RL_SHORT:     return 2;
00038     case RL_USHORT:    return 2;
00039     case RL_LONGLONG:  return 8;
00040     case RL_STRING:    return 246;
00041     case RL_BUFFER:    return 246;
00042     case RL_UCHAR:     return 1;
00043     case RL_BOOL:      return 1;
00044     case RL_LONG:      return 4;
00045     case RL_ULONG:     return 4;
00046     case RL_ULONGLONG: return 8;
00047     case RL_PDO:       return 8;
00048     case RL_NOTYPE:    return 0;
00049     default:           return 0;
00050   } 
00051 }   
00052 
00054 void rlCanOpenTypes::clearBuffer(){
00055   for (int i=0; i<247; i++){
00056     t_databytes[i] = 0;
00057   }
00058 }
00059 
00061 void rlCanOpenTypes::set_DaemonType(int _type){
00062   typenumber  = _type;
00063 }
00064 
00066 void rlCanOpenTypes::set_DaemonType(rl_types _type){
00067   typenumber  = _type;
00068 }
00069 
00071 int  rlCanOpenTypes::get_DaemonType(){
00072   return typenumber;
00073 }
00074 
00076 void rlCanOpenTypes::set_CanOpenType(int _type){
00077   typenumber  = canOpenType2DeamonType(_type);
00078 }
00079 
00081 int rlCanOpenTypes::get_CanOpenType(){
00082   return deamonType2CanOpenType(typenumber);
00083 }
00084 
00086 int rlCanOpenTypes::canOpenType2DeamonType(int _canopentype)
00087 {
00088   // refer table Data Types on page 11 in CiA CANopen Specification
00089   
00090   switch(_canopentype)   { 
00091     case 0x0001:return RL_BOOL;   // c_BOOLEAN         
00092     case 0x0002:return RL_SHORT;   // INTEGER8_t        
00093     case 0x0003:return RL_SHORT;   // INTEGER16_t       
00094     case 0x0004:return RL_LONG;   // INTEGER32_t        
00095     case 0x0005:return RL_UCHAR;   // UNSIGNED8_t        
00096     case 0x0006:return RL_USHORT;   // UNSIGNED16_t       
00097     case 0x0007:return RL_ULONG;   // UNSIGNED32_t       
00098     case 0x0008:return RL_FLOAT;   // REAL32_t           
00099     case 0x0009:return RL_STRING;   // VISIBLE_STRING
00100     case 0x000A:return RL_STRING;   // OCTET_STRING_t     
00101     case 0x000B:return RL_STRING;   // UNICODE_STRING
00102     case 0x000C:return RL_ULONGLONG;   // TIME_OF_DAY_t      
00103     case 0x000D:return RL_ULONGLONG;   // TIME_DIFFERENC
00104     case 0x000E:return RL_BUFFER;   // BIT_STRING_t       
00105     case 0x000F:return RL_BUFFER;   // DOMAIN_t           
00106     case 0x0010:return RL_ULONG;   // INTEGER24_t        
00107     case 0x0011:return RL_DOUBLE;   // REAL64_t           
00108     case 0x0012:return RL_LONGLONG;   // INTEGER40_t        
00109     case 0x0013:return RL_LONGLONG;   // INTEGER48_t        
00110     case 0x0014:return RL_LONGLONG;   // INTEGER56_t        
00111     case 0x0015:return RL_LONGLONG;   // INTEGER64_t        
00112     case 0x0016:return RL_ULONG;   // UNSIGNED24_t       
00113     case 0x0017:return RL_BUFFER;   // RESERVED1_t        
00114     case 0x0018:return RL_ULONGLONG;   // UNSIGNED40_t       
00115     case 0x0019:return RL_ULONGLONG;   // UNSIGNED48_t       
00116     case 0x001A:return RL_ULONGLONG;   // UNSIGNED56_t       
00117     case 0x001B:return RL_ULONGLONG;   // UNSIGNED64_t  
00118     default    :return RL_NOTYPE;   // ERROR
00119   }
00120 }
00121 
00122 
00124 int rlCanOpenTypes::deamonType2CanOpenType(int _deamontype)
00125 {
00126 
00127   switch(_deamontype)   {                               
00128    case RL_INT:return 0x0007;
00129    case RL_FLOAT:return 0x0008;
00130    case RL_DOUBLE:return 0x0011;
00131    case RL_SHORT:return 0x0003;
00132    case RL_USHORT:return 0x0006;
00133    case RL_LONGLONG:return 0x0015;
00134    case RL_STRING:return 0x0009;
00135    case RL_BUFFER:return 0x000A;
00136    case RL_UCHAR:return 0x0005;//???
00137    case RL_BOOL:return 0x0001;
00138    case RL_LONG:return 0x0004;
00139    case RL_ULONG:return 0x0007;
00140    case RL_ULONGLONG:return 0x001B;
00141    case RL_PDO:return 0x000E;
00142    case RL_NOTYPE:return 0x0;
00143    default:return 0x0;
00144   } 
00145 }         
00146 
00148 void rlCanOpenTypes::set_int(int _value){
00149   t_int = _value;
00150   typenumber = RL_INT;
00151 }
00152 
00154 int rlCanOpenTypes::get_int(){
00155   if (typenumber != RL_INT){
00156     invalidTypeError(RL_INT);
00157     
00158   }
00159   return t_int;
00160 }
00161 
00163 void rlCanOpenTypes::set_float(float _value){
00164   t_float = _value;
00165   typenumber = RL_FLOAT;
00166 }
00167 
00169 float rlCanOpenTypes::get_float(){
00170   if (typenumber != RL_FLOAT){
00171     invalidTypeError(RL_FLOAT);
00172   }
00173   return t_float;
00174 }
00175 
00177 void rlCanOpenTypes::set_double(double _value){
00178   t_double = _value;
00179   typenumber = RL_DOUBLE;
00180 }
00181 
00183 double rlCanOpenTypes::get_double(){
00184   if (typenumber != RL_DOUBLE){
00185     invalidTypeError(RL_DOUBLE);
00186   }
00187   return t_double;
00188 }
00189 
00191 void rlCanOpenTypes::set_short(short _value){
00192   t_short = _value;
00193   typenumber = RL_SHORT;
00194 }
00195 
00197 short rlCanOpenTypes::get_short(){
00198   if (typenumber != RL_SHORT){
00199     invalidTypeError(RL_SHORT);    
00200   }
00201   return t_short;
00202 }
00203 
00205 void rlCanOpenTypes::set_ushort(ushort _value){
00206   t_ushort = _value;
00207   typenumber = RL_USHORT;
00208 }
00209 
00211 unsigned short rlCanOpenTypes::get_ushort(){
00212   if (typenumber != RL_USHORT){
00213     invalidTypeError(RL_USHORT);
00214   }
00215   return t_ushort;
00216 }
00217 
00218 
00220 void rlCanOpenTypes::set_longlong(long int _value){
00221   t_longlong = _value;
00222   typenumber = RL_LONGLONG;
00223 }
00224 
00226 long int rlCanOpenTypes::get_longlong(){
00227   if (typenumber != RL_LONGLONG){
00228     invalidTypeError(RL_LONGLONG);
00229   }
00230   return t_longlong;
00231 }
00232 
00235 void rlCanOpenTypes::set_string(const char* _value){
00236   int i=0;
00237   while ((_value[i] != '\0')&&(i<247)){
00238     t_string[i] = _value[i];
00239     i++;        
00240   }
00241   typenumber = RL_STRING;
00242 }
00243 
00245 char* rlCanOpenTypes::get_string(){
00246   if (typenumber != RL_STRING){
00247     invalidTypeError(RL_STRING);
00248   }
00249   char* outstring = new char[247];
00250   int i=0;
00251   while ((t_string[i] != '\0')&&(i<247)){
00252     outstring[i] = t_string[i];
00253     i++;        
00254   }
00255   return outstring;
00256 }
00257 
00259 void rlCanOpenTypes::set_buffer(int _index, unsigned char _databyte){
00260   if (_index<247){
00261     t_databytes[_index] = _databyte;
00262   }
00263   else
00264   {
00265     fprintf(stderr, "ERROR! set_buffer: INDEX OUT OF RANGE!\n");  
00266   }
00267 }
00268 
00269 
00271 unsigned char rlCanOpenTypes::get_buffer(int _index){
00272   if (_index<247){
00273     return t_databytes[_index];
00274   }
00275   else
00276   {
00277     fprintf(stderr, "ERROR! get_buffer: INDEX OUT OF RANGE!\n");  
00278     return 0;
00279   }
00280 }
00281 
00283 void rlCanOpenTypes::set_uchar(unsigned char _value){
00284   t_databyte = _value;
00285   typenumber = RL_UCHAR;
00286 }
00287 
00289 unsigned char rlCanOpenTypes::get_uchar(){
00290   if (typenumber != RL_UCHAR){
00291     invalidTypeError(RL_UCHAR);
00292   }
00293   return t_databyte;
00294 }
00295 
00297 void rlCanOpenTypes::set_bool(bool _value){
00298   t_bool = _value;
00299   typenumber = RL_BOOL;
00300 }
00301 
00303 bool rlCanOpenTypes::get_bool(){
00304   if (typenumber != RL_BOOL){
00305     invalidTypeError(RL_BOOL);
00306   }
00307   return t_bool;
00308 }
00310 void rlCanOpenTypes::set_long(long _value){
00311   t_long = _value;
00312   typenumber = RL_LONG;
00313 }
00314 
00316 long  rlCanOpenTypes::get_long(){
00317   if (typenumber != RL_LONG){
00318     invalidTypeError(RL_LONG);          
00319   }
00320   return t_long;
00321 }
00323 void rlCanOpenTypes::set_ulonglong(unsigned long int _value){
00324   t_ulonglong = _value;
00325   typenumber = RL_ULONGLONG;
00326 }
00327 
00329 unsigned long int rlCanOpenTypes::get_ulonglong(){
00330   if (typenumber != RL_ULONGLONG)
00331   {
00332     invalidTypeError(RL_ULONGLONG);
00333   }
00334   return t_ulonglong;
00335 }
00336 
00338 void rlCanOpenTypes::set_ulong(unsigned long _value){
00339   t_ulong = _value;
00340   typenumber = RL_ULONG;
00341 }
00342 
00344 unsigned long rlCanOpenTypes::get_ulong(){
00345   if (typenumber != RL_ULONG){
00346     invalidTypeError(RL_ULONG);
00347   }
00348   return t_ulong;
00349 }
00350 
00352 void rlCanOpenTypes::set_rlmsgerr(long _errnr){
00353   rlmsgerr = _errnr;
00354 }
00355 
00357 long rlCanOpenTypes::get_rlmsgerr(){
00358   return rlmsgerr;
00359 }
00360 
00361 
00363 rlCanOpenTypes& rlCanOpenTypes::operator = (rlCanOpenTypes &cp){
00364   typenumber = cp.typenumber;
00365   rlmsgerr = cp.rlmsgerr;
00366   for (int i=0; i<246; i++){
00367     t_databytes[i]=cp.t_databytes[i];
00368   }
00369   return *this;
00370 }
00371 
00373 void  rlCanOpenTypes::invalidTypeError(int _typenr){
00374   char* curTypeStr; 
00375   char* usrTypeStr;
00376   curTypeStr = type2str(typenumber);
00377   usrTypeStr = type2str(_typenr);
00378   rlDebugPrintf("Warning! %s invalid type! current data type is: %s \n"
00379          , usrTypeStr, curTypeStr);
00380   delete curTypeStr;
00381   delete usrTypeStr;
00382 }
00383 
00385 char* rlCanOpenTypes::type2str(int _typenr){
00386   char* typestr = new char[12];
00387   switch(_typenr)   {                               
00388    case RL_INT:       strncpy(typestr, "RL_INT      ", 12); break;
00389    case RL_FLOAT:     strncpy(typestr, "RL_FLOAT    ", 12); break;
00390    case RL_DOUBLE:    strncpy(typestr, "RL_DOUBLE   ", 12); break;
00391    case RL_SHORT:     strncpy(typestr, "RL_SHORT    ", 12); break;
00392    case RL_USHORT:    strncpy(typestr, "RL_USHORT   ", 12); break;
00393    case RL_LONGLONG:  strncpy(typestr, "RL_LONGLONG ", 12); break;
00394    case RL_STRING:    strncpy(typestr, "RL_STRING   ", 12); break;
00395    case RL_BUFFER:    strncpy(typestr, "RL_BUFFER   ", 12); break;
00396    case RL_UCHAR:     strncpy(typestr, "RL_UCHAR    ", 12); break;
00397    case RL_BOOL:      strncpy(typestr, "RL_BOOL     ", 12); break;
00398    case RL_LONG:      strncpy(typestr, "RL_LONG     ", 12); break;
00399    case RL_ULONG:     strncpy(typestr, "RL_ULONG    ", 12); break;
00400    case RL_ULONGLONG: strncpy(typestr, "RL_ULONGLONG", 12); break;
00401    case RL_PDO:       strncpy(typestr, "RL_PDO      ", 12); break;
00402    case RL_NODESTATE: strncpy(typestr, "RL_NODESTATE", 12); break;
00403    case RL_NOTYPE:    strncpy(typestr, "RL_NOTYPE   ", 12); break;
00404    default:           strncpy(typestr, "UNDEFINED   ", 12); 
00405   } 
00406   return typestr;
00407 }
00408 
00410 void rlCanOpenTypes::rlMsgErrOut(){
00411   char* errOut = rlMsgErrStr();
00412   rlDebugPrintf("ERROR: \"%s\" \n", errOut);
00413   delete errOut;
00414 }
00416 char* rlCanOpenTypes::rlMsgErrStr(){
00417   char* errstr = new char[25];
00418   switch(rlmsgerr)   {                               
00419    case 0:  strncpy(errstr, "ERRCODE_NOERROR       ", 25); break;
00420    case -1: strncpy(errstr, "                      ", 25); break;
00421    case -2: strncpy(errstr, "ERRCODE_INVALID_NODEID", 25); break;
00422    case -3: strncpy(errstr, "ERRCODE_INVALID_PDOID ", 25); break;
00423    case -4: strncpy(errstr, "ERRCODE_PDOSND_FAIL   ", 25); break;
00424    case -5: strncpy(errstr, "ERRCODE_INVALID_MAPID ", 25); break;
00425    case -6: strncpy(errstr, "ERRCODE_INVALID_RLTYPE", 25); break;
00426    case -7: strncpy(errstr, "ERRCODE_PDORCV_FAIL   ", 25); break;
00427    default: strncpy(errstr, "ERRCODE_MSGF          ", 25); break;
00428   } 
00429   return errstr;
00430 }
00431 
00432 
00434 void rlCanOpenTypes::buf2pdobuf(){
00435   for (int i=0; i<8; i++){
00436     pdobuffer[i]=t_databytes[i];
00437   }
00438   typenumber = RL_PDO;
00439 }
00440 
00442 void rlCanOpenTypes::pdobuf2buf(){
00443   for (int i=0; i<8; i++){
00444     t_databytes[i]=pdobuffer[i];
00445   }
00446   typenumber = RL_PDO;
00447 }
00448 
00449 
00451 IPCMSGSTRUCT rlCanOpenTypes::createIpcMsg(){
00452   IPCMSGSTRUCT istruct;
00453   for (int i=0; i<247; i++){
00454     istruct.mtext[i] = t_string[i];
00455   }
00456   istruct.typenumber = typenumber;
00457   istruct.msgtype     = -1;
00458   istruct.transfertype= -1;
00459   istruct.processid   = -1;
00460   istruct.boardid     = -1;
00461   istruct.nodeid      = -1;
00462   istruct.objectindex = -1;
00463   istruct.subindex    = -1;
00464   istruct.pdoid       = -1;
00465   istruct.mappingid   = -1;
00466   istruct.rlmsgerr    = rlmsgerr;
00467   return istruct;
00468 }
00469 
00471 void rlCanOpenTypes::getIpcMsg(IPCMSGSTRUCT _myIpcMsg){
00472   for (int i=0; i<247; i++){
00473     t_string[i] = _myIpcMsg.mtext[i];
00474   }
00475   typenumber = _myIpcMsg.typenumber;
00476   rlmsgerr   = _myIpcMsg.rlmsgerr;
00477 }
00478 
00480 void rlCanOpenTypes::set_nodestateFlags( unsigned char _bNodeNoResponse,
00481                                          unsigned char _bEmcyBuffOverflow,
00482                                          unsigned char _bPrmFault,
00483                                          unsigned char _bGuardActive ,
00484                                          unsigned char _bDeactivated)
00485 {
00486   bNodeFlagState.bNodeNoResponse   =  _bNodeNoResponse;  
00487   bNodeFlagState.bEmcyBuffOverflow =  _bEmcyBuffOverflow;
00488   bNodeFlagState.bPrmFault         =  _bPrmFault;        
00489   bNodeFlagState.bGuardActive      =  _bGuardActive;     
00490   bNodeFlagState.bDeactivated      =  _bDeactivated;     
00491   typenumber = RL_NODESTATE;
00492 }
00493 
00495 void rlCanOpenTypes::set_nodestate(unsigned char _nodestate)
00496 {
00497   bNodeFlagState.bNodeState = _nodestate;
00498   typenumber = RL_NODESTATE;
00499 }  
00500 
00503 void rlCanOpenTypes::set_nodeerror(unsigned char _nodeerror)
00504 {
00505   bNodeFlagState.bActualError = _nodeerror;
00506 }
00507 
00510 bool rlCanOpenTypes::get_nodestateFlags( bool &_bNodeNoResponse, 
00511                                          bool &_bEmcyBuffOverflow, 
00512                                          bool &_bPrmFault, 
00513                                          bool &_bGuardActive, 
00514                                          bool &_bDeactivated)
00515 {
00516   if (typenumber == RL_NODESTATE){
00517     _bNodeNoResponse    = bNodeFlagState.bNodeNoResponse;
00518     _bEmcyBuffOverflow  = bNodeFlagState.bEmcyBuffOverflow;
00519     _bPrmFault          = bNodeFlagState.bPrmFault;
00520     _bGuardActive       = bNodeFlagState.bGuardActive;
00521     _bDeactivated       = bNodeFlagState.bDeactivated;
00522     return true;
00523   }
00524   else
00525   {
00526     invalidTypeError(RL_NODESTATE);    
00527     return false;
00528   }
00529 }                     
00530 
00532 unsigned char rlCanOpenTypes::get_nodestate()
00533 {
00534   if (typenumber != RL_NODESTATE) invalidTypeError(RL_NODESTATE); 
00535   return bNodeFlagState.bNodeState;     
00536 }
00537 
00539 unsigned char rlCanOpenTypes::get_nodeerror()
00540 {
00541     if (typenumber != RL_NODESTATE) invalidTypeError(RL_NODESTATE); 
00542   return bNodeFlagState.bActualError;
00543 }
00544 
00546 bool rlCanOpenTypes::get_nodestateFlag_NoResponse()
00547 {
00548   if (typenumber != RL_NODESTATE) invalidTypeError(RL_NODESTATE); 
00549   return bNodeFlagState.bNodeNoResponse;
00550 }
00551 bool rlCanOpenTypes::get_nodestateFlag_EmcyBuffOverflow()
00552 {
00553   if (typenumber != RL_NODESTATE) invalidTypeError(RL_NODESTATE); 
00554   return bNodeFlagState.bEmcyBuffOverflow;
00555 }
00556 bool rlCanOpenTypes::get_nodestateFlag_PrmFault()
00557 {
00558   if (typenumber != RL_NODESTATE) invalidTypeError(RL_NODESTATE); 
00559   return bNodeFlagState.bPrmFault;
00560 }
00561 bool rlCanOpenTypes::get_nodestateFlag_GuardActive()
00562 {
00563   if (typenumber != RL_NODESTATE) invalidTypeError(RL_NODESTATE); 
00564   return bNodeFlagState.bGuardActive;
00565 }
00566 bool rlCanOpenTypes::get_nodestateFlag_Deactivated()
00567 {
00568   if (typenumber != RL_NODESTATE) invalidTypeError(RL_NODESTATE); 
00569   return bNodeFlagState.bDeactivated;
00570 }
00571 
00572 
00573 bool rlCanOpenTypes::translate_CanOpenType(int _canopentype)
00574 {
00575   switch (_canopentype){
00576     case rlCanOpenTypes::INTEGER24_t :
00577       if (t_int<0) {
00578         t_int = t_int * -1;
00579         t_databytes[3] = 00;
00580         t_int = t_int * -1;
00581       }
00582       else{
00583         t_databytes[3] = 00;
00584       } 
00585     break;
00586     
00587     case rlCanOpenTypes::INTEGER40_t :
00588       if (t_longlong<0) {
00589         t_longlong = t_longlong * -1;
00590         t_databytes[5] = 00;
00591         t_databytes[6] = 00;
00592         t_databytes[7] = 00;
00593         t_longlong = t_longlong * -1;
00594       }
00595       else{
00596         t_databytes[5] = 00;
00597         t_databytes[6] = 00;
00598         t_databytes[7] = 00;
00599       } 
00600     break;
00601       
00602     case rlCanOpenTypes::INTEGER48_t :return true;  
00603       if (t_longlong<0) {
00604         t_longlong = t_longlong * -1;
00605         t_databytes[6] = 00;
00606         t_databytes[7] = 00;
00607         t_longlong = t_longlong * -1;
00608       }
00609       else{
00610         t_databytes[6] = 00;
00611         t_databytes[7] = 00;
00612       } 
00613     break;
00614 
00615 
00616     case rlCanOpenTypes::INTEGER56_t :return true;  
00617       if (t_longlong<0) {
00618         t_longlong = t_longlong * -1;
00619         t_databytes[7] = 00;
00620         t_longlong = t_longlong * -1;
00621       }
00622       else{
00623         t_databytes[7] = 00;
00624       } 
00625     break;
00626 
00627     case rlCanOpenTypes::UNSIGNED24_t:
00628       t_databytes[3] = 00;
00629     break;
00630     case rlCanOpenTypes::UNSIGNED40_t:
00631       t_databytes[5] = 00;
00632       t_databytes[6] = 00;      
00633       t_databytes[7] = 00;      
00634     break;    
00635     case rlCanOpenTypes::UNSIGNED48_t:
00636       t_databytes[6] = 00;      
00637       t_databytes[7] = 00;      
00638     break;        
00639     case rlCanOpenTypes::UNSIGNED56_t:
00640       t_databytes[7] = 00;      
00641     break;        
00642     default                          :return false;
00643   };
00644   
00645   return false;
00646 }
00647                           
00648 int  rlCanOpenTypes::get_CanOpenTypeLength(int _canopentype)
00649 {
00650   switch (_canopentype){
00651     case rlCanOpenTypes::INTEGER24_t :return 3;  
00652     case rlCanOpenTypes::INTEGER40_t :return 5;  
00653     case rlCanOpenTypes::INTEGER48_t :return 6;  
00654     case rlCanOpenTypes::INTEGER56_t :return 7;  
00655     case rlCanOpenTypes::UNSIGNED24_t:return 3;  
00656     case rlCanOpenTypes::UNSIGNED40_t:return 5;  
00657     case rlCanOpenTypes::UNSIGNED48_t:return 6; 
00658     case rlCanOpenTypes::UNSIGNED56_t:return 7;   
00659     default                          :return false;
00660   }; 
00661 }   
00662 #endif
00663