1
0
Fork 0

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:
curt 2001-11-30 23:56:28 +00:00
parent e1ac99d5c9
commit a69e2cc976
6 changed files with 291 additions and 0 deletions

View file

@ -44,6 +44,7 @@
#include <Network/native.hxx>
#include <Network/native_ctrls.hxx>
#include <Network/native_fdm.hxx>
#include <Network/opengc.hxx>
#include <Network/nmea.hxx>
#include <Network/props.hxx>
#include <Network/pve.hxx>
@ -84,6 +85,11 @@ static FGProtocol *parse_port_config( const string& config )
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 == "garmin" ) {
FGGarmin *garmin = new FGGarmin;
io = garmin;

View file

@ -798,6 +798,10 @@ parse_option (const string& arg)
add_channel( "native_ctrls", arg.substr(15) );
} else if ( arg.find( "--native-fdm=" ) == 0 ) {
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 ) {
add_channel( "garmin", arg.substr(9) );
} else if ( arg.find( "--nmea=" ) == 0 ) {

View file

@ -10,6 +10,7 @@ libNetwork_a_SOURCES = \
native_ctrls.cxx native_ctrls.hxx \
native_fdm.cxx native_fdm.hxx \
nmea.cxx nmea.hxx \
opengc.cxx opengc.hxx opengc_data.hxx \
props.cxx props.hxx \
pve.cxx pve.hxx \
raw_ctrls.hxx raw_fdm.hxx \

152
src/Network/opengc.cxx Normal file
View 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
View 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

View 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