using Aitex.Core.Common; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using MECF.Framework.Common.DataCenter; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media; using System.Xml; namespace FurnaceUI.DataModule { public class GlobalDataManager : Singleton { private int _lpCount = 0; public int LPCount { get { if (_lpCount == 0) { string key = "LoadPort.LPCount"; if (QueryDataClient.Instance.Service.GetConfig(key) == null) { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key}=null)"); _lpCount = 4; } else { int t = (int)QueryDataClient.Instance.Service.GetConfig(key); if (t > 0 && t <= 10) _lpCount = t; else { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key})={t} out of [1,10]"); _lpCount = 4; } } } return _lpCount; } } private int _stockerCount = 0; public int StockerCount { get { if (_stockerCount == 0) { string key = "System.Stocker.StockerCount"; if (QueryDataClient.Instance.Service.GetConfig(key) == null) { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key}=null)"); _stockerCount = 18; } else { int t = (int)QueryDataClient.Instance.Service.GetConfig(key); if (t > 0 && t <= 22) _stockerCount = t; else { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key})={t} out of [1,22]"); _stockerCount = 18; } } } return _stockerCount; } } private int _stockerCountByLayer = 0; public int StockerCountByLayer { get { if (_stockerCountByLayer == 0) { string key = "System.Stocker.StockerCountByLayer"; if (QueryDataClient.Instance.Service.GetConfig(key) == null) { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key}=null)"); _stockerCountByLayer = 4; } else { int t = (int)QueryDataClient.Instance.Service.GetConfig(key); if (t > 0 && t < 6) _stockerCountByLayer = t; else { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key})={t}"); _stockerCountByLayer = 4; } } } return _stockerCountByLayer; } } private int _stockerLayers = 0; public int StockerLayers { get { if (_stockerLayers == 0) { string key = "System.Stocker.StockerLayers"; if (QueryDataClient.Instance.Service.GetConfig(key) == null) { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key}=null)"); _stockerLayers = 4; } else { int t = (int)QueryDataClient.Instance.Service.GetConfig(key); if (t > 0 && t < 5) _stockerLayers = t; else { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key})={t}"); _stockerLayers = 4; } } } return _stockerLayers; } } private int _stockerFoupCount; /// ///正常情况应该是StockerCountByLayer*StockerLayers ///需考虑排除特殊情况 /// public int StockerFoupCount { get { if (_stockerFoupCount == 0) { string key = "System.Stocker.FoupStockerCount"; if (QueryDataClient.Instance.Service.GetConfig(key) == null) { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key}=null)"); _stockerFoupCount = 16; } else { int t = (int)QueryDataClient.Instance.Service.GetConfig(key); if (t > 0 && t < 22) { _stockerFoupCount = t; } else { LOG.Error($"GlobalDataManager.LPCount QueryDataClient.Instance.Service.GetConfig({key})={t}"); _stockerFoupCount = 16; } } } return _stockerFoupCount; } } private Dictionary _waferTypes; public Dictionary WaferTypes { get { if (_waferTypes == null || _waferTypes.Count == 0) { List types = QueryDataClient.Instance.Service.GetConfigWaferTypes(); _waferTypes = new Dictionary(); if (types == null || types.Count == 0) { LOG.Error("GlobalDataManager.WaferTypes: QueryDataClient.Instance.Service.GetWaferTypes not find avalible"); } else { foreach (var type in types) { _waferTypes[type.Name] = type; } } //_waferTypes = new Dictionary(); //var config = QueryDataClient.Instance.Service.GetConfigFileContent(); //string key = "System.WaferType"; //var t = GetWaferInfo(key, config); //if (t == null || t.Count == 0) //{ // LOG.Error($"GlobalDataManager.WaferTypes: QueryDataClient.Instance.Service.GetConfigFileContent not find avalible [{key}]"); //} //else //{ // foreach (var type in t) // { // _waferTypes[type.Name] = type; // } //} } return _waferTypes; } } private List GetWaferInfo(string key, string content) { XmlDocument xml = new XmlDocument(); xml.LoadXml(content); XmlElement root = xml.DocumentElement; XmlNodeList xmlNodeList = xml.SelectNodes("root/configs"); string[] keys = key.Split('.'); foreach (XmlElement item in xmlNodeList) { if (item.GetAttribute("name") == keys[0]) { foreach (XmlElement element in item.ChildNodes) { if (element.GetAttribute("name") == keys[1]) { foreach (XmlElement ele in element.ChildNodes) { BuildPathConfigs(ele.GetAttribute("name"), ele); } break; } } break; } } List wafers = new List(); BrushConverter converter = new BrushConverter(); foreach (var item in dic) { if (string.IsNullOrWhiteSpace(item.Key) || item.Key == "None" || item.Key == "V" || wafers.Find(r => r.Name == item.Key) != null) continue; WaferTypeInfo typeInfo = new WaferTypeInfo() { Name = item.Key }; foreach (var r in item.Value) { switch (r.Name) { case "FullName": typeInfo.FullName = string.IsNullOrWhiteSpace(r.Default) ? string.Empty : r.Default.Trim(); break; case "AccFilmThick": typeInfo.AccFilmThick = bool.Parse(r.Default); break; case "AlternativeWaferType": typeInfo.AlternativeWaferType = string.IsNullOrWhiteSpace(r.Default) ? string.Empty : r.Default.Trim(); break; case "IsReturnWafer": typeInfo.IsReturnWafer = bool.Parse(r.Default); break; case "ReturnWaferType": typeInfo.ReturnWaferType = string.IsNullOrWhiteSpace(r.Default) ? string.Empty : r.Default.Trim(); break; case "READY": { if (string.IsNullOrWhiteSpace(r.Default) || converter.IsValid(r.Default)) typeInfo.ShowColor = r.Default ?? "".Trim(); else typeInfo.ShowColor = "LightGray";//保证颜色有效 } break; case "CanProcessContinuously": typeInfo.CanProcessContinuously = bool.Parse(r.Default); break; case "IsDummy": typeInfo.IsDummy = bool.Parse(r.Default); break; } } wafers.Add(typeInfo); } return wafers; } private Dictionary> dic = new Dictionary>(); private void BuildPathConfigs(string parentPath, XmlElement configElement) { //先处理config节点 XmlNodeList nodeConfigs = configElement.SelectNodes("config"); List items = new List(); foreach (XmlElement nodeConfig in nodeConfigs) { SCConfigItem item = new SCConfigItem() { Default = nodeConfig.GetAttribute("default"), Name = nodeConfig.GetAttribute("name"), Description = nodeConfig.GetAttribute("description"), Max = nodeConfig.GetAttribute("max"), Min = nodeConfig.GetAttribute("min"), Parameter = nodeConfig.GetAttribute("paramter"), Path = parentPath, Tag = nodeConfig.GetAttribute("tag"), Type = nodeConfig.GetAttribute("type"), Unit = nodeConfig.GetAttribute("unit"), }; items.Add(item); } if (!dic.ContainsKey(parentPath)) dic[parentPath] = items; //再处理configs XmlNodeList nodeConfigsList = configElement.SelectNodes("configs"); foreach (XmlElement nodeConfig in nodeConfigsList) { BuildPathConfigs(nodeConfig.GetAttribute("name"), nodeConfig); } } /// /// 是否需要pick、place过程主界面动画 /// 应用:手动拖动时,不需要此动画 /// public bool IsNeedAnimationDisplay { get; set; } = true; #region 未找到合理的界面更改配置后如何更新此配置的方式,暂时不用 private Dictionary _stockersType; /// /// 存放每个Stocker的配置的WaferType /// public Dictionary StockersConfigType { get { if (_stockersType == null) { _stockersType = new Dictionary(); for (Int32 i = 1; i <= StockerCount; i++) { string key = $"System.Stocker.Stocker{i}WaferType"; if (QueryDataClient.Instance.Service.GetConfig(key) == null) { LOG.Error($"GlobalDataManager.StockersConfigType QueryDataClient.Instance.Service.GetConfig({key}=null)"); _stockersType[$"Stocker{i}"] = ""; } else { _stockersType[$"Stocker{i}"] = ((string)QueryDataClient.Instance.Service.GetConfig(key)).Trim(); } } } return _stockersType; } set { _stockersType = value; } } #endregion } }