This commit is contained in:
Frank
2020-03-05 17:59:26 +01:00
parent 589335e420
commit 5f416b3271
5 changed files with 198 additions and 93 deletions
+78 -30
View File
@@ -21,6 +21,12 @@
-- @field #table missionqueue Mission queue table. -- @field #table missionqueue Mission queue table.
-- @field #table payloads Playloads for specific aircraft and mission types. -- @field #table payloads Playloads for specific aircraft and mission types.
-- @field #number payloadcounter Running index of payloads. -- @field #number payloadcounter Running index of payloads.
-- @field Core.Set#SET_ZONE zonesetCAP Set of CAP zones.
-- @field Core.Set#SET_ZONE zonesetTANKER Set of TANKER zones.
-- @field Core.Set#SET_ZONE zonesetAWACS Set of AWACS zones.
-- @field #number nflightsCAP Number of CAP flights constantly in the air.
-- @field #number nflightsTANKER Number of TANKER flights constantly in the air.
-- @field #number nflightsAWACS Number of AWACS flights constantly in the air.
-- @extends Functional.Warehouse#WAREHOUSE -- @extends Functional.Warehouse#WAREHOUSE
--- Be surprised! --- Be surprised!
@@ -42,6 +48,7 @@ AIRWING = {
squadrons = {}, squadrons = {},
missionqueue = {}, missionqueue = {},
payloads = {}, payloads = {},
cappoints = {},
} }
--- Squadron data. --- Squadron data.
@@ -56,7 +63,6 @@ AIRWING = {
--- Squadron asset. --- Squadron asset.
-- @type AIRWING.SquadronAsset -- @type AIRWING.SquadronAsset
-- @field #AIRWING.Payload payload The payload of the asset. -- @field #AIRWING.Payload payload The payload of the asset.
-- @field Ops.Auftrag#AUFTRAG mission The assigned mission.
-- @field Ops.FlightGroup#FLIGHTGROUP flightgroup The flightgroup object. -- @field Ops.FlightGroup#FLIGHTGROUP flightgroup The flightgroup object.
-- @extends Functional.Warehouse#WAREHOUSE.Assetitem -- @extends Functional.Warehouse#WAREHOUSE.Assetitem
@@ -69,10 +75,17 @@ AIRWING = {
-- @field #number navail Number of available payloads of this type. -- @field #number navail Number of available payloads of this type.
-- @field #boolean unlimited If true, this payload is unlimited and does not get consumed. -- @field #boolean unlimited If true, this payload is unlimited and does not get consumed.
--- CAP data.
-- @type AIRWING.PatrolData
-- @field Core.Point#COORDINATE coord CAP coordinate.
-- @field #number heading heading
-- @field #number leg Leg.
-- @field #number speed Speed.
-- @field #boolean occupied Is currently occupied.
--- AIRWING class version. --- AIRWING class version.
-- @field #string version -- @field #string version
AIRWING.version="0.1.3" AIRWING.version="0.1.4"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- ToDo list -- ToDo list
@@ -82,11 +95,13 @@ AIRWING.version="0.1.3"
-- TODO: Make special request to transfer squadrons to anther airwing (or warehouse). -- TODO: Make special request to transfer squadrons to anther airwing (or warehouse).
-- DONE: Build mission queue. -- DONE: Build mission queue.
-- DONE: Find way to start missions. -- DONE: Find way to start missions.
-- TODO: Check if missions are accomplished. -- TODO: Check if missions are done/cancelled.
-- DONE: Payloads as resources. -- DONE: Payloads as resources.
-- TODO: Spawn in air or hot. -- TODO: Spawn in air or hot.
-- TODO: Define CAP zones. -- TODO: Define CAP zones.
-- TODO: Define TANKER zones for refuelling. -- TODO: Define TANKER zones for refuelling.
-- TODO: Border zone or even multiple zones.
-- TODO: Check that airbase has enough parking spots if a request is BIG. Alternatively, split requests.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Constructor -- Constructor
@@ -112,7 +127,6 @@ function AIRWING:New(warehousename, airwingname)
-- Add FSM transitions. -- Add FSM transitions.
-- From State --> Event --> To State -- From State --> Event --> To State
self:AddTransition("*", "MissionNew", "*") -- Add a new mission.
self:AddTransition("*", "MissionRequest", "*") -- Add a (mission) request to the warehouse. self:AddTransition("*", "MissionRequest", "*") -- Add a (mission) request to the warehouse.
self:AddTransition("*", "MissionDone", "*") -- Mission is over. self:AddTransition("*", "MissionDone", "*") -- Mission is over.
self:AddTransition("*", "MissionCancel", "*") -- Mission is over. self:AddTransition("*", "MissionCancel", "*") -- Mission is over.
@@ -190,7 +204,7 @@ end
-- @param Wrapper.Unit#UNIT Unit The unit, the payload is extracted from. Can also be given as *#string* name of the unit. -- @param Wrapper.Unit#UNIT Unit The unit, the payload is extracted from. Can also be given as *#string* name of the unit.
-- @param #table MissionTypes Mission types this payload can be used for. -- @param #table MissionTypes Mission types this payload can be used for.
-- @param #number Npayloads Number of payloads to add to the airwing resources. Default 99 (which should be enough for most scenarios). -- @param #number Npayloads Number of payloads to add to the airwing resources. Default 99 (which should be enough for most scenarios).
-- @param #boolan Unlimited If true, this payload is unlimited. -- @param #boolean Unlimited If true, this payload is unlimited.
-- @return #AIRWING.Payload The payload table or nil if the unit does not exist. -- @return #AIRWING.Payload The payload table or nil if the unit does not exist.
function AIRWING:NewPayload(Unit, MissionTypes, Npayloads, Unlimited) function AIRWING:NewPayload(Unit, MissionTypes, Npayloads, Unlimited)
@@ -323,31 +337,52 @@ end
--- Add mission to queue. --- Add mission to queue.
-- @param #AIRWING self -- @param #AIRWING self
-- @param Ops.Auftrag#AUFTRAG Mission for this group. -- @param Ops.Auftrag#AUFTRAG Mission for this group.
-- @param #number Nassets Number of required assets for this mission. Default 1.
-- @param Core.Point#COORDINATE WaypointCoordinate Coordinate of the mission waypoint.
-- @return #AIRWING self -- @return #AIRWING self
function AIRWING:AddMission(Mission, Nassets, WaypointCoordinate) function AIRWING:AddMission(Mission)
-- Number of assets.
Mission.nassets=Mission.nassets and Mission.nassets or (Nassets or 1)
Mission.waypointcoord=WaypointCoordinate
Mission.waypointindex=nil
-- Set status to QUEUED. -- Set status to QUEUED.
Mission:Queued() Mission:Queued()
-- Set airwing.
Mission.airwing=self
-- Add mission to queue. -- Add mission to queue.
table.insert(self.missionqueue, Mission) table.insert(self.missionqueue, Mission)
-- Info text. -- Info text.
local text=string.format("Added %s mission %s at waypoint #%s. Starting at %s. Stopping at %s", local text=string.format("Added %s mission %s. Starting at %s. Stopping at %s",
tostring(Mission.type), tostring(Mission.name), tostring(Mission.waypointindex), UTILS.SecondsToClock(Mission.Tstart, true), Mission.Tstop and UTILS.SecondsToClock(Mission.Tstop, true) or "never") tostring(Mission.type), tostring(Mission.name), UTILS.SecondsToClock(Mission.Tstart, true), Mission.Tstop and UTILS.SecondsToClock(Mission.Tstop, true) or "never")
self:I(self.lid..text) self:I(self.lid..text)
return self return self
end end
--- Set CAP zones.
-- @param #AIRWING self
-- @param #number n Number of flights. Default 1.
-- @return #AIRWING self
function AIRWING:SetCAPflights(n)
self.nflightsCAP=n
return self
end
--- Add a CAP zone.
-- @param #AIRWING self
-- @param Core.Zone#ZONE AcceptZone Add a zone to the CAP zone set.
-- @return #AIRWING self
function AIRWING:AddCAPPoint(Coordinate, Heading, Leg, Speed)
local cappoint={} --#AIRWING.PatrolData
cappoint.coord=Coordinate
cappoint.heading=Heading or 090
cappoint.leg=Leg or 15
cappoint.speed=Speed or 350
table.insert(self.cappoints, cappoint)
return self
end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Start & Status -- Start & Status
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -362,12 +397,17 @@ function AIRWING:onafterStart(From, Event, To)
-- Info. -- Info.
self:I(self.lid..string.format("Starting AIRWING v%s", AIRWING.version)) self:I(self.lid..string.format("Starting AIRWING v%s", AIRWING.version))
-- Add F10 radio menu. -- Menu.
self:_SetMenuCoalition() if false then
for _,_squadron in pairs(self.squadrons) do -- Add F10 radio menu.
local squadron=_squadron --#AIRWING.Squadron self:_SetMenuCoalition()
self:_AddSquadonMenu(squadron)
for _,_squadron in pairs(self.squadrons) do
local squadron=_squadron --#AIRWING.Squadron
self:_AddSquadonMenu(squadron)
end
end end
end end
@@ -422,6 +462,8 @@ function AIRWING:onafterStatus(From, Event, To)
end end
self:I(self.lid..text) self:I(self.lid..text)
-------------- --------------
-- Mission --- -- Mission ---
-------------- --------------
@@ -471,7 +513,7 @@ function AIRWING:_GetNextMission()
local can, assets=self:CanMission(mission.type, mission.nassets) local can, assets=self:CanMission(mission.type, mission.nassets)
-- Debug output. -- Debug output.
self:T3({self.lid.."Mission check:", MissionStatusScheduled=mission.status==AUFTRAG.Status.SCHEDULED, TstartPassed=time>=mission.Tstart, CanMission=can, Nassets=#assets}) self:T3({self.lid.."Mission check:", TstartPassed=time>=mission.Tstart, CanMission=can, Nassets=#assets})
-- Check that mission is still scheduled, time has passed and enough assets are available. -- Check that mission is still scheduled, time has passed and enough assets are available.
if can then if can then
@@ -494,8 +536,6 @@ function AIRWING:_GetNextMission()
end end
table.insert(mission.assets, asset) table.insert(mission.assets, asset)
asset.mission=mission
end end
return mission return mission
@@ -609,7 +649,7 @@ function AIRWING:onafterMissionCancel(From, Event, To, Mission)
end end
--- On after "MissionRequest" event. Performs a self request to the warehouse for the mission assets. Sets mission status to ASSIGNED. --- On after "MissionRequest" event. Performs a self request to the warehouse for the mission assets. Sets mission status to REQUESTED.
-- @param #AIRWING self -- @param #AIRWING self
-- @param #string From From state. -- @param #string From From state.
-- @param #string Event Event. -- @param #string Event Event.
@@ -617,12 +657,14 @@ end
-- @param Ops.Auftrag#AUFTRAG Mission The requested mission. -- @param Ops.Auftrag#AUFTRAG Mission The requested mission.
function AIRWING:onafterMissionRequest(From, Event, To, Mission) function AIRWING:onafterMissionRequest(From, Event, To, Mission)
-- Set mission status to ASSIGNED. -- Set mission status from QUEUED to REQUESTED. Ensures that it is not considered in the next selection.
Mission:Requested() Mission:Requested()
---
-- Some assets might already be spawned and even on a different mission (orbit). -- Some assets might already be spawned and even on a different mission (orbit).
-- Need to dived to set into spawned and instock assets and handle the other -- Need to dived to set into spawned and instock assets and handle the other
---
-- Assets to be requested -- Assets to be requested
local Assetlist={} local Assetlist={}
@@ -633,7 +675,7 @@ function AIRWING:onafterMissionRequest(From, Event, To, Mission)
if asset.flightgroup then if asset.flightgroup then
--TODO: cancel current mission if there is any! --TODO: cancel current mission if there is any!
asset.flightgroup:AddMission(Mission, Mission.waypointcoord, Mission.waypointindex) asset.flightgroup:AddMission(Mission)
else else
self:E(self.lid.."ERROR: flight group for asset does NOT exist!") self:E(self.lid.."ERROR: flight group for asset does NOT exist!")
end end
@@ -646,12 +688,18 @@ function AIRWING:onafterMissionRequest(From, Event, To, Mission)
-- Add request to airwing warehouse. -- Add request to airwing warehouse.
if #Assetlist>0 then if #Assetlist>0 then
-- Add request to airwing warehouse.
-- TODO: better Assignment string.
self:AddRequest(self, WAREHOUSE.Descriptor.ASSETLIST, Assetlist, #Assetlist, nil, nil, Mission.prio, tostring(Mission.auftragsnummer)) self:AddRequest(self, WAREHOUSE.Descriptor.ASSETLIST, Assetlist, #Assetlist, nil, nil, Mission.prio, tostring(Mission.auftragsnummer))
-- The queueid has been increased in the onafterAddRequest function. So we can simply use it here.
Mission.requestID=self.queueid
end end
end end
--- On after "Request" event. Spawns the necessary cargo and transport assets. --- On after "Request" event.
-- @param #AIRWING self -- @param #AIRWING self
-- @param #string From From state. -- @param #string From From state.
-- @param #string Event Event. -- @param #string Event Event.
@@ -702,7 +750,7 @@ function AIRWING:onafterAssetSpawned(From, Event, To, group, asset, request)
if mission then if mission then
-- Add mission to flightgroup queue. -- Add mission to flightgroup queue.
asset.flightgroup:AddMission(mission, mission.waypointcoord, mission.waypointindex) asset.flightgroup:AddMission(mission)
end end
end end
+76 -23
View File
@@ -20,8 +20,6 @@
-- @field #number auftragsnummer Auftragsnummer. -- @field #number auftragsnummer Auftragsnummer.
-- @field #string type Mission type. -- @field #string type Mission type.
-- @field #string status Mission status. -- @field #string status Mission status.
-- @field #table flightstatus Status of flight missions.
-- @field #table flightgroups Flight groups of this mission.
-- @field #table flightdata Flight specific data. -- @field #table flightdata Flight specific data.
-- @field #string name Mission name. -- @field #string name Mission name.
-- @field #number prio Mission priority. -- @field #number prio Mission priority.
@@ -33,8 +31,6 @@
-- @field #table DCStask DCS task structure. -- @field #table DCStask DCS task structure.
-- --
-- @field Core.Point#COORDINATE waypointcoord Coordinate of the waypoint task. -- @field Core.Point#COORDINATE waypointcoord Coordinate of the waypoint task.
-- @field #number waypointindex Waypoint number at which the task is executed.
-- @field Ops.FlightGroup#FLIGHTGROUP.Task waypointtask Waypoint task.
-- --
-- @field Core.Point#COORDINATE orbitCoord Coordinate where to orbit. -- @field Core.Point#COORDINATE orbitCoord Coordinate where to orbit.
-- @field #number orbitSpeed Orbit speed in m/s. -- @field #number orbitSpeed Orbit speed in m/s.
@@ -61,6 +57,7 @@
-- @field #string squadname Name of the assigned Airwing squadron. -- @field #string squadname Name of the assigned Airwing squadron.
-- @field #table assets Airwing Assets assigned for this mission. -- @field #table assets Airwing Assets assigned for this mission.
-- @field #number nassets Number of required assets by the Airwing. -- @field #number nassets Number of required assets by the Airwing.
-- @field #number requestID The ID of the queued warehouse request. Necessary to cancel the request if the mission was cancelled before the request is processed.
-- --
-- @field #number optionROE ROE. -- @field #number optionROE ROE.
-- @field #number optionROT ROT. -- @field #number optionROT ROT.
@@ -98,8 +95,6 @@ AUFTRAG = {
Debug = false, Debug = false,
lid = nil, lid = nil,
auftragsnummer = nil, auftragsnummer = nil,
flightgroups = {},
flightstatus = {},
flightdata = {}, flightdata = {},
} }
@@ -177,14 +172,16 @@ AUFTRAG.Status={
-- @field #string STARTED Flightgroup started this mission but it is not executed yet. -- @field #string STARTED Flightgroup started this mission but it is not executed yet.
-- @field #string EXECUTING Flightgroup is executing this mission. -- @field #string EXECUTING Flightgroup is executing this mission.
-- @field #string DONE Mission task of the flightgroup is done. -- @field #string DONE Mission task of the flightgroup is done.
-- @field #string CANCELLED Mission was cancelled.
AUFTRAG.FlightStatus={ AUFTRAG.FlightStatus={
SCHEDULED="scheduled", SCHEDULED="scheduled",
STARTED="started", STARTED="started",
EXECUTING="executing", EXECUTING="executing",
DONE="done", DONE="done",
CANCELLED="cancelled",
} }
--- Flight specific data. --- Flight specific data. Each flight subscribed to this mission has different data for this.
-- @type AUFTRAG.FlightData -- @type AUFTRAG.FlightData
-- @field Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group. -- @field Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @field Core.Point#COORDINATE waypointcoordinate Waypoint coordinate. -- @field Core.Point#COORDINATE waypointcoordinate Waypoint coordinate.
@@ -195,7 +192,7 @@ AUFTRAG.FlightStatus={
--- AUFTRAG class version. --- AUFTRAG class version.
-- @field #string version -- @field #string version
AUFTRAG.version="0.0.3" AUFTRAG.version="0.0.4"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list -- TODO list
@@ -204,6 +201,8 @@ AUFTRAG.version="0.0.3"
-- TODO: Mission ROE and ROT -- TODO: Mission ROE and ROT
-- TODO: Mission formation, etc. -- TODO: Mission formation, etc.
-- TODO: FSM events. -- TODO: FSM events.
-- TODO: F10 marker functions that are updated on Status event.
-- TODO: Evaluate mission result ==> SUCCESS/FAILURE
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Constructor -- Constructor
@@ -505,17 +504,45 @@ end
function AUFTRAG:AddFlightGroup(FlightGroup) function AUFTRAG:AddFlightGroup(FlightGroup)
self:I(self.lid..string.format("Adding flight group %s", FlightGroup.groupname)) self:I(self.lid..string.format("Adding flight group %s", FlightGroup.groupname))
--table.insert(self.flightgroups, FlightGroup)
local flightdata={} --#AUFTRAG.FlightData local flightdata={} --#AUFTRAG.FlightData
flightdata.flightgroup=FlightGroup flightdata.flightgroup=FlightGroup
flightdata.status=AUFTRAG.FlightStatus.SCHEDULED flightdata.status=AUFTRAG.FlightStatus.SCHEDULED
flightdata.waypointcoordinate=nil flightdata.waypointcoordinate=nil
flightdata.waypointindex=nil
flightdata.waypointtask=nil
self.flightdata[FlightGroup.groupname]=flightdata self.flightdata[FlightGroup.groupname]=flightdata
end end
--- Check if mission is PLANNED.
-- @param #AUFTRAG self
-- @return #boolean If true, mission is in the planning state.
function AUFTRAG:IsPlanned()
return self.status==AUFTRAG.Status.PLANNED
end
--- Check if mission is QUEUED at an AIRWING mission queue.
-- @param #AUFTRAG self
-- @return #boolean If true, mission is queued.
function AUFTRAG:IsQueued()
return self.status==AUFTRAG.Status.QUEUED
end
--- Check if mission is REQUESTED, i.e. request for WAREHOUSE assets is done.
-- @param #AUFTRAG self
-- @return #boolean If true, mission is requested.
function AUFTRAG:IsRequested()
return self.status==AUFTRAG.Status.REQUESTED
end
--- Check if mission is SCHEDULED, i.e. request for WAREHOUSE assets is done.
-- @param #AUFTRAG self
-- @return #boolean If true, mission is queued.
function AUFTRAG:IsScheduled()
return self.status==AUFTRAG.Status.SCHEDULED
end
--- Check if mission is executing. --- Check if mission is executing.
-- @param #AUFTRAG self -- @param #AUFTRAG self
-- @return #boolean If true, mission is currently executing. -- @return #boolean If true, mission is currently executing.
@@ -523,6 +550,20 @@ function AUFTRAG:IsExecuting()
return self.status==AUFTRAG.Status.EXECUTING return self.status==AUFTRAG.Status.EXECUTING
end end
--- Check if mission was cancelled.
-- @param #AUFTRAG self
-- @return #boolean If true, mission was cancelled.
function AUFTRAG:IsCancelled()
return self.status==AUFTRAG.Status.CANCELLED
end
--- Check if mission is done.
-- @param #AUFTRAG self
-- @return #boolean If true, mission is done.
function AUFTRAG:IsCancelled()
return self.status==AUFTRAG.Status.DONE
end
--- Check if mission is over. This could be state DONE or CANCELLED. --- Check if mission is over. This could be state DONE or CANCELLED.
-- @param #AUFTRAG self -- @param #AUFTRAG self
-- @return #boolean If true, mission is currently executing. -- @return #boolean If true, mission is currently executing.
@@ -544,8 +585,14 @@ end
function AUFTRAG:onafterStatus(From, Event, To) function AUFTRAG:onafterStatus(From, Event, To)
local fsmstate=self:GetState() local fsmstate=self:GetState()
local Ntargets=self:CountMissionTargets()
local Cstart=UTILS.SecondsToClock(self.Tstart, true)
local Cstop=self.Tstop and UTILS.SecondsToClock(self.Tstop, true) or "INF"
self:I(self.lid..string.format("FSM status %s, mission status=%s, flightgroups=%d", fsmstate, self.status, #self.flightdata)) -- Info message.
self:I(self.lid..string.format("FSM state %s (Mstatus=%s): T=%s-%s flights=%d, targets=%d", fsmstate, self.status, Cstart, Cstop, #self.flightdata, Ntargets))
self:__Status(-30) self:__Status(-30)
end end
@@ -605,10 +652,16 @@ end
-- @return #boolean If true, all flights are done with the mission. -- @return #boolean If true, all flights are done with the mission.
function AUFTRAG:CheckFlightsDone() function AUFTRAG:CheckFlightsDone()
-- These are early stages, where we might not even have a flightgroup defined to be checked.
if self:IsPlanned() or self:IsQueued() or self:IsRequested() then
return false
end
local done=true local done=true
for groupname,status in pairs(self.flightstatus) do for groupname,data in pairs(self.flightdata) do
if status~=AUFTRAG.Status.DONE then local flightdata=data --#AUFTRAG.FlightData
if flightdata.status~=AUFTRAG.FlightStatus.DONE and flightdata.status~=AUFTRAG.FlightStatus.CANCELLED then
done=false done=false
end end
end end
@@ -703,16 +756,16 @@ function AUFTRAG:onafterCancel(From, Event, To)
self.status=AUFTRAG.Status.CANCELLED self.status=AUFTRAG.Status.CANCELLED
self:I(self.lid..string.format("New mission status=%s", self.status)) self:I(self.lid..string.format("New mission status=%s", self.status))
--[[ if self.airwing then
for _,_asset in pairs(self.assets or {}) do
local asset=_asset --Ops.AirWing#AIRWING.SquadronAsset
asset.flightgroup:MissionCancel(self)
end
]]
for _,_flightdata in pairs(self.flightdata) do self.airwing:MissionCancel(self)
local flightdata=_flightdata --#AUFTRAG.FlightData
flightdata.flightgroup:MissionCancel(self) else
for _,_flightdata in pairs(self.flightdata) do
local flightdata=_flightdata --#AUFTRAG.FlightData
flightdata.flightgroup:MissionCancel(self)
end
end end
end end
@@ -723,7 +776,7 @@ end
--- Count alive mission targets. --- Count alive mission targets.
-- @param #AUFTRAG self -- @param #AUFTRAG self
-- @param #number Number of alive targets. -- @return #number Number of alive targets.
function AUFTRAG:CountMissionTargets() function AUFTRAG:CountMissionTargets()
local N=0 local N=0
+38 -26
View File
@@ -656,18 +656,16 @@ end
--- Add mission to queue. --- Add mission to queue.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @param Ops.Auftrag#AUFTRAG Mission Mission for this group. -- @param Ops.Auftrag#AUFTRAG Mission Mission for this group.
-- @param Core.Point#COORDINATE WaypointCoordinate Coordinate of the mission waypoint
-- @param #number WaypointIndex The waypoint number. Default is after all current air waypoints.
-- @return #FLIGHTGROUP self -- @return #FLIGHTGROUP self
function FLIGHTGROUP:AddMission(Mission, WaypointCoordinate) function FLIGHTGROUP:AddMission(Mission)
Mission.waypointcoord=WaypointCoordinate
-- Add flight group to mission. -- Add flight group to mission.
Mission:AddFlightGroup(self) Mission:AddFlightGroup(self)
-- Set status to scheduled. -- Set flight status to SCHEDULED..
Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.SCHEDULED) Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.SCHEDULED)
-- Set mission status to SCHEDULED.
Mission:Scheduled() Mission:Scheduled()
-- Add mission to queue. -- Add mission to queue.
@@ -2539,7 +2537,7 @@ function FLIGHTGROUP:onafterRTB(From, Event, To, airbase, SpeedTo, SpeedHold, Sp
wp[#wp+1]=pland:WaypointAirLanding(UTILS.KnotsToKmph(SpeedLand), airbase, {}, "Landing") wp[#wp+1]=pland:WaypointAirLanding(UTILS.KnotsToKmph(SpeedLand), airbase, {}, "Landing")
-- Respawn? -- Respawn?
if fc then if fc or world.event.S_EVENT_KILL then
-- Just route the group. Respawn will happen when going from holding to final. -- Just route the group. Respawn will happen when going from holding to final.
self:Route(wp, 1) self:Route(wp, 1)
@@ -3004,6 +3002,7 @@ function FLIGHTGROUP:onafterTaskCancel(From, Event, To, Task)
-- Get current task. -- Get current task.
local currenttask=self:GetTaskCurrent() local currenttask=self:GetTaskCurrent()
-- If no task, we take the current task. But this could also be *nil*!
Task=Task or currenttask Task=Task or currenttask
if Task then if Task then
@@ -3020,12 +3019,20 @@ function FLIGHTGROUP:onafterTaskCancel(From, Event, To, Task)
Task.stopflag:Set(1) Task.stopflag:Set(1)
else else
self:I(self.lid..string.format("TaskCancel: Setting task %s ID=%d to DONE", Task.description, Task.id)) -- Set task status to DONE (we have no CANCELLED defined yet).
Task.status=FLIGHTGROUP.TaskStatus.DONE Task.status=FLIGHTGROUP.TaskStatus.DONE
-- Debug info.
self:I(self.lid..string.format("TaskCancel: Setting task %s ID=%d to DONE", Task.description, Task.id))
-- Is this a waypoint task?
if Task.type==FLIGHTGROUP.TaskType.WAYPOINT and Task.waypoint then if Task.type==FLIGHTGROUP.TaskType.WAYPOINT and Task.waypoint then
self:RemoveWaypoint(Task.waypoint)
-- Check that this is a mission waypoint and no other tasks are defined here.
if self:GetMissionByTaskID(Task.id) and #self:GetTasksWaypoint(Task.waypoint) then
self:RemoveWaypoint(Task.waypoint)
end
end end
end end
@@ -3136,9 +3143,10 @@ function FLIGHTGROUP:onafterMissionStart(From, Event, To, Mission)
-- Set current mission. -- Set current mission.
self.currentmission=Mission.auftragsnummer self.currentmission=Mission.auftragsnummer
-- Set mission status. -- Set flight mission status to STARTED.
Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.STARTED) Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.STARTED)
-- Set mission status to STARTED.
Mission:Started() Mission:Started()
-- Route flight to mission zone. -- Route flight to mission zone.
@@ -3158,8 +3166,10 @@ function FLIGHTGROUP:onafterMissionExecute(From, Event, To, Mission)
self:I(self.lid..text) self:I(self.lid..text)
MESSAGE:New(text, 120, "DEBUG"):ToAllIf(true) MESSAGE:New(text, 120, "DEBUG"):ToAllIf(true)
-- Set mission status. -- Set flight mission status to EXECUTING.
Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.EXECUTING) Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.EXECUTING)
-- Set mission status to EXECUTING.
Mission:Executing() Mission:Executing()
end end
@@ -3174,25 +3184,30 @@ function FLIGHTGROUP:onafterMissionCancel(From, Event, To, Mission)
if self.currentmission and Mission.auftragsnummer==self.currentmission then if self.currentmission and Mission.auftragsnummer==self.currentmission then
-- Get mission waypoint task.
local Task=Mission:GetFlightWaypointTask(self) local Task=Mission:GetFlightWaypointTask(self)
env.info(string.format("FF Cancel current mission %s. Task=%s", tostring(Mission.name), tostring(Task and Task.description or "WTF"))) env.info(string.format("FF Cancel current mission %s. Task=%s", tostring(Mission.name), tostring(Task and Task.description or "WTF")))
-- Cancelling the mission is actually cancelling the current task. This will trigger the task done. -- Cancelling the mission is actually cancelling the current task.
-- Note that two things can happen.
-- 1.) Flight is still on the way to the waypoint (status should be STARTED). In this case there would not be a current task!
-- 2.) Flight already passed the mission waypoint (status should be EXECUTING).
self:TaskCancel(Task) self:TaskCancel(Task)
-- Set current mission to nil.
self.currentmission=nil self.currentmission=nil
else else
-- Not the current mission. So set status in queue. -- Not the current mission.
-- TODO: remove mission from queue? -- TODO: remove mission from queue?
end end
-- Set missin flight status. -- Set missin flight status.
env.info("FF setting mission to cancelled") env.info("FF setting mission to cancelled")
Mission:SetFlightStatus(self, AUFTRAG.Status.CANCELLED) Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.CANCELLED)
end end
@@ -3207,14 +3222,6 @@ function FLIGHTGROUP:onafterMissionDone(From, Event, To, Mission)
-- Set Flight status. -- Set Flight status.
Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.DONE) Mission:SetFlightStatus(self, AUFTRAG.FlightStatus.DONE)
-- TODO: This has to be done in AUFTRAG.
--[[
local airwing=self:GetAirWing()
if airwing then
airwing:MissionDone(Mission)
end
]]
-- Set current mission to nil. -- Set current mission to nil.
self.currentmission=nil self.currentmission=nil
@@ -3233,9 +3240,14 @@ function FLIGHTGROUP:RouteToMission(mission, delay)
-- Next waypoint. -- Next waypoint.
local nextwaypoint=self.currentwp+1 local nextwaypoint=self.currentwp+1
-- Create waypoint coordinate half way between us and the target.
local targetcoord=mission:GetTargetCoordinate()
local flightcoord=self.group:GetCoordinate()
local waypointcoord=flightcoord:GetIntermediateCoordinate(targetcoord, 0.5)
-- Add waypoint. -- Add waypoint.
self:AddWaypointAir(mission.waypointcoord, nextwaypoint, self.speedmax*0.8, false) self:AddWaypointAir(waypointcoord, nextwaypoint, self.speedmax*0.8, false)
-- Add waypoint task. UpdateRoute is called inside. -- Add waypoint task. UpdateRoute is called inside.
local waypointtask=self:AddTaskWaypoint(mission.DCStask, nextwaypoint, mission.name, mission.prio, mission.duration) local waypointtask=self:AddTaskWaypoint(mission.DCStask, nextwaypoint, mission.name, mission.prio, mission.duration)
@@ -3244,7 +3256,7 @@ function FLIGHTGROUP:RouteToMission(mission, delay)
mission:SetFlightWaypointTask(self, waypointtask) mission:SetFlightWaypointTask(self, waypointtask)
-- TODO: better marker text, mission.maker -- TODO: better marker text, mission.maker
mission.marker=mission.waypointcoord:MarkToCoalition(mission.name, self:GetCoalition(), true) mission.marker=waypointcoord:MarkToCoalition(mission.name, self:GetCoalition(), true)
--self:SetROE(mission.optionROE) --self:SetROE(mission.optionROE)
@@ -3781,7 +3793,7 @@ function FLIGHTGROUP:GetMissionByTaskID(taskid)
for _,_mission in pairs(self.missionqueue) do for _,_mission in pairs(self.missionqueue) do
local mission=_mission --Ops.Auftrag#AUFTRAG local mission=_mission --Ops.Auftrag#AUFTRAG
local task=mission.waypointtask local task=mission:GetFlightWaypointTask(self)
if task and task.id and task.id==taskid then if task and task.id and task.id==taskid then
return mission return mission
@@ -232,12 +232,14 @@ function INTEL:onafterStatus(From, Event, To)
-- FSM state. -- FSM state.
local fsmstate=self:GetState() local fsmstate=self:GetState()
-- Fresh arrays.
self.ContactsLost={} self.ContactsLost={}
self.ContactsUnknown={} self.ContactsUnknown={}
-- Check if group has detected any units. -- Check if group has detected any units.
self:UpdateIntel() self:UpdateIntel()
-- Number of total contacts.
local Ncontacts=#self.Contacts local Ncontacts=#self.Contacts
-- Short info. -- Short info.
+4 -14
View File
@@ -54,7 +54,7 @@ WINGCOMMANDER = {
--- WINGCOMMANDER class version. --- WINGCOMMANDER class version.
-- @field #string version -- @field #string version
WINGCOMMANDER.version="0.0.1" WINGCOMMANDER.version="0.0.2"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list -- TODO list
@@ -79,13 +79,6 @@ function WINGCOMMANDER:New(AgentSet)
-- Set some string id for output to DCS.log file. -- Set some string id for output to DCS.log file.
self.lid=string.format("WINGCOMMANDER | ") self.lid=string.format("WINGCOMMANDER | ")
-- Start State.
--self:SetStartState("Stopped")
-- Add FSM transitions.
-- From State --> Event --> To State
--self:AddTransition("Stopped", "Start", "Running") -- Start FSM.
------------------------ ------------------------
--- Pseudo Functions --- --- Pseudo Functions ---
@@ -192,7 +185,7 @@ function WINGCOMMANDER:onafterStatus(From, Event, To)
if contact.mission and contact.mission.airwing then if contact.mission and contact.mission.airwing then
-- Cancel this mission. -- Cancel this mission.
contact.mission.airwing:MissionCancel(contact.mission) contact.mission:Cancel()
end end
@@ -314,14 +307,11 @@ function WINGCOMMANDER:CheckMissionQueue()
end end
table.sort(airwings, sortdist) table.sort(airwings, sortdist)
-- This is the closest airwing to the target.
local airwing=airwings[1].airwing --Ops.AirWing#AIRWING local airwing=airwings[1].airwing --Ops.AirWing#AIRWING
local targetcoord=airwings[1].targetcoord --Core.Point#COORDINATE
-- Get waypoint coordinate. This is where the mission is actually executed.
local WaypointCoordinate=airwing:GetCoordinate():GetIntermediateCoordinate(targetcoord, 0.5)
-- Add mission to airwing. -- Add mission to airwing.
airwing:AddMission(mission, Nassets, WaypointCoordinate) airwing:AddMission(mission)
return return
end end