NodeRegisterManager.cpp
Go to the documentation of this file.
00001 
00005 #include "robot_instance/NodeRegisterManager.h"
00006 
00007 using namespace std;
00008 using namespace log4cpp;
00009 
00010 NodeRegisterManager::NodeRegisterManager()
00011 {
00012 }
00013 
00014 NodeRegisterManager::~NodeRegisterManager()
00015 {
00016 
00017 }
00018 
00019 /***************************************************************************/
00027 void NodeRegisterManager::addNode(const std::string& nodeName, const std::string& xmlFile)
00028 {
00029     if (not(hasNode(nodeName)))
00030     {
00031         RegisterWizardMapPtr registerWizardMap = boost::make_shared<RegisterWizardMap>();
00032         RegisterWizardMapLoader::loadRegistersFromFile(xmlFile, nodeName, registerWizardMap);
00033 
00034         for (RegisterWizardMap::iterator registerIterator = registerWizardMap->begin(); registerIterator != registerWizardMap->end(); ++registerIterator)
00035         {
00036             uint16_t registerValue = 0;
00037             registerIterator->second->certifyRegister(registerValue);
00038 
00039             if (registerIterator->second->isWritable())
00040             {
00041                 nodeRegisterMap[nodeName].control[registerIterator->first] = RegisterInfo(registerIterator->second, registerValue);
00042                 NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::INFO << "Added control register [" << registerIterator->first << "] with value [0x" << hex << registerValue << "]";
00043             }
00044             else
00045             {
00046                 nodeRegisterMap[nodeName].status[registerIterator->first] = RegisterInfo(registerIterator->second, registerValue);
00047                 NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::INFO << "Added status register [" << registerIterator->first << "] with value [0x" << hex << registerValue << "]";
00048             }
00049         }
00050 
00051         nodeRegisterMap[nodeName].nodeType = RegisterWizardMapLoader::getPropertyFromFile(xmlFile, "NodeType");
00052         NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::INFO << "Set nodeType = " << nodeRegisterMap[nodeName].nodeType;
00053     }
00054     else
00055     {
00056         NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::WARN << "No registers added, node [" << nodeName << "] already exists.";
00057     }
00058 }
00059 
00060 /***************************************************************************/
00065 unsigned int NodeRegisterManager::getNodeCount()
00066 {
00067     return nodeRegisterMap.size();
00068 }
00069 
00070 /***************************************************************************/
00076 bool NodeRegisterManager::hasNode(const std::string& nodeName)
00077 {
00078     return (nodeRegisterMap.find(nodeName) != nodeRegisterMap.end());
00079 }
00080 
00081 /***************************************************************************/
00087 std::string NodeRegisterManager::getNodeType(const std::string& nodeName)
00088 {
00089     if (hasNode(nodeName))
00090     {
00091         return nodeRegisterMap[nodeName].nodeType;
00092     }
00093     else
00094     {
00095         stringstream err;
00096         err << "getNodeType(): Invalid node name: " << nodeName;
00097         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00098         throw runtime_error(err.str());
00099     }
00100 }
00101 
00102 /***************************************************************************/
00112 NodeRegisterManager::RegisterInfo NodeRegisterManager::getControlInfo(const std::string& nodeName, const std::string& registerName)
00113 {
00114     RegisterInfo registerInfo;
00115     string fqRegisterName = nodeName + StringUtilities::TOKEN_DELIMITER + registerName;
00116 
00117     if (hasNode(nodeName))
00118     {
00119         if (nodeRegisterMap[nodeName].control.count(fqRegisterName))
00120         {
00121             registerInfo = nodeRegisterMap[nodeName].control[fqRegisterName];
00122         }
00123         else
00124         {
00125             stringstream err;
00126             err << "NodeRegisterManager::getControlInfo() - Invalid register name: " << fqRegisterName;
00127             NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00128             throw runtime_error(err.str());
00129         }
00130     }
00131     else
00132     {
00133         stringstream err;
00134         err << "NodeRegisterManager::getControlInfo() - Invalid node name: " << nodeName;
00135         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00136         throw runtime_error(err.str());
00137     }
00138 
00139     return registerInfo;
00140 }
00141 
00142 /***************************************************************************/
00152 NodeRegisterManager::RegisterInfo NodeRegisterManager::getStatusInfo(const std::string& nodeName, const std::string& registerName)
00153 {
00154     RegisterInfo registerInfo;
00155     string       fqRegisterName = nodeName + StringUtilities::TOKEN_DELIMITER + registerName;
00156 
00157     if (hasNode(nodeName))
00158     {
00159         if (nodeRegisterMap[nodeName].status.count(fqRegisterName))
00160         {
00161             registerInfo = nodeRegisterMap[nodeName].status[fqRegisterName];
00162         }
00163         else
00164         {
00165             stringstream err;
00166             err << "NodeRegisterManager::getControlInfo() - Invalid register name: " << fqRegisterName;
00167             NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00168             throw runtime_error(err.str());
00169         }
00170     }
00171     else
00172     {
00173         stringstream err;
00174         err << "NodeRegisterManager::getControlInfo() - Invalid node name: " << nodeName;
00175         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00176         throw runtime_error(err.str());
00177     }
00178 
00179     return registerInfo;
00180 }
00181 
00182 /***************************************************************************/
00192 bool NodeRegisterManager::hasControlProperty(const std::string& nodeName, const std::string& prop)
00193 {
00194     NodeRegisterMapIterator nodeIterator = nodeRegisterMap.find(nodeName);
00195 
00196     if (nodeIterator != nodeRegisterMap.end())
00197     {
00198         bool has = false;
00199 
00200         for (RegisterInfoMap::iterator registerIterator = nodeIterator->second.control.begin(); registerIterator != nodeIterator->second.control.end(); ++registerIterator)
00201         {
00202             if (registerIterator->second.wizard->has(prop))
00203             {
00204                 has = true;
00205             }
00206         }
00207 
00208         return has;
00209     }
00210     else
00211     {
00212         stringstream err;
00213         err << "NodeRegisterManager::hasControlProperty() - Invalid node name: " << nodeName;
00214         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00215         throw runtime_error(err.str());
00216     }
00217 }
00218 
00219 /***************************************************************************/
00229 bool NodeRegisterManager::hasStatusProperty(const std::string& nodeName, const std::string& prop)
00230 {
00231     NodeRegisterMapIterator nodeIterator = nodeRegisterMap.find(nodeName);
00232 
00233     if (nodeIterator != nodeRegisterMap.end())
00234     {
00235         bool has = false;
00236 
00237         for (RegisterInfoMap::iterator registerIterator = nodeIterator->second.status.begin(); registerIterator != nodeIterator->second.status.end(); ++registerIterator)
00238         {
00239             if (registerIterator->second.wizard->has(prop))
00240             {
00241                 has = true;
00242             }
00243         }
00244 
00245         return has;
00246     }
00247     else
00248     {
00249         stringstream err;
00250         err << "NodeRegisterManager::hasStatusProperty() - Invalid node name: " << nodeName;
00251         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00252         throw runtime_error(err.str());
00253     }
00254 }
00255 
00256 /***************************************************************************/
00266 uint16_t NodeRegisterManager::getStatusValue(const std::string& nodeName, const std::string& prop)
00267 {
00268     NodeRegisterMapIterator nodeIterator = nodeRegisterMap.find(nodeName);
00269 
00270     if (nodeIterator != nodeRegisterMap.end())
00271     {
00272         for (RegisterInfoMap::iterator registerIterator = nodeIterator->second.status.begin(); registerIterator != nodeIterator->second.status.end(); ++registerIterator)
00273         {
00274             if (registerIterator->second.wizard->has(prop))
00275             {
00276                 return registerIterator->second.wizard->getRegisterValue(prop, registerIterator->second.registerValue);
00277             }
00278         }
00279 
00280         stringstream err;
00281         err << "NodeRegisterManager::getStatusValue() - Invalid property name. Node: " << nodeName << ", Property: " << prop;
00282         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00283         throw runtime_error(err.str());
00284     }
00285     else
00286     {
00287         stringstream err;
00288         err << "NodeRegisterManager::getStatusValue() - Invalid node name: " << nodeName;
00289         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00290         throw runtime_error(err.str());
00291     }
00292 }
00293 
00294 /***************************************************************************/
00304 uint16_t NodeRegisterManager::getControlValue(const std::string& nodeName, const std::string& prop)
00305 {
00306     NodeRegisterMapIterator nodeIterator = nodeRegisterMap.find(nodeName);
00307 
00308     if (nodeIterator != nodeRegisterMap.end())
00309     {
00310         for (RegisterInfoMap::iterator registerIterator = nodeIterator->second.control.begin(); registerIterator != nodeIterator->second.control.end(); ++registerIterator)
00311         {
00312             if (registerIterator->second.wizard->has(prop))
00313             {
00314                 return registerIterator->second.wizard->getRegisterValue(prop, registerIterator->second.registerValue);
00315             }
00316         }
00317 
00318         stringstream err;
00319         err << "NodeRegisterManager::getControlValue() - Invalid property name: " << prop;
00320         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00321         throw runtime_error(err.str());
00322     }
00323     else
00324     {
00325         stringstream err;
00326         err << "NodeRegisterManager::getControlValue() - Invalid node name: " << nodeName;
00327         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00328         throw runtime_error(err.str());
00329     }
00330 }
00331 
00332 /***************************************************************************/
00342 void NodeRegisterManager::setControlValue(const std::string& nodeName, const std::string& prop, uint16_t value)
00343 {
00344     NodeRegisterMapIterator nodeIterator = nodeRegisterMap.find(nodeName);
00345 
00346     if (nodeIterator != nodeRegisterMap.end())
00347     {
00348         bool set = false;
00349 
00350         for (RegisterInfoMap::iterator registerIterator = nodeIterator->second.control.begin(); registerIterator != nodeIterator->second.control.end(); ++registerIterator)
00351         {
00352             if (registerIterator->second.wizard->has(prop))
00353             {
00354                 registerIterator->second.wizard->setRegisterValue(value, prop, registerIterator->second.registerValue);
00355                 NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::INFO << "Register property [" << nodeName << "::" << prop << "] set to [0x" << hex << value << "]";
00356                 set = true;
00357             }
00358         }
00359 
00360         if (not set)
00361         {
00362             stringstream err;
00363             err << "NodeRegisterManager::setControlValue() - No changes made.  Invalid property name.  Node: " << nodeName << ", Property: " << prop;
00364             NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00365             throw runtime_error(err.str());
00366         }
00367     }
00368     else
00369     {
00370         stringstream err;
00371         err << "NodeRegisterManager::setControlValue() - No changes made.  Invalid node name: " << nodeName;
00372         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00373         throw runtime_error(err.str());
00374     }
00375 }
00376 
00377 /***************************************************************************/
00385 void NodeRegisterManager::resetControlValues(const std::string& nodeName)
00386 {
00387     NodeRegisterMapIterator nodeIterator = nodeRegisterMap.find(nodeName);
00388 
00389     if (nodeIterator != nodeRegisterMap.end())
00390     {
00391         for (RegisterInfoMap::iterator registerIterator = nodeIterator->second.control.begin(); registerIterator != nodeIterator->second.control.end(); ++registerIterator)
00392         {
00393             uint16_t newValue = 0;
00394 
00395             if (registerIterator->second.wizard->has("BridgeEnable"))
00396             {
00397                 newValue = 1;
00398             }
00399 
00400             registerIterator->second.wizard->certifyRegister(newValue);
00401             registerIterator->second.registerValue = newValue;
00402 
00403             NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::INFO << "Control register [" << registerIterator->first << "] reset to [0x" << hex << registerIterator->second.registerValue << "]";
00404         }
00405     }
00406     else
00407     {
00408         stringstream err;
00409         err << "NodeRegisterManager::setControlValue() - No changes made.  Invalid node name: " << nodeName;
00410         NasaCommonLogging::Logger::log("gov.nasa.robonet.NodeRegisterManager", Priority::ERROR, err.str());
00411         throw runtime_error(err.str());
00412     }
00413 }
00414 
00415 /***************************************************************************/
00422 void NodeRegisterManager::show(const std::string& nodeName)
00423 {
00424     if (hasNode(nodeName))
00425     {
00426         showControl(nodeName);
00427         cout << endl;
00428         showStatus(nodeName);
00429     }
00430     else
00431     {
00432         NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::ERROR << "NodeRegisterManager::show() - Invalid node name: " << nodeName;
00433     }
00434 }
00435 
00436 /***************************************************************************/
00443 void NodeRegisterManager::showStatus(const std::string& nodeName)
00444 {
00445     NodeRegisterMapIterator nodeIterator = nodeRegisterMap.find(nodeName);
00446 
00447     if (nodeIterator != nodeRegisterMap.end())
00448     {
00449         for (RegisterInfoMap::iterator registerIterator = nodeIterator->second.status.begin(); registerIterator != nodeIterator->second.status.end(); ++registerIterator)
00450         {
00451             cout << "Status Register [" << registerIterator->first << "]" << endl;
00452             cout << registerIterator->second.wizard->registerToString(registerIterator->second.registerValue) << endl;
00453             cout << endl;
00454         }
00455     }
00456     else
00457     {
00458         NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::ERROR << "NodeRegisterManager::showStatus() - Invalid node name: " << nodeName;
00459     }
00460 }
00461 
00462 /***************************************************************************/
00469 void NodeRegisterManager::showControl(const std::string& nodeName)
00470 {
00471     NodeRegisterMapIterator nodeIterator = nodeRegisterMap.find(nodeName);
00472 
00473     if (nodeIterator != nodeRegisterMap.end())
00474     {
00475         for (RegisterInfoMap::iterator registerIterator = nodeIterator->second.control.begin(); registerIterator != nodeIterator->second.control.end(); ++registerIterator)
00476         {
00477             cout << "Control Register [" << registerIterator->first << "]" << endl;
00478             cout << registerIterator->second.wizard->registerToString(registerIterator->second.registerValue) << endl;
00479             cout << endl;
00480         }
00481     }
00482     else
00483     {
00484         NasaCommonLogging::Logger::getCategory("gov.nasa.robonet.NodeRegisterManager") << Priority::ERROR << "NodeRegisterManager::showControl() - Invalid node name: " << nodeName;
00485     }
00486 }


robot_instance
Author(s):
autogenerated on Sat Jun 8 2019 20:43:12