diff --git a/Input/Joysticks/ThrustMaster/Warthog/README b/Input/Joysticks/ThrustMaster/Warthog/README
index aced0ebcf..6e50bc028 100644
--- a/Input/Joysticks/ThrustMaster/Warthog/README
+++ b/Input/Joysticks/ThrustMaster/Warthog/README
@@ -16,9 +16,11 @@ by the contents of property "x":
- generic.xml
- helicopter.xml (only helicopters)
- .xml (some aircraft set this property to "seaplane")
- - .xml (not used by the system; meant to
+ - .xml (not used by the system; meant to
be set on the command line or in wrapper scripts,
- for example: --prop:input/joysticks/overlay=modern_jet)
+ for example: --prop:input/joysticks/overlays=modern_jet;
+ accepts a single overlay file name -- withtout extension --
+ or a list of names separated by colon ":")
- .xml (aircraft name, for example "harrier.xml")
@@ -37,6 +39,15 @@ and variables.
+Standard overlay files:
+- stick_rotate: rotates stick X/Y axis by given angle. Apparently desired
+ by some users who have the stick between their knees and want to move it
+ in a more natural fashion. Usage:
+
+ fgfs --prop:input/joysticks/overlays=stick_rotate --prop:d:input/joysticks/stick-angle=15
+
+
+
Joystick configuration from within FlightGear under Linux:
diff --git a/Input/Joysticks/ThrustMaster/Warthog/Stick/stick_rotate.xml b/Input/Joysticks/ThrustMaster/Warthog/Stick/stick_rotate.xml
new file mode 100644
index 000000000..e467ae1e8
--- /dev/null
+++ b/Input/Joysticks/ThrustMaster/Warthog/Stick/stick_rotate.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+ 0.00001
+
+ nasal
+
+
+
+
+
+ 0.00001
+
+ nasal
+
+
+
+
diff --git a/Input/Joysticks/ThrustMaster/Warthog/Warthog-Stick.xml b/Input/Joysticks/ThrustMaster/Warthog/Warthog-Stick.xml
index 896b6192c..3128b555e 100644
--- a/Input/Joysticks/ThrustMaster/Warthog/Warthog-Stick.xml
+++ b/Input/Joysticks/ThrustMaster/Warthog/Warthog-Stick.xml
@@ -24,7 +24,6 @@
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")]) {
@@ -66,8 +65,8 @@
load_overlay("helicopter");
if (aircraft_type)
load_overlay(aircraft_type);
- if (overlay)
- load_overlay(overlay);
+ foreach (var o; split(":", getprop("/input/joysticks/overlays") or ""))
+ load_overlay(o);
load_overlay(getprop("/sim/aircraft"));
diff --git a/Input/Joysticks/ThrustMaster/Warthog/Warthog-Throttle.xml b/Input/Joysticks/ThrustMaster/Warthog/Warthog-Throttle.xml
index 4df6572b8..f46360c74 100644
--- a/Input/Joysticks/ThrustMaster/Warthog/Warthog-Throttle.xml
+++ b/Input/Joysticks/ThrustMaster/Warthog/Warthog-Throttle.xml
@@ -19,7 +19,6 @@
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")]) {
@@ -65,8 +64,8 @@
load_overlay("helicopter");
if (aircraft_type)
load_overlay(aircraft_type);
- if (overlay)
- load_overlay(overlay);
+ foreach (var o; split(":", getprop("/input/joysticks/overlays") or ""))
+ load_overlay(o);
load_overlay(getprop("/sim/aircraft"));
diff --git a/Input/Joysticks/ThrustMaster/Warthog/warthog.nas b/Input/Joysticks/ThrustMaster/Warthog/warthog.nas
index 56cf3d96a..f67232aba 100644
--- a/Input/Joysticks/ThrustMaster/Warthog/warthog.nas
+++ b/Input/Joysticks/ThrustMaster/Warthog/warthog.nas
@@ -1,61 +1,86 @@
-# Hardware Interface (currently Linux/HIDRAW-only; see README)
+# Hardware Interface (currently Linux/HIDRAW-only)
+# see README and http://members.aon.at/mfranz/warthog.html
+
+
+if (io.stat("/dev/input") != nil and io.stat("/dev/input/hidraw") == nil) {
+ print("warthog: read file $FG_ROOT/Input/Joysticks/ThrustMaster/Warthog/README");
+ print(" for how to enable FlightGear to set backlight and LEDs etc.");
+}
+
var device = {
new: func(path, bufsize) {
var m = { parents: [device] };
m.path = path;
m.bufsize = bufsize;
- m.leds = 0;
- m.bright = 0;
+ m.data = bits.buf(m.bufsize);
var stat = io.stat(m.path);
if (stat == nil or stat[11] != "chr")
- m.send = func { nil };
+ m.send = m.receive = func {};
return m;
},
send: func {
var buf = bits.buf(me.bufsize);
- buf[0] = 1;
forindex (var i; arg)
- buf[i + 1] = arg[i];
+ buf[i] = arg[i];
var file = io.open(me.path, "wb");
io.write(file, buf);
io.close(file);
},
+ receive: func {
+ var file = io.open(me.path, "rb");
+ io.read(file, me.data, me.bufsize);
+ io.close(file);
+ },
};
var joystick = {
parents: [device.new("/dev/input/hidraw/Thustmaster_Joystick_-_HOTAS_Warthog", 12)],
+ init: func {
+ me.receive();
+ },
};
var throttle = {
parents: [device.new("/dev/input/hidraw/Thrustmaster_Throttle_-_HOTAS_Warthog", 36)],
+ init: func {
+ me.receive();
+ me.leds = me.data[26];
+ me.brightness = me.data[27];
+ },
set_leds: func(state, which...) { # on/off, list of leds (0: background, 1-5)
+ var leds = me.leds;
foreach (var w; which)
me.leds = bits.switch(me.leds, me._ledmap[w], state);
- me.send(6, me.leds, me.bright);
+ if (me.leds != leds)
+ me.send(1, 6, me.leds, me.brightness);
},
toggle_leds: func(which...) {
foreach (var w; which)
me.leds = bits.toggle(me.leds, me._ledmap[w]);
- me.send(6, me.leds, me.bright);
+ me.send(1, 6, me.leds, me.brightness);
},
set_brightness: func(v) { # clamped to [0,5], where 0 is off and 5 is bright
- me.send(6, me.leds, me.bright = v < 0 ? 0 : v > 5 ? 5 : v);
+ if (v != me.brightness)
+ me.send(1, 6, me.leds, me.brightness = v < 0 ? 0 : v > 5 ? 5 : v);
},
brighter: func {
me.leds = bits.set(me.leds, me._ledmap[0]);
- me.set_brightness(me.bright + 1);
+ me.set_brightness(me.brightness + 1);
},
darker: func {
me.leds = bits.set(me.leds, me._ledmap[0]);
- me.set_brightness(me.bright - 1);
+ me.set_brightness(me.brightness - 1);
},
_ledmap: {0: 3, 1: 2, 2: 1, 3: 4, 4: 0, 5: 6},
};
-throttle.set_brightness(1); # LEDs dark (but on)
-throttle.set_leds(1, 0); # backlight on
+joystick.init();
+throttle.init(); # read configuration
+
+throttle.set_brightness(1); # LEDs dark (but on)
+throttle.set_leds(1, 0); # backlight on
setlistener("/sim/signals/exit", func throttle.set_leds(0, 1, 2, 3, 4, 5), 1); # other LEDs off (now and at exit)
diff --git a/Textures/Runway/pa_shoulder.dds b/Textures/Runway/pa_shoulder.dds
new file mode 100644
index 000000000..9c9d48154
Binary files /dev/null and b/Textures/Runway/pa_shoulder.dds differ
diff --git a/Textures/Runway/pa_shoulder_f.dds b/Textures/Runway/pa_shoulder_f.dds
new file mode 100644
index 000000000..876baf0dc
Binary files /dev/null and b/Textures/Runway/pa_shoulder_f.dds differ
diff --git a/Textures/Runway/pc_shoulder.dds b/Textures/Runway/pc_shoulder.dds
new file mode 100644
index 000000000..527e68d87
Binary files /dev/null and b/Textures/Runway/pc_shoulder.dds differ
diff --git a/Textures/Runway/pc_shoulder_f.dds b/Textures/Runway/pc_shoulder_f.dds
new file mode 100644
index 000000000..d1378e93c
Binary files /dev/null and b/Textures/Runway/pc_shoulder_f.dds differ
diff --git a/materials-dds.xml b/materials-dds.xml
index a60f7481c..74749307d 100644
--- a/materials-dds.xml
+++ b/materials-dds.xml
@@ -175,6 +175,18 @@ Shared parameters for various materials.
false
+
+ pa_shoulder
+ Runway/pa_shoulder.dds
+ 5
+
+
+
+ pa_shoulder_f
+ Runway/pa_shoulder_f.dds
+ 5
+
+
pa_threshold
Runway/pa_threshold.dds
@@ -422,6 +434,18 @@ Shared parameters for various materials.
false
+
+ pc_shoulder
+ Runway/pc_shoulder.dds
+ 5
+
+
+
+ pc_shoulder_f
+ Runway/pc_shoulder_f.dds
+ 5
+
+
pc_threshold
dirt_rwythreshold
diff --git a/materials.xml b/materials.xml
index e74fbef28..002323dab 100644
--- a/materials.xml
+++ b/materials.xml
@@ -335,6 +335,18 @@ Shared parameters for various materials.
false
+
+ pa_shoulder
+ Runway/pa_shoulder.dds
+ 5
+
+
+
+ pa_shoulder_f
+ Runway/pa_shoulder_f.dds
+ 5
+
+
pa_threshold
Runway/pa_threshold.png
@@ -600,6 +612,18 @@ Shared parameters for various materials.
false
+
+ pc_shoulder
+ Runway/pc_shoulder.dds
+ 5
+
+
+
+ pc_shoulder_f
+ Runway/pc_shoulder_f.dds
+ 5
+
+
pc_threshold
dirt_rwythreshold