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 }