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

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

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