From 24a6d375002234cbc36c7f99b4c78b5f887b30df Mon Sep 17 00:00:00 2001 From: Sven Van de Velde Date: Sun, 11 Dec 2016 11:01:06 +0100 Subject: [PATCH 01/11] Progress --- Moose Development/Moose/Core/Event.lua | 9 +- Moose Development/Moose/Core/Point.lua | 2 +- Moose Development/Moose/Core/Zone.lua | 6 +- Moose Development/Moose/Dcs/DCStrigger.lua | 3 + Moose Development/Moose/Fsm/Fsm.lua | 4 +- .../Moose/Functional/AirbasePolice.lua | 130 +++++++++--------- .../Moose/Functional/Detection.lua | 4 +- Moose Development/Moose/Functional/Escort.lua | 8 +- .../Moose/Tasking/CommandCenter.lua | 3 +- Moose Development/Moose/Tasking/Mission.lua | 6 +- Moose Development/Moose/Tasking/Task.lua | 31 ++--- Moose Development/Moose/Wrapper/Unit.lua | 32 +---- .../SET-101 - Group Sets.lua | 6 +- .../TSK-010 - Task Modelling - SEAD.lua | 32 ++++- .../TSK-010 - Task Modelling - SEAD.miz | Bin 28124 -> 28154 bytes .../ZON-100 - Normal Zone.lua | 2 +- .../ZON-400 - Radius Zone.lua | 2 +- .../ZON-500 - Polygon Zone.lua | 2 +- 18 files changed, 136 insertions(+), 146 deletions(-) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 623005ae2..f90096791 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -87,16 +87,13 @@ function EVENT:Init( EventID, EventClass ) self:F3( { _EVENTCODES[EventID], EventClass } ) if not self.Events[EventID] then - self.Events[EventID] = {} - -- Create a WEAK table to ensure that the garbage collector is cleaning the event links when the object usage is cleaned. - local Meta = {} - setmetatable( self.Events[EventID], Meta ) - Meta.__mode = "k" + self.Events[EventID] = setmetatable( {}, { __mode = "k" } ) + end if not self.Events[EventID][EventClass] then - self.Events[EventID][EventClass] = {} + self.Events[EventID][EventClass] = setmetatable( {}, { __mode = "v" } ) end return self.Events[EventID][EventClass] end diff --git a/Moose Development/Moose/Core/Point.lua b/Moose Development/Moose/Core/Point.lua index 6beef3dc7..4269fb4cc 100644 --- a/Moose Development/Moose/Core/Point.lua +++ b/Moose Development/Moose/Core/Point.lua @@ -62,7 +62,7 @@ -- @field #number x The x coordinate in 3D space. -- @field #number y The y coordinate in 3D space. -- @field #number z The z coordiante in 3D space. --- @field #POINT_VEC3.SmokeColor SmokeColor +-- @field Utilities.Utils#SMOKECOLOR SmokeColor -- @field Utilities.Utils#FLARECOLOR FlareColor -- @field #POINT_VEC3.RoutePointAltType RoutePointAltType -- @field #POINT_VEC3.RoutePointType RoutePointType diff --git a/Moose Development/Moose/Core/Zone.lua b/Moose Development/Moose/Core/Zone.lua index e02d256ae..d0b8c635c 100644 --- a/Moose Development/Moose/Core/Zone.lua +++ b/Moose Development/Moose/Core/Zone.lua @@ -230,7 +230,7 @@ end --- Smokes the zone boundaries in a color. -- @param #ZONE_BASE self --- @param SmokeColor The smoke color. +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color. function ZONE_BASE:SmokeZone( SmokeColor ) self:F2( SmokeColor ) @@ -298,7 +298,7 @@ end --- Smokes the zone boundaries in a color. -- @param #ZONE_RADIUS self --- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color. -- @param #number Points (optional) The amount of points in the circle. -- @return #ZONE_RADIUS self function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) @@ -689,7 +689,7 @@ end --- Smokes the zone boundaries in a color. -- @param #ZONE_POLYGON_BASE self --- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color. -- @return #ZONE_POLYGON_BASE self function ZONE_POLYGON_BASE:SmokeZone( SmokeColor ) self:F2( SmokeColor ) diff --git a/Moose Development/Moose/Dcs/DCStrigger.lua b/Moose Development/Moose/Dcs/DCStrigger.lua index 408e75689..7bf5360be 100644 --- a/Moose Development/Moose/Dcs/DCStrigger.lua +++ b/Moose Development/Moose/Dcs/DCStrigger.lua @@ -3,3 +3,6 @@ trigger = {} --#timer + + + \ No newline at end of file diff --git a/Moose Development/Moose/Fsm/Fsm.lua b/Moose Development/Moose/Fsm/Fsm.lua index 04b424afa..373b544c8 100644 --- a/Moose Development/Moose/Fsm/Fsm.lua +++ b/Moose Development/Moose/Fsm/Fsm.lua @@ -491,6 +491,8 @@ do -- FSM_PROCESS function FSM_PROCESS:New( Controllable, Task ) local self = BASE:Inherit( self, FSM_CONTROLLABLE:New() ) -- Fsm.Fsm#FSM_PROCESS + + self:F( Controllable, Task ) self:Assign( Controllable, Task ) @@ -631,7 +633,7 @@ do -- FSM_PROCESS self:E( { ProcessUnit, Event, From, To, Dummy, self:IsTrace() } ) if self:IsTrace() then - MESSAGE:New( "Process " .. self.ProcessName .. " : " .. Event .. " changed to state " .. To, 15 ):ToAll() + MESSAGE:New( "Process " .. self:GetClassNameAndID() .. " : " .. Event .. " changed to state " .. To, 15 ):ToAll() end self:E( self.Scores[To] ) diff --git a/Moose Development/Moose/Functional/AirbasePolice.lua b/Moose Development/Moose/Functional/AirbasePolice.lua index 661f64ec0..45af50d9f 100644 --- a/Moose Development/Moose/Functional/AirbasePolice.lua +++ b/Moose Development/Moose/Functional/AirbasePolice.lua @@ -85,18 +85,18 @@ function AIRBASEPOLICE_BASE:New( SetClient, Airbases ) self.Airbases = Airbases for AirbaseID, Airbase in pairs( self.Airbases ) do - Airbase.ZoneBoundary = ZONE_POLYGON_BASE:New( "Boundary", Airbase.PointsBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + Airbase.ZoneBoundary = ZONE_POLYGON_BASE:New( "Boundary", Airbase.PointsBoundary ):SmokeZone(SMOKECOLOR.White):Flush() for PointsRunwayID, PointsRunway in pairs( Airbase.PointsRunways ) do - Airbase.ZoneRunways[PointsRunwayID] = ZONE_POLYGON_BASE:New( "Runway " .. PointsRunwayID, PointsRunway ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + Airbase.ZoneRunways[PointsRunwayID] = ZONE_POLYGON_BASE:New( "Runway " .. PointsRunwayID, PointsRunway ):SmokeZone(SMOKECOLOR.Red):Flush() end end -- -- Template -- local TemplateBoundary = GROUP:FindByName( "Template Boundary" ) --- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() +-- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local TemplateRunway1 = GROUP:FindByName( "Template Runway 1" ) --- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() self.SetClient:ForEachClient( --- @param Wrapper.Client#CLIENT Client @@ -749,197 +749,197 @@ function AIRBASEPOLICE_CAUCASUS:New( SetClient ) -- -- AnapaVityazevo -- local AnapaVityazevoBoundary = GROUP:FindByName( "AnapaVityazevo Boundary" ) - -- self.Airbases.AnapaVityazevo.ZoneBoundary = ZONE_POLYGON:New( "AnapaVityazevo Boundary", AnapaVityazevoBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.AnapaVityazevo.ZoneBoundary = ZONE_POLYGON:New( "AnapaVityazevo Boundary", AnapaVityazevoBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local AnapaVityazevoRunway1 = GROUP:FindByName( "AnapaVityazevo Runway 1" ) - -- self.Airbases.AnapaVityazevo.ZoneRunways[1] = ZONE_POLYGON:New( "AnapaVityazevo Runway 1", AnapaVityazevoRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.AnapaVityazevo.ZoneRunways[1] = ZONE_POLYGON:New( "AnapaVityazevo Runway 1", AnapaVityazevoRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Batumi -- local BatumiBoundary = GROUP:FindByName( "Batumi Boundary" ) - -- self.Airbases.Batumi.ZoneBoundary = ZONE_POLYGON:New( "Batumi Boundary", BatumiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Batumi.ZoneBoundary = ZONE_POLYGON:New( "Batumi Boundary", BatumiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local BatumiRunway1 = GROUP:FindByName( "Batumi Runway 1" ) - -- self.Airbases.Batumi.ZoneRunways[1] = ZONE_POLYGON:New( "Batumi Runway 1", BatumiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Batumi.ZoneRunways[1] = ZONE_POLYGON:New( "Batumi Runway 1", BatumiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Beslan -- local BeslanBoundary = GROUP:FindByName( "Beslan Boundary" ) - -- self.Airbases.Beslan.ZoneBoundary = ZONE_POLYGON:New( "Beslan Boundary", BeslanBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Beslan.ZoneBoundary = ZONE_POLYGON:New( "Beslan Boundary", BeslanBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local BeslanRunway1 = GROUP:FindByName( "Beslan Runway 1" ) - -- self.Airbases.Beslan.ZoneRunways[1] = ZONE_POLYGON:New( "Beslan Runway 1", BeslanRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Beslan.ZoneRunways[1] = ZONE_POLYGON:New( "Beslan Runway 1", BeslanRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Gelendzhik -- local GelendzhikBoundary = GROUP:FindByName( "Gelendzhik Boundary" ) - -- self.Airbases.Gelendzhik.ZoneBoundary = ZONE_POLYGON:New( "Gelendzhik Boundary", GelendzhikBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Gelendzhik.ZoneBoundary = ZONE_POLYGON:New( "Gelendzhik Boundary", GelendzhikBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local GelendzhikRunway1 = GROUP:FindByName( "Gelendzhik Runway 1" ) - -- self.Airbases.Gelendzhik.ZoneRunways[1] = ZONE_POLYGON:New( "Gelendzhik Runway 1", GelendzhikRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Gelendzhik.ZoneRunways[1] = ZONE_POLYGON:New( "Gelendzhik Runway 1", GelendzhikRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Gudauta -- local GudautaBoundary = GROUP:FindByName( "Gudauta Boundary" ) - -- self.Airbases.Gudauta.ZoneBoundary = ZONE_POLYGON:New( "Gudauta Boundary", GudautaBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Gudauta.ZoneBoundary = ZONE_POLYGON:New( "Gudauta Boundary", GudautaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local GudautaRunway1 = GROUP:FindByName( "Gudauta Runway 1" ) - -- self.Airbases.Gudauta.ZoneRunways[1] = ZONE_POLYGON:New( "Gudauta Runway 1", GudautaRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Gudauta.ZoneRunways[1] = ZONE_POLYGON:New( "Gudauta Runway 1", GudautaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Kobuleti -- local KobuletiBoundary = GROUP:FindByName( "Kobuleti Boundary" ) - -- self.Airbases.Kobuleti.ZoneBoundary = ZONE_POLYGON:New( "Kobuleti Boundary", KobuletiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Kobuleti.ZoneBoundary = ZONE_POLYGON:New( "Kobuleti Boundary", KobuletiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local KobuletiRunway1 = GROUP:FindByName( "Kobuleti Runway 1" ) - -- self.Airbases.Kobuleti.ZoneRunways[1] = ZONE_POLYGON:New( "Kobuleti Runway 1", KobuletiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Kobuleti.ZoneRunways[1] = ZONE_POLYGON:New( "Kobuleti Runway 1", KobuletiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- KrasnodarCenter -- local KrasnodarCenterBoundary = GROUP:FindByName( "KrasnodarCenter Boundary" ) - -- self.Airbases.KrasnodarCenter.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarCenter Boundary", KrasnodarCenterBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.KrasnodarCenter.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarCenter Boundary", KrasnodarCenterBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local KrasnodarCenterRunway1 = GROUP:FindByName( "KrasnodarCenter Runway 1" ) - -- self.Airbases.KrasnodarCenter.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarCenter Runway 1", KrasnodarCenterRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.KrasnodarCenter.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarCenter Runway 1", KrasnodarCenterRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- KrasnodarPashkovsky -- local KrasnodarPashkovskyBoundary = GROUP:FindByName( "KrasnodarPashkovsky Boundary" ) - -- self.Airbases.KrasnodarPashkovsky.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarPashkovsky Boundary", KrasnodarPashkovskyBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.KrasnodarPashkovsky.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarPashkovsky Boundary", KrasnodarPashkovskyBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local KrasnodarPashkovskyRunway1 = GROUP:FindByName( "KrasnodarPashkovsky Runway 1" ) - -- self.Airbases.KrasnodarPashkovsky.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 1", KrasnodarPashkovskyRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.KrasnodarPashkovsky.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 1", KrasnodarPashkovskyRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- local KrasnodarPashkovskyRunway2 = GROUP:FindByName( "KrasnodarPashkovsky Runway 2" ) - -- self.Airbases.KrasnodarPashkovsky.ZoneRunways[2] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 2", KrasnodarPashkovskyRunway2 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.KrasnodarPashkovsky.ZoneRunways[2] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 2", KrasnodarPashkovskyRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Krymsk -- local KrymskBoundary = GROUP:FindByName( "Krymsk Boundary" ) - -- self.Airbases.Krymsk.ZoneBoundary = ZONE_POLYGON:New( "Krymsk Boundary", KrymskBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Krymsk.ZoneBoundary = ZONE_POLYGON:New( "Krymsk Boundary", KrymskBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local KrymskRunway1 = GROUP:FindByName( "Krymsk Runway 1" ) - -- self.Airbases.Krymsk.ZoneRunways[1] = ZONE_POLYGON:New( "Krymsk Runway 1", KrymskRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Krymsk.ZoneRunways[1] = ZONE_POLYGON:New( "Krymsk Runway 1", KrymskRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Kutaisi -- local KutaisiBoundary = GROUP:FindByName( "Kutaisi Boundary" ) - -- self.Airbases.Kutaisi.ZoneBoundary = ZONE_POLYGON:New( "Kutaisi Boundary", KutaisiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Kutaisi.ZoneBoundary = ZONE_POLYGON:New( "Kutaisi Boundary", KutaisiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local KutaisiRunway1 = GROUP:FindByName( "Kutaisi Runway 1" ) - -- self.Airbases.Kutaisi.ZoneRunways[1] = ZONE_POLYGON:New( "Kutaisi Runway 1", KutaisiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Kutaisi.ZoneRunways[1] = ZONE_POLYGON:New( "Kutaisi Runway 1", KutaisiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- MaykopKhanskaya -- local MaykopKhanskayaBoundary = GROUP:FindByName( "MaykopKhanskaya Boundary" ) - -- self.Airbases.MaykopKhanskaya.ZoneBoundary = ZONE_POLYGON:New( "MaykopKhanskaya Boundary", MaykopKhanskayaBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.MaykopKhanskaya.ZoneBoundary = ZONE_POLYGON:New( "MaykopKhanskaya Boundary", MaykopKhanskayaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local MaykopKhanskayaRunway1 = GROUP:FindByName( "MaykopKhanskaya Runway 1" ) - -- self.Airbases.MaykopKhanskaya.ZoneRunways[1] = ZONE_POLYGON:New( "MaykopKhanskaya Runway 1", MaykopKhanskayaRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.MaykopKhanskaya.ZoneRunways[1] = ZONE_POLYGON:New( "MaykopKhanskaya Runway 1", MaykopKhanskayaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- MineralnyeVody -- local MineralnyeVodyBoundary = GROUP:FindByName( "MineralnyeVody Boundary" ) - -- self.Airbases.MineralnyeVody.ZoneBoundary = ZONE_POLYGON:New( "MineralnyeVody Boundary", MineralnyeVodyBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.MineralnyeVody.ZoneBoundary = ZONE_POLYGON:New( "MineralnyeVody Boundary", MineralnyeVodyBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local MineralnyeVodyRunway1 = GROUP:FindByName( "MineralnyeVody Runway 1" ) - -- self.Airbases.MineralnyeVody.ZoneRunways[1] = ZONE_POLYGON:New( "MineralnyeVody Runway 1", MineralnyeVodyRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.MineralnyeVody.ZoneRunways[1] = ZONE_POLYGON:New( "MineralnyeVody Runway 1", MineralnyeVodyRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Mozdok -- local MozdokBoundary = GROUP:FindByName( "Mozdok Boundary" ) - -- self.Airbases.Mozdok.ZoneBoundary = ZONE_POLYGON:New( "Mozdok Boundary", MozdokBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Mozdok.ZoneBoundary = ZONE_POLYGON:New( "Mozdok Boundary", MozdokBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local MozdokRunway1 = GROUP:FindByName( "Mozdok Runway 1" ) - -- self.Airbases.Mozdok.ZoneRunways[1] = ZONE_POLYGON:New( "Mozdok Runway 1", MozdokRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Mozdok.ZoneRunways[1] = ZONE_POLYGON:New( "Mozdok Runway 1", MozdokRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Nalchik -- local NalchikBoundary = GROUP:FindByName( "Nalchik Boundary" ) - -- self.Airbases.Nalchik.ZoneBoundary = ZONE_POLYGON:New( "Nalchik Boundary", NalchikBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Nalchik.ZoneBoundary = ZONE_POLYGON:New( "Nalchik Boundary", NalchikBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local NalchikRunway1 = GROUP:FindByName( "Nalchik Runway 1" ) - -- self.Airbases.Nalchik.ZoneRunways[1] = ZONE_POLYGON:New( "Nalchik Runway 1", NalchikRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Nalchik.ZoneRunways[1] = ZONE_POLYGON:New( "Nalchik Runway 1", NalchikRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Novorossiysk -- local NovorossiyskBoundary = GROUP:FindByName( "Novorossiysk Boundary" ) - -- self.Airbases.Novorossiysk.ZoneBoundary = ZONE_POLYGON:New( "Novorossiysk Boundary", NovorossiyskBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Novorossiysk.ZoneBoundary = ZONE_POLYGON:New( "Novorossiysk Boundary", NovorossiyskBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local NovorossiyskRunway1 = GROUP:FindByName( "Novorossiysk Runway 1" ) - -- self.Airbases.Novorossiysk.ZoneRunways[1] = ZONE_POLYGON:New( "Novorossiysk Runway 1", NovorossiyskRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Novorossiysk.ZoneRunways[1] = ZONE_POLYGON:New( "Novorossiysk Runway 1", NovorossiyskRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- SenakiKolkhi -- local SenakiKolkhiBoundary = GROUP:FindByName( "SenakiKolkhi Boundary" ) - -- self.Airbases.SenakiKolkhi.ZoneBoundary = ZONE_POLYGON:New( "SenakiKolkhi Boundary", SenakiKolkhiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.SenakiKolkhi.ZoneBoundary = ZONE_POLYGON:New( "SenakiKolkhi Boundary", SenakiKolkhiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local SenakiKolkhiRunway1 = GROUP:FindByName( "SenakiKolkhi Runway 1" ) - -- self.Airbases.SenakiKolkhi.ZoneRunways[1] = ZONE_POLYGON:New( "SenakiKolkhi Runway 1", SenakiKolkhiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.SenakiKolkhi.ZoneRunways[1] = ZONE_POLYGON:New( "SenakiKolkhi Runway 1", SenakiKolkhiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- SochiAdler -- local SochiAdlerBoundary = GROUP:FindByName( "SochiAdler Boundary" ) - -- self.Airbases.SochiAdler.ZoneBoundary = ZONE_POLYGON:New( "SochiAdler Boundary", SochiAdlerBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.SochiAdler.ZoneBoundary = ZONE_POLYGON:New( "SochiAdler Boundary", SochiAdlerBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local SochiAdlerRunway1 = GROUP:FindByName( "SochiAdler Runway 1" ) - -- self.Airbases.SochiAdler.ZoneRunways[1] = ZONE_POLYGON:New( "SochiAdler Runway 1", SochiAdlerRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.SochiAdler.ZoneRunways[1] = ZONE_POLYGON:New( "SochiAdler Runway 1", SochiAdlerRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- local SochiAdlerRunway2 = GROUP:FindByName( "SochiAdler Runway 2" ) - -- self.Airbases.SochiAdler.ZoneRunways[2] = ZONE_POLYGON:New( "SochiAdler Runway 2", SochiAdlerRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.SochiAdler.ZoneRunways[2] = ZONE_POLYGON:New( "SochiAdler Runway 2", SochiAdlerRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Soganlug -- local SoganlugBoundary = GROUP:FindByName( "Soganlug Boundary" ) - -- self.Airbases.Soganlug.ZoneBoundary = ZONE_POLYGON:New( "Soganlug Boundary", SoganlugBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Soganlug.ZoneBoundary = ZONE_POLYGON:New( "Soganlug Boundary", SoganlugBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local SoganlugRunway1 = GROUP:FindByName( "Soganlug Runway 1" ) - -- self.Airbases.Soganlug.ZoneRunways[1] = ZONE_POLYGON:New( "Soganlug Runway 1", SoganlugRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Soganlug.ZoneRunways[1] = ZONE_POLYGON:New( "Soganlug Runway 1", SoganlugRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- SukhumiBabushara -- local SukhumiBabusharaBoundary = GROUP:FindByName( "SukhumiBabushara Boundary" ) - -- self.Airbases.SukhumiBabushara.ZoneBoundary = ZONE_POLYGON:New( "SukhumiBabushara Boundary", SukhumiBabusharaBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.SukhumiBabushara.ZoneBoundary = ZONE_POLYGON:New( "SukhumiBabushara Boundary", SukhumiBabusharaBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local SukhumiBabusharaRunway1 = GROUP:FindByName( "SukhumiBabushara Runway 1" ) - -- self.Airbases.SukhumiBabushara.ZoneRunways[1] = ZONE_POLYGON:New( "SukhumiBabushara Runway 1", SukhumiBabusharaRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.SukhumiBabushara.ZoneRunways[1] = ZONE_POLYGON:New( "SukhumiBabushara Runway 1", SukhumiBabusharaRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- TbilisiLochini -- local TbilisiLochiniBoundary = GROUP:FindByName( "TbilisiLochini Boundary" ) - -- self.Airbases.TbilisiLochini.ZoneBoundary = ZONE_POLYGON:New( "TbilisiLochini Boundary", TbilisiLochiniBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.TbilisiLochini.ZoneBoundary = ZONE_POLYGON:New( "TbilisiLochini Boundary", TbilisiLochiniBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local TbilisiLochiniRunway1 = GROUP:FindByName( "TbilisiLochini Runway 1" ) - -- self.Airbases.TbilisiLochini.ZoneRunways[1] = ZONE_POLYGON:New( "TbilisiLochini Runway 1", TbilisiLochiniRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.TbilisiLochini.ZoneRunways[1] = ZONE_POLYGON:New( "TbilisiLochini Runway 1", TbilisiLochiniRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- local TbilisiLochiniRunway2 = GROUP:FindByName( "TbilisiLochini Runway 2" ) - -- self.Airbases.TbilisiLochini.ZoneRunways[2] = ZONE_POLYGON:New( "TbilisiLochini Runway 2", TbilisiLochiniRunway2 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.TbilisiLochini.ZoneRunways[2] = ZONE_POLYGON:New( "TbilisiLochini Runway 2", TbilisiLochiniRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- -- -- Vaziani -- local VazianiBoundary = GROUP:FindByName( "Vaziani Boundary" ) - -- self.Airbases.Vaziani.ZoneBoundary = ZONE_POLYGON:New( "Vaziani Boundary", VazianiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Vaziani.ZoneBoundary = ZONE_POLYGON:New( "Vaziani Boundary", VazianiBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local VazianiRunway1 = GROUP:FindByName( "Vaziani Runway 1" ) - -- self.Airbases.Vaziani.ZoneRunways[1] = ZONE_POLYGON:New( "Vaziani Runway 1", VazianiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Vaziani.ZoneRunways[1] = ZONE_POLYGON:New( "Vaziani Runway 1", VazianiRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- @@ -947,10 +947,10 @@ function AIRBASEPOLICE_CAUCASUS:New( SetClient ) -- Template -- local TemplateBoundary = GROUP:FindByName( "Template Boundary" ) - -- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() + -- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local TemplateRunway1 = GROUP:FindByName( "Template Runway 1" ) - -- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() + -- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() return self @@ -1143,49 +1143,49 @@ function AIRBASEPOLICE_NEVADA:New( SetClient ) -- -- Nellis -- local NellisBoundary = GROUP:FindByName( "Nellis Boundary" ) --- self.Airbases.Nellis.ZoneBoundary = ZONE_POLYGON:New( "Nellis Boundary", NellisBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() +-- self.Airbases.Nellis.ZoneBoundary = ZONE_POLYGON:New( "Nellis Boundary", NellisBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local NellisRunway1 = GROUP:FindByName( "Nellis Runway 1" ) --- self.Airbases.Nellis.ZoneRunways[1] = ZONE_POLYGON:New( "Nellis Runway 1", NellisRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.Nellis.ZoneRunways[1] = ZONE_POLYGON:New( "Nellis Runway 1", NellisRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- local NellisRunway2 = GROUP:FindByName( "Nellis Runway 2" ) --- self.Airbases.Nellis.ZoneRunways[2] = ZONE_POLYGON:New( "Nellis Runway 2", NellisRunway2 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.Nellis.ZoneRunways[2] = ZONE_POLYGON:New( "Nellis Runway 2", NellisRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- McCarran -- local McCarranBoundary = GROUP:FindByName( "McCarran Boundary" ) --- self.Airbases.McCarran.ZoneBoundary = ZONE_POLYGON:New( "McCarran Boundary", McCarranBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() +-- self.Airbases.McCarran.ZoneBoundary = ZONE_POLYGON:New( "McCarran Boundary", McCarranBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local McCarranRunway1 = GROUP:FindByName( "McCarran Runway 1" ) --- self.Airbases.McCarran.ZoneRunways[1] = ZONE_POLYGON:New( "McCarran Runway 1", McCarranRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.McCarran.ZoneRunways[1] = ZONE_POLYGON:New( "McCarran Runway 1", McCarranRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- local McCarranRunway2 = GROUP:FindByName( "McCarran Runway 2" ) --- self.Airbases.McCarran.ZoneRunways[2] = ZONE_POLYGON:New( "McCarran Runway 2", McCarranRunway2 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.McCarran.ZoneRunways[2] = ZONE_POLYGON:New( "McCarran Runway 2", McCarranRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- local McCarranRunway3 = GROUP:FindByName( "McCarran Runway 3" ) --- self.Airbases.McCarran.ZoneRunways[3] = ZONE_POLYGON:New( "McCarran Runway 3", McCarranRunway3 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.McCarran.ZoneRunways[3] = ZONE_POLYGON:New( "McCarran Runway 3", McCarranRunway3 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- local McCarranRunway4 = GROUP:FindByName( "McCarran Runway 4" ) --- self.Airbases.McCarran.ZoneRunways[4] = ZONE_POLYGON:New( "McCarran Runway 4", McCarranRunway4 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.McCarran.ZoneRunways[4] = ZONE_POLYGON:New( "McCarran Runway 4", McCarranRunway4 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- Creech -- local CreechBoundary = GROUP:FindByName( "Creech Boundary" ) --- self.Airbases.Creech.ZoneBoundary = ZONE_POLYGON:New( "Creech Boundary", CreechBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() +-- self.Airbases.Creech.ZoneBoundary = ZONE_POLYGON:New( "Creech Boundary", CreechBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local CreechRunway1 = GROUP:FindByName( "Creech Runway 1" ) --- self.Airbases.Creech.ZoneRunways[1] = ZONE_POLYGON:New( "Creech Runway 1", CreechRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.Creech.ZoneRunways[1] = ZONE_POLYGON:New( "Creech Runway 1", CreechRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- local CreechRunway2 = GROUP:FindByName( "Creech Runway 2" ) --- self.Airbases.Creech.ZoneRunways[2] = ZONE_POLYGON:New( "Creech Runway 2", CreechRunway2 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.Creech.ZoneRunways[2] = ZONE_POLYGON:New( "Creech Runway 2", CreechRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- -- Groom Lake -- local GroomLakeBoundary = GROUP:FindByName( "GroomLake Boundary" ) --- self.Airbases.GroomLake.ZoneBoundary = ZONE_POLYGON:New( "GroomLake Boundary", GroomLakeBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush() +-- self.Airbases.GroomLake.ZoneBoundary = ZONE_POLYGON:New( "GroomLake Boundary", GroomLakeBoundary ):SmokeZone(SMOKECOLOR.White):Flush() -- -- local GroomLakeRunway1 = GROUP:FindByName( "GroomLake Runway 1" ) --- self.Airbases.GroomLake.ZoneRunways[1] = ZONE_POLYGON:New( "GroomLake Runway 1", GroomLakeRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.GroomLake.ZoneRunways[1] = ZONE_POLYGON:New( "GroomLake Runway 1", GroomLakeRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() -- -- local GroomLakeRunway2 = GROUP:FindByName( "GroomLake Runway 2" ) --- self.Airbases.GroomLake.ZoneRunways[2] = ZONE_POLYGON:New( "GroomLake Runway 2", GroomLakeRunway2 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush() +-- self.Airbases.GroomLake.ZoneRunways[2] = ZONE_POLYGON:New( "GroomLake Runway 2", GroomLakeRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() end diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index 97977bdca..bd5df0de6 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -973,10 +973,10 @@ function DETECTION_AREAS:CreateDetectionSets() end ) if DETECTION_AREAS._FlareDetectedZones or self._FlareDetectedZones then - DetectedZone:FlareZone( POINT_VEC3.SmokeColor.White, 30, math.random( 0,90 ) ) + DetectedZone:FlareZone( SMOKECOLOR.White, 30, math.random( 0,90 ) ) end if DETECTION_AREAS._SmokeDetectedZones or self._SmokeDetectedZones then - DetectedZone:SmokeZone( POINT_VEC3.SmokeColor.White, 30 ) + DetectedZone:SmokeZone( SMOKECOLOR.White, 30 ) end end diff --git a/Moose Development/Moose/Functional/Escort.lua b/Moose Development/Moose/Functional/Escort.lua index aceec0bfc..96a28c453 100644 --- a/Moose Development/Moose/Functional/Escort.lua +++ b/Moose Development/Moose/Functional/Escort.lua @@ -494,10 +494,10 @@ function ESCORT:MenuFlare( MenuTextFormat ) if not self.EscortMenuFlare then self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) - self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) - self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) - self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) - self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = FLARECOLOR.Green, ParamMessage = "Released a green flare!" } ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = FLARECOLOR.Red, ParamMessage = "Released a red flare!" } ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = FLARECOLOR.White, ParamMessage = "Released a white flare!" } ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = FLARECOLOR.Yellow, ParamMessage = "Released a yellow flare!" } ) end return self diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index 7e049b2de..7157dddff 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -64,8 +64,7 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) self.CommandCenterName = CommandCenterName or CommandCenterPositionable:GetName() self.CommandCenterCoalition = CommandCenterPositionable:GetCoalition() - self.Missions = {} - setmetatable( self.Missions, { __mode = "v" } ) + self.Missions = setmetatable( {}, { __mode = "v" } ) self:EventOnBirth( --- @param #COMMANDCENTER self diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 388071ee2..0c0390402 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -59,7 +59,6 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi self.MissionCoalition = MissionCoalition self.Tasks = {} - setmetatable( self.Tasks, { __mode = "v" } ) -- Build the Fsm for the mission. @@ -202,8 +201,9 @@ function MISSION:AddTask( Task ) local TaskName = Task:GetTaskName() self:F( TaskName ) + self.Tasks[TaskName] = self.Tasks[TaskName] or { n = 0 } - + self.Tasks[TaskName] = Task return Task @@ -222,8 +222,6 @@ function MISSION:RemoveTask( Task ) self:F( TaskName ) self.Tasks[TaskName] = self.Tasks[TaskName] or { n = 0 } - Task:CleanUp() -- Cleans all events and sets task to nil to get Garbage Collected - -- Ensure everything gets garbarge collected. self.Tasks[TaskName] = nil Task = nil diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 33c8cb24e..d5a6f39f1 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -55,6 +55,8 @@ -- @field Tasking.Mission#MISSION Mission -- @field Core.Set#SET_GROUP SetGroup The Set of Groups assigned to the Task -- @field Fsm.Fsm#FSM_PROCESS FsmTemplate +-- @field Tasking.Mission#MISSION Mission +-- @field Tasking.CommandCenter#COMMANDCENTER CommandCenter -- @extends Fsm.Fsm#FSM_TASK TASK_BASE = { ClassName = "TASK_BASE", @@ -66,6 +68,8 @@ TASK_BASE = { Menu = {}, SetGroup = nil, FsmTemplate = nil, + Mission = nil, + CommandCenter = nil, } --- Instantiates a new TASK_BASE. Should never be used. Interface Class. @@ -94,6 +98,7 @@ function TASK_BASE:New( Mission, SetGroupAssign, TaskName, TaskType ) self.Fsm = {} self.Mission = Mission + self.CommandCenter = Mission:GetCommandCenter() self.SetGroup = SetGroupAssign @@ -106,6 +111,7 @@ function TASK_BASE:New( Mission, SetGroupAssign, TaskName, TaskType ) self.FsmTemplate = self.FsmTemplate or FSM_PROCESS:New() -- Handle the birth of new planes within the assigned set. + self:EventOnPlayerEnterUnit( --- @param #TASK_BASE self -- @param Core.Event#EVENTDATA EventData @@ -142,7 +148,7 @@ function TASK_BASE:New( Mission, SetGroupAssign, TaskName, TaskType ) self:UnAssignFromUnit( TaskUnit ) self:MessageToGroups( TaskUnit:GetPlayerName() .. " aborted Task " .. self:GetName() ) end - if self:AreUnitsAlive() == false then + if self:HasAliveUnits() == false then self:__Abort( 1 ) end end @@ -170,6 +176,7 @@ function TASK_BASE:New( Mission, SetGroupAssign, TaskName, TaskType ) end ) + Mission:AddTask( self ) return self @@ -279,6 +286,7 @@ end --- Send a message of the @{Task} to the assigned @{Group}s. -- @param #TASK_BASE self function TASK_BASE:MessageToGroups( Message ) + self:F( { Message = Message } ) local Mission = self:GetMission() local CC = Mission:GetCommandCenter() @@ -344,13 +352,15 @@ end --- Returns if the @{Task} has still alive and assigned Units. -- @param #TASK_BASE self -- @return #boolean -function TASK_BASE:HasAliveUnits( TaskGroup ) +function TASK_BASE:HasAliveUnits() + self:F() for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do if self:IsStateAssigned() then if self:IsAssignedToGroup( TaskGroup ) then for TaskUnitID, TaskUnit in pairs( TaskGroup:GetUnits() ) do if TaskUnit:IsAlive() then + self:T( { HasAliveUnits = true } ) return true end end @@ -358,6 +368,7 @@ function TASK_BASE:HasAliveUnits( TaskGroup ) end end + self:T( { HasAliveUnits = true } ) return false end @@ -784,22 +795,6 @@ end ---- Adds a score for the TASK to be achieved. --- @param #FSM_TEMPLATE self --- @param #string TaskStatus is the status of the TASK when the score needs to be given. --- @param #string ScoreText is a text describing the score that is given according the status. --- @param #number Score is a number providing the score of the status. --- @return #FSM_TEMPLATE self -function TASK_BASE:AddScoreTask( TaskStatus, ScoreText, Score ) - self:F2( { TaskStatus, ScoreText, Score } ) - - self.Scores[TaskStatus] = self.Scores[TaskStatus] or {} - self.Scores[TaskStatus].ScoreText = ScoreText - self.Scores[TaskStatus].Score = Score - return self -end - - --- StateMachine callback function for a TASK -- @param #TASK_BASE self -- @param #string Event diff --git a/Moose Development/Moose/Wrapper/Unit.lua b/Moose Development/Moose/Wrapper/Unit.lua index 5e2f5b712..65657e3c5 100644 --- a/Moose Development/Moose/Wrapper/Unit.lua +++ b/Moose Development/Moose/Wrapper/Unit.lua @@ -75,39 +75,10 @@ --- The UNIT class -- @type UNIT -- @extends Wrapper.Controllable#CONTROLLABLE --- @field #UNIT.FlareColor FlareColor --- @field #UNIT.SmokeColor SmokeColor UNIT = { ClassName="UNIT", - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - } +} ---- FlareColor --- @type UNIT.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - ---- SmokeColor --- @type UNIT.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue --- Unit.SensorType -- @type Unit.SensorType @@ -655,6 +626,7 @@ end --- Signal a flare at the position of the UNIT. -- @param #UNIT self +-- @param Utilities.Utils#FLARECOLOR FlareColor function UNIT:Flare( FlareColor ) self:F2() trigger.action.signalFlare( self:GetVec3(), FlareColor , 0 ) diff --git a/Moose Test Missions/SET - Data Sets/SET-101 - Group Sets/SET-101 - Group Sets.lua b/Moose Test Missions/SET - Data Sets/SET-101 - Group Sets/SET-101 - Group Sets.lua index 9af754901..534d78e34 100644 --- a/Moose Test Missions/SET - Data Sets/SET-101 - Group Sets/SET-101 - Group Sets.lua +++ b/Moose Test Missions/SET - Data Sets/SET-101 - Group Sets/SET-101 - Group Sets.lua @@ -121,9 +121,9 @@ GroupZoneCompletely = GROUP:FindByName( "Zone Completely" ) GroupZonePartly = GROUP:FindByName( "Zone Partly" ) GroupZoneNot = GROUP:FindByName( "Zone Not" ) -ZoneCompletely = ZONE_POLYGON:New( "Zone Completely", GroupZoneCompletely ):SmokeZone( POINT_VEC3.SmokeColor.White ) -ZonePartly = ZONE_POLYGON:New( "Zone Partly", GroupZonePartly ):SmokeZone( POINT_VEC3.SmokeColor.White ) -ZoneNot = ZONE_POLYGON:New( "Zone Not", GroupZoneNot ):SmokeZone( POINT_VEC3.SmokeColor.White ) +ZoneCompletely = ZONE_POLYGON:New( "Zone Completely", GroupZoneCompletely ):SmokeZone( SMOKECOLOR.White ) +ZonePartly = ZONE_POLYGON:New( "Zone Partly", GroupZonePartly ):SmokeZone( SMOKECOLOR.White ) +ZoneNot = ZONE_POLYGON:New( "Zone Not", GroupZoneNot ):SmokeZone( SMOKECOLOR.White ) SetVehicleCompletely:ForEachGroupCompletelyInZone( ZoneCompletely, --- @param Wrapper.Group#GROUP MooseGroup diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua index d5545a1d9..171d0532e 100644 --- a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua +++ b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua @@ -1,3 +1,4 @@ + -- This test mission is a test bed for the TASKING framework. -- It creates an head quarters (HQ), which contains one mission with one task to be accomplished. -- When the pilot joins the plane, it will need to accept the task using the HQ menu. @@ -102,8 +103,27 @@ FsmSEADTemplate:AddScoreProcess( "Updated", "Account", "Failed", "failed to dest FsmSEADTemplate:AddScore( "Success", "Destroyed all target radars", 250 ) FsmSEADTemplate:AddScore( "Failed", "Failed to destroy all target radars", -100 ) - - +--local TestTask = TASK_BASE:New( Mission, SEADSet, "TEST TASK", "TEST" ) +--TestTask:E("Clean TestTask") +--TestTask = nil +--collectgarbage() +-- +--local TestUnit = GROUP:FindByName( "HQ" ):GetUnit(1) +-- +--local fsm = FSM_PROCESS:New( TestUnit, TaskSEAD ) +-- +--fsm:AddProcess("test","test",FSM_ACCOUNT_DEADS:New( TargetSet, "SEAD" )) +-- +----Mission:AddTask(fsm) +-- +--fsm:E("CLEAN fsm") +--fsm = nil +--collectgarbage() +-- +-- +--TaskSEAD:E("CLEAN TASK") +--TaskSEAD = nil +--collectgarbage() function FsmSEADTemplate:onenterUpdated( TaskUnit ) self:E( { self } ) @@ -112,9 +132,13 @@ function FsmSEADTemplate:onenterUpdated( TaskUnit ) end -local TaskSEAD2 = TASK_BASE:New( Mission, SEADSet, "SEAD Radars Vector 2", "SEAD" ) -- Tasking.Task#TASK_BASE -TaskSEAD2:SetFsmTemplate( TaskSEAD:GetFsmTemplate():Copy() ) +--local TaskSEAD2 = TASK_BASE:New( Mission, SEADSet, "SEAD Radars Vector 2", "SEAD" ) -- Tasking.Task#TASK_BASE +--TaskSEAD2:SetFsmTemplate( TaskSEAD:GetFsmTemplate():Copy() ) --Mission:AddTask( TaskSEAD2 ) +TaskSEAD = nil +FsmSEADTemplate = nil HQ:SetMenu() + +collectgarbage() diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz index 71460895eccfdfaa2836016ba2f41a2dbabc1576..cd32600fe3cc9e2336acda61353db059b3d8d0d9 100644 GIT binary patch delta 14055 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 AssI20 delta 14013 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 diff --git a/Moose Test Missions/ZON - Zones/ZON-100 - Normal Zone/ZON-100 - Normal Zone.lua b/Moose Test Missions/ZON - Zones/ZON-100 - Normal Zone/ZON-100 - Normal Zone.lua index cfdfbbf70..0cc8bca29 100644 --- a/Moose Test Missions/ZON - Zones/ZON-100 - Normal Zone/ZON-100 - Normal Zone.lua +++ b/Moose Test Missions/ZON - Zones/ZON-100 - Normal Zone/ZON-100 - Normal Zone.lua @@ -6,7 +6,7 @@ local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) -local ZoneA = ZONE:New( "Zone A" ):SmokeZone( POINT_VEC3.SmokeColor.White, 90 ) +local ZoneA = ZONE:New( "Zone A" ):SmokeZone( SMOKECOLOR.White, 90 ) Messager = SCHEDULER:New( nil, function() diff --git a/Moose Test Missions/ZON - Zones/ZON-400 - Radius Zone/ZON-400 - Radius Zone.lua b/Moose Test Missions/ZON - Zones/ZON-400 - Radius Zone/ZON-400 - Radius Zone.lua index 34d4c7699..7eb347e91 100644 --- a/Moose Test Missions/ZON - Zones/ZON-400 - Radius Zone/ZON-400 - Radius Zone.lua +++ b/Moose Test Missions/ZON - Zones/ZON-400 - Radius Zone/ZON-400 - Radius Zone.lua @@ -7,7 +7,7 @@ local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) local House = STATIC:FindByName( "House" ) -local ZoneA = ZONE_RADIUS:New( "Zone A", House:GetPointVec2(), 300 ):SmokeZone( POINT_VEC3.SmokeColor.White, 90 ) +local ZoneA = ZONE_RADIUS:New( "Zone A", House:GetPointVec2(), 300 ):SmokeZone( SMOKECOLOR.White, 90 ) Messager = SCHEDULER:New( nil, function() diff --git a/Moose Test Missions/ZON - Zones/ZON-500 - Polygon Zone/ZON-500 - Polygon Zone.lua b/Moose Test Missions/ZON - Zones/ZON-500 - Polygon Zone/ZON-500 - Polygon Zone.lua index 55404345d..e38d859ee 100644 --- a/Moose Test Missions/ZON - Zones/ZON-500 - Polygon Zone/ZON-500 - Polygon Zone.lua +++ b/Moose Test Missions/ZON - Zones/ZON-500 - Polygon Zone/ZON-500 - Polygon Zone.lua @@ -8,7 +8,7 @@ local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) local GroupPolygon = GROUP:FindByName( "Polygon A" ) -local PolygonZone = ZONE_POLYGON:New( "Polygon A", GroupPolygon ):SmokeZone( POINT_VEC3.SmokeColor.White, 20 ) +local PolygonZone = ZONE_POLYGON:New( "Polygon A", GroupPolygon ):SmokeZone( SMOKECOLOR.White, 20 ) Messager = SCHEDULER:New( nil, function() From b81b483f0b18adc822931594b261e717ca34a4e8 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Mon, 12 Dec 2016 16:44:56 +0100 Subject: [PATCH 02/11] First prototype of the scheduler dispatcher is ready... It works, but the code was very difficult... So, when the Scheduler that is passed to the AddScheduler is nillified, the internal arrays that keep the Scheduler reference are also nillified. And it does what i need for further utilization in MOOSE classes. When the Scheduler is nillified, but, a schedule was planned for that Scheduler, once the scheduler fires off, it will ignore that call... cool. Sven --- Moose Development/Moose/Core/Event.lua | 19 +- Moose Development/Moose/Core/Scheduler.lua | 114 +--------- Moose Development/Moose/Core/Scheduler2.lua | 214 ++++++++++++++++++ Moose Development/Moose/Core/Timer.lua | 104 +++++++++ Moose Development/Moose/Moose.lua | 4 + Moose Development/Moose/Tasking/Task.lua | 25 +- .../SCH-000 - Simple Scheduling.lua | 24 ++ .../SCH-000 - Simple Scheduling.miz} | Bin 18083 -> 17738 bytes .../SCH-001 - Simple Object Scheduling.lua | 34 +++ .../SCH-001 - Simple Object Scheduling.miz} | Bin 18099 -> 17882 bytes .../SCH-001 - Simple Scheduling.lua | 8 - .../SCH-002 - Nested Scheduling.lua | 28 --- ...-002 - No Object Scheduling because GC.lua | 56 +++++ ...002 - No Object Scheduling because GC.miz} | Bin 19196 -> 18142 bytes .../SCH-003 - Repeated Scheduling.lua | 16 -- .../TSK-010 - Task Modelling - SEAD.lua | 9 +- .../TSK-010 - Task Modelling - SEAD.miz | Bin 28154 -> 28592 bytes 17 files changed, 481 insertions(+), 174 deletions(-) create mode 100644 Moose Development/Moose/Core/Scheduler2.lua create mode 100644 Moose Development/Moose/Core/Timer.lua create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.lua rename Moose Test Missions/SCH - Scheduler/{SCH-003 - Repeated Scheduling/SCH-003 - Repeated Scheduling.miz => SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz} (64%) create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Object Scheduling/SCH-001 - Simple Object Scheduling.lua rename Moose Test Missions/SCH - Scheduler/{SCH-002 - Nested Scheduling/SCH-002 - Nested Scheduling.miz => SCH-001 - Simple Object Scheduling/SCH-001 - Simple Object Scheduling.miz} (64%) delete mode 100644 Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Scheduling/SCH-001 - Simple Scheduling.lua delete mode 100644 Moose Test Missions/SCH - Scheduler/SCH-002 - Nested Scheduling/SCH-002 - Nested Scheduling.lua create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua rename Moose Test Missions/SCH - Scheduler/{SCH-001 - Simple Scheduling/SCH-001 - Simple Scheduling.miz => SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz} (60%) delete mode 100644 Moose Test Missions/SCH - Scheduler/SCH-003 - Repeated Scheduling/SCH-003 - Repeated Scheduling.lua diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index f90096791..0d426511c 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -1,6 +1,19 @@ ---- The EVENT class models an efficient event handling process between other classes and its units, weapons. +--- This module contains the EVENT class. +-- +-- === +-- +-- Takes care of EVENT dispatching between DCS events and event handling functions defined in MOOSE classes. +-- +-- === +-- +-- The above menus classes **are derived** from 2 main **abstract** classes defined within the MOOSE framework (so don't use these): +-- +-- === +-- +-- ### Contributions: - +-- ### Authors: FlightControl : Design & Programming +-- -- @module Event --- @author FlightControl --- The EVENT structure -- @type EVENT @@ -93,7 +106,7 @@ function EVENT:Init( EventID, EventClass ) end if not self.Events[EventID][EventClass] then - self.Events[EventID][EventClass] = setmetatable( {}, { __mode = "v" } ) + self.Events[EventID][EventClass] = setmetatable( {}, { __mode = "k" } ) end return self.Events[EventID][EventClass] end diff --git a/Moose Development/Moose/Core/Scheduler.lua b/Moose Development/Moose/Core/Scheduler.lua index 883260722..7c8a1eddb 100644 --- a/Moose Development/Moose/Core/Scheduler.lua +++ b/Moose Development/Moose/Core/Scheduler.lua @@ -58,26 +58,6 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg local self = BASE:Inherit( self, BASE:New() ) self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - self:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - - return self -end - ---- Schedule a new time event. Note that the schedule will only take place if the scheduler is *started*. Even for a single schedule event, the scheduler needs to be started also. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - self:T3( { TimeEventFunctionArguments } ) - self.TimeEventObject = TimeEventObject self.TimeEventFunction = TimeEventFunction self.TimeEventFunctionArguments = TimeEventFunctionArguments @@ -89,103 +69,11 @@ function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFuncti self.StartTime = timer.getTime() - self:Start() + _TIMERDISPATCHER:AddSchedule( self ) return self end ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2() - - if self.RepeatSecondsInterval ~= 0 then - self.Repeat = true - end - - if self.StartSeconds then - if self.ScheduleID then - timer.removeFunction( self.ScheduleID ) - end - self:T( { self.StartSeconds } ) - self.ScheduleID = timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .001 ) - end - - return self -end - ---- Stops the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) - - self.Repeat = false - if self.ScheduleID then - self:E( "Stop Schedule" ) - timer.removeFunction( self.ScheduleID ) - end - self.ScheduleID = nil - - return self -end - --- Private Functions - ---- @param #SCHEDULER self -function SCHEDULER:_Scheduler() - self:F2( self.TimeEventFunctionArguments ) - - local ErrorHandler = function( errmsg ) - - env.info( "Error in SCHEDULER function:" .. errmsg ) - if debug ~= nil then - env.info( debug.traceback() ) - end - - return errmsg - end - - local StartTime = self.StartTime - local StopSeconds = self.StopSeconds - local Repeat = self.Repeat - local RandomizationFactor = self.RandomizationFactor - local RepeatSecondsInterval = self.RepeatSecondsInterval - local ScheduleID = self.ScheduleID - - local Status, Result - if self.TimeEventObject then - Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - else - Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - end - - self:T( { "Timer Event2 .. " .. self.ScheduleID, Status, Result, StartTime, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - if Status and ( ( Result == nil ) or ( Result and Result ~= false ) ) then - if Repeat and ( not StopSeconds or ( StopSeconds and timer.getTime() <= StartTime + StopSeconds ) ) then - local ScheduleTime = - timer.getTime() + - self.RepeatSecondsInterval + - math.random( - - ( RandomizationFactor * RepeatSecondsInterval / 2 ), - ( RandomizationFactor * RepeatSecondsInterval / 2 ) - ) + - 0.01 - self:T( { self.TimeEventFunctionArguments, "Repeat:", timer.getTime(), ScheduleTime } ) - return ScheduleTime -- returns the next time the function needs to be called. - else - timer.removeFunction( ScheduleID ) - self.ScheduleID = nil - end - else - timer.removeFunction( ScheduleID ) - self.ScheduleID = nil - end - - return nil -end diff --git a/Moose Development/Moose/Core/Scheduler2.lua b/Moose Development/Moose/Core/Scheduler2.lua new file mode 100644 index 000000000..363626328 --- /dev/null +++ b/Moose Development/Moose/Core/Scheduler2.lua @@ -0,0 +1,214 @@ +--- This module contains the SCHEDULER class. +-- +-- 1) @{Core.Scheduler#SCHEDULER} class, extends @{Core.Base#BASE} +-- ===================================================== +-- The @{Core.Scheduler#SCHEDULER} class models time events calling given event handling functions. +-- +-- 1.1) SCHEDULER constructor +-- -------------------------- +-- The SCHEDULER class is quite easy to use: +-- +-- * @{Core.Scheduler#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. +-- +-- 1.2) SCHEDULER timer stop and start +-- ----------------------------------- +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{Core.Scheduler#SCHEDULER.Start}: (Re-)Start the scheduler. +-- * @{Core.Scheduler#SCHEDULER.Stop}: Stop the scheduler. +-- +-- 1.3) Reschedule new time event +-- ------------------------------ +-- With @{Core.Scheduler#SCHEDULER.Schedule} a new time event can be scheduled. +-- +-- === +-- +-- ### Contributions: +-- +-- * Mechanist : Concept & Testing +-- +-- ### Authors: +-- +-- * FlightControl : Design & Programming +-- +-- === +-- +-- @module Scheduler + + +--- The SCHEDULER class +-- @type SCHEDULER +-- @field #number ScheduleID the ID of the scheduler. +-- @extends Core.Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", +} + +--- SCHEDULER constructor. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + + self.TimeEventObject = TimeEventObject + self.TimeEventFunction = TimeEventFunction + self.TimeEventFunctionArguments = TimeEventFunctionArguments + self.StartSeconds = StartSeconds + self.Repeat = false + self.RepeatSecondsInterval = RepeatSecondsInterval or 0 + self.RandomizationFactor = RandomizationFactor or 0 + self.StopSeconds = StopSeconds + + self.StartTime = timer.getTime() + + _TIMERDISPATCHER:AddSchedule( self ) + + return self +end + +--- Schedule a new time event. Note that the schedule will only take place if the scheduler is *started*. Even for a single schedule event, the scheduler needs to be started also. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + self:T3( { TimeEventFunctionArguments } ) + + self.TimeEventObject = TimeEventObject + self.TimeEventFunction = TimeEventFunction + self.TimeEventFunctionArguments = TimeEventFunctionArguments + self.StartSeconds = StartSeconds + self.Repeat = false + self.RepeatSecondsInterval = RepeatSecondsInterval or 0 + self.RandomizationFactor = RandomizationFactor or 0 + self.StopSeconds = StopSeconds + + self.StartTime = timer.getTime() + + self:Start() + + return self +end + +--- (Re-)Starts the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Start() + self:F2() + + if self.RepeatSecondsInterval ~= 0 then + self.Repeat = true + end + + if self.StartSeconds then + if self.ScheduleID then + timer.removeFunction( self.ScheduleID ) + end + self:T( { self.StartSeconds } ) + self.ScheduleID = timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .001 ) + end + + return self +end + +--- Stops the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Stop() + self:F2( self.TimeEventObject ) + + self.Repeat = false + if self.ScheduleID then + self:E( "Stop Schedule" ) + timer.removeFunction( self.ScheduleID ) + end + self.ScheduleID = nil + + return self +end + +-- Private Functions + +--- @param #SCHEDULER self +function SCHEDULER:_Scheduler() + self:F2( self.TimeEventFunctionArguments ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + + return errmsg + end + + local StartTime = self.StartTime + local StopSeconds = self.StopSeconds + local Repeat = self.Repeat + local RandomizationFactor = self.RandomizationFactor + local RepeatSecondsInterval = self.RepeatSecondsInterval + local ScheduleID = self.ScheduleID + + local Status, Result + if self.TimeEventObject then + Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + else + Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + end + + self:T( { "Timer Event2 .. " .. self.ScheduleID, Status, Result, StartTime, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + + if Status and ( ( Result == nil ) or ( Result and Result ~= false ) ) then + if Repeat and ( not StopSeconds or ( StopSeconds and timer.getTime() <= StartTime + StopSeconds ) ) then + local ScheduleTime = + timer.getTime() + + self.RepeatSecondsInterval + + math.random( + - ( RandomizationFactor * RepeatSecondsInterval / 2 ), + ( RandomizationFactor * RepeatSecondsInterval / 2 ) + ) + + 0.01 + self:T( { self.TimeEventFunctionArguments, "Repeat:", timer.getTime(), ScheduleTime } ) + return ScheduleTime -- returns the next time the function needs to be called. + else + timer.removeFunction( ScheduleID ) + self.ScheduleID = nil + end + else + timer.removeFunction( ScheduleID ) + self.ScheduleID = nil + end + + return nil +end + + + + + + + + + + + + + + + + diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua new file mode 100644 index 000000000..a31e67300 --- /dev/null +++ b/Moose Development/Moose/Core/Timer.lua @@ -0,0 +1,104 @@ +--- This module contains the TIMER class. +-- +-- === +-- +-- Takes care of scheduled function dispatching for defined in MOOSE classes. +-- +-- === +-- +-- === +-- +-- ### Contributions: - +-- ### Authors: FlightControl : Design & Programming +-- +-- @module Timer + +--- The TIMER structure +-- @type TIMER +TIMER = { + ClassName = "TIMER", + CallID = 0, +} + +function TIMER:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F3() + return self +end + +--- Add a Schedule to the ScheduleDispatcher. +-- The development of this method was really tidy. +-- It is constructed as such that a garbage collection is executed on the weak tables, when the Scheduler is nillified. +-- Nothing of this code should be modified without testing it thoroughly. +-- @param #TIMER self +-- @param Core.Scheduler#SCHEDULER Scheduler +function TIMER:AddSchedule( Scheduler ) + self:F3( { Scheduler = Scheduler } ) + + -- Initialize the Functions array, which is a weakly coupled table. + -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. + self.Schedulers = self.Schedulers or setmetatable( {}, { __mode = "k" } ) + + self.CallID = self.CallID + 1 + self.Schedulers[Scheduler] = self.CallID + + self:E(self.Schedulers) + + self.Schedule = self.Schedule or setmetatable( {}, { __mode = "v" } ) + + + self.Schedule[self.CallID] = {} + + self.Schedule[self.CallID].ScheduleFunction = Scheduler.TimeEventFunction + self.Schedule[self.CallID].ScheduleArguments = Scheduler.TimeEventFunctionArguments + self.Schedule[self.CallID].ScheduleObject = Scheduler.TimeEventObject + self.Schedule[self.CallID].ScheduleStart = Scheduler.StartSeconds + .001 + + self:E( self.Schedule[self.CallID] ) + + local function ScheduleCallHandler( CallID ) + + local ErrorHandler = function( errmsg ) + env.info( "Error in timer function: " .. errmsg ) + if debug ~= nil then + env.info( debug.traceback() ) + end + return errmsg + end + + BASE:E( { self } ) + + local ScheduleFunction = self.Schedule[CallID].ScheduleFunction + local ScheduleArguments = self.Schedule[CallID].ScheduleArguments + local ScheduleObject = self.Schedule[CallID].ScheduleObject + + local Status, Result + if ScheduleObject then + local function Timer() + return ScheduleFunction( ScheduleObject, unpack( ScheduleArguments ) ) + end + Status, Result = xpcall( Timer, ErrorHandler ) + else + local function Timer() + return ScheduleFunction( unpack( ScheduleArguments ) ) + end + Status, Result = xpcall( Timer, ErrorHandler ) + end + end + + timer.scheduleFunction( + ScheduleCallHandler, + self.CallID, + timer.getTime() + 1 + ) + --[[ + + + self:T( Schedule.FunctionID ) + --]] + + return self.CallID +end + + + diff --git a/Moose Development/Moose/Moose.lua b/Moose Development/Moose/Moose.lua index d3abcd966..5d79c3bca 100644 --- a/Moose Development/Moose/Moose.lua +++ b/Moose Development/Moose/Moose.lua @@ -7,6 +7,7 @@ Include.File( "Utilities/Utils" ) --- Core Classes Include.File( "Core/Base" ) Include.File( "Core/Scheduler" ) +Include.File( "Core/Timer") Include.File( "Core/Event" ) Include.File( "Core/Menu" ) Include.File( "Core/Zone" ) @@ -66,3 +67,6 @@ _EVENTDISPATCHER = EVENT:New() -- Core.Event#EVENT --- Declare the main database object, which is used internally by the MOOSE classes. _DATABASE = DATABASE:New() -- Database#DATABASE +--- Declare the timer dispatcher based on the TIMER class +_TIMERDISPATCHER = TIMER:New() -- Core.Timer#TIMER + diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index d5a6f39f1..983a85d1d 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -148,9 +148,7 @@ function TASK_BASE:New( Mission, SetGroupAssign, TaskName, TaskType ) self:UnAssignFromUnit( TaskUnit ) self:MessageToGroups( TaskUnit:GetPlayerName() .. " aborted Task " .. self:GetName() ) end - if self:HasAliveUnits() == false then - self:__Abort( 1 ) - end + self:__Abort( 1 ) end end ) @@ -793,6 +791,27 @@ function TASK_BASE:SetBriefing( TaskBriefing ) return self end +--- StateMachine callback function for a TASK +-- @param #TASK_BASE self +-- @param #string Event +-- @param #string From +-- @param #string To +-- @param Core.Event#EVENTDATA Event +function TASK_BASE:onbeforeAbort( Event, From, To ) + + self:E("Abort") + + for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do + if self:HasAliveUnits() then + return false + end + end + + self:MessageToGroups( "Task " .. self:GetName() .. " has been aborted! Task will be replanned." ) + + return true +end + --- StateMachine callback function for a TASK diff --git a/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.lua b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.lua new file mode 100644 index 000000000..5b1cc0462 --- /dev/null +++ b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.lua @@ -0,0 +1,24 @@ +--- Simple function scheduling +-- +-- === +-- +-- Author: FlightControl +-- Date Created: 12 Dec 2016 +-- +-- # Situation +-- Uses the Tracing functions from BASE within the DCS.log file. Check the DCS.log file for the results. +-- Create a new SCHEDULER object. +-- Check the DCS.log. +-- +-- # Test cases: +-- +-- 1. The log should contain a "Hello World" line that is fired off 10 seconds after mission start. +-- +-- +-- # Status: TESTED - 12 Dec 2016 + +local TestScheduler = SCHEDULER:New( nil, + function() + BASE:E( "Hello World") + end, {}, 1 + ) \ No newline at end of file diff --git a/Moose Test Missions/SCH - Scheduler/SCH-003 - Repeated Scheduling/SCH-003 - Repeated Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz similarity index 64% rename from Moose Test Missions/SCH - Scheduler/SCH-003 - Repeated Scheduling/SCH-003 - Repeated Scheduling.miz rename to Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz index c9b5f4bdd8023172f8548f46d55d9ca19212fca0..3cf8a601a008a9ed3867868b61029c27171821ca 100644 GIT binary patch delta 5649 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 delta 6056 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%0D=&2rhMNjTq&c1&_#4Nm!i!;^TkOsee5sLHp# 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 delta 6021 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 diff --git a/Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Scheduling/SCH-001 - Simple Scheduling.lua b/Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Scheduling/SCH-001 - Simple Scheduling.lua deleted file mode 100644 index 9113e32c9..000000000 --- a/Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Scheduling/SCH-001 - Simple Scheduling.lua +++ /dev/null @@ -1,8 +0,0 @@ -GroupTest = GROUP:FindByName("Test") - -TestScheduler = SCHEDULER:New( nil, - function() - - MESSAGE:New("Hello World", 5 ):ToAll() - - end, {}, 10, 10 ) \ No newline at end of file diff --git a/Moose Test Missions/SCH - Scheduler/SCH-002 - Nested Scheduling/SCH-002 - Nested Scheduling.lua b/Moose Test Missions/SCH - Scheduler/SCH-002 - Nested Scheduling/SCH-002 - Nested Scheduling.lua deleted file mode 100644 index f15b78df9..000000000 --- a/Moose Test Missions/SCH - Scheduler/SCH-002 - Nested Scheduling/SCH-002 - Nested Scheduling.lua +++ /dev/null @@ -1,28 +0,0 @@ --- This test will schedule the same function 2 times. - -SpawnTest = SPAWN:New( "Test" ) -TestZone = ZONE:New( "TestZone" ) - -local function MessageTest2() - - SpawnTest:SpawnInZone( TestZone, true ) - -end - -local function MessageTest1() - - SpawnTest:SpawnInZone( TestZone, true ) - - -- The second after 10 seconds - SCHEDULER:New( nil, MessageTest2, {}, 5 ) - - -- The third after 15 seconds - SCHEDULER:New( nil, MessageTest2, {}, 10 ) - -end - --- The first after 5 seconds -SCHEDULER:New( nil, MessageTest1, {}, 5 ) - --- The fourth after 20 seconds -SCHEDULER:New( nil, MessageTest1, {}, 20 ) diff --git a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua new file mode 100644 index 000000000..44e3b4ce9 --- /dev/null +++ b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua @@ -0,0 +1,56 @@ +--- No Object Scheduling because of garbage collect and Object nillification. +-- +-- === +-- +-- Author: FlightControl +-- Date Created: 12 Dec 2016 +-- +-- # Situation +-- Uses the Tracing functions from BASE within the DCS.log file. Check the DCS.log file for the results. +-- Create a new SCHEDULER object. +-- Check the DCS.log. +-- +-- A Test object is created. +-- It is nillified directly after the Schedule has been planned. +-- There should be no schedule fired. +-- The Test object should be garbage collected! +-- +-- THIS IS A VERY IMPORTANT TEST! +-- +-- # Test cases: +-- +-- 1. No schedule should be fired! The destructors of the Test object should be shown. +-- 2. Commend the nillification of the Test object in the source, and test again. +-- The schedule should now be fired and Hello World should be logged through the Test object. +-- +-- # Status: STARTED - 12 Dec 2016 + +local TEST_BASE = { + ClassName = "TEST_BASE", + } + +function TEST_BASE:New( Message ) + self = BASE:Inherit( self, BASE:New() ) + + self.TestScheduler = SCHEDULER:New( self, + function( Object, Message ) + Object:E( Message ) + end, { Message }, 1 + ) + return self +end + +do +local Test1 = TEST_BASE:New( "Hello World Test 1" ) +end + +local Test2 = TEST_BASE:New( "Hello World Test 2" ) +Test2 = nil + +local Test3 = TEST_BASE:New( "Hello World Test 3" ) + +collectgarbage() + +BASE:E( "Collect Garbage executed." ) +BASE:E( "You should only now see Test 3!" ) +BASE:E( "Check if Test 1 and Test 2 are garbage collected!" ) \ No newline at end of file diff --git a/Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Scheduling/SCH-001 - Simple Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz similarity index 60% rename from Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Scheduling/SCH-001 - Simple Scheduling.miz rename to Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz index 6f0eb2ca7cb1e18896e55b8ef4836786792ccde5..d0650c90e6915c37dead5f4ad87990a27e1fffc5 100644 GIT binary patch delta 6145 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 D7)d`e diff --git a/Moose Test Missions/SCH - Scheduler/SCH-003 - Repeated Scheduling/SCH-003 - Repeated Scheduling.lua b/Moose Test Missions/SCH - Scheduler/SCH-003 - Repeated Scheduling/SCH-003 - Repeated Scheduling.lua deleted file mode 100644 index a5c9a5a82..000000000 --- a/Moose Test Missions/SCH - Scheduler/SCH-003 - Repeated Scheduling/SCH-003 - Repeated Scheduling.lua +++ /dev/null @@ -1,16 +0,0 @@ --- This test will schedule the same function 2 times. - -SpawnTest = SPAWN:New( "Test" ) -TestZone = ZONE:New( "TestZone" ) - -local function MessageTest() - - SpawnTest:SpawnInZone( TestZone, true ) - -end - --- The first after 5 seconds -TestScheduler1 = SCHEDULER:New( nil, MessageTest, {}, 5 ) - --- The second after 10 seconds -TestScheduler2 = SCHEDULER:New( nil, MessageTest, {}, 10 ) \ No newline at end of file diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua index 171d0532e..be30215a1 100644 --- a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua +++ b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua @@ -31,6 +31,7 @@ Mission:AddScoring( Scoring ) -- Define the set of group of planes that can be assigned to the Mission object. local SEADSet = SET_GROUP:New():FilterPrefixes( "Test SEAD"):FilterStart() +SEADSet:Flush() -- Define the set of units that are the targets. -- Note that I use FilterOnce, which means that the set will be defined only once, @@ -132,9 +133,11 @@ function FsmSEADTemplate:onenterUpdated( TaskUnit ) end ---local TaskSEAD2 = TASK_BASE:New( Mission, SEADSet, "SEAD Radars Vector 2", "SEAD" ) -- Tasking.Task#TASK_BASE ---TaskSEAD2:SetFsmTemplate( TaskSEAD:GetFsmTemplate():Copy() ) ---Mission:AddTask( TaskSEAD2 ) +local TaskSEAD2 = TASK_BASE:New( Mission, SEADSet, "SEAD Radars Vector 2", "SEAD" ) -- Tasking.Task#TASK_BASE +TaskSEAD2:SetFsmTemplate( TaskSEAD:GetFsmTemplate():Copy() ) +Mission:AddTask( TaskSEAD2 ) + +Mission:RemoveTask(TaskSEAD) TaskSEAD = nil FsmSEADTemplate = nil diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz index cd32600fe3cc9e2336acda61353db059b3d8d0d9..6d2b331db63aec4603cf889544a2ad750ed8d568 100644 GIT binary patch delta 14023 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 delta 13567 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 V0JZGdz>q9~vG({-4c7k&{uh?E--rMJ From 15134d7f4edd618a3b7ded8fa58f99529ec1904b Mon Sep 17 00:00:00 2001 From: FlightControl Date: Mon, 12 Dec 2016 17:41:58 +0100 Subject: [PATCH 03/11] Formidastic, now when nillifying the Test1 and Test 3, the destructor of the SCHEDULER is called The references of nillified and garbage collected SCHEDULERS are removed from the _TIMERDISPATCHER. This results now in schedules that are still pending to be executed, but are nillified, that these schedules will never be executed!!! Sven --- Moose Development/Moose/Core/Scheduler.lua | 9 ++++- Moose Development/Moose/Core/Timer.lua | 35 +++++++++--------- ...-002 - No Object Scheduling because GC.lua | 12 ++++-- ...-002 - No Object Scheduling because GC.miz | Bin 18142 -> 18167 bytes 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/Moose Development/Moose/Core/Scheduler.lua b/Moose Development/Moose/Core/Scheduler.lua index 7c8a1eddb..d8b9a0805 100644 --- a/Moose Development/Moose/Core/Scheduler.lua +++ b/Moose Development/Moose/Core/Scheduler.lua @@ -69,11 +69,17 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg self.StartTime = timer.getTime() - _TIMERDISPATCHER:AddSchedule( self ) + self.CallID = _TIMERDISPATCHER:AddSchedule( self ) return self end +function SCHEDULER:_Destructor() + --self:E("_Destructor") + + _TIMERDISPATCHER:RemoveSchedule( self.CallID ) +end + @@ -89,4 +95,3 @@ end - diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua index a31e67300..174f6f674 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/Timer.lua @@ -33,30 +33,26 @@ end -- @param #TIMER self -- @param Core.Scheduler#SCHEDULER Scheduler function TIMER:AddSchedule( Scheduler ) - self:F3( { Scheduler = Scheduler } ) + self:F3( { Scheduler } ) -- Initialize the Functions array, which is a weakly coupled table. -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. - self.Schedulers = self.Schedulers or setmetatable( {}, { __mode = "k" } ) + self.Schedulers = self.Schedulers or setmetatable( {}, { __mode = "v" } ) self.CallID = self.CallID + 1 - self.Schedulers[Scheduler] = self.CallID + self.Schedulers[self.CallID] = Scheduler - self:E(self.Schedulers) + Scheduler:E( { self.CallID, self.Schedulers[self.CallID] } ) self.Schedule = self.Schedule or setmetatable( {}, { __mode = "v" } ) - - self.Schedule[self.CallID] = {} - - self.Schedule[self.CallID].ScheduleFunction = Scheduler.TimeEventFunction - self.Schedule[self.CallID].ScheduleArguments = Scheduler.TimeEventFunctionArguments - self.Schedule[self.CallID].ScheduleObject = Scheduler.TimeEventObject + self.Schedule[self.CallID].ScheduleStart = Scheduler.StartSeconds + .001 self.Schedule[self.CallID].ScheduleStart = Scheduler.StartSeconds + .001 self:E( self.Schedule[self.CallID] ) - local function ScheduleCallHandler( CallID ) + self.Schedule[self.CallID].ScheduleCallHandler = function( CallID ) + self:E( CallID ) local ErrorHandler = function( errmsg ) env.info( "Error in timer function: " .. errmsg ) @@ -66,11 +62,9 @@ function TIMER:AddSchedule( Scheduler ) return errmsg end - BASE:E( { self } ) - - local ScheduleFunction = self.Schedule[CallID].ScheduleFunction - local ScheduleArguments = self.Schedule[CallID].ScheduleArguments - local ScheduleObject = self.Schedule[CallID].ScheduleObject + local ScheduleFunction = self.Schedulers[CallID].TimeEventFunction + local ScheduleArguments = self.Schedulers[CallID].TimeEventFunctionArguments + local ScheduleObject = self.Schedulers[CallID].TimeEventObject local Status, Result if ScheduleObject then @@ -87,7 +81,7 @@ function TIMER:AddSchedule( Scheduler ) end timer.scheduleFunction( - ScheduleCallHandler, + self.Schedule[self.CallID].ScheduleCallHandler, self.CallID, timer.getTime() + 1 ) @@ -100,5 +94,12 @@ function TIMER:AddSchedule( Scheduler ) return self.CallID end +function TIMER:RemoveSchedule( CallID ) + + self:F( CallID ) + self.Schedulers[CallID] = nil +end + + diff --git a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua index 44e3b4ce9..ee34c7a79 100644 --- a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua +++ b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua @@ -42,15 +42,21 @@ end do local Test1 = TEST_BASE:New( "Hello World Test 1" ) +Test1 = nil +BASE:E( Test1 ) end local Test2 = TEST_BASE:New( "Hello World Test 2" ) -Test2 = nil + local Test3 = TEST_BASE:New( "Hello World Test 3" ) +Test3 = nil collectgarbage() +BASE:E( Test2 ) +BASE:E( Test3 ) + BASE:E( "Collect Garbage executed." ) -BASE:E( "You should only now see Test 3!" ) -BASE:E( "Check if Test 1 and Test 2 are garbage collected!" ) \ No newline at end of file +BASE:E( "You should only see a Hello Worlld message for Test 2!" ) +BASE:E( "Check if Test 1 and Test 3 are garbage collected!" ) \ No newline at end of file diff --git a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz b/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz index d0650c90e6915c37dead5f4ad87990a27e1fffc5..8707c5c492ffa14fabe538d19efe05ae614177e8 100644 GIT binary patch delta 851 zcmV-Z1FZbsjRE(K0k8=y4jg?(k-h=|0C)xf06GAZUqw8BjZ{r<+CUJ!Bk><5R{1bF7n+czIOqtOVq3htkN zAh(e40<%h#at}|)S!EDZ4tu7b*dBo^AsmXytPYT+5M^F+W=kc<-43z&ulao5zAP$R zC_RIZqTCmMcB!P*N_fwTS%jrV`pIT6nZgP=Oy5o3JFiDvLsHtx)BE=ag9dDYkZQ)A z&b*S`c@5-R9pJ+vS;MikMJYXOwM@oB5v&wAhGl{L=RbDHmG(xBrV`eKJc2A>An^#v z@^-y?_`KeM@`*>tCEZB{7LcN`5e}sR9?}eujW@-A>R|?1sR<_j0Lv`~F|ij21vAtQ zl<-S1DQkwbK#gDuRf&w;AQhN8A}6*Mb|$0^xacZoSFQN;c9Q^o7VvewdxXv1m-}71 z*rt%Klk^049k@B8uFP8VWb9_Dk<*^(gUQc&(1y>pc@+CkpS~NE)Ai()PV^2u;KwKx_EeWm6BLrr_ot1b!bK zRMryuaWxFj4|h*+%+~!&7d3PU&yDqE2ongN2+(LNE&Xxb4xwGWGS$?KL{3QDMe@DV zp82*+dN3g38c*}n?RY#%3dTW0-%?NCLOl)C=aDyWiM(k=-PEGGop>wbCG8KK?NsVV z)JZ)x+`t*8w~WjBQ@rN*8+qmSPwzCc_o%9Ro|UBiW6-Uw& z^H^kmUqWiY^lOWT!v6wLO9KRxp+y?A7B9sC1o2&GnzP?9MF<1*Gp@5IIUEcL9DPQS zz5)OMc#}*;c>)nHlgC9v0y;30Jun)RCPok&@m*({A_)KhX+Qt~2LJ#7000000RR91 d008EbQARWYEt7^uGy(RLyG9)br$Yb$006M0j)edK delta 835 zcmV-J1HAnAjRD?`0k8=y4rht(?xg|%038MZ06GAZctt#ajZ|H4+AtJ-N8&%+(ie~b z4Jz#ci3b+ginP*+q?`IQxz0`E&DfLeh)q@h`}~yzSSK|?K<+)~`uN^sPbL%CNw|Od zfz&`sE6i)oLSbB7`#ZwP{M&I(3}VNy){JzLFxEtkvgWmTI> zss()HtgK9bB85?s`^=gcghZkJ$rmu2!x|~f-_72;tVdi!%1rIc`}YTp8cc%4X2@hK*>6A+gV;rZDR7ijR6Nf@7A5^GoZgkj3kOc$;9wAL` zH|vMbn>|Rs@d&vrchZ3sWT;Jq1JgjmHUnhqL$P~*m_yE#h4DW?3WGsRoCQKfw4DYD z_{E73O@*vNg`g{0^W3IENYD+Vu+=))nUIcfF;&d3I`P@?}%zt&-f5&L8xt*Xq9MJmD z;m^!}_gazY0WE7qaqN9-T$+@G#gg`MYA&@3d2IE1-Ys%2;hR)8*=e&QFVTrnvM#I3 z^{1zeN)0i!UO<|y_St3)lXJWGdt6e&eS^Py6EESp-*fsBPPE>U1KQA_%@4*d`{KU( zz2*>f^u-R3L%2h&-Hb;LrjZx6gwJk;wGT6YLmwPN%NPY{1E0FxG)7dG+@6C_-?M|t zM#3;&4de60-4hav&G0g12Rer5Hu^G#8H7v(C^WSaez|_nqFujo+4jteoLO-fn;)Fc z%#UR@fDyC>I`aH2gyurDC$wcEhbvkx!j0R+cdl#a9b zFhvLhpfRnpKsg)?31^A!?xg|%03DNMMR@}FE|cIzLjfU^Bt|P6$6Az*A_)KhX+Qt~ z2LJ#7000000RR91007OCYDP2x6qBDuG$h?X004Jka%E_5b#rBNP)h{{000003;+xO NIs*Uzjza(d000z(et7@@ From e5b386b9e5e824162df989c7135e0a850eb0a937 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Tue, 13 Dec 2016 10:24:19 +0100 Subject: [PATCH 04/11] Progress --- Moose Development/Moose/Core/Base.lua | 8 +- Moose Development/Moose/Core/Scheduler.lua | 94 +++++++++++++--- Moose Development/Moose/Core/Timer.lua | 125 +++++++++++++++------ 3 files changed, 172 insertions(+), 55 deletions(-) diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua index 22edffbd7..ebbfb67dd 100644 --- a/Moose Development/Moose/Core/Base.lua +++ b/Moose Development/Moose/Core/Base.lua @@ -124,11 +124,15 @@ end function BASE:_Destructor() --self:E("_Destructor") - self:EventRemoveAll() + --self:EventRemoveAll() end function BASE:_SetDestructor() + -- TODO: Okay, this is really technical... + -- When you set a proxy to a table to catch __gc, weak tables don't behave like weak... + -- Therefore, I am parking this logic until I've properly discussed all this with the community. + --[[ local proxy = newproxy(true) local proxyMeta = getmetatable(proxy) @@ -143,7 +147,7 @@ function BASE:_SetDestructor() -- table is about to be garbage-collected - then the __gc hook -- will be invoked and the destructor called rawset( self, '__proxy', proxy ) - + --]] end --- This is the worker method to inherit from a parent class. diff --git a/Moose Development/Moose/Core/Scheduler.lua b/Moose Development/Moose/Core/Scheduler.lua index d8b9a0805..ce54f70d8 100644 --- a/Moose Development/Moose/Core/Scheduler.lua +++ b/Moose Development/Moose/Core/Scheduler.lua @@ -42,6 +42,7 @@ -- @extends Core.Base#BASE SCHEDULER = { ClassName = "SCHEDULER", + Schedules = {}, } --- SCHEDULER constructor. @@ -58,26 +59,88 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg local self = BASE:Inherit( self, BASE:New() ) self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - self.Repeat = false - self.RepeatSecondsInterval = RepeatSecondsInterval or 0 - self.RandomizationFactor = RandomizationFactor or 0 - self.StopSeconds = StopSeconds - - self.StartTime = timer.getTime() - - self.CallID = _TIMERDISPATCHER:AddSchedule( self ) + self:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) return self end -function SCHEDULER:_Destructor() - --self:E("_Destructor") +--function SCHEDULER:_Destructor() +-- --self:E("_Destructor") +-- +-- _TIMERDISPATCHER:RemoveSchedule( self.CallID ) +--end - _TIMERDISPATCHER:RemoveSchedule( self.CallID ) +--- Schedule a new time event. Note that the schedule will only take place if the scheduler is *started*. Even for a single schedule event, the scheduler needs to be started also. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + self:T3( { TimeEventFunctionArguments } ) + + + self.TimeEventObject = TimeEventObject + + self.Schedules[#self.Schedules+1] = _TIMERDISPATCHER:AddSchedule( + self, + TimeEventFunction, + TimeEventFunctionArguments, + StartSeconds, + RepeatSecondsInterval, + RandomizationFactor, + StopSeconds + ) + + return self +end + +--- (Re-)Starts the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Start() + self:F2() + + if self.RepeatSecondsInterval ~= 0 then + self.Repeat = true + end + + if self.StartSeconds then + self:T( { self.StartSeconds } ) + self.Schedules[#self.Schedules+1] = _TIMERDISPATCHER:AddSchedule( + self, + self.TimeEventObject, + self.TimeEventFunction, + self.TimeEventFunctionArguments, + self.StartSeconds, + self.RepeatSecondsInterval, + self.RandomizationFactor, + self.StopSeconds + ) + end + + return self +end + +--- Stops the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Stop() + self:F2( self.TimeEventObject ) + + self.Repeat = false + if self.ScheduleID then + self:E( "Stop Schedule" ) + timer.removeFunction( self.ScheduleID ) + end + self.ScheduleID = nil + + return self end @@ -94,4 +157,3 @@ end - diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua index 174f6f674..be26757ff 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/Timer.lua @@ -32,26 +32,30 @@ end -- Nothing of this code should be modified without testing it thoroughly. -- @param #TIMER self -- @param Core.Scheduler#SCHEDULER Scheduler -function TIMER:AddSchedule( Scheduler ) - self:F3( { Scheduler } ) +function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop ) + self:F( { Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop } ) + + self.CallID = self.CallID + 1 -- Initialize the Functions array, which is a weakly coupled table. -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. - self.Schedulers = self.Schedulers or setmetatable( {}, { __mode = "v" } ) - - self.CallID = self.CallID + 1 - self.Schedulers[self.CallID] = Scheduler + self.Calls = self.Calls or setmetatable( {}, { __mode = "v" } ) + self.Calls[self.CallID] = Scheduler + Scheduler:E( { self.CallID, self.Calls[self.CallID] } ) - Scheduler:E( { self.CallID, self.Schedulers[self.CallID] } ) + self.Schedule = self.Schedule or setmetatable( {}, { __mode = "k" } ) + self.Schedule[Scheduler] = {} + self.Schedule[Scheduler][self.CallID] = {} + self.Schedule[Scheduler][self.CallID].Function = ScheduleFunction + self.Schedule[Scheduler][self.CallID].Arguments = ScheduleArguments + self.Schedule[Scheduler][self.CallID].Start = Start + .001 + self.Schedule[Scheduler][self.CallID].Repeat = Repeat + self.Schedule[Scheduler][self.CallID].Randomize = Randomize + self.Schedule[Scheduler][self.CallID].Stop = Stop - self.Schedule = self.Schedule or setmetatable( {}, { __mode = "v" } ) - self.Schedule[self.CallID] = {} - self.Schedule[self.CallID].ScheduleStart = Scheduler.StartSeconds + .001 - self.Schedule[self.CallID].ScheduleStart = Scheduler.StartSeconds + .001 + self:E( self.Schedule[Scheduler][self.CallID] ) - self:E( self.Schedule[self.CallID] ) - - self.Schedule[self.CallID].ScheduleCallHandler = function( CallID ) + self.Schedule[Scheduler][self.CallID].CallHandler = function( CallID ) self:E( CallID ) local ErrorHandler = function( errmsg ) @@ -61,43 +65,90 @@ function TIMER:AddSchedule( Scheduler ) end return errmsg end - - local ScheduleFunction = self.Schedulers[CallID].TimeEventFunction - local ScheduleArguments = self.Schedulers[CallID].TimeEventFunctionArguments - local ScheduleObject = self.Schedulers[CallID].TimeEventObject - local Status, Result - if ScheduleObject then - local function Timer() - return ScheduleFunction( ScheduleObject, unpack( ScheduleArguments ) ) + local Scheduler = self.Calls[CallID] + + self:E( { Scheduler = Scheduler } ) + + if self.Calls[CallID] then + + local Schedule = self.Schedule[Scheduler][CallID] + + self:E( { Schedule = Schedule } ) + + local ScheduleObject = Scheduler.TimeEventObject + local ScheduleFunction = Schedule.Function + local ScheduleArguments = Schedule.Arguments + local Start = Schedule.Start + local Repeat = Schedule.Repeat + local Randomize = Schedule.Randomize + local Stop = Schedule.Stop + local ScheduleID = Schedule.ScheduleID + + local Status, Result + if ScheduleObject then + local function Timer() + return ScheduleFunction( ScheduleObject, unpack( ScheduleArguments ) ) + end + Status, Result = xpcall( Timer, ErrorHandler ) + else + local function Timer() + return ScheduleFunction( unpack( ScheduleArguments ) ) + end + Status, Result = xpcall( Timer, ErrorHandler ) + end + + local CurrentTime = timer.getTime() + local StartTime = CurrentTime + Start + + if Status and (( Result == nil ) or ( Result and Result ~= false ) ) then + if Repeat and Repeat ~= 0 and ( not Stop ) or ( Stop and CurrentTime <= StartTime + Stop ) then + local ScheduleTime = + CurrentTime + + Repeat + + math.random( + - ( Randomize * Repeat / 2 ), + ( Randomize * Repeat / 2 ) + ) + + 0.01 + self:T( { ScheduleArguments, "Repeat:", CurrentTime, ScheduleTime } ) + return ScheduleTime -- returns the next time the function needs to be called. + else + timer.removeFunction( ScheduleID ) + ScheduleID = nil + end + else + timer.removeFunction( ScheduleID ) + ScheduleID = nil end - Status, Result = xpcall( Timer, ErrorHandler ) else - local function Timer() - return ScheduleFunction( unpack( ScheduleArguments ) ) - end - Status, Result = xpcall( Timer, ErrorHandler ) + self:E( "Scheduled obscolete call ..." ) end + + return nil end - timer.scheduleFunction( - self.Schedule[self.CallID].ScheduleCallHandler, + + self.Schedule[Scheduler][self.CallID].ScheduleID = timer.scheduleFunction( + self.Schedule[Scheduler][self.CallID].CallHandler, self.CallID, - timer.getTime() + 1 + timer.getTime() + self.Schedule[Scheduler][self.CallID].Start ) - --[[ - - self:T( Schedule.FunctionID ) - --]] - return self.CallID end function TIMER:RemoveSchedule( CallID ) - self:F( CallID ) - self.Schedulers[CallID] = nil + + local Schedule = self.Calls[CallID] + + if Schedule then + local ScheduleID = Schedule.ScheduleID + timer.removeFunction( ScheduleID ) + ScheduleID = nil + Schedule = nil + end end From 6c6b26e33e8bbfed84539d8c0ccce9a142faa873 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Tue, 13 Dec 2016 11:25:39 +0100 Subject: [PATCH 05/11] Progress --- Moose Development/Moose/Core/Timer.lua | 9 ++-- .../SCH-100 - Simple Repeat Scheduling.lua | 24 ++++++++++ .../SCH-100 - Simple Repeat Scheduling.miz | Bin 0 -> 17788 bytes .../SCH-110 - Object Repeat Scheduling.lua | 44 ++++++++++++++++++ .../SCH-110 - Object Repeat Scheduling.miz | Bin 0 -> 17991 bytes 5 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.lua create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.miz create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-110 - Object Repeat Scheduling/SCH-110 - Object Repeat Scheduling.lua create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-110 - Object Repeat Scheduling/SCH-110 - Object Repeat Scheduling.miz diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua index be26757ff..19ea1bc14 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/Timer.lua @@ -48,6 +48,7 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star self.Schedule[Scheduler][self.CallID] = {} self.Schedule[Scheduler][self.CallID].Function = ScheduleFunction self.Schedule[Scheduler][self.CallID].Arguments = ScheduleArguments + self.Schedule[Scheduler][self.CallID].StartTime = timer.getTime() + ( Start or 0 ) self.Schedule[Scheduler][self.CallID].Start = Start + .001 self.Schedule[Scheduler][self.CallID].Repeat = Repeat self.Schedule[Scheduler][self.CallID].Randomize = Randomize @@ -80,9 +81,9 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star local ScheduleFunction = Schedule.Function local ScheduleArguments = Schedule.Arguments local Start = Schedule.Start - local Repeat = Schedule.Repeat - local Randomize = Schedule.Randomize - local Stop = Schedule.Stop + local Repeat = Schedule.Repeat or 0 + local Randomize = Schedule.Randomize or 0 + local Stop = Schedule.Stop or 0 local ScheduleID = Schedule.ScheduleID local Status, Result @@ -102,7 +103,7 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star local StartTime = CurrentTime + Start if Status and (( Result == nil ) or ( Result and Result ~= false ) ) then - if Repeat and Repeat ~= 0 and ( not Stop ) or ( Stop and CurrentTime <= StartTime + Stop ) then + if Repeat ~= 0 and ( not Stop ) or ( Stop and CurrentTime <= StartTime + Stop ) then local ScheduleTime = CurrentTime + Repeat + diff --git a/Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.lua b/Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.lua new file mode 100644 index 000000000..4e1c84183 --- /dev/null +++ b/Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.lua @@ -0,0 +1,24 @@ +--- Simple repeat scheduling of a function. +-- +-- === +-- +-- Author: FlightControl +-- Date Created: 13 Dec 2016 +-- +-- # Situation +-- Uses the Tracing functions from BASE within the DCS.log file. Check the DCS.log file for the results. +-- Create a new SCHEDULER object. +-- Check the DCS.log. +-- +-- # Test cases: +-- +-- 1. The log should contain "Hello World Repeat" lines that is fired off 1 second after mission start and is repeated every 1 seconds. +-- +-- +-- # Status: TESTED - 13 Dec 2016 + +local TestScheduler = SCHEDULER:New( nil, + function() + BASE:E( "Hello World Repeat") + end, {}, 1, 1 + ) \ No newline at end of file diff --git a/Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.miz new file mode 100644 index 0000000000000000000000000000000000000000..c3721898084abf368edf1e18191aa62988333ebf GIT binary patch literal 17788 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 literal 0 HcmV?d00001 From 152c8a986dcd62182b117b0a9200d8b73a34473f Mon Sep 17 00:00:00 2001 From: FlightControl Date: Tue, 13 Dec 2016 12:10:12 +0100 Subject: [PATCH 06/11] Pogress - Still a problem, getting obscolete calls after a garbage collect where i should not get them ... --- Moose Development/Moose/Core/Scheduler2.lua | 15 +--- Moose Development/Moose/Core/Timer.lua | 2 +- .../SCH-000 - Simple Scheduling.lua | 13 ++- .../SCH-000 - Simple Scheduling.miz | Bin 17738 -> 18147 bytes ...SCH-300 - GC Simple Object Scheduling.lua} | 7 +- ...SCH-300 - GC Simple Object Scheduling.miz} | Bin 18167 -> 18147 bytes .../SCH-310 - GC Object Repeat Scheduling.lua | 80 ++++++++++++++++++ .../SCH-310 - GC Object Repeat Scheduling.miz | Bin 0 -> 17605 bytes 8 files changed, 100 insertions(+), 17 deletions(-) rename Moose Test Missions/SCH - Scheduler/{SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua => SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.lua} (95%) rename Moose Test Missions/SCH - Scheduler/{SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz => SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.miz} (76%) create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-310 - GC Object Repeat Scheduling/SCH-310 - GC Object Repeat Scheduling.lua create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-310 - GC Object Repeat Scheduling/SCH-310 - GC Object Repeat Scheduling.miz diff --git a/Moose Development/Moose/Core/Scheduler2.lua b/Moose Development/Moose/Core/Scheduler2.lua index 363626328..e4bcfe7d9 100644 --- a/Moose Development/Moose/Core/Scheduler2.lua +++ b/Moose Development/Moose/Core/Scheduler2.lua @@ -58,18 +58,7 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg local self = BASE:Inherit( self, BASE:New() ) self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - self.Repeat = false - self.RepeatSecondsInterval = RepeatSecondsInterval or 0 - self.RandomizationFactor = RandomizationFactor or 0 - self.StopSeconds = StopSeconds - - self.StartTime = timer.getTime() - - _TIMERDISPATCHER:AddSchedule( self ) + self:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) return self end @@ -119,6 +108,8 @@ function SCHEDULER:Start() timer.removeFunction( self.ScheduleID ) end self:T( { self.StartSeconds } ) + _TIMERDISPATCHER:AddSchedule( self ) + self.ScheduleID = timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .001 ) end diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua index 19ea1bc14..96eae1411 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/Timer.lua @@ -103,7 +103,7 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star local StartTime = CurrentTime + Start if Status and (( Result == nil ) or ( Result and Result ~= false ) ) then - if Repeat ~= 0 and ( not Stop ) or ( Stop and CurrentTime <= StartTime + Stop ) then + if Repeat ~= 0 and ( Stop == 0 ) or ( Stop ~= 0 and CurrentTime <= StartTime + Stop ) then local ScheduleTime = CurrentTime + Repeat + diff --git a/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.lua b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.lua index 5b1cc0462..be50637aa 100644 --- a/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.lua +++ b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.lua @@ -19,6 +19,15 @@ local TestScheduler = SCHEDULER:New( nil, function() - BASE:E( "Hello World") + BASE:E( "Hello World 1") end, {}, 1 - ) \ No newline at end of file + ) + +SCHEDULER:New( nil, + function() + BASE:E( "Hello World 2") + end, {}, 2 + ) + +collectgarbage() + diff --git a/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz index 3cf8a601a008a9ed3867868b61029c27171821ca..2c6329813b8dc751822f0f939c97525be771f7b3 100644 GIT binary patch delta 3431 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 delta 2977 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 XMl%9eKa;^m7z!){000O=00000d8wCK diff --git a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua b/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.lua similarity index 95% rename from Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua rename to Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.lua index ee34c7a79..852a01bdc 100644 --- a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.lua +++ b/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.lua @@ -42,19 +42,22 @@ end do local Test1 = TEST_BASE:New( "Hello World Test 1" ) +collectgarbage() Test1 = nil +collectgarbage() BASE:E( Test1 ) end +collectgarbage() local Test2 = TEST_BASE:New( "Hello World Test 2" ) - +collectgarbage() +BASE:E( Test2 ) local Test3 = TEST_BASE:New( "Hello World Test 3" ) Test3 = nil collectgarbage() -BASE:E( Test2 ) BASE:E( Test3 ) BASE:E( "Collect Garbage executed." ) diff --git a/Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz b/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.miz similarity index 76% rename from Moose Test Missions/SCH - Scheduler/SCH-002 - No Object Scheduling because GC/SCH-002 - No Object Scheduling because GC.miz rename to Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.miz index 8707c5c492ffa14fabe538d19efe05ae614177e8..2cdac6499820380d22fa646923cfd223152da0eb 100644 GIT binary patch delta 3671 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 delta 3656 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 t{iFVOSm Date: Tue, 13 Dec 2016 12:29:28 +0100 Subject: [PATCH 07/11] Progress Fixed that schedulers, which are not attached to an object, after garbage collect were removed also from the scheduler dispatcher. The scheduler dispatcher now attaches the schedulers to 2 different tables. - A weak table ObjectSchedulers, which contains scheduler attached to objects. When the object is removed, the scheduler is removed also. - A weak table with PersistentSchedulers, which contains schedulers not attached to objects. These schedulers are persistent, even after garbage collection. I hope this now makes the circle round... --- Moose Development/Moose/Core/Timer.lua | 37 ++++++++++++------ .../SCH-000 - Simple Scheduling.miz | Bin 18147 -> 17770 bytes 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua index 96eae1411..3a8254e52 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/Timer.lua @@ -4,6 +4,8 @@ -- -- Takes care of scheduled function dispatching for defined in MOOSE classes. -- +-- This function is complicated. +-- -- === -- -- === @@ -37,11 +39,21 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star self.CallID = self.CallID + 1 - -- Initialize the Functions array, which is a weakly coupled table. + -- Initialize the ObjectSchedulers array, which is a weakly coupled table. -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. - self.Calls = self.Calls or setmetatable( {}, { __mode = "v" } ) - self.Calls[self.CallID] = Scheduler - Scheduler:E( { self.CallID, self.Calls[self.CallID] } ) + self.PersistentSchedulers = self.PersistentSchedulers or {} + + -- Initialize the ObjectSchedulers array, which is a weakly coupled table. + -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. + self.ObjectSchedulers = self.ObjectSchedulers or setmetatable( {}, { __mode = "v" } ) + + if Scheduler.TimeEventObject then + self.ObjectSchedulers[self.CallID] = Scheduler + self:T3( { self.CallID, self.ObjectSchedulers[self.CallID] } ) + else + self.PersistentSchedulers[self.CallID] = Scheduler + self:T3( { self.CallID, self.PersistentSchedulers[self.CallID] } ) + end self.Schedule = self.Schedule or setmetatable( {}, { __mode = "k" } ) self.Schedule[Scheduler] = {} @@ -54,10 +66,10 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star self.Schedule[Scheduler][self.CallID].Randomize = Randomize self.Schedule[Scheduler][self.CallID].Stop = Stop - self:E( self.Schedule[Scheduler][self.CallID] ) + self:T3( self.Schedule[Scheduler][self.CallID] ) self.Schedule[Scheduler][self.CallID].CallHandler = function( CallID ) - self:E( CallID ) + self:F3( CallID ) local ErrorHandler = function( errmsg ) env.info( "Error in timer function: " .. errmsg ) @@ -67,15 +79,18 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star return errmsg end - local Scheduler = self.Calls[CallID] + local Scheduler = self.ObjectSchedulers[CallID] + if not Scheduler then + Scheduler = self.PersistentSchedulers[CallID] + end - self:E( { Scheduler = Scheduler } ) + self:T3( { Scheduler = Scheduler } ) - if self.Calls[CallID] then + if Scheduler then local Schedule = self.Schedule[Scheduler][CallID] - self:E( { Schedule = Schedule } ) + self:T3( { Schedule = Schedule } ) local ScheduleObject = Scheduler.TimeEventObject local ScheduleFunction = Schedule.Function @@ -142,7 +157,7 @@ end function TIMER:RemoveSchedule( CallID ) self:F( CallID ) - local Schedule = self.Calls[CallID] + local Schedule = self.ObjectSchedulers[CallID] if Schedule then local ScheduleID = Schedule.ScheduleID diff --git a/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz index 2c6329813b8dc751822f0f939c97525be771f7b3..533a2dfda841c2c5e463cb439075d3ac74786eaf 100644 GIT binary patch delta 3296 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 No&f-mHuz`oe*g+UBY*$^ delta 3721 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 uPD2u(O(By`Q Date: Tue, 13 Dec 2016 13:05:21 +0100 Subject: [PATCH 08/11] Getting somewhere, with the new schedulers, the TASK logic works now much better! - Schedulers are stopped when the parent object is destroyed. - Parent objects are garbage cleaned. - Destructors are called. Jippie! Results!!! --- Moose Development/Moose/Core/Base.lua | 4 ++-- Moose Development/Moose/Core/Timer.lua | 11 ++++++----- Moose Development/Moose/Moose.lua | 8 +++++--- .../l10n/DEFAULT/Moose.lua | 2 +- Moose Mission Setup/Moose.lua | 2 +- .../SCH-310 - GC Object Repeat Scheduling.miz | Bin 17605 -> 18246 bytes .../TSK-010 - Task Modelling - SEAD.miz | Bin 28592 -> 28591 bytes 7 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua index ebbfb67dd..194f44154 100644 --- a/Moose Development/Moose/Core/Base.lua +++ b/Moose Development/Moose/Core/Base.lua @@ -132,7 +132,7 @@ function BASE:_SetDestructor() -- TODO: Okay, this is really technical... -- When you set a proxy to a table to catch __gc, weak tables don't behave like weak... -- Therefore, I am parking this logic until I've properly discussed all this with the community. - --[[ + -- local proxy = newproxy(true) local proxyMeta = getmetatable(proxy) @@ -147,7 +147,7 @@ function BASE:_SetDestructor() -- table is about to be garbage-collected - then the __gc hook -- will be invoked and the destructor called rawset( self, '__proxy', proxy ) - --]] + -- end --- This is the worker method to inherit from a parent class. diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/Timer.lua index 3a8254e52..662506fc6 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/Timer.lua @@ -69,7 +69,7 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star self:T3( self.Schedule[Scheduler][self.CallID] ) self.Schedule[Scheduler][self.CallID].CallHandler = function( CallID ) - self:F3( CallID ) + self:F( CallID ) local ErrorHandler = function( errmsg ) env.info( "Error in timer function: " .. errmsg ) @@ -84,15 +84,16 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star Scheduler = self.PersistentSchedulers[CallID] end - self:T3( { Scheduler = Scheduler } ) + self:T( { Scheduler = Scheduler } ) if Scheduler then local Schedule = self.Schedule[Scheduler][CallID] - self:T3( { Schedule = Schedule } ) + self:T( { Schedule = Schedule } ) local ScheduleObject = Scheduler.TimeEventObject + --local ScheduleObjectName = Scheduler.TimeEventObject:GetNameAndClassID() local ScheduleFunction = Schedule.Function local ScheduleArguments = Schedule.Arguments local Start = Schedule.Start @@ -127,7 +128,7 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star ( Randomize * Repeat / 2 ) ) + 0.01 - self:T( { ScheduleArguments, "Repeat:", CurrentTime, ScheduleTime } ) + self:T3( { ScheduleArguments, "Repeat:", CurrentTime, ScheduleTime } ) return ScheduleTime -- returns the next time the function needs to be called. else timer.removeFunction( ScheduleID ) @@ -138,7 +139,7 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star ScheduleID = nil end else - self:E( "Scheduled obscolete call ..." ) + --self:E( "Scheduled obscolete call for CallID: " .. CallID ) end return nil diff --git a/Moose Development/Moose/Moose.lua b/Moose Development/Moose/Moose.lua index 5d79c3bca..b14d40bea 100644 --- a/Moose Development/Moose/Moose.lua +++ b/Moose Development/Moose/Moose.lua @@ -64,9 +64,11 @@ Include.File( "Tasking/Task_A2G" ) --- Declare the event dispatcher based on the EVENT class _EVENTDISPATCHER = EVENT:New() -- Core.Event#EVENT ---- Declare the main database object, which is used internally by the MOOSE classes. -_DATABASE = DATABASE:New() -- Database#DATABASE - --- Declare the timer dispatcher based on the TIMER class _TIMERDISPATCHER = TIMER:New() -- Core.Timer#TIMER +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + + + diff --git a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua index 696b2b92e..d990a8dfe 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20161209_1413' ) +env.info( 'Moose Generation Timestamp: 20161213_1239' ) local base = _G diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 696b2b92e..d990a8dfe 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20161209_1413' ) +env.info( 'Moose Generation Timestamp: 20161213_1239' ) local base = _G diff --git a/Moose Test Missions/SCH - Scheduler/SCH-310 - GC Object Repeat Scheduling/SCH-310 - GC Object Repeat Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-310 - GC Object Repeat Scheduling/SCH-310 - GC Object Repeat Scheduling.miz index af44132dffb05689fb5f27c8bb648c5ce770942f..b1883f6dd5bd1f5771bb2b7764e67d23eef51cc8 100644 GIT binary patch delta 15229 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 Do|M;5 delta 461 zcmV;;0W$ut-vO}S0kB&t1)R;+b9$3tDlvcBZ44%OaN3D5t*qT)43Vr&W+6=^O?Mgl z?@Q8dR@Z@-gqQcd@5}e{g4u_kGr~RS4F&^PMNu5W{AE2|EoZP?&mN!WA;ih_DFL1D zK_46&AB$F;mlzh9VS!}M86 Date: Wed, 14 Dec 2016 06:58:24 +0100 Subject: [PATCH 09/11] Progress --- Moose Development/Moose/Core/Base.lua | 4 +- .../{Timer.lua => ScheduleDispatcher.lua} | 101 ++++++++++----- Moose Development/Moose/Core/Scheduler.lua | 116 +++++++++--------- Moose Development/Moose/Fsm/Fsm.lua | 5 +- Moose Development/Moose/Moose.lua | 6 +- Moose Development/Moose/Tasking/Task.lua | 1 + .../SCH-110 - Object Repeat Scheduling.miz | Bin 17991 -> 17981 bytes .../SCH-300 - GC Simple Object Scheduling.lua | 7 +- .../SCH-300 - GC Simple Object Scheduling.miz | Bin 18147 -> 23757 bytes .../TSK-010 - Task Modelling - SEAD.miz | Bin 28591 -> 27530 bytes 10 files changed, 137 insertions(+), 103 deletions(-) rename Moose Development/Moose/Core/{Timer.lua => ScheduleDispatcher.lua} (55%) diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua index 194f44154..ebbfb67dd 100644 --- a/Moose Development/Moose/Core/Base.lua +++ b/Moose Development/Moose/Core/Base.lua @@ -132,7 +132,7 @@ function BASE:_SetDestructor() -- TODO: Okay, this is really technical... -- When you set a proxy to a table to catch __gc, weak tables don't behave like weak... -- Therefore, I am parking this logic until I've properly discussed all this with the community. - -- + --[[ local proxy = newproxy(true) local proxyMeta = getmetatable(proxy) @@ -147,7 +147,7 @@ function BASE:_SetDestructor() -- table is about to be garbage-collected - then the __gc hook -- will be invoked and the destructor called rawset( self, '__proxy', proxy ) - -- + --]] end --- This is the worker method to inherit from a parent class. diff --git a/Moose Development/Moose/Core/Timer.lua b/Moose Development/Moose/Core/ScheduleDispatcher.lua similarity index 55% rename from Moose Development/Moose/Core/Timer.lua rename to Moose Development/Moose/Core/ScheduleDispatcher.lua index 662506fc6..8193086bb 100644 --- a/Moose Development/Moose/Core/Timer.lua +++ b/Moose Development/Moose/Core/ScheduleDispatcher.lua @@ -1,10 +1,29 @@ ---- This module contains the TIMER class. +--- This module defines the SCHEDULEDISPATCHER class, which is used by a central object called _SCHEDULEDISPATCHER. -- -- === -- --- Takes care of scheduled function dispatching for defined in MOOSE classes. +-- Takes care of the creation and dispatching of scheduled functions for SCHEDULER objects. -- --- This function is complicated. +-- This class is tricky and needs some thorought explanation. +-- SCHEDULE classes are used to schedule functions for objects, or as persistent objects. +-- The SCHEDULEDISPATCHER class ensures that: +-- +-- - Scheduled functions are planned according the SCHEDULER object parameters. +-- - Scheduled functions are repeated when requested, according the SCHEDULER object parameters. +-- - Scheduled functions are automatically removed when the schedule is finished, according the SCHEDULER object parameters. +-- +-- The SCHEDULEDISPATCHER class will manage SCHEDULER object in memory during garbage collection: +-- - When a SCHEDULER object is not attached to another object (that is, it's first :Schedule() parameter is nil), then the SCHEDULER +-- object is _persistent_ within memory. +-- - When a SCHEDULER object *is* attached to another object, then the SCHEDULER object is _not persistent_ within memory after a garbage collection! +-- The none persistency of SCHEDULERS attached to objects is required to allow SCHEDULER objects to be garbage collectged, when the parent object is also desroyed or nillified and garbage collected. +-- Even when there are pending timer scheduled functions to be executed for the SCHEDULER object, +-- these will not be executed anymore when the SCHEDULER object has been destroyed. +-- +-- The SCHEDULEDISPATCHER allows multiple scheduled functions to be planned and executed for one SCHEDULER object. +-- The SCHEDULER object therefore keeps a table of "CallID's", which are returned after each planning of a new scheduled function by the SCHEDULEDISPATCHER. +-- The SCHEDULER object plans new scheduled functions through the @{Core.Scheduler#SCHEDULER.Schedule}() method. +-- The Schedule() method returns the CallID that is the reference ID for each planned schedule. -- -- === -- @@ -13,16 +32,16 @@ -- ### Contributions: - -- ### Authors: FlightControl : Design & Programming -- --- @module Timer +-- @module ScheduleDispatcher ---- The TIMER structure --- @type TIMER -TIMER = { - ClassName = "TIMER", +--- The SCHEDULEDISPATCHER structure +-- @type SCHEDULEDISPATCHER +SCHEDULEDISPATCHER = { + ClassName = "SCHEDULEDISPATCHER", CallID = 0, } -function TIMER:New() +function SCHEDULEDISPATCHER:New() local self = BASE:Inherit( self, BASE:New() ) self:F3() return self @@ -32,9 +51,9 @@ end -- The development of this method was really tidy. -- It is constructed as such that a garbage collection is executed on the weak tables, when the Scheduler is nillified. -- Nothing of this code should be modified without testing it thoroughly. --- @param #TIMER self +-- @param #SCHEDULEDISPATCHER self -- @param Core.Scheduler#SCHEDULER Scheduler -function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop ) +function SCHEDULEDISPATCHER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop ) self:F( { Scheduler, ScheduleFunction, ScheduleArguments, Start, Repeat, Randomize, Stop } ) self.CallID = self.CallID + 1 @@ -128,15 +147,13 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star ( Randomize * Repeat / 2 ) ) + 0.01 - self:T3( { ScheduleArguments, "Repeat:", CurrentTime, ScheduleTime } ) + self:T3( { Repeat = CallID, CurrentTime, ScheduleTime, ScheduleArguments } ) return ScheduleTime -- returns the next time the function needs to be called. else - timer.removeFunction( ScheduleID ) - ScheduleID = nil + self:Stop( Scheduler, CallID ) end else - timer.removeFunction( ScheduleID ) - ScheduleID = nil + self:Stop( Scheduler, CallID ) end else --self:E( "Scheduled obscolete call for CallID: " .. CallID ) @@ -145,29 +162,49 @@ function TIMER:AddSchedule( Scheduler, ScheduleFunction, ScheduleArguments, Star return nil end - - self.Schedule[Scheduler][self.CallID].ScheduleID = timer.scheduleFunction( - self.Schedule[Scheduler][self.CallID].CallHandler, - self.CallID, - timer.getTime() + self.Schedule[Scheduler][self.CallID].Start - ) + self:Start( Scheduler, self.CallID ) return self.CallID end -function TIMER:RemoveSchedule( CallID ) - self:F( CallID ) +function SCHEDULEDISPATCHER:RemoveSchedule( Scheduler, CallID ) + self:F( { Remove = CallID, Scheduler = Scheduler } ) - local Schedule = self.ObjectSchedulers[CallID] - - if Schedule then - local ScheduleID = Schedule.ScheduleID - timer.removeFunction( ScheduleID ) - ScheduleID = nil - Schedule = nil + if CallID then + self:Stop( Scheduler, CallID ) + self.Schedule[Scheduler][CallID] = nil + end +end + +function SCHEDULEDISPATCHER:Start( Scheduler, CallID ) + self:F( { Start = CallID, Scheduler = Scheduler } ) + + if CallID then + local Schedule = self.Schedule[Scheduler] + Schedule[CallID].ScheduleID = timer.scheduleFunction( + Schedule[CallID].CallHandler, + CallID, + timer.getTime() + Schedule[CallID].Start + ) + else + for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + self:Start( Scheduler, CallID ) -- Recursive + end + end +end + +function SCHEDULEDISPATCHER:Stop( Scheduler, CallID ) + self:F( { Stop = CallID, Scheduler = Scheduler } ) + + if CallID then + local Schedule = self.Schedule[Scheduler] + timer.removeFunction( Schedule[CallID].ScheduleID ) + else + for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + self:Stop( Scheduler, CallID ) -- Recursive + end end end - diff --git a/Moose Development/Moose/Core/Scheduler.lua b/Moose Development/Moose/Core/Scheduler.lua index ce54f70d8..2b953e3cb 100644 --- a/Moose Development/Moose/Core/Scheduler.lua +++ b/Moose Development/Moose/Core/Scheduler.lua @@ -1,36 +1,43 @@ --- This module contains the SCHEDULER class. -- --- 1) @{Core.Scheduler#SCHEDULER} class, extends @{Core.Base#BASE} --- ===================================================== --- The @{Core.Scheduler#SCHEDULER} class models time events calling given event handling functions. +-- # 1) @{Core.Scheduler#SCHEDULER} class, extends @{Core.Base#BASE} +-- +-- The @{Core.Scheduler#SCHEDULER} class creates schedule. -- --- 1.1) SCHEDULER constructor --- -------------------------- --- The SCHEDULER class is quite easy to use: +-- ## 1.1) SCHEDULER constructor +-- +-- The SCHEDULER class is quite easy to use, but note that the New constructor has variable parameters: -- --- * @{Core.Scheduler#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. +-- * @{Core.Scheduler#SCHEDULER.New}( nil ): Setup a new SCHEDULER object, which is persistently executed after garbage collection. +-- * @{Core.Scheduler#SCHEDULER.New}( Object ): Setup a new SCHEDULER object, which is linked to the Object. When the Object is nillified or destroyed, the SCHEDULER object will also be destroyed and stopped after garbage collection. +-- * @{Core.Scheduler#SCHEDULER.New}( nil, Function, FunctionArguments, Start, ... ): Setup a new persistent SCHEDULER object, and start a new schedule for the Function with the defined FunctionArguments according the Start and sequent parameters. +-- * @{Core.Scheduler#SCHEDULER.New}( Object, Function, FunctionArguments, Start, ... ): Setup a new SCHEDULER object, linked to Object, and start a new schedule for the Function with the defined FunctionArguments according the Start and sequent parameters. +-- +-- ## 1.2) SCHEDULER timer stopping and (re-)starting. -- --- 1.2) SCHEDULER timer stop and start --- ----------------------------------- -- The SCHEDULER can be stopped and restarted with the following methods: -- --- * @{Core.Scheduler#SCHEDULER.Start}: (Re-)Start the scheduler. --- * @{Core.Scheduler#SCHEDULER.Stop}: Stop the scheduler. +-- * @{Core.Scheduler#SCHEDULER.Start}(): (Re-)Start the schedules within the SCHEDULER object. If a CallID is provided to :Start(), only the schedule referenced by CallID will be (re-)started. +-- * @{Core.Scheduler#SCHEDULER.Stop}(): Stop the schedules within the SCHEDULER object. If a CallID is provided to :Stop(), then only the schedule referenced by CallID will be stopped. -- --- 1.3) Reschedule new time event --- ------------------------------ --- With @{Core.Scheduler#SCHEDULER.Schedule} a new time event can be scheduled. +-- ## 1.3) Create a new schedule +-- +-- With @{Core.Scheduler#SCHEDULER.Schedule}() a new time event can be scheduled. This function is used by the :New() constructor when a new schedule is planned. -- -- === -- -- ### Contributions: -- --- * Mechanist : Concept & Testing +-- * FlightControl : Concept & Testing -- -- ### Authors: -- -- * FlightControl : Design & Programming -- +-- ### Test Missions: +-- +-- * SCH - Scheduler +-- -- === -- -- @module Scheduler @@ -55,19 +62,24 @@ SCHEDULER = { -- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. -- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. -- @return #SCHEDULER self +-- @return #number The ScheduleID of the planned schedule. function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) local self = BASE:Inherit( self, BASE:New() ) self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - self:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + local ScheduleID = nil + + if TimeEventFunction then + ScheduleID = self:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + end - return self + return self, ScheduleID end --function SCHEDULER:_Destructor() -- --self:E("_Destructor") -- --- _TIMERDISPATCHER:RemoveSchedule( self.CallID ) +-- _SCHEDULEDISPATCHER:RemoveSchedule( self.CallID ) --end --- Schedule a new time event. Note that the schedule will only take place if the scheduler is *started*. Even for a single schedule event, the scheduler needs to be started also. @@ -79,7 +91,7 @@ end -- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. -- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. -- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self +-- @return #number The ScheduleID of the planned schedule. function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) self:T3( { TimeEventFunctionArguments } ) @@ -87,7 +99,7 @@ function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFuncti self.TimeEventObject = TimeEventObject - self.Schedules[#self.Schedules+1] = _TIMERDISPATCHER:AddSchedule( + local ScheduleID = _SCHEDULEDISPATCHER:AddSchedule( self, TimeEventFunction, TimeEventFunctionArguments, @@ -96,51 +108,37 @@ function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFuncti RandomizationFactor, StopSeconds ) - - return self -end - ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2() - - if self.RepeatSecondsInterval ~= 0 then - self.Repeat = true - end - if self.StartSeconds then - self:T( { self.StartSeconds } ) - self.Schedules[#self.Schedules+1] = _TIMERDISPATCHER:AddSchedule( - self, - self.TimeEventObject, - self.TimeEventFunction, - self.TimeEventFunctionArguments, - self.StartSeconds, - self.RepeatSecondsInterval, - self.RandomizationFactor, - self.StopSeconds - ) - end - - return self + self.Schedules[#self.Schedules+1] = ScheduleID + + return ScheduleID end ---- Stops the scheduler. +--- (Re-)Starts the schedules or a specific schedule if a valid ScheduleID is provided. -- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Start( ScheduleID ) + self:F3( { ScheduleID } ) - self.Repeat = false - if self.ScheduleID then - self:E( "Stop Schedule" ) - timer.removeFunction( self.ScheduleID ) - end - self.ScheduleID = nil + _SCHEDULEDISPATCHER:Start( self, ScheduleID ) +end - return self +--- Stops the schedules or a specific schedule if a valid ScheduleID is provided. +-- @param #SCHEDULER self +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Stop( ScheduleID ) + self:F3( { ScheduleID } ) + + _SCHEDULEDISPATCHER:Stop( self, ScheduleID ) +end + +--- Removes a specific schedule if a valid ScheduleID is provided. +-- @param #SCHEDULER self +-- @param #number ScheduleID (optional) The ScheduleID of the planned (repeating) schedule. +function SCHEDULER:Remove( ScheduleID ) + self:F3( { ScheduleID } ) + + _SCHEDULEDISPATCHER:Remove( self, ScheduleID ) end diff --git a/Moose Development/Moose/Fsm/Fsm.lua b/Moose Development/Moose/Fsm/Fsm.lua index 373b544c8..d7a894a70 100644 --- a/Moose Development/Moose/Fsm/Fsm.lua +++ b/Moose Development/Moose/Fsm/Fsm.lua @@ -58,6 +58,8 @@ do -- FSM self._EndStates = {} self._Scores = {} + self.CallScheduler = SCHEDULER:New( self ) + return self end @@ -313,7 +315,8 @@ do -- FSM self:E( { EventName = EventName } ) return function( self, DelaySeconds, ... ) self:T( "Delayed Event: " .. EventName ) - SCHEDULER:New( self, self._handler, { EventName, ... }, DelaySeconds ) + local CallID = self.CallScheduler:Schedule( self, self._handler, { EventName, ... }, DelaySeconds or 1 ) + self:T( { CallID = CallID } ) end end diff --git a/Moose Development/Moose/Moose.lua b/Moose Development/Moose/Moose.lua index b14d40bea..3dc6792af 100644 --- a/Moose Development/Moose/Moose.lua +++ b/Moose Development/Moose/Moose.lua @@ -7,7 +7,7 @@ Include.File( "Utilities/Utils" ) --- Core Classes Include.File( "Core/Base" ) Include.File( "Core/Scheduler" ) -Include.File( "Core/Timer") +Include.File( "Core/ScheduleDispatcher") Include.File( "Core/Event" ) Include.File( "Core/Menu" ) Include.File( "Core/Zone" ) @@ -64,8 +64,8 @@ Include.File( "Tasking/Task_A2G" ) --- Declare the event dispatcher based on the EVENT class _EVENTDISPATCHER = EVENT:New() -- Core.Event#EVENT ---- Declare the timer dispatcher based on the TIMER class -_TIMERDISPATCHER = TIMER:New() -- Core.Timer#TIMER +--- Declare the timer dispatcher based on the SCHEDULEDISPATCHER class +_SCHEDULEDISPATCHER = SCHEDULEDISPATCHER:New() -- Core.Timer#SCHEDULEDISPATCHER --- Declare the main database object, which is used internally by the MOOSE classes. _DATABASE = DATABASE:New() -- Database#DATABASE diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 983a85d1d..f599dd00b 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -539,6 +539,7 @@ function TASK_BASE:RemoveStateMachine( TaskUnit ) self.Fsm[TaskUnit] = nil collectgarbage() + self:T( "Garbage Collected, Processes should be finalized now ...") end --- Checks if there is a FiniteStateMachine assigned to Task@{Unit} for @{Task} diff --git a/Moose Test Missions/SCH - Scheduler/SCH-110 - Object Repeat Scheduling/SCH-110 - Object Repeat Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-110 - Object Repeat Scheduling/SCH-110 - Object Repeat Scheduling.miz index d4b4e7d27e2d83ea50676604b6547adaab832fa9..1f2126a2b53ad63838467bd9d5a8cd0e9365088a 100644 GIT binary patch delta 2739 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 SMKl3TlNv@H2L3_-0001JI4AD_ diff --git a/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.lua b/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.lua index 852a01bdc..f5e5dab2d 100644 --- a/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.lua +++ b/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.lua @@ -42,24 +42,19 @@ end do local Test1 = TEST_BASE:New( "Hello World Test 1" ) -collectgarbage() Test1 = nil -collectgarbage() BASE:E( Test1 ) end -collectgarbage() local Test2 = TEST_BASE:New( "Hello World Test 2" ) -collectgarbage() BASE:E( Test2 ) local Test3 = TEST_BASE:New( "Hello World Test 3" ) Test3 = nil +BASE:E( Test3 ) collectgarbage() -BASE:E( Test3 ) - BASE:E( "Collect Garbage executed." ) BASE:E( "You should only see a Hello Worlld message for Test 2!" ) BASE:E( "Check if Test 1 and Test 3 are garbage collected!" ) \ No newline at end of file diff --git a/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-300 - GC Simple Object Scheduling/SCH-300 - GC Simple Object Scheduling.miz index 2cdac6499820380d22fa646923cfd223152da0eb..f0b44f7136c2d3bbef18dcdd966efcdbee27fe8c 100644 GIT binary patch delta 9108 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 O`jjYA@R0KStFEM0%tW9)X>t#;RfL2#Ay{g5> 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 diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz index fb792174b3c43b3360275a851546b41274084691..15ec24d93950e2385a06dd44acb7d8a719d363ef 100644 GIT binary patch delta 25238 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 C?L)2r delta 26424 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

Mkq9>>b~2zYU- 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 Date: Wed, 14 Dec 2016 06:59:43 +0100 Subject: [PATCH 10/11] Progress --- Moose Development/Moose/Core/Scheduler2.lua | 205 -------------------- 1 file changed, 205 deletions(-) delete mode 100644 Moose Development/Moose/Core/Scheduler2.lua diff --git a/Moose Development/Moose/Core/Scheduler2.lua b/Moose Development/Moose/Core/Scheduler2.lua deleted file mode 100644 index e4bcfe7d9..000000000 --- a/Moose Development/Moose/Core/Scheduler2.lua +++ /dev/null @@ -1,205 +0,0 @@ ---- This module contains the SCHEDULER class. --- --- 1) @{Core.Scheduler#SCHEDULER} class, extends @{Core.Base#BASE} --- ===================================================== --- The @{Core.Scheduler#SCHEDULER} class models time events calling given event handling functions. --- --- 1.1) SCHEDULER constructor --- -------------------------- --- The SCHEDULER class is quite easy to use: --- --- * @{Core.Scheduler#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. --- --- 1.2) SCHEDULER timer stop and start --- ----------------------------------- --- The SCHEDULER can be stopped and restarted with the following methods: --- --- * @{Core.Scheduler#SCHEDULER.Start}: (Re-)Start the scheduler. --- * @{Core.Scheduler#SCHEDULER.Stop}: Stop the scheduler. --- --- 1.3) Reschedule new time event --- ------------------------------ --- With @{Core.Scheduler#SCHEDULER.Schedule} a new time event can be scheduled. --- --- === --- --- ### Contributions: --- --- * Mechanist : Concept & Testing --- --- ### Authors: --- --- * FlightControl : Design & Programming --- --- === --- --- @module Scheduler - - ---- The SCHEDULER class --- @type SCHEDULER --- @field #number ScheduleID the ID of the scheduler. --- @extends Core.Base#BASE -SCHEDULER = { - ClassName = "SCHEDULER", -} - ---- SCHEDULER constructor. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - self:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - - return self -end - ---- Schedule a new time event. Note that the schedule will only take place if the scheduler is *started*. Even for a single schedule event, the scheduler needs to be started also. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - self:T3( { TimeEventFunctionArguments } ) - - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - self.Repeat = false - self.RepeatSecondsInterval = RepeatSecondsInterval or 0 - self.RandomizationFactor = RandomizationFactor or 0 - self.StopSeconds = StopSeconds - - self.StartTime = timer.getTime() - - self:Start() - - return self -end - ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2() - - if self.RepeatSecondsInterval ~= 0 then - self.Repeat = true - end - - if self.StartSeconds then - if self.ScheduleID then - timer.removeFunction( self.ScheduleID ) - end - self:T( { self.StartSeconds } ) - _TIMERDISPATCHER:AddSchedule( self ) - - self.ScheduleID = timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .001 ) - end - - return self -end - ---- Stops the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) - - self.Repeat = false - if self.ScheduleID then - self:E( "Stop Schedule" ) - timer.removeFunction( self.ScheduleID ) - end - self.ScheduleID = nil - - return self -end - --- Private Functions - ---- @param #SCHEDULER self -function SCHEDULER:_Scheduler() - self:F2( self.TimeEventFunctionArguments ) - - local ErrorHandler = function( errmsg ) - - env.info( "Error in SCHEDULER function:" .. errmsg ) - if debug ~= nil then - env.info( debug.traceback() ) - end - - return errmsg - end - - local StartTime = self.StartTime - local StopSeconds = self.StopSeconds - local Repeat = self.Repeat - local RandomizationFactor = self.RandomizationFactor - local RepeatSecondsInterval = self.RepeatSecondsInterval - local ScheduleID = self.ScheduleID - - local Status, Result - if self.TimeEventObject then - Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - else - Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - end - - self:T( { "Timer Event2 .. " .. self.ScheduleID, Status, Result, StartTime, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - if Status and ( ( Result == nil ) or ( Result and Result ~= false ) ) then - if Repeat and ( not StopSeconds or ( StopSeconds and timer.getTime() <= StartTime + StopSeconds ) ) then - local ScheduleTime = - timer.getTime() + - self.RepeatSecondsInterval + - math.random( - - ( RandomizationFactor * RepeatSecondsInterval / 2 ), - ( RandomizationFactor * RepeatSecondsInterval / 2 ) - ) + - 0.01 - self:T( { self.TimeEventFunctionArguments, "Repeat:", timer.getTime(), ScheduleTime } ) - return ScheduleTime -- returns the next time the function needs to be called. - else - timer.removeFunction( ScheduleID ) - self.ScheduleID = nil - end - else - timer.removeFunction( ScheduleID ) - self.ScheduleID = nil - end - - return nil -end - - - - - - - - - - - - - - - - From 365034ad690fcb848b00253435bbdfa19fcb5ef7 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Wed, 14 Dec 2016 11:10:00 +0100 Subject: [PATCH 11/11] Finalized the SCHEDULER and SCHEDULERDISPATCHER - Done, time to remerge the work. --- Moose Development/Moose/Core/Event.lua | 2 +- .../Moose/Core/ScheduleDispatcher.lua | 6 +- Moose Development/Moose/Core/Scheduler.lua | 56 +++++++++--------- Moose Development/Moose/Wrapper/Client.lua | 7 ++- .../SCH-000 - Simple Scheduling.miz | Bin 17770 -> 17775 bytes .../SCH-001 - Simple Object Scheduling.miz | Bin 17882 -> 17872 bytes .../SCH-100 - Simple Repeat Scheduling.miz | Bin 17788 -> 17785 bytes .../SCH-110 - Object Repeat Scheduling.miz | Bin 17981 -> 17986 bytes ...imple Repeat Scheduling Stop and Start.lua | 41 +++++++++++++ ...imple Repeat Scheduling Stop and Start.miz | Bin 0 -> 22825 bytes .../SPA-120 - Repeat Spawning.miz | Bin 25653 -> 25841 bytes 11 files changed, 78 insertions(+), 34 deletions(-) create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-200 - Simple Repeat Scheduling Stop and Start/SCH-200 - Simple Repeat Scheduling Stop and Start.lua create mode 100644 Moose Test Missions/SCH - Scheduler/SCH-200 - Simple Repeat Scheduling Stop and Start/SCH-200 - Simple Repeat Scheduling Stop and Start.miz diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 0d426511c..e3f5301a2 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -726,7 +726,7 @@ function EVENT:onEvent( Event ) Event.IniUnit = UNIT:FindByName( Event.IniDCSUnitName ) if not Event.IniUnit then -- Unit can be a CLIENT. Most likely this will be the case ... - Event.IniUnit = CLIENT:FindByName( Event.IniDCSUnitName ) + Event.IniUnit = CLIENT:FindByName( Event.IniDCSUnitName, '', true ) end Event.IniDCSGroupName = "" if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then diff --git a/Moose Development/Moose/Core/ScheduleDispatcher.lua b/Moose Development/Moose/Core/ScheduleDispatcher.lua index 8193086bb..e069ce0a3 100644 --- a/Moose Development/Moose/Core/ScheduleDispatcher.lua +++ b/Moose Development/Moose/Core/ScheduleDispatcher.lua @@ -66,7 +66,7 @@ function SCHEDULEDISPATCHER:AddSchedule( Scheduler, ScheduleFunction, ScheduleAr -- If the object used as the key is nil, then the garbage collector will remove the item from the Functions array. self.ObjectSchedulers = self.ObjectSchedulers or setmetatable( {}, { __mode = "v" } ) - if Scheduler.TimeEventObject then + if Scheduler.SchedulerObject then self.ObjectSchedulers[self.CallID] = Scheduler self:T3( { self.CallID, self.ObjectSchedulers[self.CallID] } ) else @@ -111,8 +111,8 @@ function SCHEDULEDISPATCHER:AddSchedule( Scheduler, ScheduleFunction, ScheduleAr self:T( { Schedule = Schedule } ) - local ScheduleObject = Scheduler.TimeEventObject - --local ScheduleObjectName = Scheduler.TimeEventObject:GetNameAndClassID() + local ScheduleObject = Scheduler.SchedulerObject + --local ScheduleObjectName = Scheduler.SchedulerObject:GetNameAndClassID() local ScheduleFunction = Schedule.Function local ScheduleArguments = Schedule.Arguments local Start = Schedule.Start diff --git a/Moose Development/Moose/Core/Scheduler.lua b/Moose Development/Moose/Core/Scheduler.lua index 2b953e3cb..6047240aa 100644 --- a/Moose Development/Moose/Core/Scheduler.lua +++ b/Moose Development/Moose/Core/Scheduler.lua @@ -54,23 +54,23 @@ SCHEDULER = { --- SCHEDULER constructor. -- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @param #table SchedulerObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function SchedulerFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in SchedulerArguments. +-- @param #table SchedulerArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number Start Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number Repeat Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizeFactor Specifies a randomization factor between 0 and 1 to randomize the Repeat. +-- @param #number Stop Specifies the amount of seconds when the scheduler will be stopped. -- @return #SCHEDULER self -- @return #number The ScheduleID of the planned schedule. -function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) +function SCHEDULER:New( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) local self = BASE:Inherit( self, BASE:New() ) - self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + self:F2( { Start, Repeat, RandomizeFactor, Stop } ) local ScheduleID = nil - if TimeEventFunction then - ScheduleID = self:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + if SchedulerFunction then + ScheduleID = self:Schedule( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) end return self, ScheduleID @@ -84,29 +84,29 @@ end --- Schedule a new time event. Note that the schedule will only take place if the scheduler is *started*. Even for a single schedule event, the scheduler needs to be started also. -- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @param #table SchedulerObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function SchedulerFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in SchedulerArguments. +-- @param #table SchedulerArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number Start Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number Repeat Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizeFactor Specifies a randomization factor between 0 and 1 to randomize the Repeat. +-- @param #number Stop Specifies the amount of seconds when the scheduler will be stopped. -- @return #number The ScheduleID of the planned schedule. -function SCHEDULER:Schedule( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - self:F2( { StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - self:T3( { TimeEventFunctionArguments } ) +function SCHEDULER:Schedule( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) + self:F2( { Start, Repeat, RandomizeFactor, Stop } ) + self:T3( { SchedulerArguments } ) - self.TimeEventObject = TimeEventObject + self.SchedulerObject = SchedulerObject local ScheduleID = _SCHEDULEDISPATCHER:AddSchedule( self, - TimeEventFunction, - TimeEventFunctionArguments, - StartSeconds, - RepeatSecondsInterval, - RandomizationFactor, - StopSeconds + SchedulerFunction, + SchedulerArguments, + Start, + Repeat, + RandomizeFactor, + Stop ) self.Schedules[#self.Schedules+1] = ScheduleID diff --git a/Moose Development/Moose/Wrapper/Client.lua b/Moose Development/Moose/Wrapper/Client.lua index d28d33549..02f1637da 100644 --- a/Moose Development/Moose/Wrapper/Client.lua +++ b/Moose Development/Moose/Wrapper/Client.lua @@ -92,6 +92,7 @@ end -- @param #CLIENT self -- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. -- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @param #boolean Error A flag that indicates whether an error should be raised if the CLIENT cannot be found. By default an error will be raised. -- @return #CLIENT -- @usage -- -- Create new Clients. @@ -102,7 +103,7 @@ end -- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) -- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) -- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:FindByName( ClientName, ClientBriefing ) +function CLIENT:FindByName( ClientName, ClientBriefing, Error ) local ClientFound = _DATABASE:FindClient( ClientName ) if ClientFound then @@ -113,7 +114,9 @@ function CLIENT:FindByName( ClientName, ClientBriefing ) return ClientFound end - error( "CLIENT not found for: " .. ClientName ) + if not Error then + error( "CLIENT not found for: " .. ClientName ) + end end function CLIENT:Register( ClientName ) diff --git a/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-000 - Simple Scheduling/SCH-000 - Simple Scheduling.miz index 533a2dfda841c2c5e463cb439075d3ac74786eaf..815610bda541ad56850e441ae7dc30eb06b9e78e 100644 GIT binary patch delta 2708 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 diff --git a/Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Object Scheduling/SCH-001 - Simple Object Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-001 - Simple Object Scheduling/SCH-001 - Simple Object Scheduling.miz index e58635bf0f44812547c8e4950cfabbb35080af9f..950ab83077f9df9eeab5a78b95fcaaa6d47541b5 100644 GIT binary patch delta 3240 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 V7n68JGy&j~twkLMkwO3f006)P4ix|Z diff --git a/Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.miz b/Moose Test Missions/SCH - Scheduler/SCH-100 - Simple Repeat Scheduling/SCH-100 - Simple Repeat Scheduling.miz index c3721898084abf368edf1e18191aa62988333ebf..387a7232533b2be0df1cc6f231a9586ded48260b 100644 GIT binary patch delta 2724 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 delta 2759 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 N8b%!k`9c5y001giGO7Ro delta 2678 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 literal 0 HcmV?d00001 diff --git a/Moose Test Missions/SPA - Spawning/SPA-120 - Repeat Spawning/SPA-120 - Repeat Spawning.miz b/Moose Test Missions/SPA - Spawning/SPA-120 - Repeat Spawning/SPA-120 - Repeat Spawning.miz index 44f4101a41e968345cb17ebde9c2c52dd0e622af..fffacfa61a30ed7983b5c2954d8df4dbd96da4a1 100644 GIT binary patch delta 13722 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 delta 13563 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