| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 | using MECF.Framework.Simulator.Core.Commons;using MECF.Framework.Simulator.Core.Driver;using System;using System.Collections;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Timers;namespace MECF.Framework.Simulator.Core.Commons{    public class SocketDeviceSimulatoFactory    {        public static CommonSocketDeviceSimulator GetCommonSocketDeviceSimulator(int port, string deviceName)        {            if (deviceName == "Hanbell")            {                return new HanbellPumpSocketSimulator(port, deviceName);            }            else if (deviceName == "SiasunPhoenixB")            {                return new SiasunPhoenixBSocketSimulator(port, deviceName);            }            else if (deviceName == "Siasun1500C800C")            {                return new Siasun1500C800CSocketSimulator(port, deviceName);            }            else if (deviceName == "HiwinRobot")            {                return new WinHinRobotSocketSimulator(port, deviceName);            }            return null;        }    }    public class CommonSocketDeviceSimulator : SimpleSocketDeviceSimulator    {        public bool Failed { get; set; }        public bool AutoReply { get; set; } = true;        public bool IsAtSpeed { get; set; }        Stopwatch _timer = new Stopwatch();        private System.Timers.Timer _tick;        private object _locker = new object();        public string ResultValue { get; set; }        public List<IOSimulatorItemViewModel> IOSimulatorItemList { get; set; }        public event Action<IOSimulatorItemViewModel> SimulatorItemActived;        string _deviceName;        public CommonSocketDeviceSimulator(int port, string deviceName, bool isAscii = true, string newLine = "\r")            : base(port, -1, newLine, ',', isAscii)        {            _deviceName = deviceName;            ResultValue = "";            _tick = new System.Timers.Timer();            _tick.Interval = 200;            _tick.Elapsed += _tick_Elapsed;            _tick.Start();            IsAtSpeed = true;        }        private void _tick_Elapsed(object sender, ElapsedEventArgs e)        {            lock (_locker)            {                if (_timer.IsRunning && _timer.Elapsed > TimeSpan.FromSeconds(10))                {                    _timer.Stop();                    IsAtSpeed = true;                }            }        }        protected override void ProcessUnsplitMessage(byte[] binaryMessage)        {            lock (_locker)            {                var activeSimulatorItem = GetActiveIOSimulatorItemViewModel(binaryMessage);                if (activeSimulatorItem == null) return;                activeSimulatorItem.CommandContent = string.Join(",", binaryMessage.Select(bt => bt.ToString("X2")).ToArray());                activeSimulatorItem.CommandRecievedTime = DateTime.Now;                if (SimulatorItemActived != null)                    SimulatorItemActived(activeSimulatorItem);                if (AutoReply)                {                    OnWriteSimulatorItem(activeSimulatorItem);                }            }        }        protected override void ProcessUnsplitMessage(string msg)        {            lock (_locker)            {                var activeSimulatorItem = GetActiveIOSimulatorItemViewModel(msg);                if (activeSimulatorItem == null) return;                activeSimulatorItem.CommandContent = msg;                activeSimulatorItem.CommandRecievedTime = DateTime.Now;                if (SimulatorItemActived != null)                    SimulatorItemActived(activeSimulatorItem);                if (AutoReply)                {                    OnWriteSimulatorItem(activeSimulatorItem);                }            }        }        protected virtual IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)        {            return null;        }        protected virtual IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(byte[] msg)        {            return null;        }        protected virtual void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)        {        }        public void ManualWriteMessage(IOSimulatorItemViewModel activeSimulatorItem)        {            OnWriteSimulatorItem(activeSimulatorItem);        }    }    public class SiasunPhoenixBSocketSimulator : CommonSocketDeviceSimulator    {        private bool _isWaferPresent = false;        private string _endline = "\r\n";        private readonly Dictionary<string, int> _timeConfigs = new Dictionary<string, int>();        public SiasunPhoenixBSocketSimulator(int port, string deviceName) : base(port, deviceName)        {            //try            //{            //    Hashtable timeSim = (Hashtable)ConfigurationManager.GetSection("VacRobotSim");            //    _timeConfigs.Add("PICK", int.Parse(timeSim["PICK"].ToString()) * 1000);            //    _timeConfigs.Add("PLACE", int.Parse(timeSim["PLACE"].ToString()) * 1000);            //    _timeConfigs.Add("GOTO", int.Parse(timeSim["GOTO"].ToString()) * 1000);            //    _timeConfigs.Add("RQLOAD", int.Parse(timeSim["RQLOAD"].ToString()) * 1000);            //    _timeConfigs.Add("CHECKLOAD", int.Parse(timeSim["CHECKLOAD"].ToString()) * 1000);            //    _timeConfigs.Add("HOME", int.Parse(timeSim["HOME"].ToString()) * 1000);            //}            //catch (ConfigurationErrorsException ex)            //{            //    throw ex;            //}        }        protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)        {            if (IOSimulatorItemList == null)                return null;            foreach (var simulatorItem in IOSimulatorItemList)            {                if (msg.Contains(simulatorItem.SourceCommandName))                {                    return simulatorItem;                }            }            return null;        }        protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeItem)        {            string cmdName = activeItem.SourceCommandName;            if (cmdName.StartsWith("RQ"))            {                if (cmdName.StartsWith("RQ LOAD"))                {                    //Thread.Sleep(_timeConfigs["RQLOAD"]);                    string response = $"{activeItem.Response} {(activeItem.CommandContent.Contains(" A") ? "A" : "B")} {(_isWaferPresent ? "ON" : "OFF")}";                    OnWriteMessage(response + _endline + "_RDY" + _endline);                }                else                {                    OnWriteMessage(activeItem.Response + _endline + "_RDY" + _endline);                }                //OnWriteMessage("_RDY" + _endline);                return;            }            else if (cmdName.StartsWith("CHECK LOAD"))            {                Thread.Sleep(1000);            }            else if (cmdName.StartsWith("HOME"))            {                Thread.Sleep(2000);            }            else if (cmdName.StartsWith("RESET"))            {                return;            }            else if (cmdName.StartsWith("PICK"))            {                Thread.Sleep(2000);            }            else if (cmdName.StartsWith("PLACE"))            {                Thread.Sleep(2000);            }            else if (cmdName.StartsWith("GOTO"))            {                Thread.Sleep(1500);            }            OnWriteMessage(activeItem.Response + _endline);        }    }    public class Siasun1500C800CSocketSimulator : CommonSocketDeviceSimulator    {        public Siasun1500C800CSocketSimulator(int port, string deviceName) : base(port, deviceName)        {        }        protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)        {            if (IOSimulatorItemList == null)                return null;            foreach (var simulatorItem in IOSimulatorItemList)            {                if (msg.Contains(simulatorItem.SourceCommandName))                {                    return simulatorItem;                }            }            return null;        }        protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)        {            if (activeSimulatorItem.SourceCommandName.StartsWith("RQ"))            {                OnWriteMessage(activeSimulatorItem.Response + "\r");                Thread.Sleep(1000);                OnWriteMessage("_RDY" + "\r");            }            else            {                OnWriteMessage(activeSimulatorItem.Response + "\r");            }        }    }    public class WinHinRobotSocketSimulator : CommonSocketDeviceSimulator    {        public WinHinRobotSocketSimulator(int port,string deviceName):base(port,deviceName)        {        }        protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)        {            if (IOSimulatorItemList == null)                return null;            foreach (var simulatorItem in IOSimulatorItemList)            {                if (msg.Contains(simulatorItem.SourceCommandName))                {                    return simulatorItem;                }            }            return null;        }        protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)        {            Thread.Sleep(200);            OnWriteMessage(activeSimulatorItem.Response + "\n\r");        }    }    internal class HanbellPumpSocketSimulator : CommonSocketDeviceSimulator    {        private List<byte> _msgBuffer = new List<byte>();        private bool _isPumpOn;        private List<byte> statusArray;        public HanbellPumpSocketSimulator(int port, string deviceName) : base(port, deviceName, false)        {            statusArray = Enumerable.Repeat((byte)0x0,90).ToList();        }        protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(byte[] msg)        {            if (IOSimulatorItemList == null)                return null;            _msgBuffer.AddRange(msg);            if (_msgBuffer.Count < 12)            {                return null;            }            foreach (var simulatorItem in IOSimulatorItemList)            {                if (msg[7] == byte.Parse(simulatorItem.SourceCommand))                {                    //action                    if (msg[7] == 5)                    {                        simulatorItem.Response = string.Join(",", msg.Take(12).Select(bt => bt.ToString("X2")).ToArray());                    }                    _msgBuffer.RemoveRange(0, 12);                    return simulatorItem;                }            }            return null;        }        protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)        {            var responseArray = activeSimulatorItem.Response.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray();            if(activeSimulatorItem.SourceCommandName == "OperatePump")            {                var response = activeSimulatorItem.Response.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray();                _isPumpOn = response[10] == 0xFF;                OnWriteMessage(response);            }            if (activeSimulatorItem.SourceCommandName == "RequestRegisters")            {                List<byte> buffer = new List<byte>();                buffer.AddRange(activeSimulatorItem.Response.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray());                statusArray[61] = (byte)(_isPumpOn ? 0xdc : 0x7f);                buffer.AddRange(statusArray);                OnWriteMessage(buffer.ToArray());            }        }    }}
 |