1
0
Fork 0
flightgear/src/Main/fg_io.cxx

440 lines
12 KiB
C++
Raw Normal View History

1999-11-19 02:10:24 +00:00
// fg_io.cxx -- higher level I/O channel management routines
//
// Written by Curtis Olson, started November 1999.
//
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
1999-11-19 02:10:24 +00:00
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
2006-02-21 01:16:04 +00:00
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1999-11-19 02:10:24 +00:00
//
// $Id$
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
1999-11-19 02:10:24 +00:00
2000-02-15 03:30:01 +00:00
#include <simgear/compiler.h>
1999-11-19 02:10:24 +00:00
#include <cstdlib> // atoi()
#include <string>
#include <algorithm>
1999-11-19 02:10:24 +00:00
2000-02-16 23:01:03 +00:00
#include <simgear/debug/logstream.hxx>
#include <simgear/io/iochannel.hxx>
#include <simgear/io/sg_file.hxx>
#include <simgear/io/sg_serial.hxx>
#include <simgear/io/sg_socket.hxx>
2001-11-12 16:06:29 +00:00
#include <simgear/io/sg_socket_udp.hxx>
#include <simgear/math/sg_types.hxx>
#include <simgear/timing/timestamp.hxx>
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
#include <simgear/misc/strutils.hxx>
2000-02-15 03:30:01 +00:00
1999-11-19 02:10:24 +00:00
#include <Network/protocol.hxx>
#include <Network/ATC-Main.hxx>
#include <Network/atlas.hxx>
#include <Network/AV400.hxx>
#include <Network/AV400Sim.hxx>
#include <Network/AV400WSim.hxx>
1999-11-19 02:10:24 +00:00
#include <Network/garmin.hxx>
#include <Network/httpd.hxx>
#ifdef FG_JPEG_SERVER
# include <Network/jpg-httpd.hxx>
#endif
#include <Network/joyclient.hxx>
#include <Network/jsclient.hxx>
#include <Network/native.hxx>
#include <Network/native_ctrls.hxx>
#include <Network/native_fdm.hxx>
#include <Network/native_gui.hxx>
#include <Network/opengc.hxx>
1999-11-19 02:10:24 +00:00
#include <Network/nmea.hxx>
2000-09-27 20:16:22 +00:00
#include <Network/props.hxx>
#include <Network/pve.hxx>
#include <Network/ray.hxx>
#include <Network/rul.hxx>
#include <Network/generic.hxx>
#ifdef FG_HAVE_HLA
#include <Network/HLA/hla.hxx>
#endif
#include "globals.hxx"
#include "fg_io.hxx"
using std::atoi;
using std::string;
1999-11-19 02:10:24 +00:00
FGIO::FGIO()
{
}
FGIO::~FGIO()
{
}
1999-11-19 02:10:24 +00:00
// configure a port based on the config string
FGProtocol*
FGIO::parse_port_config( const string& config )
1999-11-19 02:10:24 +00:00
{
2001-03-24 06:03:11 +00:00
SG_LOG( SG_IO, SG_INFO, "Parse I/O channel request: " << config );
1999-11-19 02:10:24 +00:00
string_list tokens = simgear::strutils::split( config, "," );
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
if (tokens.empty())
{
SG_LOG( SG_IO, SG_ALERT,
"Port configuration error: empty config string" );
return 0;
1999-11-19 02:10:24 +00:00
}
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
string protocol = tokens[0];
2001-03-24 06:03:11 +00:00
SG_LOG( SG_IO, SG_INFO, " protocol = " << protocol );
1999-11-19 02:10:24 +00:00
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
FGProtocol *io = 0;
try
{
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" );
2006-09-30 05:17:45 +00:00
delete atcsim;
return NULL;
2003-04-02 14:56:21 +00:00
}
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;
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
} else if ( protocol == "atlas" ) {
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" ) {
FGAV400 *av400 = new FGAV400;
io = av400;
} else if ( protocol == "AV400Sim" ) {
FGAV400Sim *av400sim = new FGAV400Sim;
io = av400sim;
} else if ( protocol == "AV400WSimA" ) {
FGAV400WSimA *av400wsima = new FGAV400WSimA;
io = av400wsima;
} else if ( protocol == "AV400WSimB" ) {
FGAV400WSimB *av400wsimb = new FGAV400WSimB;
io = av400wsimb;
} else if ( protocol == "garmin" ) {
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
FGGarmin *garmin = new FGGarmin;
io = garmin;
} else if ( protocol == "httpd" ) {
// determine port
string port = tokens[1];
return new FGHttpd( atoi(port.c_str()) );
#ifdef FG_JPEG_SERVER
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
} else if ( protocol == "jpg-httpd" ) {
// determine port
string port = tokens[1];
return new FGJpegHttpd( atoi(port.c_str()) );
#endif
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
} else if ( protocol == "joyclient" ) {
FGJoyClient *joyclient = new FGJoyClient;
io = joyclient;
} else if ( protocol == "jsclient" ) {
FGJsClient *jsclient = new FGJsClient;
io = jsclient;
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
} else if ( protocol == "native" ) {
FGNative *native = new FGNative;
io = native;
} else if ( protocol == "native-ctrls" ) {
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
FGNativeCtrls *native_ctrls = new FGNativeCtrls;
io = native_ctrls;
} else if ( protocol == "native-fdm" ) {
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
FGNativeFDM *native_fdm = new FGNativeFDM;
io = native_fdm;
} else if ( protocol == "native-gui" ) {
FGNativeGUI *net_gui = new FGNativeGUI;
io = net_gui;
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
} else if ( protocol == "nmea" ) {
FGNMEA *nmea = new FGNMEA;
io = nmea;
} else if ( protocol == "props" || protocol == "telnet" ) {
io = new FGProps( tokens );
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
return io;
} else if ( protocol == "pve" ) {
FGPVE *pve = new FGPVE;
io = pve;
} else if ( protocol == "ray" ) {
FGRAY *ray = new FGRAY;
io = ray;
} else if ( protocol == "rul" ) {
FGRUL *rul = new FGRUL;
io = rul;
} else if ( protocol == "generic" ) {
2009-08-24 16:03:49 +00:00
size_t configToken;
2009-06-19 11:27:44 +00:00
if (tokens[1] == "socket") {
configToken = 7;
2009-06-19 11:27:44 +00:00
} else if (tokens[1] == "file") {
configToken = 5;
2009-06-19 11:27:44 +00:00
} else {
configToken = 6;
}
2009-06-19 11:27:44 +00:00
if (configToken >= tokens.size()) {
SG_LOG( SG_IO, SG_ALERT, "Not enough tokens passed for the generic protocol.");
return NULL;
}
2009-06-19 11:27:44 +00:00
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];
int rate = atoi(tokens[2].c_str());
string host = tokens[3];
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
fgSetInt("/sim/multiplay/tx-rate-hz", rate);
if (dir == "in") {
fgSetInt("/sim/multiplay/rxport", port);
fgSetString("/sim/multiplay/rxhost", host.c_str());
} else if (dir == "out") {
fgSetInt("/sim/multiplay/txport", port);
fgSetString("/sim/multiplay/txhost", host.c_str());
}
return NULL;
#ifdef FG_HAVE_HLA
} else if ( protocol == "hla" ) {
return new FGHLA(tokens);
#endif
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
} else {
return NULL;
}
}
catch (FGProtocolConfigError& err)
{
SG_LOG( SG_IO, SG_ALERT, "Port configuration error: " << err.what() );
delete io;
return 0;
1999-11-19 02:10:24 +00:00
}
if (tokens.size() < 3) {
SG_LOG( SG_IO, SG_ALERT, "Incompatible number of network arguments.");
return NULL;
}
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
string medium = tokens[1];
SG_LOG( SG_IO, SG_INFO, " medium = " << medium );
string direction = tokens[2];
io->set_direction( direction );
SG_LOG( SG_IO, SG_INFO, " direction = " << direction );
string hertz_str = tokens[3];
double hertz = atof( hertz_str.c_str() );
io->set_hz( hertz );
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;
}
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
// device name
string device = tokens[4];
SG_LOG( SG_IO, SG_INFO, " device = " << device );
// baud
string baud = tokens[5];
SG_LOG( SG_IO, SG_INFO, " baud = " << baud );
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
SGSerial *ch = new SGSerial( device, baud );
io->set_io_channel( ch );
if ( protocol == "AV400WSimB" ) {
if ( tokens.size() < 7 ) {
SG_LOG( SG_IO, SG_ALERT, "Missing second hz for AV400WSimB.");
return NULL;
}
FGAV400WSimB *fgavb = static_cast<FGAV400WSimB*>(io);
string hz2_str = tokens[6];
double hz2 = atof(hz2_str.c_str());
fgavb->set_hz2(hz2);
}
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
} 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;
}
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
string file = tokens[4];
SG_LOG( SG_IO, SG_INFO, " file name = " << 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<FGGeneric*>(io);
if (generic)
generic->setExitOnError(true);
} else {
repeat = -1;
}
}
SGFile *ch = new SGFile( file, repeat );
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
io->set_io_channel( ch );
} else if ( medium == "socket" ) {
if ( tokens.size() < 6) {
SG_LOG( SG_IO, SG_ALERT, "Incompatible number of arguments for socket communications.");
return NULL;
}
string hostname = tokens[4];
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
string port = tokens[5];
string style = tokens[6];
SG_LOG( SG_IO, SG_INFO, " hostname = " << hostname );
SG_LOG( SG_IO, SG_INFO, " port = " << port );
SG_LOG( SG_IO, SG_INFO, " style = " << style );
Bernie Bright: Here is the new super improved telnet property interface. CVS changelog is at the end of this message. Once this new telnet code is in and compiles every where we can remove Network/props.[ch]xx. I've added a --telnet=<port> command line option to invoke the new server. Later on we could remove the --props option, or least change it to invoke the new server. I'll let you decide. I've added some new commands to the telnet interface: view next Select the next view. view prev Select the previous view. view set <n> Select view 'n' view get Return index of current view I'm not sure if these same effects could be achieved through property operations. The commands provide a convenient shortcut in any case. I'm also planning on adding a panel command to manipulate panels and objects contained therein (eg simulated mouse clicks). There is going to be some commonality with the command objects so we may need to rationalize this in the near future. Finally, I've also included my python stuff. This is still very much a work in progress, basically I've been using it to test the new telnet server. I have tested it with python 2.2. Feel free to add it to the repository if you want. I would suggest a scripts/python directory CVS Changelog Network/telnet.cxx: New property telnet protocol interface. It supports the same user interface provided by the --props server. Additionally it handles multiple simultaneous connections. Added "view" command to manipulate viewmgr. Network/protocol.hxx: Added protocol configuration exception. Main/fg_io.cxx: Added new "telnet" protocol. Added protocol configuration parse exceptions. Simplified protocol configuration parsing. Main/options.cxx: Added --telnet=<port> command line option and help message.
2002-05-15 21:44:34 +00:00
io->set_io_channel( new SGSocket( hostname, port, style ) );
1999-11-19 02:10:24 +00:00
}
return io;
}
// step through the port config streams (from fgOPTIONS) and setup
// serial port channels for each
void
FGIO::init()
{
// SG_LOG( SG_IO, SG_INFO, "I/O Channel initialization, " <<
// globals->get_channel_options_list()->size() << " requests." );
2010-11-24 20:57:56 +00:00
_realDeltaTime = fgGetNode("/sim/time/delta-realtime-sec");
1999-11-19 02:10:24 +00:00
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;
}
p->open();
if ( !p->is_enabled() ) {
SG_LOG( SG_IO, SG_ALERT, "I/O Channel config failed." );
delete p;
continue;
}
io_channels.push_back( p );
} // of channel options iteration
1999-11-19 02:10:24 +00:00
}
void
FGIO::reinit()
{
}
// process any IO channel work
void
2010-11-24 20:57:56 +00:00
FGIO::update( double /* delta_time_sec */ )
{
2010-11-24 20:57:56 +00:00
// 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
double delta_time_sec = _realDeltaTime->getDoubleValue();
1999-11-19 02:10:24 +00:00
ProtocolVec::iterator i = io_channels.begin();
ProtocolVec::iterator end = io_channels.end();
for (; i != end; ++i ) {
2010-11-24 20:57:56 +00:00
FGProtocol* p = *i;
if (!p->is_enabled()) {
continue;
}
p->dec_count_down( delta_time_sec );
double dt = 1 / p->get_hz();
if ( p->get_count_down() < 0.33 * dt ) {
p->process();
p->inc_count();
while ( p->get_count_down() < 0.33 * dt ) {
2010-11-24 20:57:56 +00:00
p->inc_count_down( dt );
}
2010-11-24 20:57:56 +00:00
} // of channel processing
} // of io_channels iteration
1999-11-19 02:10:24 +00:00
}
void
FGIO::shutdown()
{
FGProtocol *p;
ProtocolVec::iterator i = io_channels.begin();
ProtocolVec::iterator end = io_channels.end();
for (; i != end; ++i )
{
p = *i;
if ( p->is_enabled() ) {
p->close();
}
delete p;
}
io_channels.clear();
}
void
FGIO::bind()
{
}
void
FGIO::unbind()
{
}