using MECF.Framework.Simulator.Core.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace Venus_Simulator.Devices
{
public class VceSimulator : SerialPortDeviceSimulator
{
private const string EOF = "\r";
private const char MSG_DELIMITER = ' ';
private const string VCE_Port = "COM161";
private Regex _action_rule = new Regex(@"\d\d,A,.*");
private Regex _read_rule = new Regex(@"\d\d,R,.*");
private Regex _set_rule = new Regex(@"\d\d,S,.*");
private Regex _curing_rule = new Regex(@"\d\d,P,.*");
private int currentSlot = 0;
private string mapresult = "XXXXXXXXXX,XXXXXXXXXX,XXXXX?????,??????????";
///
/// 用以模拟扫片结果
///
///
public void Wafermap(bool isempty)
{
if(isempty)
mapresult = "0000000000,0000000000,00000?????,??????????";
else
mapresult = "XXXXXXXXXX,XXXXXXXXXX,XXXXX?????,??????????";
}
public VceSimulator(string port) : base(port, -1, EOF, MSG_DELIMITER)
{
}
protected override void ProcessUnsplitMessage(string message)
{
if (string.IsNullOrEmpty(message))
throw new ArgumentException("Hardware command message is invalid");
if (message.Contains(EOF))
{
message = message.Trim();
}
if (_action_rule.IsMatch(message) || _set_rule.IsMatch(message) || _curing_rule.IsMatch(message))
{
OnWriteMessage("_RDY" + EOF);
Thread.Sleep(2000);
OnWriteMessage("_BKGRDY" + EOF);
if (message.Contains("00,A,GO"))
currentSlot = Convert.ToInt32(message.Split(',')[3]);
return;
}
if (_read_rule.IsMatch(message))
{
switch (message)
{
case "00,R,MI":
OnWriteMessage("00,X,MI,1,0,A,3,0,0,0,0,0,0" + EOF);
Thread.Sleep(2000);
OnWriteMessage("_RDY" + EOF);
return;
case "00,R,MI,S":
OnWriteMessage("00,X,MI,"+ mapresult + EOF);
//OnWriteMessage("00,X,MI,0000000000,0000000000,XXXXX?????,??????????" + EOF);
Thread.Sleep(2000);
OnWriteMessage("_RDY" + EOF);
return;
case "00,R,OS":
OnWriteMessage($"00,X,OS,BRR,SL{currentSlot.ToString().PadLeft(2,'0')},CPNN,WPYY,ERN" + EOF);
//OnWriteMessage("00,X,MI,0000000000,0000000000,XXXXX?????,??????????" + EOF);
Thread.Sleep(2000);
OnWriteMessage("_RDY" + EOF);
return;
default:
return;
}
}
//string[] strs = message.Split(MSG_DELIMITER);
//Thread.Sleep(2 * 1000);
}
}
}