From e509eb3d356f3de21a211fa09b5ef14939076ada Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 20 Jan 2020 23:25:43 +0100 Subject: [PATCH] FG/FC/ATIS v0.6.3 --- Moose Development/Moose/Ops/ATIS.lua | 6 +++- Moose Development/Moose/Ops/FlightControl.lua | 32 +++++++++++++------ Moose Development/Moose/Ops/FlightGroup.lua | 23 ++++++++++--- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/Moose Development/Moose/Ops/ATIS.lua b/Moose Development/Moose/Ops/ATIS.lua index 911c719ea..b8b64ebe6 100644 --- a/Moose Development/Moose/Ops/ATIS.lua +++ b/Moose Development/Moose/Ops/ATIS.lua @@ -523,7 +523,7 @@ _ATIS={} --- ATIS class version. -- @field #string version -ATIS.version="0.6.2" +ATIS.version="0.6.3" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -1142,6 +1142,10 @@ function ATIS:onafterBroadcast(From, Event, To) local WINDFROM=string.format("%03d", windFrom-magvar) local WINDSPEED=string.format("%d", UTILS.MpsToKnots(windSpeed)) + + if WINDFROM=="000" then + WINDFROM="360" + end if self.metric then WINDSPEED=string.format("%d", windSpeed) diff --git a/Moose Development/Moose/Ops/FlightControl.lua b/Moose Development/Moose/Ops/FlightControl.lua index 957c62a35..9ea5cdcb0 100644 --- a/Moose Development/Moose/Ops/FlightControl.lua +++ b/Moose Development/Moose/Ops/FlightControl.lua @@ -29,6 +29,7 @@ -- @field #table Qwaiting Queue of aircraft waiting for landing permission. -- @field #table Qlanding Queue of aircraft currently on final approach. -- @field #table Qtakeoff Queue of aircraft about to takeoff. +-- @field #table QtaxiInb Queue of aircraft taxiing to parking after landing. -- @field #table Qparking Queue of aircraft parking. -- @field Ops.ATIS#ATIS atis ATIS object. -- @field #number activerwyno Number of active runway. @@ -69,6 +70,7 @@ FLIGHTCONTROL = { Qlanding = {}, Qtakeoff = {}, Qparking = {}, + QtaxiInb = {}, atis = nil, activerwyno = 1, atcfreq = nil, @@ -107,7 +109,7 @@ FLIGHTCONTROL = { --- FlightControl class version. -- @field #string version -FLIGHTCONTROL.version="0.1.2" +FLIGHTCONTROL.version="0.1.3" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -308,7 +310,8 @@ function FLIGHTCONTROL:onafterStatus() local nfree=self.Nparkingspots -- Info text. - local text=string.format("State %s - Runway %s - Parking %d/%d - Qpark=%d Qtakeoff=%d Qland=%d Qhold=%d", self:GetState(), runway.idx, nfree, self.Nparkingspots, #self.Qparking, #self.Qtakeoff, #self.Qlanding, #self.Qwaiting) + local text=string.format("State %s - Runway %s - Parking %d/%d - Flights=%s: Qpark=%d Qtakeoff=%d Qland=%d Qhold=%d", + self:GetState(), runway.idx, nfree, self.Nparkingspots, #self.flights, #self.Qparking, #self.Qtakeoff, #self.Qlanding, #self.Qwaiting) self:I(self.lid..text) -- Next status update in ~30 seconds. @@ -521,7 +524,9 @@ function FLIGHTCONTROL:_CheckQueues() -- TODO: handle case with engines hot. That does not trigger a ENGINE_START event. More a FLIGHTGROUP issue. flight.group:StartUncontrolled() - flight:_UpdateRoute(1) + + -- TODO: is this really necessary here? + flight:__UpdateRoute(-1) env.info("FF remove flight from parking queue - if possible.") self:_RemoveFlightFromQueue(self.Qparking, flight, "parking") @@ -1046,18 +1051,20 @@ function FLIGHTCONTROL:_CreatePlayerMenu(flight, atcmenu) atcmenu[airbasename] = atcmenu[airbasename] or {} - -- Root menu - atcmenu[airbasename].root = MENU_GROUP_DELAYED:New(group, airbasename, nil):SetTime(Tnow):SetTag(Tag) + -- Airbase root menu. + atcmenu[airbasename].root = MENU_GROUP_DELAYED:New(group, airbasename, atcmenu.root):SetTime(Tnow):SetTag(Tag) local rootmenu=atcmenu[airbasename].root --Core.Menu#MENU_GROUP_DELAYED -- Commands MENU_GROUP_COMMAND_DELAYED:New(group, "Request Info", rootmenu, self._PlayerRequestInfo, self, groupname):SetTime(Tnow):SetTag(Tag) + if flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename then MENU_GROUP_COMMAND_DELAYED:New(group, "Request Taxi", rootmenu, self._PlayerRequestTaxi, self, groupname):SetTime(Tnow):SetTag(Tag) MENU_GROUP_COMMAND_DELAYED:New(group, "Request Takeoff", rootmenu, self._PlayerRequestTakeoff, self, groupname):SetTime(Tnow):SetTag(Tag) MENU_GROUP_COMMAND_DELAYED:New(group, "Request Parking", rootmenu, self._PlayerRequestParking, self, groupname):SetTime(Tnow):SetTag(Tag) + end MENU_GROUP_COMMAND_DELAYED:New(group, "Inbound", rootmenu, self._PlayerInbound, self, groupname):SetTime(Tnow):SetTag(Tag) - if flight.flightcontrol.airbasename==self.airbasename then + if flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename then MENU_GROUP_COMMAND_DELAYED:New(group, "My Status", rootmenu, self._PlayerMyStatus, self, groupname):SetTime(Tnow):SetTag(Tag) end @@ -1086,6 +1093,7 @@ function FLIGHTCONTROL:_PlayerRequestInfo(groupname) -- local text=string.format("Airbase %s Status:", self.airbasename) + text=text..string.format("\nFlights %d", #self.flights) text=text..string.format("\nQlanding %d", #self.Qlanding) text=text..string.format("\nQholding %d", #self.Qwaiting) text=text..string.format("\nQparking %d", #self.Qparking) @@ -1134,9 +1142,10 @@ function FLIGHTCONTROL:_PlayerInbound(groupname) if flight:IsAirborne() then if flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename then - + -- Nothing to do as this flight has already the right flightcontrol. else + -- Set FC controlling this flight. flight:SetFlightControl(self) end @@ -1148,7 +1157,9 @@ function FLIGHTCONTROL:_PlayerInbound(groupname) MESSAGE:New(text, 5):ToGroup(flight.group) else - -- TODO: error you are not airborne! + -- Error you are not airborne! + local text=string.format("Negative, you must be AIRBORNE to call INBOUND!") + MESSAGE:New(text, 5):ToGroup(flight.group) end else @@ -1260,7 +1271,8 @@ function FLIGHTCONTROL:_CreateFlightGroup(group) flight=FLIGHTGROUP:New(group:GetName()) end - if flight.destination and flight.destination:GetName()==self.airbasename then + --if flight.destination and flight.destination:GetName()==self.airbasename then + if flight.homebase and flight.homebase:GetName()==self.airbasename then flight:SetFlightControl(self) end @@ -1270,7 +1282,7 @@ function FLIGHTCONTROL:_CreateFlightGroup(group) return flight end ---- Create a new flight group. +--- Remove flight from all queues. -- @param #FLIGHTCONTROL self -- @param Ops.FlightGroup#FLIGHTGROUP flight The flight to be removed. function FLIGHTCONTROL:_RemoveFlight(flight) diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index ba2d9823c..09c4ce742 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -233,7 +233,7 @@ FLIGHTGROUP.TaskType={ --- FLIGHTGROUP class version. -- @field #string version -FLIGHTGROUP.version="0.2.1" +FLIGHTGROUP.version="0.2.2" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -514,7 +514,18 @@ end -- @return #FLIGHTGROUP self function FLIGHTGROUP:SetFlightControl(flightcontrol) self:I(self.sid..string.format("Setting FLIGHTCONTROL to airbase %s", flightcontrol.airbasename)) + -- Remove flight from previous FC. + if self.flightcontrol and self.flightcontrol.airbasename~=flightcontrol.airbasename then + self.flightcontrol:_RemoveFlight(self) + end + -- Set FC. self.flightcontrol=flightcontrol + -- Add flight to all flights. + table.insert(flightcontrol.flights, self) + -- Update flight's F10 menu. + if self.ai==false then + self:_UpdateMenu() + end return self end @@ -1518,14 +1529,14 @@ function FLIGHTGROUP:onbeforeUpdateRoute(From, Event, To, n) if self.group and self.group:IsAlive() and self:IsAirborne() then -- Alive & Airborne ==> Update route possible. - env.info("FF update route allowed") + self:I(self.sid.."FF update route allowed") return true elseif self:IsDead() then -- Group is dead! No more updates. return false else -- Not airborne yet. Try again in 1 sec. - env.info("FF update route denied ==> checking back in 1 sec") + self:I(self.sid.."FF update route denied ==> checking back in 1 sec") self:__UpdateRoute(-1, n) return false end @@ -1541,7 +1552,7 @@ end function FLIGHTGROUP:onafterUpdateRoute(From, Event, To, n) MESSAGE:New("Updating route", 10):ToAll() - env.info("FF updating route") + self:I(self.sid.."FF updating route") -- TODO: what happens if currentwp=#waypoints n=n or self.currentwp+1 @@ -1594,7 +1605,7 @@ function FLIGHTGROUP:onafterUpdateRoute(From, Event, To, n) -- Debug info. local hb=self.homebase and self.homebase:GetName() or "unknown" local db=self.destination and self.destination:GetName() or "unknown" - self:I(self.sid..string.format("Updating route for WP>=%d (%d/%d) homebase=%s destination=%s", n, #wp, #self.waypoints, hb, db)) + self:I(self.sid..string.format("Updating route for WP>=%d/%d (%d) homebase=%s destination=%s", n, #wp, #self.waypoints, hb, db)) if #wp>0 then @@ -3660,6 +3671,8 @@ function FLIGHTGROUP:_UpdateMenu() --playermenu:RemoveSubMenus() --Core.Menu#MENU_GROUP + self.menu.atc.root=self.menu.atc.root or MENU + -- If there is a designated FC, we put it first. local N=8 if self.flightcontrol then