From 905095add9869fe3559f772058aa7068e18b8a04 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 1 Mar 2020 22:48:09 +0100 Subject: [PATCH] Ops --- .../Moose/Functional/Warehouse.lua | 22 +- Moose Development/Moose/Ops/AirWing.lua | 51 ++-- Moose Development/Moose/Ops/Auftrag.lua | 69 ++++- Moose Development/Moose/Ops/FlightGroup.lua | 242 ++++++++++++------ 4 files changed, 263 insertions(+), 121 deletions(-) diff --git a/Moose Development/Moose/Functional/Warehouse.lua b/Moose Development/Moose/Functional/Warehouse.lua index a41161291..32da69f94 100644 --- a/Moose Development/Moose/Functional/Warehouse.lua +++ b/Moose Development/Moose/Functional/Warehouse.lua @@ -1763,7 +1763,7 @@ _WAREHOUSEDB = { --- Warehouse class version. -- @field #string version -WAREHOUSE.version="0.9.9" +WAREHOUSE.version="1.0.0" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO: Warehouse todo list. @@ -1835,7 +1835,7 @@ function WAREHOUSE:New(warehouse, alias) local warehousename=warehouse warehouse=UNIT:FindByName(warehousename) if warehouse==nil then - env.info(string.format("No warehouse unit with name %s found trying static.", tostring(warehousename))) + --env.info(string.format("No warehouse unit with name %s found trying static.", tostring(warehousename))) warehouse=STATIC:FindByName(warehousename, true) self.isunit=false else @@ -1870,12 +1870,9 @@ function WAREHOUSE:New(warehouse, alias) -- Set unique ID for this warehouse. self.uid=_WAREHOUSEDB.WarehouseID - -- As Kalbuth found out, this would fail when using SPAWNSTATIC https://forums.eagle.ru/showthread.php?p=3703488#post3703488 - --self.uid=tonumber(warehouse:GetID()) - - -- Closest of the same coalition but within a certain range. + -- Closest of the same coalition but within 5 km range. local _airbase=self:GetCoordinate():GetClosestAirbase(nil, self:GetCoalition()) - if _airbase and _airbase:GetCoordinate():Get2DDistance(self:GetCoordinate()) < 3000 then + if _airbase and _airbase:GetCoordinate():Get2DDistance(self:GetCoordinate()) <= 5000 then self:SetAirbase(_airbase) end @@ -3354,7 +3351,7 @@ end function WAREHOUSE:onafterStatus(From, Event, To) -- Info. - self:I(self.lid..string.format("FSM state %s. Assets=%d (global %d). Requests waiting=%d, pending=%d", self:GetState(), #self.stock, #_WAREHOUSEDB.Assets, #self.queue, #self.pending)) + self:I(self.lid..string.format("State=%s, Assets=%d, Requests: waiting=%d, pending=%d", self:GetState(), #self.stock, #self.queue, #self.pending)) -- Check if any pending jobs are done and can be deleted from the queue. self:_JobDone() @@ -3729,8 +3726,7 @@ function WAREHOUSE:onafterAddAsset(From, Event, To, group, ngroups, forceattribu -- If no assignment was given we take the assignment of the request if there is any. if assignment==nil and request.assignment~=nil then - -- WARNING: not doing this any more - --assignment=request.assignment + assignment=request.assignment end end @@ -3760,7 +3756,7 @@ function WAREHOUSE:onafterAddAsset(From, Event, To, group, ngroups, forceattribu end -- Set skill. - asset.skill=skill + asset.skill=skill or asset.skill -- Asset is not spawned. asset.spawned=false @@ -3985,7 +3981,7 @@ end -- @param #WAREHOUSE.Assetitem asset The asset that has just been added. -- @param #string assignment The (optional) assignment for the asset. function WAREHOUSE:onafterNewAsset(From, Event, To, asset, assignment) - self:T(self.lid..string.format("New asset %s id=%d with assignment %s.", tostring(asset.templatename), asset.uid, tostring(assignment))) + self:I(self.lid..string.format("New asset %s id=%d with assignment %s.", tostring(asset.templatename), asset.uid, tostring(assignment))) end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -5608,7 +5604,7 @@ function WAREHOUSE:_SpawnAssetAircraft(alias, asset, request, parking, uncontrol end if asset.payload then - unit.payload.pylons=asset.payload.pylons + unit.payload=asset.payload.pylons end end diff --git a/Moose Development/Moose/Ops/AirWing.lua b/Moose Development/Moose/Ops/AirWing.lua index 2b5a0129c..5f7c3e623 100644 --- a/Moose Development/Moose/Ops/AirWing.lua +++ b/Moose Development/Moose/Ops/AirWing.lua @@ -72,7 +72,7 @@ AIRWING = { --- AIRWING class version. -- @field #string version -AIRWING.version="0.1.2" +AIRWING.version="0.1.3" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- ToDo list @@ -83,7 +83,7 @@ AIRWING.version="0.1.2" -- DONE: Build mission queue. -- DONE: Find way to start missions. -- TODO: Check if missions are accomplished. --- TODO: Payloads as resources. +-- DONE: Payloads as resources. -- TODO: Spawn in air or hot. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -332,10 +332,7 @@ function AIRWING:AddMission(Mission, Nassets, WaypointCoordinate) Mission.waypointindex=nil -- Set status to scheduled. - Mission.status=AUFTRAG.Status.QUEUED - - -- Todo call FSM event. - --Mission:Queue() + Mission:Queue() -- Add mission to queue. table.insert(self.missionqueue, Mission) @@ -370,8 +367,6 @@ function AIRWING:onafterStart(From, Event, To) self:_AddSquadonMenu(squadron) end - -- Init status updates. - --self:__AirwingStatus(-1) end --- Update status. @@ -408,20 +403,17 @@ function AIRWING:onafterStatus(From, Event, To) local asset=_asset --#AIRWING.SquadronAsset local assignment=asset.assignment or "none" local name=asset.templatename - local task=asset.mission and asset.mission.name or "none" local spawned=tostring(asset.spawned) local groupname=asset.spawngroupname - local group=nil --Wrapper.Group#GROUP local typename=asset.unittype - local fuel=100 - if groupname then - group=GROUP:FindByName(groupname) - if group then - fuel=group:GetFuelMin() - end - end - text=text..string.format("\n -[%d] %s*%d: spawned=%s, mission=%s, fuel=%d", j, typename, asset.nunits, spawned, task, fuel) + local mission=self:GetAssetCurrentMission(asset) + local missiontext="" + if mission then + missiontext=string.format(" [%s (%s): status=%s]", mission.type, mission.name, mission.status) + end + + text=text..string.format("\n -[%d] %s*%d: spawned=%s, mission=%s%s", j, typename, asset.nunits, spawned, tostring(self:IsAssetOnMission(asset)), missiontext) end end @@ -439,7 +431,6 @@ function AIRWING:onafterStatus(From, Event, To) self:MissionRequest(mission) end - --self:__AirwingStatus(-30) end --- Get next mission. @@ -578,9 +569,9 @@ function AIRWING:onafterNewAsset(From, Event, To, asset, assignment) self:GetParent(self).onafterNewAsset(self, From, Event, To, asset, assignment) -- Get squadron. - local squad=self:GetSquadron(assignment) + local squad=self:GetSquadron(asset.assignment) - if squad then + if squad and asset.assignment==assignment then -- TODO: Check if asset is already part of the squadron. If an asset returns, it will be added again! @@ -615,7 +606,7 @@ end function AIRWING:onafterMissionRequest(From, Event, To, Mission) -- Set mission status to ASSIGNED. - Mission.status=AUFTRAG.Status.ASSIGNED + Mission:Assign() -- 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 @@ -812,7 +803,7 @@ function AIRWING:SquadronCanMission(Squadron, MissionType, Nassets) --- --TODO: This only checks if it has an ORBIT mission. It could have others as well! - if self:IsAssetOnMission(asset, AUFTRAG.Type.ORBIT) then + if self:IsAssetOnMission(asset, AUFTRAG.Type.ORBIT) and MissionType~=AUFTRAG.Type.ORBIT then -- Check if the payload of this asset is compatible with the mission. if self:CheckMissionType(MissionType, asset.payload.missiontypes) then @@ -891,6 +882,20 @@ function AIRWING:IsAssetOnMission(asset, MissionTypes) return false end +--- Get the current mission of the asset. +-- @param #AIRWING self +-- @param #AIRWING.SquadronAsset asset The asset. +-- @return Ops.Auftrag#AUFTRAG Current mission or *nil*. +function AIRWING:GetAssetCurrentMission(asset) + + if asset.flightgroup then + return asset.flightgroup:GetMissionCurrent() + end + + return nil +end + + --- Check if assets for a given mission type are available. -- @param #AIRWING self -- @param #string MissionType Type of mission. diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index b28058a74..b40dafa16 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -150,7 +150,7 @@ AUFTRAG.Status={ --- AUFTRAG class version. -- @field #string version -AUFTRAG.version="0.0.2" +AUFTRAG.version="0.0.3" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -439,6 +439,65 @@ end -- FSM Functions ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--- On after "Queue" event. +-- @param #AUFTRAG self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +function AUFTRAG:onafterQueue(From, Event, To) + self.status=AUFTRAG.Status.QUEUED + self:I(self.lid..string.format("New mission status=%s", self.status)) +end + +--- On after "Assign" event. +-- @param #AUFTRAG self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +function AUFTRAG:onafterAssign(From, Event, To) + self.status=AUFTRAG.Status.ASSIGNED + self:I(self.lid..string.format("New mission status=%s", self.status)) +end + +--- On after "Schedule" event. +-- @param #AUFTRAG self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +function AUFTRAG:onafterSchedule(From, Event, To) + self.status=AUFTRAG.Status.SCHEDULED + self:I(self.lid..string.format("New mission status=%s", self.status)) +end + +--- On after "Start" event. +-- @param #AUFTRAG self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +function AUFTRAG:onafterStart(From, Event, To) + self.status=AUFTRAG.Status.STARTED + self:I(self.lid..string.format("New mission status=%s", self.status)) +end + +--- On after "Execute" event. +-- @param #AUFTRAG self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +function AUFTRAG:onafterExecute(From, Event, To) + self.status=AUFTRAG.Status.EXECUTING + self:I(self.lid..string.format("New mission status=%s", self.status)) +end + +--- On after "Done" event. +-- @param #AUFTRAG self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +function AUFTRAG:onafterDone(From, Event, To) + self.status=AUFTRAG.Status.DONE + self:I(self.lid..string.format("New mission status=%s", self.status)) +end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Misc Functions @@ -468,13 +527,16 @@ end -- @param Core.Point#COORDINATE The target coordinate or nil. function AUFTRAG:GetTargetCoordinate() - if self.engageTargetGroupset then - + if self.engageTargetGroupset then local group=self.engageTargetGroupset:GetFirst() --Wrapper.Group#GROUP return group:GetCoordinate() elseif self.engageTargetUnitset then local unit=self.engageTargetUnitset:GetFirst() --Wrapper.Unit#UNIT return unit:GetCoordinate() + elseif self.engageCoord then + return self.engageCoord + elseif self.orbitCoord then + return self.orbitCoord end return nil @@ -661,6 +723,7 @@ function AUFTRAG:GetDCSMissionTask() end + -- Return the task. if #DCStasks==1 then return DCStasks[1] else diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index 5bf130f7b..b8dec0593 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -316,7 +316,7 @@ FLIGHTGROUP.TaskType={ --- FLIGHTGROUP class version. -- @field #string version -FLIGHTGROUP.version="0.3.2" +FLIGHTGROUP.version="0.3.3" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list @@ -407,7 +407,7 @@ function FLIGHTGROUP:New(groupname, autostart) self:AddTransition("*", "PassingWaypoint", "*") -- Group passed a waypoint. self:AddTransition("*", "GotoWaypoint", "*") -- Group switches to a specific waypoint. - self:AddTransition("*", "Orbit", "Orbiting") -- Group is orbiting. + self:AddTransition("*", "Wait", "Waiting") -- Group is orbiting. self:AddTransition("*", "FuelLow", "*") -- Fuel state of group is low. Default ~25%. self:AddTransition("*", "FuelCritical", "*") -- Fuel state of group is critical. Default ~10%. @@ -667,10 +667,8 @@ function FLIGHTGROUP:AddMission(Mission, WaypointCoordinate, WaypointIndex) Mission.waypointindex=WaypointIndex -- Set status to scheduled. - Mission.status=AUFTRAG.Status.SCHEDULED - - -- Route flight to mission zone. - --self:RouteToMission(Mission) + Mission:Schedule() + --Mission.status=AUFTRAG.Status.SCHEDULED -- Add mission to queue. table.insert(self.missionqueue, Mission) @@ -1319,9 +1317,9 @@ function FLIGHTGROUP:onafterFlightStatus(From, Event, To) end -- Output text for element. if task.type==FLIGHTGROUP.TaskType.SCHEDULED then - text=text..string.format("\n[%d] %s: %s: status=%s, scheduled=%s (%d sec), started=%s, duration=%d", i, taskid, name, status, clock, eta, started, duration) + text=text..string.format("\n[%d] %s (%s): status=%s, scheduled=%s (%d sec), started=%s, duration=%d", i, taskid, name, status, clock, eta, started, duration) elseif task.type==FLIGHTGROUP.TaskType.WAYPOINT then - text=text..string.format("\n[%d] %s: %s: status=%s, waypoint=%d, started=%s, duration=%d, stopflag=%d", i, taskid, name, status, task.waypoint, started, duration, task.stopflag:Get()) + text=text..string.format("\n[%d] %s (%s): status=%s, waypoint=%d, started=%s, duration=%d, stopflag=%d", i, taskid, name, status, task.waypoint, started, duration, task.stopflag:Get()) end end if #self.taskqueue>0 then @@ -1337,11 +1335,11 @@ function FLIGHTGROUP:onafterFlightStatus(From, Event, To) local mymission=Mission and Mission.name or "none" -- Current status. - local text=string.format("Missions=%d Current: %s", #self.missionqueue, mymission) + local text=string.format("Missions %d, Current: %s", self:CountRemainingMissison(), mymission) for i,_mission in pairs(self.missionqueue) do local mission=_mission --Ops.Auftrag#AUFTRAG local Cstart= UTILS.SecondsToClock(mission.Tstart, true) - local Cstop = mission.Tstop and UTILS.SecondsToClock(mission.Tstop, true) or "N/A" + local Cstop = mission.Tstop and UTILS.SecondsToClock(mission.Tstop, true) or "INF" text=text..string.format("\n[%d] %s (%s) status=%s, Time=%s-%s, waypoint=%s, prio=%d targets=%d", i, tostring(mission.name), mission.type, tostring(mission.status), Cstart, Cstop, tostring(mission.waypointindex), mission.prio, mission:CountMissionTargets()) end @@ -2310,11 +2308,11 @@ end -- @param #number n Waypoint number passed. -- @param #number N Final waypoint number. function FLIGHTGROUP:onafterPassingWaypoint(From, Event, To, n, N) - local text=string.format("Flight %s passed waypoint %d/%d", self.groupname, n, N) + local text=string.format("Flight passed waypoint %d/%d", n, N) self:I(self.lid..text) MESSAGE:New(text, 30, "DEBUG"):ToAllIf(self.Debug) - --[[ + if true then -- Get all waypoint tasks. local tasks=self:GetTasksWaypoint(n) @@ -2359,19 +2357,21 @@ function FLIGHTGROUP:onafterPassingWaypoint(From, Event, To, n, N) self:SetTask(self.group:TaskCombo(taskswp)) end - ]] + end -- Final AIR waypoint reached? - if n==N and false then + if n==N then - --TODO: Find better way to RTB! + --TODO: Find better way to RTB! + self:I(self.lid.."FF group passed final waypoint!") - -- Send flight to destination. + -- Send flight to destination. NOTE that if there are still remaining tasks, the RTB call is delayed by 10 sec until all tasks are done. if self.destbase then self:__RTB(-1, self.destbase) elseif self.destzone then self:__RTZ(-1, self.destzone) else + self:__Wait(-1) self:E(self.lid.."ERROR: Reached final waypoint but no destination set! Don't know what to do?!") end @@ -2406,28 +2406,6 @@ function FLIGHTGROUP:onafterGotoWaypoint(From, Event, To, n) end ---- On after "Orbit" event. --- @param #FLIGHTGROUP self --- @param #string From From state. --- @param #string Event Event. --- @param #string To To state. --- @param Core.Point#COORDINATE Coord Coordinate where to orbit. --- @param #number Altitude Altitude in meters. --- @param #number Speed Speed in km/h. -function FLIGHTGROUP:onafterOrbit(From, Event, To, Coord, Altitude, Speed) - - -- Debug message. - local text=string.format("Flight group set to orbit at altitude %d m and speed %.1f km/h", Altitude, Speed) - MESSAGE:New(text, 30, "DEBUG"):ToAllIf(self.Debug) - self:I(self.lid..text) - - --TODO: set ROE passive. introduce roe event/state/variable. - - local TaskOrbit=self.group:TaskOrbit(Coord, Altitude, UTILS.KmphToMps(Speed)) - - self:SetTask(TaskOrbit) -end - --- On before "RTB" event. -- @param #FLIGHTGROUP self -- @param #string From From state. @@ -2442,13 +2420,13 @@ function FLIGHTGROUP:onbeforeRTB(From, Event, To, airbase, SpeedTo, SpeedHold) local Tsuspend=nil if airbase==nil then - self:E(self.lid.."ERROR: Airbase is nil in Hold() call!") + self:E(self.lid.."ERROR: Airbase is nil in RTB() call!") allowed=false end -- Check that coaliton is okay. We allow same (blue=blue, red=red) or landing on neutral bases. if airbase and airbase:GetCoalition()~=self.group:GetCoalition() and airbase:GetCoalition()>0 then - self:E(self.lid.."ERROR: Wrong airbase coalition in Hold() call! We allow only same as group or neutral airbases.") + self:E(self.lid.."ERROR: Wrong airbase coalition in RTB() call! We allow only same as group or neutral airbases.") allowed=false end @@ -2456,19 +2434,19 @@ function FLIGHTGROUP:onbeforeRTB(From, Event, To, airbase, SpeedTo, SpeedHold) local Ntot,Nsched, Nwp=self:CountRemainingTasks() if self.taskcurrent>0 then - self:I(self.lid..string.format("WARNING: Got current task ==> Hold event is suspended for 10 sec.")) + self:I(self.lid..string.format("WARNING: Got current task ==> RTB event is suspended for 10 sec.")) Tsuspend=-10 allowed=false end if Nsched>0 then - self:I(self.lid..string.format("WARNING: Still got %d SCHEDULED tasks in the queue ==> Hold event is suspended for 10 sec.", Nsched)) + self:I(self.lid..string.format("WARNING: Still got %d SCHEDULED tasks in the queue ==> RTB event is suspended for 10 sec.", Nsched)) Tsuspend=-10 allowed=false end if Nwp>0 then - self:I(self.lid..string.format("WARNING: Still got %d WAYPOINT tasks in the queue ==> Hold event is suspended for 10 sec.", Nsched)) + self:I(self.lid..string.format("WARNING: Still got %d WAYPOINT tasks in the queue ==> RTB event is suspended for 10 sec.", Nwp)) Tsuspend=-10 allowed=false end @@ -2586,6 +2564,76 @@ function FLIGHTGROUP:onafterRTB(From, Event, To, airbase, SpeedTo, SpeedHold, Sp end +--- On before "Wait" event. +-- @param #FLIGHTGROUP self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +-- @param Core.Point#COORDINATE Coord Coordinate where to orbit. Default current position. +-- @param #number Altitude Altitude in feet. Default 10000 ft. +-- @param #number Speed Speed in knots. Default 250 kts. +function FLIGHTGROUP:onafterWait(From, Event, To, Coord, Altitude, Speed) + + local allowed=true + local Tsuspend=nil + + -- Check if there are remaining tasks. + local Ntot,Nsched, Nwp=self:CountRemainingTasks() + + if self.taskcurrent>0 then + self:I(self.lid..string.format("WARNING: Got current task ==> WAIT event is suspended for 10 sec.")) + Tsuspend=-10 + allowed=false + end + + if Nsched>0 then + self:I(self.lid..string.format("WARNING: Still got %d SCHEDULED tasks in the queue ==> WAIT event is suspended for 10 sec.", Nsched)) + Tsuspend=-10 + allowed=false + end + + if Nwp>0 then + self:I(self.lid..string.format("WARNING: Still got %d WAYPOINT tasks in the queue ==> WAIT event is suspended for 10 sec.", Nwp)) + Tsuspend=-10 + allowed=false + end + + if Tsuspend and not allowed then + self:__WAIT(Tsuspend, Coord, Altitude, Speed) + end + + return allowed +end + + +--- On after "Wait" event. +-- @param #FLIGHTGROUP self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +-- @param Core.Point#COORDINATE Coord Coordinate where to orbit. Default current position. +-- @param #number Altitude Altitude in feet. Default 10000 ft. +-- @param #number Speed Speed in knots. Default 250 kts. +function FLIGHTGROUP:onafterWait(From, Event, To, Coord, Altitude, Speed) + + Coord=Coord or self.group:GetCoordinate() + Altitude=Altitude or 10000 + Speed=Speed or 250 + + -- Debug message. + local text=string.format("Flight group set to wait/orbit at altitude %d m and speed %.1f km/h", Altitude, Speed) + MESSAGE:New(text, 30, "DEBUG"):ToAllIf(self.Debug) + self:I(self.lid..text) + + --TODO: set ROE passive. introduce roe event/state/variable. + + -- Orbit task. + local TaskOrbit=self.group:TaskOrbit(Coord, UTILS.FeetToMeters(Altitude), UTILS.KnotsToMps(Speed)) + + -- Set task. + self:SetTask(TaskOrbit) +end + --- On after "Holding" event. Flight arrived at the holding point. -- @param #FLIGHTGROUP self -- @param #string From From state. @@ -2819,8 +2867,9 @@ function FLIGHTGROUP:CountRemainingTasks() Ntot=Ntot+1 if task.type==FLIGHTGROUP.TaskType.WAYPOINT then + --TODO: maybe check that waypoint was not already passed? Nwp=Nwp+1 - elseif task.type==FLIGHTGROUP.TaskType.WAYPOINT then + elseif task.type==FLIGHTGROUP.TaskType.SCHEDULED then Nsched=Nsched+1 end @@ -2831,6 +2880,23 @@ function FLIGHTGROUP:CountRemainingTasks() return Ntot, Nsched, Nwp end +--- Count remaining missons. +-- @param #FLIGHTGROUP self +-- @return #number Number of missions to be done. +function FLIGHTGROUP:CountRemainingMissison() + + local N=0 + + -- Loop over mission queue. + for _,_mission in pairs(self.missionqueue) do + local mission=_mission --Ops.Auftrag#AUFTRAG + if mission.status~=AUFTRAG.Status.DONE then + N=N+1 + end + end + + return N +end --- On after TaskExecute event. -- @param #FLIGHTGROUP self @@ -2889,15 +2955,15 @@ function FLIGHTGROUP:onafterTaskExecute(From, Event, To, Task) -- Set task for group. self:SetTask(TaskFinal, 1) - - -- Get mission of this task (if any). - local Mission=self:GetMissionByTaskID(self.taskcurrent) - if Mission then - -- Set AUFTRAG status. - self:MissionExecute(Mission) - end end + + -- Get mission of this task (if any). + local Mission=self:GetMissionByTaskID(self.taskcurrent) + if Mission then + -- Set AUFTRAG status. + self:MissionExecute(Mission) + end end @@ -3058,7 +3124,8 @@ function FLIGHTGROUP:onafterMissionStart(From, Event, To, Mission) self.currentmission=Mission.auftragsnummer -- Set mission status. - Mission.status=AUFTRAG.Status.STARTED + Mission:Start() + --Mission.status=AUFTRAG.Status.STARTED -- Route flight to mission zone. self:RouteToMission(Mission, 5) @@ -3077,7 +3144,8 @@ function FLIGHTGROUP:onafterMissionExecute(From, Event, To, Mission) self:I(self.lid..text) MESSAGE:New(text, 120, "DEBUG"):ToAllIf(true) - Mission.status=AUFTRAG.Status.EXECUTING + Mission:Execute() + --Mission.status=AUFTRAG.Status.EXECUTING end @@ -3110,7 +3178,8 @@ function FLIGHTGROUP:onafterMissionDone(From, Event, To, Mission) -- TODO: evaluate mission success or failure! complicated! - Mission.status=AUFTRAG.Status.DONE + --Mission.status=AUFTRAG.Status.DONE + Mission:Done() local airwing=self:GetAirWing() if airwing then @@ -3659,20 +3728,29 @@ end -- @return Ops.Auftrag#AUFTRAG The mission. function FLIGHTGROUP:GetMissionByTaskID(taskid) - for _,_mission in pairs(self.missionqueue) do - local mission=_mission --Ops.Auftrag#AUFTRAG - - local task=mission.waypointtask - - if task and task.id and task.id==taskid then - return mission + if taskid then + for _,_mission in pairs(self.missionqueue) do + local mission=_mission --Ops.Auftrag#AUFTRAG + + local task=mission.waypointtask + + if task and task.id and task.id==taskid then + return mission + end + end - end - + return nil end +--- Get current mission. +-- @param #FLIGHTGROUP self +-- @return Ops.Auftrag#AUFTRAG The current mission or *nil*. +function FLIGHTGROUP:GetMissionCurrent() + return self:GetMissionByID(self.currentmission) +end + --- Get next waypoint of the flight group. -- @param #FLIGHTGROUP self @@ -3731,27 +3809,27 @@ function FLIGHTGROUP:_UpdateWaypointTasks() -- For some reason THIS DOES NOT WORK if executed at the last waypoint if it is an AIR WAYPOINT. -- I have moved it to the onafterpassingwaypoint function instead. - if true then + if false then - -- Get taks - local tasks=self:GetTasksWaypoint(i) - - for _,task in pairs(tasks) do - local Task=task --#FLIGHTGROUP.Task + -- Get taks + local tasks=self:GetTasksWaypoint(i) - -- Task execute. - table.insert(taskswp, self.group:TaskFunction("FLIGHTGROUP._TaskExecute", self, Task)) - - -- Stop condition if userflag is set to 1. - local TaskCondition=self.group:TaskCondition(nil, Task.stopflag:GetName(), 1, nil, Task.duration) - - -- Controlled task. - table.insert(taskswp, self.group:TaskControlled(Task.dcstask, TaskCondition)) - - -- Task done. - table.insert(taskswp, self.group:TaskFunction("FLIGHTGROUP._TaskDone", self, Task)) - - end + for _,task in pairs(tasks) do + local Task=task --#FLIGHTGROUP.Task + + -- Task execute. + table.insert(taskswp, self.group:TaskFunction("FLIGHTGROUP._TaskExecute", self, Task)) + + -- Stop condition if userflag is set to 1. + local TaskCondition=self.group:TaskCondition(nil, Task.stopflag:GetName(), 1, nil, Task.duration) + + -- Controlled task. + table.insert(taskswp, self.group:TaskControlled(Task.dcstask, TaskCondition)) + + -- Task done. + table.insert(taskswp, self.group:TaskFunction("FLIGHTGROUP._TaskDone", self, Task)) + + end end