【问题标题】:Multiple functions from one button一键实现多种功能
【发布时间】:2021-02-12 08:41:22
【问题描述】:

我一直在使用这段代码进行 VR 飞行模拟,效果很好。但现在我一直在尝试做的是将它从使用 9 个按钮更改为只使用一个。目前每个按钮都会激活其中一个功能,我希望它做的是 1 个按钮将循环浏览所有功能。任何帮助将不胜感激。

-- Load sounds
heading_sound = sound_add("heading.wav")
altitude_sound = sound_add("altitude.wav") 
vertspd_sound = sound_add("verticalspd_baro.wav") 
com1_sound = sound_add("stby_com1.wav")
com2_sound = sound_add("stby_com2.wav")
nav1_sound = sound_add("stby_nav1.wav")
nav2_sound = sound_add("stby_nav2.wav")
com1xfr_sound = sound_add("com1_txfr.wav")
com2xfr_sound = sound_add("com2_txfr.wav")
nav1xfr_sound = sound_add("nav1_txfr.wav")
nav2xfr_sound = sound_add("nav2_txfr.wav")
obs1_sound = sound_add("obs_one.wav")
obs2_sound = sound_add("obs_two.wav")
dirv1_sound = sound_add("direct_vor1.wav")
dirv2_sound = sound_add("direct_vor2.wav")
nogps_1_sound = sound_add("no_gps1.wav")
nogps_2_sound = sound_add("no_gps2.wav")
g530_1_sound = sound_add("G530_1.wav")
g530_2_sound = sound_add("G530_2.wav")
g1000_1_sound = sound_add("G1000_1.wav")
g1000_2_sound = sound_add("G1000_2.wav")
ignition_1_sound = sound_add("eng1_ign.wav")
ignition_2_sound = sound_add("eng2_ign.wav")
sync_hdg_sound = sound_add("sync_hdg.wav")
sync_alt_sound = sound_add( "sync_alt.wav")
sync_vs_sound = sound_add( "sync_vs.wav")
cursor_sound = sound_add( "cursor.wav")
inop_sound = sound_add("inop.wav")
engage_1_sound = sound_add("engage_start1.wav")
engage_2_sound = sound_add("engage_start2.wav")
release_sound = sound_add("release_start.wav")
-- Play the sound
--sound_play(mysound1)

local outer_accel=3
local outer_clockwise= nil
local outer_counter_clockwise = nil
local inner_accel=1
local inner_clockwise= nil
local inner_counter_clockwise = nil
local button_push = "none"
local button_release = "none"
local type_gps1 = "NONE"
local type_gps2 = "NONE"
local dir_bear1= 0
local dir_bear2 = 0
local heading_bug = 0
local alt_bug = 0
local obs_1 = 0
local obs_2= 0
local play_sync = nil

-- User properties
gps1_prop = user_prop_add_enum("No. 1 GPS Type", "G530,G1000,NONE","NONE", "Choose type for GPS 1 knob")
type_gps1 = user_prop_get(gps1_prop)
gps2_prop = user_prop_add_enum("No. 2 GPS Type", "G530,G1000,NONE","NONE",  "Choose type for GPS 2 knob")
type_gps2 = user_prop_get(gps2_prop)


--Button 1,1   Headingx10, Heading, HDG sync

function button11_pressed()
    sound_play(heading_sound)
    outer_accel=10
    outer_clockwise= "sim/autopilot/heading_up"
    outer_counter_clockwise = "sim/autopilot/heading_down"
    inner_accel=1
    inner_clockwise= "sim/autopilot/heading_up"
    inner_counter_clockwise = "sim/autopilot/heading_down"
    button_push = "sim/autopilot/heading_sync"
    button_release = "none"
    play_sync = sync_hdg_sound
end

hw_button_add("ARDUINO_NANO_A_D7", button11_pressed)

--Button 1,2   ALTx10, Alt, Alt sync

function button12_pressed()
    sound_play(altitude_sound)
    outer_accel=10
    outer_clockwise= "sim/autopilot/altitude_up"
    outer_counter_clockwise = "sim/autopilot/altitude_down"
    inner_accel=1
    inner_clockwise= "sim/autopilot/altitude_up"
    inner_counter_clockwise = "sim/autopilot/altitude_down"
    button_push = "sim/autopilot/altitude_sync"
    button_release = "none"
    play_sync = sync_alt_sound
end

hw_button_add("ARDUINO_NANO_A_D8", button12_pressed)

--Button 1,3   VS, baro, VS sync

function button13_pressed()
    sound_play(vertspd_sound)
    outer_accel= 1
    outer_clockwise= "sim/autopilot/vertical_speed_up"
    outer_counter_clockwise = "sim/autopilot/vertical_speed_down"
    inner_accel= 1
    inner_clockwise= "sim/instruments/barometer_up"
    inner_counter_clockwise = "sim/instruments/barometer_down"
    button_push = "sim/autopilot/vertical_speed_sync"
    button_release = "none"
    play_sync = sync_vs_sound
end

hw_button_add("ARDUINO_NANO_A_D9", button13_pressed)

--Button 2,1   Com 1 stby, Com 2 stby, flip coms

local  com_sel = 0
function button21_pressed()
    outer_accel= 1
    inner_accel= 1
    com_sel = math.abs( com_sel -  1)
        if com_sel == 1 then
        n= "1"
        sound_play(com1_sound)
    else
        n= "2"
        sound_play(com2_sound)
    end
    outer_clockwise= "sim/radios/stby_com"..n.."_coarse_up_833"
    outer_counter_clockwise = "sim/radios/stby_com"..n.."_coarse_down_833"
    inner_clockwise= "sim/radios/stby_com"..n.."_fine_up_833"
    inner_counter_clockwise = "sim/radios/stby_com"..n.."_fine_down_833"
    button_push = "com_toggle"..n
    button_release = "none"
    play_sync = nil
end

hw_button_add("ARDUINO_NANO_A_D10", button21_pressed)

--Button 2,2   Nav 1 stby, Nav 2 stby, flip navs
local  nav_sel = 0
function button22_pressed()
    outer_accel= 1
    inner_accel= 1
    nav_sel = math.abs( nav_sel -  1)
    if nav_sel == 1 then
        n= "1"
        sound_play(nav1_sound)
    else
        n= "2"
        sound_play(nav2_sound)
    end
    outer_clockwise= "sim/radios/stby_nav"..n.."_coarse_up"
    outer_counter_clockwise = "sim/radios/stby_nav"..n.."_coarse_down"
    inner_clockwise= "sim/radios/stby_nav"..n.."_fine_up"
    inner_counter_clockwise = "sim/radios/stby_nav"..n.."_fine_down"
    button_push = "nav_toggle"..n
    button_release = "none"
    play_sync = nil
end

hw_button_add("ARDUINO_NANO_A_D11", button22_pressed)

--Button 2,3   Obs 1, Obs 2, Toggle
local  obs_sel = 0
function button23_pressed()
    outer_accel= 10
    inner_accel= 1
    obs_sel = math.abs( obs_sel -  1)
    if obs_sel == 1 then
        n= "1"
        sound_play(obs1_sound)
    else
        n= "2"
        sound_play(obs2_sound)
    end
    outer_clockwise= "sim/radios/obs"..n.."_up"
    outer_counter_clockwise = "sim/radios/obs"..n.."_down"
    
    inner_clockwise= "sim/radios/obs"..n.."_up"
    inner_counter_clockwise = "sim/radios/obs"..n.."_down"
    button_push = "direct"..n
    button_release = "none"
    play_sync = nil
end

hw_button_add("ARDUINO_NANO_A_D12", button23_pressed)

--Button 3, 1   GPS1

function button31_pressed()
    outer_accel= 1
    inner_accel= 1
    if type_gps1 == "NONE" then
        sound_play(nogps_1_sound)
        outer_clockwise=  "none"
        outer_counter_clockwise =  "none"
        inner_clockwise=  "none"
        inner_counter_clockwise =  "none"
        button_push = "none"
        button_release = "none"
        play_sync = inop_sound
    elseif  type_gps1 == "G530"  then
        sound_play(g530_1_sound)
        outer_clockwise= "sim/GPS/g430n1_chapter_up"
        outer_counter_clockwise = "sim/GPS/g430n1_chapter_dn"
        inner_clockwise= "sim/GPS/g430n1_page_up"
        inner_counter_clockwise = "sim/GPS/g430n1_page_dn"
        button_push = "sim/GPS/g430n1_cursor"
        button_release = "none"
        play_sync = cursor_sound
    elseif  type_gps1 == "G1000"  then
        sound_play(g1000_1_sound)
        outer_clockwise= "sim/GPS/g1000n1_fms_outer_up"
        outer_counter_clockwise = "sim/GPS/g1000n1_fms_outer_down"
        inner_clockwise= "sim/GPS/g1000n1_fms_inner_up"
        inner_counter_clockwise = "sim/GPS/g1000n1_fms_inner_down"
        button_push = "sim/GPS/g1000n1_cursor"
        button_release = "none"
        play_sync = cursor_sound
    end
    
end

hw_button_add("ARDUINO_NANO_A_A5", button31_pressed)

--Button 3, 2   GPS2

function button32_pressed()
    outer_accel= 1
    inner_accel= 1
    if type_gps2 == "NONE" then
        sound_play(nogps_2_sound)
        outer_clockwise=  "none"
        outer_counter_clockwise =  "none"
        inner_clockwise=  "none"
        inner_counter_clockwise =  "none"
        button_push = "none"
        button_release = "none"
        play_sync = inop_sound
    elseif  type_gps2 == "G530"  then
        sound_play(g530_2_sound)
        outer_clockwise= "sim/GPS/g430n2_chapter_up"
        outer_counter_clockwise = "sim/GPS/g430n2_chapter_dn"
        inner_clockwise= "sim/GPS/g430n2_page_up"
        inner_counter_clockwise = "sim/GPS/g430n2_page_dn"
        button_push = "sim/GPS/g430n2_cursor"
        button_release = "none"
        play_sync = cursor_sound
    elseif  type_gps2 == "G1000"  then
        sound_play(g1000_2_sound)
        outer_clockwise= "sim/GPS/g1000n2_fms_outer_up"
        outer_counter_clockwise = "sim/GPS/g1000n2_fms_outer_down"
        inner_clockwise= "sim/GPS/g1000n2_fms_inner_up"
        inner_counter_clockwise = "sim/GPS/g1000n2_fms_inner_down"
        button_push = "sim/GPS/g1000n2_cursor"
        button_release = "none"
        play_sync = cursor_sound
    end
    
end

hw_button_add("ARDUINO_NANO_A_A4", button32_pressed)

--Button 3,3   Start 1, start 2, Toggle
local  start_sel = 0
function button33_pressed()
    outer_accel= 1
    inner_accel= 1
    start_sel = math.abs( start_sel -  1)
    if start_sel == 1 then
        n= "1"
        sound_play(ignition_1_sound)
    else
        n= "2"
        sound_play(ignition_2_sound)
    end
    outer_clockwise= "sim/ignition/ignition_up_"..n
    outer_counter_clockwise = "sim/ignition/ignition_down_"..n
    
    inner_clockwise= "sim/ignition/ignition_up_"..n
    inner_counter_clockwise =  "sim/ignition/ignition_down_"..n
    button_push = "starter"..n
    button_release = "stop"..n
    
end

hw_button_add("ARDUINO_NANO_A_A3", button33_pressed)

-- Outer Knob Encoder


-- Callback function which is called when the rotary encoder is turned
-- direction 1 : The dial turned clockwise
-- direciton -1: The dial turned counterclockwise
function outer_dial_change(direction)

  if direction == 1 then

        xpl_command(outer_clockwise)

    

  elseif direction == -1 then
  

        xpl_command(outer_counter_clockwise)

  end

end

-- Bind to Arduino A 
--hw_dial_add("ARDUINO_NANO_A_D3", "ARDUINO_NANO_A_D2", outer_accel, outer_dial_change)
hw_dial_add("OUTER_KNOB", outer_accel, outer_dial_change)
-- Inner Knob Encoder

function inner_dial_change(direction)

  if direction == 1 then

        xpl_command(inner_clockwise)


  elseif direction == -1 then
  

        xpl_command(inner_counter_clockwise)

  end

end

-- Bind to Arduino A 
--hw_dial_add("ARDUINO_NANO_A_D4", "ARDUINO_NANO_A_D5", inner_accel, inner_dial_change)
hw_dial_add("INNER_KNOB", inner_accel, inner_dial_change)

function button_released()
    if button_release == "stop1" then

        xpl_command("sim/ignition/ignition_up_1", 0)
        sound_stop(engage_1_sound)
        sound_play(release_sound)

    elseif button_release == "stop2" then

        xpl_command("sim/ignition/ignition_up_2", 0)
        sound_stop(engage_2_sound)
        sound_play(release_sound)

    end
end

function button_pressed()
    if button_push == "com_toggle1" then
    sound_play(com1xfr_sound)
        xpl_command("sim/radios/com1_standy_flip")
    elseif button_push == "com_toggle2" then
        xpl_command("sim/radios/com2_standy_flip")
        sound_play(com2xfr_sound)
    elseif button_push == "nav_toggle1" then
        xpl_command("sim/radios/nav1_standy_flip")
        sound_play(nav1xfr_sound)
    elseif button_push == "nav_toggle2" then
        xpl_command("sim/radios/nav2_standy_flip")
        sound_play(nav2xfr_sound)
    elseif button_push == "direct1" then 
        sound_play(dirv1_sound)
        xpl_dataref_write("sim/cockpit2/radios/actuators/nav1_obs_deg_mag_pilot","FLOAT", dir_bear1)
    elseif button_push == "direct2" then
        sound_play(dirv2_sound)
        xpl_dataref_write("sim/cockpit2/radios/actuators/nav2_obs_deg_mag_pilot","FLOAT", dir_bear2)
    elseif button_push == "starter1" then
        sound_play(engage_1_sound)
        xpl_command("sim/ignition/ignition_up_1", 1)
    elseif button_push == "starter2" then
        sound_play(engage_2_sound)
        xpl_command("sim/ignition/ignition_up_2", 1)
    else
        xpl_command( button_push )
        if play_sync ~= nil then  sound_play(play_sync) end
    end


end

hw_button_add("ARDUINO_NANO_A_D6", button_pressed, button_released)


function set_values( dir1, dir2, hdg, alt, obs1, obs2 )
dir_bear1= dir1
dir_bear2 = dir2
heading_bug = hdg
alt_bug = alt
obs_1 = obs1
obs_2= obs2
end

xpl_dataref_subscribe("sim/cockpit2/radios/indicators/nav1_bearing_deg_mag", "FLOAT","sim/cockpit2/radios/indicators/nav2_bearing_deg_mag", "FLOAT", "sim/cockpit/autopilot/heading_mag", "FLOAT", "sim/cockpit/autopilot/altitude", "FLOAT","sim/cockpit/radios/nav1_obs_degm", "FLOAT", "sim/cockpit/radios/nav2_obs_degm", "FLOAT", set_values)

【问题讨论】:

  • 有什么自己的想法吗?这不是编码服务。还将您的代码减少到最低限度。没有人愿意通读多页代码。
  • 我试图做一个按钮计数器功能,但无法让它真正与这些功能一起工作。

标签: lua evaluation


【解决方案1】:

在函数列表中循环的函数的简单演示代码

-- put your functions into a table
local functions = {
  function () print("1") end,
  function () print("2") end,
  function () print("3") end,
}
-- initialize a counter for how often the button was pressed
local buttonCounter = 0
-- call this function every time the button is pressed
function OnButtonPress()
    -- increment counter
    buttonCounter = buttonCounter + 1
    -- call function from list
    functions[buttonCounter]()
    -- make sure to reset your counter once you've reached the last function
    buttonCounter = buttonCounter % #functions
end  
-- "press the button" 6 times
for i = 1, 6 do OnButtonPress() end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多