Go to the documentation of this file.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 #include "jaus/core/component.h"
00041 #include "jaus/core/transport/judp.h"
00042 #include "jaus/core/transport/jtcpclient.h"
00043 #include "jaus/core/sensor.h"
00044 #include <tinyxml/tinyxml.h>
00045 #include <iostream>
00046 #include <cstdlib>
00047 #include <time.h>
00048
00049 using namespace JAUS;
00050
00057 Component::Component()
00058 {
00059 mInitializedFlag = false;
00060 mCheckServiceTimer.RegisterTimerEvent(Component::CheckServiceStatusEvent, this);
00061 mCheckCoreServicesTimer.RegisterTimerEvent(Component::CheckCoreServicesStatusEvent, this);
00062 mCoreServicesCheckTimeMs = 0;
00063 mCoreServicesCheckTimeMs = 0;
00064 mServices[Transport::Name] = mpTransportService = new JUDP();
00065
00066
00067 mpEventsService = new Events();
00068 mpLivenessService = new Liveness();
00069 mpDiscoveryService = new Discovery();
00070 mpAccessControlService = new AccessControl();
00071 mpManagementService = new Management();
00072 mpTimeService = new TimeService();
00073
00074 AddService(mpEventsService);
00075 AddService(mpLivenessService);
00076 AddService(mpDiscoveryService);
00077 AddService(mpAccessControlService);
00078 AddService(mpManagementService);
00079 AddService(mpTimeService);
00080 }
00081
00082
00088 Component::~Component()
00089 {
00090 Shutdown();
00091 mCheckCoreServicesTimer.Stop();
00092 if(mCheckServiceTimer.IsActive())
00093 {
00094
00095 mCheckServiceTimer.Stop();
00096
00097 mpTransportService->RecursiveShutdown();
00098 mpTransportService->Shutdown();
00099 }
00100 Service::Map::iterator s;
00101
00102 s = mServices.find(Transport::Name);
00103 if(s != mServices.end())
00104 {
00105 delete s->second;
00106 mServices.erase(s);
00107 }
00108
00109 mpTransportService = NULL;
00110
00111 for(s = mServices.begin();
00112 s != mServices.end();
00113 s++)
00114 {
00115 delete s->second;
00116 }
00117 mServices.clear();
00118 mServiceCheckTimeMs = 0;
00119 mInitializedFlag = false;
00120 mComponentID(0, 0, 0);
00121 }
00122
00123
00147 bool Component::Initialize(const Address& id, const double serviceUpdateFrequency)
00148 {
00149 bool result = false;
00150
00151 Shutdown();
00152
00153 CxUtils::MappedMemory mappedMem;
00154 if(mLockID.CreateMappedMemory(std::string("JAUS") + id.ToString(), 256) == 0)
00155 {
00156
00157 return false;
00158 }
00159
00160 mComponentID = id;
00161 if(DiscoveryService()->IsEnabled() && DiscoveryService()->GetSubsystemIdentification().empty())
00162 {
00163 std::cout << "Component::ERROR - Subsystem Identification Not Set.\n";
00164 return false;
00165 }
00166 if(mpTransportService->Initialize(id))
00167 {
00168
00169 if(serviceUpdateFrequency >= 1.0)
00170 {
00171 std::stringstream str;
00172 str << "JSRVC Check 2 - " << mComponentID.ToString();
00173 mCheckServiceTimer.SetName(str.str());
00174 mCheckServiceTimer.Start(serviceUpdateFrequency);
00175 }
00176
00177 std::stringstream str;
00178 str << "JSRVC Check 1 - " << mComponentID.ToString();
00179 mCheckCoreServicesTimer.SetName(str.str());
00180 mCheckCoreServicesTimer.Start(10);
00181 mInitializedFlag = result = true;
00182 Service::Map::iterator s;
00183 for(s = mServices.begin();
00184 s != mServices.end();
00185 s++)
00186 {
00187 if(s->second != mpTransportService)
00188 {
00189 s->second->Initialize();
00190 }
00191 }
00192 ManagementService()->SetStatus(Management::Status::Standby);
00193 }
00194
00195 return result;
00196 }
00197
00198
00223 bool Component::InitializeWithUniqueID(const unsigned int waitTimeMs,
00224 const double serviceUpdateFrequency)
00225 {
00226 CxUtils::IP4Address::List available;
00227 if(CxUtils::Socket::GetHostAddresses(available) && available.size() > 0)
00228 {
00229 JAUS::Address unique((JAUS::UShort)(available[0].mData[3] + 10000), 1, 1);
00230 if(Initialize(unique, serviceUpdateFrequency))
00231 {
00232 return true;
00233 }
00234 for(int c = 254; c > 0; c--)
00235 {
00236 for(int n = 254; n > 0; n--)
00237 {
00238 if(Address::IsReservedComponentID((JAUS::Byte)c) == false)
00239 {
00240 unique.mNode = (JAUS::Byte)n;
00241 unique.mComponent = (JAUS::Byte)c;
00242 if(Initialize(unique, serviceUpdateFrequency))
00243 {
00244 return true;
00245 }
00246 }
00247 }
00248 }
00249 }
00250
00251 return false;
00252 }
00253
00254
00268 bool Component::LoadSettings(const std::string& filename)
00269 {
00270 if(mInitializedFlag == false)
00271 {
00272 TiXmlDocument xml;
00273 Service::Map::iterator s;
00274
00275 if(xml.LoadFile(filename.c_str()) == false)
00276 {
00277 return false;
00278 }
00279 TiXmlHandle doc(&xml);
00280
00281 TiXmlElement* transportService = doc.FirstChild("JAUS").FirstChild("Transport").ToElement();
00282 if(transportService && transportService->Attribute("type"))
00283 {
00284 if(std::string("JUDP") == transportService->Attribute("type"))
00285 {
00286 this->AddService(new JUDP());
00287 }
00288 else if(std::string("JTCP") == transportService->Attribute("type"))
00289 {
00290 this->AddService(new JTCPClient());
00291 }
00292 }
00293 TiXmlElement* service = doc.FirstChild("JAUS").ToElement();
00294 if(service && service->FirstChildElement())
00295 {
00296 service = service->FirstChildElement();
00297 }
00298 while(service)
00299 {
00300 std::string name = service->Value();
00301 for(s = mServices.begin(); s != mServices.end(); s++)
00302 {
00303 if(strstr(s->first.c_str(), name.c_str()) != NULL)
00304
00305
00306 {
00307 if(s->first != Transport::Name &&
00308 service->Attribute("on") &&
00309 atoi(service->Attribute("on")) == 0)
00310 {
00311 s->second->EnableService(false);
00312 }
00313 else if(s->second->LoadSettings(filename) == false)
00314 {
00315 return false;
00316 }
00317
00318 }
00319 }
00320 service = service->NextSiblingElement();
00321 }
00322
00323 return true;
00324 }
00325 return false;
00326 }
00327
00328
00335 void Component::Shutdown()
00336 {
00337 if(IsInitialized())
00338 {
00339 mLockID.CloseMappedMemory();
00340
00341 mInitializedFlag = false;
00342
00343
00344 Service::Map::iterator s;
00345 for(s = mServices.begin();
00346 s != mServices.end();
00347 s++)
00348 {
00349 s->second->SignalServiceToShutdown();
00350 }
00351
00352 AccessControlService()->ReleaseComponentControl(Address());
00353 EventsService()->CancelSubscription(Address(), 0);
00354
00355 mpTransportService->RecursiveShutdown();
00356 mServiceCheckTimeMs = 0;
00357 mComponentID(0, 0, 0);
00358 CxUtils::SleepMs(250);
00359
00360 mCheckCoreServicesTimer.Stop();
00361 mCheckServiceTimer.Stop();
00362 }
00363 }
00364
00365
00371 Events* Component::EventsService()
00372 {
00373 return mpEventsService;
00374 }
00375
00376
00382 Liveness* Component::LivenessService()
00383 {
00384 return mpLivenessService;
00385 }
00386
00387
00393 Discovery* Component::DiscoveryService()
00394 {
00395 return mpDiscoveryService;
00396 }
00397
00398
00404 AccessControl* Component::AccessControlService()
00405 {
00406 return mpAccessControlService;
00407 }
00408
00409
00415 Management* Component::ManagementService()
00416 {
00417 return mpManagementService;
00418 }
00419
00420
00426 TimeService* Component::GetTimeService()
00427 {
00428 return mpTimeService;
00429 }
00430
00431
00437 const Events* Component::EventsService() const
00438 {
00439 return mpEventsService;
00440 }
00441
00442
00448 const Liveness* Component::LivenessService() const
00449 {
00450 return mpLivenessService;
00451 }
00452
00453
00459 const Discovery* Component::DiscoveryService() const
00460 {
00461 return mpDiscoveryService;
00462 }
00463
00464
00470 const AccessControl* Component::AccessControlService() const
00471 {
00472 return mpAccessControlService;
00473 }
00474
00475
00481 const Management* Component::ManagementService() const
00482 {
00483 return mpManagementService;
00484 }
00485
00486
00492 const TimeService* Component::GetTimeService() const
00493 {
00494 return mpTimeService;
00495 }
00496
00497
00511 bool Component::Send(const Message* message, const int broadcastFlags) const
00512 {
00513 return mpTransportService->Send(message, broadcastFlags);
00514 }
00515
00516
00530 bool Component::Send(const Message* message,
00531 Message* response,
00532 const unsigned int waitTimeMs) const
00533 {
00534 return mpTransportService->Send(message, response, waitTimeMs);
00535 }
00536
00537
00549 bool Component::EnableService(const std::string& name, const bool enable)
00550 {
00551 Service::Map::iterator s;
00552 s = mServices.find(name);
00553 if(s != mServices.end())
00554 {
00555 s->second->EnableService(enable);
00556 return true;
00557 }
00558 return false;
00559 }
00560
00561
00573 bool Component::AddService(Service* service)
00574 {
00575 bool result = false;
00576
00577 if(mInitializedFlag == false)
00578 {
00579 Service::Map::iterator s;
00580 s = mServices.find(service->GetServiceID().mName);
00581 if(s == mServices.end())
00582 {
00583 mServices[service->GetServiceID().mName] = service;
00584 }
00585 else
00586 {
00587 delete s->second;
00588 s->second = service;
00589 }
00590
00591 for(s = mServices.begin();
00592 s != mServices.end();
00593 s++)
00594 {
00595 if(service->InheritsFrom(s->second->GetServiceID()))
00596 {
00597 service->SetParentService(s->second);
00598 s->second->AddChildService(service);
00599 }
00600 if(s->second->InheritsFrom(service->GetServiceID()))
00601 {
00602 s->second->SetParentService(service);
00603 service->AddChildService(s->second);
00604 }
00605 }
00606
00607 Transport* t = dynamic_cast<Transport *>(service);
00608 if(t)
00609 {
00610 mpTransportService = t;
00611 }
00612
00613 if(mpTransportService)
00614 {
00615 mpTransportService->SetComponent(this);
00616 }
00617 result = true;
00618 }
00619 return result;
00620 }
00621
00622
00628 Service* Component::GetService(const std::string& name)
00629 {
00630 Service::Map::iterator s;
00631 s = mServices.find(name);
00632 if(s != mServices.end())
00633 {
00634 return s->second;
00635 }
00636
00637 for(s = mServices.begin(); s != mServices.end(); s++)
00638 {
00639 if(strstr(s->first.c_str(), name.c_str()) != NULL)
00640 {
00641 return s->second;
00642 }
00643 }
00644 return NULL;
00645 }
00646
00647
00653 const Service* Component::GetService(const std::string& name) const
00654 {
00655 Service::Map::const_iterator s;
00656 s = mServices.find(name);
00657 if(s != mServices.end())
00658 {
00659 return s->second;
00660 }
00661
00662 for(s = mServices.begin(); s != mServices.end(); s++)
00663 {
00664 if(strstr(s->first.c_str(), name.c_str()) != NULL)
00665 {
00666 return s->second;
00667 }
00668 }
00669 return NULL;
00670 }
00671
00672
00678 Service::ID::List Component::GetServiceList() const
00679 {
00680 Service::ID::List result;
00681 Service::Map::const_iterator s;
00682 for(s = mServices.begin();
00683 s != mServices.end();
00684 s++)
00685 {
00686 if(s->second->IsEnabled())
00687 {
00688 result.push_back(s->second->GetServiceID());
00689 }
00690 }
00691 return result;
00692 }
00693
00699 Service::ID::Set Component::GetServiceSet() const
00700 {
00701 Service::ID::Set result;
00702 Service::Map::const_iterator s;
00703 for(s = mServices.begin();
00704 s != mServices.end();
00705 s++)
00706 {
00707 if(s->second->IsEnabled())
00708 {
00709 result.insert(s->second->GetServiceID());
00710 }
00711 }
00712 return result;
00713 }
00714
00715
00723 void Component::CheckServiceStatusEvent(void* args)
00724 {
00725 Component* component = (Component *)args;
00726 if(component->mInitializedFlag)
00727 {
00728 Service::Map::iterator s;
00729 for(s = component->mServices.begin();
00730 s != component->mServices.end() && component->mInitializedFlag;
00731 s++)
00732 {
00733 if(s->second != component->mpEventsService &&
00734 s->second != component->mpLivenessService &&
00735 s->second != component->mpDiscoveryService &&
00736 s->second != component->mpAccessControlService &&
00737 s->second != component->mpManagementService &&
00738 s->second != component->mpTimeService &&
00739 s->second != component->mpTransportService)
00740 {
00741 s->second->CheckServiceStatus((unsigned int)(Time::GetUtcTimeMs() - component->mServiceCheckTimeMs));
00742 Sensor* sensor = dynamic_cast<Sensor *>(s->second);
00743 if(sensor)
00744 {
00745 sensor->CheckServiceSynchronization((unsigned int)(Time::GetUtcTimeMs() - component->mServiceCheckTimeMs));
00746 }
00747 }
00748 }
00749 component->mServiceCheckTimeMs = Time::GetUtcTimeMs();
00750 }
00751 }
00752
00753
00761 void Component::CheckCoreServicesStatusEvent(void* args)
00762 {
00763 Component* component = (Component *)args;
00764 if(component->mInitializedFlag)
00765 {
00766 component->mpTransportService->CheckServiceStatus((unsigned int)(Time::GetUtcTimeMs() - component->mCoreServicesCheckTimeMs));
00767 component->mpEventsService->CheckServiceStatus((unsigned int)(Time::GetUtcTimeMs() - component->mCoreServicesCheckTimeMs));
00768 component->mpLivenessService->CheckServiceStatus((unsigned int)(Time::GetUtcTimeMs() - component->mCoreServicesCheckTimeMs));
00769 component->mpDiscoveryService->CheckServiceStatus((unsigned int)(Time::GetUtcTimeMs() - component->mCoreServicesCheckTimeMs));
00770 component->mpAccessControlService->CheckServiceStatus((unsigned int)(Time::GetUtcTimeMs() - component->mCoreServicesCheckTimeMs));
00771 component->mpManagementService->CheckServiceStatus((unsigned int)(Time::GetUtcTimeMs() - component->mCoreServicesCheckTimeMs));
00772 component->mpTimeService->CheckServiceStatus((unsigned int)(Time::GetUtcTimeMs() - component->mCoreServicesCheckTimeMs));
00773
00774 component->mCoreServicesCheckTimeMs = Time::GetUtcTimeMs();
00775 }
00776 }
00777
00778
00784 void Component::PrintStatus() const
00785 {
00786 Service::Map::const_iterator service;
00787
00788 std::cout << "========================================================================\n";
00789 std::cout << "Component Status [" << GetComponentID().ToString() << "]" << std::endl;
00790 for(service = mServices.begin();
00791 service != mServices.end();
00792 service++)
00793 {
00794 std::cout << service->second->GetServiceID().ToString() << std::endl;
00795 service->second->PrintStatus();
00796 }
00797 }
00798
00799
00800