using System; using System.Xml.Linq; using System.ComponentModel; namespace DTS.SensorDB { public class SensorRange : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected bool SetProperty(ref T storage, T value, String propertyName = null) { if (Equals(storage, value)) return false; storage = value; OnPropertyChanged(propertyName); return true; } protected void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public double Low { get; set; } public double Medium { get; set; } public double High { get; set; } #region Tags internal const string SensorRangeTag = "SensorRange"; internal const string LowTag = "Low"; internal const string MediumTag = "Medium"; internal const string HighTag = "High"; #endregion public SensorRange(string value) { var values = value.Split(','); if (3 != values.Length) { throw new System.IO.InvalidDataException("bad SensorRange, " + value); } Low = double.Parse(values[0]); Medium = double.Parse(values[1]); High = double.Parse(values[2]); } public string ToSerializeString() { return $"{Low.ToString(System.Globalization.CultureInfo.InvariantCulture)},{Medium.ToString(System.Globalization.CultureInfo.InvariantCulture)},{High.ToString(System.Globalization.CultureInfo.InvariantCulture)}"; } private string TableName; internal SensorRange(XElement elem, string prefix, string tblName, string id) { TableName = tblName; XElement inner = null; try { inner = elem.Element(mkTag(prefix)); } catch (ArgumentNullException) { if (!string.IsNullOrEmpty(id)) throw new Exception($"{TableName}: Can't find tag {prefix + "-" + SensorRangeTag} for entry {id}"); throw new Exception($"{TableName}: Can't find tag {prefix + "-" + SensorRangeTag} in file"); } Low = Double.Parse(inner.Attribute(LowTag).Value, System.Globalization.CultureInfo.InvariantCulture); Medium = Double.Parse(inner.Attribute(MediumTag).Value, System.Globalization.CultureInfo.InvariantCulture); High = Double.Parse(inner.Attribute(HighTag).Value, System.Globalization.CultureInfo.InvariantCulture); } public SensorRange(double low, double medium, double high) { Low = low; Medium = medium; High = high; } internal XElement ToXElement(string prefix) { var element = new XElement(mkTag(prefix)); element.SetAttributeValue(LowTag, Low); element.SetAttributeValue(MediumTag, Medium); element.SetAttributeValue(HighTag, High); return element; } internal void Update(XElement elem, string prefix) { var element = elem.Element(mkTag(prefix)); if (element == null) return; element.SetAttributeValue(LowTag, Low); element.SetAttributeValue(MediumTag, Medium); element.SetAttributeValue(HighTag, High); } internal static string mkTag(string prefix) { return prefix + "-" + SensorRangeTag; } } }