From: curt Date: Tue, 6 Mar 2001 23:59:08 +0000 (+0000) Subject: Patch from Tony so the FDM can trim out a specific starting location for a X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=b1ade68b616e8a546e982d41363d16314aa1f280;p=flightgear.git Patch from Tony so the FDM can trim out a specific starting location for a joystick input, and then will ignore the actual position of that input until the user places it in the proper position to match the trimmed position. At that point the joystick input captures control over the value and the value will match the joystick position from then on. This is primarily set up so that the FDM can trim in an initial throttle position. --- diff --git a/src/Joystick/joystick.cxx b/src/Joystick/joystick.cxx index fd8b29c59..1f952a149 100644 --- a/src/Joystick/joystick.cxx +++ b/src/Joystick/joystick.cxx @@ -76,17 +76,35 @@ static const char * buttonNames[] = { }; +/** + * trim capture + */ +struct trimcapture { + float tolerance; + bool captured; + string name; + SGValue* value; +}; + + /** * Settings for a single axis. */ struct axis { - axis () : value(0), offset(0.0), factor(1.0), - last_value(9999999), tolerance(0.002) {} + axis () : + value(0), + offset(0.0), + factor(1.0), + last_value(9999999), + tolerance(0.002), + capture(NULL) + { } SGValue * value; float offset; float factor; float last_value; float tolerance; + trimcapture* capture; }; @@ -136,6 +154,8 @@ struct joystick { */ static joystick joysticks[MAX_JOYSTICKS]; +SGValue *trimmed; + /** * Initialize any joysticks found. @@ -277,6 +297,28 @@ fgJoystickInit() if (value != 0) center[j] = value->getDoubleValue(); FG_LOG(FG_INPUT, FG_INFO, " center is " << center[j]); + + // Capture + name = base; + name += "/capture"; + value = fgGetValue(name); + if ( value != 0 ) { + string trimname = "/fdm/trim" + + control.substr(control.rfind("/"),control.length()); + if ( fgHasValue(trimname) ) { + a.capture = new trimcapture; + a.capture->tolerance = value->getDoubleValue(); + a.capture->captured = false; + a.capture->name = control; + a.capture->value = fgGetValue(trimname); + FG_LOG(FG_INPUT, FG_INFO, " capture is " + << value->getDoubleValue() ); + } else { + a.capture = NULL; + FG_LOG(FG_INPUT, FG_INFO, " capture is " + << "unsupported by FDM" ); + } + } } @@ -357,6 +399,8 @@ fgJoystickInit() delete center; } + trimmed = fgGetValue("/fdm/trim/trimmed"); + if (seen_joystick) FG_LOG(FG_INPUT, FG_INFO, "Done initializing joysticks"); else @@ -373,6 +417,7 @@ int fgJoystickRead() { int buttons; + float js_val, diff; float *axis_values = new float[MAX_AXES]; for (int i = 0; i < MAX_JOYSTICKS; i++) { @@ -392,16 +437,40 @@ fgJoystickRead() bool flag = true; axis &a = joysticks[i].axes[j]; + if ( a.capture && trimmed->getBoolValue() ) { + // if the model has been trimmed then capture the + // joystick. When a trim succeeds, the above + // is true for one frame only. + a.capture->captured = false; + FG_LOG( FG_GENERAL, FG_INFO, "Successful trim, capture is " << + "enabled on " << a.capture->name ); + } + // If the axis hasn't changed, don't // force the value. if (fabs(axis_values[j] - a.last_value) <= a.tolerance) continue; else a.last_value = axis_values[j]; - - if (a.value) - flag = a.value->setDoubleValue((axis_values[j] + a.offset) * - a.factor); + + if ( a.value ) { + js_val = ( axis_values[j] + a.offset ) * a.factor; + + if ( a.capture && !a.capture->captured ) { + diff = js_val - a.capture->value->getDoubleValue(); + FG_LOG( FG_GENERAL, FG_INFO, a.capture->name + << " capture: " << diff ); + if ( fabs( diff ) < a.capture->tolerance ) { + flag = a.value->setDoubleValue( js_val ); + a.capture->captured = true; + FG_LOG(FG_GENERAL,FG_INFO, a.capture->name + << " captured." ); + } + } else { + flag = a.value->setDoubleValue( js_val ); + } + } + if (!flag) FG_LOG(FG_INPUT, FG_ALERT, "Failed to set value for joystick " << i << ", axis " << j);