#include <simgear/io/sg_file.hxx>
#include <Scripting/NasalSys.hxx>
+using simgear::PropertyList;
+
FGEventSetting::FGEventSetting( SGPropertyNode_ptr base ) :
value(0.0)
{
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 );
}
read_bindings( node, bindings, KEYMOD_NONE, device->GetNasalModule() );
- vector<SGPropertyNode_ptr> settingNodes = node->getChildren("setting");
- for( vector<SGPropertyNode_ptr>::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 ) );
}
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);
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 ) :
nasalModule = string("__event:") + GetName();
- vector<SGPropertyNode_ptr> eventNodes = deviceNode->getChildren( "event" );
- for( vector<SGPropertyNode_ptr>::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 );