Beispiel #1
0
        /// <summary>
        /// Formats the event according to the channel properties.
        /// </summary>
        public EventFormatted FormatEvent(Event ev)
        {
            if (ev == null)
            {
                throw new ArgumentNullException(nameof(ev));
            }

            EventFormatted eventFormatted = new EventFormatted
            {
                Time = TimeZoneInfo.ConvertTimeFromUtc(ev.Timestamp, timeZone).ToLocalizedString()
            };

            // object
            if (ev.ObjNum > 0)
            {
                eventFormatted.Obj = configDataset.ObjTable.GetItem(ev.ObjNum)?.Name ?? "";
            }

            // device
            if (ev.DeviceNum > 0)
            {
                eventFormatted.Dev = configDataset.DeviceTable.GetItem(ev.DeviceNum)?.Name ?? "";
            }

            // channel
            Cnl cnl = null;

            if (ev.CnlNum > 0)
            {
                cnl = configDataset.CnlTable.GetItem(ev.CnlNum);
                eventFormatted.Cnl = cnl?.Name ?? "";
            }

            // description
            StringBuilder    sbDescr = new StringBuilder();
            CnlDataFormatted dataFormatted;

            if (ev.TextFormat == EventTextFormat.Command)
            {
                // Command Value, Data. Custom text
                sbDescr.Append(CommonPhrases.CommandDescrPrefix);
                dataFormatted = FormatCnlData(new CnlData(ev.CnlVal, CnlStatusID.Defined),
                                              DataTypeID.Double, cnl?.FormatID ?? 0, cnl?.UnitID ?? 0);

                if (ev.CnlStat > 0)
                {
                    sbDescr.Append(dataFormatted.DispVal);
                }

                if (ev.Data != null && ev.Data.Length > 0)
                {
                    sbDescr
                    .Append(ev.CnlStat > 0 ? ", " : "")
                    .Append("0x")
                    .Append(ScadaUtils.BytesToHex(ev.Data, 0, Math.Min(DataDisplayLength, ev.Data.Length)))
                    .Append(DataDisplayLength < ev.Data.Length ? "..." : "");
                }
            }
            else
            {
                // Status, Value. Custom text
                dataFormatted = FormatCnlData(new CnlData(ev.CnlVal, ev.CnlStat), cnl, true);

                if (ev.TextFormat == EventTextFormat.Full || ev.TextFormat == EventTextFormat.AutoText)
                {
                    string statusName = configDataset.CnlStatusTable.GetItem(ev.CnlStat)?.Name ??
                                        string.Format(CommonPhrases.StatusFormat, ev.CnlStat);
                    sbDescr.Append(statusName).Append(", ").Append(dataFormatted.DispVal);
                }
            }

            if (!string.IsNullOrEmpty(ev.Text) && ev.TextFormat != EventTextFormat.AutoText)
            {
                if (sbDescr.Length > 0)
                {
                    sbDescr.Append(". ");
                }

                sbDescr.Append(ev.Text);
            }

            eventFormatted.Descr = sbDescr.ToString();

            // severity
            int knownSeverity = Severity.Closest(ev.Severity);

            if (knownSeverity != Severity.Undefined)
            {
                switch (knownSeverity)
                {
                case Severity.Critical:
                    eventFormatted.Sev = CommonPhrases.CriticalSeverity;
                    break;

                case Severity.Major:
                    eventFormatted.Sev = CommonPhrases.MajorSeverity;
                    break;

                case Severity.Minor:
                    eventFormatted.Sev = CommonPhrases.MinorSeverity;
                    break;

                case Severity.Info:
                    eventFormatted.Sev = CommonPhrases.InfoSeverity;
                    break;
                }

                eventFormatted.Sev += ", " + ev.Severity;
            }

            // acknowledgement
            if (ev.Ack)
            {
                eventFormatted.Ack = string.Join(", ",
                                                 configDataset.UserTable.GetItem(ev.AckUserID)?.Name,
                                                 TimeZoneInfo.ConvertTimeFromUtc(ev.AckTimestamp, timeZone).ToLocalizedString());
            }

            // color
            if (dataFormatted.Colors.Length > 0)
            {
                eventFormatted.Color = dataFormatted.Colors[0];
            }

            // beep
            if (cnl != null && new EventMask(cnl.EventMask).Beep)
            {
                eventFormatted.Beep = true;
            }

            return(eventFormatted);
        }