seaBeeJoyStick-slave.C
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 #include "Beowulf/Beowulf.H"
00040 #include "Component/ModelManager.H"
00041 #include "Devices/JoyStick.H"
00042 #include "Util/Types.H"
00043 #include "Util/log.H"
00044 #include "Util/MathFunctions.H"
00045 #include "Raster/Raster.H"
00046 #include "SeaBee/SubController.H"
00047 #include "Media/FrameSeries.H"
00048 #include "Transport/FrameInfo.H"
00049 #include "Raster/GenericFrame.H"
00050 #include "Media/MediaOpts.H"
00051 #include "Image/CutPaste.H"
00052 #include "Image/DrawOps.H"
00053 #include "Image/ShapeOps.H"
00054
00055 #include <unistd.h>
00056 #include <signal.h>
00057 #include <math.h>
00058
00059 #define COM_B_NODE 0
00060 #define INIT_DONE 10001
00061 #define JS_AXIS_UPDATE 20000
00062 #define SUB_GUI_UPDATE 20001
00063 #define ABORT 90000
00064
00065 #define THRUSTER_UP_LEFT 0
00066 #define THRUSTER_UP_RIGHT 4
00067 #define THRUSTER_UP_BACK 2
00068 #define THRUSTER_FWD_RIGHT 3
00069 #define THRUSTER_FWD_LEFT 1
00070
00071 float currentXAxis = 0.0;
00072 float currentYAxis = 0.0;
00073
00074 float currentR = 0.0;
00075 float currentTheta = 0.0;
00076
00077
00078 volatile bool keepGoing = false;
00079 std::list<TCPmessage> inMessages;
00080 std::list<TCPmessage> outMessages;
00081
00082
00083 void checkInMessages
00084 ( nub::soft_ref<Beowulf> beo );
00085
00086 void packageGUIMessage
00087 ( nub::soft_ref<SubController> subController,
00088 Image<PixRGB<byte> > frontImg);
00089
00090
00091
00092 void terminate(int s) { LERROR("*** INTERRUPT ***"); keepGoing = false; }
00093
00094
00095
00096 int main( int argc, const char* argv[] )
00097 {
00098 MYLOGVERB = LOG_INFO;
00099
00100
00101 ModelManager manager("JoyStick Manager");
00102
00103
00104
00105 nub::soft_ref<Beowulf>
00106 beo(new Beowulf(manager, "Beowulf Slave", "BeowulfSlave", false));
00107 manager.addSubComponent(beo);
00108
00109 nub::soft_ref<SubController> subController(new SubController(manager));
00110 manager.addSubComponent(subController);
00111
00112
00113 nub::soft_ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00114 manager.addSubComponent(ifs);
00115
00116 manager.exportOptions(MC_RECURSE);
00117
00118
00119 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00120
00121 TCPmessage rmsg;
00122 TCPmessage smsg;
00123 int32 rframe = 0, raction = 0, rnode = -1;
00124
00125
00126 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00127 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00128 signal(SIGALRM, terminate);
00129
00130
00131 manager.start();
00132
00133
00134 while(!beo->receive(rnode, rmsg, rframe, raction, 5));
00135 int initval = uint(rmsg.getElementInt32());
00136 LINFO("got INIT: %d", initval);
00137
00138
00139 smsg.reset(rframe, INIT_DONE);
00140 beo->send(rnode, smsg);
00141
00142 keepGoing = true;
00143 subController->setMotorsOn(true);
00144
00145 while(keepGoing)
00146 {
00147
00148 checkInMessages(beo);
00149
00150 subController->setThruster(THRUSTER_FWD_RIGHT, (int)(clampValue(-currentYAxis + currentXAxis,-100.0,100.0)));
00151 subController->setThruster(THRUSTER_FWD_LEFT, (int)(clampValue(-currentYAxis - currentXAxis,-100.0,100.0)));
00152
00153 const FrameState is = ifs->updateNext();
00154 if (is == FRAME_COMPLETE)
00155 break;
00156
00157
00158 GenericFrame input = ifs->readFrame();
00159 if (!input.initialized())
00160 break;
00161 Image<PixRGB<byte> > frontImg = rescale(input.asRgb(), 320, 280);
00162
00163 packageGUIMessage(subController, frontImg);
00164
00165
00166 if(outMessages.size() > 0)
00167 {
00168 beo->send(-1, outMessages.front());
00169 outMessages.pop_front();
00170 }
00171
00172 }
00173
00174 subController->setMotorsOn(false);
00175
00176 manager.stop();
00177 return 0;
00178 }
00179
00180
00181 void checkInMessages
00182 ( nub::soft_ref<Beowulf> beo)
00183 {
00184 int32 rframe = 0, raction = 0, rnode = -1;
00185 TCPmessage rmsg;
00186
00187
00188 while(beo->receive(rnode, rmsg, rframe, raction, 5))
00189 {
00190 LINFO("COM_B: recieving a message: %d", raction);
00191
00192
00193 switch(raction)
00194 {
00195 case ABORT:
00196 {
00197 keepGoing = false; LINFO("Stop SeaBee COM-B");
00198 break;
00199 }
00200
00201 case JS_AXIS_UPDATE:
00202 {
00203 int32 num = rmsg.getElementInt32();
00204 float p = rmsg.getElementFloat();
00205 switch(num)
00206 {
00207 case 0:
00208 LINFO("X-Axis = %f", p);
00209 currentXAxis = p;
00210 break;
00211 case 1:
00212 LINFO("Y-Axis = %f", p);
00213 currentYAxis = p;
00214 break;
00215 case 2:
00216 LINFO("Depth = %f", p);
00217 break;
00218 default:
00219 LERROR("Unknown axis event recieved");
00220 }
00221
00222 break;
00223 }
00224 default:
00225 LFATAL("Unknown purpose");
00226 }
00227 }
00228 }
00229
00230
00231 void packageGUIMessage
00232 ( nub::soft_ref<SubController> subController,
00233 Image<PixRGB<byte> > frontImg)
00234 {
00235 TCPmessage smsg;
00236
00237 int32 sframe = 0;
00238 int32 saction = SUB_GUI_UPDATE;
00239
00240 smsg.reset(sframe, saction);
00241
00242 smsg.addInt32(int32(*(subController->getIntPressurePtr())));
00243 smsg.addInt32(int32(*(subController->getHeadingPtr())));
00244 smsg.addInt32(int32(*(subController->getPitchPtr())));
00245 smsg.addInt32(int32(*(subController->getRollPtr())));
00246 smsg.addInt32(int32(*(subController->getDepthPtr())));
00247 smsg.addInt32(int32(*(subController->getThruster_Up_Left_Ptr())));
00248 smsg.addInt32(int32(*(subController->getThruster_Up_Right_Ptr())));
00249 smsg.addInt32(int32(*(subController->getThruster_Up_Back_Ptr())));
00250 smsg.addInt32(int32(*(subController->getThruster_Fwd_Left_Ptr())));
00251 smsg.addInt32(int32(*(subController->getThruster_Fwd_Right_Ptr())));
00252
00253 smsg.addImage(frontImg);
00254
00255 outMessages.push_back(smsg);
00256
00257 }
00258
00259
00260
00261
00262
00263