/// <summary> /// Copy constructor /// </summary> /// <param name="that"></param> public AlarmInfoViewModelBase(AlarmInfoViewModelBase that) { _alarmIsActive = that._alarmIsActive; _alarmIsUnacked = that._alarmIsUnacked; _occurrenceTime = that._occurrenceTime; _timeLastActive = that._timeLastActive; _tag = that._tag; _propertyPath = that._propertyPath; _desc = that._desc; _area = that._area; _originalAlarmCondition = that._originalAlarmCondition; _currentAlarmCondition = that._currentAlarmCondition; _alarmConditionType = that._alarmConditionType; _categoryId = that._categoryId; _priority = that._priority; _textMessage = that._textMessage; _currentValue = that._currentValue; _currentValueText = that._currentValueText; _tripValue = that._tripValue; _tripValueText = that._tripValueText; EventId = that.EventId; OriginalEventMessage = that.OriginalEventMessage; _eu = that._eu; _isDigital = that._isDigital; _tripValue = that._tripValue; _tripValueText = that._tripValueText; AlarmConditionChanged = that.AlarmConditionChanged; UnackedChanged = that.UnackedChanged; }
/// <summary> /// Returns new AlarmInfoViewModels or null. /// </summary> /// <param name="eventSourceModel"></param> /// <param name="eventMessage"></param> /// <param name="logger"></param> /// <returns></returns> public static Task <IEnumerable <AlarmInfoViewModelBase>?> ProcessEventMessage(Ssz.Utils.EventSourceModel.EventSourceModel eventSourceModel, EventMessage eventMessage, ILogger?logger = null) { try { if (eventMessage.EventType != EventType.EclipsedAlarm && eventMessage.EventType != EventType.SimpleAlarm) { return(Task.FromResult((IEnumerable <AlarmInfoViewModelBase>?)null)); } if (eventMessage.EventId is null || eventMessage.EventId.Conditions is null || eventMessage.EventId.Conditions.Count == 0 || eventMessage.EventId.SourceElementId == @"" || eventMessage.AlarmMessageData is null || !eventMessage.AlarmMessageData.TimeLastActive.HasValue || eventMessage.EventId.SourceElementId == @"") { if (logger is not null && logger.IsEnabled(LogLevel.Debug)) { logger.LogDebug("Invalid message ignored: VarName=" + eventMessage.EventId?.SourceElementId + ";OccurrenceTime=" + eventMessage.OccurrenceTimeUtc + ";TextMessage=" + eventMessage.TextMessage + ";OccurrenceId=" + eventMessage.EventId?.OccurrenceId); } return(Task.FromResult((IEnumerable <AlarmInfoViewModelBase>?)null)); } if (logger is not null && logger.IsEnabled(LogLevel.Debug)) { logger.LogDebug("Valid message received: VarName=" + eventMessage.EventId.SourceElementId + ";Condition=" + eventMessage.EventId.Conditions[0].LocalId + ";Active=" + eventMessage.AlarmMessageData.AlarmState.HasFlag(AlarmState.Active) + ";Unacked=" + eventMessage.AlarmMessageData.AlarmState.HasFlag(AlarmState.Unacked) + ";OccurrenceTime=" + eventMessage.OccurrenceTimeUtc + ";TimeLastActive=" + eventMessage.AlarmMessageData.TimeLastActive.Value + ";TextMessage=" + eventMessage.TextMessage + ";OccurrenceId=" + eventMessage.EventId.OccurrenceId); } string textMessage = eventMessage.TextMessage; string tag = eventMessage.EventId?.SourceElementId ?? ""; string desc = ""; string area = ""; string level = ""; string eu = ""; AlarmCondition condition; bool isDigital = false; bool active = eventMessage.AlarmMessageData.AlarmState.HasFlag(AlarmState.Active); bool unacked = eventMessage.AlarmMessageData.AlarmState.HasFlag(AlarmState.Unacked); uint categoryId = eventMessage.CategoryId; uint priority = eventMessage.Priority; bool alarmConditionChanged = false; bool unackedChanged = false; switch (eventMessage.EventId?.Conditions[0].LocalId) { case "PVLL": case "LL": condition = AlarmCondition.LowLow; categoryId = 2; break; case "PVLO": case "LO": case "L": condition = AlarmCondition.Low; categoryId = 1; break; case "None": condition = AlarmCondition.None; break; case "PVHI": case "HI": case "H": condition = AlarmCondition.High; categoryId = 1; break; case "HH": case "PVHH": condition = AlarmCondition.HighHigh; categoryId = 2; break; case "PositiveRate": condition = AlarmCondition.PositiveRate; break; case "NegativeRate": condition = AlarmCondition.NegativeRate; break; case "AlarmByChngPosLo": condition = AlarmCondition.ChangeOfState; isDigital = true; break; case "AlarmByChngPosLoLo": condition = AlarmCondition.ChangeOfState; isDigital = true; break; case "AlarmByChngPosHi": condition = AlarmCondition.ChangeOfState; isDigital = true; break; case "AlarmByChngPosHiHi": condition = AlarmCondition.ChangeOfState; isDigital = true; break; case "AlarmByPos_LoLo": condition = AlarmCondition.OffNormal; isDigital = true; break; case "AlarmByPos_Low": condition = AlarmCondition.OffNormal; isDigital = true; break; case "AlarmByPos_High": condition = AlarmCondition.OffNormal; isDigital = true; break; case "AlarmByPos_HiHi": condition = AlarmCondition.OffNormal; isDigital = true; break; default: condition = AlarmCondition.Other; categoryId = 1; break; } EventSourceObject eventSourceObject = eventSourceModel.GetOrCreateEventSourceObject(tag, area); if (condition != AlarmCondition.None) { bool changed = eventSourceModel.ProcessEventSourceObject(eventSourceObject, condition, categoryId, active, unacked, eventMessage.OccurrenceTimeUtc, out alarmConditionChanged, out unackedChanged); if (!changed) { return(Task.FromResult((IEnumerable <AlarmInfoViewModelBase>?)null)); } } else { alarmConditionChanged = (eventMessage.AlarmMessageData.AlarmStateChange & AlarmStateChangeCodes.Active) != 0; unackedChanged = (eventMessage.AlarmMessageData.AlarmStateChange & AlarmStateChangeCodes.Acknowledge) != 0; } ConditionState?conditionState; if (condition != AlarmCondition.None) { eventSourceObject.AlarmConditions.TryGetValue(condition, out conditionState); } else { conditionState = eventSourceObject.NormalCondition; } double tripValue = new Any(level).ValueAsDouble(false); string tripValueText = level + @" " + eu; var alarmInfoViewModel = new AlarmInfoViewModelBase { AlarmIsActive = active, AlarmIsUnacked = unacked, OccurrenceTime = eventMessage.OccurrenceTimeUtc, TimeLastActive = eventMessage.AlarmMessageData.TimeLastActive.Value, Tag = tag, Desc = desc, TripValue = tripValue, TripValueText = tripValueText, Area = area, CurrentAlarmCondition = condition, IsDigital = isDigital, CategoryId = categoryId, Priority = priority, EventId = eventMessage.EventId, TextMessage = desc, // eventMessage.TextMessage contains XML OriginalEventMessage = eventMessage, AlarmConditionChanged = alarmConditionChanged, UnackedChanged = unackedChanged }; if (conditionState is not null) { conditionState.LastAlarmInfoViewModel = alarmInfoViewModel; } return(Task.FromResult((IEnumerable <AlarmInfoViewModelBase>?) new[] { alarmInfoViewModel })); } catch (Exception ex) { if (logger is not null) { logger.LogError(ex, "DeltaSimHelper::ProcessEventMessage method error."); } } return(Task.FromResult((IEnumerable <AlarmInfoViewModelBase>?)null)); }