ScorbotController.C

00001 #include "Robots/Scorbot/ScorbotController.H"
00002 
00003 const ModelOptionCateg MOC_ScorbotComponent = {
00004     MOC_SORTPRI_3, "Scorbot Related Options" };
00005 
00006 const ModelOptionDef OPT_SerialDev =
00007 { MODOPT_ARG(std::string), "SerialDev", &MOC_ScorbotComponent, OPTEXP_CORE,
00008     "Serial Device",
00009     "serial-dev", '\0', "<string>", "/dev/ttyUSB0" };
00010 
00011 
00012 //############################################################
00013 ScorbotController::ScorbotController(int id, OptionManager& mgr,
00014     const std::string& descrName, const std::string& tagName) :
00015   RobotBrainComponent(mgr, descrName, tagName),
00016   itsSerialDev(&OPT_SerialDev, this, 0),
00017   itsSerial(new Serial(mgr))
00018 {
00019   addSubComponent(itsSerial)
00020 }
00021 
00022 //############################################################
00023 ScorbotController::start1()
00024 {
00025   //Configure the serial port
00026   itsSerial->configure(itsSerialDev.getVal(), 115200, "8N1", false, false, 0);
00027 }
00028 
00029 //############################################################
00030 void ScorbotController::registerTopics()
00031 {
00032   LINFO("Registering Scorbot Messages");
00033 //  this->registerPublisher("RetinaMessageTopic");
00034   this->registerSubscription("ScorbotControl");
00035 }
00036 
00037 //############################################################
00038 void ScorbotController::evolve()
00039 {
00040 
00041 }
00042 
00043 //############################################################
00044 void ScorbotController::updateMessage(const RobotSimEvents::EventMessagePtr& eMsg,
00045     const Ice::Current&)
00046 {
00047   //Get a retina message
00048   if(eMsg->ice_isA("::RobotSimEvents::CameraConfigMessage"))
00049   {
00050   }
00051 }
00052 
00053 
00054 //############################################################
00055 void ScorbotController::setMotor(JOINT m, int pwm)
00056 {
00057   unsigned char cmd[6];
00058 
00059         if (pwm > MAX_PWM) pwm = MAX_PWM;
00060         if (pwm < -MAX_PWM) pwm = -MAX_PWM;
00061 
00062         cmd[0] = 10; //move motor
00063 
00064   if (m == WRIST_ROLL || m == WRIST_PITCH)
00065   {
00066     cmd[1] = WRIST1; //move motor
00067     cmd[3] = 10; //move motor
00068     cmd[4] = WRIST2;
00069 
00070     if (pwm >= 0)
00071       cmd[2] = (short int)pwm&0x7F;
00072     else
00073       cmd[2] = (abs((short int)pwm)&0x7F) | 0x80;
00074 
00075     if (m == WRIST_ROLL)
00076     {
00077       if (pwm >= 0)
00078         cmd[5] = (short int)pwm&0x7F;
00079       else
00080         cmd[5] = (abs((short int)pwm)&0x7F) | 0x80;
00081     } else {
00082       if (pwm <= 0)
00083         cmd[5] = (short int)pwm&0x7F;
00084       else
00085         cmd[5] = (abs((short int)pwm)&0x7F) | 0x80;
00086     }
00087 
00088 
00089     for(int i=0; i<3; i++)
00090     {
00091       itsSerial->write(cmd, 6);
00092       usleep(1000);
00093     }
00094 
00095   } else {
00096     cmd[1] = m; //motor
00097     if (pwm >= 0)
00098       cmd[2] = (short int)pwm&0x7F;
00099     else
00100       cmd[2] = (abs((short int)pwm)&0x7F) | 0x80;
00101 
00102     for(int i=0; i<3; i++)
00103     {
00104       itsSerial->write(cmd, 3);
00105       usleep(1000);
00106     }
00107   }
00108 
00109 }
00110 
00111 //############################################################
00112 void ScorbotController::stopAllMotors()
00113 {
00114   unsigned char cmd[1];
00115   cmd[0] = 11; //stop all motors
00116   itsSerial->write(cmd, 1);
00117 }
00118 
00119 //############################################################
00120 int Scorbot::getMicroSwitch()
00121 {
00122   unsigned char cmd;
00123   unsigned char buf;
00124   cmd = 15; //get all ms
00125 
00126         itsSerial->write(&cmd, 1);
00127 
00128         usleep(1000);
00129         itsSerial->read(&buf, 1);
00130   return buf;
00131 }
00132 
00133 //############################################################
00134 int ScorbotController::getEncoder(JOINT m)
00135 {
00136   unsigned char cmd[2];
00137   unsigned char buf[2];
00138 
00139   if (m == WRIST_ROLL || m == WRIST_PITCH)
00140   {
00141     int wrist1 = getEncoder(WRIST1);
00142     int wrist2 = getEncoder(WRIST2);
00143 
00144     if (m==WRIST_PITCH)
00145       return wrist1-wrist2;
00146     else
00147       return wrist1+wrist2;
00148 
00149   } else {
00150     cmd[0] = 12; //get encoder
00151     cmd[1] = m; //motor
00152 
00153     short val = 0;
00154     itsSerial->write(cmd, 2);
00155 
00156     usleep(1000);
00157     int i = itsSerial->read(buf, 2);
00158     if (i == 1) //Only read one byte, wait for another
00159       i += itsSerial->read(buf+1, 1);
00160 
00161     if (i < 2)
00162     {
00163       LFATAL("Error reading encoder value read(%i)", i);
00164     }
00165 
00166     val = (buf[0] << 8) + buf[1];
00167     return val;
00168   }
00169   return 0;
00170 }
00171 
00172 //############################################################
00173 void ScorbotController::setSafety(bool val)
00174 {
00175   unsigned char cmd[2];
00176   cmd[0] = SAFE_MODE;
00177         if (val)
00178                 cmd[1] = 1;
00179         else
00180                 cmd[1] = 0;
00181 
00182         itsSerial->write(cmd, 2);
00183 }
00184 
00185 //############################################################
00186 int ScorbotController::getPWM(JOINT m)
00187 {
00188   unsigned char cmd[2];
00189   unsigned char buf[2];
00190   cmd[0] = GET_PWM;
00191   cmd[1] = m; //motor
00192   itsSerial->write(cmd, 2);
00193 
00194   int i = itsSerial->read(buf, 1);
00195   if (i < 1) return -1;
00196   return buf[0];
00197 }
00198 
00199 
00200 
00201 
00202 
Generated on Sun May 8 08:41:32 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3