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

ArModes.cpp

00001 /*
00002 ActivMedia Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004,2005 ActivMedia Robotics, LLC
00004 
00005 
00006      This program is free software; you can redistribute it and/or modify
00007      it under the terms of the GNU General Public License as published by
00008      the Free Software Foundation; either version 2 of the License, or
00009      (at your option) any later version.
00010 
00011      This program is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014      GNU General Public License for more details.
00015 
00016      You should have received a copy of the GNU General Public License
00017      along with this program; if not, write to the Free Software
00018      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 If you wish to redistribute ARIA under different terms, contact 
00021 ActivMedia Robotics for information about a commercial version of ARIA at 
00022 robots@activmedia.com or 
00023 ActivMedia Robotics, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
00024 
00025 */
00026 
00027 #include "ArExport.h"
00028 #include "ariaOSDef.h"
00029 #include "ArMode.h"
00030 #include "ArModes.h"
00031 #include "ArKeyHandler.h"
00032 #include "ArSonyPTZ.h"
00033 #include "ArVCC4.h"
00034 #include "ArDPPTU.h"
00035 #include "ArAMPTU.h"
00036 #include "ArSick.h"
00037 #include "ArAnalogGyro.h"
00038 #include "ArRobotConfigPacketReader.h"
00039 #include "ariaInternal.h"
00040 
00041 ArModeTeleop::ArModeTeleop(ArRobot *robot, const char *name, char key, char key2): 
00042   ArMode(robot, name, key, key2),
00043   myGroup(robot)
00044 {
00045   myGroup.deactivate();
00046 }
00047 
00048 ArModeTeleop::~ArModeTeleop()
00049 {
00050   
00051 }
00052 
00053 void ArModeTeleop::activate(void)
00054 {
00055   if (!baseActivate())
00056     return;
00057   myGroup.activateExclusive();
00058 }
00059 
00060 void ArModeTeleop::deactivate(void)
00061 {
00062   if (!baseDeactivate())
00063     return;
00064   myGroup.deactivate();
00065 }
00066 
00067 void ArModeTeleop::help(void)
00068 {
00069   ArLog::log(ArLog::Terse, 
00070            "Teleop mode will drive under your joystick or keyboard control.");
00071   ArLog::log(ArLog::Terse, 
00072              "It will not allow you to drive into obstacles it can see,");
00073   ArLog::log(ArLog::Terse, 
00074       "though if you are presistent you may be able to run into something.");
00075   ArLog::log(ArLog::Terse, "For joystick, hold in the trigger button and then move the joystick to drive.");
00076   ArLog::log(ArLog::Terse, "For keyboard control these are the keys and their actions:");
00077   ArLog::log(ArLog::Terse, "%13s:  speed up if forward or no motion, slow down if going backwards", "up arrow");
00078   ArLog::log(ArLog::Terse, "%13s:  slow down if going forwards, speed up if backward or no motion", "down arrow");
00079   ArLog::log(ArLog::Terse, "%13s:  turn left", "left arrow");
00080   ArLog::log(ArLog::Terse, "%13s:  turn right", "right arrow");
00081   ArLog::log(ArLog::Terse, "%13s:  stop", "space bar");
00082   printf("%10s %10s %10s %10s %10s %10s\n", "transVel", "rotVel", "x", "y", "th", "volts");
00083 }
00084 
00085 void ArModeTeleop::userTask(void)
00086 {
00087   printf("\r%10.0f %10.0f %10.0f %10.0f %10.1f %10.1f", myRobot->getVel(), 
00088          myRobot->getRotVel(), myRobot->getX(), myRobot->getY(), 
00089          myRobot->getTh(), myRobot->getRealBatteryVoltage());
00090 }
00091 
00092 ArModeUnguardedTeleop::ArModeUnguardedTeleop(ArRobot *robot,
00093                                                       const char *name, 
00094                                                       char key, char key2): 
00095   ArMode(robot, name, key, key2),
00096   myGroup(robot)
00097 {
00098   myGroup.deactivate();
00099 }
00100 
00101 ArModeUnguardedTeleop::~ArModeUnguardedTeleop()
00102 {
00103   
00104 }
00105 
00106 void ArModeUnguardedTeleop::activate(void)
00107 {
00108   if (!baseActivate())
00109     return;
00110   myGroup.activateExclusive();
00111 }
00112 
00113 void ArModeUnguardedTeleop::deactivate(void)
00114 {
00115   if (!baseDeactivate())
00116     return;
00117   myGroup.deactivate();
00118 }
00119 
00120 void ArModeUnguardedTeleop::help(void)
00121 {
00122   ArLog::log(ArLog::Terse, 
00123            "Unguarded teleop mode will drive under your joystick or keyboard control.");
00124   ArLog::log(ArLog::Terse, 
00125              "\n### THIS MODE IS UNGUARDED AND UNSAFE, BE CAREFUL DRIVING");
00126   ArLog::log(ArLog::Terse,
00127              "\nAs it will allow you to drive into things or down stairs.");
00128   ArLog::log(ArLog::Terse, "For joystick, hold in the trigger button and then move the joystick to drive.");
00129   ArLog::log(ArLog::Terse, "For keyboard control these are the keys and their actions:");
00130   ArLog::log(ArLog::Terse, "%13s:  speed up if forward or no motion, slow down if going backwards", "up arrow");
00131   ArLog::log(ArLog::Terse, "%13s:  slow down if going forwards, speed up if backward or no motion", "down arrow");
00132   ArLog::log(ArLog::Terse, "%13s:  turn left", "left arrow");
00133   ArLog::log(ArLog::Terse, "%13s:  turn right", "right arrow");
00134   ArLog::log(ArLog::Terse, "%13s:  stop", "space bar");
00135   printf("%10s %10s %10s %10s %10s %10s\n", "transVel", "rotVel", "x", "y", "th", "volts");
00136 }
00137 
00138 void ArModeUnguardedTeleop::userTask(void)
00139 {
00140   printf("\r%10.0f %10.0f %10.0f %10.0f %10.1f %10.1f", myRobot->getVel(), 
00141          myRobot->getRotVel(), myRobot->getX(), myRobot->getY(), 
00142          myRobot->getTh(), myRobot->getRealBatteryVoltage());
00143 }
00144 
00145 ArModeWander::ArModeWander(ArRobot *robot, const char *name, char key, char key2): 
00146   ArMode(robot, name, key, key2),
00147   myGroup(robot)
00148 {
00149   myGroup.deactivate();
00150 }
00151 
00152 ArModeWander::~ArModeWander()
00153 {
00154   
00155 }
00156 
00157 void ArModeWander::activate(void)
00158 {
00159   if (!baseActivate())
00160     return;
00161   myGroup.activateExclusive();
00162 }
00163 
00164 void ArModeWander::deactivate(void)
00165 {
00166   if (!baseDeactivate())
00167     return;
00168   myGroup.deactivate(); 
00169 }
00170 
00171 void ArModeWander::help(void)
00172 {
00173   ArLog::log(ArLog::Terse, "Wander mode will simply drive around forwards until it finds an obstacle,");
00174   ArLog::log(ArLog::Terse, "then it will turn until its clear, and continue.");
00175   printf("%10s %10s %10s %10s %10s %10s\n", "transVel", "rotVel", "x", "y", "th", "volts");
00176 }
00177 
00178 void ArModeWander::userTask(void)
00179 {
00180   printf("\r%10.0f %10.0f %10.0f %10.0f %10.1f %10.1f", myRobot->getVel(), 
00181          myRobot->getRotVel(), myRobot->getX(), myRobot->getY(), 
00182          myRobot->getTh(), myRobot->getRealBatteryVoltage());
00183 }
00184 
00185 ArModeGripper::ArModeGripper(ArRobot *robot, const char *name, 
00186                                       char key, char key2): 
00187   ArMode(robot, name, key, key2),
00188   myGripper(robot),
00189   myOpenCB(this, &ArModeGripper::open),
00190   myCloseCB(this, &ArModeGripper::close),
00191   myUpCB(this, &ArModeGripper::up),
00192   myDownCB(this, &ArModeGripper::down),
00193   myStopCB(this, &ArModeGripper::stop),
00194   myExerciseCB(this, &ArModeGripper::exercise)
00195 {
00196   myExercising = false;
00197 }
00198 
00199 ArModeGripper::~ArModeGripper()
00200 {
00201   
00202 }
00203 
00204 void ArModeGripper::activate(void)
00205 {
00206   if (!baseActivate())
00207     return;
00208 
00209   addKeyHandler(ArKeyHandler::UP, &myUpCB);
00210   addKeyHandler(ArKeyHandler::DOWN, &myDownCB);
00211   addKeyHandler(ArKeyHandler::RIGHT, &myOpenCB);
00212   addKeyHandler(ArKeyHandler::LEFT, &myCloseCB);  
00213   addKeyHandler(ArKeyHandler::SPACE, &myStopCB);
00214   addKeyHandler('e', &myExerciseCB);
00215   addKeyHandler('E', &myExerciseCB);
00216 }
00217 
00218 void ArModeGripper::deactivate(void)
00219 {
00220   if (!baseDeactivate())
00221     return;
00222 
00223   remKeyHandler(&myUpCB);
00224   remKeyHandler(&myDownCB);
00225   remKeyHandler(&myOpenCB);
00226   remKeyHandler(&myCloseCB);
00227   remKeyHandler(&myStopCB);
00228   remKeyHandler(&myExerciseCB);
00229 }
00230 
00231 void ArModeGripper::userTask(void)
00232 {
00233   int val;
00234   printf("\r");
00235   if (myGripper.getBreakBeamState() & 2) // outer 
00236     printf("%13s", "blocked");
00237   else 
00238     printf("%13s", "clear");
00239   if (myGripper.getBreakBeamState() & 1) // inner
00240     printf("%13s", "blocked");
00241   else 
00242     printf("%13s", "clear");
00243   val = myGripper.getGripState(); // gripper portion
00244   if (val == 0)
00245     printf("%13s", "between");
00246   else if (val == 1)
00247     printf("%13s", "open");
00248   else if (val == 2)
00249     printf("%13s", "closed");
00250   if (myGripper.isLiftMaxed()) // lift
00251     printf("%13s", "maxed");
00252   else
00253     printf("%13s", "clear");
00254   val = myGripper.getPaddleState(); // paddle section
00255   if (val & 1) // left paddle
00256     printf("%13s", "triggered");
00257   else
00258     printf("%13s", "clear");
00259   if (val & 2) // right paddle
00260     printf("%13s", "triggered");
00261   else
00262     printf("%13s", "clear");
00263   // exercise the thing
00264   if (myExercising)
00265   {
00266     switch (myExerState) {
00267     case UP_OPEN:
00268       if ((myLastExer.mSecSince() > 3000 && myGripper.isLiftMaxed()) ||
00269           myLastExer.mSecSince() > 30000)
00270       {
00271         myGripper.gripClose();
00272         myExerState = UP_CLOSE;
00273         myLastExer.setToNow();
00274         if (myLastExer.mSecSince() > 30000)
00275           ArLog::log(ArLog::Terse, "\nLift took more than thirty seconds to raise, there is probably a problem with it.\n");
00276       }
00277       break;
00278     case UP_CLOSE:
00279       if (myGripper.getGripState() == 2 || myLastExer.mSecSince() > 10000)
00280       {
00281         myGripper.liftDown();
00282         myExerState = DOWN_CLOSE;
00283         myLastExer.setToNow();
00284         if (myLastExer.mSecSince() > 10000)
00285           ArLog::log(ArLog::Terse, "\nGripper took more than 10 seconds to close, there is probably a problem with it.\n");
00286       }
00287       break;
00288     case DOWN_CLOSE:
00289       if ((myLastExer.mSecSince() > 3000 && myGripper.isLiftMaxed()) ||
00290           myLastExer.mSecSince() > 30000)
00291       {
00292         myGripper.gripOpen();
00293         myExerState = DOWN_OPEN;
00294         myLastExer.setToNow();
00295         if (myLastExer.mSecSince() > 30000)
00296           ArLog::log(ArLog::Terse, "\nLift took more than thirty seconds to raise, there is probably a problem with it.\n");
00297       }
00298       break;
00299     case DOWN_OPEN:
00300       if (myGripper.getGripState() == 1 || myLastExer.mSecSince() > 10000)
00301       {
00302         myGripper.liftUp();
00303         myExerState = UP_OPEN;
00304         myLastExer.setToNow();
00305         if (myLastExer.mSecSince() > 10000)
00306           ArLog::log(ArLog::Terse, "\nGripper took more than 10 seconds to open, there is probably a problem with it.\n");
00307       }
00308       break;
00309     }      
00310     
00311   }
00312 }
00313 
00314 void ArModeGripper::open(void)
00315 {
00316   if (myExercising == true)
00317   {
00318     myExercising = false;
00319     myGripper.gripperHalt();
00320   }
00321   myGripper.gripOpen();
00322 }
00323 
00324 void ArModeGripper::close(void)
00325 {
00326   if (myExercising == true)
00327   {
00328     myExercising = false;
00329     myGripper.gripperHalt();
00330   }
00331   myGripper.gripClose();
00332 }
00333 
00334 void ArModeGripper::up(void)
00335 {
00336   if (myExercising == true)
00337   {
00338     myExercising = false;
00339     myGripper.gripperHalt();
00340   }
00341   myGripper.liftUp();
00342 }
00343 
00344 void ArModeGripper::down(void)
00345 {
00346   if (myExercising == true)
00347   {
00348     myExercising = false;
00349     myGripper.gripperHalt();
00350   }
00351   myGripper.liftDown();
00352 }
00353 
00354 void ArModeGripper::stop(void)
00355 {
00356   if (myExercising == true)
00357   {
00358     myExercising = false;
00359     myGripper.gripperHalt();
00360   }
00361   myGripper.gripperHalt();
00362 }
00363 
00364 void ArModeGripper::exercise(void)
00365 {
00366   if (myExercising == false)
00367   {
00368     ArLog::log(ArLog::Terse, 
00369        "\nGripper will now be exercised until another command is given.");
00370     myExercising = true;
00371     myExerState = UP_OPEN;
00372     myGripper.liftUp();
00373     myGripper.gripOpen();
00374     myLastExer.setToNow();
00375   }
00376 }
00377 
00378 void ArModeGripper::help(void)
00379 {
00380   ArLog::log(ArLog::Terse, 
00381              "Gripper mode will let you control or exercise the gripper.");
00382   ArLog::log(ArLog::Terse, 
00383       "If you start exercising the gripper it will stop your other commands.");
00384   ArLog::log(ArLog::Terse, 
00385              "If you use other commands it will interrupt the exercising.");
00386   ArLog::log(ArLog::Terse, "%13s:  raise lift", "up arrow");
00387   ArLog::log(ArLog::Terse, "%13s:  lower lift", "down arrow");
00388   ArLog::log(ArLog::Terse, "%13s:  close gripper paddles", "left arrow");
00389   ArLog::log(ArLog::Terse, "%13s:  open gripper paddles", "right arrow");
00390   ArLog::log(ArLog::Terse, "%13s:  stop gripper paddles and lift", 
00391              "space bar");
00392   ArLog::log(ArLog::Terse, "%13s:  exercise the gripper", "'e' or 'E'");
00393   ArLog::log(ArLog::Terse, "\nGripper status:");
00394   ArLog::log(ArLog::Terse, "%13s%13s%13s%13s%13s%13s", "BB outer", "BB inner",
00395              "Paddles", "Lift", "LeftPaddle", "RightPaddle");
00396   
00397 }
00398 
00399 
00400 
00401 ArModeCamera::ArModeCamera(ArRobot *robot, const char *name, 
00402                                       char key, char key2): 
00403   ArMode(robot, name, key, key2),
00404   myUpCB(this, &ArModeCamera::up),
00405   myDownCB(this, &ArModeCamera::down),
00406   myLeftCB(this, &ArModeCamera::left),
00407   myRightCB(this, &ArModeCamera::right),
00408   myCenterCB(this, &ArModeCamera::center),
00409   myZoomInCB(this, &ArModeCamera::zoomIn),  
00410   myZoomOutCB(this, &ArModeCamera::zoomOut),
00411   myExerciseCB(this, &ArModeCamera::exercise),
00412   mySonyCB(this, &ArModeCamera::sony),
00413   myCanonCB(this, &ArModeCamera::canon),
00414   myDpptuCB(this, &ArModeCamera::dpptu),
00415   myAmptuCB(this, &ArModeCamera::amptu),
00416   myCanonInvertedCB(this, &ArModeCamera::canonInverted),
00417   mySonySerialCB(this, &ArModeCamera::sonySerial),
00418   myCanonSerialCB(this, &ArModeCamera::canonSerial),
00419   myDpptuSerialCB(this, &ArModeCamera::dpptuSerial),
00420   myAmptuSerialCB(this, &ArModeCamera::amptuSerial),
00421   myCanonInvertedSerialCB(this, &ArModeCamera::canonInvertedSerial),
00422   myCom1CB(this, &ArModeCamera::com1),
00423   myCom2CB(this, &ArModeCamera::com2),
00424   myCom3CB(this, &ArModeCamera::com3),
00425   myCom4CB(this, &ArModeCamera::com4),
00426   myAux1CB(this, &ArModeCamera::aux1),
00427   myAux2CB(this, &ArModeCamera::aux2)
00428 {
00429   myState = STATE_CAMERA;
00430   myExercising = false;
00431 }
00432 
00433 ArModeCamera::~ArModeCamera()
00434 {
00435   
00436 }
00437 
00438 void ArModeCamera::activate(void)
00439 {
00440   ArKeyHandler *keyHandler;
00441   if (!baseActivate())
00442     return;
00443   // see if there is already a keyhandler, if not something is wrong
00444   // (since constructor should make one if there isn't one yet
00445   if ((keyHandler = Aria::getKeyHandler()) == NULL)
00446   {
00447     ArLog::log(ArLog::Terse,"ArModeCamera::activate: There should already be a key handler, but there isn't... mode won't work");
00448     return;
00449   }
00450   if (myState == STATE_CAMERA)
00451     takeCameraKeys();
00452   else if (myState == STATE_PORT)
00453     takePortKeys();
00454   else if (myState == STATE_MOVEMENT)
00455     takeMovementKeys();
00456   else
00457     ArLog::log(ArLog::Terse,"ArModeCamera in bad state.");
00458   
00459 }
00460 
00461 void ArModeCamera::deactivate(void)
00462 {
00463   if (!baseDeactivate())
00464     return;
00465   if (myState == STATE_CAMERA)
00466     giveUpCameraKeys();
00467   else if (myState == STATE_PORT)
00468     giveUpPortKeys();
00469   else if (myState == STATE_MOVEMENT)
00470     giveUpMovementKeys();
00471   else
00472     ArLog::log(ArLog::Terse,"ArModeCamera in bad state.");
00473 }
00474 
00475 void ArModeCamera::userTask(void)
00476 {
00477   if (myExercising && myCam != NULL && myLastExer.mSecSince() > 10000)
00478   {
00479     switch (myExerState) {
00480     case CENTER:
00481       myCam->panTilt(myCam->getMaxNegPan(), myCam->getMaxPosTilt());
00482       myExerState = UP_LEFT;
00483       myLastExer.setToNow();
00484       break;
00485     case UP_LEFT:
00486       myCam->panTilt(myCam->getMaxPosPan(), myCam->getMaxPosTilt());
00487       myExerState = UP_RIGHT;
00488       myLastExer.setToNow();
00489       break;
00490     case UP_RIGHT:
00491       myCam->panTilt(myCam->getMaxPosPan(), myCam->getMaxNegTilt());
00492       myExerState = DOWN_RIGHT;
00493       myLastExer.setToNow();
00494       break;
00495     case DOWN_RIGHT:
00496       myCam->panTilt(myCam->getMaxNegPan(), myCam->getMaxNegTilt());
00497       myExerState = DOWN_LEFT;
00498       myLastExer.setToNow();
00499       break;
00500     case DOWN_LEFT:
00501       myCam->panTilt(0, 0);
00502       myExerState = CENTER;
00503       myLastExer.setToNow();
00504       break;
00505     }      
00506   }
00507   if (myExercising && myCam != NULL && myCam->canZoom() && 
00508       myLastExerZoomed.mSecSince() > 35000)
00509   {
00510     if (myExerZoomedIn)
00511       myCam->zoom(myCam->getMinZoom());
00512     else
00513       myCam->zoom(myCam->getMaxZoom());
00514     myLastExerZoomed.setToNow();
00515   }
00516 }
00517 
00518 void ArModeCamera::left(void)
00519 {
00520   if (myExercising == true)
00521     myExercising = false;
00522   myCam->panRel(-5);
00523 }
00524 
00525 void ArModeCamera::right(void)
00526 {
00527   if (myExercising == true)
00528     myExercising = false;
00529   myCam->panRel(5);
00530 }
00531 
00532 void ArModeCamera::up(void)
00533 {
00534   if (myExercising == true)
00535     myExercising = false;
00536   myCam->tiltRel(3);
00537 }
00538 
00539 void ArModeCamera::down(void)
00540 {  
00541   if (myExercising == true)
00542     myExercising = false;
00543   myCam->tiltRel(-3);
00544 }
00545 
00546 void ArModeCamera::center(void)
00547 {
00548   if (myExercising == true)
00549     myExercising = false;
00550   myCam->panTilt(0, 0);
00551   myCam->zoom(myCam->getMinZoom());
00552 }
00553 
00554 void ArModeCamera::exercise(void)
00555 {
00556   if (myExercising == false)
00557   {
00558     ArLog::log(ArLog::Terse, 
00559        "Camera will now be exercised until another command is given.");
00560     myExercising = true;
00561     myExerState = UP_LEFT;
00562     myLastExer.setToNow();
00563     myCam->panTilt(myCam->getMaxNegPan(), myCam->getMaxPosTilt());
00564     myLastExerZoomed.setToNow();
00565     myExerZoomedIn = true;
00566     if (myCam->canZoom())
00567       myCam->zoom(myCam->getMaxZoom());
00568   }
00569 }
00570 
00571 void ArModeCamera::help(void)
00572 {
00573   ArLog::log(ArLog::Terse, 
00574              "Camera mode will let you control or exercise the camera.");
00575   ArLog::log(ArLog::Terse, 
00576       "If you start exercising the camera it will stop your other commands.");
00577   if (myState == STATE_CAMERA)
00578     helpCameraKeys();
00579   else if (myState == STATE_PORT)
00580     helpPortKeys();
00581   else if (myState == STATE_MOVEMENT)
00582     helpMovementKeys();
00583   else
00584     ArLog::log(ArLog::Terse, "Something is horribly wrong and mode camera is in no state.");
00585 }
00586 
00587 void ArModeCamera::zoomIn(void)
00588 {
00589   if (myCam->canZoom())
00590   {
00591     myCam->zoom(myCam->getZoom() + 
00592          ArMath::roundInt((myCam->getMaxZoom() - myCam->getMinZoom()) * .01));
00593   }
00594 }
00595 
00596 void ArModeCamera::zoomOut(void)
00597 {
00598   if (myCam->canZoom())
00599   {
00600     myCam->zoom(myCam->getZoom() - 
00601         ArMath::roundInt((myCam->getMaxZoom() - myCam->getMinZoom()) * .01));
00602   }
00603 }
00604 
00605 void ArModeCamera::sony(void)
00606 {
00607   myCam = new ArSonyPTZ(myRobot);
00608   ArLog::log(ArLog::Terse, "\nSony selected, now need to select the aux port.");
00609   cameraToAux();
00610 }
00611 
00612 void ArModeCamera::canon(void)
00613 {
00614   myCam = new ArVCC4(myRobot);
00615   ArLog::log(ArLog::Terse, "\nCanon selected, now need to select the aux port.");
00616   cameraToAux();
00617 }
00618 
00619 void ArModeCamera::dpptu(void)
00620 {
00621   myCam = new ArDPPTU(myRobot);
00622   ArLog::log(ArLog::Terse, "\nDPPTU selected, now need to select the aux port.");
00623   cameraToAux();
00624 }
00625 
00626 void ArModeCamera::amptu(void)
00627 {
00628   myCam = new ArAMPTU(myRobot);
00629   ArLog::log(ArLog::Terse, 
00630              "\nActivMedia Pan Tilt Unit selected, now need to select the aux port.");
00631   cameraToAux();
00632 }
00633 
00634 void ArModeCamera::canonInverted(void)
00635 {
00636   myCam = new ArVCC4(myRobot, true);
00637   ArLog::log(ArLog::Terse, "\nInverted Canon selected, now need to select the aux port.");
00638   cameraToAux();
00639 }
00640 
00641 void ArModeCamera::sonySerial(void)
00642 {
00643   myCam = new ArSonyPTZ(myRobot);
00644   ArLog::log(ArLog::Terse, "\nSony selected, now need to select serial port.");
00645   cameraToPort();
00646 }
00647 
00648 void ArModeCamera::canonSerial(void)
00649 {
00650   myCam = new ArVCC4(myRobot);
00651   ArLog::log(ArLog::Terse, 
00652              "\nCanon VCC4 selected, now need to select serial port.");
00653   cameraToPort();
00654 }
00655 
00656 void ArModeCamera::dpptuSerial(void)
00657 {
00658   myCam = new ArDPPTU(myRobot);
00659   ArLog::log(ArLog::Terse, "\nDPPTU selected, now need to select serial port.");
00660   cameraToPort();
00661 }
00662 
00663 void ArModeCamera::amptuSerial(void)
00664 {
00665   myCam = new ArAMPTU(myRobot);
00666   ArLog::log(ArLog::Terse, "\nAMPTU selected, now need to select serial port.");
00667   cameraToPort();
00668 }
00669 
00670 void ArModeCamera::canonInvertedSerial(void)
00671 {
00672   myCam = new ArVCC4(myRobot, true);
00673   ArLog::log(ArLog::Terse, 
00674              "\nInverted Canon VCC4 selected, now need to select serial port.");
00675   cameraToPort();
00676 }
00677 
00678 void ArModeCamera::com1(void)
00679 {
00680   myConn.setPort(ArUtil::COM1);
00681   portToMovement();
00682 }
00683 
00684 void ArModeCamera::com2(void)
00685 {
00686   myConn.setPort(ArUtil::COM2);
00687   portToMovement();
00688 }
00689 
00690 void ArModeCamera::com3(void)
00691 {
00692   myConn.setPort(ArUtil::COM3);
00693   portToMovement();
00694 }
00695 
00696 void ArModeCamera::com4(void)
00697 {
00698   myConn.setPort(ArUtil::COM4);
00699   portToMovement();
00700 }
00701 
00702 void ArModeCamera::aux1(void)
00703 {
00704   myCam->setAuxPort(1);
00705   auxToMovement();
00706 }
00707 void ArModeCamera::aux2(void)
00708 {
00709   myCam->setAuxPort(2);
00710   auxToMovement();
00711 }
00712 
00713 void ArModeCamera::cameraToMovement(void)
00714 {
00715   myState = STATE_MOVEMENT;
00716   myCam->init();
00717   myRobot->setPTZ(myCam);
00718   giveUpCameraKeys();
00719   takeMovementKeys();
00720   helpMovementKeys();
00721 }
00722 
00723 void ArModeCamera::cameraToPort(void)
00724 {
00725   myState = STATE_PORT;
00726   giveUpCameraKeys();
00727   takePortKeys();
00728   helpPortKeys();
00729 }
00730 
00731 void ArModeCamera::cameraToAux(void)
00732 {
00733   giveUpCameraKeys();
00734   takeAuxKeys();
00735   helpAuxKeys();
00736 }
00737 
00738 void ArModeCamera::portToMovement(void)
00739 {
00740   if (!myConn.openSimple())
00741   {
00742     ArLog::log(ArLog::Terse, 
00743                "\n\nCould not open camera on that port, try another port.\n");
00744     helpPortKeys();
00745     return;
00746   }
00747   myCam->setDeviceConnection(&myConn);
00748   myCam->init();
00749   myRobot->setPTZ(myCam);
00750   myState = STATE_MOVEMENT;
00751   giveUpPortKeys();
00752   takeMovementKeys();
00753   helpMovementKeys();
00754 }
00755 
00756 void ArModeCamera::auxToMovement(void)
00757 {
00758   myCam->init();
00759   myRobot->setPTZ(myCam);
00760   myState = STATE_MOVEMENT;
00761   giveUpAuxKeys();
00762   takeMovementKeys();
00763   helpMovementKeys();
00764 }
00765 
00766 void ArModeCamera::takeCameraKeys(void)
00767 {
00768   addKeyHandler('1', &mySonyCB);
00769   addKeyHandler('2', &myCanonCB);
00770   addKeyHandler('3', &myDpptuCB);
00771   addKeyHandler('4', &myAmptuCB);
00772   addKeyHandler('5', &myCanonInvertedCB);
00773   addKeyHandler('!', &mySonySerialCB);
00774   addKeyHandler('@', &myCanonSerialCB);
00775   addKeyHandler('#', &myDpptuSerialCB);
00776   addKeyHandler('$', &myAmptuSerialCB);
00777   addKeyHandler('%', &myCanonInvertedSerialCB);
00778 }
00779 
00780 void ArModeCamera::giveUpCameraKeys(void)
00781 {
00782   remKeyHandler(&myCanonCB);
00783   remKeyHandler(&mySonyCB);
00784   remKeyHandler(&myDpptuCB);
00785   remKeyHandler(&myAmptuCB);
00786   remKeyHandler(&myCanonInvertedCB);
00787   remKeyHandler(&mySonySerialCB);
00788   remKeyHandler(&myCanonSerialCB);
00789   remKeyHandler(&myDpptuSerialCB);
00790   remKeyHandler(&myAmptuSerialCB);
00791   remKeyHandler(&myCanonInvertedSerialCB);
00792 }
00793 
00794 void ArModeCamera::helpCameraKeys(void)
00795 {
00796   ArLog::log(ArLog::Terse, 
00797              "You now need to select what type of camera you have.");
00798   ArLog::log(ArLog::Terse, 
00799              "%13s: select a SONY PTZ camera attached to the robot", "'1'");
00800   ArLog::log(ArLog::Terse, 
00801              "%13s: select a Canon VCC4 camera attached to the robot", "'2'");
00802   ArLog::log(ArLog::Terse, 
00803              "%13s: select a DPPTU camera attached to the robot", "'3'");
00804   ArLog::log(ArLog::Terse, 
00805              "%13s: select an AMPTU camera attached to the robot", "'4'");
00806   ArLog::log(ArLog::Terse, 
00807              "%13s: select an inverted Canon VCC4 camera attached to the robot", "'5'");
00808 
00809   ArLog::log(ArLog::Terse, 
00810              "%13s: select a SONY PTZ camera attached to a serial port", 
00811              "'!'");
00812   ArLog::log(ArLog::Terse, 
00813              "%13s: select a Canon VCC4 camera attached to a serial port", 
00814              "'@'");
00815   ArLog::log(ArLog::Terse, 
00816              "%13s: select a DPPTU camera attached to a serial port",
00817              "'#'");
00818   ArLog::log(ArLog::Terse, 
00819              "%13s: select an AMPTU camera attached to a serial port", 
00820              "'$'");
00821   ArLog::log(ArLog::Terse, 
00822              "%13s: select an inverted Canon VCC4 camera attached to a serial port", 
00823              "'%'");
00824 }
00825 
00826 void ArModeCamera::takePortKeys(void)
00827 {
00828   addKeyHandler('1', &myCom1CB);
00829   addKeyHandler('2', &myCom2CB);
00830   addKeyHandler('3', &myCom3CB);
00831   addKeyHandler('4', &myCom4CB);
00832 }
00833 
00834 void ArModeCamera::giveUpPortKeys(void)
00835 {
00836   remKeyHandler(&myCom1CB);
00837   remKeyHandler(&myCom2CB);
00838   remKeyHandler(&myCom3CB);
00839   remKeyHandler(&myCom4CB);
00840 }
00841 
00842 void ArModeCamera::helpPortKeys(void)
00843 {
00844   ArLog::log(ArLog::Terse, 
00845              "You now need to select what port your camera is on.");
00846   ArLog::log(ArLog::Terse, "%13s:  select COM1 or /dev/ttyS0", "'1'");
00847   ArLog::log(ArLog::Terse, "%13s:  select COM2 or /dev/ttyS1", "'2'");
00848   ArLog::log(ArLog::Terse, "%13s:  select COM3 or /dev/ttyS2", "'3'");
00849   ArLog::log(ArLog::Terse, "%13s:  select COM4 or /dev/ttyS3", "'4'");
00850 }
00851 
00852 void ArModeCamera::takeAuxKeys(void)
00853 {
00854   addKeyHandler('1', &myAux1CB);
00855   addKeyHandler('2', &myAux2CB);
00856 }
00857 
00858 void ArModeCamera::giveUpAuxKeys(void)
00859 {
00860   remKeyHandler(&myAux1CB);
00861   remKeyHandler(&myAux2CB);
00862 }
00863 
00864 void ArModeCamera::helpAuxKeys(void)
00865 {
00866   ArLog::log(ArLog::Terse,
00867              "You now need to select what aux port your camera is on.");
00868   ArLog::log(ArLog::Terse, "%13s:  select AUX1", "'1'");
00869   ArLog::log(ArLog::Terse, "%13s:  select AUX2", "'2'");
00870 }
00871 
00872 void ArModeCamera::takeMovementKeys(void)
00873 {
00874   addKeyHandler(ArKeyHandler::UP, &myUpCB);
00875   addKeyHandler(ArKeyHandler::DOWN, &myDownCB);
00876   addKeyHandler(ArKeyHandler::LEFT, &myLeftCB);
00877   addKeyHandler(ArKeyHandler::RIGHT, &myRightCB);
00878   addKeyHandler(ArKeyHandler::SPACE, &myCenterCB);
00879   addKeyHandler('e', &myExerciseCB);
00880   addKeyHandler('E', &myExerciseCB);
00881   if (myCam->canZoom())
00882   {
00883     addKeyHandler('z', &myZoomInCB);
00884     addKeyHandler('Z', &myZoomInCB);
00885     addKeyHandler('x', &myZoomOutCB);
00886     addKeyHandler('X', &myZoomOutCB);
00887   }
00888 }
00889 
00890 void ArModeCamera::giveUpMovementKeys(void)
00891 {
00892   remKeyHandler(&myUpCB);
00893   remKeyHandler(&myDownCB);
00894   remKeyHandler(&myLeftCB);
00895   remKeyHandler(&myRightCB);
00896   remKeyHandler(&myCenterCB);
00897   remKeyHandler(&myExerciseCB);
00898   if (myCam->canZoom())
00899   {
00900     remKeyHandler(&myZoomInCB);
00901     remKeyHandler(&myZoomOutCB);
00902   }
00903 }
00904 
00905 void ArModeCamera::helpMovementKeys(void)
00906 {
00907   ArLog::log(ArLog::Terse, 
00908              "Camera mode will now let you move the camera.");
00909   ArLog::log(ArLog::Terse, "%13s:  tilt camera up", "up arrow");
00910   ArLog::log(ArLog::Terse, "%13s:  tilt camera down", "down arrow");
00911   ArLog::log(ArLog::Terse, "%13s:  pan camera left", "left arrow");
00912   ArLog::log(ArLog::Terse, "%13s:  pan camera right", "right arrow");
00913   ArLog::log(ArLog::Terse, "%13s:  center camera and zoom out", 
00914              "space bar");
00915   ArLog::log(ArLog::Terse, "%13s:  exercise the camera", "'e' or 'E'");
00916   if (myCam->canZoom())
00917   {
00918     ArLog::log(ArLog::Terse, "%13s:  zoom in", "'z' or 'Z'");
00919     ArLog::log(ArLog::Terse, "%13s:  zoom out", "'x' or 'X'");
00920   }
00921 }
00922 
00923 ArModeSonar::ArModeSonar(ArRobot *robot, const char *name, char key,
00924                                   char key2) :
00925   ArMode(robot, name, key, key2),
00926   myAllSonarCB(this, &ArModeSonar::allSonar),
00927   myFirstSonarCB(this, &ArModeSonar::firstSonar),
00928   mySecondSonarCB(this, &ArModeSonar::secondSonar),
00929   myThirdSonarCB(this, &ArModeSonar::thirdSonar),
00930   myFourthSonarCB(this, &ArModeSonar::fourthSonar)
00931 {
00932   myState = STATE_FIRST;
00933 }
00934 
00935 ArModeSonar::~ArModeSonar()
00936 {
00937 
00938 }
00939 
00940 void ArModeSonar::activate(void)
00941 {
00942   if (!baseActivate())
00943     return;
00944   addKeyHandler('1', &myAllSonarCB);
00945   addKeyHandler('2', &myFirstSonarCB);
00946   addKeyHandler('3', &mySecondSonarCB);
00947   addKeyHandler('4', &myThirdSonarCB);
00948   addKeyHandler('5', &myFourthSonarCB);
00949 }
00950 
00951 void ArModeSonar::deactivate(void)
00952 {
00953   if (!baseDeactivate())
00954     return;
00955   remKeyHandler(&myAllSonarCB);
00956   remKeyHandler(&myFirstSonarCB);
00957   remKeyHandler(&mySecondSonarCB);
00958   remKeyHandler(&myThirdSonarCB);
00959   remKeyHandler(&myFourthSonarCB);
00960 }
00961 
00962 void ArModeSonar::help(void)
00963 {
00964   int i;
00965   ArLog::log(ArLog::Terse, "This mode displays different segments of sonar.");
00966   ArLog::log(ArLog::Terse, 
00967              "You can use these keys to switch what is displayed:");
00968   ArLog::log(ArLog::Terse, "%13s: display all sonar", "'1'");
00969   ArLog::log(ArLog::Terse, "%13s: display sonar 0 - 7", "'2'");
00970   ArLog::log(ArLog::Terse, "%13s: display sonar 8 - 15", "'3'");
00971   ArLog::log(ArLog::Terse, "%13s: display sonar 16 - 23", "'4'");
00972   ArLog::log(ArLog::Terse, "%13s: display sonar 24 - 31", "'5'");
00973   ArLog::log(ArLog::Terse, "Sonar readings:");
00974   if (myState == STATE_ALL)
00975   {
00976     ArLog::log(ArLog::Terse, "Displaying all sonar.");
00977     for (i = 0; i < myRobot->getNumSonar(); ++i)
00978       printf("%6d", i); 
00979   }
00980   else if (myState == STATE_FIRST)
00981   {
00982     ArLog::log(ArLog::Terse, "Displaying 0-7 sonar.");
00983     for (i = 0; i < myRobot->getNumSonar() && i <= 7; ++i)
00984       printf("%6d", i); 
00985   }
00986   else if (myState == STATE_SECOND)
00987   {
00988     ArLog::log(ArLog::Terse, "Displaying 8-15 sonar.");
00989     for (i = 8; i < myRobot->getNumSonar() && i <= 15; ++i)
00990       printf("%6d", i); 
00991   }
00992   else if (myState == STATE_THIRD)
00993   {
00994     ArLog::log(ArLog::Terse, "Displaying 16-23 sonar.");
00995     for (i = 16; i < myRobot->getNumSonar() && i <= 23; ++i)
00996       printf("%6d", i); 
00997   }
00998   else if (myState == STATE_FOURTH)
00999   {
01000     ArLog::log(ArLog::Terse, "Displaying 24-31 sonar.");
01001     for (i = 24; i < myRobot->getNumSonar() && i <= 31; ++i)
01002       printf("%6d", i); 
01003   }
01004   printf("\n");
01005 }
01006 
01007 void ArModeSonar::userTask(void)
01008 {
01009   int i;
01010   printf("\r");
01011   if (myState == STATE_ALL)
01012   {
01013     for (i = 0; i < myRobot->getNumSonar(); ++i)
01014       printf("%6d", myRobot->getSonarRange(i)); 
01015   }
01016   else if (myState == STATE_FIRST)
01017   {
01018      for (i = 0; i < myRobot->getNumSonar() && i <= 7; ++i)
01019       printf("%6d", myRobot->getSonarRange(i));
01020   }
01021   else if (myState == STATE_SECOND)
01022   {
01023      for (i = 8; i < myRobot->getNumSonar() && i <= 15; ++i)
01024       printf("%6d", myRobot->getSonarRange(i));
01025   }
01026   else if (myState == STATE_THIRD)
01027   {
01028     for (i = 16; i < myRobot->getNumSonar() && i <= 23; ++i)
01029       printf("%6d", myRobot->getSonarRange(i)); 
01030   }
01031   else if (myState == STATE_FOURTH)
01032   {
01033     for (i = 24; i < myRobot->getNumSonar() && i <= 31; ++i)
01034       printf("%6d", myRobot->getSonarRange(i)); 
01035   }
01036 }
01037 
01038 void ArModeSonar::allSonar(void)
01039 {
01040   myState = STATE_ALL;
01041   printf("\n");
01042   help();
01043 }
01044 
01045 void ArModeSonar::firstSonar(void)
01046 {
01047   myState = STATE_FIRST;
01048   printf("\n");
01049   help();
01050 }
01051 
01052 void ArModeSonar::secondSonar(void)
01053 {
01054   myState = STATE_SECOND;
01055   printf("\n");
01056   help();
01057 }
01058 
01059 void ArModeSonar::thirdSonar(void)
01060 {
01061   myState = STATE_THIRD;
01062   printf("\n");
01063   help();
01064 }
01065 
01066 void ArModeSonar::fourthSonar(void)
01067 {
01068   myState = STATE_FOURTH;
01069   printf("\n");
01070   help();
01071 }
01072 
01073 ArModeBumps::ArModeBumps(ArRobot *robot, const char *name, char key, char key2): 
01074   ArMode(robot, name, key, key2)
01075 {
01076 }
01077 
01078 ArModeBumps::~ArModeBumps()
01079 {
01080   
01081 }
01082 
01083 void ArModeBumps::activate(void)
01084 {
01085   if (!baseActivate())
01086     return;
01087 }
01088 
01089 void ArModeBumps::deactivate(void)
01090 {
01091   if (!baseDeactivate())
01092     return;
01093 }
01094 
01095 void ArModeBumps::help(void)
01096 {
01097   unsigned int i;
01098   ArLog::log(ArLog::Terse, "Bumps mode will display whether bumpers are triggered or not...");
01099   ArLog::log(ArLog::Terse, "keep in mind it is assuming you have a full bump ring... so you should");
01100   ArLog::log(ArLog::Terse, "ignore readings for where there aren't bumpers.");
01101   ArLog::log(ArLog::Terse, "Bumper readings:");
01102   for (i = 0; i < myRobot->getNumFrontBumpers(); i++)
01103   {
01104     printf("%6d", i + 1);
01105   }
01106   printf(" |");
01107   for (i = 0; i < myRobot->getNumRearBumpers(); i++)
01108   {
01109     printf("%6d", i + 1);
01110   }
01111   printf("\n");
01112 }
01113 
01114 void ArModeBumps::userTask(void)
01115 {
01116   unsigned int i;
01117   int val;
01118   int bit;
01119   if (myRobot == NULL)
01120     return;
01121   printf("\r");
01122   val = ((myRobot->getStallValue() & 0xff00) >> 8);
01123   for (i = 0, bit = 2; i < myRobot->getNumFrontBumpers(); i++, bit *= 2)
01124   {
01125     if (val & bit)
01126       printf("%6s", "trig");
01127     else
01128       printf("%6s", "clear");
01129   }
01130   printf(" |");
01131   val = ((myRobot->getStallValue() & 0xff));
01132   for (i = 0, bit = 2; i < myRobot->getNumRearBumpers(); i++, bit *= 2)
01133   {
01134     if (val & bit)
01135       printf("%6s", "trig");
01136     else
01137       printf("%6s", "clear");
01138   }
01139 
01140 }
01141 
01142 ArModePosition::ArModePosition(ArRobot *robot, const char *name, char key, char key2, ArAnalogGyro *gyro): 
01143   ArMode(robot, name, key, key2),
01144   myUpCB(this, &ArModePosition::up),
01145   myDownCB(this, &ArModePosition::down),
01146   myLeftCB(this, &ArModePosition::left),
01147   myRightCB(this, &ArModePosition::right),
01148   myStopCB(this, &ArModePosition::stop),
01149   myResetCB(this, &ArModePosition::reset),
01150   myModeCB(this, &ArModePosition::mode),
01151   myGyroCB(this, &ArModePosition::gyro),
01152   myIncDistCB(this, &ArModePosition::incDistance),
01153   myDecDistCB(this, &ArModePosition::decDistance)
01154 {
01155   myGyro = gyro;
01156   myMode = MODE_BOTH;
01157   myModeString = "both";
01158   myInHeadingMode = false;
01159   myDistance = 1000;
01160 
01161   if (myGyro != NULL)
01162     myGyroZero = myGyro->getHeading();
01163   myRobotZero = myRobot->getRawEncoderPose().getTh();
01164   myInHeadingMode = true;
01165   myHeading = myRobot->getTh();
01166 }
01167 
01168 ArModePosition::~ArModePosition()
01169 {
01170   
01171 }
01172 
01173 void ArModePosition::activate(void)
01174 {
01175   if (!baseActivate())
01176     return;
01177 
01178   addKeyHandler(ArKeyHandler::UP, &myUpCB);
01179   addKeyHandler(ArKeyHandler::DOWN, &myDownCB);
01180   addKeyHandler(ArKeyHandler::LEFT, &myLeftCB);  
01181   addKeyHandler(ArKeyHandler::RIGHT, &myRightCB);
01182   addKeyHandler(ArKeyHandler::SPACE, &myStopCB);
01183   addKeyHandler(ArKeyHandler::PAGEUP, &myIncDistCB);
01184   addKeyHandler(ArKeyHandler::PAGEDOWN, &myDecDistCB);
01185   addKeyHandler('r', &myResetCB);
01186   addKeyHandler('R', &myResetCB);
01187   addKeyHandler('x', &myModeCB);
01188   addKeyHandler('X', &myModeCB);
01189   addKeyHandler('z', &myGyroCB);
01190   addKeyHandler('Z', &myGyroCB);
01191 }
01192 
01193 void ArModePosition::deactivate(void)
01194 {
01195   if (!baseDeactivate())
01196     return;
01197 
01198   remKeyHandler(&myUpCB);
01199   remKeyHandler(&myDownCB);
01200   remKeyHandler(&myLeftCB);
01201   remKeyHandler(&myRightCB);
01202   remKeyHandler(&myStopCB);
01203   remKeyHandler(&myResetCB);
01204   remKeyHandler(&myModeCB);
01205   remKeyHandler(&myGyroCB);
01206   remKeyHandler(&myIncDistCB);
01207   remKeyHandler(&myDecDistCB);
01208 }
01209 
01210 void ArModePosition::up(void)
01211 {
01212   myRobot->move(myDistance);
01213   if (myInHeadingMode)
01214   {
01215     myInHeadingMode = false;
01216     myHeading = myRobot->getTh();
01217   }
01218 }
01219 
01220 void ArModePosition::down(void)
01221 {
01222   myRobot->move(-myDistance);
01223   if (myInHeadingMode)
01224   {
01225     myInHeadingMode = false;
01226     myHeading = myRobot->getTh();
01227   }
01228 }
01229 
01230 void ArModePosition::incDistance(void)
01231 {
01232   myDistance += 500;
01233 }
01234 
01235 void ArModePosition::decDistance(void)
01236 {
01237   myDistance -= 500;
01238   if(myDistance < 500) myDistance = 500;
01239 }
01240 
01241 void ArModePosition::left(void)
01242 {
01243   myRobot->setDeltaHeading(90);
01244   myInHeadingMode = true;
01245 }
01246 
01247 void ArModePosition::right(void)
01248 {
01249   myRobot->setDeltaHeading(-90);
01250   myInHeadingMode = true;
01251 }
01252 
01253 void ArModePosition::stop(void)
01254 {
01255   myRobot->stop();
01256   myInHeadingMode = true;
01257 }
01258 
01259 void ArModePosition::reset(void)
01260 {
01261   myRobot->stop();
01262   myRobot->moveTo(ArPose(0, 0, 0));
01263   if (myGyro != NULL)
01264     myGyroZero = myGyro->getHeading();
01265   myRobotZero = myRobot->getRawEncoderPose().getTh();
01266   myInHeadingMode = true;
01267   myHeading = myRobot->getTh();
01268 }
01269 
01270 void ArModePosition::mode(void)
01271 {
01272   if (myMode == MODE_BOTH)
01273   {
01274     myMode = MODE_EITHER;
01275     myModeString = "either";
01276     myInHeadingMode = true;
01277     myRobot->stop();
01278   }
01279   else if (myMode == MODE_EITHER)
01280   {
01281     myMode = MODE_BOTH;
01282     myModeString = "both";
01283   }
01284 }
01285 
01286 void ArModePosition::gyro(void)
01287 {
01288   if (myGyro == NULL || !myGyro->haveGottenData())
01289     return;
01290 
01291   if (myGyro != NULL && myGyro->isActive())
01292     myGyro->deactivate();
01293   else if (myGyro != NULL && !myGyro->isActive())
01294     myGyro->activate();
01295 
01296   help();
01297 }
01298 
01299 void ArModePosition::help(void)
01300 {
01301   ArLog::log(ArLog::Terse, "Mode is one of two values:");
01302   ArLog::log(ArLog::Terse, "%13s: heading and move can happen simultaneously", 
01303              "both");
01304   ArLog::log(ArLog::Terse, "%13s: only heading or move is active (move holds heading)", "either");
01305   ArLog::log(ArLog::Terse, "");
01306   ArLog::log(ArLog::Terse, "%13s:  forward %.1f meter(s)", "up arrow", myDistance/1000.0);
01307   ArLog::log(ArLog::Terse, "%13s:  backward %.1f meter(s)", "down arrow", myDistance/1000.0);
01308   ArLog::log(ArLog::Terse, "%13s:  increase distance by 1/2 meter", "page up");
01309   ArLog::log(ArLog::Terse, "%13s:  decrease distance by 1/2 meter", "page down");
01310   ArLog::log(ArLog::Terse, "%13s:  turn left 90 degrees", "left arrow");
01311   ArLog::log(ArLog::Terse, "%13s:  turn right 90 degrees", "right arrow");
01312   ArLog::log(ArLog::Terse, "%13s:  stop", "space bar");
01313   ArLog::log(ArLog::Terse, "%13s:  reset position to (0, 0, 0)", "'r' or 'R'");
01314   ArLog::log(ArLog::Terse, "%13s:  switch heading/velocity mode","'x' or 'X'");
01315   if (myGyro != NULL && myGyro->haveGottenData())
01316     ArLog::log(ArLog::Terse, "%13s:  turn gyro on or off (stays this way in other modes)","'z' or 'Z'");
01317 
01318   ArLog::log(ArLog::Terse, "");
01319   ArLog::log(ArLog::Terse, "Position mode shows the position stats on a robot.");
01320   if (myGyro != NULL && myGyro->haveGottenData())
01321     ArLog::log(ArLog::Terse, "%7s%7s%9s%7s%8s%7s%8s%6s%10s%10s", "x", "y", "th", "comp", "volts", "mpacs", "mode", "gyro", "gyro_th", "robot_th");
01322   else
01323     ArLog::log(ArLog::Terse, "%7s%7s%9s%7s%8s%7s%8s", "x", "y", "th", "comp", "volts", "mpacs", "mode");
01324   
01325 }
01326 
01327 void ArModePosition::userTask(void)
01328 {
01329   if (myRobot == NULL)
01330     return;
01331   // if we're in either mode and not in the heading mode try to keep the
01332   // same heading (in heading mode its controlled by those commands)
01333   if (myMode == MODE_EITHER && !myInHeadingMode)
01334   {
01335     myRobot->setHeading(myHeading);
01336   }
01337   double voltage;
01338   if (myRobot->getRealBatteryVoltage() > 0)
01339     voltage = myRobot->getRealBatteryVoltage();
01340   else
01341     voltage = myRobot->getBatteryVoltage();
01342   if (myGyro != NULL && myGyro->haveGottenData())
01343     printf("\r%7.0f%7.0f%9.2f%7.0f%8.2f%7d%8s%6s%10.2f%10.2f", 
01344            myRobot->getX(),  myRobot->getY(), myRobot->getTh(), 
01345            myRobot->getCompass(), voltage,
01346            myRobot->getMotorPacCount(),
01347            myMode == MODE_BOTH ? "both" : "either", 
01348            myGyro->isActive() ? "on" : "off", 
01349            ArMath::subAngle(myGyro->getHeading(), myGyroZero), 
01350            ArMath::subAngle(myRobot->getRawEncoderPose().getTh(),myRobotZero));
01351   else
01352     printf("\r%7.0f%7.0f%9.2f%7.0f%8.2f%7d%8s", myRobot->getX(), 
01353            myRobot->getY(), myRobot->getTh(), myRobot->getCompass(), 
01354            voltage, myRobot->getMotorPacCount(), 
01355            myMode == MODE_BOTH ? "both" : "either");
01356 }
01357 
01358 ArModeIO::ArModeIO(ArRobot *robot, const char *name, char key, char key2): 
01359   ArMode(robot, name, key, key2)
01360 {
01361 }
01362 
01363 ArModeIO::~ArModeIO()
01364 {
01365   
01366 }
01367 
01368 void ArModeIO::activate(void)
01369 {
01370   if (!baseActivate())
01371     return;
01372   if (myRobot == NULL)
01373     return;
01374   myRobot->comInt(ArCommands::IOREQUEST, 2);
01375   myOutput[0] = '\0';
01376   myLastPacketTime = myRobot->getIOPacketTime();
01377 }
01378 
01379 void ArModeIO::deactivate(void)
01380 {
01381   if (!baseDeactivate())
01382     return;
01383   if (myRobot == NULL)
01384     return;
01385   myRobot->comInt(ArCommands::IOREQUEST, 0);
01386 }
01387 
01388 void ArModeIO::help(void)
01389 {
01390   ArLog::log(ArLog::Terse, 
01391              "IO mode shows the IO (digin, digout, a/d) from the robot.");
01392   myExplanationReady = false;
01393   myExplained = false;
01394 }
01395 
01396 void ArModeIO::userTask(void)
01397 {
01398   int num;
01399   int i, j;
01400   unsigned int value;
01401   int bit;
01402   char label[256];
01403   myOutput[0] = '\0';
01404 
01405   if (myLastPacketTime.mSecSince(myRobot->getIOPacketTime()) == 0)
01406     return;
01407 
01408   if (!myExplanationReady)
01409     myExplanation[0] = '\0';
01410 
01411   value = myRobot->getFlags();
01412   if (!myExplanationReady)
01413   {
01414     sprintf(label, "flags");
01415     sprintf(myExplanation, "%s%17s  ", myExplanation, label);
01416   }
01417   for (j = 0, bit = 1; j < 16; ++j, bit *= 2)
01418   {
01419     if (j == 8)
01420       sprintf(myOutput, "%s ", myOutput);
01421     if (value & bit)
01422       sprintf(myOutput, "%s%d", myOutput, 1);
01423     else
01424       sprintf(myOutput, "%s%d", myOutput, 0);
01425   }
01426   sprintf(myOutput, "%s  ", myOutput);
01427 
01428   num = myRobot->getIODigInSize();
01429   for (i = 0; i < num; ++i)
01430   {
01431     value = myRobot->getIODigIn(i);
01432     if (!myExplanationReady)
01433     {
01434       sprintf(label, "digin%d", i);
01435       sprintf(myExplanation, "%s%8s  ", myExplanation, label);
01436     }
01437     for (j = 0, bit = 1; j < 8; ++j, bit *= 2)
01438     {
01439       if (value & bit)
01440         sprintf(myOutput, "%s%d", myOutput, 1);
01441       else
01442         sprintf(myOutput, "%s%d", myOutput, 0);
01443     }
01444     sprintf(myOutput, "%s  ", myOutput);
01445   }
01446 
01447   num = myRobot->getIODigOutSize();
01448   for (i = 0; i < num; ++i)
01449   {
01450     value = myRobot->getIODigOut(i);
01451     if (!myExplanationReady)
01452     {
01453       sprintf(label, "digout%d", i);
01454       sprintf(myExplanation, "%s%8s  ", myExplanation, label);
01455     }
01456     for (j = 0, bit = 1; j < 8; ++j, bit *= 2)
01457     {
01458       if (value & bit)
01459         sprintf(myOutput, "%s%d", myOutput, 1);
01460       else
01461         sprintf(myOutput, "%s%d", myOutput, 0);
01462     }
01463     sprintf(myOutput, "%s  ", myOutput);
01464   }
01465 
01466   num = myRobot->getIOAnalogSize();
01467   for (i = 0; i < num; ++i)
01468   {
01469     if (!myExplanationReady)
01470     {
01471       sprintf(label, "a/d%d", i);
01472       sprintf(myExplanation, "%s%6s", myExplanation, label);
01473     }
01474     
01475     /*
01476       int ad = myRobot->getIOAnalog(i);
01477       double adVal;
01478     ad &= 0xfff;
01479     adVal = ad * .0048828;
01480     sprintf(myOutput, "%s%6.2f", myOutput,adVal);
01481     */
01482     sprintf(myOutput, "%s%6.2f", myOutput, myRobot->getIOAnalogVoltage(i));
01483     
01484   }
01485 
01486   if (!myExplained)
01487   {
01488     printf("\n%s\n", myExplanation);
01489     myExplained = true;
01490   }
01491 
01492   printf("\r%s", myOutput);
01493 }
01494 
01495 ArModeLaser::ArModeLaser(ArRobot *robot, const char *name, 
01496                                   char key, char key2, ArSick *sick) :
01497   ArMode(robot, name, key, key2),
01498   myFailedConnectCB(this, &ArModeLaser::failedConnect)
01499 {
01500   myState = STATE_UNINITED;
01501   mySick = sick;
01502   myConnectingLaser = false;
01503   myInitializedLaser = false;
01504 }
01505 
01506 ArModeLaser::~ArModeLaser()
01507 {
01508 }
01509 
01510 void ArModeLaser::activate(void)
01511 {
01512   if (!baseActivate())
01513     return;
01514 
01515   if (myRobot == NULL || mySick == NULL)
01516   {
01517     ArLog::log(ArLog::Terse, "Laser mode activated but either no robot or laser given to it.");
01518     return;
01519   }
01520   if (myState == STATE_UNINITED)
01521   {
01522     mySick->lockDevice();
01523     if (mySick->isConnected())
01524     {
01525       ArLog::log(ArLog::Verbose, 
01526                  "\nArModeLaser using already existing and connected laser.");
01527       myState = STATE_CONNECTED;
01528     }
01529     else if (myConnectingLaser && !mySick->tryingToConnect())
01530     {
01531       ArLog::log(ArLog::Terse, 
01532                  "\nArModeLaser trying to connect to a laser its already started once.");
01533       mySick->asyncConnect();
01534       myState = STATE_CONNECTING;
01535     } 
01536     else if (myConnectingLaser)
01537     {
01538       ArLog::log(ArLog::Terse, "\nArModeLaser already connecting to laser.");
01539     }
01540     else
01541     {
01542       ArLog::log(ArLog::Terse,
01543                  "\nArModeLaser is connecting to the laser.");
01544       myConnectingLaser = true;
01545       myInitializedLaser = true;
01546       myRobot->remRangeDevice(mySick);
01547       myRobot->addRangeDevice(mySick);
01548       mySick->remFailedConnectCB(&myFailedConnectCB);
01549       mySick->addFailedConnectCB(&myFailedConnectCB, ArListPos::LAST);
01550       // run the laser in its own thread if it isn't already
01551       if (!mySick->getRunning())
01552         mySick->runAsync();
01553       // connect the thing
01554       if (!mySick->tryingToConnect())
01555         mySick->asyncConnect();
01556       myState = STATE_CONNECTING;
01557     }
01558     mySick->unlockDevice();
01559   } 
01560 }
01561 
01562 void ArModeLaser::deactivate(void)
01563 {
01564   if (!baseDeactivate())
01565     return;
01566 }
01567 
01568 void ArModeLaser::help(void)
01569 {
01570   ArLog::log(ArLog::Terse, 
01571              "Laser mode connects to a laser, or uses a previously established connection.");
01572   ArLog::log(ArLog::Terse,
01573              "Laser mode then displays the closest and furthest reading from the laser.");
01574 
01575 }
01576 
01577 
01578 void ArModeLaser::userTask(void)
01579 {
01580   double dist, angle;
01581   const std::list<ArPoseWithTime *> *readings;
01582   std::list<ArPoseWithTime *>::const_iterator it;
01583   double farDist, farAngle;
01584   bool found;
01585   int i = 0;
01586 
01587   if (myRobot == NULL || mySick == NULL)
01588     return;
01589   if (myState == STATE_CONNECTED)
01590   {
01591     mySick->lockDevice();
01592     if (!mySick->isConnected())
01593     {
01594       ArLog::log(ArLog::Terse, "\n\nLaser mode lost connection to the laser.");
01595       ArLog::log(ArLog::Terse, "Switch out of this mode and back if you want to try reconnecting to the laser.\n");
01596       myState = STATE_UNINITED;
01597     }
01598     dist = mySick->currentReadingPolar(-90, 90, &angle);
01599     if (dist < mySick->getMaxRange())
01600       printf("\rClose: %10.2fmm %5.2f deg\t", dist, angle);
01601     else
01602       printf("\rNo close reading.\t\t");
01603     readings = mySick->getCurrentBuffer();
01604     for (it = readings->begin(), found = false; it != readings->end(); it++)
01605     {
01606       i++;
01607       dist = (*it)->findDistanceTo(ArPose(0, 0));
01608       angle = (*it)->findAngleTo(ArPose(0, 0));
01609       if (!found || dist > farDist)
01610       {
01611         found = true;
01612         farDist = dist;
01613         farAngle = angle;
01614       }
01615     }
01616     if (found)
01617       printf("Far: %10.2fmm %5.2f deg\t", 
01618              farDist, farAngle);
01619     else
01620       printf("No far reading found\t");
01621     printf("%d readings", readings->size());
01622     mySick->unlockDevice();
01623   }
01624   else if (myState == STATE_CONNECTING)
01625   {
01626     mySick->lockDevice();
01627     if (mySick->isConnected())
01628     {
01629       ArLog::log(ArLog::Terse, "\nLaser mode has connected to the laser.\n");
01630       myState = STATE_CONNECTED;
01631     }
01632     mySick->unlockDevice();
01633   }
01634 }
01635 
01636 void ArModeLaser::failedConnect(void)
01637 {
01638   ArLog::log(ArLog::Terse, "\nLaser mode failed to connect to the laser.\n");
01639   ArLog::log(ArLog::Terse, 
01640              "Switch out of this mode and back to try reconnecting.\n");
01641   myState = STATE_UNINITED;
01642 }
01643 
01648 ArModeActs::ArModeActs(ArRobot *robot, const char *name, char key, 
01649                                 char key2, ArACTS_1_2 *acts): 
01650   ArMode(robot, name, key, key2),
01651   myChannel1CB(this, &ArModeActs::channel1),
01652   myChannel2CB(this, &ArModeActs::channel2),
01653   myChannel3CB(this, &ArModeActs::channel3),
01654   myChannel4CB(this, &ArModeActs::channel4),
01655   myChannel5CB(this, &ArModeActs::channel5),
01656   myChannel6CB(this, &ArModeActs::channel6),
01657   myChannel7CB(this, &ArModeActs::channel7),
01658   myChannel8CB(this, &ArModeActs::channel8),
01659   myStopCB(this, &ArModeActs::stop),
01660   myStartCB(this, &ArModeActs::start),
01661   myToggleAcquireCB(this, &ArModeActs::toggleAcquire)
01662 {
01663   if (acts != NULL)
01664     myActs = acts;
01665   else
01666     myActs = new ArACTS_1_2;
01667   myRobot = robot;
01668   myActs->openPort(myRobot);
01669   myGroup = new ArActionGroupColorFollow(myRobot, myActs, camera);
01670   myGroup->deactivate();
01671 }
01672 
01673 // Destructor
01674 ArModeActs::~ArModeActs()
01675 {
01676   
01677 }
01678 
01679 // Activate the mode
01680 void ArModeActs::activate(void)
01681 {
01682   // Activate the group
01683   if (!baseActivate())
01684     return;
01685   myGroup->activateExclusive();
01686   
01687   // Add key handlers for keyboard input
01688   addKeyHandler(ArKeyHandler::SPACE, &myStopCB);
01689   addKeyHandler('z', &myStartCB);
01690   addKeyHandler('Z', &myStartCB);
01691   addKeyHandler('x', &myToggleAcquireCB);
01692   addKeyHandler('X', &myToggleAcquireCB);
01693   addKeyHandler('1', &myChannel1CB);
01694   addKeyHandler('2', &myChannel2CB);
01695   addKeyHandler('3', &myChannel3CB);
01696   addKeyHandler('4', &myChannel4CB);
01697   addKeyHandler('5', &myChannel5CB);
01698   addKeyHandler('6', &myChannel6CB);
01699   addKeyHandler('7', &myChannel7CB);
01700   addKeyHandler('8', &myChannel8CB);
01701 
01702   // Set the camera
01703   camera = myRobot->getPTZ();
01704   
01705   // Tell us whether we are connected to ACTS or not
01706   if(myActs->isConnected())
01707     { 
01708       printf("\nConnected to ACTS.\n");
01709     }
01710   else printf("\nNot connected to ACTS.\n");
01711 
01712   // Tell us whether a camera is defined or not
01713   if(camera != NULL)
01714     {
01715       printf("\nCamera defined.\n\n");
01716       myGroup->setCamera(camera);
01717     }
01718   else
01719     {  
01720       printf("\nNo camera defined.\n");
01721       printf("The robot will not tilt its camera up or down until\n");
01722       printf("a camera has been defined in camera mode ('c' or 'C').\n\n");
01723     }
01724 }
01725 
01726 // Deactivate the group
01727 void ArModeActs::deactivate(void)
01728 {
01729   if (!baseDeactivate())
01730     return;
01731 
01732   // Remove the key handlers
01733   remKeyHandler(&myStopCB);
01734   remKeyHandler(&myStartCB);
01735   remKeyHandler(&myToggleAcquireCB);
01736   remKeyHandler(&myChannel1CB);
01737   remKeyHandler(&myChannel2CB);
01738   remKeyHandler(&myChannel3CB);
01739   remKeyHandler(&myChannel4CB);
01740   remKeyHandler(&myChannel5CB);
01741   remKeyHandler(&myChannel6CB);
01742   remKeyHandler(&myChannel7CB);
01743   remKeyHandler(&myChannel8CB);
01744 
01745   myGroup->deactivate();
01746 }
01747 
01748 // Display the available commands
01749 void ArModeActs::help(void)
01750 {
01751   ArLog::log(ArLog::Terse, 
01752            "ACTS mode will drive the robot in an attempt to follow a color blob.\n");
01753 
01754   ArLog::log(ArLog::Terse, "%20s:  Pick a channel",     "1 - 8    ");
01755   ArLog::log(ArLog::Terse, "%20s:  toggle acquire mode", "'x' or 'X'");
01756   ArLog::log(ArLog::Terse, "%20s:  start movement",     "'z' or 'Z'");
01757   ArLog::log(ArLog::Terse, "%20s:  stop movement",      "space bar");
01758   ArLog::log(ArLog::Terse, "");
01759   
01760 }
01761 
01762 // Display data about this mode
01763 void ArModeActs::userTask(void)
01764 {
01765   int myChannel;
01766 
01767   char *acquire;
01768   char *move;
01769   char *blob;
01770 
01771   myChannel = myGroup->getChannel();
01772   if(myGroup->getAcquire()) acquire = "actively acquiring";
01773   else acquire = "passively acquiring";
01774   
01775   if(myGroup->getMovement()) move = "movement on";
01776   else move = "movement off";
01777 
01778   if(myGroup->getBlob()) blob = "blob in sight";
01779   else blob = "no blob in sight";
01780 
01781   printf("\r Channel: %d  %15s %25s %20s", myChannel, move, acquire, blob);
01782 }
01783 
01784 // The channels
01785 void ArModeActs::channel1(void)
01786 {
01787   myGroup->setChannel(1);
01788 }
01789 
01790 void ArModeActs::channel2(void)
01791 {
01792   myGroup->setChannel(2);
01793 }
01794 
01795 void ArModeActs::channel3(void)
01796 {
01797   myGroup->setChannel(3);
01798 }
01799 
01800 void ArModeActs::channel4(void)
01801 {
01802   myGroup->setChannel(4);
01803 }
01804 
01805 void ArModeActs::channel5(void)
01806 {
01807   myGroup->setChannel(5);
01808 }
01809 
01810 void ArModeActs::channel6(void)
01811 {
01812   myGroup->setChannel(6);
01813 }
01814 
01815 void ArModeActs::channel7(void)
01816 {
01817   myGroup->setChannel(7);
01818 }
01819 
01820 void ArModeActs::channel8(void)
01821 {
01822   myGroup->setChannel(8);
01823 }
01824 
01825 // Stop the robot from moving
01826 void ArModeActs::stop(void)
01827 {
01828   myGroup->stopMovement();
01829 }
01830 
01831 // Allow the robot to move
01832 void ArModeActs::start(void)
01833 {
01834   myGroup->startMovement();
01835 }
01836 
01837 // Toggle whether or not the robot is allowed
01838 // to aquire anything
01839 void ArModeActs::toggleAcquire()
01840 {
01841   if(myGroup->getAcquire())
01842     myGroup->setAcquire(false);
01843   else myGroup->setAcquire(true);
01844 
01845 }
01846 
01847 ArModeCommand::ArModeCommand(ArRobot *robot, const char *name, char key, char key2): 
01848   ArMode(robot, name, key, key2),
01849   my0CB(this, &ArModeCommand::addChar, '0'),
01850   my1CB(this, &ArModeCommand::addChar, '1'),
01851   my2CB(this, &ArModeCommand::addChar, '2'),
01852   my3CB(this, &ArModeCommand::addChar, '3'),
01853   my4CB(this, &ArModeCommand::addChar, '4'),
01854   my5CB(this, &ArModeCommand::addChar, '5'),
01855   my6CB(this, &ArModeCommand::addChar, '6'),
01856   my7CB(this, &ArModeCommand::addChar, '7'),
01857   my8CB(this, &ArModeCommand::addChar, '8'),
01858   my9CB(this, &ArModeCommand::addChar, '9'),
01859   myMinusCB(this, &ArModeCommand::addChar, '-'),
01860   myBackspaceCB(this, &ArModeCommand::addChar, ArKeyHandler::BACKSPACE),
01861   mySpaceCB(this, &ArModeCommand::addChar, ArKeyHandler::SPACE),
01862   myEnterCB(this, &ArModeCommand::finishParsing)
01863 
01864 {
01865   reset(false);
01866 }
01867 
01868 ArModeCommand::~ArModeCommand()
01869 {
01870   
01871 }
01872 
01873 void ArModeCommand::activate(void)
01874 {
01875   reset(false);
01876   if (!baseActivate())
01877     return;
01878   myRobot->stopStateReflection();
01879   takeKeys();
01880   reset(true);
01881 }
01882 
01883 void ArModeCommand::deactivate(void)
01884 {
01885   if (!baseDeactivate())
01886     return;
01887   giveUpKeys();
01888 }
01889 
01890 void ArModeCommand::help(void)
01891 {
01892   
01893   ArLog::log(ArLog::Terse, "Command mode has three ways to send commands");
01894   ArLog::log(ArLog::Terse, "%-30s: Sends com(<command>)", "<command>");
01895   ArLog::log(ArLog::Terse, "%-30s: Sends comInt(<command>, <integer>)", "<command> <integer>");
01896   ArLog::log(ArLog::Terse, "%-30s: Sends com2Bytes(<command>, <byte1>, <byte2>)", "<command> <byte1> <byte2>");
01897 }
01898 
01899 void ArModeCommand::addChar(int ch)
01900 {
01901   if (ch < '0' && ch > '9' && ch != '-' && ch != ArKeyHandler::BACKSPACE && 
01902       ch != ArKeyHandler::SPACE)
01903   {
01904     ArLog::log(ArLog::Terse, "Something horribly wrong in command mode since number is < 0 || > 9 (it is the value %d)", ch);
01905     return;
01906   }
01907 
01908   size_t size = sizeof(myCommandString);
01909   size_t len = strlen(myCommandString);
01910 
01911   if (ch == ArKeyHandler::BACKSPACE)
01912   {
01913     // don't overrun backwards
01914     if (len < 1)
01915       return;
01916     myCommandString[len-1] = '\0';
01917     printf("\r> %s  \r> %s", myCommandString, myCommandString);
01918     return;
01919   }
01920   if (ch == ArKeyHandler::SPACE)
01921   {
01922     // if we're at the start or have a space or - just return
01923     if (len < 1 || myCommandString[len-1] == ' ' || 
01924         myCommandString[len-1] == '-')
01925       return;
01926     myCommandString[len] = ' ';
01927     myCommandString[len+1] = '\0';
01928     printf(" ");
01929     return;
01930   }
01931   if (ch == '-')
01932   {
01933     // make sure it isn't the command trying to be negated or that its the start of the byte
01934     if (len < 1 || myCommandString[len-1] != ' ')
01935       return;
01936     printf("%c", '-');
01937     myCommandString[len] = '-';
01938     myCommandString[len+1] = '\0';
01939     return;
01940   }
01941   if (len + 1 >= size)
01942   {
01943     printf("\n");
01944     ArLog::log(ArLog::Terse, "Command is too long, abandoning command");
01945     reset();
01946     return;
01947   }
01948   else
01949   {
01950     printf("%c", ch);
01951     myCommandString[len] = ch;
01952     myCommandString[len+1] = '\0';
01953     return;
01954   }
01955 }
01956 
01957 void ArModeCommand::finishParsing(void)
01958 {
01959   
01960   ArArgumentBuilder builder;
01961   builder.add(myCommandString);
01962   int command;
01963   int int1;
01964   int int2;
01965 
01966   if (myCommandString[0] == '\0')
01967     return;
01968 
01969   printf("\n");
01970   if (builder.getArgc() == 0)
01971   {
01972     ArLog::log(ArLog::Terse, "Syntax error, no arguments.");
01973   }
01974   if (builder.getArgc() == 1)
01975   {
01976     command = builder.getArgInt(0);
01977     if (command < 0 || command > 255 || !builder.isArgInt(0))
01978     {
01979       ArLog::log(ArLog::Terse, 
01980                  "Invalid command, must be an integer between 0 and 255");
01981       reset();
01982       return;
01983     }
01984     else
01985     {
01986       ArLog::log(ArLog::Terse, "com(%d)", command);
01987       myRobot->com(command);
01988       reset();
01989       return;
01990     }
01991   }
01992   else if (builder.getArgc() == 2)
01993   {
01994     command = builder.getArgInt(0);
01995     int1 = builder.getArgInt(1);
01996     if (command < 0 || command > 255 || !builder.isArgInt(0))
01997     {
01998       ArLog::log(ArLog::Terse, 
01999                  "Invalid command, must be an integer between 0 and 255");
02000       reset();
02001       return;
02002     }
02003     else if (int1 < -32767 || int1 > 32767 || !builder.isArgInt(1))
02004     {
02005       ArLog::log(ArLog::Terse, 
02006          "Invalid integer, must be an integer between -32767 and 32767");
02007       reset();
02008       return;
02009     }
02010     else
02011     {
02012       ArLog::log(ArLog::Terse, "comInt(%d, %d)", command,
02013                  int1);
02014       myRobot->comInt(command, int1);
02015       reset();
02016       return;
02017     }
02018   }
02019   else if (builder.getArgc() == 3)
02020   {
02021     command = builder.getArgInt(0);
02022     int1 = builder.getArgInt(1);
02023     int2 = builder.getArgInt(2);
02024     if (command < 0 || command > 255 || !builder.isArgInt(0))
02025     {
02026       ArLog::log(ArLog::Terse, 
02027                  "Invalid command, must be between 0 and 255");
02028       reset();
02029       return;
02030     }
02031     else if (int1 < -128 || int1 > 255 || !builder.isArgInt(1))
02032     {
02033       ArLog::log(ArLog::Terse, 
02034          "Invalid byte1, must be an integer between -128 and 127, or between 0 and 255");
02035       reset();
02036       return;
02037     }
02038     else if (int2 < -128 || int2 > 255 || !builder.isArgInt(2))
02039     {
02040       ArLog::log(ArLog::Terse, 
02041          "Invalid byte2, must be an integer between -128 and 127, or between 0 and 255");
02042       reset();
02043       return;
02044     }
02045     else
02046     {
02047       ArLog::log(ArLog::Terse, 
02048                  "com2Bytes(%d, %d, %d)", 
02049                  command, int1, int2);
02050       myRobot->com2Bytes(command, int1, int2);
02051       reset();
02052       return;
02053     }
02054   }
02055   else
02056   {
02057     ArLog::log(ArLog::Terse, "Syntax error, too many arguments");
02058     reset();
02059     return;
02060   }
02061 }
02062 
02063 void ArModeCommand::reset(bool print)
02064 {
02065   myCommandString[0] = '\0';
02066   if (print)
02067   {
02068     ArLog::log(ArLog::Terse, "");
02069     printf("> ");
02070   }
02071 }
02072 
02073 void ArModeCommand::takeKeys(void)
02074 {
02075   addKeyHandler('0', &my0CB);
02076   addKeyHandler('1', &my1CB);
02077   addKeyHandler('2', &my2CB);
02078   addKeyHandler('3', &my3CB);
02079   addKeyHandler('4', &my4CB);
02080   addKeyHandler('5', &my5CB);
02081   addKeyHandler('6', &my6CB);
02082   addKeyHandler('7', &my7CB);
02083   addKeyHandler('8', &my8CB);
02084   addKeyHandler('9', &my9CB);
02085   addKeyHandler('-', &myMinusCB);
02086   addKeyHandler(ArKeyHandler::BACKSPACE, &myBackspaceCB);
02087   addKeyHandler(ArKeyHandler::ENTER, &myEnterCB);
02088   addKeyHandler(ArKeyHandler::SPACE, &mySpaceCB);
02089 }
02090 
02091 void ArModeCommand::giveUpKeys(void)
02092 {
02093   remKeyHandler(&my0CB);
02094   remKeyHandler(&my1CB);
02095   remKeyHandler(&my2CB);
02096   remKeyHandler(&my3CB);
02097   remKeyHandler(&my4CB);
02098   remKeyHandler(&my5CB);
02099   remKeyHandler(&my6CB);
02100   remKeyHandler(&my7CB);
02101   remKeyHandler(&my8CB);
02102   remKeyHandler(&my9CB);
02103   remKeyHandler(&myBackspaceCB);
02104   remKeyHandler(&myMinusCB);
02105   remKeyHandler(&myEnterCB);
02106   remKeyHandler(&mySpaceCB);
02107 }
02108 
02114 ArModeTCM2::ArModeTCM2(ArRobot *robot, const char *name, char key, char key2, ArTCM2 *tcm2): 
02115   ArMode(robot, name, key, key2)
02116 {
02117   if (tcm2 != NULL)
02118     myTCM2 = tcm2;
02119   else
02120     myTCM2 = new ArTCM2(robot);
02121   myOffCB = new ArFunctorC<ArTCM2>(myTCM2, &ArTCM2::commandOff);
02122   myCompassCB = new ArFunctorC<ArTCM2>(myTCM2, &ArTCM2::commandJustCompass);
02123   myOnePacketCB = new ArFunctorC<ArTCM2>(myTCM2, &ArTCM2::commandOnePacket);
02124   myContinuousPacketsCB = new ArFunctorC<ArTCM2>(
02125           myTCM2, &ArTCM2::commandContinuousPackets);
02126   myUserCalibrationCB = new ArFunctorC<ArTCM2>(
02127           myTCM2, &ArTCM2::commandUserCalibration);
02128   myAutoCalibrationCB = new ArFunctorC<ArTCM2>(
02129           myTCM2, &ArTCM2::commandAutoCalibration);
02130   myStopCalibrationCB = new ArFunctorC<ArTCM2>(
02131           myTCM2, &ArTCM2::commandStopCalibration);
02132   myResetCB = new ArFunctorC<ArTCM2>(
02133           myTCM2, &ArTCM2::commandSoftReset);
02134 
02135 }
02136 
02137 ArModeTCM2::~ArModeTCM2()
02138 {
02139   
02140 }
02141 
02142 void ArModeTCM2::activate(void)
02143 {
02144   if (!baseActivate())
02145     return;
02146   myTCM2->commandContinuousPackets();
02147   addKeyHandler('0', myOffCB);
02148   addKeyHandler('1', myCompassCB);
02149   addKeyHandler('2', myOnePacketCB);
02150   addKeyHandler('3', myContinuousPacketsCB);
02151   addKeyHandler('4', myUserCalibrationCB);
02152   addKeyHandler('5', myAutoCalibrationCB);
02153   addKeyHandler('6', myStopCalibrationCB);
02154   addKeyHandler('7', myResetCB);
02155 }
02156 
02157 void ArModeTCM2::deactivate(void)
02158 {
02159   if (!baseDeactivate())
02160     return;
02161   myTCM2->commandJustCompass();
02162   remKeyHandler(myOffCB);
02163   remKeyHandler(myCompassCB);
02164   remKeyHandler(myOnePacketCB);
02165   remKeyHandler(myContinuousPacketsCB);
02166   remKeyHandler(myUserCalibrationCB);
02167   remKeyHandler(myAutoCalibrationCB);
02168   remKeyHandler(myStopCalibrationCB);
02169   remKeyHandler(myResetCB);
02170 }
02171 
02172 void ArModeTCM2::help(void)
02173 {
02174   ArLog::log(ArLog::Terse, 
02175              "TCM2 mode shows the data from the TCM2 compass and lets you send the TCM2 commands");
02176   ArLog::log(ArLog::Terse, "%20s:  turn TCM2 off", "'0'");  
02177   ArLog::log(ArLog::Terse, "%20s:  just get compass readings", "'1'");  
02178   ArLog::log(ArLog::Terse, "%20s:  get a single set of TCM2 data", "'2'");  
02179   ArLog::log(ArLog::Terse, "%20s:  get continuous TCM2 data", "'3'");  
02180   ArLog::log(ArLog::Terse, "%20s:  start user calibration", "'4'");  
02181   ArLog::log(ArLog::Terse, "%20s:  start auto calibration", "'5'");  
02182   ArLog::log(ArLog::Terse, "%20s:  stop calibration and get a single set of data", "'6'");  
02183   ArLog::log(ArLog::Terse, "%20s:  soft reset of compass", "'7'");  
02184 
02185   printf("%6s %5s %5s %6s %6s %6s %6s %10s %4s %4s %6s %3s\n", 
02186          "comp", "pitch", "roll", "magX", "magY", "magZ", "temp", "error",
02187          "calH", "calV", "calM", "cnt");
02188 }
02189 
02190 void ArModeTCM2::userTask(void)
02191 {
02192   printf("\r%6.1f %5.1f %5.1f %6.2f %6.2f %6.2f %6.1f 0x%08x %4.0f %4.0f %6.2f %3d", 
02193          myTCM2->getCompass(), myTCM2->getPitch(), myTCM2->getRoll(), 
02194          myTCM2->getXMagnetic(), myTCM2->getYMagnetic(), 
02195          myTCM2->getZMagnetic(), 
02196          myTCM2->getTemperature(), myTCM2->getError(), 
02197          myTCM2->getCalibrationH(), myTCM2->getCalibrationV(), 
02198          myTCM2->getCalibrationM(), myTCM2->getPacCount());
02199 
02200 }

Generated on Wed Oct 19 12:56:36 2005 for Aria by  doxygen 1.4.0