Added Network/opengc.cxx Network/opengc.hxx Network/opengc_data.hxx
This is John Wojnaroski's initial implimentation of an interface to the OpenGC glass cockpit displays.
This commit is contained in:
parent
e1ac99d5c9
commit
a69e2cc976
6 changed files with 291 additions and 0 deletions
|
@ -44,6 +44,7 @@
|
||||||
#include <Network/native.hxx>
|
#include <Network/native.hxx>
|
||||||
#include <Network/native_ctrls.hxx>
|
#include <Network/native_ctrls.hxx>
|
||||||
#include <Network/native_fdm.hxx>
|
#include <Network/native_fdm.hxx>
|
||||||
|
#include <Network/opengc.hxx>
|
||||||
#include <Network/nmea.hxx>
|
#include <Network/nmea.hxx>
|
||||||
#include <Network/props.hxx>
|
#include <Network/props.hxx>
|
||||||
#include <Network/pve.hxx>
|
#include <Network/pve.hxx>
|
||||||
|
@ -84,6 +85,11 @@ static FGProtocol *parse_port_config( const string& config )
|
||||||
if ( protocol == "atlas" ) {
|
if ( protocol == "atlas" ) {
|
||||||
FGAtlas *atlas = new FGAtlas;
|
FGAtlas *atlas = new FGAtlas;
|
||||||
io = atlas;
|
io = atlas;
|
||||||
|
} else if ( protocol == "opengc" ) {
|
||||||
|
// char wait;
|
||||||
|
// printf("Parsed opengc\n"); cin >> wait;
|
||||||
|
FGOpenGC *opengc = new FGOpenGC;
|
||||||
|
io = opengc;
|
||||||
} else if ( protocol == "garmin" ) {
|
} else if ( protocol == "garmin" ) {
|
||||||
FGGarmin *garmin = new FGGarmin;
|
FGGarmin *garmin = new FGGarmin;
|
||||||
io = garmin;
|
io = garmin;
|
||||||
|
|
|
@ -798,6 +798,10 @@ parse_option (const string& arg)
|
||||||
add_channel( "native_ctrls", arg.substr(15) );
|
add_channel( "native_ctrls", arg.substr(15) );
|
||||||
} else if ( arg.find( "--native-fdm=" ) == 0 ) {
|
} else if ( arg.find( "--native-fdm=" ) == 0 ) {
|
||||||
add_channel( "native_fdm", arg.substr(13) );
|
add_channel( "native_fdm", arg.substr(13) );
|
||||||
|
} else if ( arg.find( "--opengc=" ) == 0 ) {
|
||||||
|
// char stop;
|
||||||
|
// cout << "Adding channel for OpenGC Display" << endl; cin >> stop;
|
||||||
|
add_channel( "opengc", arg.substr(10) );
|
||||||
} else if ( arg.find( "--garmin=" ) == 0 ) {
|
} else if ( arg.find( "--garmin=" ) == 0 ) {
|
||||||
add_channel( "garmin", arg.substr(9) );
|
add_channel( "garmin", arg.substr(9) );
|
||||||
} else if ( arg.find( "--nmea=" ) == 0 ) {
|
} else if ( arg.find( "--nmea=" ) == 0 ) {
|
||||||
|
|
|
@ -10,6 +10,7 @@ libNetwork_a_SOURCES = \
|
||||||
native_ctrls.cxx native_ctrls.hxx \
|
native_ctrls.cxx native_ctrls.hxx \
|
||||||
native_fdm.cxx native_fdm.hxx \
|
native_fdm.cxx native_fdm.hxx \
|
||||||
nmea.cxx nmea.hxx \
|
nmea.cxx nmea.hxx \
|
||||||
|
opengc.cxx opengc.hxx opengc_data.hxx \
|
||||||
props.cxx props.hxx \
|
props.cxx props.hxx \
|
||||||
pve.cxx pve.hxx \
|
pve.cxx pve.hxx \
|
||||||
raw_ctrls.hxx raw_fdm.hxx \
|
raw_ctrls.hxx raw_fdm.hxx \
|
||||||
|
|
152
src/Network/opengc.cxx
Normal file
152
src/Network/opengc.cxx
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
// opengc.cxx --
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
#include <simgear/io/iochannel.hxx>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "opengc.hxx"
|
||||||
|
#include <FDM/flight.hxx>
|
||||||
|
#include <Main/globals.hxx>
|
||||||
|
#include <Cockpit/radiostack.hxx>
|
||||||
|
|
||||||
|
SG_USING_STD(vector);
|
||||||
|
|
||||||
|
FGOpenGC::FGOpenGC() {
|
||||||
|
}
|
||||||
|
|
||||||
|
FGOpenGC::~FGOpenGC() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// open hailing frequencies
|
||||||
|
bool FGOpenGC::open() {
|
||||||
|
if ( is_enabled() ) {
|
||||||
|
SG_LOG( SG_IO, SG_ALERT, "This shouldn't happen, but the channel "
|
||||||
|
<< "is already in use, ignoring" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SGIOChannel *io = get_io_channel();
|
||||||
|
|
||||||
|
if ( ! io->open( get_direction() ) ) {
|
||||||
|
SG_LOG( SG_IO, SG_ALERT, "Error opening channel communication layer." );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_enabled( true );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void collect_data( const FGInterface *fdm, ogcFGData *data ) {
|
||||||
|
//static void collect_data( ogcFGData *data ) {
|
||||||
|
|
||||||
|
FGEngInterface *p_engine[4]; // four is enough unless you're a BUF
|
||||||
|
|
||||||
|
p_engine[0] = cur_fdm_state->get_engine(0);
|
||||||
|
|
||||||
|
data->latitude = fdm->get_Longitude_deg();
|
||||||
|
data->longitude = cur_fdm_state->get_Latitude_deg();
|
||||||
|
|
||||||
|
data->pitch = cur_fdm_state->get_Theta_deg();
|
||||||
|
data->bank = cur_fdm_state->get_Phi_deg();
|
||||||
|
data->heading = cur_fdm_state->get_Psi_deg();
|
||||||
|
data->altitude = cur_fdm_state->get_Altitude();
|
||||||
|
data->v_kcas = cur_fdm_state->get_V_calibrated_kts();
|
||||||
|
data->vvi = cur_fdm_state->get_Climb_Rate();
|
||||||
|
|
||||||
|
data->magvar = globals->get_mag()->get_magvar();
|
||||||
|
|
||||||
|
// engine data, for now set the 2nd engine equal to the first
|
||||||
|
|
||||||
|
data->rpm[0] = p_engine[0]->get_RPM();
|
||||||
|
data->rpm[1] = p_engine[0]->get_RPM();
|
||||||
|
|
||||||
|
data->epr[0] = p_engine[0]->get_Manifold_Pressure();
|
||||||
|
data->epr[1] = p_engine[0]->get_Manifold_Pressure();
|
||||||
|
|
||||||
|
data->egt[0] = p_engine[0]->get_EGT();
|
||||||
|
data->egt[1] = p_engine[0]->get_EGT();
|
||||||
|
|
||||||
|
data->oil_pressure[0] = p_engine[0]->get_Oil_Pressure();
|
||||||
|
data->oil_pressure[1] = p_engine[0]->get_Oil_Pressure();
|
||||||
|
|
||||||
|
|
||||||
|
// navigation data
|
||||||
|
// Once OPenGC develops a comparable navaids database some of this will not be required
|
||||||
|
|
||||||
|
//data->nav1_ident = current_radiostack->get_nav1_ident();
|
||||||
|
data->nav1_freq = current_radiostack->get_nav1_freq();
|
||||||
|
data->nav1_radial = current_radiostack->get_nav1_sel_radial();
|
||||||
|
data->nav1_course_dev = current_radiostack->get_nav1_heading_needle_deflection();
|
||||||
|
|
||||||
|
//data->nav1_ident = current_radiostack->get_nav1_ident();
|
||||||
|
data->nav2_freq = current_radiostack->get_nav2_freq();
|
||||||
|
data->nav2_radial = current_radiostack->get_nav2_sel_radial();
|
||||||
|
data->nav2_course_dev = current_radiostack->get_nav2_heading_needle_deflection();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void distribute_data( const ogcFGData *data, FGInterface *chunk ) {
|
||||||
|
// just a place holder until the CDU is developed
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// process work for this port
|
||||||
|
bool FGOpenGC::process() {
|
||||||
|
SGIOChannel *io = get_io_channel();
|
||||||
|
int length = sizeof(buf);
|
||||||
|
|
||||||
|
if ( get_direction() == SG_IO_OUT ) {
|
||||||
|
collect_data( cur_fdm_state, &buf );
|
||||||
|
//collect_data( &buf );
|
||||||
|
if ( ! io->write( (char *)(& buf), length ) ) {
|
||||||
|
SG_LOG( SG_IO, SG_ALERT, "Error writing data." );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if ( get_direction() == SG_IO_IN ) {
|
||||||
|
if ( io->get_type() == sgFileType ) {
|
||||||
|
if ( io->read( (char *)(& buf), length ) == length ) {
|
||||||
|
SG_LOG( SG_IO, SG_DEBUG, "Success reading data." );
|
||||||
|
distribute_data( &buf, cur_fdm_state );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while ( io->read( (char *)(& buf), length ) == length ) {
|
||||||
|
SG_LOG( SG_IO, SG_DEBUG, "Success reading data." );
|
||||||
|
distribute_data( &buf, cur_fdm_state );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// close the channel
|
||||||
|
bool FGOpenGC::close() {
|
||||||
|
SGIOChannel *io = get_io_channel();
|
||||||
|
|
||||||
|
set_enabled( false );
|
||||||
|
|
||||||
|
if ( ! io->close() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
55
src/Network/opengc.hxx
Normal file
55
src/Network/opengc.hxx
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
// opengc.hxx --
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _FG_OPENGC_HXX
|
||||||
|
#define _FG_OPENGC_HXX
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include STL_STRING
|
||||||
|
|
||||||
|
#include <FDM/flight.hxx>
|
||||||
|
|
||||||
|
#include "protocol.hxx"
|
||||||
|
#include "opengc_data.hxx"
|
||||||
|
|
||||||
|
class FGOpenGC : public FGProtocol, public FGInterface, public FGEngInterface {
|
||||||
|
|
||||||
|
ogcFGData buf;
|
||||||
|
int length;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
FGOpenGC();
|
||||||
|
~FGOpenGC();
|
||||||
|
|
||||||
|
// open hailing frequencies
|
||||||
|
bool open();
|
||||||
|
|
||||||
|
// process work for this port
|
||||||
|
bool process();
|
||||||
|
|
||||||
|
// close the channel
|
||||||
|
bool close();
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _FG_OPENGC_HXX
|
||||||
|
|
||||||
|
|
73
src/Network/opengc_data.hxx
Normal file
73
src/Network/opengc_data.hxx
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
// opengc.hxx -- define shared flight model parameters
|
||||||
|
//
|
||||||
|
// Version 1.0 by J. Wojnaroski for interface to Open Glass Displays
|
||||||
|
// Date: Nov 18,2001
|
||||||
|
|
||||||
|
// 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
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef _OPENGC_HXX
|
||||||
|
#define _OPENGC_HXX
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
# error This library requires C++
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class ogcFGData {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// flight parameters
|
||||||
|
|
||||||
|
double pitch;
|
||||||
|
double bank;
|
||||||
|
double heading;
|
||||||
|
double altitude;
|
||||||
|
double altitude_agl;
|
||||||
|
double v_kcas;
|
||||||
|
double groundspeed;
|
||||||
|
double vvi;
|
||||||
|
|
||||||
|
// position
|
||||||
|
|
||||||
|
double latitude;
|
||||||
|
double longitude;
|
||||||
|
double magvar;
|
||||||
|
|
||||||
|
// engine data
|
||||||
|
|
||||||
|
double rpm[4];
|
||||||
|
double epr[4];
|
||||||
|
double egt[4];
|
||||||
|
double fuel_flow[4];
|
||||||
|
double oil_pressure[4];
|
||||||
|
|
||||||
|
// navigation data
|
||||||
|
|
||||||
|
double nav1_freq;
|
||||||
|
double nav1_radial;
|
||||||
|
double nav1_course_dev;
|
||||||
|
|
||||||
|
double nav2_freq;
|
||||||
|
double nav2_radial;
|
||||||
|
double nav2_course_dev;
|
||||||
|
|
||||||
|
// some other locations to add stuff in
|
||||||
|
double d_ogcdata[16];
|
||||||
|
float f_ogcdata[16];
|
||||||
|
int i_ogcdata[16];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _OPENGC_HXX
|
Loading…
Reference in a new issue