using Aitex.Core.RT.Log;
using Aitex.Core.Util;
using CyberX8_Core;
using CyberX8_RT.Devices.EFEM;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Modules.EFEM
{
public class EfemAutoMessageProcessor
{
#region 内部变量
///
/// EFEM对象
///
private EfemBase _efem;
///
/// 指令
///
private ConcurrentQueue _commands = new ConcurrentQueue();
#endregion
///
/// 构造函数
///
///
public EfemAutoMessageProcessor(EfemBase efem)
{
_efem = efem;
}
///
/// 发送指令
///
///
public void SendAutoCommandMessage(object[] parameters)
{
EfemEntity.MSG cmd = (EfemEntity.MSG)parameters[0];
ModuleName moduleName = (ModuleName)parameters[1];
if (!IsExistMsg(cmd,moduleName))
{
_commands.Enqueue(parameters);
LOG.WriteLog(eEvent.EV_EFEM_COMMON_INFO, ModuleName.EFEM.ToString(), $"{cmd} command enter queue");
}
}
///
/// 是否存在队列
///
///
///
private bool IsExistMsg(EfemEntity.MSG msg,ModuleName moduleName)
{
List queues = _commands.ToList();
foreach (var item in queues)
{
EfemEntity.MSG itemMsg = (EfemEntity.MSG)item[0];
ModuleName itemModule = (ModuleName)item[1];
if (itemMsg == msg&&itemModule==moduleName)
{
return true;
}
}
return false;
}
///
/// 监控
///
public void Monitor()
{
if (Singleton.Instance.EFEM.RobotStatus != RState.Running)
{
if (Singleton.Instance.EFEM.RobotStatus==RState.End)
{
if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0))
{
return;
}
if (_commands.Count > 0 && _commands.TryDequeue(out object[] args))
{
EfemEntity.MSG cmd = (EfemEntity.MSG)args[0];
LOG.WriteLog(eEvent.EV_EFEM_ROBOT, ModuleName.EfemRobot.ToString(), $"execute {cmd}");
ProcessBackroundCommand(cmd, args);
}
}
}
}
///
/// 处理指令
///
///
///
private void ProcessBackroundCommand(EfemEntity.MSG cmd, object[] args)
{
switch (cmd)
{
case EfemEntity.MSG.Load:
_efem.Load((ModuleName)args[1]);
break;
case EfemEntity.MSG.Unload:
_efem.Unload((ModuleName)args[1]);
break;
case EfemEntity.MSG.Dock:
_efem.Dock((ModuleName)args[1]);
break;
case EfemEntity.MSG.Undock:
_efem.Undock((ModuleName)args[1]);
break;
case EfemEntity.MSG.Clamp:
_efem.Clamp((ModuleName)args[1], (bool)args[2]);
break;
case EfemEntity.MSG.Unclamp:
_efem.Unclamp((ModuleName)args[1]);
break;
case EfemEntity.MSG.GotoMap:
_efem.GotoMap((ModuleName)args[1], Aitex.Sorter.Common.Hand.Blade1, args[2].ToString());
break;
case EfemEntity.MSG.Map:
_efem.Map((ModuleName)args[1]);
break;
case EfemEntity.MSG.ReadCarrierId:
_efem.ReadCarrierId((ModuleName)args[1]);
break;
case EfemEntity.MSG.WriteCarrierID:
_efem.WriteCarrierId((ModuleName)args[1], (string)args[2]);
break;
case EfemEntity.MSG.ReadTagData:
_efem.ReadCarrierId((ModuleName)args[1]);
break;
case EfemEntity.MSG.WriteTagData:
_efem.WriteCarrierId((ModuleName)args[1], (string)args[2]);
break;
default:
LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, $"unprocessed Efem command {cmd}");
break;
}
}
}
}