using System; using System.Collections.Generic; using log4net; using log4net.Appender; using log4net.Layout; using log4net.Repository.Hierarchy; using System.Text; using Microsoft.Win32; using System.IO; using System.Threading; namespace SHARP_CLAS_UI { public class Panel_Info_Manager { #region Define string str_extension = ".xml"; #endregion #region Logger /// /// Alarm Log /// private ILog Panel_Info_Change_Log = LogManager.GetLogger("Panel_Info_Change"); /// /// Alarm Log Write /// /// Method name of exception that occurred /// exception private void Write_Panel_Info_Change_Log(string message) { if (Panel_Info_Change_Log != null) Panel_Info_Change_Log.Debug($"{message}"); } /// /// Create excepton logger /// private void Create_Panel_Info_Change_logger() { Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); RollingFileAppender rollingAppender = new RollingFileAppender(); PatternLayout layout = new PatternLayout(); hierarchy.Configured = true; rollingAppender.Name = "Panel_Info_Change_RoolingFile"; rollingAppender.LockingModel = new RollingFileAppender.MinimalLock(); rollingAppender.File = $@"D:\Logger\Panel_Info_Change\"; rollingAppender.AppendToFile = true; rollingAppender.DatePattern = "yyyy\\\\MM\\\\'Panel_Info_Change'_dd'.csv'"; rollingAppender.RollingStyle = RollingFileAppender.RollingMode.Composite; rollingAppender.MaxSizeRollBackups = 10; rollingAppender.MaximumFileSize = "100MB"; rollingAppender.StaticLogFileName = false; rollingAppender.Encoding = Encoding.UTF8; rollingAppender.PreserveLogFileNameExtension = true; layout = new PatternLayout("%d{yyyy/MM/dd HH:mm:ss.fff},%m%n"); layout.ActivateOptions(); rollingAppender.Layout = layout; rollingAppender.ActivateOptions(); hierarchy.GetLogger("Panel_Info_Change"); ILog log = LogManager.GetLogger("Panel_Info_Change"); Logger l = (Logger)log.Logger; l.Level = log4net.Core.Level.Debug; l.AddAppender(rollingAppender); Panel_Info_Change_Log = LogManager.GetLogger("Panel_Info_Change"); } #endregion #region Property private static readonly Lazy _instatnce = new Lazy(() => new Panel_Info_Manager()); public static Panel_Info_Manager Instance { get { return _instatnce.Value; } } public Dictionary Panel_Infos { get; set; } private Xml_Manager xml_manager = new Xml_Manager(); private string file_path; private object _lockObject; private bool _isLock; #endregion #region Construct private Panel_Info_Manager() { Create_Panel_Info_Change_logger(); _lockObject = new object(); Get_File_Path(); Panel_Infos = new Dictionary(); foreach (Panel_Info_Names info in Enum.GetValues(typeof(Panel_Info_Names))) { Panel_Infos.Add(info, new Panel_Info()); } } #endregion #region Function private void Get_File_Path() { RegistryKey rkk = Registry.CurrentUser.OpenSubKey(Equipment.Registry_Path, true); try { if (rkk == null) { rkk = Registry.CurrentUser.CreateSubKey(Equipment.Registry_Path); rkk.SetValue("PANEL_INFO_PATH", @"C:\SHARP_CLAS\Config\PANEL_INFO\"); file_path = @"C:\SHARP_CLAS\Config\PANEL_INFO\"; } else { object value = rkk.GetValue("PANEL_INFO_PATH"); if (value == null) { rkk.SetValue("PANEL_INFO_PATH", @"C:\SHARP_CLAS\Config\PANEL_INFO\"); file_path = @"C:\SHARP_CLAS\Config\PANEL_INFO\"; } else { file_path = value.ToString(); } } } finally { rkk.Close(); } } public Panel_Info Get_Panel_Info(Panel_Info_Names panel_name, int tray_panel_num = 0) { lock (_lockObject) { try { while (_isLock) { Monitor.Wait(_lockObject); } _isLock = true; Panel_Info info; string info_name = string.Empty; if (panel_name == Panel_Info_Names.LD_Tray_In || panel_name == Panel_Info_Names.ULD_Tray_Ok || panel_name == Panel_Info_Names.ULD_Tray_Ng) { info_name = $"{panel_name}_{tray_panel_num}"; } else { info_name = $"{panel_name}"; } info_name += str_extension; if (File.Exists(file_path + info_name)) { info = xml_manager.Read_File(file_path + info_name); } else { info = new Panel_Info(); xml_manager.Save_File(file_path + info_name, info); } if(info == null) { info = new Panel_Info(); xml_manager.Save_File(file_path + info_name, info); } Panel_Infos[panel_name] = info.Clone(); return Panel_Infos[panel_name].Clone(); } finally { _isLock = false; Monitor.Pulse(_lockObject); } } } public bool Move_Panel_Info(Panel_Info_Names remove_info, Panel_Info_Names make_info) { try { bool check = true; Get_Panel_Info(remove_info); Set_Panel_Info(make_info, Panel_Infos[remove_info]); Panel_Info resetInfo = new Panel_Info(); Set_Panel_Info(remove_info, resetInfo); Get_Panel_Info(remove_info); return check; } catch(Exception ) { return false; } } public bool Set_Panel_Info(Panel_Info_Names name, Panel_Info info) { lock (_lockObject) { try { while (_isLock) { Monitor.Wait(_lockObject); } _isLock = true; string info_name = string.Empty; if (name == Panel_Info_Names.LD_Tray_In || name == Panel_Info_Names.ULD_Tray_Ok || name == Panel_Info_Names.ULD_Tray_Ng) { info_name = $"{name}_{info.Panel_Num}"; } else { info_name = $"{name}"; } info_name += str_extension; xml_manager.Save_File(file_path + info_name, info); Write_Panel_Info_Change_Log($"{info_name},{info.ToString()}"); Panel_Infos[name] = info.Clone(); return true; } finally { _isLock = false; Monitor.Pulse(_lockObject); } } } #endregion } }