Merge pull request #490 from FlightControl-Master/489-Detection-Unit

Optimizations for detection. fixes issue #489
This commit is contained in:
Sven Van de Velde 2017-05-03 12:07:40 +02:00 committed by GitHub
commit 9ca007ccf4
2 changed files with 93 additions and 30 deletions

View File

@ -273,10 +273,16 @@ do -- DETECTION_BASE
--- @type DETECTION_BASE.DetectedObject --- @type DETECTION_BASE.DetectedObject
-- @field #string Name -- @field #string Name
-- @field #boolean Visible -- @field #boolean IsVisible
-- @field #boolean KnowType
-- @field #boolean KnowDistance
-- @field #string Type -- @field #string Type
-- @field #number Distance -- @field #number Distance
-- @field #boolean Identified -- @field #boolean Identified
-- @field #number LastTime
-- @field #boolean LastPos
-- @field #number LastVelocity
--- @type DETECTION_BASE.DetectedItems --- @type DETECTION_BASE.DetectedItems
-- @list <#DETECTION_BASE.DetectedItem> -- @list <#DETECTION_BASE.DetectedItem>
@ -309,12 +315,12 @@ do -- DETECTION_BASE
self.DetectionInterval = 30 self.DetectionInterval = 30
self:InitDetectVisual( false ) self:InitDetectVisual( nil )
self:InitDetectOptical( false ) self:InitDetectOptical( nil )
self:InitDetectRadar( false ) self:InitDetectRadar( nil )
self:InitDetectRWR( false ) self:InitDetectRWR( nil )
self:InitDetectIRST( false ) self:InitDetectIRST( nil )
self:InitDetectDLINK( false ) self:InitDetectDLINK( nil )
self:FilterCategories( { self:FilterCategories( {
Unit.Category.AIRPLANE, Unit.Category.AIRPLANE,
@ -531,6 +537,7 @@ do -- DETECTION_BASE
self:T( { "DetectionGroup is Alive", DetectionGroup:GetName() } ) self:T( { "DetectionGroup is Alive", DetectionGroup:GetName() } )
local DetectionGroupName = DetectionGroup:GetName() local DetectionGroupName = DetectionGroup:GetName()
local DetectionUnit = DetectionGroup:GetUnit(1)
local DetectedUnits = {} local DetectedUnits = {}
@ -550,6 +557,18 @@ do -- DETECTION_BASE
if DetectedObject and DetectedObject:isExist() and DetectedObject.id_ < 50000000 then -- and ( DetectedObject:getCategory() == Object.Category.UNIT or DetectedObject:getCategory() == Object.Category.STATIC ) then if DetectedObject and DetectedObject:isExist() and DetectedObject.id_ < 50000000 then -- and ( DetectedObject:getCategory() == Object.Category.UNIT or DetectedObject:getCategory() == Object.Category.STATIC ) then
local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity = DetectionUnit:IsTargetDetected(
DetectedObject,
self.DetectVisual,
self.DetectOptical,
self.DetectRadar,
self.DetectIRST,
self.DetectRWR,
self.DetectDLINK
)
self:T( { TargetIsDetected = TargetIsDetected, TargetIsVisible = TargetIsVisible, TargetLastTime = TargetLastTime, TargetKnowType = TargetKnowType, TargetKnowDistance = TargetKnowDistance, TargetLastPos = TargetLastPos, TargetLastVelocity = TargetLastVelocity } )
local DetectionAccepted = true local DetectionAccepted = true
local DetectedObjectName = DetectedObject:getName() local DetectedObjectName = DetectedObject:getName()
@ -648,12 +667,14 @@ do -- DETECTION_BASE
HasDetectedObjects = true HasDetectedObjects = true
if not self.DetectedObjects[DetectedObjectName] then self.DetectedObjects[DetectedObjectName] = self.DetectedObjects[DetectedObjectName] or {}
self.DetectedObjects[DetectedObjectName] = {}
end
self.DetectedObjects[DetectedObjectName].Name = DetectedObjectName self.DetectedObjects[DetectedObjectName].Name = DetectedObjectName
self.DetectedObjects[DetectedObjectName].Visible = Detection.visible self.DetectedObjects[DetectedObjectName].IsVisible = TargetIsVisible
self.DetectedObjects[DetectedObjectName].Type = Detection.type self.DetectedObjects[DetectedObjectName].LastTime = TargetLastTime
self.DetectedObjects[DetectedObjectName].LastPos = TargetLastPos
self.DetectedObjects[DetectedObjectName].LastVelocity = TargetLastVelocity
self.DetectedObjects[DetectedObjectName].KnowType = TargetKnowType
self.DetectedObjects[DetectedObjectName].KnowDistance = Detection.distance -- TargetKnowDistance
self.DetectedObjects[DetectedObjectName].Distance = Distance self.DetectedObjects[DetectedObjectName].Distance = Distance
local DetectedUnit = UNIT:FindByName( DetectedObjectName ) local DetectedUnit = UNIT:FindByName( DetectedObjectName )
@ -1435,7 +1456,6 @@ do -- DETECTION_UNITS
for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do
local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT
local DetectedTypeName = DetectedItem.Type
for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do
local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT
@ -1450,6 +1470,17 @@ do -- DETECTION_UNITS
-- Yes, the DetectedUnit is still detected or exists. Flag as identified. -- Yes, the DetectedUnit is still detected or exists. Flag as identified.
self:IdentifyDetectedObject( DetectedObject ) self:IdentifyDetectedObject( DetectedObject )
-- Update the detection with the new data provided.
DetectedItem.TypeName = DetectedUnit:GetTypeName()
DetectedItem.Name = DetectedObject.Name
DetectedItem.IsVisible = DetectedObject.IsVisible
DetectedItem.LastTime = DetectedObject.LastTime
DetectedItem.LastPos = DetectedObject.LastPos
DetectedItem.LastVelocity = DetectedObject.LastVelocity
DetectedItem.KnowType = DetectedObject.KnowType
DetectedItem.KnowDistance = DetectedObject.KnowDistance
DetectedItem.Distance = DetectedObject.Distance
else else
-- There was no DetectedObject, remove DetectedUnit from the Set. -- There was no DetectedObject, remove DetectedUnit from the Set.
self:AddChangeUnit( DetectedItem, "RU", DetectedUnitName ) self:AddChangeUnit( DetectedItem, "RU", DetectedUnitName )
@ -1474,10 +1505,15 @@ do -- DETECTION_UNITS
if not DetectedItem then if not DetectedItem then
self:T( "Added new DetectedItem" ) self:T( "Added new DetectedItem" )
DetectedItem = self:AddDetectedItem( "UNIT", DetectedUnitName ) DetectedItem = self:AddDetectedItem( "UNIT", DetectedUnitName )
DetectedItem.Type = DetectedUnit:GetTypeName() DetectedItem.TypeName = DetectedUnit:GetTypeName()
DetectedItem.Name = DetectedObjectData.Name DetectedItem.Name = DetectedObject.Name
DetectedItem.Visible = DetectedObjectData.Visible DetectedItem.IsVisible = DetectedObject.IsVisible
DetectedItem.Distance = DetectedObjectData.Distance DetectedItem.LastTime = DetectedObject.LastTime
DetectedItem.LastPos = DetectedObject.LastPos
DetectedItem.LastVelocity = DetectedObject.LastVelocity
DetectedItem.KnowType = DetectedObject.KnowType
DetectedItem.KnowDistance = DetectedObject.KnowDistance
DetectedItem.Distance = DetectedObject.Distance
end end
DetectedItem.Set:AddUnit( DetectedUnit ) DetectedItem.Set:AddUnit( DetectedUnit )
@ -1557,19 +1593,27 @@ do -- DETECTION_UNITS
if DetectedItemUnit and DetectedItemUnit:IsAlive() then if DetectedItemUnit and DetectedItemUnit:IsAlive() then
self:T(DetectedItemUnit) self:T(DetectedItemUnit)
local UnitCategoryName = DetectedItemUnit:GetCategoryName() or ""
local UnitCategoryType = DetectedItemUnit:GetTypeName() or ""
if DetectedItem.Type and UnitCategoryName and UnitCategoryType then if DetectedItem.KnowType then
UnitCategoryText = UnitCategoryName .. " (" .. UnitCategoryType .. ") at " local UnitCategoryName = DetectedItemUnit:GetCategoryName()
if UnitCategoryName then
UnitCategoryText = UnitCategoryName
end
if DetectedItem.TypeName then
UnitCategoryText = UnitCategoryText .. " (" .. DetectedItem.TypeName .. ")"
end
else else
UnitCategoryText = "Unknown target at " UnitCategoryText = "Unknown"
end end
if DetectedItem.Visible == false then if DetectedItem.KnowDistance then
UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " km, estimated" if DetectedItem.IsVisible then
UnitDistanceText = " at " .. string.format( "%.2f", DetectedItem.Distance ) .. " km"
end
else else
UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " km, visual" if DetectedItem.IsVisible then
UnitDistanceText = " at +/- " .. string.format( "%.0f", DetectedItem.Distance ) .. " km"
end
end end
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate() local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
@ -1699,7 +1743,7 @@ do -- DETECTION_TYPES
for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do
local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT
local DetectedTypeName = DetectedItem.Type local DetectedTypeName = DetectedItem.TypeName
for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do
local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT
@ -1736,7 +1780,7 @@ do -- DETECTION_TYPES
local DetectedItem = self:GetDetectedItem( DetectedTypeName ) local DetectedItem = self:GetDetectedItem( DetectedTypeName )
if not DetectedItem then if not DetectedItem then
DetectedItem = self:AddDetectedItem( "TYPE", DetectedTypeName ) DetectedItem = self:AddDetectedItem( "TYPE", DetectedTypeName )
DetectedItem.Type = DetectedUnit:GetTypeName() DetectedItem.TypeName = DetectedUnit:GetTypeName()
end end
DetectedItem.Set:AddUnit( DetectedUnit ) DetectedItem.Set:AddUnit( DetectedUnit )
@ -1808,7 +1852,7 @@ do -- DETECTION_TYPES
local ThreatLevelA2G = DetectedSet:CalculateThreatLevelA2G() local ThreatLevelA2G = DetectedSet:CalculateThreatLevelA2G()
local DetectedItemsCount = DetectedSet:Count() local DetectedItemsCount = DetectedSet:Count()
local DetectedItemType = DetectedItem.Type local DetectedItemType = DetectedItem.TypeName
local DetectedItemUnit = DetectedSet:GetFirst() local DetectedItemUnit = DetectedSet:GetFirst()
@ -1967,7 +2011,7 @@ do -- DETECTION_AREAS
local ThreatLevelA2G = self:GetTreatLevelA2G( DetectedItem ) local ThreatLevelA2G = self:GetTreatLevelA2G( DetectedItem )
local DetectedItemsCount = DetectedSet:Count() local DetectedItemsCount = DetectedSet:Count()
local DetectedItemsTypes = DetectedSet:GetTypeNames() local DetectedItemsTypes = DetectedSet:GetTypeNames()
local ReportSummary = string.format( local ReportSummary = string.format(
"%s - %s - Threat:[%s](%2d)\n %2d of %s", "%s - %s - Threat:[%s](%2d)\n %2d of %s",
DetectedItemID, DetectedItemID,
@ -1983,6 +2027,25 @@ do -- DETECTION_AREAS
return nil return nil
end end
--- Report detailed of a detection result.
-- @param #DETECTION_AREAS self
-- @return #string
function DETECTION_AREAS:DetectedReportDetailed() --R2.1 Fixed missing report
self:F()
local Report = REPORT:New( "Detected areas:" )
for DetectedItemIndex, DetectedItem in pairs( self.DetectedItems ) do
local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem
local ReportSummary = self:DetectedItemReportSummary( DetectedItemIndex )
Report:Add( ReportSummary )
end
local ReportText = Report:Text()
return ReportText
end
--- Returns if there are friendlies nearby the FAC units ... --- Returns if there are friendlies nearby the FAC units ...

View File

@ -1782,7 +1782,7 @@ function CONTROLLABLE:GetDetectedTargets( DetectVisual, DetectOptical, DetectRad
return nil return nil
end end
function CONTROLLABLE:IsTargetDetected( DCSObject ) function CONTROLLABLE:IsTargetDetected( DCSObject, DetectVisual, DetectOptical, DetectRadar, DetectIRST, DetectRWR, DetectDLINK )
self:F2( self.ControllableName ) self:F2( self.ControllableName )
local DCSControllable = self:GetDCSObject() local DCSControllable = self:GetDCSObject()