60 lines
1005 B
C#
60 lines
1005 B
C#
|
using System.Collections.Generic;
|
||
|
|
||
|
namespace Aitex.Core.RT.Routine
|
||
|
{
|
||
|
public class QueueRoutine
|
||
|
{
|
||
|
private Queue<IRoutine> _steps = new Queue<IRoutine>();
|
||
|
|
||
|
private IRoutine _currentStep = null;
|
||
|
|
||
|
public void Add(IRoutine step)
|
||
|
{
|
||
|
_steps.Enqueue(step);
|
||
|
}
|
||
|
|
||
|
public void Reset()
|
||
|
{
|
||
|
_steps.Clear();
|
||
|
_currentStep = null;
|
||
|
}
|
||
|
|
||
|
public void Abort()
|
||
|
{
|
||
|
if (_currentStep != null)
|
||
|
{
|
||
|
_currentStep.Abort();
|
||
|
}
|
||
|
Reset();
|
||
|
}
|
||
|
|
||
|
public Result Start(params object[] objs)
|
||
|
{
|
||
|
if (_steps.Count == 0)
|
||
|
{
|
||
|
return Result.DONE;
|
||
|
}
|
||
|
_currentStep = _steps.Dequeue();
|
||
|
return _currentStep.Start(objs);
|
||
|
}
|
||
|
|
||
|
public Result Monitor(params object[] objs)
|
||
|
{
|
||
|
Result result = Result.FAIL;
|
||
|
if (_currentStep != null)
|
||
|
{
|
||
|
result = _currentStep.Monitor();
|
||
|
}
|
||
|
if (result == Result.DONE)
|
||
|
{
|
||
|
_currentStep = ((_steps.Count > 0) ? _steps.Dequeue() : null);
|
||
|
if (_currentStep != null)
|
||
|
{
|
||
|
return _currentStep.Start(objs);
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
}
|
||
|
}
|