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

ArRobotConfigPacketReader.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 "ariaOSDef.h"
00028 #include "ArExport.h"
00029 #include "ArRobotConfigPacketReader.h"
00030 #include "ArRobot.h"
00031 #include "ArRobotPacket.h"
00032 #include "ArCommands.h"
00033 
00041 ArRobotConfigPacketReader::ArRobotConfigPacketReader(ArRobot *robot, bool onlyOneRequest) : 
00042   myPacketHandlerCB(this, &ArRobotConfigPacketReader::packetHandler),
00043   myConnectedCB(this, &ArRobotConfigPacketReader::connected)
00044 {
00045   myRobot = robot;
00046   myRobot->addPacketHandler(&myPacketHandlerCB);
00047   myRobot->addConnectCB(&myConnectedCB);
00048   myOnlyOneRequest = onlyOneRequest;
00049   myPacketRequested = false;
00050   myPacketArrived = false;
00051 }
00052 
00053 ArRobotConfigPacketReader::~ArRobotConfigPacketReader(void)
00054 {
00055   myRobot->remPacketHandler(&myPacketHandlerCB);
00056   myRobot->remConnectCB(&myConnectedCB);
00057 }
00058 
00059 bool ArRobotConfigPacketReader::requestPacket(void)
00060 {
00061   // make sure we haven't already gotten one
00062   if (myOnlyOneRequest && myPacketArrived)
00063     return false;
00064 
00065   if (myPacketRequested && myLastPacketRequest.mSecSince() < 200)
00066     return true;
00067 
00068   myPacketArrived = false;
00069   myPacketRequested = true;
00070   myLastPacketRequest.setToNow();
00071   myRobot->comInt(ArCommands::CONFIG, 1);
00072   return true;
00073 }
00074 
00075 void ArRobotConfigPacketReader::connected(void)
00076 {
00077   if (myPacketRequested)
00078     myRobot->comInt(ArCommands::CONFIG, 1);
00079 }
00080 
00081 bool ArRobotConfigPacketReader::packetHandler(ArRobotPacket *packet)
00082 {
00083   char buf[256];
00084 
00085   // if this isn't the right packet ignore it
00086   if (packet->getID() != 0x20)
00087     return false;
00088   // if we've already gotten our one request ignore it
00089   if (myPacketArrived)
00090     return false;
00091   // if we haven't requested a packet ignore it
00092   if (!myPacketRequested)
00093     return false;
00094 
00095   myPacketRequested = false;
00096   myPacketArrived = true;
00097   // read in all the data
00098   packet->bufToStr(buf, sizeof(buf));
00099   myType = buf;
00100   packet->bufToStr(buf, sizeof(buf));
00101   mySubType = buf;
00102   packet->bufToStr(buf, sizeof(buf));
00103   mySerialNumber = buf;
00104   packet->bufToUByte();
00105   myRotVelTop = packet->bufToUByte2();
00106   myTransVelTop = packet->bufToUByte2();
00107   myRotAccelTop = packet->bufToUByte2();
00108   myTransAccelTop = packet->bufToUByte2();
00109   myPwmMax = packet->bufToUByte2();
00110   packet->bufToStr(buf, sizeof(buf));
00111   myName = buf;
00112   mySipCycleTime = packet->bufToUByte();
00113   myHostBaud = packet->bufToUByte();
00114   myAux1Baud = packet->bufToUByte();
00115   myHasGripper = (bool)packet->bufToUByte2();
00116   myFrontSonar = (bool) packet->bufToUByte2();
00117   myRearSonar = (bool) packet->bufToUByte();
00118   myLowBattery = packet->bufToUByte2();
00119   myRevCount = packet->bufToUByte2();
00120   myWatchdog = packet->bufToUByte2();
00121   myNormalMPacs = (bool) packet->bufToUByte();
00122   myStallVal = packet->bufToUByte2();
00123   myStallCount = packet->bufToUByte2();
00124   myJoyVel = packet->bufToUByte2();
00125   myJoyRotVel = packet->bufToUByte2();
00126   myRotVelMax = packet->bufToUByte2();
00127   myTransVelMax = packet->bufToUByte2();
00128   myRotAccel = packet->bufToUByte2();
00129   myRotDecel = packet->bufToUByte2();
00130   myRotKP = packet->bufToUByte2();
00131   myRotKV = packet->bufToUByte2();
00132   myRotKI = packet->bufToUByte2();
00133   myTransAccel = packet->bufToUByte2();
00134   myTransDecel = packet->bufToUByte2();
00135   myTransKP = packet->bufToUByte2();
00136   myTransKV = packet->bufToUByte2();
00137   myTransKI = packet->bufToUByte2();
00138   myFrontBumps = packet->bufToUByte();
00139   myRearBumps = packet->bufToUByte();
00140   myHasCharger = packet->bufToUByte();
00141   mySonarCycle = packet->bufToUByte();
00142   if (packet->bufToUByte() == 2)
00143     myResetBaud = true;
00144   else
00145     myResetBaud = false;
00146   if (packet->bufToUByte() == 1)
00147     myHasGyro = true;
00148   else
00149     myHasGyro = false;
00150   myDriftFactor = packet->bufToUByte2();
00151   myAux2Baud = packet->bufToUByte();
00152   myAux3Baud = packet->bufToUByte();
00153   myTicksMM = packet->bufToUByte2();
00154   myShutdownVoltage = packet->bufToUByte2();
00155   return true;
00156 }
00157   
00158 void ArRobotConfigPacketReader::log(void) const
00159 {
00160   ArLog::log(ArLog::Terse, "General information:");
00161   ArLog::log(ArLog::Terse, "Robot is type '%s' subtype '%s'",
00162              getType(), getSubType());
00163   ArLog::log(ArLog::Terse, "serial number '%s' name '%s'", 
00164              getSerialNumber(), getName());
00165   ArLog::log(ArLog::Terse, "Intrinsic properties and unsettable maxes:");
00166   ArLog::log(ArLog::Terse, "RotVelTop %d RotAccelTop %d", 
00167              getRotVelTop(), getRotAccelTop());
00168   ArLog::log(ArLog::Terse, "TransVelTop %d TransAccelTop %d", 
00169              getTransVelTop(), getTransAccelTop());
00170   ArLog::log(ArLog::Terse, "PWMMax %d ResetBaud %s", getPwmMax(),
00171              ArUtil::convertBool(getResetBaud()));
00172   ArLog::log(ArLog::Terse, "Current values:");
00173   ArLog::log(ArLog::Terse, "RotVelMax %d RotAccel %d RotDecel %d", 
00174              getRotVelMax(), getRotAccel(), getRotDecel());
00175   ArLog::log(ArLog::Terse, "TransVelMax %d TransAccel %d TransDecel %d", 
00176              getTransVelMax(), getTransAccel(), getTransDecel());
00177   
00178   ArLog::log(ArLog::Terse, "Accessories:");
00179   ArLog::log(ArLog::Terse, 
00180              "Gripper %s FrontSonar %s RearSonar %s Charger %d Gyro %s", 
00181              ArUtil::convertBool(getHasGripper()), 
00182              ArUtil::convertBool(getFrontSonar()), 
00183              ArUtil::convertBool(getRearSonar()), 
00184              getHasCharger(),
00185              ArUtil::convertBool(getHasGyro()));
00186   ArLog::log(ArLog::Terse, "FrontBumps %d RearBumps %d", 
00187              getFrontBumps(), getRearBumps());
00188   ArLog::log(ArLog::Terse, "Settings:");
00189   ArLog::log(ArLog::Terse, "SipCycle %d SonarCycle %d HostBaud %d Aux1Baud %d ", getSipCycleTime(), getSonarCycle(), getHostBaud(), getAux1Baud());
00190   ArLog::log(ArLog::Terse, "StallVal %d StallCount %d RevCount %d Watchdog %d ",
00191              getStallVal(), getStallCount(), getRevCount(), getWatchdog());
00192   
00193   ArLog::log(ArLog::Terse, "JoyVel %d JoyRVel %d NormalMotorPackets %s ", getJoyVel(), getJoyRotVel(), ArUtil::convertBool(getNormalMPacs()));
00194   ArLog::log(ArLog::Terse, "PID Settings:");
00195   ArLog::log(ArLog::Terse, "Rot kp %d kv %d ki %d", getRotKP(), getRotKV(),
00196              getRotKI());
00197   ArLog::log(ArLog::Terse, "Trans kp %d kv %d ki %d", getTransKP(), 
00198              getTransKV(), getTransKI());
00199   ArLog::log(ArLog::Terse, "DriftFactor %d", getDriftFactor());
00200   ArLog::log(ArLog::Terse, "Aux2Baud setting %d, Aux3Baud setting %d", getAux2Baud(), getAux3Baud());
00201   ArLog::log(ArLog::Terse, "TicksMM: %d", getTicksMM());
00202   ArLog::log(ArLog::Terse, "Shutdown Voltage: %d", getShutdownVoltage());
00203 }

Generated on Wed Oct 19 12:56:36 2005 for Aria by  doxygen 1.4.0