]> git.mxchange.org Git - flightgear.git/blobdiff - src/Cockpit/cockpit.cxx
Merge branch 'vivian/cullsetting'
[flightgear.git] / src / Cockpit / cockpit.cxx
index 5c23036c0a77d72198637559ff63aa63d3baccd6..0414a0f6a0ae4fb0a15f3cde660c52bde07fbed4 100644 (file)
@@ -16,7 +16,7 @@
 //
 // 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.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
 #  include <config.h>
 #endif
 
-#ifdef HAVE_WINDOWS_H          
-#  include <windows.h>
-#endif
-
-#include <GL/glu.h>
+#include <simgear/compiler.h>
 
 #include <stdlib.h>
 #include <stdio.h>
 
 #include <simgear/constants.h>
 #include <simgear/debug/logstream.hxx>
-#include <simgear/math/polar3d.hxx>
 #include <simgear/props/props.hxx>
 #include <simgear/timing/sg_time.hxx>
 
 #include <Aircraft/aircraft.hxx>
 #include <Include/general.hxx>
-#include <FDM/ADA.hxx>
+#ifdef ENABLE_SP_FDM
+#include <FDM/SP/ADA.hxx>
+#endif
 #include <Main/globals.hxx>
 #include <Main/fg_props.hxx>
 #include <Main/viewmgr.hxx>
+#include <Main/viewer.hxx>
 #include <Scenery/scenery.hxx>
-#include <Time/fg_timer.hxx>
 #include <GUI/gui.h>
 
 #include "cockpit.hxx"
 #include "hud.hxx"
 
 
-// This is a structure that contains all data related to
-// cockpit/panel/hud system
-
-static pCockpit ac_cockpit;
 // The following routines obtain information concerntin the aircraft's
 // current state and return it to calling instrument display routines.
 // They should eventually be member functions of the aircraft.
@@ -73,7 +66,7 @@ float get_lat_min( void )
 {
     double a, d;
 
-    a = current_aircraft.fdm_state->get_Latitude() * SGD_RADIANS_TO_DEGREES;    
+    a = current_aircraft.fdm_state->get_Latitude() * SGD_RADIANS_TO_DEGREES;
     if (a < 0.0) {
         a = -a;
     }
@@ -95,7 +88,7 @@ get_formated_gmt_time( void )
 {
     static char buf[32];
     const struct tm *p = globals->get_time_params()->getGmt();
-    sprintf( buf, "%d/%d/%4d %d:%02d:%02d", 
+    sprintf( buf, "%d/%d/%4d %d:%02d:%02d",
          p->tm_mon+1, p->tm_mday, 1900 + p->tm_year,
          p->tm_hour, p->tm_min, p->tm_sec);
 
@@ -106,12 +99,12 @@ get_formated_gmt_time( void )
 float get_long_min( void )
 {
     double  a, d;
-    a = current_aircraft.fdm_state->get_Longitude() * SGD_RADIANS_TO_DEGREES;   
+    a = current_aircraft.fdm_state->get_Longitude() * SGD_RADIANS_TO_DEGREES;
     if (a < 0.0) {
         a = -a;
     }
     d = (double) ( (int) a);
-    float lon_min = (a - d) * 60.0; 
+    float lon_min = (a - d) * 60.0;
 
     return lon_min;
 }
@@ -147,7 +140,7 @@ float get_speed( void )
     static const SGPropertyNode * speedup_node = fgGetNode("/sim/speed-up");
 
     float speed = current_aircraft.fdm_state->get_V_calibrated_kts()
-       * speedup_node->getIntValue();
+        * speedup_node->getIntValue();
 
     return speed;
 }
@@ -155,7 +148,7 @@ float get_speed( void )
 float get_mach(void)
 {
     return current_aircraft.fdm_state->get_Mach_number();
-}      
+}
 
 float get_aoa( void )
 {
@@ -203,10 +196,10 @@ float get_agl( void )
 
     if ( !strcmp(startup_units_node->getStringValue(), "feet") ) {
         agl = (current_aircraft.fdm_state->get_Altitude()
-               - globals->get_scenery()->get_cur_elev() * SG_METER_TO_FEET);
+               - current_aircraft.fdm_state->get_Runway_altitude());
     } else {
-        agl = (current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
-               - globals->get_scenery()->get_cur_elev());
+        agl = (current_aircraft.fdm_state->get_Altitude()
+               - current_aircraft.fdm_state->get_Runway_altitude()) * SG_FEET_TO_METER;
     }
 
     return agl;
@@ -224,7 +217,7 @@ float get_frame_rate( void )
 
 float get_fov( void )
 {
-    return globals->get_current_view()->get_fov(); 
+    return globals->get_current_view()->get_fov();
 }
 
 float get_vfc_ratio( void )
@@ -268,13 +261,13 @@ float get_view_direction( void )
 {
     double view_off = SGD_2PI - globals->get_current_view()->getHeadingOffset_deg() * SGD_DEGREES_TO_RADIANS;
     double view = ( current_aircraft.fdm_state->get_Psi() + view_off)
-       * SGD_RADIANS_TO_DEGREES;
-    
-    if(view > 360.)
+        * SGD_RADIANS_TO_DEGREES;
+
+    if (view > 360.)
         view -= 360.;
-    else if(view<0.)
+    else if (view<0.)
         view += 360.;
-    
+
     return view;
 }
 
@@ -282,7 +275,7 @@ float get_view_direction( void )
 float get_dme( void )
 {
     static const SGPropertyNode * dme_node =
-        fgGetNode("/radios/dme/distance-nm");
+        fgGetNode("/instrumentation/dme/indicated-distance-nm");
 
     return dme_node->getFloatValue();
 }
@@ -337,6 +330,7 @@ float get_anzg   ( void )
     return anzg;
 }
 
+#ifdef ENABLE_SP_FDM
 int get_iaux1 (void)
 {
     FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
@@ -516,158 +510,6 @@ float get_aux18 (void)
     FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
     return fdm->get_faux(10);
 }
-// #endif
-// $$$ end - added, VS Renganathan 13 Oct 2K
-
-
-#ifdef NOT_USED
-/****************************************************************************/
-/* Convert degrees to dd mm'ss.s" (DMS-Format)                              */
-/****************************************************************************/
-char *dmshh_format(double degrees)
-{
-    static char buf[16];    
-    int deg_part;
-    int min_part;
-    double sec_part;
-    
-    if (degrees < 0)
-      degrees = -degrees;
-
-    deg_part = degrees;
-    min_part = 60.0 * (degrees - deg_part);
-    sec_part = 3600.0 * (degrees - deg_part - min_part / 60.0);
-
-    /* Round off hundredths */
-    if (sec_part + 0.005 >= 60.0)
-      sec_part -= 60.0, min_part += 1;
-    if (min_part >= 60)
-      min_part -= 60, deg_part += 1;
-
-    sprintf(buf,"%02d*%02d %05.2f",deg_part,min_part,sec_part);
-
-    return buf;
-}
-#endif // 0
-
-
-/************************************************************************
- Convert degrees to dd mm.mmm' (DMM-Format)
- Description: Converts using a round-off factor tailored to the required
- precision of the minutes field (three decimal places).  Round-off
- prevents function from returning a minutes value of 60.
-
- Input arguments: Coordinate value in decimal degrees
-
-************************************************************************/
-static char *toDM(float dd)
-{
-    static char  dm[16];
-    double tempdd;
-    double mn;
-    double sign = 1;
-    int deg;
-
-    if (dd < 0) {
-       sign = -1;
-    }
-    /* round for minutes expressed to three decimal places */
-    tempdd = fabs(dd) + (5.0E-4 / 60.0);
-    deg = (int)tempdd;
-    mn = fabs( (tempdd - (double)(deg)) * 60.0 - 4.999E-4 );
-    deg *= (int)sign;
-    sprintf(dm, "%d*%06.3f", deg, mn);
-    return dm;
-}
-
-
-/************************************************************************
- Convert degrees to dd mm'ss.s'' (DMS-Format)
- Description: Converts using a round-off factor tailored to the required
- precision of the seconds field (one decimal place).  Round-off
- prevents function from returning a seconds value of 60.
-
- Input arguments: Coordinate value in decimal degrees
-
-************************************************************************/
-static char *toDMS(float dd)
-{
-    static char  dms[16];
-    double tempdd, tempmin;
-    int deg;
-    int mn;
-    double sec;
-    double sign = 1;
-
-    if(dd < 0) {
-       sign = -1;
-    }
-    /* round up for seconds expressed to one decimal place */
-    tempdd = fabs(dd) + (0.05 / 3600.0);
-    deg = (int)tempdd;
-    tempmin =  (tempdd - (double)(deg)) * 60.0;
-    mn = (int)tempmin;
-    sec = fabs( (tempmin - (double)(mn)) * 60.0 - 0.049 );
-    deg *= (int)sign;
-    sprintf(dms, "%d*%02d %04.1f", deg, mn, sec);
-    return dms;
-}
-
-
-// Have to set the LatLon display type
-//static char *(*fgLatLonFormat)(float) = toDM;
-static char *(*fgLatLonFormat)(float);
-
-char *coord_format_lat(float latitude)
-{
-    static char buf[16];
-
-    sprintf(buf,"%s%c",
-//      dmshh_format(latitude),
-//      toDMS(latitude),
-//      toDM(latitude),
-        fgLatLonFormat(latitude),           
-        latitude > 0 ? 'N' : 'S');
-    return buf;
-}
-
-char *coord_format_lon(float longitude)
-{
-    static char buf[80];
-
-    sprintf(buf,"%s%c",
-//      dmshh_format(longitude),
-//      toDMS(longitude),
-//      toDM(longitude),
-        fgLatLonFormat(longitude),
-        longitude > 0 ? 'E' : 'W');
-    return buf;
-}
-
-void fgLatLonFormatToggle( puObject *)
-{
-    static int toggle = 0;
-
-    if ( toggle ) 
-        fgLatLonFormat = toDM;
-    else
-        fgLatLonFormat = toDMS;
-    
-    toggle = ~toggle;
-}
-
-#ifdef NOT_USED
-char *coord_format_latlon(double latitude, double longitude)
-{
-    static char buf[1024];
-
-    sprintf(buf,"%s%c %s%c",
-        dmshh_format(latitude),
-        latitude > 0 ? 'N' : 'S',
-        dmshh_format(longitude),
-        longitude > 0 ? 'E' : 'W');
-    return buf;
-}
 #endif
 
 
@@ -680,31 +522,19 @@ bool fgCockpitInit( fgAIRCRAFT *cur_aircraft )
 
     // If aircraft has HUD specified we will get the specs from its def
     // file. For now we will depend upon hard coding in hud?
-    
+
     // We must insure that the existing instrument link is purged.
     // This is done by deleting the links in the list.
-    
+
     // HI_Head is now a null pointer so we can generate a new list from the
     // current aircraft.
 
     fgHUDInit( cur_aircraft );
-    ac_cockpit = new fg_Cockpit();
-    
-    // Have to set the LatLon display type
-    fgLatLonFormat = toDM;
-    
-    SG_LOG( SG_COCKPIT, SG_INFO,
-        "  Code " << ac_cockpit->code() << " Status " 
-        << ac_cockpit->status() );
 
-       return true;
+    return true;
 }
 
-void fgCockpitUpdate( void ) {
-
-    SG_LOG( SG_COCKPIT, SG_DEBUG,
-            "Cockpit: code " << ac_cockpit->code() << " status " 
-            << ac_cockpit->status() );
+void fgCockpitUpdate( osg::State* state ) {
 
     static const SGPropertyNode * xsize_node = fgGetNode("/sim/startup/xsize");
     static const SGPropertyNode * ysize_node = fgGetNode("/sim/startup/ysize");
@@ -713,46 +543,77 @@ void fgCockpitUpdate( void ) {
 
     int iwidth   = xsize_node->getIntValue();
     int iheight  = ysize_node->getIntValue();
-    float width  = iwidth;
-    // float height = iheight;
 
-                               // FIXME: inefficient
+                                // FIXME: inefficient
     if ( hud_visibility_node->getBoolValue() ) {
         // This will check the global hud linked list pointer.
-        // If these is anything to draw it will.
-        fgUpdateHUD();
-    } else if ( fgGetBool( "/sim/hud/draw-fps-when-off", false ) ) {
-        char buf[64];
-        float fps    =       get_frame_rate();
-//      float tris   = fps * get_vfc_tris_drawn();
-//      float culled = fps * get_vfc_tris_culled();
-//      sprintf(buf,"%-4.1f  %7.0f  %7.0f", fps, tris, culled);
-        sprintf(buf,"%-5.1f", fps);
-
-        glMatrixMode( GL_PROJECTION );
-        glPushMatrix();
-        glLoadIdentity();
-        gluOrtho2D( 0, iwidth, 0, iheight );
-        glMatrixMode( GL_MODELVIEW );
-        glPushMatrix();
-        glLoadIdentity();
-
-        glDisable( GL_DEPTH_TEST );
-        glDisable( GL_LIGHTING );
-        
-        glColor3f( 0.9, 0.4, 0.2 );
-
-        guiFnt.drawString( buf,
-                          int(width - guiFnt.getStringWidth(buf) - 10),
-                           10 );
-        glEnable( GL_DEPTH_TEST );
-        glEnable( GL_LIGHTING );
-        glMatrixMode( GL_PROJECTION );
-        glPopMatrix();
-        glMatrixMode( GL_MODELVIEW );
-        glPopMatrix();
+        // If there is anything to draw it will.
+        fgUpdateHUD( state );
     }
-    
+
     glViewport( 0, 0, iwidth, iheight );
 }
 
+
+
+
+
+struct FuncTable {
+    const char *name;
+    FLTFNPTR func;
+} fn_table[] = {
+    { "agl", get_agl },
+    { "aileronval", get_aileronval },
+    { "altitude", get_altitude },
+    { "anzg", get_anzg },
+    { "aoa", get_aoa },
+    { "ax", get_Ax },
+    { "climb", get_climb_rate },
+    { "elevatortrimval", get_elev_trimval },
+    { "elevatorval", get_elevatorval },
+    { "fov", get_fov },
+    { "framerate", get_frame_rate },
+    { "heading", get_heading },
+    { "latitude", get_latitude },
+    { "longitude", get_longitude },
+    { "mach", get_mach },
+    { "rudderval", get_rudderval },
+    { "speed", get_speed },
+    { "throttleval", get_throttleval },
+    { "view_direction", get_view_direction },
+    { "vfc_tris_culled", get_vfc_tris_culled },
+    { "vfc_tris_drawn", get_vfc_tris_drawn },
+#ifdef ENABLE_SP_FDM
+    { "aux1", get_aux1 },
+    { "aux2", get_aux2 },
+    { "aux3", get_aux3 },
+    { "aux4", get_aux4 },
+    { "aux5", get_aux5 },
+    { "aux6", get_aux6 },
+    { "aux7", get_aux7 },
+    { "aux8", get_aux8 },
+    { "aux9", get_aux9 },
+    { "aux10", get_aux10 },
+    { "aux11", get_aux11 },
+    { "aux12", get_aux12 },
+    { "aux13", get_aux13 },
+    { "aux14", get_aux14 },
+    { "aux15", get_aux15 },
+    { "aux16", get_aux16 },
+    { "aux17", get_aux17 },
+    { "aux18", get_aux18 },
+#endif
+    { 0, 0 },
+};
+
+
+FLTFNPTR get_func(const char *name)
+{
+    for (int i = 0; fn_table[i].name; i++)
+        if (!strcmp(fn_table[i].name, name))
+            return fn_table[i].func;
+
+    return 0;
+}
+
+