-// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
+// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
#include "HLAFederate.hxx"
-#include "RTI13Federate.hxx"
+#include "simgear/debug/logstream.hxx"
+
#include "RTIFederate.hxx"
+#include "RTIFederateFactoryRegistry.hxx"
+#include "RTI13FederateFactory.hxx"
#include "RTIInteractionClass.hxx"
#include "RTIObjectClass.hxx"
#include "HLADataElement.hxx"
_timeConstrainedByLocalClock(false),
_done(false)
{
+ // For now instantiate the current only available factory here explicitly
+ RTI13FederateFactory::instance();
}
HLAFederate::~HLAFederate()
bool
HLAFederate::connect(Version version, const std::list<std::string>& stringList)
{
- if (_rtiFederate.valid()) {
- SG_LOG(SG_NETWORK, SG_WARN, "HLA: Trying to connect to already connected federate!");
- return false;
- }
- switch (version) {
- case RTI13:
- _rtiFederate = new RTI13Federate(stringList);
- _version = version;
- _connectArguments = stringList;
- break;
- case RTI1516:
- SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516 not yet(!?) supported.");
- // _rtiFederate = new RTI1516Federate(stringList);
- break;
- case RTI1516E:
- SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
- // _rtiFederate = new RTI1516eFederate(stringList);
- break;
- default:
- SG_LOG(SG_NETWORK, SG_WARN, "HLA: Unknown rti version in connect!");
- }
- return _rtiFederate.valid();
+ _version = version;
+ _connectArguments = stringList;
+ return connect();
}
bool
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Trying to connect to already connected federate!");
return false;
}
+
+ SGSharedPtr<RTIFederateFactoryRegistry> registry = RTIFederateFactoryRegistry::instance();
+ if (!registry) {
+ SG_LOG(SG_NETWORK, SG_ALERT, "HLA: RTIFederateFactoryRegistry is no longer available!");
+ return false;
+ }
+
switch (_version) {
case RTI13:
- _rtiFederate = new RTI13Federate(_connectArguments);
+ _rtiFederate = registry->create("RTI13", _connectArguments);
break;
case RTI1516:
- SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516 not yet(!?) supported.");
- // _rtiFederate = new RTI1516Federate(_connectArguments);
+ _rtiFederate = registry->create("RTI1516", _connectArguments);
break;
case RTI1516E:
- SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
- // _rtiFederate = new RTI1516eFederate(_connectArguments);
+ _rtiFederate = registry->create("RTI1516E", _connectArguments);
break;
default:
SG_LOG(SG_NETWORK, SG_WARN, "HLA: Unknown rti version in connect!");
}
// Now flush just what is left
- while (!_rtiFederate->processMessages(0, 0));
+ while (_rtiFederate->processMessages(0, 0));
return true;
}
return true;
}
+bool
+HLAFederate::readRTI13ObjectModelTemplate(const std::string& objectModel)
+{
+ SG_LOG(SG_IO, SG_ALERT, "HLA version RTI13 not yet(!?) supported.");
+ return false;
+}
+
+bool
+HLAFederate::readRTI1516ObjectModelTemplate(const std::string& objectModel)
+{
+ ObjectModelFactory objectModelFactory;
+ return readObjectModelTemplate(objectModel, objectModelFactory);
+}
+
+bool
+HLAFederate::readRTI1516EObjectModelTemplate(const std::string& objectModel)
+{
+ SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
+ return false;
+}
+
HLAObjectClass*
HLAFederate::getObjectClass(const std::string& name)
{
return i->second.get();
}
+HLAObjectClass*
+HLAFederate::createObjectClass(const std::string& name)
+{
+ return new HLAObjectClass(name, *this);
+}
+
HLAInteractionClass*
HLAFederate::getInteractionClass(const std::string& name)
{
{
/// Currently empty, but is called at the right time so that
/// the object model is present when it is needed
+ // switch (getVersion()) {
+ // case RTI13:
+ // return readRTI13ObjectModelTemplate(getFederationObjectModel());
+ // case RTI1516:
+ // return readRTI1516ObjectModelTemplate(getFederationObjectModel());
+ // case RTI1516E:
+ // return readRTI1516EObjectModelTemplate(getFederationObjectModel());
+ // }
return true;
}