diff --git a/Moose Development/Moose/Core/RadioQueue.lua b/Moose Development/Moose/Core/RadioQueue.lua index baa294dc9..4dd101b95 100644 --- a/Moose Development/Moose/Core/RadioQueue.lua +++ b/Moose Development/Moose/Core/RadioQueue.lua @@ -321,6 +321,8 @@ function RADIOQUEUE:Broadcast(transmission) -- Set command for radio transmission. sender:SetCommand(commandTransmit) + + --MESSAGE:New(string.format("transmissing file %s duration=%.2f sec, subtitle=%s", filename, transmission.duration, transmission.subtitle or ""), 5, "RADIOQUEUE"):ToAll() else @@ -347,6 +349,7 @@ function RADIOQUEUE:Broadcast(transmission) if vec3 then self:T("Sending") self:T( { filename = filename, vec3 = vec3, modulation = self.modulation, frequency = self.frequency, power = self.power } ) + --MESSAGE:New(string.format("transmissing file %s duration=%.2f sec, subtitle=%s", filename, transmission.duration, transmission.subtitle or ""), 5, "RADIOQUEUE (trigger)"):ToAll() trigger.action.radioTransmission(filename, vec3, self.modulation, false, self.frequency, self.power) end diff --git a/Moose Development/Moose/Ops/ATIS.lua b/Moose Development/Moose/Ops/ATIS.lua index a7ebe4fe8..f3c465a1f 100644 --- a/Moose Development/Moose/Ops/ATIS.lua +++ b/Moose Development/Moose/Ops/ATIS.lua @@ -21,13 +21,13 @@ -- ## Youtube Videos: -- -- * [ATIS v0.1 Caucasus - Batumi (WIP)](https://youtu.be/MdH9FmbNabo) --- * [ATIS Airport Names Sound Check](https://youtu.be/qIE_OUQNAc0) -- * [ATIS v0.2 Nevada - Nellis AFB (WIP)](https://youtu.be/8CT_9AoPrTk) -- * [ATIS v0.3 Persion Gulf - Abu Dhabi/Dubai International](https://youtu.be/NjkKvPz6ovM) +-- * [ATIS Airport Names Sound Check](https://youtu.be/qIE_OUQNAc0) -- -- === -- --- ## Missions: Example missions will be added later. +-- ## Missions: Example missions can be found [here](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/develop/OPS%20-%20ATIS) -- -- === -- @@ -66,6 +66,13 @@ -- @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. +-- @field #table ils Table of ILS frequencies (can be runway specific). +-- @field #table ndbinner Table of inner NDB frequencies (can be runway specific). +-- @field #table ndbouter Table of outer NDB frequencies (can be runway specific). +-- @field #number tacan TACAN channel. +-- @field #number vor VOR frequency. +-- @field #number rsbn RSBN channel. +-- @field #table prmg PRMG channels (can be runway specific). -- @extends Core.Fsm#FSM --- Be informed! @@ -209,6 +216,13 @@ ATIS = { TDegF = nil, zuludiff = nil, magvar = nil, + ils = {}, + ndbinner = {}, + ndbouter = {}, + vor = nil, + tacan = nil, + rsbn = nil, + prmg = {}, } --- NATO alphabet. @@ -244,19 +258,161 @@ ATIS.Alphabet = { [28] = "Zulu", } +--- Nav point data. +-- @type ATIS.NavPoint +-- @field #number frequency Nav point frequency. +-- @field #string runway Runway, e.g. "21". + +--- Sound file data. +-- @type ATIS.Soundfile +-- @field #string filename Name of the file +-- @field #number duration Duration in seconds. + +--- Sound files. +-- @type ATIS.Sound +-- @field #ATIS.Soundfile ActiveRunway +-- @field #ATIS.Soundfile Airport +-- @field #ATIS.Soundfile Altimeter +-- @field #ATIS.Soundfile At +-- @field #ATIS.Soundfile CloudBase +-- @field #ATIS.Soundfile CloudCeiling +-- @field #ATIS.Soundfile CloudsBroken +-- @field #ATIS.Soundfile CloudsFew +-- @field #ATIS.Soundfile CloudsNo +-- @field #ATIS.Soundfile CloudsNotAvailable +-- @field #ATIS.Soundfile CloudsOvercast +-- @field #ATIS.Soundfile CloudsScattered +-- @field #ATIS.Soundfile Decimal +-- @field #ATIS.Soundfile DegreesCelsius +-- @field #ATIS.Soundfile DegreesFahrenheit +-- @field #ATIS.Soundfile Dust +-- @field #ATIS.Soundfile Feet +-- @field #ATIS.Soundfile Fog +-- @field #ATIS.Soundfile Gusting +-- @field #ATIS.Soundfile HectoPascal +-- @field #ATIS.Soundfile Hundred +-- @field #ATIS.Soundfile InchesOfMercury +-- @field #ATIS.Soundfile Information +-- @field #ATIS.Soundfile Kilometers +-- @field #ATIS.Soundfile Knots +-- @field #ATIS.Soundfile Left +-- @field #ATIS.Soundfile MegaHertz +-- @field #ATIS.Soundfile Meters +-- @field #ATIS.Soundfile MetersPerSecond +-- @field #ATIS.Soundfile MillimetersOfMercury +-- @field #ATIS.Soundfile N0 +-- @field #ATIS.Soundfile N1 +-- @field #ATIS.Soundfile N2 +-- @field #ATIS.Soundfile N3 +-- @field #ATIS.Soundfile N4 +-- @field #ATIS.Soundfile N5 +-- @field #ATIS.Soundfile N6 +-- @field #ATIS.Soundfile N7 +-- @field #ATIS.Soundfile N8 +-- @field #ATIS.Soundfile N9 +-- @field #ATIS.Soundfile NauticalMiles +-- @field #ATIS.Soundfile None +-- @field #ATIS.Soundfile QFE +-- @field #ATIS.Soundfile QNH +-- @field #ATIS.Soundfile Rain +-- @field #ATIS.Soundfile Right +-- @field #ATIS.Soundfile Temperature +-- @field #ATIS.Soundfile Thousand +-- @field #ATIS.Soundfile ThunderStorm +-- @field #ATIS.Soundfile TimeLocal +-- @field #ATIS.Soundfile TimeZulu +-- @field #ATIS.Soundfile TowerFrequency +-- @field #ATIS.Soundfile Visibilty +-- @field #ATIS.Soundfile WeatherPhenomena +-- @field #ATIS.Soundfile WindFrom +-- @field #ATIS.Soundfile ILSFrequency +-- @field #ATIS.Soundfile InnerNDBFrequency +-- @field #ATIS.Soundfile OuterNDBFrequency +-- @field #ATIS.Soundfile PRGMChannel +-- @field #ATIS.Soundfiel RSBNChannel +-- @field #ATIS.Soundfile RunwayLength +-- @field #ATIS.Soundfile TACANChannel +-- @field #ATIS.Soundfile VORFrequency +ATIS.Sound = { + ActiveRunway={filename="ActiveRunway.ogg", duration=0.99}, + Airport={filename="Airport.ogg", duration=0.66}, + Altimeter={filename="Altimeter.ogg", duration=0.68}, + At={filename="At.ogg", duration=0.41}, + CloudBase={filename="CloudBase.ogg", duration=0.82}, + CloudCeiling={filename="CloudCeiling.ogg", duration=0.61}, + CloudsBroken={filename="CloudsBroken.ogg", duration=1.07}, + CloudsFew={filename="CloudsFew.ogg", duration=0.99}, + CloudsNo={filename="CloudsNo.ogg", duration=1.01}, + CloudsNotAvailable={filename="CloudsNotAvailable.ogg", duration=2.35}, + CloudsOvercast={filename="CloudsOvercast.ogg", duration=0.83}, + CloudsScattered={filename="CloudsScattered.ogg", duration=1.18}, + Decimal={filename="Decimal.ogg", duration=0.54}, + DegreesCelsius={filename="DegreesCelsius.ogg", duration=1.27}, + DegreesFahrenheit={filename="DegreesFahrenheit.ogg", duration=1.23}, + Dust={filename="Dust.ogg", duration=0.54}, + Feet={filename="Feet.ogg", duration=0.45}, + Fog={filename="Fog.ogg", duration=0.47}, + Gusting={filename="Gusting.ogg", duration=0.55}, + HectoPascal={filename="HectoPascal.ogg", duration=1.15}, + Hundred={filename="Hundred.ogg", duration=0.47}, + InchesOfMercury={filename="InchesOfMercury.ogg", duration=1.16}, + Information={filename="Information.ogg", duration=0.85}, + Kilometers={filename="Kilometers.ogg", duration=0.78}, + Knots={filename="Knots.ogg", duration=0.59}, + Left={filename="Left.ogg", duration=0.54}, + MegaHertz={filename="MegaHertz.ogg", duration=0.87}, + Meters={filename="Meters.ogg", duration=0.59}, + MetersPerSecond={filename="MetersPerSecond.ogg", duration=1.14}, + MillimetersOfMercury={filename="MillimetersOfMercury.ogg", duration=1.53}, + Minus={filename="Minus.ogg", duration=0.64}, + N0={filename="N-0.ogg", duration=0.55}, + N1={filename="N-1.ogg", duration=0.41}, + N2={filename="N-2.ogg", duration=0.37}, + N3={filename="N-3.ogg", duration=0.41}, + N4={filename="N-4.ogg", duration=0.37}, + N5={filename="N-5.ogg", duration=0.43}, + N6={filename="N-6.ogg", duration=0.55}, + N7={filename="N-7.ogg", duration=0.43}, + N8={filename="N-8.ogg", duration=0.38}, + N9={filename="N-9.ogg", duration=0.55}, + NauticalMiles={filename="NauticalMiles.ogg", duration=1.04}, + None={filename="None.ogg", duration=0.43}, + QFE={filename="QFE.ogg", duration=0.63}, + QNH={filename="QNH.ogg", duration=0.71}, + Rain={filename="Rain.ogg", duration=0.41}, + Right={filename="Right.ogg", duration=0.44}, + Temperature={filename="Temperature.ogg", duration=0.64}, + Thousand={filename="Thousand.ogg", duration=0.55}, + ThunderStorm={filename="ThunderStorm.ogg", duration=0.81}, + TimeLocal={filename="TimeLocal.ogg", duration=0.90}, + TimeZulu={filename="TimeZulu.ogg", duration=0.86}, + TowerFrequency={filename="TowerFrequency.ogg", duration=1.19}, + Visibilty={filename="Visibility.ogg", duration=0.79}, + WeatherPhenomena={filename="WeatherPhenomena.ogg", duration=1.07}, + WindFrom={filename="WindFrom.ogg", duration=0.60}, + ILSFrequency={filename="ILSFrequency.ogg", duration=1.30}, + InnerNDBFrequency={filename="InnerNDBFrequency.ogg", duration=1.56}, + OuterNDBFrequency={filename="OuterNDBFrequency.ogg", duration=1.59}, + RunwayLength={filename="RunwayLength.ogg", duration=0.91}, + VORFrequency={filename="VORFrequency.ogg", duration=1.38}, + TACANChannel={filename="TACANChannel.ogg", duration=0.88}, + PRGMChannel={filename="PRGMChannel.ogg", duration=1.12}, + RSBNChannel={filename="RSBNChannel.ogg", duration=1.14}, +} + --- ATIS class version. -- @field #string version -ATIS.version="0.3.1" +ATIS.version="0.3.3" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- TODO: Metric units. +-- DONE: Metric units. -- TODO: Correct fog for elevation. --- TODO: Set UTC correction. +-- DONE: Set UTC correction. -- TODO: Use local time. --- TODO: Set magnetic variation. +-- DONE: Set magnetic variation. -- TODO: Add stop/pause FMS functions. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -461,6 +617,68 @@ function ATIS:SetZuluTimeDifference(delta) return self end +--- Add ILS station. +-- @param #ATIS self +-- @param #number frequency ILS frequency. +-- @param #string runway Runway. Default all (*nil*). +-- @return #ATIS self +function ATIS:AddILS(frequency, runway) + local ils={} --#ATIS.NavPoint + ils.frequency=tonumber(frequency) + ils.runway=runway + table.insert(self.ils, ils) + return self +end + +--- Add VOR station. +-- @param #ATIS self +-- @param #number frequency VOR frequency. +-- @param #string runway Runway. Default all (*nil*). +-- @return #ATIS self +function ATIS:AddVOR(frequency, runway) + local vor={} --#ATIS.NavPoint + vor.frequency=tonumber(frequency) + vor.runway=runway + table.insert(self.vor, vor) + return self +end + +--- Add outer NDB. +-- @param #ATIS self +-- @param #number frequency NDB frequency. +-- @param #string runway Runway. Default all (*nil*). +-- @return #ATIS self +function ATIS:AddNDBouter(frequency, runway) + local ndb={} --#ATIS.NavPoint + ndb.frequency=tonumber(frequency) + ndb.runway=runway + table.insert(self.ndbouter, ndb) + return self +end + +--- Add inner NDB. +-- @param #ATIS self +-- @param #number frequency NDB frequency. +-- @param #string runway Runway. Default all (*nil*). +-- @return #ATIS self +function ATIS:AddNDBouter(frequency, runway) + local ndb={} --#ATIS.NavPoint + ndb.frequency=tonumber(frequency) + ndb.runway=runway + table.insert(self.ndbinner, ndb) + return self +end + +--- Set TACAN channel. +-- @param #ATIS self +-- @param #number tacan TACAN channel. +-- @return #ATIS self +function ATIS:SetTACAN(tacan) + self.tacan=tacan + return self +end + + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Start & Status ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -482,16 +700,16 @@ function ATIS:onafterStart(From, Event, To) 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) - self.radioqueue:SetDigit(2, "N-2.ogg", 0.35, self.soundpath) - self.radioqueue:SetDigit(3, "N-3.ogg", 0.40, self.soundpath) - self.radioqueue:SetDigit(4, "N-4.ogg", 0.36, self.soundpath) - self.radioqueue:SetDigit(5, "N-5.ogg", 0.42, self.soundpath) - self.radioqueue:SetDigit(6, "N-6.ogg", 0.53, self.soundpath) - 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) + self.radioqueue:SetDigit(0, ATIS.Sound.N0.filename, ATIS.Sound.N0.duration, self.soundpath) + self.radioqueue:SetDigit(1, ATIS.Sound.N1.filename, ATIS.Sound.N1.duration, self.soundpath) + self.radioqueue:SetDigit(2, ATIS.Sound.N2.filename, ATIS.Sound.N2.duration, self.soundpath) + self.radioqueue:SetDigit(3, ATIS.Sound.N3.filename, ATIS.Sound.N3.duration, self.soundpath) + self.radioqueue:SetDigit(4, ATIS.Sound.N4.filename, ATIS.Sound.N4.duration, self.soundpath) + self.radioqueue:SetDigit(5, ATIS.Sound.N5.filename, ATIS.Sound.N5.duration, self.soundpath) + self.radioqueue:SetDigit(6, ATIS.Sound.N6.filename, ATIS.Sound.N6.duration, self.soundpath) + self.radioqueue:SetDigit(7, ATIS.Sound.N7.filename, ATIS.Sound.N7.duration, self.soundpath) + self.radioqueue:SetDigit(8, ATIS.Sound.N8.filename, ATIS.Sound.N8.duration, self.soundpath) + self.radioqueue:SetDigit(9, ATIS.Sound.N9.filename, ATIS.Sound.N9.duration, self.soundpath) -- Start radio queue. self.radioqueue:Start(1, 0.1) @@ -512,7 +730,7 @@ function ATIS:onafterStatus(From, Event, To) local text=string.format("State %s", fsmstate) self:I(self.lid..text) - self:__Status(30) + self:__Status(60) end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -734,39 +952,34 @@ function ATIS:onafterBroadcast(From, Event, To) end -- No cloud info for dynamic weather. - local CLOUDSogg="CloudsNotAvailable.ogg" + local CloudCover={} --#ATIS.Soundfile + CloudCover=ATIS.Sound.CloudsNotAvailable local CLOUDSsub="Cloud coverage information not available" - local CLOUDSdur=2.40 -- Only valid for static weather. if static then if clouddens>=9 then -- Overcast 9,10 - CLOUDSogg="CloudsOvercast.ogg" + CloudCover=ATIS.Sound.CloudsOvercast CLOUDSsub="Overcast" - CLOUDSdur=0.85 elseif clouddens>=7 then -- Broken 7,8 - CLOUDSogg="CloudsBroken.ogg" + CloudCover=ATIS.Sound.CloudsBroken CLOUDSsub="Broken clouds" - CLOUDSdur=1.10 elseif clouddens>=4 then -- Scattered 4,5,6 - CLOUDSogg="CloudsScattered.ogg" + CloudCover=ATIS.Sound.CloudsScattered CLOUDSsub="Scattered clouds" - CLOUDSdur=1.20 elseif clouddens>=1 then -- Few 1,2,3 - CLOUDSogg="CloudsFew.ogg" + CloudCover=ATIS.Sound.CloudsFew CLOUDSsub="Few clouds" - CLOUDSdur=1.00 else -- No clouds CLOUDBASE=nil CLOUDCEIL=nil - CLOUDSogg="CloudsNo.ogg" + CloudCover=ATIS.Sound.CloudsNo CLOUDSsub="No clouds" - CLOUDSdur=1.00 end end @@ -774,7 +987,7 @@ function ATIS:onafterBroadcast(From, Event, To) --- Transmission --- -------------------- - local subduration=self.subduration + -- Subtitle local subtitle="" --Airbase name @@ -782,17 +995,17 @@ function ATIS:onafterBroadcast(From, Event, To) 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) + self.radioqueue:NewTransmission(string.format("%s/%s.ogg", self.theatre, self.airbasename), 3.0, self.soundpath, nil, nil, subtitle, self.subduration) -- Information tag subtitle=string.format("Information %s", NATO) - self.radioqueue:NewTransmission("Information.ogg", 0.85, self.soundpath, nil, 0.5, subtitle, subduration) + self:Transmission(ATIS.Sound.Information, 0.5, subtitle) 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) + self:Transmission(ATIS.Sound.TimeZulu, 0.2, subtitle) -- Visibility if self.metric then @@ -800,16 +1013,16 @@ function ATIS:onafterBroadcast(From, Event, To) else subtitle=string.format("Visibility %s NM", VISIBILITY) end - self.radioqueue:NewTransmission("Visibility.ogg", 0.8, self.soundpath, nil, 1.0, subtitle, subduration) + self:Transmission(ATIS.Sound.Visibilty, 1.0, subtitle) self.radioqueue:Number2Transmission(VISIBILITY) if self.metric then - self.radioqueue:NewTransmission("Kilometers.ogg", 0.78, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.Kilometers, 0.2) else - self.radioqueue:NewTransmission("NauticalMiles.ogg", 1.05, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.NauticalMiles, 0.2) end -- Cloud base - self.radioqueue:NewTransmission(CLOUDSogg, CLOUDSdur, self.soundpath, nil, 1.0, CLOUDSsub, subduration) + self:Transmission(CloudCover, 1.0, CLOUDSsub) if CLOUDBASE and static then -- Base if self.metric then @@ -817,29 +1030,29 @@ function ATIS:onafterBroadcast(From, Event, To) else subtitle=string.format("Cloudbase %s, ceiling %s ft", CLOUDBASE, CLOUDCEIL) end - self.radioqueue:NewTransmission("CloudBase.ogg", 0.81, self.soundpath, nil, 1.0, subtitle, subduration) + self:Transmission(ATIS.Sound.CloudBase, 1.0, subtitle) if tonumber(CLOUDBASE1000)>0 then self.radioqueue:Number2Transmission(CLOUDBASE1000) - self.radioqueue:NewTransmission("Thousand.ogg", 0.55, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.Thousand, 0.1) end if tonumber(CLOUDBASE0100)>0 then self.radioqueue:Number2Transmission(CLOUDBASE0100) - self.radioqueue:NewTransmission("Hundred.ogg", 0.47, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.Hundred, 0.1) end -- Ceiling - self.radioqueue:NewTransmission("CloudCeiling.ogg", 0.62, self.soundpath, nil, 0.5) + self:Transmission(ATIS.Sound.CloudCeiling, 0.5) if tonumber(CLOUDCEIL1000)>0 then self.radioqueue:Number2Transmission(CLOUDCEIL1000) - self.radioqueue:NewTransmission("Thousand.ogg", 0.55, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.Thousand, 0.1) end if tonumber(CLOUDCEIL0100)>0 then self.radioqueue:Number2Transmission(CLOUDCEIL0100) - self.radioqueue:NewTransmission("Hundred.ogg", 0.47, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.Hundred, 0.1) end if self.metric then - self.radioqueue:NewTransmission("Meters.ogg", 0.59, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.Meters, 0.1) else - self.radioqueue:NewTransmission("Feet.ogg", 0.45, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.Feet, 0.1) end end @@ -872,17 +1085,18 @@ function ATIS:onafterBroadcast(From, Event, To) end -- Actual output if wp then - self.radioqueue:NewTransmission("WeatherPhenomena.ogg", 1.07, self.soundpath, nil, 1.0, string.format("Weather phenomena:%s", wpsub), subduration) + subtitle=string.format("Weather phenomena:%s", wpsub) + self:Transmission(ATIS.Sound.WeatherPhenomena, 1.0, subtitle) if precepitation==1 then - self.radioqueue:NewTransmission("Rain.ogg", 0.41, self.soundpath, nil, 0.5) + self:Transmission(ATIS.Sound.Rain, 0.5) elseif precepitation==2 then - self.radioqueue:NewTransmission("ThunderStorm.ogg", 0.81, self.soundpath, nil, 0.5) + self:Transmission(ATIS.Sound.ThunderStorm, 0.5) end if fog then - self.radioqueue:NewTransmission("Fog.ogg", 0.81, self.soundpath, nil, 0.5) + self:Transmission(ATIS.Sound.Fog, 0.5) end if dust then - self.radioqueue:NewTransmission("Dust.ogg", 0.81, self.soundpath, nil, 0.5) + self:Transmission(ATIS.Sound.Dust, 0.5) end end @@ -896,22 +1110,22 @@ function ATIS:onafterBroadcast(From, Event, To) subtitle=string.format("Altimeter QNH %s.%s, QFE %s.%s inHg", QNH[1], QNH[2], QFE[1], QFE[2]) end end - self.radioqueue:NewTransmission("Altimeter.ogg", 0.7, self.soundpath, nil, 1.0, subtitle, subduration) - self.radioqueue:NewTransmission("QNH.ogg", 0.70, self.soundpath, nil, 0.5) + self:Transmission(ATIS.Sound.Altimeter, 1.0, subtitle) + self:Transmission(ATIS.Sound.QNH, 0.5) self.radioqueue:Number2Transmission(QNH[1]) - self.radioqueue:NewTransmission("Decimal.ogg", 0.58, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.Decimal, 0.2) self.radioqueue:Number2Transmission(QNH[2]) - self.radioqueue:NewTransmission("QFE.ogg", 0.62, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.QFE, 0.2) self.radioqueue:Number2Transmission(QFE[1]) - self.radioqueue:NewTransmission("Decimal.ogg", 0.58, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.Decimal, 0.2) self.radioqueue:Number2Transmission(QFE[2]) if self.PmmHg then - self.radioqueue:NewTransmission("MillimetersOfMercury.ogg", 1.53, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.MillimetersOfMercury, 0.1) else if self.metric then - self.radioqueue:NewTransmission("HectoPascal.ogg", 1.15, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.HectoPascal, 0.1) else - self.radioqueue:NewTransmission("InchesOfMercury.ogg", 1.16, self.soundpath, nil, 0.1) + self:Transmission(ATIS.Sound.InchesOfMercury, 0.1) end end @@ -921,12 +1135,12 @@ function ATIS:onafterBroadcast(From, Event, To) else subtitle=string.format("Temperature %s °C", TEMPERATURE) end - self.radioqueue:NewTransmission("Temperature.ogg", 0.55, self.soundpath, nil, 1.0, subtitle, subduration) + self:Transmission(ATIS.Sound.Temperature, 1.0, subtitle) self.radioqueue:Number2Transmission(TEMPERATURE) if self.TDegF then - self.radioqueue:NewTransmission("DegreesFahrenheit.ogg", 1.23, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.DegreesFahrenheit, 0.2) else - self.radioqueue:NewTransmission("DegreesCelsius.ogg", 1.28, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.DegreesCelsius, 0.2) end -- Wind @@ -938,17 +1152,17 @@ function ATIS:onafterBroadcast(From, Event, To) if turbulence>0 then subtitle=subtitle..", gusting" end - self.radioqueue:NewTransmission("WindFrom.ogg", 0.60, self.soundpath, nil, 1.0, subtitle, subduration) + self:Transmission(ATIS.Sound.WindFrom, 1.0, subtitle) self.radioqueue:Number2Transmission(WINDFROM) - self.radioqueue:NewTransmission("At.ogg", 0.40, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.At, 0.2) self.radioqueue:Number2Transmission(WINDSPEED) if self.metric then - self.radioqueue:NewTransmission("MetersPerSecond.ogg", 1.14, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.MetersPerSecond, 0.2) else - self.radioqueue:NewTransmission("Knots.ogg", 0.60, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.Knots, 0.2) end if turbulence>0 then - self.radioqueue:NewTransmission("Gusting.ogg", 0.55, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.Gusting, 0.2) end -- Active runway. @@ -958,14 +1172,17 @@ function ATIS:onafterBroadcast(From, Event, To) elseif rright then subtitle=subtitle.." Right" end - self.radioqueue:NewTransmission("ActiveRunway.ogg", 1.05, self.soundpath, nil, 1.0, subtitle, subduration) + self:Transmission(ATIS.Sound.Knots, 1.0, subtitle) self.radioqueue:Number2Transmission(runway) if rleft then - self.radioqueue:NewTransmission("Left.ogg", 0.53, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.Left, 0.2) elseif rright then + self:Transmission(ATIS.Sound.Right, 0.2) self.radioqueue:NewTransmission("Right.ogg", 0.43, self.soundpath, nil, 0.2) end + --TODO: runway length + -- Tower frequency. if self.towerfrequency then local freqs="" @@ -975,23 +1192,141 @@ function ATIS:onafterBroadcast(From, Event, To) freqs=freqs..", " end end - self.radioqueue:NewTransmission("TowerFrequency.ogg", 1.19, self.soundpath, nil, 1.0, string.format("Tower frequency %s", freqs), subduration) + subtitle=string.format("Tower frequency %s", freqs) + self:Transmission(ATIS.Sound.TowerFrequency, 1.0, subtitle) for _,freq in pairs(self.towerfrequency) do local f=string.format("%.3f", freq) 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:Transmission(ATIS.Sound.Decimal, 0.2) self.radioqueue:Number2Transmission(f[2]) - self.radioqueue:NewTransmission("MegaHertz.ogg", 0.86, self.soundpath, nil, 0.2) + self:Transmission(ATIS.Sound.MegaHertz, 0.2) end end + -- ILS + local ils=self:GetNavPoint(self.ils, runway) + if ils then + subtitle=string.format("ILS frequency %.2f", ils.frequency) + self:Transmission(ATIS.Sound.ILSFrequency, 1.0, subtitle) + local f=string.format("%.2f", vor.frequency) + f=UTILS.Split(f, ".") + self.radioqueue:Number2Transmission(f[1], nil, 0.5) + self:Transmission(ATIS.Sound.Decimal, 0.2) + self.radioqueue:Number2Transmission(f[2]) + end + + -- Outer NDB + local ndb=self:GetNavPoint(self.ndbouter, runway) + if ndb then + subtitle=string.format("Outer NDB frequency %.2f", ndb.frequency) + self:Transmission(ATIS.Sound.OuterNDBFrequency, 1.0, subtitle) + local f=string.format("%.2f", ndb.frequency) + f=UTILS.Split(f, ".") + self.radioqueue:Number2Transmission(f[1], nil, 0.5) + self:Transmission(ATIS.Sound.Decimal, 0.2) + self.radioqueue:Number2Transmission(f[2]) + end + + -- Inner NDB + local ndb=self:GetNavPoint(self.ndbinner, runway) + if ndb then + subtitle=string.format("Inner NDB frequency %.2f", ndb.frequency) + self:Transmission(ATIS.Sound.InnerNDBFrequency, 1.0, subtitle) + local f=string.format("%.2f", ndb.frequency) + f=UTILS.Split(f, ".") + self.radioqueue:Number2Transmission(f[1], nil, 0.5) + self:Transmission(ATIS.Sound.Decimal, 0.2) + self.radioqueue:Number2Transmission(f[2]) + end + + -- VOR + if self.vor then + subtitle=string.format("VOR frequency %.2f", self.vor) + self:Transmission(ATIS.Sound.VORFrequency, 1.0, subtitle) + local f=string.format("%.2f", self.vor) + f=UTILS.Split(f, ".") + self.radioqueue:Number2Transmission(f[1], nil, 0.5) + self:Transmission(ATIS.Sound.Decimal, 0.2) + self.radioqueue:Number2Transmission(f[2]) + end + + -- TACAN + if self.tacan then + subtitle=string.format("TACAN channel %dX", self.tacan) + self:Transmission(ATIS.Sound.TACANChannel, 1.0, subtitle) + self.radioqueue:Number2Transmission(self.tacan, nil, 0.2) + self.radioqueue:NewTransmission(string.format("NATO Alphabet/Xray.ogg", NATO), 0.75, self.soundpath) + end + + -- RSBN + if self.prmg then + subtitle=string.format("RSBN channel %d", self.rsbn) + self:Transmission(ATIS.Sound.RSBNChannel, 1.0, subtitle) + self.radioqueue:Number2Transmission(self.rsbn, nil, 0.2) + end + + -- PRMG + local ndb=self:GetNavPoint(self.prmg, runway) + if ndb then + subtitle=string.format("PRMG %d", ndb.frequency) + self:Transmission(ATIS.Sound.PRGMChannel, 1.0, subtitle) + local f=string.format("%.2f", vor.frequency) + f=UTILS.Split(f, ".") + self.radioqueue:Number2Transmission(f[1], nil, 0.5) + self:Transmission(ATIS.Sound.Decimal, 0.2) + self.radioqueue:Number2Transmission(f[2]) + end + end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Misc Functions ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--- Get Nav point data. +-- @param #ATIS self +-- @param #table navpoints Nav points data table. +-- @param #string runway (Active) runway, e.g. "31" +-- @return #ATIS.NavPoint Nav point data table. +function ATIS:GetNavPoint(navpoints, runway) + for _,_nav in pairs(navpoints or {}) do + local nav=_nav --#ATIS.NavPoint + if nav.runway==nil or nav.runway==runway then + return nav + end + end + return nil +end + + +--- Transmission via RADIOQUEUE. +-- @param #ATIS self +-- @param #string runway Runway, e.g. "31" +-- @return #ATIS.NavPoint Nav point data table. +function ATIS:GetVOR(runway) + + for _,_vor in pairs(self.vor or {}) do + local vor=_vor --#ATIS.NavPoint + if vor.runway==nil or vor.runway==runway then + return vor + end + end + return nil +end + + +--- Transmission via RADIOQUEUE. +-- @param #ATIS self +-- @param #ATIS.Soundfile sound ATIS sound object. +-- @param #number interval Interval in seconds after the last transmission finished. +-- @param #string subtitle Subtitle of the transmission. +-- @param #string path Path to sound file. Default self.soundpath. +function ATIS:Transmission(sound, interval, subtitle, path) + self.radioqueue:NewTransmission(sound.filename, sound.duration, path or self.soundpath, nil, interval, subtitle, self.subduration) +end + + --- Get weather of this mission from env.mission.weather variable. -- @param #ATIS self -- @return #table Clouds table which has entries "thickness", "density", "base", "iprecptns".