Merge branch 'jmt/navradio' into next
This commit is contained in:
commit
0044bd4436
2 changed files with 45 additions and 20 deletions
|
@ -153,7 +153,8 @@ FGNavRadio::FGNavRadio(SGPropertyNode *node) :
|
||||||
_localizerWidth(5.0),
|
_localizerWidth(5.0),
|
||||||
_name(node->getStringValue("name", "nav")),
|
_name(node->getStringValue("name", "nav")),
|
||||||
_num(node->getIntValue("number", 0)),
|
_num(node->getIntValue("number", 0)),
|
||||||
_time_before_search_sec(-1.0)
|
_time_before_search_sec(-1.0),
|
||||||
|
_falseCoursesEnabled(true)
|
||||||
{
|
{
|
||||||
SGPath path( globals->get_fg_root() );
|
SGPath path( globals->get_fg_root() );
|
||||||
SGPath term = path;
|
SGPath term = path;
|
||||||
|
@ -209,6 +210,9 @@ FGNavRadio::init ()
|
||||||
tofrom_serviceable_node = createServiceableProp(node, "to-from");
|
tofrom_serviceable_node = createServiceableProp(node, "to-from");
|
||||||
dme_serviceable_node = createServiceableProp(node, "dme");
|
dme_serviceable_node = createServiceableProp(node, "dme");
|
||||||
|
|
||||||
|
globals->get_props()->tie("sim/realism/false-radio-courses-enabled",
|
||||||
|
SGRawValuePointer<bool>(&_falseCoursesEnabled));
|
||||||
|
|
||||||
// frequencies
|
// frequencies
|
||||||
SGPropertyNode *subnode = node->getChild("frequencies", 0, true);
|
SGPropertyNode *subnode = node->getChild("frequencies", 0, true);
|
||||||
freq_node = subnode->getChild("selected-mhz", 0, true);
|
freq_node = subnode->getChild("selected-mhz", 0, true);
|
||||||
|
@ -518,12 +522,28 @@ void FGNavRadio::updateReceiver(double dt)
|
||||||
SG_NORMALIZE_RANGE(r, -180.0, 180.0);
|
SG_NORMALIZE_RANGE(r, -180.0, 180.0);
|
||||||
|
|
||||||
if ( is_loc ) {
|
if ( is_loc ) {
|
||||||
// The factor of 30.0 gives a period of 120 which gives us 3 cycles and six
|
if (_falseCoursesEnabled) {
|
||||||
// zeros i.e. six courses: one front course, one back course, and four
|
// The factor of 30.0 gives a period of 120 which gives us 3 cycles and six
|
||||||
// false courses. Three of the six are reverse sensing.
|
// zeros i.e. six courses: one front course, one back course, and four
|
||||||
_cdiDeflection = 30.0 * sawtooth(r / 30.0);
|
// false courses. Three of the six are reverse sensing.
|
||||||
|
_cdiDeflection = 30.0 * sawtooth(r / 30.0);
|
||||||
|
} else {
|
||||||
|
// no false courses, but we do need to create a back course
|
||||||
|
if (fabs(r) > 90.0) { // front course
|
||||||
|
_cdiDeflection = r - copysign(180.0, r);
|
||||||
|
} else {
|
||||||
|
_cdiDeflection = r; // back course
|
||||||
|
}
|
||||||
|
|
||||||
|
_cdiDeflection = -_cdiDeflection; // reverse for outbound radial
|
||||||
|
} // of false courses disabled
|
||||||
|
|
||||||
const double VOR_FULL_ARC = 20.0; // VOR is -10 .. 10 degree swing
|
const double VOR_FULL_ARC = 20.0; // VOR is -10 .. 10 degree swing
|
||||||
_cdiDeflection *= VOR_FULL_ARC / _localizerWidth; // increased localiser sensitivity
|
_cdiDeflection *= VOR_FULL_ARC / _localizerWidth; // increased localiser sensitivity
|
||||||
|
|
||||||
|
if (backcourse_node->getBoolValue()) {
|
||||||
|
_cdiDeflection = -_cdiDeflection;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// handle the TO side of the VOR
|
// handle the TO side of the VOR
|
||||||
if (fabs(r) > 90.0) {
|
if (fabs(r) > 90.0) {
|
||||||
|
@ -569,21 +589,23 @@ void FGNavRadio::updateGlideSlope(double dt, const SGVec3d& aircraft, double sig
|
||||||
double dot_v = dot(pos, _gsVertical);
|
double dot_v = dot(pos, _gsVertical);
|
||||||
double angle = atan2(dot_v, dot_h) * SGD_RADIANS_TO_DEGREES;
|
double angle = atan2(dot_v, dot_h) * SGD_RADIANS_TO_DEGREES;
|
||||||
double deflectionAngle = target_gs - angle;
|
double deflectionAngle = target_gs - angle;
|
||||||
|
|
||||||
// Construct false glideslopes. The scale factor of 1.5
|
if (_falseCoursesEnabled) {
|
||||||
// in the sawtooth gives a period of 6 degrees.
|
// Construct false glideslopes. The scale factor of 1.5
|
||||||
// There will be zeros at 3, 6r, 9, 12r et cetera
|
// in the sawtooth gives a period of 6 degrees.
|
||||||
// where "r" indicates reverse sensing.
|
// There will be zeros at 3, 6r, 9, 12r et cetera
|
||||||
// This is is consistent with conventional pilot lore
|
// where "r" indicates reverse sensing.
|
||||||
// e.g. http://www.allstar.fiu.edu/aerojava/ILS.htm
|
// This is is consistent with conventional pilot lore
|
||||||
// but inconsistent with
|
// e.g. http://www.allstar.fiu.edu/aerojava/ILS.htm
|
||||||
// http://www.freepatentsonline.com/3757338.html
|
// but inconsistent with
|
||||||
//
|
// http://www.freepatentsonline.com/3757338.html
|
||||||
// It may be that some of each exist.
|
//
|
||||||
if (deflectionAngle < 0) {
|
// It may be that some of each exist.
|
||||||
deflectionAngle = 1.5 * sawtooth(deflectionAngle / 1.5);
|
if (deflectionAngle < 0) {
|
||||||
} else {
|
deflectionAngle = 1.5 * sawtooth(deflectionAngle / 1.5);
|
||||||
// no false GS below the true GS
|
} else {
|
||||||
|
// no false GS below the true GS
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_gsNeedleDeflection = deflectionAngle * 5.0;
|
_gsNeedleDeflection = deflectionAngle * 5.0;
|
||||||
|
|
|
@ -156,6 +156,9 @@ class FGNavRadio : public SGSubsystem
|
||||||
double _gsNeedleDeflection;
|
double _gsNeedleDeflection;
|
||||||
double _gsNeedleDeflectionNorm;
|
double _gsNeedleDeflectionNorm;
|
||||||
|
|
||||||
|
// realism setting, are false courses and GS lobes enabled?
|
||||||
|
bool _falseCoursesEnabled;
|
||||||
|
|
||||||
bool updateWithPower(double aDt);
|
bool updateWithPower(double aDt);
|
||||||
|
|
||||||
// model standard VOR/DME/TACAN service volumes as per AIM 1-1-8
|
// model standard VOR/DME/TACAN service volumes as per AIM 1-1-8
|
||||||
|
|
Loading…
Reference in a new issue