Merge branch 'develop' into FF/Fox2

This commit is contained in:
Frank
2019-10-02 23:41:34 +02:00
2 changed files with 347 additions and 343 deletions
+153 -151
View File
@@ -1,5 +1,5 @@
--- **Ops** - (R2.5) - Automatic Terminal Information Service (ATIS).
--
--
-- ===
--
-- **Main Features:**
@@ -28,9 +28,9 @@
-- ===
--
-- ## Missions: Example missions will be added later.
--
--
-- ===
--
--
-- ## Sound files: Check out the pinned messages in the Moose discord #ops-atis channel.
--
-- ===
@@ -63,7 +63,7 @@
-- @field #number subduration Duration how long subtitles are displayed in seconds.
-- @field #boolean metric If true, use metric units. If false, use imperial (default).
-- @field #boolean PmmHg If true, give pressure in millimeters of Mercury. Default is inHg for imperial and hecto Pascal (=mili Bars) for metric units.
-- @field #boolean TDegF If true, give temperature in degrees Fahrenheit. Default is in degrees Celsius independent of chosen unit system.
-- @field #boolean TDegF If true, give temperature in degrees Fahrenheit. Default is in degrees Celsius independent of chosen unit system.
-- @field #number zuludiff Time difference local vs. zulu in hours.
-- @field #number magvar Magnetic declination/variation at the airport in degrees.
-- @extends Core.Fsm#FSM
@@ -75,108 +75,110 @@
-- ![Banner Image](..\Presentations\ATIS\ATIS_Main.png)
--
-- # The ATIS Concept
--
--
-- Automatic terminal information service, or ATIS, is a continuous broadcast of recorded aeronautical information in busier terminal areas, i.e. airports and their immediate surroundings.
-- ATIS broadcasts contain essential information, such as current weather information, active runways, and any other information required by the pilots.
--
--
-- # DCS Limitations
--
--
-- Unfortunately, the DCS API only allow to get the temperature, pressure as well as wind direction and speed. Therefore, some other information such as cloud coverage, base and ceiling are not available
-- when dynamic weather is used.
--
--
-- # Scripting
--
--
-- The lua script to create an ATIS at an airport is pretty easy:
--
--
-- -- ATIS at Batumi Airport on 143.00 MHz AM.
-- atisBatumi=ATIS:New("Batumi", 143.00)
-- atisBatumi:Start()
--
--
-- The @{#ATIS.New}(*airbasename*, *frequency*) creates a new ATIS object. The parameter *airbasename* is the name of the airbase or airport. Note that this has to be spelled exactly as in the DCS mission editor.
-- The parameter *frequency* is the frequency the ATIS broadcasts in MHz.
--
-- Broadcasting is started via the @{#ATIS.Start}() function. The start can be delayed by useing @{#ATIS.__Start}(*delay*), where *delay* is the delay in seconds.
--
--
-- Broadcasting is started via the @{#ATIS.Start}() function. The start can be delayed by useing @{#ATIS.__Start}(*delay*), where *delay* is the delay in seconds.
--
-- ## Subtitles
--
-- Currently, DCS allows for displaying subtitles of radio transmissions only from airborne units, i.e. airplanes and helicopters. Therefore, if you want to have subtitles, it is necessary to place an
--
-- Currently, DCS allows for displaying subtitles of radio transmissions only from airborne units, i.e. airplanes and helicopters. Therefore, if you want to have subtitles, it is necessary to place an
-- additonal aircraft on the ATIS airport and set it to uncontrolled. This unit can then function as a radio relay to transmit messages with subtitles. These subtitles will only be displayed, if the
-- player has tuned in the correct ATIS frequency.
--
--
-- Radio transmissions via an airborne unit can be set via the @{#ATIS.SetRadioRelayUnitName}(*unitname*) function, where the parameter *unitname* is the name of the unit passed as string, e.g.
--
--
-- atisBatumi:SetRadioRelayUnitName("Radio Relay Batumi")
--
--
-- With a unit set in the mission editor with name "Radio Relay Batumi".
--
--
-- By default, subtitles are displayed for 10 seconds. This can be changed using @{#ATIS.SetSubtitleDuration}(*duration*) with *duration* being the duration in seconds.
--
--
-- ## Active Runway
--
-- By default, the currently active runway is determined automatically by analysing the wind direction. However, there are special cases, where this does not yield the correct result.
-- Also, there are airports with more than one runway facing in the same direction (usually denoted left and right). In this case, there is obviously no *unique* result depending on the wind vector.
--
--
-- By default, the currently active runway is determined automatically by analysing the wind direction. Therefore, you should obviously set the wind speed to be greater zero in your mission.
--
-- Note however, there are a few special cases, where automatic detection does not yield the correct or desired result.
-- For example, there are airports with more than one runway facing in the same direction (usually denoted left and right). In this case, there is obviously no *unique* result depending on the wind vector.
--
-- If the automatic runway detection fails, the active runway can be specified manually in the script via the @{#ATIS.SetActiveRunway}(*runway*) function.
-- The parameter *runway* is a string which can be used to specify the runway heading and, if applicable, whether the left or right runway is in use.
--
--
-- For example, setting runway 21L would be
--
--
-- atisNellis:SetActiveRunway("21L")
--
--
-- The script will examine the string and search for the characters "L" (left) and "R" (right).
--
--
-- If only left or right should be set and the direction determined by the wind vector, the runway heading can be left out, e.g.
--
--
-- atisAbuDhabi:SetActiveRunway("L")
--
--
-- The first two digits of the runway are determined by converting the *true* runway heading into its magnetic heading. The magnetic declination (or variation) is assumed to be constant on the given map.
-- The magnatic declinatin can also be specified for the specific airport using the @{#ATIS.SetMagneticDeclination}(*magvar*).
--
--
-- ## Tower Frequencies
--
--
-- The tower frequency (or frequencies) can also be included in the ATIS information. However, there is no way to get these automatically. Therefore, it is necessary to manually specify them in the script via the
-- @{#ATIS.SetTowerFrequencies}(*frequencies*) function. The parameter *frequencies* can be a plain number if only one frequency is necessary or it can be a table of frequencies.
--
--
-- ## Unit System
--
--
-- By default, information is given in imperial units, i.e. wind speed in knots, pressure in inches of mercury, visibility in Nautical miles, etc.
--
--
-- If you prefer metric units, you can enable this via the @{#ATIS.SetMetricUnits}() function,
--
--
-- atisBatumi:SetMetricUnits()
--
--
-- With this, wind speed is given in meters per second, pressure in hecto Pascal (mbar), visibility in kilometers etc.
--
--
-- # Sound Files
--
-- More than 180 individual sound files have been created using a text-to-speech program. All ATIS information is given with en-US accent.
--
--
-- More than 180 individual sound files have been created using a text-to-speech program. All ATIS information is given with en-US accent.
--
-- Check out the pinned messages in the Moose discord #ops-atis channel.
--
--
-- To include the files, open the mission (.miz) file with, e.g., 7-zip. Then just drag-n-drop the file into the miz.
--
--
-- ![Banner Image](..\Presentations\ATIS\ATIS_SoundFolder.png)
--
--
-- **Note** that the default folder name is *ATIS Soundfiles/*. If you want to change it, you can use the @{#ATIS.SetSoundfilesPath}(*path*), where *path* is the path of the directory. This must end with a slash "/"!
--
--
-- # Examples
--
--
-- ## Caucasus: Batumi
--
--
-- -- ATIS Batumi Airport on 143.00 MHz AM.
-- atisBatumi=ATIS:New(AIRBASE.Caucasus.Batumi, 143.00)
-- atisBatumi:SetRadioRelayUnitName("Radio Relay Batumi")
-- atisBatumi:Start()
--
--
-- ## Nevada: Nellis AFB
--
--
-- -- ATIS Nellis AFB on 270.100 MHz AM.
-- atisNellis=ATIS:New(AIRBASE.Nevada.Nellis_AFB, 270.100)
-- atisNellis:SetRadioRelayUnitName("Radio Relay Nellis")
-- atisNellis:SetActiveRunway("21L")
-- atisNellis:SetTowerFrequencies({327.000, 132.550})
-- atisNellis:Start()
--
--
-- ## Persian Gulf: Abu Dhabi International Airport
--
-- atisAbuDhabi=ATIS:New(AIRBASE.PersianGulf.Abu_Dhabi_International_Airport, 125.1)
@@ -184,7 +186,7 @@
-- atisAbuDhabi:SetMetricUnits()
-- atisAbuDhabi:SetActiveRunway("L")
-- atisAbuDhabi:Start()
--
--
--
-- @field #ATIS
ATIS = {
@@ -271,24 +273,24 @@ function ATIS:New(airbasename, frequency, modulation)
-- Inherit everything from WAREHOUSE class.
local self=BASE:Inherit(self, FSM:New()) -- #ATIS
self.airbasename=airbasename
self.airbase=AIRBASE:FindByName(airbasename)
if self.airbase==nil then
self:E("ERROR: Airbase %s for ATIS could not be found!", tostring(airbasename))
end
-- Default freq and modulation.
self.frequency=frequency or 143.00
self.modulation=modulation or 0
-- Get map.
self.theatre=env.mission.theatre
-- Set some string id for output to DCS.log file.
self.lid=string.format("ATIS %s | ", self.airbasename)
-- Defaults:
self:SetSoundfilesPath()
self:SetSubtitleDuration()
@@ -302,7 +304,7 @@ function ATIS:New(airbasename, frequency, modulation)
self:AddTransition("*", "Status", "*") -- Update status.
self:AddTransition("*", "Broadcast", "*") -- Broadcast ATIS message.
self:AddTransition("*", "CheckQueue", "*") -- Check if radio queue is empty.
------------------------
--- Pseudo Functions ---
------------------------
@@ -367,7 +369,7 @@ end
function ATIS:SetTowerFrequencies(freqs)
if type(freqs)=="table" then
-- nothing to do
else
else
freqs={freqs}
end
self.towerfrequency=freqs
@@ -410,7 +412,7 @@ function ATIS:SetImperialUnits()
end
--- Set pressure unit to millimeters of mercury (mmHg).
-- Default is inHg for imperial and hPa (=mBar) for metric units.
-- Default is inHg for imperial and hPa (=mBar) for metric units.
-- @param #ATIS self
-- @return #ATIS self
function ATIS:SetPressureMillimetersMercury()
@@ -427,14 +429,14 @@ function ATIS:SetTemperatureFahrenheit()
end
--- Set magnetic declination/variation at the airport.
--
--
-- Default is per map:
--
--
-- * Caucasus +6 (East), year ~ 2011
-- * NTTR +12 (East), year ~ 2011
-- * Normandy -10 (West), year ~ 1944
-- * Persian Gulf +2 (East), year ~ 2011
--
--
-- @param #ATIS self
-- @param #number magvar Magnetic variation in degrees.
-- @return #ATIS self
@@ -445,12 +447,12 @@ end
--- Set time local difference with respect to Zulu time.
-- Default is per map:
--
--
-- * Caucasus +4
-- * Nevada -7
-- * Normandy +1
-- * Persian Gulf +4
--
--
-- @param #ATIS self
-- @param #number delta Time difference in hours.
-- @return #ATIS self
@@ -469,16 +471,16 @@ function ATIS:onafterStart(From, Event, To)
-- Info.
self:I(self.lid..string.format("Starting ATIS v%s for airbase %s on %.3f MHz Modulation=%d", ATIS.version, self.airbasename, self.frequency, self.modulation))
-- Start radio queue.
self.radioqueue=RADIOQUEUE:New(self.frequency, self.modulation)
-- Send coordinate is airbase coord.
self.radioqueue:SetSenderCoordinate(self.airbase:GetCoordinate())
-- Set relay unit if we have one.
self.radioqueue:SetSenderUnitName(self.relayunitname)
-- Init numbers.
self.radioqueue:SetDigit(0, "N-0.ogg", 0.55, self.soundpath)
self.radioqueue:SetDigit(1, "N-1.ogg", 0.40, self.soundpath)
@@ -490,7 +492,7 @@ function ATIS:onafterStart(From, Event, To)
self.radioqueue:SetDigit(7, "N-7.ogg", 0.42, self.soundpath)
self.radioqueue:SetDigit(8, "N-8.ogg", 0.37, self.soundpath)
self.radioqueue:SetDigit(9, "N-9.ogg", 0.38, self.soundpath)
-- Start radio queue.
self.radioqueue:Start(1, 0.1)
@@ -505,11 +507,11 @@ function ATIS:onafterStatus(From, Event, To)
-- Get FSM state.
local fsmstate=self:GetState()
-- Info text.
local text=string.format("State %s", fsmstate)
self:I(self.lid..text)
self:__Status(30)
end
@@ -527,7 +529,7 @@ function ATIS:onafterCheckQueue(From, Event, To)
else
self:T2(self.lid..string.format("Radio queue %d transmissions queued.", #self.radioqueue.queue))
end
-- Check back in 5 seconds.
self:__CheckQueue(5)
end
@@ -538,29 +540,29 @@ function ATIS:onafterBroadcast(From, Event, To)
-- Get current coordinate.
local coord=self.airbase:GetCoordinate()
-- Get elevation.
local height=coord:GetLandHeight()+10
----------------
--- Pressure ---
----------------
-- Pressure in hPa.
local qfe=coord:GetPressure(height)
local qnh=coord:GetPressure(0)
-- Convert to inHg.
if self.PmmHg then
qfe=UTILS.hPa2mmHg(qfe)
qnh=UTILS.hPa2mmHg(qnh)
else
else
if not self.metric then
qfe=UTILS.hPa2inHg(qfe)
qnh=UTILS.hPa2inHg(qnh)
end
end
local QFE=UTILS.Split(string.format("%.2f", qfe), ".")
local QNH=UTILS.Split(string.format("%.2f", qnh), ".")
@@ -573,18 +575,18 @@ function ATIS:onafterBroadcast(From, Event, To)
QNH=UTILS.Split(string.format("%.1f", qnh), ".")
end
end
--------------
--- Runway ---
--------------
-- Get runway based on wind direction.
local runway=self.airbase:GetActiveRunway(self.magvar).idx
-- Left or right in case there are two runways with the same heading.
local rleft=false
local rright=false
-- Check if user explicitly specified a runway.
if self.activerunway then
local runwayno=self.activerunway:gsub("%D+", "")
@@ -594,27 +596,27 @@ function ATIS:onafterBroadcast(From, Event, To)
rleft=self.activerunway:lower():find("l")
rright=self.activerunway:lower():find("r")
end
------------
--- Wind ---
------------
-- Get wind direction and speed in m/s.
local windFrom, windSpeed=coord:GetWind(height)
local WINDFROM=string.format("%03d", windFrom)
local WINDSPEED=string.format("%d", UTILS.MpsToKnots(windSpeed))
if self.metric then
WINDSPEED=string.format("%d", windSpeed)
end
------------
--- Time ---
------------
local time=timer.getAbsTime()
-- Conversion to Zulu time.
if self.zuludiff then
-- User specified.
@@ -630,43 +632,43 @@ function ATIS:onafterBroadcast(From, Event, To)
time=time-1*60*60 -- Calais UTC+1 hour
end
end
local clock=UTILS.SecondsToClock(time)
local zulu=UTILS.Split(clock, ":")
local ZULU=string.format("%s%s", zulu[1], zulu[2])
-- NATO time stamp. 0=Alfa, 1=Bravo, 2=Charlie, etc.
local NATO=ATIS.Alphabet[tonumber(zulu[1])+1]
-- Debug.
self:T3({nato=NATO})
-------------------
--- Temperature ---
-------------------
-- Temperature in °C.
-- Temperature in C.
local temperature=coord:GetTemperature(height)
local TEMPERATURE=string.format("%d", temperature)
if self.TDegF then
TEMPERATURE=string.format("%d", UTILS.CelciusToFarenheit(temperature))
end
---------------
--- Weather ---
---------------
-- Get mission weather info. Most of this is static.
local clouds, visibility, turbulence, fog, dust, static=self:GetMissionWeather()
-- Check that fog is actually "thick" enough to reach the airport. If an airport is in the mountains, fog might not affect it as it is measured from sea level.
if fog and fog.thickness<height then
fog=nil
end
-- Dust only up to 1500 ft = 457 m ASL.
if dust and height>UTILS.FeetToMeters(1500) then
dust=nil
@@ -675,63 +677,63 @@ function ATIS:onafterBroadcast(From, Event, To)
------------------
--- Visibility ---
------------------
-- Get min visibility.
local visibilitymin=visibility
if fog then
if fog.visibility<visibilitymin then
visibilitymin=fog.visibility
end
end
end
if dust then
if dust<visibilitymin then
visibilitymin=dust
end
end
-- Visibility in NM.
local VISIBILITY=string.format("%d", UTILS.Round(UTILS.MetersToNM(visibilitymin)))
-- Visibility in km.
if self.metric then
VISIBILITY=string.format("%d", UTILS.Round(visibilitymin/1000))
end
--------------
--- Clouds ---
--------------
local cloudbase=clouds.base
local cloudceil=clouds.base+clouds.thickness
local clouddens=clouds.density
-- Precepitation: 0=None, 1=Rain, 2=Thunderstorm.
local precepitation=tonumber(clouds.iprecptns)
local CLOUDBASE=string.format("%d", UTILS.MetersToFeet(cloudbase))
local CLOUDCEIL=string.format("%d", UTILS.MetersToFeet(cloudceil))
if self.metric then
CLOUDBASE=string.format("%d", cloudbase)
CLOUDCEIL=string.format("%d", cloudceil)
end
-- Cloud base/ceiling in thousands and hundrets of ft/meters.
local CLOUDBASE1000, CLOUDBASE0100=self:_GetThousandsAndHundreds(UTILS.MetersToFeet(cloudbase))
local CLOUDCEIL1000, CLOUDCEIL0100=self:_GetThousandsAndHundreds(UTILS.MetersToFeet(cloudceil))
if self.metric then
CLOUDBASE1000, CLOUDBASE0100=self:_GetThousandsAndHundreds(cloudbase)
CLOUDCEIL1000, CLOUDCEIL0100=self:_GetThousandsAndHundreds(cloudceil)
end
-- No cloud info for dynamic weather.
local CLOUDSogg="CloudsNotAvailable.ogg"
local CLOUDSsub="Cloud coverage information not available"
local CLOUDSdur=2.40
-- Only valid for static weather.
if static then
if clouddens>=9 then
@@ -763,31 +765,31 @@ function ATIS:onafterBroadcast(From, Event, To)
CLOUDSdur=1.00
end
end
--------------------
--- Transmission ---
--------------------
local subduration=self.subduration
local subtitle=""
--Airbase name
subtitle=string.format("%s", self.airbasename)
if self.airbasename:find("AFB")==nil and self.airbasename:find("Airport")==nil and self.airbasename:find("Airstrip")==nil and self.airbasename:find("airfield")==nil and self.airbasename:find("AB")==nil then
subtitle=subtitle.." Airport"
end
self.radioqueue:NewTransmission(string.format("%s/%s.ogg", self.theatre, self.airbasename), 3.0, self.soundpath, nil, nil, subtitle, subduration)
-- Information tag
subtitle=string.format("Information %s", NATO)
self.radioqueue:NewTransmission("Information.ogg", 0.85, self.soundpath, nil, 0.5, subtitle, subduration)
self.radioqueue:NewTransmission(string.format("NATO Alphabet/%s.ogg", NATO), 0.75, self.soundpath)
-- Zulu Time
subtitle=string.format("%s Zulu Time", ZULU)
self.radioqueue:Number2Transmission(ZULU, nil, 0.5)
self.radioqueue:NewTransmission("TimeZulu.ogg", 0.89, self.soundpath, nil, 0.2, subtitle, subduration)
-- Visibility
if self.metric then
subtitle=string.format("Visibility %s km", VISIBILITY)
@@ -799,9 +801,9 @@ function ATIS:onafterBroadcast(From, Event, To)
if self.metric then
self.radioqueue:NewTransmission("Kilometers.ogg", 0.78, self.soundpath, nil, 0.2)
else
self.radioqueue:NewTransmission("NauticalMiles.ogg", 1.05, self.soundpath, nil, 0.2)
self.radioqueue:NewTransmission("NauticalMiles.ogg", 1.05, self.soundpath, nil, 0.2)
end
-- Cloud base
self.radioqueue:NewTransmission(CLOUDSogg, CLOUDSdur, self.soundpath, nil, 1.0, CLOUDSsub, subduration)
if CLOUDBASE and static then
@@ -815,7 +817,7 @@ function ATIS:onafterBroadcast(From, Event, To)
if tonumber(CLOUDBASE1000)>0 then
self.radioqueue:Number2Transmission(CLOUDBASE1000)
self.radioqueue:NewTransmission("Thousand.ogg", 0.55, self.soundpath, nil, 0.1)
end
end
if tonumber(CLOUDBASE0100)>0 then
self.radioqueue:Number2Transmission(CLOUDBASE0100)
self.radioqueue:NewTransmission("Hundred.ogg", 0.47, self.soundpath, nil, 0.1)
@@ -825,7 +827,7 @@ function ATIS:onafterBroadcast(From, Event, To)
if tonumber(CLOUDCEIL1000)>0 then
self.radioqueue:Number2Transmission(CLOUDCEIL1000)
self.radioqueue:NewTransmission("Thousand.ogg", 0.55, self.soundpath, nil, 0.1)
end
end
if tonumber(CLOUDCEIL0100)>0 then
self.radioqueue:Number2Transmission(CLOUDCEIL0100)
self.radioqueue:NewTransmission("Hundred.ogg", 0.47, self.soundpath, nil, 0.1)
@@ -836,7 +838,7 @@ function ATIS:onafterBroadcast(From, Event, To)
self.radioqueue:NewTransmission("Feet.ogg", 0.45, self.soundpath, nil, 0.1)
end
end
-- Weather phenomena
local wp=false
local wpsub=""
@@ -853,16 +855,16 @@ function ATIS:onafterBroadcast(From, Event, To)
if fog then
if wp then
wpsub=wpsub..","
end
end
wpsub=wpsub.." fog"
wp=true
wp=true
end
if dust then
if wp then
wpsub=wpsub..","
end
end
wpsub=wpsub.." dust"
wp=true
wp=true
end
-- Actual output
if wp then
@@ -876,14 +878,14 @@ function ATIS:onafterBroadcast(From, Event, To)
self.radioqueue:NewTransmission("Fog.ogg", 0.81, self.soundpath, nil, 0.5)
end
if dust then
self.radioqueue:NewTransmission("Dust.ogg", 0.81, self.soundpath, nil, 0.5)
end
end
self.radioqueue:NewTransmission("Dust.ogg", 0.81, self.soundpath, nil, 0.5)
end
end
-- Altimeter QNH/QFE.
if self.PmmHg then
subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s mmHg", QNH[1], QNH[2], QFE[1], QFE[2])
else
else
if self.metric then
subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s hPa", QNH[1], QNH[2], QFE[1], QFE[2])
else
@@ -908,7 +910,7 @@ function ATIS:onafterBroadcast(From, Event, To)
self.radioqueue:NewTransmission("InchesOfMercury.ogg", 1.16, self.soundpath, nil, 0.1)
end
end
-- Temperature
if self.TDegF then
subtitle=string.format("Temperature %s °F", TEMPERATURE)
@@ -922,7 +924,7 @@ function ATIS:onafterBroadcast(From, Event, To)
else
self.radioqueue:NewTransmission("DegreesCelsius.ogg", 1.28, self.soundpath, nil, 0.2)
end
-- Wind
if self.metric then
subtitle=string.format("Wind from %s at %s m/s", WINDFROM, WINDSPEED)
@@ -944,7 +946,7 @@ function ATIS:onafterBroadcast(From, Event, To)
if turbulence>0 then
self.radioqueue:NewTransmission("Gusting.ogg", 0.55, self.soundpath, nil, 0.2)
end
-- Active runway.
local subtitle=string.format("Active runway %s", runway)
if rleft then
@@ -959,7 +961,7 @@ function ATIS:onafterBroadcast(From, Event, To)
elseif rright then
self.radioqueue:NewTransmission("Right.ogg", 0.43, self.soundpath, nil, 0.2)
end
-- Tower frequency.
if self.towerfrequency then
local freqs=""
@@ -972,14 +974,14 @@ function ATIS:onafterBroadcast(From, Event, To)
self.radioqueue:NewTransmission("TowerFrequency.ogg", 1.19, self.soundpath, nil, 1.0, string.format("Tower frequency %s", freqs), subduration)
for _,freq in pairs(self.towerfrequency) do
local f=string.format("%.3f", freq)
f=UTILS.Split(f, ".")
f=UTILS.Split(f, ".")
self.radioqueue:Number2Transmission(f[1], nil, 0.5)
self.radioqueue:NewTransmission("Decimal.ogg", 0.58, self.soundpath, nil, 0.2)
self.radioqueue:Number2Transmission(f[2])
self.radioqueue:NewTransmission("MegaHertz.ogg", 0.86, self.soundpath, nil, 0.2)
end
end
end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -990,7 +992,7 @@ end
-- @param #ATIS self
-- @return #table Clouds table which has entries "thickness", "density", "base", "iprecptns".
-- @return #number Visibility distance in meters.
-- @return #number Ground turbulence in m/s.
-- @return #number Ground turbulence in m/s.
-- @return #table Fog table, which has entries "thickness", "visibility" or nil if fog is disabled in the mission.
-- @return #number Dust density or nil if dust is disabled in the mission.
-- @return #boolean static If true, static weather is used. If false, dynamic weather is used.
@@ -1010,13 +1012,13 @@ function ATIS:GetMissionWeather()
}, -- end of ["clouds"]
]]
local clouds=weather.clouds
-- 0=static, 1=dynamic
local static=weather.atmosphere_type==0
-- Visibilty distance in meters.
local visibility=weather.visibility.distance
-- Ground turbulence.
local turbulence=weather.groundTurbulence
@@ -1063,12 +1065,12 @@ end
function ATIS:_GetThousandsAndHundreds(n)
local N=UTILS.Round(n/1000, 1)
local S=UTILS.Split(string.format("%.1f", N), ".")
local t=S[1]
local h=S[2]
return t, h
end