📄 federation.cc
字号:
throw (InteractionClassNotDefined, FederateNotExecutionMember, SaveInProgress, SecurityError, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw InteractionClassNotDefined root->Interactions->publish(federate, interaction, pub); D.Out(pdRequest, "Federation %d: Federate %d has(un)published Interaction %d.", handle, federate, interaction);}// ----------------------------------------------------------------------------// publishObjectvoidFederation::publishObject(FederateHandle federate, ObjectClassHandle object, AttributeHandle *attributes, UShort list_size, bool pub) throw (ObjectClassNotDefined, AttributeNotDefined, FederateNotExecutionMember, SaveInProgress, SecurityError, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw *NotDefined root->ObjectClasses->publish(federate, object, attributes, list_size, pub); D.Out(pdRegister, "Federation %d: Federate %d(un)publishes %d attrib. of ObjClass %d.", handle, federate, list_size, object);}// ----------------------------------------------------------------------------//! Adds a new object instance to federation.ObjectHandleFederation::registerObject(FederateHandle federate, ObjectClassHandle class_handle, const char *object_name) throw (FederateNotExecutionMember, FederateNotPublishing, ObjectAlreadyRegistered, ObjectClassNotDefined, ObjectClassNotPublished, SaveInProgress, RestoreInProgress, RTIinternalError){ ObjectHandle new_id = objectHandles.provide(); D.Out(pdRegister, "Federation %d: Federate %d registering Object %d of Class %d.", handle, federate, new_id, class_handle); // create a name if necessary string strname = "" ; strname += object_name ? string(object_name) : "HLA" + new_id ; // Register Object. root->registerObjectInstance(federate, class_handle, new_id, strname.c_str()); return new_id ;}// ----------------------------------------------------------------------------/** Remove a federate. @param federate_handle Handle of the federate to remove. @bug Currently does not check if Federate owns attributes. The Federate Object is deleted.*/voidFederation::remove(FederateHandle federate_handle) throw (FederateOwnsAttributes, FederateNotExecutionMember){ for (list<Federate *>::iterator i = begin(); i != end(); i++) { if ((*i)->getHandle() == federate_handle) { // BUG: RemoveFederate: Should see if Federate owns attributes federateHandles.free(federate_handle); delete (*i); erase(i); D.Out(pdInit, "Federation %d: Removed Federate %d.", handle, federate_handle); return ; } } D.Out(pdExcept, "Federation %d could not remove unknown federate %d.", handle, federate_handle); throw FederateNotExecutionMember();}// ----------------------------------------------------------------------------//! Set Federate's IsConstrained to false.voidFederation::removeConstrained(FederateHandle federate_handle) throw (FederateNotExecutionMember, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember Federate *federate = getByHandle(federate_handle); if (federate->isConstrained() == false) { D.Out(pdExcept, "Federate %d was not constrained.", federate_handle); throw RTIinternalError("Time constrained not enabled."); } federate->setConstrained(false); D.Out(pdTerm, "Federation %d: Federate %d is not constrained anymore.", handle, federate_handle);}// ----------------------------------------------------------------------------//! Remove the Federate from the Regulators' list.voidFederation::removeRegulator(FederateHandle federate_handle) throw (FederateNotExecutionMember, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember Federate *federate = getByHandle(federate_handle); // It may throw RTIinternalError if Federate was not regulators. regulators.remove(federate_handle); federate->setRegulator(false); D.Out(pdTerm, "Federation %d: Federate %d is not a regulator anymore.", handle, federate_handle); NetworkMessage msg ; msg.type = NetworkMessage::SET_TIME_REGULATING ; msg.exception = e_NO_EXCEPTION ; msg.federation = handle ; msg.federate = federate_handle ; msg.regulator = RTI_FALSE ; msg.date = 0 ; broadcastAnyMessage(&msg, 0);}// ----------------------------------------------------------------------------//! unregisterSynchronization.voidFederation::unregisterSynchronization(FederateHandle federate_handle, const char *label) throw (FederateNotExecutionMember, FederationNotPaused, SaveInProgress, RestoreInProgress, RTIinternalError){ this->check(federate_handle); // It may throw FederateNotExecutionMember. if ((label == NULL) || (strlen(label) > MAX_USER_TAG_LENGTH)) throw RTIinternalError("Bad pause label(null or too long)."); // Set federate synchronized on this label. Federate *federate = getByHandle(federate_handle); federate->removeSynchronizationLabel(label); // Test in every federate is synchronized. Otherwise, quit method. list<Federate *>::iterator j ; for (j = begin(); j != end(); j++) { if ((*j)->isSynchronizationLabel(label) == true) return ; } // All federates from federation has called synchronizationPointAchieved. D.Out(pdTerm, "Federation %d is not Paused anymore.", handle); // Remove label from federation list. std::map<const char *, const char *>::iterator i ; i = synchronizationLabels.begin(); for (; i != synchronizationLabels.end(); i++) { if (!strcmp((*i).first, label)) { // Allocated by strdup(). free(const_cast<char *>((*i).first)); free(const_cast<char *>((*i).second)); synchronizationLabels.erase(i); break ; } } // send a federationSynchronized(). NetworkMessage msg ; msg.type = NetworkMessage::FEDERATION_SYNCHRONIZED ; msg.exception = e_NO_EXCEPTION ; msg.federation = handle ; msg.federate = federate_handle ; msg.setLabel(label); broadcastAnyMessage(&msg, 0); D.Out(pdTerm, "Federation %d is synchronized on %s.", handle, label);}// ----------------------------------------------------------------------------// subscribeInteractionvoidFederation::subscribeInteraction(FederateHandle federate, InteractionClassHandle interaction, bool sub) throw (InteractionClassNotDefined, FederateNotExecutionMember, SaveInProgress, SecurityError, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw *NotDefined root->Interactions->subscribe(federate, interaction, sub); D.Out(pdRegister, "Federation %d: Federate %d(un)subscribes to Interaction %d.", handle, federate, interaction);}// ----------------------------------------------------------------------------// subscribeObjectvoidFederation::subscribeObject(FederateHandle federate, ObjectClassHandle object, AttributeHandle *attributes, UShort list_size, bool sub) throw (ObjectClassNotDefined, AttributeNotDefined, FederateNotExecutionMember, SaveInProgress, SecurityError, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw *NotDefined root->ObjectClasses->subscribe(federate, object, attributes, list_size, sub); D.Out(pdRegister, "Federation %d: Federate %d(un)sub. to %d attrib. of ObjClass %d.", handle, federate, list_size, object);}// ----------------------------------------------------------------------------// updateAttributeValuesvoidFederation::updateAttributeValues(FederateHandle federate, ObjectHandle id, AttributeHandle *attributes, AttributeValue *values, UShort list_size, FederationTime time, const char *tag) throw (FederateNotExecutionMember, ObjectNotKnown, AttributeNotDefined, AttributeNotOwned, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw *NotDefined root->ObjectClasses->updateAttributeValues(federate, id, attributes, values, list_size, time, tag); D.Out(pdRegister, "Federation %d: Federate %d updated attributes of Object %d.", handle, federate, id);}// ----------------------------------------------------------------------------//! Update the current time of a regulator federate.voidFederation::updateRegulator(FederateHandle federate_handle, FederationTime time) throw (FederateNotExecutionMember, RTIinternalError){ // It may throw FederateNotExecutionMember Federate *federate = getByHandle(federate_handle); if (federate->isRegulator() == false) { D.Out(pdExcept, "Federate %d is not a regulator.", federate_handle); throw RTIinternalError("Time regulation not enabled."); } D.Out(pdTerm, "Federation %d: Federate %d's new time is %f.", handle, federate_handle, time); regulators.update(federate_handle, time); NetworkMessage msg ; msg.type = NetworkMessage::MESSAGE_NULL ; msg.exception = e_NO_EXCEPTION ; msg.federation = handle ; msg.federate = federate_handle ; msg.date = time ; broadcastAnyMessage(&msg, federate_handle);}// ----------------------------------------------------------------------------// isOwner (isAttributeOwnedByFederate)boolFederation::isOwner(FederateHandle federate, ObjectHandle id, AttributeHandle attribute) throw (FederateNotExecutionMember, ObjectNotKnown, AttributeNotDefined, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); D.Out(pdDebug, "Owner of Object %u Atrribute %u", id, attribute); // It may throw *NotDefined return root->objects->isAttributeOwnedByFederate(id, attribute, federate);}// ----------------------------------------------------------------------------// queryAttributeOwnershipvoidFederation::queryAttributeOwnership(FederateHandle federate, ObjectHandle id, AttributeHandle attribute) throw (FederateNotExecutionMember, ObjectNotKnown, AttributeNotDefined, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); D.Out(pdDebug, "Owner of Object %u Atrribute %u", id, attribute); // It may throw *NotDefined root->objects->queryAttributeOwnership(id, attribute, federate);}// ----------------------------------------------------------------------------// negotiateDivestiture (negotiatedAttributeOwnershipDivestiture)voidFederation::negotiateDivestiture(FederateHandle federate, ObjectHandle id, AttributeHandle *attribs, UShort list_size, const char *tag) throw (FederateNotExecutionMember, ObjectNotKnown, AttributeNotDefined, AttributeNotOwned, AttributeAlreadyBeingDivested, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw *NotDefined root->ObjectClasses->negotiatedAttributeOwnershipDivestiture(federate, id, attribs, list_size, tag);}// ----------------------------------------------------------------------------// acquireIfAvailable (attributeOwnershipAcquisitionIfAvailable)voidFederation::acquireIfAvailable(FederateHandle federate, ObjectHandle id, AttributeHandle *attribs, UShort list_size) throw (ObjectNotKnown, ObjectClassNotPublished, AttributeNotDefined, AttributeNotPublished, FederateOwnsAttributes, AttributeAlreadyBeingAcquired, FederateNotExecutionMember, SaveInProgress, RestoreInProgress, RTIinternalError){ // It may throw FederateNotExecutionMember. this->check(federate); // It may throw *NotDefined root->ObjectClasses->attributeOwnershipAcquisitionIfAvailable(federate, id, attribs, list_size);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -