virtual void init ();
virtual void update (double delta_time_sec);
-
+
+ virtual void bind();
+ virtual void unbind();
private:
friend class GPSListener;
friend class SearchFilter;
{
public:
Config();
-
- void init(SGPropertyNode*);
+
+ void bind(GPS* aOwner, SGPropertyNode* aCfg);
bool turnAnticipationEnabled() const
{ return _enableTurnAnticipation; }
double minRunwayLengthFt() const
{ return _minRunwayLengthFt; }
- double getOBSCourse() const;
+ double getExternalCourse() const;
+
+ void setExternalCourse(double aCourseDeg);
bool cdiDeflectionIsAngular() const
{ return (_cdiMaxDeflectionNm <= 0.0); }
assert(_cdiMaxDeflectionNm > 0.0);
return _cdiMaxDeflectionNm;
}
+
+ bool driveAutopilot() const
+ { return _driveAutopilot; }
private:
bool _enableTurnAnticipation;
// should we require a hard-surfaced runway when filtering?
bool _requireHardSurface;
- // helpers to tie obs-course-source property
- const char* getOBSCourseSource() const;
- void setOBSCourseSource(const char* aPropPath);
+ // helpers to tie course-source property
+ const char* getCourseSource() const;
+ void setCourseSource(const char* aPropPath);
- // property to retrieve the OBS course from
- SGPropertyNode_ptr _obsCourseSource;
+ // property to retrieve the external course from
+ SGPropertyNode_ptr _extCourseSource;
double _cdiMaxDeflectionNm;
+
+ bool _driveAutopilot;
};
class SearchFilter : public FGPositioned::Filter
*/
void clearOutput();
- void updateWithValid(double dt);
void updateBasicData(double dt);
void updateWaypoints();
void referenceNavaidSet(const std::string& aNavaid);
void tuneNavRadios();
void updateRouteData();
+ void driveAutopilot();
void routeActivated();
void routeManagerSequenced();
+ void routeEdited();
+ void routeFinished();
void updateTurn();
void updateOverflight();
void computeTurnData();
void updateTurnData();
double computeTurnRadiusNm(double aGroundSpeedKts) const;
-
-
+
+ /**
+ * Update one-shot things when WP1 / leg data change
+ */
+ void wp1Changed();
+
// scratch maintenence utilities
void setScratchFromPositioned(FGPositioned* aPos, int aIndex);
void setScratchFromCachedSearchResult();
void nextResult();
void previousResult();
void defineWaypoint();
+ void insertWaypointAtIndex(int aIndex);
+ void removeWaypointAtIndex(int aIndex);
// tied-property getter/setters
void setCommand(const char* aCmd);
double getWP1CourseDeviation() const;
double getWP1CourseErrorNm() const;
bool getWP1ToFlag() const;
- // true-bearing-error and mag-bearing-error
+ bool getWP1FromFlag() const;
+ // true-bearing-error and mag-bearing-error
+
+ /**
+ * Tied-properties helper, record nodes which are tied for easy un-tie-ing
+ */
+ template <typename T>
+ void tie(SGPropertyNode* aNode, const char* aRelPath, const SGRawValue<T>& aRawValue)
+ {
+ SGPropertyNode* nd = aNode->getNode(aRelPath, true);
+ _tiedNodes.push_back(nd);
+ nd->tie(aRawValue);
+ }
+
+ /// helper, tie the lat/lon/elev of a SGGeod to the named children of aNode
+ void tieSGGeod(SGPropertyNode* aNode, SGGeod& aRef,
+ const char* lonStr, const char* latStr, const char* altStr);
+ /// helper, tie a SGGeod to proeprties, but read-only
+ void tieSGGeodReadOnly(SGPropertyNode* aNode, SGGeod& aRef,
+ const char* lonStr, const char* latStr, const char* altStr);
+
// members
+ SGPropertyNode_ptr _gpsNode;
SGPropertyNode_ptr _magvar_node;
SGPropertyNode_ptr _serviceable_node;
SGPropertyNode_ptr _electrical_node;
SGPropertyNode_ptr _route_current_wp_node;
SGPropertyNode_ptr _routeDistanceNm;
SGPropertyNode_ptr _routeETE;
-
- SGPropertyNode_ptr _fromFlagNode;
-
+ SGPropertyNode_ptr _routeEditedSignal;
+ SGPropertyNode_ptr _routeFinishedSignal;
+
double _selectedCourse;
- bool _last_valid;
+ bool _dataValid;
SGGeod _last_pos;
+ bool _lastPosValid;
double _last_speed_kts;
double _last_true_track;
double _last_vertical_speed;
double _turnRadius; // radius of turn in nm
SGGeod _turnPt;
SGGeod _turnCentre;
+
+ SGPropertyNode_ptr _realismSimpleGps; ///< should the GPS be simple or realistic?
+
+// autopilot drive properties
+ SGPropertyNode_ptr _apTrueHeading;
+ SGPropertyNode_ptr _apTargetAltitudeFt;
+ SGPropertyNode_ptr _apAltitudeLock;
+
+ std::vector<SGPropertyNode_ptr> _tiedNodes;
};