X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2FFGEventInput.cxx;h=31e6fc9788361ad78d313e1e13c067dd798194b9;hb=0d0751e37c71dd1e8c20d499036a551390ee5487;hp=6ac1dd4af642b67c80877defd75664de973d45ca;hpb=a6db6d89ff41a619569e6433409e8bf62ff98499;p=flightgear.git diff --git a/src/Input/FGEventInput.cxx b/src/Input/FGEventInput.cxx index 6ac1dd4af..31e6fc978 100644 --- a/src/Input/FGEventInput.cxx +++ b/src/Input/FGEventInput.cxx @@ -29,6 +29,8 @@ #include #include +using simgear::PropertyList; + FGEventSetting::FGEventSetting( SGPropertyNode_ptr base ) : value(0.0) { @@ -74,10 +76,10 @@ FGInputEvent * FGInputEvent::NewObject( FGInputDevice * device, SGPropertyNode_p return new FGButtonEvent( device, node ); if( StartsWith( name, "rel-" ) ) - return new FGAxisEvent( device, node ); + return new FGRelAxisEvent( device, node ); if( StartsWith( name, "abs-" ) ) - return new FGAxisEvent( device, node ); + return new FGAbsAxisEvent( device, node ); return new FGInputEvent( device, node ); } @@ -93,8 +95,8 @@ FGInputEvent::FGInputEvent( FGInputDevice * aDevice, SGPropertyNode_ptr node ) : read_bindings( node, bindings, KEYMOD_NONE, device->GetNasalModule() ); - vector settingNodes = node->getChildren("setting"); - for( vector::iterator it = settingNodes.begin(); it != settingNodes.end(); it++ ) + PropertyList settingNodes = node->getChildren("setting"); + for( PropertyList::iterator it = settingNodes.begin(); it != settingNodes.end(); it++ ) settings.push_back( new FGEventSetting( *it ) ); } @@ -121,18 +123,25 @@ void FGInputEvent::fire( FGEventData & eventData ) if( lastDt >= intervalSec ) { for( binding_list_t::iterator it = bindings[eventData.modifiers].begin(); it != bindings[eventData.modifiers].end(); it++ ) - (*it)->fire( eventData.value, 1.0 ); + fire( *it, eventData ); lastDt -= intervalSec; } } +void FGInputEvent::fire( SGBinding * binding, FGEventData & eventData ) +{ + binding->fire(); +} + + + FGAxisEvent::FGAxisEvent( FGInputDevice * device, SGPropertyNode_ptr node ) : FGInputEvent( device, node ) { tolerance = node->getDoubleValue("tolerance", 0.002); - minRange = node->getDoubleValue("min-range", -1024.0); - maxRange = node->getDoubleValue("max-range", 1024.0); + minRange = node->getDoubleValue("min-range", 0.0 ); + maxRange = node->getDoubleValue("max-range", 0.0 ); center = node->getDoubleValue("center", 0.0); deadband = node->getDoubleValue("dead-band", 0.0); lowThreshold = node->getDoubleValue("low-threshold", -0.9); @@ -145,7 +154,36 @@ void FGAxisEvent::fire( FGEventData & eventData ) if (fabs( eventData.value - lastValue) < tolerance) return; lastValue = eventData.value; - FGInputEvent::fire( eventData ); + + // We need a copy of the FGEventData struct to set the new value and to avoid side effects + FGEventData ed = eventData; + + if( fabs(ed.value) < deadband ) + ed.value = 0.0; + + if( minRange != maxRange ) + ed.value = 2.0*(eventData.value-minRange)/(maxRange-minRange)-1.0; + + FGInputEvent::fire( ed ); +} + +void FGAbsAxisEvent::fire( SGBinding * binding, FGEventData & eventData ) +{ + // sets the "setting" node + binding->fire( eventData.value ); +} + +FGRelAxisEvent::FGRelAxisEvent( FGInputDevice * device, SGPropertyNode_ptr node ) : + FGAxisEvent( device, node ) +{ + // relative axes can't use tolerance + tolerance = 0.0; +} + +void FGRelAxisEvent::fire( SGBinding * binding, FGEventData & eventData ) +{ + // sets the "offset" node + binding->fire( eventData.value, 1.0 ); } FGButtonEvent::FGButtonEvent( FGInputDevice * device, SGPropertyNode_ptr node ) : @@ -199,8 +237,8 @@ void FGInputDevice::Configure( SGPropertyNode_ptr aDeviceNode ) nasalModule = string("__event:") + GetName(); - vector eventNodes = deviceNode->getChildren( "event" ); - for( vector::iterator it = eventNodes.begin(); it != eventNodes.end(); it++ ) + PropertyList eventNodes = deviceNode->getChildren( "event" ); + for( PropertyList::iterator it = eventNodes.begin(); it != eventNodes.end(); it++ ) AddHandledEvent( FGInputEvent::NewObject( this, *it ) ); debugEvents = deviceNode->getBoolValue("debug-events", debugEvents );