using Aitex.Core.UI.MVVM; using MECF.Framework.Simulator.Core.Commons; using MECF.Framework.Simulator.Core.Driver; using MECF.Framework.Simulator.Core.LoadPorts; using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace MECF.Framework.Simulator.Core.VCE.SiasunVCE { /// /// SimSiasunVCEView.xaml 的交互逻辑 /// public partial class SimSiasunVCEView : UserControl { public static readonly DependencyProperty PortProperty = DependencyProperty.Register( "Port", typeof(string), typeof(SimSiasunVCEView), new FrameworkPropertyMetadata("COM5", FrameworkPropertyMetadataOptions.AffectsRender)); public string Port { get { return (string)this.GetValue(PortProperty); } set { this.SetValue(PortProperty, value); } } public SimSiasunVCEView() { InitializeComponent(); this.Loaded += OnViewLoaded; } private void OnViewLoaded(object sender, RoutedEventArgs e) { if (DesignerProperties.GetIsInDesignMode(this)) return; if (DataContext == null) { DataContext = new SimSiasunVCEViewModel(Port); (DataContext as TimerViewModelBase).Start(); } } } class SimSiasunVCEViewModel : SerialPortDeviceViewModel { public string Title { get { return "Siasun VCE Simulator"; } } public string WaferMap { get { return _sim.SlotMap; } } public bool IsPresent { get { return _sim.IsPresent; } set { _sim.IsPresent = value; } } public bool IsProtrude { get { return _sim.IsProtrude; } set { _sim.IsProtrude = value; } } public bool IsCross { get { return _sim.IsCross; } set { _sim.IsCross = value; } } public ObservableCollection WaferList { get; set; } public ICommand PlaceCommand { get; set; } public ICommand RemoveCommand { get; set; } public ICommand ClearCommand { get; set; } public ICommand SetAllCommand { get; set; } public ICommand RandomCommand { get; set; } private SimSiasunVCE _sim; public SimSiasunVCEViewModel(string port) : base("SimSiasunVCEViewModel") { PlaceCommand = new DelegateCommand(Place); RemoveCommand = new DelegateCommand(Remove); ClearCommand = new DelegateCommand(Clear); SetAllCommand = new DelegateCommand(SetAll); RandomCommand = new DelegateCommand(RandomGenerateWafer); _sim = new SimSiasunVCE(port); Init(_sim); WaferList = new ObservableCollection() { new WaferItem {Display = "1", Index = 2, State = 3} }; } private void RandomGenerateWafer(string obj) { _sim.RandomWafer(); } private void SetAll(string obj) { _sim.SetAllWafer(); } private void Clear(string obj) { _sim.ClearWafer(); } private void Remove(string obj) { _sim.RemoveCarrier(); } private void Place(string obj) { _sim.PlaceCarrier(); } } public class SimSiasunVCE : SerialPortDeviceSimulator { public string SlotMap { get { return string.Join("", _slotMap); } } private bool _isPresent; public bool IsPresent { get { return _isPresent; } set { _isPresent = value; } } public bool IsProtrude { get; set; } public bool IsCross { get; set; } private string[] _slotMap = new string[25]; private bool _doorOpen = false; private string _zAxisPosition = "L"; public SimSiasunVCE(string port) : base(port, -1, "\r", '\r', true) { IsPresent = true; SetAllWafer(); } public void RandomWafer() { Random _rd = new Random(); for (int i = 0; i < _slotMap.Length; i++) { var rtn = _rd.Next(0, 10) % 3; switch (rtn) { case 0: _slotMap[i] = "O"; break; case 1: _slotMap[i] = "S"; break; case 2: _slotMap[i] = IsCross ? "C": "S"; break; default: break; } } } internal void SetAllWafer() { for (int i = 0; i < _slotMap.Length; i++) { _slotMap[i] = "S"; } } internal void ClearWafer() { for (int i = 0; i < _slotMap.Length; i++) { _slotMap[i] = "O"; } } internal void RemoveCarrier() { IsPresent = false; } internal void PlaceCarrier() { IsPresent = true; } protected override void ProcessUnsplitMessage(string message) { //Command: Q // Response: XXXXXXX_aaaa_bbbbb_cccc_ddddd < cr > string content = message.Remove(message.Length - 1); var contentArray = content.Split(','); if (message.StartsWith("A,LP")) // move to load position { _zAxisPosition = "L"; } if (message.StartsWith("A,MP")) // MapCassette { _zAxisPosition = "M"; } if (message.StartsWith("A,HM,ALL")) // HomeAll { _zAxisPosition = "H"; } if (message.StartsWith("A,") || message.StartsWith("S,") || message.StartsWith("P,")) { if (message.StartsWith("A,DC")) { } if (contentArray[1] == "GO") { _zAxisPosition = contentArray[2]; } OnWriteMessage("M,OK\r"); } else if (message.StartsWith("R,")) { if (message.StartsWith("R,W2")) { if (IsPresent) { OnWriteMessage("X,W2Y\r"); } else { OnWriteMessage("X,W2N\r"); } return; } if (message.StartsWith("R,MI")) { if (IsPresent) { var slot = string.Join("", _slotMap); OnWriteMessage($"X,MI{slot}?????\r"); } else { OnWriteMessage($"X,MIOOOOOOOOOOOOOOOOOOOOOOOOO?????\r"); } return; } if (message.StartsWith("R,STAT,ARM")) { OnWriteMessage($"X,STAT{_zAxisPosition}\r"); return; } if (message.StartsWith("R,STAT,DOOR")) { var open = _doorOpen ? "O":"C"; OnWriteMessage($"X,DOOR{open}\r"); return; } if (message.StartsWith("R,SO")) { var slideout = IsProtrude ? "Y" : "N"; OnWriteMessage($"X,SO{slideout}\r"); return; } OnWriteMessage("X,OK\r"); } else { OnWriteMessage("M,OK\r"); } } } }