using BPASmartClient.CustomResource.Pages.ViewModel; using BPASmartClient.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 AlarmTest where AlarmT : class, new() { private volatile static ConcurrentDictionary _Instance; public static AlarmT GetInstance(string name = "") { 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 AlarmTest() { } 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(() => { 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])); EdgeAlarm(value, $"{temp.Key}:{AlarmModel.AlarmInfo}", 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) { 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(); } } } }