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 #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)
00236 printf("%13s", "blocked");
00237 else
00238 printf("%13s", "clear");
00239 if (myGripper.getBreakBeamState() & 1)
00240 printf("%13s", "blocked");
00241 else
00242 printf("%13s", "clear");
00243 val = myGripper.getGripState();
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())
00251 printf("%13s", "maxed");
00252 else
00253 printf("%13s", "clear");
00254 val = myGripper.getPaddleState();
00255 if (val & 1)
00256 printf("%13s", "triggered");
00257 else
00258 printf("%13s", "clear");
00259 if (val & 2)
00260 printf("%13s", "triggered");
00261 else
00262 printf("%13s", "clear");
00263
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
00444
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
01332
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
01477
01478
01479
01480
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
01551 if (!mySick->getRunning())
01552 mySick->runAsync();
01553
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
01674 ArModeActs::~ArModeActs()
01675 {
01676
01677 }
01678
01679
01680 void ArModeActs::activate(void)
01681 {
01682
01683 if (!baseActivate())
01684 return;
01685 myGroup->activateExclusive();
01686
01687
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
01703 camera = myRobot->getPTZ();
01704
01705
01706 if(myActs->isConnected())
01707 {
01708 printf("\nConnected to ACTS.\n");
01709 }
01710 else printf("\nNot connected to ACTS.\n");
01711
01712
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
01727 void ArModeActs::deactivate(void)
01728 {
01729 if (!baseDeactivate())
01730 return;
01731
01732
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
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
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
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
01826 void ArModeActs::stop(void)
01827 {
01828 myGroup->stopMovement();
01829 }
01830
01831
01832 void ArModeActs::start(void)
01833 {
01834 myGroup->startMovement();
01835 }
01836
01837
01838
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
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
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
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 }