-- *** vSpeedCallouts v1.10 by ManosK - copyright 2017 - 2021 *** -- -- *** Forum link: http://forums.x-plane.org/index.php?/files/file/38144-vspeedcallouts-by-m/ *** -- -- *** Sounds created with NaturalReader - and further tweaked by me *** -- -- *** vSpeedCallouts was originally based on the script: --- IXEG vSpeed Beta v0.110 by Wizball / Tom Stian - 2017 --- Forum: http://forums.x-pilot.com/forums/topic/12002-vspeed-callouts-for-ixeg-733-lua-script/ -- *** but heavily extended in a form that can accommodate a number of aircrafts, from Airliners to General Aviation -- *** However, this script is mostly targeted for airliners and best suited for the following: *** -- -- Aircraft Design Studio/Team Authors -- Boeing B738-800 Laminar Research -- x737-800_v503 x737project,EADT Benedikt Stratmann, Pierre Stone -- Boeing B738-800X Laminar Research mod by Zibo Alex Unruh -- *** ... but in manual mode works for... just about every aircraft ! *** -- -- *** In order to manually adjust the v-Speeds just click on the relative panel BUG settings *** -- -- *** You can also assign a keyboard shortcut such as Alt+v from X-Plane's Keyboard settings, in order to toggle the view of the panel *** -- -- *** FlyWithLua Macros can also be used to toggle the panel view or disable the 80 Knots and Gear Up callouts -- While at first this script was only intended for airliners (hence the following commented out line of code), then I just thought that it -- would be nice not to restrict it, since it supports manual input ! -- if (PLANE_ICAO == "B738") or (PLANE_ICAO == "B744") or (PLANE_ICAO == "B741") or (PLANE_ICAO == "MD82") then -- ********************** -- -- SETTINGS -- -- ********************** -- function file_exists(file) local f = io.open(file, "rb") if f then f:close() end return f ~= nil end function read_file(file) if not file_exists(file) then logMsg("- Preferences file "..file.." not found! -") return {} end logMsg("- Preferences file "..file.." found! -") tableValues = {} for line in io.lines(file) do if string.sub(line,1,2) ~= '--' then tableValues[#tableValues + 1] = line end end logMsg("- Preferences file read! -") return tableValues end -- -- Initialize preferences local preferences_FileName = SCRIPT_DIRECTORY .. "preferences.cfg" function get_Preferences(fileName) local preferencesTable = read_file(fileName) local pref_Settings_lines = {} for i,j in pairs(preferencesTable) do local pref_Settings_words = {} for value in j:gmatch("[^=]+") do table.insert(pref_Settings_words, value) end table.insert(pref_Settings_lines, pref_Settings_words) -- print all line numbers and their contents logMsg('[' .. i .. '] - ' .. pref_Settings_lines[i][1]..' = '..pref_Settings_lines[i][2]) end return pref_Settings_lines -- preferencesTable = nil end prefTable = get_Preferences(preferences_FileName) function findSetting(searchTable, setting) for i=1,#searchTable do if searchTable[i][1] == setting then if searchTable[i][2] == 'activate' then return true else return false end end end return nil end function findSettingPos(searchTable, setting) for i=1,#searchTable do if searchTable[i][1] == setting then return i end end return nil end function setSettingNewValue(setting, newValue) local p = findSettingPos(prefTable, setting) logMsg ('Setting position = '..p) prefTable[p][2] = newValue logMsg (prefTable[p][1]..'='..newValue) end function ActivateSetting(settingStr) setSettingNewValue(settingStr, 'activate') if not onload then savePreferences(prefTable) end logMsg (settingStr..' is now activate') end function DeactivateSetting(settingStr) setSettingNewValue(settingStr, 'deactivate') if not onload then savePreferences(prefTable) end logMsg (settingStr..' is now deactivate') end function setCommandState(preference) if preference then return 'activate' else return 'deactivate' end end function savePreferences(t) local file = assert(io.open(preferences_FileName, "w")) for i=1,#t do str = t[i][1]..'='..t[i][2] file:write(str.."\n") end file:close() end -- true and false have to be written with lowercase letters. -- Set to true to enable "V2" callout and false to disable it. Enable_V2 = findSetting(prefTable, 'Enable_V2') -- Set to true to individually enable "80 Knots" callout and false to disable it. Enable_80Kts = findSetting(prefTable, 'Enable_80Kts') -- Set to true to individually enable "80 Knots" callout and false to disable it. Enable_100Kts = findSetting(prefTable, 'Enable_100Kts') -- Set to true to enable "Positive rate/Gear up" callout and false to disable. EnablePosGearUp = findSetting(prefTable, 'EnablePosGearUp') -- "80 Knots" and "Positive rate/Gear up" callouts can be mutually enabled/disabled by the relative macro in the FlyWithLua Macros -- Change "SoundLevel" to adjust volume for the callouts. Adjust between 0.10 min - 1.00 max SoundLevel = 0.8 -- Toggles the display of the values panel. Also controlled by the FlyWithLua Macros, as well as the assigned keyboard command "Display vSpeed values toggle" show_values = findSetting(prefTable, 'show_values') -- Toggles the 10,000ft in the climb or descent annunciation. Also controlled by the FlyWithLua Macros pass_10Kft = findSetting(prefTable, 'pass_10Kft') -- Toggles the automatic switch-on and switch-off of the landing lights at 10,000ft. Also controlled by the FlyWithLua Macros auto_lights = findSetting(prefTable, 'auto_lights') -- Toggles the 60Knots manual breaks annunciation when landing. Also controlled by the FlyWithLua Macros manual_Breaks = findSetting(prefTable, 'manual_Breaks') -- Toggles the Gear Down annunciation when landing. Also controlled by the FlyWithLua Macros Gear_Down = findSetting(prefTable, 'Gear_Down') -- 10K Feet Switch for enabling correct Gear Down annunciation TenKFeetSwitch = findSetting(prefTable, 'TenKFeetSwitch') -- *************************** -- -- DO NOT EDIT BELOW THIS LINE -- -- *************************** -- require("graphics") function sleep(a) local sec = tonumber(os.clock() + a); while (os.clock() < sec) do end end -- end function sleep() V1_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/V1.wav") VR_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/Rotate.wav") V2_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/V2.wav") KTS80_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/80knots.wav") KTS100_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/100knots.wav") PosGearUp_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/PosRateGearUp.wav") Pass10KLightsOn_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/Pass10000LightsOn.wav") Pass10KLightsOff_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/Pass10000LightsOff.wav") ManualBreaks60KTS_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/60KnotsManualBrakes.wav") GearDown_Sound = load_WAV_file(SCRIPT_DIRECTORY .. "vSpeed_Sounds/GearDown.wav") set_sound_gain(V1_Sound, SoundLevel) set_sound_gain(VR_Sound, SoundLevel) set_sound_gain(V2_Sound, SoundLevel) set_sound_gain(KTS80_Sound, SoundLevel) set_sound_gain(KTS100_Sound, SoundLevel) set_sound_gain(PosGearUp_Sound, SoundLevel) set_sound_gain(Pass10KLightsOn_Sound, SoundLevel) set_sound_gain(Pass10KLightsOff_Sound, SoundLevel) set_sound_gain(ManualBreaks60KTS_Sound, SoundLevel) set_sound_gain(GearDown_Sound, SoundLevel) local V1_value local VR_value local V2_value local manualVSpeeds = false local userInputActivated = false local sValue = "" local manualVSpeedParam = 0 local aircraft = "" local x737800SPDREF = false function getAircraftName() local t = {} -- table to store the indices local i = 0 while true do i = string.find(AIRCRAFT_PATH, "/", i+1) -- find next "/" pattern in path if i == nil then break end table.insert(t, i) end aircraft = AIRCRAFT_PATH:sub(t[table.maxn(t)-1] + 1,AIRCRAFT_PATH.len(AIRCRAFT_PATH) - 1) if aircraft:sub(0, 8) == "x737-800" then aircraft = aircraft:sub(0, 8) end if string.upper(string.sub(aircraft,1,9)) == "TOLISS319" then aircraft = "tolissa319" end -- hummelmose's addition for Toliss A319 -- current version (V1p3p1) has TOLISSA321 not TOLISS321: -- if string.upper(string.sub(aircraft,1,9)) == "TOLISS321" then aircraft = "tolissa321" end -- addition for Toliss A321 if string.upper(string.sub(aircraft,1,10)) == "TOLISSA321" then aircraft = "tolissa321" end -- addition for Toliss A321 if PLANE_ICAO == "B77W" or PLANE_ICAO == "B772" or PLANE_ICAO == "B77L" or PLANE_ICAO == "B77F" then aircraft = "FF777" end -- katyjason's addition for FlightFactor 777 t = nil i = nil end -- end function getAircraftName() getAircraftName() logMsg("vSpeedCallouts aircraft type: "..aircraft) dataref( "AUTHOR", "sim/aircraft/view/acf_author", "readonly", 0) logMsg(AUTHOR) -- *** For future use. Detection of an active X-FMC plugin *** -- -- dataref( "X_FMC_ISACTIVE", "xfmc/Status", "readonly") -- logMsg(X_FMC_ISACTIVE) dataref( "IAS", "sim/cockpit2/gauges/indicators/airspeed_kts_pilot", "readonly") dataref( "GS", "sim/flightmodel/position/groundspeed", "readonly") dataref( "AGL", "sim/flightmodel/position/y_agl", "readonly") dataref( "VSI", "sim/cockpit2/gauges/indicators/vvi_fpm_pilot", "readonly") dataref( "IALT", "sim/cockpit2/gauges/indicators/altitude_ft_pilot", "readonly") dataref( "THROTTLE", "sim/cockpit2/engine/actuators/throttle_ratio_all", "readonly") dataref( "REVTHROTTLE", "sim/cockpit2/engine/actuators/throttle_beta_rev_ratio_all", "readonly") dataref( "GEARSTATUS", "sim/flightmodel2/gear/deploy_ratio", "readonly", 0) -- gearStatus_table = dataref_table( "sim/flightmodel2/gear/deploy_ratio" ) -- GEARSTATUS = gearStatus_table [0] -- copied from A319_Custom_cmnd.lua.TXT (https://forums.x-plane.org/index.php?/forums/topic/201877-keybinding-lights/) if aircraft == "tolissa321" then LIGHTS = dataref_table("AirbusFBW/OHPLightSwitches") end if aircraft == "AirbusA350" then LIGHTS = dataref_table("sim/cockpit2/switches/landing_lights_switch") end if aircraft == "B737-800X" then dataref( "FMC_REF", "laminar/B738/fmc1/Line00_L","readonly", 5) dataref( "FMC_REF_PAGE", "laminar/B738/fmc1/Line00_S","readonly", 0) dataref( "BUG_V1", "laminar/B738/fmc1/Line01_L","readonly", 0) dataref( "BUG_VR", "laminar/B738/fmc1/Line02_L","readonly", 0) dataref( "BUG_V2", "laminar/B738/fmc1/Line03_L","readonly", 0) end if aircraft == "x737-800" then dataref( "BUG_V1", "x737/systems/SPDREF/manual_v1","readonly") dataref( "BUG_VR", "x737/systems/SPDREF/manual_vR","readonly") dataref( "BUG_V2", "x737/systems/SPDREF/manual_v2","readonly") -- For future use. Detection if using the default x737-800 FMS *** -- -- dataref( "USE_DEFAULT_FMC", "x737/systems/FMC/useDefaultFMS", "readonly") -- if USE_DEFAULT_FMC then manualVSpeeds=true end -- logMsg(USE_DEFAULT_FMC) end if aircraft == "A350_FlightFactor" or aircraft == "A320_FlightFactor" then -->datarefs by Oliver -- CAUTION: you need the A320 Connector Script from FlightFactor, otherwise it won't work !!! dataref( "FFA320_V1", "MOKNY/FFA320/Aircraft/TakeoffDecision","readonly") dataref( "FFA320_VR", "MOKNY/FFA320/Aircraft/TakeoffRotate","readonly") dataref( "FFA320_V2", "MOKNY/FFA320/Aircraft/TakeoffReference","readonly") dataref( "FFA320_IAS", "MOKNY/FFA320/Aircraft/AirSpeed","readonly") end -- disabled, PMCO doing call-outs now: if aircraft == "tolissa319" or aircraft == "_tolissa321" then -->datarefs by hummelmose -- logMsg("- vSpeedCallouts aircraft type: A321") dataref( "BUG_V1", "toliss_airbus/performance/V1","readonly") dataref( "BUG_V2", "toliss_airbus/performance/V2","readonly") dataref( "BUG_VR", "toliss_airbus/performance/VR","readonly") end -- new section for FF A350 using dataref tool (disabled, PMCO doing call-outs now): if aircraft == "_AirbusA350" then logMsg("- vSpeedCallouts aircraft type: A359") dataref( "FFA350_V1", "1-sim/fms/perf/speed/v1","readonly") dataref( "FFA350_VR", "1-sim/fms/perf/speed/vr","readonly") dataref( "FFA350_V2", "1-sim/fms/perf/speed/v2","readonly") dataref( "FFA350_IAS", "AirbusFBW/IASCapt","readonly") -- possible alternate for IAS: -- dataref( "FFA350_IAS", "sim/flightmodel/position/indicated_airspeed","readonly") end if aircraft == "FF777" then -->datarefs by katyjason dataref( "BUG_V1", "T7Avionics/fms/v1","readonly") dataref( "BUG_VR", "T7Avionics/fms/vr","readonly") dataref( "BUG_V2", "T7Avionics/fms/v2","readonly") end function assignVSpeedsFromUserInput() if aircraft == "x737-800" then set( "x737/systems/SPDREF/manual_v1",V1_value) set( "x737/systems/SPDREF/manual_vR",VR_value) set( "x737/systems/SPDREF/manual_v2",V2_value) set( "x737/systems/SPDREF/mode", 1) -- set SPDREF mode in V1 so that V1 and VR speeds are displayed in PFD end end -- end function assignVSpeedsFromUserInput() function getVSpeedsFromFMC() if aircraft == "B737-800X" then if string.find(FMC_REF, "TAKEOFF REF") ~= nil and string.find(FMC_REF_PAGE, "1/2") ~= nil then V1_value = tonumber(BUG_V1:sub(22,24)) VR_value = tonumber(BUG_VR:sub(22,24)) V2_value = tonumber(BUG_V2:sub(22,24)) end end -- disabled, PMCO doing call-outs now: if aircraft == "x737-800" or aircraft == "tolissa319" or aircraft == "_tolissa321" then --> V speed adjustments by hummelmose for tolissa319 -- logMsg("- vSpeedCallouts #337 aircraft type: A321") V1_value = BUG_V1 VR_value = BUG_VR V2_value = BUG_V2 end if aircraft == "A350_FlightFactor" or aicraft == "A320_FlightFactor" then --> V speed adjustments by Oliver -- logMsg("- FFA320_V1: "..FFA320_V1) -- logMsg("- FFA320_VR: "..FFA320_VR) V1_value = math.floor(FFA320_V1 * 1.943844547019393) VR_value = math.floor(FFA320_VR * 1.943844547019393) V2_value = math.floor(FFA320_V2 * 1.943844547019393) IAS = math.floor(FFA320_IAS * 1.943844547019393) end -- disabled, PMCO doing call-outs now: if aircraft == "_AirbusA350" then V1_value = FFA350_V1 VR_value = FFA350_VR V2_value = FFA350_V2 IAS = FFA350_IAS -- these will fill log in loop, only enable temporarily: -- logMsg("- vSpeedCallouts #366 aircraft type: A359") -- logMsg("- V1_value: "..V1_value) -- logMsg("- VR_value: "..VR_value) -- logMsg("- IAS: "..IAS) end if aircraft == "FF777" then --> V speed adjustments by katyjason V1_value = math.floor(BUG_V1 + 0.5) VR_value = math.floor(BUG_VR + 0.5) V2_value = math.floor(BUG_V2 + 0.5) end if (V1_value == nil or V1_value == -1) then V1_value = 0 end if (VR_value == nil or VR_value == -1) then VR_value = 0 end if (V2_value == nil or V2_value == -1) then V2_value = 0 end if (IAS == nil or IAS == -1) then IAS = 0 end if (GS == nil or GS == -1) then GS = 0 end if (AGL == nil or AGL == -1) then AGL = 0 end end -- end function getVSpeedsFromFMC() getVSpeedsFromFMC() -- *** log initial values for debugging purposes *** -- logMsg("*** VSpedCallouts initial values ***") logMsg("V1_value: "..V1_value) logMsg("VR_value: "..VR_value) logMsg("V2_value: "..V2_value) logMsg("IAS: "..IAS) logMsg("GS: "..GS) logMsg("AGL: "..AGL) PlayedKTS80 = false PlayedKTS100 = false PlayedV1 = false PlayedVR = false PlayedV2 = false PlayedPosGear = false PlayedPass10KLightsOn = false PlayedPass10KLightsOff = false SwitchedLightsOn = true SwitchedLightsOff = false PlayedManualBreaks = false PlayedGearDown = false local window_x = 150 -- Display position from right edge of window local window_y = 250 -- Display position from top edge of window -- *** Experimental. Examining the use of jjjLib1 *** -- -- local vSpeedPanel_plId = jjjLib1.getPlId("vSpeedCallouts") -- local vSpeedPanel = false function display_values_panel() if show_values then -- if MOUSE_STATUS ~= nil then draw_string(400, 400, "Status: "..MOUSE_STATUS.." / ".."X: "..MOUSE_X.." Y: "..MOUSE_Y.." window_x: "..window_x.." window_y: "..window_y) end XPLMSetGraphicsState(0,0,0,1,1,0,0) -- draw the title graphics.set_color(0, 0, 0, 1) graphics.draw_rectangle(SCREEN_WIDTH - window_x + 10, SCREEN_HIGHT - window_y + 200, SCREEN_WIDTH - window_x + 180, SCREEN_HIGHT - window_y + 220) graphics.set_color(1, 1, 1, 0.8) draw_string_Helvetica_18(SCREEN_WIDTH - window_x + 15, SCREEN_HIGHT - window_y + 202, "vSpeedCallouts") -- draw the transparent background graphics.set_color(0, 0, 0, 0.5) graphics.draw_rectangle(SCREEN_WIDTH - window_x + 10, SCREEN_HIGHT - window_y + 60, SCREEN_WIDTH - window_x + 180, SCREEN_HIGHT - window_y + 200) -- draw the parameters graphics.set_color(1, 1, 1, 0.8) draw_string_Helvetica_12(SCREEN_WIDTH - window_x + 20, SCREEN_HIGHT - window_y + 180, "GS: "..math.floor(GS).." m/sec") draw_string_Helvetica_12(SCREEN_WIDTH - window_x + 20, SCREEN_HIGHT - window_y + 160, "IAS: "..math.floor(IAS).." Kts") draw_string_Helvetica_12(SCREEN_WIDTH - window_x + 20, SCREEN_HIGHT - window_y + 140 , "AGL: "..math.floor(AGL).." m / "..math.floor(AGL*3.28084).." ft") draw_string_Helvetica_12(SCREEN_WIDTH - window_x + 20, SCREEN_HIGHT - window_y + 120, "BUG_V1: "..V1_value) draw_string_Helvetica_12(SCREEN_WIDTH - window_x + 20, SCREEN_HIGHT - window_y + 100, "BUG_VR: "..VR_value) draw_string_Helvetica_12(SCREEN_WIDTH - window_x + 20, SCREEN_HIGHT - window_y + 80, "BUG_V2: "..V2_value) -- *** Experimental. Examining the use of jjjLib1 *** -- -- jjjLib1.setColor("blue", false, false, true, false, 0.9) -- vSpeedPanel = jjjLib1.createPanel(vSpeedPanel_plId, "vSpeeds", 870, "", "blue", true) -- jjjLib1.setPanelPos(vSpeedPanel_plId, vSpeedPanel, SCREEN_WIDTH - 870, SCREEN_HIGHT - 180) end end -- end function display_values_panel() -- *** Experimental. Examining the use of jjjLib1 *** -- -- jjjLib1.openPanel(vSpeedPanel_plId,vSpeedPanel) function DrawVSpeedInputLine(vSpeedParam) -- Modified function based on the FlyWithLua Internals if not userInputActivated then return end local yOffset = 0 if vSpeedParam == 1 then yOffset = 0 end if vSpeedParam == 2 then yOffset = 20 end if vSpeedParam == 3 then yOffset = 40 end -- draw the background XPLMSetGraphicsState(0,0,0,1,1,0,0) glColor4f(0,0,0,1) glRectf(SCREEN_WIDTH - window_x + 102, SCREEN_HIGHT - window_y + 115 - yOffset, SCREEN_WIDTH - window_x + 140, SCREEN_HIGHT - window_y + 135 - yOffset) -- draw the input field glColor4f(0, 1, 0, 1) draw_string_Helvetica_12(SCREEN_WIDTH - window_x + 105, SCREEN_HIGHT - window_y + 120 - yOffset, sValue) -- draw cursor glColor4f(1,1,1,1) glBegin_LINES() local x_pos = SCREEN_WIDTH - window_x + 105 + measure_string(sValue, "Helvetica_12") glVertex2f(x_pos, SCREEN_HIGHT - window_y + 135 - yOffset) glVertex2f(x_pos, SCREEN_HIGHT - window_y + 135 - yOffset - 20) glEnd() end -- end function DrawVSpeedInputLine() function GetVSpeedLineFromKeyboard() -- Modified function based on the FlyWithLua Internals if userInputActivated and KEY_ACTION == "pressed" then RESUME_KEY = true -- escape if VKEY == 27 then sValue = "" userInputActivated = false return end -- backspace if VKEY == 8 and sValue ~= "" then sValue = string.sub(sValue, 1, string.len(sValue)-1) return end -- enter if VKEY == 13 then if sValue ~= "" then --assert(loadstring(sValue))() if manualVSpeedParam == 1 then V1_value = tonumber(sValue) elseif manualVSpeedParam == 2 then VR_value = tonumber(sValue) else V2_value = tonumber(sValue) end assignVSpeedsFromUserInput() end sValue = "" userInputActivated = false return end -- any other number key if (VKEY >= 48 and VKEY <= 59) or (VKEY >= 96 and VKEY <= 105) then sValue = sValue .. CKEY end end end -- end function GetVSpeedLineFromKeyboard() function activateUserInput() if show_values then -- if panel is visible if not userInputActivated and MOUSE_X >= SCREEN_WIDTH - window_x - 40 and MOUSE_X <= SCREEN_WIDTH - window_x + 180 and MOUSE_Y >= SCREEN_HIGHT - window_y + 150 and MOUSE_Y <= SCREEN_HIGHT - window_y + 270 then if MOUSE_STATUS == "up" then RESUME_MOUSE_CLICK = false else RESUME_MOUSE_CLICK = true end if MOUSE_STATUS == "drag" then if MOUSE_X < SCREEN_WIDTH - 92 and MOUSE_X > 45 then window_x = SCREEN_WIDTH - MOUSE_X + 65 end if MOUSE_Y < SCREEN_HIGHT - 32 and MOUSE_Y > 150 then window_y = SCREEN_HIGHT - MOUSE_Y + 210 end end end if not userInputActivated and MOUSE_STATUS ~= "drag" and MOUSE_X >= SCREEN_WIDTH - window_x + 20 and MOUSE_X <= SCREEN_WIDTH - window_x + 140 and MOUSE_Y >= SCREEN_HIGHT - window_y + 120 and MOUSE_Y <= SCREEN_HIGHT - window_y + 130 then manualVSpeedParam = 1 vSpeedParam = 1 sValue = V1_value userInputActivated = true end if not userInputActivated and MOUSE_STATUS ~= "drag" and MOUSE_X >= SCREEN_WIDTH - window_x + 20 and MOUSE_X <= SCREEN_WIDTH - window_x + 140 and MOUSE_Y >= SCREEN_HIGHT - window_y + 100 and MOUSE_Y <= SCREEN_HIGHT - window_y + 110 then manualVSpeedParam = 2 vSpeedParam = 2 sValue = VR_value userInputActivated = true end if not userInputActivated and MOUSE_STATUS ~= "drag" and MOUSE_X >= SCREEN_WIDTH - window_x + 20 and MOUSE_X <= SCREEN_WIDTH - window_x + 140 and MOUSE_Y >= SCREEN_HIGHT - window_y + 80 and MOUSE_Y <= SCREEN_HIGHT - window_y + 90 then manualVSpeedParam = 3 vSpeedParam = 3 sValue = V2_value userInputActivated = true end end end -- end function activateUserInput() function resetPanelPosition() if show_values and not userInputActivated then window_x = 150 window_y = 250 end end -- end function resetPanelPosition() function toggle_show_values() if show_values then show_values = false DeactivateSetting('show_values') else show_values = true ActivateSetting('show_values') end end -- end function toggle_show_values() function mainVSpeedCallouts() getVSpeedsFromFMC() if IALT < 10300 and GS > 5 then if math.floor(IAS) + 5 == 80 and not PlayedKTS80 and Enable_80Kts then play_sound(KTS80_Sound) PlayedKTS80 = true end if math.floor(IAS) + 5 == 100 and not PlayedKTS100 and Enable_100Kts then play_sound(KTS100_Sound) PlayedKTS100 = true end if math.floor(IAS) + 3 == V1_value and not PlayedV1 and V1_value > 39 and GS > 5 then play_sound(V1_Sound) PlayedV1 = true end if math.floor(IAS) + 3 == VR_value and not PlayedVR and PlayedV1 then play_sound(VR_Sound) PlayedVR = true end if math.floor(IAS) + 3 == V2_value and not PlayedV2 and Enable_V2 and PlayedVR then play_sound(V2_Sound) PlayedV2 = true end if AGL > 15 and math.floor(VSI) > 10 and not PlayedPosGear and EnablePosGearUp and PlayedVR then play_sound(PosGearUp_Sound) PlayedPosGear = true end --if AGL > 3048 and not PlayedPass10KLightsOff and PlayedPosGear then if (pass_10Kft) and (math.floor(IALT) >= 10001) and (math.floor(IALT) <= 10010) and (not PlayedPass10KLightsOff) and (math.floor(VSI) > 0) then PlayedPass10KLightsOff = true play_sound(Pass10KLightsOff_Sound) end if auto_lights and (math.floor(IALT) >= 10001) and (math.floor(IALT) <= 10010) and (math.floor(VSI) > 0) and (not SwitchedLightsOff) then SwitchedLightsOff = true if aircraft == "x737-800" then set("x737/systems/exteriorLights/leftFixedLanLtSwitch", 0) set("x737/systems/exteriorLights/rightFixedLanLtSwitch", 0) set("x737/systems/exteriorLights/leftRetrLanLtSwitch", 0) set("x737/systems/exteriorLights/rightRetrLanLtSwitch", 0) end if aircraft == "Boeing B747-400" then command_once("laminar/B747/toggle_switch/landing_light_IBL") command_once("laminar/B747/toggle_switch/landing_light_IBR") command_once("laminar/B747/toggle_switch/landing_light_OBL") command_once("laminar/B747/toggle_switch/landing_light_OBR") end if aircraft == "tolissa321" then LIGHTS[4] = 1 -- Left landing off LIGHTS[5] = 1 -- Right landing off end if aircraft == "AirbusA350" then LIGHTS[0] = 0 -- Left landing off LIGHTS[1] = 0 -- Right landing off else command_once("sim/lights/landing_lights_off") end end --if AGL < 3048 and not PlayedPass10KLightsOn and PlayedPass10KLightsOff then if (pass_10Kft) and (math.floor(IALT) <= 9999) and (math.floor(IALT) >= 9990) and (not PlayedPass10KLightsOn) and (math.floor(VSI) < 0) then PlayedPass10KLightsOn = true play_sound(Pass10KLightsOn_Sound) end if auto_lights and (math.floor(IALT) <= 9999) and (math.floor(IALT) >= 9990) and (math.floor(VSI) < 0) and (not SwitchedLightsOn) then SwitchedLightsOn = true if aircraft == "x737-800" then set("x737/systems/exteriorLights/leftFixedLanLtSwitch", 1) set("x737/systems/exteriorLights/rightFixedLanLtSwitch", 1) set("x737/systems/exteriorLights/leftRetrLanLtSwitch", 2) set("x737/systems/exteriorLights/rightRetrLanLtSwitch", 2) end if aircraft == "Boeing B747-400" then command_once("laminar/B747/toggle_switch/landing_light_IBL") command_once("laminar/B747/toggle_switch/landing_light_IBR") command_once("laminar/B747/toggle_switch/landing_light_OBL") command_once("laminar/B747/toggle_switch/landing_light_OBR") end if aircraft == "tolissa321" then LIGHTS[4] = 2 -- Left landing on LIGHTS[5] = 2 -- Right landing on end if aircraft == "AirbusA350" then LIGHTS[0] = 1 -- Left landing off LIGHTS[1] = 1 -- Right landing off else command_once("sim/lights/landing_lights_on") end end -- 0=up, 1= down if math.floor(IALT) >= 9990 then TenKFeetSwitch = true end if Gear_Down and TenKFeetSwitch and (math.floor(AGL) <= 549) and (IAS <= 190) and (GEARSTATUS == 0) and (not PlayedGearDown) then PlayedGearDown = true play_sound(GearDown_Sound) end -- (1 knot = 0.514444 m/sec) if manual_Breaks and (math.floor(AGL) == 0) and (IAS <= 61) and (IAS >= 56) and (THROTTLE == 0 or REVTHROTTLE <= -1) and (not PlayedManualBreaks) then PlayedManualBreaks = true play_sound(ManualBreaks60KTS_Sound) end -- *** Alternative method for callout sounds, by using the XLMP FlyWithLua library *** -- -- if math.floor(IAS) + 2 == 80 and not PlayedKTS80 and Enable_80Kts then XPLMSpeakString( "80 Knots" ) PlayedKTS80 = true end -- if math.floor(IAS) + 3 == V1_value and not PlayedV1 and V1_value > 39 and GS > 5 then XPLMSpeakString( "V1" ) PlayedV1 = true end -- if math.floor(IAS) == VR_value and not PlayedVR and PlayedV1 then XPLMSpeakString( "Rotate" ) PlayedVR = true end -- if math.floor(IAS) == V2_value and not PlayedV2 and Enable_V2 and PlayedVR then XPLMSpeakString( "V2" ) PlayedV2 = true end -- if AGL > 20 and math.floor(VSI) > 10 and not PlayedPosGear and EnablePosGearUp and PlayedVR then -- XPLMSpeakString( "Positive rate of climb. Gear up" ) -- PlayedPosGear = true -- end if AGL > 200 then PlayedKTS80 = true PlayedKTS100 = true PlayedV1 = true PlayedVR = true PlayedV2 = true PlayedPosGear = true if aircraft == "x737-800" and not x737800SPDREF then x737800SPDREF = true set( "x737/systems/SPDREF/mode", 0) -- set SPDREF mode in AUTO so that V1 and VR speeds are not displayed in PFD end end if GS < 10 then PlayedKTS80 = false PlayedKTS100 = false PlayedV1 = false PlayedVR = false PlayedV2 = false PlayedPosGear = false x737800SPDREF = false PlayedManualBreaks = false PlayedGearDown = false end --if AGL > 3109 then if math.floor(IALT) > 10100 then PlayedPass10KLightsOn = false PlayedPass10KLightsOff = true SwitchedLightsOn = false SwitchedLightsOff = true end --if AGL < 2987 then if math.floor(IALT) < 9900 then PlayedPass10KLightsOn = true PlayedPass10KLightsOff = false SwitchedLightsOn = true SwitchedLightsOff = false end end end --end function mainVSpeedCallouts() onload = true -- *** Main function calls, macros and keyboard command creation create_command("FlyWithLua/vSpeedCallouts/panel_toggle", "Display vSpeedCallouts panel toggle", "toggle_show_values()", "", "") add_macro("vSpeedCallouts Panel toggle", "show_values=true ActivateSetting('show_values')", "show_values=false DeactivateSetting('show_values')", setCommandState(show_values)) add_macro("vSpeedCallouts Reset Panel position", "resetPanelPosition()") add_macro("vSpeedCallouts 80Kts toggle", "Enable_80Kts=true ActivateSetting('Enable_80Kts')", "Enable_80Kts=false DeactivateSetting('Enable_80Kts')", setCommandState(Enable_80Kts)) add_macro("vSpeedCallouts 100Kts toggle", "Enable_100Kts=true ActivateSetting('Enable_100Kts')", "Enable_100Kts=false DeactivateSetting('Enable_100Kts')", setCommandState(Enable_100Kts)) add_macro("vSpeedCallouts GearUp toggle", "EnablePosGearUp=true ActivateSetting('EnablePosGearUp')", "EnablePosGearUp=false DeactivateSetting('EnablePosGearUp')", setCommandState(EnablePosGearUp)) add_macro("vSpeedCallouts Auto-Lights@10,000ft toggle", "auto_lights=true ActivateSetting('auto_lights')", "auto_lights=false DeactivateSetting('auto_lights')", setCommandState(auto_lights)) add_macro("vSpeedCallouts 10,000ft annunciation toggle", "pass_10Kft=true ActivateSetting('pass_10Kft')", "pass_10Kft=false DeactivateSetting('pass_10Kft')", setCommandState(pass_10Kft)) add_macro("vSpeedCallouts 60Kts/ManualBreaks annunciation toggle", "manual_Breaks=true ActivateSetting('manual_Breaks')", "manual_Breaks=false DeactivateSetting('manual_Breaks')", setCommandState(manual_Breaks)) add_macro("vSpeedCallouts Gear Down annunciation toggle", "Gear_Down=true ActivateSetting('Gear_Down')", "Gear_Down=false DeactivateSetting('Gear_Down')", setCommandState(Gear_Down)) onload = false do_on_keystroke("GetVSpeedLineFromKeyboard()") do_on_mouse_click("activateUserInput()") do_every_draw("display_values_panel()") do_every_draw("DrawVSpeedInputLine(vSpeedParam)") do_every_frame ("mainVSpeedCallouts()") print ("-- vSpeedCallouts v1.10 by 'ManosK' loaded successfully --") -- end