using System; using System.Collections.Generic; using System.Globalization; using System.Linq; namespace DatabaseExport { public class TestObject : DbTimeStampBase, IComparable { public override string LookupTable => DbOperations.TestSetups.TestObjectsTable; public override ConstraintHelper[] GetConstraints() { return new[] { new ConstraintHelper { ColumnName = DbOperations.TestSetups.TestObjectsFields.SerialNumber.ToString(), DbType = System.Data.SqlDbType.NVarChar, DbValue = SerialNumber } }; } public void RefreshHardware() { SetHardwareFromISO(); } public enum Tags { SerialNumber, SerialNumberConverted, TestObjectType, ParentObject, SysBuilt, Channels, Hardware, LastModifiedBy, LastModifiedText, AllTemplates, Template, TemplateIndex, ChannelsDescription, TemplateDescription, TemplateImage, Zones, SelectedGlobalRangeCACOption, ZoneNames, CurrentZone, CurrentZoneIndex, ChannelVisibility, ChannelTypesIndex } /// /// dirty controls whether _isComplete is valid or not /// if Dirty is true then _isComplete is not valid /// IsComplete will actually calculate this value /// public bool IsDirty { get; set; } = true; public int CompareTo(TestObject rhs) { if (null == rhs) { return 1; } return rhs == this ? 0 : SerialNumber.CompareTo(rhs.SerialNumber); } /// /// returns the iso support level of the group /// /// public SerializedSettings.ISOSupportLevels GetObjectISOLevel() { if (TemplateType.Contains(TestObjectTemplate.NON_ISO_TESTOBJECT_CHANNEL_TYPE) || TemplateType.Contains(TestObjectTemplateChannel.NONISOCHANNELTYPE)) { return SerializedSettings.ISOSupportLevels.NO_ISO; } return SerializedSettings.ISOSupportLevels.ISO_ONLY; } public SensorData GetSensor(string ChannelId, string serialNumber) { var sd = SensorsCollection.SensorsList.GetSensorBySerialNumber(serialNumber); if (null == sd) { return null; } sd = new SensorData(sd); var settings = GetISOTestObject().GetSensorSettings(ChannelId, 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 ISO.TestObject.SensorSettings.CFC: sd.FilterClassIso = setting.Value; switch (sd.FilterClassIso) { case "A": sd.Filter = new FilterClass(FilterClass.FilterClassType.CFC1000); break; case "B": sd.Filter = new FilterClass(FilterClass.FilterClassType.CFC600); break; case "C": sd.Filter = new FilterClass(FilterClass.FilterClassType.CFC180); break; case "D": sd.Filter = new FilterClass(FilterClass.FilterClassType.CFC60); break; case "P": sd.Filter = new FilterClass(FilterClass.FilterClassType.None); break; case "S": //FB 13120 Adhoc filter class sd.Filter = new FilterClass(FilterClass.FilterClassType.AdHoc); break; } break; case ISO.TestObject.SensorSettings.Position: sd.Position = setting.Value; break; case ISO.TestObject.SensorSettings.Polarity: sd.Invert = setting.Value == "-"; break; case ISO.TestObject.SensorSettings.Range: sd.Capacity = double.Parse(setting.Value, CultureInfo.InvariantCulture); break; case ISO.TestObject.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 ISO.TestObject.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 ISO.TestObject.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 ISO.TestObject.SensorSettings.OutputMode: if (!string.IsNullOrWhiteSpace(setting.Value)) { int iValue; if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out iValue)) { sd.DigitalOutputMode = (OutputTOMDigitalChannel.DigitalOutputMode)iValue; } } break; case ISO.TestObject.SensorSettings.SQMode: if (!string.IsNullOrWhiteSpace(setting.Value)) { int iValue; if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out iValue)) { sd.SquibFireMode = (OutputSquibChannel.SquibFireMode)iValue; } } break; case ISO.TestObject.SensorSettings.DIMode: if (!string.IsNullOrWhiteSpace(setting.Value)) { int iValue; if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out iValue)) { sd.InputMode = (DigitalInputScaleMultiplier.InputModes)iValue; } } break; case ISO.TestObject.SensorSettings.DefaultValue: if (!string.IsNullOrWhiteSpace(setting.Value)) { if (double.TryParse(setting.Value, out var defaultValue)) { sd.ScaleMultiplier.DefaultValue = defaultValue; } } break; case ISO.TestObject.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(ISO.TestObject.SensorSettings)).Cast().ToArray(); foreach (var field in fields) { var value = ""; switch (field) { case ISO.TestObject.SensorSettings.CFC: value = sensor.FilterClassIso; break; case ISO.TestObject.SensorSettings.Position: value = sensor.Position; break; case ISO.TestObject.SensorSettings.Polarity: value = sensor.Invert ? "-" : "+"; break; case ISO.TestObject.SensorSettings.Range: value = sensor.Capacity.ToString(CultureInfo.InvariantCulture); break; case ISO.TestObject.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 ISO.TestObject.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 ISO.TestObject.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 ISO.TestObject.SensorSettings.OutputMode: value = ((int)sensor.DigitalOutputMode).ToString(CultureInfo.InvariantCulture); break; case ISO.TestObject.SensorSettings.SQMode: value = ((int)sensor.SquibFireMode).ToString(CultureInfo.InvariantCulture); break; case ISO.TestObject.SensorSettings.DIMode: value = ((int)sensor.InputMode).ToString(CultureInfo.InvariantCulture); break; case ISO.TestObject.SensorSettings.DefaultValue: value = sensor.ScaleMultiplier.DefaultValue.ToString(CultureInfo.InvariantCulture); break; case ISO.TestObject.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 ISO.TestObject.SensorSetting(field, value, channelName, sensor.SerialNumber)); } foreach (var setting in settings) { GetISOTestObject().SetSensorSetting(channelName, sensor.SerialNumber, setting); } } public TestObject() { //PopulateTemplates(); _isoTestObject = new 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 = ISO13499FileDb.IsoDb; _isoTestObject = new ISO.TestObject(copy.GetISOTestObject(), ref db); SerialNumber = copy.SerialNumber; if (null != copy.Template) { var tot = new TestObjectTemplate(copy.Template, ref db); SetTemplateDontResetISOObject(tot); } var copyISOTO = copy.GetISOTestObject(); var ISOTO = GetISOTestObject(); var hardware = new List(); foreach (var das in copy.Hardware) { hardware.Add(new DASHardware(das, null)); } foreach (var h in hardware) { _hardware.Add(h.SerialNumber, h); } ParentObject = copy.ParentObject; SysBuilt = copy.SysBuilt; if (SysBuilt) { _isoTestObject.SerialNumberConverted = copy.SerialNumberConverted; } } public TestObject(TestObject copy) { Initialize(copy); DbTimeStamp = copy.DbTimeStamp; } 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 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 { IsDirty = true; 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); } public void SetHardwareFromISO() { _hardware.Clear(); var isoTO = GetISOTestObject(); foreach (var hid in isoTO.HardwareIds) { var h = DASHardwareList.GetList().GetHardware(hid); if (null == h) { continue; } //just making sure we have a copy and not the original hardware record. h = new DASHardware(h.GetHardware()); h.SetTimeStampMemory(h.GetTimeStampMemory()); if (!_hardware.ContainsKey(h.SerialNumber)) { _hardware[h.SerialNumber] = h; } } } /// /// 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) { var stamp = hardware.GetTimeStampMemory(); //just making sure we have a copy and not the original hardware record hardware = new DASHardware(hardware.GetHardware()); hardware.SetTimeStampMemory(stamp); IsDirty = true; var toAdd = hardware; if (hardware.IsDummy()) { var key = hardware.SerialNumber; if (_hardware.ContainsKey(key)) { var current = 1; while (_hardware.ContainsKey(key)) { current++; key = string.Format("{0}({1:00})", hardware.SerialNumber, current); } toAdd = new DASHardware(hardware.GetHardware()); toAdd.SetTimeStampMemory(hardware.GetTimeStampMemory()); toAdd.SerialNumber = key; } else { toAdd = new DASHardware(hardware.GetHardware()); toAdd.SetTimeStampMemory(hardware.GetTimeStampMemory()); } } else { toAdd = new DASHardware(hardware.GetHardware()); toAdd.SetTimeStampMemory(hardware.GetTimeStampMemory()); } if (_hardware.ContainsKey(toAdd.SerialNumber)) { return; } _hardware.Add(toAdd.SerialNumber, toAdd); //toAdd.PropertyChanged += addedHardware_PropertyChanged; OnPropertyChanged(Tags.Hardware.ToString()); var hids = new List(); foreach (var h in Hardware) { hids.Add(h.GetHardware().GetId()); } _isoTestObject.HardwareIds = hids.ToArray(); } public ISO.TestObject GetISOTestObject() { return _isoTestObject; } private TestObjectTemplate _template = null; public TestObjectTemplate Template { get => _template; set { if (value == _template) { return; } if (null == value) { _template = value; return; } if (GetISOTestObject().Template != value.TemplateName) { var db = ISO13499FileDb.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()); var zoneNames = new List(); foreach (var z in Template.TemplateZones) { zoneNames.Add(z.Name); } ZoneNames = zoneNames.ToArray(); } } public void SetTemplateDontResetISOObject(TestObjectTemplate value) { if (value == _template) { return; } if (null == value) { _template = value; return; } try { _isoTestObject?.SetTemplateOnly(value.TemplateName); } catch (Exception) { } var db = ISO13499FileDb.IsoDb; 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()); var zoneNames = new List(); foreach (var z in value.TemplateZones) { zoneNames.Add(z.Name); } ZoneNames = zoneNames.ToArray(); } public Dictionary GetValues() { var elementNameValuePairs = new Dictionary(); var isoTestObject = GetISOTestObject(); elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.SerialNumber.ToString()] = SerialNumber; elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.LastModifiedBy.ToString()] = isoTestObject.LastModifiedBy; elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.LastModified.ToString()] = isoTestObject.LastModified.ToString(CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.Template.ToString()] = (null != Template) ? Template.TemplateName : ""; elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.LocalOnly.ToString()] = isoTestObject.LocalOnly.ToString(); elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.ParentObject.ToString()] = ParentObject ?? ""; elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.SysBuilt.ToString()] = SysBuilt.ToString(); elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.Embedded.ToString()] = isoTestObject.Embedded.ToString(CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.OriginalTemplate.ToString()] = isoTestObject.OriginalTemplate; elementNameValuePairs[DbOperations.TestSetups.TestObjectsFields.OriginalSerialNumber.ToString()] = isoTestObject.OriginalSerialNumber; return elementNameValuePairs; } private List _zoneNames = new List(); public string[] ZoneNames { get => _zoneNames.ToArray(); set => SetProperty(ref _zoneNames, new List(value), Tags.ZoneNames.ToString()); } public string TemplateType => null == Template ? "" : Template.TestObjectType; public bool LocalOnly { get; } = false; private ISO.TestObject _isoTestObject = null; public TestObject(ISO.TestObject to, bool sysBuilt) { //PopulateTemplates(); _isoTestObject = to; SerialNumber = to.SerialNumber; if (sysBuilt) { SerialNumberConverted = to.SerialNumber.Remove(0, SerialNumber.LastIndexOf('_') + 1); if (to.Template == "SysBuilt_(no channels)") // add to string resources this whole thing not needed anymore? { Template = TestObjectTemplateCollection.TemplateCollection.SysBuiltTestObjectTemplate; } else { Template = TestObjectTemplateCollection.TemplateCollection.GetTemplate(to.Template); } TestObjectType = to.TestObjectType; SysBuilt = true; } else { Template = TestObjectTemplateCollection.TemplateCollection.GetTemplate(to.Template); } LocalOnly = to.LocalOnly; foreach (var id in to.HardwareIds) { DASHardware da = null; try { da = DASHardwareList.GetList().GetHardware(id); } catch (Exception) { //DTS.Utilities.Logging.APILogger.Log(ex); } if (null != da && !ContainsHardware(da)) { AddHardware(da); } } } } }