]> git.mxchange.org Git - flightgear.git/commitdiff
For the agRadar, initialize property nodes with defaults.
authortimoore <timoore>
Sat, 22 Mar 2008 09:19:21 +0000 (09:19 +0000)
committertimoore <timoore>
Sat, 22 Mar 2008 09:19:21 +0000 (09:19 +0000)
Introduce a convenience member function in wxRadarBg for creating an
SGPropertyNode and initializing it in one step. Use this in
agRadar. This eliminates buggy behavior when the necessary radar
properties aren't defined.

src/Instrumentation/agradar.cxx
src/Instrumentation/agradar.hxx
src/Instrumentation/wxradar.hxx

index 4666f0b19f254c8c719a9fc3fa8762b55703c705..4e47d38e7c48e780d32a9c6e460afd8af8bfe0f8 100644 (file)
@@ -71,25 +71,28 @@ agRadar::init ()
     _Instrument->setBoolValue("stabilisation/roll", false);
     _Instrument->setBoolValue("stabilisation/pitch", false);
     
-    _Instrument->getNode("antenna/x-offset-m", true);
-    _Instrument->getNode("antenna/y-offset-m", true);
-    _Instrument->getNode("antenna/z-offset-m", true);
-
-    _Instrument->getNode("terrain-warning/elev-limit-deg", true);
-    _Instrument->getNode("terrain-warning/elev-step-deg", true);
-    _Instrument->getNode("terrain-warning/az-limit-deg", true);
-    _Instrument->getNode("terrain-warning/az-step-deg", true);
-    _Instrument->getNode("terrain-warning/max-range-m", true);
-    _Instrument->getNode("terrain-warning/min-range-m", true);
-    _Instrument->getNode("terrain-warning/tilt",true);
-
-    _Instrument->getNode("terrain-warning/hit/brg-deg", true);
-    _Instrument->getNode("terrain-warning/hit/range-m", true);
-    _Instrument->getNode("terrain-warning/hit/material", true);
-    _Instrument->getNode("terrain-warning/hit/bumpiness", true);
-
-    _Instrument->getNode("terrain-warning/stabilisation/roll", true);
-    _Instrument->getNode("terrain-warning/stabilisation/pitch", true);
+    _xOffsetMNode = getInstrumentNode("antenna/x-offset-m", 0.0);
+    _yOffsetMNode = getInstrumentNode("antenna/y-offset-m", 0.0);
+    _zOffsetMNode = getInstrumentNode("antenna/z-offset-m", 0.0);
+
+    _elevLimitDegNode = getInstrumentNode("terrain-warning/elev-limit-deg", 2.0);
+    _elevStepDegNode = getInstrumentNode("terrain-warning/elev-step-deg", 1.0);
+    _azLimitDegNode = getInstrumentNode("terrain-warning/az-limit-deg", 1.0);
+    _azStepDegNode = getInstrumentNode("terrain-warning/az-step-deg", 1.5);
+    _maxRangeMNode = getInstrumentNode("terrain-warning/max-range-m", 4000.0);
+    _minRangeMNode = getInstrumentNode("terrain-warning/min-range-m", 250.0);
+    _tiltNode = getInstrumentNode("terrain-warning/tilt", -2.0);
+
+    _brgDegNode = getInstrumentNode("terrain-warning/hit/brg-deg", 0.0);
+    _rangeMNode = getInstrumentNode("terrain-warning/hit/range-m", 0.0);
+    _elevationMNode = getInstrumentNode("terrain-warning/hit/elevation-m", 0.0);
+    _materialNode = getInstrumentNode("terrain-warning/hit/material", "");
+    _bumpinessNode = getInstrumentNode("terrain-warning/hit/bumpiness", 0.0);
+
+    _rollStabNode = getInstrumentNode("terrain-warning/stabilisation/roll",
+                                      true);
+    _pitchStabNode = getInstrumentNode("terrain-warning/stabilisation/pitch",
+                                       false);
 //    cout << "init done" << endl;
 
 }
@@ -143,9 +146,9 @@ agRadar::getCartAntennaPos() const {
     float pitch = _user_pitch_deg_node->getDoubleValue();
     float roll  = _user_roll_deg_node->getDoubleValue();
 
-    double x_offset_m =_Instrument->getDoubleValue("antenna/x-offset-m", 0);
-    double y_offset_m =_Instrument->getDoubleValue("antenna/y-offset-m", 0);
-    double z_offset_m =_Instrument->getDoubleValue("antenna/y-offset-m", 0);
+    double x_offset_m =_xOffsetMNode->getDoubleValue();
+    double y_offset_m =_yOffsetMNode->getDoubleValue();
+    double z_offset_m =_zOffsetMNode->getDoubleValue();
 
     // convert geodetic positions to geocentered
     SGVec3d cartuserPos = getCartUserPos();
@@ -253,8 +256,8 @@ agRadar::update_terrain()
     double max_range = 40000;
     double min_range = 250;
     double tilt = -2.5;
-    bool roll_stab   = _Instrument->getBoolValue("stabilisation/roll");
-    bool pitch_stab  = _Instrument->getBoolValue("stabilisation/pitch");
+    bool roll_stab   = _rollStabNode->getBoolValue();
+    bool pitch_stab  = _pitchStabNode->getBoolValue();
     //string status = "";
     const char* status;
     bool hdg_mkr = true;
@@ -262,15 +265,13 @@ agRadar::update_terrain()
     if (mode == 5){
         status = "TW";
         hdg_mkr = false;
-        roll_stab   = _Instrument->getBoolValue("terrain-warning/stabilisation/roll", true);
-        pitch_stab  = _Instrument->getBoolValue("terrain-warning/stabilisation/pitch", false);
-        tilt        = _Instrument->getDoubleValue("terrain-warning/tilt", -2);
-        el_limit    = _Instrument->getDoubleValue("terrain-warning/elev-limit-deg", 2);
-        el_step     = _Instrument->getDoubleValue("terrain-warning/elev-step-deg", 1);
-        az_limit    = _Instrument->getDoubleValue("terrain-warning/az-limit-deg", 1);
-        az_step     = _Instrument->getDoubleValue("terrain-warning/az-step-deg", 1.5);
-        max_range   = _Instrument->getDoubleValue("terrain-warning/max-range-m", 4000);
-        min_range   = _Instrument->getDoubleValue("terrain-warning/min-range-m", 250);
+        tilt        = _tiltNode->getDoubleValue();
+        el_limit    = _elevLimitDegNode->getDoubleValue();
+        el_step     = _elevStepDegNode->getDoubleValue();
+        az_limit    = _azLimitDegNode->getDoubleValue();
+        az_step     = _azStepDegNode->getDoubleValue();
+        max_range   = _maxRangeMNode->getDoubleValue();
+        min_range   = _minRangeMNode->getDoubleValue();
     }
 
     _Instrument->setDoubleValue("tilt", tilt);
@@ -297,18 +298,18 @@ agRadar::update_terrain()
             if (distance >= min_range && distance <= max_range) {
                 _terrain_warning_node->setBoolValue(true);
                 getMaterial();
-                _Instrument->setDoubleValue("terrain-warning/hit/brg-deg", course2);
-                _Instrument->setDoubleValue("terrain-warning/hit/range-m", distance);
-                _Instrument->setStringValue("terrain-warning/hit/material", _mat_name.c_str());
-                _Instrument->setDoubleValue("terrain-warning/hit/bumpiness", _bumpinessFactor);
-                _Instrument->setDoubleValue("terrain-warning/hit/elevation-m", _elevation_m);
+                _brgDegNode->setDoubleValue(course2);
+                _rangeMNode->setDoubleValue(distance);
+                _materialNode->setStringValue(_mat_name.c_str());
+                _bumpinessNode->setDoubleValue(_bumpinessFactor);
+                _elevationMNode->setDoubleValue(_elevation_m);
             } else {
                 _terrain_warning_node->setBoolValue(false);
-                _Instrument->setDoubleValue("terrain-warning/hit/brg-deg", 0);
-                _Instrument->setDoubleValue("terrain-warning/hit/range-m", 0);
-                _Instrument->setStringValue("terrain-warning/hit/material", "");
-                _Instrument->setDoubleValue("terrain-warning/hit/bumpiness", 0);
-                _Instrument->setDoubleValue("terrain-warning/hit/elevation-m",0);
+                _brgDegNode->setDoubleValue(0);
+                _rangeMNode->setDoubleValue(0);
+                _materialNode->setStringValue("");
+                _bumpinessNode->setDoubleValue(0);
+                _elevationMNode->setDoubleValue(0);
             }
 
             //cout  << "usr hdg " << _user_hdg_deg_node->getDoubleValue()
index 26907a7fd682df8c47bd313a8316f57d45a33d0f..f5ad02d73ae79a477c29aded63cdfccd43688c0f 100644 (file)
@@ -67,6 +67,27 @@ public:
     SGPropertyNode_ptr _user_pitch_deg_node;
     SGPropertyNode_ptr _terrain_warning_node;
 
+    SGPropertyNode_ptr _xOffsetMNode;
+    SGPropertyNode_ptr _yOffsetMNode;
+    SGPropertyNode_ptr _zOffsetMNode;
+
+    SGPropertyNode_ptr _elevLimitDegNode;
+    SGPropertyNode_ptr _elevStepDegNode;
+    SGPropertyNode_ptr _azLimitDegNode;
+    SGPropertyNode_ptr _azStepDegNode;
+    SGPropertyNode_ptr _maxRangeMNode;
+    SGPropertyNode_ptr _minRangeMNode;
+    SGPropertyNode_ptr _tiltNode;
+
+    SGPropertyNode_ptr _brgDegNode;
+    SGPropertyNode_ptr _rangeMNode;
+    SGPropertyNode_ptr _elevationMNode;
+    SGPropertyNode_ptr _materialNode;
+    SGPropertyNode_ptr _bumpinessNode;
+
+    SGPropertyNode_ptr _rollStabNode;
+    SGPropertyNode_ptr _pitchStabNode;
+
     SGGeod userpos;
     SGGeod hitpos;
     SGGeod antennapos;
index 287ea7e779b35fbddbba564dbbe2866c45104ed3..b7d145724e5ca4dee0a1dbfee513c2203c989c04 100644 (file)
@@ -76,6 +76,11 @@ public:
 
     FGODGauge *_odg;
 
+    // Convenience function for creating a property node with a
+    // default value
+    template<typename DefaultType>
+    SGPropertyNode* getInstrumentNode(const char* name, DefaultType value);
+
 private:
 
     string _texture_path;
@@ -152,4 +157,33 @@ private:
     
 };
 
+template<> inline
+SGPropertyNode* wxRadarBg::getInstrumentNode(const char* name, bool value)
+{
+    SGPropertyNode* result = _Instrument->getNode(name, true);
+    if (result->getType() == SGPropertyNode::NONE)
+        result->setBoolValue(value);
+    return result;
+}
+
+template<> inline
+SGPropertyNode* wxRadarBg::getInstrumentNode(const char* name, double value)
+{
+    SGPropertyNode* result = _Instrument->getNode(name, true);
+    if (result->getType() == SGPropertyNode::NONE)
+        result->setDoubleValue(value);
+    return result;
+}
+
+template<> inline
+SGPropertyNode* wxRadarBg::getInstrumentNode(const char* name,
+                                             const char* value)
+{
+    SGPropertyNode* result = _Instrument->getNode(name, true);
+    if (result->getType() == SGPropertyNode::NONE)
+        result->setStringValue(value);
+    return result;
+}
+
+
 #endif // _INST_WXRADAR_HXX