]> git.mxchange.org Git - flightgear.git/blobdiff - src/Network/ATC-Inputs.cxx
Fix for bug 1304 - crash loading XML route
[flightgear.git] / src / Network / ATC-Inputs.cxx
index 4d8a02c928b1557334935545aa4ad8ba8ea3d2bb..be59770f89fda441e7f2b9bdc8a26da1acfe0afd 100644 (file)
 #  include <sys/types.h>
 #  include <sys/stat.h>
 #  include <fcntl.h>
+#  include <stdlib.h>
 #  include <unistd.h>
 #  include <istream>
 #endif
 
 #include <errno.h>
 #include <math.h>
+#include <cstdio>
 
-#include STL_STRING
+#include <string>
 
 #include <simgear/debug/logstream.hxx>
 #include <simgear/misc/sg_path.hxx>
+#include <simgear/props/props_io.hxx>
 
 #include <Main/fg_props.hxx>
 
 #include "ATC-Inputs.hxx"
 
-SG_USING_STD(string);
-
+using std::string;
+using std::vector;
 
 
 // Constructor: The _board parameter specifies which board to
@@ -414,11 +417,12 @@ bool FGATCInput::do_analog_in() {
             string name = "";
             string type = "";
             string subtype = "";
-            vector <SGPropertyNode *> output_nodes; output_nodes.clear();
+            vector <SGPropertyNode *> output_nodes;
             int center = -1;
             int min = 0;
             int max = 1023;
            int deadband = 0;
+           int hysteresis = 0;
             float offset = 0.0;
             float factor = 1.0;
             if ( cname == "channel" ) {
@@ -458,6 +462,10 @@ bool FGATCInput::do_analog_in() {
                 if ( prop != NULL ) {
                     deadband = prop->getIntValue();
                 }
+                prop = child->getChild( "hysteresis" );
+                if ( prop != NULL ) {
+                    hysteresis = prop->getIntValue();
+                }
                 prop = child->getChild( "offset" );
                 if ( prop != NULL ) {
                     offset = prop->getFloatValue();
@@ -482,6 +490,22 @@ bool FGATCInput::do_analog_in() {
                     {
                         // "Cook" the raw value
                         float scaled_value = 0.0f;
+
+                       if ( hysteresis > 0 ) {
+                           int last_raw_value = 0;
+                           prop = child->getChild( "last-raw-value", 0, true );
+                           last_raw_value = prop->getIntValue();
+
+                           if ( abs(raw_value - last_raw_value) < hysteresis )
+                           {
+                               // not enough movement stay put
+                               raw_value = last_raw_value;
+                           } else {
+                               // update last raw value
+                               prop->setIntValue( raw_value );
+                           }
+                       }
+
                         if ( center >= 0 ) {
                             scaled_value = scale( center, deadband,
                                                  min, max, raw_value );
@@ -637,9 +661,13 @@ static void update_switch_matrix(
        unsigned char switches = switch_data[row];
 
        for( int column = 0; column < ATC_NUM_COLS; ++column ) {
-           switch_matrix[board][column][row] = switches & 1;
-           switches = switches >> 1;
-       }                       
+            if ( row < 8 ) {
+                switch_matrix[board][column][row] = switches & 1;
+            } else {
+                switch_matrix[board][row-8][8+column] = switches & 1;
+            }
+            switches = switches >> 1;
+        }
     }
 }                     
 
@@ -660,7 +688,7 @@ bool FGATCInput::do_switches() {
             string cname = child->getName();
             string name = "";
             string type = "";
-            vector <SGPropertyNode *> output_nodes; output_nodes.clear();
+            vector <SGPropertyNode *> output_nodes;
             int row = -1;
             int col = -1;
             float factor = 1.0;
@@ -863,7 +891,7 @@ bool FGATCInput::do_radio_switches() {
             if ( cname == "switch" ) {
                 string name = "";
                 string type = "";
-                vector <SGPropertyNode *> output_nodes; output_nodes.clear();
+                vector <SGPropertyNode *> output_nodes;
                 int byte_num = -1;
                 int right_shift = 0;
                 int mask = 0xff;