MAK Data Logger API Documentation for DIS
readFile Example

The main application:

/*******************************************************************************
** Copyright (c) 1992-2010 VT MAK
** All rights reserved.
*******************************************************************************/
#if DtDIS
#include <vl/disPduFactory.h>
#endif
#if DtHLA
#include <vl/exerciseConn.h>
#include <vl/hExConnInit.h>
#include <vl/hInterFactory.h>
#include <hlaPacket.h>
#include <vl/hInteraction.h>
#include <onlineFomDesc.h>
#include <vlutil/vlRtiMismatchException.h>
#endif
#include <lgrVersion.h>
#include <absoluteTime.h>
#include <iostream>
#include <cmdLine/cmdLine.h>
using namespace MAKLogger;
// Function foe checking if any keys in the array are pressed.
bool keyCheck(const char* keysToCheck)
{
if(DtKbHit())
{
int c = DtGetCh();
return strchr(keysToCheck,c) != 0;
}
return false;
}
#if DtDIS
void readPacket( const DtPacket* packet)
{
//Necessary factory object.
static DtDisPduFactory factory;
// Check to see if packet is a PDU.
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 )
{
// Ok lets open the file for playback.
try
{
file = new DtLgrDisPlaybackFile(filename);
// Necessary information (not really needed here but for completeness)
ioInfo = DtLgrDisMessageIOInfo::create(DtMessageIOInfo::File,5);
// Now construct a reader object to read the packets from the file.
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 )
{
// Now opening the file for playback.
try
{
DtLgrHlaPlaybackFile* file = DtLgrHlaPlaybackFile::create(filename);
// Necessary information.
DtLgrHlaMessageIOInfo* ioInfo = DtLgrHlaMessageIOInfo::create(
DtMessageIOInfo::File,DtBaseFomDesc::copy(*file->fom()));
// Now construct a reader object to read the packets from the file.
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
// DIS initialization
#else
// HLA initialization
DtExerciseConnInitializer exConnInit;
#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
try
{
theExerciseConn = new DtExerciseConn(exConnInit);
}
catch( DtVlRtiMismatchException )
{
DtFatal << "Mismatching RTI compiler Version. Please reconfigure your environment" << std::endl;
return -1;
}
theInteractionFactory = theExerciseConn->interactionFactory();
theOnlineFom = DtLgrOnlineFomDesc::create(theExerciseConn);
DtLgrHlaFileFormats::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;
}
//HLA hook up state for handle mapping.
#if DtHLA
theMessageState = new DtLgrHlaMessageState();
theMessageState->setInputInfo(reader->info());
theMessageState->setOutputInfo(DtLgrHlaMessageIOInfo::create(
DtMessageIOInfo::Network,theOnlineFom));
#endif
//Buffer to store the messages
// Get the time of the last message in the file.
DtAbsoluteTime lastTime = reader->lastMessageTime();
// Tell the reader to read all messages up to and including the last time.
reader->startReadMessages(lastTime);
// Read until the end of the tape and the buffer is empty.
// The second case is required for all messages with the timestamp
// as the last time.
bool quit = false;
while(!quit && reader->lastReadTime() != lastTime)
{
// Break out if q or enter was pressed.
if (keyCheck("q\r"))
{
quit = true;
break;
}
//Read a set of packets into the buffer
//The number read is determined by the internal buffer size of the reader.
reader->getNextMessages(buffer);
// If no more messages break out.
if(buffer.size() == 0) break;
#if DtHLA
// This is an important and necessary step to convert an offline hla packet
// to an online packet. This is required for using VR-Link to create
// interactions and such
theMessageState->modifyMessages(buffer);
#endif
//Iterate through all packets in the buffer.
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);
// Break out if q or enter was pressed.
if (keyCheck("q\r"))
{
quit = true;
break;
}
}
buffer.clear();
}
delete reader;
#if DtHLA
DtDELETE(theExerciseConn);
#endif
return 0;
}
// The application entry point
int main(int argc,char** argv)
{
return readFile(argc,argv);
}

Document ID: Generated on Thu Apr 11 12:13:00 EDT 2013 from SVN revision 126011
Copyright © 2005-2012 VT MÄK. All Rights Reserved (www.mak.com)