using BPA.Helper; using BPASmartClient.Model; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows; namespace BPASmartClient.CustomResource.Pages.Model { public class AlarmHelper where AlarmT : class, new() { private volatile static ConcurrentDictionary _Instance; private static readonly object Obj_Lock = new object(); public static AlarmT GetInstance(string name = "") { lock (Obj_Lock) { if (string.IsNullOrEmpty(name)) name = typeof(AlarmT).Name; if (_Instance == null) _Instance = new ConcurrentDictionary(); if (!_Instance.ContainsKey(name)) _Instance.TryAdd(name, new AlarmT()); return _Instance[name]; } } private AlarmHelper() { } public static List Alarms { get; set; } = new List(); public static List HistoryAlarms { get; set; } = new List(); static ConcurrentDictionary flagbit = new ConcurrentDictionary(); static ConcurrentDictionary delays = new ConcurrentDictionary(); public static Action AddAction { get; set; } public static Action RemoveAction { get; set; } public static Action ChangeAction { get; set; } //public static AlarmT Alarm { get; set; } = new AlarmT(); public static void Init() { //AlarmViewModel.AlarmInfos = Alarms; ThreadManage.GetInstance().StartLong(new Action(() => { if (_Instance != null) { foreach (var temp in _Instance) { foreach (var item in temp.Value.GetType().GetProperties()) { if (item.CustomAttributes.Count() > 0) { var AlarmModel = item.GetCustomAttribute(); if (AlarmModel != null) { bool value = Convert.ToBoolean(_Instance[temp.Key].GetType().GetProperty(item.Name)?.GetValue(_Instance[temp.Key])); string text = typeof(AlarmT).Name == temp.Key ? AlarmModel.AlarmInfo : $"{temp.Key}:{AlarmModel.AlarmInfo}"; EdgeAlarm(value, text, 1, AlarmModel.AlarmLevel, AlarmModel.AlarmType); } } } } } Thread.Sleep(100); }), $"{typeof(AlarmT).Name},报警通用模块监听"); } /// /// 沿报警检测 /// /// 触发变量 /// 报警信息 /// 触发类型,上升沿 或 下降沿 private static void EdgeAlarm(bool Trigger, string text, int delay = 2, AlarmLevel alarmLevel = AlarmLevel.一般报警, AlarmTriggerType edgeType = AlarmTriggerType.Rising) { if (!flagbit.ContainsKey(text)) flagbit.TryAdd(text, false); if (!delays.ContainsKey(text)) delays.TryAdd(text, Delay.GetInstance(text)); if (edgeType == AlarmTriggerType.Rising ? delays[text].Start(Trigger, delay) : delays[text].Start(!Trigger, delay)) { if (edgeType == AlarmTriggerType.Rising ? !flagbit[text] : flagbit[text]) { AddAlarm(Trigger, text, alarmLevel); flagbit[text] = edgeType == AlarmTriggerType.Rising ? true : false; } } else RemoveAlarm(text); if (edgeType == AlarmTriggerType.Rising ? flagbit[text] : !flagbit[text]) flagbit[text] = Trigger; } /// /// 添加报警信息 /// /// 报警信息 private static void AddAlarm(object value, string AlarmInfo, AlarmLevel alarmLevel) { Alarm tempAlarm = new Alarm() { NumId = Alarms.Count + 1, Date = DateTime.Now.ToString("yyyy/MM/dd"), Grade = alarmLevel.ToString(), Info = AlarmInfo, Value = value.ToString(), Time = DateTime.Now.ToString("HH:mm:ss"), }; var res = Sqlite.GetInstance.Base.Add(tempAlarm); Sqlite.GetInstance.Save(); if (Alarms.FirstOrDefault(p => p.Info == AlarmInfo) == null) { Alarms.Insert(0, tempAlarm); for (int i = 0; i < Alarms.Count; i++) { Alarms.ElementAt(i).NumId = i + 1; } AddAction?.Invoke(AlarmInfo);//添加报警通知 ChangeAction?.Invoke();//更改报警通知 } } /// /// 移除报警信息 /// /// 报警信息 private static void RemoveAlarm(string AlarmInfo) { var result = Alarms.FirstOrDefault(p => p.Info == AlarmInfo); if (result != null) { Alarms.Remove(result); for (int i = 0; i < Alarms.Count; i++) { Alarms.ElementAt(i).NumId = i + 1; } if (RemoveAction != null) RemoveAction(AlarmInfo); if (ChangeAction != null) ChangeAction(); } } } //public class AlarmHelper where AlarmT : class, new() //{ // //private volatile static ConcurrentDictionary _Instance; // //public static AlarmT GetInstance(string name) // //{ // // if (_Instance == null) _Instance = new ConcurrentDictionary(); // // if (!_Instance.ContainsKey(name)) _Instance.TryAdd(name, new AlarmT()); // // return _Instance[name]; // //} // //private AlarmHelper() { } // public static ObservableCollection Alarms { get; set; } = new ObservableCollection(); // public static List HistoryAlarms { get; set; } = new List(); // static ConcurrentDictionary flagbit = new ConcurrentDictionary(); // static ConcurrentDictionary delays = new ConcurrentDictionary(); // public static Action AddAction { get; set; } // public static Action RemoveAction { get; set; } // public static Action ChangeAction { get; set; } // public static AlarmT Alarm { get; set; } = new AlarmT(); // public static void Init() // { // AlarmViewModel.AlarmInfos = Alarms; // ThreadManage.GetInstance().StartLong(new Action(() => // { // foreach (var item in Alarm.GetType().GetProperties()) // { // if (item.CustomAttributes.Count() > 0) // { // var AlarmModel = item.GetCustomAttribute(); // if (AlarmModel != null) // { // bool value = Convert.ToBoolean(Alarm.GetType().GetProperty(item.Name)?.GetValue(Alarm)); // EdgeAlarm(value, AlarmModel.AlarmInfo, 1, AlarmModel.AlarmLevel, AlarmModel.AlarmType); // } // } // } // Thread.Sleep(100); // }), $"{typeof(AlarmT).Name},报警通用模块监听"); // } // //public static void AnalogAlarm(dynamic Trigger, string info, dynamic HH = null, dynamic H = 0, dynamic L = 0, dynamic LL = 0) // //{ // //} // /// // /// 沿报警检测 // /// // /// 触发变量 // /// 报警信息 // /// 触发类型,上升沿 或 下降沿 // private static void EdgeAlarm(bool Trigger, string text, int delay = 2, AlarmLevel alarmLevel = AlarmLevel.一般报警, AlarmTriggerType edgeType = AlarmTriggerType.Rising) // { // if (!flagbit.ContainsKey(text)) flagbit.TryAdd(text, false); // if (!delays.ContainsKey(text)) delays.TryAdd(text, Delay.GetInstance(text)); // if (edgeType == AlarmTriggerType.Rising ? delays[text].Start(Trigger, delay) : delays[text].Start(!Trigger, delay)) // { // if (edgeType == AlarmTriggerType.Rising ? !flagbit[text] : flagbit[text]) // { // AddAlarm(Trigger, text, alarmLevel); // flagbit[text] = edgeType == AlarmTriggerType.Rising ? true : false; // } // } // else RemoveAlarm(text); // if (edgeType == AlarmTriggerType.Rising ? flagbit[text] : !flagbit[text]) flagbit[text] = Trigger; // } // /// // /// 添加报警信息 // /// // /// 报警信息 // private static void AddAlarm(object value, string AlarmInfo, AlarmLevel alarmLevel) // { // Alarm tempAlarm = new Alarm() // { // NumId = Alarms.Count + 1, // Date = DateTime.Now.ToString("yyyy/MM/dd"), // Grade = alarmLevel.ToString(), // Info = AlarmInfo, // Value = value.ToString(), // Time = DateTime.Now.ToString("HH:mm:ss"), // }; // var res = Sqlite.GetInstance.Base.Add(tempAlarm); // Sqlite.GetInstance.Save(); // if (Alarms.FirstOrDefault(p => p.Info == AlarmInfo) == null) // { // Application.Current.Dispatcher.Invoke(new Action(() => // { // Alarms.Insert(0, tempAlarm); // for (int i = 0; i < Alarms.Count; i++) { Alarms.ElementAt(i).NumId = i + 1; } // })); // AddAction?.Invoke(AlarmInfo);//添加报警通知 // ChangeAction?.Invoke();//更改报警通知 // } // } // /// // /// 移除报警信息 // /// // /// 报警信息 // private static void RemoveAlarm(string AlarmInfo) // { // var result = Alarms.FirstOrDefault(p => p.Info == AlarmInfo); // if (result != null) // { // Application.Current.Dispatcher.Invoke(new Action(() => // { // Alarms.Remove(result); // for (int i = 0; i < Alarms.Count; i++) { Alarms.ElementAt(i).NumId = i + 1; } // })); // if (RemoveAction != null) RemoveAction(AlarmInfo); // if (ChangeAction != null) ChangeAction(); // } // } //} }