00001
00003
00004 #include "xmlBase/XmlParser.h"
00005 #include "xmlBase/Dom.h"
00006 #include <xercesc/dom/DOMElement.hpp>
00007 #include <xercesc/dom/DOMNodeList.hpp>
00008 #include <xercesc/dom/DOMTreeWalker.hpp>
00009
00010 #include <string>
00011 #include <iostream>
00012 #include <vector>
00013 #include <cstdlib>
00014 #include <memory>
00015
00016 #include "calibUtil/GenericSrv.h"
00017 #include "calibUtil/StripSrv.h"
00018 #include "calibUtil/ChannelStatusDef.h"
00019
00020 namespace calibUtil {
00021
00022 using XERCES_CPP_NAMESPACE_QUALIFIER DOMElement;
00023
00024 StripSrv::StripSrv(eBadType badType, const GenericSrv& gen)
00025 : m_badType(badType), m_state(BUILDING) {
00026 m_genSrv = new GenericSrv(gen);
00027 }
00028
00029
00030 StripSrv::StripSrv(std::string xmlFileName) : m_badType(UNKNOWN_BADTYPE),
00031 m_state(FROM_PERS),
00032 m_genSrv(0)
00033 {
00034 using xmlBase::Dom;
00035 using XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument;
00036
00037 xmlBase::XmlParser* parser = new xmlBase::XmlParser();
00038 DOMDocument* doc = parser->parse(xmlFileName.c_str());
00039
00040 if (doc == 0) {
00041 std::cerr << "Error parsing document" << xmlFileName << std::endl;
00042 return;
00043 }
00044
00045 DOMElement* docElt = doc->getDocumentElement();
00046 m_genSrv = new GenericSrv(docElt);
00047
00048 std::vector<DOMElement *> towers;
00049
00050 Dom::getDescendantsByTagName(docElt, "tower", towers);
00051 unsigned nTower = towers.size();
00052
00053 m_towers.reserve(nTower);
00054
00055 std::string bString = Dom::getAttribute(docElt,"badType");
00056 if (!bString.compare("hot")) m_badType = HOT;
00057 else if (!bString.compare("dead")) m_badType = DEAD;
00058 else m_badType = UNKNOWN_BADTYPE;
00059
00060
00061 for (unsigned int iTower = 0; iTower < nTower; iTower++) {
00062 Tower tower;
00063 tower.m_uniplanes.clear();
00064 try {
00065 tower.m_row = Dom::getIntAttribute(towers[iTower], "row");
00066 tower.m_col = Dom::getIntAttribute(towers[iTower], "col");
00067 }
00068 catch (xmlBase::DomException ex) {
00069 std::cerr << "From calibUtil::StripSrv::StripSrv" << std::endl
00070 << ex.getMsg() << std::endl;
00071 throw ex;
00072 }
00073
00074 tower.m_howBad = 0;
00075 tower.m_allBad = 0;
00076
00077 std::string attValue = Dom::getAttribute(towers[iTower], "nOnbdCalib");
00078 if (attValue.compare("true") == 0) {
00079 tower.m_howBad |= vCALIBUTIL_nOnbdCalib;
00080 }
00081 attValue = Dom::getAttribute(towers[iTower], "nOnbdTrig");
00082 if (attValue.compare("true") == 0) {
00083 tower.m_howBad |= vCALIBUTIL_nOnbdTrig;
00084 }
00085 attValue = Dom::getAttribute(towers[iTower], "nOnbdData");
00086 if (attValue.compare("true") == 0) {
00087 tower.m_howBad |= vCALIBUTIL_nOnbdData;
00088 }
00089 if (tower.m_howBad) {
00090 tower.m_allBad = 1;
00091 goto NEXT;
00092 }
00093
00094 {
00095 DOMElement* uniElt = Dom::getFirstChildElement(towers[iTower]);
00096
00097 while (uniElt != 0) {
00098 Uniplane uni;
00099 uni.m_howBad = 0;
00100 fillUni(uniElt, &uni);
00101
00102
00103 tower.m_uniplanes.push_back(uni);
00104 uniElt = Dom::getSiblingElement(uniElt);
00105 }
00106 }
00107 NEXT:
00108 m_towers.push_back(tower);
00109
00110 }
00111 }
00112
00114 StripSrv::~StripSrv(){
00115 delete m_genSrv;
00116 }
00117
00119 StripSrv::eBadType StripSrv::getBadType() const {
00120 return m_badType;
00121 }
00122
00124 void StripSrv::getBadTowers(std::vector<StripSrv::towerRC>& towerRCs) const
00125 {
00126 std::vector<Tower>::const_iterator it = m_towers.begin();
00127 while(it != m_towers.end() ) {
00128
00129 towerRC trc;
00130 towerRCs.reserve(m_towers.size());
00131 trc.row = it->m_row;
00132 trc.col = it->m_col;
00133 towerRCs.push_back(trc);
00134 it++;
00135 }
00136 }
00137
00139
00141 std::string StripSrv::getInst() const {
00142 return m_genSrv->getInst();
00143 }
00144
00146 std::string StripSrv::getTimestamp() const {
00147 return m_genSrv->getTimestamp();
00148 }
00149
00151 std::string StripSrv::getCalType() const {
00152 return m_genSrv->getCalType();
00153 }
00154
00156 std::string StripSrv::getFmtVer() const {
00157 return m_genSrv->getFmtVer();
00158 }
00159
00160
00162 eVisitorRet StripSrv::traverseInfo(ClientObject *client) const {
00163
00164
00165
00166
00167 std::vector<Tower>::const_iterator iTower = m_towers.begin();
00168
00169 eVisitorRet ret = DONE;
00170 while (iTower != m_towers.end() ) {
00171 if (iTower->m_allBad) {
00172 ret = client->badTower(iTower->m_row, iTower->m_col, iTower->m_howBad);
00173 if (ret != CONT) return ret;
00174 }
00175
00176 else {
00177 std::vector<Uniplane>::const_iterator iUni =
00178 (iTower->m_uniplanes).begin();
00179 while (iUni != (iTower->m_uniplanes).end() ) {
00180 ret = client->badPlane(iTower->m_row, iTower->m_col,
00181 iUni->m_tray, iUni->m_top,
00182 iUni->m_howBad, iUni->m_allBad,
00183 (iUni->m_strips));
00184 if (ret != CONT) return ret;
00185 iUni++;
00186 }
00187 }
00188 ++iTower;
00189 }
00190
00191
00192 return DONE;
00193 }
00194
00195
00196
00197 void StripSrv::fillUni(const DOMElement* uniElt, Uniplane *uni) {
00198 using xmlBase::Dom;
00199
00200 std::string attValue;
00201
00202 attValue = Dom::getAttribute(uniElt, "allBad");
00203 uni->m_allBad = (attValue.compare("true") == 0);
00204
00205 attValue = Dom::getAttribute(uniElt, "nOnbdCalib");
00206 if (attValue.compare("true") == 0) {
00207 uni->m_howBad |= vCALIBUTIL_nOnbdCalib;
00208 }
00209 attValue = Dom::getAttribute(uniElt, "nOnbdTrig");
00210 if (attValue.compare("true") == 0) {
00211 uni->m_howBad |= vCALIBUTIL_nOnbdTrig;
00212 }
00213 attValue = Dom::getAttribute(uniElt, "nOnbdData");
00214 if (attValue.compare("true") == 0) {
00215 uni->m_howBad |= vCALIBUTIL_nOnbdData;
00216 }
00217
00218 attValue = Dom::getAttribute(uniElt, "tray");
00219 uni->m_tray = atoi(attValue.c_str());
00220
00221 attValue = Dom::getAttribute(uniElt, "which");
00222 if (attValue.compare("top") == 0) uni->m_top = true;
00223 else if (attValue.compare("bot") == 0) uni->m_top = false;
00224
00225
00226 if (!uni->m_allBad) {
00227 fillStrips(uniElt, uni->m_strips);
00228 }
00229 }
00230
00231
00232 void StripSrv::fillStrips(const DOMElement* badElt, StripCol& list) {
00233 using xmlBase::Dom;
00234
00235 DOMElement* childElt = Dom::getFirstChildElement(badElt);
00236
00237 while (childElt != 0 ) {
00238
00239 if (Dom::checkTagName(childElt, "stripList")) {
00240 std::string xmlList = Dom::getAttribute(childElt, "strips");
00241 strToNum(xmlList, list);
00242 }
00243 else if (Dom::checkTagName(childElt, "stripSpan")) {
00244 unsigned short first, last;
00245
00246 try {
00247 first = Dom::getIntAttribute(childElt, "first");
00248 last = Dom::getIntAttribute(childElt, "last");
00249 }
00250 catch (xmlBase::DomException ex) {
00251 std::cerr << "From calibUtil::StripSrv::fillStrips" << std::endl
00252 << ex.getMsg() << std::endl;
00253 throw ex;
00254 }
00255
00256 if (last >= first) {
00257
00258 list.reserve(list.size() + last + 1 - first);
00259 for (unsigned short int i = first; i <= last; i++) {
00260 list.push_back(i);
00261 }
00262 }
00263 }
00264 childElt = Dom::getSiblingElement(childElt);
00265 }
00266 }
00267
00268 void StripSrv::strToNum(std::string s, std::vector<unsigned short int> &v){
00269
00270 std::string::iterator it = s.begin();
00271
00272
00273
00274
00275
00276 while((it != s.end()) && (*it == ' ')) it++;
00277
00278
00279 while ((it != s.end()) && (*it >= '0') && (*it <= '9')) {
00280 std::string tempStr;
00281 tempStr += *it;
00282 it++;
00283
00284 while((it != s.end()) && (*it >= '0') && (*it <= '9')){
00285 tempStr += *it;
00286 it++;
00287 }
00288
00289
00290 while((it != s.end()) && (*it == ' ')) it++;
00291
00292
00293 v.push_back(atoi(tempStr.c_str()));
00294 }
00295
00296 }
00297
00298 StripSrv::Tower* StripSrv::findTower(towerRC& towerId) {
00299 std::vector<Tower>::iterator it = m_towers.begin();
00300 while(it != m_towers.end() ) {
00301 if ((it->m_row == towerId.row) && (it->m_col == towerId.col)) {
00302 return (&(*it));
00303 }
00304 ++it;
00305 }
00306 return 0;
00307 }
00308
00309 const StripSrv::Tower* StripSrv::findTower(const towerRC& towerId) const {
00310 std::vector<Tower>::const_iterator it = m_towers.begin();
00311 while(it != m_towers.end() ) {
00312 if ((it->m_row == towerId.row) && (it->m_col == towerId.col)) {
00313 return (&(*it));
00314 }
00315 ++it;
00316 }
00317 return 0;
00318 }
00319
00320 eVisitorRet StripSrv::writeXml(std::ostream* ) {
00321 return DONE;
00322 }
00323
00324
00325 }