mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Got tasking working again now, with the NEW API set!!!
This is really, really great! Now document all, and optimize the code. And start video making. And re-test the test mission, all... And PUBLISH!!!
This commit is contained in:
@@ -41,6 +41,7 @@ function STATEMACHINE:New( options )
|
||||
--self.__index = self
|
||||
|
||||
self.options = options
|
||||
self.options.subs = self.options.subs or {}
|
||||
self.current = options.initial or 'none'
|
||||
self.events = {}
|
||||
self.subs = {}
|
||||
@@ -96,6 +97,8 @@ function STATEMACHINE:AddProcess( From, Event, Process, ReturnEvents )
|
||||
sub.fsm = Process
|
||||
sub.event = "Start"
|
||||
sub.ReturnEvents = ReturnEvents
|
||||
|
||||
self.options.subs[Event] = sub
|
||||
|
||||
self:_submap( self.subs, sub, nil )
|
||||
|
||||
@@ -145,26 +148,27 @@ end
|
||||
|
||||
|
||||
function STATEMACHINE:_call_handler(handler, params)
|
||||
if handler then
|
||||
return handler( self, unpack(params) )
|
||||
if self[handler] then
|
||||
self:E( "Calling " .. handler )
|
||||
return self[handler]( self, unpack(params) )
|
||||
end
|
||||
end
|
||||
|
||||
function STATEMACHINE._handler( self, EventName, ... )
|
||||
|
||||
self:F( { EventName, ... } )
|
||||
self:E( { EventName, ... } )
|
||||
|
||||
local can, to = self:can(EventName)
|
||||
self:T( { EventName, can, to } )
|
||||
local can, to = self:can( EventName )
|
||||
self:E( { EventName, can, to } )
|
||||
|
||||
local ReturnValues = nil
|
||||
|
||||
if can then
|
||||
local from = self.current
|
||||
local params = { ..., EventName, from, to }
|
||||
local params = { EventName, from, to, ... }
|
||||
|
||||
if self:_call_handler(self["onbefore" .. EventName], params) == false
|
||||
or self:_call_handler(self["onleave" .. from], params) == false then
|
||||
if self:_call_handler("onbefore" .. EventName, params) == false
|
||||
or self:_call_handler("onleave" .. from, params) == false then
|
||||
return false
|
||||
end
|
||||
|
||||
@@ -188,28 +192,28 @@ function STATEMACHINE._handler( self, EventName, ... )
|
||||
local fsmparent, event = self:_isendstate( to )
|
||||
if fsmparent and event then
|
||||
self:F2( { "end state: ", fsmparent, event } )
|
||||
self:_call_handler(self["onenter" .. to] or self["on" .. to], params)
|
||||
self:_call_handler(self["onafter" .. EventName] or self["on" .. EventName], params)
|
||||
self:_call_handler(self["onstatechange"], params)
|
||||
self:_call_handler("onenter" .. to, params)
|
||||
self:_call_handler("onafter" .. EventName, params)
|
||||
self:_call_handler("onstatechange", params)
|
||||
fsmparent[event]( fsmparent )
|
||||
execute = false
|
||||
end
|
||||
|
||||
if execute then
|
||||
self:T3( { onenter = "onenter" .. to, callback = self["onenter" .. to] } )
|
||||
self:_call_handler(self["onenter" .. to] or self["on" .. to], params)
|
||||
self:_call_handler("onenter" .. to, params)
|
||||
|
||||
self:T3( { On = "OnBefore" .. to, callback = self["OnBefore" .. to] } )
|
||||
if ( self:_call_handler(self["OnBefore" .. to], params ) ~= false ) then
|
||||
if ( self:_call_handler("OnBefore" .. to, params ) ~= false ) then
|
||||
|
||||
self:T3( { onafter = "onafter" .. EventName, callback = self["onafter" .. EventName] } )
|
||||
self:_call_handler(self["onafter" .. EventName] or self["on" .. EventName], params)
|
||||
self:_call_handler("onafter" .. EventName, params)
|
||||
|
||||
self:T3( { On = "OnAfter" .. to, callback = self["OnAfter" .. to] } )
|
||||
ReturnValues = self:_call_handler(self["OnAfter" .. to], params )
|
||||
ReturnValues = self:_call_handler("OnAfter" .. to, params )
|
||||
end
|
||||
|
||||
self:_call_handler(self["onstatechange"], params)
|
||||
self:_call_handler("onstatechange", params)
|
||||
end
|
||||
|
||||
return ReturnValues
|
||||
@@ -233,8 +237,8 @@ end
|
||||
|
||||
function STATEMACHINE:_gosub( ParentFrom, ParentEvent )
|
||||
local fsmtable = {}
|
||||
self:E( { ParentFrom, ParentEvent, self.subs[ParentFrom] } )
|
||||
if self.subs[ParentFrom] and self.subs[ParentFrom][ParentEvent] then
|
||||
self:E( { ParentFrom, ParentEvent, self.subs[ParentFrom] } )
|
||||
return self.subs[ParentFrom][ParentEvent]
|
||||
else
|
||||
return {}
|
||||
@@ -308,40 +312,6 @@ function STATEMACHINE:todot(filename)
|
||||
end
|
||||
|
||||
|
||||
--- STATEMACHINE_TASK class
|
||||
-- @type STATEMACHINE_TASK
|
||||
-- @field Task#TASK_BASE Task
|
||||
-- @extends StateMachine#STATEMACHINE
|
||||
STATEMACHINE_TASK = {
|
||||
ClassName = "STATEMACHINE_TASK",
|
||||
}
|
||||
|
||||
--- Creates a new STATEMACHINE_TASK object.
|
||||
-- @param #STATEMACHINE_TASK self
|
||||
-- @param #table FSMT
|
||||
-- @param Task#TASK_BASE Task
|
||||
-- @param Unit#UNIT TaskUnit
|
||||
-- @return #STATEMACHINE_TASK
|
||||
function STATEMACHINE_TASK:New( FSMT, Task, TaskUnit )
|
||||
|
||||
local self = BASE:Inherit( self, STATEMACHINE:New( FSMT ) ) -- StateMachine#STATEMACHINE_PROCESS
|
||||
|
||||
self["onstatechange"] = Task.OnStateChange
|
||||
self["onAssigned"] = Task.OnAssigned
|
||||
self["onSuccess"] = Task.OnSuccess
|
||||
self["onFailed"] = Task.OnFailed
|
||||
|
||||
self.Task = Task
|
||||
self.TaskUnit = TaskUnit
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function STATEMACHINE_TASK:_call_handler( handler, params )
|
||||
if handler then
|
||||
return handler( self.Task, self.TaskUnit, unpack( params ) )
|
||||
end
|
||||
end
|
||||
|
||||
--- STATEMACHINE_CONTROLLABLE class
|
||||
-- @type STATEMACHINE_CONTROLLABLE
|
||||
@@ -385,14 +355,16 @@ function STATEMACHINE_CONTROLLABLE:GetControllable()
|
||||
end
|
||||
|
||||
function STATEMACHINE_CONTROLLABLE:_call_handler( handler, params )
|
||||
if handler then
|
||||
return handler( self, self.Controllable, unpack( params ) )
|
||||
if self[handler] then
|
||||
self:E( "Calling " .. handler )
|
||||
return self[handler]( self, self.Controllable, unpack( params ) )
|
||||
end
|
||||
end
|
||||
|
||||
--- STATEMACHINE_PROCESS class
|
||||
-- @type STATEMACHINE_PROCESS
|
||||
-- @field Process#PROCESS Process
|
||||
-- @field Tasking.Task#TASK_BASE Task
|
||||
-- @extends Core.StateMachine#STATEMACHINE_CONTROLLABLE
|
||||
STATEMACHINE_PROCESS = {
|
||||
ClassName = "STATEMACHINE_PROCESS",
|
||||
@@ -408,6 +380,92 @@ function STATEMACHINE_PROCESS:New( FSMT )
|
||||
return self
|
||||
end
|
||||
|
||||
--- Sets the task of the process.
|
||||
-- @param #PROCESS self
|
||||
-- @param Tasking.Task#TASK_BASE Task
|
||||
-- @return #PROCESS
|
||||
function STATEMACHINE_PROCESS:SetTask( Task )
|
||||
|
||||
self.Task = Task
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Gets the task of the process.
|
||||
-- @param #PROCESS self
|
||||
-- @return Task#TASK_BASE
|
||||
function STATEMACHINE_PROCESS:GetTask()
|
||||
|
||||
return self.Task
|
||||
end
|
||||
|
||||
--- Gets the mission of the process.
|
||||
-- @param #PROCESS self
|
||||
-- @return Mission#MISSION
|
||||
function STATEMACHINE_PROCESS:GetMission()
|
||||
|
||||
return self.Task.Mission
|
||||
end
|
||||
|
||||
|
||||
--- Assign the process to a @{Unit} and activate the process.
|
||||
-- @param #PROCESS self
|
||||
-- @param Task.Tasking#TASK_BASE Task
|
||||
-- @param Wrapper.Unit#UNIT ProcessUnit
|
||||
-- @return #PROCESS self
|
||||
function STATEMACHINE_PROCESS:Assign( Task, ProcessUnit )
|
||||
self:E( { Task, ProcessUnit } )
|
||||
|
||||
self:SetControllable( ProcessUnit )
|
||||
self:SetTask( Task )
|
||||
|
||||
self.ProcessGroup = ProcessUnit:GetGroup()
|
||||
|
||||
--self:Activate()
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function STATEMACHINE_PROCESS:onenterAssigned( ProcessUnit )
|
||||
|
||||
self.Task:Assign()
|
||||
end
|
||||
|
||||
function STATEMACHINE_PROCESS:onenterSuccess( ProcessUnit )
|
||||
|
||||
self.Task:Success()
|
||||
end
|
||||
|
||||
--- STATEMACHINE_TASK class
|
||||
-- @type STATEMACHINE_TASK
|
||||
-- @field Task#TASK_BASE Task
|
||||
-- @extends Core.StateMachine#STATEMACHINE
|
||||
STATEMACHINE_TASK = {
|
||||
ClassName = "STATEMACHINE_TASK",
|
||||
}
|
||||
|
||||
--- Creates a new STATEMACHINE_TASK object.
|
||||
-- @param #STATEMACHINE_TASK self
|
||||
-- @param #table FSMT
|
||||
-- @param Task#TASK_BASE Task
|
||||
-- @param Unit#UNIT TaskUnit
|
||||
-- @return #STATEMACHINE_TASK
|
||||
function STATEMACHINE_TASK:New( FSMT )
|
||||
|
||||
local self = BASE:Inherit( self, STATEMACHINE_CONTROLLABLE:New( FSMT ) ) -- Core.StateMachine#STATEMACHINE_TASK
|
||||
|
||||
self["onstatechange"] = self.OnStateChange
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function STATEMACHINE_TASK:_call_handler( handler, params )
|
||||
if self[handler] then
|
||||
self:E( "Calling " .. handler )
|
||||
return self[handler]( self, unpack( params ) )
|
||||
end
|
||||
end
|
||||
|
||||
do -- STATEMACHINE_SET
|
||||
|
||||
--- STATEMACHINE_SET class
|
||||
@@ -452,8 +510,9 @@ function STATEMACHINE_SET:Get()
|
||||
end
|
||||
|
||||
function STATEMACHINE_SET:_call_handler( handler, params )
|
||||
if handler then
|
||||
return handler( self, self.Set, unpack( params ) )
|
||||
if self[handler] then
|
||||
self:E( "Calling " .. handler )
|
||||
return self[handler]( self, self.Set, unpack( params ) )
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user