using Aitex.Core.RT.Device;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.Utilities;
using CyberX8_Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Devices.Loader
{
public class LoaderSideCycleRoutine : RoutineBase, IRoutine
{
private enum LoaderSideCycleStep
{
LoopStart,
LoopUnload,
LoopUnloadWait,
LoopLoad,
LoopLoadWait,
LoopFlowTest,
LoopFlowTestWait,
LoopEnd,
End
}
#region 内部变量
///
/// 面
///
private string _side;
///
/// Load Routine
///
private LoaderLoadRoutine _loadRoutine;
///
/// Unload Routine
///
private LoaderUnloadRoutine _unloadRoutine;
///
/// Common device对象
///
private LoaderCommonDevice _commonDevice;
///
/// 总次数
///
private int _totalCycle;
#endregion
#region 属性
///
/// 当前次数
///
public int CurrentCycle { get { return Runner.LoopCounter+1; } }
#endregion
///
/// 构造函数
///
///
public LoaderSideCycleRoutine(string module,string side) : base(module)
{
_side = side;
}
///
/// 中止
///
public void Abort()
{
Runner.Stop("Manual Stop");
if (Runner.CurrentStep.ToString() ==LoaderSideCycleStep.LoopFlowTest.ToString()
|| Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopFlowTestWait.ToString())
{
_commonDevice.StopFlowTestAction();
}
else if (Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopLoad.ToString()
|| Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopLoadWait.ToString())
{
_loadRoutine.Abort();
}
else if (Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopUnload.ToString()
|| Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopUnloadWait.ToString())
{
_unloadRoutine.Abort();
}
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.LoopStart(LoaderSideCycleStep.LoopStart, "Loader Cycle", _totalCycle, NullFun, _delay_1ms)
.LoopRun(LoaderSideCycleStep.LoopUnload, StartUnload, _delay_1ms)
.LoopRunWithStopStatus(LoaderSideCycleStep.LoopUnloadWait, () => CommonFunction.CheckRoutineEndState(_unloadRoutine),
() => CommonFunction.CheckRoutineStopState(_unloadRoutine))
.LoopRun(LoaderSideCycleStep.LoopLoad, StartLoad, _delay_1ms)
.LoopRunWithStopStatus(LoaderSideCycleStep.LoopLoadWait, () => CommonFunction.CheckRoutineEndState(_loadRoutine),
() => CommonFunction.CheckRoutineStopState(_loadRoutine))
.LoopRun(LoaderSideCycleStep.LoopFlowTest, StartFlowTest, _delay_1ms)
.LoopRunWithStopStatus(LoaderSideCycleStep.LoopFlowTestWait, () => _commonDevice.Status == RState.End, () => _commonDevice.Status == RState.Failed)
.LoopEnd(LoaderSideCycleStep.LoopEnd, NullFun, _delay_1ms)
.End(LoaderSideCycleStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
///
/// 启动Unload
///
///
private bool StartUnload()
{
return _unloadRoutine.Start()==RState.Running;
}
///
/// 启动Load
///
///
private bool StartLoad()
{
return _loadRoutine.Start()==RState.Running;
}
///
/// 启动Flowtest
///
///
private bool StartFlowTest()
{
return _commonDevice.StartFlowTestAction();
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_commonDevice = DEVICE.GetDevice($"{Module}.Common");
_totalCycle = (int)objs[0];
_loadRoutine = new LoaderLoadRoutine(Module, _side);
_unloadRoutine= new LoaderUnloadRoutine(Module, _side);
Runner.Start(Module, "Start Cycle");
return RState.Running;
}
}
}