<?xml version="1.0"?> <!-- Joystick binding for ThrustMaster T.Flight Hotas X Adrien Bailly Original file by 'flug': http://www.flightgear.org/forums/viewtopic.php?f=2&t=5517 Axis # (direction) mapped to ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ axis 0: (left-right) aileron axis 1: (forward-backward) elevator axis 2: (slider) throttle axis 3: (twist) rudder axis 4: (top hat) view left/right Note that internally, FG numbers buttons starting with 0. The markings on the HOTAS-X start with Button 1, and I have used the HOTAS-X number markings below: Button # Location Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ button 1: (joystick R1) Brakes & reset view button 2: (joystick L1) Push-To-Talk (for fgcom) button 3: (joystick R3) Trim nose down button 4: (joystick L3) Trim nose up NO MODIFIER: button 5: (throttle) Flaps up button 6: (throttle) Flaps down button 7: (throttle) Gear up/down button 8: (throttle) Switch view MODIFIER 1 (keep button R2 down): button 5: (throttle) Mixture rich button 6: (throttle) Mixture lean button 7 (throttle) Propeller coarse button 8: (throttle) Propeller fine MODIFIER 2 (keep button L2 down): button 5: (throttle) Battery ON/OFF button 6: (throttle) Fuel selector button 7 (throttle) Magnetos button 8: (throttle) ??? MODIFIER 1+2 (keep buttons L2 and R2 down): button 5: (throttle) ??? button 6: (throttle) ??? button 7 (throttle) ??? button 8: (throttle) ??? button 9: (throttle R2) Modifier 1 button 10: (throttle L2) Modifier 2 button SE: (base SE) ??? button ST: (base ST) ??? HAT SWITCH ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With the rocker switch and throttle twist controlling view direction, it is easy to look all around in different directions. --> <PropertyList> <name type="string">T.Flight Hotas X</name> <name type="string">Hotas X</name> <name type="string">Thrustmaster Hotas X</name> <name type="string">Thrustmaster T.Flight Hotas X</name> <nasal> <script> <![CDATA[ setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1", 0); setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2", 0); ]]> </script> </nasal> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~ Axis Bindings ~~~~~~~~~~~~~~~~~~~~~~~~ --> <axis n="0"> <desc>Joystick: Aileron</desc> <binding> <command>property-scale</command> <property>/controls/flight/aileron</property> <factor type="double">1.0</factor> <power type="double">1.0</power> </binding> </axis> <axis n="1"> <desc>Joystick: Elevator</desc> <binding> <command>property-scale</command> <property>/controls/flight/elevator</property> <factor type="double">-1.0</factor> <power type="double">1.0</power> </binding> </axis> <axis n= "2"> <desc>Throttle</desc> <binding> <command>nasal</command> <script>controls.throttleAxis()</script> </binding> </axis> <axis n="3"> <desc>Rudder</desc> <binding> <command>property-scale</command> <property>/controls/flight/rudder</property> <power type="double">1.0</power> </binding> </axis> <!-- Throttle rocker switch axis pans l/r --> <axis n="4"> <desc>Throttle rocker switch: View Left/Right</desc> <dead-band type="double">0.05</dead-band> <binding> <command>property-scale</command> <property>/sim/current-view/heading-offset-deg</property> <factor type="double">-180</factor> <power type="double">1.2</power> </binding> </axis> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~ Hat Switch ~~~~~~~~~~~~~~~~~~~~~~~~ --> <axis n="5"> <desc>Hat Switch: View Direction (use mod buttons for different effects)</desc> <low> <repeatable>true</repeatable> <binding> <command>property-adjust</command> <property>/sim/current-view/goal-heading-offset-deg</property> <step type="double">5.0</step> </binding> </low> <high> <repeatable>true</repeatable> <binding> <command>property-adjust</command> <property>/sim/current-view/goal-heading-offset-deg</property> <step type="double">-5.0</step> </binding> </high> </axis> <axis n="6"> <desc>Hat Switch: View Elevation (use mod buttons for different effects)</desc> <low> <repeatable>true</repeatable> <binding> <command>property-adjust</command> <property>/sim/current-view/goal-pitch-offset-deg</property> <step type="double">5.0</step> </binding> </low> <high> <repeatable>true</repeatable> <binding> <command>property-adjust</command> <property>/sim/current-view/goal-pitch-offset-deg</property> <step type="double">-5.0</step> </binding> </high> </axis> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~ Button Bindings ~~~~~~~~~~~~~~~~~~~~~~~~ --> <!-- Trigger (R1) --> <button n="0"> <desc>Button R1(1) (trigger): Brakes + reset to pilot view</desc> <repeatable type="bool">true</repeatable> <binding> <command>nasal</command> <script> controls.applyBrakes(1.0); setprop("/sim/current-view/view-number", 0); view.resetView(); </script> </binding> <mod-up> <binding> <command>nasal</command> <script> controls.applyBrakes(0.0); </script> </binding> </mod-up> </button> <!-- Button right of Hat switch, Labeled L1(2) --> <button n="1"> <desc>Button L1(2) (joystick center): Push-To-Talk (for fgcom)</desc> <binding> <command>nasal</command> <script> controls.ptt(1); # push-to-talk (fgcom) ON </script> </binding> <mod-up> <binding> <command>nasal</command> <script> controls.ptt(0); # push-to-talk (fgcom) OFF </script> </binding> </mod-up> </button> <!-- Front button, right of trigger, (R3) --> <button n="2"> <desc>Button R3(3): Elevator trim down</desc> <repeatable type="bool">true</repeatable> <binding> <command>nasal</command> <script> controls.elevatorTrim(1); gui.popupTip(sprintf("Elevator trim: %d", 100 * getprop("/controls/flight/elevator-trim"))); </script> </binding> </button> <!-- Button far right of Hat switch, Labeled L3(4) --> <button n="3"> <desc>Button L3(4): Elevator trim down</desc> <repeatable type="bool">true</repeatable> <binding> <command>nasal</command> <script> controls.elevatorTrim(-1); gui.popupTip(sprintf("Elevator trim: %d", 100 * getprop("/controls/flight/elevator-trim"))); </script> </binding> </button> <!-- Throttle Button labeled 5 --> <button n="4"> <desc>Button (5): Flaps up / Mixture rich / Battery on-off / ???</desc> <repeatable type="bool">false</repeatable> <binding> <command>nasal</command> <script> mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1"); mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2"); if(mod1==0 and mod2==0) { controls.flapsDown(-1); gui.popupTip(sprintf("Flaps: %d deg", 30*getprop("/controls/flight/flaps")+0.1)); } elsif(mod1==1 and mod2==0) { controls.adjMixture(10); gui.popupTip(sprintf("Mixture rich")); } elsif(mod1 == 0 and mod2==1) { j = getprop("/controls/electric/battery-switch"); if(j == 0) { setprop("/controls/electric/battery-switch", 1); gui.popupTip(sprintf("Battery ON")); } else { setprop("/controls/electric/battery-switch", 0); gui.popupTip(sprintf("Battery OFF")); } } elsif(mod1==1 and mod2==1) { } </script> </binding> <mod-up> <binding> <command>nasal</command> <script> mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1"); mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2"); if(mod1==0 and mod2==0) { controls.flapsDown(0); gui.popupTip(sprintf("Flaps: %d deg", 30*getprop("/controls/flight/flaps")+0.1)); } elsif(mod1==1 and mod2==0) { # mixture } elsif(mod1 == 0 and mod2==1) { } elsif(mod1==1 and mod2==1) { } </script> </binding> </mod-up> </button> <!-- Throttle Button labeled 6 --> <button n="5"> <desc>Button (6): Flaps down / Mixture lean / Fuel selector / ???</desc> <repeatable type="bool">false</repeatable> <binding> <command>nasal</command> <script> mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1"); mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2"); if(mod1==0 and mod2==0) { controls.flapsDown(1); gui.popupTip(sprintf("Flaps: %d deg", 30*getprop("/controls/flight/flaps")+0.1)); } elsif(mod1==1 and mod2==0) { controls.adjMixture(-10); gui.popupTip(sprintf("Mixture lean")); } elsif(mod1 == 0 and mod2==1) { k = getprop("/controls/fuel/tank/fuel_selector"); if (k == 0) { setprop("/controls/fuel/tank/fuel_selector", 1); setprop("/controls/engines/engine/fuel-pump", 1); } else { setprop("/controls/fuel/tank/fuel_selector", 0); setprop("/controls/engines/engine/fuel-pump", 0); } } elsif(mod1==1 and mod2==1) { } </script> </binding> <mod-up> <binding> <command>nasal</command> <script> mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1"); mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2"); if(mod1==0 and mod2==0) { controls.flapsDown(0); gui.popupTip(sprintf("Flaps: %d deg", 30*getprop("/controls/flight/flaps")+0.1)); } elsif(mod1==1 and mod2==0) { # mixture } elsif(mod1 == 0 and mod2==1) { } elsif(mod1==1 and mod2==1) { } </script> </binding> </mod-up> </button> <!-- Throttle Button labeled 7 (circle)--> <button n="6"> <desc>Button (7): Landing Gear Toggle / Propeller coarse / Magnetos / ???</desc> <repeatable type="bool">false</repeatable> <binding> <command>nasal</command> <script> mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1"); mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2"); if(mod1==0 and mod2==0) { controls.gearToggle(); } elsif(mod1==1 and mod2==0) { controls.adjPropeller(10); gui.popupTip(sprintf("Propeller coarse")); } elsif(mod1 == 0 and mod2==1) { l = getprop("/controls/engines/engine/magnetos"); if (l == 0) { props.setAll("/controls/engines/engine", "magnetos", 1); } elsif ( l == 1 ) { props.setAll("/controls/engines/engine", "magnetos", 2); } elsif ( l == 2 ) { props.setAll("/controls/engines/engine", "magnetos", 3); } elsif ( l == 3 ) { props.setAll("/controls/engines/engine", "magnetos", 0); } } elsif(mod1==1 and mod2==1) { } </script> </binding> <mod-up> <binding> <command>nasal</command> <script> mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1"); mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2"); if(mod1==0 and mod2==0) { # gear } elsif(mod1==1 and mod2==0) { # propeller } elsif(mod1 == 0 and mod2==1) { # magnetos } elsif(mod1==1 and mod2==1) { } </script> </binding> </mod-up> </button> <!-- Throttle Button labeled 8 (triangle) --> <button n="7"> <desc>Button (8): Switch view / Propeller fine / Starter / ???</desc> <repeatable type="bool">false</repeatable> <binding> <command>nasal</command> <script> mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1"); mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2"); if(mod1==0 and mod2==0) { view.stepView(1); } elsif(mod1==1 and mod2==0) { controls.adjPropeller(-10); gui.popupTip(sprintf("Propeller fine")); } elsif(mod1==0 and mod2==1) { setprop("/controls/engines/engine/starter", 1); setprop("/controls/engines/engine[1]/starter", 1); setprop("/controls/engines/engine[2]/starter", 1); setprop("/controls/engines/engine[3]/starter", 1); setprop("/controls/engines/engine[4]/starter", 1); gui.popupTip(sprintf("Cranking...")); } elsif(mod1==1 and mod2==1) { } </script> </binding> <mod-up> <binding> <command>nasal</command> <script> mod1 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1"); mod2 = getprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2"); if(mod1==0 and mod2==0) { # switch views } elsif(mod1==1 and mod2==0) { # propeller } elsif(mod1==0 and mod2==1) { setprop("/controls/engines/engine/starter", 0); setprop("/controls/engines/engine[1]/starter", 0); setprop("/controls/engines/engine[2]/starter", 0); setprop("/controls/engines/engine[3]/starter", 0); setprop("/controls/engines/engine[4]/starter", 0); } elsif(mod1==1 and mod2==1) { } </script> </binding> </mod-up> </button> <!-- Throttle Button labeled R2(9) --> <button n="8"> <desc>Button R2(9): Modifier 1</desc> <repeatable type="bool">false</repeatable> <binding> <command>nasal</command> <script> setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1", 1); </script> </binding> <mod-up> <binding> <command>nasal</command> <script> setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier1", 0); </script> </binding> </mod-up> </button> <!-- Throttle Button labeled L2(10) --> <button n="9"> <desc>Button L2(10): Modifier2</desc> <repeatable type="bool">false</repeatable> <binding> <command>nasal</command> <script> setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2", 1); </script> </binding> <mod-up> <binding> <command>nasal</command> <script> setprop("/input/joysticks/js[0]/t-flight-hotas-x-modifier2", 0); </script> </binding> </mod-up> </button> <!-- Base Button SE --> <button n="10"> <desc>Button SE: ???</desc> <repeatable type="bool">false</repeatable> <binding> <command>nasal</command> <script> gui.popupTip(sprintf("Button n=10 unused")); </script> </binding> </button> <!-- Base Button ST --> <button n="11"> <desc>Button ST: ???</desc> <repeatable type="bool">false</repeatable> <binding> <command>nasal</command> <script> gui.popupTip(sprintf("Button n=11 unused")); </script> </binding> </button> </PropertyList>