1
0
Fork 0
fgdata/Input/Joysticks/ThrustMaster/Warthog/Warthog-Throttle.xml
Melchior FRANZ 7d9ea536f7 warthog: first stab at throttle hardware config (backlight + LEDs)
This works under Linux only, which is certainly suboptimal. But there's no
reason why support for other OSes couldn't be added later, and there's no
reason to not support Linux now, either. The code can set the throttle's
backlight brightness and the five programmable LEDs. As a demonstration,
the latter is currently used for a gear-down warning. Support for setting
the stick's hardware deadzone is planned. (It's on by default.)

The mechanism writes directly to Linux' hidraw devices, which requires
some simple configuration. This is described in the README. It doesn't
depend on any external utility.
2011-10-02 21:56:28 +02:00

538 lines
12 KiB
XML

<?xml version="1.0"?>
<!--
Copyright (c) 2011 Melchior FRANZ mfranz # aon : at
This driver supports joystick overlay files (see ./Warthog/README).
-->
<PropertyList>
<name>Thrustmaster Throttle - HOTAS Warthog</name>
<nasal>
<script>
var this = cmdarg().getParent();
var init = !contains(caller(0)[0], "init");
if (!contains(globals, "warthog"))
io.load_nasal(getprop("/sim/fg-root") ~ "/Input/Joysticks/ThrustMaster/Warthog/warthog.nas");
var jslistener = func init and call(setlistener, arg);
var popup = func gui.popupTip(call(sprintf, arg));
var is_helicopter = (func {(var n = props.globals.getNode("rotors", 0)) != nil and n.getAttribute("children")})();
var aircraft_type = getprop("/sim/type");
var overlay = getprop("/input/joysticks/overlay");
var load_overlay = func(name) {
foreach (var dir; [getprop("/sim/fg-home"), getprop("/sim/fg-root")]) {
var file = dir ~ "/Input/Joysticks/ThrustMaster/Warthog/Throttle/" ~ name ~ ".xml";
if (io.stat(file) != nil) {
printlog("info", "WARTHOG: loading overlay " ~ file);
cmdarg().setValues({command: "nasal", script: ""});
io.read_properties(file, this);
props.runBinding(cmdarg());
break;
}
}
}
foreach (var b; this.getChildren("button")) {
if (b.getAttribute("children") == 1) {
var name = b.getNode("name", 1).getValue() or "??";
b.setValues({binding: {command: "nasal", script: 'popup("' ~ name ~ '")'}});
}
}
var gearcheck = func {
var agl = getprop("/position/altitude-agl-ft");
var geardown = getprop("/controls/gear/gear-down");
if (agl &lt; 500 and !geardown)
warthog.throttle.toggle_leds(1, 2, 3, 4, 5);
else
warthog.throttle.set_leds(0, 1, 2, 3, 4, 5);
settimer(gearcheck, 0.5);
};
init and gearcheck();
var mod = 0;
var m = props.globals.initNode("/devices/status/joysticks/warthog/modifier", mod, "INT");
jslistener(m, func(n) mod = n.getValue());
var left_engines = [0, 2, 4, 6, 8, 10];
var right_engines = [1, 3, 5, 7, 9, 11];
load_overlay("generic");
if (is_helicopter)
load_overlay("helicopter");
if (aircraft_type)
load_overlay(aircraft_type);
if (overlay)
load_overlay(overlay);
load_overlay(getprop("/sim/aircraft"));
</script>
</nasal>
<axis n="0">
<name>Mouse Horizontal</name>
</axis>
<axis n="1">
<name>Mouse Vertical</name>
</axis>
<axis n="2">
<name>Right Throttle</name>
<desc>right throttle</desc>
<tolerance>0.00001</tolerance>
<binding>
<command>nasal</command>
<script>controls.perEngineSelectedAxisHandler(0)(right_engines)</script>
</binding>
</axis>
<axis n="3">
<name>Left Throttle</name>
<desc>left throttle</desc>
<number>
<unix>3</unix>
<mac>3</mac>
<windows>5</windows>
</number>
<tolerance>0.00001</tolerance>
<binding>
<command>nasal</command>
<script>controls.perEngineSelectedAxisHandler(0)(left_engines)</script>
</binding>
</axis>
<axis n="4">
<name>Friction Wheel</name>
<desc>rudder trim</desc>
<number>
<unix>4</unix>
<mac>4</mac>
<windows>6</windows>
</number>
<binding>
<command>property-scale</command>
<property>/controls/flight/rudder-trim</property>
<factor type="double">-1</factor>
<power type="int">2</power>
</binding>
</axis>
<axis n="5">
<name>Hat Switch Horizontal</name>
<desc>adjust mixture: left = leaner, right = fatter</desc>
<number>
<unix>5</unix>
<mac>5</mac>
<windows>3</windows>
</number>
<low>
<repeatable>true</repeatable>
<binding>
<command>nasal</command>
<script>controls.adjMixture(-1)</script>
</binding>
</low>
<high>
<repeatable>true</repeatable>
<binding>
<command>nasal</command>
<script>controls.adjMixture(1)</script>
</binding>
</high>
</axis>
<axis n="6">
<name>Hat Switch Vertical</name>
<desc>adjust propeller pitch: forward = increase, backward = decrease</desc>
<number>
<unix>6</unix>
<mac>6</mac>
<windows>4</windows>
</number>
<low>
<repeatable>true</repeatable>
<binding>
<command>nasal</command>
<script>controls.adjPropeller(1)</script>
</binding>
</low>
<high>
<repeatable>true</repeatable>
<binding>
<command>nasal</command>
<script>controls.adjPropeller(-1)</script>
</binding>
</high>
</axis>
<button n="0">
<name>Mouse Button</name>
</button>
<button n="1">
<name>MIC Switch Push</name>
<desc>Push To Talk (PTT)</desc>
<binding>
<command>nasal</command>
<script>controls.ptt(1)</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>controls.ptt(0)</script>
</binding>
</mod-up>
</button>
<button n="2">
<name>MIC Switch Up</name>
</button>
<button n="3">
<name>MIC Switch Forward</name>
</button>
<button n="4">
<name>MIC Switch Down</name>
</button>
<button n="5">
<name>MIC Switch Aft</name>
</button>
<button n="6">
<name>Speedbrake Forward (right throttle, top grey)</name>
<desc>apply speed brake</desc>
<binding>
<command>property-assign</command>
<property>/controls/flight/speedbrake</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>/controls/flight/speedbrake</property>
<value>0</value>
</binding>
</mod-up>
</button>
<button n="7">
<name>Speedbrake Aft</name>
</button>
<button n="8">
<name>Boat Switch Forward</name>
</button>
<button n="9">
<name>Boat Switch Aft</name>
<desc>apply thrust reverser</desc>
<binding>
<command>nasal</command>
<script>props.setAll("/controls/engines/engine", "reverser", 1)</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>props.setAll("/controls/engines/engine", "reverser", 0)</script>
</binding>
</mod-up>
</button>
<button n="10">
<name>China Hat Forward</name>
<desc>+mod: increase LED brightness (see README)</desc>
<binding>
<command>nasal</command>
<script>
if (mod)
warthog.throttle.brighter();
</script>
</binding>
</button>
<button n="11">
<name>China Hat Aft</name>
<desc>+mod: decrease LED brightness (see README)</desc>
<binding>
<command>nasal</command>
<script>
if (mod)
warthog.throttle.darker();
</script>
</binding>
</button>
<button n="12">
<name>Pinky Switch Forward</name>
</button>
<button n="13">
<name>Pinky Switch Aft</name>
</button>
<button n="14">
<name>Left Throttle Button</name>
</button>
<button n="15">
<name>Engine Fuel Flow Left</name>
<desc>engine fuel flow left</desc>
<binding>
<command>nasal</command>
<script>
foreach (var i; left_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/fuel-pump", 1);
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
foreach (var i; left_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/fuel-pump", 0);
</script>
</binding>
</mod-up>
</button>
<button n="16">
<name>Engine Fuel Flow Right</name>
<desc>engine fuel flow right</desc>
<binding>
<command>nasal</command>
<script>
foreach (var i; right_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/fuel-pump", 1);
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
foreach (var i; right_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/fuel-pump", 0);
</script>
</binding>
</mod-up>
</button>
<button n="17">
<name>Engine Operate Left MOTOR</name>
<desc>engine operate left motor (magnetos)</desc>
<binding>
<command>nasal</command>
<script>
foreach (var i; left_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/magnetos", 1);
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
foreach (var i; left_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/magnetos", 0);
</script>
</binding>
</mod-up>
</button>
<button n="18">
<name>Engine Operate Right MOTOR</name>
<desc>engine operate right motor (magnetos)</desc>
<binding>
<command>nasal</command>
<script>
foreach (var i; right_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/magnetos", 1);
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
foreach (var i; right_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/magnetos", 0);
</script>
</binding>
</mod-up>
</button>
<button n="19">
<name>APU Start</name>
<desc>APU (auxiliary power unit) on/off</desc>
<binding>
<command>property-assign</command>
<property>/controls/electric/APU-generator</property>
<value>1</value>
</binding>
<mod-up>
<binding>
<command>property-assign</command>
<property>/controls/electric/APU-generator</property>
<value>0</value>
</binding>
</mod-up>
</button>
<button n="20">
<name>Landing Gear Horn Silence</name>
<desc>gear up, +mod: gear down</desc>
<binding>
<command>nasal</command>
<script>controls.gearDown(mod ? 1 : -1)</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>controls.gearDown(0)</script>
</binding>
</mod-up>
</button>
<button n="21">
<name>Flaps Up</name>
<desc>flaps up</desc>
<binding>
<command>nasal</command>
<script>controls.flapsDown(-1)</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>controls.flapsDown(0)</script>
</binding>
</mod-up>
</button>
<button n="22">
<name>Flaps Down</name>
<desc>flaps down</desc>
<binding>
<command>nasal</command>
<script>controls.flapsDown(1)</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>controls.flapsDown(0)</script>
</binding>
</mod-up>
</button>
<button n="23">
<name>EAC Switch</name>
</button>
<button n="24">
<name>RADAR ALT</name>
</button>
<button n="25">
<name>Autopilot (Dis)Engage</name>
</button>
<button n="26">
<name>Autopilot PATH</name>
<binding>
<command>nasal</command>
<script>popup("autopilot path")</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>popup("autopilot alt/hdg")</script>
</binding>
</mod-up>
</button>
<button n="27">
<name>Autopilot ALT</name>
<binding>
<command>nasal</command>
<script>popup("autopilot alt")</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>popup("autopilot alt/hdg")</script>
</binding>
</mod-up>
</button>
<button n="28">
<name>Right Throttle Idle Switch</name>
<desc>right engines cutoff</desc>
<binding>
<command>nasal</command>
<script>
foreach (var i; right_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/cutoff", 1);
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
foreach (var i; right_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/cutoff", 0);
</script>
</binding>
</mod-up>
</button>
<button n="29">
<name>Left Throttle Idle Switch</name>
<desc>left engines cutoff</desc>
<binding>
<command>nasal</command>
<script>
foreach (var i; left_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/cutoff", 1);
</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>
foreach (var i; left_engines)
setprop("/controls/engines/engine[" ~ i ~ "]/cutoff", 0);
</script>
</binding>
</mod-up>
</button>
<button n="30">
<name>Engine Operate Left IGN</name>
<desc>start left engines</desc>
<binding>
<command>nasal</command>
<script>call(controls.startEngine, [1] ~ left_engines)</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>call(controls.startEngine, [0] ~ left_engines)</script>
</binding>
</mod-up>
</button>
<button n="31">
<name>Engine Operate Right IGN</name>
<desc>start right engines</desc>
<binding>
<command>nasal</command>
<script>call(controls.startEngine, [1] ~ right_engines)</script>
</binding>
<mod-up>
<binding>
<command>nasal</command>
<script>call(controls.startEngine, [0] ~ right_engines)</script>
</binding>
</mod-up>
</button>
</PropertyList>