The main application:
#if DtDIS
#include <vl/disPduFactory.h>
#include <lgrDisMessageIoInfo.h>
#include <lgrDisPlaybackFile.h>
#include <lgrDisFileFormats.h>
#endif
#if DtHLA
#include <vl/exerciseConn.h>
#include <vl/hExConnInit.h>
#include <vl/hInterFactory.h>
#include <hlaMessageFactory.h>
#include <hlaMessageIOInfo.h>
#include <hlaPacket.h>
#include <vl/hInteraction.h>
#include <lgrHlaPlaybackFile.h>
#include <onlineFomDesc.h>
#include <lgrHlaFileFormats.h>
#include <hlaMessageState.h>
#endif
#include <lgrVersion.h>
#include <absoluteTime.h>
#include <loggerFileReader.h>
#include <iostream>
#include <cmdLine/cmdLine.h>
using namespace MAKLogger;
#if DtDIS
void readPacket( const DtPacket* packet)
{
static DtDisPduFactory factory;
if(packet->type() == static_cast<int>(DtPacket::Type_Pdu))
{
DtPdu* Pdu = factory.createPdu (
reinterpret_cast<const DtNetPacket*>(packet->data()),
reinterpret_cast<DtBufferPtr>(const_cast<char*>(packet->data())));
Pdu->print();
delete Pdu;
}
}
DtLoggerFileReader* openFileForReading( const DtString& filename )
{
DtLgrDisPlaybackFile* file(0);
DtLgrDisMessageIOInfo* ioInfo(0);
try
{
file = new DtLgrDisPlaybackFile(filename);
ioInfo = DtLgrDisMessageIOInfo::create(DtMessageIOInfo::File,5);
return new DtLoggerFileReader(ioInfo,file);
}
catch(DtException& ex)
{
DtString output = DtSerializeException(ex);
DtInfo << output << std::endl;
return 0;
}
}
#endif
#if DtHLA
DtExerciseConn* theExerciseConn;
DtInteractionFactory* theInteractionFactory;
DtLgrOnlineFomDesc* theOnlineFom;
DtBaseFomDesc* theFileFom;
DtLgrHlaMessageState* theMessageState;
void readPacket( const DtPacket* packet)
{
DtConstLgrHlaMessage hlaMessage(packet);
if(hlaMessage.isInteraction())
{
DtInteraction* inter = hlaMessage.createInteraction(
theInteractionFactory,
*theOnlineFom);
inter->print();
}
}
DtLoggerFileReader* openFileForReading( const DtString& filename )
{
try
{
DtLgrHlaPlaybackFile* file = DtLgrHlaPlaybackFile::create(filename);
DtLgrHlaMessageIOInfo* ioInfo = DtLgrHlaMessageIOInfo::create(
DtMessageIOInfo::File,DtBaseFomDesc::copy(*file->fom()));
return new DtLoggerFileReader(ioInfo,file);
}
catch(DtException& ex)
{
DtString output = DtSerializeException(ex);
DtInfo << output << std::endl;
return 0;
}
}
#endif
int readFile(int argc,char** argv)
{
DtCmdLine::CmdLine cmdLine("readFile","Example of how to read a logger file.",LOGGER_VERSION_STRING);
DtCmdLine::UnlabeledValueArg<DtString> filenameArg("Filename","The name of the logger file to read.","","string");
cmdLine.add(&filenameArg);
cmdLine.parse(argc,argv);
#if DtHLA
DtExerciseConnInitializer exConnInit;
#if DtHLA
#if DtHLA_1516_EVOLVED
exConnInit.setFedFileName("vr-link_evolved.xml");
#elif DtHLA_1516
exConnInit.setFedFileName("vr-link.xml");
#else
exConnInit.setFedFileName("vr-link.fed");
#endif
#endif
theExerciseConn = new DtExerciseConn(exConnInit);
theInteractionFactory = theExerciseConn->interactionFactory();
theOnlineFom = DtLgrOnlineFomDesc::create(theExerciseConn);
DtLgrHlaFileFormats::registerFormats();
#else
DtLgrDisFileFormats::registerFormats();
#endif
DtString filename(filenameArg.getValue());
DtLoggerFileReader* reader = openFileForReading(filename);
if(!reader)
{
DtInfo << "Unable to open file: " << filename << " for reading." << std::endl;
return 1;
}
else
{
DtInfo << "Opened file: " << filename << " for reading." << std::endl;
}
#if DtHLA
theMessageState = new DtLgrHlaMessageState();
theMessageState->setInputInfo(reader->info());
theMessageState->setOutputInfo(DtLgrHlaMessageIOInfo::create(
DtMessageIOInfo::Network,theOnlineFom));
#endif
DtMessageBuffer buffer;
DtAbsoluteTime lastTime = reader->lastMessageTime();
reader->startReadMessages(lastTime);
while(reader->lastReadTime() != lastTime)
{
reader->getNextMessages(buffer);
if(buffer.size() == 0) break;
#if DtHLA
theMessageState->modifyMessages(buffer);
#endif
DtMessageBuffer::PacketList::iterator packetIterator;
for(packetIterator = buffer.begin(); packetIterator != buffer.end();++packetIterator)
{
DtPacket* packet = *packetIterator;
static int packetCount = 0;
DtInfo <<
"***********************************************" << std::endl <<
"* Packet #" << ++packetCount << " Type = " << packet->type() <<
" at Time = " << packet->time().toString(2) << std::endl;
readPacket(packet);
}
buffer.clear();
}
delete reader;
return 0;
}
int main(int argc,char** argv)
{
return readFile(argc,argv);
}