mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-21 11:53:30 +00:00
Ops FC
This commit is contained in:
@@ -335,10 +335,17 @@ function FLIGHTCONTROL:onafterStatus()
|
|||||||
--TODO: get and substract number of reserved parking spots.
|
--TODO: get and substract number of reserved parking spots.
|
||||||
local nfree=self.Nparkingspots-NQarrived-NQparking
|
local nfree=self.Nparkingspots-NQarrived-NQparking
|
||||||
|
|
||||||
|
local Nfree=self:CountParking(AIRBASE.SpotStatus.FREE)
|
||||||
|
local Noccu=self:CountParking(AIRBASE.SpotStatus.OCCUPIED)
|
||||||
|
local Nresv=self:CountParking(AIRBASE.SpotStatus.RESERVED)
|
||||||
|
|
||||||
|
if Nfree+Noccu+Nresv~=self.Nparkingspots then
|
||||||
|
self:E(self.lid..string.format("WARNING: Number of parking spots does not match! Nfree=%d, Noccu=%d, Nreserved=%d %d != %d total"), Nfree, Noccu, Nresv, self.Nparkingspots)
|
||||||
|
end
|
||||||
|
|
||||||
-- Info text.
|
-- Info text.
|
||||||
local text=string.format("State %s - Runway %s - Parking %d/%d - Flights=%s: Qpark=%d Qtxout=%d Qready=%d Qto=%d | Qinbound=%d Qhold=%d Qland=%d Qtxinb=%d Qarr=%d",
|
local text=string.format("State %s - Runway %s - Parking %d/%d/%d of %d - Flights=%s: Qpark=%d Qtxout=%d Qready=%d Qto=%d | Qinbound=%d Qhold=%d Qland=%d Qtxinb=%d Qarr=%d",
|
||||||
self:GetState(), runway.idx, nfree, self.Nparkingspots, #self.flights, #self.Qparking, #self.Qtaxiout, #self.Qreadyto, #self.Qtakeoff, #self.Qinbound, #self.Qholding, #self.Qlanding, #self.Qtaxiinb, #self.Qarrived)
|
self:GetState(), runway.idx, Nfree, Noccu, Nresv, self.Nparkingspots, #self.flights, #self.Qparking, #self.Qtaxiout, #self.Qreadyto, #self.Qtakeoff, #self.Qinbound, #self.Qholding, #self.Qlanding, #self.Qtaxiinb, #self.Qarrived)
|
||||||
self:I(self.lid..text)
|
self:I(self.lid..text)
|
||||||
|
|
||||||
if Nflights==Nqueues then
|
if Nflights==Nqueues then
|
||||||
@@ -1088,6 +1095,9 @@ function FLIGHTCONTROL:_InitParkingSpots()
|
|||||||
-- Mark position.
|
-- Mark position.
|
||||||
local text=string.format("Parking ID=%d, Terminal=%d: Free=%s, Client=%s, Dist=%.1f", spot.TerminalID, spot.TerminalType, tostring(spot.Free), tostring(spot.ClientSpot), spot.DistToRwy)
|
local text=string.format("Parking ID=%d, Terminal=%d: Free=%s, Client=%s, Dist=%.1f", spot.TerminalID, spot.TerminalType, tostring(spot.Free), tostring(spot.ClientSpot), spot.DistToRwy)
|
||||||
self:I(self.lid..text)
|
self:I(self.lid..text)
|
||||||
|
|
||||||
|
-- Add to table.
|
||||||
|
self.parking[spot.TerminalID]=spot
|
||||||
|
|
||||||
-- Set spot to occupied.
|
-- Set spot to occupied.
|
||||||
if spot.Free then
|
if spot.Free then
|
||||||
@@ -1098,9 +1108,6 @@ function FLIGHTCONTROL:_InitParkingSpots()
|
|||||||
|
|
||||||
--TODO: scan spot for objects.
|
--TODO: scan spot for objects.
|
||||||
|
|
||||||
-- Add to table.
|
|
||||||
self.parking[spot.TerminalID]=spot
|
|
||||||
|
|
||||||
-- Increase counter
|
-- Increase counter
|
||||||
self.Nparkingspots=self.Nparkingspots+1
|
self.Nparkingspots=self.Nparkingspots+1
|
||||||
end
|
end
|
||||||
@@ -1110,7 +1117,7 @@ end
|
|||||||
--- Get parking spot by its Terminal ID.
|
--- Get parking spot by its Terminal ID.
|
||||||
-- @param #FLIGHTCONTROL self
|
-- @param #FLIGHTCONTROL self
|
||||||
-- @param #number TerminalID
|
-- @param #number TerminalID
|
||||||
-- @return Wrapper.Airbase#AIRBASE Parking spot data table.
|
-- @return Wrapper.Airbase#AIRBASE.ParkingSpot Parking spot data table.
|
||||||
function FLIGHTCONTROL:GetParkingSpotByID(TerminalID)
|
function FLIGHTCONTROL:GetParkingSpotByID(TerminalID)
|
||||||
return self.parking[TerminalID]
|
return self.parking[TerminalID]
|
||||||
end
|
end
|
||||||
@@ -1120,6 +1127,7 @@ end
|
|||||||
-- @param Wrapper.Airbase#AIRBASE.ParkingSpot spot The parking spot data table.
|
-- @param Wrapper.Airbase#AIRBASE.ParkingSpot spot The parking spot data table.
|
||||||
function FLIGHTCONTROL:SetParkingFree(spot)
|
function FLIGHTCONTROL:SetParkingFree(spot)
|
||||||
|
|
||||||
|
local spot=self:GetParkingSpotByID(spot.TerminalID)
|
||||||
spot.Status=AIRBASE.SpotStatus.FREE
|
spot.Status=AIRBASE.SpotStatus.FREE
|
||||||
spot.OccupiedBy=nil
|
spot.OccupiedBy=nil
|
||||||
spot.ReservedBy=nil
|
spot.ReservedBy=nil
|
||||||
@@ -1134,6 +1142,7 @@ end
|
|||||||
-- @param #string unitname Name of the unit occupying the spot. Default "unknown".
|
-- @param #string unitname Name of the unit occupying the spot. Default "unknown".
|
||||||
function FLIGHTCONTROL:SetParkingReserved(spot, unitname)
|
function FLIGHTCONTROL:SetParkingReserved(spot, unitname)
|
||||||
|
|
||||||
|
local spot=self:GetParkingSpotByID(spot.TerminalID)
|
||||||
spot.Status=AIRBASE.SpotStatus.RESERVED
|
spot.Status=AIRBASE.SpotStatus.RESERVED
|
||||||
spot.ReservedBy=unitname or "unknown"
|
spot.ReservedBy=unitname or "unknown"
|
||||||
|
|
||||||
@@ -1147,6 +1156,7 @@ end
|
|||||||
-- @param #string unitname Name of the unit occupying the spot. Default "unknown".
|
-- @param #string unitname Name of the unit occupying the spot. Default "unknown".
|
||||||
function FLIGHTCONTROL:SetParkingOccupied(spot, unitname)
|
function FLIGHTCONTROL:SetParkingOccupied(spot, unitname)
|
||||||
|
|
||||||
|
local spot=self:GetParkingSpotByID(spot.TerminalID)
|
||||||
spot.Status=AIRBASE.SpotStatus.OCCUPIED
|
spot.Status=AIRBASE.SpotStatus.OCCUPIED
|
||||||
spot.OccupiedBy=unitname or "unknown"
|
spot.OccupiedBy=unitname or "unknown"
|
||||||
|
|
||||||
@@ -1159,22 +1169,29 @@ end
|
|||||||
-- @param Wrapper.Airbase#AIRBASE.ParkingSpot spot The parking spot data table.
|
-- @param Wrapper.Airbase#AIRBASE.ParkingSpot spot The parking spot data table.
|
||||||
function FLIGHTCONTROL:UpdateParkingMarker(spot)
|
function FLIGHTCONTROL:UpdateParkingMarker(spot)
|
||||||
|
|
||||||
|
local spot=self:GetParkingSpotByID(spot.TerminalID)
|
||||||
|
|
||||||
if spot.MarkerID then
|
if spot.MarkerID then
|
||||||
spot.Coordinate:RemoveMark(spot.MarkerID)
|
spot.Coordinate:RemoveMark(spot.MarkerID)
|
||||||
end
|
end
|
||||||
|
|
||||||
local text=string.format("Spot %d (type %d) status=%s", spot.TerminalID, spot.TerminalType, spot.Status)
|
-- Only mark OCCUPIED and RESERVED spots.
|
||||||
if spot.OccupiedBy then
|
if spot.Status~=AIRBASE.SpotStatus.FREE then
|
||||||
text=text..string.format("Occupied by %s", spot.OccupiedBy)
|
|
||||||
|
local text=string.format("Spot %d (type %d): %s", spot.TerminalID, spot.TerminalType, spot.Status:upper())
|
||||||
|
if spot.OccupiedBy then
|
||||||
|
text=text..string.format("\nOccupied by %s", spot.OccupiedBy)
|
||||||
|
end
|
||||||
|
if spot.ReservedBy then
|
||||||
|
text=text..string.format("\nReserved for %s", spot.ReservedBy)
|
||||||
|
end
|
||||||
|
if spot.ClientSpot then
|
||||||
|
text=text..string.format("\nClient %s", tostring(spot.ClientSpot))
|
||||||
|
end
|
||||||
|
|
||||||
|
spot.MarkerID=spot.Coordinate:MarkToAll(text, true)
|
||||||
|
|
||||||
end
|
end
|
||||||
if spot.ReservedBy then
|
|
||||||
text=text..string.format("Reserved for %s", spot.ReservedBy)
|
|
||||||
end
|
|
||||||
if spot.ClientSpot then
|
|
||||||
text=text..string.format("Client %s", spot.ClientSpot)
|
|
||||||
end
|
|
||||||
|
|
||||||
spot.MarkerID=spot.Coordinate:MarkToAll(text, true)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Check if parking spot is free.
|
--- Check if parking spot is free.
|
||||||
@@ -1201,7 +1218,7 @@ end
|
|||||||
--- Check if a parking spot is reserved by a flight group.
|
--- Check if a parking spot is reserved by a flight group.
|
||||||
-- @param #FLIGHTCONTROL self
|
-- @param #FLIGHTCONTROL self
|
||||||
-- @param Wrapper.Airbase#AIRBASE.ParkingSpot spot Parking spot to check.
|
-- @param Wrapper.Airbase#AIRBASE.ParkingSpot spot Parking spot to check.
|
||||||
-- @return #string Name of element or nil.
|
-- @return #string Name of element or *nil*.
|
||||||
function FLIGHTCONTROL:IsParkingReserved(spot)
|
function FLIGHTCONTROL:IsParkingReserved(spot)
|
||||||
|
|
||||||
if spot.Status==AIRBASE.SpotStatus.RESERVED then
|
if spot.Status==AIRBASE.SpotStatus.RESERVED then
|
||||||
@@ -1283,6 +1300,24 @@ function FLIGHTCONTROL:GetClosestParkingSpot(coordinate, terminaltype, free)
|
|||||||
return spotmin
|
return spotmin
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Count number of parking spots.
|
||||||
|
-- @param #FLIGHTCONTROL self
|
||||||
|
-- @param #string SpotStatus (Optional) Status of spot.
|
||||||
|
-- @return #number Number of parking spots.
|
||||||
|
function FLIGHTCONTROL:CountParking(SpotStatus)
|
||||||
|
|
||||||
|
local n=0
|
||||||
|
for _,_spot in pairs(self.parking) do
|
||||||
|
local spot=_spot --Wrapper.Airbase#AIRBASE.ParkingSpot
|
||||||
|
if SpotStatus==nil or SpotStatus==spot.Status then
|
||||||
|
n=n+1
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return n
|
||||||
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- ATIS Functions
|
-- ATIS Functions
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -1879,7 +1914,7 @@ function FLIGHTCONTROL:_LandAI(flight, parking)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local respawn=false
|
local respawn=true
|
||||||
|
|
||||||
if respawn then
|
if respawn then
|
||||||
|
|
||||||
|
|||||||
@@ -799,14 +799,19 @@ end
|
|||||||
-- @param Ops.FlightControl#FLIGHTCONTROL flightcontrol The FLIGHTCONTROL object.
|
-- @param Ops.FlightControl#FLIGHTCONTROL flightcontrol The FLIGHTCONTROL object.
|
||||||
-- @return #FLIGHTGROUP self
|
-- @return #FLIGHTGROUP self
|
||||||
function FLIGHTGROUP:SetFlightControl(flightcontrol)
|
function FLIGHTGROUP:SetFlightControl(flightcontrol)
|
||||||
self:I(self.lid..string.format("Setting FLIGHTCONTROL to airbase %s", flightcontrol.airbasename))
|
|
||||||
|
|
||||||
-- Remove flight from previous FC.
|
-- Remove flight from previous FC.
|
||||||
if self.flightcontrol and self.flightcontrol.airbasename~=flightcontrol.airbasename then
|
if self.flightcontrol then
|
||||||
self.flightcontrol:_RemoveFlight(self)
|
if self.flightcontrol.airbasename==flightcontrol.airbasename then
|
||||||
|
-- Flight control is already controlling this flight!
|
||||||
|
return
|
||||||
|
else
|
||||||
|
self.flightcontrol:_RemoveFlight(self)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set FC.
|
-- Set FC.
|
||||||
|
self:I(self.lid..string.format("Setting FLIGHTCONTROL to airbase %s", flightcontrol.airbasename))
|
||||||
self.flightcontrol=flightcontrol
|
self.flightcontrol=flightcontrol
|
||||||
|
|
||||||
-- Add flight to all flights.
|
-- Add flight to all flights.
|
||||||
@@ -1332,6 +1337,23 @@ end
|
|||||||
-- @param #string To To state.
|
-- @param #string To To state.
|
||||||
function FLIGHTGROUP:onafterStop(From, Event, To)
|
function FLIGHTGROUP:onafterStop(From, Event, To)
|
||||||
|
|
||||||
|
-- Check if group is still alive.
|
||||||
|
if self:IsAlive() then
|
||||||
|
|
||||||
|
-- Set element parking spot to FREE (after arrived for example).
|
||||||
|
if self.flightcontrol then
|
||||||
|
for _,_element in pairs(self.elements) do
|
||||||
|
local element=_element --#FLIGHTGROUP.Element
|
||||||
|
if element.parking then
|
||||||
|
self.flightcontrol:SetParkingFree(element.parking)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Destroy group.
|
||||||
|
self.group:Destroy()
|
||||||
|
end
|
||||||
|
|
||||||
-- Handle events:
|
-- Handle events:
|
||||||
self:UnHandleEvent(EVENTS.Birth)
|
self:UnHandleEvent(EVENTS.Birth)
|
||||||
self:UnHandleEvent(EVENTS.EngineStartup)
|
self:UnHandleEvent(EVENTS.EngineStartup)
|
||||||
@@ -1902,7 +1924,7 @@ function FLIGHTGROUP:OnEventRemoveUnit(EventData)
|
|||||||
|
|
||||||
if element then
|
if element then
|
||||||
self:T3(self.lid..string.format("EVENT: Element %s removed ==> dead", element.name))
|
self:T3(self.lid..string.format("EVENT: Element %s removed ==> dead", element.name))
|
||||||
self:ElementDead(element)
|
--self:ElementDead(element)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -1994,7 +2016,7 @@ function FLIGHTGROUP:onafterElementTaxiing(From, Event, To, Element)
|
|||||||
local TerminalID=Element.parking and tostring(Element.parking.TerminalID) or "N/A"
|
local TerminalID=Element.parking and tostring(Element.parking.TerminalID) or "N/A"
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:T(self.lid..string.format("Element taxiing %s. Parking spot %s is now free", Element.name, TerminalID))
|
self:I(self.lid..string.format("Element taxiing %s. Parking spot %s is now free", Element.name, TerminalID))
|
||||||
|
|
||||||
-- Set parking to FREE.
|
-- Set parking to FREE.
|
||||||
if self.flightcontrol and Element.parking then
|
if self.flightcontrol and Element.parking then
|
||||||
@@ -2274,6 +2296,8 @@ function FLIGHTGROUP:onafterFlightArrived(From, Event, To)
|
|||||||
self.flightcontrol:_AddFlightToArrivedQueue(self)
|
self.flightcontrol:_AddFlightToArrivedQueue(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
self:__Stop(5*60)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- On after "FlightDead" event.
|
--- On after "FlightDead" event.
|
||||||
|
|||||||
@@ -322,10 +322,10 @@ AIRBASE.SpotStatus = {
|
|||||||
-- @field #number DistToRwy Distance to runway in meters. Currently bugged and giving the same number as the TerminalID.
|
-- @field #number DistToRwy Distance to runway in meters. Currently bugged and giving the same number as the TerminalID.
|
||||||
-- @field #string AirbaseName Name of the airbase.
|
-- @field #string AirbaseName Name of the airbase.
|
||||||
-- @field #number MarkerID Numerical ID of marker placed at parking spot.
|
-- @field #number MarkerID Numerical ID of marker placed at parking spot.
|
||||||
-- @field #boolean ClientSpot If true, a client unit sits at this parking spot (spawned or not).
|
-- @field #string ClientSpot Client unit sitting at this spot or *nil*.
|
||||||
-- @field #string Status Status of spot e.g. AIRBASE.SpotStatus.FREE.
|
-- @field #string Status Status of spot e.g. AIRBASE.SpotStatus.FREE.
|
||||||
-- @field #string OccupiedBy Name of the aircraft occupying the spot or "unknown". Can be nil if spot is not occupied.
|
-- @field #string OccupiedBy Name of the aircraft occupying the spot or "unknown". Can be *nil* if spot is not occupied.
|
||||||
-- @field #string ReservedBy Name of the aircraft for which this spot is reserved. Can be nil if spot is not reserved.
|
-- @field #string ReservedBy Name of the aircraft for which this spot is reserved. Can be *nil* if spot is not reserved.
|
||||||
|
|
||||||
--- Terminal Types of parking spots. See also https://wiki.hoggitworld.com/view/DCS_func_getParking
|
--- Terminal Types of parking spots. See also https://wiki.hoggitworld.com/view/DCS_func_getParking
|
||||||
--
|
--
|
||||||
@@ -713,12 +713,12 @@ function AIRBASE:GetParkingSpotsTable(termtype)
|
|||||||
local dist=coord:Get2DDistance(_coord)
|
local dist=coord:Get2DDistance(_coord)
|
||||||
|
|
||||||
if dist<=5 then
|
if dist<=5 then
|
||||||
return true
|
return clientname
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Put coordinates of parking spots into table.
|
-- Put coordinates of parking spots into table.
|
||||||
|
|||||||
Reference in New Issue
Block a user