53 #include "rnr/rnrconfig.h" 55 #include "rnr/appkit/Xml.h" 70 const string &strSearchPath,
71 const string &strXmlFileName,
74 vector<string> vecPath;
80 split(strSearchPath,
':', vecPath);
82 bFoundInstance =
false;
85 for(i=0; i<vecPath.size(); ++i)
87 fqname = vecPath[i] +
'/' + strXmlFileName;
88 if( access(fqname.c_str(), F_OK) == 0 )
90 LOGDIAG3(
"Loading Hekateros description XML file: %s.", fqname.c_str());
92 bFoundInstance =
true;
94 if( (rc = Xml::loadFile(fqname)) < 0 )
96 LOGERROR(
"Parse of Hekateros description from XML file %s failed.",
102 rc = setHekDescFromDOM(desc);
107 LOGDIAG2(
"Hekateros description from XML file %s loaded.",
118 if( !bFoundInstance )
120 LOGERROR(
"XML file %s not found.", strXmlFileName.c_str());
128 int HekXmlCfg::createTemplateFile(
const string &strXmlFileName)
132 if( strXmlFileName.empty() )
134 setErrorMsg(
"No file name.");
135 LOGERROR(
"%s", m_bufErrMsg);
136 return -HEK_ECODE_XML;
139 m_strXmlFileName = strXmlFileName;
142 if( (fp = fopen(m_strXmlFileName.c_str(),
"w+")) == NULL )
144 setErrorMsg(
"%s: %s(errno=%d).",
145 m_strXmlFileName.c_str(), strerror(errno), errno);
146 LOGERROR(
"%s", m_bufErrMsg);
147 return -HEK_ECODE_XML;
156 fprintf(fp,
" <!-- RoadNarrows Hekateros Top-Level Configuration -->\n");
157 fprintf(fp,
"%s", m_strXmlHead.c_str());
162 fprintf(fp,
" <!-- Hekateros robotic base -->\n");
163 fprintf(fp,
" <%s product_id=\"PRODID\">\n", m_strMajElemArm.c_str());
165 fprintf(fp,
" <%s>PRODNAME</%s>\n",
166 m_strElemProdName.c_str(), m_strElemProdName.c_str());
168 fprintf(fp,
" <%s>\n PRODBRIEF\n </%s>\n",
169 m_strElemProdBrief.c_str(), m_strElemProdBrief.c_str());
171 fprintf(fp,
" <%s>PRODHWVER</%s>\n",
172 m_strElemProdHwVer.c_str(), m_strElemProdHwVer.c_str());
174 fprintf(fp,
" <%s>DOF</%s>\n",
175 m_strElemProdDoF.c_str(), m_strElemProdDoF.c_str());
177 fprintf(fp,
" <%s>PRODSIZE</%s>\n",
178 m_strElemProdSize.c_str(), m_strElemProdSize.c_str());
180 fprintf(fp,
" </%s>\n\n", m_strMajElemArm.c_str());
185 fprintf(fp,
" <!-- Hekateros end effector tool -->\n");
186 fprintf(fp,
" <%s product_id=\"EEPRODID\">\n", m_strMajElemEE.c_str());
188 fprintf(fp,
" <%s>PRODNAME</%s>\n",
189 m_strElemProdName.c_str(), m_strElemProdName.c_str());
191 fprintf(fp,
" <%s>\n EEPRODBRIEF\n </%s>\n",
192 m_strElemProdBrief.c_str(), m_strElemProdBrief.c_str());
194 fprintf(fp,
" <%s>EEPRODHWVER</%s>\n",
195 m_strElemProdHwVer.c_str(), m_strElemProdHwVer.c_str());
197 fprintf(fp,
" <%s>EEDOF</%s>\n",
198 m_strElemProdDoF.c_str(), m_strElemProdDoF.c_str());
200 fprintf(fp,
" <%s>EEPRODSIZE</%s>\n",
201 m_strElemProdSize.c_str(), m_strElemProdSize.c_str());
203 fprintf(fp,
" </%s>\n\n", m_strMajElemEE.c_str());
209 fprintf(fp,
"%s", m_strXmlTail.c_str());
213 LOGDIAG3(
"Created file %s.", m_strXmlFileName.c_str());
218 int HekXmlCfg::setHekDescFromDOM(
HekDesc &desc)
238 if( m_pElemRoot == NULL )
240 setErrorMsg(
"Missing DOM and/or <%s> root element missing.",
241 m_strRootElemName.c_str());
242 LOGERROR(
"%s", m_bufErrMsg);
243 return -HEK_ECODE_XML;
247 for(pElem = m_pElemRoot->FirstChildElement();
249 pElem = pElem->NextSiblingElement())
251 if( (sValue = pElem->Value()) == NULL )
257 else if( !strcasecmp(sValue, m_strMajElemArm.c_str()) )
259 setHekArmDescFromDOM(pElem, pDescArm);
263 else if( !strcasecmp(sValue, m_strMajElemEE.c_str()) )
265 setHekEEDescFromDOM(pElem, pDescEE);
272 int HekXmlCfg::setDOMFromHekDesc(
const HekDesc &desc)
275 return -HEK_ECODE_GEN;
278 int HekXmlCfg::setHekArmDescFromDOM(TiXmlElement *pElemMaj,
HekDescArm *pDesc)
288 int eProdSize = HekProdSizeUnknown;
291 if( (rc = strToInt(elemAttr(pElemMaj, m_strAttrProdId), eProdId)) < 0 )
293 setErrorMsg(
"%s: No %s attribute of <%s> found or value not an integer.",
294 m_strXmlFileName.c_str(),
295 m_strAttrProdId.c_str(),
296 m_strMajElemArm.c_str());
297 LOGERROR(
"%s", m_bufErrMsg);
298 return -HEK_ECODE_XML;
302 for(pElem = pElemMaj->FirstChildElement();
304 pElem = pElem->NextSiblingElement())
306 if( (sValue = pElem->Value()) == NULL )
312 else if( !strcasecmp(sValue, m_strElemProdName.c_str()) )
314 strProdName = elemText(pElem);
318 else if( !strcasecmp(sValue, m_strElemProdBrief.c_str()) )
320 strProdBrief = elemText(pElem);
324 else if( !strcasecmp(sValue, m_strElemProdHwVer.c_str()) )
326 strHwVer = elemText(pElem);
330 else if( !strcasecmp(sValue, m_strElemProdDoF.c_str()) )
332 str = elemText(pElem);
335 if( (rc = strToInt(str, nDoF)) < 0 )
337 setErrorMsg(
"%s: Element <%s> text \"%s\" not an integer.",
338 m_strXmlFileName.c_str(), m_strElemProdDoF.c_str(), str.c_str());
339 LOGERROR(
"%s", m_bufErrMsg);
340 return -HEK_ECODE_XML;
346 else if( !strcasecmp(sValue, m_strElemProdSize.c_str()) )
348 str = elemText(pElem);
351 if( (rc = strToProdSizeCode(str, eProdSize)) < 0 )
353 setErrorMsg(
"%s: Element <%s> text \"%s\" not a recognized " 355 m_strXmlFileName.c_str(), m_strElemProdSize.c_str(), str.c_str());
356 LOGERROR(
"%s", m_bufErrMsg);
357 return -HEK_ECODE_XML;
363 pDesc->setDesc(eProdId, strProdName, strProdBrief, strHwVer, nDoF, eProdSize);
365 LOGDIAG3(
"%s: Hekateros robotic base description set.",
366 m_strXmlFileName.c_str());
371 int HekXmlCfg::setHekEEDescFromDOM(TiXmlElement *pElemMaj,
HekDescEE *pDesc)
381 int eProdSize = HekProdSizeUnknown;
384 if( (rc = strToInt(elemAttr(pElemMaj, m_strAttrProdId), eProdId)) < 0 )
386 setErrorMsg(
"%s: No %s attribute of <%s> found or value not an integer.",
387 m_strXmlFileName.c_str(),
388 m_strAttrProdId.c_str(),
389 m_strMajElemArm.c_str());
390 LOGERROR(
"%s", m_bufErrMsg);
391 return -HEK_ECODE_XML;
395 for(pElem = pElemMaj->FirstChildElement();
397 pElem = pElem->NextSiblingElement())
399 if( (sValue = pElem->Value()) == NULL )
405 else if( !strcasecmp(sValue, m_strElemProdName.c_str()) )
407 strProdName = elemText(pElem);
411 else if( !strcasecmp(sValue, m_strElemProdBrief.c_str()) )
413 strProdBrief = elemText(pElem);
417 else if( !strcasecmp(sValue, m_strElemProdHwVer.c_str()) )
419 strHwVer = elemText(pElem);
423 else if( !strcasecmp(sValue, m_strElemProdDoF.c_str()) )
425 str = elemText(pElem);
428 if( (rc = strToInt(str, nDoF)) < 0 )
430 setErrorMsg(
"%s: Element <%s> text \"%s\" not an integer.",
431 m_strXmlFileName.c_str(), m_strElemProdDoF.c_str(), str.c_str());
432 LOGERROR(
"%s", m_bufErrMsg);
433 return -HEK_ECODE_XML;
439 else if( !strcasecmp(sValue, m_strElemProdSize.c_str()) )
441 str = elemText(pElem);
444 if( (rc = strToProdSizeCode(str, eProdSize)) < 0 )
446 setErrorMsg(
"%s: Element <%s> text \"%s\" not a recognized " 448 m_strXmlFileName.c_str(), m_strElemProdSize.c_str(), str.c_str());
449 LOGERROR(
"%s", m_bufErrMsg);
450 return -HEK_ECODE_XML;
456 pDesc->setDesc(eProdId, strProdName, strProdBrief, strHwVer, nDoF, eProdSize);
458 LOGDIAG3(
"%s: Hekateros end effector description set.",
459 m_strXmlFileName.c_str());
464 int HekXmlCfg::strToProdSizeCode(
const string &str,
int &val)
470 val = HekProdSizeUnknown;
472 else if( !strcmp(str.c_str(), HekProdSizeStrUnknown) )
474 val = HekProdSizeUnknown;
476 else if( !strcmp(str.c_str(), HekProdSizeStrStd) )
478 val = HekProdSizeStd;
480 else if( !strcmp(str.c_str(), HekProdSizeStrShort) )
482 val = HekProdSizeShort;
484 else if( !strcmp(str.c_str(), HekProdSizeStrLong) )
486 val = HekProdSizeLong;
490 LOGERROR(
"%s: Unknown product size code.", str.c_str());
497 int HekXmlCfg::prodSizeToStr(
const int val,
string &str)
503 case HekProdSizeUnknown:
509 case HekProdSizeShort:
512 case HekProdSizeLong:
516 LOGERROR(
"%c: Unknown product size code.", val);
HekDesc - Hekateros full robotic manipulator descripition class interface.
Hekateros end effector tool description class.
HekXmlCfg - <b><i>Hekateros</i></b> XML configuration class interface.
HekDescArm * getArmDesc()
Get the <b><i>Hekateros</i></b> base product description.
void resetDesc()
Reset base description to the "unitialized" values.
Hekateros robotic arm (manipulator) description class.
Hekateros robotic manipulator full description class.
std::vector< std::string > & split(const std::string &s, char delim, std::vector< std::string > &elems)
Split string at the delimiter character.
HekDescEE * getEEDesc()
Get the <b><i>Hekateros</i></b> end effector product description.
Top-level package include file.
void resetDesc()
Reset base description to the "unitialized" values.
HekDescEE - Hekateros end effector tool description class interface.
HekDescArm - Hekateros robotic arm description class interface.
Hekateros common utilities.
The <b><i>Hekateros</i></b> namespace encapsulates all <b><i>Hekateros</i></b> related constructs...