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

ArRatioInputKeydrive.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 "ArRatioInputKeydrive.h"
00029 #include "ArRobot.h"
00030 #include "ariaInternal.h"
00031 #include "ArKeyHandler.h"
00032 
00033 AREXPORT ArRatioInputKeydrive::ArRatioInputKeydrive(ArRobot *robot, 
00034                             ArActionRatioInput *input,
00035                             int priority,
00036                             double velIncrement) :
00037   myUpCB(this, &ArRatioInputKeydrive::up),
00038   myDownCB(this, &ArRatioInputKeydrive::down),
00039   myLeftCB(this, &ArRatioInputKeydrive::left),
00040   myRightCB(this, &ArRatioInputKeydrive::right),
00041   mySpaceCB(this, &ArRatioInputKeydrive::space),
00042   myFireCB(this, &ArRatioInputKeydrive::fireCallback),
00043   myActivateCB(this, &ArRatioInputKeydrive::activate),
00044   myDeactivateCB(this, &ArRatioInputKeydrive::deactivate)
00045 {
00046   myRobot = robot;
00047   myInput = input;
00048   myInput->addFireCallback(priority, &myFireCB);
00049   myInput->addActivateCallback(&myActivateCB);
00050   myInput->addDeactivateCallback(&myDeactivateCB);
00051   myFireCB.setName("Keydrive");
00052   myVelIncrement = velIncrement;
00053   myHaveKeys = false;
00054   myTransRatio = 0;
00055   myRotRatio = 0;
00056   myThrottle = 100;
00057   myPrinting = false;
00058 }
00059 
00060 AREXPORT ArRatioInputKeydrive::~ArRatioInputKeydrive()
00061 {
00062   myInput->remFireCallback(&myFireCB);
00063   myInput->remActivateCallback(&myActivateCB);
00064 }
00065 
00066 
00067 AREXPORT void ArRatioInputKeydrive::takeKeys(void)
00068 {
00069   myHaveKeys = true;
00070   ArKeyHandler *keyHandler;
00071   if ((keyHandler = Aria::getKeyHandler()) == NULL)
00072   {
00073     ArLog::log(ArLog::Terse, 
00074            "ArRatioInputKeydrive::takeKeys: There is no key handler, keydrive will not work.");
00075   }
00076   // now that we have one, add our keys as callbacks, print out big
00077   // warning messages if they fail
00078   if (!keyHandler->addKeyHandler(ArKeyHandler::UP, &myUpCB))
00079     ArLog::log(ArLog::Terse, "The key handler already has a key for up, keydrive will not work correctly.");
00080   if (!keyHandler->addKeyHandler(ArKeyHandler::DOWN, &myDownCB))
00081     ArLog::log(ArLog::Terse, "The key handler already has a key for down, keydrive will not work correctly.");
00082   if (!keyHandler->addKeyHandler(ArKeyHandler::LEFT, &myLeftCB))
00083     ArLog::log(ArLog::Terse,  
00084            "The key handler already has a key for left, keydrive will not work correctly.");
00085   if (!keyHandler->addKeyHandler(ArKeyHandler::RIGHT, &myRightCB))
00086     ArLog::log(ArLog::Terse,  
00087            "The key handler already has a key for right, keydrive will not work correctly.");
00088   if (!keyHandler->addKeyHandler(ArKeyHandler::SPACE, &mySpaceCB))
00089     ArLog::log(ArLog::Terse,  
00090            "The key handler already has a key for space, keydrive will not work correctly.");
00091 }
00092 
00093 AREXPORT void ArRatioInputKeydrive::giveUpKeys(void)
00094 {
00095   ArKeyHandler *keyHandler;
00096   myHaveKeys = false;
00097   if ((keyHandler = Aria::getKeyHandler()) == NULL)
00098   {
00099     ArLog::log(ArLog::Terse, 
00100            "ArRatioInputKeydrive::giveUpKeys: There is no key handler, something is probably horribly wrong .");
00101   }
00102   // now that we have one, add our keys as callbacks, print out big
00103   // warning messages if they fail
00104   if (!keyHandler->remKeyHandler(&myUpCB))
00105     ArLog::log(ArLog::Terse, "ArRatioInputKeydrive: The key handler already didn't have a key for up, something is wrong.");
00106   if (!keyHandler->remKeyHandler(&myDownCB))
00107     ArLog::log(ArLog::Terse, "ArRatioInputKeydrive: The key handler already didn't have a key for down, something is wrong.");
00108   if (!keyHandler->remKeyHandler(&myLeftCB))
00109     ArLog::log(ArLog::Terse,  
00110            "ArRatioInputKeydrive: The key handler already didn't have a key for left, something is wrong.");
00111   if (!keyHandler->remKeyHandler(&myRightCB))
00112     ArLog::log(ArLog::Terse,  
00113            "ArRatioInputKeydrive: The key handler already didn't have a key for right, something is wrong.");
00114   if (!keyHandler->remKeyHandler(&mySpaceCB))
00115     ArLog::log(ArLog::Terse,  
00116            "ArRatioInputKeydrive: The key handler didn't have a key for space, something is wrong.");
00117 }
00118 
00119 
00120 AREXPORT void ArRatioInputKeydrive::up(void)
00121 {
00122   if (myPrinting)
00123     printf("up\n");
00124   myTransRatio += myVelIncrement;
00125   if (myTransRatio > 100)
00126     myTransRatio = 100;
00127 }
00128 
00129 AREXPORT void ArRatioInputKeydrive::down(void)
00130 {
00131   if (myPrinting)
00132     printf("down\n");
00133   myTransRatio -= myVelIncrement;
00134   if (myTransRatio < -100)
00135     myTransRatio = -100;
00136 }
00137 
00138 AREXPORT void ArRatioInputKeydrive::left(void)
00139 {
00140   if (myPrinting)
00141     printf("left\n");
00142   myRotRatio = 100;
00143 }
00144 
00145 AREXPORT void ArRatioInputKeydrive::right(void)
00146 {
00147   if (myPrinting)
00148     printf("right\n");
00149   myRotRatio = -100;
00150 }
00151 
00152 AREXPORT void ArRatioInputKeydrive::space(void)
00153 {
00154   if (myPrinting)
00155     printf("stop\n");
00156   myTransRatio = 0;
00157   myRotRatio = 0;
00158 }
00159 
00160 AREXPORT void ArRatioInputKeydrive::activate(void)
00161 {
00162   // set things so we'll stop
00163   myTransRatio = 0;
00164   myRotRatio = 0;
00165   if (myHaveKeys)
00166     takeKeys();
00167 }
00168 
00169 AREXPORT void ArRatioInputKeydrive::deactivate(void)
00170 {
00171   if (myHaveKeys)
00172     giveUpKeys();
00173 }
00174 
00175 AREXPORT void ArRatioInputKeydrive::fireCallback(void)
00176 {
00177   // set what we want to do
00178   myInput->setTransRatio(myTransRatio);
00179   myInput->setRotRatio(myRotRatio);
00180   myInput->setThrottleRatio(myThrottle);
00181 
00182   // reset us to going straight (if they're holding the key we'll keep turning)
00183   myRotRatio = 0;
00184 
00185   if (myHaveKeys)
00186     return;
00187   ArKeyHandler *keyHandler;
00188    
00189   // see if there is already a keyhandler, if not make one for ourselves
00190   if ((keyHandler = Aria::getKeyHandler()) == NULL)
00191   {
00192     keyHandler = new ArKeyHandler;
00193     Aria::setKeyHandler(keyHandler);
00194     myRobot->attachKeyHandler(keyHandler);
00195   }
00196   takeKeys();
00197 }

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