00001 #ifndef SCTAPI_CONFIGURATIONXMLIMPL
00002 #define SCTAPI_CONFIGURATIONXMLIMPL
00003
00004 #include <utility>
00005 #include <vector>
00006 #include <libxml/tree.h>
00007 #include <libxml/xpath.h>
00008
00009 #include <is/infodictionary.h>
00010 #include <boost/thread.hpp>
00011
00012 #include "log.h"
00013 #include "configuration.h"
00014
00015 #include "timings.h"
00016
00019 class ConfigurationXMLImpl : public SctConfiguration::Configuration {
00020 ConfigurationXMLImpl(const ConfigurationXMLImpl &);
00021 ConfigurationXMLImpl &operator=(const ConfigurationXMLImpl &);
00022
00023 static ConfigurationXMLImpl *m_config;
00024
00025 xmlDocPtr document;
00026 xmlXPathContextPtr xpathContext;
00027
00028 Log log;
00029
00030 std::string lastFilename;
00031
00032 ISInfoDictionary *is_dict;
00033 bool useIS;
00034 bool useMRS;
00035
00036 Timings timings;
00037
00038 public:
00043 ConfigurationXMLImpl();
00044
00048 virtual ~ConfigurationXMLImpl();
00049
00050
00051
00056 std::list<unsigned int> listPartitions();
00057
00062 std::list<unsigned int> listCratesInPartition(unsigned int partition);
00063
00064 bool isDummyCrate(unsigned int partition, unsigned int crate);
00065
00070 std::list<unsigned int> listRodsInCrate(unsigned int partition, unsigned int crate);
00071
00078 std::list<unsigned int> listMURSInRod(unsigned int partition, unsigned int crate, unsigned int rod);
00079
00086 std::list<std::string> listModulesInMUR(unsigned int partition, unsigned int MUR);
00087
00094 std::list<std::string> listRModulesInMUR(unsigned int partition, unsigned int MUR);
00095
00101 std::list<std::string> listAllModules();
00102
00106 std::list<std::string> listUnusedModules();
00107
00108
00109
00115 ABCDModule getModuleConfig(const std::string module);
00116
00120 short getModuleGroup(const std::string module);
00121
00125 void setModuleGroup(const std::string module, short group);
00126
00130 unsigned int getModuleErrorMask(unsigned int partition, unsigned int crate, unsigned int rod,
00131 unsigned int channel, unsigned int link);
00132
00136 void setModuleErrorMask(unsigned int partition, unsigned int crate, unsigned int rod,
00137 unsigned int channel, unsigned int link, unsigned int mask);
00138
00142 void setDefaultModuleErrorMask(unsigned int mask);
00143
00149 SctConfiguration::RodConfig getRodConfig(unsigned int partition, unsigned int crate, unsigned int rod);
00150
00156 SctConfiguration::SlaveConfig getDefaultSlaveConfig(char type);
00157
00163 SctConfiguration::BOCChannelConfig getBOCConfig(unsigned int partition, unsigned int crate, unsigned int rod,
00164 unsigned int channel);
00165
00166 SctConfiguration::BOCGlobalConfig getBOCGlobalConfig(unsigned int partition, unsigned int crate, unsigned int rod);
00167
00173 unsigned char *getFibreMappings(unsigned int partition, unsigned int crate, unsigned int rod);
00174
00180 SctConfiguration::TimConfig getTimConfig(unsigned int partition, unsigned int crate);
00181
00187 void setFibreMapping(unsigned int partition, unsigned int crate, unsigned int rod,
00188 unsigned int channel, unsigned int tx, unsigned int rx0, unsigned int rx1);
00189
00193 std::string printModuleConfig(const ABCDModule &conf);
00194
00195 SctConfiguration::MURType getMURType(unsigned int MUR);
00196
00197 unsigned int getFreeMurId();
00198
00199
00200
00204 void translateToROD(unsigned int MUR, unsigned int module,
00205 unsigned int &partition, unsigned int &crate,
00206 unsigned int &rod, unsigned int &channel);
00207
00214 void translateToRROD(unsigned int MUR, unsigned int module,
00215 unsigned int &partition, unsigned int &crate,
00216 unsigned int &rod, unsigned int &channel);
00217
00221 void translateToSN(unsigned int MUR, unsigned int module,
00222 std::string &sn);
00223
00227 void translateToRMUR(unsigned int MUR, unsigned int module,
00228 unsigned int &RMUR, unsigned int &rmodule);
00229
00233 void translateToBarrel(unsigned int MUR, unsigned int module,
00234 unsigned int &barrel, unsigned int &row, int &number);
00235
00239 void translateToEndcap(unsigned int MUR, unsigned int module,
00240 int &disk, unsigned int &ring, unsigned int &number);
00241
00245 void translateToPowerSupply(unsigned int MUR, unsigned int module,
00246 unsigned int &partition,
00247 unsigned int &crate, unsigned int &channel);
00248
00252 void translateFromROD(unsigned int partition, unsigned int crate,
00253 unsigned int rod, unsigned int channel,
00254 unsigned int &MUR, unsigned int &module);
00255
00262 void translateFromRROD(unsigned int partition, unsigned int crate,
00263 unsigned int rod, unsigned int channel,
00264 unsigned int &MUR, unsigned int &module);
00268 void translateFromSN(const std::string sn,
00269 unsigned int &MUR, unsigned int &module);
00270
00274 void translateFromRMUR(unsigned int RMUR, unsigned int rmodule,
00275 unsigned int &MUR, unsigned int &module);
00276
00280 void translateFromBarrel(unsigned int barrel, unsigned int row, int number,
00281 unsigned int &MUR, unsigned int &module);
00282
00286 void translateFromEndcap(int disk, unsigned int ring, unsigned int number,
00287 unsigned int &MUR, unsigned int &module);
00288
00292 void translateFromPowerSupply(unsigned int partition,
00293 unsigned int crate, unsigned int channel,
00294 unsigned int &MUR, unsigned int &module);
00295
00296
00297
00298
00304 void configureModuleFromStructure(const std::string module, const ABCDModule conf);
00305
00311 void configureModuleFromFile(const std::string filename);
00312
00321 void configureROD(unsigned int partition, unsigned int crate, unsigned int rod, SctConfiguration::RodConfig conf);
00322
00331 void configureTIM(unsigned int partition, unsigned int crate, SctConfiguration::TimConfig conf);
00332
00336 void configureBOC(unsigned int partition, unsigned int crate, unsigned int rod, const SctConfiguration::BOCGlobalConfig &conf);
00337
00342 void clearAll();
00343
00357 void namePartition(unsigned int partition, const std::string name);
00358
00359 public:
00363
00364
00368 void configureBOCChannel(unsigned int MUR, unsigned int position, const SctConfiguration::BOCChannelConfig &conf);
00369
00373 void mapModuleMUR(unsigned int MUR, unsigned int order, unsigned int RMUR, unsigned int rorder, std::string number);
00374
00378 void unmapModuleMUR(unsigned int MUR, unsigned int order);
00379
00383 void mapRODMUR(unsigned int partition, unsigned int crate, unsigned int rod, unsigned int order, unsigned int number);
00384
00388 void unmapRODMUR(unsigned int number);
00389
00393 void mapBarrelMUR(unsigned int MUR, unsigned int barrel, unsigned int row, int position);
00394
00398 void unmapBarrelMUR(unsigned int MUR);
00399
00403 void getMapMURROD(unsigned int MUR, unsigned int &partition, unsigned int &crate, unsigned int &rod, unsigned int &order);
00404
00408 void getMapRODMUR(unsigned int partition, unsigned int crate, unsigned int rod, unsigned int order, unsigned int &MUR);
00409
00410
00411
00412
00413 void getMapMURPhysical(unsigned int MUR, SctConfiguration::MURType &type, int &plane, int §ion, int &position);
00414
00418 void mapEndcapMUR(unsigned int MUR, int disk, unsigned int quadrant, unsigned int position);
00419
00423 void unmapEndcapMUR(unsigned int MUR);
00424
00431 void swapMURNames(unsigned int MUR1, unsigned int MUR2);
00432
00436 void mapPowerChannel(unsigned int MUR, unsigned int number, unsigned int partition, unsigned int crate, unsigned int channel);
00437
00441 void unmapPowerChannel(unsigned int MUR, unsigned int number);
00442
00446 void modifyDefaultPowerParam(std::string state, std::string name, std::string type, float value);
00447
00451 void modifyHVCardParam(unsigned int crate, unsigned int card,
00452 std::string name, std::string type, float value);
00453
00457 void modifyLVCardParam(unsigned int crate, unsigned int card,
00458 std::string name, std::string type, float value);
00459
00463 void modifyPowerParam(unsigned int MUR, unsigned int number,
00464 std::string state, std::string name, std::string type, float value);
00465
00469 void modifyPowerParamCC(unsigned int crate, unsigned int channel,
00470 std::string state, std::string name, std::string type, float value);
00471
00475 float getDefaultPowerParam(std::string state, std::string name, std::string type);
00476
00480 float getHVCardParam(unsigned int crate, unsigned int card, std::string name, std::string type);
00481
00485 float getLVCardParam(unsigned int crate, unsigned int card, std::string name, std::string type);
00486
00490 float getPowerParam(unsigned int MUR, unsigned int number, std::string state, std::string name, std::string type);
00491
00495 float getPowerParamCC(unsigned int crate, unsigned int channel, std::string state, std::string name, std::string type);
00496
00500 std::list<std::string> listDefaultPowerParams();
00501
00505 float getCratePowerParam(unsigned int crate, std::string name);
00506
00507 std::list<std::string> listDCSChannelParams();
00508
00509 std::list<std::string> listDCSCardParams();
00510
00511 std::list<std::string> listDCSCrateParams();
00512
00516 void useISForChanges(bool valid = true);
00517
00521 void useMRSForMessages(bool valid = true);
00522
00526 void loadConfiguration(const std::string &filename);
00527
00531 std::string getConfigurationFileName();
00532
00533
00534
00544 void saveConfiguration(const std::string filename = "");
00545
00551 void saveModuleConfiguration(const std::string modsn, const std::string filename);
00552
00556 std::string getModuleConfigurationString(const std::string modsn, const ABCDModule config);
00557
00561 void writePowerSupplyConfiguration(std::string filename);
00562
00563 protected:
00571 void createPartition(unsigned int partition);
00572
00578 void createCrate(unsigned int partition, unsigned int crate);
00579
00585 void createROD(unsigned int partition, unsigned int crate, unsigned int rod);
00586
00587 xmlNodePtr getModuleConfigurationNode(std::string sn, std::string reason);
00588
00589 void notifyModuleConfChange();
00590
00591 void notifyModuleMappingChange();
00592
00593 void notifySystemStructureChange();
00594
00595 private:
00600 ISInfoDictionary *getIsDict();
00601
00608 void updateRodConfig(unsigned int partition, unsigned int crate, unsigned int rod, SctConfiguration::RodConfig conf);
00609
00615 xmlNodePtr getQueryNode(const std::string query, const std::string task);
00616
00623 std::list<xmlNodePtr> getQueryNodeList(const std::string query, const std::string task);
00624
00630 float getAttrAsFloat(xmlNodePtr node, const char *attr);
00631
00639 int getAttrAsInt(xmlNodePtr node, const char *attr, int base = 0);
00640
00647 std::string getAttrAsString(xmlNodePtr node, const char *attr);
00648
00654 xmlNodePtr getChildNode(xmlNodePtr node, const char *name);
00655
00661 xmlNodePtr getOrNewChildNode(xmlNodePtr node, const char *name);
00662
00668 void setOrCreateChildNodeWithContent(xmlNodePtr node, const char *name, const char *content);
00669
00673 xmlNodePtr getChildNodeWithContent(xmlNodePtr node, const char *name, const char *content);
00674
00680 xmlNodePtr getOrNewChildWithIntAttr(xmlNodePtr, const char *name, const char *attr, int integer);
00681
00687 xmlNodePtr getOrNewChildWithStringAttr(xmlNodePtr parent, const char *name, const char *attr, std::string value);
00688
00692 xmlNodePtr getNodeWithIntAttr(xmlNodePtr node, const char *name, const char *attr, int integer);
00693
00697 xmlNodePtr getNodeWithStringAttr(xmlNodePtr node, const char *name, const char *attr, std::string value);
00698
00702 void setFloatAttr(xmlNodePtr node, const char *attr, float floater);
00703
00707 void setIntAttr(xmlNodePtr node, const char *attr, int integer);
00708
00712 void clearAttr(xmlNodePtr node, const char *attr);
00713
00717 const ABCDModule parseModuleConfig(xmlNodePtr node);
00718
00722 const SctConfiguration::RodConfig parseRodConfig(xmlNodePtr node);
00723
00727 const SctConfiguration::TimConfig parseTimConfig(xmlNodePtr node);
00728
00733 xmlNodePtr replaceModuleConfig(xmlNodePtr node, const ABCDModule conf, const std::string name);
00734
00735 protected:
00736 void checkInitialised();
00737 boost::mutex initialise_mutex;
00738
00739 std::map<std::string, xmlNodePtr> serialToMurNode;
00740 bool serialToMurNodeBuilt;
00741
00742 void buildSerialToMurNode();
00743
00744 std::map<std::string, xmlNodePtr> serialToConfigNode;
00745 bool serialToConfigNodeBuilt;
00746
00747 void buildSerialToConfigNode();
00748 };
00749
00750 #endif