#include <Network/AV400WSim.hxx>
#include <Network/garmin.hxx>
#include <Network/httpd.hxx>
+#include <Network/igc.hxx>
#ifdef FG_JPEG_SERVER
# include <Network/jpg-httpd.hxx>
#endif
#include <Network/ray.hxx>
#include <Network/rul.hxx>
#include <Network/generic.hxx>
-#include <Network/HTTPClient.hxx>
-#ifdef FG_HAVE_HLA
+#if FG_HAVE_HLA
#include <Network/HLA/hla.hxx>
#endif
}
-
-
-
FGIO::~FGIO()
{
if (tokens.empty())
{
SG_LOG( SG_IO, SG_ALERT,
- "Port configuration error: empty config string" );
- return 0;
+ "Port configuration error: empty config string" );
+ return NULL;
}
string protocol = tokens[0];
SG_LOG( SG_IO, SG_INFO, " protocol = " << protocol );
- FGProtocol *io = 0;
+ FGProtocol *io = NULL;
try
{
FGAtlas *atlas = new FGAtlas;
io = atlas;
} else if ( protocol == "opengc" ) {
- // char wait;
- // printf("Parsed opengc\n"); cin >> wait;
FGOpenGC *opengc = new FGOpenGC;
io = opengc;
} else if ( protocol == "AV400" ) {
} else if ( protocol == "garmin" ) {
FGGarmin *garmin = new FGGarmin;
io = garmin;
+ } else if ( protocol == "igc" ) {
+ IGCProtocol *igc = new IGCProtocol;
+ io = igc;
} else if ( protocol == "httpd" ) {
// determine port
string port = tokens[1];
short port = atoi(tokens[4].c_str());
// multiplay used to be handled by an FGProtocol, but no longer. This code
- // retains compatability with existing command-line syntax
+ // retains compatibility with existing command-line syntax
fgSetInt("/sim/multiplay/tx-rate-hz", rate);
if (dir == "in") {
fgSetInt("/sim/multiplay/rxport", port);
}
return NULL;
-#ifdef FG_HAVE_HLA
- } else if ( protocol == "hla" ) {
+ }
+#if FG_HAVE_HLA
+ else if ( protocol == "hla" ) {
+ return new FGHLA(tokens);
+ }
+ else if ( protocol == "hla-local" ) {
+ // This is just about to bring up some defaults
+ if (tokens.size() != 2) {
+ SG_LOG( SG_IO, SG_ALERT, "Ignoring invalid --hla-local option "
+ "(one argument expected: --hla-local=<federationname>" );
+ return NULL;
+ }
+ tokens.insert(tokens.begin(), "");
+ tokens.insert(tokens.begin(), "60");
+ tokens.insert(tokens.begin(), "bi");
+ tokens.push_back("fg-local.xml");
return new FGHLA(tokens);
}
#endif
- } else {
+ else {
return NULL;
}
}
{
SG_LOG( SG_IO, SG_ALERT, "Port configuration error: " << err.what() );
delete io;
- return 0;
+ return NULL;
}
if (tokens.size() < 3) {
SG_LOG( SG_IO, SG_ALERT, "Incompatible number of network arguments.");
+ delete io;
return NULL;
}
string medium = tokens[1];
if ( medium == "serial" ) {
if ( tokens.size() < 5) {
SG_LOG( SG_IO, SG_ALERT, "Incompatible number of arguments for serial communications.");
+ delete io;
return NULL;
}
// device name
if ( protocol == "AV400WSimB" ) {
if ( tokens.size() < 7 ) {
SG_LOG( SG_IO, SG_ALERT, "Missing second hz for AV400WSimB.");
+ delete io;
return NULL;
}
FGAV400WSimB *fgavb = static_cast<FGAV400WSimB*>(io);
// file name
if ( tokens.size() < 4) {
SG_LOG( SG_IO, SG_ALERT, "Incompatible number of arguments for file I/O.");
+ delete io;
return NULL;
}
} else if ( medium == "socket" ) {
if ( tokens.size() < 6) {
SG_LOG( SG_IO, SG_ALERT, "Incompatible number of arguments for socket communications.");
+ delete io;
return NULL;
}
string hostname = tokens[4];
_realDeltaTime = fgGetNode("/sim/time/delta-realtime-sec");
- FGProtocol *p;
-
// we could almost do this in a single step except pushing a valid
// port onto the port list copies the structure and destroys the
// original, which closes the port and frees up the fd ... doh!!!
- // parse the configuration strings and store the results in the
- // appropriate FGIOChannel structures
string_list::iterator i = globals->get_channel_options_list()->begin();
string_list::iterator end = globals->get_channel_options_list()->end();
for (; i != end; ++i ) {
- p = parse_port_config( *i );
- if (!p) {
- continue;
- }
+ add_channel( *i );
+ } // of channel options iteration
+}
- p->open();
- if ( !p->is_enabled() ) {
- SG_LOG( SG_IO, SG_ALERT, "I/O Channel config failed." );
- delete p;
- continue;
- }
+// add another I/O channel
+void FGIO::add_channel(const string& config)
+{
+ // parse the configuration string and store the results in the
+ // appropriate FGIOChannel structure
+ FGProtocol *p = parse_port_config( config );
+ if (!p)
+ {
+ return;
+ }
- io_channels.push_back( p );
- } // of channel options iteration
+ p->open();
+ if ( !p->is_enabled() ) {
+ SG_LOG( SG_IO, SG_ALERT, "I/O Channel config failed." );
+ delete p;
+ return;
+ }
+
+ io_channels.push_back( p );
}
void
void
FGIO::update( double /* delta_time_sec */ )
{
- if (FGHTTPClient::haveInstance()) {
- FGHTTPClient::instance()->update();
- }
-
// use wall-clock, not simulation, delta time, so that network
// protocols update when the simulation is paused
// see http://code.google.com/p/flightgear-bugs/issues/detail?id=125
void
FGIO::shutdown()
{
- FGProtocol *p;
-
ProtocolVec::iterator i = io_channels.begin();
ProtocolVec::iterator end = io_channels.end();
for (; i != end; ++i )
{
- p = *i;
+ FGProtocol *p = *i;
if ( p->is_enabled() ) {
p->close();
}
FGIO::unbind()
{
}
-