using Aitex.Core.Common; using Aitex.Core.UI.MVVM; using MECF.Framework.Common.CommonData.Metal; using MECF.Framework.Common.CommonData.PowerSupplier; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.OperationCenter; using MECF.Framework.Common.Persistent.Reservoirs; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.Common.ToolLayout; using MECF.Framework.Common.Utilities; using MECF.Framework.Common.WaferHolder; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Windows.Input; using System.Windows.Threading; namespace CyberX8_MainPages.ViewModels { internal class MetalCMHomePageViewModel : BindableBase { #region 常量 private const string PUMP_DATA = "PumpData"; private const string PERSISTENT_VALUE = "PersistentValue"; #endregion #region 内部变量 #region Common /// <summary> /// 模块名称 /// </summary> private string _module; /// <summary> /// 当前选择Recipe节点 /// </summary> private RecipeNode _selectedRecipeNode; /// <summary> /// MetalData /// </summary> //private MetalData _metalCommonData; /// <summary> /// Persistent /// </summary> private MetalPersistentValue _metalPersistent; /// <summary> /// RinseItem /// </summary> private MetalItem _metalItem; /// <summary> /// WaferSize /// </summary> private WaferSize _selectedWaferSize = 0; /// <summary> /// Wafer Size List /// </summary> private List<int> _waferSizeList = new List<int>(); /// <summary> /// MetalData /// </summary> private CompactMembranMetalDeviceData _metalData; /// <summary> /// 页面功能启用 /// </summary> private bool _isEnabled; /// <summary> /// AutoMode页面功能启用 /// </summary> private bool _isAutoEnabled; #endregion #region Wafer Holder /// <summary> /// Wafer Holder属性 /// </summary> private WaferHolderInfo _waferHolderInfo; /// <summary> /// SeqRecipe /// </summary> private string _seqRecipe; #endregion #region 系统数据 /// <summary> /// 定时器 /// </summary> DispatcherTimer _timer; /// <summary> /// 查询后台数据集合 /// </summary> private List<string> _rtDataKeys = new List<string>(); /// <summary> /// rt查询key数值字典 /// </summary> private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>(); #endregion #region MetalCM /// <summary> /// RecipeContent /// </summary> private string _recipeContent; /// <summary> /// TimeRemaining /// </summary> private double _timeRemaining; /// <summary> /// OfTotalTime /// </summary> private double _totalTime; /// <summary> /// OperatingMode /// </summary> private string _operatingMode; /// <summary> /// State /// </summary> private string _state; /// <summary> /// RecipeMode /// </summary> private string _recipeMode; #endregion #region Metal recipe /// <summary> /// RecipeModuleName /// </summary> private string _recipeModuleName; /// <summary> /// RecipeType /// </summary> private string _recipeType; /// <summary> /// AchievedRunRecipeCycle /// </summary> private int _achievedRunRecipeCycle; /// <summary> /// 当前Recipe /// </summary> private string _currentRecipe; #endregion #region UI Related /// <summary> /// ClampStatus /// </summary> private string _clampStatus; /// <summary> /// IsErrorState /// </summary> private bool _isErrorState; #endregion #region PowerSupplier /// <summary> /// SidA PowerSuplier数据 /// </summary> private PowerSupplierData _sideAPowerSupplierData; /// <summary> /// SidB PowerSuplier数据 /// </summary> private PowerSupplierData _sideBPowerSupplierData; /// <summary> /// 是否存在WaferHolder /// </summary> private bool _isWaferHolder; #endregion #region CellStatus /// <summary> /// Anode SideA Flow /// </summary> private double _anodeSideAFlow; /// <summary> /// Anode SideB Flow /// </summary> private double _anodeSideBFlow; /// <summary> /// Anode SideA Status /// </summary> private string _anodeSideAStatus; /// <summary> /// Anode SideB Status /// </summary> private string _anodeSideBStatus; #endregion #endregion #region 属性 #region Common /// <summary> /// MetalData /// </summary> public CompactMembranMetalDeviceData MetalData { get { return _metalData; } set { SetProperty(ref _metalData, value); } } /// <summary> /// Persistent /// </summary> public MetalPersistentValue MetalPersistent { get { return _metalPersistent; } set { SetProperty(ref _metalPersistent, value); } } /// <summary> /// 模块名称 /// </summary> public string Module { get { return _module; } set { SetProperty(ref _module, value); } } /// <summary> /// 当前选择Recipe节点 /// </summary> public RecipeNode SelectedRecipeNode { get { return _selectedRecipeNode; } set { SetProperty(ref _selectedRecipeNode, value); } } /// <summary> /// WaferSize /// </summary> public WaferSize SelectedWaferSize { get { return _selectedWaferSize; } set { SetProperty(ref _selectedWaferSize, value); } } /// <summary> /// WaferSizeList /// </summary> public List<int> WaferSizeList { get { return _waferSizeList; } set { SetProperty(ref _waferSizeList, value); } } /// <summary> /// 页面功能启用 /// </summary> public bool IsEnabled { get { return _isEnabled; } set { SetProperty(ref _isEnabled, value); } } /// <summary> /// AutoMode页面功能启用 /// </summary> public bool IsAutoEnabled { get { return _isAutoEnabled; } set { SetProperty(ref _isAutoEnabled, value); } } #endregion #region Wafer Holder /// <summary> /// Wafer Holder属性 /// </summary> public WaferHolderInfo WaferHolderInfo { get { return _waferHolderInfo; } set { SetProperty(ref _waferHolderInfo, value); } } /// <summary> /// SeqRecipe /// </summary> public string SeqRecipe { get { return _seqRecipe; } set { SetProperty(ref _seqRecipe, value); } } #endregion #region MetalCM /// <summary> /// RecipeContent /// </summary> public string RecipeContent { get { return _recipeContent; } set { SetProperty(ref _recipeContent, value); } } /// <summary> /// TimeRemaining /// </summary> public double TimeRemaining { get { return _timeRemaining; } set { SetProperty(ref _timeRemaining, value); } } /// <summary> /// TotalTime /// </summary> public double TotalTime { get { return _totalTime; } set { SetProperty(ref _totalTime, value); } } /// <summary> /// OperatingMode /// </summary> public string OperatingMode { get { return _operatingMode; } set { SetProperty(ref _operatingMode, value); } } /// <summary> /// State /// </summary> public string State { get { return _state; } set { SetProperty(ref _state, value); } } /// <summary> /// RecipeMode /// </summary> public string RecipeMode { get { return _recipeMode; } set { SetProperty(ref _recipeMode, value); } } #endregion #region Metal recipe /// <summary> /// RecipeModuleName /// </summary> public string RecipeModuleName { get { return _recipeModuleName; } set { SetProperty(ref _recipeModuleName, value); } } /// <summary> /// RecipeType /// </summary> public string RecipeType { get { return _recipeType; } set { SetProperty(ref _recipeType, value); } } /// <summary> /// Run Recipe已经完成的次数 /// </summary> public int AchievedRunRecipeCycle { get { return _achievedRunRecipeCycle; } set { SetProperty(ref _achievedRunRecipeCycle, value); } } /// <summary> /// 当前Recipe /// </summary> public string CurrentRecipe { get { return _currentRecipe; } set { SetProperty(ref _currentRecipe, value); } } #endregion #region UI Related /// <summary> /// IsErrorState /// </summary> public bool IsErrorState { get { return _isErrorState; } set { SetProperty(ref _isErrorState, value); } } /// <summary> /// ClampStatus /// </summary> public string ClampStatus { get { return _clampStatus; } set { SetProperty(ref _clampStatus, value); } } #endregion #region PowerSupplier /// <summary> /// SidA PowerSuplier数据 /// </summary> public PowerSupplierData SideAPowerSupplierData { get { return _sideAPowerSupplierData; } set { SetProperty(ref _sideAPowerSupplierData, value); } } /// <summary> /// SidB PowerSuplier数据 /// </summary> public PowerSupplierData SideBPowerSupplierData { get { return _sideBPowerSupplierData; } set { SetProperty(ref _sideBPowerSupplierData, value); } } /// <summary> /// 是否存在WaferHolder /// </summary> public bool IsWaferHolder { get { return _isWaferHolder; } set { SetProperty(ref _isWaferHolder, value); } } #endregion #region CellStatus /// <summary> /// Anode SideA Flow /// </summary> public double AnodeSideAFlow { get { return _anodeSideAFlow; } set { SetProperty(ref _anodeSideAFlow, value); } } /// <summary> /// Anode SideB Flow /// </summary> public double AnodeSideBFlow { get { return _anodeSideBFlow; } set { SetProperty(ref _anodeSideBFlow, value); } } /// <summary> /// Anode SideA Status /// </summary> public string AnodeSideAStatus { get { return _anodeSideAStatus; } set { SetProperty(ref _anodeSideAStatus, value); } } /// <summary> /// Anode SideB Status /// </summary> public string AnodeSideBStatus { get { return _anodeSideBStatus; } set { SetProperty(ref _anodeSideBStatus, value); } } #endregion #endregion #region Command指令 public ICommand InitializeCommand { get; set; } #endregion /// <summary> /// 构造函数 /// </summary> public MetalCMHomePageViewModel() { InitializeCommand = new DelegateCommand<object>(InitializeAction); WaferSizeList.Add((int)WaferSize.WS8); WaferSizeList.Add((int)WaferSize.WS12); } /// <summary> /// 加载数据 /// </summary> public void LoadData(string systemName) { Module = systemName; RecipeModuleName = "DEP Recipe"; RecipeType = "dep"; _rtDataKeys.Clear(); _rtDataKeys.Add($"{Module}.WaferHolder"); _rtDataKeys.Add($"{Module}.SequenceRecipe"); _rtDataKeys.Add($"{Module}.AchievedCycle"); _rtDataKeys.Add($"{Module}.FsmState"); _rtDataKeys.Add($"{Module}.MetalData"); _rtDataKeys.Add($"{Module}.{PERSISTENT_VALUE}"); _rtDataKeys.Add($"{Module}.SideAPowerSupplierData"); _rtDataKeys.Add($"{Module}.SideBPowerSupplierData"); _rtDataKeys.Add($"{Module}.SideAFlow"); _rtDataKeys.Add($"{Module}.SideAFlowStatus"); _rtDataKeys.Add($"{Module}.SideBFlow"); _rtDataKeys.Add($"{Module}.SideBFlowStatus"); _rtDataKeys.Add($"{Module}.CurrentRecipe"); _rtDataKeys.Add($"{Module}.TotalTime"); _rtDataKeys.Add($"{Module}.TimeRemain"); if (_timer == null) { _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromMilliseconds(200); _timer.Tick += Timer_Tick; } _timer.Start(); } /// <summary> /// 定时器执行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Timer_Tick(object sender, EventArgs e) { if (_rtDataKeys.Count != 0) { _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys); if (_rtDataValueDic != null) { MetalData = CommonFunction.GetValue<CompactMembranMetalDeviceData>(_rtDataValueDic, $"{Module}.MetalData"); MetalPersistent = CommonFunction.GetValue<MetalPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}"); ClampStatus = true ? "Disconnect":(false ? "Clamped" : "Unclamped"); WaferHolderInfo = CommonFunction.GetValue<WaferHolderInfo>(_rtDataValueDic, $"{Module}.WaferHolder"); if (WaferHolderInfo != null) { IsWaferHolder = true; } else { IsWaferHolder = false; } SeqRecipe = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.SequenceRecipe"); AchievedRunRecipeCycle = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.AchievedCycle"); State = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.FsmState"); if ("Manual".Equals(MetalPersistent.OperatingMode)) { IsEnabled = true; IsAutoEnabled = true; } else if ("Auto".Equals(MetalPersistent.OperatingMode)) { IsAutoEnabled = true; IsEnabled = false; } else { State = "Stopped"; IsEnabled = false; IsAutoEnabled = false; } SideAPowerSupplierData = CommonFunction.GetValue<PowerSupplierData>(_rtDataValueDic, $"{Module}.SideAPowerSupplierData"); SideBPowerSupplierData = CommonFunction.GetValue<PowerSupplierData>(_rtDataValueDic, $"{Module}.SideBPowerSupplierData"); AnodeSideAFlow = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.SideAFlow"); AnodeSideBFlow = CommonFunction.GetValue<double>(_rtDataValueDic, $"{Module}.SideBFlow"); AnodeSideAStatus = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.SideAFlowStatus"); AnodeSideBStatus = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.SideBFlowStatus"); //Error时UI腔体变红 IsErrorState = "Error".Equals(State) ? true : false; //WHClamp control if(MetalData != null) { ClampStatus = MetalData.WHUnclamp ? "Unclamped" : (MetalData.WHClamp ? "Clamped" : "Disconnect"); } CurrentRecipe = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.CurrentRecipe"); TotalTime = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.TotalTime"); TimeRemaining = CommonFunction.GetValue<int>(_rtDataValueDic, $"{Module}.TimeRemain"); TimeRemaining = TimeRemaining < 0 ? 0 : TimeRemaining; if (State == "Idle") { TimeRemaining = 0; } } } } /// <summary> /// 隐藏 /// </summary> public void Hide() { if (_timer != null) { _timer.Stop(); } } /// <summary> /// Initialize Action /// </summary> /// <param name="param"></param> private void InitializeAction(object param) { InvokeClient.Instance.Service.DoOperation($"{Module}.InitializeAll"); } } }