This commit is contained in:
Applevangelist 2022-04-24 19:11:08 +02:00
parent 68c75a4e34
commit 619cc3c047
4 changed files with 158 additions and 40 deletions

View File

@ -82,6 +82,8 @@ do
-- @field #boolean MonitoringOn -- @field #boolean MonitoringOn
-- @field Core.Set#SET_GROUP clientset -- @field Core.Set#SET_GROUP clientset
-- @field Utilities.FiFo#FIFO FlightGroups -- @field Utilities.FiFo#FIFO FlightGroups
-- @field #number PictureInterval Interval in seconds for general picture
-- @field #number PictureTimeStamp Interval timestamp
-- @extends Core.Fsm#FSM -- @extends Core.Fsm#FSM
--- ---
@ -145,6 +147,8 @@ AWACS = {
AwacsReady = false, AwacsReady = false,
CatchAllMissions = {}, CatchAllMissions = {},
CatchAllFGs = {}, CatchAllFGs = {},
PictureInterval = 300,
PictureTimeStamp = 0,
} }
--- ---
@ -274,7 +278,12 @@ AWACS.THREATLEVEL = {
-- @field Core.Menu#MENU_GROUP_COMMAND picture -- @field Core.Menu#MENU_GROUP_COMMAND picture
-- @field Core.Menu#MENU_GROUP_COMMAND bogeydope -- @field Core.Menu#MENU_GROUP_COMMAND bogeydope
-- @field Core.Menu#MENU_GROUP_COMMAND declare -- @field Core.Menu#MENU_GROUP_COMMAND declare
-- @field Core.Menu#MENU_GROUP tasking
-- @field Core.Menu#MENU_GROUP_COMMAND showtask -- @field Core.Menu#MENU_GROUP_COMMAND showtask
-- @field Core.Menu#MENU_GROUP_COMMAND judy
-- @field Core.Menu#MENU_GROUP_COMMAND unable
-- @field Core.Menu#MENU_GROUP_COMMAND abort
-- @field Core.Menu#MENU_GROUP_COMMAND commit
--- ---
-- @type AWACS.ManagedGroup -- @type AWACS.ManagedGroup
@ -481,6 +490,9 @@ function AWACS:New(Name,AirWing,Coalition,AirbaseName,AwacsOrbit,OpsZone,AnchorZ
self.FlightGroups = FIFO:New() -- Utilities.FiFo#FIFO self.FlightGroups = FIFO:New() -- Utilities.FiFo#FIFO
self.Countactcounter = 0 self.Countactcounter = 0
self.PictureInterval = 300 -- picture every 5 mins
self.PictureTimeStamp = 0 -- timestamp
local speed = 250 local speed = 250
self.SpeedBase = speed self.SpeedBase = speed
self.Speed = UTILS.KnotsToAltKIAS(speed,self.AwacsAngels*1000) self.Speed = UTILS.KnotsToAltKIAS(speed,self.AwacsAngels*1000)
@ -567,7 +579,7 @@ function AWACS:New(Name,AirWing,Coalition,AirbaseName,AwacsOrbit,OpsZone,AnchorZ
MonitoringData.EscortsShiftChange = false MonitoringData.EscortsShiftChange = false
MonitoringData.EscortsStateFG= "unknown" MonitoringData.EscortsStateFG= "unknown"
MonitoringData.EscortsStateMission = "unknown" MonitoringData.EscortsStateMission = "unknown"
self.MonitoringOn = true -- #boolean self.MonitoringOn = false -- #boolean
self.MonitoringData = MonitoringData self.MonitoringData = MonitoringData
self.CatchAllMissions = {} self.CatchAllMissions = {}
@ -717,7 +729,7 @@ function AWACS:_StartEscorts(Shiftchange)
local AwacsFG = self.AwacsFG -- Ops.FlightGroup#FLIGHTGROUP local AwacsFG = self.AwacsFG -- Ops.FlightGroup#FLIGHTGROUP
local group = AwacsFG:GetGroup() local group = AwacsFG:GetGroup()
local mission = AUFTRAG:NewESCORT(group,{x=-100, y=0, z=200},30,{"Air"}) local mission = AUFTRAG:NewESCORT(group,{x=-100, y=0, z=200},45,{"Air"})
self.CatchAllMissions[#self.CatchAllMissions+1] = mission self.CatchAllMissions[#self.CatchAllMissions+1] = mission
mission:SetRequiredAssets(self.EscortNumber) mission:SetRequiredAssets(self.EscortNumber)
@ -770,7 +782,7 @@ function AWACS:_StartSettings(FlightGroup,Mission)
-- Non AWACS does not seem take AWACS CS in DCS Group -- Non AWACS does not seem take AWACS CS in DCS Group
--group:CommandSetCallsign(CALLSIGN.Aircraft.Pig,self.CallSignNo,2) --group:CommandSetCallsign(CALLSIGN.Aircraft.Pig,self.CallSignNo,2)
AwacsFG:SetSRS(self.PathToSRS,self.Gender,self.Culture,self.Voice,self.Port,nil) AwacsFG:SetSRS(self.PathToSRS,self.Gender,self.Culture,self.Voice,self.Port,nil,"AWACS")
--self.callsigntxt = string.format("%s %d %d",AWACS.CallSignClear[self.CallSign],1,self.CallSignNo) --self.callsigntxt = string.format("%s %d %d",AWACS.CallSignClear[self.CallSign],1,self.CallSignNo)
self.callsigntxt = string.format("%s",AWACS.CallSignClear[self.CallSign]) self.callsigntxt = string.format("%s",AWACS.CallSignClear[self.CallSign])
--local text = string.format("%s starting for AO %s control.",self.callsigntxt,self.OpsZone:GetName() or "AO") --local text = string.format("%s starting for AO %s control.",self.callsigntxt,self.OpsZone:GetName() or "AO")
@ -790,6 +802,8 @@ function AWACS:_StartSettings(FlightGroup,Mission)
self.AwacsTimeStamp = timer.getTime() self.AwacsTimeStamp = timer.getTime()
self.EscortsTimeStamp = timer.getTime() self.EscortsTimeStamp = timer.getTime()
self.PictureTimeStamp = timer.getTime()
self.AwacsReady = true self.AwacsReady = true
-- set FSM to started -- set FSM to started
@ -819,7 +833,7 @@ function AWACS:_StartSettings(FlightGroup,Mission)
-- Non AWACS does not seem take AWACS CS in DCS Group -- Non AWACS does not seem take AWACS CS in DCS Group
-- group:CommandSetCallsign(CALLSIGN.Aircraft.Pig,self.CallSignNo,2) -- group:CommandSetCallsign(CALLSIGN.Aircraft.Pig,self.CallSignNo,2)
AwacsFG:SetSRS(self.PathToSRS,self.Gender,self.Culture,self.Voice,self.Port,nil) AwacsFG:SetSRS(self.PathToSRS,self.Gender,self.Culture,self.Voice,self.Port,nil,"AWACS")
--self.callsigntxt = string.format("%s %d %d",AWACS.CallSignClear[self.CallSign],1,self.CallSignNo) --self.callsigntxt = string.format("%s %d %d",AWACS.CallSignClear[self.CallSign],1,self.CallSignNo)
self.callsigntxt = string.format("%s",AWACS.CallSignClear[self.CallSign]) self.callsigntxt = string.format("%s",AWACS.CallSignClear[self.CallSign])
@ -861,7 +875,7 @@ function AWACS:ToStringBULLS( Coordinate )
return string.format("Bullseye %03d, %03d",Bearing,Distance) return string.format("Bullseye %03d, %03d",Bearing,Distance)
end end
--- [Internal] Chnage Bullseye string to be TTS friendly, "Bullseye 021, 16" returns e.g. "Bulls eye 0-2-1, 1-6" --- [Internal] Chnage Bullseye string to be TTS friendly, "Bullseye 021, 16" returns e.g. "Bulls eye 0 2 1. 1 6"
-- @param #AWACS self -- @param #AWACS self
-- @param #string Text Input text -- @param #string Text Input text
-- @return #string BullseyeBRTTS -- @return #string BullseyeBRTTS
@ -869,7 +883,7 @@ function AWACS:ToStringBullsTTS(Text)
local text = Text local text = Text
text=string.gsub(text,"Bullseye","Bulls eye") text=string.gsub(text,"Bullseye","Bulls eye")
text=string.gsub(text,"%d","%1 ") text=string.gsub(text,"%d","%1 ")
text=string.gsub(text,"?," ,",") text=string.gsub(text,"?," ,"\.")
text=string.gsub(text," $","") text=string.gsub(text," $","")
return text return text
end end
@ -882,6 +896,10 @@ end
-- @return #boolean CheckedIn -- @return #boolean CheckedIn
-- @return #string CallSign -- @return #string CallSign
function AWACS:_GetManagedGrpID(Group) function AWACS:_GetManagedGrpID(Group)
if not Group or not Group:IsAlive() then
self:E(self.lid.."_GetManagedGrpID - Requested Group is not alive!")
return 0,false,""
end
self:T(self.lid.."_GetManagedGrpID for "..Group:GetName()) self:T(self.lid.."_GetManagedGrpID for "..Group:GetName())
local GID = 0 local GID = 0
local Outcome = false local Outcome = false
@ -928,16 +946,32 @@ end
-- @param #boolean AO If true this is for AO, else EWR -- @param #boolean AO If true this is for AO, else EWR
-- @param #string Callsign Callsign to address -- @param #string Callsign Callsign to address
-- @param #number GID GroupID for comms -- @param #number GID GroupID for comms
-- @param #number MaxEntries Max entries to show
-- @param #boolean IsGeneral Is a general picture, address all stations
-- @return #AWACS self -- @return #AWACS self
function AWACS:_CreatePicture(AO,Callsign,GID) function AWACS:_CreatePicture(AO,Callsign,GID,MaxEntries,IsGeneral)
self:T(self.lid.."_CreatePicture AO="..tostring(AO).." for "..Callsign.." GID "..GID) self:T(self.lid.."_CreatePicture AO="..tostring(AO).." for "..Callsign.." GID "..GID)
local managedgroup = self.ManagedGrps[GID] -- #AWACS.ManagedGroup local managedgroup = nil
local group = managedgroup.Group -- Wrapper.Group#GROUP local group = nil
local groupcoord = group:GetCoordinate() local groupcoord = nil
if IsGeneral then
-- local managedgroup = self.ManagedGrps[GID] -- #AWACS.ManagedGroup
-- local group = managedgroup.Group -- Wrapper.Group#GROUP
-- local groupcoord = group:GetCoordinate()
else
managedgroup = self.ManagedGrps[GID] -- #AWACS.ManagedGroup
group = managedgroup.Group -- Wrapper.Group#GROUP
groupcoord = group:GetCoordinate()
end
local fifo = self.PictureAO -- Utilities.FiFo#FIFO local fifo = self.PictureAO -- Utilities.FiFo#FIFO
local maxentries = self.maxspeakentries or 3 local maxentries = self.maxspeakentries or 3
if MaxEntries and MaxEntries>0 and MaxEntries <= 3 then
maxentries = MaxEntries
end
local counter = 0 local counter = 0
if not AO then if not AO then
@ -958,9 +992,19 @@ function AWACS:_CreatePicture(AO,Callsign,GID)
if cluster and cluster.coordinate then if cluster and cluster.coordinate then
local clustercoord = cluster.coordinate -- Core.Point#COORDINATE local clustercoord = cluster.coordinate -- Core.Point#COORDINATE
--local refBRAA = clustercoord:ToStringBRA(groupcoord) --local refBRAA = clustercoord:ToStringBRA(groupcoord)
local refBRAA = clustercoord:ToStringBRAANATO(groupcoord,true) local refBRAA = ""
text = text .. " "..refBRAA.."." if IsGeneral then
textScreen = textScreen .." "..refBRAA..".\n" -- bulls eye reference
refBRAA = self:ToStringBULLS(clustercoord)
refBRAA = self:ToStringBullsTTS(refBRAA)
text = text .. " "..refBRAA.."."
textScreen = textScreen .." "..refBRAA..".\n"
else
-- pilot reference
refBRAA = clustercoord:ToStringBRAANATO(groupcoord,true)
text = text .. " "..refBRAA
textScreen = textScreen .." "..refBRAA.."\n"
end
if counter < maxentries then if counter < maxentries then
text = text .. " Group" text = text .. " Group"
textScreen = textScreen .. text .. "\n" textScreen = textScreen .. text .. "\n"
@ -976,8 +1020,13 @@ function AWACS:_CreatePicture(AO,Callsign,GID)
RadioEntry.TextTTS = text RadioEntry.TextTTS = text
RadioEntry.TextScreen = textScreen RadioEntry.TextScreen = textScreen
RadioEntry.GroupID = GID RadioEntry.GroupID = GID
RadioEntry.IsGroup = managedgroup.IsPlayer if IsGeneral then
RadioEntry.ToScreen = managedgroup.IsPlayer RadioEntry.IsGroup = false
RadioEntry.ToScreen = self.debug
else
RadioEntry.IsGroup = managedgroup.IsPlayer
RadioEntry.ToScreen = managedgroup.IsPlayer
end
RadioEntry.Duration = STTS.getSpeechTime(text,1.1,false) or 8 RadioEntry.Duration = STTS.getSpeechTime(text,1.1,false) or 8
self.RadioQueue:Push(RadioEntry) self.RadioQueue:Push(RadioEntry)
@ -1028,13 +1077,20 @@ end
--- [Internal] AWACS Menu for Picture --- [Internal] AWACS Menu for Picture
-- @param #AWACS self -- @param #AWACS self
-- @param Wrapper.Group#GROUP Group Group to use -- @param Wrapper.Group#GROUP Group Group to use
-- @param #boolean IsGeneral General picture if true, address no-one specific
-- @return #AWACS self -- @return #AWACS self
function AWACS:_Picture(Group) function AWACS:_Picture(Group,IsGeneral)
self:T(self.lid.."_Picture") self:T(self.lid.."_Picture")
local text = "" local text = ""
local textScreen = text local textScreen = text
local GID, Outcome = self:_GetManagedGrpID(Group) local GID, Outcome = self:_GetManagedGrpID(Group)
local gcallsign = self:_GetCallSign(Group,GID) or "Ghost 1 1" local gcallsign = ""
if IsGeneral then
gcallsign = "All Stations"
else
gcallsign = self:_GetCallSign(Group,GID) or "Ghost 1 1"
end
if not self.intel then if not self.intel then
-- no intel yet! -- no intel yet!
@ -1051,7 +1107,7 @@ function AWACS:_Picture(Group)
return self return self
end end
if Outcome then if Outcome or IsGeneral then
-- Pilot is checked in -- Pilot is checked in
-- get clusters from Intel -- get clusters from Intel
local clustertable = self.intel:GetClusterTable() local clustertable = self.intel:GetClusterTable()
@ -1106,12 +1162,12 @@ function AWACS:_Picture(Group)
RadioEntry.Duration = STTS.getSpeechTime(text,1.1,false) or 8 RadioEntry.Duration = STTS.getSpeechTime(text,1.1,false) or 8
self.RadioQueue:Push(RadioEntry) self.RadioQueue:Push(RadioEntry)
self:_CreatePicture(true,gcallsign,GID) self:_CreatePicture(true,gcallsign,GID,3,IsGeneral)
self.PictureAO:Clear() self.PictureAO:Clear()
end end
if clustersAO < 3 and clustersEWR > 0 then if clustersAO == 0 and clustersEWR > 0 then
text = string.format("%s. %s. Picture Early Warning. ",gcallsign, self.callsigntxt) text = string.format("%s. %s. Picture Early Warning. ",gcallsign, self.callsigntxt)
textScreen = string.format("%s. %s. Picture EWR. ",gcallsign, self.callsigntxt) textScreen = string.format("%s. %s. Picture EWR. ",gcallsign, self.callsigntxt)
if clustersEWR == 1 then if clustersEWR == 1 then
@ -1131,7 +1187,7 @@ function AWACS:_Picture(Group)
RadioEntry.Duration = STTS.getSpeechTime(text,1.1,false) or 8 RadioEntry.Duration = STTS.getSpeechTime(text,1.1,false) or 8
self.RadioQueue:Push(RadioEntry) self.RadioQueue:Push(RadioEntry)
--self:_CreatePicture(false,gcallsign,GID) self:_CreatePicture(false,gcallsign,GID,3,IsGeneral)
self.PictureEWR:Clear() self.PictureEWR:Clear()
end end
@ -1369,6 +1425,38 @@ function AWACS:_Declare(Group)
return self return self
end end
--- [Internal] AWACS Menu for Commit
-- @param #AWACS self
-- @param Wrapper.Group#GROUP Group Group to use
-- @return #AWACS self
function AWACS:_Commit(Group)
self:T(self.lid.."_Commit")
local GID, Outcome = self:_GetManagedGrpID(Group)
local text = "Commit Not yet implemented"
if Outcome then
--[[ yes, known
--]]
elseif self.AwacsFG then
-- no, unknown
text = string.format("%s. %s. Negative. You are not checked in.",self:_GetCallSign(Group,GID) or "Ghost 1 1", self.callsigntxt)
end
local RadioEntry = {} -- #AWACS.RadioEntry
RadioEntry.IsNew = true
RadioEntry.TextTTS = text
RadioEntry.TextScreen = text
RadioEntry.GroupID = GID
RadioEntry.IsGroup = Outcome
RadioEntry.ToScreen = true
RadioEntry.Duration = STTS.getSpeechTime(text,1.1,false) or 8
self.RadioQueue:Push(RadioEntry)
return self
end
--- [Internal] AWACS Menu for Judy --- [Internal] AWACS Menu for Judy
-- @param #AWACS self -- @param #AWACS self
-- @param Wrapper.Group#GROUP Group Group to use -- @param Wrapper.Group#GROUP Group Group to use
@ -1558,7 +1646,7 @@ function AWACS:_CheckIn(Group)
alphacheckbulls = self:ToStringBullsTTS(alphacheckbulls)-- make tts friendly alphacheckbulls = self:ToStringBullsTTS(alphacheckbulls)-- make tts friendly
self.ManagedGrps[self.ManagedGrpID]=managedgroup self.ManagedGrps[self.ManagedGrpID]=managedgroup
text = string.format("%s. %s. Alpha Check %s",managedgroup.CallSign,self.callsigntxt,alphacheckbulls) text = string.format("%s. %s. Alpha Check. %s",managedgroup.CallSign,self.callsigntxt,alphacheckbulls)
self:__CheckedIn(1,managedgroup.GID) self:__CheckedIn(1,managedgroup.GID)
self:__AssignAnchor(5,managedgroup.GID) self:__AssignAnchor(5,managedgroup.GID)
@ -1637,7 +1725,7 @@ function AWACS:_CheckInAI(FlightGroup,Group,AuftragsNr)
alphacheckbulls = self:ToStringBullsTTS(alphacheckbulls)-- make tts friendly alphacheckbulls = self:ToStringBullsTTS(alphacheckbulls)-- make tts friendly
self.ManagedGrps[self.ManagedGrpID]=managedgroup self.ManagedGrps[self.ManagedGrpID]=managedgroup
text = string.format("%s. %s. Alpha Check %s",managedgroup.CallSign,self.callsigntxt,alphacheckbulls) text = string.format("%s. %s. Alpha Check. %s",managedgroup.CallSign,self.callsigntxt,alphacheckbulls)
self:__CheckedIn(1,managedgroup.GID) self:__CheckedIn(1,managedgroup.GID)
self:__AssignAnchor(5,managedgroup.GID) self:__AssignAnchor(5,managedgroup.GID)
else else
@ -1723,11 +1811,14 @@ function AWACS:_SetClientMenus()
local picture = MENU_GROUP_COMMAND:New(grp,"Picture",basemenu,self._Picture,self,grp) local picture = MENU_GROUP_COMMAND:New(grp,"Picture",basemenu,self._Picture,self,grp)
local bogeydope = MENU_GROUP_COMMAND:New(grp,"Bogey Dope",basemenu,self._BogeyDope,self,grp) local bogeydope = MENU_GROUP_COMMAND:New(grp,"Bogey Dope",basemenu,self._BogeyDope,self,grp)
local declare = MENU_GROUP_COMMAND:New(grp,"Declare",basemenu,self._Declare,self,grp) local declare = MENU_GROUP_COMMAND:New(grp,"Declare",basemenu,self._Declare,self,grp)
local tasking = MENU_GROUP:New(grp,"Tasking",basemenu) local tasking = MENU_GROUP:New(grp,"Tasking",basemenu)
local showtask = MENU_GROUP_COMMAND:New(grp,"Showtask",tasking,self._Showtask,self,grp) local showtask = MENU_GROUP_COMMAND:New(grp,"Showtask",tasking,self._Showtask,self,grp)
local judy = MENU_GROUP_COMMAND:New(grp,"Judy",tasking,self._Judy,self,grp) local commit = MENU_GROUP_COMMAND:New(grp,"Commit",tasking,self._Commit,self,grp)
local unable = MENU_GROUP_COMMAND:New(grp,"Unable",tasking,self._Unable,self,grp) local unable = MENU_GROUP_COMMAND:New(grp,"Unable",tasking,self._Unable,self,grp)
local abort = MENU_GROUP_COMMAND:New(grp,"Abort",tasking,self._TaskAbort,self,grp) local abort = MENU_GROUP_COMMAND:New(grp,"Abort",tasking,self._TaskAbort,self,grp)
local judy = MENU_GROUP_COMMAND:New(grp,"Judy",tasking,self._Judy,self,grp):Refresh()
local checkout = MENU_GROUP_COMMAND:New(grp,"Check Out",basemenu,self._CheckOut,self,grp):Refresh() local checkout = MENU_GROUP_COMMAND:New(grp,"Check Out",basemenu,self._CheckOut,self,grp):Refresh()
clientmenus[grp:GetName()] = { -- #AWACS.MenuStructure clientmenus[grp:GetName()] = { -- #AWACS.MenuStructure
groupname = grp:GetName(), groupname = grp:GetName(),
@ -1737,10 +1828,12 @@ function AWACS:_SetClientMenus()
picture = picture, picture = picture,
bogeydope = bogeydope, bogeydope = bogeydope,
declare = declare, declare = declare,
tasking = tasking,
showtask = showtask, showtask = showtask,
judy = judy, judy = judy,
unable = unable, unable = unable,
abort = abort, abort = abort,
commit=commit,
} }
elseif not clientmenus[grp:GetName()] then elseif not clientmenus[grp:GetName()] then
-- check in only -- check in only
@ -1762,11 +1855,14 @@ function AWACS:_SetClientMenus()
local picture = MENU_COALITION_COMMAND:New(self.coalition,"Picture",basemenu,self._Picture,self,grp) local picture = MENU_COALITION_COMMAND:New(self.coalition,"Picture",basemenu,self._Picture,self,grp)
local bogeydope = MENU_COALITION_COMMAND:New(self.coalition,"Bogey Dope",basemenu,self._BogeyDope,self,grp) local bogeydope = MENU_COALITION_COMMAND:New(self.coalition,"Bogey Dope",basemenu,self._BogeyDope,self,grp)
local declare = MENU_COALITION_COMMAND:New(self.coalition,"Declare",basemenu,self._Declare,self,grp) local declare = MENU_COALITION_COMMAND:New(self.coalition,"Declare",basemenu,self._Declare,self,grp)
local tasking = MENU_GROUP:New(grp,"Tasking",basemenu) local tasking = MENU_GROUP:New(grp,"Tasking",basemenu)
local showtask = MENU_GROUP_COMMAND:New(grp,"Showtask",tasking,self._Showtask,self,grp) local showtask = MENU_GROUP_COMMAND:New(grp,"Showtask",tasking,self._Showtask,self,grp)
local judy = MENU_GROUP_COMMAND:New(grp,"Judy",tasking,self._Judy,self,grp) local commit = MENU_GROUP_COMMAND:New(grp,"Commit",tasking,self._Commit,self,grp)
local unable = MENU_GROUP_COMMAND:New(grp,"Unable",tasking,self._Unable,self,grp) local unable = MENU_GROUP_COMMAND:New(grp,"Unable",tasking,self._Unable,self,grp)
local abort = MENU_GROUP_COMMAND:New(grp,"Abort",tasking,self._TaskAbort,self,grp) local abort = MENU_GROUP_COMMAND:New(grp,"Abort",tasking,self._TaskAbort,self,grp)
local judy = MENU_GROUP_COMMAND:New(grp,"Judy",tasking,self._Judy,self,grp):Refresh()
local checkin = MENU_COALITION_COMMAND:New(self.coalition,"Check In",basemenu,self._CheckIn,self,grp) local checkin = MENU_COALITION_COMMAND:New(self.coalition,"Check In",basemenu,self._CheckIn,self,grp)
local checkout = MENU_COALITION_COMMAND:New(self.coalition,"Check Out",basemenu,self._CheckOut,self,grp):Refresh() local checkout = MENU_COALITION_COMMAND:New(self.coalition,"Check Out",basemenu,self._CheckOut,self,grp):Refresh()
clientmenus[grp:GetName()] = { -- #AWACS.MenuStructure clientmenus[grp:GetName()] = { -- #AWACS.MenuStructure
@ -1779,9 +1875,11 @@ function AWACS:_SetClientMenus()
bogeydope = bogeydope, bogeydope = bogeydope,
declare = declare, declare = declare,
showtask = showtask, showtask = showtask,
tasking = tasking,
judy = judy, judy = judy,
unable = unable, unable = unable,
abort = abort, abort = abort,
commit = commit,
} }
end end
end end
@ -1949,7 +2047,8 @@ function AWACS:_StartIntel(awacs)
local intel = INTEL:New(self.DetectionSet,self.coalition,self.callsigntxt) local intel = INTEL:New(self.DetectionSet,self.coalition,self.callsigntxt)
--intel:SetVerbosity(2) --intel:SetVerbosity(2)
intel:SetClusterAnalysis(true,self.debug) intel:SetClusterAnalysis(true,false)
if self.NoHelos then if self.NoHelos then
intel:SetFilterCategory({Unit.Category.AIRPLANE}) intel:SetFilterCategory({Unit.Category.AIRPLANE})
else else
@ -2261,9 +2360,9 @@ function AWACS:_LogStatistics()
local text = string.gsub(text,"{","\n") local text = string.gsub(text,"{","\n")
local text = string.gsub(text,"}","") local text = string.gsub(text,"}","")
local text = string.gsub(text,"="," = ") local text = string.gsub(text,"="," = ")
self:T(text) self:I(text)
if self.MonitoringOn then if self.MonitoringOn then
MESSAGE:New(text,20,"AWACS",true):ToAll() MESSAGE:New(text,20,"AWACS",false):ToAll()
end end
return self return self
end end
@ -2404,7 +2503,7 @@ function AWACS:_AnnounceContact(Contact,IsNew,Group,IsBogeyDope,Tag,IsPopup,Repo
if Tag and Tag ~= "" then if Tag and Tag ~= "" then
BRAText = BRAText .. " "..Tag.."." BRAText = BRAText .. " "..Tag.."."
BRAText = BRAText .. " "..Tag.."." TextScreen = TextScreen .. " "..Tag.."."
end end
BRAText = BRAText .. " "..threatsizetext..". "..BRAfromBulls BRAText = BRAText .. " "..threatsizetext..". "..BRAfromBulls
@ -2413,11 +2512,12 @@ function AWACS:_AnnounceContact(Contact,IsNew,Group,IsBogeyDope,Tag,IsPopup,Repo
if self.ModernEra then if self.ModernEra then
-- Platform -- Platform
if ReportingName and ReportingName ~= "Bogey" then if ReportingName and ReportingName ~= "Bogey" then
BRAText = BRAText .. " "..ReportingName.."." ReportingName = string.gsub(ReportingName,"_"," ")
TextScreen = TextScreen .. " "..ReportingName.."." BRAText = BRAText .. ". "..ReportingName.."."
TextScreen = TextScreen .. ". "..ReportingName.."."
end end
-- High - > 40k feet -- High - > 40k feet
local height = contact.group:GetAltitude() local height = contact.group:GetHeight()
local height = UTILS.Round(UTILS.MetersToFeet(height)/1000,0) -- e.g, 25 local height = UTILS.Round(UTILS.MetersToFeet(height)/1000,0) -- e.g, 25
if height >= 40 then if height >= 40 then
BRAText = BRAText .. " High." BRAText = BRAText .. " High."
@ -2970,7 +3070,7 @@ function AWACS:onafterStatus(From, Event, To)
end end
if self.debug then if self.debug then
self:T(report:Text()) self:I(report:Text())
end end
-- Check on AUFTRAG status for CAP AI -- Check on AUFTRAG status for CAP AI
@ -2979,7 +3079,8 @@ function AWACS:onafterStatus(From, Event, To)
end end
else else
-- do other stuff -- do other stuff, AWACS dead?
-- TODO AWACS dead
end end
@ -2989,15 +3090,15 @@ function AWACS:onafterStatus(From, Event, To)
end end
monitoringdata.AwacsShiftChange = self.ShiftChangeAwacsFlag monitoringdata.AwacsShiftChange = self.ShiftChangeAwacsFlag
if self.AwacsFG then if self.AwacsFG then
monitoringdata.AwacsStateFG = self.AwacsFG:GetState() monitoringdata.AwacsStateFG = self.AwacsFG:GetState()
end end
monitoringdata.AwacsStateMission = self.AwacsMission:GetState() monitoringdata.AwacsStateMission = self.AwacsMission:GetState()
--monitoringdata.EscortsStateMission = self.Escor
monitoringdata.EscortsShiftChange = self.ShiftChangeEscortsFlag monitoringdata.EscortsShiftChange = self.ShiftChangeEscortsFlag
monitoringdata.AICAPCurrent = self.AICAPMissions:Count() monitoringdata.AICAPCurrent = self.AICAPMissions:Count()
monitoringdata.AICAPMax = self.MaxAIonCAP monitoringdata.AICAPMax = self.MaxAIonCAP
--monitoringdata.Players = self.clientset:CountAlive()
monitoringdata.Airwings = self.CAPAirwings:Count() monitoringdata.Airwings = self.CAPAirwings:Count()
self.MonitoringData = monitoringdata self.MonitoringData = monitoringdata
@ -3006,6 +3107,14 @@ function AWACS:onafterStatus(From, Event, To)
self:_LogStatistics() self:_LogStatistics()
end end
local picturetime = timer.getTime() - self.PictureTimeStamp
if self.AwacsInZone and picturetime > self.PictureInterval then
-- reset timer
self.PictureTimeStamp = timer.getTime()
self:_Picture(nil,true)
end
self:__Status(30) self:__Status(30)
return self return self
@ -3266,7 +3375,7 @@ function AWACS:onafterCheckRadioQueue(From,Event,To)
if self:Is("Running") then if self:Is("Running") then
-- exit if stopped -- exit if stopped
self:__CheckRadioQueue(nextcall+3) self:__CheckRadioQueue(nextcall+2)
end end
return self return self
end end
@ -3417,7 +3526,7 @@ AwacsAW2:NewPayload("CAP 2-1",-1,{AUFTRAG.Type.ALERT5,AUFTRAG.Type.CAP, AUFTRAG.
-- Get AWACS started -- Get AWACS started
local testawacs = AWACS:New("AWACS North",AwacsAW,"blue",AIRBASE.Caucasus.Kutaisi,"Awacs Orbit",ZONE:FindByName("NW Zone"),"Anchor One",255,radio.modulation.AM ) local testawacs = AWACS:New("AWACS North",AwacsAW,"blue",AIRBASE.Caucasus.Kutaisi,"Awacs Orbit",ZONE:FindByName("NW Zone"),"Anchor One",255,radio.modulation.AM )
testawacs:SetEscort(2) testawacs:SetEscort(2)
testawacs:SetAwacsDetails(CALLSIGN.AWACS.Darkstar,1,300,300,60,20) testawacs:SetAwacsDetails(CALLSIGN.AWACS.Wizard,1,30,300,243,30)
testawacs:SetSRS("E:\\Program Files\\DCS-SimpleRadio-Standalone","female","en-GB",5010,nil) testawacs:SetSRS("E:\\Program Files\\DCS-SimpleRadio-Standalone","female","en-GB",5010,nil)
testawacs:AddCAPAirWing(AwacsAW2) testawacs:AddCAPAirWing(AwacsAW2)
testawacs:__Start(5) testawacs:__Start(5)

View File

@ -92,9 +92,15 @@ OPSZONE.version="0.3.0"
--- Create a new OPSZONE class object. --- Create a new OPSZONE class object.
-- @param #OPSZONE self -- @param #OPSZONE self
-- @param Core.Zone#ZONE Zone The zone. -- @param Core.Zone#ZONE Zone The zone. Needs to be a ZONE\_RADIUS (round) zone. Can be passed as ZONE\_AIRBASE or simply as the name of the airbase.
-- @param #number CoalitionOwner Initial owner of the coaliton. Default `coalition.side.NEUTRAL`. -- @param #number CoalitionOwner Initial owner of the coaliton. Default `coalition.side.NEUTRAL`.
-- @return #OPSZONE self -- @return #OPSZONE self
-- @usage
-- myopszone = OPSZONE:New(ZONE:FindByName("OpsZoneOne"),coalition.side.RED) -- base zone from the mission editor
-- myopszone = OPSZONE:New(ZONE_RADIUS:New("OpsZoneTwo",mycoordinate:GetVec2(),5000),coalition.side.BLUE) -- radius zone of 5km at a coordinate
-- myopszone = OPSZONE:New(ZONE_RADIUS:New("Batumi")) -- airbase zone from Batumi Airbase, ca 2500m radius
-- myopszone = OPSZONE:New(ZONE_AIRBASE:New("Batumi",6000),coalition.side.BLUE) -- airbase zone from Batumi Airbase, but with a specific radius of 6km
--
function OPSZONE:New(Zone, CoalitionOwner) function OPSZONE:New(Zone, CoalitionOwner)
-- Inherit everything from LEGION class. -- Inherit everything from LEGION class.

View File

@ -1023,6 +1023,8 @@ function GROUP:GetCoordinate()
if FirstUnit then if FirstUnit then
local FirstUnitCoordinate = FirstUnit:GetCoordinate() local FirstUnitCoordinate = FirstUnit:GetCoordinate()
local Heading = self:GetHeading()
FirstUnitCoordinate.Heading = Heading
return FirstUnitCoordinate return FirstUnitCoordinate
end end

View File

@ -376,7 +376,8 @@ function POSITIONABLE:GetCoordinate()
local PositionableVec3 = self:GetVec3() local PositionableVec3 = self:GetVec3()
local coord=COORDINATE:NewFromVec3(PositionableVec3) local coord=COORDINATE:NewFromVec3(PositionableVec3)
local heading = self:GetHeading()
coord.Heading = heading
-- Return a new coordiante object. -- Return a new coordiante object.
return coord return coord