1 // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Library General Public
5 // License as published by the Free Software Foundation; either
6 // version 2 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Library General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #include "HLAFederate.hxx"
20 #include "RTIFederate.hxx"
21 #include "RTIInteractionClass.hxx"
22 #include "RTIObjectClass.hxx"
23 #include "HLADataElement.hxx"
24 #include "HLADataType.hxx"
25 #include "HLAOMTXmlVisitor.hxx"
29 HLAFederate::HLAFederate(const SGSharedPtr<RTIFederate>& rtiFederate) :
30 _rtiFederate(rtiFederate)
34 HLAFederate::~HLAFederate()
39 HLAFederate::getFederateType() const
41 return _rtiFederate->getFederateType();
45 HLAFederate::getFederationName() const
47 return _rtiFederate->getFederationName();
51 HLAFederate::createFederationExecution(const std::string& federation, const std::string& objectModel)
53 return _rtiFederate->createFederationExecution(federation, objectModel);
57 HLAFederate::destroyFederationExecution(const std::string& federation)
59 return _rtiFederate->destroyFederationExecution(federation);
63 HLAFederate::join(const std::string& federateType, const std::string& federation)
65 return _rtiFederate->join(federateType, federation);
71 return _rtiFederate->resign();
75 HLAFederate::enableTimeConstrained()
77 return _rtiFederate->enableTimeConstrained();
81 HLAFederate::disableTimeConstrained()
83 return _rtiFederate->disableTimeConstrained();
87 HLAFederate::enableTimeRegulation(const SGTimeStamp& lookahead)
89 return _rtiFederate->enableTimeRegulation(lookahead);
93 HLAFederate::disableTimeRegulation()
95 return _rtiFederate->disableTimeRegulation();
99 HLAFederate::timeAdvanceRequestBy(const SGTimeStamp& dt)
101 return _rtiFederate->timeAdvanceRequestBy(dt);
105 HLAFederate::timeAdvanceRequest(const SGTimeStamp& dt)
107 return _rtiFederate->timeAdvanceRequest(dt);
113 return _rtiFederate->tick();
117 HLAFederate::tick(const double& minimum, const double& maximum)
119 return _rtiFederate->tick(minimum, maximum);
123 HLAFederate::readObjectModelTemplate(const std::string& objectModel,
124 HLAFederate::ObjectModelFactory& objectModelFactory)
126 if (!_rtiFederate.valid()) {
127 SG_LOG(SG_IO, SG_ALERT, "Could not process HLA XML object model file: "
128 "No rti federate available!");
132 // The XML version of the federate object model.
133 // This one covers the generic attributes, parameters and data types.
134 HLAOMTXmlVisitor omtXmlVisitor;
136 readXML(objectModel, omtXmlVisitor);
137 } catch (const sg_throwable& e) {
138 SG_LOG(SG_IO, SG_ALERT, "Could not open HLA XML object model file: "
142 SG_LOG(SG_IO, SG_ALERT, "Could not open HLA XML object model file");
146 unsigned numObjectClasses = omtXmlVisitor.getNumObjectClasses();
147 for (unsigned i = 0; i < numObjectClasses; ++i) {
148 const HLAOMTXmlVisitor::ObjectClass* objectClass = omtXmlVisitor.getObjectClass(i);
149 std::string objectClassName = objectClass->getName();
151 SGSharedPtr<HLAObjectClass> hlaObjectClass = objectModelFactory.createObjectClass(objectClassName, *this);
152 if (!hlaObjectClass.valid()) {
153 SG_LOG(SG_IO, SG_INFO, "Ignoring object class \"" << objectClassName << "\".");
157 bool publish = objectModelFactory.publishObjectClass(objectClassName, objectClass->getSharing());
158 bool subscribe = objectModelFactory.subscribeObjectClass(objectClassName, objectClass->getSharing());
160 std::set<unsigned> subscriptions;
161 std::set<unsigned> publications;
163 // process the attributes
164 for (unsigned j = 0; j < objectClass->getNumAttributes(); ++j) {
165 const simgear::HLAOMTXmlVisitor::Attribute* attribute;
166 attribute = objectClass->getAttribute(j);
168 std::string attributeName = attribute->getName();
169 unsigned index = hlaObjectClass->getAttributeIndex(attributeName);
172 SG_LOG(SG_IO, SG_WARN, "RTI does not know the \"" << attributeName << "\" attribute!");
176 SGSharedPtr<HLADataType> dataType;
177 dataType = omtXmlVisitor.getAttributeDataType(objectClassName, attributeName);
178 if (!dataType.valid()) {
179 SG_LOG(SG_IO, SG_WARN, "Could not find data type for attribute \""
180 << attributeName << "\" in object class \"" << objectClassName << "\"!");
182 hlaObjectClass->setAttributeDataType(index, dataType);
184 HLAUpdateType updateType = HLAUndefinedUpdate;
185 if (attribute->_updateType == "Periodic")
186 updateType = HLAPeriodicUpdate;
187 else if (attribute->_updateType == "Static")
188 updateType = HLAStaticUpdate;
189 else if (attribute->_updateType == "Conditional")
190 updateType = HLAConditionalUpdate;
191 hlaObjectClass->setAttributeUpdateType(index, updateType);
193 if (subscribe && objectModelFactory.subscribeAttribute(objectClassName, attributeName, attribute->_sharing))
194 subscriptions.insert(index);
195 if (publish && objectModelFactory.publishAttribute(objectClassName, attributeName, attribute->_sharing))
196 publications.insert(index);
200 hlaObjectClass->publish(publications);
202 hlaObjectClass->subscribe(subscriptions, true);
204 _objectClassMap[objectClassName] = hlaObjectClass;
211 HLAFederate::getObjectClass(const std::string& name)
213 ObjectClassMap::const_iterator i = _objectClassMap.find(name);
214 if (i == _objectClassMap.end())
216 return i->second.get();
219 const HLAObjectClass*
220 HLAFederate::getObjectClass(const std::string& name) const
222 ObjectClassMap::const_iterator i = _objectClassMap.find(name);
223 if (i == _objectClassMap.end())
225 return i->second.get();
229 HLAFederate::getInteractionClass(const std::string& name)
231 InteractionClassMap::const_iterator i = _interactionClassMap.find(name);
232 if (i == _interactionClassMap.end())
234 return i->second.get();
237 const HLAInteractionClass*
238 HLAFederate::getInteractionClass(const std::string& name) const
240 InteractionClassMap::const_iterator i = _interactionClassMap.find(name);
241 if (i == _interactionClassMap.end())
243 return i->second.get();
246 } // namespace simgear