using BPA.Helper; using BPASmartClient.Model; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BPASmartClient.Device { public class AlarmHelper { public List Alarms { get; set; } = new(); public List HistoryAlarms { get; set; } = new(); ConcurrentDictionary flagbit = new ConcurrentDictionary(); ConcurrentDictionary delays = new ConcurrentDictionary(); public Action AddAction { get; set; } public Action RemoveAction { get; set; } public Action ChangeAction { get; set; } /// /// 沿报警检测 /// /// 触发变量 /// 报警信息 /// 触发类型,上升沿 或 下降沿 public 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 ? Trigger : !Trigger) 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); AddAlarm(Trigger, text.Substring(0, text.LastIndexOf("-")), alarmLevel); flagbit[text] = edgeType == AlarmTriggerType.Rising ? true : false; } } else { //RemoveAlarm(text); RemoveAlarm(text.Substring(0, text.LastIndexOf("-"))); } if (edgeType == AlarmTriggerType.Rising ? flagbit[text] : !flagbit[text]) flagbit[text] = Trigger; } /// /// 添加报警信息 /// /// 报警信息 private void AddAlarm(object value, string AlarmInfo, AlarmLevel alarmLevel) { BPASmartClient.Model.Alarm tempAlarm = new BPASmartClient.Model.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();//更改报警通知 MessageLog.GetInstance.AddDeviceAlarmLogShow(tempAlarm.Info, Guid.NewGuid().ToString()); } } /// /// 移除报警信息 /// /// 报警信息 private 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(); } } } }