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

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