X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2FFGEventInput.cxx;h=8bf9f304e53bb2be03e22c04bbc1182008b3e78b;hb=d0a2fbba990c07608b813fa026126fe7ce52c552;hp=f47a6161aeae737a35edbbb768c8d88e58d34c25;hpb=5c57153e6233a112fa3aec8fd648a1a7d8743099;p=flightgear.git diff --git a/src/Input/FGEventInput.cxx b/src/Input/FGEventInput.cxx index f47a6161a..8bf9f304e 100644 --- a/src/Input/FGEventInput.cxx +++ b/src/Input/FGEventInput.cxx @@ -24,11 +24,13 @@ # include #endif +#include #include "FGEventInput.hxx" #include
#include -#include -#include +#include + +using simgear::PropertyList; FGEventSetting::FGEventSetting( SGPropertyNode_ptr base ) : value(0.0) @@ -65,7 +67,7 @@ bool FGEventSetting::Test() static inline bool StartsWith( string & s, const char * cp ) { - return s.compare( 0, strlen(cp), cp ) == 0; + return s.find( cp ) == 0; } FGInputEvent * FGInputEvent::NewObject( FGInputDevice * device, SGPropertyNode_ptr node ) @@ -75,10 +77,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 ); } @@ -91,12 +93,11 @@ FGInputEvent::FGInputEvent( FGInputDevice * aDevice, SGPropertyNode_ptr node ) : name = node->getStringValue( "name", "" ); desc = node->getStringValue( "desc", "" ); intervalSec = node->getDoubleValue("interval-sec",0.0); - string module = "event"; - read_bindings( node, bindings, KEYMOD_NONE, module ); + 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 ) ); } @@ -123,18 +124,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); @@ -147,13 +155,42 @@ 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 ) : FGInputEvent( device, node ), - lastState(false), - repeatable(false) + repeatable(false), + lastState(false) { repeatable = node->getBoolValue("repeatable", repeatable); } @@ -181,8 +218,51 @@ void FGButtonEvent::fire( FGEventData & eventData ) FGInputDevice::~FGInputDevice() { + FGNasalSys *nas = (FGNasalSys *)globals->get_subsystem("nasal"); + if (nas && deviceNode ) { + SGPropertyNode_ptr nasal = deviceNode->getNode("nasal"); + if( nasal ) { + SGPropertyNode_ptr nasalClose = nasal->getNode("close"); + if (nasalClose) { + const string s = nasalClose->getStringValue(); + nas->createModule(nasalModule.c_str(), nasalModule.c_str(), s.c_str(), s.length(), deviceNode ); + } + } + nas->deleteModule(nasalModule.c_str()); + } } +void FGInputDevice::Configure( SGPropertyNode_ptr aDeviceNode ) +{ + deviceNode = aDeviceNode; + + nasalModule = string("__event:") + GetName(); + + 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 ); + grab = deviceNode->getBoolValue("grab", grab ); + + // TODO: + // add nodes for the last event: + // last-event/name [string] + // last-event/value [double] + + SGPropertyNode_ptr nasal = deviceNode->getNode("nasal"); + if (nasal) { + SGPropertyNode_ptr open = nasal->getNode("open"); + if (open) { + const string s = open->getStringValue(); + FGNasalSys *nas = (FGNasalSys *)globals->get_subsystem("nasal"); + if (nas) + nas->createModule(nasalModule.c_str(), nasalModule.c_str(), s.c_str(), s.length(), deviceNode ); + } + } + +} + void FGInputDevice::update( double dt ) { for( map::iterator it = handledEvents.begin(); it != handledEvents.end(); it++ ) @@ -192,7 +272,10 @@ void FGInputDevice::update( double dt ) void FGInputDevice::HandleEvent( FGEventData & eventData ) { string eventName = TranslateEventName( eventData ); -// cout << GetName() << " has event " << eventName << " modifiers=" << eventData.modifiers << " value=" << eventData.value << endl; + if( debugEvents ) + cout << GetName() << " has event " << + eventName << " modifiers=" << eventData.modifiers << " value=" << eventData.value << endl; + if( handledEvents.count( eventName ) > 0 ) { handledEvents[ eventName ]->fire( eventData ); } @@ -220,7 +303,7 @@ FGEventInput::~FGEventInput() void FGEventInput::init( ) { SG_LOG(SG_INPUT, SG_DEBUG, "Initializing event bindings"); - SGPropertyNode * base = fgGetNode("/input/event", true); +// SGPropertyNode * base = fgGetNode("/input/event", true); } @@ -235,7 +318,7 @@ void FGEventInput::update( double dt ) (*it).second->update( dt ); } -void FGEventInput::AddDevice( FGInputDevice * inputDevice ) +unsigned FGEventInput::AddDevice( FGInputDevice * inputDevice ) { SGPropertyNode_ptr baseNode = fgGetNode( PROPERTY_ROOT, true ); SGPropertyNode_ptr deviceNode = NULL; @@ -246,13 +329,13 @@ void FGEventInput::AddDevice( FGInputDevice * inputDevice ) // find a free index unsigned index; - for( index = 0; index < 1000; index++ ) + for( index = 0; index < MAX_DEVICES; index++ ) if( (deviceNode = baseNode->getNode( "device", index, false ) ) == NULL ) break; - if( index == 1000 ) { + if( index == MAX_DEVICES ) { SG_LOG(SG_INPUT, SG_WARN, "To many event devices - ignoring " << inputDevice->GetName() ); - return; + return INVALID_DEVICE_INDEX; } // create this node @@ -260,23 +343,17 @@ void FGEventInput::AddDevice( FGInputDevice * inputDevice ) // and copy the properties from the configuration tree copyProperties( configMap[ inputDevice->GetName() ], deviceNode ); + } if( deviceNode == NULL ) { SG_LOG(SG_INPUT, SG_DEBUG, "No configuration found for device " << inputDevice->GetName() ); delete inputDevice; - return; + return INVALID_DEVICE_INDEX; } - vector eventNodes = deviceNode->getChildren( "event" ); - for( vector::iterator it = eventNodes.begin(); it != eventNodes.end(); it++ ) - inputDevice->AddHandledEvent( FGInputEvent::NewObject( inputDevice, *it ) ); + inputDevice->Configure( deviceNode ); - // TODO: - // add nodes for the last event: - // last-event/name [string] - // last-event/value [double] - try { inputDevice->Open(); input_devices[ deviceNode->getIndex() ] = inputDevice; @@ -284,7 +361,25 @@ void FGEventInput::AddDevice( FGInputDevice * inputDevice ) catch( ... ) { delete inputDevice; SG_LOG(SG_INPUT, SG_ALERT, "can't open InputDevice " << inputDevice->GetName() ); + return INVALID_DEVICE_INDEX; } SG_LOG(SG_INPUT, SG_DEBUG, "using InputDevice " << inputDevice->GetName() ); + return deviceNode->getIndex(); } + +void FGEventInput::RemoveDevice( unsigned index ) +{ + // not fully implemented yet + SGPropertyNode_ptr baseNode = fgGetNode( PROPERTY_ROOT, true ); + SGPropertyNode_ptr deviceNode = NULL; + + FGInputDevice *inputDevice = input_devices[index]; + if (inputDevice) { + input_devices.erase(index); + delete inputDevice; + + } + deviceNode = baseNode->removeChild("device", index, false); +} +