diff --git a/Moose Development/Moose/Modules.lua b/Moose Development/Moose/Modules.lua index 0c7dbef2a..814d454a2 100644 --- a/Moose Development/Moose/Modules.lua +++ b/Moose Development/Moose/Modules.lua @@ -115,8 +115,8 @@ __Moose.Include( 'Scripts/Moose/Ops/RescueHelo.lua' ) __Moose.Include( 'Scripts/Moose/Ops/Squadron.lua' ) __Moose.Include( 'Scripts/Moose/Ops/Target.lua' ) -__Moose.Include( 'Scripts/Moose/Navigation/Navaid.lua' ) -__Moose.Include( 'Scripts/Moose/Navigation/NavFix.lua' ) +__Moose.Include( 'Scripts/Moose/Navigation/Point.lua' ) +__Moose.Include( 'Scripts/Moose/Navigation/Procedure.lua' ) __Moose.Include( 'Scripts/Moose/Navigation/FlightPlan.lua' ) __Moose.Include( 'Scripts/Moose/AI/AI_Balancer.lua' ) diff --git a/Moose Development/Moose/Navigation/FlightPlan.lua b/Moose Development/Moose/Navigation/FlightPlan.lua index 2d83e41cc..f927d11f2 100644 --- a/Moose Development/Moose/Navigation/FlightPlan.lua +++ b/Moose Development/Moose/Navigation/FlightPlan.lua @@ -65,9 +65,9 @@ FLIGHTPLAN = { -- @field #string IFRL Instrument Flying Rules Low Altitude. -- @field #string VFR Visual Flight Rules. FLIGHTPLAN.Type={ - IFRH="IFR Heigh", - IFRL="IFR Low", - VFR="VFR", + IFRH = "IFR High", + IFRL = "IFR Low", + VFR = "VFR", } @@ -201,10 +201,7 @@ end -- Private Functions ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - - - +-- No private functions yet. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/Moose Development/Moose/Navigation/NavFix.lua b/Moose Development/Moose/Navigation/NavFix.lua deleted file mode 100644 index 88d479447..000000000 --- a/Moose Development/Moose/Navigation/NavFix.lua +++ /dev/null @@ -1,241 +0,0 @@ ---- **NAVIGATION** - Navigation Airspace Fix. --- --- **Main Features:** --- --- * Stuff --- * More Stuff --- --- === --- --- ## Example Missions: --- --- Demo missions can be found on [github](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/develop/Navigation%20-%20NavFix). --- --- === --- --- ### Author: **funkyfranky** --- --- === --- @module Navigation.NavFix --- @image NAVIGATION_NavFix.png - - ---- NAVFIX class. --- @type NAVFIX --- @field #string ClassName Name of the class. --- @field #number verbose Verbosity of output. --- @field #string name Name of the fix. --- @field Core.Point#COORDINATE coordinate Coordinate of the fix. --- @field Wrapper.Marker#MARKER marker Marker of fix on F10 map. --- @field #boolean isCompulsory Is this a compulsory fix. --- @field #boolean isFlyover Is this a fly over fix. --- @field #boolean isIAF Is initial approach fix (IAF). --- @field #boolean isIF Is intermediate fix (IF). --- --- @extends Core.Base#BASE - ---- *A fleet of British ships at war are the best negotiators.* -- Horatio Nelson --- --- === --- --- # The NAVFIX Concept --- --- The NAVFIX class has a great concept! --- --- # Basic Setup --- --- A new `NAVFIX` object can be created with the @{#NAVFIX.New}() function. --- --- myTemplate=NAVFIX:New() --- myTemplate:SetXYZ(X, Y, Z) --- --- This is how it works. --- --- @field #NAVFIX -NAVFIX = { - ClassName = "NAVFIX", - verbose = 0, -} - ---- Type of navaid --- @type NAVFIX.Type --- @field #string VOR VOR --- @field #string NDB NDB -NAVFIX.Type={ - VOR="VOR", - NDB="NDB", -} - ---- NAVFIX class version. --- @field #string version -NAVFIX.version="0.0.1" - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- ToDo list -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - --- TODO: A lot... - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- Constructor -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ---- Create a new NAVFIX class instance. --- @param #NAVFIX self --- @param #string Name Name of the fix. Should be unique! --- @param Core.Point#COORDINATE Coordinate of the fix. --- @return #NAVFIX self -function NAVFIX:NewFromCoordinate(Name, Coordinate) - - -- Inherit everything from SCENERY class. - self=BASE:Inherit(self, BASE:New()) -- #NAVFIX - - self.coordinate=Coordinate - - self.name=Name - - self.marker=MARKER:New(Coordinate, self:_GetMarkerText()) - self.marker:ToAll() - - return self -end - ---- Create a new NAVFIX class instance from a given NavAid. --- @param #NAVFIX self --- @param #string Name Name of the fix. Should be unique! --- @param Navigation.NavFix#NAVFIX NavFix The navigation fix. --- @param #number Distance Distance in nautical miles. --- @param #number Bearing Bearing from the given NavFix to the newly created one. --- @param #boolean Reciprocal If `true` the reciprocal `Bearing` is taken so it specifies the direction from the new navfix to the given one. --- @return #NAVFIX self -function NAVFIX:NewFromNavFix(Name, NavFix, Distance, Bearing, Reciprocal) - - local coord=NavFix.coordinate - - local Angle=Bearing-90 - - local coord=NavFix.coordinate:Translate(UTILS.NMToMeters(Distance), Angle) - - local self=NAVFIX:NewFromCoordinate(coord, Name) - - - return self -end - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- User Functions -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ---- Set minimum altitude. --- @param #NAVFIX self --- @param #number Altitude Min altitude in feet. --- @return #NAVFIX self -function NAVFIX:SetAltMin(Altitude) - - self.altMin=Altitude - - return self -end - ---- Set maximum altitude. --- @param #NAVFIX self --- @param #number Altitude Max altitude in feet. --- @return #NAVFIX self -function NAVFIX:SetAltMax(Altitude) - - self.altMax=Altitude - - return self -end - ---- Set whether this fix is compulsory. --- @param #NAVFIX self --- @param #boolean Compulsory If `true`, this is a compusory fix. If `false` or nil, it is non-compulsory. --- @return #NAVFIX self -function NAVFIX:SetCompulsory(Compulsory) - self.isCompulsory=Compulsory - return self -end - ---- Set whether this is a fly-over fix fix. --- @param #NAVFIX self --- @param #boolean FlyOver If `true`, this is a fly over fix. If `false` or nil, it is not. --- @return #NAVFIX self -function NAVFIX:SetFlyOver(FlyOver) - self.isFlyover=FlyOver - return self -end - ---- Set whether this is the intermediate fix (IF). --- @param #NAVFIX self --- @param #boolean IntermediateFix If `true`, this is an intermediate fix. --- @return #NAVFIX self -function NAVFIX:SetIntermediateFix(IntermediateFix) - self.isIF=IntermediateFix - return self -end - ---- Set whether this is an initial approach fix (IAF). --- The IAF is the point where the initial approach segment of an instrument approach begins. --- It is usually a designated intersection, VHF omidirectional range (VOR) non-directional beacon (NDB) --- or distance measuring equipment (DME) fix. --- The IAF may be collocated with the intermediate fix (IF) of the instrument apprach an in such case they designate the --- beginning of the intermediate segment of the approach. When the IAF and the IF are combined, there is no inital approach segment. --- @param #NAVFIX self --- @param #boolean IntermediateFix If `true`, this is an intermediate fix. --- @return #NAVFIX self -function NAVFIX:SetInitialApproachFix(IntermediateFix) - self.isIAF=IntermediateFix - return self -end - ---- Get the altitude in feet MSL. --- @param #NAVFIX self --- @return #number Altitude in feet MSL. Can be `nil`, if neither min nor max altitudes have beeen set. -function NAVFIX:GetAltitude() - - local alt=nil - if self.altMin and self.altMax then - alt=math.random(self.altMin, self.altMax) - elseif self.altMin then - alt=self.altMin - elseif self.altMax then - alt=self.altMax - end - - return alt -end - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- Private Functions -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ---- Get text displayed in the F10 marker. --- @param #NAVFIX self --- @return #string Marker text. -function NAVFIX:_GetMarkerText() - - local altmin=self.altMin and tostring(self.altMin) or "" - local altmax=self.altMax and tostring(self.altMax) or "" - local speedmin=self.speedMin and tostring(self.speedMin) or "" - local speedmax=self.speedMax and tostring(self.speedMax) or "" - - - local text=string.format("NAVFIX %s", self.name) - if self.isIAF then - text=text..string.format(" (IAF)") - end - if self.isIF then - text=text..string.format(" (IF)") - end - text=text..string.format("\nAltitude: %s - %s", altmin, altmax) - text=text..string.format("\nSpeed: %s - %s", speedmin, speedmax) - text=text..string.format("\nCompulsory: %s", tostring(self.isCompulsory)) - text=text..string.format("\nFly Over: %s", tostring(self.isFlyover)) - - return text -end - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/Moose Development/Moose/Navigation/Navaid.lua b/Moose Development/Moose/Navigation/Navaid.lua deleted file mode 100644 index c5947b51f..000000000 --- a/Moose Development/Moose/Navigation/Navaid.lua +++ /dev/null @@ -1,177 +0,0 @@ ---- **Navigation** - Navigation aid. --- --- **Main Features:** --- --- * Manage navigation aids --- * VOR, NDB --- --- === --- --- ## Example Missions: --- --- Demo missions can be found on [github](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/develop/Navigation%20-%20Navaid). --- --- === --- --- ### Author: **funkyfranky** --- --- === --- @module Navigation.Navaid --- @image Navigation_Navaid.png - - ---- NAVAID class. --- @type NAVAID --- @field #string ClassName Name of the class. --- @field #number verbose Verbosity of output. --- @extends Core.Base#BASE - ---- *A fleet of British ships at war are the best negotiators.* -- Horatio Nelson --- --- === --- --- # The NAVAID Concept --- --- A NAVAID consists of one or multiple FLOTILLAs. These flotillas "live" in a WAREHOUSE that has a phyiscal struction (STATIC or UNIT) and can be captured or destroyed. --- --- # Basic Setup --- --- A new `NAVAID` object can be created with the @{#NAVAID.New}(`WarehouseName`, `FleetName`) function, where `WarehouseName` is the name of the static or unit object hosting the fleet --- and `FleetName` is the name you want to give the fleet. This must be *unique*! --- --- myFleet=NAVAID:New("myWarehouseName", "1st Fleet") --- myFleet:SetPortZone(ZonePort1stFleet) --- myFleet:Start() --- --- A fleet needs a *port zone*, which is set via the @{#NAVAID.SetPortZone}(`PortZone`) function. This is the zone where the naval assets are spawned and return to. --- --- Finally, the fleet needs to be started using the @{#NAVAID.Start}() function. If the fleet is not started, it will not process any requests. --- --- @field #NAVAID -NAVAID = { - ClassName = "NAVAID", - verbose = 0, -} - ---- Type of navaid --- @type NAVAID.Type --- @field #string VOR VOR --- @field #string NDB NDB -NAVAID.Type={ - VOR="VOR", - NDB="NDB", - DME="DME", - TACAN="TACAN", - LOC="Loc" - -} - ---- NAVAID class version. --- @field #string version -NAVAID.version="0.0.1" - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- ToDo list -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - --- TODO: Add frequencies. Which unit MHz, kHz, Hz? --- TODO: Add radial function - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- Constructor -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ---- Create a new NAVAID class instance. --- @param #NAVAID self --- @param #string ZoneName Name of the zone to scan the scenery. --- @param #string SceneryName Name of the scenery object. --- @param #string Type Type of Navaid. --- @return #NAVAID self -function NAVAID:New(ZoneName, SceneryName, Type) - - -- Inherit everything from BASE class. - self=BASE:Inherit(self, BASE:New()) -- #NAVAID - - - self.zone=ZONE:FindByName(ZoneName) - - self.coordinate=self.zone:GetCoordinate() - - if SceneryName then - self.scenery=SCENERY:FindByNameInZone(SceneryName, ZoneName) - if not self.scenery then - self:E("ERROR: Could not find scenery object %s in zone %s", SceneryName, ZoneName) - end - end - - self.alias=string.format("%s %s %s", tostring(ZoneName), tostring(SceneryName), tostring(Type)) - - - -- Set some string id for output to DCS.log file. - self.lid=string.format("NAVAID %s | ", self.alias) - - self:I(self.lid..string.format("Created NAVAID!")) - - return self -end - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- User Functions -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ---- Set frequency. --- @param #NAVAID self --- @param #number Frequency Frequency in Hz. --- @return #NAVAID self -function NAVAID:SetFrequency(Frequency) - - self.frequency=Frequency - - return self -end - ---- Set channel. --- @param #NAVAID self --- @param #number Channel --- @param #string Band --- @return #NAVAID self -function NAVAID:SetChannel(Channel, Band) - - self.channel=Channel - self.band=Band - - return self -end - ---- Add marker the NAVAID on the F10 map. --- @param #NAVAID self --- @return #NAVAID self -function NAVAID:AddMarker() - - local text=string.format("I am a NAVAID!") - - self.markID=self.coordinate:MarkToAll(text, true) - - return self -end - ---- Remove marker of the NAVAID from the F10 map. --- @param #NAVAID self --- @return #NAVAID self -function NAVAID:DelMarker() - - if self.markID then - UTILS.RemoveMark(self.markID) - end - - return self -end - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- Private Functions -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/Moose Development/Moose/Navigation/Point.lua b/Moose Development/Moose/Navigation/Point.lua new file mode 100644 index 000000000..b8d65c26e --- /dev/null +++ b/Moose Development/Moose/Navigation/Point.lua @@ -0,0 +1,533 @@ +--- **NAVIGATION** - Navigation Airspace Points, Fixes and Aids. +-- +-- **Main Features:** +-- +-- * Stuff +-- * More Stuff +-- +-- === +-- +-- ## Example Missions: +-- +-- Demo missions can be found on [github](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/develop/Navigation%20-%20NavFix). +-- +-- === +-- +-- ### Author: **funkyfranky** +-- +-- === +-- @module Navigation.Point +-- @image NAVIGATION_Point.png + + +--- NAVAID class. +-- @type NAVAID +-- @field #string ClassName Name of the class. +-- @field #number verbose Verbosity of output. +-- @extends Core.Base#BASE + +--- *A fleet of British ships at war are the best negotiators.* -- Horatio Nelson +-- +-- === +-- +-- # The NAVAID Concept +-- +-- A NAVAID consists of one or multiple FLOTILLAs. These flotillas "live" in a WAREHOUSE that has a phyiscal struction (STATIC or UNIT) and can be captured or destroyed. +-- +-- # Basic Setup +-- +-- A new `NAVAID` object can be created with the @{#NAVAID.New}(`WarehouseName`, `FleetName`) function, where `WarehouseName` is the name of the static or unit object hosting the fleet +-- and `FleetName` is the name you want to give the fleet. This must be *unique*! +-- +-- myFleet=NAVAID:New("myWarehouseName", "1st Fleet") +-- myFleet:SetPortZone(ZonePort1stFleet) +-- myFleet:Start() +-- +-- A fleet needs a *port zone*, which is set via the @{#NAVAID.SetPortZone}(`PortZone`) function. This is the zone where the naval assets are spawned and return to. +-- +-- Finally, the fleet needs to be started using the @{#NAVAID.Start}() function. If the fleet is not started, it will not process any requests. +-- +-- @field #NAVAID +NAVAID = { + ClassName = "NAVAID", + verbose = 0, +} + +--- Type of navaid +-- @type NAVAID.Type +-- @field #string VOR Very High Frequency Omnirange Station (VOR). +-- @field #string NDB Non-Directional Beacon (NDB). +-- @field #string DME Distance Measuring Equipment (DME). +-- @field #string TACAN TACtical Air Navigation System (TACAN). +-- @field #string LOC LOCalizer for horizontal guidance (LOC). +NAVAID.Type={ + VOR="VOR", + NDB="NDB", + DME="DME", + TACAN="TACAN", + LOC="Localizer" +} + +--- NAVAID class version. +-- @field #string version +NAVAID.version="0.0.1" + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- ToDo list +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +-- TODO: Add frequencies. Which unit MHz, kHz, Hz? +-- TODO: Add radial function + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Constructor +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- Create a new NAVAID class instance. +-- @param #NAVAID self +-- @param #string ZoneName Name of the zone to scan the scenery. +-- @param #string SceneryName Name of the scenery object. +-- @param #string Type Type of Navaid. +-- @return #NAVAID self +function NAVAID:New(ZoneName, SceneryName, Type) + + -- Inherit everything from BASE class. + self=BASE:Inherit(self, BASE:New()) -- #NAVAID + + + self.zone=ZONE:FindByName(ZoneName) + + self.coordinate=self.zone:GetCoordinate() + + if SceneryName then + self.scenery=SCENERY:FindByNameInZone(SceneryName, ZoneName) + if not self.scenery then + self:E("ERROR: Could not find scenery object %s in zone %s", SceneryName, ZoneName) + end + end + + self.alias=string.format("%s %s %s", tostring(ZoneName), tostring(SceneryName), tostring(Type)) + + + -- Set some string id for output to DCS.log file. + self.lid=string.format("NAVAID %s | ", self.alias) + + self:I(self.lid..string.format("Created NAVAID!")) + + return self +end + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- User Functions +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- Set frequency. +-- @param #NAVAID self +-- @param #number Frequency Frequency in Hz. +-- @return #NAVAID self +function NAVAID:SetFrequency(Frequency) + + self.frequency=Frequency + + return self +end + +--- Set channel. +-- @param #NAVAID self +-- @param #number Channel +-- @param #string Band +-- @return #NAVAID self +function NAVAID:SetChannel(Channel, Band) + + self.channel=Channel + self.band=Band + + return self +end + +--- Add marker the NAVAID on the F10 map. +-- @param #NAVAID self +-- @return #NAVAID self +function NAVAID:AddMarker() + + local text=string.format("I am a NAVAID!") + + self.markID=self.coordinate:MarkToAll(text, true) + + return self +end + +--- Remove marker of the NAVAID from the F10 map. +-- @param #NAVAID self +-- @return #NAVAID self +function NAVAID:DelMarker() + + if self.markID then + UTILS.RemoveMark(self.markID) + end + + return self +end + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Private Functions +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +--- NAVFIX class. +-- @type NAVFIX +-- @field #string ClassName Name of the class. +-- @field #boolean isIAF Is initial approach fix (IAF). +-- @field #boolean isIF Is intermediate fix (IF). +-- @field #boolean isFAF Is final approach fix (FAF). +-- @field #boolean isMAF Is missed approach fix (MAF). +-- +-- @extends Navigation.Point#NAVPOINT + +--- *A fleet of British ships at war are the best negotiators.* -- Horatio Nelson +-- +-- === +-- +-- # The NAVFIX Concept +-- +-- The NAVFIX class has a great concept! +-- +-- # Basic Setup +-- +-- A new `NAVFIX` object can be created with the @{#NAVFIX.New}() function. +-- +-- myTemplate=NAVFIX:New() +-- myTemplate:SetXYZ(X, Y, Z) +-- +-- This is how it works. +-- +-- @field #NAVFIX +NAVFIX = { + ClassName = "NAVFIX", + verbose = 0, +} + +--- Type of navaid +-- @type NAVFIX.Type +-- @field #string VOR VOR +-- @field #string NDB NDB +NAVFIX.Type={ + VOR="VOR", + NDB="NDB", +} + +--- NAVFIX class version. +-- @field #string version +NAVFIX.version="0.0.1" + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- ToDo list +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +-- TODO: A lot... + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Constructor +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- Create a new NAVFIX class instance. +-- @param #NAVFIX self +-- @param #string Name Name of the fix. Should be unique! +-- @param Core.Point#COORDINATE Coordinate of the fix. +-- @return #NAVFIX self +function NAVFIX:NewFromCoordinate(Name, Coordinate) + + -- Inherit everything from SCENERY class. + self=BASE:Inherit(self, BASE:New()) -- #NAVFIX + + self.coordinate=Coordinate + + self.name=Name + + self.marker=MARKER:New(Coordinate, self:_GetMarkerText()) + self.marker:ToAll() + + return self +end + +--- Create a new NAVFIX class instance from a given NavAid. +-- @param #NAVFIX self +-- @param #string Name Name of the fix. Should be unique! +-- @param Navigation.NavFix#NAVFIX NavFix The navigation fix. +-- @param #number Distance Distance in nautical miles. +-- @param #number Bearing Bearing from the given NavFix to the newly created one. +-- @param #boolean Reciprocal If `true` the reciprocal `Bearing` is taken so it specifies the direction from the new navfix to the given one. +-- @return #NAVFIX self +function NAVFIX:NewFromNavFix(Name, NavFix, Distance, Bearing, Reciprocal) + + local coord=NavFix.coordinate + + local Angle=Bearing-90 + + local coord=NavFix.coordinate:Translate(UTILS.NMToMeters(Distance), Angle) + + local self=NAVFIX:NewFromCoordinate(coord, Name) + + + return self +end + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- User Functions +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- Set minimum altitude. +-- @param #NAVFIX self +-- @param #number Altitude Min altitude in feet. +-- @return #NAVFIX self +function NAVFIX:SetAltMin(Altitude) + + self.altMin=Altitude + + return self +end + +--- Set maximum altitude. +-- @param #NAVFIX self +-- @param #number Altitude Max altitude in feet. +-- @return #NAVFIX self +function NAVFIX:SetAltMax(Altitude) + + self.altMax=Altitude + + return self +end + + +--- Set mandatory altitude (min alt = max alt). +-- @param #NAVFIX self +-- @param #number Altitude Altitude in feet. +-- @return #NAVFIX self +function NAVFIX:SetAltMandatory(Altitude) + + self.altMin=Altitude + self.altMax=Altitude + + return self +end + +--- Set whether this fix is compulsory. +-- @param #NAVFIX self +-- @param #boolean Compulsory If `true`, this is a compusory fix. If `false` or nil, it is non-compulsory. +-- @return #NAVFIX self +function NAVFIX:SetCompulsory(Compulsory) + self.isCompulsory=Compulsory + return self +end + +--- Set whether this is a fly-over fix fix. +-- @param #NAVFIX self +-- @param #boolean FlyOver If `true`, this is a fly over fix. If `false` or nil, it is not. +-- @return #NAVFIX self +function NAVFIX:SetFlyOver(FlyOver) + self.isFlyover=FlyOver + return self +end + +--- Set whether this is the intermediate fix (IF). +-- @param #NAVFIX self +-- @param #boolean IntermediateFix If `true`, this is an intermediate fix. +-- @return #NAVFIX self +function NAVFIX:SetIntermediateFix(IntermediateFix) + self.isIF=IntermediateFix + return self +end + +--- Set whether this is an initial approach fix (IAF). +-- The IAF is the point where the initial approach segment of an instrument approach begins. +-- It is usually a designated intersection, VHF omidirectional range (VOR) non-directional beacon (NDB) +-- or distance measuring equipment (DME) fix. +-- The IAF may be collocated with the intermediate fix (IF) of the instrument apprach an in such case they designate the +-- beginning of the intermediate segment of the approach. When the IAF and the IF are combined, there is no inital approach segment. +-- @param #NAVFIX self +-- @param #boolean IntermediateFix If `true`, this is an intermediate fix. +-- @return #NAVFIX self +function NAVFIX:SetInitialApproachFix(IntermediateFix) + self.isIAF=IntermediateFix + return self +end + + +--- Set whether this is the final approach fix (FAF). +-- @param #NAVFIX self +-- @param #boolean FinalApproachFix If `true`, this is a final approach fix. +-- @return #NAVFIX self +function NAVFIX:SetFinalApproachFix(FinalApproachFix) + self.isFAF=FinalApproachFix + return self +end + +--- Set whether this is the final approach fix (FAF). +-- @param #NAVFIX self +-- @param #boolean FinalApproachFix If `true`, this is a final approach fix. +-- @return #NAVFIX self +function NAVFIX:SetMissedApproachFix(MissedApproachFix) + self.isMAF=MissedApproachFix + return self +end + + +--- Get the altitude in feet MSL. +-- @param #NAVFIX self +-- @return #number Altitude in feet MSL. Can be `nil`, if neither min nor max altitudes have beeen set. +function NAVFIX:GetAltitude() + + local alt=nil + if self.altMin and self.altMax then + alt=math.random(self.altMin, self.altMax) + elseif self.altMin then + alt=self.altMin + elseif self.altMax then + alt=self.altMax + end + + return alt +end + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Private Functions +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- Get text displayed in the F10 marker. +-- @param #NAVFIX self +-- @return #string Marker text. +function NAVFIX:_GetMarkerText() + + local altmin=self.altMin and tostring(self.altMin) or "" + local altmax=self.altMax and tostring(self.altMax) or "" + local speedmin=self.speedMin and tostring(self.speedMin) or "" + local speedmax=self.speedMax and tostring(self.speedMax) or "" + + + local text=string.format("NAVFIX %s", self.name) + if self.isIAF then + text=text..string.format(" (IAF)") + end + if self.isIF then + text=text..string.format(" (IF)") + end + text=text..string.format("\nAltitude: %s - %s", altmin, altmax) + text=text..string.format("\nSpeed: %s - %s", speedmin, speedmax) + text=text..string.format("\nCompulsory: %s", tostring(self.isCompulsory)) + text=text..string.format("\nFly Over: %s", tostring(self.isFlyover)) + + return text +end + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- NAVPOINT class. +-- @type NAVPOINT +-- +-- @field #string ClassName Name of the class. +-- @field #number verbose Verbosity of output. +-- @field #string name Name of the point. +-- @field Core.Point#COORDINATE coordinate Coordinate of the fix. +-- @field Wrapper.Marker#MARKER marker Marker on F10 map. +-- @field #boolean isCompulsory Is this a compulsory fix. +-- +-- @extends Core.Base#BASE + +--- *A fleet of British ships at war are the best negotiators.* -- Horatio Nelson +-- +-- === +-- +-- # The NAVFIX Concept +-- +-- The NAVFIX class has a great concept! +-- +-- # Basic Setup +-- +-- A new `NAVFIX` object can be created with the @{#NAVFIX.New}() function. +-- +-- myNavPoint=NAVPOINT:New() +-- myTemplate:SetXYZ(X, Y, Z) +-- +-- This is how it works. +-- +-- @field #NAVPOINT +NAVPOINT = { + ClassName = "NAVPOINT", + verbose = 0, +} + +--- NAVPOINT class version. +-- @field #string version +NAVPOINT.version="0.0.1" + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- ToDo list +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +-- TODO: A lot... + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Constructor(s) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- Create a new NAVPOINT class instance from a given COORDINATE. +-- @param #NAVPOINT self +-- @param #string Name Name of the fix. Should be unique! +-- @param Core.Point#COORDINATE Coordinate of the fix. +-- @return #NAVPOINT self +function NAVPOINT:NewFromCoordinate(Name, Coordinate) + + -- Inherit everything from SCENERY class. + self=BASE:Inherit(self, BASE:New()) -- #NAVFIX + + self.coordinate=Coordinate + + self.name=Name + + --self.marker=MARKER:New(Coordinate, self:_GetMarkerText()) + --self.marker:ToAll() + + return self +end + +--- Create a new NAVPOINT class instance from a given NAVPOINT. +-- @param #NAVFIX self +-- @param #string Name Name of the fix. Should be unique! +-- @param Navigation.Point#NAVPOINT NavPoint The navigation fix. +-- @param #number Distance Distance in nautical miles. +-- @param #number Bearing Bearing from the given NavFix to the newly created one. +-- @param #boolean Reciprocal If `true` the reciprocal `Bearing` is taken so it specifies the direction from the new navfix to the given one. +-- @return #NAVFIX self +function NAVPOINT:NewFromNavPoint(Name, NavPoint, Distance, Bearing, Reciprocal) + + local Angle=Bearing + + local coord=NavPoint.coordinate:Translate(UTILS.NMToMeters(Distance), Angle) + + local self=NavPoint:NewFromCoordinate(Name, coord) + + return self +end + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- User Functions +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +-- No user functions yet. + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Private Functions +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +-- No private functions yet. + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/Moose Development/Moose/Navigation/NavApp.lua b/Moose Development/Moose/Navigation/Procedure.lua similarity index 79% rename from Moose Development/Moose/Navigation/NavApp.lua rename to Moose Development/Moose/Navigation/Procedure.lua index 81da98f3e..13fbe6e05 100644 --- a/Moose Development/Moose/Navigation/NavApp.lua +++ b/Moose Development/Moose/Navigation/Procedure.lua @@ -1,4 +1,4 @@ ---- **NAVIGATION** - Template. +--- **NAVIGATION** - Prodedures for Departure (SID), Arrival (STAR) and Approach. -- -- **Main Features:** -- @@ -16,34 +16,32 @@ -- ### Author: **funkyfranky** -- -- === --- @module Navigation.Template --- @image NAVIGATION_Template.png +-- @module Navigation.Procedure +-- @image NAVIGATION_Procedure.png ---- NAVAPP class. --- @type NAVAPP +--- APPROACH class. +-- @type APPROACH -- @field #string ClassName Name of the class. -- @field #number verbose Verbosity of output. -- @field #string apptype Approach type (ILS, VOR, LOC). -- @field Wrapper.Airbase#AIRBASE airbase Airbase of this approach. -- @field Wrapper.Airbase#AIRBASE.Runway runway Runway of this approach. -- @field #number wpcounter Running number counting the waypoints to generate its UID. --- @list <#NAVAPP.Waypoint> path Path of approach consisting of waypoints. +-- @list <#APPROACH.Waypoint> path Path of approach consisting of waypoints. -- @extends Core.Base#BASE --- *A fleet of British ships at war are the best negotiators.* -- Horatio Nelson -- -- === -- --- # The NAVAPP Concept --- --- The NAVAPP class has a great concept! +-- # The APPROACH Concept -- --- A typical approach has (up to) three segments. It starts with the initial approach segment, followed by the intermediate approach segment, followed --- by the final approach segment. +-- A typical approach has (up to) four segments. It starts with the initial approach segment, followed by the intermediate approach segment, followed +-- by the final approach segment. In case something goes wrong during the final approach, the missed approach segment kicks in. -- -- The initial approach segment starts at the initial approach fix (IAF). The segment can contain multiple other fixes, that need to be passed. --- An approach procedure can have more than one segment and IAF. +-- Note, that an approach procedure can have more than one intitial approach segment and IAF. -- -- The intermediate approach segment starts at the intermediate fix (IF). The intermediate approach segment blends the initial approach segment into the final approach segment. -- It is the segment in which aircraft configuration, speed, and positioning adjustments are made for entry into the final approach segment. @@ -54,37 +52,37 @@ -- -- # Basic Setup -- --- A new `NAVAPP` object can be created with the @{#NAVAPP.New}() function. +-- A new `APPROACH` object can be created with the @{#APPROACH.New}() function. -- --- myTemplate=NAVAPP:New() +-- myTemplate=APPROACH:New() -- myTemplate:SetXYZ(X, Y, Z) -- -- This is how it works. -- --- @field #NAVAPP -NAVAPP = { - ClassName = "NAVAPP", +-- @field #APPROACH +APPROACH = { + ClassName = "APPROACH", verbose = 0, wpcounter = 0, } --- Type of approach. --- @type NAVAPP.Type +-- @type APPROACH.Type -- @field #string VOR VOR -- @field #string NDB NDB -NAVAPP.Type={ +APPROACH.Type={ VOR="VOR", ILS="ILS", } --- Setments of approach. --- @type NAVAPP.Segment +-- @type APPROACH.Segment -- @field #string INITIAL Initial approach segment. -- @field #string INTERMEDIATE Intermediate approach segment. -- @field #string FINAL Final approach segment. -- @field #string MISSED Missed approach segment. -NAVAPP.Segment={ +APPROACH.Segment={ INITIAL="Initial", INTERMEDIATE="Intermediate", FINAL="Final", @@ -92,14 +90,14 @@ NAVAPP.Segment={ } --- Waypoint of the approach. --- @type NAVAPP.Waypoint +-- @type APPROACH.Waypoint -- @field #number uid Unique ID of the point. -- @field #string segment The segment this point belongs to. -- @field Navigation.NavFix#NAVFIX navfix The navigation fix that determines the coordinates of this point. ---- NAVAPP class version. +--- APPROACH class version. -- @field #string version -NAVAPP.version="0.0.1" +APPROACH.version="0.0.1" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- ToDo list @@ -112,16 +110,16 @@ NAVAPP.version="0.0.1" -- Constructor ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---- Create a new NAVAPP class instance. --- @param #NAVAPP self +--- Create a new APPROACH class instance. +-- @param #APPROACH self -- @param #string Type Type of approach (ILS, VOR, LOC). -- @param Wrapper.Airbase#AIRBASE Airbase The airbase or name of the airbase. -- @param Wrapper.Airbase#AIRBASE.Runway Runway The runway or name of the runway. --- @return #NAVAPP self -function NAVAPP:New(Type, Airbase, Runway) +-- @return #APPROACH self +function APPROACH:New(Type, Airbase, Runway) -- Inherit everything from BASE class. - self=BASE:Inherit(self, BASE:New()) -- #NAVAPP + self=BASE:Inherit(self, BASE:New()) -- #APPROACH self.apptype=Type @@ -137,10 +135,10 @@ end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- Set the primary navigation aid used in the approach. --- @param #NAVAPP self +-- @param #APPROACH self -- @param Navigation.NavAid#NAVAID NavAid The NAVAID. --- @return #NAVAPP self -function NAVAPP:SetNavAid(NavAid) +-- @return #APPROACH self +function APPROACH:SetNavAid(NavAid) self.navaid=NavAid @@ -148,15 +146,15 @@ function NAVAPP:SetNavAid(NavAid) end --- Add a waypoint to the path of the approach. --- @param #NAVAPP self +-- @param #APPROACH self -- @param Navigation.NavAid#NAVAID NavAid The NAVAID. -- @param #string Segment The approach segment this fix belongs to. --- @return #NAVAPP self -function NAVAPP:AddWaypoint(NavFix, Segment) +-- @return #APPROACH self +function APPROACH:AddWaypoint(NavFix, Segment) self.wpcounter=self.wpcounter+1 - local point={} --#NAVAPP.Waypoint + local point={} --#APPROACH.Waypoint point.uid=self.wpcounter point.segment=Segment point.navfix=NavFix