<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="joystick.xsl"?>
<!-- Saitek AV8R/Aviator

  Copyright (C) 2007 - 2011  Anders Gidenstam  (anders(at)gidenstam.org)
  This file is released under the GPL license v2 or later.
-->
<PropertyList>

 <name>Saitek AV8R Joystick</name>
 <name>Saitek AV8R Classic Stick</name>

 <nasal>
  <script>
   <![CDATA[
     var self = cmdarg().getParent();
     var data = self.getNode("data");
     var modifier            = 0;
     var engine_select_mode  = 0;
     # TM0: All selected; TM1: #1 & #2; TM2: #3 & #4
     var engine_axis_mode    = 0;
     # Valid only in TM1 and TM2.
     #   EA0: throttle
     #   EA1: mixture
     #   EA2: propeller
     var quick_view_active   = 0;
     var old_view            = view.point.save();
     var pressed             = [0,0,0,0,0,0,0,0,0,0,0,0];
     # Map engines to throttles for TM1 (0, 1) and TM2 (2, 3)
     var engine = [0, 1, 2, 3];

     # Do per-aircraft modifications
     if (contains({"Aircraft/Short_Empire/Models/Short_Empire-model.xml" : 0,
                   "Aircraft/Lockheed1049/Models/Lockheed1049_twa.xml"   : 0},
                  getprop("/sim/model/path"))) {
       # TM1: the outer engines, TM2: the inner engines
       engine = [0, 3, 1, 2];
     }
     if (contains({"Aircraft/DO-X/Models/dox.xml"   : 0},
                  getprop("/sim/model/path"))) {
       engine = [[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11],
                 [0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]];
     }


     var goal_heading_offset =
       props.globals.getNode("/sim/current-view/goal-heading-offset-deg", 1);
     var goal_pitch_offset   =
       props.globals.getNode("/sim/current-view/goal-pitch-offset-deg", 1);

     var headtracking = props.globals.getNode("/sim/headtracking/enabled", 1);

     var kbdctrl  = props.globals.getNode("/devices/status/keyboard/ctrl", 1);
     var kbdalt   = props.globals.getNode("/devices/status/keyboard/alt", 1);

     var quick_view = func {
       var dir = arg[0];
       if (dir == 0) {
         quick_view_active = 0;
         view.point.move(old_view, 0.1);
         headtracking.setIntValue(1);
       } else {
         if (quick_view_active == 0) {
           quick_view_active = 1;
           old_view = view.point.save();
           headtracking.setIntValue(0);

           if (dir == 1) {
             goal_heading_offset.setDoubleValue
               (getprop("/sim/view/config/left-direction-deg"));
             goal_pitch_offset.setDoubleValue
               (getprop("/sim/view/config/pitch-offset-deg"));
             view.fovProp.setDoubleValue
               (getprop("/sim/view/config/default-field-of-view-deg"));
           } if (dir == 2) {
             goal_heading_offset.setDoubleValue
               (getprop("/sim/view/config/right-direction-deg"));
             goal_pitch_offset.setDoubleValue
               (getprop("/sim/view/config/pitch-offset-deg"));
             view.fovProp.setDoubleValue
               (getprop("/sim/view/config/default-field-of-view-deg"));
           } if (dir == 3) {
             goal_heading_offset.setDoubleValue
               (getprop("/sim/view/config/front-direction-deg"));
             goal_pitch_offset.setDoubleValue
               (getprop("/sim/view/config/pitch-offset-deg"));
             view.fovProp.setDoubleValue
               (getprop("/sim/view/config/default-field-of-view-deg"));
           } if (dir == 4) {
             goal_heading_offset.setDoubleValue
               (getprop("/sim/view/config/back-direction-deg"));
             goal_pitch_offset.setDoubleValue
               (getprop("/sim/view/config/pitch-offset-deg"));
             view.fovProp.setDoubleValue
               (getprop("/sim/view/config/default-field-of-view-deg"));
           }
         }
       }
     } 

     var trace = func(str) {
       # Uncomment the line below to trace button presses.
       #print("Aviator.xml: " ~ str);
     }
   ]]>
  </script>
 </nasal>

 <!-- Analog axis 0. Aileron -->
 <axis>
  <name>Stick left/right</name>
  <number>
   <unix>0</unix>
   <mac>0</mac>
   <windows>0</windows>
  </number>
  <desc>aileron</desc>
  <dead-band type="double">0.05</dead-band>
  <binding>
   <command>property-scale</command>
   <property>/controls/flight/aileron</property>
   <offset type="double">0.0</offset>
   <squared type="bool">1</squared>
  </binding>
 </axis>

 <!-- Analog axis 1. Elevator -->
 <axis>
  <name>Stick forward/back</name>
  <number>
   <unix>1</unix>
   <mac>1</mac>
   <windows>1</windows>
  </number>
  <desc>elevator</desc>
  <dead-band type="double">0.05</dead-band>
  <binding>
   <command>property-scale</command>
   <property>/controls/flight/elevator</property>
   <offset type="double">0.0</offset>
   <factor type="double">-1.0</factor>
   <squared type="bool">1</squared>
  </binding>
 </axis>

 <!-- Analog axis 3. Rudder -->
 <axis>
  <name>Stick twist</name>
  <number>
   <unix>3</unix>
   <mac>2</mac>
   <windows>3</windows>
  </number>
  <desc>rudder</desc>
  <dead-band type="double">0.05</dead-band>
  <binding>
   <command>property-scale</command>
   <property>/controls/flight/rudder</property>
   <offset type="double">0.0</offset>
   <factor type="double">1.0</factor>
   <squared type="bool">1</squared>
  </binding>
  <!-- binding>
   <command>nasal</command>
   <script>
    setprop("sim/current-view/goal-heading-offset-deg",
            -90.0*cmdarg().getNode("setting").getValue());
   </script>
  </binding -->
 </axis>

 <!-- Analog axis 2. Throttle 1 -->
 <axis>
  <name>Left throttle</name>
  <number>
   <unix>2</unix>
   <mac>3</mac>
   <windows>2</windows>
  </number>
  <desc>TM0: throttle, TM1: throttle/propeller 1, TM2: throttle/propeller 3</desc>
  <binding>
   <command>nasal</command>
   <script>
     if (engine_select_mode == 0) {
       controls.throttleAxis();
     } else {
       controls.perEngineSelectedAxisHandler(engine_axis_mode)
           ((engine_select_mode == 1) ? engine[0] : engine[2]);
     }
   </script>
  </binding>
 </axis>

 <!-- Analog axis 4. Throttle 2 -->
 <axis>
  <name>Right throttle</name>
  <number>
   <unix>4</unix>
   <mac>4</mac>
   <windows>4</windows>
  </number>
  <desc>TM0: mixture, TM1: throttle/propeller 2, TM2: throttle/propeller 4</desc>
  <binding>
   <command>nasal</command>
   <script>
     if (engine_select_mode == 0) {
       controls.mixtureAxis();
     } else {
       controls.perEngineSelectedAxisHandler(engine_axis_mode)
           ((engine_select_mode == 1) ? engine[1] : engine[3]);
     }
   </script>
  </binding>
 </axis>

 <!-- Axis 5. Hat left/right -->
 <axis>
  <name>Hat left/right</name>
  <number>
   <unix>5</unix>
   <mac>5</mac>
   <windows>5</windows>
  </number>
  <desc>quick view left/right, +mod: horizontal view pan</desc>
  <low>
   <repeatable type="bool">true</repeatable>
   <binding>
    <command>nasal</command>
    <script>
     <![CDATA[
       trace("Axis 5, Hat: low!");
      if (modifier) {
         view.panViewDir(0.5);
       } else {
         quick_view(1);
       }
     ]]>
    </script>
   </binding>
   <mod-up>
    <binding>
     <command>nasal</command>
     <script>
        if (!modifier) {
          quick_view(0);
        }
     </script>
    </binding>
   </mod-up>
  </low>
  <high>
   <repeatable type="bool">true</repeatable>
   <binding>
    <command>nasal</command>
    <script>
     <![CDATA[
       trace("Axis 5, Hat: high!");
       if (modifier) {
         view.panViewDir(-0.5);
       } else {
         quick_view(2);
       }
     ]]>
    </script>
   </binding>
   <mod-up>
    <binding>
     <command>nasal</command>
     <script>
      <![CDATA[
        trace("Axis 5, Hat: low released!");
        if (!modifier) {
          quick_view(0);
        }
      ]]>
     </script>
    </binding>
   </mod-up>
  </high>
 </axis>

 <!-- Axis 6. Hat up/down -->
 <axis>
  <name>Hat up/down</name>
  <number>
   <unix>6</unix>
   <mac>6</mac>
   <windows>6</windows>
  </number>
  <desc>view reset/quick view front, +mod: vertical view pan</desc>
  <low>
   <repeatable type="bool">true</repeatable>
   <binding>
    <command>nasal</command>
    <script>
     <![CDATA[
       trace("Axis 6, Hat: low!");
       if (modifier) {
         view.panViewPitch(0.5);
       } else {
         view.resetView();
       }
     ]]>
    </script>
   </binding>
   <mod-up>
    <binding>
     <command>nasal</command>
     <script>
      <![CDATA[
        if (!modifier) {
          #quick_view(0);
        }
      ]]>
     </script>
    </binding>
   </mod-up>
  </low>
  <high>
   <repeatable type="bool">true</repeatable>
   <binding>
    <command>nasal</command>
    <script>
     <![CDATA[
       trace("Axis 6, Hat: high!");
       if (modifier) {
         view.panViewPitch(-0.5);
       } else {
         quick_view(3);
       }
     ]]>
    </script>
   </binding>
   <mod-up>
    <binding>
     <command>nasal</command>
     <script>
      <![CDATA[
        if (!modifier) {
          quick_view(0);
        }
      ]]>
     </script>
    </binding>
   </mod-up>
  </high>
 </axis>

 <!-- Trigger Button -->
 <button>
  <name>Trigger</name>
  <number>
   <unix>0</unix>
   <mac>0</mac>
   <windows>0</windows>
  </number>
  <desc>function modifier (mod)</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 0 pressed!");
      modifier = 1;
   </script>
  </binding>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
      modifier = 0;
    </script>
   </binding>
  </mod-up>
 </button>

 <!-- Center Button -->
 <button>
  <name>Center button</name>
  <number>
   <unix>2</unix>
   <mac>2</mac>
   <windows>2</windows>
  </number>
  <desc>brakes, +mod: Toggle parking brake</desc>
  <binding>
   <command>nasal</command>
   <script>
     trace("Button 2 pressed!");
     if (modifier) {
       controls.applyParkingBrake(1);
     } else {
       controls.applyBrakes(1);
     }
   </script>
  </binding>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
      controls.applyBrakes(0);
    </script>
   </binding>
  </mod-up>
 </button>

 <!-- Left Button -->
 <button>
  <name>Left button</name>
  <number>
   <unix>1</unix>
   <mac>1</mac>
   <windows>1</windows>
  </number>
  <desc>left brake, +mod: PTT</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 1 pressed!");
      if (modifier) {
        controls.ptt(1);
      } else {
        controls.applyBrakes(1, -1);
      }
   </script>
  </binding>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
       controls.applyBrakes(0, -1);
       controls.ptt(0);
    </script>
   </binding>
  </mod-up>
 </button>

 <!-- Right Button -->
 <button>
  <name>Right button</name>
  <number>
   <unix>3</unix>
   <mac>3</mac>
   <windows>3</windows>
  </number>
  <desc>right brake, +mod: trigger</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 3 pressed!");
      if (modifier) {
        controls.trigger(1);
      } else {
        controls.applyBrakes(1, 1);
      }
   </script>
  </binding>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
       controls.applyBrakes(0, 1);
       controls.trigger(0);
    </script>
   </binding>
  </mod-up>
 </button>

 <!-- Button: T1 -->
 <button>
  <name>T1</name>
  <number>
   <unix>4</unix>
   <mac>4</mac>
   <windows>4</windows>
  </number>
  <desc>next view, +mod: zoom in +Shift: next weapon</desc>
  <repeatable type="bool">true</repeatable>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 4 pressed!");
      if (modifier) {
        view.decrease();
      } else {
        if (!pressed[4]) {
          pressed[4] = 1;
          view.stepView(1);
        }
      }
   </script>
  </binding>
  <mod-shift>
   <binding>
    <command>nasal</command>
    <script>
      trace("Button 4 + shift pressed!");
      controls.weaponSelect(1);
    </script>
   </binding>
  </mod-shift>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
      pressed[4] = 0;
    </script>
   </binding>
  </mod-up>
 </button>

 <!-- Button: T2 -->
 <button>
  <name>T2</name>
  <number>
   <unix>5</unix>
   <mac>5</mac>
   <windows>5</windows>
  </number>
  <desc>previous view, +mod: zoom out, +Shift: previous weapon</desc>
  <repeatable type="bool">true</repeatable>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 5 pressed!");
      if (modifier) {
        view.increase();
      } else {
        if (!pressed[5]) {
          pressed[5] = 1;
          view.stepView(-1);
        }
      }
   </script>
  </binding>
  <mod-shift>
   <binding>
    <command>nasal</command>
    <script>
      trace("Button 5 + shift pressed!");
      controls.weaponSelect(-1);
    </script>
   </binding>
  </mod-shift>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
      pressed[5] = 0;
    </script>
   </binding>
  </mod-up>
 </button>

 <!-- Button: T3 -->
 <button>
  <name>T3</name>
  <number>
   <unix>6</unix>
   <mac>6</mac>
   <windows>6</windows>
  </number>
  <desc>trim nose down, +mod: disarm speed brakes</desc>
  <repeatable type="bool">true</repeatable>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 6 pressed!");
      if (modifier) {
        setprop("/controls/flight/speedbrake", 0.0);
      } else {
        controls.elevatorTrim(1);
      }
   </script>
  </binding>
 </button>

 <!-- Button: T4 -->
 <button>
  <name>T4</name>
  <number>
   <unix>7</unix>
   <mac>7</mac>
   <windows>7</windows>
  </number>
  <desc>trim nose up, +mod: deploy speed brakes</desc>
  <repeatable type="bool">true</repeatable>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 7 pressed!");
      if (modifier) {
        setprop("/controls/flight/speedbrake", 1.0);
      } else {
        controls.elevatorTrim(-1);
      }
   </script>
  </binding>
 </button>

 <!-- Button: T5 -->
 <button>
  <name>T5</name>
  <number>
   <unix>8</unix>
   <mac>8</mac>
   <windows>8</windows>
  </number>
  <desc>retract flaps one step, +mod: gear up</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 8 pressed!");
      if (!modifier) {
        controls.flapsDown(-1);
      } else {
        controls.gearDown(-1);
      }
   </script>
  </binding>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
       controls.flapsDown(0);
       controls.gearDown(0);
    </script>
   </binding>
  </mod-up>
 </button>

 <!-- Button: T6 -->
 <button>
  <name>T6</name>
  <number>
   <unix>9</unix>
   <mac>9</mac>
   <windows>9</windows>
  </number>
  <desc>deploy flaps one step, +mod: gear down</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 9 pressed!");
      if (!modifier) {
        controls.flapsDown(1);
      } else {
        controls.gearDown(1);
      }
   </script>
  </binding>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
       controls.flapsDown(0);
       controls.gearDown(0);
    </script>
   </binding>
  </mod-up>
 </button>

 <!-- Button: T7 -->
 <button>
  <name>T7</name>
  <number>
   <unix>10</unix>
   <mac>10</mac>
   <windows>10</windows>
  </number>
  <desc>Increase magnetos, +mod: Engine throttle/propeller axis swap</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 10 pressed!");
      if (!modifier) {
        controls.stepMagnetos(1);
      } else {
        engine_axis_mode = 2*!engine_axis_mode;
      }
   </script>
  </binding>
 </button>

 <!-- Button: T8 -->
 <button>
  <number>
   <unix>11</unix>
   <mac>11</mac>
   <windows>11</windows>
  </number>
  <name>T8</name>
  <desc>Decrease magnetos, +mod: Engine throttle/propeller axis swap</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Button 11 pressed!");
      if (!modifier) {
        controls.stepMagnetos(-1);
      } else {
        engine_axis_mode = 2*!engine_axis_mode;
      }
   </script>
  </binding>
 </button>

 <!-- Button: 3-way Mode switch -->
 <button>
  <name>Mode 1</name>
  <number>
   <unix>12</unix>
   <mac>12</mac>
   <windows>12</windows>
  </number>
  <desc>Engine 0/1 throttle mode</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Mode 1!");
      engine_select_mode = 1;
   </script>
  </binding>
  <mod-up>
   <binding>
    <command>nasal</command>
    <script>
       trace("Mode Off!");
       engine_select_mode = 0;
    </script>
   </binding>
  </mod-up>
 </button>
 <button>
  <name>Mode 2</name>
  <number>
   <unix>13</unix>
   <mac>13</mac>
   <windows>13</windows>
  </number>
  <name>Mode 2</name>
  <desc>Engine 2/3 throttle mode</desc>
  <binding>
   <command>nasal</command>
   <script>
      trace("Mode 2!");
      engine_select_mode = 2;
   </script>
  </binding>
 </button>

</PropertyList>