#define _FG_NAVCOM_HXX
-#include <Main/fgfs.hxx>
#include <Main/fg_props.hxx>
#include <simgear/compiler.h>
-
+#include <simgear/structure/subsystem_mgr.hxx>
#include <simgear/math/interpolater.hxx>
#include <simgear/timing/timestamp.hxx>
-#include <Navaids/ilslist.hxx>
#include <Navaids/navlist.hxx>
-#include <Sound/beacon.hxx>
#include <Sound/morse.hxx>
-class FGNavCom : public FGSubsystem
+class FGNavCom : public SGSubsystem
{
- FGBeacon beacon;
FGMorse morse;
SGInterpTable *term_tbl;
SGPropertyNode *lon_node;
SGPropertyNode *lat_node;
SGPropertyNode *alt_node;
+ SGPropertyNode *bus_power;
+ SGPropertyNode *com_serviceable, *nav_serviceable;
+ SGPropertyNode *cdi_serviceable, *gs_serviceable, *tofrom_serviceable;
- string last_nav_ident;
+ string last_nav_id;
bool last_nav_vor;
int nav_play_count;
time_t nav_last_time;
bool need_update;
- string comm_ident;
+ bool power_btn;
+ bool audio_btn;
+
bool comm_valid;
bool comm_inrange;
double comm_freq;
double comm_range;
double comm_effective_range;
- string nav_ident;
+ string nav_id;
string nav_trans_ident;
bool nav_valid;
bool nav_inrange;
bool nav_loc;
double nav_freq;
double nav_alt_freq;
- double nav_radial;
+ double nav_heading; // true heading to nav station
+ double nav_radial; // current radial we are on (taking
+ // into consideration the vor station
+ // alignment which likely doesn't
+ // match the magnetic alignment
+ // exactly.)
double nav_sel_radial;
+ double nav_target_radial;
+ double nav_target_radial_true;
+ double nav_target_auto_hdg;
double nav_loclon;
double nav_loclat;
double nav_x;
double nav_loc_dist;
double nav_gslon;
double nav_gslat;
+ double nav_elev; // use gs elev if available
double nav_gs_x;
double nav_gs_y;
double nav_gs_z;
+ sgdVec3 gs_base_vec;
double nav_gs_dist;
+ double nav_gs_dist_signed;
+ double nav_gs_rate_of_climb;
SGTimeStamp prev_time;
SGTimeStamp curr_time;
- double nav_elev;
double nav_range;
double nav_effective_range;
- double nav_heading;
double nav_target_gs;
- double nav_magvar;
+ double nav_twist;
double nav_vol_btn;
bool nav_ident_btn;
+ double horiz_vel;
+ double last_x;
// model standard VOR/DME/TACAN service volumes as per AIM 1-1-8
double adjustNavRange( double stationElev, double aircraftElev,
sprintf( dme_fx_name, "dme%d-vor-ident", index );
}
+ // NavCom Setters
+ inline void set_power_btn( bool val ) { power_btn = val; }
+ inline void set_audio_btn( bool val ) { audio_btn = val; }
+
// COMM Setters
inline void set_comm_freq( double freq ) {
comm_freq = freq; need_update = true;
}
inline void set_nav_ident_btn( bool val ) { nav_ident_btn = val; }
+ // NavCom Accessors
+ inline bool has_power() const {
+ return power_btn && (bus_power->getDoubleValue() > 1.0);
+ }
+ inline bool get_power_btn() const { return power_btn; }
+ inline bool get_audio_btn() const { return audio_btn; }
+
// COMM Accessors
inline double get_comm_freq () const { return comm_freq; }
inline double get_comm_alt_freq () const { return comm_alt_freq; }
inline double get_nav_freq () const { return nav_freq; }
inline double get_nav_alt_freq () const { return nav_alt_freq; }
inline double get_nav_sel_radial() const { return nav_sel_radial; }
+ inline double get_nav_target_radial() const { return nav_target_radial; }
+ inline double get_nav_target_radial_true() const {
+ return nav_target_radial_true;
+ }
+ inline double get_nav_target_auto_hdg() const {
+ return nav_target_auto_hdg;
+ }
// Calculated values.
inline bool get_comm_inrange() const { return comm_inrange; }
inline double get_nav_gslon() const { return nav_gslon; }
inline double get_nav_gslat() const { return nav_gslat; }
inline double get_nav_gs_dist() const { return nav_gs_dist; }
+ inline double get_nav_gs_dist_signed() const { return nav_gs_dist_signed; }
+ inline double get_nav_gs_rate_of_climb() const {
+ return nav_gs_rate_of_climb;
+ }
inline double get_nav_elev() const { return nav_elev; }
- inline double get_nav_heading() const { return nav_heading; }
- inline double get_nav_radial() const { return nav_radial; }
+ double get_nav_heading() const;
+ double get_nav_radial() const;
+ double get_nav_reciprocal_radial() const;
inline double get_nav_target_gs() const { return nav_target_gs; }
- inline double get_nav_magvar() const { return nav_magvar; }
- double get_nav_heading_needle_deflection() const;
- double get_nav_gs_needle_deflection() const;
+ inline double get_nav_twist() const { return nav_twist; }
+ double get_nav_cdi_deflection() const;
+ double get_nav_cdi_xtrack_error() const;
+ double get_nav_gs_deflection() const;
inline double get_nav_vol_btn() const { return nav_vol_btn; }
inline bool get_nav_ident_btn() const { return nav_ident_btn; }
+ inline const char * get_nav_id() const { return nav_id.c_str(); }
+ inline int get_nav_id_c1() const { return nav_id.c_str()[0]; }
+ inline int get_nav_id_c2() const { return nav_id.c_str()[1]; }
+ inline int get_nav_id_c3() const { return nav_id.c_str()[2]; }
+ inline int get_nav_id_c4() const { return nav_id.c_str()[3]; }
};