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