]> git.mxchange.org Git - flightgear.git/commitdiff
Added Network/opengc.cxx Network/opengc.hxx Network/opengc_data.hxx
authorcurt <curt>
Fri, 30 Nov 2001 23:56:28 +0000 (23:56 +0000)
committercurt <curt>
Fri, 30 Nov 2001 23:56:28 +0000 (23:56 +0000)
This is John Wojnaroski's initial implimentation of an interface to the
OpenGC glass cockpit displays.

src/Main/fg_io.cxx
src/Main/options.cxx
src/Network/Makefile.am
src/Network/opengc.cxx [new file with mode: 0644]
src/Network/opengc.hxx [new file with mode: 0644]
src/Network/opengc_data.hxx [new file with mode: 0644]

index 8df8a559a87663585fac7fbe31bc051f0156348f..ba1ce3681c8f57f23144606bbc0c9b1e29bb4893 100644 (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;
index 3ede60f65d27b9ec7aff288597b63b0f45176723..ee3cf67636aee1a12dc18fcecc481bfd66bba809 100644 (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 ) {
index 361da9c30c93b96b033050b47afdfb7ba4cd14e1..5a65aa5fd0fa1331990cd7231dbada1b73f3e576 100644 (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 \
diff --git a/src/Network/opengc.cxx b/src/Network/opengc.cxx
new file mode 100644 (file)
index 0000000..c2524b4
--- /dev/null
@@ -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;
+}
diff --git a/src/Network/opengc.hxx b/src/Network/opengc.hxx
new file mode 100644 (file)
index 0000000..33266cc
--- /dev/null
@@ -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
+
+
diff --git a/src/Network/opengc_data.hxx b/src/Network/opengc_data.hxx
new file mode 100644 (file)
index 0000000..f057139
--- /dev/null
@@ -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