using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using log4net;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;
using DIT.SharedMemory;
namespace SHARP_CLAS_UI
{
public class Alarm_Manager:IDisposable
{
#region Define
readonly string file_name = "Alarm_List.csv";
#endregion
#region Logger
///
/// Alarm Log
///
private ILog Alarm_Log = LogManager.GetLogger("Alarm");
///
/// Alarm Log Write
///
/// Method name of exception that occurred
/// exception
private void Write_Alarm_Log(string message)
{
if (Alarm_Log != null) Alarm_Log.Debug($"{message}");
}
///
/// Create excepton logger
///
private void Create_Alarm_logger()
{
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
RollingFileAppender rollingAppender = new RollingFileAppender();
PatternLayout layout = new PatternLayout();
hierarchy.Configured = true;
rollingAppender.Name = "Alarm_RoolingFile";
rollingAppender.LockingModel = new RollingFileAppender.MinimalLock();
rollingAppender.File = @"D:\Logger\Alarm\";
rollingAppender.AppendToFile = true;
rollingAppender.DatePattern = "yyyy\\\\MM\\\\'Alarm_'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("Alarm");
ILog log = LogManager.GetLogger("Alarm");
Logger l = (Logger)log.Logger;
l.Level = log4net.Core.Level.Debug;
l.AddAppender(rollingAppender);
Alarm_Log = LogManager.GetLogger("Alarm");
}
#endregion
#region Property
private static readonly Lazy _instatnce = new Lazy(() => new Alarm_Manager());
public static Alarm_Manager Instance
{
get
{
return _instatnce.Value;
}
}
public List Occured_List { get; private set; }
#endregion
#region Field
bool IsDisposed;
string file_path;
public SortedList Alarm_List;
public En_Alarm_Status Alarm_Status;
public Queue Occured_Alarm = new Queue();
public SharedMemory sm;
List lst_alarm_memory = new List();
#endregion
#region Construct
public Alarm_Manager()
{
sm = new SharedMemory("SHARP_CLAS", 10000, true);
sm.Open();
Create_Alarm_logger();
IsDisposed = false;
Alarm_Status = En_Alarm_Status.NONE;
Get_File_Path();
Initialize_Alarm_List();
Occured_List = new List();
Occured_List.Clear();
}
#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("ALARM_INFO_PATH", @"C:\SHARP_CLAS\Config\SETTING\");
file_path = @"C:\SHARP_CLAS\Config\SETTING\";
}
else
{
object value = rkk.GetValue("ALARM_INFO_PATH");
if (value == null)
{
rkk.SetValue("ALARM_INFO_PATH", @"C:\SHARP_CLAS\Config\SETTING\");
file_path = @"C:\SHARP_CLAS\Config\SETTING\";
}
else
{
file_path = value.ToString();
}
}
if (!Directory.Exists(file_path))
{
Directory.CreateDirectory(file_path);
}
}
finally
{
rkk.Close();
}
}
private void Initialize_Alarm_List()
{
Alarm_List = new SortedList();
Alarm_List.Clear();
SortedList alarm_datas = Get_Alarm_Info();
foreach (En_Alarm_List list in Enum.GetValues(typeof(En_Alarm_List)))
{
if(alarm_datas.ContainsKey(list))
{
Alarm_List.Add(list, alarm_datas[list]);
}
else
{
Alarm_List.Add(list, new Alarm(list));
}
}
Save_Alarm_List();
lst_alarm_memory.AddRange(Alarm_Memory_Address.Get_Address_Infos());
}
private SortedList Get_Alarm_Info()
{
string file = file_path + file_name;
SortedList alarm_list = new SortedList();
alarm_list.Clear();
if (File.Exists(file))
{
foreach(string line in File.ReadAllLines(file))
{
if (line == "") continue;
string[] items = line.Split(',');
if (items.Length < 4) continue;
En_Alarm_List list;
if (Enum.TryParse(items[0], out list))
{
if(!alarm_list.ContainsKey(list))
{
Alarm alarm = new Alarm(list);
alarm.Set_Heavy(items[1]);
alarm.Set_Discription(items[2]);
alarm.Set_Use(items[3]);
alarm_list.Add(list, alarm);
}
}
}
}
else
{
File.Create(file);
foreach (En_Alarm_List list in Enum.GetValues(typeof(En_Alarm_List)))
{
Alarm alarm = new Alarm(list);
alarm_list.Add(list, alarm);
}
}
return alarm_list;
}
public void Save_Alarm_List()
{
string file = file_path + file_name;
if (Alarm_List == null) return;
StringBuilder sb = new StringBuilder();
string[] lines = new string[Alarm_List.Count];
foreach(Alarm data in Alarm_List.Values)
{
sb.AppendLine($"{data.Code},{data.Heavy},{data.Description},{data.Use}");
}
File.WriteAllText(file, sb.ToString());
}
public bool Get_Alarm_Info(int Code, out Alarm info)
{
info = null;
En_Alarm_List eCode = (En_Alarm_List)Code;
if (Alarm_List.Count <= 0) return false;
if (Code < 0 || Alarm_List.Count < Code)
return false;
if (Alarm_List[eCode].Code == eCode)
{
info = Alarm_List[eCode];
return true;
}
else
{
foreach (Alarm ainfo in Alarm_List.Values)
{
if (ainfo.Code == eCode)
{
info = ainfo;
return true;
}
}
}
return false;
}
public SortedList Clone()
{
SortedList list = new SortedList();
foreach(Alarm alarm in Alarm_List.Values)
{
Alarm data = alarm.Clone();
list.Add(data.Code, data);
}
return list;
}
public List Clone_Occurred()
{
List list = new List();
list.Clear();
foreach (Alarm_Occurred alarm in Occured_List)
{
list.Add(alarm);
}
return list;
}
public void Occurred(En_Alarm_List list)
{
Alarm alarm = Alarm_List[list].Clone();
if(alarm.Use)
{
if(!Occured_List.Exists(x => x.Code == alarm.Code))
{
Write_Alarm_Log($"{alarm.Code.ToString()},{alarm.Description}");
if ((int)list < lst_alarm_memory.Count)
{
sm.Set_Bit(lst_alarm_memory[(int)list], true);
}
Occured_Alarm.Enqueue(new Alarm_Occurred(alarm));
Occured_List.Add(new Alarm_Occurred(alarm));
}
if(Occured_List.Exists(x => x.Heavy))
{
Alarm_Status = En_Alarm_Status.HEAVY;
}
else
{
Alarm_Status = En_Alarm_Status.LIGHT;
}
}
}
public void Alarm_Clear()
{
foreach(SharedmemoryAddressInfo sa in lst_alarm_memory)
{
sm.Set_Bit(sa, false);
}
Occured_List.Clear();
Alarm_Status = En_Alarm_Status.NONE;
}
public void Alarm_Clear(En_Alarm_List list)
{
if(Occured_List.Exists(x => x.Code == list))
{
foreach(Alarm_Occurred alarm in Occured_List)
{
if (alarm.Code == list)
{
Occured_List.Remove(alarm);
return;
}
}
}
}
public void Dispose()
{
IsDisposed = true;
sm.Close();
}
#endregion
}
}