############################################################################### ## ## Nasal for dual control of a KI-206 VOR indicator over the multiplayer ## network. ## ## Copyright (C) 2007 - 2010 Anders Gidenstam (anders(at)gidenstam.org) ## This file is licensed under the GPL license version 2 or later. ## ############################################################################### # Note: # This module MUST be loaded as KI206. # Slave button presses. var radial_decS = "radial-decS-clicked"; var radial_incS = "radial-incS-clicked"; # Only one step size implemented. var selected_radial = "radials/selected-deg"; var base = ["instrumentation/nav[0]", "instrumentation/nav[1]"]; ########################################################################### var master_ki206 = { new : func(n) { var obj = {}; obj.parents = [master_ki206]; obj.base = props.globals.getNode(base[n]); return obj; }, adjust_radial : func(d) { p = me.base.getNode(selected_radial); var v = p.getValue() + d; if (v < 0) { v += 360; }; if (v > 360) { v -= 360; }; p.setValue(v); } }; ########################################################################### var slave_ki206 = { new : func(n, airoot) { var obj = {}; obj.parents = [slave_ki206]; obj.root = airoot; obj.base = props.globals.getNode(base[n]); return obj; }, adjust_radial : func(d) { var p = 0; if (abs(d) < 0.99) { p = (d < 0) ? me.base.getNode(radial_decS) : me.base.getNode(radial_incS); } else { p = (d < 0) ? me.base.getNode(radial_decS) : me.base.getNode(radial_incS); } if (!p.getValue()) { p.setValue(1); settimer(func { p.setValue(0); }, 1.0); } } }; ########################################################################### # The KI-206 pick animations default to master. # NOTE: Use make_master() and make_slave_to(). Do NOT change ki206 directly. var ki206 = [master_ki206.new(0), master_ki206.new(1)]; ########################################################################### # API for pick animations and dual control setup. ########################################################################### ########################################################################### # n - Nav# var make_master = func(n) { ki206[n] = master_ki206.new(n); } ########################################################################### # n - Nav# var make_slave_to = func(n, airoot) { ki206[n] = KI206.slave_ki206.new(n, airoot); } ########################################################################### # n - Nav# # d - adjustment delta var adjust_radial = func(n, d) { ki206[n].adjust_radial(d); } ########################################################################### # Create aliases to drive the KI 206 3d model in an AI/MP model. # n - Nav# var animate_aimodel = func(n, airoot) { var p = base[n] ~ "/data-is-valid"; airoot.getNode(p, 1).alias(props.globals.getNode(p)); p = base[n] ~ "/in-range"; airoot.getNode(p, 1).alias(props.globals.getNode(p)); p = base[n] ~ "/has-gs"; airoot.getNode(p, 1).alias(props.globals.getNode(p)); p = base[n] ~ "/to-flag"; airoot.getNode(p, 1).alias(props.globals.getNode(p)); p = base[n] ~ "/from-flag"; airoot.getNode(p, 1).alias(props.globals.getNode(p)); p = base[n] ~ "/" ~ selected_radial; airoot.getNode(p, 1).alias(props.globals.getNode(p)); p = base[n] ~ "/heading-needle-deflection"; airoot.getNode(p, 1).alias(props.globals.getNode(p)); p = base[n] ~ "/gs-needle-deflection"; airoot.getNode(p, 1).alias(props.globals.getNode(p)); } ########################################################################### # Create a TDMEncoder node array for sending the current radio state to # slaves. # n - Nav# var master_send_state = func(n) { return [ props.globals.getNode(base[n] ~ "/" ~ selected_radial) ]; } ########################################################################### # Create a SwitchDecoder action array for processing button presses # from a slave. # n - Nav# var master_receive_slave_buttons = func(n) { return [ func (b) { if (b) { KI206.adjust_radial(n, -1.0); } }, func (b) { if (b) { KI206.adjust_radial(n, 1.0); } } ]; } ########################################################################### # Create a TDMDecoder action array for processing the radio state # from the master. # n - Nav# var slave_receive_master_state = func(n) { return [ func (v) { props.globals.getNode(base[n] ~ "/" ~ selected_radial).setValue(v); } ]; } ########################################################################### # Create a SwitchEncoder node array for sending button presses # to the master # n - Nav# var slave_send_buttons = func(n) { return [ props.globals.getNode(base[n] ~ "/" ~ radial_decS, 1), props.globals.getNode(base[n] ~ "/" ~ radial_incS, 1), ]; }