Refactoring

This commit is contained in:
Frank
2020-05-21 00:16:19 +02:00
parent 3bb8f35f63
commit b26fb5ac19
2 changed files with 109 additions and 112 deletions
+108 -111
View File
@@ -25,7 +25,7 @@
-- @field #number auftragsnummer Auftragsnummer.
-- @field #string type Mission type.
-- @field #string status Mission status.
-- @field #table flightdata Flight specific data.
-- @field #table groupdata Flight specific data.
-- @field #string name Mission name.
-- @field #number prio Mission priority.
-- @field #boolean urgent Mission is urgent. Running missions with lower prio might be cancelled.
@@ -171,7 +171,7 @@ AUFTRAG = {
Debug = false,
lid = nil,
auftragsnummer = nil,
flightdata = {},
groupdata = {},
assets = {},
missionFraction = 0.5,
enrouteTasks = {},
@@ -321,19 +321,19 @@ AUFTRAG.TargetType={
-- @field #function func Callback function to check for a condition. Should return a #boolean.
-- @field #table arg Optional arguments passed to the condition callback function.
--- Flight specific data. Each flight subscribed to this mission has different data for this.
-- @type AUFTRAG.FlightData
-- @field Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
--- Group specific data. Each ops group subscribed to this mission has different data for this.
-- @type AUFTRAG.GroupData
-- @field Ops.OpsGroup#OPSGROUP opsgroup The OPS group.
-- @field Core.Point#COORDINATE waypointcoordinate Waypoint coordinate.
-- @field #number waypointindex Waypoint index.
-- @field Ops.FlightGroup#FLIGHTGROUP.Task waypointtask Waypoint task.
-- @field #string status Flight mission status.
-- @field Ops.OpsGroup#OPSGROUP.Task waypointtask Waypoint task.
-- @field #string status Group mission status.
-- @field Ops.AirWing#AIRWING.SquadronAsset asset The squadron asset.
--- AUFTRAG class version.
-- @field #string version
AUFTRAG.version="0.2.3"
AUFTRAG.version="0.3.0"
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TODO list
@@ -403,7 +403,7 @@ function AUFTRAG:New(Type)
self:AddTransition(AUFTRAG.Status.PLANNED, "Queued", AUFTRAG.Status.QUEUED) -- Mission is in queue of an AIRWING.
self:AddTransition(AUFTRAG.Status.QUEUED, "Requested", AUFTRAG.Status.REQUESTED) -- Mission assets have been requested from the warehouse.
self:AddTransition(AUFTRAG.Status.REQUESTED, "Scheduled", AUFTRAG.Status.SCHEDULED) -- Mission added to the first flight group queue.
self:AddTransition(AUFTRAG.Status.REQUESTED, "Scheduled", AUFTRAG.Status.SCHEDULED) -- Mission added to the first ops group queue.
self:AddTransition(AUFTRAG.Status.PLANNED, "Scheduled", AUFTRAG.Status.SCHEDULED) -- From planned directly to scheduled.
@@ -1438,35 +1438,35 @@ function AUFTRAG:AssignSquadrons(Squadrons)
end
--- Add a flight group to the mission.
--- Add a Ops group to the mission.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The FLIGHTGROUP object.
function AUFTRAG:AddFlightGroup(FlightGroup)
self:I(self.lid..string.format("Adding flight group %s", FlightGroup.groupname))
-- @param Ops.OpsGroup#OPSGROUP OpsGroup The OPSGROUP object.
function AUFTRAG:AddOpsGroup(OpsGroup)
self:I(self.lid..string.format("Adding Ops group %s", OpsGroup.groupname))
local flightdata={} --#AUFTRAG.FlightData
flightdata.flightgroup=FlightGroup
flightdata.status=AUFTRAG.GroupStatus.SCHEDULED
flightdata.waypointcoordinate=nil
flightdata.waypointindex=nil
flightdata.waypointtask=nil
local groupdata={} --#AUFTRAG.GroupData
groupdata.opsgroup=OpsGroup
groupdata.status=AUFTRAG.GroupStatus.SCHEDULED
groupdata.waypointcoordinate=nil
groupdata.waypointindex=nil
groupdata.waypointtask=nil
self.flightdata[FlightGroup.groupname]=flightdata
self.groupdata[OpsGroup.groupname]=groupdata
end
--- Remove a flight group to the mission.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The FLIGHTGROUP object.
function AUFTRAG:DelFlightGroup(FlightGroup)
self:I(self.lid..string.format("Removing flight group %s", FlightGroup and FlightGroup.groupname or "nil (ERROR)!"))
-- @param Ops.OpsGroup#OPSGROUP OpsGroup The OPSGROUP object.
function AUFTRAG:DelOpsGroup(OpsGroup)
self:I(self.lid..string.format("Removing OPS group %s", OpsGroup and OpsGroup.groupname or "nil (ERROR)!"))
if FlightGroup then
if OpsGroup then
-- Remove mission form flightgroup queue.
FlightGroup:RemoveMission(self)
OpsGroup:RemoveMission(self)
self.flightdata[FlightGroup.groupname]=nil
self.groupdata[OpsGroup.groupname]=nil
end
@@ -1500,7 +1500,7 @@ function AUFTRAG:IsScheduled()
return self.status==AUFTRAG.Status.SCHEDULED
end
--- Check if mission is STARTED, i.e. flight is on its way to the mission execution waypoint.
--- Check if mission is STARTED, i.e. group is on its way to the mission execution waypoint.
-- @param #AUFTRAG self
-- @return #boolean If true, mission is started.
function AUFTRAG:IsStarted()
@@ -1673,21 +1673,20 @@ end
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.AirWing#AIRWING Airwing The airwing.
function AUFTRAG:onafterStatus(From, Event, To)
-- Number of alive mission targets.
local Ntargets=self:CountMissionTargets()
-- Number of alive flights attached to this mission.
local Nflights=self:CountFlightGroups()
-- Number of alive groups attached to this mission.
local Ngroups=self:CountOpsGroups()
-- Check if mission is not OVER yet.
if self:IsNotOver() then
if self:CheckFlightsDone() then
-- All flights have reported MISSON DONE.
-- All groups have reported MISSON DONE.
self:Done()
elseif (self.Tstop and timer.getAbsTime()>self.Tstop+10) or (self.Ntargets>0 and Ntargets==0) then
@@ -1714,17 +1713,17 @@ function AUFTRAG:onafterStatus(From, Event, To)
local commander=self.wingcommander and tostring(self.wingcommander.coalition) or "N/A"
-- Info message.
self:I(self.lid..string.format("Status %s: Target=%s, T=%s-%s, assets=%d, flights=%d, targets=%d, wing=%s, commander=%s", self.status, targetname, Cstart, Cstop, #self.assets, Nflights, Ntargets, airwing, commander))
self:I(self.lid..string.format("Status %s: Target=%s, T=%s-%s, assets=%d, groups=%d, targets=%d, wing=%s, commander=%s", self.status, targetname, Cstart, Cstop, #self.assets, Ngroups, Ntargets, airwing, commander))
-- Check for error.
if fsmstate~=self.status then
self:E(self.lid..string.format("ERROR: FSM state %s != %s mission status!", fsmstate, self.status))
end
local text="Flight data:"
for groupname,_flightdata in pairs(self.flightdata) do
local flightdata=_flightdata --#AUFTRAG.FlightData
text=text..string.format("\n- %s: status mission=%s flightgroup=%s", groupname, flightdata.status, flightdata.flightgroup and flightdata.flightgroup:GetState() or "N/A")
local text="Group data:"
for groupname,_groupdata in pairs(self.groupdata) do
local groupdata=_groupdata --#AUFTRAG.GroupData
text=text..string.format("\n- %s: status mission=%s opsgroup=%s", groupname, groupdata.status, groupdata.opsgroup and groupdata.opsgroup:GetState() or "N/A")
end
self:I(self.lid..text)
@@ -1811,25 +1810,25 @@ end
--- Get asset data table.
-- @param #AUFTRAG self
-- @param #string AssetName Name of the asset.
-- @return #AUFTRAG.FlightData Flight data or nil if flightgroup does not exist.
-- @return #AUFTRAG.GroupData Flight data or nil if OPS group does not exist.
function AUFTRAG:GetAssetDataByName(AssetName)
return self.flightdata[tostring(AssetName)]
return self.groupdata[tostring(AssetName)]
end
--- Get flight data table.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @return #AUFTRAG.FlightData Flight data or nil if flightgroup does not exist.
-- @param Ops.OpsGroup#OPSGROUP flightgroup The flight group.
-- @return #AUFTRAG.GroupData Flight data or nil if flightgroup does not exist.
function AUFTRAG:GetFlightData(flightgroup)
if flightgroup and self.flightdata then
return self.flightdata[flightgroup.groupname]
if flightgroup and self.groupdata then
return self.groupdata[flightgroup.groupname]
end
return nil
end
--- Set flightgroup mission status.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @param Ops.OpsGroup#OPSGROUP flightgroup The flight group.
-- @param #string status New status.
function AUFTRAG:SetFlightStatus(flightgroup, status)
self:I(self.lid..string.format("Setting flight %s to status %s", flightgroup and flightgroup.groupname or "nil", tostring(status)))
@@ -1838,9 +1837,9 @@ function AUFTRAG:SetFlightStatus(flightgroup, status)
if self:GetFlightStatus(flightgroup)==AUFTRAG.GroupStatus.CANCELLED and status==AUFTRAG.GroupStatus.DONE then
-- Do not overwrite a CANCELLED status with a DONE status.
else
local flightdata=self:GetFlightData(flightgroup)
if flightdata then
flightdata.status=status
local groupdata=self:GetFlightData(flightgroup)
if groupdata then
groupdata.status=status
else
self:E(self.lid.."WARNING: Could not SET flight data for flight group. Setting status to DONE")
end
@@ -1861,17 +1860,17 @@ end
--- Get flightgroup mission status.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @param Ops.OpsGroup#OPSGROUP flightgroup The flight group.
function AUFTRAG:GetFlightStatus(flightgroup)
self:T3(self.lid..string.format("Trying to get Flight status for flight group %s", flightgroup and flightgroup.groupname or "nil"))
local flightdata=self:GetFlightData(flightgroup)
local groupdata=self:GetFlightData(flightgroup)
if flightdata then
return flightdata.status
if groupdata then
return groupdata.status
else
self:E(self.lid..string.format("WARNING: Could not GET flightdata for flightgroup %s. Returning status DONE.", flightgroup and flightgroup.groupname or "nil"))
self:E(self.lid..string.format("WARNING: Could not GET groupdata for flightgroup %s. Returning status DONE.", flightgroup and flightgroup.groupname or "nil"))
return AUFTRAG.GroupStatus.DONE
end
@@ -1880,12 +1879,12 @@ end
--- Set flightgroup waypoint coordinate.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @param Ops.OpsGroup#OPSGROUP flightgroup The flight group.
-- @param Core.Point#COORDINATE coordinate Waypoint Coordinate.
function AUFTRAG:SetFlightWaypointCoordinate(flightgroup, coordinate)
local flightdata=self:GetFlightData(flightgroup)
if flightdata then
flightdata.waypointcoordinate=coordinate
local groupdata=self:GetFlightData(flightgroup)
if groupdata then
groupdata.waypointcoordinate=coordinate
end
end
@@ -1893,56 +1892,56 @@ end
-- @param #AUFTRAG self
-- @return Core.Point#COORDINATE Waypoint Coordinate.
function AUFTRAG:GetFlightWaypointCoordinate(flightgroup)
local flightdata=self:GetFlightData(flightgroup)
if flightdata then
return flightdata.waypointcoordinate
local groupdata=self:GetFlightData(flightgroup)
if groupdata then
return groupdata.waypointcoordinate
end
end
--- Set flightgroup waypoint task.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @param Ops.FlightGroup#FLIGHTGROUP.Task task Waypoint task.
-- @param Ops.OpsGroup#OPSGROUP flightgroup The flight group.
-- @param Ops.OpsGroup#OPSGROUP.Task task Waypoint task.
function AUFTRAG:SetFlightWaypointTask(flightgroup, task)
self:I(self.lid..string.format("Setting waypoint task %s", task and task.description or "WTF"))
local flightdata=self:GetFlightData(flightgroup)
if flightdata then
flightdata.waypointtask=task
local groupdata=self:GetFlightData(flightgroup)
if groupdata then
groupdata.waypointtask=task
end
end
--- Get flightgroup waypoint task.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @return Ops.FlightGroup#FLIGHTGROUP.Task task Waypoint task. Waypoint task.
-- @param Ops.OpsGroup#OPSGROUP flightgroup The flight group.
-- @return Ops.OpsGroup#OPSGROUP.Task task Waypoint task. Waypoint task.
function AUFTRAG:GetFlightWaypointTask(flightgroup)
local flightdata=self:GetFlightData(flightgroup)
if flightdata then
return flightdata.waypointtask
local groupdata=self:GetFlightData(flightgroup)
if groupdata then
return groupdata.waypointtask
end
end
--- Set flightgroup waypoint index.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @param Ops.OpsGroup#OPSGROUP flightgroup The flight group.
-- @param #number waypointindex Waypoint index.
function AUFTRAG:SetFlightWaypointIndex(flightgroup, waypointindex)
self:I(self.lid..string.format("Setting waypoint index %d", waypointindex))
local flightdata=self:GetFlightData(flightgroup)
if flightdata then
flightdata.waypointindex=waypointindex
local groupdata=self:GetFlightData(flightgroup)
if groupdata then
groupdata.waypointindex=waypointindex
end
end
--- Get flightgroup waypoint index.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
-- @param Ops.OpsGroup#OPSGROUP flightgroup The flight group.
-- @return #number Waypoint index
function AUFTRAG:GetFlightWaypointIndex(flightgroup)
local flightdata=self:GetFlightData(flightgroup)
if flightdata then
return flightdata.waypointindex
local groupdata=self:GetFlightData(flightgroup)
if groupdata then
return groupdata.waypointindex
end
end
@@ -1959,15 +1958,15 @@ function AUFTRAG:CheckFlightsDone()
-- It could be that all flights were destroyed on the way to the mission execution waypoint.
-- TODO: would be better to check if everybody is dead by now.
if self:IsStarted() and self:CountFlightGroups()==0 then
if self:IsStarted() and self:CountOpsGroups()==0 then
return true
end
-- Check status of all flight groups.
for groupname,data in pairs(self.flightdata) do
local flightdata=data --#AUFTRAG.FlightData
if flightdata then
if flightdata.status==AUFTRAG.GroupStatus.DONE or flightdata.status==AUFTRAG.GroupStatus.CANCELLED then
for groupname,data in pairs(self.groupdata) do
local groupdata=data --#AUFTRAG.GroupData
if groupdata then
if groupdata.status==AUFTRAG.GroupStatus.DONE or groupdata.status==AUFTRAG.GroupStatus.CANCELLED then
-- This one is done or cancelled.
else
-- At least this flight is not DONE or CANCELLED.
@@ -1994,10 +1993,10 @@ function AUFTRAG:OnEventUnitLost(EventData)
local group=EventData.IniGroup
local unitname=EventData.IniUnitName
for _,_flightdata in pairs(self.flightdata) do
local flightdata=_flightdata --#AUFTRAG.FlightData
if flightdata and flightdata.flightgroup and flightdata.flightgroup.groupname==EventData.IniGroupName then
self:I(self.lid..string.format("UNIT LOST event for flightgroup %s unit %s", flightdata.flightgroup.groupname, EventData.IniUnitName))
for _,_groupdata in pairs(self.groupdata) do
local groupdata=_groupdata --#AUFTRAG.GroupData
if groupdata and groupdata.opsgroup and groupdata.opsgroup.groupname==EventData.IniGroupName then
self:I(self.lid..string.format("UNIT LOST event for flightgroup %s unit %s", groupdata.opsgroup.groupname, EventData.IniUnitName))
end
end
@@ -2047,7 +2046,7 @@ end
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup
-- @param Ops.OpsGroup#OPSGROUP FlightGroup
function AUFTRAG:onafterScheduled(From, Event, To, FlightGroup)
self.status=AUFTRAG.Status.SCHEDULED
self:I(self.lid..string.format("New mission status=%s", self.status))
@@ -2093,12 +2092,10 @@ end
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The flightgroup that is dead now.
function AUFTRAG:onafterFlightDead(From, Event, To, FlightGroup)
-- @param Ops.OpsGroup#OPSGROUP OpsGroup The ops group that is dead now.
function AUFTRAG:onafterFlightDead(From, Event, To, OpsGroup)
--self:SetFlightStatus(FlightGroup, AUFTRAG.GroupStatus.DONE)
local asset=self:GetAssetByName(FlightGroup.groupname)
local asset=self:GetAssetByName(OpsGroup.groupname)
if asset then
self:AssetDead(asset)
end
@@ -2114,9 +2111,9 @@ end
function AUFTRAG:onafterAssetDead(From, Event, To, Asset)
-- Remove flightgroup from mission.
--self:DelFlightGroup(Asset.flightgroup)
--self:DelOpsGroup(Asset.opsgroup)
local N=self:CountFlightGroups()
local N=self:CountOpsGroups()
-- All assets dead?
if N==0 then
@@ -2167,7 +2164,7 @@ end
function AUFTRAG:onafterCancel(From, Event, To)
-- Debug info.
self:I(self.lid..string.format("CANCELLING mission in status %s. Will wait for flights to report mission DONE before evaluation.", self.status))
self:I(self.lid..string.format("CANCELLING mission in status %s. Will wait for groups to report mission DONE before evaluation.", self.status))
-- Time stamp.
self.Tover=timer.getAbsTime()
@@ -2195,9 +2192,9 @@ function AUFTRAG:onafterCancel(From, Event, To)
self:I(self.lid..string.format("No airwing or wingcommander. Attached flights will cancel the mission on their own. Will wait for mission DONE before evaluation!"))
for _,_flightdata in pairs(self.flightdata) do
local flightdata=_flightdata --#AUFTRAG.FlightData
flightdata.flightgroup:MissionCancel(self)
for _,_groupdata in pairs(self.groupdata) do
local groupdata=_groupdata --#AUFTRAG.GroupData
groupdata.opsgroup:MissionCancel(self)
end
end
@@ -2266,16 +2263,16 @@ function AUFTRAG:onafterRepeat(From, Event, To)
-- No mission assets.
self.assets={}
for _,_flightdata in pairs(self.flightdata) do
local flightdata=_flightdata --#AUFTRAG.FlightData
local flightgroup=flightdata.flightgroup
for _,_groupdata in pairs(self.groupdata) do
local groupdata=_groupdata --#AUFTRAG.GroupData
local flightgroup=groupdata.opsgroup
if flightgroup then
self:DelFlightGroup(flightgroup)
self:DelOpsGroup(flightgroup)
end
end
-- No flight data.
self.flightdata={}
self.groupdata={}
-- Call status again.
self:__Status(-30)
@@ -2304,16 +2301,16 @@ function AUFTRAG:onafterStop(From, Event, To)
self.airwing:RemoveMission(self)
end
for _,_flightdata in pairs(self.flightdata) do
local flightdata=_flightdata --#AUFTRAG.FlightData
flightdata.flightgroup:RemoveMission(self)
for _,_groupdata in pairs(self.groupdata) do
local groupdata=_groupdata --#AUFTRAG.GroupData
groupdata.opsgroup:RemoveMission(self)
end
-- No mission assets.
self.assets={}
-- No flight data.
self.flightdata={}
self.groupdata={}
-- Clear pending scheduler calls.
self.CallScheduler:Clear()
@@ -2601,11 +2598,11 @@ end
--- Count alive flight groups assigned for this mission.
-- @param #AUFTRAG self
-- @return #number Number of alive flight groups.
function AUFTRAG:CountFlightGroups()
function AUFTRAG:CountOpsGroups()
local N=0
for _,_flightdata in pairs(self.flightdata) do
local flightdata=_flightdata --#AUFTRAG.FlightData
if flightdata and flightdata.flightgroup and flightdata.flightgroup:IsAlive() then
for _,_groupdata in pairs(self.groupdata) do
local groupdata=_groupdata --#AUFTRAG.GroupData
if groupdata and groupdata.opsgroup and groupdata.opsgroup:IsAlive() then
N=N+1
end
end
@@ -2746,7 +2743,7 @@ function AUFTRAG:UpdateMarker()
local text=string.format("%s %s: %s", self.name, self.type:upper(), self.status:upper())
text=text..string.format("\n%s", self:GetTargetName())
text=text..string.format("\nTargets %d/%d, Life Points=%d/%d", self:CountMissionTargets(), self.Ntargets, self:GetTargetLife(), self:GetTargetInitialLife())
text=text..string.format("\nFlights %d/%d", self:CountFlightGroups(), self.nassets)
text=text..string.format("\nFlights %d/%d", self:CountOpsGroups(), self.nassets)
if not self.marker then
+1 -1
View File
@@ -1239,7 +1239,7 @@ end
function OPSGROUP:AddMission(Mission)
-- Add flight group to mission.
Mission:AddFlightGroup(self)
Mission:AddOpsGroup(self)
-- Set flight status to SCHEDULED..
Mission:SetFlightStatus(self, AUFTRAG.GroupStatus.SCHEDULED)