/// <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;
 }
Exemplo n.º 2
0
        /// <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));
        }