SeaBee3GUICommunicator.C

00001 #ifndef SeaBee3GUICommunicator_C
00002 #define SeaBee3GUICommunicator_C
00003 
00004 #include "Qt/SeaBee3GUICommunicator.H"
00005 #include "Ice/ImageIce.ice.H"
00006 #include "Ice/IceImageUtils.H"
00007 //#include "Robots/SeaBeeIII/Ice/SeaBeeMessages.ice.H"
00008 
00009 SeaBee3GUICommunicator::SeaBee3GUICommunicator(OptionManager& mgr,
00010     const std::string& descrName,
00011     const std::string& tagName) :
00012   RobotBrainComponent(mgr, descrName, tagName),
00013   itsGUIRegistered(false),
00014   itsFwdFrameCount(0),
00015   itsLastFwdFrameCount(0),
00016   itsDwnFrameCount(0),
00017   itsLastDwnFrameCount(0)
00018 {
00019 }
00020 
00021 void SeaBee3GUICommunicator::registerTopics()
00022 {
00023   registerSubscription("BeeStemMessageTopic");
00024   registerSubscription("XBox360RemoteControlMessageTopic");
00025   registerSubscription("RetinaMessageTopic");
00026   registerSubscription("VisionRectangleMessageTopic");
00027   registerSubscription("SalientPointMessageTopic");
00028   registerSubscription("MovementControllerMessageTopic");
00029   registerPublisher("CameraConfigTopic");
00030   registerPublisher("BeeStemConfigTopic");
00031   registerPublisher("SeaBeeStateConditionMessageTopic");
00032 }
00033 
00034 void SeaBee3GUICommunicator::evolve()
00035 {
00036   itsImageMutex.lock();
00037   Image<PixRGB<byte> > fwdImg = itsFwdImg;
00038   Image<PixRGB<byte> > dwnImg = itsDwnImg;
00039   itsImageMutex.unlock();
00040 
00041   itsGUIFormMutex.lock();
00042   if(itsGUIRegistered)
00043     {
00044       if(fwdImg.initialized() && itsFwdFrameCount != itsLastFwdFrameCount)
00045         {
00046           itsLastFwdFrameCount = itsFwdFrameCount;
00047           itsGUIForm->setImage(fwdImg, "FwdCamera");
00048         }
00049 
00050       if(dwnImg.initialized() && itsDwnFrameCount != itsLastDwnFrameCount)
00051         {
00052           itsLastDwnFrameCount = itsDwnFrameCount;
00053           itsGUIForm->setImage(dwnImg, "DwnCamera");
00054         }
00055     }
00056   itsGUIFormMutex.unlock();
00057 }
00058 
00059 void SeaBee3GUICommunicator::toggleCamera(std::string cameraID, bool active) {
00060 
00061   RobotSimEvents::CameraConfigMessagePtr msg = new RobotSimEvents::CameraConfigMessage;
00062   msg->cameraID=cameraID;
00063   msg->active=active;
00064 
00065   this->publish("CameraConfigTopic", msg);
00066 }
00067 
00068 void SeaBee3GUICommunicator::updatePoseSettings(int updateSelect, int heading, int depth, int speed)
00069 {
00070 
00071   RobotSimEvents::BeeStemConfigMessagePtr msg = new RobotSimEvents::BeeStemConfigMessage;
00072   msg->desiredHeading = heading;
00073   msg->desiredDepth = depth;
00074   msg->desiredSpeed = speed;
00075   msg->updateDesiredValue = updateSelect;
00076 
00077   msg->headingK = 0.0;
00078   msg->headingP = 0.0;
00079   msg->headingI = 0.0;
00080   msg->headingD = 0.0;
00081   msg->updateHeadingPID = false;
00082 
00083   msg->depthK = 0.0;
00084   msg->depthP = 0.0;
00085   msg->depthI = 0.0;
00086   msg->depthD = 0.0;
00087   msg->updateDepthPID = false;
00088 
00089   msg->enablePID = 0;
00090   msg->enableVal = 0;
00091 
00092 
00093   this->publish("BeeStemConfigTopic", msg);
00094 }
00095 
00096 void SeaBee3GUICommunicator::updatePID(int pidSelect, float k, float p, float i, float d)
00097 {
00098 
00099 
00100   RobotSimEvents::BeeStemConfigMessagePtr msg = new RobotSimEvents::BeeStemConfigMessage;
00101   msg->desiredHeading = 0.0;
00102   msg->desiredDepth = 0.0;
00103   msg->desiredSpeed = 0.0;
00104   msg->updateDesiredValue = 0;
00105 
00106   msg->headingK = 0.0;
00107   msg->headingP = 0.0;
00108   msg->headingI = 0.0;
00109   msg->headingD = 0.0;
00110   msg->updateHeadingPID = false;
00111 
00112   msg->depthK = 0.0;
00113   msg->depthP = 0.0;
00114   msg->depthI = 0.0;
00115   msg->depthD = 0.0;
00116   msg->updateDepthPID = false;
00117 
00118   msg->enablePID = 0;
00119   msg->enableVal = 0;
00120 
00121   // if heading
00122   if(pidSelect == 1)
00123     {
00124       msg->headingK = k;
00125       msg->headingP = p;
00126       msg->headingI = i;
00127       msg->headingD = d;
00128       msg->updateHeadingPID = 1;
00129     }
00130   // if depth
00131   else if(pidSelect == 0)
00132     {
00133       msg->depthK = k;
00134       msg->depthP = p;
00135       msg->depthI = i;
00136       msg->depthD = d;
00137       msg->updateDepthPID = 1;
00138     }
00139 
00140 
00141 
00142   this->publish("BeeStemConfigTopic", msg);
00143 }
00144 
00145 
00146 // ######################################################################
00147 void SeaBee3GUICommunicator::updateMessage(const RobotSimEvents::EventMessagePtr& eMsg,
00148     const Ice::Current&)
00149 {
00150   //Get a retina message
00151   if(eMsg->ice_isA("::RobotSimEvents::RetinaMessage"))
00152   {
00153     RobotSimEvents::RetinaMessagePtr retinaMessage = RobotSimEvents::RetinaMessagePtr::dynamicCast(eMsg);
00154     Image<PixRGB<byte> > retinaImage = Ice2Image<PixRGB<byte> >(retinaMessage->img);
00155 
00156     itsImageMutex.lock();
00157 
00158     if(retinaMessage->cameraID == "FwdCamera")
00159       {
00160         itsFwdImg = retinaImage;
00161         itsFwdFrameCount++;
00162       }
00163     else
00164       {
00165         itsDwnImg = retinaImage;
00166         itsDwnFrameCount++;
00167       }
00168 
00169     itsImageMutex.unlock();
00170   }
00171   // Get a XBox360RemoteControl Message
00172   else if(eMsg->ice_isA("::RobotSimEvents::JoyStickControlMessage"))
00173   {
00174     RobotSimEvents::JoyStickControlMessagePtr msg = RobotSimEvents::JoyStickControlMessagePtr::dynamicCast(eMsg);
00175 
00176     itsGUIFormMutex.lock();
00177     if(itsGUIRegistered)
00178     {
00179       if(msg->axis >= 0)
00180         itsGUIForm->setJSAxis(msg->axis, msg->axisVal);
00181       else
00182         LINFO("Button[%d] = %d",msg->button, msg->butVal);
00183     }
00184     itsGUIFormMutex.unlock();
00185   }
00186   // Get a BeeStem Message
00187   else if(eMsg->ice_isA("::RobotSimEvents::BeeStemMessage"))
00188   {
00189 
00190     RobotSimEvents::BeeStemMessagePtr msg = RobotSimEvents::BeeStemMessagePtr::dynamicCast(eMsg);
00191     itsGUIFormMutex.lock();
00192     if(itsGUIRegistered)
00193       {
00194         int killSwitch = msg->killSwitch;
00195         killSwitch = killSwitch;
00196         itsGUIForm->setSensorValues(msg->compassHeading,
00197                                     msg->compassPitch,
00198                                     msg->compassRoll,
00199                                     msg->internalPressure,
00200                                     msg->externalPressure,
00201                                     msg->headingOutput,
00202                                     msg->depthOutput);
00203       }
00204 
00205 
00206     itsGUIForm->setThrusterMeters(
00207         0,
00208         (int)msg->thruster1,
00209         (int)msg->thruster2,
00210         (int)msg->thruster3,
00211         (int)msg->thruster4,
00212         (int)msg->thruster5,
00213         (int)msg->thruster6,
00214         0
00215         );
00216 
00217 
00218 
00219       itsGUIFormMutex.unlock();
00220   }
00221   else if(eMsg->ice_isA("::RobotSimEvents::VisionRectangleMessage"))
00222     {
00223       RobotSimEvents::VisionRectangleMessagePtr msg = RobotSimEvents::VisionRectangleMessagePtr::dynamicCast(eMsg);
00224       itsGUIFormMutex.lock();
00225       if(itsGUIRegistered)
00226         {
00227           if(msg->isFwdCamera)
00228             {
00229               for(uint i = 0; i < msg->quads.size(); i++)
00230                 {
00231                   itsGUIForm->pushFwdRectangle(msg->quads[i]);
00232                 }
00233             }
00234           else
00235             {
00236               for(uint i = 0; i < msg->quads.size(); i++)
00237                 {
00238 
00239                   itsGUIForm->pushRectRatio(msg->quads[i].ratio);
00240                   itsGUIForm->pushRectAngle(msg->quads[i].angle);
00241 
00242                   itsGUIForm->pushContourPoint(Point2D<int>(msg->quads[i].tl.i,msg->quads[i].tl.j));
00243                   itsGUIForm->pushContourPoint(Point2D<int>(msg->quads[i].tr.i, msg->quads[i].tr.j));
00244                   itsGUIForm->pushContourPoint(Point2D<int>(msg->quads[i].br.i, msg->quads[i].br.j));
00245                   itsGUIForm->pushContourPoint(Point2D<int>(msg->quads[i].bl.i, msg->quads[i].bl.j));
00246                 }
00247             }
00248         }
00249       itsGUIFormMutex.unlock();
00250     }
00251   else if(eMsg->ice_isA("::RobotSimEvents::SalientPointMessage"))
00252     {
00253       RobotSimEvents::SalientPointMessagePtr msg = RobotSimEvents::SalientPointMessagePtr::dynamicCast(eMsg);
00254       itsGUIFormMutex.lock();
00255       if(itsGUIRegistered)
00256         {
00257           itsGUIForm->setSalientPoint(Point2D<float>(msg->x,msg->y));
00258         }
00259       itsGUIFormMutex.unlock();
00260     }
00261   else if(eMsg->ice_isA("::RobotSimEvents::MovementControllerMessage"))
00262     {
00263       RobotSimEvents::MovementControllerMessagePtr msg = RobotSimEvents::MovementControllerMessagePtr::dynamicCast(eMsg);
00264       itsGUIFormMutex.lock();
00265       if(itsGUIRegistered)
00266         {
00267           itsGUIForm->setSensorVotes(msg->votes);
00268           itsGUIForm->setCompositeHeading(msg->compositeHeading);
00269           itsGUIForm->setCompositeDepth(msg->compositeDepth);
00270         }
00271       itsGUIFormMutex.unlock();
00272     }
00273 }
00274 
00275 // ######################################################################
00276 void SeaBee3GUICommunicator::enablePID()
00277 {
00278   RobotSimEvents::BeeStemConfigMessagePtr msg = new RobotSimEvents::BeeStemConfigMessage;
00279   msg->desiredHeading = 0.0;
00280   msg->desiredDepth = 0.0;
00281   msg->desiredSpeed = 0.0;
00282   msg->updateDesiredValue = 0;
00283 
00284   msg->headingK = 0.0;
00285   msg->headingP = 0.0;
00286   msg->headingI = 0.0;
00287   msg->headingD = 0.0;
00288   msg->updateHeadingPID = false;
00289 
00290   msg->depthK = 0.0;
00291   msg->depthP = 0.0;
00292   msg->depthI = 0.0;
00293   msg->depthD = 0.0;
00294   msg->updateDepthPID = false;
00295 
00296   msg->enablePID = 1;
00297   msg->enableVal = 1;
00298 
00299   this->publish("BeeStemConfigTopic", msg);
00300 }
00301 
00302 // ######################################################################
00303 void SeaBee3GUICommunicator::disablePID()
00304 {
00305   RobotSimEvents::BeeStemConfigMessagePtr msg = new RobotSimEvents::BeeStemConfigMessage;
00306   msg->desiredHeading = 0.0;
00307   msg->desiredDepth = 0.0;
00308   msg->desiredSpeed = 0.0;
00309   msg->updateDesiredValue = 0;
00310 
00311   msg->headingK = 0.0;
00312   msg->headingP = 0.0;
00313   msg->headingI = 0.0;
00314   msg->headingD = 0.0;
00315   msg->updateHeadingPID = false;
00316 
00317   msg->depthK = 0.0;
00318   msg->depthP = 0.0;
00319   msg->depthI = 0.0;
00320   msg->depthD = 0.0;
00321   msg->updateDepthPID = false;
00322 
00323   msg->enablePID = 1;
00324   msg->enableVal = 0;
00325   this->publish("BeeStemConfigTopic", msg);
00326 
00327 }
00328 // ######################################################################
00329 void SeaBee3GUICommunicator::registerGUI(SeaBee3MainDisplayForm* form)
00330 {
00331   itsGUIFormMutex.lock();
00332   itsGUIForm = form;
00333   itsGUIRegistered = true;
00334   itsGUIFormMutex.unlock();
00335 }
00336 
00337 void SeaBee3GUICommunicator::SeaBeeInjectorMsg(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j)
00338 {
00339         RobotSimEvents::SeaBeeStateConditionMessagePtr msg;
00340         msg = new RobotSimEvents::SeaBeeStateConditionMessage;
00341 
00342         msg->InitDone = a;
00343         msg->GateFound = b;
00344         msg->GateDone = c;
00345         msg->ContourFoundFlare = d;
00346         msg->FlareDone = e;
00347         msg->ContourFoundBarbwire = f;
00348         msg->BarbwireDone = g;
00349         msg->ContourFoundBoxes = h;
00350         msg->BombingRunDone = i;
00351         msg->BriefcaseFound = j;
00352         msg->TimeUp = 0;
00353 
00354         publish("SeaBeeStateConditionMessageTopic",msg);
00355 }
00356 #endif
00357 
Generated on Sun May 8 08:41:15 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3