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

ArDPPTU.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 "ArDPPTU.h"
00029 #include "ArCommands.h"
00030 
00031 const double ArDPPTU::CONVERT = 0.0514; 
00032 
00033 AREXPORT ArDPPTUPacket::ArDPPTUPacket(ArTypes::UByte2 bufferSize) :
00034   ArBasePacket(bufferSize, 0)
00035 {
00036 }
00037 
00038 AREXPORT ArDPPTUPacket::~ArDPPTUPacket()
00039 {
00040 
00041 }
00042 
00043 AREXPORT void ArDPPTUPacket::byte2ToBuf(int val)
00044 {
00045   int i;
00046   char buf[5];
00047   if (myLength + 4 > myMaxLength)
00048   {
00049     ArLog::log(ArLog::Terse, "ArDPPTUPacket::uByte2ToBuf: Trying to add beyond length of buffer.");
00050     return;
00051   }
00052 
00053   sprintf(buf, "%d", val);
00054 
00055   for (i=0;i<(int)strlen(buf);i++)
00056   {
00057       myBuf[myLength] = buf[i];
00058       ++myLength;
00059   }
00060 }
00061 
00062 AREXPORT void ArDPPTUPacket::finalizePacket(void)
00063 {
00064     ArDPPTUPacket::uByteToBuf(ArDPPTUCommands::DELIM);
00065 }
00066 
00067 AREXPORT ArDPPTU::ArDPPTU(ArRobot *robot) :
00068   ArPTZ(robot)
00069 {
00070   myRobot = robot;
00071   myPanSlew = 40; //Default to 1000 positions/sec
00072   myTiltSlew = 40; //Defaults to 1000 positions/sec
00073 }
00074 
00075 AREXPORT ArDPPTU::~ArDPPTU()
00076 {
00077 }
00078 
00079 void ArDPPTU::preparePacket(void)
00080 {
00081   myPacket.empty();
00082   myPacket.byteToBuf(ArDPPTUCommands::DELIM);
00083 }
00084 
00085 AREXPORT bool ArDPPTU::init(void)
00086 {
00087   preparePacket();
00088   myPacket.byteToBuf(ArDPPTUCommands::INIT);
00089 
00090   if (!sendPacket(&myPacket))
00091     return false;
00092 
00093   myPan = -1;  //myPan and myTilt set to -1 for initial positioning
00094   myTilt = -1;
00095 
00096   if (!panTilt(0,0))
00097     return false;
00098 
00099   //Assuming default accel and slew rates
00100   myPanSlew = 40; // 1000 positions/sec
00101   myBasePanSlew = 40; // 1000 positions/sec
00102   myTiltSlew = 40; // 1000 positions/sec
00103   myBaseTiltSlew = 40; // 1000 positions/sec
00104   myPanAccel = 80; // 2000 positions/sec^2
00105   myTiltAccel = 80; // 2000 positions/sec^2
00106 
00107   return true;
00108 }
00109 
00111 AREXPORT bool ArDPPTU::blank(void)
00112 {
00113   myPacket.empty();
00114   return sendPacket(&myPacket);
00115 }
00116 
00117 AREXPORT bool ArDPPTU::panTilt(double pdeg, double tdeg)
00118 {
00119   if (pdeg > getMaxPosPan())
00120     pdeg = getMaxPosPan();
00121   if (pdeg < getMaxNegPan())
00122     pdeg = getMaxNegPan();
00123 
00124   if (tdeg > getMaxPosTilt())
00125     tdeg = getMaxPosTilt();
00126   if (tdeg < getMaxNegTilt())
00127     tdeg = getMaxNegTilt();
00128 
00129   if (pdeg != myPan)
00130   {
00131     preparePacket();
00132     myPacket.byteToBuf(ArDPPTUCommands::PAN);
00133     myPacket.byteToBuf(ArDPPTUCommands::PAN);
00134     myPacket.byte2ToBuf(ArMath::roundInt(pdeg/CONVERT));
00135 
00136     myPan = pdeg;
00137     if (!sendPacket(&myPacket)) return false;
00138   }
00139 
00140   if (tdeg != myTilt)
00141   {
00142     preparePacket();
00143     myPacket.byteToBuf(ArDPPTUCommands::TILT);
00144     myPacket.byteToBuf(ArDPPTUCommands::PAN);
00145     myPacket.byte2ToBuf(ArMath::roundInt(tdeg/CONVERT));
00146 
00147     myTilt = tdeg;
00148     if (!sendPacket(&myPacket)) return false;
00149   }
00150 
00151   return true;
00152 }
00153 
00154 AREXPORT bool ArDPPTU::panSlew(double deg)
00155 {
00156   if (deg > getMaxPanSlew())
00157     deg = getMaxPanSlew();
00158   if (deg < getMinPanSlew())
00159     deg = getMinPanSlew();
00160   
00161   myPanSlew = deg;
00162   preparePacket();
00163   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00164   myPacket.byteToBuf(ArDPPTUCommands::SPEED);
00165 
00166   myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00167 
00168   return sendPacket(&myPacket);
00169 }
00170 
00171 AREXPORT bool ArDPPTU::tiltSlew(double deg)
00172 {
00173   if (deg > getMaxTiltSlew())
00174     deg = getMaxTiltSlew();
00175   if (deg < getMinTiltSlew())
00176     deg = getMinTiltSlew();
00177   
00178   myTiltSlew = deg;
00179   preparePacket();
00180   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00181   myPacket.byteToBuf(ArDPPTUCommands::SPEED);
00182 
00183   myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00184 
00185   return sendPacket(&myPacket);
00186 }
00187 
00188 AREXPORT bool ArDPPTU::resetCalib(void)
00189 {
00190   preparePacket();
00191   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00192   return sendPacket(&myPacket);
00193 }
00194 
00195 AREXPORT bool ArDPPTU::disableReset(void)
00196 {
00197   preparePacket();
00198   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00199   myPacket.byteToBuf(ArDPPTUCommands::DISABLE);
00200 
00201   return sendPacket(&myPacket);
00202 }
00203 
00204 AREXPORT bool ArDPPTU::resetTilt(void)
00205 {
00206   preparePacket();
00207   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00208   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00209 
00210   return sendPacket(&myPacket);
00211 }
00212 
00213 AREXPORT bool ArDPPTU::resetPan(void)
00214 {
00215   preparePacket();
00216   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00217   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00218 
00219   return sendPacket(&myPacket);
00220 }
00221 
00222 AREXPORT bool ArDPPTU::resetAll(void)
00223 {
00224   preparePacket();
00225   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00226   myPacket.byteToBuf(ArDPPTUCommands::ENABLE);
00227 
00228   return sendPacket(&myPacket);
00229 }
00230 
00231 AREXPORT bool ArDPPTU::saveSet(void)
00232 {
00233   preparePacket();
00234   myPacket.byteToBuf(ArDPPTUCommands::DISABLE);
00235   myPacket.byteToBuf(ArDPPTUCommands::SPEED);
00236 
00237   return sendPacket(&myPacket);
00238 }
00239 
00240 AREXPORT bool ArDPPTU::restoreSet(void)
00241 {
00242   preparePacket();
00243   myPacket.byteToBuf(ArDPPTUCommands::DISABLE);
00244   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00245 
00246   return sendPacket(&myPacket);
00247 }
00248 
00249 AREXPORT bool ArDPPTU::factorySet(void)
00250 {
00251   preparePacket();
00252   myPacket.byteToBuf(ArDPPTUCommands::DISABLE);
00253   myPacket.byteToBuf(ArDPPTUCommands::FACTORY);
00254 
00255   return sendPacket(&myPacket);
00256 }
00257 
00258 AREXPORT bool ArDPPTU::limitEnforce(bool val)
00259 {
00260   preparePacket();
00261   myPacket.byteToBuf(ArDPPTUCommands::LIMIT);
00262 
00263   if (val)
00264     myPacket.byteToBuf(ArDPPTUCommands::ENABLE);
00265   else
00266     myPacket.byteToBuf(ArDPPTUCommands::DISABLE);
00267 
00268   return sendPacket(&myPacket);
00269 }
00270 
00271 AREXPORT bool ArDPPTU::immedExec(void)
00272 {
00273   preparePacket();
00274   myPacket.byteToBuf(ArDPPTUCommands::IMMED);
00275 
00276   return sendPacket(&myPacket);
00277 }
00278 
00279 AREXPORT bool ArDPPTU::slaveExec(void)
00280 {
00281   preparePacket();
00282   myPacket.byteToBuf(ArDPPTUCommands::SPEED);
00283 
00284   return sendPacket(&myPacket);
00285 }
00286 
00287 AREXPORT bool ArDPPTU::awaitExec(void)
00288 {
00289   preparePacket();
00290   myPacket.byteToBuf(ArDPPTUCommands::ACCEL);
00291 
00292   return sendPacket(&myPacket);
00293 }
00294 
00295 
00296 AREXPORT bool ArDPPTU::haltAll(void)
00297 {
00298   preparePacket();
00299   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00300 
00301   return sendPacket(&myPacket);
00302 }
00303 
00304 AREXPORT bool ArDPPTU::haltPan(void)
00305 {
00306   preparePacket();
00307   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00308   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00309 
00310   return sendPacket(&myPacket);
00311 }
00312 
00313 AREXPORT bool ArDPPTU::haltTilt(void)
00314 {
00315   preparePacket();
00316   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00317   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00318 
00319   return sendPacket(&myPacket);
00320 }
00321 
00322 
00323 AREXPORT bool ArDPPTU::panAccel(double deg)
00324 {
00325   if (deg > getMaxPanAccel())
00326     deg = getMaxPanAccel();
00327   if (deg < getMinPanAccel())
00328     deg = getMinPanAccel();
00329 
00330   if (myPanAccel != deg) {
00331     preparePacket();
00332     myPacket.byteToBuf(ArDPPTUCommands::PAN);
00333     myPacket.byteToBuf(ArDPPTUCommands::ACCEL);
00334     myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00335 
00336     return sendPacket(&myPacket);
00337   }
00338 
00339   return true;
00340 }
00341 
00342 AREXPORT bool ArDPPTU::tiltAccel(double deg)
00343 {
00344   if (deg > getMaxPanAccel())
00345     deg = getMaxPanAccel();
00346   if (deg < getMinPanAccel())
00347     deg = getMinPanAccel();
00348 
00349   if (myTiltAccel != deg) {
00350     preparePacket();
00351     myPacket.byteToBuf(ArDPPTUCommands::TILT);
00352     myPacket.byteToBuf(ArDPPTUCommands::ACCEL);
00353     myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00354 
00355     return sendPacket(&myPacket);
00356   }
00357 
00358   return true;
00359 }
00360 
00361 AREXPORT bool ArDPPTU::basePanSlew(double deg)
00362 {
00363   myBasePanSlew = deg;
00364 
00365   preparePacket();
00366   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00367   myPacket.byteToBuf(ArDPPTUCommands::BASE);
00368   myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00369 
00370   return sendPacket(&myPacket);
00371 }
00372 
00373 AREXPORT bool ArDPPTU::baseTiltSlew(double deg)
00374 {
00375   myBaseTiltSlew = deg;
00376 
00377   preparePacket();
00378   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00379   myPacket.byteToBuf(ArDPPTUCommands::BASE);
00380   myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00381 
00382   return sendPacket(&myPacket);
00383 }
00384 
00385 AREXPORT bool ArDPPTU::upperPanSlew(double deg)
00386 {
00387   preparePacket();
00388   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00389   myPacket.byteToBuf(ArDPPTUCommands::UPPER);
00390   myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00391 
00392   return sendPacket(&myPacket);
00393 }
00394 
00395 AREXPORT bool ArDPPTU::lowerPanSlew(double deg)
00396 {
00397   preparePacket();
00398   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00399   myPacket.byteToBuf(ArDPPTUCommands::LIMIT);
00400   myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00401 
00402   return sendPacket(&myPacket);
00403 }
00404 
00405 AREXPORT bool ArDPPTU::upperTiltSlew(double deg)
00406 {
00407   preparePacket();
00408   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00409   myPacket.byteToBuf(ArDPPTUCommands::UPPER);
00410   myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00411 
00412   return sendPacket(&myPacket);
00413 }
00414 
00415 AREXPORT bool ArDPPTU::lowerTiltSlew(double deg)
00416 {
00417   preparePacket();
00418   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00419   myPacket.byteToBuf(ArDPPTUCommands::LIMIT);
00420   myPacket.byte2ToBuf(ArMath::roundInt(deg/CONVERT));
00421 
00422   return sendPacket(&myPacket);
00423 }
00424 
00425 AREXPORT bool ArDPPTU::indepMove(void)
00426 {
00427   preparePacket();
00428   myPacket.byteToBuf(ArDPPTUCommands::CONTROL);
00429   myPacket.byteToBuf(ArDPPTUCommands::IMMED);
00430 
00431   return sendPacket(&myPacket);
00432 }
00433 
00434 AREXPORT bool ArDPPTU::velMove(void)
00435 {
00436   preparePacket();
00437   myPacket.byteToBuf(ArDPPTUCommands::CONTROL);
00438   myPacket.byteToBuf(ArDPPTUCommands::VELOCITY);
00439 
00440   return sendPacket(&myPacket);
00441 }
00442 
00443 AREXPORT bool ArDPPTU::enMon(void)
00444 {
00445   preparePacket();
00446   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00447   myPacket.byteToBuf(ArDPPTUCommands::ENABLE);
00448 
00449   return sendPacket(&myPacket);
00450 }
00451 
00452 AREXPORT bool ArDPPTU::disMon(void)
00453 {
00454   preparePacket();
00455   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00456   myPacket.byteToBuf(ArDPPTUCommands::DISABLE);
00457 
00458   return sendPacket(&myPacket);
00459 }
00460 
00461 AREXPORT bool ArDPPTU::initMon(double deg1, double deg2, 
00462                    double deg3, double deg4)
00463 {
00464 
00465   preparePacket();
00466   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00467 
00468   myPacket.byte2ToBuf(ArMath::roundInt(deg1/CONVERT));
00469   myPacket.byteToBuf(',');
00470   myPacket.byte2ToBuf(ArMath::roundInt(deg2/CONVERT));
00471   myPacket.byteToBuf(',');
00472   myPacket.byte2ToBuf(ArMath::roundInt(deg3/CONVERT));
00473   myPacket.byteToBuf(',');
00474   myPacket.byte2ToBuf(ArMath::roundInt(deg4/CONVERT));
00475 
00476   return sendPacket(&myPacket);
00477 }
00478 
00479 AREXPORT bool ArDPPTU::offStatPower(void)
00480 {
00481   preparePacket();
00482   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00483   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00484   myPacket.byteToBuf(ArDPPTUCommands::OFFSET);
00485 
00486   if (!sendPacket(&myPacket))
00487     return false;
00488 
00489   preparePacket();
00490   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00491   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00492   myPacket.byteToBuf(ArDPPTUCommands::OFFSET);
00493 
00494   return sendPacket(&myPacket);
00495 }
00496 
00497 AREXPORT bool ArDPPTU::regStatPower(void)
00498 {
00499   preparePacket();
00500   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00501   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00502   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00503 
00504   if (!sendPacket(&myPacket))
00505     return false;
00506 
00507   preparePacket();
00508   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00509   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00510   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00511 
00512   return sendPacket(&myPacket);
00513 }
00514 
00515 AREXPORT bool ArDPPTU::lowStatPower(void)
00516 {
00517   preparePacket();
00518   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00519   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00520   myPacket.byteToBuf(ArDPPTUCommands::LIMIT);
00521 
00522   if (!sendPacket(&myPacket))
00523     return false;
00524 
00525   preparePacket();
00526   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00527   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00528   myPacket.byteToBuf(ArDPPTUCommands::LIMIT);
00529 
00530   return sendPacket(&myPacket);
00531 }
00532 
00533 AREXPORT bool ArDPPTU::lowMotPower(void)
00534 {
00535   preparePacket();
00536   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00537   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00538   myPacket.byteToBuf(ArDPPTUCommands::LIMIT);
00539 
00540   if (!sendPacket(&myPacket))
00541     return false;
00542 
00543   preparePacket();
00544   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00545   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00546   myPacket.byteToBuf(ArDPPTUCommands::LIMIT);
00547 
00548   return sendPacket(&myPacket);
00549 }
00550 
00551 AREXPORT bool ArDPPTU::regMotPower(void)
00552 {
00553   preparePacket();
00554   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00555   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00556   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00557 
00558   if (!sendPacket(&myPacket))
00559     return false;
00560 
00561   preparePacket();
00562   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00563   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00564   myPacket.byteToBuf(ArDPPTUCommands::RESET);
00565 
00566   return sendPacket(&myPacket);
00567 }
00568 
00569 AREXPORT bool ArDPPTU::highMotPower(void)
00570 {
00571   preparePacket();
00572   myPacket.byteToBuf(ArDPPTUCommands::PAN);
00573   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00574   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00575 
00576   if (!sendPacket(&myPacket))
00577     return false;
00578 
00579   preparePacket();
00580   myPacket.byteToBuf(ArDPPTUCommands::TILT);
00581   myPacket.byteToBuf(ArDPPTUCommands::MONITOR);
00582   myPacket.byteToBuf(ArDPPTUCommands::HALT);
00583 
00584   return sendPacket(&myPacket);
00585 }

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