From 06852539d9c07e316cc477b5a66b8c5995611266 Mon Sep 17 00:00:00 2001
From: Thorsten Renk <thorsten@science-and-fiction.org>
Date: Wed, 30 Aug 2017 12:33:59 +0300
Subject: [PATCH] Start fixing USS Harry Truman animations, add control dialog
 (click on bridge to bring it up)

---
 Models/Geometry/Nimitz/truman.xml | 720 ++++++++++--------------------
 gui/dialogs/truman.xml            | 318 +++++++++++++
 2 files changed, 561 insertions(+), 477 deletions(-)
 create mode 100644 gui/dialogs/truman.xml

diff --git a/Models/Geometry/Nimitz/truman.xml b/Models/Geometry/Nimitz/truman.xml
index c8f568f57..810a9c747 100755
--- a/Models/Geometry/Nimitz/truman.xml
+++ b/Models/Geometry/Nimitz/truman.xml
@@ -3,9 +3,11 @@
 The Truman model is based on the work of user karla, who
 gave permission to use it for FG.
 
-Additional modelling, animations , Tower View control, single animation of JBD depending
-on engaged cat, etc.
-added by Michael Habarta
+Additional modelling, animations etc.
+added by Michael Habarta 2017
+
+Streamlined for inclusion in FG 
+by Thorsten Renk 2017
 
 -->
 <PropertyList>
@@ -16,8 +18,111 @@ added by Michael Habarta
 
   <nasal>
     <load><![CDATA[
+
       var carrier = "Truman";
       var pathc = cmdarg().getPath();
+      var self = cmdarg();
+
+      var elevator_transit_time = 30.0;
+      var door_transit_time = 60.0;
+      var rail_transit_time = 4.0;
+
+      # search for the next free slot in the AI menu and register the Truman control menu
+
+      #var menu_root_nd = props.globals.getNode("/sim/menubar/default/menu[6]",1);
+      #for (var i = 0; 1; i += 1)
+      #		if (menu_root_nd.getChild("item", i, 0) == nil)
+      #			break;
+      #var menu_nd = menu_root_nd.getChild("item", i, 1);
+
+      #menu_nd.getNode("enabled", 1).setBoolValue("true");
+      #menu_nd.getNode("name", 1).setValue("Truman");
+      #menu_nd.getNode("binding", 1).getNode("command", 1).setValue("dialog-show");
+      #menu_nd.getNode("binding", 1).getNode("dialog-name", 1).setValue("TrumanControls");
+      #fgcommand("gui-redraw");
+
+      # set up the animation control properties
+
+      setprop("/controls/truman/crew", 0);
+      setprop("/controls/truman/deck-park",0);
+
+
+
+      # init flight-operations flag (whip antenna animation)
+      setprop("/controls/truman/flight-operations",0);
+
+      # init ai elevators
+      setprop("/controls/truman/elevator[0]/state",1);
+      setprop("/controls/truman/elevator[1]/state",0);
+      setprop("/controls/truman/elevator[2]/state",0);
+      setprop("/controls/truman/elevator[3]/state",1);
+
+
+      # init elevator doors
+      setprop("/controls/truman/door[0]/state",0);
+      setprop("/controls/truman/door[1]/state",0);
+      setprop("/controls/truman/door[2]/state",0);
+      setprop("/controls/truman/door[3]/state",0);
+
+      ###########
+      # elevators
+
+      var elevator1 = aircraft.door.new(pathc~"/surface-positions/elevator[0]", elevator_transit_time, 1);
+      var elevator2 = aircraft.door.new(pathc~"/surface-positions/elevator[1]", elevator_transit_time, 0);
+      var elevator3 = aircraft.door.new(pathc~"/surface-positions/elevator[2]", elevator_transit_time, 0);
+      var elevator4 = aircraft.door.new(pathc~"/surface-positions/elevator[3]", elevator_transit_time, 1);
+
+      var elevator_array = [elevator1, elevator2, elevator3, elevator4];
+
+
+      ################
+      # elevator wires
+
+
+      setprop(pathc~"/surface-positions/elevator[0]/wire-norm", 0);
+      setprop(pathc~"/surface-positions/elevator[1]/wire-norm", 0);
+      setprop(pathc~"/surface-positions/elevator[2]/wire-norm", 0);
+      setprop(pathc~"/surface-positions/elevator[3]/wire-norm", 0);
+
+      ################
+      # elevator rails
+
+      var elevatorr1 = aircraft.door.new(pathc~"/surface-positions/elevator-rail[0]", rail_transit_time, getprop("/controls/truman/elevator[0]/state"));
+      var elevatorr2 = aircraft.door.new(pathc~"/surface-positions/elevator-rail[1]", rail_transit_time, getprop("/controls/truman/elevator[1]/state"));
+      var elevatorr3 = aircraft.door.new(pathc~"/surface-positions/elevator-rail[2]", rail_transit_time, getprop("/controls/truman/elevator[2]/state"));
+      var elevatorr4 = aircraft.door.new(pathc~"/surface-positions/elevator-rail[3]", rail_transit_time, getprop("/controls/truman/elevator[3]/state"));
+
+	var rail_upper_array = [elevatorr1, elevatorr2, elevatorr3, elevatorr4];
+
+
+      #####################
+      # elevator rails door
+
+      var elevatorrd1 = aircraft.door.new(pathc~"/surface-positions/elevator-rail-door[0]", rail_transit_time, getprop("/controls/truman/elevator[0]/state"));
+      var elevatorrd2 = aircraft.door.new(pathc~"/surface-positions/elevator-rail-door[1]", rail_transit_time, getprop("/controls/truman/elevator[1]/state"));
+      var elevatorrd3 = aircraft.door.new(pathc~"/surface-positions/elevator-rail-door[2]", rail_transit_time, getprop("/controls/truman/elevator[2]/state"));
+      var elevatorrd4 = aircraft.door.new(pathc~"/surface-positions/elevator-rail-door[3]", rail_transit_time, getprop("/controls/truman/elevator[3]/state"));
+
+	var rail_lower_array = [elevatorrd1, elevatorrd2, elevatorrd3, elevatorrd4];
+
+
+      ################
+      # elevator doors
+
+      var door1 = aircraft.door.new(pathc~"/surface-positions/elevator-door[0]", 60, 0);
+      var door2 = aircraft.door.new(pathc~"/surface-positions/elevator-door[1]", 60, 0);
+      var door3 = aircraft.door.new(pathc~"/surface-positions/elevator-door[2]", 60, 0);
+      var door4 = aircraft.door.new(pathc~"/surface-positions/elevator-door[3]", 60, 0);
+
+      var door_array = [door1, door2, door3, door4];
+      
+     
+      ########
+      # whips function
+
+      var whip_antennas = aircraft.door.new(pathc~"/surface-positions/whip-antennas", 6);
+
+
       print("LOAD ",carrier," prop-path: ", pathc);
 
       # set tower/active carrier if
@@ -52,233 +157,6 @@ added by Michael Habarta
       # fixme: not clear how to do ?!
       # on_carr = 1;
 
-      var carr_cnt = AIcarrier.countCarriersReady();
-
-      # find scenario of carrier and get tower offset
-      #
-      # Fixme: this works only if exactly
-      # one carrier of given name is active
-      # in all active scenarios
-      # this restriction makes sense,
-      # but it is not enforced in FG
-      var path = getprop("/sim/fg-root") ~ "/AI";
-      var s = -1;
-      foreach(var file; sort(directory(path), cmp)) {
-        if(size(file) > 4 and substr(file, -4) == ".xml") {
-          var n = io.read_properties(path ~ "/" ~ file);
-          # find carrier scenarios
-          if ( !AIscenario.containsType(n,"carrier") ) {
-            continue;
-          } else {
-            var index = AIscenario.isactive(substr(file,0,size(file)-4));
-            if ( index == -1 ) { continue; }
-            # find carrier in scenario
-            var i = -1;
-            foreach (var c; n.getNode("scenario").getChildren("entry")) {
-              i+=1;
-              if ( c.getValue("name") == carrier ) {
-                s = i;
-                break;
-              }
-            }
-            if ( s > -1 ) {
-              print("carrier: ",carrier," found in scenario: ",substr(file,0,size(file)-4)," at index: ",s);
-              break;
-            }
-          }
-        }
-      }
-      # get tower offset and first park-pos altitude
-      var carr_alt     = n.getNode("scenario/entry[" ~ s ~ "]/parking-pos").getValue("z-offset-m");
-      var tower_diff_x = n.getNode("scenario/entry[" ~ s ~ "]").getValue("tower-x-offset-m");
-      var tower_diff_y = n.getNode("scenario/entry[" ~ s ~ "]").getValue("tower-y-offset-m");
-      var tower_diff_z = n.getNode("scenario/entry[" ~ s ~ "]").getValue("tower-z-offset-m");
-
-      if ( getprop("/sim/presets/parkpos") == "" ) {
-        setprop("/sim/presets/parkpos",n.getNode("scenario/entry/parking-pos").getValue("name"));
-      }
-
-      # save tower offset and park-pos altitude
-      setprop("/ai/models/carrier[" ~ ci ~ "]/surface-positions/parkpos-alt-m",carr_alt);
-      setprop("/ai/models/carrier[" ~ ci ~ "]/surface-positions/tower-x-offset-m",tower_diff_x);
-      setprop("/ai/models/carrier[" ~ ci ~ "]/surface-positions/tower-y-offset-m",tower_diff_y);
-      setprop("/ai/models/carrier[" ~ ci ~ "]/surface-positions/tower-z-offset-m",tower_diff_z);
-
-      # save catapult positions
-      i = -1;
-      foreach( var c; n.getNode("scenario/entry[" ~ s ~ "]").getChildren("parking-pos") ) {
-        i+=1;
-        var name = c.getValue("name");
-        if ( substr(name,0,4) == "cat-" ) {
-          var cat_offset_x = c.getValue("x-offset-m");
-          var cat_offset_y = c.getValue("y-offset-m");
-          var cat_offset_z = c.getValue("z-offset-m");
-
-          setprop("/ai/models/carrier[" ~ ci ~ "]/surface-positions/parking-pos[" ~ i ~ "]/name",name);
-          setprop("/ai/models/carrier[" ~ ci ~ "]/surface-positions/parking-pos[" ~ i ~ "]/x-offset-m",cat_offset_x);
-          setprop("/ai/models/carrier[" ~ ci ~ "]/surface-positions/parking-pos[" ~ i ~ "]/y-offset-m",cat_offset_y);
-          setprop("/ai/models/carrier[" ~ ci ~ "]/surface-positions/parking-pos[" ~ i ~ "]/z-offset-m",cat_offset_z);
-        }
-      }
-
-      var self = cmdarg();
-      var control_node = self.getNode("controls/turn-to-base-course", 1);
-      var turn_old = 1;
-
-      # init flight-operations flag (whip antenna animation)
-      setprop("/ai/models/carrier/controls/flight-operations",0);
-
-      # init ai elevators
-      setprop("ai/models/carrier/controls/elevator[0]/state",1);
-      setprop("ai/models/carrier/controls/elevator[1]/state",0);
-      setprop("ai/models/carrier/controls/elevator[2]/state",0);
-      setprop("ai/models/carrier/controls/elevator[3]/state",1);
-
-      # init ai elevator rails
-      setprop("ai/models/carrier/controls/elevator-rail[0]/state",getprop("ai/models/carrier/controls/elevator[0]/state"));
-      setprop("ai/models/carrier/controls/elevator-rail[1]/state",getprop("ai/models/carrier/controls/elevator[1]/state"));
-      setprop("ai/models/carrier/controls/elevator-rail[2]/state",getprop("ai/models/carrier/controls/elevator[2]/state"));
-      setprop("ai/models/carrier/controls/elevator-rail[3]/state",getprop("ai/models/carrier/controls/elevator[3]/state"));
-
-      # init ai elevator rails door
-      setprop("ai/models/carrier/controls/elevator-rail-door[0]/state",getprop("ai/models/carrier/controls/elevator[0]/state"));
-      setprop("ai/models/carrier/controls/elevator-rail-door[1]/state",getprop("ai/models/carrier/controls/elevator[1]/state"));
-      setprop("ai/models/carrier/controls/elevator-rail-door[2]/state",getprop("ai/models/carrier/controls/elevator[2]/state"));
-      setprop("ai/models/carrier/controls/elevator-rail-door[3]/state",getprop("ai/models/carrier/controls/elevator[3]/state"));
-
-      # init elevator doors
-      setprop("ai/models/carrier/controls/elevator-door[0]/state",0);
-      setprop("ai/models/carrier/controls/elevator-door[1]/state",0);
-      setprop("ai/models/carrier/controls/elevator-door[2]/state",0);
-      setprop("ai/models/carrier/controls/elevator-door[3]/state",0);
-
-      # listeners are set once by first loaded carrier
-      # and removed by last removed carrier
-      # remark: if this is the first carrier it is not ready yet
-      #         so count is still 0 until carrier is fully loaded
-      if ( carr_cnt == 0 ) {
-        # identify which catapult is engaged
-        # whenever "/gear/launchbar/state" is "Engaged"
-        var lblis = setlistener("/gear/launchbar/state", func {
-          if ( getprop("/gear/launchbar/state") == "Engaged" ) {
-            AIcarrier.setCatEngaged();
-          } else {
-            settimer(func { setprop("/sim/presets/cat-engaged",""); },5.0);
-          }
-        },1,0);
-        print("listener for launchbar lock set ...");
-
-        # whenever "/gear/gear/wow" is changed
-        # check and set the active carrier
-        var wowlis = setlistener("/gear/gear/wow", func {
-          AIcarrier.setActiveCarrier();
-        },0,0);
-        print("listener for aircraft on carrier set ...");
-      }
-
-      ########
-      # properties used to handle rendering, lighting and to control the Deck-Park
-      # Due to a change in MPcarrier system ?
-
-      var rembrandt_node   = self.getNode("sim/rendering/rembrandt/enabled", 1);
-      var sunAngleRad_node = self.getNode("sim/time/sun-angle-rad", 1);
-
-      ########
-      # properties to control the E2C
-
-      var gear0_Node = self.getNode("gear/gear[0]/position-norm", 1);
-      gear0_Node.setDoubleValue(1);
-
-      var gear1_Node = self.getNode("gear/gear[1]/position-norm", 1);
-      gear1_Node.setDoubleValue(1);
-
-      var gear2_Node = self.getNode("gear/gear[2]/position-norm", 1);
-      gear2_Node.setDoubleValue(1);
-
-      var compression0_Node = self.getNode("gear/gear[0]/compression-norm", 1);
-      compression0_Node.setDoubleValue(0);
-
-      var compression1_Node = self.getNode("gear/gear[1]/compression-norm", 1);
-      compression1_Node.setDoubleValue(0.9);
-
-      var compression2_Node = self.getNode("gear/gear[2]/compression-norm", 1);
-      compression2_Node.setDoubleValue(0.9);
-
-      var wingfold_Node = self.getNode("surface-positions/wing-fold-pos-norm", 1);
-      wingfold_Node.setDoubleValue(1.0);
-
-      var rpm0_Node = self.getNode("engines/engine[0]/rpm", 1);
-      rpm0_Node.setDoubleValue(1.15);
-
-      var rpm1_Node = self.getNode("engines/engine[1]/rpm", 1);
-      rpm1_Node.setDoubleValue(2.17);
-
-      ###########
-      # elevators
-
-      var elevator1 = aircraft.door.new("/surface-positions/elevator[0]", 15, 1);
-      var elevator2 = aircraft.door.new("/surface-positions/elevator[1]", 15, 0);
-      var elevator3 = aircraft.door.new("/surface-positions/elevator[2]", 15, 0);
-      var elevator4 = aircraft.door.new("/surface-positions/elevator[3]", 15, 1);
-
-      var elev1_node = self.getNode("surface-positions/elevator[0]/position-norm", 1);
-      var elev2_node = self.getNode("surface-positions/elevator[1]/position-norm", 1);
-      var elev3_node = self.getNode("surface-positions/elevator[2]/position-norm", 1);
-      var elev4_node = self.getNode("surface-positions/elevator[3]/position-norm", 1);
-
-      ################
-      # elevator wires
-
-      var elevw1_node = self.getNode("surface-positions/elevator[0]/wire-norm", 1);
-      var elevw2_node = self.getNode("surface-positions/elevator[1]/wire-norm", 1);
-      var elevw3_node = self.getNode("surface-positions/elevator[2]/wire-norm", 1);
-      var elevw4_node = self.getNode("surface-positions/elevator[3]/wire-norm", 1);
-
-      ################
-      # elevator rails
-
-      var elevatorr1 = aircraft.door.new("/surface-positions/elevator-rail[0]", 4, getprop("ai/models/carrier/controls/elevator[0]/state"));
-      var elevatorr2 = aircraft.door.new("/surface-positions/elevator-rail[1]", 4, getprop("ai/models/carrier/controls/elevator[1]/state"));
-      var elevatorr3 = aircraft.door.new("/surface-positions/elevator-rail[2]", 4, getprop("ai/models/carrier/controls/elevator[2]/state"));
-      var elevatorr4 = aircraft.door.new("/surface-positions/elevator-rail[3]", 4, getprop("ai/models/carrier/controls/elevator[3]/state"));
-
-      var elevr1_node = self.getNode("surface-positions/elevator-rail[0]/position-norm", 1);
-      var elevr2_node = self.getNode("surface-positions/elevator-rail[1]/position-norm", 1);
-      var elevr3_node = self.getNode("surface-positions/elevator-rail[2]/position-norm", 1);
-      var elevr4_node = self.getNode("surface-positions/elevator-rail[3]/position-norm", 1);
-
-      #####################
-      # elevator rails door
-
-      var elevatorrd1 = aircraft.door.new("/surface-positions/elevator-rail-door[0]", 4, getprop("ai/models/carrier/controls/elevator[0]/state"));
-      var elevatorrd2 = aircraft.door.new("/surface-positions/elevator-rail-door[1]", 4, getprop("ai/models/carrier/controls/elevator[1]/state"));
-      var elevatorrd3 = aircraft.door.new("/surface-positions/elevator-rail-door[2]", 4, getprop("ai/models/carrier/controls/elevator[2]/state"));
-      var elevatorrd4 = aircraft.door.new("/surface-positions/elevator-rail-door[3]", 4, getprop("ai/models/carrier/controls/elevator[3]/state"));
-
-      var elevrd1_node = self.getNode("surface-positions/elevator-rail-door[0]/position-norm", 1);
-      var elevrd2_node = self.getNode("surface-positions/elevator-rail-door[1]/position-norm", 1);
-      var elevrd3_node = self.getNode("surface-positions/elevator-rail-door[2]/position-norm", 1);
-      var elevrd4_node = self.getNode("surface-positions/elevator-rail-door[3]/position-norm", 1);
-
-      ################
-      # elevator doors
-
-      var elevatord1 = aircraft.door.new("/surface-positions/elevator-door[0]", 60, 0);
-      var elevatord2 = aircraft.door.new("/surface-positions/elevator-door[1]", 60, 0);
-      var elevatord3 = aircraft.door.new("/surface-positions/elevator-door[2]", 60, 0);
-      var elevatord4 = aircraft.door.new("/surface-positions/elevator-door[3]", 60, 0);
-
-      var elevd1_node = self.getNode("surface-positions/elevator-door[0]/position-norm", 1);
-      var elevd2_node = self.getNode("surface-positions/elevator-door[1]/position-norm", 1);
-      var elevd3_node = self.getNode("surface-positions/elevator-door[2]/position-norm", 1);
-      var elevd4_node = self.getNode("surface-positions/elevator-door[3]/position-norm", 1);
-
-      ########
-      # whips function
-
-      var whip_antennas = aircraft.door.new("/sim/whip-antennas", 6);
-      var antenna_node  = self.getNode("sim/antenna-pos-norm", 1);
-
       ###########
       # add AN/SPN-46 see http://chateau-logic.com/content/emesary-nasal-implementation-flightgear
       # by Richard Harrison (2016)
@@ -292,206 +170,106 @@ added by Michael Habarta
       });
       an_spn_46_timer.restart(6);
 
-      ########
-      # the main loop
 
-      var loopid = 1;
 
-      var loop = func(id) {
-        if (id != loopid) { return; }
+    
+     var check_rails = func (i) {
 
-        var turn = control_node.getValue();
+	var el_state = getprop(pathc~"/surface-positions/elevator["~i~"]/position-norm");
+	var el_cmd = getprop("controls/truman/elevator["~i~"]/state");
+	print ("Rail check, state: ", el_state);
 
-        value = getprop("/sim/rendering/rembrandt/enabled");
-        rembrandt_node.setBoolValue(value);
+	if ((el_state == 0) and (el_cmd == 0))
+		{
+		rail_upper_array[i].close();
+		rail_lower_array[i].close();
+		}
+	else if ((el_state == 1) and (el_cmd == 1))
+		{
+		rail_upper_array[i].open();
+		rail_lower_array[i].open();
+		}
+	else if ((el_state == 0) and (el_cmd == 1))
+		{
+		rail_upper_array[i].close();
+		rail_lower_array[i].open();
+		}
+	else if ((el_state == 1) and (el_cmd == 0))
+		{
+		rail_upper_array[i].close();
+		rail_lower_array[i].open();
+		}
 
-        value = getprop("/sim/time/sun-angle-rad");
-        sunAngleRad_node.setValue(value);
+     }
 
-        # elevators
-        var elev1 = getprop("/surface-positions/elevator[0]/position-norm");
-        elev1_node.setValue(elev1);
-        var elev2 = getprop("/surface-positions/elevator[1]/position-norm");
-        elev2_node.setValue(elev2);
-        var elev3 = getprop("/surface-positions/elevator[2]/position-norm");
-        elev3_node.setValue(elev3);
-        var elev4 = getprop("/surface-positions/elevator[3]/position-norm");
-        elev4_node.setValue(elev4);
 
-        if ( getprop("ai/models/carrier/controls/elevator[0]/state") == 1) {
-          elevator1.open();
-        } else {
-          elevator1.close();
-        }
 
-        if ( getprop("ai/models/carrier/controls/elevator[1]/state") == 1) {
-          elevator2.open();
-        } else {
-          elevator2.close();
-        }
+     var elevator_operate = func (i){
 
-        if ( getprop("ai/models/carrier/controls/elevator[2]/state") == 1) {
-          elevator3.open();
-        } else {
-          elevator3.close();
-        }
+	check_rails(i);
 
-        if ( getprop("ai/models/carrier/controls/elevator[3]/state") == 1) {
-          elevator4.open();
-        } else {
-          elevator4.close();
-        }
+	var tgt = getprop("/controls/truman/elevator["~i~"]/state");
+	if (tgt == 1)
+		{
+		print ("Elevator ", i+1, " up.");
+		elevator_array[i].open();
 
-        # invert elevator wires
-        # Remark: needed for scale animation
-        elevw1_node.setValue(1-elev1);
-        elevw2_node.setValue(1-elev2);
-        elevw3_node.setValue(1-elev3);
-        elevw4_node.setValue(1-elev4);
+		}
+	else
+		{
+		print ("Elevator ", i+1, " down.");
+		elevator_array[i].close();
+		}
+	settimer( func {check_rails(i);}, elevator_transit_time);
+     }
 
-        # elevator rails
-        var elevr1 = getprop("/surface-positions/elevator-rail[0]/position-norm");
-        elevr1_node.setValue(elevr1);
-        var elevr2 = getprop("/surface-positions/elevator-rail[1]/position-norm");
-        elevr2_node.setValue(elevr2);
-        var elevr3 = getprop("/surface-positions/elevator-rail[2]/position-norm");
-        elevr3_node.setValue(elevr3);
-        var elevr4 = getprop("/surface-positions/elevator-rail[3]/position-norm");
-        elevr4_node.setValue(elevr4);
+     var door_operate = func (i){
 
-        if ( getprop("ai/models/carrier/controls/elevator-rail[0]/state") == 1) {
-          elevatorr1.open();
-        } else {
-          elevatorr1.close();
-        }
 
-        if ( getprop("ai/models/carrier/controls/elevator-rail[1]/state") == 1) {
-          elevatorr2.open();
-        } else {
-          elevatorr2.close();
-        }
 
-        if ( getprop("ai/models/carrier/controls/elevator-rail[2]/state") == 1) {
-          elevatorr3.open();
-        } else {
-          elevatorr3.close();
-        }
+	var tgt = getprop("/controls/truman/door["~i~"]/state");
+	if (tgt == 1)
+		{
+		print ("Door ", i+1, " close.");
+		door_array[i].open();
+		}
+	else
+		{
+		print ("Door ", i+1, " open.");
+		door_array[i].close();
+		}
+     }
 
-        if ( getprop("ai/models/carrier/controls/elevator-rail[3]/state") == 1) {
-          elevatorr4.open();
-        } else {
-          elevatorr4.close();
-        }
+   var flight_ops = func {
+	
+	var state = getprop("/controls/truman/flight-operations");
 
-        # elevator rails door
-        var elevrd1 = getprop("/surface-positions/elevator-rail-door[0]/position-norm");
-        elevrd1_node.setValue(elevrd1);
-        var elevrd2 = getprop("/surface-positions/elevator-rail-door[1]/position-norm");
-        elevrd2_node.setValue(elevrd2);
-        var elevrd3 = getprop("/surface-positions/elevator-rail-door[2]/position-norm");
-        elevrd3_node.setValue(elevrd3);
-        var elevrd4 = getprop("/surface-positions/elevator-rail-door[3]/position-norm");
-        elevrd4_node.setValue(elevrd4);
+	if (state == 0) 
+		{
+		whip_antennas.close();
+		print ("Whip antennas retract.");
+		}
+	else 
+		{
+		whip_antennas.open();
+		print ("Whip antennas deploy.");
+		}
 
-        if ( getprop("ai/models/carrier/controls/elevator-rail-door[0]/state") == 1) {
-          elevatorrd1.open();
-        } else {
-          elevatorrd1.close();
-        }
+    }
 
-        if ( getprop("ai/models/carrier/controls/elevator-rail-door[1]/state") == 1) {
-          elevatorrd2.open();
-        } else {
-          elevatorrd2.close();
-        }
 
-        if ( getprop("ai/models/carrier/controls/elevator-rail-door[2]/state") == 1) {
-          elevatorrd3.open();
-        } else {
-          elevatorrd3.close();
-        }
+     var l_flightops = setlistener("/controls/truman/flight-operations", func {flight_ops();},0,0);
 
-        if ( getprop("ai/models/carrier/controls/elevator-rail-door[3]/state") == 1) {
-          elevatorrd4.open();
-        } else {
-          elevatorrd4.close();
-        }
+     var l_elev1 = setlistener("/controls/truman/elevator/state", func {elevator_operate(0);},0,0);
+     var l_elev2 = setlistener("/controls/truman/elevator[1]/state", func {elevator_operate(1);},0,0);
+     var l_elev3 = setlistener("/controls/truman/elevator[2]/state", func {elevator_operate(2);},0,0);
+     var l_elev4 = setlistener("/controls/truman/elevator[3]/state", func {elevator_operate(3);},0,0);
 
-        # elevator doors
-        var elevd1 = getprop("/surface-positions/elevator-door[0]/position-norm");
-        elevd1_node.setValue(elevd1);
-        var elevd2 = getprop("/surface-positions/elevator-door[1]/position-norm");
-        elevd2_node.setValue(elevd2);
-        var elevd3 = getprop("/surface-positions/elevator-door[2]/position-norm");
-        elevd3_node.setValue(elevd3);
-        var elevd4 = getprop("/surface-positions/elevator-door[3]/position-norm");
-        elevd4_node.setValue(elevd4);
+     var l_door1 = setlistener("/controls/truman/door/state", func {door_operate(0);},0,0);
+     var l_door2 = setlistener("/controls/truman/door[1]/state", func {door_operate(1);},0,0);
+     var l_door3 = setlistener("/controls/truman/door[2]/state", func {door_operate(2);},0,0);
+     var l_door4 = setlistener("/controls/truman/door[3]/state", func {door_operate(3);},0,0);
 
-        if ( getprop("ai/models/carrier/controls/elevator-door[0]/state") == 1) {
-          elevatord1.open();
-        } else {
-          elevatord1.close();
-        }
-
-        if ( getprop("ai/models/carrier/controls/elevator-door[1]/state") == 1) {
-          elevatord2.open();
-        } else {
-          elevatord2.close();
-        }
-
-        if ( getprop("ai/models/carrier/controls/elevator-door[2]/state") == 1) {
-          elevatord3.open();
-        } else {
-          elevatord3.close();
-        }
-
-        if ( getprop("ai/models/carrier/controls/elevator-door[3]/state") == 1) {
-          elevatord4.open();
-        } else {
-          elevatord4.close();
-        }
-
-        # whip antenna
-        if ( getprop("ai/models/carrier/controls/flight-operations") ){
-          whip_antennas.open();
-        } else {
-          whip_antennas.close();
-        }
-        var whipant = getprop("/sim/whip-antennas/position-norm");
-        antenna_node.setValue(whipant);
-
-        var vn = getprop("/sim/current-view/view-number");
-
-        if ( vn == 3 or vn == 4 ) {
-          if ( getprop("/sim/tower/carrier-auto-position") and !getprop("/sim/tower/auto-position") ) {
-            AIcarrier.syncTowerView();
-          }
-        }
-
-        settimer(func { loop(id); }, 0);
-      }
-
-      settimer(func { loop(loopid); }, 0);
-
-      # mark ready flag
-      setprop(pathc ~ "/ready",1);
-
-      #  fix missing parkpos
-      if ( getprop("/sim/presets/parkpos") == "" ) {
-        setprop("/sim/presets/parkpos",n.getNode("scenario/entry/parking-pos").getValue("name"));
-      }
-
-      # set tower, i.e.active carrier
-      # fixme: condition of setting should not be checked here but in setting function
-      carr_cnt = AIcarrier.countCarriersReady();
-
-      if ( carr_cnt > 0 and in_air ) {
-        # Attention:
-        # The following function waits until all carriers are ready.
-        # Check if in case more than one is active
-        # if there could be some kind of deadlock situation ?
-        AIcarrier.setActiveCarrier();
-      }
 
     ]]></load>
 
@@ -500,24 +278,7 @@ added by Michael Habarta
 
       an_spn_46_timer.stop();
 
-      loopid += 1;
 
-      var carr_cnt = AIcarrier.countCarriers();
-
-      if ( carr_cnt == 0 ) {
-        # fixme: this only works if the last unloaded carrier
-        #        was the first one loaded (= the one who set the listener)
-        removelistener(lblis);
-        print("listener for launchbar lock removed ...");
-        removelistener(wowlis);
-        print("listener for ac on carrier removed ...");
-
-        # reset presets
-        AIcarrier.resetPresets();
-      }
-
-      # cycle to next carrier or reset tower
-      AIcarrier.cycleTowers();
 
     ]]></unload>
 
@@ -574,7 +335,7 @@ added by Michael Habarta
     <type>select</type>
     <object-name>crew</object-name>
     <condition>
-      <property>/controls/crew</property>
+      <property>/controls/truman/crew</property>
     </condition>
   </animation>
 
@@ -656,7 +417,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-1</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>-100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -673,7 +434,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-2</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>-100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -690,7 +451,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-3</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>-100</factor>
     <axis>
       <x1-m>-18.083</x1-m>
@@ -705,7 +466,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-4</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>-100</factor>
     <axis>
       <x1-m>-18.083</x1-m>
@@ -720,7 +481,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-5</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>-100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -737,7 +498,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-6</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>-100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -754,7 +515,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-7</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>-100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -771,7 +532,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-8</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -788,7 +549,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-9</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -805,7 +566,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-10</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -822,7 +583,7 @@ added by Michael Habarta
   <animation>
     <type>rotate</type>
     <object-name>antenna-11</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <factor>100</factor>
     <center>
       <x-m>  0.000</x-m>
@@ -840,7 +601,7 @@ added by Michael Habarta
   <animation>
     <type>translate</type>
     <object-name>Howdah-cover</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <interpolation>
       <entry><ind>0.00</ind><dep>0.00</dep></entry>
       <entry><ind>0.15</ind><dep>-0.10</dep></entry>
@@ -854,7 +615,7 @@ added by Michael Habarta
   <animation>
     <type>translate</type>
     <object-name>Howdah-cover</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <interpolation>
       <entry><ind>0.00</ind><dep>0.00</dep></entry>
       <entry><ind>0.15</ind><dep>0.00</dep></entry>
@@ -870,7 +631,7 @@ added by Michael Habarta
     <type>translate</type>
     <object-name>Howdah</object-name>
     <object-name>Howdah-glass</object-name>
-    <property>sim/antenna-pos-norm</property>
+    <property>surface-positions/whip-antennas/position-norm</property>
     <interpolation>
       <entry><ind>0.00</ind><dep>0.00</dep></entry>
       <entry><ind>0.60</ind><dep>0.00</dep></entry>
@@ -3649,8 +3410,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>AIcarrier.toggleFlightOperations();</script>
+	<command>property-toggle</command>
+	<property>/controls/truman/flight-operations</property>
       </binding>
     </action>
     <hovered>
@@ -3670,10 +3431,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>
-          AIcarrier.operateElevator(0);
-        </script>
+	<command>property-toggle</command>
+	<property>/controls/truman/elevator/state</property>
       </binding>
     </action>
     <hovered>
@@ -3692,10 +3451,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>
-          AIcarrier.operateElevator(1);
-        </script>
+	<command>property-toggle</command>
+	<property>/controls/truman/elevator[1]/state</property>
       </binding>
     </action>
     <hovered>
@@ -3714,10 +3471,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>
-          AIcarrier.operateElevator(2);
-        </script>
+	<command>property-toggle</command>
+	<property>/controls/truman/elevator[2]/state</property>
       </binding>
     </action>
     <hovered>
@@ -3736,10 +3491,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>
-          AIcarrier.operateElevator(3);
-        </script>
+	<command>property-toggle</command>
+	<property>/controls/truman/elevator[3]/state</property>
       </binding>
     </action>
     <hovered>
@@ -3760,11 +3513,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>
-          var p = !getprop("ai/models/carrier/controls/elevator-door[0]/state");
-          setprop("ai/models/carrier/controls/elevator-door[0]/state",p);
-        </script>
+	<command>property-toggle</command>
+	<property>/controls/truman/door/state</property>
       </binding>
     </action>
     <hovered>
@@ -3784,11 +3534,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>
-          var p = !getprop("ai/models/carrier/controls/elevator-door[1]/state");
-          setprop("ai/models/carrier/controls/elevator-door[1]/state",p);
-        </script>
+	<command>property-toggle</command>
+	<property>/controls/truman/door[1]/state</property>
       </binding>
     </action>
     <hovered>
@@ -3808,11 +3555,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>
-          var p = !getprop("ai/models/carrier/controls/elevator-door[2]/state");
-          setprop("ai/models/carrier/controls/elevator-door[2]/state",p);
-        </script>
+	<command>property-toggle</command>
+	<property>/controls/truman/door[2]/state</property>
       </binding>
     </action>
     <hovered>
@@ -3832,11 +3576,8 @@ added by Michael Habarta
       <button>0</button>
       <repeatable>false</repeatable>
       <binding>
-        <command>nasal</command>
-        <script>
-          var p = !getprop("ai/models/carrier/controls/elevator-door[3]/state");
-          setprop("ai/models/carrier/controls/elevator-door[3]/state",p);
-        </script>
+	<command>property-toggle</command>
+	<property>/controls/truman/door[3]/state</property>
       </binding>
     </action>
     <hovered>
@@ -3847,4 +3588,29 @@ added by Michael Habarta
       </binding>
     </hovered>
   </animation>
+
+  <animation>
+    <type>pick</type>
+    <object-name>island</object-name>
+    <object-name>island-details</object-name>
+    <object-name>bridge</object-name>
+    <action>
+      <button>0</button>
+      <repeatable>false</repeatable>
+      <binding>
+	<command>dialog-show</command>
+	<dialog-name>TrumanControls</dialog-name>
+	<property></property>
+      </binding>
+    </action>
+    <hovered>
+      <binding>
+        <command>set-tooltip</command>
+        <tooltip-id>bridge</tooltip-id>
+        <label>show Truman control dialog</label>
+      </binding>
+    </hovered>
+  </animation>
+
+
 </PropertyList>
diff --git a/gui/dialogs/truman.xml b/gui/dialogs/truman.xml
new file mode 100644
index 000000000..35e512ddf
--- /dev/null
+++ b/gui/dialogs/truman.xml
@@ -0,0 +1,318 @@
+<?xml version="1.0"?>
+
+<PropertyList>
+	<name>TrumanControls</name>
+	<modal>false</modal>
+	<layout>vbox</layout>
+
+
+
+
+	<group>
+		<layout>hbox</layout>
+
+		<empty>
+			<stretch>1</stretch>
+		</empty>
+
+		<text>
+			<label>USS Harry S. Truman Controls</label>
+		</text>
+
+		<empty>
+			<stretch>1</stretch>
+		</empty>
+
+		<button>
+			<pref-width>16</pref-width>
+			<pref-height>16</pref-height>
+			<legend></legend>
+			<keynum>27</keynum>
+			<border>2</border>
+			<binding>
+				<command>dialog-close</command>
+			</binding>
+		</button>
+	</group>
+
+	<hrule/>
+
+	<group>
+		<layout>table</layout>
+
+		<text>
+			<label>Course</label>
+			<row>0</row>
+			<col>0</col>
+		</text>
+
+		<radio>
+			<row>1</row>
+			<col>0</col>
+			<halign>left</halign>
+			<label>Turn to launch course</label>
+			<property>/ai/models/carrier/controls/turn-to-launch-hdg</property>
+			<live>true</live>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+			<binding>
+				<command>nasal</command>
+				<script>
+					var v = getprop("/ai/models/carrier/controls/turn-to-launch-hdg");
+						foreach (var c; props.globals.getNode("/ai/models").getChildren("carrier")){
+						c.getNode("controls/turn-to-launch-hdg").setBoolValue(v);
+						c.getNode("controls/turn-to-recovery-hdg").setBoolValue(0);
+						c.getNode("controls/turn-to-base-course").setBoolValue(0);
+						}
+				</script>
+			</binding>
+		</radio>
+
+		<radio>
+			<row>2</row>
+			<col>0</col>
+			<halign>left</halign>
+			<label>Turn to recovery course</label>
+			<property>/ai/models/carrier/controls/turn-to-recovery-hdg</property>
+			<live>true</live>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+			<binding>
+				<command>nasal</command>
+				<script>
+					var v = getprop("/ai/models/carrier/controls/turn-to-recovery-hdg");
+						foreach (var c; props.globals.getNode("/ai/models").getChildren("carrier")){
+						c.getNode("controls/turn-to-recovery-hdg").setBoolValue(v);
+						c.getNode("controls/turn-to-launch-hdg").setBoolValue(0);
+						c.getNode("controls/turn-to-base-course").setBoolValue(0);
+						}
+				</script>
+			</binding>
+		</radio>
+
+		<radio>
+			<row>3</row>
+			<col>0</col>
+			<halign>left</halign>
+			<label>Turn to base course</label>
+			<property>/ai/models/carrier/controls/turn-to-base-course</property>
+			<live>true</live>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+			<binding>
+				<command>nasal</command>
+				<script>
+					var v = getprop("/ai/models/carrier/controls/turn-to-base-course");
+						foreach (var c; props.globals.getNode("/ai/models").getChildren("carrier")){
+						c.getNode("controls/turn-to-base-course").setBoolValue(v);
+						c.getNode("controls/turn-to-recovery-hdg").setBoolValue(0);
+						c.getNode("controls/turn-to-launch-hdg").setBoolValue(0);
+						}
+				</script>
+			</binding>
+		</radio>
+		</group>
+
+		<hrule/>
+
+		<group>
+		<layout>table</layout>
+
+		<text>
+			<label>Elevators and doors</label>
+			<row>0</row>
+			<col>0</col>
+		</text>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>1</row>
+			<col>0</col>
+			<label>Elevator 1</label>
+			<property>/controls/truman/elevator[0]/state</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>1</row>
+			<col>1</col>
+			<label>Elevator 2</label>
+			<property>/controls/truman/elevator[1]/state</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>1</row>
+			<col>2</col>
+			<label>Elevator 3</label>
+			<property>/controls/truman/elevator[2]/state</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>1</row>
+			<col>3</col>
+			<label>Elevator 4</label>
+			<property>/controls/truman/elevator[3]/state</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>2</row>
+			<col>0</col>
+			<label>Door 1</label>
+			<property>/controls/truman/door[0]/state</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>2</row>
+			<col>1</col>
+			<label>Door 2</label>
+			<property>/controls/truman/door[1]/state</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>2</row>
+			<col>2</col>
+			<label>Door 3</label>
+			<property>/controls/truman/door[2]/state</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>2</row>
+			<col>3</col>
+			<label>Door 4</label>
+			<property>/controls/truman/door[3]/state</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		</group>
+
+
+		<hrule/>
+
+		<group>
+		<layout>table</layout>
+
+		<text>
+			<label>Options</label>
+			<row>0</row>
+			<col>0</col>
+		</text>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>1</row>
+			<col>0</col>
+			<label>Enable Deck Park</label>
+			<property>/controls/truman/deck-park</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		<checkbox>
+			<halign>left</halign>
+			<row>2</row>
+			<col>0</col>
+			<label>Enable Crew</label>
+			<property>/controls/truman/crew</property>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</checkbox>
+
+		</group>
+
+		<empty>
+			<stretch>1</stretch>
+		</empty>
+
+
+
+
+
+	<hrule/>
+
+
+
+	<hrule/>
+
+	<group>
+		<layout>hbox</layout>
+		<default-padding>6</default-padding>
+		<empty>
+			<stretch>true</stretch>
+		</empty>
+
+		<button>
+			<legend>OK</legend>
+			<default>true</default>
+			<equal>true</equal>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+			<binding>
+				<command>dialog-close</command>
+			</binding>
+		</button>
+
+		<button>
+			<legend>Apply</legend>
+			<equal>true</equal>
+			<binding>
+				<command>dialog-apply</command>
+			</binding>
+		</button>
+
+		<button>
+			<legend>Reset</legend>
+			<equal>true</equal>
+			<binding>
+				<command>dialog-update</command>
+			</binding>
+		</button>
+
+		<button>
+			<legend>Cancel</legend>
+			<equal>true</equal>
+			<key>Esc</key>
+			<binding>
+				<command>dialog-close</command>
+			</binding>
+		</button>
+
+		<empty>
+			<stretch>true</stretch>
+		</empty>
+	</group>
+</PropertyList>