/// <summary> /// Updates the alarm with a new state. /// </summary> /// <param name="node">The node.</param> /// <param name="alarm">The alarm.</param> private void UpdateAlarm(AlarmConditionState node, UnderlyingSystemAlarm alarm) { ISystemContext context = m_nodeManager.SystemContext; // remove old event. if (node.EventId.Value != null) { m_events.Remove(Utils.ToHexString(node.EventId.Value)); } // update the basic event information (include generating a unique id for the event). node.EventId.Value = Guid.NewGuid().ToByteArray(); node.Time.Value = DateTime.UtcNow; node.ReceiveTime.Value = node.Time.Value; // save the event for later lookup. m_events[Utils.ToHexString(node.EventId.Value)] = node; // determine the retain state. node.Retain.Value = true; if (alarm != null) { node.Time.Value = alarm.Time; node.Message.Value = new LocalizedText(alarm.Reason); // update the states. node.SetEnableState(context, (alarm.State & UnderlyingSystemAlarmStates.Enabled) != 0); node.SetAcknowledgedState(context, (alarm.State & UnderlyingSystemAlarmStates.Acknowledged) != 0); node.SetConfirmedState(context, (alarm.State & UnderlyingSystemAlarmStates.Confirmed) != 0); node.SetActiveState(context, (alarm.State & UnderlyingSystemAlarmStates.Active) != 0); node.SetSuppressedState(context, (alarm.State & UnderlyingSystemAlarmStates.Suppressed) != 0); // update other information. node.SetComment(context, alarm.Comment, alarm.UserName); node.SetSeverity(context, alarm.Severity); node.EnabledState.TransitionTime.Value = alarm.EnableTime; node.ActiveState.TransitionTime.Value = alarm.ActiveTime; // check for deleted items. if ((alarm.State & UnderlyingSystemAlarmStates.Deleted) != 0) { node.Retain.Value = false; } // handle high alarms. ExclusiveLimitAlarmState highAlarm = node as ExclusiveLimitAlarmState; if (highAlarm != null) { highAlarm.HighLimit.Value = alarm.Limits[0]; if ((alarm.State & UnderlyingSystemAlarmStates.High) != 0) { highAlarm.SetLimitState(context, LimitAlarmStates.High); } } // handle high-low alarms. NonExclusiveLimitAlarmState highLowAlarm = node as NonExclusiveLimitAlarmState; if (highLowAlarm != null) { highLowAlarm.HighHighLimit.Value = alarm.Limits[0]; highLowAlarm.HighLimit.Value = alarm.Limits[1]; highLowAlarm.LowLimit.Value = alarm.Limits[2]; highLowAlarm.LowLowLimit.Value = alarm.Limits[3]; LimitAlarmStates limit = LimitAlarmStates.Inactive; if ((alarm.State & UnderlyingSystemAlarmStates.HighHigh) != 0) { limit |= LimitAlarmStates.HighHigh; } if ((alarm.State & UnderlyingSystemAlarmStates.High) != 0) { limit |= LimitAlarmStates.High; } if ((alarm.State & UnderlyingSystemAlarmStates.Low) != 0) { limit |= LimitAlarmStates.Low; } if ((alarm.State & UnderlyingSystemAlarmStates.LowLow) != 0) { limit |= LimitAlarmStates.LowLow; } highLowAlarm.SetLimitState(context, limit); } } // not interested in disabled or inactive alarms. if (!node.EnabledState.Id.Value || !node.ActiveState.Id.Value) { node.Retain.Value = false; } }