using Aitex.Common.Util;
using Aitex.Core.Common;
using Aitex.Core.RT.Log;
using Aitex.Core.Util;
using CyberX8_Core;
using CyberX8_RT.Modules;
using CyberX8_RT.Modules.Dryer;
using CyberX8_RT.Modules.Loader;
using CyberX8_RT.Modules.Metal;
using CyberX8_RT.Modules.Prewet;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.RecipeCenter;
using MECF.Framework.Common.WaferHolder;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Schedulers.Metal
{
public class SchedulerMetal : SchedulerModule
{
#region 内部变量
///
/// Metal Entity
///
private MetalEntity _metalEntity;
///
/// 是否开始Run Recipe
///
private bool _isStartRunRecipe = false;
#endregion
#region 属性
///
/// 是否空闲
///
public override bool IsIdle
{
get { return _state == RState.End; }
}
///
/// 是否错误
///
public override bool IsError
{
get { return _state == RState.Failed || _state == RState.Timeout; }
}
#endregion
///
/// 构造函数
///
///
public SchedulerMetal(ModuleName moduleName) : base(moduleName.ToString())
{
_metalEntity = Singleton.Instance.GetModule(moduleName.ToString());
}
///
/// 执行
///
///
///
public override bool RunProcess(object recipe, object parameter, List syncModuleMessages)
{
if (!(recipe is DepRecipe))
{
_state = RState.Failed;
LOG.WriteLog(eEvent.ERR_DRYER, Module.ToString(), "recipe is invalid");
return false;
}
DepRecipe depRecipe = (DepRecipe)recipe;
WaferHolderInfo waferHolderInfo = _metalEntity.WaferHolderInfo;
if (waferHolderInfo == null)
{
return false;
}
string side = "";
if (waferHolderInfo.WaferAType == (int)WaferType.Production && waferHolderInfo.WaferBType == (int)WaferType.Assit)
{
side = "SideA";
}
else if (waferHolderInfo.WaferBType == (int)WaferType.Production && waferHolderInfo.WaferAType == (int)WaferType.Assit)
{
side = "SideB";
}
_isStartRunRecipe = false;
bool result = _metalEntity.CheckToPostMessage(eEvent.ERR_METAL, Module.ToString(),
(int)MetalMsg.RunRecipe, depRecipe,side, 1);
if (result)
{
_state = RState.Running;
}
return result;
}
///
/// 监控执行
///
///
public override bool MonitorProcess(SchedulerSequence schedulerSequence, bool hasMatchWafer)
{
if (!_isStartRunRecipe)
{
_isStartRunRecipe = _metalEntity.State == (int)MetalState.RunReciping;
}
if (_metalEntity.IsError)
{
_state = RState.Failed;
_isStartRunRecipe = false;
return true;
}
if (_isStartRunRecipe)
{
if (_metalEntity.IsIdle)
{
_state = RState.End;
_isStartRunRecipe = false;
}
}
return true;
}
///
/// 检验前置条件
///
///
///
///
public override bool CheckPrecondition(List schedulerSequences, int sequenceIndex, object parameter, string materialId, ref string reason)
{
if (_state == RState.Running)
{
reason = "scheduler module is already running";
return false;
}
if (_metalEntity.WaferHolderInfo==null)
{
reason = $"{_metalEntity.Module} has no wafer shuttle";
return false;
}
if (_metalEntity.WaferHolderInfo.Id != materialId)
{
reason = $"{_metalEntity.Module} wafer shuttle {_metalEntity.WaferHolderInfo.Id} is not matched with {materialId}";
return false;
}
if (_metalEntity.IsIdle || _metalEntity.State == (int)MetalState.WaitForRunRecipe)
{
return true;
}
else
{
reason = $"{_metalEntity.Module} is not idle or WaitForRunRecipe";
return false;
}
}
}
}