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 "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
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
00096
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
00121
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
00203 if (fabs(currentDesired.getVelStrength() - 1.0) < .0000000000001)
00204 {
00205 mySpeedReset = true;
00206 }
00207
00208
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 }