Go to the documentation of this file.00001 #include "robodyn_mechanisms/GripperStatusChecker.h"
00002
00003 GripperStatusChecker::GripperStatusChecker()
00004 {
00005 timer = ros::Duration(0);
00006 requestTimeOut = ros::Duration(0);
00007 grantTimeOut = ros::Duration(0);
00008 }
00009
00010 GripperStatusChecker::~GripperStatusChecker()
00011 {
00012 }
00013
00014 void GripperStatusChecker::initializeMap(const std::vector<std::string>& grippers)
00015 {
00016
00017 GripperStatusCheckInfo initData;
00018
00019 initData.pilotMode = r2_msgs::JointControlMode::BOOTLOADER;
00020 initData.captainMode = r2_msgs::JointControlMode::BOOTLOADER;
00021 initData.pilotRequest = false;
00022 initData.captainRequest = false;
00023 initData.engineerCheck = false;
00024 initData.state = IDLE;
00025
00026 for (unsigned int i = 0; i < grippers.size(); ++i)
00027 {
00028 gripperInfoMap[grippers[i]] = initData;
00029 }
00030
00031 }
00032
00033 void GripperStatusChecker::setTimingParameters(const double& rTimeOut, const double& gTimeOut)
00034 {
00035 requestTimeOut = ros::Duration(rTimeOut);
00036 grantTimeOut = ros::Duration(gTimeOut);
00037 }
00038
00039 bool GripperStatusChecker::getMapEntry(const std::string& name, GripperStatusCheckInfo& info)
00040 {
00041 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00042
00043 if ((gripIt = gripperInfoMap.find(name)) != gripperInfoMap.end())
00044 {
00045 info = gripIt->second;
00046 return true;
00047 }
00048
00049 return false;
00050 }
00051
00052 int GripperStatusChecker::getState(const std::string& name)
00053 {
00054 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00055
00056 if ((gripIt = gripperInfoMap.find(name)) != gripperInfoMap.end())
00057 {
00058 return gripIt->second.state;
00059 }
00060
00061 return -1;
00062 }
00063
00064 void GripperStatusChecker::populateJointControlPilotInfo(const r2_msgs::JointControlDataArray& jointControlMsg)
00065 {
00066 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00067
00068 if (jointControlMsg.joint.size() == jointControlMsg.data.size())
00069 {
00070 for (unsigned int i = 0; i < jointControlMsg.joint.size(); ++i)
00071 {
00072 if ((gripIt = gripperInfoMap.find(jointControlMsg.joint[i])) != gripperInfoMap.end())
00073 {
00074 gripIt->second.pilotMode = jointControlMsg.data[i].controlMode.state;
00075 }
00076 }
00077 }
00078
00079 return;
00080 }
00081
00082 void GripperStatusChecker::populateJointControlCaptainInfo(const r2_msgs::JointControlDataArray& jointControlMsg)
00083 {
00084 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00085
00086 if (jointControlMsg.joint.size() == jointControlMsg.data.size())
00087 {
00088 for (unsigned int i = 0; i < jointControlMsg.joint.size(); ++i)
00089 {
00090 if ((gripIt = gripperInfoMap.find(jointControlMsg.joint[i])) != gripperInfoMap.end())
00091 {
00092 gripIt->second.captainMode = jointControlMsg.data[i].controlMode.state;
00093 }
00094 }
00095 }
00096
00097 return;
00098 }
00099
00100 void GripperStatusChecker::populatePilotRequestInfo(const r2_msgs::StringArray& pilotRequest)
00101 {
00102 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00103
00104 for (unsigned int i = 0; i < pilotRequest.data.size(); ++i)
00105 {
00106 if ((gripIt = gripperInfoMap.find(pilotRequest.data[i])) != gripperInfoMap.end())
00107 {
00108 gripIt->second.pilotRequest = true;
00109 }
00110 }
00111
00112 return;
00113 }
00114
00115 void GripperStatusChecker::populateCaptainRequestInfo(const r2_msgs::StringArray& captainRequest)
00116 {
00117 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00118
00119 for (unsigned int i = 0; i < captainRequest.data.size(); ++i)
00120 {
00121 if ((gripIt = gripperInfoMap.find(captainRequest.data[i])) != gripperInfoMap.end())
00122 {
00123 gripIt->second.captainRequest = true;
00124 }
00125 }
00126
00127 return;
00128 }
00129
00130 void GripperStatusChecker::createEngineerCheckMsg(r2_msgs::StringArray& engineerCheckMsg)
00131 {
00132 engineerCheckMsg.header.stamp = ros::Time::now();
00133 engineerCheckMsg.data.clear();
00134
00135 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00136
00137 for (gripIt = gripperInfoMap.begin(); gripIt != gripperInfoMap.end(); ++gripIt)
00138 {
00139 if (gripIt->second.engineerCheck)
00140 {
00141 engineerCheckMsg.data.push_back(gripIt->first);
00142 }
00143 }
00144
00145 return;
00146 }
00147
00148 void GripperStatusChecker::createSweStopMessage(diagnostic_msgs::DiagnosticArray& sweStopMsg)
00149 {
00150 sweStopMsg.header.stamp = ros::Time::now();
00151 sweStopMsg.status.clear();
00152
00153 sweStopMsg.status = sweStopCollection.status;
00154 sweStopCollection.status.clear();
00155
00156 return;
00157 }
00158
00159 void GripperStatusChecker::update()
00160 {
00161 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00162
00163 for (gripIt = gripperInfoMap.begin(); gripIt != gripperInfoMap.end(); ++gripIt)
00164 {
00166 if ((gripIt->second.pilotMode == r2_msgs::JointControlMode::DRIVE
00167 || gripIt->second.captainMode == r2_msgs::JointControlMode::DRIVE)
00168 && !gripIt->second.engineerCheck)
00169 {
00171 diagnostic_msgs::DiagnosticStatus diagnosticStatusTemp;
00172 diagnosticStatusTemp.name = "GripperStatusChecker";
00173 diagnosticStatusTemp.level = diagnostic_msgs::DiagnosticStatus::ERROR;
00174 diagnosticStatusTemp.hardware_id = gripIt->first;
00175 diagnosticStatusTemp.message = gripIt->first + " reported in DRIVE without engineer's okay!";
00176 sweStopCollection.status.push_back(diagnosticStatusTemp);
00177
00179 clearRequestsAndChecks(gripIt->first);
00180 gripIt->second.state = IDLE;
00181 }
00182
00184 if (gripIt->second.state == IDLE)
00185 {
00186 if (gripIt->second.pilotRequest && gripIt->second.captainRequest)
00187 {
00188 gripIt->second.engineerCheck = true;
00189 gripIt->second.state = GRANT;
00190 startTime = ros::Time::now();
00191 }
00192 else if (gripIt->second.pilotRequest)
00193 {
00194 gripIt->second.state = PILOT_REQUEST;
00195 startTime = ros::Time::now();
00196 }
00197 else if (gripIt->second.captainRequest)
00198 {
00199 gripIt->second.state = CAPTAIN_REQUEST;
00200 startTime = ros::Time::now();
00201 }
00202
00204 }
00205 else if (gripIt->second.state == PILOT_REQUEST)
00206 {
00207 if (!gripIt->second.pilotRequest)
00208 {
00210 gripIt->second.state = IDLE;
00211 }
00212 else if (gripIt->second.captainRequest)
00213 {
00214 gripIt->second.engineerCheck = true;
00215 gripIt->second.state = GRANT;
00216 startTime = ros::Time::now();
00217 }
00218 else
00219 {
00221 timer = ros::Time::now() - startTime;
00222
00223 if (timer > requestTimeOut)
00224 {
00225 clearRequestsAndChecks(gripIt->first);
00226 gripIt->second.state = IDLE;
00227 }
00228 }
00229 }
00230 else if (gripIt->second.state == CAPTAIN_REQUEST)
00231 {
00232 if (!gripIt->second.captainRequest)
00233 {
00235 gripIt->second.state = IDLE;
00236 }
00237 else if (gripIt->second.pilotRequest)
00238 {
00239 gripIt->second.engineerCheck = true;
00240 gripIt->second.state = GRANT;
00241 startTime = ros::Time::now();
00242 }
00243 else
00244 {
00246 timer = ros::Time::now() - startTime;
00247
00248 if (timer > requestTimeOut)
00249 {
00250 clearRequestsAndChecks(gripIt->first);
00251 gripIt->second.state = IDLE;
00252 }
00253 }
00254 }
00255 else if (gripIt->second.state == GRANT)
00256 {
00257 timer = ros::Time::now() - startTime;
00258
00259 if (timer > grantTimeOut && (gripIt->second.pilotMode != r2_msgs::JointControlMode::DRIVE
00260 || gripIt->second.captainMode != r2_msgs::JointControlMode::DRIVE))
00261 {
00262 clearRequestsAndChecks(gripIt->first);
00263 gripIt->second.state = IDLE;
00264 }
00265 else if (gripIt->second.pilotMode == r2_msgs::JointControlMode::DRIVE
00266 && gripIt->second.captainMode == r2_msgs::JointControlMode::DRIVE)
00267 {
00268 gripIt->second.state = DRIVING;
00269 startTime = ros::Time::now();
00270 }
00271 }
00272 else if (gripIt->second.state == DRIVING)
00273 {
00274 timer = ros::Time::now() - startTime;
00275
00276 if (gripIt->second.pilotMode == r2_msgs::JointControlMode::DRIVE
00277 && gripIt->second.captainMode == r2_msgs::JointControlMode::DRIVE)
00278 {
00279 startTime = ros::Time::now();
00280 }
00281 else if (timer > requestTimeOut)
00282 {
00283 clearRequestsAndChecks(gripIt->first);
00284 gripIt->second.state = IDLE;
00285 }
00286 }
00287 }
00288 }
00289
00290 void GripperStatusChecker::clearRequestsAndChecks(const std::string& gripper)
00291 {
00292 std::map<std::string, GripperStatusCheckInfo>::iterator gripIt;
00293
00294 if ((gripIt = gripperInfoMap.find(gripper)) != gripperInfoMap.end())
00295 {
00296 gripIt->second.pilotRequest = false;
00297 gripIt->second.captainRequest = false;
00298 gripIt->second.engineerCheck = false;
00299 }
00300
00301 return;
00302 }