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 #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
00077
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
00103
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
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
00178 myInput->setTransRatio(myTransRatio);
00179 myInput->setRotRatio(myRotRatio);
00180 myInput->setThrottleRatio(myThrottle);
00181
00182
00183 myRotRatio = 0;
00184
00185 if (myHaveKeys)
00186 return;
00187 ArKeyHandler *keyHandler;
00188
00189
00190 if ((keyHandler = Aria::getKeyHandler()) == NULL)
00191 {
00192 keyHandler = new ArKeyHandler;
00193 Aria::setKeyHandler(keyHandler);
00194 myRobot->attachKeyHandler(keyHandler);
00195 }
00196 takeKeys();
00197 }