1 // Copyright (C) 2009 - 2011 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 "RTI13Federate.hxx"
20 #include "RTI13Ambassador.hxx"
24 static std::string toStdString(const char* n)
28 return std::string(n);
31 /// Just the interface class doing the callbacks into the parent class
32 struct RTI13Federate::FederateAmbassador : public RTI::FederateAmbassador {
33 FederateAmbassador() :
34 _timeRegulationEnabled(false),
35 _timeConstrainedEnabled(false),
36 _timeAdvancePending(false)
39 virtual ~FederateAmbassador()
40 throw (RTI::FederateInternalError)
44 /// RTI federate ambassador callback functions.
45 virtual void synchronizationPointRegistrationSucceeded(const char* label)
46 throw (RTI::FederateInternalError)
50 virtual void synchronizationPointRegistrationFailed(const char* label)
51 throw (RTI::FederateInternalError)
55 virtual void announceSynchronizationPoint(const char* label, const char* tag)
56 throw (RTI::FederateInternalError)
58 _pendingSyncLabels.insert(toStdString(label));
61 virtual void federationSynchronized(const char* label)
62 throw (RTI::FederateInternalError)
64 std::string s = toStdString(label);
65 _pendingSyncLabels.erase(s);
66 _syncronizedSyncLabels.insert(s);
69 virtual void initiateFederateSave(const char* label)
70 throw (RTI::UnableToPerformSave,
71 RTI::FederateInternalError)
75 virtual void federationSaved()
76 throw (RTI::FederateInternalError)
80 virtual void federationNotSaved()
81 throw (RTI::FederateInternalError)
85 virtual void requestFederationRestoreSucceeded(const char* label)
86 throw (RTI::FederateInternalError)
90 virtual void requestFederationRestoreFailed(const char* label, const char* reason)
91 throw (RTI::FederateInternalError)
95 virtual void federationRestoreBegun()
96 throw (RTI::FederateInternalError)
100 virtual void initiateFederateRestore(const char* label, RTI::FederateHandle federateHandle)
101 throw (RTI::SpecifiedSaveLabelDoesNotExist,
102 RTI::CouldNotRestore,
103 RTI::FederateInternalError)
107 virtual void federationRestored()
108 throw (RTI::FederateInternalError)
112 virtual void federationNotRestored()
113 throw (RTI::FederateInternalError)
117 // Declaration Management
118 virtual void startRegistrationForObjectClass(RTI::ObjectClassHandle objectClassHandle)
119 throw (RTI::ObjectClassNotPublished,
120 RTI::FederateInternalError)
122 ObjectClassMap::iterator i = _objectClassMap.find(objectClassHandle);
123 if (i == _objectClassMap.end())
125 if (!i->second.valid())
127 i->second->startRegistration();
130 virtual void stopRegistrationForObjectClass(RTI::ObjectClassHandle objectClassHandle)
131 throw (RTI::ObjectClassNotPublished,
132 RTI::FederateInternalError)
134 ObjectClassMap::iterator i = _objectClassMap.find(objectClassHandle);
135 if (i == _objectClassMap.end())
137 if (!i->second.valid())
139 i->second->stopRegistration();
142 virtual void turnInteractionsOn(RTI::InteractionClassHandle interactionClassHandle)
143 throw (RTI::InteractionClassNotPublished,
144 RTI::FederateInternalError)
148 virtual void turnInteractionsOff(RTI::InteractionClassHandle interactionClassHandle)
149 throw (RTI::InteractionClassNotPublished,
150 RTI::FederateInternalError)
156 virtual void discoverObjectInstance(RTI::ObjectHandle objectHandle, RTI::ObjectClassHandle objectClassHandle, const char* tag)
157 throw (RTI::CouldNotDiscover,
158 RTI::ObjectClassNotKnown,
159 RTI::FederateInternalError)
161 ObjectClassMap::iterator i = _objectClassMap.find(objectClassHandle);
162 if (i == _objectClassMap.end())
163 throw RTI::ObjectClassNotKnown("Federate: discoverObjectInstance()!");
164 if (!i->second.valid())
166 SGSharedPtr<RTI13ObjectInstance> objectInstance = new RTI13ObjectInstance(objectHandle, 0, i->second, _rtiAmbassador.get(), false);
167 _objectInstanceMap[objectHandle] = objectInstance;
168 _queueCallbackList.push_back(new DiscoverObjectCallback(i->second, objectInstance, tagToData(tag)));
171 virtual void reflectAttributeValues(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleValuePairSet& attributeValuePairSet,
172 const RTI::FedTime& fedTime, const char* tag, RTI::EventRetractionHandle eventRetractionHandle)
173 throw (RTI::ObjectNotKnown,
174 RTI::AttributeNotKnown,
175 RTI::FederateOwnsAttributes,
176 RTI::InvalidFederationTime,
177 RTI::FederateInternalError)
179 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
180 if (i == _objectInstanceMap.end())
181 throw RTI::ObjectNotKnown("Reflect attributes for unknown object!");
182 if (!i->second.valid())
184 i->second->reflectAttributeValues(attributeValuePairSet, RTI13Ambassador::toTimeStamp(fedTime), tagToData(tag));
187 virtual void reflectAttributeValues(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleValuePairSet& attributeValuePairSet,
189 throw (RTI::ObjectNotKnown,
190 RTI::AttributeNotKnown,
191 RTI::FederateOwnsAttributes,
192 RTI::FederateInternalError)
194 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
195 if (i == _objectInstanceMap.end())
196 throw RTI::ObjectNotKnown("Reflect attributes for unknown object!");
197 if (!i->second.valid())
199 i->second->reflectAttributeValues(attributeValuePairSet, tagToData(tag));
202 virtual void receiveInteraction(RTI::InteractionClassHandle interactionClassHandle, const RTI::ParameterHandleValuePairSet& parameters,
203 const RTI::FedTime& fedTime, const char* tag, RTI::EventRetractionHandle eventRetractionHandle)
204 throw (RTI::InteractionClassNotKnown,
205 RTI::InteractionParameterNotKnown,
206 RTI::InvalidFederationTime,
207 RTI::FederateInternalError)
211 virtual void receiveInteraction(RTI::InteractionClassHandle interactionClassHandle,
212 const RTI::ParameterHandleValuePairSet& parameters, const char* tag)
213 throw (RTI::InteractionClassNotKnown,
214 RTI::InteractionParameterNotKnown,
215 RTI::FederateInternalError)
219 virtual void removeObjectInstance(RTI::ObjectHandle objectHandle, const RTI::FedTime& fedTime,
220 const char* tag, RTI::EventRetractionHandle eventRetractionHandle)
221 throw (RTI::ObjectNotKnown,
222 RTI::InvalidFederationTime,
223 RTI::FederateInternalError)
225 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
226 if (i == _objectInstanceMap.end())
227 throw RTI::ObjectNotKnown("Federate: removeObjectInstance()!");
228 if (i->second.valid())
229 _queueCallbackList.push_back(new RemoveObjectCallback(i->second, tagToData(tag)));
230 _objectInstanceMap.erase(i);
233 virtual void removeObjectInstance(RTI::ObjectHandle objectHandle, const char* tag)
234 throw (RTI::ObjectNotKnown,
235 RTI::FederateInternalError)
237 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
238 if (i == _objectInstanceMap.end())
239 throw RTI::ObjectNotKnown("Federate: removeObjectInstance()!");
240 if (i->second.valid())
241 _queueCallbackList.push_back(new RemoveObjectCallback(i->second, tagToData(tag)));
242 _objectInstanceMap.erase(i);
245 virtual void attributesInScope(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
246 throw (RTI::ObjectNotKnown,
247 RTI::AttributeNotKnown,
248 RTI::FederateInternalError)
250 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
251 if (i == _objectInstanceMap.end())
252 throw RTI::ObjectNotKnown("Attributes in scope for unknown object!");
253 if (!i->second.valid())
255 i->second->attributesInScope(attributes);
258 virtual void attributesOutOfScope(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
259 throw (RTI::ObjectNotKnown,
260 RTI::AttributeNotKnown,
261 RTI::FederateInternalError)
263 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
264 if (i == _objectInstanceMap.end())
265 throw RTI::ObjectNotKnown("Attributes in scope for unknown object!");
266 if (!i->second.valid())
268 i->second->attributesOutOfScope(attributes);
271 virtual void provideAttributeValueUpdate(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
272 throw (RTI::ObjectNotKnown,
273 RTI::AttributeNotKnown,
274 RTI::AttributeNotOwned,
275 RTI::FederateInternalError)
277 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
278 if (i == _objectInstanceMap.end())
279 throw RTI::ObjectNotKnown("Reflect attributes for unknown object!");
280 if (!i->second.valid())
282 i->second->provideAttributeValueUpdate(attributes);
285 virtual void turnUpdatesOnForObjectInstance(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
286 throw (RTI::ObjectNotKnown,
287 RTI::AttributeNotOwned,
288 RTI::FederateInternalError)
290 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
291 if (i == _objectInstanceMap.end())
292 throw RTI::ObjectNotKnown("Turn on attributes for unknown object!");
293 if (!i->second.valid())
295 i->second->turnUpdatesOnForObjectInstance(attributes);
298 virtual void turnUpdatesOffForObjectInstance(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
299 throw (RTI::ObjectNotKnown,
300 RTI::AttributeNotOwned,
301 RTI::FederateInternalError)
303 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
304 if (i == _objectInstanceMap.end())
305 throw RTI::ObjectNotKnown("Turn off attributes for unknown object!");
306 if (!i->second.valid())
308 i->second->turnUpdatesOffForObjectInstance(attributes);
311 // Ownership Management
312 virtual void requestAttributeOwnershipAssumption(RTI::ObjectHandle objectHandle,
313 const RTI::AttributeHandleSet& attributes, const char* tag)
314 throw (RTI::ObjectNotKnown,
315 RTI::AttributeNotKnown,
316 RTI::AttributeAlreadyOwned,
317 RTI::AttributeNotPublished,
318 RTI::FederateInternalError)
320 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
321 if (i == _objectInstanceMap.end())
322 throw RTI::ObjectNotKnown("requestAttributeOwnershipAssumption for unknown object!");
323 if (!i->second.valid())
325 i->second->requestAttributeOwnershipAssumption(attributes, tagToData(tag));
328 virtual void attributeOwnershipDivestitureNotification(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
329 throw (RTI::ObjectNotKnown,
330 RTI::AttributeNotKnown,
331 RTI::AttributeNotOwned,
332 RTI::AttributeDivestitureWasNotRequested,
333 RTI::FederateInternalError)
335 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
336 if (i == _objectInstanceMap.end())
337 throw RTI::ObjectNotKnown("attributeOwnershipDivestitureNotification for unknown object!");
338 if (!i->second.valid())
340 i->second->attributeOwnershipDivestitureNotification(attributes);
343 virtual void attributeOwnershipAcquisitionNotification(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
344 throw (RTI::ObjectNotKnown,
345 RTI::AttributeNotKnown,
346 RTI::AttributeAcquisitionWasNotRequested,
347 RTI::AttributeAlreadyOwned,
348 RTI::AttributeNotPublished,
349 RTI::FederateInternalError)
351 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
352 if (i == _objectInstanceMap.end())
353 throw RTI::ObjectNotKnown("attributeOwnershipAcquisitionNotification for unknown object!");
354 if (!i->second.valid())
356 i->second->attributeOwnershipAcquisitionNotification(attributes);
359 virtual void attributeOwnershipUnavailable(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
360 throw (RTI::ObjectNotKnown,
361 RTI::AttributeNotKnown,
362 RTI::AttributeAlreadyOwned,
363 RTI::AttributeAcquisitionWasNotRequested,
364 RTI::FederateInternalError)
366 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
367 if (i == _objectInstanceMap.end())
368 throw RTI::ObjectNotKnown("attributeOwnershipUnavailable for unknown object!");
369 if (!i->second.valid())
371 i->second->attributeOwnershipUnavailable(attributes);
374 virtual void requestAttributeOwnershipRelease(RTI::ObjectHandle objectHandle,
375 const RTI::AttributeHandleSet& attributes, const char* tag)
376 throw (RTI::ObjectNotKnown,
377 RTI::AttributeNotKnown,
378 RTI::AttributeNotOwned,
379 RTI::FederateInternalError)
381 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
382 if (i == _objectInstanceMap.end())
383 throw RTI::ObjectNotKnown("requestAttributeOwnershipRelease for unknown object!");
384 if (!i->second.valid())
386 i->second->requestAttributeOwnershipRelease(attributes, tagToData(tag));
389 virtual void confirmAttributeOwnershipAcquisitionCancellation(RTI::ObjectHandle objectHandle, const RTI::AttributeHandleSet& attributes)
390 throw (RTI::ObjectNotKnown,
391 RTI::AttributeNotKnown,
392 RTI::AttributeAlreadyOwned,
393 RTI::AttributeAcquisitionWasNotCanceled,
394 RTI::FederateInternalError)
396 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
397 if (i == _objectInstanceMap.end())
398 throw RTI::ObjectNotKnown("confirmAttributeOwnershipAcquisitionCancellation for unknown object!");
399 if (!i->second.valid())
401 i->second->confirmAttributeOwnershipAcquisitionCancellation(attributes);
404 virtual void informAttributeOwnership(RTI::ObjectHandle objectHandle, RTI::AttributeHandle attributeHandle,
405 RTI::FederateHandle federateHandle)
406 throw (RTI::ObjectNotKnown,
407 RTI::AttributeNotKnown,
408 RTI::FederateInternalError)
410 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
411 if (i == _objectInstanceMap.end())
412 throw RTI::ObjectNotKnown("informAttributeOwnership for unknown object!");
413 if (!i->second.valid())
415 i->second->informAttributeOwnership(attributeHandle, federateHandle);
418 virtual void attributeIsNotOwned(RTI::ObjectHandle objectHandle, RTI::AttributeHandle attributeHandle)
419 throw (RTI::ObjectNotKnown,
420 RTI::AttributeNotKnown,
421 RTI::FederateInternalError)
423 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
424 if (i == _objectInstanceMap.end())
425 throw RTI::ObjectNotKnown("attributeIsNotOwned for unknown object!");
426 if (!i->second.valid())
428 i->second->attributeIsNotOwned(attributeHandle);
431 virtual void attributeOwnedByRTI(RTI::ObjectHandle objectHandle, RTI::AttributeHandle attributeHandle)
432 throw (RTI::ObjectNotKnown,
433 RTI::AttributeNotKnown,
434 RTI::FederateInternalError)
436 ObjectInstanceMap::iterator i = _objectInstanceMap.find(objectHandle);
437 if (i == _objectInstanceMap.end())
438 throw RTI::ObjectNotKnown("attributeOwnedByRTI for unknown object!");
439 if (!i->second.valid())
441 i->second->attributeOwnedByRTI(attributeHandle);
445 virtual void timeRegulationEnabled(const RTI::FedTime& fedTime)
446 throw (RTI::InvalidFederationTime,
447 RTI::EnableTimeRegulationWasNotPending,
448 RTI::FederateInternalError)
450 _timeRegulationEnabled = true;
451 _federateTime = RTI13Ambassador::toTimeStamp(fedTime);
452 SG_LOG(SG_NETWORK, SG_INFO, "RTI: timeRegulationEnabled: " << _federateTime);
455 virtual void timeConstrainedEnabled(const RTI::FedTime& fedTime)
456 throw (RTI::InvalidFederationTime,
457 RTI::EnableTimeConstrainedWasNotPending,
458 RTI::FederateInternalError)
460 _timeConstrainedEnabled = true;
461 _federateTime = RTI13Ambassador::toTimeStamp(fedTime);
462 SG_LOG(SG_NETWORK, SG_INFO, "RTI: timeConstrainedEnabled: " << _federateTime);
465 virtual void timeAdvanceGrant(const RTI::FedTime& fedTime)
466 throw (RTI::InvalidFederationTime,
467 RTI::TimeAdvanceWasNotInProgress,
468 RTI::FederateInternalError)
470 _federateTime = RTI13Ambassador::toTimeStamp(fedTime);
471 _timeAdvancePending = false;
472 SG_LOG(SG_NETWORK, SG_INFO, "RTI: timeAdvanceGrant: " << _federateTime);
475 virtual void requestRetraction(RTI::EventRetractionHandle eventRetractionHandle)
476 throw (RTI::EventNotKnown,
477 RTI::FederateInternalError)
479 // No retraction concept yet
482 // processes the queues that filled up during the past
485 while (!_queueCallbackList.empty()) {
486 (*_queueCallbackList.front())();
487 _queueCallbackList.pop_front();
491 bool getFederationSynchronizationPointAnnounced(const std::string& label)
492 { return _pendingSyncLabels.find(label) != _pendingSyncLabels.end(); }
493 bool getFederationSynchronized(const std::string& label)
495 std::set<std::string>::iterator i = _syncronizedSyncLabels.find(label);
496 if (i == _syncronizedSyncLabels.end())
498 _syncronizedSyncLabels.erase(i);
502 /// Generic callback to execute some notification on objects in a way that they are not prone to
503 /// ConcurrentAccess exceptions.
504 class QueueCallback : public SGReferenced {
506 virtual ~QueueCallback() {}
507 virtual void operator()() = 0;
510 class DiscoverObjectCallback : public QueueCallback {
512 DiscoverObjectCallback(SGSharedPtr<RTIObjectClass> objectClass, SGSharedPtr<RTIObjectInstance> objectInstance, const RTIData& tag) :
513 _objectClass(objectClass),
514 _objectInstance(objectInstance),
517 virtual void operator()()
519 _objectClass->discoverInstance(_objectInstance.get(), _tag);
520 _objectInstance->requestObjectAttributeValueUpdate();
523 SGSharedPtr<RTIObjectClass> _objectClass;
524 SGSharedPtr<RTIObjectInstance> _objectInstance;
527 class RemoveObjectCallback : public QueueCallback {
529 RemoveObjectCallback(SGSharedPtr<RTIObjectInstance> objectInstance, const RTIData& tag) :
530 _objectInstance(objectInstance),
533 virtual void operator()()
535 _objectInstance->removeInstance(_tag);
538 SGSharedPtr<RTIObjectInstance> _objectInstance;
542 // The rtiambassador to issue requests
543 SGSharedPtr<RTI13Ambassador> _rtiAmbassador;
545 // All the sync labels we got an announcement for
546 std::set<std::string> _pendingSyncLabels;
547 std::set<std::string> _syncronizedSyncLabels;
549 // All that calls back into user code is just queued.
550 // That is to make sure we do not call recursively into the RTI
551 typedef std::list<SGSharedPtr<QueueCallback> > QueueCallbackList;
552 QueueCallbackList _queueCallbackList;
554 // Top level information for dispatching federate object attribute updates
555 typedef std::map<RTI::ObjectHandle, SGSharedPtr<RTI13ObjectInstance> > ObjectInstanceMap;
556 // Map of all available objects
557 ObjectInstanceMap _objectInstanceMap;
559 // Top level information for dispatching creation of federate objects
560 typedef std::map<RTI::ObjectClassHandle, SGSharedPtr<RTI13ObjectClass> > ObjectClassMap;
561 ObjectClassMap _objectClassMap;
563 bool _timeRegulationEnabled;
564 bool _timeConstrainedEnabled;
565 bool _timeAdvancePending;
566 SGTimeStamp _federateTime;
569 const RTIData& tagToData(const char* tag)
572 _cachedTag.setData(tag, std::strlen(tag) + 1);
574 _cachedTag.setData("", 1);
580 RTI13Federate::RTI13Federate(const std::list<std::string>& stringList) :
583 _ambassador(new RTI13Ambassador),
584 _federateAmbassador(new FederateAmbassador)
586 _ambassador->_federate = this;
587 _federateAmbassador->_rtiAmbassador = _ambassador;
588 if (stringList.empty()) {
589 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Ignoring non empty connect arguments while connecting to an RTI13 federation!");
593 RTI13Federate::~RTI13Federate()
596 _ambassador->resignFederationExecution();
597 delete _federateAmbassador;
601 RTI13Federate::createFederationExecution(const std::string& federationName, const std::string& objectModel)
604 _ambassador->createFederationExecution(federationName, objectModel);
606 } catch (RTI::FederationExecutionAlreadyExists& e) {
608 } catch (RTI::CouldNotOpenFED& e) {
609 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not create federation execution: " << e._name << " " << e._reason);
611 } catch (RTI::ErrorReadingFED& e) {
612 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not create federation execution: " << e._name << " " << e._reason);
614 } catch (RTI::ConcurrentAccessAttempted& e) {
615 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not create federation execution: " << e._name << " " << e._reason);
617 } catch (RTI::RTIinternalError& e) {
618 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not create federation execution: " << e._name << " " << e._reason);
624 RTI13Federate::destroyFederationExecution(const std::string& federation)
627 _ambassador->destroyFederationExecution(federation);
629 } catch (RTI::FederatesCurrentlyJoined& e) {
631 } catch (RTI::FederationExecutionDoesNotExist& e) {
633 } catch (RTI::ConcurrentAccessAttempted& e) {
634 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not destroy federation execution: " << e._name << " " << e._reason);
636 } catch (RTI::RTIinternalError& e) {
637 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not destroy federation execution: " << e._name << " " << e._reason);
643 RTI13Federate::join(const std::string& federateType, const std::string& federationName)
646 _federateHandle = _ambassador->joinFederationExecution(federateType, federationName, _federateAmbassador);
647 SG_LOG(SG_NETWORK, SG_INFO, "RTI: Joined federation \""
648 << federationName << "\" as \"" << federateType << "\"");
649 setFederateType(federateType);
650 setFederationName(federationName);
653 } catch (RTI::FederateAlreadyExecutionMember& e) {
654 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not join federation execution: " << e._name << " " << e._reason);
656 } catch (RTI::FederationExecutionDoesNotExist& e) {
657 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not join federation execution: " << e._name << " " << e._reason);
659 } catch (RTI::CouldNotOpenFED& e) {
660 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not join federation execution: " << e._name << " " << e._reason);
662 } catch (RTI::ErrorReadingFED& e) {
663 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not join federation execution: " << e._name << " " << e._reason);
665 } catch (RTI::ConcurrentAccessAttempted& e) {
666 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not join federation execution: " << e._name << " " << e._reason);
668 } catch (RTI::SaveInProgress& e) {
669 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not join federation execution: " << e._name << " " << e._reason);
671 } catch (RTI::RestoreInProgress& e) {
672 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not join federation execution: " << e._name << " " << e._reason);
674 } catch (RTI::RTIinternalError& e) {
675 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not join federation execution: " << e._name << " " << e._reason);
681 RTI13Federate::resign()
684 _ambassador->resignFederationExecution();
685 SG_LOG(SG_NETWORK, SG_INFO, "RTI: Resigned from federation.");
687 _federateHandle = -1;
689 } catch (RTI::FederateOwnsAttributes& e) {
690 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
692 } catch (RTI::FederateNotExecutionMember& e) {
693 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
695 } catch (RTI::InvalidResignAction& e) {
696 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
698 } catch (RTI::ConcurrentAccessAttempted& e) {
699 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
701 } catch (RTI::RTIinternalError& e) {
702 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
708 RTI13Federate::registerFederationSynchronizationPoint(const std::string& label, const RTIData& tag)
711 _ambassador->registerFederationSynchronizationPoint(label, tag);
712 SG_LOG(SG_NETWORK, SG_INFO, "RTI: registerFederationSynchronizationPoint(" << label << ", tag )");
714 } catch (RTI::FederateNotExecutionMember& e) {
715 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register federation synchronization point: " << e._name << " " << e._reason);
717 } catch (RTI::ConcurrentAccessAttempted& e) {
718 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register federation synchronization point: " << e._name << " " << e._reason);
720 } catch (RTI::SaveInProgress& e) {
721 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register federation synchronization point: " << e._name << " " << e._reason);
723 } catch (RTI::RestoreInProgress& e) {
724 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register federation synchronization point: " << e._name << " " << e._reason);
726 } catch (RTI::RTIinternalError& e) {
727 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register federation synchronization point: " << e._name << " " << e._reason);
733 RTI13Federate::waitForFederationSynchronizationPointAnnounced(const std::string& label)
735 while (!_federateAmbassador->getFederationSynchronizationPointAnnounced(label)) {
736 _ambassador->tick(_tickTimeout, 0);
737 _federateAmbassador->processQueues();
743 RTI13Federate::synchronizationPointAchieved(const std::string& label)
746 _ambassador->synchronizationPointAchieved(label);
747 SG_LOG(SG_NETWORK, SG_INFO, "RTI: synchronizationPointAchieved(" << label << ")");
749 } catch (RTI::SynchronizationPointLabelWasNotAnnounced& e) {
750 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not signal synchronization point: " << e._name << " " << e._reason);
752 } catch (RTI::FederateNotExecutionMember& e) {
753 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not signal synchronization point: " << e._name << " " << e._reason);
755 } catch (RTI::ConcurrentAccessAttempted& e) {
756 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not signal synchronization point: " << e._name << " " << e._reason);
758 } catch (RTI::SaveInProgress& e) {
759 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not signal synchronization point: " << e._name << " " << e._reason);
761 } catch (RTI::RestoreInProgress& e) {
762 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not signal synchronization point: " << e._name << " " << e._reason);
764 } catch (RTI::RTIinternalError& e) {
765 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not signal synchronization point: " << e._name << " " << e._reason);
771 RTI13Federate::waitForFederationSynchronized(const std::string& label)
773 while (!_federateAmbassador->getFederationSynchronized(label)) {
774 _ambassador->tick(_tickTimeout, 0);
775 _federateAmbassador->processQueues();
781 RTI13Federate::enableTimeConstrained()
783 if (!_ambassador.valid()) {
784 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not enable time constrained at unconnected federate.");
788 if (_federateAmbassador->_timeConstrainedEnabled) {
789 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Time constrained is already enabled.");
794 _ambassador->enableTimeConstrained();
795 } catch (RTI::TimeConstrainedAlreadyEnabled& e) {
796 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
798 } catch (RTI::EnableTimeConstrainedPending& e) {
799 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
801 } catch (RTI::TimeAdvanceAlreadyInProgress& e) {
802 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
804 } catch (RTI::ConcurrentAccessAttempted& e) {
805 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
807 } catch (RTI::FederateNotExecutionMember& e) {
808 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
810 } catch (RTI::SaveInProgress& e) {
811 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
813 } catch (RTI::RestoreInProgress& e) {
814 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
816 } catch (RTI::RTIinternalError& e) {
817 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
821 while (!_federateAmbassador->_timeConstrainedEnabled) {
822 _ambassador->tick(_tickTimeout, 0);
823 _federateAmbassador->processQueues();
830 RTI13Federate::disableTimeConstrained()
832 if (!_ambassador.valid()) {
833 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not disable time constrained at unconnected federate.");
837 if (!_federateAmbassador->_timeConstrainedEnabled) {
838 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Time constrained is not enabled.");
843 _ambassador->disableTimeConstrained();
844 _federateAmbassador->_timeConstrainedEnabled = false;
845 } catch (RTI::TimeConstrainedWasNotEnabled& e) {
846 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
848 } catch (RTI::FederateNotExecutionMember& e) {
849 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
851 } catch (RTI::ConcurrentAccessAttempted& e) {
852 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
854 } catch (RTI::SaveInProgress& e) {
855 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
857 } catch (RTI::RestoreInProgress& e) {
858 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
860 } catch (RTI::RTIinternalError& e) {
861 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
869 RTI13Federate::enableTimeRegulation(const SGTimeStamp& lookahead)
871 if (!_ambassador.valid()) {
872 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not enable time regulation at unconnected federate.");
876 if (_federateAmbassador->_timeRegulationEnabled) {
877 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Time regulation already enabled.");
882 _ambassador->enableTimeRegulation(SGTimeStamp(), lookahead);
883 } catch (RTI::TimeRegulationAlreadyEnabled& e) {
884 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
886 } catch (RTI::EnableTimeRegulationPending& e) {
887 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
889 } catch (RTI::TimeAdvanceAlreadyInProgress& e) {
890 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
892 } catch (RTI::InvalidFederationTime& e) {
893 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
895 } catch (RTI::InvalidLookahead& e) {
896 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
898 } catch (RTI::ConcurrentAccessAttempted& e) {
899 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
901 } catch (RTI::FederateNotExecutionMember& e) {
902 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
904 } catch (RTI::SaveInProgress& e) {
905 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
907 } catch (RTI::RestoreInProgress& e) {
908 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
910 } catch (RTI::RTIinternalError& e) {
911 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
915 while (!_federateAmbassador->_timeRegulationEnabled) {
916 _ambassador->tick(_tickTimeout, 0);
917 _federateAmbassador->processQueues();
924 RTI13Federate::disableTimeRegulation()
926 if (!_ambassador.valid()) {
927 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not disable time regulation at unconnected federate.");
931 if (!_federateAmbassador->_timeRegulationEnabled) {
932 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Time regulation is not enabled.");
937 _ambassador->disableTimeRegulation();
938 _federateAmbassador->_timeRegulationEnabled = false;
939 } catch (RTI::TimeRegulationWasNotEnabled& e) {
940 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
942 } catch (RTI::ConcurrentAccessAttempted& e) {
943 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
945 } catch (RTI::FederateNotExecutionMember& e) {
946 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
948 } catch (RTI::SaveInProgress& e) {
949 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
951 } catch (RTI::RestoreInProgress& e) {
952 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
954 } catch (RTI::RTIinternalError& e) {
955 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
963 RTI13Federate::timeAdvanceRequestBy(const SGTimeStamp& dt)
965 if (!_ambassador.valid()) {
966 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not disable time regulation at unconnected federate.");
970 SGTimeStamp fedTime = _federateAmbassador->_federateTime + dt;
971 return timeAdvanceRequest(fedTime);
975 RTI13Federate::timeAdvanceRequest(const SGTimeStamp& fedTime)
977 if (!_ambassador.valid()) {
978 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not disable time regulation at unconnected federate.");
983 _ambassador->timeAdvanceRequest(fedTime);
984 _federateAmbassador->_timeAdvancePending = true;
985 } catch (RTI::InvalidFederationTime& e) {
986 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
988 } catch (RTI::FederationTimeAlreadyPassed& e) {
989 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
991 } catch (RTI::TimeAdvanceAlreadyInProgress& e) {
992 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
994 } catch (RTI::EnableTimeRegulationPending& e) {
995 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
997 } catch (RTI::EnableTimeConstrainedPending& e) {
998 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
1000 } catch (RTI::FederateNotExecutionMember& e) {
1001 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
1003 } catch (RTI::ConcurrentAccessAttempted& e) {
1004 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
1006 } catch (RTI::SaveInProgress& e) {
1007 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
1009 } catch (RTI::RestoreInProgress& e) {
1010 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
1012 } catch (RTI::RTIinternalError& e) {
1013 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not resign federation execution: " << e._name << " " << e._reason);
1017 while (_federateAmbassador->_timeAdvancePending) {
1018 _ambassador->tick(_tickTimeout, 0);
1019 _federateAmbassador->processQueues();
1026 RTI13Federate::queryFederateTime(SGTimeStamp& timeStamp)
1028 if (!_ambassador.valid()) {
1029 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query federate time.");
1034 _ambassador->queryFederateTime(timeStamp);
1035 } catch (RTI::FederateNotExecutionMember& e) {
1036 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query federate time: " << e._name << " " << e._reason);
1038 } catch (RTI::ConcurrentAccessAttempted& e) {
1039 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query federate time: " << e._name << " " << e._reason);
1041 } catch (RTI::SaveInProgress& e) {
1042 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query federate time: " << e._name << " " << e._reason);
1044 } catch (RTI::RestoreInProgress& e) {
1045 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query federate time: " << e._name << " " << e._reason);
1047 } catch (RTI::RTIinternalError& e) {
1048 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query federate time: " << e._name << " " << e._reason);
1055 RTI13Federate::modifyLookahead(const SGTimeStamp& timeStamp)
1057 if (!_ambassador.valid()) {
1058 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not modify lookahead.");
1062 _ambassador->modifyLookahead(timeStamp);
1063 } catch (RTI::InvalidLookahead& e) {
1064 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not modify lookahead: " << e._name << " " << e._reason);
1066 } catch (RTI::FederateNotExecutionMember& e) {
1067 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not modify lookahead: " << e._name << " " << e._reason);
1069 } catch (RTI::ConcurrentAccessAttempted& e) {
1070 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not modify lookahead: " << e._name << " " << e._reason);
1072 } catch (RTI::SaveInProgress& e) {
1073 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not modify lookahead: " << e._name << " " << e._reason);
1075 } catch (RTI::RestoreInProgress& e) {
1076 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not modify lookahead: " << e._name << " " << e._reason);
1078 } catch (RTI::RTIinternalError& e) {
1079 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not modify lookahead: " << e._name << " " << e._reason);
1086 RTI13Federate::queryLookahead(SGTimeStamp& timeStamp)
1088 if (!_ambassador.valid()) {
1089 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query lookahead.");
1094 _ambassador->queryLookahead(timeStamp);
1095 } catch (RTI::FederateNotExecutionMember& e) {
1096 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query lookahead: " << e._name << " " << e._reason);
1098 } catch (RTI::ConcurrentAccessAttempted& e) {
1099 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query lookahead: " << e._name << " " << e._reason);
1101 } catch (RTI::SaveInProgress& e) {
1102 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query lookahead: " << e._name << " " << e._reason);
1104 } catch (RTI::RestoreInProgress& e) {
1105 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query lookahead: " << e._name << " " << e._reason);
1107 } catch (RTI::RTIinternalError& e) {
1108 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not query lookahead: " << e._name << " " << e._reason);
1115 RTI13Federate::tick()
1117 bool result = _ambassador->tick();
1118 _federateAmbassador->processQueues();
1123 RTI13Federate::tick(const double& minimum, const double& maximum)
1125 bool result = _ambassador->tick(minimum, maximum);
1126 _federateAmbassador->processQueues();
1131 RTI13Federate::createObjectClass(const std::string& objectClassName, HLAObjectClass* hlaObjectClass)
1134 RTI::ObjectClassHandle objectClassHandle;
1135 objectClassHandle = _ambassador->getObjectClassHandle(objectClassName);
1136 if (_federateAmbassador->_objectClassMap.find(objectClassHandle) != _federateAmbassador->_objectClassMap.end()) {
1137 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not create object class, object class already exists!");
1140 RTI13ObjectClass* rtiObjectClass;
1141 rtiObjectClass = new RTI13ObjectClass(hlaObjectClass, objectClassHandle, _ambassador.get());
1142 _federateAmbassador->_objectClassMap[objectClassHandle] = rtiObjectClass;
1143 return rtiObjectClass;
1144 } catch (RTI::NameNotFound& e) {
1145 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: " << e._name << " " << e._reason);
1147 } catch (RTI::FederateNotExecutionMember& e) {
1148 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: " << e._name << " " << e._reason);
1150 } catch (RTI::ConcurrentAccessAttempted& e) {
1151 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: " << e._name << " " << e._reason);
1153 } catch (RTI::RTIinternalError& e) {
1154 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: " << e._name << " " << e._reason);
1159 RTI13ObjectInstance*
1160 RTI13Federate::getObjectInstance(const std::string& objectInstanceName)
1163 RTI::ObjectHandle objectHandle;
1164 objectHandle = _ambassador->getObjectInstanceHandle(objectInstanceName);
1165 FederateAmbassador::ObjectInstanceMap::iterator i = _federateAmbassador->_objectInstanceMap.find(objectHandle);
1166 if (i == _federateAmbassador->_objectInstanceMap.end()) {
1167 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: ObjectInstance not found.");
1171 } catch (RTI::ObjectNotKnown& e) {
1172 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: " << e._name << " " << e._reason);
1174 } catch (RTI::FederateNotExecutionMember& e) {
1175 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: " << e._name << " " << e._reason);
1177 } catch (RTI::ConcurrentAccessAttempted& e) {
1178 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: " << e._name << " " << e._reason);
1180 } catch (RTI::RTIinternalError& e) {
1181 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class: " << e._name << " " << e._reason);
1187 RTI13Federate::insertObjectInstance(RTI13ObjectInstance* objectInstance)
1189 _federateAmbassador->_objectInstanceMap[objectInstance->getHandle()] = objectInstance;