00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 #include <math.h>
00059 #include <unistd.h>
00060 
00061 
00062 #include <cob_generic_can/CanESD.h>
00063 #include <cob_generic_can/CanPeakSys.h>
00064 #include <cob_generic_can/CanPeakSysUSB.h>
00065 #include <cob_base_drive_chain/CanCtrlPltfCOb3.h>
00066 
00067 #include <unistd.h>
00068 
00069 
00070 
00071 CanCtrlPltfCOb3::CanCtrlPltfCOb3(std::string iniDirectory)
00072 {       
00073         sIniDirectory = iniDirectory;
00074         IniFile iniFile;
00075         iniFile.SetFileName(sIniDirectory + "Platform.ini", "PltfHardwareCoB3.h");
00076 
00077         
00078         iniFile.GetKeyInt("Config", "NumberOfMotors", &m_iNumMotors, true);
00079         iniFile.GetKeyInt("Config", "NumberOfWheels", &m_iNumDrives, true);
00080 
00081         if(m_iNumMotors < 2 || m_iNumMotors > 8) {
00082                 m_iNumMotors = 8;
00083                 m_iNumDrives = 4;
00084         }
00085 
00086         
00087         m_pCanCtrl = NULL;
00088 
00089         
00090         m_vpMotor.resize(m_iNumMotors);
00091 
00092         for(int i=0; i<m_iNumMotors; i++)
00093         {
00094                 m_vpMotor[i] = NULL;
00095         }
00096 
00097         m_viMotorID.resize(m_iNumMotors);
00098 
00099 
00100         if(m_iNumMotors >= 1)
00101                 m_viMotorID[0] = CANNODE_WHEEL1DRIVEMOTOR;
00102         if(m_iNumMotors >= 2)
00103                 m_viMotorID[1] = CANNODE_WHEEL1STEERMOTOR;
00104         if(m_iNumMotors >= 3)
00105                 m_viMotorID[2] = CANNODE_WHEEL2DRIVEMOTOR;
00106         if(m_iNumMotors >= 4)
00107                 m_viMotorID[3] = CANNODE_WHEEL2STEERMOTOR;
00108         if(m_iNumMotors >= 5)
00109                 m_viMotorID[4] = CANNODE_WHEEL3DRIVEMOTOR;
00110         if(m_iNumMotors >= 6)
00111                 m_viMotorID[5] = CANNODE_WHEEL3STEERMOTOR;
00112         if(m_iNumMotors >= 7)
00113                 m_viMotorID[6] = CANNODE_WHEEL4DRIVEMOTOR;
00114         if(m_iNumMotors == 8)
00115                 m_viMotorID[7] = CANNODE_WHEEL4STEERMOTOR;
00116 
00117         
00118         m_Param.dCanTimeout = 7;
00119 
00120         if(m_iNumMotors >= 1)
00121                 m_Param.iHasWheel1DriveMotor = 0;
00122         if(m_iNumMotors >= 2)
00123                 m_Param.iHasWheel1SteerMotor = 0;
00124         if(m_iNumMotors >= 3)
00125                 m_Param.iHasWheel2DriveMotor = 0;
00126         if(m_iNumMotors >= 4)
00127                 m_Param.iHasWheel2SteerMotor = 0;
00128         if(m_iNumMotors >= 5)
00129                 m_Param.iHasWheel3DriveMotor = 0;
00130         if(m_iNumMotors >= 6)
00131                 m_Param.iHasWheel3SteerMotor = 0;
00132         if(m_iNumMotors >= 7)
00133                 m_Param.iHasWheel4DriveMotor = 0;
00134         if(m_iNumMotors == 8)
00135                 m_Param.iHasWheel4SteerMotor = 0;
00136 
00137         m_Param.iHasRelayBoard = 0;
00138         m_Param.iHasIOBoard = 0;
00139         m_Param.iHasUSBoard = 0;
00140         m_Param.iHasGyroBoard = 0;
00141         m_Param.iHasRadarBoard = 0;     
00142 
00143         m_bWatchdogErr = false;
00144         
00145         
00146         
00147         
00148         
00149         
00150         if(m_iNumMotors >= 1)
00151         {
00152                 m_CanOpenIDParam.TxPDO1_W1Drive = 0x182;
00153                 m_CanOpenIDParam.TxPDO2_W1Drive = 0x282;
00154                 m_CanOpenIDParam.RxPDO2_W1Drive = 0x302;
00155                 m_CanOpenIDParam.TxSDO_W1Drive = 0x582;
00156                 m_CanOpenIDParam.RxSDO_W1Drive = 0x602;
00157         }
00158         
00159         if(m_iNumMotors >= 2)
00160         {
00161                 m_CanOpenIDParam.TxPDO1_W1Steer = 0x181;
00162                 m_CanOpenIDParam.TxPDO2_W1Steer = 0x281;
00163                 m_CanOpenIDParam.RxPDO2_W1Steer = 0x301;
00164                 m_CanOpenIDParam.TxSDO_W1Steer = 0x581;
00165                 m_CanOpenIDParam.RxSDO_W1Steer = 0x601;
00166         }
00167         
00168         
00169         if(m_iNumMotors >= 3)
00170         {
00171                 m_CanOpenIDParam.TxPDO1_W2Drive = 0x184;
00172                 m_CanOpenIDParam.TxPDO2_W2Drive = 0x284;
00173                 m_CanOpenIDParam.RxPDO2_W2Drive = 0x304;
00174                 m_CanOpenIDParam.TxSDO_W2Drive = 0x584;
00175                 m_CanOpenIDParam.RxSDO_W2Drive = 0x604;
00176         }
00177         
00178         if(m_iNumMotors >= 4)
00179         {
00180                 m_CanOpenIDParam.TxPDO1_W2Steer = 0x183;
00181                 m_CanOpenIDParam.TxPDO2_W2Steer = 0x283;
00182                 m_CanOpenIDParam.RxPDO2_W2Steer = 0x303;
00183                 m_CanOpenIDParam.TxSDO_W2Steer = 0x583;
00184                 m_CanOpenIDParam.RxSDO_W2Steer = 0x603;
00185         }
00186         
00187         
00188         if(m_iNumMotors >= 5)
00189         {
00190                 m_CanOpenIDParam.TxPDO1_W3Drive = 0x188;
00191                 m_CanOpenIDParam.TxPDO2_W3Drive = 0x288;
00192                 m_CanOpenIDParam.RxPDO2_W3Drive = 0x308;
00193                 m_CanOpenIDParam.TxSDO_W3Drive = 0x588;
00194                 m_CanOpenIDParam.RxSDO_W3Drive = 0x608;
00195         }
00196         
00197         if(m_iNumMotors >= 6)
00198         {
00199                 m_CanOpenIDParam.TxPDO1_W3Steer = 0x187;
00200                 m_CanOpenIDParam.TxPDO2_W3Steer = 0x287;
00201                 m_CanOpenIDParam.RxPDO2_W3Steer = 0x307;
00202                 m_CanOpenIDParam.TxSDO_W3Steer = 0x587;
00203                 m_CanOpenIDParam.RxSDO_W3Steer = 0x607;
00204         }
00205         
00206         
00207         if(m_iNumMotors >= 7)
00208         {
00209                 m_CanOpenIDParam.TxPDO1_W4Drive = 0x186;
00210                 m_CanOpenIDParam.TxPDO2_W4Drive = 0x286;
00211                 m_CanOpenIDParam.RxPDO2_W4Drive = 0x306;
00212                 m_CanOpenIDParam.TxSDO_W4Drive = 0x586;
00213                 m_CanOpenIDParam.RxSDO_W4Drive = 0x606;
00214         }
00215         
00216         if(m_iNumMotors == 8)
00217         {
00218                 m_CanOpenIDParam.TxPDO1_W4Steer = 0x185;
00219                 m_CanOpenIDParam.TxPDO2_W4Steer = 0x285;
00220                 m_CanOpenIDParam.RxPDO2_W4Steer = 0x305;
00221                 m_CanOpenIDParam.TxSDO_W4Steer = 0x585;
00222                 m_CanOpenIDParam.RxSDO_W4Steer = 0x605;
00223         }
00224 }
00225 
00226 
00227 CanCtrlPltfCOb3::~CanCtrlPltfCOb3()
00228 {
00229 
00230         if (m_pCanCtrl != NULL)
00231         {
00232                 delete m_pCanCtrl;
00233         }
00234 
00235         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
00236         {
00237                 if (m_vpMotor[i] != NULL)
00238                 {
00239                         delete m_vpMotor[i];
00240                 }
00241         }
00242 
00243 }
00244 
00245 
00246 void CanCtrlPltfCOb3::readConfiguration()
00247 {
00248 
00249         int iTypeCan = 0;
00250         int iMaxMessages = 0;
00251 
00252         DriveParam DriveParamW1DriveMotor;
00253         DriveParam DriveParamW1SteerMotor;
00254         DriveParam DriveParamW2DriveMotor;
00255         DriveParam DriveParamW2SteerMotor;
00256         DriveParam DriveParamW3DriveMotor;
00257         DriveParam DriveParamW3SteerMotor;
00258         DriveParam DriveParamW4DriveMotor;
00259         DriveParam DriveParamW4SteerMotor;
00260         
00261         std::string strTypeDrive;
00262         std::string strTypeSteer;
00263 
00264         double dScaleToMM;
00265 
00266         
00267         m_IniFile.SetFileName(sIniDirectory + "Platform.ini", "CanCtrlPltfCOb3.cpp");
00268 
00269         m_IniFile.GetKeyInt("Geom", "RadiusWheel", &m_Param.iRadiusWheelMM, true);
00270         m_IniFile.GetKeyInt("Geom", "DistSteerAxisToDriveWheelCenter", &m_Param.iDistSteerAxisToDriveWheelMM, true);
00271 
00272         if(m_iNumDrives >= 1)
00273                 m_IniFile.GetKeyDouble("DrivePrms", "Wheel1SteerDriveCoupling", &m_Param.dWheel1SteerDriveCoupling, true);
00274         if(m_iNumDrives >= 2)
00275                 m_IniFile.GetKeyDouble("DrivePrms", "Wheel2SteerDriveCoupling", &m_Param.dWheel2SteerDriveCoupling, true);
00276         if(m_iNumDrives >= 3)
00277                 m_IniFile.GetKeyDouble("DrivePrms", "Wheel3SteerDriveCoupling", &m_Param.dWheel3SteerDriveCoupling, true);
00278         if(m_iNumDrives == 4)
00279                 m_IniFile.GetKeyDouble("DrivePrms", "Wheel4SteerDriveCoupling", &m_Param.dWheel4SteerDriveCoupling, true);
00280 
00281 
00282         
00283         m_IniFile.SetFileName(sIniDirectory + "CanCtrl.ini", "CanCtrlPltfCOb3.cpp");
00284 
00285         std::cout << "Can configuration of the platform:" << std::endl;
00286         
00287         
00288         m_IniFile.GetKeyInt("TypeCan", "Can", &iTypeCan, true);
00289         if (iTypeCan == 0)
00290         {
00291                 sComposed = sIniDirectory;
00292                 sComposed += "CanCtrl.ini";
00293                 m_pCanCtrl = new CanPeakSys(sComposed.c_str());
00294                 std::cout << "Uses CAN-Peak-Systems dongle" << std::endl;
00295         }
00296         else if (iTypeCan == 1)
00297         {
00298                 sComposed = sIniDirectory;
00299                 sComposed += "CanCtrl.ini";
00300                 m_pCanCtrl = new CANPeakSysUSB(sComposed.c_str());
00301                 std::cout << "Uses CAN-Peak-USB" << std::endl;
00302         }
00303         else if (iTypeCan == 2)
00304         {
00305                 sComposed = sIniDirectory;
00306                 sComposed += "CanCtrl.ini";
00307                 m_pCanCtrl = new CanESD(sComposed.c_str(), false);
00308                 std::cout << "Uses CAN-ESD-card" << std::endl;
00309         }
00310 
00311         
00312         
00313         
00314         if(m_iNumDrives >= 1)
00315         {
00316                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO1_W1Drive", &m_CanOpenIDParam.TxPDO1_W1Drive, true);
00317                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO2_W1Drive", &m_CanOpenIDParam.TxPDO2_W1Drive, true);
00318                 m_IniFile.GetKeyInt("CanOpenIDs", "RxPDO2_W1Drive", &m_CanOpenIDParam.RxPDO2_W1Drive, true);
00319                 m_IniFile.GetKeyInt("CanOpenIDs", "TxSDO_W1Drive", &m_CanOpenIDParam.TxSDO_W1Drive, true);
00320                 m_IniFile.GetKeyInt("CanOpenIDs", "RxSDO_W1Drive", &m_CanOpenIDParam.RxSDO_W1Drive, true);
00321         }
00322         
00323         if(m_iNumDrives >= 1)
00324         {
00325                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO1_W1Steer", &m_CanOpenIDParam.TxPDO1_W1Steer, true);
00326                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO2_W1Steer", &m_CanOpenIDParam.TxPDO2_W1Steer, true);
00327                 m_IniFile.GetKeyInt("CanOpenIDs", "RxPDO2_W1Steer", &m_CanOpenIDParam.RxPDO2_W1Steer, true);
00328                 m_IniFile.GetKeyInt("CanOpenIDs", "TxSDO_W1Steer", &m_CanOpenIDParam.TxSDO_W1Steer, true);
00329                 m_IniFile.GetKeyInt("CanOpenIDs", "RxSDO_W1Steer", &m_CanOpenIDParam.RxSDO_W1Steer, true);
00330         }
00331         
00332         
00333         
00334         if(m_iNumDrives >= 2)
00335         {
00336                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO1_W2Drive", &m_CanOpenIDParam.TxPDO1_W2Drive, true);
00337                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO2_W2Drive", &m_CanOpenIDParam.TxPDO2_W2Drive, true);
00338                 m_IniFile.GetKeyInt("CanOpenIDs", "RxPDO2_W2Drive", &m_CanOpenIDParam.RxPDO2_W2Drive, true);
00339                 m_IniFile.GetKeyInt("CanOpenIDs", "TxSDO_W2Drive", &m_CanOpenIDParam.TxSDO_W2Drive, true);
00340                 m_IniFile.GetKeyInt("CanOpenIDs", "RxSDO_W2Drive", &m_CanOpenIDParam.RxSDO_W2Drive, true);
00341         }
00342         
00343         if(m_iNumDrives >= 2)
00344         {
00345                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO1_W2Steer", &m_CanOpenIDParam.TxPDO1_W2Steer, true);
00346                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO2_W2Steer", &m_CanOpenIDParam.TxPDO2_W2Steer, true);
00347                 m_IniFile.GetKeyInt("CanOpenIDs", "RxPDO2_W2Steer", &m_CanOpenIDParam.RxPDO2_W2Steer, true);
00348                 m_IniFile.GetKeyInt("CanOpenIDs", "TxSDO_W2Steer", &m_CanOpenIDParam.TxSDO_W2Steer, true);
00349                 m_IniFile.GetKeyInt("CanOpenIDs", "RxSDO_W2Steer", &m_CanOpenIDParam.RxSDO_W2Steer, true);
00350         }
00351         
00352         
00353         
00354         if(m_iNumDrives >= 3)
00355         {
00356                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO1_W3Drive", &m_CanOpenIDParam.TxPDO1_W3Drive, true);
00357                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO2_W3Drive", &m_CanOpenIDParam.TxPDO2_W3Drive, true);
00358                 m_IniFile.GetKeyInt("CanOpenIDs", "RxPDO2_W3Drive", &m_CanOpenIDParam.RxPDO2_W3Drive, true);
00359                 m_IniFile.GetKeyInt("CanOpenIDs", "TxSDO_W3Drive", &m_CanOpenIDParam.TxSDO_W3Drive, true);
00360                 m_IniFile.GetKeyInt("CanOpenIDs", "RxSDO_W3Drive", &m_CanOpenIDParam.RxSDO_W3Drive, true);
00361         }
00362         
00363         if(m_iNumDrives >= 3)
00364         {
00365                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO1_W3Steer", &m_CanOpenIDParam.TxPDO1_W3Steer, true);
00366                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO2_W3Steer", &m_CanOpenIDParam.TxPDO2_W3Steer, true);
00367                 m_IniFile.GetKeyInt("CanOpenIDs", "RxPDO2_W3Steer", &m_CanOpenIDParam.RxPDO2_W3Steer, true);
00368                 m_IniFile.GetKeyInt("CanOpenIDs", "TxSDO_W3Steer", &m_CanOpenIDParam.TxSDO_W3Steer, true);
00369                 m_IniFile.GetKeyInt("CanOpenIDs", "RxSDO_W3Steer", &m_CanOpenIDParam.RxSDO_W3Steer, true);
00370         }
00371         
00372         
00373         
00374         if(m_iNumDrives >= 4)
00375         {
00376                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO1_W4Drive", &m_CanOpenIDParam.TxPDO1_W4Drive, true);
00377                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO2_W4Drive", &m_CanOpenIDParam.TxPDO2_W4Drive, true);
00378                 m_IniFile.GetKeyInt("CanOpenIDs", "RxPDO2_W4Drive", &m_CanOpenIDParam.RxPDO2_W4Drive, true);
00379                 m_IniFile.GetKeyInt("CanOpenIDs", "TxSDO_W4Drive", &m_CanOpenIDParam.TxSDO_W4Drive, true);
00380                 m_IniFile.GetKeyInt("CanOpenIDs", "RxSDO_W4Drive", &m_CanOpenIDParam.RxSDO_W4Drive, true);
00381         }
00382         
00383         if(m_iNumDrives == 4)
00384         {
00385                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO1_W4Steer", &m_CanOpenIDParam.TxPDO1_W4Steer, true);
00386                 m_IniFile.GetKeyInt("CanOpenIDs", "TxPDO2_W4Steer", &m_CanOpenIDParam.TxPDO2_W4Steer, true);
00387                 m_IniFile.GetKeyInt("CanOpenIDs", "RxPDO2_W4Steer", &m_CanOpenIDParam.RxPDO2_W4Steer, true);
00388                 m_IniFile.GetKeyInt("CanOpenIDs", "TxSDO_W4Steer", &m_CanOpenIDParam.TxSDO_W4Steer, true);
00389                 m_IniFile.GetKeyInt("CanOpenIDs", "RxSDO_W4Steer", &m_CanOpenIDParam.RxSDO_W4Steer, true);
00390         }
00391 
00392         
00393         
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401 
00402 
00403 
00404 
00405 
00406         
00407         if(m_iNumDrives >= 1)
00408         {
00409                 m_IniFile.GetKeyInt("Drive1", "EncIncrPerRevMot", &(m_GearMotDrive1.iEncIncrPerRevMot), true);
00410                 m_IniFile.GetKeyDouble("Drive1", "VelMeasFrqHz", &(m_GearMotDrive1.dVelMeasFrqHz), true);
00411                 m_IniFile.GetKeyDouble("Drive1", "BeltRatio", &(m_GearMotDrive1.dBeltRatio), true);
00412                 m_IniFile.GetKeyDouble("Drive1", "GearRatio", &(m_GearMotDrive1.dGearRatio), true);
00413                 m_IniFile.GetKeyInt("Drive1", "Sign", &(m_GearMotDrive1.iSign), true);
00414                 m_IniFile.GetKeyDouble("Drive1", "VelMaxEncIncrS", &(m_GearMotDrive1.dVelMaxEncIncrS), true);
00415                 m_IniFile.GetKeyDouble("Drive1", "AccIncrS", &(m_GearMotDrive1.dAccIncrS2), true);
00416                 m_IniFile.GetKeyDouble("Drive1", "DecIncrS", &(m_GearMotDrive1.dDecIncrS2), true);
00417                 m_IniFile.GetKeyInt("Drive1", "EncOffsetIncr",&(m_GearMotDrive1.iEncOffsetIncr),true);
00418                 m_IniFile.GetKeyBool("Drive1", "IsSteering", &(m_GearMotDrive1.bIsSteer), true);
00419                 m_IniFile.GetKeyDouble("Drive1", "CurrentToTorque", &(m_GearMotDrive1.dCurrentToTorque), false);
00420                 m_IniFile.GetKeyDouble("Drive1", "CurrMax", &(m_GearMotDrive1.dCurrMax), false);
00421                 m_IniFile.GetKeyInt("Drive1", "HomingDigIn", &(m_GearMotDrive1.iHomingDigIn), false);
00422         }
00423 
00424         
00425         if(m_iNumDrives >= 2)
00426         {
00427                 m_IniFile.GetKeyInt("Drive2", "EncIncrPerRevMot", &(m_GearMotDrive2.iEncIncrPerRevMot), true);
00428                 m_IniFile.GetKeyDouble("Drive2", "VelMeasFrqHz", &(m_GearMotDrive2.dVelMeasFrqHz), true);
00429                 m_IniFile.GetKeyDouble("Drive2", "BeltRatio", &(m_GearMotDrive2.dBeltRatio), true);
00430                 m_IniFile.GetKeyDouble("Drive2", "GearRatio", &(m_GearMotDrive2.dGearRatio), true);
00431                 m_IniFile.GetKeyInt("Drive2", "Sign", &(m_GearMotDrive2.iSign), true);
00432                 m_IniFile.GetKeyDouble("Drive2", "VelMaxEncIncrS", &(m_GearMotDrive2.dVelMaxEncIncrS), true);
00433                 m_IniFile.GetKeyDouble("Drive2", "AccIncrS", &(m_GearMotDrive2.dAccIncrS2), true);
00434                 m_IniFile.GetKeyDouble("Drive2", "DecIncrS", &(m_GearMotDrive2.dDecIncrS2), true);
00435                 m_IniFile.GetKeyInt("Drive2", "EncOffsetIncr",&(m_GearMotDrive2.iEncOffsetIncr),true);
00436                 m_IniFile.GetKeyBool("Drive2", "IsSteering", &(m_GearMotDrive2.bIsSteer), true);
00437                 m_IniFile.GetKeyDouble("Drive2", "CurrentToTorque", &(m_GearMotDrive2.dCurrentToTorque), false);
00438                 m_IniFile.GetKeyDouble("Drive2", "CurrMax", &(m_GearMotDrive2.dCurrMax), false);
00439                 m_IniFile.GetKeyInt("Drive2", "HomingDigIn", &(m_GearMotDrive2.iHomingDigIn), false);
00440         }
00441 
00442         
00443         if(m_iNumDrives >= 3)
00444         {
00445                 m_IniFile.GetKeyInt("Drive3", "EncIncrPerRevMot", &(m_GearMotDrive3.iEncIncrPerRevMot), true);
00446                 m_IniFile.GetKeyDouble("Drive3", "VelMeasFrqHz", &(m_GearMotDrive3.dVelMeasFrqHz), true);
00447                 m_IniFile.GetKeyDouble("Drive3", "BeltRatio", &(m_GearMotDrive3.dBeltRatio), true);
00448                 m_IniFile.GetKeyDouble("Drive3", "GearRatio", &(m_GearMotDrive3.dGearRatio), true);
00449                 m_IniFile.GetKeyInt("Drive3", "Sign", &(m_GearMotDrive3.iSign), true);
00450                 m_IniFile.GetKeyDouble("Drive3", "VelMaxEncIncrS", &(m_GearMotDrive3.dVelMaxEncIncrS), true);
00451                 m_IniFile.GetKeyDouble("Drive3", "AccIncrS", &(m_GearMotDrive3.dAccIncrS2), true);
00452                 m_IniFile.GetKeyDouble("Drive3", "DecIncrS", &(m_GearMotDrive3.dDecIncrS2), true);
00453                 m_IniFile.GetKeyInt("Drive3", "EncOffsetIncr",&(m_GearMotDrive3.iEncOffsetIncr),true);
00454                 m_IniFile.GetKeyBool("Drive3", "IsSteering", &(m_GearMotDrive3.bIsSteer), true);
00455                 m_IniFile.GetKeyDouble("Drive3", "CurrentToTorque", &(m_GearMotDrive3.dCurrentToTorque), false);
00456                 m_IniFile.GetKeyDouble("Drive3", "CurrMax", &(m_GearMotDrive3.dCurrMax), false);
00457                 m_IniFile.GetKeyInt("Drive3", "HomingDigIn", &(m_GearMotDrive3.iHomingDigIn), false);
00458         }
00459 
00460         
00461         if(m_iNumDrives == 4)
00462         {
00463                 m_IniFile.GetKeyInt("Drive4", "EncIncrPerRevMot", &(m_GearMotDrive4.iEncIncrPerRevMot), true);
00464                 m_IniFile.GetKeyDouble("Drive4", "VelMeasFrqHz", &(m_GearMotDrive4.dVelMeasFrqHz), true);
00465                 m_IniFile.GetKeyDouble("Drive4", "BeltRatio", &(m_GearMotDrive4.dBeltRatio), true);
00466                 m_IniFile.GetKeyDouble("Drive4", "GearRatio", &(m_GearMotDrive4.dGearRatio), true);
00467                 m_IniFile.GetKeyInt("Drive4", "Sign", &(m_GearMotDrive4.iSign), true);
00468                 m_IniFile.GetKeyDouble("Drive4", "VelMaxEncIncrS", &(m_GearMotDrive4.dVelMaxEncIncrS), true);
00469                 m_IniFile.GetKeyDouble("Drive4", "AccIncrS", &(m_GearMotDrive4.dAccIncrS2), true);
00470                 m_IniFile.GetKeyDouble("Drive4", "DecIncrS", &(m_GearMotDrive4.dDecIncrS2), true);
00471                 m_IniFile.GetKeyInt("Drive4", "EncOffsetIncr",&(m_GearMotDrive4.iEncOffsetIncr),true);
00472                 m_IniFile.GetKeyBool("Drive4", "IsSteering", &(m_GearMotDrive4.bIsSteer), true);
00473                 m_IniFile.GetKeyDouble("Drive4", "CurrentToTorque", &(m_GearMotDrive4.dCurrentToTorque), false);
00474                 m_IniFile.GetKeyDouble("Drive4", "CurrMax", &(m_GearMotDrive4.dCurrMax), false);
00475                 m_IniFile.GetKeyInt("Drive4", "HomingDigIn", &(m_GearMotDrive4.iHomingDigIn), false);
00476         }
00477 
00478         
00479         if(m_iNumDrives >= 1)
00480         {
00481                 m_IniFile.GetKeyInt("Steer1", "EncIncrPerRevMot", &(m_GearMotSteer1.iEncIncrPerRevMot), true);
00482                 m_IniFile.GetKeyDouble("Steer1", "VelMeasFrqHz", &(m_GearMotSteer1.dVelMeasFrqHz), true);
00483                 m_IniFile.GetKeyDouble("Steer1", "BeltRatio", &(m_GearMotSteer1.dBeltRatio), true);
00484                 m_IniFile.GetKeyDouble("Steer1", "GearRatio", &(m_GearMotSteer1.dGearRatio), true);
00485                 m_IniFile.GetKeyInt("Steer1", "Sign", &(m_GearMotSteer1.iSign), true);
00486                 m_IniFile.GetKeyDouble("Steer1", "VelMaxEncIncrS", &(m_GearMotSteer1.dVelMaxEncIncrS), true);
00487                 m_IniFile.GetKeyDouble("Steer1", "AccIncrS", &(m_GearMotSteer1.dAccIncrS2), true);
00488                 m_IniFile.GetKeyDouble("Steer1", "DecIncrS", &(m_GearMotSteer1.dDecIncrS2), true);
00489                 m_IniFile.GetKeyInt("Steer1", "EncOffsetIncr",&(m_GearMotSteer1.iEncOffsetIncr),true);
00490                 m_IniFile.GetKeyBool("Steer1", "IsSteering", &(m_GearMotSteer1.bIsSteer), true);
00491                 m_IniFile.GetKeyDouble("Steer1", "CurrentToTorque", &(m_GearMotSteer1.dCurrentToTorque), false);
00492                 m_IniFile.GetKeyDouble("Steer1", "CurrMax", &(m_GearMotSteer1.dCurrMax), false);
00493                 m_IniFile.GetKeyInt("Steer1", "HomingDigIn", &(m_GearMotSteer1.iHomingDigIn), false);
00494         }
00495 
00496         
00497         if(m_iNumDrives >= 2)
00498         {
00499                 m_IniFile.GetKeyInt("Steer2", "EncIncrPerRevMot", &(m_GearMotSteer2.iEncIncrPerRevMot), true);
00500                 m_IniFile.GetKeyDouble("Steer2", "VelMeasFrqHz", &(m_GearMotSteer2.dVelMeasFrqHz), true);
00501                 m_IniFile.GetKeyDouble("Steer2", "BeltRatio", &(m_GearMotSteer2.dBeltRatio), true);
00502                 m_IniFile.GetKeyDouble("Steer2", "GearRatio", &(m_GearMotSteer2.dGearRatio), true);
00503                 m_IniFile.GetKeyInt("Steer2", "Sign", &(m_GearMotSteer2.iSign), true);
00504                 m_IniFile.GetKeyDouble("Steer2", "VelMaxEncIncrS", &(m_GearMotSteer2.dVelMaxEncIncrS), true);
00505                 m_IniFile.GetKeyDouble("Steer2", "AccIncrS", &(m_GearMotSteer2.dAccIncrS2), true);
00506                 m_IniFile.GetKeyDouble("Steer2", "DecIncrS", &(m_GearMotSteer2.dDecIncrS2), true);
00507                 m_IniFile.GetKeyInt("Steer2", "EncOffsetIncr",&(m_GearMotSteer2.iEncOffsetIncr),true);
00508                 m_IniFile.GetKeyBool("Steer2", "IsSteering", &(m_GearMotSteer2.bIsSteer), true);
00509                 m_IniFile.GetKeyDouble("Steer2", "CurrentToTorque", &(m_GearMotSteer2.dCurrentToTorque), false);
00510                 m_IniFile.GetKeyDouble("Steer2", "CurrMax", &(m_GearMotSteer2.dCurrMax), false);
00511                 m_IniFile.GetKeyInt("Steer2", "HomingDigIn", &(m_GearMotSteer2.iHomingDigIn), false);
00512         }
00513 
00514         
00515         if(m_iNumDrives >= 3)
00516         {
00517                 m_IniFile.GetKeyInt("Steer3", "EncIncrPerRevMot", &(m_GearMotSteer3.iEncIncrPerRevMot), true);
00518                 m_IniFile.GetKeyDouble("Steer3", "VelMeasFrqHz", &(m_GearMotSteer3.dVelMeasFrqHz), true);
00519                 m_IniFile.GetKeyDouble("Steer3", "BeltRatio", &(m_GearMotSteer3.dBeltRatio), true);
00520                 m_IniFile.GetKeyDouble("Steer3", "GearRatio", &(m_GearMotSteer3.dGearRatio), true);
00521                 m_IniFile.GetKeyInt("Steer3", "Sign", &(m_GearMotSteer3.iSign), true);
00522                 m_IniFile.GetKeyDouble("Steer3", "VelMaxEncIncrS", &(m_GearMotSteer3.dVelMaxEncIncrS), true);
00523                 m_IniFile.GetKeyDouble("Steer3", "AccIncrS", &(m_GearMotSteer3.dAccIncrS2), true);
00524                 m_IniFile.GetKeyDouble("Steer3", "DecIncrS", &(m_GearMotSteer3.dDecIncrS2), true);
00525                 m_IniFile.GetKeyInt("Steer3", "EncOffsetIncr",&(m_GearMotSteer3.iEncOffsetIncr),true);
00526                 m_IniFile.GetKeyBool("Steer3", "IsSteering", &(m_GearMotSteer3.bIsSteer), true);
00527                 m_IniFile.GetKeyDouble("Steer3", "CurrentToTorque", &(m_GearMotSteer3.dCurrentToTorque), false);
00528                 m_IniFile.GetKeyDouble("Steer3", "CurrMax", &(m_GearMotSteer3.dCurrMax), false);
00529                 m_IniFile.GetKeyInt("Steer3", "HomingDigIn", &(m_GearMotSteer3.iHomingDigIn), false);
00530         }
00531 
00532         
00533         if(m_iNumDrives == 4)
00534         {
00535                 m_IniFile.GetKeyInt("Steer4", "EncIncrPerRevMot", &(m_GearMotSteer4.iEncIncrPerRevMot), true);
00536                 m_IniFile.GetKeyDouble("Steer4", "VelMeasFrqHz", &(m_GearMotSteer4.dVelMeasFrqHz), true);
00537                 m_IniFile.GetKeyDouble("Steer4", "BeltRatio", &(m_GearMotSteer4.dBeltRatio), true);
00538                 m_IniFile.GetKeyDouble("Steer4", "GearRatio", &(m_GearMotSteer4.dGearRatio), true);
00539                 m_IniFile.GetKeyInt("Steer4", "Sign", &(m_GearMotSteer4.iSign), true);
00540                 m_IniFile.GetKeyDouble("Steer4", "VelMaxEncIncrS", &(m_GearMotSteer4.dVelMaxEncIncrS), true);
00541                 m_IniFile.GetKeyDouble("Steer4", "AccIncrS", &(m_GearMotSteer4.dAccIncrS2), true);
00542                 m_IniFile.GetKeyDouble("Steer4", "DecIncrS", &(m_GearMotSteer4.dDecIncrS2), true);
00543                 m_IniFile.GetKeyInt("Steer4", "EncOffsetIncr",&(m_GearMotSteer4.iEncOffsetIncr),true);
00544                 m_IniFile.GetKeyBool("Steer4", "IsSteering", &(m_GearMotSteer4.bIsSteer), true);
00545                 m_IniFile.GetKeyDouble("Steer4", "CurrentToTorque", &(m_GearMotSteer4.dCurrentToTorque), false);
00546                 m_IniFile.GetKeyDouble("Steer4", "CurrMax", &(m_GearMotSteer4.dCurrMax), false);
00547                 m_IniFile.GetKeyInt("Steer4", "HomingDigIn", &(m_GearMotSteer4.iHomingDigIn), false);
00548         }
00549 
00550         if(m_iNumDrives >= 1)
00551         {
00552                 DriveParamW1DriveMotor.setParam(
00553                         0,
00554                         m_GearMotDrive1.iEncIncrPerRevMot,
00555                         m_GearMotDrive1.dVelMeasFrqHz,
00556                         m_GearMotDrive1.dBeltRatio,
00557                         m_GearMotDrive1.dGearRatio,
00558                         m_GearMotDrive1.iSign,
00559                         m_GearMotDrive1.dVelMaxEncIncrS,
00560                         m_GearMotDrive1.dAccIncrS2,
00561                         m_GearMotDrive1.dDecIncrS2,
00562                         m_GearMotDrive1.iEncOffsetIncr,
00563                         m_GearMotDrive1.bIsSteer,
00564                         m_GearMotDrive1.dCurrentToTorque,
00565                         m_GearMotDrive1.dCurrMax,
00566                         m_GearMotDrive1.iHomingDigIn);
00567         }
00568         
00569         if(m_iNumDrives >= 1)
00570         {
00571                 DriveParamW1SteerMotor.setParam(
00572                         1,
00573                         m_GearMotSteer1.iEncIncrPerRevMot,
00574                         m_GearMotSteer1.dVelMeasFrqHz,
00575                         m_GearMotSteer1.dBeltRatio,
00576                         m_GearMotSteer1.dGearRatio,
00577                         m_GearMotSteer1.iSign,
00578                         m_GearMotSteer1.dVelMaxEncIncrS,
00579                         m_GearMotSteer1.dAccIncrS2,
00580                         m_GearMotSteer1.dDecIncrS2,
00581                         m_GearMotSteer1.iEncOffsetIncr,
00582                         m_GearMotSteer1.bIsSteer,
00583                         m_GearMotSteer1.dCurrentToTorque,
00584                         m_GearMotSteer1.dCurrMax,
00585                         m_GearMotSteer1.iHomingDigIn);
00586         }
00587 
00588         if(m_iNumDrives >= 2)
00589         {
00590                 DriveParamW2DriveMotor.setParam(
00591                         2,
00592                         m_GearMotDrive2.iEncIncrPerRevMot,
00593                         m_GearMotDrive2.dVelMeasFrqHz,
00594                         m_GearMotDrive2.dBeltRatio,
00595                         m_GearMotDrive2.dGearRatio,
00596                         m_GearMotDrive2.iSign,
00597                         m_GearMotDrive2.dVelMaxEncIncrS,
00598                         m_GearMotDrive2.dAccIncrS2,
00599                         m_GearMotDrive2.dDecIncrS2,
00600                         m_GearMotDrive2.iEncOffsetIncr,
00601                         m_GearMotDrive2.bIsSteer,
00602                         m_GearMotDrive2.dCurrentToTorque,
00603                         m_GearMotDrive2.dCurrMax,
00604                         m_GearMotDrive2.iHomingDigIn);
00605         }
00606         
00607         if(m_iNumDrives >= 2)
00608         {
00609                 DriveParamW2SteerMotor.setParam(
00610                         3,
00611                         m_GearMotSteer2.iEncIncrPerRevMot,
00612                         m_GearMotSteer2.dVelMeasFrqHz,
00613                         m_GearMotSteer2.dBeltRatio,
00614                         m_GearMotSteer2.dGearRatio,
00615                         m_GearMotSteer2.iSign,
00616                         m_GearMotSteer2.dVelMaxEncIncrS,
00617                         m_GearMotSteer2.dAccIncrS2,
00618                         m_GearMotSteer2.dDecIncrS2,
00619                         m_GearMotSteer2.iEncOffsetIncr,
00620                         m_GearMotSteer2.bIsSteer,
00621                         m_GearMotSteer2.dCurrentToTorque,
00622                         m_GearMotSteer2.dCurrMax,
00623                         m_GearMotSteer2.iHomingDigIn);
00624         }
00625 
00626         if(m_iNumDrives >= 3)
00627         {
00628                 DriveParamW3DriveMotor.setParam(
00629                         4,
00630                         m_GearMotDrive3.iEncIncrPerRevMot,
00631                         m_GearMotDrive3.dVelMeasFrqHz,
00632                         m_GearMotDrive3.dBeltRatio,
00633                         m_GearMotDrive3.dGearRatio,
00634                         m_GearMotDrive3.iSign,
00635                         m_GearMotDrive3.dVelMaxEncIncrS,
00636                         m_GearMotDrive3.dAccIncrS2,
00637                         m_GearMotDrive3.dDecIncrS2,
00638                         m_GearMotDrive3.iEncOffsetIncr,
00639                         m_GearMotDrive3.bIsSteer,
00640                         m_GearMotDrive3.dCurrentToTorque,
00641                         m_GearMotDrive3.dCurrMax,
00642                         m_GearMotDrive3.iHomingDigIn);
00643         }
00644         
00645         if(m_iNumDrives >= 3)
00646         {
00647                 DriveParamW3SteerMotor.setParam(
00648                         5,
00649                         m_GearMotSteer3.iEncIncrPerRevMot,
00650                         m_GearMotSteer3.dVelMeasFrqHz,
00651                         m_GearMotSteer3.dBeltRatio,
00652                         m_GearMotSteer3.dGearRatio,
00653                         m_GearMotSteer3.iSign,
00654                         m_GearMotSteer3.dVelMaxEncIncrS,
00655                         m_GearMotSteer3.dAccIncrS2,
00656                         m_GearMotSteer3.dDecIncrS2,
00657                         m_GearMotSteer3.iEncOffsetIncr,
00658                         m_GearMotSteer3.bIsSteer,
00659                         m_GearMotSteer3.dCurrentToTorque,
00660                         m_GearMotSteer3.dCurrMax,
00661                         m_GearMotSteer3.iHomingDigIn);
00662         }
00663 
00664         if(m_iNumDrives == 4)
00665         {
00666                 DriveParamW4DriveMotor.setParam(
00667                         6,
00668                         m_GearMotDrive4.iEncIncrPerRevMot,
00669                         m_GearMotDrive4.dVelMeasFrqHz,
00670                         m_GearMotDrive4.dBeltRatio,
00671                         m_GearMotDrive4.dGearRatio,
00672                         m_GearMotDrive4.iSign,
00673                         m_GearMotDrive4.dVelMaxEncIncrS,
00674                         m_GearMotDrive4.dAccIncrS2,
00675                         m_GearMotDrive4.dDecIncrS2,
00676                         m_GearMotDrive4.iEncOffsetIncr,
00677                         m_GearMotDrive4.bIsSteer,
00678                         m_GearMotDrive4.dCurrentToTorque,
00679                         m_GearMotDrive4.dCurrMax,
00680                         m_GearMotDrive4.iHomingDigIn);
00681         }
00682         
00683         if(m_iNumDrives == 4)
00684         {
00685                 DriveParamW4SteerMotor.setParam(
00686                         7,
00687                         m_GearMotSteer4.iEncIncrPerRevMot,
00688                         m_GearMotSteer4.dVelMeasFrqHz,
00689                         m_GearMotSteer4.dBeltRatio,
00690                         m_GearMotSteer4.dGearRatio,
00691                         m_GearMotSteer4.iSign,
00692                         m_GearMotSteer4.dVelMaxEncIncrS,
00693                         m_GearMotSteer4.dAccIncrS2,
00694                         m_GearMotSteer4.dDecIncrS2,
00695                         m_GearMotSteer4.iEncOffsetIncr,
00696                         m_GearMotSteer4.bIsSteer,
00697                         m_GearMotSteer4.dCurrentToTorque,
00698                         m_GearMotSteer4.dCurrMax,
00699                         m_GearMotSteer4.iHomingDigIn);
00700         }
00701         
00702         m_IniFile.GetKeyDouble("US", "ScaleToMM", &dScaleToMM, true);
00703 
00704 
00705         
00706         m_IniFile.SetFileName(sIniDirectory + "Platform.ini", "CanCtrlPltfCOb3.cpp");
00707 
00708 
00709         
00710         
00711         if(m_iNumDrives >= 1)
00712         {
00713                 m_IniFile.GetKeyInt("Config", "Wheel1DriveMotor", &m_Param.iHasWheel1DriveMotor, true);
00714                 if (m_Param.iHasWheel1DriveMotor == 0)
00715                 {
00716                         
00717                         std::cout << "node Wheel1DriveMotor available = 0" << std::endl;
00718                 }
00719                 else
00720                 {
00721                         
00722                         std::cout << "Wheel1DriveMotor available = type version 2" << std::endl;
00723                         m_vpMotor[0] = new CanDriveHarmonica();
00724                         ((CanDriveHarmonica*) m_vpMotor[0])->setCanOpenParam(
00725                                 m_CanOpenIDParam.TxPDO1_W1Drive, m_CanOpenIDParam.TxPDO2_W1Drive, m_CanOpenIDParam.RxPDO2_W1Drive,
00726                                 m_CanOpenIDParam.TxSDO_W1Drive, m_CanOpenIDParam.RxSDO_W1Drive);
00727                         m_vpMotor[0]->setCanItf(m_pCanCtrl);
00728                         m_vpMotor[0]->setDriveParam(DriveParamW1DriveMotor);
00729                 }
00730         }
00731 
00732         
00733         if(m_iNumDrives >= 1)
00734         {
00735                 m_IniFile.GetKeyInt("Config", "Wheel1SteerMotor", &m_Param.iHasWheel1SteerMotor, true);
00736                 if (m_Param.iHasWheel1SteerMotor == 0)
00737                 {
00738                         
00739                         std::cout << "node Wheel1SteerMotor available = 0" << std::endl;
00740                 }
00741                 else
00742                 {
00743                         
00744                         std::cout << "Wheel1SteerMotor available = type version 2" << std::endl;
00745                         m_vpMotor[1] = new CanDriveHarmonica();
00746                         ((CanDriveHarmonica*) m_vpMotor[1])->setCanOpenParam(
00747                                 m_CanOpenIDParam.TxPDO1_W1Steer, m_CanOpenIDParam.TxPDO2_W1Steer, m_CanOpenIDParam.RxPDO2_W1Steer,
00748                                 m_CanOpenIDParam.TxSDO_W1Steer, m_CanOpenIDParam.RxSDO_W1Steer);
00749                         m_vpMotor[1]->setCanItf(m_pCanCtrl);
00750                         m_vpMotor[1]->setDriveParam(DriveParamW1SteerMotor);
00751 
00752                 }
00753         }
00754         
00755         
00756         
00757         if(m_iNumDrives >= 2)
00758         {
00759                 m_IniFile.GetKeyInt("Config", "Wheel2DriveMotor", &m_Param.iHasWheel2DriveMotor, true);
00760                 if (m_Param.iHasWheel2DriveMotor == 0)
00761                 {
00762                         
00763                         std::cout << "node Wheel2DriveMotor available = 0" << std::endl;
00764                 }
00765                 else
00766                 {
00767                         
00768                         std::cout << "Wheel2DriveMotor available = type version 2" << std::endl;
00769                         m_vpMotor[2] = new CanDriveHarmonica();
00770                         ((CanDriveHarmonica*) m_vpMotor[2])->setCanOpenParam(
00771                                 m_CanOpenIDParam.TxPDO1_W2Drive, m_CanOpenIDParam.TxPDO2_W2Drive, m_CanOpenIDParam.RxPDO2_W2Drive,
00772                                 m_CanOpenIDParam.TxSDO_W2Drive, m_CanOpenIDParam.RxSDO_W2Drive);
00773                         m_vpMotor[2]->setCanItf(m_pCanCtrl);
00774                         m_vpMotor[2]->setDriveParam(DriveParamW2DriveMotor);
00775                 }
00776         }
00777 
00778         
00779         if(m_iNumDrives >= 2)
00780         {
00781                 m_IniFile.GetKeyInt("Config", "Wheel2SteerMotor", &m_Param.iHasWheel2SteerMotor, true);
00782                 if (m_Param.iHasWheel2SteerMotor == 0)
00783                 {
00784                         
00785                         std::cout << "node Wheel2SteerMotor available = 0" << std::endl;
00786                 }
00787                 else
00788                 {
00789                         
00790                         std::cout << "Wheel2SteerMotor available = type version 2" << std::endl;
00791                         m_vpMotor[3] = new CanDriveHarmonica();
00792                         ((CanDriveHarmonica*) m_vpMotor[3])->setCanOpenParam(
00793                                 m_CanOpenIDParam.TxPDO1_W2Steer, m_CanOpenIDParam.TxPDO2_W2Steer, m_CanOpenIDParam.RxPDO2_W2Steer,
00794                                 m_CanOpenIDParam.TxSDO_W2Steer, m_CanOpenIDParam.RxSDO_W2Steer);
00795                         m_vpMotor[3]->setCanItf(m_pCanCtrl);
00796                         m_vpMotor[3]->setDriveParam(DriveParamW2SteerMotor);
00797 
00798                 }
00799         }
00800         
00801         
00802         
00803         if(m_iNumDrives >= 3)
00804         {
00805                 m_IniFile.GetKeyInt("Config", "Wheel3DriveMotor", &m_Param.iHasWheel3DriveMotor, true);
00806                 if (m_Param.iHasWheel3DriveMotor == 0)
00807                 {
00808                         
00809                         std::cout << "node Wheel3DriveMotor available = 0" << std::endl;
00810                 }
00811                 else
00812                 {
00813                         
00814                         std::cout << "Wheel3DriveMotor available = type version 2" << std::endl;
00815                         m_vpMotor[4] = new CanDriveHarmonica();
00816                         ((CanDriveHarmonica*) m_vpMotor[4])->setCanOpenParam(
00817                                 m_CanOpenIDParam.TxPDO1_W3Drive, m_CanOpenIDParam.TxPDO2_W3Drive, m_CanOpenIDParam.RxPDO2_W3Drive,
00818                                 m_CanOpenIDParam.TxSDO_W3Drive, m_CanOpenIDParam.RxSDO_W3Drive);
00819                         m_vpMotor[4]->setCanItf(m_pCanCtrl);
00820                         m_vpMotor[4]->setDriveParam(DriveParamW3DriveMotor);
00821                 }
00822         }
00823 
00824         
00825         if(m_iNumDrives >= 3)
00826         {
00827                 m_IniFile.GetKeyInt("Config", "Wheel3SteerMotor", &m_Param.iHasWheel3SteerMotor, true);
00828                 if (m_Param.iHasWheel3SteerMotor == 0)
00829                 {
00830                         
00831                         std::cout << "node Wheel3SteerMotor available = 0" << std::endl;
00832                 }
00833                 else
00834                 {
00835                         
00836                         std::cout << "Wheel3SteerMotor available = type version 2" << std::endl;
00837                         m_vpMotor[5] = new CanDriveHarmonica();
00838                         ((CanDriveHarmonica*) m_vpMotor[5])->setCanOpenParam(
00839                                 m_CanOpenIDParam.TxPDO1_W3Steer, m_CanOpenIDParam.TxPDO2_W3Steer, m_CanOpenIDParam.RxPDO2_W3Steer,
00840                                 m_CanOpenIDParam.TxSDO_W3Steer, m_CanOpenIDParam.RxSDO_W3Steer);
00841                         m_vpMotor[5]->setCanItf(m_pCanCtrl);
00842                         m_vpMotor[5]->setDriveParam(DriveParamW3SteerMotor);
00843 
00844                 }
00845         }
00846         
00847         
00848         
00849         if(m_iNumDrives == 4)
00850         {
00851                 m_IniFile.GetKeyInt("Config", "Wheel4DriveMotor", &m_Param.iHasWheel4DriveMotor, true);
00852                 if (m_Param.iHasWheel4DriveMotor == 0)
00853                 {
00854                         
00855                         std::cout << "node Wheel4DriveMotor available = 0" << std::endl;
00856                 }
00857                 else
00858                 {
00859                         
00860                         std::cout << "Wheel4DriveMotor available = type version 2" << std::endl;
00861                         m_vpMotor[6] = new CanDriveHarmonica();
00862                         ((CanDriveHarmonica*) m_vpMotor[6])->setCanOpenParam(
00863                                 m_CanOpenIDParam.TxPDO1_W4Drive, m_CanOpenIDParam.TxPDO2_W4Drive, m_CanOpenIDParam.RxPDO2_W4Drive,
00864                                 m_CanOpenIDParam.TxSDO_W4Drive, m_CanOpenIDParam.RxSDO_W4Drive);
00865                         m_vpMotor[6]->setCanItf(m_pCanCtrl);
00866                         m_vpMotor[6]->setDriveParam(DriveParamW4DriveMotor);
00867                 }
00868         }
00869 
00870         
00871         if(m_iNumDrives == 4)
00872         {
00873                 m_IniFile.GetKeyInt("Config", "Wheel4SteerMotor", &m_Param.iHasWheel4SteerMotor, true);
00874                 if (m_Param.iHasWheel4SteerMotor == 0)
00875                 {
00876                         
00877                         std::cout << "node Wheel4SteerMotor available = 0" << std::endl;
00878                 }
00879                 else
00880                 {
00881                         
00882                         std::cout << "Wheel4SteerMotor available = type version 2" << std::endl;
00883                         m_vpMotor[7] = new CanDriveHarmonica();
00884                         ((CanDriveHarmonica*) m_vpMotor[7])->setCanOpenParam(
00885                                 m_CanOpenIDParam.TxPDO1_W4Steer, m_CanOpenIDParam.TxPDO2_W4Steer, m_CanOpenIDParam.RxPDO2_W4Steer,
00886                                 m_CanOpenIDParam.TxSDO_W4Steer, m_CanOpenIDParam.RxSDO_W4Steer);
00887                         m_vpMotor[7]->setCanItf(m_pCanCtrl);
00888                         m_vpMotor[7]->setDriveParam(DriveParamW4SteerMotor);
00889 
00890                 }
00891         }
00892 
00893         m_IniFile.GetKeyInt("Config", "GenericBufferLen", &iMaxMessages, true);
00894 
00895 
00896 }
00897 
00898 
00899 int CanCtrlPltfCOb3::evalCanBuffer()
00900 {
00901         bool bRet;
00902 
00903         
00904         m_Mutex.lock();
00905 
00906         
00907         while(m_pCanCtrl->receiveMsg(&m_CanMsgRec) == true)
00908         {
00909                 bRet = false;
00910                 
00911                 for (unsigned int i = 0; i < m_vpMotor.size(); i++)
00912                 {
00913                         
00914                         bRet |= m_vpMotor[i]->evalReceivedMsg(m_CanMsgRec);
00915                 }
00916 
00917                 if (bRet == false)
00918                 {
00919                         std::cout << "evalCanBuffer(): Received CAN_Message with unknown identifier " << m_CanMsgRec.m_iID << std::endl;
00920                 }               
00921         };
00922         
00923 
00924         m_Mutex.unlock();
00925 
00926         return 0;
00927 }
00928 
00929 
00930 bool CanCtrlPltfCOb3::initPltf()
00931 {       
00932         
00933         readConfiguration();
00934                 
00935         
00936         std::vector<bool> vbRetDriveMotor;
00937         std::vector<bool> vbRetSteerMotor;
00938         std::vector<CanDriveItf*> vpDriveMotor;
00939         std::vector<CanDriveItf*> vpSteerMotor;
00940         bool bHomingOk;
00941 
00942 
00943 
00944         vbRetDriveMotor.assign(m_iNumDrives,0);
00945         vbRetSteerMotor.assign(m_iNumDrives,0);
00946 
00947         
00948         
00949         for(int i=0; i<=m_iNumMotors; i+=2)
00950                 vpDriveMotor.push_back(m_vpMotor[i]);
00951 
00952 
00953 
00954         for(int i=1; i<=m_iNumMotors; i+=2)
00955                 vpSteerMotor.push_back(m_vpMotor[i]);
00956 
00957 
00958 
00959 
00960         std::vector<double> vdFactorVel;
00961 
00962         vdFactorVel.assign(m_iNumDrives,0);
00963         double dhomeVeloRadS = -1.0;
00964 
00965 
00966         
00967         std::cout << "StartCanOpen" << std::endl;
00968         sendNetStartCanOpen();
00969         
00970 
00971         
00972         
00973         
00974         std::cout << "Initialization of Watchdogs" << std::endl;
00975         for(int i=0; i<m_iNumMotors; i++)
00976         {
00977                 m_vpMotor[i]->startWatchdog(true);
00978         }
00979 
00980 
00981 
00982 
00983 
00984 
00985 
00986 
00987 
00988         usleep(10000);
00989         
00990         
00991         for(int i=0; i<m_iNumMotors; i++)
00992         {
00993                 m_vpMotor[i]->startWatchdog(false);
00994         }
00995 
00996 
00997 
00998 
00999 
01000 
01001 
01002 
01003 
01004         usleep(100000);
01005 
01006         std::cout << "Initialization of Watchdogs done" << std::endl;
01007 
01008 
01009         
01010         
01011         
01012         if( (int)m_vpMotor.size() == m_iNumMotors )
01013         {
01014                 
01015                 for (int i = 0; i<m_iNumDrives; i++)
01016                 {
01017                         
01018                         vbRetDriveMotor[i] = vpDriveMotor[i]->init();
01019                         vbRetSteerMotor[i] = vpSteerMotor[i]->init();
01020                         usleep(10000);
01021                         vbRetDriveMotor[i] = vbRetDriveMotor[i] && vpDriveMotor[i]->start();
01022                         vbRetSteerMotor[i] = vbRetSteerMotor[i] && vpSteerMotor[i]->start();
01023                         usleep(10000);
01024                         
01025                         if (vbRetDriveMotor[i] && vbRetSteerMotor[i])
01026                                 std::cout << "Initialization of Wheel "<< (i+1) << " OK" << std::endl;
01027                         else if (!vbRetDriveMotor[i] && vbRetSteerMotor[i])
01028                                 std::cout << "Initialization of Wheel "<< (i+1) << " ERROR while initializing DRIVE-Motor" << std::endl;
01029                         else if (vbRetDriveMotor[i] && !vbRetSteerMotor[i])
01030                                 std::cout << "Initialization of Wheel "<< (i+1) << " ERROR while initializing STEER-Motor" << std::endl;
01031                         else
01032                                 std::cout << "Initialization of Wheel "<< (i+1) << " ERROR while initializing STEER- and DRIVE-Motor" << std::endl;
01033                         
01034                         vpDriveMotor[i]->setGearVelRadS(0);
01035                         vpSteerMotor[i]->setGearVelRadS(0);
01036                 }       
01037                 
01038                 
01039 
01040 
01041                 bHomingOk = true;
01042                 for(int i=0; i<m_iNumDrives; i++)
01043                 {
01044                         if((vbRetDriveMotor[i] && vbRetSteerMotor[i]) == false)
01045                                 bHomingOk = false;
01046                 }
01047                 if(bHomingOk)
01048                 {
01049                         
01050                         if(m_iNumDrives >= 1)
01051                                 vdFactorVel[0] = - m_Param.dWheel1SteerDriveCoupling + double(m_Param.iDistSteerAxisToDriveWheelMM) / double(m_Param.iRadiusWheelMM);
01052                         if(m_iNumDrives >= 2)
01053                                 vdFactorVel[1] = - m_Param.dWheel2SteerDriveCoupling + double(m_Param.iDistSteerAxisToDriveWheelMM) / double(m_Param.iRadiusWheelMM);
01054                         if(m_iNumDrives >= 3)
01055                                 vdFactorVel[2] = - m_Param.dWheel3SteerDriveCoupling + double(m_Param.iDistSteerAxisToDriveWheelMM) / double(m_Param.iRadiusWheelMM);
01056                         if(m_iNumDrives == 4)
01057                                 vdFactorVel[3] = - m_Param.dWheel4SteerDriveCoupling + double(m_Param.iDistSteerAxisToDriveWheelMM) / double(m_Param.iRadiusWheelMM);
01058 
01059                         
01060                         for (int i = 0; i<m_iNumDrives; i++)
01061                                 vpSteerMotor[i]->initHoming();                                          
01062                         
01063                         
01064                         for (int i = 0; i<m_iNumDrives; i++)
01065                         {
01066                                 vpSteerMotor[i]->setGearVelRadS(dhomeVeloRadS);
01067                                 vpDriveMotor[i]->setGearVelRadS(dhomeVeloRadS * vdFactorVel[i]);
01068                         }
01069 
01070                         
01071                         usleep(500000);
01072 
01073                         
01074                         bool bRet;
01075                         do
01076                                 bRet = m_pCanCtrl->receiveMsg(&m_CanMsgRec);
01077                         while(bRet == true);
01078 
01079                         
01080                         for (int i = 0; i<m_iNumDrives; i++)
01081                                 vpSteerMotor[i]->IntprtSetInt(8, 'H', 'M', 1, 1);
01082 
01083                         
01084                         bool bAllDone, bTimeOut=false;
01085                         int iCnt = 0;
01086                         do
01087                         {
01088                                 
01089                                 for (int i = 0; i<m_iNumDrives; i++)
01090                                         vpSteerMotor[i]->IntprtSetInt(4, 'H', 'M', 1, 0);
01091                                 
01092                                 
01093                                 evalCanBuffer();
01094 
01095                                 
01096                                 bAllDone = true;
01097                                 for (int i = 0; i<m_iNumDrives; i++)
01098                                 {
01099                                         if (vpSteerMotor[i]->getStatusLimitSwitch())
01100                                         {
01101                                                 vpSteerMotor[i]->setGearVelRadS(0);
01102                                                 vpDriveMotor[i]->setGearVelRadS(0);
01103                                         }
01104                                         bAllDone = bAllDone && vpSteerMotor[i]->getStatusLimitSwitch();
01105                                 }       
01106 
01107                                 
01108                                 if (iCnt++ > 1000) 
01109                                         bTimeOut = true;
01110 
01111                                 
01112                         usleep(20000);                          
01113                         }
01114                         while(!bAllDone && !bTimeOut);
01115 
01116                         
01117                         if (bTimeOut)
01118                         {
01119                                 for (int i=0;i<m_iNumDrives;i++)
01120                                 {
01121                                         vpSteerMotor[i]->setGearVelRadS(0);
01122                                         vpDriveMotor[i]->setGearVelRadS(0);
01123                                 }
01124                                 std::cout << "Error while Homing: Timeout while waiting for homing signal" << std::endl;
01125                         }
01126 
01127                         
01128                         
01129                         evalCanBuffer();
01130 
01131                         
01132                         
01133                         
01134                         double m_d0 = 2.5;
01135                         if (bTimeOut == false)
01136                         {
01137                                 do
01138                                 {       
01139                                         bAllDone = true;
01140                                         for (int i = 0; i<m_iNumDrives; i++)
01141                                         {
01142                                                 
01143                                                 double dCurrentPosRad;
01144                                                 vpSteerMotor[i]->getGearPosRad(&dCurrentPosRad);
01145                                                 
01146                                                 double dDeltaPhi = 0.0 - dCurrentPosRad; 
01147                                                 
01148                                                 if (fabs(dDeltaPhi) < 0.03)     
01149                                                 {
01150                                                         dDeltaPhi = 0.0;
01151                                                 }
01152                                                 else
01153                                                 {
01154                                                         bAllDone = false;       
01155                                                 }
01156                                                 double dVelCmd = m_d0 * dDeltaPhi;
01157                                                 
01158                                                 vpSteerMotor[i]->setGearVelRadS(dVelCmd);
01159                                                 vpDriveMotor[i]->setGearVelRadS(dVelCmd*vdFactorVel[i]);
01160                                         }
01161                                         usleep(20000);
01162                                         evalCanBuffer();
01163                                 } while(!bAllDone);
01164 
01165 
01166                                 
01167                                 std::cout << "Wheels homed" << std::endl;
01168                                 for (int i=0;i<m_iNumDrives;i++)
01169                                 {
01170                                         vpSteerMotor[i]->setGearVelRadS(0);
01171                                         vpDriveMotor[i]->setGearVelRadS(0);
01172                                 }
01173                         }
01174                 }
01175         }
01176         
01177 
01178         
01179         for(int i=0; i<m_iNumMotors; i++)
01180         {
01181                 m_vpMotor[i]->startWatchdog(true);
01182         }
01183 
01184 
01185 
01186 
01187 
01188 
01189 
01190 
01191 
01192 
01193 
01194 
01195         bHomingOk = true;
01196         for(int i=0; i<m_iNumDrives; i++)
01197         {
01198                 if((vbRetDriveMotor[i] && vbRetSteerMotor[i]) == false)
01199                 {
01200                         bHomingOk = false;
01201                 }
01202         }
01203         return (bHomingOk);
01204 }
01205 
01206 
01207 bool CanCtrlPltfCOb3::resetPltf()
01208 {
01209         bool bRetMotor = true;
01210         bool bRet = true;
01211         
01212         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01213         {
01214                 bRetMotor = m_vpMotor[i]->start();
01215                 if (bRetMotor == true)
01216                 {
01217                         m_vpMotor[i]->setGearVelRadS(0);
01218                 }
01219                 else
01220                 {
01221                         std::cout << "Resetting of Motor " << i << " failed" << std::endl;
01222                 }
01223 
01224                 bRet &= bRetMotor;
01225         }
01226         return(bRet);
01227 }
01228 
01229 
01230 bool CanCtrlPltfCOb3::shutdownPltf()
01231 {
01232 
01233         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01234         {
01235                 m_vpMotor[i]->shutdown();
01236         }
01237 
01238         return true;
01239 }
01240 
01241 
01242 bool CanCtrlPltfCOb3::isPltfError()
01243 {
01244 
01245         bool bErrMotor = false;
01246         std::vector<bool> vbErrMotor;
01247         vbErrMotor.resize(m_vpMotor.size());
01248 
01249         
01250         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01251         {
01252                 vbErrMotor[i] = m_vpMotor[i]->isError();
01253                 
01254                 if( (m_bWatchdogErr == false) && (vbErrMotor[i] == true) )
01255                 {
01256                         std::cout << "Motor " << i << " error" << std::endl;
01257                 }
01258                 
01259                 bErrMotor |= vbErrMotor[i];
01260         }
01261 
01262         
01263         if(bErrMotor == false)
01264                 m_bWatchdogErr = false;
01265         else
01266                 m_bWatchdogErr = true;
01267 
01268         if (m_bWatchdogErr) return true;
01269 
01270 
01271         
01272         double dWatchTime = 0;
01273 
01274         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01275         {
01276                 dWatchTime = m_vpMotor[i]->getTimeToLastMsg();
01277 
01278                 if(dWatchTime <  m_Param.dCanTimeout)
01279                 {
01280                         m_bWatchdogErr = false;
01281                 }
01282                 if( (dWatchTime > m_Param.dCanTimeout) && (m_bWatchdogErr == false) )
01283                 {
01284                         std::cout << "timeout CAN motor " << i << std::endl;
01285                         m_bWatchdogErr = true;
01286                         return true;
01287                 }
01288         }
01289 
01290         return false;
01291 }
01292 
01293 
01294 bool CanCtrlPltfCOb3::startWatchdog(bool bStarted)
01295 {
01296 
01297         bool bRet = true;
01298 
01299         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01300         {
01301                 bRet = m_vpMotor[i]->startWatchdog(bStarted);
01302         }
01303 
01304         return (bRet);
01305 }
01306 
01307 
01308 void CanCtrlPltfCOb3::sendNetStartCanOpen()
01309 {
01310         CanMsg msg;
01311 
01312         msg.m_iID  = 0;
01313         msg.m_iLen = 2;
01314         msg.set(1,0,0,0,0,0,0,0);
01315         m_pCanCtrl->transmitMsg(msg, false);
01316 
01317         usleep(100000);
01318 }
01319 
01320 
01321 
01322 
01323 
01324 
01325 
01326 
01327 int CanCtrlPltfCOb3::setVelGearRadS(int iCanIdent, double dVelGearRadS)
01328 {               
01329         m_Mutex.lock();
01330 
01331         
01332         if (m_bWatchdogErr == true)
01333         {
01334                 
01335                 dVelGearRadS = 0;
01336                 
01337         }
01338 
01339         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01340         {
01341                 
01342                 if(iCanIdent == m_viMotorID[i])
01343                 {
01344                         m_vpMotor[i]->setGearVelRadS(dVelGearRadS);
01345                 }
01346         }
01347         
01348         m_Mutex.unlock();
01349         
01350         return 0;
01351 }
01352 
01353 
01354 int CanCtrlPltfCOb3::requestMotPosVel(int iCanIdent)
01355 {
01356         m_Mutex.lock();
01357 
01358         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01359         {
01360                 
01361                 if(iCanIdent == m_viMotorID[i])
01362                 {
01363                         m_vpMotor[i]->requestPosVel();
01364                 }
01365         }
01366         
01367         m_Mutex.unlock();
01368 
01369         return 0;
01370 }
01371 
01372 
01373 void CanCtrlPltfCOb3::requestDriveStatus()
01374 {
01375         m_Mutex.lock();
01376 
01377         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01378         {
01379                 m_vpMotor[i]->requestStatus();
01380         }
01381 
01382         m_Mutex.unlock();
01383 }
01384 
01385 
01386 int CanCtrlPltfCOb3::getGearPosVelRadS(int iCanIdent, double* pdAngleGearRad, double* pdVelGearRadS)
01387 {
01388 
01389         
01390         *pdAngleGearRad = 0;
01391         *pdVelGearRadS = 0;
01392 
01393         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01394         {
01395                 
01396                 if(iCanIdent == m_viMotorID[i])
01397                 {
01398                         m_vpMotor[i]->getGearPosVelRadS(pdAngleGearRad, pdVelGearRadS);
01399                 }
01400         }
01401         
01402         return 0;
01403 }
01404 
01405 
01406 int CanCtrlPltfCOb3::getGearDeltaPosVelRadS(int iCanIdent, double* pdAngleGearRad,
01407                                                                                    double* pdVelGearRadS)
01408 {
01409 
01410         
01411         *pdAngleGearRad = 0;
01412         *pdVelGearRadS = 0;
01413 
01414         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01415         {
01416                 
01417                 if(iCanIdent == m_viMotorID[i])
01418                 {
01419                         m_vpMotor[i]->getGearDeltaPosVelRadS(pdAngleGearRad, pdVelGearRadS);
01420                 }
01421         }
01422 
01423         return 0;
01424 }
01425 
01426 
01427 void CanCtrlPltfCOb3::getStatus(int iCanIdent, int* piStatus, int* piTempCel)
01428 {
01429         
01430         *piStatus = 0;
01431         *piTempCel = 0;
01432 
01433         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01434         {
01435                 
01436                 if(iCanIdent == m_viMotorID[i])
01437                 {
01438                         m_vpMotor[i]->getStatus(piStatus, piTempCel);
01439                 }
01440         }
01441 
01442 }
01443 
01444 void CanCtrlPltfCOb3::requestMotorTorque()
01445 {
01446         m_Mutex.lock();
01447 
01448         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01449         {
01450                 m_vpMotor[i]->requestMotorTorque();
01451         }
01452 
01453         m_Mutex.unlock();
01454 }       
01455 
01456 
01457 void CanCtrlPltfCOb3::getMotorTorque(int iCanIdent, double* pdTorqueNm)
01458 {
01459         
01460         *pdTorqueNm = 0;
01461 
01462         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01463         {
01464                 
01465                 if(iCanIdent == m_viMotorID[i])
01466                 {
01467                         m_vpMotor[i]->getMotorTorque(pdTorqueNm);
01468                 }
01469         }
01470 
01471 }
01472 
01473 void CanCtrlPltfCOb3::setMotorTorque(int iCanIdent, double dTorqueNm)
01474 {
01475         m_Mutex.lock();
01476 
01477         for(unsigned int i = 0; i < m_vpMotor.size(); i++)
01478         {
01479                 
01480                 if(iCanIdent == m_viMotorID[i])
01481                 {
01482                         m_vpMotor[i]->setMotorTorque(dTorqueNm);
01483                 }
01484         }
01485 
01486         m_Mutex.unlock();
01487 }
01488 
01489 
01490 
01491 
01492 
01493 
01494 int CanCtrlPltfCOb3::ElmoRecordings(int iFlag, int iParam, std::string sString) {
01495         int tempRet = 0;
01496         int bRet = 0;
01497         
01498         switch(iFlag) {
01499                 case 0: 
01500                         for(unsigned int i = 0; i < m_vpMotor.size(); i++) {
01501                                 m_vpMotor[i]->setRecorder(0, iParam); 
01502                         }
01503                         return 0;
01504 
01505                 case 1: 
01506                         for(unsigned int i = 0; i < m_vpMotor.size(); i++) {
01507                                 if((tempRet = m_vpMotor[i]->setRecorder(1, iParam, sString)) > bRet) { 
01508                                         bRet = tempRet; 
01509                                 }
01510                         }
01511                         return bRet;
01512                 
01513                 case 99:
01514                         for(unsigned int i = 0; i < m_vpMotor.size(); i++) {
01515                                 m_vpMotor[i]->setRecorder(99, 0); 
01516                         }
01517                         return 0;
01518                         
01519                 case 100:
01520                         for(unsigned int i = 0; i < m_vpMotor.size(); i++) {
01521                                 bRet += m_vpMotor[i]->setRecorder(2, 0); 
01522                         }
01523                         return bRet;
01524                 
01525                 default:
01526                         return -1;
01527         }
01528 }