using Aitex.Core.Util; using MECF.Framework.Simulator.Core.Driver; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http.Headers; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace Venus_Simulator.Devices { public class DETMSimulatorServer : SocketDeviceSimulator { private readonly Regex _check_load = new Regex(@"CHECK LOAD\s+(\d)+\s+(A|B)\s*"); private readonly Regex _move_arm = new Regex(@"(PLACE|PICK)\s+(\d+)\s+ARM\s+(A|B)\s+(\w{4})\s*"); private readonly Regex _move_wafer = new Regex(@"(PLACE|PICK)\s+(\d+)\s+ARM\s+(A|B)\s*"); private readonly Regex _rq_arm = new Regex(@"(RQ)\s+(LOAD)\s+(ARM)\s*"); private readonly Regex _rq_speed = new Regex(@"(RQ)\s+(MOTIONPARA)\s*"); private readonly Regex _set_speed = new Regex(@"(SET)\s+(MOTIONPARA)\s*"); private readonly Regex _store_speed = new Regex(@"(STORE)\s+(MOTIONPARA)\s*"); private PeriodicJob _HwThread; private string WithWaferSpeed = "0300"; private string NoWaferSpeed = "0300"; public DETMSimulatorServer() : base(1103, -1, "\n", ' ') { _HwThread = new PeriodicJob(500, OnSendEvent, "honghuRobot", true); } private bool OnSendEvent() { return true; } protected override void ProcessUnsplitMessage(string str) { if (str.Contains("HOME") || str.Contains("GOTO") || str.Contains("XFER") || str.Contains("HALT")) { OnWriteMessage("_RDY"); } if (_rq_speed.IsMatch(str)) { switch (str.Split(' ')[2]) { case "WITHWAFER": OnWriteMessage($"MOTIONPARA WITHWAFER SPDPCT ALL {WithWaferSpeed} 0100 0100"); OnWriteMessage("_RDY"); break; case "NOWAFER": OnWriteMessage($"MOTIONPARA NOWAFER SPDPCT ALL {NoWaferSpeed} 0100 0100"); OnWriteMessage("_RDY"); break; default: OnWriteMessage(str); OnWriteMessage($"_ERR 350"); break; } } if (_set_speed.IsMatch(str)) { switch (str.Split(' ')[2]) { case "WITHWAFER": WithWaferSpeed = str.Split(' ')[5]; OnWriteMessage(str); OnWriteMessage("_RDY"); break; case "NOWAFER": NoWaferSpeed = str.Split(' ')[5]; OnWriteMessage(str); OnWriteMessage("_RDY"); break; default: OnWriteMessage(str); OnWriteMessage($"_ERR 350"); break; } } if (_store_speed.IsMatch(str)) { OnWriteMessage(str); OnWriteMessage("_RDY"); } if (_rq_arm.IsMatch(str)) { //OnWriteMessage(string.Format($"LOAD {arm} OFF")); //OnWriteMessage(string.Format($"CHECK LOAD")); OnWriteMessage("_RDY"); } //if (str.Contains("RQ WAF_CEN DATA")) //{ // string t = new Random().Next(0, 359).ToString().PadLeft(6, '0'); // string r = new Random().Next(0, 50000).ToString().PadLeft(6, '0'); // OnWriteMessage($"WAF_CEN RT 000000 000000 000000 000000 LFT 000000 000000 000000 000000 OFFSET {r} {t}"); // OnWriteMessage("_RDY"); //} if (_check_load.IsMatch(str)) { Match result = _check_load.Match(str); string station = result.Groups[1].Value; string arm = result.Groups[2].Value; //OnWriteMessage(string.Format($"LOAD {arm} OFF")); //OnWriteMessage(string.Format($"CHECK LOAD")); OnWriteMessage("_RDY"); } else if (_move_arm.IsMatch(str)) { // @"(PLACE|PICK)\s+(\d+)\s+SLOT\s+(\d+)\s+ARM\s+(A|B)\s+(\w{4})\s+" Match result = _move_arm.Match(str); string operation = result.Groups[1].Value; string station = result.Groups[2].Value; string slot = result.Groups[3].Value; string arm = result.Groups[4].Value; string dir = result.Groups[5].Value; Thread.Sleep(6000); OnWriteMessage("_RDY"); } else if (_move_wafer.IsMatch(str)) { // @"(PLACE|PICK)\s+(\d+)\s+SLOT\s+(\d+)\s+ARM\s+(A|B)\s+" Match result = _move_wafer.Match(str); string operation = result.Groups[1].Value; string station = result.Groups[2].Value; string slot = result.Groups[3].Value; string arm = result.Groups[4].Value; Thread.Sleep(6000); OnWriteMessage("_RDY"); } } } }