using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace DatabaseExport { public class TestTemplate : TagAwareBase, IComparable { /// /// returns true whenever the test template is a quick test setup, false otherwise /// public bool QuickSensorCheck { get; set; } public const string NON_ISO_INTERNAL_GROUP_NAME = "[NONE]"; private const int MaxRealtimeChannels = 6; private const int MaxErrorsToDisplay = 5; internal List _calculatedChannels = new List(); private readonly List _channelKeysInOrder = new List(); private readonly List _hardwareChannelsInOrder = new List(); private string _errorMessage = ""; /// /// dictionary of harware overrides for the test /// key is hardware id /// if present, then value is whether the hardware is included or removed from the test. /// internal Dictionary _hardwareOverrides = new Dictionary(); /// /// cache of sensors for the test setup /// this keeps us from having to lookup sensors and apply changes every time we need to use them /// public Dictionary>> _sensorLookup = new Dictionary>>(); private readonly Dictionary _dasChannelNumberToAbsoluteNumber = null; private readonly Dictionary _dasSettings = new Dictionary(); public DASSettings[] DASSettings { get => _dasSettings.Count < 1 ? new DASSettings[0] : _dasSettings.Values.ToArray(); set { _dasSettings.Clear(); foreach (var setting in value) { _dasSettings[setting.DASSerialNumber] = setting; } } } /// /// whether to upload data after data collection is completed /// this lets you separate out the time consumptive network data tasks from the ones you want to keep fast (export/view) /// private bool _uploadData = Properties.Settings.Default.DefaultUploadEnabled; public bool UploadData { get => _uploadData; set => SetProperty(ref _uploadData, value, TestTemplateTags.UploadData.ToString()); } /// /// folder to upload to /// private string _uploadFolder = ""; public string UploadFolder { get => _uploadFolder; set => SetProperty(ref _uploadFolder, value, TestTemplateTags.UploadFolder.ToString()); } /// /// whether all units in the test share a common line /// this should be set to false if DAS in the test don't share a common line /// the default is true /// if units share a common status line and there are multiple units in the test, then each unit will monitor the status line /// if false or there's only one unit, the status line should not be monitored /// private bool _bCommonLine = SerializedSettings.TestSetupDefaultCommonStatusLine; public bool CommonLine { get => _bCommonLine; set => SetProperty(ref _bCommonLine, value, TestTemplateTags.CommonLine.ToString()); } /// /// true if the test objects and other fields have already been loaded from the database, false otherwise /// internal bool _bIsLoaded = false; public bool IsLoaded => _bIsLoaded; /// /// when true the expectation is that any unit that can have a battery will have a battery, and the user should be warned /// whenever a unit that should have a battery does not have an acceptable battery voltage /// private bool _warnOnFailedBattery = SerializedSettings.TestSetupDefaultWarnOnBatteryFail; public bool WarnOnFailedBattery { get => _warnOnFailedBattery; set => SetProperty(ref _warnOnFailedBattery, value, TestTemplateTags.WarnOnFailedBattery.ToString()); } public string CompletionErrorMessage => _errorMessage.Length > 250 ? _errorMessage.Substring(0, 250) : _errorMessage; /// /// returns whether the test setup is complete or not. /// WILL FORCE IsComplete TO BE CALCULATED IF IsDirty is true /// (you might not want this if you are adding a new test setup for instance...) /// public bool IsComplete { get { if (string.IsNullOrWhiteSpace(Name)) { return false; } //TODO: review property functionality if (IsDirty) { CalculateIsComplete(); } return _testTemplateLite.IsComplete; } set => _testTemplateLite.IsComplete = value; } /// /// returns whether the test setup is dirty or not (whether the is complete is calculated already or not) /// private bool _bIsDirty = true; public bool IsDirty { get => _bIsDirty; set => _bIsDirty = value; } private readonly Dictionary _filterLookup = new Dictionary(); private List _testGraphs = new List(); public TestGraph[] TestGraphs { get => _testGraphs.ToArray(); set { SetProperty(ref _testGraphs, new List(value), TestTemplateTags.TestGraphs.ToString()); OnPropertyChanged(TestTemplateTags.GraphCount.ToString()); } } private readonly TestTemplateLite _testTemplateLite = new TestTemplateLite(); public string Name { get => _testTemplateLite.Name; set { _testTemplateLite.Name = value; OnPropertyChanged(TestTemplateTags.Name.ToString()); } } private bool _bAllowMissingSensors = Properties.Settings.Default.DefaultTestAllowMissingSensors; public bool AllowMissingSensors { get => _bAllowMissingSensors; set => SetProperty(ref _bAllowMissingSensors, value, TestTemplateTags.AllowMissingSensors.ToString()); } private bool _bAllowSensorIdToBlankChannel = Properties.Settings.Default.DefaultTestAllowSensorIdToBlankChannel; public bool AllowSensorIdToBlankChannel { get => _bAllowSensorIdToBlankChannel; set => SetProperty(ref _bAllowSensorIdToBlankChannel, value, TestTemplateTags.AllowSensorIdToBlankChannel.ToString()); } private bool _bAutomaticProgression = SerializedSettings.TestSetupAutomaticMode; //Properties.Settings.Default.DefaultTestAutomaticProgression public bool AutomaticProgression { get => _bAutomaticProgression; set => SetProperty(ref _bAutomaticProgression, value, TestTemplateTags.AutomaticProgression.ToString()); } private int _automaticProgressionDelayMs = SerializedSettings.TestSetupAutomaticProgressDelayMS; public int AutomaticProgressionDelayMS { get => _automaticProgressionDelayMs; set => SetProperty(ref _automaticProgressionDelayMs, value, TestTemplateTags.AutomaticProgressionDelayMS.ToString()); } private bool _invertTriggerCompletion; public bool InvertTriggerCompletion { get => _invertTriggerCompletion; set => SetProperty(ref _invertTriggerCompletion, value, TestTemplateTags.InvertTriggerCompletion.ToString()); } private bool _triggerCheckStep = Properties.Settings.Default.DefaultTestTriggerCheckStep; public bool TriggerCheckStep { get => _triggerCheckStep; set => SetProperty(ref _triggerCheckStep, value, TestTemplateTags.TriggerCheckStep.ToString()); } private int _postTestDiagnosticsLevel = Properties.Settings.Default.DefaultTestRunPostTestDiagnostics ? 255 : 0; public bool PostTestDiagnosticsLevel { get => _postTestDiagnosticsLevel != 0; set { if (value) { SetProperty(ref _postTestDiagnosticsLevel, 255, TestTemplateTags.PostTestDiagnostics.ToString()); } else { SetProperty(ref _postTestDiagnosticsLevel, 0, TestTemplateTags.PostTestDiagnostics.ToString()); } } } private bool _triggerCheckRealtime; public bool TriggerCheckRealtime { get => _triggerCheckRealtime; set => SetProperty(ref _triggerCheckRealtime, value, TestTemplateTags.TriggerCheckRealtime.ToString()); } private bool _invertStartRecordCompletion; public bool InvertStartRecordCompletion { get => _invertStartRecordCompletion; set => SetProperty(ref _invertStartRecordCompletion, value, TestTemplateTags.InvertStartRecordCompletion.ToString()); } private bool _bViewDiagnostics = true; public bool ViewDiagnostics { get => _bViewDiagnostics; set => SetProperty(ref _bViewDiagnostics, value, TestTemplateTags.ViewDiagnostics.ToString()); } private bool _bVerify = true; public bool VerifyChannels { get => _bVerify; set => SetProperty(ref _bVerify, value, TestTemplateTags.VerifyChannels.ToString()); } private bool _bAutoVerifyChannels = true; public bool AutoVerifyChannels { get => _bAutoVerifyChannels; set => SetProperty(ref _bAutoVerifyChannels, value, TestTemplateTags.AutoVerifyProgress.ToString()); } private double _autoVerifyDelay = 2D; public double AutoVerifyDelaySeconds { get => _autoVerifyDelay; set => SetProperty(ref _autoVerifyDelay, value, TestTemplateTags.AutoVerifyDelaySeconds.ToString()); } private bool _bUseCustomerDetails; public bool UseCustomerDetails { get => _bUseCustomerDetails; set => SetProperty(ref _bUseCustomerDetails, value, TestTemplateTags.UseCustomerDetails.ToString()); } private bool _bUseTestEngineerDetails; public bool UseTestEngineerDetails { get => _bUseTestEngineerDetails; set => SetProperty(ref _bUseTestEngineerDetails, value, TestTemplateTags.UseTestEngineerDetails.ToString()); } private bool _bTurnOffExcitation = true; public bool TurnOffExcitation { get => _bTurnOffExcitation; set => SetProperty(ref _bTurnOffExcitation, value, TestTemplateTags.TurnOffExcitation.ToString()); } private bool _bUseLabratoryDetails; public bool UseLabratoryDetails { get => _bUseLabratoryDetails; set => SetProperty(ref _bUseLabratoryDetails, value, TestTemplateTags.UseLabratoryDetails.ToString()); } private bool _localOnly; public bool LocalOnly { get => _localOnly; set => SetProperty(ref _localOnly, value, TestTemplateTags.LocalOnly.ToString()); } public DateTime LastModified { get => _testTemplateLite.LastModified; set { _testTemplateLite.LastModified = value; OnPropertyChanged(TestTemplateTags.LastModified.ToString()); } } public string LastModifiedBy { get => _testTemplateLite.LastModifiedBy; set { _testTemplateLite.LastModifiedBy = value; OnPropertyChanged(TestTemplateTags.LastMmodifiedBy.ToString()); } } public string Description { get => _testTemplateLite.Description; set { _testTemplateLite.Description = value; OnPropertyChanged(TestTemplateTags.Description.ToString()); } } private double _samplesPerSecond = Properties.Settings.Default.DefaultTestSampleRate; public double SamplesPerSecond { get => _samplesPerSecond; set { SetProperty(ref _samplesPerSecond, value, TestTemplateTags.SamplesPerSecond.ToString()); OnPropertyChanged(TestTemplateTags.SampleRateText.ToString()); } } public double PreTriggerSeconds { get => _testTemplateLite.PreTriggerSeconds; set { _testTemplateLite.PreTriggerSeconds = value; OnPropertyChanged(TestTemplateTags.PreTriggerSeconds.ToString()); } } public double PostTriggerSeconds { get => _testTemplateLite.PostTriggerSeconds; set { _testTemplateLite.PostTriggerSeconds = value; OnPropertyChanged(TestTemplateTags.PostTriggerSeconds.ToString()); } } private string _isfFile = ""; public string ISFFile { get => _isfFile; set => SetProperty(ref _isfFile, value, TestTemplateTags.ISFFile.ToString()); } private bool _doAutoArm = false; public bool DoAutoArm { get => _doAutoArm; set => SetProperty(ref _doAutoArm, value, TestTemplateTags.DoAutoArm.ToString()); } private bool _doStreaming = false; public bool DoStreaming { get => _doStreaming; set => SetProperty(ref _doStreaming, value, TestTemplateTags.DoStreaming.ToString()); } /// /// CheckoutMode means a non destructive data collection /// squib fires will only occur internally /// private bool _checkoutMode = false; public bool CheckoutMode { get => _checkoutMode; set => SetProperty(ref _checkoutMode, value, TestTemplateTags.CheckoutMode.ToString()); } /// /// QuitTestWithoutWarning flag will suppress warnings on exit /// see: 7509 add option to Quit Test Without Warning /// private bool _quitTestWithoutWarning = Properties.Settings.Default.DefaultTestQuitTestWithoutWarning; public bool QuitTestWithoutWarning { get => _quitTestWithoutWarning; set => SetProperty(ref _quitTestWithoutWarning, value, TestTemplateTags.QuitTestWithoutWarning.ToString()); } /// /// SuppressMissingSensorsWarning flag will suppress missing sensors warnings /// see: 8877 Suppress modal warning in checkout mode for missing sensors. /// private bool _suppressMissingSensorsWarning = Properties.Settings.Default.DefaultSuppressMissingSensorsWarning; public bool SuppressMissingSensorsWarning { get => _suppressMissingSensorsWarning; set => SetProperty(ref _suppressMissingSensorsWarning, value, TestTemplateTags.SuppressMissingSensorsWarning.ToString()); } /// /// suppress warnings on exit /// see: 7642 add two test setup option to suppress "not all channels have been viewed" warnings in both real-time and viewer. /// private bool _notAllChannelsRealTime = Properties.Settings.Default.DefaultTestSuppressNotAllChannelsViewedWarningRealTime; public bool NotAllChannelsRealTime { get => _notAllChannelsRealTime; set => SetProperty(ref _notAllChannelsRealTime, value, TestTemplateTags.NotAllChannelsRealTime.ToString()); } /// /// suppress warnings on exit /// see: 7642 add two test setup option to suppress "not all channels have been viewed" warnings in both real-time and viewer. /// private bool _notAllChannelsViewer = Properties.Settings.Default.DefaultTestSuppressNotAllChannelsViewedWarningViewer; public bool NotAllChannelsViewer { get => _notAllChannelsViewer; set => SetProperty(ref _notAllChannelsViewer, value, TestTemplateTags.NotAllChannelsViewer.ToString()); } public RecordingModes RecordingMode { get => _testTemplateLite.RecordingMode; set { if (value != _testTemplateLite.RecordingMode) { _testTemplateLite.RecordingMode = value; OnPropertyChanged(TestTemplateTags.RecordingMode.ToString()); OnPropertyChanged(TestTemplateTags.RecordingModeText.ToString()); } } } private bool _bStrictDiagnostics = Properties.Settings.Default.DefaultTestRequireAllUnitsPassDiagnostics; public bool StrictDiagnostics { get => _bStrictDiagnostics; set => SetProperty(ref _bStrictDiagnostics, value, TestTemplateTags.StrictDiagnostics.ToString()); } private readonly List _checkedDASList = new List(); public TestTestObject[] TestObjectsWithChannels { get { var list = new List(_testObjects); for (var i = list.Count - 1; i >= 0; i--) { var isoTO = list[i].GetISOTestObject(); if (0 == isoTO.AllChannels.Length) { list.RemoveAt(i); } } return list.ToArray(); } } public List TestObjectsAndAddedGroupsList = new List(); public TestObject[] TestObjectsAndAddedGroups => TestObjectsAndAddedGroupsList.ToArray(); private List _testObjects = new List(); public TestTestObject[] TestObjects { get => _testObjects.ToArray(); set => SetTestObjects(false, value); } private List _addedGroups = new List(); public TestTestObject[] AddedGroups { get => _addedGroups.ToArray(); set { //MarkIsCompleteUnchecked(); Removed to fix FB 10241 with the assumption that simply Setting AddedGroups should not cause a database write. SetProperty(ref _addedGroups, new List(value), TestTemplateTags.SysBuiltTestObjectTypes.ToString()); OnPropertyChanged(TestTemplateTags.AllTestObjects.ToString());//check this OnPropertyChanged("TestObjectsAndAddedGroups"); OnPropertyChanged(TestTemplateTags.TestObjectsAndAddedGroups.ToString()); } } private bool _bRequireUserConfirmationOnErrors = Properties.Settings.Default.DefaultTestRequireUserConfirmationOnErrors; public bool RequireUserConfirmationOnErrors { get => _bRequireUserConfirmationOnErrors; set => SetProperty(ref _bRequireUserConfirmationOnErrors, value, TestTemplateTags.RequireUserConfirmationOnErrors.ToString()); } private bool _ROIDownload = Properties.Settings.Default.DefaultTestDownloadROI; public bool DoROIDownload { get => _ROIDownload; set { SetProperty(ref _ROIDownload, value, TestTemplateTags.DoROIDownload.ToString()); OnPropertyChanged(TestTemplateTags.ROIButtonVisibility.ToString()); } } private bool _ROIDownloadView = Properties.Settings.Default.DefaultTestViewROI; public bool ViewROIDownload { get => _ROIDownloadView; set { SetProperty(ref _ROIDownloadView, value, TestTemplateTags.ViewROIDownload.ToString()); OnPropertyChanged(TestTemplateTags.ViewROIDownloadButtonVisibility.ToString()); } } private bool _DownloadAll = Properties.Settings.Default.DefaultTestDownloadAll; public bool DownloadAll { get => _DownloadAll; set { SetProperty(ref _DownloadAll, value, TestTemplateTags.DownloadAll.ToString()); OnPropertyChanged(TestTemplateTags.DownloadAllButtonVisibility.ToString()); } } private bool _ViewRealtime = Properties.Settings.Default.DefaultTestViewAll; public bool ViewRealtime { get => 0 != GetNumberOfRealtimeSupportedChannels() && _ViewRealtime; set { SetProperty(ref _ViewRealtime, value, TestTemplateTags.ViewRealtime.ToString()); OnPropertyChanged(TestTemplateTags.ViewRealtime.ToString()); } } private double _roiStart = Properties.Settings.Default.DefaultTestROIStart; public double ROIStart { get => _roiStart; set => SetProperty(ref _roiStart, value, TestTemplateTags.ROIStart.ToString()); } private double _roiEnd = Properties.Settings.Default.DefaultTestROIEnd; public double ROIEnd { get => _roiEnd; set => SetProperty(ref _roiEnd, value, TestTemplateTags.ROIEnd.ToString()); } private bool _viewDownloadAll = Properties.Settings.Default.DefaultTestViewAll; public bool ViewDownloadAll { get => _viewDownloadAll; set { SetProperty(ref _viewDownloadAll, value, TestTemplateTags.ViewDownloadAll.ToString()); OnPropertyChanged(TestTemplateTags.ViewDownloadAllButtonVisibility.ToString()); } } private bool _viewExport = Properties.Settings.Default.DefaultTestExport; public bool ViewExport { get => _viewExport; set { SetProperty(ref _viewExport, value, TestTemplateTags.ViewExport.ToString()); OnPropertyChanged(TestTemplateTags.ViewExportButtonVisibility.ToString()); } } private SupportedExportFormatBitFlags _exportFormats = (SupportedExportFormatBitFlags)Properties.Settings.Default.DefaultTestExportFormat; public SupportedExportFormatBitFlags ExportFormats { get => _exportFormats; set => SetProperty(ref _exportFormats, value, TestTemplateTags.ExportFormats.ToString()); } private string _downloadFolder = Properties.Settings.Default.DownloadFolder; public string DownloadFolder { get => _downloadFolder; set => SetProperty(ref _downloadFolder, value, TestTemplateTags.DownloadFolder.ToString()); } private string _exportFolder = Properties.Settings.Default.DownloadFolder; public string ExportFolder { get => _exportFolder; set => SetProperty(ref _exportFolder, value, TestTemplateTags.ExportFolder.ToString()); } private bool _sameAsDownloadFolder = true; public bool SameAsDownloadFolder { get => _sameAsDownloadFolder; set => SetProperty(ref _sameAsDownloadFolder, value, TestTemplateTags.SameAsDownloadFolder.ToString()); } private LabratoryDetails _labDetails = null; public LabratoryDetails LabDetails { get => _labDetails; set => SetProperty(ref _labDetails, value, TestTemplateTags.LabDetails.ToString()); } private CustomerDetails _customerDetails = null; public CustomerDetails CustomerDetails { get => _customerDetails; set => SetProperty(ref _customerDetails, value, TestTemplateTags.CustomerDetails.ToString()); } private TestEngineerDetails _testEngineerDetails = null; public TestEngineerDetails TestEngineerDetails { get => _testEngineerDetails; set => SetProperty(ref _testEngineerDetails, value, TestTemplateTags.TestEngineerDetails.ToString()); } private int _defaultNumberRealtimeGraphs = Properties.Settings.Default.DefaultTestRealtimeModeGraphCount; public int DefaultNumberRealtimeGraphs { get { switch (_defaultNumberRealtimeGraphs) { case 6: return 6; case 3: return 3; case 1: default: return 1; } } set { switch (value) { case 6: _defaultNumberRealtimeGraphs = value; break; case 3: _defaultNumberRealtimeGraphs = value; break; case 1: default: _defaultNumberRealtimeGraphs = value; break; } OnPropertyChanged(TestTemplateTags.DefaultNumberRealtimeGraphs.ToString()); } } public override ConstraintHelper[] GetConstraints() { return new[] { new ConstraintHelper() { ColumnName = DbOperations.TestSetups.Fields.SetupName.ToString(), DbType = SqlDbType.NVarChar, DbValue = Name } }; } public override string LookupTable => DbOperations.TestSetups.TestSetupsTable; /// /// this is a brave new world, this is the hardware for this test. /// now groups in this test setup may have hardware assigned, or no hardware assigned /// we'll take that if we find it, but then we'll also check a list we have for the test itself and intersect the two /// we then modify the groups IN MEMORY and change their hardware to match all hardware officially in the test /// /// public void ApplyHardwareOverrides() { //for now don't do anything if the test setup is non iso var hardwareInTest = new Dictionary(); foreach (var group in TestObjects) { foreach (var h in group.Hardware) { var hiso = h.GetHardware(); if (!hardwareInTest.ContainsKey(hiso.GetId())) { hardwareInTest.Add(hiso.GetId(), h); } } } foreach (var group in AddedGroups) { foreach (var h in group.Hardware) { var hiso = h.GetHardware(); if (!hardwareInTest.ContainsKey(hiso.GetId())) { hardwareInTest.Add(hiso.GetId(), h); } } } var e = _hardwareOverrides.GetEnumerator(); while (e.MoveNext()) { switch (e.Current.Value.Action) { case HardwareInclusionInstruction.Actions.Add: if (!hardwareInTest.ContainsKey(e.Current.Value.HardwareId)) { DASHardware h = null; try { h = DASHardwareList.GetList().GetHardware(e.Current.Value.HardwareId); } catch (DASHardwareList.HardwareTypeChangedException) { //ignore } if (null != h) { hardwareInTest.Add(h.GetHardware().GetId(), h); } } break; case HardwareInclusionInstruction.Actions.Remove: if (hardwareInTest.ContainsKey(e.Current.Value.HardwareId)) { hardwareInTest.Remove(e.Current.Value.HardwareId); } break; } } GetNonISOTestObject(); foreach (var group in TestObjects) { var hardware = new List(); var e2 = hardwareInTest.GetEnumerator(); while (e2.MoveNext()) { var newH = new DASHardware(e2.Current.Value.GetHardware()); newH.SetTimeStampMemory(e2.Current.Value.GetTimeStampMemory()); hardware.Add(newH); } group.SetHardware(hardware.ToArray()); } foreach (var ag in AddedGroups) { var hardware = new List(); var e2 = hardwareInTest.GetEnumerator(); while (e2.MoveNext()) { var newH = new DASHardware(e2.Current.Value.GetHardware()); newH.SetTimeStampMemory(e2.Current.Value.GetTimeStampMemory()); hardware.Add(newH); } ag.SetHardware(hardware.ToArray()); } } internal Dictionary LevelTriggerChannels = new Dictionary(); public string GetLTKey(LevelTriggerChannel ch) { return string.Format("{0}x{1}", ch.HardwareChannelId, ch.SensorSerialNumber); } public void SetLevelTrigger(LevelTriggerChannel channel) { var key = GetLTKey(channel); LevelTriggerChannels[key] = new LevelTriggerChannel(channel);//do a copy just for safety } public SensorData GetSensor(string serialNumber, string testObjectSerial, string channelName) { lock (SensorLock) { var tto = GetTestTestObject(testObjectSerial); if (_sensorLookup.ContainsKey(testObjectSerial)) { if (_sensorLookup[testObjectSerial].ContainsKey(channelName)) { if (_sensorLookup[testObjectSerial][channelName].ContainsKey(serialNumber)) { if (_sensorLookup[testObjectSerial][channelName][serialNumber].FilterClassIso == "?") { _sensorLookup[testObjectSerial][channelName][serialNumber].FilterClassIso = "P"; // "Prefiltered > CFC 1000" (Unfiltered) } //for some reason the Filter isn't always set, setting filterclassiso will ensure it gets set, even though it should have already _been_ set _sensorLookup[testObjectSerial][channelName][serialNumber].FilterClassIso = _sensorLookup[testObjectSerial][channelName][serialNumber].FilterClassIso; if (null == tto) { return _sensorLookup[testObjectSerial][channelName][serialNumber]; } var position = tto.Position.Position; if (position != TestTestObject.UserSetKey && position != TestTestObject.ChannelDefaultsKey && position != _sensorLookup[testObjectSerial][channelName][serialNumber].Position) { _sensorLookup[testObjectSerial][channelName][serialNumber].Position = position; } return _sensorLookup[testObjectSerial][channelName][serialNumber]; } } } if (null == tto) { return SensorData.IsTestSpecificDigitalOutSN(serialNumber) ? new DigitalOutputSetting { SerialNumber = serialNumber } : SensorsCollection.SensorsList.GetSensorBySerialNumber(serialNumber); } { var ttosd = tto.GetSensor(channelName, serialNumber); if (ttosd != null) { ttosd.TestObject = tto.TestObject.Test_Object; var position = tto.Position.Position; if (position != TestTestObject.UserSetKey && position != TestTestObject.ChannelDefaultsKey && position != ttosd.Position) { ttosd.Position = position; } } else { return SensorData.IsTestSpecificDigitalOutSN(serialNumber) ? new DigitalOutputSetting { SerialNumber = serialNumber } : null; } return ttosd; } } } public void SetSensor(SensorData sd, string testobjectserial, string channelname) { SetSensor(sd, testobjectserial, channelname, false); } private static readonly object SensorLock = new object(); /// /// sets the sensor (and custom values like range/CFC/polarity) for a channel in the test /// /// /// /// /// public void SetSensor(SensorData sd, string testobjectserial, string channelname, bool bSetPositionFromSensor) { lock (SensorLock) { if (!_sensorLookup.ContainsKey(testobjectserial)) { _sensorLookup.Add(testobjectserial, new Dictionary>()); } if (!_sensorLookup[testobjectserial].ContainsKey(channelname)) { _sensorLookup[testobjectserial].Add(channelname, new Dictionary()); } //Build out the ISO fields we know about // FB 5423 var tto = GetTestTestObject(testobjectserial) ?? new TestTestObject(new TestObject()); sd.TestObject = tto.TestObject.Test_Object; // ReSharper disable once InconsistentNaming var isoTO = tto.GetISOTestObject(); var channel = isoTO.GetChannel(channelname); if (bSetPositionFromSensor) { if (tto.Position.Position != sd.Position && tto.Position.Position != TestTestObject.UserSetKey) { tto.SetPosition(TestTestObject.UserSetKey); } } else { if ((tto.Position.Position != TestTestObject.ChannelDefaultsKey) && //Remove this? (tto.Position.Position != TestTestObject.UserSetKey)) { sd.Position = tto.Position.Position; } } if (null != channel) { 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; } _sensorLookup[testobjectserial][channelname][sd.SerialNumber] = sd; } } public const string HARDWAREOVERRIDE_ACTION = "Action"; public const string HARDWAREOVERRIDE_HID = "HID"; private const string LT_TESTSETUPNAME = "TestSetupName"; private const string LT_TESTOBJECTCHANNELID = "TestObjectChannelId"; private const string LT_HARDWARECHANNELID = "HardwareChannelId"; private const string LT_GROUPSERIALNUMBER = "GroupId"; private const string LT_SENSORSERIALNUMBER = "SensorSerialNumber"; private const string LT_LESSTHANTHRESHOLDEU = "LessThanValue"; private const string LT_LESSTHANENABLED = "LessThanEnabled"; private const string LT_GREATERTHANENABLED = "GreaterThanEnabled"; private const string LT_GREATERTHANTHRESHOLDEU = "GreaterThanValue"; private const string LT_TRIGGEROUTSIDE = "TriggerOutside"; private const string LT_TRIGGERINSIDE = "TriggerInside"; private const string LT_OUTSIDEUPPEREU = "OutsideUpperEU"; private const string LT_OUTSIDELOWEREU = "OutsideLowerEU"; private const string LT_INSIDEUPPEREU = "InsideUpperEU"; private const string LT_INSIDELOWEREU = "InsideLowerEU"; private const string CC_CALCULATEDCHANNELVALUE = "ISOCODE"; private const string CC_CFCFORINPUTCHANNELS = "CFCInputChannels"; private const string CC_CFCFOROUTPUTCHANNELS = "CFCOutput"; private const string CC_TESTSETUPNAME = "TestSetupName"; private const string CC_NAME = "Name"; private const string CC_INPUTCHANNELIDS = "InputChannelIds"; private const string CC_ID = "ID"; private const string CC_OPERATION = "Operation"; public Dictionary GetTestObjectValues(TestTestObject to) { var elementNameValuePairs = new Dictionary(); elementNameValuePairs[DbOperations.TestSetups.TestSetupObjectFields.TestObjectSerialNumber.ToString()] = to.SerialNumber; elementNameValuePairs[DbOperations.TestSetups.TestSetupObjectFields.TestSetupName.ToString()] = Name; elementNameValuePairs[DbOperations.TestSetups.TestSetupObjectFields.TargetSampleRate.ToString()] = to.TargetSampleRate.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupObjectFields.ExcitationWarmupTimeMS.ToString()] = to.ExcitationWarmupTimeMS.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupObjectFields.LocalOnly.ToString()] = to.LocalOnly.ToString(); elementNameValuePairs[DbOperations.TestSetups.TestSetupObjectFields.TestObjectType.ToString()] = to.TestObject.Test_Object; elementNameValuePairs[DbOperations.TestSetups.TestSetupObjectFields.TestObjectPosition.ToString()] = to.Position.Position; return elementNameValuePairs; } public Dictionary GetDASSettingsValues(DASSettings settings) { var elementNameValuePairs = new Dictionary(); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.DASSerialNumber.ToString()] = settings.DASSerialNumber; elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.TestSetupName.ToString()] = Name; elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.TargetSampleRate.ToString()] = settings.SampleRate.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.ExcitationWarmupTimeMS.ToString()] = settings.ExcitationWarmupTimeMS.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.AAFilterRate.ToString()] = settings.HardwareAAF.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.PreTriggerSeconds.ToString()] = settings.PreTriggerSeconds.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.PostTriggerSeconds.ToString()] = settings.PostTriggerSeconds.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.StatusLineCheck.ToString()] = settings.StatusLineCheck.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.BatteryCheck.ToString()] = settings.BatteryCheck.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.InputVoltageMin.ToString()] = settings.InputVoltageMin.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.InputVoltageMax.ToString()] = settings.InputVoltageMax.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.BatteryVoltageMin.ToString()] = settings.BatteryVoltageMin.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.BatteryVoltageMax.ToString()] = settings.BatteryVoltageMax.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.TestSetupDASSettingsFields.LocalOnly.ToString()] = false.ToString(System.Globalization.CultureInfo.InvariantCulture); return elementNameValuePairs; } public Dictionary GetChannelSettingValues(TestTestObject to, TestObjectChannel channel, SensorData sd) { var elementNameValuePairs = new Dictionary(); elementNameValuePairs[DbOperations.TestSetups.ChannelSettingFields.TestName.ToString()] = Name; elementNameValuePairs[DbOperations.TestSetups.ChannelSettingFields.TestObjectName.ToString()] = to.SerialNumber; elementNameValuePairs[DbOperations.TestSetups.ChannelSettingFields.ChannelId.ToString()] = channel.NameOfTheChannel; elementNameValuePairs[DbOperations.TestSetups.ChannelSettingFields.Setting.ToString()] = TestTemplateList.GetSensorSettings(sd); elementNameValuePairs[DbOperations.TestSetups.ChannelSettingFields.SensorSerial.ToString()] = channel.SensorSerialNumber; return elementNameValuePairs; } public Dictionary GetGraphValues(TestGraph g) { var elementNameValuePairs = new Dictionary(); elementNameValuePairs[DbOperations.TestSetups.GraphFields.GraphName.ToString()] = g.GraphName; elementNameValuePairs[DbOperations.TestSetups.GraphFields.GraphDescription.ToString()] = g.GraphDescription; elementNameValuePairs[DbOperations.TestSetups.GraphFields.TemplateName.ToString()] = Name; elementNameValuePairs[DbOperations.TestSetups.GraphFields.Channels.ToString()] = g.GetChannelsForSQL(); elementNameValuePairs[DbOperations.TestSetups.GraphFields.UseDomainMin.ToString()] = g.UseDomainMin.ToString(); elementNameValuePairs[DbOperations.TestSetups.GraphFields.DomainMin.ToString()] = g.DomainMin.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.GraphFields.UseDomainMax.ToString()] = g.UseDomainMax.ToString(); elementNameValuePairs[DbOperations.TestSetups.GraphFields.DomainMax.ToString()] = g.DomainMax.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.GraphFields.UseRangeMin.ToString()] = g.UseRangeMin.ToString(); elementNameValuePairs[DbOperations.TestSetups.GraphFields.RangeMin.ToString()] = g.RangeMin.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.GraphFields.UseRangeMax.ToString()] = g.UseRangeMax.ToString(); elementNameValuePairs[DbOperations.TestSetups.GraphFields.RangeMax.ToString()] = g.RangeMax.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.GraphFields.Thresholds.ToString()] = g.GetThresholdsSQL(); elementNameValuePairs[DbOperations.TestSetups.GraphFields.LocalOnly.ToString()] = LocalOnly.ToString(); return elementNameValuePairs; } public Dictionary GetFieldValues() { var elementNameValuePairs = new Dictionary(); elementNameValuePairs[DbOperations.TestSetups.Fields.SetupName.ToString()] = Name; elementNameValuePairs[DbOperations.TestSetups.Fields.SetupDescription.ToString()] = Description; elementNameValuePairs[DbOperations.TestSetups.Fields.AutomaticTestProgression.ToString()] = AutomaticProgression.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.AutomaticProgressionDelayMS.ToString()] = AutomaticProgressionDelayMS.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.InvertTrigger.ToString()] = InvertTriggerCompletion.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.InvertStart.ToString()] = InvertStartRecordCompletion.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.ViewDiagnostics.ToString()] = ViewDiagnostics.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.VerifyChannels.ToString()] = VerifyChannels.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.AutoVerifyChannels.ToString()] = AutoVerifyChannels.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.VerifyChannelsDelayMS.ToString()] = (AutoVerifyDelaySeconds * 1000D).ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.RecordingMode.ToString()] = RecordingMode.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.SamplesPerSecond.ToString()] = SamplesPerSecond.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.PreTriggerSeconds.ToString()] = PreTriggerSeconds.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.PostTriggerSeconds.ToString()] = PostTriggerSeconds.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.StrictDiagnostics.ToString()] = StrictDiagnostics.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.RequireConfirmationOnErrors.ToString()] = RequireUserConfirmationOnErrors.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.ROIDownload.ToString()] = DoROIDownload.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.ViewROIDownload.ToString()] = ViewROIDownload.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.DownloadAll.ToString()] = DownloadAll.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.ViewRealtime.ToString()] = ViewRealtime.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.RealtimePlotCount.ToString()] = DefaultNumberRealtimeGraphs.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.ROIStart.ToString()] = ROIStart.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.ROIEnd.ToString()] = ROIEnd.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.ViewDownloadAll.ToString()] = ViewDownloadAll.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.Export.ToString()] = ViewExport.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.ExportFormat.ToString()] = ((ulong)ExportFormats).ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.LabDetails.ToString()] = (null != LabDetails) ? LabDetails.Name : ""; elementNameValuePairs[DbOperations.TestSetups.Fields.UseLabDetails.ToString()] = UseLabratoryDetails.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.CustomerDetails.ToString()] = null != CustomerDetails ? CustomerDetails.Name : ""; elementNameValuePairs[DbOperations.TestSetups.Fields.UseCustomerDetails.ToString()] = UseCustomerDetails.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.AllowMissingSensors.ToString()] = AllowMissingSensors.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.AllowSensorIdToBlankChannel.ToString()] = AllowSensorIdToBlankChannel.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.LocalOnly.ToString()] = LocalOnly.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.LastModified.ToString()] = LastModified.ToString(System.Globalization.CultureInfo.InvariantCulture); elementNameValuePairs[DbOperations.TestSetups.Fields.LastModifiedBy.ToString()] = LastModifiedBy; elementNameValuePairs[DbOperations.TestSetups.Fields.TurnOffExcitation.ToString()] = TurnOffExcitation.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.TriggerCheckRealtime.ToString()] = TriggerCheckRealtime.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.TriggerCheckStep.ToString()] = TriggerCheckStep.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.PostTestDiagnostics.ToString()] = PostTestDiagnosticsLevel.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.ExportFolder.ToString()] = ExportFolder; elementNameValuePairs[DbOperations.TestSetups.Fields.DownloadFolder.ToString()] = DownloadFolder; elementNameValuePairs[DbOperations.TestSetups.Fields.CommonStatusLine.ToString()] = CommonLine.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.SameAsDownloadFolder.ToString()] = SameAsDownloadFolder.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.UploadData.ToString()] = UploadData.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.UploadDataFolder.ToString()] = UploadFolder; elementNameValuePairs[DbOperations.TestSetups.Fields.Settings.ToString()] = _settings.ToSerializeString(); elementNameValuePairs[DbOperations.TestSetups.Fields.WarnOnBatteryFail.ToString()] = WarnOnFailedBattery.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.Dirty.ToString()] = IsDirty.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.Complete.ToString()] = IsComplete.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.ErrorMessage.ToString()] = CompletionErrorMessage; elementNameValuePairs[DbOperations.TestSetups.Fields.TestEngineerDetails.ToString()] = null != TestEngineerDetails ? TestEngineerDetails.Name : ""; elementNameValuePairs[DbOperations.TestSetups.Fields.UseTestEngineerDetails.ToString()] = UseTestEngineerDetails.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.UserTags.ToString()] = GetTagsCommaSeperatedString(); elementNameValuePairs[DbOperations.TestSetups.Fields.DoAutoArm.ToString()] = DoAutoArm.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.DoStreaming.ToString()] = DoStreaming.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.CheckoutMode.ToString()] = CheckoutMode.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.QuitTestWithoutWarning.ToString()] = QuitTestWithoutWarning.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.SuppressMissingSensorsWarning.ToString()] = SuppressMissingSensorsWarning.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.ISFFile.ToString()] = ISFFile; elementNameValuePairs[DbOperations.TestSetups.Fields.NotAllChannelsRealTime.ToString()] = NotAllChannelsRealTime.ToString(); elementNameValuePairs[DbOperations.TestSetups.Fields.NotAllChannelsViewer.ToString()] = NotAllChannelsViewer.ToString(); return elementNameValuePairs; } public Dictionary GetHardwareOverrideValues(HardwareInclusionInstruction hii) { var attributeNameValuePairs = new Dictionary(); attributeNameValuePairs[HARDWAREOVERRIDE_HID] = hii.HardwareId; attributeNameValuePairs[HARDWAREOVERRIDE_ACTION] = hii.Action.ToString(); return attributeNameValuePairs; } public Dictionary GetCalculatedChannelValues(CalculatedValueClass cc) { var attributeNameValuePairs = new Dictionary(); attributeNameValuePairs[CC_CALCULATEDCHANNELVALUE] = cc.CalculatedValueCode; attributeNameValuePairs[CC_CFCFORINPUTCHANNELS] = cc.CFCForInputChannels; attributeNameValuePairs[CC_CFCFOROUTPUTCHANNELS] = cc.ChannelFilterClassForOutput; attributeNameValuePairs[CC_ID] = cc.Id.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[CC_INPUTCHANNELIDS] = string.Join(System.Globalization.CultureInfo.InvariantCulture.TextInfo.ListSeparator, cc.InputChannelIds); attributeNameValuePairs[CC_NAME] = cc.Name; attributeNameValuePairs[CC_OPERATION] = cc.Operation.ToString(); attributeNameValuePairs[CC_TESTSETUPNAME] = cc.TestSetupName; return attributeNameValuePairs; } public Dictionary GetLevelTriggerValues(LevelTriggerChannel lt) { var attributeNameValuePairs = new Dictionary(); attributeNameValuePairs[LT_TESTSETUPNAME] = lt.TestSetupName; attributeNameValuePairs[LT_GROUPSERIALNUMBER] = lt.GroupSerialNumber; attributeNameValuePairs[LT_TESTOBJECTCHANNELID] = lt.TestObjectChannelId; attributeNameValuePairs[LT_HARDWARECHANNELID] = lt.HardwareChannelId; attributeNameValuePairs[LT_SENSORSERIALNUMBER] = lt.SensorSerialNumber; attributeNameValuePairs[LT_GREATERTHANENABLED] = lt.GreaterThanEnabled.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_GREATERTHANTHRESHOLDEU] = lt.GreaterThanThresholdEU.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_LESSTHANENABLED] = lt.LessThanEnabled.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_LESSTHANTHRESHOLDEU] = lt.LessThanThresholdEU.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_TRIGGERINSIDE] = lt.TriggerBetweenBounds.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_TRIGGEROUTSIDE] = lt.TriggerOutsideBounds.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_INSIDELOWEREU] = lt.InsideLowerLevelEU.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_INSIDEUPPEREU] = lt.InsideUpperLevelEU.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_OUTSIDELOWEREU] = lt.OutsideLowerLevelEU.ToString(System.Globalization.CultureInfo.InvariantCulture); attributeNameValuePairs[LT_OUTSIDEUPPEREU] = lt.OutsideUpperLevelEU.ToString(System.Globalization.CultureInfo.InvariantCulture); return attributeNameValuePairs; } public Dictionary GetMetaDataValues(TestSetupMetaData testMeta, MetaData prop) { var attributeNameValuePairs = new Dictionary(); attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.TestObject.ToString()] = testMeta.TestObject.ToString(); attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.SetupName.ToString()] = Name; attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.PropName.ToString()] = prop.Name; attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.PropValue.ToString()] = prop.Value; attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.Optional.ToString()] = prop.IsOptional.ToString(); attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.Version.ToString()] = prop.Version.ToString(System.Globalization.CultureInfo.InvariantCulture); return attributeNameValuePairs; } public Dictionary GetMetaDataValues(TestObjectMetaData testMeta, MetaData prop) { var attributeNameValuePairs = new Dictionary(); attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.TestObject.ToString()] = testMeta.TestObject.ToString(); attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.SetupName.ToString()] = Name; attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.PropName.ToString()] = prop.Name; attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.PropValue.ToString()] = prop.Value; attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.Optional.ToString()] = prop.IsOptional.ToString(); attributeNameValuePairs[DbOperations.TestSetups.TestObjectMetaDataFields.Version.ToString()] = prop.Version.ToString(System.Globalization.CultureInfo.InvariantCulture); return attributeNameValuePairs; } /// /// sets the dirty flag /// does NOT set the flag in the database, so this should only be called when the flag needs to be set in memory /// (for instance during initialization) /// /// public void SetIsDirty(bool bDirty) { _bIsDirty = bDirty; } /// /// sets the complete flag /// does not set the flag in the database, so this should only be called when the flag needs to be set in memory /// (for instance during initialization) /// /// public void SetIsComplete(bool bComplete) { _testTemplateLite.IsComplete = bComplete; } /// /// sets the completion error message. /// does not set the field in the db, so this should only be called when the information nets to be set in memory and not the db /// (for instance during initialization) /// /// public void SetCompletionErrorMessage(string msg) { _errorMessage = msg; } public int CompareTo(TestTemplate right) { if (null == right) { return 1; } var r = Name.CompareTo(right.Name); return 0 == r ? LastModified.CompareTo(right.LastModified) : r; } public TestTestObject GetTestTestObject(string testObjectSerial) { foreach (var tto in TestObjects) { if (tto.SerialNumber == testObjectSerial) { return tto; } } return Array.Find(AddedGroups, addedGroup => addedGroup.SerialNumber == testObjectSerial); } /// /// calculates whether the test setup is complete or not /// will cause the test setup to be loaded if it is not yet /// does not unload the test setup /// private void CalculateIsComplete() { if (!IsLoaded) { Load(); } var errorMessage = string.Empty; var errors = new List(); var warnings = new List(); var res = Validate(ref errors, ref warnings, false, this, true, StrictLevel.UpdateTable, false, true); //don't limit quick sensor check to one operating mode if (!QuickSensorCheck) { switch (GetISOTestSetupISOSupportLevel()) { case SerializedSettings.ISOSupportLevels.NO_ISO: //Only valid if exact mode if (SerializedSettings.ISOSupportLevel != SerializedSettings.ISOSupportLevels.NO_ISO) { res = false; errors.Add("TestObject_GroupNotSupportedInCurrentISOSupportLevel"/*Strings.StringResources.TestObject_GroupNotSupportedInCurrentISOSupportLevel*/); } break; case SerializedSettings.ISOSupportLevels.ISO_ONLY: case SerializedSettings.ISOSupportLevels.TRANSITORY: //Allow either non-ISO modes (TRANSITORY or ISO_ONLY) if (SerializedSettings.ISOSupportLevel == SerializedSettings.ISOSupportLevels.NO_ISO) { res = false; errors.Add("TestObject_GroupNotSupportedInCurrentISOSupportLevel"/*Strings.StringResources.TestObject_GroupNotSupportedInCurrentISOSupportLevel*/); } break; } } if (errors.Count > MaxErrorsToDisplay) { errorMessage = string.Format("{0}{1}{2}", string.Join(Environment.NewLine, errors.ToArray(), 0, MaxErrorsToDisplay), Environment.NewLine, string.Format("TestTemplate_MoreErrors"/*Strings.StringResources.TestTemplate_MoreErrors*/, (errors.Count - MaxErrorsToDisplay))); } else if (errors.Count > 0) { errorMessage = string.Join(System.Environment.NewLine, errors.ToArray()); } if (!res) { IsComplete = false; } IsComplete = errors.Count <= 0; _errorMessage = errorMessage; _bIsDirty = false; if (0 == Properties.Settings.Default.DBType && IsOutOfDate()) { return; } //DON'T UPDATE, our record is old, just leave it as it is in the db and let the user play around with the mem copy for now using (var cmd = DbOperations.GetCommand()) { cmd.CommandText = string.Format("UPDATE {0} SET {1}=@{1}, {2}=@{2}, {3}=@{3} WHERE {4}=@{4}", DbOperations.TestSetups.TestSetupsTable, DbOperations.TestSetups.Fields.Complete.ToString(), DbOperations.TestSetups.Fields.Dirty.ToString(), DbOperations.TestSetups.Fields.ErrorMessage.ToString(), DbOperations.TestSetups.Fields.SetupName.ToString()); DbOperations.CreateParam(cmd, string.Format("@{0}", DbOperations.TestSetups.Fields.Dirty.ToString()), SqlDbType.Bit, _bIsDirty); DbOperations.CreateParam(cmd, string.Format("@{0}", DbOperations.TestSetups.Fields.Complete.ToString()), SqlDbType.Bit, _testTemplateLite.IsComplete); DbOperations.CreateParam(cmd, string.Format("@{0}", DbOperations.TestSetups.Fields.ErrorMessage.ToString()), SqlDbType.NVarChar, CompletionErrorMessage); DbOperations.CreateParam(cmd, string.Format("@{0}", DbOperations.TestSetups.Fields.SetupName.ToString()), SqlDbType.NVarChar, Name); DbOperations.Connection.ExecuteCommand(cmd); SetTimeStampMemory(GetTimeStampDb()); } } /// /// marks a test setup as unchecked by setting the dirty flag, which means the next time completion is checked it will be calculated again /// this function will change that flag in the database immediately /// public void MarkIsCompleteUnchecked(bool skipMemoryCheck = false) { //Ensure that our UPDATE below will not cause us to return without resetting our memory timestamp. var previouslyOutOfDate = IsOutOfDate(); IsComplete = false; _bIsDirty = true; _errorMessage = string.Empty; if (string.IsNullOrEmpty(Name)) { return; } using (var sql = DbOperations.GetCommand()) { sql.CommandText = string.Format("UPDATE tblTestSetups SET Dirty=1, Complete=0 WHERE {0}=@{0}", DbOperations.TestSetups.Fields.SetupName.ToString()); DbOperations.CreateParam(sql, string.Format("@{0}", DbOperations.TestSetups.Fields.SetupName.ToString()), SqlDbType.NVarChar, Name); DbOperations.Connection.ExecuteCommand(sql); //If this Test Setup was out-of-date before we did the above UPDATE, keep it out-of-date. if (!skipMemoryCheck && 0 == Properties.Settings.Default.DBType && previouslyOutOfDate) return; SetTimeStampMemory(GetTimeStampDb()); //THIS FUNCTION NOT ONLY CHANGES THIS COPY OF THE TEST SETUP, BUT ALL!!! var original = TestTemplateList.TestTemplatesList.GetTemplate(Name); if (null == original) return; original.SetTimeStampMemory(GetTimeStampMemory()); original.IsDirty = true; original.IsComplete = false; //delete sensor } } /// /// frees up the memory assigned during Load, this includes channels, groups, meta data, etc /// various things may cause us to load the information and hold the information for some setups, /// but in general we want to unload it if we don't need it /// public void UnLoad() { if (QuickSensorCheck) { return; } _bIsLoaded = false; if (null != _testObjects) { _testObjects.Clear(); } if (null != _addedGroups) { _addedGroups.Clear(); } if (null != TestObjectsAndAddedGroupsList) { TestObjectsAndAddedGroupsList.Clear(); } if (null != _channelKeysInOrder) { _channelKeysInOrder.Clear(); } if (null != _channelLookup) { _channelLookup.Clear(); } if (null != _checkedDASList) { _checkedDASList.Clear(); } if (null != _dasChannelNumberToAbsoluteNumber) { _dasChannelNumberToAbsoluteNumber.Clear(); } if (null != _dasSettings) { _dasSettings.Clear(); } if (null != _filterLookup) { _filterLookup.Clear(); } if (null != _hardwareChannelsInOrder) { _hardwareChannelsInOrder.Clear(); } if (null != _metaDataLookup) { _metaDataLookup.Clear(); } if (null != _oldChannelLookup) { _oldChannelLookup.Clear(); } lock (SensorLock) { if (null != _sensorLookup) { _sensorLookup.Clear(); } } if (null != _sessionOpen) { _sessionOpen.Clear(); } //6552 Cannot set prepare hardware delay seconds. (this information is in the root table, don't unload it) if (null != _testGraphs) { _testGraphs.Clear(); } if (null != _testSetupMeta) { _testSetupMeta.Clear(); } if (null != _hardwareOverrides) { _hardwareOverrides.Clear(); } if (null != LevelTriggerChannels) { LevelTriggerChannels.Clear(); } } /// /// loads all the information for the test setup from tables in the db /// we do this so that we can keep the minimal information on hand until we need it /// public void Load() { if (QuickSensorCheck) { return; } if (string.IsNullOrWhiteSpace(Name)) { return; } //nothing to load! //intermediate structures. originally we loaded all test graphs at once, so these structures made sense, now they are a little //vestigial, but it was a clean transition from the old loading structure ... var tblTestGraphs = new Dictionary>>(100); var tblTestSetupDASSettings = new Dictionary>>(100); var tblTestObjects = new Dictionary>>(100); var tblChannelSettings = new Dictionary>>(100); var tblMetaData = new Dictionary>>(100); #region Load Graphs try { using (var sql = DbOperations.GetCommand()) { //sp_GetTestGraphs sql.CommandText = string.Format("SELECT * from [{0}] where {1}=@{1}", DbOperations.TestSetups.TestGraphsTable, DbOperations.TestSetups.GraphFields.TemplateName.ToString()); DbOperations.CreateParam(sql, string.Format("@{0}", DbOperations.TestSetups.GraphFields.TemplateName.ToString()), SqlDbType.NVarChar, Name); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { TestTemplateList.ConvertToDictionary(ds.Tables[0], ref tblTestGraphs, DbOperations.TestSetups.GraphFields.TemplateName.ToString()); } } } } catch (Exception) { //ignore } #endregion Graphs #region Load DAS Settings try { using (var sql = DbOperations.GetCommand()) { //sp_GetTestSetupDASSettings sql.CommandText = string.Format("SELECT * FROM [{0}] WHERE TestSetupName=@TestSetupName", DbOperations.TestSetups.DASSettingsTable); DbOperations.CreateParam(sql, "@TestSetupName", SqlDbType.NVarChar, Name); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { TestTemplateList.ConvertToDictionary(ds.Tables[0], ref tblTestSetupDASSettings, "TestSetupName"); } } } } catch (Exception) { //ignore } #endregion DAS Settings #region Load Groups try { using (var sql = DbOperations.GetCommand()) { //sp_GetTestSetupObjects sql.CommandText = string.Format("SELECT * FROM [{0}] WHERE {1}=@{1}", DbOperations.TestSetups.TestSetupObjectsTable, DbOperations.TestSetups.TestSetupObjectFields.TestSetupName.ToString()); DbOperations.CreateParam(sql, string.Format("@{0}", DbOperations.TestSetups.TestSetupObjectFields.TestSetupName.ToString()), SqlDbType.NVarChar, Name); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { TestTemplateList.ConvertToDictionary(ds.Tables[0], ref tblTestObjects, DbOperations.TestSetups.TestSetupObjectFields.TestSetupName.ToString()); } } } } catch (Exception) { //ignore } #endregion Objects #region Load Channel Settings try { using (var sql = DbOperations.GetCommand()) { //sp_GetTestChannelSettings sql.CommandText = string.Format("SELECT * FROM [{0}] WHERE {1}=@{1}", DbOperations.TestSetups.ChannelSettingsTable, DbOperations.TestSetups.ChannelSettingFields.TestName.ToString()); DbOperations.CreateParam(sql, string.Format("@{0}", DbOperations.TestSetups.ChannelSettingFields.TestName.ToString()), SqlDbType.NVarChar, Name); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { TestTemplateList.ConvertToDictionary(ds.Tables[0], ref tblChannelSettings, DbOperations.TestSetups.ChannelSettingFields.TestName.ToString()); } } } } catch (Exception) { //ignore } #endregion Channel Settings #region Load Meta Data try { using (var sql = DbOperations.GetCommand()) { //sp_GetTestSetupObjectMetaData sql.CommandText = string.Format("SELECT * FROM [{0}] WHERE {1}=@{1}", DbOperations.TestSetups.TestObjectMetaDataTable, DbOperations.TestSetups.TestObjectMetaDataFields.SetupName.ToString()); DbOperations.CreateParam(sql, string.Format("@{0}", DbOperations.TestSetups.TestObjectMetaDataFields.SetupName.ToString()), SqlDbType.NVarChar, Name); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { TestTemplateList.ConvertToDictionary(ds.Tables[0], ref tblMetaData, DbOperations.TestSetups.TestObjectMetaDataFields.SetupName.ToString()); } } } } catch (Exception) { //ignore } #endregion Meta Data #region Load Hardware Overrides try { _hardwareOverrides.Clear(); using (var sql = DbOperations.GetCommand()) { //sp_GetTestSetupHardware sql.CommandText = string.Format("SELECT * FROM [{0}] WHERE {1}=@{1}", DbOperations.TestSetups.HardwareTable, DbOperations.TestSetups.HardwareFields.TestSetupName.ToString()); DbOperations.CreateParam(sql, string.Format("@{0}", DbOperations.TestSetups.HardwareFields.TestSetupName.ToString()), SqlDbType.NVarChar, Name); var columns = Enum.GetValues(typeof(DbOperations.TestSetups.HardwareFields)) .Cast().ToArray(); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { foreach (DataRow row in ds.Tables[0].Rows) { var bAdd = true; var hid = ""; foreach (var column in columns) { var o = row[column.ToString()]; if (DBNull.Value.Equals(o)) { continue; } switch (column) { case DbOperations.TestSetups.HardwareFields.AddOrRemove: bAdd = Convert.ToBoolean(o); break; case DbOperations.TestSetups.HardwareFields.HardwareId: hid = Convert.ToString(o); break; case DbOperations.TestSetups.HardwareFields.TestSetupName: //don't need break; } } if (!string.IsNullOrEmpty(hid)) { _hardwareOverrides[hid] = new HardwareInclusionInstruction(hid, bAdd ? HardwareInclusionInstruction.Actions.Add : HardwareInclusionInstruction.Actions.Remove); } } } } } catch (Exception) { //ignore } #endregion //now all the structures are populated from the db, we just have to process and populate into classes #region Load Calculated Channels _calculatedChannels.Clear(); var calculatedChannels = new List(); try { using (var sql = DbOperations.GetCommand()) { //sp_GetCalculatedChannels sql.CommandText = string.Format("SELECT * from {0} WHERE [{1}]=@1", DbOperations.CalculatedChannels.Table, DbOperations.CalculatedChannels.Fields.TestSetupName.ToString()); DbOperations.CreateParam(sql, "@1", SqlDbType.NVarChar, Name); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { foreach (DataRow row in ds.Tables[0].Rows) { try { calculatedChannels.Add(new CalculatedValueClass(row)); } catch (Exception) { //ignore } } } } } catch (Exception) { //ignore } #endregion Calculated Channels #region Load Level Triggers LevelTriggerChannels.Clear(); var levelTriggerChannels = new List(); try { using (var sql = DbOperations.GetCommand()) { //sp_GetLevelTriggers sql.CommandText = string.Format("SELECT * FROM [{0}] WHERE {1}=@1", DbOperations.LevelTriggers.Table, DbOperations.LevelTriggers.Fields.TestSetupName.ToString()); DbOperations.CreateParam(sql, "@1", SqlDbType.NVarChar, Name); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { foreach (DataRow row in ds.Tables[0].Rows) { try { levelTriggerChannels.Add(new LevelTriggerChannel(row)); } catch (Exception) { //ignore } } } } } catch (Exception) { //ignore } #endregion #region Process Groups _testObjects.Clear(); _addedGroups.Clear(); TestObjectsAndAddedGroupsList.Clear(); if (tblTestObjects.ContainsKey(Name)) { foreach (var row in tblTestObjects[Name]) { var serialNumber = ""; var excitationWarmupTimeMs = 0; var targetSampleRate = 20000D; var testobject = "?"; var position = "?"; var tsofields = Enum.GetValues(typeof(DbOperations.TestSetups.TestSetupObjectFields)) .Cast().ToArray(); foreach (var field in tsofields) { var o = row[field.ToString()]; if (DBNull.Value.Equals(o)) { continue; } switch (field) { case DbOperations.TestSetups.TestSetupObjectFields.TestSetupName: break; case DbOperations.TestSetups.TestSetupObjectFields.TestObjectType: testobject = Convert.ToString(o); break; case DbOperations.TestSetups.TestSetupObjectFields.TestObjectSerialNumber: serialNumber = Convert.ToString(o); break; case DbOperations.TestSetups.TestSetupObjectFields.TestObjectPosition: position = Convert.ToString(o); break; case DbOperations.TestSetups.TestSetupObjectFields.TargetSampleRate: targetSampleRate = Convert.ToDouble(o); break; case DbOperations.TestSetups.TestSetupObjectFields.LocalOnly: break; case DbOperations.TestSetups.TestSetupObjectFields.ExcitationWarmupTimeMS: excitationWarmupTimeMs = Convert.ToInt32(o); break; } } try { if (TestTemplateList.SysBuiltObject(serialNumber)) { AddAddedGroup(serialNumber, testobject, position); } else { AddTestObject(serialNumber, excitationWarmupTimeMs, targetSampleRate, testobject, position); } } catch (Exception) { //ignore } } } #endregion Groups #region Process Graphs if (null != _testGraphs) { _testGraphs.Clear(); } if (tblTestGraphs.ContainsKey(Name)) { foreach (var row in tblTestGraphs[Name]) { var tg = new TestGraph(this) { GraphName = Convert.ToString(row["GraphName"]), GraphDescription = Convert.ToString(row["GraphDescription"]), UseDomainMin = Convert.ToBoolean(row["UseDomainMin"]), DomainMin = Convert.ToDouble(row["DomainMin"]), UseDomainMax = Convert.ToBoolean(row["UseDomainMax"]), DomainMax = Convert.ToDouble(row["DomainMax"]), UseRangeMin = Convert.ToBoolean(row["UseRangeMin"]), RangeMin = Convert.ToDouble(row["RangeMin"]), UseRangeMax = Convert.ToBoolean(row["UseRangeMax"]), RangeMax = Convert.ToDouble(row["RangeMax"]), }; tg.SetChannelsFromSQL(Convert.ToString(row["Channels"])); tg.SetThresholdsFromSQL(Convert.ToString(row["Thresholds"])); AddTestGraph(tg); } } #endregion Graphs #region Process DASSettings var settings = new List(); if (tblTestSetupDASSettings.ContainsKey(Name)) { settings.AddRange(tblTestSetupDASSettings[Name].Select(row => new DASSettings { BatteryCheck = Convert.ToBoolean(row["BatteryCheck"]) , BatteryVoltageMax = Convert.ToDouble(row["BatteryVoltageMax"]) , BatteryVoltageMin = Convert.ToDouble(row["BatteryVoltageMin"]) , DASSerialNumber = Convert.ToString(row["DASSerialNumber"]) , ExcitationWarmupTimeMS = Convert.ToInt32(row["ExcitationWarmupTimeMS"]) , HardwareAAF = Convert.ToDouble(row["AAFilterRate"]) , InputVoltageMax = Convert.ToDouble(row["InputVoltageMax"]) , InputVoltageMin = Convert.ToDouble(row["InputVoltageMin"]) , PostTriggerSeconds = Convert.ToDouble(row["PostTriggerSeconds"]) , PreTriggerSeconds = Convert.ToDouble(row["PreTriggerSeconds"]) , SampleRate = Convert.ToDouble(row["TargetSampleRate"]) , StatusLineCheck = Convert.ToBoolean(row["StatusLineCheck"]) })); } #endregion DASSettings #region Process ChannelSettings if (tblChannelSettings.ContainsKey(Name)) { var cFields = Enum.GetValues(typeof(DbOperations.TestSetups.ChannelSettingFields)).Cast().ToArray(); foreach (var row in tblChannelSettings[Name]) { string testobjectname = null; string channelname = null; string sensorserial = null; string setting = null; foreach (var cf in cFields) { switch (cf) { case DbOperations.TestSetups.ChannelSettingFields.TestName: break; case DbOperations.TestSetups.ChannelSettingFields.Setting: setting = row[cf.ToString()] as string; break; case DbOperations.TestSetups.ChannelSettingFields.TestObjectName: testobjectname = row[cf.ToString()] as string; break; case DbOperations.TestSetups.ChannelSettingFields.ChannelId: channelname = row[cf.ToString()] as string; break; case DbOperations.TestSetups.ChannelSettingFields.SensorSerial: sensorserial = row[cf.ToString()] as string; break; } } if (string.IsNullOrEmpty(testobjectname) || string.IsNullOrEmpty(channelname) || string.IsNullOrEmpty(setting)) continue; try { var sd = TestTemplateList.GetSensorFromSettings(setting, sensorserial); if (null != sd) { if (sd.FilterClassIso == "?") { sd.FilterClassIso = "P"; // "Prefiltered > CFC 1000" (Unfiltered) } SetSensor(sd, testobjectname, channelname); } } catch (Exception) { //ignore } } } DASSettings = settings.ToArray(); #endregion Channel Settings #region Process MetaData var metas = new Dictionary(); var setupMeta = new TestSetupMetaData(Properties.Settings.Default.RequireXCrashCompatibilityForISOExports); if (tblMetaData.ContainsKey(Name)) { foreach (var row in tblMetaData[Name]) { var bOptional = Convert.ToBoolean(row[DbOperations.TestSetups.TestObjectMetaDataFields.Optional.ToString()]); var pname = Convert.ToString(row[DbOperations.TestSetups.TestObjectMetaDataFields.PropName.ToString()]); var pvalue = Convert.ToString(row[DbOperations.TestSetups.TestObjectMetaDataFields.PropValue.ToString()]); var to = "?"; try { if (row[DbOperations.TestSetups.TestObjectMetaDataFields.TestObject.ToString()] is string) { to = (row[DbOperations.TestSetups.TestObjectMetaDataFields.TestObject.ToString()] as string); } else { to = Convert.ToString(Convert.ToChar(Convert.ToInt32(row[DbOperations.TestSetups.TestObjectMetaDataFields.TestObject.ToString()]))); } } catch (Exception) { //ignore } //little wonky here, sometimes the character comes in as a number, sometimes as a string. //if we end up with a string longer than 1 character, then we definitely need to convert it. //there are no strings of length 2 that are a valid character if (to.Length > 1) { try { if (int.TryParse(to, out int iTemp)) { to = Convert.ToString(Convert.ToChar(iTemp)); } } catch (Exception) { //ignore } } var version = Convert.ToDouble(row[DbOperations.TestSetups.TestObjectMetaDataFields.Version.ToString()]); if (to == "_") { if ((pname == "Title") && ((pvalue == "NOVALUE") || (string.IsNullOrWhiteSpace(pvalue)))) { pvalue = Name; } else if (pname == "DateOfTheTest") { pvalue = DateTime.Now.ToString("yyyy-MM-dd"); } setupMeta.SetProperty(new MetaData(pname, bOptional, pvalue, version), Properties.Settings.Default.RequireXCrashCompatibilityForISOExports); } else { if (!metas.ContainsKey(to[0])) { metas.Add(to[0], new TestObjectMetaData(to[0])); } metas[to[0]].SetProperty(new MetaData(pname, bOptional, pvalue, version)); } } } foreach (var v in metas.Values) { SetMetaData(v.TestObject, v); } SetTestSetupMetaData(setupMeta); _bIsLoaded = true; #endregion #region Process Calculated Channels foreach (var cc in calculatedChannels) { AddCalculatedChannel(cc); } #endregion Process Calculated Channels #region Process Level Triggers foreach (var lt in levelTriggerChannels) { SetLevelTrigger(lt); } #endregion Process Level Triggers ApplyHardwareOverrides(); } // #region Validate public static bool ValidateTestSetupName(ref List errors, TestTemplate CurrentTestSetup) { if (string.IsNullOrWhiteSpace(CurrentTestSetup.Name)) { errors.Add("EditTestSetup_NameRequired"/*Strings.StringResources.EditTestSetup_NameRequired*/); return false; } if (CurrentTestSetup.Name == "QuickSensorCheck_DefaultTestName"/*Strings.StringResources.QuickSensorCheck_DefaultTestName*/ && !CurrentTestSetup.QuickSensorCheck) { errors.Add("QuickSensorCheck_DefaultTestNameInvalid"/*Strings.StringResources.QuickSensorCheck_DefaultTestNameInvalid*/); return false; } if (DiskUtility.ValidateFileAndPathNameChars(CurrentTestSetup.Name)) { var nameToCheck = CurrentTestSetup.Name.ToLower(); if (nameToCheck.Equals("iso") || nameToCheck.Equals("csv") || nameToCheck.Equals("realtime")) { errors.Add("EditTestSetup_NameCannotBeISOCSVOrRealtime"/*Strings.StringResources.EditTestSetup_NameCannotBeISOCSVOrRealtime*/); return false; } var encoding = Encoding.GetEncoding("UTF-8"); var nameInBytes = encoding.GetBytes(nameToCheck); if (nameInBytes.Length == nameToCheck.Length) return true; errors.Add("EditTestSetup_NameCannotContainDoubleByteCharacters"/*Strings.StringResources.EditTestSetup_NameCannotContainDoubleByteCharacters*/); return false; } errors.Add("EditTestSetup_NameContainsInvalidCharacters"/*Strings.StringResources.EditTestSetup_NameContainsInvalidCharacters*/); //fatal return false; } public static bool Validate(ref List errors, ref List warnings, bool displayWindow, TestTemplate CurrentTestSetup, bool bValid, StrictLevel strictness, bool markIsCompleteUnchecked, bool bWarnOnNotFullyAssigned) { //I'm not sure of all the entry points into this function //it seems like there are many //however there are definite times we _don't_ want to just blindly change the iscompleteunchecked flag //just because we want to do some validation on the test plan ... //for now I just fixed the ones I know shouldn't be changing the flag blindly //and preserved current behavior for the rest ... var bHasHardware = false; var bHasChannels = false; var testobjects = new List(); testobjects.AddRange(CurrentTestSetup.TestObjects); testobjects.AddRange(CurrentTestSetup.AddedGroups); var serialNumbersProcessed = new Dictionary(); var hardwareChannelIdsProcessed = new Dictionary(); var channelLookup = new Dictionary(); var usedISOCodesLookup = new Dictionary(); var availableAnalogChannels = 0; var availableDigitalInputChannels = 0; var availableDigitalOutputChannels = 0; var availableSquibChannels = 0; if (testobjects.Any()) { //this is using the assumption that all testobjects now have the same list of hardware foreach (var lastTO in testobjects) { lastTO.RefreshHardware(); foreach (var h in lastTO.Hardware) { if (null != h) { var ser = h.SerialNumber; var hFromDB = DASHardwareList.GetList().GetHardware(h.GetHardware().GetId()); if (null == hFromDB) { var err = string.Format("Test includes hardware which is no longer available ({0})" /*Strings.StringResources.TestTemplate_HardwareNotFound*/, ser); continue; } } else { continue; } var hType = h.GetHardwareTypeEnum(); if (hType == Hardware.HardwareTypes.SLICE_EthernetController || hType == Hardware.HardwareTypes.SLICE_Distributor || hType == Hardware.HardwareTypes.SLICE_LabEthernet) { continue; } bHasHardware = true; if (CurrentTestSetup.DoAutoArm) { switch (hType) { case Hardware.HardwareTypes.TDAS_Pro_Rack: case Hardware.HardwareTypes.TDAS_LabRack: case Hardware.HardwareTypes.G5INDUMMY: case Hardware.HardwareTypes.G5VDS: errors.Add("Some hardware does not support auto-arming"); break; } } for (var i = 0; i < h.Channels.Length; i++) { var ch = h.Channels[i]; if (channelLookup.ContainsKey(ch.GetId())) continue; channelLookup.Add(ch.GetId(), ch); if (ch.IsSupportedBridgeType(Test.Module.Channel.Sensor.BridgeType.SQUIB)) { availableSquibChannels++; i++; /*bypass next channel as it's also a squib*/ } else if (ch.IsSupportedBridgeType(Test.Module.Channel.Sensor.BridgeType.DigitalInput)) { availableDigitalInputChannels++; } else if (ch.IsSupportedBridgeType(Test.Module.Channel.Sensor.BridgeType.TOMDigital)) { availableDigitalOutputChannels++; } else { availableAnalogChannels++; } } } } if (!bHasHardware && bWarnOnNotFullyAssigned) { errors.Add("Test requires Hardware"); } } else { errors.Add("Test requires at least one Group"); } foreach (var to in testobjects) { var isoTO = to.GetISOTestObject(); foreach (var ch in isoTO.AllChannels) { if (!ch.Required) { continue; } bHasChannels = true; if (string.IsNullOrWhiteSpace(ch.SensorSerialNumber)) { if (!errors.Contains("Some channels have no sensor assigned." /*Strings.StringResources.EditTestSetupPage_NoSensorOnChannel*/) && bWarnOnNotFullyAssigned) { errors.Add("Some channels have no sensor assigned." /*Strings.StringResources.EditTestSetupPage_NoSensorOnChannel*/); } } else { if (serialNumbersProcessed.ContainsKey(ch.SensorSerialNumber)) { var err = string.Format("Sensor {0} appears multiple times in the test setup." /*Strings.StringResources.EditTestSetupPage_SerialNumberAppearsTwice*/, ch.SensorSerialNumber); if (!errors.Contains(err)) { errors.Add(err); return false; } } else { serialNumbersProcessed.Add(ch.SensorSerialNumber, true); } var sd = CurrentTestSetup.GetSensor(ch.SensorSerialNumber, to.SerialNumber, ch.Name); if (null == sd) { var err = string.Format("Couldn't find sensor {0} for channel {1} for group {2}" /*Strings.StringResources.EditTestSetupPage_CouldNotFindSensor*/, ch.SensorSerialNumber, ch.Name, to.DisplaySerialNumber); if (!errors.Contains(err)) { errors.Add(err); } } else { if (sd.IsSquib()) { availableSquibChannels--; if (sd.SquibFireDelayMS + sd.SquibFireDurationMS > CurrentTestSetup.PostTriggerSeconds * 1000) { errors.Add(string.Format("Sensor '{0}' on channel '{1}' has output that exceeds post-trigger time."/*Strings.StringResources.TestTemplate_InsufficientPostTriggerLength*/, sd.SerialNumber, ch.Name)); } } else if (sd.IsDigitalInput()) { availableDigitalInputChannels--; } else if (sd.IsDigitalOutput()) { availableDigitalOutputChannels--; if (sd.DigitalOutputDelayMS + sd.DigitalOutputDurationMS > CurrentTestSetup.PostTriggerSeconds * 1000) { errors.Add(string.Format("Sensor '{0}' on channel '{1}' has output that exceeds post-trigger time." /*Strings.StringResources.TestTemplate_InsufficientPostTriggerLength*/, sd.SerialNumber, ch.Name)); } } else { availableAnalogChannels--; } var sensor = SensorsCollection.SensorsList.GetSensorBySerialNumber(ch.SensorSerialNumber); if (sensor != null) { var sensorDimension = sensor.PhysicalDimension; if (((ISO13499FileDb.IsoDb.GetPhysicalDimensionByIso(sensorDimension) != null) && ((ISO13499FileDb.IsoDb.GetPhysicalDimensionByIso(ch.Channel.Physical_Dimension) != null) && (sd.IncompatibleSensorAssignment(sensorDimension, ch.Channel.Physical_Dimension))))) { var err = string.Format("Dimension ({0}) of sensor ({1}) is different than dimension ({2}) of channel ({3}) in group {4}", //Strings.StringResources.EditTestSetupPage_IncompatibleSensorNotSupported, ISO13499FileDb.IsoDb.GetPhysicalDimensionByIso(sensorDimension).Text_L1, ch.SensorSerialNumber, ISO13499FileDb.IsoDb.GetPhysicalDimensionByIso(ch.Channel.Physical_Dimension).Text_L1, ch.Name, to.DisplaySerialNumber); switch (SerializedSettings.IsoChannelSensorCompatibilityLevel) { case IsoChannelSensorCompatibilityLevels.DontAllow: if (!errors.Contains(err)) { errors.Add(err); } bValid = false; break; case IsoChannelSensorCompatibilityLevels.Warn: if (!warnings.Contains("Warning"/*Strings.StringResources.EditObjectSensorsControl_Warning*/ + ": " + err)) { warnings.Add("Warning"/*Strings.StringResources.EditObjectSensorsControl_Warning */+ ": " + err); } break; } } } if (!sd.IsDigitalOutput() && (CurrentTestSetup.GetISOTestSetupISOSupportLevel() == SerializedSettings.ISOSupportLevels.ISO_ONLY)) { if (sd.MainLocation.Contains('?') || sd.FineLocation1.Contains('?') || sd.FineLocation2.Contains('?') || sd.FineLocation3.Contains('?') || sd.Direction.Contains('?') || sd.PhysicalDimension.Contains('?')) { var isoto = to.GetISOTestObject(); foreach (var isotoChannel in isoto.AllChannels) { //reapplying channel iso settings here with the exception of filter class, position, and test object if (ch.Name != isotoChannel.Name) continue; sd.MainLocation = ch.Channel.Trans_Main_Loc; sd.FineLocation1 = ch.Channel.Fine_Loc_1; sd.FineLocation2 = ch.Channel.Fine_Loc_2; sd.FineLocation3 = ch.Channel.Fine_Loc_3; sd.Direction = ch.Channel.Direction; sd.PhysicalDimension = ch.Channel.Physical_Dimension; } } if (usedISOCodesLookup.ContainsKey(sd.ISOCode)) { var err = $"TestTemplate_DuplicateISOCode {sd.ISOCode}"; if (!errors.Contains(err)) { errors.Add(err); } } else { usedISOCodesLookup[sd.ISOCode] = true; } } SensorCalibration sc = null; var preferredExcitation = sd.SupportedExcitation[0]; sc = SensorCalibration.GetLatestCalibrationBySerialNumberAndExcitation(sd, preferredExcitation); if (null == sc) { bValid = false; var err = $"EditTestSetupPage_MissingCalibration {ch.Name}, {sd.SerialNumber}"; if (!errors.Contains(err)) { errors.Add(err); } } else { var now = DateTime.Now; var days = sc.CalibrationDate.AddDays(sd.CalInterval).Subtract(now).TotalDays; if (SerializedSettings.TestSetupDefaultDontAllowOutOfCalSensors && ((days < 0) || (days < Properties.Settings.Default.CalWarningPeriodDays))) { bValid = false; var err = $"OverdueSensors_CalibrationDateOverdueOrNear {ch.Name}, {sd.SerialNumber}"; if (!errors.Contains(err)) { errors.Add(err); } } } if (!string.IsNullOrWhiteSpace(ch.HardwareId)) { if (!channelLookup.ContainsKey(ch.HardwareId)) { var err = $"EditTestSetupPage_InvalidHardware {ch.Name}, {to.DisplaySerialNumber}"; if (!errors.Contains(err)) { errors.Add(err); } } else { if (hardwareChannelIdsProcessed.ContainsKey(ch.HardwareId)) { bValid = false; var err = $"EditTestSetupPage_HardwareAlreadyInUse, {ch.Name}, {to.DisplaySerialNumber}"; if (!errors.Contains(err)) { errors.Add(err); } } else { hardwareChannelIdsProcessed.Add(ch.HardwareId, true); var hch = channelLookup[ch.HardwareId]; if (sd.ByPassFilter && ((hch.Hardware.GetHardwareTypeEnum() != Hardware.HardwareTypes.TDAS_Pro_Rack) && (hch.Hardware.GetHardwareTypeEnum() != Hardware.HardwareTypes.TDAS_LabRack))) { var err = $"EditTestSetupPage_BypassAAFilterNotSupported, {ch.Name}, {to.DisplaySerialNumber}"; if (!errors.Contains(err)) { errors.Add(err); } } else { if (hch.IsSupportedBridgeType(sd.Bridge)) continue; var err = $"EditTestSetupPage_BridgeNotSupported, {sd.Bridge}, {ch.Name}, {to.DisplaySerialNumber}"; if (!errors.Contains(err)) { errors.Add(err); } } } } } } } } } if (!bHasChannels) { errors.Add("EditTestSetupPage_NoChannelsInTest"); } if (availableAnalogChannels < 0 && !CurrentTestSetup.AllowMissingSensors && bWarnOnNotFullyAssigned) { if (!errors.Contains("EditTestSetupPage_NeedMoreAnalogChannels") && !errors.Contains("EditTestSetupPage_NoHardwareInTest")) { errors.Add("EditTestSetupPage_NeedMoreAnalogChannels"); } } if (availableDigitalInputChannels < 0 && !CurrentTestSetup.AllowMissingSensors && bWarnOnNotFullyAssigned) { if (!errors.Contains("EditTestSetupPage_NeedMoreDigitalInputChannels") && !errors.Contains("EditTestSetupPage_NoHardwareInTest")) { errors.Add("EditTestSetupPage_NeedMoreDigitalInputChannels"); } } if (availableDigitalOutputChannels < 0 && !CurrentTestSetup.AllowMissingSensors && bWarnOnNotFullyAssigned) { if (!errors.Contains("EditTestSetupPage_NeedMoreDigitalOutputChannels"/*Strings.StringResources.EditTestSetupPage_NeedMoreDigitalOutputChannels*/) && !errors.Contains("EditTestSetupPage_NoHardwareInTest"/*Strings.StringResources.EditTestSetupPage_NoHardwareInTest */)) { errors.Add("EditTestSetupPage_NeedMoreDigitalOutputChannels"/*Strings.StringResources.EditTestSetupPage_NeedMoreDigitalOutputChannels*/); } } if (availableSquibChannels < 0 && !CurrentTestSetup.AllowMissingSensors && bWarnOnNotFullyAssigned) { if (!errors.Contains("EditTestSetupPage_NeedMoreSquibChannels"/*Strings.StringResources.EditTestSetupPage_NeedMoreSquibChannels*/) && !errors.Contains("EditTestSetupPage_NoHardwareInTest"/*Strings.StringResources.EditTestSetupPage_NoHardwareInTest */)) { errors.Add(""/*Strings.StringResources.EditTestSetupPage_NeedMoreSquibChannels*/); } } if (!ValidateTestSetupName(ref errors, CurrentTestSetup)) { bValid = false; } ValidateStorageSpace(ref errors, CurrentTestSetup);//not fatal ValidateUploadFolder(ref errors, CurrentTestSetup);//not fatal ValidateAutoArmAllowability(ref errors, CurrentTestSetup); return bValid; } public static bool ValidateUploadFolder(ref List errors, TestTemplate currentTest) { //if we have a export ini file, we still allow a blank upload folder if (!currentTest.UploadData || !string.IsNullOrWhiteSpace(currentTest.UploadFolder)) return true; if (SerializedSettings.ExportINIFile.Length > 0) { return true; } errors.Add("TestTestTemplate_InvalidUploadPath"/*Strings.StringResources.TestTestTemplate_InvalidUploadPath*/); return false; } private static bool ValidateAutoArmAllowability(ref List errors, TestTemplate currentTest) { if (!currentTest.DoAutoArm || Properties.Settings.Default.AllowAutoArm) return true; errors.Add("EditTestSetupInfo_AutoArmNotAllowed"); return false; } public static bool ValidateStorageSpace(ref List errors, TestTemplate currentTest) { var bStorageSpaceValid = true; var preTriggerSeconds = currentTest.PreTriggerSeconds; var postTriggerSeconds = currentTest.PostTriggerSeconds; var sampleRate = currentTest.SamplesPerSecond; var secondsToRecord = preTriggerSeconds + postTriggerSeconds; var sampleClocksToRecord = (ulong)(secondsToRecord * sampleRate + 1); var das = new List(); foreach (var to in currentTest.TestObjects) { foreach (var h in to.Hardware) { if (!das.Contains(h)) { das.Add(h); } } } foreach (var to in currentTest.AddedGroups) { foreach (var h in to.Hardware) { if (!das.Contains(h)) { das.Add(h); } } } foreach (var d in das) { double maxSampleClockTicks = d.GetMaxMemoryLong(); if (!(maxSampleClockTicks > 0)) continue; if (!(sampleClocksToRecord > maxSampleClockTicks)) continue; bStorageSpaceValid = false; errors.Add(string.Format("TestTemplate_InsufficientMemory"/*Strings.StringResources.TestTemplate_InsufficientMemory*/, d.SerialNumber, maxSampleClockTicks)); } return bStorageSpaceValid; } public void AddTestGraph(TestGraph tg) { _testGraphs.Add(tg); } /// /// holds test settings that don't have individual db columns /// private readonly TestSettingDictionary _settings = CreateSettingsDictionary(); /// /// loads values from a serialized string into the settings table /// /// public void LoadSettings(string s) { _settings.LoadSettings(s); } /// /// constructs a settings table with some default values /// default values can then have their values changed by LoadSettings if we are loading from a db /// /// private static TestSettingDictionary CreateSettingsDictionary() { var settings = new TestSettingDictionary(); var mySettings = Enum.GetValues(typeof(TestSettingsEnum)).Cast().ToArray(); foreach (var setting in mySettings) { switch (setting) { case TestSettingsEnum.ArmCheckListStep: settings.SetValue(new TestSetting(TestSettingsEnum.ArmCheckListStep.ToString(), Properties.Settings.Default.DefaultTestArmCheckListStep.ToString(), Properties.Settings.Default.DefaultTestArmCheckListStep.ToString())); break; case TestSettingsEnum.CheckListBatteryVoltageCheck: settings.SetValue(new TestSetting(TestSettingsEnum.CheckListBatteryVoltageCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListBatteryVoltageCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListBatteryVoltageCheck.ToString())); break; case TestSettingsEnum.CheckListInputVoltageCheck: settings.SetValue(new TestSetting(TestSettingsEnum.CheckListInputVoltageCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListInputVoltageCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListInputVoltageCheck.ToString())); break; case TestSettingsEnum.CheckListSensorIDCheck: settings.SetValue(new TestSetting(TestSettingsEnum.CheckListSensorIDCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListSensorIDCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListSensorIDCheck.ToString())); break; case TestSettingsEnum.CheckListSquibResistanceCheck: settings.SetValue(new TestSetting(TestSettingsEnum.CheckListSquibResistanceCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListSquibResistanceCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListSquibResistanceCheck.ToString())); break; case TestSettingsEnum.CheckListTriggerStartCheck: settings.SetValue(new TestSetting(TestSettingsEnum.CheckListTriggerStartCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListTriggerStartCheck.ToString(), Properties.Settings.Default.DefaultTestCheckListTriggerStartCheck.ToString())); break; case TestSettingsEnum.CheckListMustPass: settings.SetValue(new TestSetting(TestSettingsEnum.CheckListMustPass.ToString(), Properties.Settings.Default.DefaultTestCheckListMustPass.ToString(), Properties.Settings.Default.DefaultTestCheckListMustPass.ToString())); break; case TestSettingsEnum.EW: settings.SetValue(new TestSetting(TestSettingsEnum.EW.ToString(), Properties.Settings.Default.DefaultTestExcitationWarmupMS.ToString(System.Globalization.CultureInfo.InvariantCulture), Properties.Settings.Default.DefaultTestExcitationWarmupMS.ToString(System.Globalization.CultureInfo.InvariantCulture))); break; default: throw new NotSupportedException("unsupported setting:" + setting.ToString()); } } //initialize here return settings; } /// /// returns the iso support level of object (as determined by it's groups, or the current application support level) /// /// public SerializedSettings.ISOSupportLevels GetISOTestSetupISOSupportLevel() { var nonISOTO = GetNonISOTestObject(); foreach (var to in TestObjects) { if (to == nonISOTO) { //if it only has digital outputs, it could be either a non iso or an iso group, so ignore it var isoto = to.GetISOTestObject(); if (isoto.AllChannels.Where(ch => ch.Required && !string.IsNullOrWhiteSpace(ch.SensorSerialNumber)).Any(ch => !SensorData.IsTestSpecificDigitalOutSN(ch.SensorSerialNumber))) { return SerializedSettings.ISOSupportLevels.NO_ISO; } } else { return to.GetObjectISOLevel(); } } foreach (var to in AddedGroups) { return SerializedSettings.ISOSupportLevels.ISO_ONLY; } return SerializedSettings.ISOSupportLevel; } private TestTestObject CreateNonISOGroupIfNecessary() { foreach (var group in _testObjects) { if (group.SerialNumberOrOriginalSerialNumber == NON_ISO_INTERNAL_GROUP_NAME) { return group; } } //if you got here it wasn't found var guid = Guid.NewGuid(); var template = new TestObjectTemplate(); var isoTO = template.ToISOTestObjectTemplate(); isoTO.Embedded = true; isoTO.TemplateName = guid.ToString(); var db = ISO13499FileDb.IsoDb; template = new TestObjectTemplate(isoTO, ref db); var to = new TestObject { Template = template }; to.GetISOTestObject().Embedded = true; to.GetISOTestObject().OriginalSerialNumber = NON_ISO_INTERNAL_GROUP_NAME; to.SerialNumber = guid.ToString(); var g = new TestTestObject(to); _testObjects.Add(g); TestObjectsAndAddedGroupsList.Add(g); return g; } public TestTestObject GetNonISOTestObject() { return CreateNonISOGroupIfNecessary(); } public void SetTestObjects(bool bMemoryOnly, TestTestObject[] value) { if (!bMemoryOnly) { MarkIsCompleteUnchecked(); } var position = 0; if (SerializedSettings.ISOSupportLevel == SerializedSettings.ISOSupportLevels.NO_ISO) { foreach (var to in value) { if (to.GetObjectISOLevel() != SerializedSettings.ISOSupportLevels.NO_ISO) continue; var availablePositions = to.AvailablePositions; if (position < availablePositions.Length) { to.Position = availablePositions[position]; position++; } else { throw new NotSupportedException("TestTemplate::Not enough positions for groups in test"); } } } SetProperty(ref _testObjects, new List(value), TestTemplateTags.TestObjects.ToString()); OnPropertyChanged(TestTemplateTags.AvailableTestObjects.ToString()); //No longer needed for added test objects combobox, but still used to update the remaining list of available test objects OnPropertyChanged(TestTemplateTags.AllTestObjects.ToString()); OnPropertyChanged("TestObjectsAndAddedGroups"); } public void AddTestObject(TestObject to, int excitationWarmupMs, double targetSampleRate, string testobject, string position) { if (null != to) { var tto = new TestTestObject(to) { ExcitationWarmupTimeMS = excitationWarmupMs, TargetSampleRate = targetSampleRate }; tto.SetPosition(position); tto.SetTestObject(testobject); //if this is the NON ISO group (which is created by default), the replace the original NONE group ... if (tto.SerialNumberOrOriginalSerialNumber == NON_ISO_INTERNAL_GROUP_NAME) { var index = -1; for (var i = 0; i < TestObjectsAndAddedGroupsList.Count; i++) { if (TestObjectsAndAddedGroupsList[i].SerialNumberOrOriginalSerialNumber != NON_ISO_INTERNAL_GROUP_NAME) continue; index = i; break; } if (index >= 0) { TestObjectsAndAddedGroupsList.RemoveAt(index); } index = -1; for (var i = 0; i < _testObjects.Count; i++) { if (_testObjects[i].SerialNumberOrOriginalSerialNumber != NON_ISO_INTERNAL_GROUP_NAME) continue; index = i; break; } if (index >= 0) { _testObjects.RemoveAt(index); } } _testObjects.Add(tto); TestObjectsAndAddedGroupsList.Add(tto); OnPropertyChanged(TestTemplateTags.TestObjects.ToString()); OnPropertyChanged(TestTemplateTags.DefaultNumberRealtimeGraphs.ToString()); } } public void AddTestObject(string serialNumber, int excitationWarmupMs, double targetSampleRate, string testobject, string position) { var to = TestObjectList.TestObjectsList.GetTestObject(serialNumber); AddTestObject(to, excitationWarmupMs, targetSampleRate, testobject, position); OnPropertyChanged(TestTemplateTags.DefaultNumberRealtimeGraphs.ToString()); } public void AddAddedGroup(TestObject to, string testobject, string position) { if (null == to) return; var tto = new TestTestObject(to); tto.SetPosition(position); tto.SetTestObject(testobject); tto.SerialNumberConverted = tto.SerialNumber.Remove(0, Name.Length + 1); tto.TestSetupName = Name; _addedGroups.Add(tto); TestObjectsAndAddedGroupsList.Add(tto); OnPropertyChanged(TestTemplateTags.DefaultNumberRealtimeGraphs.ToString()); } public void AddAddedGroup(string serialNumber, string testobject, string position) { var to = TestObjectList.TestObjectsList.GetAddedGroup(serialNumber); AddAddedGroup(to, testobject, position); OnPropertyChanged(TestTemplateTags.DefaultNumberRealtimeGraphs.ToString()); } public int GetNumberOfRealtimeSupportedChannels() { var count = 0; foreach (var to in TestObjects) { var isoto = to.GetISOTestObject(); count += isoto.AllChannels.Where(ch => ch.Required && !string.IsNullOrWhiteSpace(ch.SensorSerialNumber)).Select(ch => GetSensor(ch.SensorSerialNumber, to.SerialNumber, ch.Name)).Where(sd => null != sd).Count(sd => !sd.IsDigitalInput() && !sd.IsDigitalOutput() && !sd.IsSquib()); } foreach (var to in AddedGroups) { var isoto = to.GetISOTestObject(); count += isoto.AllChannels.Where(ch => ch.Required && !string.IsNullOrWhiteSpace(ch.SensorSerialNumber)).Select(ch => GetSensor(ch.SensorSerialNumber, to.SerialNumber, ch.Name)).Where(sd => null != sd).Count(sd => !sd.IsDigitalInput() && !sd.IsDigitalOutput() && !sd.IsSquib()); } if (0 == count) { count = MaxRealtimeChannels; } return count; } private readonly Dictionary _oldChannelLookup = new Dictionary(); private readonly Dictionary _channelLookup = new Dictionary(); private readonly Dictionary _sessionOpen = new Dictionary(); public void AddCalculatedChannel(CalculatedValueClass ch) { _calculatedChannels.Add(ch); } private readonly Dictionary _metaDataLookup = new Dictionary(); private TestSetupMetaData _testSetupMeta = new TestSetupMetaData(Properties.Settings.Default.RequireXCrashCompatibilityForISOExports); public TestSetupMetaData GetTestMetaData() { return _testSetupMeta; } public void SetTestSetupMetaData(TestSetupMetaData meta) { _testSetupMeta = meta; } public TestObjectMetaData[] GetMetaData() { var metas = new List(); foreach (var to in TestObjects.Select(x=>x.TestObject)) { if (to == null) continue; var m = GetMetaData(to.Test_Object[0]); if (!metas.Contains(m)) { metas.Add(m); } } foreach (var to in AddedGroups.Select(x=>x.TestObject)) { if (to == null) continue; var m = GetMetaData(to.Test_Object[0]); if (!metas.Contains(m)) { metas.Add(m); } } metas.Sort(CompareMeta); return metas.ToArray(); } public TestObjectMetaData GetMetaData(char testobject) { if (!_metaDataLookup.ContainsKey(testobject)) { _metaDataLookup.Add(testobject, new TestObjectMetaData(testobject)); } return _metaDataLookup[testobject]; } private int CompareMeta(TestObjectMetaData left, TestObjectMetaData right) { if (left == right) { return 0; } if (null == left) { return -1; } return null == right ? 1 : left.TestObject.CompareTo(right.TestObject); } public void SetMetaData(char testobject, TestObjectMetaData meta) { _metaDataLookup[testobject] = meta; } } }