From 755343d02ef6fc983eaaafdcae736f6835ced03b Mon Sep 17 00:00:00 2001 From: FlightControl Date: Wed, 26 Apr 2017 11:33:48 +0200 Subject: [PATCH] Fixeds for tasking - Fixed the hanging report (I think) - Fixed the routing messages appearing every time again - Fixed the Task menu --- Moose Development/Moose/Core/Fsm.lua | 7 +- .../Moose/Core/ScheduleDispatcher.lua | 6 +- .../Moose/Tasking/CommandCenter.lua | 2 +- Moose Development/Moose/Tasking/Mission.lua | 86 +++++----- Moose Development/Moose/Tasking/Task.lua | 4 +- .../Moose/Tasking/Task_A2G_Dispatcher.lua | 155 +++++++++--------- Moose Development/Moose/Wrapper/Group.lua | 1 - Moose Mission Setup/Moose.lua | 2 +- 8 files changed, 138 insertions(+), 125 deletions(-) diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index 972071634..8af98362f 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -1003,8 +1003,11 @@ do -- FSM_PROCESS -- @param #FSM_PROCESS self -- @return #FSM_PROCESS function FSM_PROCESS:Remove() - self:T( { self:GetClassNameAndID() } ) - + self:F( { self:GetClassNameAndID() } ) + + self:F( "Clearing Schedules" ) + self.CallScheduler:Clear() + -- Copy Processes for ProcessID, Process in pairs( self:GetProcesses() ) do self:E( { Process} ) diff --git a/Moose Development/Moose/Core/ScheduleDispatcher.lua b/Moose Development/Moose/Core/ScheduleDispatcher.lua index a7962e677..9db739ae1 100644 --- a/Moose Development/Moose/Core/ScheduleDispatcher.lua +++ b/Moose Development/Moose/Core/ScheduleDispatcher.lua @@ -191,7 +191,7 @@ function SCHEDULEDISPATCHER:Start( Scheduler, CallID ) ) end else - for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + for CallID, Schedule in pairs( self.Schedule[Scheduler] or {} ) do self:Start( Scheduler, CallID ) -- Recursive end end @@ -209,7 +209,7 @@ function SCHEDULEDISPATCHER:Stop( Scheduler, CallID ) Schedule[CallID].ScheduleID = nil end else - for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + for CallID, Schedule in pairs( self.Schedule[Scheduler] or {} ) do self:Stop( Scheduler, CallID ) -- Recursive end end @@ -218,7 +218,7 @@ end function SCHEDULEDISPATCHER:Clear( Scheduler ) self:F2( { Scheduler = Scheduler } ) - for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + for CallID, Schedule in pairs( self.Schedule[Scheduler] or {} ) do self:Stop( Scheduler, CallID ) -- Recursive end end diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index f24527cbb..f599dc87f 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -161,7 +161,7 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) local PlayerUnit = EventData.IniUnit for MissionID, Mission in pairs( self:GetMissions() ) do local Mission = Mission -- Tasking.Mission#MISSION - if Mission:IsOngoing() then + if Mission:IsENGAGED() then Mission:AbortUnit( PlayerUnit ) end end diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 177376bfd..f0bfb9c52 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -26,35 +26,35 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi local self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM - self:SetStartState( "Idle" ) + self:SetStartState( "IDLE" ) - self:AddTransition( "Idle", "Start", "Ongoing" ) + self:AddTransition( "IDLE", "Start", "ENGAGED" ) - --- OnLeave Transition Handler for State Idle. - -- @function [parent=#MISSION] OnLeaveIdle + --- OnLeave Transition Handler for State IDLE. + -- @function [parent=#MISSION] OnLeaveIDLE -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Idle. - -- @function [parent=#MISSION] OnEnterIdle + --- OnEnter Transition Handler for State IDLE. + -- @function [parent=#MISSION] OnEnterIDLE -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. - --- OnLeave Transition Handler for State Ongoing. - -- @function [parent=#MISSION] OnLeaveOngoing + --- OnLeave Transition Handler for State ENGAGED. + -- @function [parent=#MISSION] OnLeaveENGAGED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Ongoing. - -- @function [parent=#MISSION] OnEnterOngoing + --- OnEnter Transition Handler for State ENGAGED. + -- @function [parent=#MISSION] OnEnterENGAGED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. @@ -84,18 +84,18 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi -- @param #MISSION self -- @param #number Delay The delay in seconds. - self:AddTransition( "Ongoing", "Stop", "Idle" ) + self:AddTransition( "ENGAGED", "Stop", "IDLE" ) - --- OnLeave Transition Handler for State Idle. - -- @function [parent=#MISSION] OnLeaveIdle + --- OnLeave Transition Handler for State IDLE. + -- @function [parent=#MISSION] OnLeaveIDLE -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Idle. - -- @function [parent=#MISSION] OnEnterIdle + --- OnEnter Transition Handler for State IDLE. + -- @function [parent=#MISSION] OnEnterIDLE -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. @@ -125,18 +125,18 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi -- @param #MISSION self -- @param #number Delay The delay in seconds. - self:AddTransition( "Ongoing", "Complete", "Completed" ) + self:AddTransition( "ENGAGED", "Complete", "COMPLETED" ) - --- OnLeave Transition Handler for State Completed. - -- @function [parent=#MISSION] OnLeaveCompleted + --- OnLeave Transition Handler for State COMPLETED. + -- @function [parent=#MISSION] OnLeaveCOMPLETED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Completed. - -- @function [parent=#MISSION] OnEnterCompleted + --- OnEnter Transition Handler for State COMPLETED. + -- @function [parent=#MISSION] OnEnterCOMPLETED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. @@ -166,18 +166,18 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi -- @param #MISSION self -- @param #number Delay The delay in seconds. - self:AddTransition( "*", "Fail", "Failed" ) + self:AddTransition( "*", "Fail", "FAILED" ) - --- OnLeave Transition Handler for State Failed. - -- @function [parent=#MISSION] OnLeaveFailed + --- OnLeave Transition Handler for State FAILED. + -- @function [parent=#MISSION] OnLeaveFAILED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Failed. - -- @function [parent=#MISSION] OnEnterFailed + --- OnEnter Transition Handler for State FAILED. + -- @function [parent=#MISSION] OnEnterFAILED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. @@ -235,7 +235,7 @@ function MISSION:onbeforeComplete( From, Event, To ) for TaskID, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK - if not Task:IsStateSuccess() and not Task:IsStateFailed() and not Task:IsStateAborted() and not Task:IsStateCancelled() then + if not Task:IsStateSuccess() and not Task:IsStateFAILED() and not Task:IsStateAborted() and not Task:IsStateCancelled() then return false -- Mission cannot be completed. Other Tasks are still active. end end @@ -247,7 +247,7 @@ end -- @param #string From -- @param #string Event -- @param #string To -function MISSION:onenterCompleted( From, Event, To ) +function MISSION:onenterCOMPLETED( From, Event, To ) self:GetCommandCenter():MessageToCoalition( "Mission " .. self:GetName() .. " has been completed! Good job guys!" ) end @@ -489,39 +489,39 @@ function MISSION:GetNextTaskID( Task ) return self.Tasks[TaskName].n end ---- Is the @{Mission} **Completed**. +--- Is the @{Mission} **COMPLETED**. -- @param #MISSION self -- @return #boolean -function MISSION:IsCompleted() - return self:Is( "Completed" ) +function MISSION:IsCOMPLETED() + return self:Is( "COMPLETED" ) end ---- Is the @{Mission} **Idle**. +--- Is the @{Mission} **IDLE**. -- @param #MISSION self -- @return #boolean -function MISSION:IsIdle() - return self:Is( "Idle" ) +function MISSION:IsIDLE() + return self:Is( "IDLE" ) end ---- Is the @{Mission} **Ongoing**. +--- Is the @{Mission} **ENGAGED**. -- @param #MISSION self -- @return #boolean -function MISSION:IsOngoing() - return self:Is( "Ongoing" ) +function MISSION:IsENGAGED() + return self:Is( "ENGAGED" ) end ---- Is the @{Mission} **Failed**. +--- Is the @{Mission} **FAILED**. -- @param #MISSION self -- @return #boolean -function MISSION:IsFailed() - return self:Is( "Failed" ) +function MISSION:IsFAILED() + return self:Is( "FAILED" ) end ---- Is the @{Mission} **Hold**. +--- Is the @{Mission} **HOLD**. -- @param #MISSION self -- @return #boolean -function MISSION:IsHold() - return self:Is( "Hold" ) +function MISSION:IsHOLD() + return self:Is( "HOLD" ) end --- Validates if the Mission has a Group @@ -548,7 +548,7 @@ function MISSION:GetTasksRemaining() local TasksRemaining = 0 for TaskID, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK - if Task:IsStateSuccess() or Task:IsStateFailed() then + if Task:IsStateSuccess() or Task:IsStateFAILED() then else TasksRemaining = TasksRemaining + 1 end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index e9519290e..dea1b7ee0 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -558,7 +558,7 @@ function TASK:SetMenu( MenuTime ) --R2.1 Mission Reports and Task Reports added. TaskGroup.MenuReports = MENU_GROUP:New( TaskGroup, "Reports", MissionMenu ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Tasks", TaskGroup.MenuReports, Mission.MenuReportSummary, Mission, TaskGroup ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Planned Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Planned" ) - MENU_GROUP_COMMAND:New( TaskGroup, "Report Ongoing Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Ongoing" ) + MENU_GROUP_COMMAND:New( TaskGroup, "Report Assigned Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Assigned" ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Successful Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Success" ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Failed Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Failed" ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Held Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Hold" ) @@ -796,7 +796,9 @@ function TASK:RemoveStateMachine( TaskUnit ) self:E( self.Fsm ) for TaskUnitT, Fsm in pairs( self.Fsm ) do + local Fsm = Fsm -- Core.Fsm#FSM_PROCESS self:E( TaskUnitT ) + Fsm:Remove() end self.Fsm[TaskUnit] = nil diff --git a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua index db260cfb0..91b49f7e1 100644 --- a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua @@ -208,82 +208,91 @@ do -- TASK_A2G_DISPATCHER local ChangeMsg = {} local Mission = self.Mission - - --- First we need to the detected targets. - for DetectedItemID, DetectedItem in pairs( Detection:GetDetectedItems() ) do - local DetectedItem = DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem - local DetectedSet = DetectedItem.Set -- Functional.Detection#DETECTION_BASE.DetectedSet - local DetectedZone = DetectedItem.Zone - self:E( { "Targets in DetectedItem", DetectedItem.ItemID, DetectedSet:Count(), tostring( DetectedItem ) } ) - DetectedSet:Flush() - - local ItemID = DetectedItem.ID - - -- Evaluate SEAD Tasking - local SEADTask = Mission:GetTask( string.format( "SEAD.%03d", ItemID ) ) - SEADTask = self:EvaluateRemoveTask( Mission, SEADTask, DetectedItem ) - if not SEADTask then - local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... - if TargetSetUnit then - local Task = TASK_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", ItemID ), TargetSetUnit ) - Task:SetTargetZone( DetectedZone ) - Task:SetDispatcher( self ) - Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) - Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) - SEADTask = Mission:AddTask( Task ) - end - end - - -- Evaluate CAS Tasking - local CASTask = Mission:GetTask( string.format( "CAS.%03d", ItemID ) ) - CASTask = self:EvaluateRemoveTask( Mission, CASTask, DetectedItem ) - if not CASTask then - local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... - if TargetSetUnit then - local Task = TASK_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", ItemID ), TargetSetUnit ) - Task:SetTargetZone( DetectedZone ) - Task:SetDispatcher( self ) - Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) - Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) - CASTask = Mission:AddTask( Task ) - end - end - - -- Evaluate BAI Tasking - local BAITask = Mission:GetTask( string.format( "BAI.%03d", ItemID ) ) - BAITask = self:EvaluateRemoveTask( Mission, BAITask, DetectedItem ) - if not BAITask then - local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be SEADed... - if TargetSetUnit then - local Task = TASK_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", ItemID ), TargetSetUnit ) - Task:SetTargetZone( DetectedZone ) - Task:SetDispatcher( self ) - Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) - Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) - BAITask = Mission:AddTask( Task ) - end - end - - -- OK, so the tasking has been done, now delete the changes reported for the area. - Detection:AcceptChanges( DetectedItem ) - - end + if Mission:IsIDLE() or Mission:IsENGAGED() then - -- TODO set menus using the HQ coordinator - Mission:GetCommandCenter():SetMenu() - - for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do - Mission:GetCommandCenter():MessageToGroup( string.format( "There are %d tasks remaining for mission *%s*. Subscribe to a task using the menu.", Mission:GetTasksRemaining(), Mission:GetName() ), TaskGroup ) - if not TaskGroup:GetState( TaskGroup, "Assigned" ) then --- Mission:GetCommandCenter():MessageToGroup( --- string.format( "HQ Reporting - Planned tasks for mission '%s':\n\n%s\n", --- self.Mission:GetName(), --- string.format( "%s\n\n%s\n\n%s\n\n%s", ReportSEAD:Text(), ReportCAS:Text(), ReportBAI:Text(), ReportChanges:Text() --- ) --- ), TaskGroup --- ) + local TaskReport = REPORT:New() + + --- First we need to the detected targets. + for DetectedItemID, DetectedItem in pairs( Detection:GetDetectedItems() ) do + + local DetectedItem = DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set -- Functional.Detection#DETECTION_BASE.DetectedSet + local DetectedZone = DetectedItem.Zone + self:E( { "Targets in DetectedItem", DetectedItem.ItemID, DetectedSet:Count(), tostring( DetectedItem ) } ) + DetectedSet:Flush() + + local ItemID = DetectedItem.ID + + -- Evaluate SEAD Tasking + local SEADTask = Mission:GetTask( string.format( "SEAD.%03d", ItemID ) ) + SEADTask = self:EvaluateRemoveTask( Mission, SEADTask, DetectedItem ) + if not SEADTask then + local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) + Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) + SEADTask = Mission:AddTask( Task ) + TaskReport:Add( Task:GetName() ) + end + end + + -- Evaluate CAS Tasking + local CASTask = Mission:GetTask( string.format( "CAS.%03d", ItemID ) ) + CASTask = self:EvaluateRemoveTask( Mission, CASTask, DetectedItem ) + if not CASTask then + local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) + Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) + CASTask = Mission:AddTask( Task ) + TaskReport:Add( Task:GetName() ) + end + end + + -- Evaluate BAI Tasking + local BAITask = Mission:GetTask( string.format( "BAI.%03d", ItemID ) ) + BAITask = self:EvaluateRemoveTask( Mission, BAITask, DetectedItem ) + if not BAITask then + local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be SEADed... + if TargetSetUnit then + local Task = TASK_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", ItemID ), TargetSetUnit ) + Task:SetTargetZone( DetectedZone ) + Task:SetDispatcher( self ) + Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) + Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) + BAITask = Mission:AddTask( Task ) + TaskReport:Add( Task:GetName() ) + end + end + + -- OK, so the tasking has been done, now delete the changes reported for the area. + Detection:AcceptChanges( DetectedItem ) + end + + -- TODO set menus using the HQ coordinator + Mission:GetCommandCenter():SetMenu() + + for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do + Mission:GetCommandCenter():MessageToGroup( string.format( "New task(s) %s for mission *%s*. Subscribe to a task using the Mission *Overlord* radio menu.", TaskReport:Text(", "), Mission:GetName() ), TaskGroup ) + if not TaskGroup:GetState( TaskGroup, "Assigned" ) then + -- Mission:GetCommandCenter():MessageToGroup( + -- string.format( "HQ Reporting - Planned tasks for mission '%s':\n\n%s\n", + -- self.Mission:GetName(), + -- string.format( "%s\n\n%s\n\n%s\n\n%s", ReportSEAD:Text(), ReportCAS:Text(), ReportBAI:Text(), ReportChanges:Text() + -- ) + -- ), TaskGroup + -- ) + end + end + end return true diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 3964388f1..02bbd7722 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -156,7 +156,6 @@ end -- @param #GROUP self -- @return Dcs.DCSWrapper.Group#Group The DCS Group. function GROUP:GetDCSObject() - self:F(self.GroupName) local DCSGroup = Group.getByName( self.GroupName ) if DCSGroup then diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index bd6df9c23..c384faa86 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: 20170424_1257' ) +env.info( 'Moose Generation Timestamp: 20170426_1017' ) local base = _G