using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Routine;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS.CANOpen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Devices.Loader
{
public class LoaderSideUnloadVacuumLevelCheckRoutine : RoutineBase, IRoutine
{
private enum UnloadVacuumLevelStep
{
VecuumLevel,
VecuumLevelCheck,
ConditionWHBladder,
ConditionWHBladderCheck,
ConditionVacuumLevel,
ConditionVacuumLevelCheck,
End
}
#region 内部变量
private bool _continue = false;
private bool _vacuumLevelCheckFailed = false;
private LoaderSideVacuumLevelCheckRoutine _vacuumLevelCheckRoutine;
private LoaderSideWhBladderRoutine _whBladderRoutine;
#endregion
///
/// 构造函数
///
///
public LoaderSideUnloadVacuumLevelCheckRoutine(string module) : base(module)
{
}
///
/// 中止
///
public void Abort()
{
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(UnloadVacuumLevelStep.VecuumLevel, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, NullFun, _delay_1ms)
.WaitWithStopCondition(UnloadVacuumLevelStep.VecuumLevelCheck, FirstVacuumLevelCheck, () => { return _vacuumLevelCheckFailed; })
.Run(UnloadVacuumLevelStep.ConditionWHBladder,ConditionWHBladder,_delay_1ms)
.WaitWithStopCondition(UnloadVacuumLevelStep.ConditionWHBladderCheck,ConditionWHBladderEndStatus,ConditionWHBladderStopStatus)
.Run(UnloadVacuumLevelStep.ConditionVacuumLevelCheck,ConditionVacuumLevel,_delay_1ms)
.WaitWithStopCondition(UnloadVacuumLevelStep.ConditionVacuumLevelCheck,ConditionVacuumLevelEndStatus,ConditionVacuumLevelStopStatus)
.End(UnloadVacuumLevelStep.End,NullFun,100);
return Runner.Status;
}
///
/// 首次VacuumLevel校验
///
///
private bool FirstVacuumLevelCheck()
{
RState state = _vacuumLevelCheckRoutine.Monitor();
if(state==RState.End)
{
return true;
}
else if(state==RState.Timeout)
{
_continue = true;
return true;
}
else if(state==RState.Failed)
{
_vacuumLevelCheckFailed = true;
return false;
}
else
{
return false;
}
}
///
/// 条件WHBladder
///
///
private bool ConditionWHBladder()
{
if(_continue)
{
return true;
}
else
{
return _whBladderRoutine.Start(true) == RState.Running;
}
}
///
/// 条件WHBladder检验
///
///
private bool ConditionWHBladderEndStatus()
{
if(_continue)
{
return true;
}
else
{
return _whBladderRoutine.Monitor() == RState.End;
}
}
///
/// 条件WHBladder停止检验
///
///
private bool ConditionWHBladderStopStatus()
{
if (_continue)
{
return true;
}
else
{
RState state = _whBladderRoutine.Monitor();
return state == RState.Failed || state == RState.Timeout;
}
}
///
/// 条件Vacuum Level
///
///
private bool ConditionVacuumLevel()
{
if (_continue)
{
return true;
}
else
{
return _vacuumLevelCheckRoutine.Start(true) == RState.Running;
}
}
///
/// 条件Vacuum Level
///
///
private bool ConditionVacuumLevelEndStatus()
{
if (_continue)
{
return true;
}
else
{
return _vacuumLevelCheckRoutine.Monitor() == RState.End;
}
}
///
/// 条件Vacuum Level
///
///
private bool ConditionVacuumLevelStopStatus()
{
if (_continue)
{
return true;
}
else
{
RState state = _vacuumLevelCheckRoutine.Monitor();
return state == RState.Failed || state == RState.Timeout;
}
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_vacuumLevelCheckRoutine = new LoaderSideVacuumLevelCheckRoutine(Module);
_whBladderRoutine = new LoaderSideWhBladderRoutine(Module);
Runner.Start(Module, "UnloadVacuumLevelCheck");
return RState.Running;
}
}
}