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 #include "Beowulf/Beowulf.H"
00041 #include "Component/ModelManager.H"
00042 #include "Media/FrameSeries.H"
00043 #include "Transport/FrameIstream.H"
00044 #include "Raster/Raster.H"
00045 #include "Media/MediaOpts.H"
00046 #include "GUI/XWinManaged.H"
00047 
00048 #include "Video/VideoFormat.H"
00049 #include "Devices/FrameGrabberConfigurator.H"
00050 #include "Devices/FrameGrabberFactory.H"
00051 
00052 #include "Devices/DeviceOpts.H"
00053 #include "Image/CutPaste.H"
00054 
00055 #include "Globals.H"
00056 #include "AgentManagerB.H"
00057 #include "Mission.H"
00058 #include "SubController.H"
00059 
00060 #include <signal.h>
00061 
00062 #define SIM_MODE false
00063 
00064 volatile bool goforever = false;
00065 uint fNum = 0;
00066 
00067 
00068 void checkInMessages
00069 ( nub::soft_ref<Beowulf> beo,
00070   nub::ref<AgentManagerB> agentManager,
00071   rutz::shared_ptr<XWinManaged> cwin);
00072 
00073 
00074 void checkOutMessages
00075 ( nub::ref<AgentManagerB> agentManager,
00076   nub::soft_ref<Beowulf> beo);
00077 
00078 
00079 void packageSensorResult
00080 ( SensorResult sensorResult,
00081   TCPmessage  &smsg);
00082 
00083 
00084 
00085 
00086 void terminate(int s)
00087 {
00088   LERROR("*** INTERRUPT ***");
00089   goforever = false;
00090   exit(1);
00091 }
00092 
00093 
00094 
00095 int main( int argc, const char* argv[] )
00096 {
00097   MYLOGVERB = LOG_INFO;
00098 
00099   
00100   ModelManager manager("SeaBee 2008 competition slave");
00101 
00102   
00103   nub::soft_ref<Beowulf>
00104     beo(new Beowulf(manager, "Beowulf Slave", "BeowulfSlave", false));
00105   manager.addSubComponent(beo);
00106 
00107 #if SIM_MODE == false
00108 
00109   nub::soft_ref<InputFrameSeries> ifs;
00110 
00111   ifs.reset(new InputFrameSeries(manager));
00112   manager.addSubComponent(ifs);
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 
00129 #endif
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137   
00138   nub::ref<AgentManagerB> agentManager(new AgentManagerB(manager));
00139   manager.addSubComponent(agentManager);
00140 
00141   manager.exportOptions(MC_RECURSE);
00142 
00143   
00144   if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154   TCPmessage rmsg;     
00155   TCPmessage smsg;     
00156   int32 rframe = 0, raction = 0, rnode = -1;
00157 
00158   
00159   signal(SIGHUP, terminate); signal(SIGINT, terminate);
00160   signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00161   signal(SIGALRM, terminate);
00162 
00163   
00164   manager.start();
00165 
00166   while(!beo->receive(rnode, rmsg, rframe, raction, 5));
00167   int initval  = uint(rmsg.getElementInt32());
00168   LINFO("Recieved INIT(%d) from COM_A", initval);
00169 
00170   
00171   uint w, h;
00172 
00173 #if SIM_MODE == false
00174     w = ifs->getWidth();
00175     h = ifs->getHeight();
00176 
00177 
00178 #else
00179   w = 320;
00180   h = 240;
00181 #endif
00182 
00183 
00184   rutz::shared_ptr<XWinManaged> cwin
00185     (new XWinManaged(Dims(w,h), 0, 0, "Downward Vision WindowF"));
00186 
00187   
00188   
00189   
00190 
00191   agentManager->setWindow(cwin);
00192   
00193 
00194   
00195   smsg.reset(rframe, INIT_DONE);
00196   beo->send(rnode, smsg);
00197 
00198 #if SIM_MODE == false
00199   
00200   ifs->startStream();
00201 
00202 
00203 
00204 
00205 #endif
00206 
00207   goforever = true;
00208 
00209   Image<PixRGB<byte> > img(w,h,ZEROS);
00210 
00211   
00212   
00213 
00214   while(goforever)
00215     {
00216       
00217 #if SIM_MODE == false
00218 
00219       ifs->updateNext(); img = ifs->readRGB();
00220       if(!img.initialized()) {Raster::waitForKey(); break; }
00221 
00222 
00223 
00224 
00225       agentManager->setCurrentImageF(img, fNum);
00226       agentManager->setCurrentImageB(img, fNum);
00227 #else
00228       
00229           
00230 #endif
00231 
00232       fNum++;
00233 
00234       
00235       checkInMessages(beo, agentManager, cwin);
00236 
00237       
00238       checkOutMessages(agentManager, beo);
00239     }
00240 
00241   
00242   manager.stop();
00243   return 0;
00244 }
00245 
00246 
00247 void checkInMessages
00248 ( nub::soft_ref<Beowulf> beo,
00249   nub::ref<AgentManagerB> agentManager,
00250   rutz::shared_ptr<XWinManaged> cwin
00251 )
00252 {
00253   int32 rframe = 0, raction = 0, rnode = -1;
00254   TCPmessage rmsg;     
00255 
00256   
00257   if(beo->receive(rnode, rmsg, rframe, raction, 5))
00258     {
00259       
00260       Image<PixRGB<byte> > img;
00261       
00262       switch(raction)
00263         {
00264         case ABORT:
00265           {
00266             goforever = false; LINFO("Stop SeaBee COM-B");
00267             break;
00268           }
00269         case UPDATE_MISSION:
00270           {
00271             
00272             Mission theMission;
00273             theMission.missionName = Mission::MissionName(rmsg.getElementInt32());
00274             theMission.timeForMission = int(rmsg.getElementInt32());
00275             theMission.missionState = Mission::MissionState(rmsg.getElementInt32());
00276 
00277             
00278             agentManager->updateAgentsMission(theMission);
00279             break;
00280           }
00281         case IMAGE_UPDATE:
00282           fNum++;
00283           img = rmsg.getElementColByteIma();
00284           
00285           agentManager->setCurrentImageF(img, fNum);
00286           break;
00287         default:
00288           LINFO("Unknown purpose");
00289         }
00290     }
00291 }
00292 
00293 
00294 void checkOutMessages
00295 ( nub::ref<AgentManagerB> agentManager,
00296   nub::soft_ref<Beowulf> beo)
00297 {
00298   int32 rnode = -1;
00299   TCPmessage smsg;     
00300 
00301   
00302   if(agentManager->getNumResults() > 0)
00303     {
00304       
00305       SensorResult result = agentManager->popResult();
00306 
00307       
00308       packageSensorResult(result, smsg);
00309 
00310       
00311       beo->send(rnode, smsg);
00312     }
00313 }
00314 
00315 
00316 void packageSensorResult
00317 ( SensorResult sensorResult,
00318   TCPmessage  &smsg)
00319 {
00320   int32 rframe = 0;
00321 
00322   smsg.reset(rframe, SENSOR_RESULT);
00323 
00324   SensorResult::SensorResultType type =
00325     sensorResult.getType();
00326 
00327   smsg.addInt32(type);
00328 
00329   smsg.addInt32(sensorResult.getStatus());
00330 
00331   
00332   switch(type)
00333     {
00334     case SensorResult::BUOY:
00335       {
00336         Point3D pos = sensorResult.getPosition();
00337         smsg.addInt32(int32(pos.x));
00338         smsg.addInt32(int32(pos.y));
00339         smsg.addInt32(int32(pos.z));
00340         break;
00341       }
00342     case SensorResult::PIPE:
00343       {
00344         Point3D pos = sensorResult.getPosition();
00345         smsg.addInt32(int32(pos.x));
00346         smsg.addInt32(int32(pos.y));
00347         smsg.addInt32(int32(pos.z));
00348         Angle ori = sensorResult.getOrientation();
00349         smsg.addDouble(ori.getVal());
00350         uint fnum = sensorResult.getFrameNum();
00351         smsg.addInt32(int32(fnum));
00352         break;
00353       }
00354     case SensorResult::BIN:
00355       {
00356         Point3D pos = sensorResult.getPosition();
00357         smsg.addInt32(int32(pos.x));
00358         smsg.addInt32(int32(pos.y));
00359         smsg.addInt32(int32(pos.z));
00360         break;
00361       }
00362     case SensorResult::PINGER:
00363       {
00364         Angle ori = sensorResult.getOrientation();
00365         smsg.addDouble(ori.getVal());
00366         break;
00367       }
00368     case SensorResult::SALIENCY:
00369       {
00370         Point3D pos = sensorResult.getPosition();
00371         smsg.addInt32(int32(pos.x));
00372         smsg.addInt32(int32(pos.y));
00373         smsg.addInt32(int32(pos.z));
00374         break;
00375       }
00376       default: LINFO("Unknown sensor result type: %d",type);
00377     }
00378 }
00379 
00380 
00381 
00382 
00383 
00384