This program is a time regulating version of TalkRPR.
It gets an initial time when time regulation is enabled and then advances for about 10 time units. Movement of the entity is not even. It Sends one interaction. Time regulation is turned off when the federate is ready to leave, this will allow time constrained federates to advance at that point. It is possible, and usually desirable to move time forward as the simulation progresses however we choose not to here.
#ifdef DtHLA
#if DtHLA_1516
#if DtHLA_1516_EVOLVED
#include <RTI/time/HLAfloat64Time.h>
#include <RTI/time/HLAfloat64Interval.h>
#else
#include <RTI/logicalTimeImpl.h>
#include <RTI/logicalTimeIntervalImpl.h>
#endif
#else
#include <fedtime.hh>
#endif
int keybrdTick();
#if DtHLA_1516
#else
void timeAdvanceRequestCb(const RTI::FedTime &, void *);
void timeRegulationEnabledCb(const RTI::FedTime &, void *);
#endif
bool GlobalTimeRegOn(false);
bool GlobalTimeMoved(false);
#if DtHLA_1516
#if DtHLA_1516_EVOLVED
HLAfloat64Time GlobalFedTime;
const HLAfloat64Interval LookAhead(2.0);
const HLAfloat64Interval FedTimeAdvance(0.5);
#else
LogicalTimeImpl GlobalFedTime;
const LogicalTimeIntervalImpl LookAhead(2.0);
const LogicalTimeIntervalImpl FedTimeAdvance(0.5);
#endif
#else
RTIfedTime GlobalFedTime;
const RTIfedTime LookAhead(2.0);
const RTIfedTime FedTimeAdvance(0.5);
#endif
int main( int argc, char* argv[] )
{
appInit.setExecName( "MAK-RPR-2.0" );
appInit.setRprFomVersion( 2.0 );
appInit.setRprFomRevision( 1 );
appInit.parseCmdLine();
DtInfo <<
"Time Management examples require attributes in FOM to be set to TimeStamp order." << std::endl;
#if DtHLA_1516
#else
LookAhead);
#endif
while(!GlobalTimeRegOn)
{
}
double refLongitude =
DtDeg2Rad(-121.326577);
DtTopoView topoView(esr, refLatitude, refLongitude);
topoView.setLocation(position);
topoView.setVelocity(velocity);
#if DtHLA_1516
DtTime dt = FedTimeAdvance.getInterval();
#else
DtTime dt = FedTimeAdvance.getTime();
#endif
#if DtHLA_1516
DtTime simTime = GlobalFedTime.getTime() + LookAhead.getInterval() + dt;
#else
DtTime simTime = GlobalFedTime.getTime() + LookAhead.getTime() + dt;
#endif
DtInfo <<
"\nSending Interaction at global Time: "
<< (GlobalFedTime.getTime() +
#if DtHLA_1516
LookAhead.getInterval()
#else
LookAhead.getTime()
#endif
) << "\n\n";
int updateCount = 0;
DtTime lastTime = simTime + 10.0;
while (simTime <= lastTime)
{
if (keybrdTick() == -1)
break;
if (GlobalTimeMoved)
{
GlobalTimeMoved = false;
position[0] += velocity[0] * dt;
position[1] = simTime;
position[2] = updateCount++;
topoView.setLocation(position);
topoView.setVelocity(velocity);
DtInfo <<
" Fed Time:" << GlobalFedTime.getTime()
<< " Sim Time:" << simTime
<< " Pos: %s "
<< topoView.location().string() << '\n'
<< "--------" << std::endl;
simTime += dt;
#if DtHLA_1516
#if DtHLA_1516_EVOLVED
HLAfloat64Time reqTime;
#else
LogicalTimeImpl reqTime;
#endif
reqTime = GlobalFedTime.getTime() + FedTimeAdvance.getInterval();
<< (GlobalFedTime.getTime() + FedTimeAdvance.getInterval())
<< std::endl;
#else
<< (GlobalFedTime.getTime() + FedTimeAdvance.getTime())
<< std::endl;
#endif
}
}
delete f18Type;
delete entityPub;
return 0;
}
int keybrdTick()
{
if (keyPtr && (*keyPtr == 'q' || *keyPtr == 'Q'))
return -1;
else
return 0;
}
void timeAdvanceRequestCb(
#if DtHLA_1516
#else
const RTI::FedTime &aTime,
#endif
void *userData)
{
GlobalFedTime = aTime;
GlobalTimeMoved = true;
DtInfo <<
"Time Advance Grant to: "
<< GlobalFedTime.getTime() << std::endl;
}
void timeRegulationEnabledCb(
#if DtHLA_1516
#else
const RTI::FedTime &aTime,
#endif
void *userData)
{
GlobalFedTime = aTime;
GlobalTimeRegOn = true;
GlobalTimeMoved = true;
DtInfo <<
"\nTime Regulation Enabled at time: "
<< GlobalFedTime.getTime() << "\n\n";
}
#else // !DtHLA
#include <iostream>
int main()
{
std::cout << "Time Management Is only available in HLA" << std::endl;;
return 0;
}
#endif // !DtHLA