X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_io.cxx;h=36ca64433d3f6dc923acdfcdaa59374ea88856d7;hb=f467ba360902e4395d23b35481c55844a3946b91;hp=e3514841ec1dadc7f138c5748778f9b731527537;hpb=d82ce71d28eaffe5857eb7a3890ba2b001e7c8b5;p=flightgear.git diff --git a/src/Main/fg_io.cxx b/src/Main/fg_io.cxx index e3514841e..36ca64433 100644 --- a/src/Main/fg_io.cxx +++ b/src/Main/fg_io.cxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started November 1999. // -// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -16,16 +16,19 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include -#include // atoi() +#include // atoi() -#include STL_STRING +#include #include #include @@ -38,14 +41,17 @@ #include #include -#include +#include #include +#include +#include #include #include #ifdef FG_JPEG_SERVER # include #endif #include +#include #include #include #include @@ -57,23 +63,21 @@ #include #include #include - -#ifdef FG_MPLAYER_AS #include -#endif #include "globals.hxx" #include "fg_io.hxx" -SG_USING_STD(string); +using std::atoi; +using std::string; FGIO::FGIO() { } -#include STL_ALGORITHM -SG_USING_STD(for_each); +#include +using std::for_each; static void delete_ptr( FGProtocol* p ) { delete p; } @@ -105,15 +109,23 @@ FGIO::parse_port_config( const string& config ) try { - if ( protocol == "atc610x" ) { - FGATC610x *atc610x = new FGATC610x; - atc610x->set_hz( 30 ); - if ( tokens.size() > 1 ) { - if ( tokens[1] == "no-rudder" ) { - atc610x->set_use_rudder( false ); - } + if ( protocol == "atcsim" ) { + FGATCMain *atcsim = new FGATCMain; + atcsim->set_hz( 30 ); + if ( tokens.size() != 6 ) { + SG_LOG( SG_IO, SG_ALERT, "Usage: --atcsim=[no-]pedals," + << "input0_config,input1_config," + << "output0_config,output1_config,file.nas" ); + delete atcsim; + return NULL; } - return atc610x; + if ( tokens[1] == "no-pedals" ) { + fgSetBool( "/input/atcsim/ignore-pedal-controls", true ); + } else { + fgSetBool( "/input/atcsim/ignore-pedal-controls", false ); + } + atcsim->set_path_names(tokens[2], tokens[3], tokens[4], tokens[5]); + return atcsim; } else if ( protocol == "atlas" ) { FGAtlas *atlas = new FGAtlas; io = atlas; @@ -122,6 +134,12 @@ FGIO::parse_port_config( const string& config ) // printf("Parsed opengc\n"); cin >> wait; FGOpenGC *opengc = new FGOpenGC; io = opengc; + } else if ( protocol == "AV400" ) { + FGAV400 *av400 = new FGAV400; + io = av400; + } else if ( protocol == "AV400Sim" ) { + FGAV400Sim *av400sim = new FGAV400Sim; + io = av400sim; } else if ( protocol == "garmin" ) { FGGarmin *garmin = new FGGarmin; io = garmin; @@ -138,6 +156,9 @@ FGIO::parse_port_config( const string& config ) } else if ( protocol == "joyclient" ) { FGJoyClient *joyclient = new FGJoyClient; io = joyclient; + } else if ( protocol == "jsclient" ) { + FGJsClient *jsclient = new FGJsClient; + io = jsclient; } else if ( protocol == "native" ) { FGNative *native = new FGNative; io = native; @@ -166,19 +187,33 @@ FGIO::parse_port_config( const string& config ) FGRUL *rul = new FGRUL; io = rul; } else if ( protocol == "generic" ) { - FGGeneric *generic = new FGGeneric( tokens[6] ); - io = generic; + size_t configToken; + if (tokens[1] == "socket") { + configToken = 7; + } else if (tokens[1] == "file") { + configToken = 5; + } else { + configToken = 6; + } -#ifdef FG_MPLAYER_AS - } else if ( protocol == "multiplay" ) {\ - //Determine dir, rate, host & port + if (configToken >= tokens.size()) { + SG_LOG( SG_IO, SG_ALERT, "Not enough tokens passed for the generic protocol."); + return NULL; + } + + FGGeneric *generic = new FGGeneric( tokens ); + io = generic; + } else if ( protocol == "multiplay" ) { + if ( tokens.size() != 5 ) { + SG_LOG( SG_IO, SG_ALERT, "Ignoring invalid --multiplay option " + "(4 arguments expected: --multiplay=dir,hz,hostname,port)" ); + return NULL; + } string dir = tokens[1]; string rate = tokens[2]; string host = tokens[3]; string port = tokens[4]; return new FGMultiplay(dir, atoi(rate.c_str()), host, atoi(port.c_str())); -#endif - } else { return NULL; } @@ -189,7 +224,11 @@ FGIO::parse_port_config( const string& config ) delete io; return 0; } - + + if (tokens.size() < 3) { + SG_LOG( SG_IO, SG_ALERT, "Incompatible number of network arguments."); + return NULL; + } string medium = tokens[1]; SG_LOG( SG_IO, SG_INFO, " medium = " << medium ); @@ -203,6 +242,10 @@ FGIO::parse_port_config( const string& config ) SG_LOG( SG_IO, SG_INFO, " hertz = " << hertz ); if ( medium == "serial" ) { + if ( tokens.size() < 5) { + SG_LOG( SG_IO, SG_ALERT, "Incompatible number of arguments for serial communications."); + return NULL; + } // device name string device = tokens[4]; SG_LOG( SG_IO, SG_INFO, " device = " << device ); @@ -211,17 +254,37 @@ FGIO::parse_port_config( const string& config ) string baud = tokens[5]; SG_LOG( SG_IO, SG_INFO, " baud = " << baud ); + SGSerial *ch = new SGSerial( device, baud ); io->set_io_channel( ch ); } else if ( medium == "file" ) { // file name + if ( tokens.size() < 4) { + SG_LOG( SG_IO, SG_ALERT, "Incompatible number of arguments for file I/O."); + return NULL; + } + string file = tokens[4]; SG_LOG( SG_IO, SG_INFO, " file name = " << file ); - - SGFile *ch = new SGFile( file ); + int repeat = 1; + if (tokens.size() >= 7 && tokens[6] == "repeat") { + if (tokens.size() >= 8) { + repeat = atoi(tokens[7].c_str()); + FGGeneric* generic = dynamic_cast(io); + if (generic) + generic->setExitOnError(true); + } else { + repeat = -1; + } + } + SGFile *ch = new SGFile( file, repeat ); io->set_io_channel( ch ); } else if ( medium == "socket" ) { - string hostname = tokens[4]; + if ( tokens.size() < 6) { + SG_LOG( SG_IO, SG_ALERT, "Incompatible number of arguments for socket communications."); + return NULL; + } + string hostname = tokens[4]; string port = tokens[5]; string style = tokens[6]; @@ -271,6 +334,11 @@ FGIO::init() } } +void +FGIO::reinit() +{ +} + // process any IO channel work void @@ -306,7 +374,7 @@ void FGIO::shutdown_all() { FGProtocol *p; - // cout << "processing I/O channels" << endl; + // cout << "shutting down all I/O channels" << endl; typedef vector< FGProtocol* > container; container::iterator i = io_channels.begin();