From 0da53c794ead4a526eece08a6b114ecba210c39a Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 14 Feb 2020 00:44:33 +0100 Subject: [PATCH] Update FlightGroup.lua --- Moose Development/Moose/Ops/FlightGroup.lua | 198 +++++++++++++++----- 1 file changed, 156 insertions(+), 42 deletions(-) diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index 9b8c6b149..5c4d4783e 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -166,6 +166,9 @@ FLIGHTGROUP = { taskcounter = nil, taskcurrent = nil, taskenroute = nil, + missionqueue = {}, + missioncounter = nil, + missioncurrent = nil, istanker = nil, isawacs = nil, eplrs = nil, @@ -341,20 +344,22 @@ FLIGHTGROUP.MissionStatus={ -- @field #string type Mission Type. -- @field #string name Mission name. -- @field #number mid Mission ID. +-- @field Core.Zone#ZONE zone Mission zone. -- @field #number Tstart Mission start time in seconds. -- @field #number Tstop Mission stop time in seconds. -- @field #number duration Mission duration in seconds. -- @field #table DCStask DCS task structure. --- @field #FLIGHTGROUP.Task Waypoint task. +-- @field #FLIGHTGROUP.Task task Waypoint task. -- @field #number waypoint Waypoint number. +-- @field #number prio Mission priority. +-- @field #string status Mission status. --- CAP mission. -- @type FLIGHTGROUP.MissionCAP --- @field Core.Zone#ZONE zone CAP zone. +-- @field #number heading Heading in degrees. -- @field #number leg Length of leg in meters. --- @field #number speedOrbit Orbit speed. --- @field #number speedTo Speed to go on station. --- @field #number altitude Altitude. +-- @field #number speedOrbit Orbit speed in m/s. +-- @field #number altitude Altitude in meters. -- @extends #FLIGHTGROUP.Mission --- FLIGHTGROUP class version. @@ -536,6 +541,8 @@ function FLIGHTGROUP:New(groupname, autostart) -- Init task counter. self.taskcurrent=0 self.taskcounter=0 + + self.missioncounter=0 -- Holding flag. self.flaghold=USERFLAG:New(string.format("%s_FlagHold", self.groupname)) @@ -630,7 +637,7 @@ function FLIGHTGROUP:AddTaskWaypoint(task, waypointindex, description, prio, dur newtask.time=0 newtask.waypoint=waypointindex or (self.currentwp and self.currentwp+1 or 2) newtask.type=FLIGHTGROUP.TaskType.WAYPOINT - newtask.stopflag=USERFLAG:New(self:StopTaskFlagname(newtask.id)) + newtask.stopflag=USERFLAG:New(string.format("StopTaskFlag %d", newtask.id)) newtask.stopflag:Set(0) self:T2({newtask=newtask}) @@ -1007,6 +1014,7 @@ end function FLIGHTGROUP:StartUncontrolled(delay) if self:IsAlive() then + --TODO: check Alive==true and Alive==false ==> Activate first self.group:StartUncontrolled(delay) else self:E(self.lid.."ERROR: Could not start uncontrolled group as it is NOT alive (yet)!") @@ -1094,26 +1102,96 @@ function FLIGHTGROUP:Route(waypoints) return self end ---- Route group along waypoints. Enroute tasks are also applied. +--- Create a CAP mission. -- @param #FLIGHTGROUP self --- @param #table waypoints Table of waypoints. --- @return #FLIGHTGROUP.MissionCAP -function FLIGHTGROUP:CreateMissionCAP(MissionType, Zone, Altitude, SpeedOrbit) +-- @param #number Altitude Orbit altitude in feet. Default 10000 ft. +-- @param #number SpeedOrbit Orbit speed in knots. Default 350 kts. +-- @param #number Heading Heading in degrees. Default 270 (East to West). +-- @param #number Leg Length of race-track in NM. Default 10 NM. +-- @return #FLIGHTGROUP.MissionCAP The CAP mission table. +function FLIGHTGROUP:CreateMissionCAP(Altitude, SpeedOrbit, Heading, Leg) local mission={} --#FLIGHTGROUP.MissionCAP - mission.mid=1 mission.type=FLIGHTGROUP.MissionType.CAP + mission.altitude=UTILS.FeetToMeters(Altitude or 10000) + mission.speedOrbit=UTILS.KnotsToMps(SpeedOrbit or 350) + mission.heading=Heading or 270 + mission.leg=UTILS.NMToMeters(Leg or 10) + + return mission +end + +--- Add mission to queue. +-- @param #FLIGHTGROUP self +-- @param FLIGHTGROUP.Mission Mission for this group. +-- @param Core.Zone#ZONE Zone The mission zone. +-- @param #number WaypointIndex The waypoint index. +-- @param #string ClockStart Time the mission is started, e.g. "05:00" for 5 am. If specified as a #number, it will be relative (in seconds) to the current mission time. Default is 5 seconds after mission was added. +-- @param #string ClockStop Time the mission is stopped, e.g. "13:00" for 1 pm. If mission could not be started at that time, it will be removed from the queue. If specified as a #number it will be relative (in seconds) to the current mission time. +-- @param #number Prio Priority of the mission, i.e. a number between 1 and 100. Default 50. +-- @param #string Name Mission name. Default "Aerial Refueling #00X", where "#00X" is a running mission counter index starting at "#001". +-- @return #FLIGHTGROUP.Mission The mission table. +function FLIGHTGROUP:AddMission(Mission, Zone, WaypointIndex, ClockStart, ClockStop, Prio, Name) + + -- Increase mission counter. + self.missioncounter=self.missioncounter+1 + + -- Create copy of Mission template. + local mission=UTILS.DeepCopy(Mission) + + -- Current mission time. + local Tnow=timer.getAbsTime() + + -- Set start time. Default in 5 sec. + local Tstart=Tnow+5 + if ClockStart and type(ClockStart)=="number" then + Tstart=Tnow+ClockStart + elseif ClockStart and type(ClockStart)=="string" then + Tstart=UTILS.ClockToSeconds(ClockStart) + end + + -- Set stop time. Default nil. + local Tstop=nil + if ClockStop and type(ClockStop)=="number" then + Tstop=Tnow+ClockStop + elseif ClockStop and type(ClockStop)=="string" then + Tstop=UTILS.ClockToSeconds(ClockStop) + end + + -- Make mission table. mission.zone=Zone - mission.altitude=Altitude - mission.speedTo=SpeedTo - mission.speedOrbit=SpeedOrbit - mission.name=Name or string.format("Mission CAP %03d", mission.id) + mission.mid=self.missioncounter + mission.Tstart=Tstart + mission.Tstop=Tstop + mission.status=FLIGHTGROUP.MissionStatus.SCHEDULED + if Tstop then + mission.duration=mission.Tstop-mission.Tstart + end + mission.prio=Prio or 50 + mission.task=nil + mission.waypoint=WaypointIndex + if mission.type==FLIGHTGROUP.MissionType.CAP then - mission.DCStask=self.group:TaskOrbit(Coord,Altitude,Speed,CoordRaceTrack) + local Coord=mission.zone:GetRandomCoordinate() + + local CoordRaceTrack=Coord:Translate(mission.leg, mission.heading, true) + + mission.DCStask=self.group:TaskOrbit(Coord, mission.altitude, mission.speed, CoordRaceTrack) + + mission.name=Name or string.format("CAP mission ID%03d", mission.mid) + + end + -- Add mission to queue. + table.insert(self.missionqueue, mission) + + local text=string.format("Added %s mission %s at zone %s. Starting at %s. Stopping at %s", mission.type, mission.name, mission.zone:GetName(), UTILS.SecondsToClock(mission.Tstart, true), mission.Tstop and UTILS.SecondsToClock(mission.Tstop, true) or "never") + self:I(self.lid..text) + + return mission end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -1225,6 +1303,10 @@ function FLIGHTGROUP:onafterFlightStatus(From, Event, To) -- Check if group has detected any units. self:_CheckDetectedUnits() + --- + -- Parking + --- + -- Check if flight began to taxi (if it was parking). if self:IsParking() then for _,_element in pairs(self.elements) do @@ -1249,6 +1331,10 @@ function FLIGHTGROUP:onafterFlightStatus(From, Event, To) end end + --- + -- Elements + --- + local nTaskTot, nTaskSched, nTaskWP=self:CountRemainingTasks() -- Short info. @@ -1295,16 +1381,10 @@ function FLIGHTGROUP:onafterFlightStatus(From, Event, To) text=text.." none!" end self:I(self.lid..text) - - -- Low fuel? - if fuelmin0 then self:I(self.lid..text) end + + --- + -- Mission + --- + + -- First check if group is alive? + if self:IsAlive()~=nil and not self.currentmission then + + local mission=self:_GetNextMission() + + if mission then + + env.info("FF starting mission") + self:MissionStart(mission) + + end + end + + -- Current mission name. + local mymission=self.currentmission and self.currentmission.name or "N/A" + + -- Current status. + local text=string.format("Tanker Status %s: Mission=%s (%d)", fsmstate, mymission, #self.missionqueue) + for i,_mission in pairs(self.missionqueue) do + local mission=_mission --#TANKERGROUP.Mission + text=text..string.format("\n[%d] %s status=%s", i, tostring(mission.name), tostring(mission.status)) + end + self:I(self.lid..text) + + + -- Low fuel? + if fuelmin=mission.Tstart then return mission @@ -3057,21 +3176,14 @@ function FLIGHTGROUP:RouteToMission(mission, delay) -- Get random coordinate in mission zone. local Coordinate=mission.zone:GetRandomCoordinate():SetAltitude(mission.altitude, true) - -- Set second coordinate for race track pattern. - local CoordRaceTrack=Coordinate:Translate(mission.distance, mission.heading, true) - - Coordinate:MarkToAll("Orbit 1") - CoordRaceTrack:MarkToAll("Orbit 2") + -- TODO: better marker text, mission.maker + mission.maker=Coordinate:MarkToCoalition(mission.name, self:GetCoalition(), true) -- Add waypoint. - self:AddWaypointAir(Coordinate, nil, self.speedmax*0.8) - - -- Create task to orbit. - local taskorbit=self.group:TaskOrbit(Coordinate, mission.altitude, mission.speed, CoordRaceTrack) + self:AddWaypointAir(Coordinate, mission.waypoint, self.speedmax*0.8, false) -- Add waypoint task. - -- TODO: find last AIR waypoint! We dont want this at landing waypoints. - mission.task=self:AddTaskWaypoint(taskorbit, #self.waypoints, mission.name, 10, mission.duration) + mission.task=self:AddTaskWaypoint(mission.DCStask, mission.waypoint, mission.name, 10, mission.duration) end end @@ -3694,7 +3806,7 @@ function FLIGHTGROUP:AddWaypointAir(coordinate, wpnumber, speed, updateroute) -- Shift all mission waypoints after the inserted waypoint. for _,_mission in pairs(self.missionqueue) do local mission=_mission --#FLIGHTGROUP.Mission - if mission.status==FLIGHTGROUP.MissonStatus.SCHEDULED and mission.waypoint>=wpnumber then + if mission.status==FLIGHTGROUP.MissionStatus.SCHEDULED and mission.waypoint>=wpnumber then mission.waypoint=mission.waypoint+1 end end @@ -3716,7 +3828,7 @@ end function FLIGHTGROUP:RemoveWaypoint(wpindex) for i, wp in pairs(self.waypoints) do - if i==index then + if i==wpindex then table.remove(self.waypoints, i) break end @@ -3725,6 +3837,8 @@ function FLIGHTGROUP:RemoveWaypoint(wpindex) --TODO update route? -- no, if <= self.currentwaypoint or WP is landing. + + --TODO shift task and mission waypoints end