GripperStatusChecker.cpp
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     // Initialize zeros in the right ways
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 }


robodyn_mechanisms
Author(s):
autogenerated on Thu Jun 6 2019 21:22:48