00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026 00027 00028 00029 00030 00031 00032 00033 00034 00035 00036 00037 00038 00039 00040 00041 #include "jaus/core/discovery/subsystem.h" 00042 #include "jaus/core/discovery/vehicle.h" 00043 using namespace JAUS; 00044 00045 00051 Subsystem::Component::Component() 00052 { 00053 mIdentification = "Component"; 00054 mAuthorityLevel = -1; 00055 mStatus = -1; 00056 } 00057 00058 00064 Subsystem::Component::Component(const Address& id) 00065 { 00066 mID = id; 00067 mAuthorityLevel = -1; 00068 mStatus = -1; 00069 mIdentification = "Component"; 00070 } 00071 00072 00078 Subsystem::Component::Component(const Address& id, const Service::ID::Set& services) 00079 { 00080 mID = id; 00081 mServices = services; 00082 mIdentification = "Component"; 00083 mAuthorityLevel = -1; 00084 mStatus = -1; 00085 } 00086 00087 00093 Subsystem::Component::Component(const Subsystem::Component& component) 00094 { 00095 *this = component; 00096 } 00097 00098 00104 Subsystem::Component::~Component() 00105 { 00106 } 00107 00108 00114 Subsystem::Component& Subsystem::Component::operator =(const Subsystem::Component& component) 00115 { 00116 mID = component.mID; 00117 mServices = component.mServices; 00118 mIdentification = component.mIdentification; 00119 mAuthorityLevel = component.mAuthorityLevel; 00120 mStatus = component.mStatus; 00121 return *this; 00122 } 00123 00124 00130 Subsystem::Subsystem() 00131 { 00132 mSubsystemID = 0; 00133 mType = OtherSubsystem; 00134 } 00135 00136 00142 Subsystem::Subsystem(const Subsystem& subsystem) 00143 { 00144 *this = subsystem; 00145 } 00146 00147 00153 Subsystem::~Subsystem() 00154 { 00155 } 00156 00157 00166 void Subsystem::AddComponent(const Address& component, const Service::ID::Set& services) 00167 { 00168 mSubsystemID = component.mSubsystem; 00169 mConfiguration[component.mNode].insert(Component(component, services)); 00170 } 00171 00172 00180 void Subsystem::RemoveComponent(const Address& component) 00181 { 00182 mSubsystemID = component.mSubsystem; 00183 Component::Set::iterator c; 00184 Configuration::iterator node = mConfiguration.find(component.mNode); 00185 if(node != mConfiguration.end()) 00186 { 00187 c = node->second.find(Component(component)); 00188 if(c != node->second.end()) 00189 { 00190 node->second.erase(c); 00191 } 00192 } 00193 } 00194 00195 00207 bool Subsystem::HaveService(const std::string& name, Address* id) const 00208 { 00209 Configuration::const_iterator node; 00210 for(node = mConfiguration.begin(); 00211 node != mConfiguration.end(); 00212 node++) 00213 { 00214 Component::Set::const_iterator component; 00215 for(component = node->second.begin(); 00216 component != node->second.end(); 00217 component++) 00218 { 00219 Service::ID::Set::const_iterator service; 00220 service = component->mServices.find(Service::ID(name)); 00221 if(service != component->mServices.end()) 00222 { 00223 if(id) 00224 { 00225 *id = component->mID; 00226 } 00227 return true; 00228 } 00229 } 00230 } 00231 return false; 00232 } 00233 00234 00244 bool Subsystem::HaveComponent(const Address& id) const 00245 { 00246 Configuration::const_iterator node; 00247 for(node = mConfiguration.begin(); 00248 node != mConfiguration.end(); 00249 node++) 00250 { 00251 Component::Set::const_iterator component; 00252 for(component = node->second.begin(); 00253 component != node->second.end(); 00254 component++) 00255 { 00256 if(component->mID == id) 00257 { 00258 return true; 00259 } 00260 } 00261 } 00262 return false; 00263 } 00264 00265 00277 Subsystem::Component* Subsystem::GetComponent(const Address& id) 00278 { 00279 if(id.IsValid() == false) 00280 { 00281 throw Exception(); 00282 return NULL; 00283 } 00284 Configuration::iterator node; 00285 for(node = mConfiguration.begin(); 00286 node != mConfiguration.end(); 00287 node++) 00288 { 00289 if(node->first == id.mNode) 00290 { 00291 Component::Set::iterator component; 00292 for(component = node->second.begin(); 00293 component != node->second.end(); 00294 component++) 00295 { 00296 if(component->mID == id) 00297 { 00298 return (Subsystem::Component *)&(*component); 00299 } 00300 } 00301 // If the component doesn't exist, create it. 00302 node->second.insert(Component(id)); 00303 for(component = node->second.begin(); 00304 component != node->second.end(); 00305 component++) 00306 { 00307 if(component->mID == id) 00308 { 00309 return (Subsystem::Component *)&(*component); 00310 } 00311 } 00312 00313 } 00314 break; 00315 } 00316 // If we got here, then we don't have any nodes created yet. 00317 mConfiguration[id.mNode].insert(Component(id)); 00318 return (Subsystem::Component *)&(*mConfiguration[id.mNode].begin()); 00319 } 00320 00321 00331 const Subsystem::Component* Subsystem::GetComponent(const Address& id) const 00332 { 00333 if(id.IsValid() == false) 00334 { 00335 throw Exception(); 00336 return NULL; 00337 } 00338 Configuration::const_iterator node; 00339 for(node = mConfiguration.begin(); 00340 node != mConfiguration.end(); 00341 node++) 00342 { 00343 if(node->first == id.mNode) 00344 { 00345 Component::Set::const_iterator component; 00346 for(component = node->second.begin(); 00347 component != node->second.end(); 00348 component++) 00349 { 00350 if(component->mID == id) 00351 { 00352 return &(*component); 00353 } 00354 } 00355 } 00356 break; 00357 } 00358 throw Exception(); 00359 return NULL; 00360 } 00361 00362 00370 Address::List Subsystem::GetComponentsWithService(const std::string& name) const 00371 { 00372 Address::List results; 00373 Configuration::const_iterator node; 00374 for(node = mConfiguration.begin(); 00375 node != mConfiguration.end(); 00376 node++) 00377 { 00378 Component::Set::const_iterator component; 00379 for(component = node->second.begin(); 00380 component != node->second.end(); 00381 component++) 00382 { 00383 Service::ID::Set::const_iterator service; 00384 service = component->mServices.find(Service::ID(name)); 00385 if(service != component->mServices.end()) 00386 { 00387 results.push_back(component->mID); 00388 } 00389 } 00390 } 00391 return results; 00392 } 00393 00394 00400 Subsystem::Component::List Subsystem::GetConfiguration() const 00401 { 00402 Component::List results; 00403 Configuration::const_iterator node; 00404 for(node = mConfiguration.begin(); 00405 node != mConfiguration.end(); 00406 node++) 00407 { 00408 Component::Set::const_iterator component; 00409 for(component = node->second.begin(); 00410 component != node->second.end(); 00411 component++) 00412 { 00413 results.push_back(*component); 00414 } 00415 } 00416 return results; 00417 } 00418 00419 00425 Address::List Subsystem::GetAddressList() const 00426 { 00427 Address::List results; 00428 Configuration::const_iterator node; 00429 for(node = mConfiguration.begin(); 00430 node != mConfiguration.end(); 00431 node++) 00432 { 00433 Component::Set::const_iterator component; 00434 for(component = node->second.begin(); 00435 component != node->second.end(); 00436 component++) 00437 { 00438 results.push_back(component->mID); 00439 } 00440 } 00441 return results; 00442 } 00443 00444 00450 Subsystem& Subsystem::operator =(const Subsystem& subsystem) 00451 { 00452 if(this != &subsystem) 00453 { 00454 mSubsystemID = subsystem.mSubsystemID; 00455 mConfiguration = subsystem.mConfiguration; 00456 mType = subsystem.mType; 00457 mIdentification = subsystem.mIdentification; 00458 mUpdateTime = subsystem.mUpdateTime; 00459 } 00460 return *this; 00461 } 00462 00463 00469 void Subsystem::CopySubsystemData(const Subsystem* subsystem) 00470 { 00471 mSubsystemID = subsystem->mSubsystemID; 00472 mConfiguration = subsystem->mConfiguration; 00473 mType = subsystem->mType; 00474 mIdentification = subsystem->mIdentification; 00475 mUpdateTime = subsystem->mUpdateTime; 00476 } 00477 00478 00479 00485 void Subsystem::DeleteSubsystemMap(Map& list) 00486 { 00487 Map::iterator s; 00488 for(s = list.begin(); 00489 s != list.end(); 00490 s++) 00491 { 00492 JAUS::Vehicle* v = dynamic_cast<JAUS::Vehicle *>(s->second); 00493 if(v) 00494 { 00495 delete v; 00496 } 00497 else 00498 { 00499 delete s->second; 00500 } 00501 } 00502 list.clear(); 00503 } 00504 00505 00511 void Subsystem::CopySubsystemMap(const Map& src, Map& dest) 00512 { 00513 Map::const_iterator s; 00514 DeleteSubsystemMap(dest); 00515 for(s = src.begin(); 00516 s != src.end(); 00517 s++) 00518 { 00519 dest[s->first] = s->second->Clone(); 00520 } 00521 } 00522 00523 00524 /* End of File */