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 "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;
00072 myTiltSlew = 40;
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;
00094 myTilt = -1;
00095
00096 if (!panTilt(0,0))
00097 return false;
00098
00099
00100 myPanSlew = 40;
00101 myBasePanSlew = 40;
00102 myTiltSlew = 40;
00103 myBaseTiltSlew = 40;
00104 myPanAccel = 80;
00105 myTiltAccel = 80;
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 }