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

ArActionKeydrive.cpp

00001 /*
00002 MobileRobots Advanced Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004, 2005 ActivMedia Robotics LLC
00004 Copyright (C) 2006, 2007 MobileRobots Inc.
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 MobileRobots for information about a commercial version of ARIA at 
00022 robots@mobilerobots.com or 
00023 MobileRobots Inc, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
00024 */
00025 
00026 #include "ArExport.h"
00027 #include "ariaOSDef.h"
00028 #include "ArActionKeydrive.h"
00029 #include "ArRobot.h"
00030 #include "ariaInternal.h"
00031 #include "ArKeyHandler.h"
00032 
00033 AREXPORT ArActionKeydrive::ArActionKeydrive(const char *name,
00034                         double transVelMax,
00035                         double turnAmountMax,
00036                         double velIncrement,
00037                         double turnIncrement)
00038   :
00039   ArAction(name, "This action reads the keyboard arrow keys and sets the translational and rotational velocities based on this."),
00040   myUpCB(this, &ArActionKeydrive::up),
00041   myDownCB(this, &ArActionKeydrive::down),
00042   myLeftCB(this, &ArActionKeydrive::left),
00043   myRightCB(this, &ArActionKeydrive::right),
00044   mySpaceCB(this, &ArActionKeydrive::space)
00045 {
00046   setNextArgument(ArArg("trans vel max", &myTransVelMax, "The maximum speed to go (mm/sec)"));
00047   myTransVelMax = transVelMax;
00048 
00049   setNextArgument(ArArg("turn amount max", &myTurnAmountMax, "The maximum amount to turn (deg/cycle)"));
00050   myTurnAmountMax = turnAmountMax;
00051 
00052   setNextArgument(ArArg("vel increment per keypress", &myVelIncrement, "The amount to increment velocity by per keypress (mm/sec)"));
00053   myVelIncrement = velIncrement;
00054   
00055   setNextArgument(ArArg("turn increment per keypress", &myVelIncrement, "The amount to turn by per keypress (deg)"));
00056   myTurnIncrement = turnIncrement;
00057 
00058   myDesiredSpeed = 0;
00059   myDeltaVel = 0;
00060   myTurnAmount = 0;
00061   mySpeedReset = true;
00062 }
00063 
00064 AREXPORT ArActionKeydrive::~ArActionKeydrive()
00065 {
00066 
00067 }
00068 
00069 AREXPORT void ArActionKeydrive::setRobot(ArRobot *robot)
00070 {
00071   ArKeyHandler *keyHandler;
00072   myRobot = robot;
00073   if (robot == NULL)
00074     return;
00075    
00076   // see if there is already a keyhandler, if not make one for ourselves
00077   if ((keyHandler = Aria::getKeyHandler()) == NULL)
00078   {
00079     keyHandler = new ArKeyHandler;
00080     Aria::setKeyHandler(keyHandler);
00081     myRobot->attachKeyHandler(keyHandler);
00082   }
00083   takeKeys();
00084 }
00085 
00086 AREXPORT void ArActionKeydrive::takeKeys(void)
00087 {
00088   ArKeyHandler *keyHandler;
00089   if ((keyHandler = Aria::getKeyHandler()) == NULL)
00090   {
00091     ArLog::log(ArLog::Terse, 
00092            "ArActionKeydrive::takeKeys: There is no key handler, keydrive will not work.");
00093   }
00094   // now that we have one, add our keys as callbacks, print out big
00095   // warning messages if they fail
00096   if (!keyHandler->addKeyHandler(ArKeyHandler::UP, &myUpCB))
00097     ArLog::log(ArLog::Terse, "The key handler already has a key for up, keydrive will not work correctly.");
00098   if (!keyHandler->addKeyHandler(ArKeyHandler::DOWN, &myDownCB))
00099     ArLog::log(ArLog::Terse, "The key handler already has a key for down, keydrive will not work correctly.");
00100   if (!keyHandler->addKeyHandler(ArKeyHandler::LEFT, &myLeftCB))
00101     ArLog::log(ArLog::Terse,  
00102            "The key handler already has a key for left, keydrive will not work correctly.");
00103   if (!keyHandler->addKeyHandler(ArKeyHandler::RIGHT, &myRightCB))
00104     ArLog::log(ArLog::Terse,  
00105            "The key handler already has a key for right, keydrive will not work correctly.");
00106   if (!keyHandler->addKeyHandler(ArKeyHandler::SPACE, &mySpaceCB))
00107     ArLog::log(ArLog::Terse,  
00108            "The key handler already has a key for space, keydrive will not work correctly.");
00109 }
00110 
00111 AREXPORT void ArActionKeydrive::giveUpKeys(void)
00112 {
00113   ArKeyHandler *keyHandler;
00114   if ((keyHandler = Aria::getKeyHandler()) == NULL)
00115   {
00116     ArLog::log(ArLog::Terse, 
00117            "ArActionKeydrive::giveUpKeys: There is no key handler, something is probably horribly wrong .");
00118   }
00119   // now that we have one, add our keys as callbacks, print out big
00120   // warning messages if they fail
00121   if (!keyHandler->remKeyHandler(&myUpCB))
00122     ArLog::log(ArLog::Terse, "ArActionKeydrive: The key handler already didn't have a key for up, something is wrong.");
00123   if (!keyHandler->remKeyHandler(&myDownCB))
00124     ArLog::log(ArLog::Terse, "ArActionKeydrive: The key handler already didn't have a key for down, something is wrong.");
00125   if (!keyHandler->remKeyHandler(&myLeftCB))
00126     ArLog::log(ArLog::Terse,  
00127            "ArActionKeydrive: The key handler already didn't have a key for left, something is wrong.");
00128   if (!keyHandler->remKeyHandler(&myRightCB))
00129     ArLog::log(ArLog::Terse,  
00130            "ArActionKeydrive: The key handler already didn't have a key for right, something is wrong.");
00131   if (!keyHandler->remKeyHandler(&mySpaceCB))
00132     ArLog::log(ArLog::Terse,  
00133            "ArActionKeydrive: The key handler didn't have a key for space, something is wrong.");
00134 }
00135 
00136 AREXPORT void ArActionKeydrive::setSpeeds(double transVelMax, 
00137                       double turnAmountMax)
00138 {
00139   myTransVelMax = transVelMax;
00140   myTurnAmountMax = turnAmountMax;
00141 }
00142 
00143 AREXPORT void ArActionKeydrive::setIncrements(double velIncrement, 
00144                           double turnIncrement)
00145 {
00146   myVelIncrement = velIncrement;
00147   myTurnIncrement = turnIncrement;
00148 }
00149 
00150 AREXPORT void ArActionKeydrive::up(void)
00151 {
00152   myDeltaVel += myVelIncrement;
00153 }
00154 
00155 AREXPORT void ArActionKeydrive::down(void)
00156 {
00157   myDeltaVel -= myVelIncrement;
00158 }
00159 
00160 AREXPORT void ArActionKeydrive::left(void)
00161 {
00162   myTurnAmount += myTurnIncrement;
00163   if (myTurnAmount > myTurnAmountMax)
00164     myTurnAmount = myTurnAmountMax;
00165 }
00166 
00167 AREXPORT void ArActionKeydrive::right(void)
00168 {
00169   myTurnAmount -= myTurnIncrement;
00170   if (myTurnAmount < -myTurnAmountMax)
00171     myTurnAmount = -myTurnAmountMax;
00172 }
00173 
00174 AREXPORT void ArActionKeydrive::space(void)
00175 {
00176   mySpeedReset = false;
00177   myDesiredSpeed = 0;
00178   myTurnAmount = 0;
00179 }
00180 
00181 AREXPORT void ArActionKeydrive::activate(void)
00182 {
00183   if (!myIsActive)
00184     takeKeys();
00185   myIsActive = true;
00186 }
00187 
00188 AREXPORT void ArActionKeydrive::deactivate(void)
00189 {
00190   if (myIsActive)
00191     giveUpKeys();
00192   myIsActive = false;
00193   myDesiredSpeed = 0;
00194   myTurnAmount = 0;
00195 }
00196 
00197 AREXPORT ArActionDesired *ArActionKeydrive::fire(ArActionDesired currentDesired)
00198 {
00199   myDesired.reset();
00200 
00201   // if we don't have any strength left
00202   if (fabs(currentDesired.getVelStrength() - 1.0) < .0000000000001)
00203   {
00204     mySpeedReset = true;
00205   }
00206 
00207   // if our speed was reset, set our desired to how fast we're going now
00208   if (mySpeedReset && myDesiredSpeed > 0 && myDesiredSpeed > myRobot->getVel())
00209     myDesiredSpeed = myRobot->getVel();
00210   if (mySpeedReset && myDesiredSpeed < 0 && myDesiredSpeed < myRobot->getVel())
00211     myDesiredSpeed = myRobot->getVel();
00212   mySpeedReset = false;
00213 
00214   if (currentDesired.getMaxVelStrength() && 
00215       myDesiredSpeed > currentDesired.getMaxVel())
00216     myDesiredSpeed = currentDesired.getMaxVel();
00217 
00218   if (currentDesired.getMaxNegVelStrength() && 
00219       myDesiredSpeed < currentDesired.getMaxNegVel())
00220     myDesiredSpeed = currentDesired.getMaxNegVel();
00221 
00222   myDesiredSpeed += myDeltaVel;
00223   if (myDesiredSpeed > myTransVelMax)
00224     myDesiredSpeed = myTransVelMax;
00225   if (myDesiredSpeed < -myTransVelMax)
00226     myDesiredSpeed = -myTransVelMax;
00227 
00228   myDesired.setVel(myDesiredSpeed);
00229   myDeltaVel = 0;
00230   
00231   myDesired.setDeltaHeading(myTurnAmount);
00232   myTurnAmount = 0;
00233 
00234   
00235   return &myDesired;
00236 }

Generated on Tue Feb 20 10:51:38 2007 for Aria by  doxygen 1.4.0