X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2FATC-Inputs.cxx;h=be59770f89fda441e7f2b9bdc8a26da1acfe0afd;hb=b0dcb657e77579ecc79798ff365737095f96f9e2;hp=4c6164928d1474ce6b6f41727b17a821975f56d2;hpb=c1f250fd3340acb6b74603ba71771b441d7e7bb3;p=flightgear.git diff --git a/src/Network/ATC-Inputs.cxx b/src/Network/ATC-Inputs.cxx index 4c6164928..be59770f8 100644 --- a/src/Network/ATC-Inputs.cxx +++ b/src/Network/ATC-Inputs.cxx @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -31,24 +31,27 @@ # include # include # include +# include # include # include #endif #include #include +#include -#include STL_STRING +#include #include #include +#include #include
#include "ATC-Inputs.hxx" -SG_USING_STD(string); - +using std::string; +using std::vector; // Constructor: The _board parameter specifies which board to @@ -268,6 +271,18 @@ static double scale( int min, int max, int value ) { } +static double clamp( double min, double max, double value ) { + double result = value; + + if ( result < min ) result = min; + if ( result > max ) result = max; + + // cout << result << endl; + + return result; +} + + static int tony_magic( int raw, int obs[3] ) { int result = 0; @@ -402,11 +417,13 @@ bool FGATCInput::do_analog_in() { string name = ""; string type = ""; string subtype = ""; - vector output_nodes; output_nodes.clear(); + vector 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" ) { SGPropertyNode *prop; @@ -445,6 +462,14 @@ 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(); + } prop = child->getChild( "factor" ); if ( prop != NULL ) { factor = prop->getFloatValue(); @@ -465,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 ); @@ -472,6 +513,14 @@ bool FGATCInput::do_analog_in() { scaled_value = scale( min, max, raw_value ); } scaled_value *= factor; + scaled_value += offset; + + // final sanity clamp + if ( center >= 0 ) { + scaled_value = clamp( -1.0, 1.0, scaled_value ); + } else { + scaled_value = clamp( 0.0, 1.0, scaled_value ); + } // update the property tree values for ( j = 0; j < (int)output_nodes.size(); ++j ) { @@ -488,6 +537,14 @@ bool FGATCInput::do_analog_in() { scaled_value = scale( min, max, raw_value ); } scaled_value *= factor; + scaled_value += offset; + + // final sanity clamp + if ( center >= 0 ) { + scaled_value = clamp( -1.0, 1.0, scaled_value ); + } else { + scaled_value = clamp( 0.0, 1.0, scaled_value ); + } // update the property tree values for ( j = 0; j < (int)output_nodes.size(); ++j ) { @@ -604,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; + } } } @@ -627,7 +688,7 @@ bool FGATCInput::do_switches() { string cname = child->getName(); string name = ""; string type = ""; - vector output_nodes; output_nodes.clear(); + vector output_nodes; int row = -1; int col = -1; float factor = 1.0; @@ -830,7 +891,7 @@ bool FGATCInput::do_radio_switches() { if ( cname == "switch" ) { string name = ""; string type = ""; - vector output_nodes; output_nodes.clear(); + vector output_nodes; int byte_num = -1; int right_shift = 0; int mask = 0xff;