// Sync1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int main(int argc, char *argv[])
{
char *federateName="Sync1";
RTI::RTIambassador rtiamb;
Simul8ManagerFederateAmbassador fedamb;
fedamb.federateName =federateName;
rtiamb.createFederationExecution("WitnessRTI", "WitnessRTI.fed");
cout << "Simul8RTI." << federateName << ": federation created successfully" << endl;
rtiamb.joinFederationExecution(federateName, "WitnessRTI", &fedamb);
cout << "Simul8RTI." << federateName << ": federation joined successfully" << endl;
Simul8ManagerFederateAmbassador::hFederate = rtiamb.getObjectClassHandle("ObjectRoot.Manager.Federate");
Simul8ManagerFederateAmbassador::hFederateHandle = rtiamb.getAttributeHandle("FederateHandle", Simul8ManagerFederateAmbassador::hFederate);
// .. create an attribute-handle set
RTI::AttributeHandleSet *ahset = NULL;
ahset=RTI::AttributeHandleSetFactory::create(1);
// .. populate the set with the attributes we publish/subscribe
ahset->add(Simul8ManagerFederateAmbassador::hFederateHandle);
// .. perform the appropriate DM calls
rtiamb.subscribeObjectClassAttributes(Simul8ManagerFederateAmbassador::hFederate, *ahset);
cout << "Simul8RTI." << federateName << ": subscribed object class Federate" << endl;
// enable time constraint
rtiamb.enableTimeConstrained();
while (!fedamb.mConstraintEnabled)
{
rtiamb.tick(0.01, 0.5);
}
cout << "Simul8RTI." << federateName << ": time constraint enabled @ " << fedamb.mCurrentTime << endl;
// enble time regulation at the current time and lookahead
RTIfedTime mTime;
rtiamb.queryLookahead(mTime);
rtiamb.enableTimeRegulation((RTIfedTime)fedamb.mCurrentTime, mTime);
while (!fedamb.mRegulationEnabled)
{
rtiamb.tick(0.01, 0.5);
}
cout << "Simul8RTI." << federateName << ": time regulation enabled @ " << fedamb.mCurrentTime << endl;
// enable asynchronous delivery of receive-ordered events
rtiamb.enableAsynchronousDelivery();
cout << "Simul8RTI." << federateName << ": asynchronous delivery enabled" << endl;
rtiamb.registerFederationSynchronizationPoint("Ready", "");
while (!fedamb.isAnnounced)
{
rtiamb.tick(0.01, 0.5);
}
fedamb.isAnnounced = false;
rtiamb.registerFederationSynchronizationPoint("End", "");
while (!fedamb.isAnnounced)
{
rtiamb.tick(0.01, 0.5);
}
// inform RTI that synchronization point has been achieved
rtiamb.synchronizationPointAchieved("Ready");
fedamb.isAnnounced = false;
while (!fedamb.isAnnounced)
{
rtiamb.tick(0.01, 0.5);
}
cout << "Joined Federates : " << fedamb.totalFederatesJoined << endl;
getch();
cout << "Joined Federates : " << fedamb.totalFederatesJoined << endl;
getch();
rtiamb.resignFederationExecution(RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES);
cout << "Simul8RTI." << federateName << ": resigned from federation" << endl;
rtiamb.destroyFederationExecution("WitnessRTI");
cout << "Simul8RTI." << federateName << ": destroyed federation execution" << endl;
getch();
return 0;
}
and the federate code is below
// Sync2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int main(int argc, char *argv[])
{
char *federateName="Sync2";
RTI::ObjectClassHandle hFederate;
RTI::AttributeHandle hFederateHandle;
RTI::RTIambassador rtiamb;
Simul8FederateAmbassador fedamb;
rtiamb.joinFederationExecution(federateName, "WitnessRTI", &fedamb);
cout << "Simul8RTI." << federateName << ": federation joined successfully" << endl;
// hFederate = rtiamb.getObjectClassHandle("ObjectRoot.Manager.Federate");
// hFederateHandle = rtiamb.getAttributeHandle("FederateHandle", hFederate);
// .. create an attribute-handle set
// RTI::AttributeHandleSet *ahset = NULL;
// ahset=RTI::AttributeHandleSetFactory::create(1);
// .. populate the set with the attributes we publish/subscribe
// ahset->add(hFederateHandle);
// .. perform the appropriate DM calls
// rtiamb.publishObjectClass(hFederate, *ahset);
// cout << "Simul8RTI." << federateName << ": published object class Federate" << endl;
// enable time constraint
rtiamb.enableTimeConstrained();
while (!fedamb.mConstraintEnabled)
{
rtiamb.tick(0.01, 0.5);
}
cout << "Simul8RTI." << federateName << ": time constraint enabled @ " << fedamb.mCurrentTime << endl;
// enble time regulation at the current time and lookahead
RTIfedTime mTime;
rtiamb.queryLookahead(mTime);
rtiamb.enableTimeRegulation((RTIfedTime)fedamb.mCurrentTime, mTime);
while (!fedamb.mRegulationEnabled)
{
rtiamb.tick(0.01, 0.5);
}
cout << "Simul8RTI." << federateName << ": time regulation enabled @ " << fedamb.mCurrentTime << endl;
// enable asynchronous delivery of receive-ordered events
rtiamb.enableAsynchronousDelivery();
cout << "Simul8RTI." << federateName << ": asynchronous delivery enabled" << endl;
// inform RTI that synchronization point has been achieved HERE I GOT INTERNAL ERROR
rtiamb.synchronizationPointAchieved("Ready");
cout << "Simul8RTI." << federateName << ": waiting for FEDERATION SYNCHRONIZATION @ synchronizationPointLabel --> Ready" << endl;
while (!fedamb.mFederationSynchronizationReadyAchieved)
{
rtiamb.tick(0.01, 0.5);
}
getch();
rtiamb.resignFederationExecution(RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES);
cout << "Simul8RTI." << federateName << ": resigned from federation" << endl;
rtiamb.destroyFederationExecution("WitnessRTI");
cout << "Simul8RTI." << federateName << ": destroyed federation execution" << endl;
getch();
return 0;
}