]> git.mxchange.org Git - flightgear.git/blobdiff - src/Instrumentation/gps.hxx
Fix bug 191, uninitialised HUD color.
[flightgear.git] / src / Instrumentation / gps.hxx
index d20c74e4814eeb6ec3012c531df2e735b874b9f0..f69a70a76be4b6fcc0922b92210e2fe5d13f3ef7 100644 (file)
@@ -7,11 +7,15 @@
 #ifndef __INSTRUMENTS_GPS_HXX
 #define __INSTRUMENTS_GPS_HXX 1
 
+#include <cassert>
+#include <memory>
+
 #include <simgear/props/props.hxx>
 #include <simgear/structure/subsystem_mgr.hxx>
 #include <simgear/math/SGMath.hxx>
 
-#include "Navaids/positioned.hxx"
+#include <Navaids/positioned.hxx>
+#include <Instrumentation/rnav_waypt_controller.hxx>
 
 // forward decls
 class SGRoute;
@@ -71,20 +75,29 @@ private:
  * /instrumentation/gps/magnetic-bug-error-deg
 
  */
-class GPS : public SGSubsystem
+class GPS : public SGSubsystem, public flightgear::RNAV
 {
-
 public:
-
     GPS (SGPropertyNode *node);
     GPS ();
     virtual ~GPS ();
 
+  // SGSubsystem interface
     virtual void init ();
     virtual void update (double delta_time_sec);
     
     virtual void bind();
     virtual void unbind();
+
+  // RNAV interface
+    virtual SGGeod position();
+    virtual double trackDeg();
+    virtual double groundSpeedKts();
+    virtual double vspeedFPM();
+    virtual double magvarDeg();
+    virtual double selectedMagCourse();
+    virtual double overflightArmDistanceM();
+    
 private:
     friend class GPSListener;
     friend class SearchFilter;
@@ -123,19 +136,12 @@ private:
       double waypointAlertTime() const
       { return _waypointAlertTime; }
             
-      bool tuneNavRadioToRefVor() const
-      { return _tuneRadio1ToRefVor; }
-      
       bool requireHardSurface() const
       { return _requireHardSurface; }
       
       double minRunwayLengthFt() const
       { return _minRunwayLengthFt; }
       
-      double getExternalCourse() const;
-      
-      void setExternalCourse(double aCourseDeg);
-      
       bool cdiDeflectionIsAngular() const
       { return (_cdiMaxDeflectionNm <= 0.0); }
       
@@ -147,6 +153,9 @@ private:
       
       bool driveAutopilot() const
       { return _driveAutopilot; }
+      
+      bool courseSelectable() const
+      { return _courseSelectable; }
     private:
       bool _enableTurnAnticipation;
       
@@ -160,25 +169,19 @@ private:
       // (in seconds)
       double _waypointAlertTime;
       
-      // should GPS automatically tune NAV1 to the reference VOR?
-      bool _tuneRadio1ToRefVor;
-      
       // minimum runway length to require when filtering
       double _minRunwayLengthFt;
       
       // should we require a hard-surfaced runway when filtering?
       bool _requireHardSurface;
       
-      // helpers to tie course-source property
-      const char* getCourseSource() const;
-      void setCourseSource(const char* aPropPath);
-      
-      // property to retrieve the external course from
-      SGPropertyNode_ptr _extCourseSource;
-      
       double _cdiMaxDeflectionNm;
       
+      // should we drive the autopilot directly or not?
       bool _driveAutopilot;
+      
+      // is selected-course-deg read to set desired-course or not?
+      bool _courseSelectable;
     };
     
     class SearchFilter : public FGPositioned::Filter
@@ -196,12 +199,10 @@ private:
     void clearOutput();
 
     void updateBasicData(double dt);
-    void updateWaypoints();
 
     void updateTrackingBug();
     void updateReferenceNavaid(double dt);
     void referenceNavaidSet(const std::string& aNavaid);
-    void tuneNavRadios();
     void updateRouteData();
     void driveAutopilot();
     
@@ -273,15 +274,17 @@ private:
   double getScratchDistance() const;
   double getScratchMagBearing() const;
   double getScratchTrueBearing() const;
-  bool getScratchHasNext() const { return _searchHasNext; }
+  bool getScratchHasNext() const;
   
   double getSelectedCourse() const { return _selectedCourse; }
+  void setSelectedCourse(double crs);
+  double getDesiredCourse() const { return _desiredCourse; }
+  
   double getCDIDeflection() const;
   
   double getLegDistance() const;
   double getLegCourse() const;
   double getLegMagCourse() const;
-  double getAltDistanceRatio() const;
   
   double getTrueTrack() const { return _last_true_track; }
   double getMagTrack() const;
@@ -331,6 +334,7 @@ private:
 
 // members
   SGPropertyNode_ptr _gpsNode;
+  SGPropertyNode_ptr _currentWayptNode;
   SGPropertyNode_ptr _magvar_node;
   SGPropertyNode_ptr _serviceable_node;
   SGPropertyNode_ptr _electrical_node;
@@ -341,6 +345,8 @@ private:
     SGPropertyNode_ptr _trip_odometer_node;
     SGPropertyNode_ptr _true_bug_error_node;
     SGPropertyNode_ptr _magnetic_bug_error_node;
+    SGPropertyNode_ptr _eastWestVelocity;
+    SGPropertyNode_ptr _northSouthVelocity;
     
     SGPropertyNode_ptr _ref_navaid_id_node;
     SGPropertyNode_ptr _ref_navaid_bearing_node;
@@ -355,8 +361,10 @@ private:
     SGPropertyNode_ptr _routeETE;
   SGPropertyNode_ptr _routeEditedSignal;
   SGPropertyNode_ptr _routeFinishedSignal;
-
+  SGPropertyNode_ptr _desiredCourseNode;
+  
     double _selectedCourse;
+    double _desiredCourse;
     
     bool _dataValid;
     SGGeod _last_pos;
@@ -364,6 +372,8 @@ private:
     double _last_speed_kts;
     double _last_true_track;
     double _last_vertical_speed;
+    double _lastEWVelocity;
+    double _lastNSVelocity;
     
     std::string _mode;
     GPSListener* _listener;
@@ -379,10 +389,8 @@ private:
   
   SGGeodProperty _position;
   SGGeod _wp0_position;
-  SGGeod _wp1_position;
   SGGeod _indicated_pos;
-  std::string _wp0Ident, _wp0Name, _wp1Ident, _wp1Name;
-  double _wp1DistanceM, _wp1TrueBearing;
+  double _legDistanceNm;
   
 // scratch data
   SGGeod _scratchPos;
@@ -394,8 +402,6 @@ private:
   std::string _searchQuery;
   FGPositioned::Type _searchType;
   bool _searchExact;
-  bool _searchOrderByRange;
-  bool _searchResultsCached;
   FGPositioned::List _searchResults;
   bool _searchIsRoute; ///< set if 'search' is actually the current route
   bool _searchHasNext; ///< is there a result after this one?
@@ -412,9 +418,14 @@ private:
     SGGeod _turnPt;
     SGGeod _turnCentre;
   
+  std::auto_ptr<flightgear::WayptController> _wayptController;
+  
   SGPropertyNode_ptr _realismSimpleGps; ///< should the GPS be simple or realistic?
+  flightgear::WayptRef _prevWaypt;
+  flightgear::WayptRef _currentWaypt;
   
 // autopilot drive properties
+  SGPropertyNode_ptr _apDrivingFlag;
   SGPropertyNode_ptr _apTrueHeading;
   SGPropertyNode_ptr _apTargetAltitudeFt;
   SGPropertyNode_ptr _apAltitudeLock;