| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683 | using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Xml;using Aitex.Common.Util;using Aitex.Core.RT.ConfigCenter;using Aitex.Core.RT.DataCenter;using Aitex.Core.RT.DBCore;using Aitex.Core.RT.Event;using Aitex.Core.RT.Log;using Aitex.Core.RT.OperationCenter;using Aitex.Core.RT.SCCore;using Aitex.Core.Util;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.FAServices;namespace MECF.Framework.Common.SCCore{	public class SystemConfigManager : Singleton<SystemConfigManager>, ISCManager	{		private Dictionary<string, SCConfigItem> _items = new Dictionary<string, SCConfigItem>(StringComparer.OrdinalIgnoreCase);		private object _itemLocker = new object();		private string _scConfigFile;		private string _scDataFile = PathManager.GetCfgDir() + "_sc.data";		private string _scDataBackupFile = PathManager.GetCfgDir() + "_sc.data.bak";		private string _scDataErrorFile = PathManager.GetCfgDir() + "_sc.data.err.";        public List<VIDItem> VidConfigList        {            get            {                List<VIDItem> result = new List<VIDItem>();                foreach (var dataItem in _items)                {                    result.Add(new VIDItem()                    {                        DataType = "",                        Description = dataItem.Value.Description,                        Index = 0,                        Name = dataItem.Key,                        Unit = "",                    });                }                return result;            }        }		public void Initialize(string scConfigPathName)		{			_scConfigFile = scConfigPathName;			BuildItems(_scConfigFile);			BackupAndRecoverDataFile();			CustomData();			GenerateDataFile();			foreach (var item in _items)			{				CONFIG.Subscribe("", item.Key, () => item.Value.Value);			}			OP.Subscribe("System.SetConfig", InvokeSetConfig);			SC.Manager = this;        }		private bool InvokeSetConfig(string cmd, object[] parameters)		{			string key = (string)parameters[0];			if (!ContainsItem(key))			{				EV.PostWarningLog("System", string.Format("Not find SC with name {0}", key));				return false;			}			object old = GetConfigValueAsObject(key);			if (InitializeItemValue(_items[(string)parameters[0]], parameters[1].ToString()))			{				GenerateDataFile();				EV.PostInfoLog("System", string.Format("SC {0} value changed from {1} to {2}", key, old, parameters[1]));			}			return true;		}		public void Terminate()		{		}		public string GetFileContent()		{			if (!File.Exists(_scConfigFile))				return "";			StringBuilder s = new StringBuilder();			try			{				using (StreamReader sr = new StreamReader(_scConfigFile))				{					while (!sr.EndOfStream)					{						s.Append(sr.ReadLine());					}				}			}			catch (Exception ex)			{				LOG.Write(ex);				return "";			}			return s.ToString();		}		private void BuildItems(string xmlFile)		{			XmlDocument xml = new XmlDocument();			try			{				xml.Load(xmlFile);				XmlNodeList nodeConfigs = xml.SelectNodes("root/configs");				foreach (XmlElement nodeConfig in nodeConfigs)				{					BuildPathConfigs(nodeConfig.GetAttribute("name"), nodeConfig as XmlElement);				}			}			catch (Exception ex)			{				LOG.Write(ex);			}		}		private void BuildPathConfigs(string parentPath, XmlElement configElement)		{			XmlNodeList nodeConfigsList = configElement.SelectNodes("configs");			foreach (XmlElement nodeConfig in nodeConfigsList)			{				if (string.IsNullOrEmpty(parentPath))				{					BuildPathConfigs(nodeConfig.GetAttribute("name"), nodeConfig as XmlElement);				}				else				{					BuildPathConfigs(parentPath + "." + nodeConfig.GetAttribute("name"), nodeConfig as XmlElement);				}			}			XmlNodeList nodeConfigs = configElement.SelectNodes("config");			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"),				};				InitializeItemValue(item, item.Default);				if (_items.ContainsKey(item.PathName))				{					LOG.Error("Duplicated SC item, " + item.PathName);				}				_items[item.PathName] = item;			}		}		private void BackupAndRecoverDataFile()		{			try			{				if (File.Exists(_scDataFile) && IsXmlFileLoadable(_scDataFile))				{					File.Copy(_scDataFile, _scDataBackupFile, true);				}				else if (File.Exists(_scDataBackupFile) && IsXmlFileLoadable(_scDataBackupFile))				{					if (File.Exists(_scDataFile))					{						File.Copy(_scDataFile, _scDataErrorFile + DateTime.Now.ToString("yyyyMMdd_HHmmss"), true);					}					File.Copy(_scDataBackupFile, _scDataFile, true);				}			}			catch (Exception ex)			{				LOG.Write(ex);			}		}		private void CustomData()		{			Dictionary<string, string> values = new Dictionary<string, string>();			try			{				if (File.Exists(_scDataFile))				{					XmlDocument xmlData = new XmlDocument();					xmlData.Load(_scDataFile);					XmlNodeList scdatas = xmlData.SelectNodes("root/scdata");					foreach (XmlElement nodedata in scdatas)					{						string name = nodedata.GetAttribute("name");						if (_items.ContainsKey(name))						{							InitializeItemValue(_items[name], nodedata.GetAttribute("value"));						}					}				}			}			catch (Exception ex)			{				LOG.Write(ex);			}		}		private void GenerateDataFile()		{			try			{				XmlDocument xml = new XmlDocument();				xml.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?><root></root>");				XmlElement nodeRoot = xml.SelectSingleNode("root") as XmlElement;				foreach (var scConfigItem in _items)				{					XmlElement node = xml.CreateElement("scdata");					node.SetAttribute("name", scConfigItem.Key);					node.SetAttribute("value", scConfigItem.Value.Value.ToString());					nodeRoot.AppendChild(node);				}				if (File.Exists(_scDataFile) && IsXmlFileLoadable(_scDataFile))				{					File.Copy(_scDataFile, _scDataBackupFile, true);					//File.Delete(_scDataFile);				}				using (FileStream fsFileStream = new FileStream(_scDataFile,					FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, 1024, FileOptions.WriteThrough))				{					fsFileStream.SetLength(0);					XmlWriterSettings settings = new XmlWriterSettings();					settings.Indent = true;					settings.OmitXmlDeclaration = false;					using (XmlWriter xmlWrite = XmlWriter.Create(fsFileStream, settings))					{						xml.Save(xmlWrite);					}				}			}			catch (Exception ex)			{				LOG.Write(ex);			}		}		private bool IsXmlFileLoadable(string file)		{			try			{				XmlDocument xml = new XmlDocument();				xml.Load(file);			}			catch (Exception ex)			{				LOG.Write(ex);				return false;			}			return true;		}		public SCConfigItem GetConfigItem(string name)		{			//Debug.Assert(_items.ContainsKey(name), "can not find sc name, "+name);			if (!_items.ContainsKey(name))			{				return null;			}			return _items[name];		}		public bool ContainsItem(string name)		{			return _items.ContainsKey(name);		}		public object GetConfigValueAsObject(string name)		{			SCConfigItem item = GetConfigItem(name);			switch (item.Type)			{				case "Bool": return item.BoolValue;				case "Integer": return item.IntValue;				case "Double": return item.DoubleValue;				case "String": return item.StringValue;			}			return null;		}		public T GetValue<T>(string name) where T : struct		{			try			{				if (typeof(T) == typeof(bool))					return (T)(object)_items[name].BoolValue;				if (typeof(T) == typeof(int))					return (T)(object)_items[name].IntValue;				if (typeof(T) == typeof(double))					return (T)(object)_items[name].DoubleValue;			}			catch (KeyNotFoundException)			{				EV.PostAlarmLog("System", $"Can not find system config item {name}");				return default(T);			}			catch (Exception)			{                EV.PostAlarmLog("System", $"Can not get valid system config item value {name}");				return default(T);			}			Debug.Assert(false, "unsupported type");			return default(T);		}		public string GetStringValue(string name)		{			if (!_items.ContainsKey(name))				return null;			return _items[name].StringValue;		}		public T SafeGetValue<T>(string name, T defaultValue) where T : struct		{			try			{				if (typeof(T) == typeof(bool))					return (T)(object)_items[name].BoolValue;				if (typeof(T) == typeof(int))					return (T)(object)_items[name].IntValue;				if (typeof(T) == typeof(double))					return (T)(object)_items[name].DoubleValue;			}			catch (KeyNotFoundException)			{				return defaultValue;			}			catch (Exception)			{				return defaultValue;			}			Debug.Assert(false, "unsupported type");			return defaultValue;		}		public string SafeGetStringValue(string name, string defaultValue)		{			if (!_items.ContainsKey(name))				return defaultValue;			return _items[name].StringValue;		}		public List<SCConfigItem> GetItemList()		{			return _items.Values.ToList();		}		public void SetItemValueFromString(string name, string value)		{			if (InitializeItemValue(_items[name], value))			{				GenerateDataFile();			}		}		private bool InitializeItemValue(SCConfigItem item, string value)		{			bool changed = false;			switch (item.Type)			{				case "Bool":					bool boolValue;					if (bool.TryParse(value, out boolValue) && boolValue != item.BoolValue)					{						item.BoolValue = boolValue;						changed = true;					}					break;				case "Integer":					int intValue;					if (int.TryParse(value, out intValue) && intValue != item.IntValue)					{						int.TryParse(item.Min, out int min);						int.TryParse(item.Max, out int max);						if (intValue < min || intValue > max)						{							EV.PostWarningLog(ModuleNameString.System, $"SC {item.PathName} value  {intValue} out of setting range ({item.Min}, {item.Max})");							break;						}						item.IntValue = intValue;						changed = true;					}					break;				case "Double":					double doubleValue;					if (double.TryParse(value, out doubleValue) && Math.Abs(doubleValue - item.DoubleValue) > 0.0001)					{						double.TryParse(item.Min, out double min);						double.TryParse(item.Max, out double max);						if (doubleValue < min || doubleValue > max)						{							EV.PostWarningLog(ModuleNameString.System, $"SC {item.PathName}  value  {doubleValue} out of setting range ({item.Min}, {item.Max})");							break;						}						item.DoubleValue = doubleValue;						changed = true;					}					break;				case "String":					if (value != item.StringValue)					{						item.StringValue = value;						changed = true;					}					break;			}			return changed;		}		public void SetItemValue(string name, object value)		{			Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);			if (!_items.ContainsKey(name))			{				return;			}			bool changed = false;			switch (_items[name].Type)			{				case "Bool":					bool boolValue = (bool)value;					if (boolValue != _items[name].BoolValue)					{						_items[name].BoolValue = boolValue;						changed = true;					}					break;				case "Integer":					int intValue = (int)value;					if (intValue != _items[name].IntValue)					{						_items[name].IntValue = intValue;						changed = true;					}					break;				case "Double":					double doubleValue = (double)value;					if (Math.Abs(doubleValue - _items[name].DoubleValue) > 0.0001)					{						_items[name].DoubleValue = doubleValue;						changed = true;					}					break;				case "String":					string stringValue = (string)value;					if (stringValue != _items[name].StringValue)					{						_items[name].StringValue = stringValue;						changed = true;					}					break;			}			if (changed)			{				GenerateDataFile();			}		}		public void SetItemValues(Dictionary<string,object> itemValues)		{			if (itemValues == null || itemValues.Count == 0) return;			bool changed = false;			foreach (var name in itemValues.Keys)            {				Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);				if (!_items.ContainsKey(name))				{					continue;				}				switch (_items[name].Type)				{					case "Bool":						bool boolValue = (bool)itemValues[name];						if (boolValue != _items[name].BoolValue)						{							_items[name].BoolValue = boolValue;							changed = true;						}						break;					case "Integer":						int intValue = (int)itemValues[name];						if (intValue != _items[name].IntValue)						{							_items[name].IntValue = intValue;							changed = true;						}						break;					case "Double":						double doubleValue = (double)itemValues[name];						if (Math.Abs(doubleValue - _items[name].DoubleValue) > 0.0001)						{							_items[name].DoubleValue = doubleValue;							changed = true;						}						break;					case "String":						string stringValue = (string)itemValues[name];						if (stringValue != _items[name].StringValue)						{							_items[name].StringValue = stringValue;							changed = true;						}						break;				}			}			if (changed)			{				GenerateDataFile();			}		}		public void SetItemValueStringFormat(string name, string value)		{			Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);			if (!_items.ContainsKey(name))			{				return;			}			bool changed = false;			switch (_items[name].Type)			{				case "Bool":					bool boolValue = Convert.ToBoolean(value);					if (boolValue != _items[name].BoolValue)					{						_items[name].BoolValue = boolValue;						changed = true;					}					break;				case "Integer":					int intValue = Convert.ToInt32(value);					if (intValue != _items[name].IntValue)					{						_items[name].IntValue = intValue;						changed = true;					}					break;				case "Double":					double doubleValue = Convert.ToDouble(value);					if (Math.Abs(doubleValue - _items[name].DoubleValue) > 0.0001)					{						_items[name].DoubleValue = doubleValue;						changed = true;					}					break;				case "String":					string stringValue = (string)value;					if (stringValue != _items[name].StringValue)					{						_items[name].StringValue = stringValue;						changed = true;					}					break;			}			if (changed)			{				GenerateDataFile();			}		}		public void SetItemValue(string name, bool value)		{			Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);			Debug.Assert(_items[name].Type == "Bool", "sc type not bool, defined as" + _items[name].Type);			if (value != _items[name].BoolValue)			{				_items[name].BoolValue = value;				GenerateDataFile();			}		}		public void SetItemValue(string name, int value)		{			Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);			Debug.Assert(_items[name].Type == "Integer", "sc type not bool, defined as" + _items[name].Type);			if (value != _items[name].IntValue)			{				_items[name].IntValue = value;				GenerateDataFile();			}		}		public void SetItemValue(string name, double value)		{			Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);			Debug.Assert(_items[name].Type == "Double", "sc type not bool, defined as" + _items[name].Type);			if (Math.Abs(value - _items[name].DoubleValue) > 0.0001)			{				_items[name].DoubleValue = value;				GenerateDataFile();			}		}		public void SetItemValue(string name, string value)		{			Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);			if (value != _items[name].StringValue)			{				_items[name].StringValue = value;				GenerateDataFile();			}		}	}}
 |