Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Platform/Aperios1.3.2/MotorCommandsSender.cpp

Go to the documentation of this file.
00001 /**
00002  * @file
00003  * This file contains the implementation of a sender for motor commands.
00004  */
00005 
00006 #include "ProcessFramework.h"
00007 #include "Tools/Debugging/Debugging.h"
00008 
00009 MotorCommandsSender::MotorCommandsSender(PlatformProcess* process,bool blocking)
00010 : SenderBase<MotorCommands>(process,"Sender.OCommandVectorData.S",blocking),
00011   jointGainsSet(false)
00012 {
00013   package = 0;
00014   numOfLED = SystemCall::getRobotDesign() == RobotDesign::ERS210 ? LEDValue::numOfLED_ERS210 : LEDValue::numOfLED_ERS7;
00015   VERIFY(OPENR::NewCommandVectorData(JointData::numOfJoint + numOfLED,&memID,&cmdVec) == oSUCCESS);
00016   cmdVec->SetNumData(JointData::numOfJoint + numOfLED);
00017 
00018   OPENR::SetMotorPower(opowerON);
00019 
00020   for(int i = 0; i < JointData::numOfJoint; i++) 
00021   {
00022     OPENR::OpenPrimitive((const char*) getPrimitiveJointName(i),&jointId[i]);
00023     OPENR::EnableJointGain(jointId[i]);
00024     OCommandInfo* info = cmdVec->GetInfo(i);
00025     info->Set(odataJOINT_COMMAND2,jointId[i],jointDataBufferNumOfFrames);
00026   }
00027 
00028   OPrimitiveID id;
00029   
00030   if(SystemCall::getRobotDesign() == RobotDesign::ERS7)
00031   {
00032     for(int i = 0; i < numOfLED; i++) 
00033     {
00034     OPENR::OpenPrimitive((const char*) getPrimitiveLEDName(i),&id);
00035     OCommandInfo* info = cmdVec->GetInfo(JointData::numOfJoint + i);
00036     if (i < (int)LEDValue::face1)
00037     {
00038        info->Set(odataLED_COMMAND2,id,jointDataBufferNumOfFrames);
00039     }
00040     else
00041     {
00042        info->Set(odataLED_COMMAND3,id,jointDataBufferNumOfFrames);
00043     }
00044     }
00045   }
00046   else
00047   {
00048     for(int i = 0; i < numOfLED; i++)
00049       {
00050     OPENR::OpenPrimitive((const char*) getPrimitiveLEDName(i),&id);
00051     OCommandInfo* info = cmdVec->GetInfo(JointData::numOfJoint + i);
00052     info->Set(odataLED_COMMAND2,id,jointDataBufferNumOfFrames);
00053     }
00054   }
00055 }
00056 
00057 MotorCommandsSender::~MotorCommandsSender()
00058 {
00059   VERIFY(OPENR::DeleteCommandVectorData(memID) == oSUCCESS);
00060 }
00061 
00062 void MotorCommandsSender::preparePackage()
00063 {
00064   if(!package)
00065     package = new RCRegion(cmdVec->vectorInfo.memRegionID,
00066                            cmdVec->vectorInfo.offset,
00067                            (void*) cmdVec,
00068                            cmdVec->vectorInfo.totalSize);
00069 
00070   const MotorCommands& motorCommands = *static_cast<const MotorCommands*>(this);
00071 
00072   for (int i = 0; i < JointData::numOfJoint; i++)
00073     if(!jointGainsSet ||
00074        motorCommands.pidData.p[i] != lastPidData.p[i] ||
00075        motorCommands.pidData.i[i] != lastPidData.i[i] ||
00076        motorCommands.pidData.d[i] != lastPidData.d[i])
00077     {
00078       OPENR::SetJointGain(jointId[i], 
00079         motorCommands.pidData.p[i],
00080         motorCommands.pidData.i[i],
00081         motorCommands.pidData.d[i],
00082         0x0E, 0x02, 0x0F);
00083       lastPidData.p[i] = motorCommands.pidData.p[i];
00084       lastPidData.i[i] = motorCommands.pidData.i[i];
00085       lastPidData.d[i] = motorCommands.pidData.d[i];
00086     }
00087   jointGainsSet = true;
00088 
00089   long value;
00090   for(int k = 0; k < JointData::numOfJoint; ++k)
00091   {
00092     OCommandData* data = cmdVec->GetData(k);
00093     for(int l = 0; l < jointDataBufferNumOfFrames; ++l) 
00094     {
00095       value = motorCommands.jointDataBuffer.frame[l].data[k];
00096       if(value == jointDataInvalidValue) 
00097         value = 0;
00098       ((OJointCommandValue2 *)data->value)[l].value = value;
00099     }
00100   }
00101 
00102   if(SystemCall::getRobotDesign() == RobotDesign::ERS7)
00103   {
00104   for(int k = 0; k < numOfLED; ++k) 
00105     {
00106     OCommandData* data = cmdVec->GetData(JointData::numOfJoint + k);
00107     if ( k < (int)LEDValue::face1 )
00108     {
00109        for(int l = 0; l < jointDataBufferNumOfFrames; l++)
00110        {
00111        ((OLEDCommandValue2 *)data->value)[l].period = 1;
00112        ((OLEDCommandValue2 *)data->value)[l].led = (motorCommands.ledValue.data[l] >> k) & 1;
00113        }
00114     }
00115     else
00116     {
00117        if (k <(int)LEDValue::backFrontBlue)
00118        {
00119        for(int l = 0; l < jointDataBufferNumOfFrames; l++)
00120          {
00121          ((OLEDCommandValue3 *)data->value)[l].period = 1;
00122          ((OLEDCommandValue3 *)data->value)[l].intensity = ((motorCommands.ledValue.data[l] >> k) & 1)*255;
00123          ((OLEDCommandValue3 *)data->value)[l].mode = oled3_MODE_B;
00124          }
00125        }
00126       else 
00127       {
00128          for(int l = 0; l < jointDataBufferNumOfFrames; l++)
00129          {
00130          ((OLEDCommandValue3 *)data->value)[l].period = 1;
00131          ((OLEDCommandValue3 *)data->value)[l].intensity = ((motorCommands.ledValue.data[l] >> k) & 1)*255;
00132          ((OLEDCommandValue3 *)data->value)[l].mode = oled3_MODE_UNDEF;
00133          }
00134       }
00135     }
00136     }
00137   }
00138   else
00139   {
00140   for(int k = 0; k < numOfLED; ++k) 
00141   {
00142      OCommandData* data = cmdVec->GetData(JointData::numOfJoint + k);
00143      for(int l = 0; l < jointDataBufferNumOfFrames; l++)
00144      {
00145      ((OLEDCommandValue2 *)data->value)[l].period = 1;
00146      ((OLEDCommandValue2 *)data->value)[l].led = (motorCommands.ledValue.data[l] >> k) & 1;
00147      }
00148   }
00149   }
00150 }
00151 
00152 void MotorCommandsSender::setPackage(const ObserverID& receiver)
00153 {
00154   VERIFY(SetData(receiver,package) == oSUCCESS);
00155 }
00156 
00157 void MotorCommandsSender::freePackage()
00158 {
00159   // package is not freed
00160 }
00161 
00162 /*
00163  * Change log :
00164  * 
00165  * $Log: MotorCommandsSender.cpp,v $
00166  * Revision 1.1.1.1  2004/05/22 17:23:26  cvsadm
00167  * created new repository GT2004_WM
00168  *
00169  * Revision 1.5  2004/02/29 14:50:29  wachter
00170  * bugfix
00171  *
00172  * Revision 1.4  2004/02/27 23:58:39  wachter
00173  * ERS7 face and back LEDs working now.
00174  *
00175  * Revision 1.3  2003/12/31 14:29:19  roefer
00176  * Joints and LEDs for ERS-7
00177  *
00178  * Revision 1.2  2003/10/29 14:23:47  roefer
00179  * Start delay bug fixed
00180  *
00181  * Revision 1.1  2003/10/07 10:06:59  cvsadm
00182  * Created GT2004 (M.J.)
00183  *
00184  * Revision 1.3  2003/07/03 22:51:11  dueffert
00185  * no spastic startup movements anymore: sending after calculating
00186  *
00187  * Revision 1.2  2003/07/03 15:57:57  dueffert
00188  * no spastic startup movements anymore
00189  *
00190  * Revision 1.1.1.1  2003/07/02 09:40:24  cvsadm
00191  * created new repository for the competitions in Padova from the 
00192  * tamara CVS (Tuesday 2:00 pm)
00193  *
00194  * removed unused solutions
00195  *
00196  * Revision 1.8  2003/05/16 17:02:17  roefer
00197  * JAM removed
00198  *
00199  * Revision 1.7  2003/03/10 18:21:15  dueffert
00200  * const cast warnings removed
00201  *
00202  * Revision 1.6  2002/12/02 11:00:13  dueffert
00203  * doxygen docu corrected
00204  *
00205  * Revision 1.5  2002/11/26 17:20:07  risler
00206  * removed PID initial low settings since wakeUp special action now performs smooth startup
00207  *
00208  * Revision 1.4  2002/11/25 15:58:37  risler
00209  * added return in preparePackage when initializing
00210  *
00211  * Revision 1.3  2002/11/25 15:17:34  dueffert
00212  * PID=1 at startup
00213  *
00214  * Revision 1.2  2002/11/19 17:08:48  risler
00215  * added datatype PIDData
00216  * support for sending new pid values at runtime
00217  *
00218  * Revision 1.1  2002/09/10 15:40:04  cvsadm
00219  * Created new project GT2003 (M.L.)
00220  * - Cleaned up the /Src/DataTypes directory
00221  * - Removed challenge related source code
00222  * - Removed processing of incoming audio data
00223  * - Renamed AcousticMessage to SoundRequest
00224  *
00225  * Revision 1.5  2002/08/30 17:10:57  dueffert
00226  * removed unused includes
00227  *
00228  * Revision 1.4  2002/08/14 17:11:00  dueffert
00229  * adapted by Thomas Roefer to OPENR_SDK-1.1.3-r1 and OPENR_SYS-007
00230  *
00231  * Revision 1.3  2002/07/23 13:39:39  loetzsch
00232  * - new streaming classes
00233  * - removed many #include statements
00234  * - new design of debugging architecture
00235  * - exchanged StaticQueue with MessageQueue
00236  *
00237  * Revision 1.2  2002/07/14 14:03:07  roefer
00238  * First working gcc-version
00239  *
00240  * Revision 1.1  2002/07/13 10:54:58  roefer
00241  * New command and sound sender
00242  *
00243  *
00244  *
00245  */

Generated on Thu Sep 23 19:57:34 2004 for GT2004 by doxygen 1.3.6