using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.Linq; using System.Text; using System.Windows; using DataPROWin7.DataModel.Classes.Hardware; using DTS.Common.Enums; using DTS.Common.Storage; using DTS.Common.Utilities.Logging; using DTS.Common.ISO; using DTS.Common.Classes.GroupTemplates; using DTS.Common.Enums.Hardware; using DTS.Common.Enums.Sensors; using DTS.SensorDB; using DTS.Common.Classes.Sensors; using DTS.Common.DataModel; using DTS.Common.SharedResource.Strings; // ReSharper disable ConvertToAutoProperty // ReSharper disable PossibleMultipleEnumeration // ReSharper disable once CheckNamespace namespace DataPROWin7.DataModel { public class TestObject : DTS.Common.Base.BasePropertyChanged, IComparable { public enum Tags { SerialNumber, SerialNumberConverted, TestObjectType, ParentObject, SysBuilt, Channels, Hardware, LastModifiedBy, LastModified, LastModifiedText, AllTemplates, Template, TemplateIndex, ChannelsDescription, TemplateDescription, TemplateImage, Zones, SelectedGlobalRangeCACOption, ZoneNames, CurrentZone, CurrentZoneIndex, ChannelVisibility, ChannelTypesIndex } private bool? _isComplete = null; public void MarkIsCompleteUnchecked() { _isComplete = null; } private readonly string _errorMessage = ""; public int CompareTo(TestObject rhs) { if (null == rhs) { return 1; } return rhs == this ? 0 : string.Compare(SerialNumber, rhs.SerialNumber, StringComparison.Ordinal); } //http://fogbugz/fogbugz/default.asp?11910, //I noticed channel name and channel id were alternatively being used to lookup sensors //rather than trying to force them all to use channel name, I merely allowed it to pass in channel id as well. public SensorData GetSensor(string channelId, string serialNumber, string alternateChannelId = null) { var sd = SensorsCollection.SensorsList.GetSensorBySerialNumber(serialNumber); if (null == sd) { return null; } sd = new SensorData(sd); var settings = GetISOTestObject().GetSensorSettings(channelId, sd.SerialNumber); if (null == settings || !settings.Any() && !string.IsNullOrWhiteSpace(alternateChannelId)) { settings = GetISOTestObject().GetSensorSettings(alternateChannelId, sd.SerialNumber); } var isoTo = GetISOTestObject(); var channel = isoTo.GetChannel(channelId); if (null != channel) { //preset the channel iso fields, these can be filter can be overwritten by to settings below sd.TestObject = channel.Channel.Test_Object; sd.Position = channel.Channel.Position; sd.OriginalPosition = channel.Channel.Position; if (channel.Channel.Default_Filter_Class != "?") { //If ISO says "?", then use the sensor's filter class (but still overwrite with any settings below) sd.FilterClassIso = channel.Channel.Default_Filter_Class; } sd.FineLocation1 = channel.Channel.Fine_Loc_1; sd.FineLocation2 = channel.Channel.Fine_Loc_2; sd.FineLocation3 = channel.Channel.Fine_Loc_3; sd.MainLocation = channel.Channel.Trans_Main_Loc; sd.PhysicalDimension = channel.Channel.Physical_Dimension; sd.Direction = channel.Channel.Direction; } if (null != settings) { foreach (var setting in settings) { switch (setting.Setting) { case SensorConstants.SensorSettings.CFC: sd.FilterClassIso = setting.Value; //FB 15574 assign both FilterClass and Filter to the same filter class sd.FilterClass = FilterClass.GetFilterClassFromIsoCode(sd.FilterClassIso); sd.Filter = FilterClass.GetFilterClassFromIsoCode(sd.FilterClassIso); break; //FB 13120 set filter class setting case SensorConstants.SensorSettings.FilterClass: sd.FilterClass = FilterClass.GetFilterClassFromFilterClassSetting(setting.Value); break; case SensorConstants.SensorSettings.Position: sd.Position = setting.Value; break; case SensorConstants.SensorSettings.Polarity: sd.Invert = setting.Value == "-"; break; case SensorConstants.SensorSettings.Range: sd.Capacity = double.Parse(setting.Value, CultureInfo.InvariantCulture); break; case SensorConstants.SensorSettings.LimitDuration: if (!string.IsNullOrWhiteSpace(setting.Value)) { sd.DigitalOutputLimitDuration = bool.Parse(setting.Value); sd.LimitDuration = bool.Parse(setting.Value); sd.LimitSquibFireDuration = bool.Parse(setting.Value); } break; case SensorConstants.SensorSettings.Delay: if (!string.IsNullOrWhiteSpace(setting.Value)) { sd.DigitalOutputDelayMS = double.Parse(setting.Value, CultureInfo.InvariantCulture); sd.DelayMS = double.Parse(setting.Value, CultureInfo.InvariantCulture); sd.SquibFireDelayMS = double.Parse(setting.Value, CultureInfo.InvariantCulture); } break; case SensorConstants.SensorSettings.Duration: if (!string.IsNullOrWhiteSpace(setting.Value)) { sd.DigitalOutputDurationMS = double.Parse(setting.Value, CultureInfo.InvariantCulture); sd.DurationMS = double.Parse(setting.Value, CultureInfo.InvariantCulture); sd.SquibFireDurationMS = double.Parse(setting.Value, CultureInfo.InvariantCulture); } break; case SensorConstants.SensorSettings.OutputMode: if (!string.IsNullOrWhiteSpace(setting.Value)) { if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out int iValue)) { sd.DigitalOutputMode = (DigitalOutputModes)iValue; } } break; case SensorConstants.SensorSettings.DigitalOutDelay: { if (double.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var d)) { sd.DigitalOutputDelayMS = d; } } break; case SensorConstants.SensorSettings.DigitalOutDuration: { if (double.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var d)) { sd.DigitalOutputDurationMS = d; } } break; case SensorConstants.SensorSettings.DigitalOutLimitDuration: { if (bool.TryParse(setting.Value, out var b)) { sd.DigitalOutputLimitDuration = b; } } break; case SensorConstants.SensorSettings.SQMode: if (!string.IsNullOrWhiteSpace(setting.Value)) { if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var iValue)) { sd.SquibFireMode = (SquibFireMode)iValue; } } break; case SensorConstants.SensorSettings.SquibDelay: { if (double.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var d)) { sd.SquibFireDelayMS = d; } } break; case SensorConstants.SensorSettings.SquibDuration: { if (double.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var d)) { sd.SquibFireDurationMS = d; } } break; case SensorConstants.SensorSettings.SquibLimitDuration: { if (bool.TryParse(setting.Value, out var b)) { sd.LimitSquibFireDuration = b; } } break; case SensorConstants.SensorSettings.DIMode: if (!string.IsNullOrWhiteSpace(setting.Value)) { if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var iValue)) { sd.InputMode = (DigitalInputModes)iValue; } } break; case SensorConstants.SensorSettings.DefaultValue: if (!string.IsNullOrWhiteSpace(setting.Value)) { if (double.TryParse(setting.Value, out var defaultValue)) { sd.ScaleMultiplier.DefaultValue = defaultValue; } } break; case SensorConstants.SensorSettings.ActiveValue: if (!string.IsNullOrWhiteSpace(setting.Value)) { if (double.TryParse(setting.Value, out var activeValue)) { sd.ScaleMultiplier.ActiveValue = activeValue; } } break; default: throw new ArgumentOutOfRangeException(); } } } if (sd.FilterClassIso == "?") { sd.FilterClassIso = "P"; // "Prefiltered > CFC 1000" (Unfiltered) } return sd; } public void SetSensor(string channelName, SensorData sensor) { var settings = new List(); var fields = Enum.GetValues(typeof(SensorConstants.SensorSettings)).Cast().ToArray(); foreach (var field in fields) { var value = ""; switch (field) { case SensorConstants.SensorSettings.CFC: value = sensor.FilterClassIso; break; //FB 13120 set filter class setting case SensorConstants.SensorSettings.FilterClass: value = $"{sensor.FilterClass.FClass},{sensor.FilterClass.Frequency}"; break; case SensorConstants.SensorSettings.Position: value = sensor.Position; break; case SensorConstants.SensorSettings.Polarity: value = sensor.Invert ? "-" : "+"; break; case SensorConstants.SensorSettings.Range: value = sensor.Capacity.ToString(CultureInfo.InvariantCulture); break; case SensorConstants.SensorSettings.Duration: value = sensor.DurationMS.ToString(CultureInfo.InvariantCulture); if (sensor.IsSquib()) { value = sensor.SquibFireDurationMS.ToString(CultureInfo.InvariantCulture); } else if (sensor.IsDigitalOutput()) { value = sensor.DigitalOutputDurationMS.ToString(CultureInfo.InvariantCulture); } break; case SensorConstants.SensorSettings.Delay: value = sensor.DelayMS.ToString(CultureInfo.InvariantCulture); if (sensor.IsSquib()) { value = sensor.SquibFireDelayMS.ToString(CultureInfo.InvariantCulture); } else if (sensor.IsDigitalOutput()) { value = sensor.DigitalOutputDelayMS.ToString(CultureInfo.InvariantCulture); } break; case SensorConstants.SensorSettings.LimitDuration: value = sensor.LimitDuration.ToString(CultureInfo.InvariantCulture); if (sensor.IsSquib()) { value = sensor.LimitSquibFireDuration.ToString(CultureInfo.InvariantCulture); } else if (sensor.IsDigitalOutput()) { value = sensor.DigitalOutputLimitDuration.ToString(CultureInfo.InvariantCulture); } break; case SensorConstants.SensorSettings.OutputMode: value = ((int)sensor.DigitalOutputMode).ToString(CultureInfo.InvariantCulture); break; case SensorConstants.SensorSettings.SQMode: value = ((int)sensor.SquibFireMode).ToString(CultureInfo.InvariantCulture); break; case SensorConstants.SensorSettings.DIMode: value = ((int)sensor.InputMode).ToString(CultureInfo.InvariantCulture); break; case SensorConstants.SensorSettings.DefaultValue: value = sensor.ScaleMultiplier.DefaultValue.ToString(CultureInfo.InvariantCulture); break; case SensorConstants.SensorSettings.ActiveValue: value = sensor.ScaleMultiplier.ActiveValue.ToString(CultureInfo.InvariantCulture); break; default: continue; // If we don't know about a setting we shouldn't overwrite it with blank. } settings.Add(new DTS.Common.ISO.TestObject.SensorSetting(field, value, channelName, sensor.SerialNumber)); } foreach (var setting in settings) { GetISOTestObject().SetSensorSetting(channelName, sensor.SerialNumber, setting); } } public TestObject() { //PopulateTemplates(); _isoTestObject = new DTS.Common.ISO.TestObject(); Template = new TestObjectTemplate(); ParentObject = ""; SysBuilt = false; } public DASHardware[] Hardware { get { var hardware = new List(_hardware.Values.ToArray()); hardware.Sort(); return hardware.ToArray(); } } public void Initialize(TestObject copy) { //PopulateTemplates(); var db = ApplicationProperties.IsoDb; _isoTestObject = new DTS.Common.ISO.TestObject(copy.GetISOTestObject(), ref db); SerialNumber = copy.SerialNumber; if (null != copy.Template) { SetTemplateDontResetISOObject(new TestObjectTemplate(copy.Template, ref db)); } copy.GetISOTestObject(); GetISOTestObject(); var hardware = copy.Hardware.Select(das => new DASHardware(das, null)).ToList(); foreach (var h in hardware) { _hardware.Add(h.SerialNumber, h); } ParentObject = copy.ParentObject; SysBuilt = copy.SysBuilt; if (SysBuilt) { _isoTestObject.SerialNumberConverted = copy.SerialNumberConverted; SerialNumberConverted = copy.SerialNumberConverted; } PurgeChannels(); } // 11287 Out of memory exception when importing large CSV Test Setup files // cleans up any channels in the template which aren't required private void PurgeChannels() { var channels = Template.TemplateAllChannels.ToList(); for (var i = channels.Count - 1; i >= 0; i--) { if (!channels[i].Required) { channels.RemoveAt(i); } } Template.TemplateAllChannels = channels.ToArray(); } public TestObject(TestObject copy) { Initialize(copy); } public void SetAllSensors() { var to = GetISOTestObject(); foreach (var ch in to.AllChannels) { if (string.IsNullOrWhiteSpace(ch.SensorSerialNumber) || !ch.Required) continue; var sd = GetSensor(ch.Name, ch.SensorSerialNumber, ch.GetId()); if (null != sd) { SetSensor(ch.Name, sd); } } } public SensorData[] GetSensors(SensorsCollection list) { var to = GetISOTestObject(); return (from channel in to.AllChannels where !string.IsNullOrEmpty(channel.SensorSerialNumber) select GetSensor(channel.Name, channel.SensorSerialNumber, channel.GetId()) into s where null != s select s).ToArray(); } public string TemplateDescription => null == _template ? "N/A" : _template.TemplateDescription; private string _serialNumber = string.Empty; public string SerialNumber { get => _serialNumber; set { SetProperty(ref _serialNumber, value, Tags.SerialNumber.ToString()); GetISOTestObject().SerialNumber = value; } } public string SerialNumberOrOriginalSerialNumber { get { if (GetISOTestObject().Embedded) { return GetISOTestObject().OriginalSerialNumber; } return string.IsNullOrWhiteSpace(SerialNumberConverted) ? SerialNumber : SerialNumberConverted; } } private string _serialNumberConverted = string.Empty; public string SerialNumberConverted { get => _serialNumberConverted; set => SetProperty(ref _serialNumberConverted, value, Tags.SerialNumberConverted.ToString()); } public string DisplaySerialNumber { get { if (string.IsNullOrWhiteSpace(SerialNumberConverted) && !SysBuilt) { return SerialNumberOrOriginalSerialNumber; } return SerialNumberConverted; } set { //We assume that this is an Added Group being renamed SerialNumber = TestSetupName + "_" + value; SerialNumberConverted = value; GetISOTestObject().OriginalSerialNumber = SerialNumber; Template.OriginalTemplateName = SerialNumber + "_Template"; GetISOTestObject().OriginalTemplate = Template.OriginalTemplateName; } } public Visibility StaticGroupTextBlockVisibility => SysBuilt ? Visibility.Hidden : Visibility.Visible; public Visibility AddedGroupTextBoxVisibility => SysBuilt ? Visibility.Visible : Visibility.Hidden; public string TestSetupName { get; set; } = string.Empty; private string _testObjectType = "?"; public string TestObjectType { get => _testObjectType; set => SetProperty(ref _testObjectType, value, Tags.TestObjectType.ToString()); } private string _parentObject = ""; public string ParentObject { get => _parentObject; set { MarkIsCompleteUnchecked(); SetProperty(ref _parentObject, value, Tags.ParentObject.ToString()); GetISOTestObject().ParentObject = value; } } private bool _sysBuilt; public bool SysBuilt { get => _sysBuilt; set => SetProperty(ref _sysBuilt, value, Tags.SysBuilt.ToString()); } private Dictionary _hardware = new Dictionary(); public bool ContainsHardware(DASHardware h) { return _hardware.ContainsKey(h.SerialNumber); } /// /// this call is intended to be available to test template to update the hardware for the group in memory /// it is not intended to have that hardware stored in the db currently /// /// public void SetHardware(DASHardware[] hardware) { _hardware.Clear(); var hids = new List(); foreach (var h in hardware) { _hardware[h.SerialNumber] = h; if (!hids.Contains(h.SerialNumber)) { hids.Add(h.SerialNumber); } } GetISOTestObject().HardwareIds = hids.ToArray(); } public void AddHardware(DASHardware hardware) { //just making sure we have a copy and not the original hardware record hardware = new DASHardware(hardware.GetHardware()); MarkIsCompleteUnchecked(); var toAdd = hardware; if (hardware.IsDummy()) { var key = hardware.SerialNumber; if (_hardware.ContainsKey(key)) { int current = 1; while (_hardware.ContainsKey(key)) { current++; key = $"{hardware.SerialNumber}({current:00})"; } toAdd = new DASHardware(hardware.GetHardware()); toAdd.SerialNumber = key; } else { toAdd = new DASHardware(hardware.GetHardware()); } } else { toAdd = new DASHardware(hardware.GetHardware()); } if (_hardware.ContainsKey(toAdd.SerialNumber)) { return; } _hardware.Add(toAdd.SerialNumber, toAdd); OnPropertyChanged(Tags.Hardware.ToString()); _isoTestObject.HardwareIds = Hardware.Select(h => h.GetHardware().GetId()).ToArray(); } public void Commit() { MarkIsCompleteUnchecked(); SetAllSensors(); } public DTS.Common.ISO.TestObject GetISOTestObject() { return _isoTestObject; } /// /// to be called in non iso mode, will modify the test object, creating channels foreach of the sensors /// when the user presses save, we in turn need to create custom channels and update the template for the object accordingly /// and assigns the hardwarechannel as necessary /// /// /// row to insert at (-1 for append to end) public void CreateMoreChannels(SensorData[] sensors, int insertAtRow, HardwareChannel[] hardwareChannels, string[] displayNames = null) { var sensorToChannelName = new Dictionary(); var currentInsertPoint = insertAtRow; var isoobj = GetISOTestObject(); var existingChannels = new List(); if (_template == null) { _template = new TestObjectTemplate(); } var isoTemplate = _template.ToISOTestObjectTemplate(); var existingNames = new Dictionary(); foreach (var c in isoobj.AllChannels) { if (c.Channel.Id < 1) { c.Channel.SetId(-1 * (existingChannels.Count + 1)); } existingChannels.Add(c); existingNames[c.Name] = true; } for (var i = 0; i < sensors.Length; i++) { var s = sensors[i]; var hw = hardwareChannels[i]; if (s.ToString().Contains(TestObjectTemplateChannel.SEPARATOR)) { APILogger.Log("Skipped sensor [", s.ToString(), "] as it contains invalid characters for a non iso channel"); continue; } var mme = new MMEPossibleChannels(-1 * (1 + existingChannels.Count), "", "?", "?", "????", "??", "??", "??", "??", "?", s.FilterClassIso, "", "", 1, DateTime.Now, "NON ISO Channel", false, "", "", DateTime.Now, "Created", "", (int)MMEPossibleChannels.MMEChannelTypes.SQL); var totc = new TestObjectTemplateChannel(mme) { Required = true }; // FB5960 New channels "Channel Name" in Non-ISO Group editor should only include Channel Name // now also checks for duplicates var channelName = s.ToDisplayString(); if (null != displayNames && i < displayNames.Length) { channelName = displayNames[i]; } var idx = 2; while (existingNames.ContainsKey(channelName)) { channelName = $"{s.ToDisplayString()} {idx}"; idx++; } sensorToChannelName[s] = channelName; existingNames[channelName] = true; totc.SetDisplayText("", "", channelName); if (SensorConstants.IsTestSpecificDigitalOut(s.SerialNumber)) { totc.NameOfTheChannel = StringResources.SensorTableControl_DigitalOutputSetting; } var toc = new TestObjectChannel(totc, isoobj, /*ref db,*/ isoTemplate) { Required = true }; if (null != hw) { toc.HardwareId = hw.GetId(); } toc.SensorSerialNumber = s.SerialNumber; if (-1 == currentInsertPoint) { existingChannels.Add(toc); } else { existingChannels.Insert(insertAtRow, toc); insertAtRow++; } } for (var i = 0; i < existingChannels.Count; i++) { existingChannels[i].DisplayOrder = i; existingChannels[i].ChannelIdx = i; } isoobj.AllChannels = existingChannels.ToArray(); using (var e = sensorToChannelName.GetEnumerator()) { while (e.MoveNext()) { SetSensor(e.Current.Value, e.Current.Key); } } } public class CustomSort : IComparer { public int Compare(TestObjectChannel left, TestObjectChannel right) { if (left == right) { return 0; } if (null == left) { return 1; } if (null == right) { return -1; } if (left.Required) { if (right.Required) { return 0 == left.ChannelIdx.CompareTo(right.ChannelIdx) ? left.DisplayOrder.CompareTo(right.DisplayOrder) : left.ChannelIdx.CompareTo(right.ChannelIdx); } return -1; } if (right.Required) { return 1; } { return 0 == left.ChannelIdx.CompareTo(right.ChannelIdx) ? left.DisplayOrder.CompareTo(right.DisplayOrder) : left.ChannelIdx.CompareTo(right.ChannelIdx); } } } private string _lastModifiedBy = "N/A"; public string LastModifiedBy { get => _lastModifiedBy; set => SetProperty(ref _lastModifiedBy, value, Tags.LastModifiedBy.ToString()); } private DateTime _lastModified = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; public DateTime LastModified { get => _lastModified; set => SetProperty(ref _lastModified, value, Tags.LastModified.ToString()); } public string LastModifiedText => _lastModified.Year < 1900 ? "N/A" : $"{_lastModified.ToLongDateString()} {_lastModified.ToShortTimeString()}"; public void SetLastModified(DateTime time) { _lastModified = time; OnPropertyChanged(Tags.LastModifiedText.ToString()); } public string ChannelsDescription { get { if (null == _template) { return "N/A"; } var requiredChannels = 0; var reqs = (from c in _template.TemplateAllChannels where c.Required select c); requiredChannels = reqs.Count(); return string.Format(StringResources.TestObject_ChannelsDescription, _template.TemplateAllChannels.Length, requiredChannels); } } private TestObjectTemplate _template = null; public TestObjectTemplate Template { get => _template; set { if (value == _template) { return; } if (null == value) { _template = null; return; } if (GetISOTestObject().Template != value.TemplateName) { var db = ApplicationProperties.IsoDb; GetISOTestObject().SetTemplate(value.TemplateName, ref db); } SetProperty(ref _template, value, Tags.Template.ToString()); OnPropertyChanged(Tags.TemplateIndex.ToString()); OnPropertyChanged(Tags.ChannelsDescription.ToString()); OnPropertyChanged(Tags.LastModifiedText.ToString()); OnPropertyChanged(Tags.TemplateDescription.ToString()); OnPropertyChanged(Tags.TemplateImage.ToString()); OnPropertyChanged(Tags.Zones.ToString()); OnPropertyChanged(Tags.SelectedGlobalRangeCACOption.ToString()); } } public void SetTemplateDontResetISOObject(TestObjectTemplate value) { if (value == _template) { return; } if (null == value) { _template = null; return; } try { _isoTestObject?.SetTemplateOnly(value.TemplateName); } catch (Exception ex) { APILogger.Log(ex); } var db = ApplicationProperties.IsoDb; _template = null; SetProperty(ref _template, new TestObjectTemplate(value, ref db), Tags.Template.ToString()); OnPropertyChanged(Tags.TemplateIndex.ToString()); OnPropertyChanged(Tags.ChannelsDescription.ToString()); OnPropertyChanged(Tags.LastModifiedText.ToString()); OnPropertyChanged(Tags.TemplateDescription.ToString()); OnPropertyChanged(Tags.TemplateImage.ToString()); OnPropertyChanged(Tags.Zones.ToString()); OnPropertyChanged(Tags.SelectedGlobalRangeCACOption.ToString()); } public static DTS.Common.ISO.TestObject ReadXML(System.Xml.XmlElement node, Dictionary templatelookup, List calibrations, List sensors) { var testobject = new DTS.Common.ISO.TestObject(); foreach (var child in node.ChildNodes) { if (child is System.Xml.XmlElement) { ProcessXMLElement(child as System.Xml.XmlElement, ref testobject, templatelookup, calibrations, sensors); } } return testobject; } private static void ProcessXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObject testObject, Dictionary templatelookup, List calibrations, List sensors) { if (Enum.TryParse(node.Name, out DbOperations.TestSetups.TestObjectsFields field)) { switch (field) { case DbOperations.TestSetups.TestObjectsFields.LastModified: testObject.LastModified = DateTime.Parse(node.InnerText, CultureInfo.InvariantCulture); break; case DbOperations.TestSetups.TestObjectsFields.LastModifiedBy: testObject.LastModifiedBy = node.InnerText; break; case DbOperations.TestSetups.TestObjectsFields.LocalOnly: testObject.LocalOnly = Convert.ToBoolean(node.InnerText); break; case DbOperations.TestSetups.TestObjectsFields.ParentObject: testObject.ParentObject = node.InnerText; break; case DbOperations.TestSetups.TestObjectsFields.SerialNumber: testObject.SerialNumber = node.InnerText.Trim(); break; case DbOperations.TestSetups.TestObjectsFields.SysBuilt: testObject.SysBuilt = Convert.ToBoolean(node.InnerText); break; case DbOperations.TestSetups.TestObjectsFields.Embedded: testObject.Embedded = Convert.ToBoolean(node.InnerText); break; case DbOperations.TestSetups.TestObjectsFields.OriginalSerialNumber: testObject.OriginalSerialNumber = node.InnerText; break; case DbOperations.TestSetups.TestObjectsFields.OriginalTemplate: testObject.OriginalTemplate = node.InnerText; break; case DbOperations.TestSetups.TestObjectsFields.Template: { if (templatelookup.ContainsKey(node.InnerText.Trim())) { testObject.SetTemplate(templatelookup[node.InnerText.Trim()] /*, ref isodb*/); } else { var db = ApplicationProperties.IsoDb; var template = DTS.Common.ISO.TestObjectTemplate.GetTemplate(ref db, node.InnerText.Trim()); templatelookup[node.InnerText.Trim()] = template; testObject.SetTemplate(template); } } break; default: throw new NotSupportedException("TestObject::ProcessXMLElement unsupported field: " + field.ToString()); } } else if (node.Name == "HardwareList") { foreach (var child in node.ChildNodes) { if (child is System.Xml.XmlElement) { ProcessHardwareXMLElement(child as System.Xml.XmlElement, ref testObject); } } } else if (node.Name == "Sensors") { foreach (var child in node.ChildNodes) { if (child is System.Xml.XmlElement) { ProcessSensorXMLElement(child as System.Xml.XmlElement, ref testObject); } } } else if (node.Name == "ChannelSettings") { foreach (var child in node.ChildNodes) { ProcessChannelXMLElement(child as System.Xml.XmlElement, ref testObject, calibrations, sensors); } } } private static void ProcessHardwareXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObject testobject) { var hid = node.GetAttribute("Id"); node.GetAttribute("LocalOnly"); //note needed? var hids = new List(testobject.HardwareIds) { hid }; testobject.HardwareIds = hids.ToArray(); } private static void ProcessSensorXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObject testobject) { // var chId = node.GetAttribute("ChId").Trim(); var sId = node.GetAttribute("SId"); var hId = node.GetAttribute("HId"); node.GetAttribute("LocalOnly"); var ch = from c in testobject.AllChannels where c.GetId() == chId select c; if (!ch.Any()) return; ch.First().SensorSerialNumber = sId; ch.First().HardwareId = hId; } private static void ProcessChannelXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObject testobject, List calibrations, List sensors) { var chId = node.GetAttribute("ChId").Trim(); var sId = node.GetAttribute("SId"); var setting = node.GetAttribute("Setting"); //18861 When migrating from pre-2.0 add these settings var settingsDict = new Dictionary(); var zeroMethodString = SensorConstants.DefaultZeroMethodType.ToString(); var zeroMethodStartString = SensorConstants.DefaultZeroMethodStart.ToString(); var zeroMethodEndString = SensorConstants.DefaultZeroMethodEnd.ToString(); var userValue1String = string.Empty; var userValue2String = string.Empty; var userValue3String = string.Empty; var initialOffset = new InitialOffset(); var initialOffsetString = $"{initialOffset.Form},{initialOffset.EU},{initialOffset.MV}"; SensorCalibration sensorCalibration = calibrations.LastOrDefault(calibration => calibration.SerialNumber == sId); SensorData sensor = sensors.Find(s => s.SerialNumber == sId); if (sensorCalibration != null) { zeroMethodString = sensorCalibration.ZeroMethods.Methods.ToList().LastOrDefault().Method.ToString(); zeroMethodStartString = sensorCalibration.ZeroMethods.Methods.ToList().LastOrDefault().Start.ToString(); zeroMethodEndString = sensorCalibration.ZeroMethods.Methods.ToList().LastOrDefault().End.ToString(); userValue1String = sensor.UserValue1; userValue2String = sensor.UserValue2; userValue3String = sensor.UserValue3; initialOffset = sensorCalibration.InitialOffsets.Offsets.ToList().LastOrDefault(); initialOffsetString = $"{initialOffset.Form},{initialOffset.EU},{initialOffset.MV}"; } settingsDict[SensorConstants.SensorSettings.ZeroMethod.ToString()] = zeroMethodString; settingsDict[SensorConstants.SensorSettings.ZeroMethodStart.ToString()] = zeroMethodStartString; settingsDict[SensorConstants.SensorSettings.ZeroMethodEnd.ToString()] = zeroMethodEndString; settingsDict[SensorConstants.SensorSettings.UserValue1.ToString()] = userValue1String; settingsDict[SensorConstants.SensorSettings.UserValue2.ToString()] = userValue2String; settingsDict[SensorConstants.SensorSettings.UserValue3.ToString()] = userValue3String; settingsDict[SensorConstants.SensorSettings.InitialOffset.ToString()] = initialOffsetString; var allsettings = DTS.Common.ISO.TestObject.GetSettingsFromString(setting, sId, chId); foreach (var s in allsettings) { testobject.SetSensorSetting(chId, sId, s); } } public void WriteXML(ref System.Xml.XmlWriter writer) { writer.WriteStartElement("TestObject"); var isoTestObject = GetISOTestObject(); var fields = Enum.GetValues(typeof(DbOperations.TestSetups.TestObjectsFields)).Cast().ToArray(); foreach (var f in fields) { writer.WriteStartElement(f.ToString()); switch (f) { case DbOperations.TestSetups.TestObjectsFields.LastModified: writer.WriteString(isoTestObject.LastModified.ToString(CultureInfo.InvariantCulture)); break; case DbOperations.TestSetups.TestObjectsFields.LastModifiedBy: writer.WriteString(isoTestObject.LastModifiedBy); break; case DbOperations.TestSetups.TestObjectsFields.LocalOnly: writer.WriteString(isoTestObject.LocalOnly.ToString()); break; case DbOperations.TestSetups.TestObjectsFields.OriginalSerialNumber: writer.WriteString(isoTestObject.OriginalSerialNumber); break; case DbOperations.TestSetups.TestObjectsFields.OriginalTemplate: writer.WriteString(isoTestObject.OriginalTemplate); break; case DbOperations.TestSetups.TestObjectsFields.Embedded: writer.WriteString(isoTestObject.Embedded.ToString(CultureInfo.InvariantCulture)); break; case DbOperations.TestSetups.TestObjectsFields.ParentObject: writer.WriteString(ParentObject ?? ""); break; case DbOperations.TestSetups.TestObjectsFields.SerialNumber: writer.WriteString(SerialNumber.Trim()); break; case DbOperations.TestSetups.TestObjectsFields.SysBuilt: writer.WriteString(SysBuilt.ToString()); break; case DbOperations.TestSetups.TestObjectsFields.Template: writer.WriteString((null != Template) ? Template.TemplateName.Trim() : ""); break; default: throw new NotSupportedException("TestObject::WriteXML unsupported field: " + f.ToString()); } writer.WriteEndElement(); //f.ToString() } writer.WriteStartElement("HardwareList"); foreach (var h in Hardware) { var isoh = h.GetHardware(); writer.WriteStartElement("Hardware"); writer.WriteAttributeString("Id", isoh.GetId()); writer.WriteAttributeString("LocalOnly", h.LocalOnly.ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); //hardwarelist writer.WriteStartElement("Sensors"); foreach (var ch in isoTestObject.AllChannels) { if (!ch.Required || string.IsNullOrEmpty(ch.SensorSerialNumber)) continue; writer.WriteStartElement("Sensor"); writer.WriteAttributeString("ChId", ch.GetId().Trim()); writer.WriteAttributeString("SId", ch.SensorSerialNumber); writer.WriteAttributeString("HId", ch.HardwareId); writer.WriteAttributeString("LocalOnly", ch.LocalOnly.ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteStartElement("ChannelSettings"); foreach (var ch in isoTestObject.AllChannels) { if (!ch.Required || string.IsNullOrWhiteSpace(ch.SensorSerialNumber)) continue; var settings = isoTestObject.GetSensorSettings(ch.Name, ch.SensorSerialNumber); if (null == settings || settings.Length <= 0) continue; writer.WriteStartElement("ChannelSetting"); writer.WriteAttributeString("ChId", ch.GetId()); writer.WriteAttributeString("SId", ch.SensorSerialNumber); writer.WriteAttributeString("Setting", isoTestObject.GetSerializedSetting(settings)); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndElement(); //testobject } public string TemplateType => null == Template ? "" : Template.TestObjectType; public bool LocalOnly { get; } = false; private DTS.Common.ISO.TestObject _isoTestObject = null; public TestObject(DTS.Common.ISO.TestObject to, bool sysBuilt, TestObjectTemplate template, Dictionary includedHardware) { var db = ApplicationProperties.IsoDb; _isoTestObject = new DTS.Common.ISO.TestObject(to, ref db); SerialNumber = to.SerialNumber; Template = template; _isoTestObject = to; if (sysBuilt) { SerialNumberConverted = to.TextL1; TestObjectType = to.TestObjectType; SysBuilt = true; } LocalOnly = to.LocalOnly; _lastModifiedBy = to.LastModifiedBy; _lastModified = to.LastModified; foreach (var id in to.HardwareIds) { if (includedHardware.ContainsKey(id)) { if (!ContainsHardware(includedHardware[id])) { AddHardware(includedHardware[id]); } } else { var da = DASHardwareList.GetList().GetHardware(id); if (null != da && !ContainsHardware(da)) { AddHardware(da); } } } } private Visibility _channelVisibility = Visibility.Visible; public Visibility ChannelVisibility { get => _channelVisibility; set => SetProperty(ref _channelVisibility, value, Tags.ChannelVisibility.ToString()); } public override string ToString() { var sb = new StringBuilder(); if (string.IsNullOrWhiteSpace(TemplateDescription)) { sb.Append(SerialNumberOrOriginalSerialNumber); } else { sb.AppendFormat("{0} - {1}", SerialNumberOrOriginalSerialNumber, TemplateDescription); } return sb.ToString(); } } }