X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fheading_indicator.cxx;h=2cbbb9f2469b31e9fbf2dd39e318d24a17d8d3fa;hb=19e716397136f25e11187bcc025d13eeaeac346c;hp=8878e3ba13c79f25f311a3fb33d4a1478fbe10aa;hpb=0ab2a40c2a2c75d117744f63a1bd74ccc7ea3a4e;p=flightgear.git diff --git a/src/Instrumentation/heading_indicator.cxx b/src/Instrumentation/heading_indicator.cxx index 8878e3ba1..2cbbb9f24 100644 --- a/src/Instrumentation/heading_indicator.cxx +++ b/src/Instrumentation/heading_indicator.cxx @@ -3,38 +3,27 @@ // // This file is in the Public Domain and comes with no warranty. +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + #include "heading_indicator.hxx" #include
#include
+#include HeadingIndicator::HeadingIndicator ( SGPropertyNode *node ) : - name("heading-indicator"), - num(0), - vacuum_system("/systems/vacuum") -{ - int i; - for ( i = 0; i < node->nChildren(); ++i ) { - SGPropertyNode *child = node->getChild(i); - string cname = child->getName(); - string cval = child->getStringValue(); - if ( cname == "name" ) { - name = cval; - } else if ( cname == "number" ) { - num = child->getIntValue(); - } else if ( cname == "vacuum-system" ) { - vacuum_system = cval; - } else { - SG_LOG( SG_INSTR, SG_WARN, "Error in heading-indicator config logic" ); - if ( name.length() ) { - SG_LOG( SG_INSTR, SG_WARN, "Section = " << name ); - } - } - } -} - -HeadingIndicator::HeadingIndicator () + _name(node->getStringValue("name", "heading-indicator")), + _num(node->getIntValue("number", 0)), + _suction(node->getStringValue("suction", "/systems/vacuum/suction-inhg")) { } @@ -45,41 +34,47 @@ HeadingIndicator::~HeadingIndicator () void HeadingIndicator::init () { - string branch; - branch = "/instrumentation/" + name; - vacuum_system += "/suction-inhg"; + std::string branch; + branch = "/instrumentation/" + _name; - SGPropertyNode *node = fgGetNode(branch.c_str(), num, true ); - _offset_node = node->getChild("offset-deg", 0, true); + SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true ); + if( NULL == (_offset_node = node->getChild("offset-deg", 0, false)) ) { + _offset_node = node->getChild("offset-deg", 0, true); + _offset_node->setDoubleValue( -globals->get_mag()->get_magvar() * SGD_RADIANS_TO_DEGREES ); + } _heading_in_node = fgGetNode("/orientation/heading-deg", true); - _suction_node = fgGetNode(vacuum_system.c_str(), true); + _suction_node = fgGetNode(_suction.c_str(), true); _heading_out_node = node->getChild("indicated-heading-deg", 0, true); + _heading_bug_error_node = node->getChild("heading-bug-error-deg", 0, true); + _heading_bug_node = node->getChild("heading-bug-deg", 0, true); _last_heading_deg = (_heading_in_node->getDoubleValue() + _offset_node->getDoubleValue()); - - //_serviceable_node->setBoolValue(true); } void HeadingIndicator::bind () { - string branch; - branch = "/instrumentation/" + name + "/serviceable"; - fgTie(branch.c_str(), + std::ostringstream temp; + std::string branch; + temp << _num; + branch = "/instrumentation/" + _name + "[" + temp.str() + "]"; + + fgTie((branch + "/serviceable").c_str(), &_gyro, &Gyro::is_serviceable, &Gyro::set_serviceable); - branch = "/instrumentation/" + name + "/spin"; - fgTie(branch.c_str(), + fgTie((branch + "/spin").c_str(), &_gyro, &Gyro::get_spin_norm, &Gyro::set_spin_norm); } void HeadingIndicator::unbind () { - string branch; - branch = "/instrumentation/" + name + "/serviceable"; - fgUntie(branch.c_str()); - branch = "/instrumentation/" + name + "/spin"; - fgUntie(branch.c_str()); + std::ostringstream temp; + std::string branch; + temp << _num; + branch = "/instrumentation/" + _name + "[" + temp.str() + "]"; + + fgUntie((branch + "/serviceable").c_str()); + fgUntie((branch + "/spin").c_str()); } void @@ -93,17 +88,13 @@ HeadingIndicator::update (double dt) // Next, calculate time-based precession double offset = _offset_node->getDoubleValue(); offset -= dt * (0.25 / 60.0); // 360deg/day - while (offset < -360) - offset += 360; - while (offset > 360) - offset -= 360; - _offset_node->setDoubleValue(offset); + SG_NORMALIZE_RANGE(offset, -360.0, 360.0); // TODO: movement-induced error // Next, calculate the indicated heading, // introducing errors. - double factor = 0.01 / (spin * spin * spin * spin * spin * spin); + double factor = 100 * (spin * spin * spin * spin * spin * spin); double heading = _heading_in_node->getDoubleValue(); // Now, we have to get the current @@ -114,16 +105,20 @@ HeadingIndicator::update (double dt) while ((heading - _last_heading_deg) < -180) _last_heading_deg -= 360; - heading = fgGetLowPass(_last_heading_deg, heading, dt/factor); + heading = fgGetLowPass(_last_heading_deg, heading, dt * factor); _last_heading_deg = heading; heading += offset; - while (heading < 0) - heading += 360; - while (heading > 360) - heading -= 360; + SG_NORMALIZE_RANGE(heading, 0.0, 360.0); _heading_out_node->setDoubleValue(heading); + + // Calculate heading bug error normalized to +/- 180.0 + double heading_bug = _heading_bug_node->getDoubleValue(); + double diff = heading_bug - heading; + + SG_NORMALIZE_RANGE(diff, -180.0, 180.0); + _heading_bug_error_node->setDoubleValue( diff ); } // end of heading_indicator.cxx