RSS Git Download  Clone
Raw Blame History
-- 	*** 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
	
	if string.upper(string.sub(aircraft,1,9)) == "TOLISS321" 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("-"..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]


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_FlighFactor" 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 

if aircraft == "tolissa319" or aircraft == "tolissa321" then -->datarefs by hummelmose
        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 
 
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

	if aircraft == "x737-800" or aircraft == "tolissa319" or aircraft == "tolissa321" then --> V speed adjustments by hummelmose for tolissa319
		V1_value = BUG_V1
		VR_value = BUG_VR
		V2_value = BUG_V2
	end
	
	if aircraft == "A350_FlighFactor" or aicraft == "A320_FlightFactor" then --> V speed adjustments by Oliver

        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 
	
	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(V1_value)
--logMsg(VR_value)
--logMsg(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")
			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")
			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