|
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 #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
1.7.5.1