]> git.mxchange.org Git - flightgear.git/commitdiff
Added a "mini fdm" output. This could (for example) be useful for an
authorcurt <curt>
Sun, 12 Jan 2003 23:28:21 +0000 (23:28 +0000)
committercurt <curt>
Sun, 12 Jan 2003 23:28:21 +0000 (23:28 +0000)
external gui if it wanted to monitor some key sim position/orientation
varialbles without saturating the net with the full slate of fdm data
@60hz.

src/Network/Makefile.am
src/Network/native_ctrls.hxx
src/Network/native_fdm.cxx
src/Network/native_fdm_mini.cxx [new file with mode: 0644]
src/Network/native_fdm_mini.hxx [new file with mode: 0644]
src/Network/net_fdm_mini.hxx [new file with mode: 0644]

index a1306b5cde5918465ba0a51b5cd4359d94dcdc5a..d9a2eed61eb57ef47186e49108fa672c012cd454 100644 (file)
@@ -17,7 +17,8 @@ libNetwork_a_SOURCES = \
        native.cxx native.hxx \
        native_ctrls.cxx native_ctrls.hxx \
        native_fdm.cxx native_fdm.hxx \
-       net_ctrls.hxx net_fdm.hxx \
+       native_fdm_mini.cxx native_fdm_mini.hxx \
+       net_ctrls.hxx net_fdm.hxx net_fdm_mini.hxx \
         nmea.cxx nmea.hxx \
         opengc.cxx opengc.hxx opengc_data.hxx \
        props.cxx props.hxx \
index 9b1b7ba2773d99047c333435fd7b0a2dd4a6eb9c..e903e3b03122a12017adb9f142d15379ccfaa916 100644 (file)
@@ -68,6 +68,7 @@ void FGProps2NetCtrls( FGNetCtrls *net );
 // Update the property tree from the FGNetCtrls structure.
 void FGNetCtrls2Props( FGNetCtrls *net );
 
+
 #endif // _FG_NATIVE_CTRLS_HXX
 
 
index a43c7f22a30abeda2b7d216026c4c5f299a6b64a..eb2a9a5ca9a1ccd692b6342e748a8b2764c2e432 100644 (file)
@@ -367,11 +367,12 @@ void FGNetFDM2Props( FGNetFDM *net ) {
         last_warp = net->warp;
        */
     } else {
-       SG_LOG( SG_IO, SG_ALERT, "Error: version mismatch in net2global()" );
+       SG_LOG( SG_IO, SG_ALERT,
+                "Error: version mismatch in FGNetFDM2Props()" );
        SG_LOG( SG_IO, SG_ALERT,
                "\tread " << net->version << " need " << FG_NET_FDM_VERSION );
        SG_LOG( SG_IO, SG_ALERT,
-               "\tsomeone needs to upgrade net_fdm.hxx and recompile." );
+               "\tNeeds to upgrade net_fdm.hxx and recompile." );
     }
 }
 
diff --git a/src/Network/native_fdm_mini.cxx b/src/Network/native_fdm_mini.cxx
new file mode 100644 (file)
index 0000000..3375df8
--- /dev/null
@@ -0,0 +1,244 @@
+// native_fdm.cxx -- FGFS "Native" flight dynamics protocal class
+//
+// Written by Curtis Olson, started September 2001.
+//
+// Copyright (C) 2001  Curtis L. Olson - curt@flightgear.org
+//
+// 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.
+//
+// $Id$
+
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <simgear/debug/logstream.hxx>
+#include <simgear/io/lowlevel.hxx> // endian tests
+#include <simgear/io/iochannel.hxx>
+#include <simgear/timing/sg_time.hxx>
+
+#include <FDM/flight.hxx>
+#include <Time/tmp.hxx>
+#include <Main/fg_props.hxx>
+#include <Main/globals.hxx>
+
+#include "native_fdm_mini.hxx"
+
+// FreeBSD works better with this included last ... (?)
+#if defined(WIN32) && !defined(__CYGWIN__)
+#  include <windows.h>
+#else
+#  include <netinet/in.h>      // htonl() ntohl()
+#endif
+
+
+// The function htond is defined this way due to the way some
+// processors and OSes treat floating point values.  Some will raise
+// an exception whenever a "bad" floating point value is loaded into a
+// floating point register.  Solaris is notorious for this, but then
+// so is LynxOS on the PowerPC.  By translating the data in place,
+// there is no need to load a FP register with the "corruped" floating
+// point value.  By doing the BIG_ENDIAN test, I can optimize the
+// routine for big-endian processors so it can be as efficient as
+// possible
+static void htond (double &x)  
+{
+    if ( sgIsLittleEndian() ) {
+        int    *Double_Overlay;
+        int     Holding_Buffer;
+    
+        Double_Overlay = (int *) &x;
+        Holding_Buffer = Double_Overlay [0];
+    
+        Double_Overlay [0] = htonl (Double_Overlay [1]);
+        Double_Overlay [1] = htonl (Holding_Buffer);
+    } else {
+        return;
+    }
+}
+
+
+FGNativeFDMmini::FGNativeFDMmini() {
+}
+
+FGNativeFDMmini::~FGNativeFDMmini() {
+}
+
+
+// open hailing frequencies
+bool FGNativeFDMmini::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 );
+
+    cur_fdm_state->_set_Sea_level_radius( SG_EQUATORIAL_RADIUS_FT );
+    return true;
+}
+
+
+void FGProps2NetFDMmini( FGNetFDMmini *net ) {
+    int i;
+
+    // Version sanity checking
+    net->version = FG_NET_FDM_MINI_VERSION;
+
+    // Aero parameters
+    net->longitude = cur_fdm_state->get_Longitude();
+    net->latitude = cur_fdm_state->get_Latitude();
+    net->altitude = cur_fdm_state->get_Altitude() * SG_FEET_TO_METER;
+    net->phi = cur_fdm_state->get_Phi();
+    net->theta = cur_fdm_state->get_Theta();
+    net->psi = cur_fdm_state->get_Psi();
+
+    // Consumables
+    net->num_tanks = FGNetFDMmini::FG_MAX_TANKS;
+    for ( i = 0; i < net->num_tanks; ++i ) {
+        SGPropertyNode *node = fgGetNode("/consumables/fuel/tank", i, true);
+        net->fuel_quantity[i] = node->getDoubleValue("level-gal_us");
+    }
+
+    // the following really aren't used in this context
+    net->cur_time = globals->get_time_params()->get_cur_time();
+    net->warp = globals->get_warp();
+
+    // Convert the net buffer to network format
+    net->version = htonl(net->version);
+
+    htond(net->longitude);
+    htond(net->latitude);
+    htond(net->altitude);
+    htond(net->phi);
+    htond(net->theta);
+    htond(net->psi);
+
+    for ( i = 0; i < net->num_tanks; ++i ) {
+        htond(net->fuel_quantity[i]);
+    }
+    net->num_tanks = htonl(net->num_tanks);
+
+    net->cur_time = htonl( net->cur_time );
+    net->warp = htonl( net->warp );
+}
+
+
+void FGNetFDMmini2Props( FGNetFDMmini *net ) {
+    int i;
+
+    // Convert to the net buffer from network format
+    net->version = ntohl(net->version);
+
+    htond(net->longitude);
+    htond(net->latitude);
+    htond(net->altitude);
+    htond(net->phi);
+    htond(net->theta);
+    htond(net->psi);
+
+    net->num_tanks = htonl(net->num_tanks);
+    for ( i = 0; i < net->num_tanks; ++i ) {
+       htond(net->fuel_quantity[i]);
+    }
+
+    net->cur_time = ntohl(net->cur_time);
+    net->warp = ntohl(net->warp);
+
+    if ( net->version == FG_NET_FDM_MINI_VERSION ) {
+        // cout << "pos = " << net->longitude << " " << net->latitude << endl;
+        // cout << "sea level rad = " << cur_fdm_state->get_Sea_level_radius()
+       //      << endl;
+        cur_fdm_state->_updateGeodeticPosition( net->latitude,
+                                                net->longitude,
+                                                net->altitude
+                                                  * SG_METER_TO_FEET );
+        cur_fdm_state->_set_Euler_Angles( net->phi,
+                                          net->theta,
+                                          net->psi );
+
+       for (i = 0; i < net->num_tanks; ++i ) {
+           SGPropertyNode * node
+               = fgGetNode("/consumables/fuel/tank", i, true);
+           node->setDoubleValue("level-gal_us", net->fuel_quantity[i] );
+       }
+
+       if ( net->cur_time ) {
+           fgSetLong("/sim/time/cur-time-override", net->cur_time);
+       }
+
+        globals->set_warp( net->warp );
+    } else {
+       SG_LOG( SG_IO, SG_ALERT,
+                "Error: version mismatch in FGNetFDMmini2Props()" );
+       SG_LOG( SG_IO, SG_ALERT,
+               "\tread " << net->version << " need " << FG_NET_FDM_MINI_VERSION );
+       SG_LOG( SG_IO, SG_ALERT,
+               "\tNeed to upgrade net_fdm.hxx and recompile." );
+    }
+}
+
+
+// process work for this port
+bool FGNativeFDMmini::process() {
+    SGIOChannel *io = get_io_channel();
+    int length = sizeof(buf);
+
+    if ( get_direction() == SG_IO_OUT ) {
+       // cout << "size of cur_fdm_state = " << length << endl;
+       FGProps2NetFDMmini( &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." );
+               FGNetFDMmini2Props( &buf );
+           }
+       } else {
+           while ( io->read( (char *)(& buf), length ) == length ) {
+               SG_LOG( SG_IO, SG_DEBUG, "Success reading data." );
+               FGNetFDMmini2Props( &buf );
+           }
+       }
+    }
+
+    return true;
+}
+
+
+// close the channel
+bool FGNativeFDMmini::close() {
+    SGIOChannel *io = get_io_channel();
+
+    set_enabled( false );
+
+    if ( ! io->close() ) {
+       return false;
+    }
+
+    return true;
+}
diff --git a/src/Network/native_fdm_mini.hxx b/src/Network/native_fdm_mini.hxx
new file mode 100644 (file)
index 0000000..a95c172
--- /dev/null
@@ -0,0 +1,68 @@
+// native_fdm_mini.hxx -- FGFS "Mini-Native" flight dynamics protocal class
+//
+// Written by Curtis Olson, started January 2002.
+//
+// Copyright (C) 2002  Curtis L. Olson - curt@flightgear.org
+//
+// 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.
+//
+// $Id$
+
+
+#ifndef _FG_NATIVE_FDM_MINI_HXX
+#define _FG_NATIVE_FDM_MINI_HXX
+
+
+#include <simgear/compiler.h>
+
+#include <FDM/flight.hxx>
+
+#include "protocol.hxx"
+#include "net_fdm_mini.hxx"
+
+
+class FGNativeFDMmini : public FGProtocol, public FGInterface {
+
+    FGNetFDMmini buf;
+    int length;
+
+public:
+
+    FGNativeFDMmini();
+    ~FGNativeFDMmini();
+
+    // open hailing frequencies
+    bool open();
+
+    // process work for this port
+    bool process();
+
+    // close the channel
+    bool close();
+};
+
+
+// Helper functions which may be useful outside this class
+
+// Populate the FGNetFDMmini structure from the property tree.
+void FGProps2NetFDMmini( FGNetFDMmini *net );
+
+// Update the property tree from the FGNetFDMmini structure.
+void FGNetFDMmini2Props( FGNetFDMmini *net );
+
+
+#endif // _FG_NATIVE_FDM_MINI_HXX
+
+
diff --git a/src/Network/net_fdm_mini.hxx b/src/Network/net_fdm_mini.hxx
new file mode 100644 (file)
index 0000000..1f3e1fb
--- /dev/null
@@ -0,0 +1,75 @@
+// net_fdm_mini.hxx -- defines a simple subset I/O interface to the flight
+//                     dynamics model variables
+//
+// Written by Curtis Olson, started January 2002.
+//
+// Copyright (C) 2002  Curtis L. Olson  - curt@flightgear.com
+//
+// 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.
+//
+// $Id$
+
+
+#ifndef _NET_FDM_MINI_HXX
+#define _NET_FDM_MINI_HXX
+
+
+#ifndef __cplusplus                                                          
+# error This library requires C++
+#endif                                   
+
+
+const int FG_NET_FDM_MINI_VERSION = 1;
+
+
+// Define a structure containing the top level flight dynamics model
+// parameters
+
+class FGNetFDMmini {
+
+public:
+
+    enum {
+        FG_MAX_ENGINES = 4,
+        FG_MAX_WHEELS = 3,
+        FG_MAX_TANKS = 4
+    };
+
+    int version;               // increment when data values change
+    int pad;                    // keep doubles 64-bit aligned for some
+                                // hardware platforms, such as the Sun
+                                // SPARC, which don't like misaligned
+                                // data
+
+    // Positions
+    double longitude;          // geodetic (radians)
+    double latitude;           // geodetic (radians)
+    double altitude;           // above sea level (meters)
+    double agl;                        // above ground level (meters)
+    double phi;                        // roll (radians)
+    double theta;              // pitch (radians)
+    double psi;                        // yaw or true heading (radians)
+
+    // Consumables
+    int num_tanks;             // Max number of fuel tanks
+    double fuel_quantity[FG_MAX_TANKS];
+
+    // Environment
+    time_t cur_time;            // current unix time
+    long int warp;              // offset in seconds to unix time
+};
+
+
+#endif // _NET_FDM_MINI_HXX