The f18 program simulates a simple HLA or DIS vehicle.
By default, that vehicle is n F/A18 flying in a circle, just off the coast of California, USA, but you can control the entity type, location and route.
The f18 generates predictable HLA entity update messages (or DIS entity state PDUs), so it is a useful tool for debugging applications that receive and interpret these messages. It can also fire munitions and react to detonations.
#include <stdlib.h>
#include <iostream>
#ifndef _WIN32
#include <sys/socket.h>
#endif
DtTime timeOutInterval = 12.0;
double translationThreshold = 1.0;
static int keybrdTick( );
#if VXWORKS
#define main realMain
#endif
int main( int argc, char* argv[] )
{
try
{
DtString appName =
"VR-Link F18 " + pidStr;
#if DtDIS
initializer.setDisVersionToSend( 7 );
#else
initializer.setFedFileName( DtDefaultRpr2Fom );
initializer.setExecName( "MAK-RPR-2.0" );
initializer.setRprFomVersion( 2.0 );
initializer.setRprFomRevision( 1 );
#ifdef DtHLA_1516_EVOLVED
initializer.addFomModule("MAK-VRLExt-1_evolved.xml");
#endif
#endif
initializer.parseCmdLine();
initializer.setApplicationNumber( pid );
DtString defaultF18Name( initializer.f18Name() );
defaultF18Name += " " + pidStr;
initializer.setF18Name( defaultF18Name );
#ifdef DtHLA
initializer.setFederateType( "Parallel F18" );
initializer.setFederateName(defaultF18Name);
#endif
#if DtDIS
initializer.setUseAsynchIO(true);
#endif
#ifdef DtHLA
std::cout <<
"[" << clock->
elapsedRealTime() <<
", 0] Initializing" << std::endl;
exConn->setExecutionStatus(vrlstatus_initializing);
#endif
DtTime frameTime = initializer.deltaTime();
#ifdef DtHLA
exConn->setExecutionStatus(vrlstatus_initialized);
std::cout <<
"[" << clock->
elapsedRealTime() <<
", 0] Initialized" << std::endl;
#endif
int forever = 1;
double outputInterval = initializer.outputInterval();
#ifdef DtHLA
std::cout <<
"[" << clock->
elapsedRealTime() <<
", 0] Executing" << std::endl;
exConn->setExecutionStatus(vrlstatus_executing);
#endif
unsigned long frameCount = 1;
double totalDrainDuration = 0.0;
double totalSimDuration = 0.0;
double totalPubDuration = 0.0;
double totalIdle = 0.0;
double totalFrameDuration = 0.0;
int numberFrameOverflows = 0;
double totalOverflow = 0.0;
std::cout << std::fixed;
while( forever )
{
dt = startTime - lastTime;
totalDrainDuration += drainDuration;
if ( keybrdTick( ) == 0 ) break;
totalSimDuration += simDuration;
totalPubDuration += pubDuration;
totalFrameDuration += frameDuration;
if (frameDuration < frameTime)
{
idle = frameTime - frameDuration;
totalIdle += idle;
dt = frameTime;
}
else
{
dt = frameDuration;
idle = -1.0;
numberFrameOverflows++;
totalOverflow += frameDuration - frameTime;
}
if (outputInterval <= 0.0 || outputTime < startTime)
{
std::cout <<
"[" << std::setprecision(2) << simulator.
simTime() <<
", " << frameCount <<
"] #entities: " << simulator.
numberRemoteEntities()
<< " total=" << std::setprecision(6) << frameDuration << "(" << totalFrameDuration / frameCount << ")"
<< " idle=" << idle << "(" << totalIdle/frameCount << ")"
<< " drain=" << drainDuration << "(" << totalDrainDuration / frameCount << ")"
<< " sim=" << simDuration << "(" << totalSimDuration / frameCount << ")"
<< " pub=" << pubDuration << "(" << totalPubDuration / frameCount << ")"
<< " #FO=" << numberFrameOverflows << "(" << (numberFrameOverflows > 0 ? totalOverflow/numberFrameOverflows : 0) << ")"
<< std::endl;
numberFrameOverflows = 0;
totalOverflow = 0.0;
}
if (idle > 0.0)
{
}
lastTime = startTime;
frameCount++;
}
}
return 0;
}
int keybrdTick( )
{
if ( !keyPtr ) return 1;
switch( *keyPtr )
{
case 'q':
case 'Q':
return 0;
default:
std::cout << "Unrecognized command key " << *keyPtr << std::endl;
break;
}
return 1;
}