<?xml version="1.0"?> <PropertyList> <name>autopilot</name> <layout>vbox</layout> <!-- /autopilot/locks/altitude /autopilot/locks/heading /autopilot/locks/speed /autopilot/locks/passive-mode /autopilot/settings/heading-bug-deg /autopilot/settings/target-agl-ft /autopilot/settings/target-altitude-ft /autopilot/settings/target-aoa-deg /autopilot/settings/target-pitch-deg /autopilot/settings/target-speed-kt /autopilot/settings/true-heading-deg /autopilot/settings/vertical-speed-fpm --> <text><label>Autopilot Settings</label></text> <hrule/> <nasal> <open> ## manage one AP property group with checkbox and radio buttons # Group = { new : func(name, options) { var m = { parents: [Group] }; m.name = name; m.enabled = 0; m.mode = options[0]; m.options = []; var locks = props.globals.getNode("/autopilot/locks", 1); if (locks.getNode(name) == nil or locks.getNode(name, 1).getValue() == nil) { locks.getNode(name, 1).setValue(""); } m.lock = locks.getNode(name); m.active = dlg.getNode(name ~ "-active", 1); foreach (var o; options) { var node = dlg.getNode(o); if (node == nil) { node = dlg.getNode(o, 1); node.setBoolValue(0); } append(m.options, node); if (m.lock.getValue() == o) { m.mode = o; } } m.listener = setlistener(m.lock, func(n) { m.update(n.getValue()) }, 1); return m; }, del : func { removelistener(me.listener); }, ## handle checkbox # enable : func { me.enabled = me.active.getBoolValue(); me.lock.setValue(me.enabled ? me.mode : ""); }, ## handle radiobuttons # set : func(mode) { me.mode = mode; foreach (var o; me.options) { o.setBoolValue(o.getName() == mode); } if (me.enabled) { me.lock.setValue(mode); } }, ## update checkboxes/radiobuttons state from the AP (listener callback) # update : func(mode) { me.enabled = (mode != ""); me.active.setBoolValue(me.enabled); if (mode == "") { mode = me.mode; } foreach (var o; me.options) { o.setBoolValue(o.getName() == mode); } }, }; ## create and initialize input field properties if necessary # var apset = props.globals.getNode("/autopilot/settings", 1); foreach (var p; ["heading-bug-deg", "true-heading-deg", "vertical-speed-fpm", "target-pitch-deg", "target-aoa-deg", "target-altitude-ft", "target-agl-ft", "target-speed-kt"]) { if ((var n = apset.getNode(p)) == nil or n.getType() == "NONE") { apset.getNode(p, 1).setDoubleValue(0); } } var dlg = props.globals.getNode("/sim/gui/dialogs/autopilot", 1); # - first entry ("heading" etc.) is the target property in /autopilot/locks/ *and* # the checkbox state property name (with "-active" appended); # - second entry is a list of available options for the /autopilot/locks/* property # and used as radio button state property; the first list entry is used as default # var hdg = Group.new("heading", ["dg-heading-hold", "wing-leveler", "true-heading-hold", "nav1-hold"]); var vel = Group.new("speed", ["speed-with-throttle", "speed-with-pitch-trim"]); var alt = Group.new("altitude", ["altitude-hold", "vertical-speed-hold", "pitch-hold", "aoa-hold", "agl-hold", "gs1-hold"]); </open> <close> hdg.del(); vel.del(); alt.del(); </close> </nasal> <group> <layout>hbox</layout> <default-padding>8</default-padding> <group> <!-- Heading --> <layout>vbox</layout> <group> <layout>hbox</layout> <checkbox> <label>Heading Control</label> <halign>fill</halign> <property>/sim/gui/dialogs/autopilot/heading-active</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> <binding> <command>nasal</command> <script>hdg.enable()</script> </binding> </checkbox> </group> <group> <layout>table</layout> <text> <label>Wings Level</label> <halign>right</halign> <row>0</row><col>0</col> </text> <radio> <row>0</row><col>1</col> <property>/sim/gui/dialogs/autopilot/wing-leveler</property> <live>true</live> <binding> <command>nasal</command> <script>hdg.set("wing-leveler")</script> </binding> </radio> <text> <label>Heading Bug</label> <halign>right</halign> <row>1</row><col>0</col> </text> <radio> <row>1</row><col>1</col> <property>/sim/gui/dialogs/autopilot/dg-heading-hold</property> <live>true</live> <binding> <command>nasal</command> <script>hdg.set("dg-heading-hold")</script> </binding> </radio> <input> <row>1</row><col>2</col> <property>/autopilot/settings/heading-bug-deg</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> </input> <text> <label>True Heading</label> <halign>right</halign> <row>2</row><col>0</col> </text> <radio> <row>2</row><col>1</col> <property>/sim/gui/dialogs/autopilot/true-heading-hold</property> <live>true</live> <binding> <command>nasal</command> <script>hdg.set("true-heading-hold")</script> </binding> </radio> <input> <row>2</row><col>2</col> <property>/autopilot/settings/true-heading-deg</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> </input> <text> <label>NAV1 CDI Course</label> <halign>right</halign> <row>3</row><col>0</col> </text> <radio> <row>3</row><col>1</col> <property>/sim/gui/dialogs/autopilot/nav1-hold</property> <live>true</live> <binding> <command>nasal</command> <script>hdg.set("nav1-hold")</script> </binding> </radio> </group> <hrule/> <group> <layout>hbox</layout> <checkbox> <label>Velocity Control</label> <halign>fill</halign> <property>/sim/gui/dialogs/autopilot/speed-active</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> <binding> <command>nasal</command> <script>vel.enable()</script> </binding> </checkbox> </group> <group> <layout>table</layout> <text> <label>Speed with Throttle</label> <halign>right</halign> <row>0</row><col>0</col> </text> <radio> <row>0</row><col>1</col> <property>/sim/gui/dialogs/autopilot/speed-with-throttle</property> <live>true</live> <binding> <command>nasal</command> <script>vel.set("speed-with-throttle")</script> </binding> </radio> <input> <row>0</row><col>2</col> <rowspan>2</rowspan> <property>/autopilot/settings/target-speed-kt</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> </input> <text> <label>Speed with Pitch</label> <halign>right</halign> <row>1</row><col>0</col> </text> <radio> <row>1</row><col>1</col> <property>/sim/gui/dialogs/autopilot/speed-with-pitch-trim</property> <live>true</live> <binding> <command>nasal</command> <script>vel.set("speed-with-pitch-trim")</script> </binding> </radio> </group> </group> <!-- End of Heading/Speed --> <vrule/> <group> <!-- Pitch/Altitude --> <layout>vbox</layout> <group> <layout>hbox</layout> <checkbox> <label>Pitch/Altitude Control</label> <halign>fill</halign> <property>/sim/gui/dialogs/autopilot/altitude-active</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> <binding> <command>nasal</command> <script>alt.enable()</script> </binding> </checkbox> </group> <group> <layout>table</layout> <text> <label>Vertical Speed</label> <halign>right</halign> <row>0</row><col>0</col> </text> <radio> <row>0</row><col>1</col> <property>/sim/gui/dialogs/autopilot/vertical-speed-hold</property> <live>true</live> <binding> <command>nasal</command> <script>alt.set("vertical-speed-hold")</script> </binding> </radio> <input> <row>0</row><col>2</col> <property>/autopilot/settings/vertical-speed-fpm</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> </input> <text> <label>Pitch Hold</label> <halign>right</halign> <row>1</row><col>0</col> </text> <radio> <row>1</row><col>1</col> <property>/sim/gui/dialogs/autopilot/pitch-hold</property> <live>true</live> <binding> <command>nasal</command> <script>alt.set("pitch-hold")</script> </binding> </radio> <input> <row>1</row><col>2</col> <property>/autopilot/settings/target-pitch-deg</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> </input> <text> <label>AoA Hold</label> <halign>right</halign> <row>2</row><col>0</col> </text> <radio> <row>2</row><col>1</col> <property>/sim/gui/dialogs/autopilot/aoa-hold</property> <live>true</live> <binding> <command>nasal</command> <script>alt.set("aoa-hold")</script> </binding> </radio> <input> <row>2</row><col>2</col> <property>/autopilot/settings/target-aoa-deg</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> </input> <text> <label>Altitude Hold</label> <halign>right</halign> <row>3</row><col>0</col> </text> <radio> <row>3</row><col>1</col> <property>/sim/gui/dialogs/autopilot/altitude-hold</property> <live>true</live> <binding> <command>nasal</command> <script>alt.set("altitude-hold")</script> </binding> </radio> <input> <row>3</row><col>2</col> <property>/autopilot/settings/target-altitude-ft</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> </input> <text> <label>AGL Hold</label> <halign>right</halign> <row>4</row><col>0</col> </text> <radio> <row>4</row><col>1</col> <property>/sim/gui/dialogs/autopilot/agl-hold</property> <live>true</live> <binding> <command>nasal</command> <script>alt.set("agl-hold")</script> </binding> </radio> <input> <row>4</row><col>2</col> <property>/autopilot/settings/target-agl-ft</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> </input> <text> <label>NAV1 Glideslope</label> <halign>right</halign> <row>5</row><col>0</col> </text> <radio> <row>5</row><col>1</col> <property>/sim/gui/dialogs/autopilot/gs1-hold</property> <live>true</live> <binding> <command>nasal</command> <script>alt.set("gs1-hold")</script> </binding> </radio> </group> <empty><stretch>true</stretch></empty> </group> <!-- End of Pitch/Altitude VBox --> </group> <hrule/> <group> <!-- Passive Mode Toggle --> <layout>hbox</layout> <checkbox> <label>FlightDirector Mode</label> <halign>center</halign> <property>/autopilot/locks/passive-mode</property> <live>true</live> <binding> <command>dialog-apply</command> </binding> <binding> <command>property-toggle</command> </binding> </checkbox> </group> <hrule/> <button> <legend>Close</legend> <default>true</default> <key>Esc</key> <padding>10</padding> <binding> <command>dialog-apply</command> </binding> <binding> <command>dialog-close</command> </binding> </button> </PropertyList>