/* * DTS.Slice.Control.Event.Module.cs * * Copyright © 2009 * Diversified Technical Systems, Inc. * All Rights Reserved */ using DTS.Common.DAS.Concepts; using DTS.Common.Utilities; using DTS.Common.Utilities.DotNetProgrammingConstructs; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using DTS.Common.Enums.Sensors; using DTS.Common.Classes.Sensors; using DTS.Common.DASResource; using DTS.Common.Enums; using DTS.Common.Utilities.Logging; using DTS.Common.Enums.DASFactory; namespace DTS.Slice.Control { // *** see DTS.Slice.Control.Event.cs *** public partial class Event { /// /// Representation of a Slice Control event module. /// public partial class Module : Exceptional, Serialization.Test.Module.IConvertable { public Module() { try { //this.InitializeReviewableAttributes(this.ReviewableAttributes); } catch (System.Exception ex) { throw new Exception("encountered problem zero-parameter constructing " + GetType().FullName, ex); } } /// /// Initialize an instance of the DTS.Slice.Control.Event.Module class. /// /// /// /// The parent of this module. /// /// //TODO: this() is not base class public Module(Event parentEvent) : this() { try { ParentEvent = parentEvent; } catch (System.Exception ex) { throw new Exception("encounterd problem 1-parameter constructing " + GetType().FullName, ex); } } /// /// Initialize an instance of the DTS.Slice.Control.Event.Module class. /// /// /// /// A with which to initialize this object. /// /// /// /// The parent of this module. /// /// /// public Module(Serialization.Test.Module that, Event parent, Serialization.Test.ReportErrors reportErrors) : this(parent) { try { FromDtsSerializationTestModule(that, reportErrors); } catch (System.IO.InvalidDataException) { throw; } catch (System.Exception ex) { throw new Exception("encountered problem 2-parameter constructing " + GetType().FullName, ex); } } /// /// The that contains this module. /// public Event ParentEvent { get => _ParentEvent.Value; private set => _ParentEvent.Value = value; } private readonly Property _ParentEvent = new Property( typeof(Module).Namespace + ".Event.Module.ParentEvent", null, false ); public void SetParentEvent(Event e) { _ParentEvent.Value = e; } /// /// Get/set the list of channels on this event module. /// public List Channels { get => _Channels.Value; set => _Channels.Value = value; } private readonly Property> _Channels = new Property>("Event.Module.Channels", new List(), true); /// /// Get/set the module number of this event module. /// public int Number { get => _Number.Value; set => _Number.Value = value; } private readonly Property _Number = new Property("Event.Module.Number", 0, false); /// /// Get/set the serial number for this DAS. /// public string DasSerialNumber { get => _dasSerialNumber.Value; set => _dasSerialNumber.Value = value; } private readonly Property _dasSerialNumber = new Property(typeof(Module).Namespace + ".Event.Module.DasSerialNumber", "", true); /// /// Get/set the serial number for this DAS. /// public string Description { get => _Description.Value; set => _Description.Value = value; } private readonly Property _Description = new Property( typeof(Module).Namespace + ".Event.Module.Description", "", true ); public bool IsSlice6DBModule() { return Description == DTS.Common.Constants.DUMMY_MOD_DESCRIP_S6DB; } /// /// Get/set the base serial number for this DAS. /// public string BaseSerialNumber { get => _BaseSerialNumber.Value; set => _BaseSerialNumber.Value = value; } private readonly Property _BaseSerialNumber = new Property( typeof(Module).Namespace + ".Event.Module.BaseSerialNumber", "", true ); /// /// Get/set the number of requested seconds pre-trigger for this event module. /// public double RequestedPreTriggerSeconds { get => _RequestedPreTriggerSeconds.Value; set => _RequestedPreTriggerSeconds.Value = value; } private readonly Property _RequestedPreTriggerSeconds = new Property("Event.Module.RequestedPreTriggerSeconds", 0.0, false); /// /// Get/set the number of requested seconds post-trigger for this event module. /// public double RequestedPostTriggerSeconds { get => _RequestedPostTriggerSeconds.Value; set => _RequestedPostTriggerSeconds.Value = value; } private readonly Property _RequestedPostTriggerSeconds = new Property("Event.Module.RequestedPostTriggerSeconds", 0.0, false); /// /// Get/set the number of seconds pre-trigger for this event module. /// public double PreTriggerSeconds { get => _PreTriggerSeconds.Value; set => _PreTriggerSeconds.Value = value; } private readonly Property _PreTriggerSeconds = new Property("Event.Module.PreTriggerSeconds", 0.0, false); /// /// Get/set the number of seconds post-trigger for this event module. /// public double PostTriggerSeconds { get => _PostTriggerSeconds.Value; set => _PostTriggerSeconds.Value = value; } private readonly Property _PostTriggerSeconds = new Property("Event.Module.PostTriggerSeconds", 0.0, false); /// /// Get/set the number of samples in this event modules. /// public ulong NumberOfSamples { get => _NumberOfSamples.Value; set => _NumberOfSamples.Value = value; } private readonly Property _NumberOfSamples = new Property("Event.Module.NumberOfSamples", 0, false); /// /// Get/set the number of unsubsampled samples in this event modules. /// public ulong UnsubsampledNumberOfSamples { get => _UnsubsampledNumberOfSamples.Value; set => _UnsubsampledNumberOfSamples.Value = value; } private readonly Property _UnsubsampledNumberOfSamples = new Property("Event.Module.UnsubsampledNumberOfSamples", 0, true); /// /// Get/set the trigger sample numbers for this event module. /// public List TriggerSampleNumbers { get => _TriggerSampleNumbers.Value; set => _TriggerSampleNumbers.Value = value; } private readonly Property> _TriggerSampleNumbers = new Property>("Event.Module.TriggerSampleNumbers", null, false); /// /// Get/set the unsubsampled trigger sample numbers for this event module. /// public List UnsubsampledTriggerSampleNumbers { get => _UnsubsampledTriggerSampleNumbers.Value; set => _UnsubsampledTriggerSampleNumbers.Value = value; } private readonly Property> _UnsubsampledTriggerSampleNumbers = new Property>("Event.Module.UnsubsampledTriggerSampleNumbers", new List(), true); /// /// Get/set the start record sample number for this event module. /// public ulong StartRecordSampleNumber { get => _StartRecordSampleNumber.Value; set => _StartRecordSampleNumber.Value = value; } private readonly Property _StartRecordSampleNumber = new Property("Event.Module.StartRecordSampleNumber", 0, false); /// /// Get/set the sample rate for this event module. /// public float SampleRateHz { get => _SampleRateHz.Value; set => _SampleRateHz.Value = value; } private readonly Property _SampleRateHz = new Property("Event.Module.SampleRateHz", 0, false); /// /// Get/set the start record timestamp in seconds for this event module. /// public double StartRecordTimestampSec { get => _StartRecordTimestampSec.Value; set => _StartRecordTimestampSec.Value = value; } private readonly Property _StartRecordTimestampSec = new Property("Event.Module.StartRecordTimestampSec", 0, false); /// /// Get/set the start record timestamp in nanoseconds for this event module. /// public double StartRecordTimestampNanoSec { get => _StartRecordTimestampNanoSec.Value; set => _StartRecordTimestampNanoSec.Value = value; } private readonly Property _StartRecordTimestampNanoSec = new Property("Event.Module.StartRecordTimestampNanoSec", 0, false); /// /// Get/set the trigger timestamp in seconds for this event module. /// public double TriggerTimestampSec { get => _TriggerTimestampSec.Value; set => _TriggerTimestampSec.Value = value; } private readonly Property _TriggerTimestampSec = new Property("Event.Module.TriggerTimestampSec", 0, false); /// /// Get/set the trigger timestamp in nanoseconds for this event module. /// public double TriggerTimestampNanoSec { get => _TriggerTimestampNanoSec.Value; set => _TriggerTimestampNanoSec.Value = value; } private readonly Property _TriggerTimestampNanoSec = new Property("Event.Module.TriggerTimestampNanoSec", 0, false); /// /// Get/set the whether or not PTP master sync is used for this event module. /// public bool PTPMasterSync { get => _PTPMasterSync.Value; set => _PTPMasterSync.Value = value; } private readonly Property _PTPMasterSync = new Property("Event.Module.PTPMasterSync", false, false); /// /// Get/set the System Id /// public string SystemID { get => _systemID.Value; set => _systemID.Value = value; } private readonly Property _systemID = new Property(typeof(Module).Namespace + ".Event.Module.SystemID", "", true); /// /// Get/set the System Location /// public string SystemLocation { get => _systemLocation.Value; set => _systemLocation.Value = value; } private readonly Property _systemLocation = new Property(typeof(Module).Namespace + ".Event.Module.SystemLocation", "", true); /// /// Get/set TargetAxisOne /// public double TargetAxisOne { get => _targetAxisOne.Value; set => _targetAxisOne.Value = value; } private readonly Property _targetAxisOne = new Property(".Event.Module.TargetAxisOne", 0, false); /// /// Get/set TargetAxisTwo /// public double TargetAxisTwo { get => _targetAxisTwo.Value; set => _targetAxisTwo.Value = value; } private readonly Property _targetAxisTwo = new Property(".Event.Module.TargetAxisTwo", 0, false); /// /// Get/set TargetAxisX /// public double TargetAxisX { get => _targetAxisX.Value; set => _targetAxisX.Value = value; } private readonly Property _targetAxisX = new Property(".Event.Module.TargetAxisX", double.NaN, false); /// /// Get/set TargetAxisY /// public double TargetAxisY { get => _targetAxisY.Value; set => _targetAxisY.Value = value; } private readonly Property _targetAxisY = new Property(".Event.Module.TargetAxisY", double.NaN, false); /// /// Get/set TargetAxisZ /// public double TargetAxisZ { get => _targetAxisZ.Value; set => _targetAxisZ.Value = value; } private readonly Property _targetAxisZ = new Property(".Event.Module.TargetAxisZ", double.NaN, false); /// /// Get/set the tilt sensor X axis value. /// public double TiltSensorAxisXDegreesPre { get => _TiltSensorAxisXDegreesPre.Value; set => _TiltSensorAxisXDegreesPre.Value = value; } private readonly Property _TiltSensorAxisXDegreesPre = new Property("Event.Module.TiltSensorAxisXDegreesPre", double.NaN, false); /// /// Get/set the tilt sensor Y axis value. /// public double TiltSensorAxisYDegreesPre { get => _TiltSensorAxisYDegreesPre.Value; set => _TiltSensorAxisYDegreesPre.Value = value; } private readonly Property _TiltSensorAxisYDegreesPre = new Property("Event.Module.TiltSensorAxis2DegreesPre", double.NaN, false); /// /// Get/set the tilt sensor Z axis value. /// public double TiltSensorAxisZDegreesPre { get => _TiltSensorAxisZDegreesPre.Value; set => _TiltSensorAxisZDegreesPre.Value = value; } private readonly Property _TiltSensorAxisZDegreesPre = new Property("Event.Module.TiltSensorAxisZDegreesPre", double.NaN, false); /// /// Get/set the tilt sensor X axis value. /// public double TiltSensorAxisXDegreesPost { get => _TiltSensorAxisXDegreesPost.Value; set => _TiltSensorAxisXDegreesPost.Value = value; } private readonly Property _TiltSensorAxisXDegreesPost = new Property("Event.Module.TiltSensorAxisXDegreesPost", double.NaN, false); /// /// Get/set the tilt sensor Y axis value. /// public double TiltSensorAxisYDegreesPost { get => _TiltSensorAxisYDegreesPost.Value; set => _TiltSensorAxisYDegreesPost.Value = value; } private readonly Property _TiltSensorAxisYDegreesPost = new Property("Event.Module.TiltSensorAxisYDegreesPost", double.NaN, false); /// /// Get/set the tilt sensor Z axis value. /// public double TiltSensorAxisZDegreesPost { get => _TiltSensorAxisZDegreesPost.Value; set => _TiltSensorAxisZDegreesPost.Value = value; } private readonly Property _TiltSensorAxisZDegreesPost = new Property("Event.Module.TiltSensorAxisZDegreesPost", double.NaN, false); /// /// Get/set the temperature sensor location 1 value. /// public float TemperatureLocation1Pre { get => _TemperatureLocation1Pre.Value; set => _TemperatureLocation1Pre.Value = value; } private readonly Property _TemperatureLocation1Pre = new Property("Event.Module.TemperatureLocation1Pre", float.NaN, false); /// /// Get/set the temperature sensor location 2 value. /// public float TemperatureLocation2Pre { get => _TemperatureLocation2Pre.Value; set => _TemperatureLocation2Pre.Value = value; } private readonly Property _TemperatureLocation2Pre = new Property("Event.Module.TemperatureLocation2Pre", float.NaN, false); /// /// Get/set the temperature sensor location 3 value. /// public float TemperatureLocation3Pre { get => _TemperatureLocation3Pre.Value; set => _TemperatureLocation3Pre.Value = value; } private readonly Property _TemperatureLocation3Pre = new Property("Event.Module.TemperatureLocation3Pre", float.NaN, false); /// /// Get/set the temperature sensor location 4 value. /// public float TemperatureLocation4Pre { get => _TemperatureLocation4Pre.Value; set => _TemperatureLocation4Pre.Value = value; } private readonly Property _TemperatureLocation4Pre = new Property("Event.Module.TemperatureLocation4Pre", float.NaN, false); /// /// Get/set the temperature sensor location 1 post value. /// public float TemperatureLocation1Post { get => _TemperatureLocation1Post.Value; set => _TemperatureLocation1Post.Value = value; } private readonly Property _TemperatureLocation1Post = new Property("Event.Module.TemperatureLocation1Post", float.NaN, false); /// /// Get/set the temperature sensor location 2 value. /// public float TemperatureLocation2Post { get => _TemperatureLocation2Post.Value; set => _TemperatureLocation2Post.Value = value; } private readonly Property _TemperatureLocation2Post = new Property("Event.Module.TemperatureLocation2Post", float.NaN, false); /// /// Get/set the temperature sensor location 3 post value. /// public float TemperatureLocation3Post { get => _TemperatureLocation3Post.Value; set => _TemperatureLocation3Post.Value = value; } private readonly Property _TemperatureLocation3Post = new Property("Event.Module.TemperatureLocation3Post", float.NaN, false); /// /// Get/set the temperature sensor location 4 post value. /// public float TemperatureLocation4Post { get => _TemperatureLocation4Post.Value; set => _TemperatureLocation4Post.Value = value; } private readonly Property _TemperatureLocation4Post = new Property("Event.Module.TemperatureLocation4Post", float.NaN, false); /// /// Get/set the InputVoltage /// public double InputVoltage { get => _inputVoltage.Value; set => _inputVoltage.Value = value; } private readonly Property _inputVoltage = new Property("Event.Module.InputVoltage", 0, false); /// /// Get/set the BatteryVoltage /// public double BatteryVoltage { get => _batteryVoltage.Value; set => _batteryVoltage.Value = value; } private readonly Property _batteryVoltage = new Property("Event.Module.BatteryVoltage", 0, false); /// /// Get/set the AA filter rate for this event module. /// public float AaFilterRateHz { get => _AaFilterRateHz.Value; set => _AaFilterRateHz.Value = value; } private readonly Property _AaFilterRateHz = new Property("Event.Module.AaFilterRateHz", 0, false); /// /// Get/set the nominal /// excitation voltage of this module. /// public ExcitationVoltageOptions.ExcitationVoltageOption NominalExcitationVoltage { get => _NominalExcitationVoltage.Value; set => _NominalExcitationVoltage.Value = value; } private readonly Property _NominalExcitationVoltage = new Property( typeof(Module).Namespace + ".Event.Module.NominalExcitationVoltage", ExcitationVoltageOptions.ExcitationVoltageOption.Volt5, true ); /// /// Get/set the of this module. /// public DFConstantsAndEnums.RecordingMode RecordingMode { get => _RecordingMode.Value; set => _RecordingMode.Value = value; } private readonly Property _RecordingMode = new Property("Event.Module.RecordingMode", DFConstantsAndEnums.RecordingMode.CircularBuffer, false); public LinkedList PartialUnfilteredData = null; // Method for creating channel files directly to disk. // Change that linked list class to something that will handle this... // I think what we need to do instead is to change the class/data structure that represents // the channel data into an object that maybe double passes the reference, or derives from the // memory-mapped file objecct, but it can also have extra methods and throw an exception if we // try to access it before it's been properly initialized. /// /// Get/set the data value list for this channel. /// public List UnfilteredData { get => _UnfilteredData.Value; set { try { // Reset unfiltered data caches. _UnfilteredData.Value = value; // Reset filtered data caches. _Data = null; //lock (previouslyFilteredDataLock) //{ // _previouslyFilteredData.Clear(); //} // Update the data count. if (value is Serialization.SliceRaw.File.PersistentDasTimestamp persistentModule) DataCount = persistentModule.Count; else DataCount = value.Count; } catch (System.Exception ex) { throw new Exception("encountered problem setting unfiltered data", ex); } } } private readonly Property> _UnfilteredData = new Property>("DTS.Control.Event.Module.Data", null, false); /// /// Get the filtered long-converted data for this channel. /// public List Data { get { try { if (UseFilterCaching) { if (null == _Data) return _Data = new List(/*GetDataFilteredBy(CurrentFilter, DataDisplayUnits.Adc)*/); return _Data; } return new List(/*GetDataFilteredBy(CurrentFilter, DataDisplayUnits.Adc)*/); } catch (System.Exception ex) { throw new Exception("encountered problem getting filtered data", ex); } } } private List _Data = null; /// /// Get/set the switch to enable/disable filter caching. /// public bool UseFilterCaching { //for now NEVER cache /*get { return _UseFilterCaching.Value; } set { if (false == (_UseFilterCaching.Value = value)) { // // If we disable filter caching on the fly, make sure the caches are cleared. // _Data = null; _DataEu = null; _DataMv = null; lock (previouslyFilteredDataLock) { _previouslyFilteredData.Clear(); } } }*/ get => false; set { } } /*private Property _UseFilterCaching = new Property( typeof(Event.Module.Channel).Namespace + ".Event.Module.Channel.UseFilterCaching", true, true ); */ /// /// Get the data count for this channel. /// public int DataCount { get; private set; } public string FileName { get => _FileName.Value; set => _FileName.Value = value; } private readonly Property _FileName = new Property( typeof(Channel).Namespace + ".Event.Module.FileName", "", true ); public void UnSet() { System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.Batch; System.Runtime.GCSettings.LargeObjectHeapCompactionMode = System.Runtime.GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(); } /// /// Set the applicable properties of this object from the specified target object. /// /// /// /// The that is to have the information it /// shares with this object copied. /// /// public void SetPropertyValuesFrom(DASLib.Service.DASModule that, int eventIndex) { try { TriggerSampleNumbers = new List(null != that.TriggerSampleNumbers ? that.TriggerSampleNumbers : new ulong[] { }); NumberOfSamples = that.NumberOfSamples; if (null != that.OwningDAS.EventGuids && that.OwningDAS.EventGuids.Any()) { ParentEvent.Guid = that.OwningDAS.EventGuids[0]; } ushort faultFlag = 0; try { faultFlag = ParentEvent.FaultFlags; } catch (System.Exception ex) { APILogger.Log("Failed to set fault flags", ex); } if (null != that.OwningDAS.FaultFlags && that.OwningDAS.FaultFlags.Any()) { if (eventIndex >= that.OwningDAS.FaultFlags.Length || eventIndex < 0) { eventIndex = 0; } ParentEvent.FaultFlags = Convert.ToUInt16(faultFlag | that.OwningDAS.FaultFlags[eventIndex]); //this is very tricky - we are always using index 0 here because the service ownload downloads one event at a time and so //the actual fault flags available at this time are only for that one given event being downloaded ... } SetExtendedFaultFlags(ParentEvent, that); } catch (System.Exception ex) { throw new Exception("encountered problem setting property from target object " + (null != that ? "\"" + that.ToString() + "\"" : ""), ex); } } private void SetExtendedFaultFlags(Event parentEvent, DASLib.Service.DASModule that) { uint extendedFaultFlag1 = 0, extendedFaultFlag2 = 0, extendedFaultFlag3 = 0, extendedFaultFlag4 = 0; uint dasExtFaultFlag1 = 0, dasExtFaultFlag2 = 0, dasExtFaultFlag3 = 0, dasExtFaultFlag4 = 0; try { extendedFaultFlag1 = parentEvent.ExtendedFaultFlags1; extendedFaultFlag2 = parentEvent.ExtendedFaultFlags2; extendedFaultFlag3 = parentEvent.ExtendedFaultFlags3; extendedFaultFlag4 = parentEvent.ExtendedFaultFlags4; if (null != that.OwningDAS && null != that.OwningDAS.ExtendedFaultFlags1 && that.OwningDAS.ExtendedFaultFlags1.Length > 0) { dasExtFaultFlag1 = that.OwningDAS.ExtendedFaultFlags1[0]; dasExtFaultFlag2 = that.OwningDAS.ExtendedFaultFlags2[0]; dasExtFaultFlag3 = that.OwningDAS.ExtendedFaultFlags3[0]; dasExtFaultFlag4 = that.OwningDAS.ExtendedFaultFlags4[0]; } } catch (Exception ex) { APILogger.Log(ex); } parentEvent.ExtendedFaultFlags1 = Convert.ToUInt32(extendedFaultFlag1 | dasExtFaultFlag1); parentEvent.ExtendedFaultFlags2 = Convert.ToUInt32(extendedFaultFlag2 | dasExtFaultFlag2); parentEvent.ExtendedFaultFlags3 = Convert.ToUInt32(extendedFaultFlag3 | dasExtFaultFlag3); parentEvent.ExtendedFaultFlags4 = Convert.ToUInt32(extendedFaultFlag4 | dasExtFaultFlag4); } /// /// Test the specified object for equality with this object. /// /// /// /// The to be tested for equality. /// /// /// /// true if the specified object has memeberwise equality with /// this object; false otherwise. /// /// public override bool Equals(object obj) { try { var that = obj as Module; return null != that && Description.Equals(that.Description) && AaFilterRateHz.Equals(that.AaFilterRateHz) && Number.Equals(that.Number) && DasSerialNumber.Equals(that.DasSerialNumber) && NumberOfSamples.Equals(that.NumberOfSamples) && UnsubsampledNumberOfSamples.Equals(that.UnsubsampledNumberOfSamples) && RequestedPostTriggerSeconds.Equals(that.RequestedPostTriggerSeconds) && RequestedPreTriggerSeconds.Equals(that.RequestedPreTriggerSeconds) && PostTriggerSeconds.Equals(that.PostTriggerSeconds) && PreTriggerSeconds.Equals(that.PreTriggerSeconds) && RecordingMode.Equals(that.RecordingMode) && SampleRateHz.Equals(that.SampleRateHz) && StartRecordSampleNumber.Equals(that.StartRecordSampleNumber) && TriggerSampleNumbersEquals(that.TriggerSampleNumbers) && UnsubsampledTriggerSampleNumbersEquals(that.UnsubsampledTriggerSampleNumbers) && ChannelsEquals(that.Channels); } catch (System.Exception ex) { throw new Exception( string.Format( Strings.DTS_Slice_Control_Equals_ComparisonFailedString, null != obj ? "\"" + obj.ToString() + "\"" : Strings.DTS_Slice_Control_NullIndicatorString), ex); } } /// /// Test the specified object's trigger sample number list for equality with this /// object's module list. /// /// /// /// The list of object to be /// compared for equality with this event's equivalent. /// /// /// /// true if the two lists contain equivalent-valued members; /// false otherwise. /// /// private bool TriggerSampleNumbersEquals(List thoseTriggerSampleNumbers) { try { if (null == thoseTriggerSampleNumbers || TriggerSampleNumbers.Count != thoseTriggerSampleNumbers.Count) return false; return !thoseTriggerSampleNumbers.Where((t, i) => !TriggerSampleNumbers[i].Equals(t)).Any(); } catch (System.Exception ex) { throw new Exception(Strings.DTS_Slice_Control_Event_Module_TriggerSampleNumbersEquals_ComparisonFailedString, ex); } } /// /// Test the specified object's unsubsampled trigger sample number list for equality with this /// object's module list. /// /// /// /// The list of object to be /// compared for equality with this event's equivalent. /// /// /// /// true if the two lists contain equivalent-valued members; /// false otherwise. /// /// private bool UnsubsampledTriggerSampleNumbersEquals(List thoseUnsubsampledTriggerSampleNumbers) { try { if (null == thoseUnsubsampledTriggerSampleNumbers || UnsubsampledTriggerSampleNumbers.Count != thoseUnsubsampledTriggerSampleNumbers.Count) return false; return !thoseUnsubsampledTriggerSampleNumbers.Where((t, i) => !UnsubsampledTriggerSampleNumbers[i].Equals(t)).Any(); } catch (System.Exception ex) { throw new Exception("unsubsampled trigger sample number arrays do not match", ex); } } /// /// Test the specified object's module list for equality with this object's /// module list. /// /// /// /// The list of objects to be /// compared for equality with this module's equivalent. /// /// /// /// true if the two lists contain equivalent-valued members; /// false otherwise. /// /// private bool ChannelsEquals(List thoseChannels) { try { if (null == thoseChannels || Channels.Count != thoseChannels.Count) return false; return !thoseChannels.Where((t, i) => !Channels[i].Equals(t)).Any(); } catch (System.Exception ex) { throw new Exception(Strings.DTS_Slice_Control_Event_Module_ChannelsEquals_ComparisonFailedString, ex); } } /// /// Return the hash code for this object. /// /// /// /// The hash code for this object. /// /// public override int GetHashCode() { return base.GetHashCode(); } /// /// Convert this object into a DTS.Serialization.Test.Module. /// /// /// /// A equivalent to this object. /// /// public Serialization.Test.Module ToDtsSerializationTestModule(Serialization.Test parentTest) { try { var that = new Serialization.Test.Module(parentTest) { Description = Description, AaFilterRateHz = AaFilterRateHz, Number = Number, SerialNumber = DasSerialNumber, NumberOfSamples = NumberOfSamples, UnsubsampledNumberOfSamples = UnsubsampledNumberOfSamples, RequestedPostTriggerSeconds = RequestedPostTriggerSeconds, RequestedPreTriggerSeconds = RequestedPreTriggerSeconds, PostTriggerSeconds = PostTriggerSeconds, PreTriggerSeconds = PreTriggerSeconds, RecordingMode = RecordingMode, SampleRateHz = SampleRateHz, StartRecordSampleNumber = StartRecordSampleNumber, TriggerSampleNumbers = TriggerSampleNumbers, UnsubsampledTriggerSampleNumbers = UnsubsampledTriggerSampleNumbers, BaseSerialNumber = BaseSerialNumber, StartRecordTimestampSec = StartRecordTimestampSec, StartRecordTimestampNanoSec = StartRecordTimestampNanoSec, TriggerTimestampSec = TriggerTimestampSec, TriggerTimestampNanoSec = TriggerTimestampNanoSec, PTPMasterSync = PTPMasterSync, SystemID = SystemID, SystemLocation = SystemLocation, TargetAxisOne = TargetAxisOne, TargetAxisTwo = TargetAxisTwo, TargetAxisX = TargetAxisX, TargetAxisY = TargetAxisY, TargetAxisZ = TargetAxisZ, TiltSensorAxisXDegreesPre = TiltSensorAxisXDegreesPre, TiltSensorAxisYDegreesPre = TiltSensorAxisYDegreesPre, TiltSensorAxisZDegreesPre = TiltSensorAxisZDegreesPre, TiltSensorAxisXDegreesPost = TiltSensorAxisXDegreesPost, TiltSensorAxisYDegreesPost = TiltSensorAxisYDegreesPost, TiltSensorAxisZDegreesPost = TiltSensorAxisZDegreesPost, TemperatureLocation1Pre = TemperatureLocation1Pre, TemperatureLocation2Pre = TemperatureLocation2Pre, TemperatureLocation3Pre = TemperatureLocation3Pre, TemperatureLocation4Pre = TemperatureLocation4Pre, TemperatureLocation1Post = TemperatureLocation1Post, TemperatureLocation2Post = TemperatureLocation2Post, TemperatureLocation3Post = TemperatureLocation3Post, TemperatureLocation4Post = TemperatureLocation4Post, InputVoltage = InputVoltage, BatteryVoltage = BatteryVoltage, Channels = new List() }; // Create a test module channel to embody each channel conversion, and then // copy over all relevant channel data members. foreach (var thisChannel in Channels) { if ( thisChannel is CANInputChannel) { continue; }//not stored in DTS file //10988 Do not download/write/purge unneeded files; Only write required channels if (thisChannel.IsConfigured) { // // Create a test module channel to embody each channel conversion, and then // copy over all relevant channel data members. // that.Channels.Add(thisChannel.ToDtsSerializationTestModuleChannel(that)); if (!string.IsNullOrWhiteSpace(thisChannel.LinearSensorCalibration)) { var newThisChannel = new Event.Module.AnalogInputChannel(that.Channels.Last(), thisChannel.ParentModule, thisChannel.AbsoluteNumber); var values = thisChannel.LinearSensorCalibration.Split(SensorConstants.LinearValuesSeparator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var records = new CalibrationRecords(values[0]); var methods = new ZeroMethods(values[1]); var offsets = new InitialOffsets(values[2]); //write over newThisChannel.ZeroPoint = records.Records.First().ZeroPoint; //newThisChannel.DesiredRangeEU newThisChannel.EngineeringUnits = records.Records.First().EngineeringUnits; newThisChannel.InitialOffset = offsets.Offsets.First().ToDbSerializeString(); switch (offsets.Offsets.First().Form) { case InitialOffsetTypes.EU: newThisChannel.InitialEu = offsets.Offsets.First().EU; break; default: newThisChannel.InitialEu = 0D; break; } newThisChannel.IsoCode = records.Records.First().ISOCode; if (thisChannel is DTS.Common.DAS.Concepts.DAS.Channel.IIsoCodeAware isoThisChannel) { //14226 Exports not using test obj/pos set by the group in a test when using a nonlinear sensor with a linear CAL //the calibration record here has the iso code set from the linear added cal from the sensor db //however we want the position and test object fields to come from the non linear channel as it was set up in the test properly //and the non linear was not //BUT we really only want to do this if in fact both channels have a test object and position field filled in //if they don't that means the user did not require unique isocodes and never filled them in ... if (newThisChannel.IsoCode.Length >= 2 && isoThisChannel.IsoCode.Length >= 2) { var iso = new DTS.Common.ISO.IsoCode(newThisChannel.IsoCode); var isoThis = new DTS.Common.ISO.IsoCode(isoThisChannel.IsoCode); iso.Position = isoThis.Position; iso.TestObject = isoThis.TestObject; newThisChannel.IsoCode = iso.StringRepresentation; } } newThisChannel.LinearizationFormula = new Common.Classes.Sensors.LinearizationFormula(); newThisChannel.AtCapacity = records.Records.First().AtCapacity; newThisChannel.MvPerEu = records.Records.First().Sensitivity; newThisChannel.Sensitivity = records.Records.First().Sensitivity; newThisChannel.SensitivityUnits = records.Records.First().SensitivityUnits; newThisChannel.CapacityOutputIsBasedOn = records.Records.First().CapacityOutputIsBasedOn; newThisChannel.ZeroAverageWindow = new IntervalSec(methods.Methods.First().Start, methods.Methods.First().End); newThisChannel.ZeroMethod = methods.Methods.First().Method; var newThatChannel = newThisChannel.ToDtsSerializationTestModuleChannel(that); if (thisChannel.UnfilteredAlternateData is Serialization.SliceRaw.File.PersistentChannel) newThatChannel.PersistentChannelInfo = (thisChannel.UnfilteredAlternateData as Serialization.SliceRaw.File.PersistentChannel); that.Channels.Add(newThatChannel); } } } return that; } catch (System.Exception ex) { throw new Exception("encountered problem converting " + GetType().FullName + " to " + typeof(Serialization.Test.Module).FullName, ex); } } /// /// Initialize this object from a DTS.Serialization.Test.Module. /// /// /// /// A from which to initialize this object. /// /// //TODO: use more descriptive variable names public void FromDtsSerializationTestModule(Serialization.Test.Module that, Serialization.Test.ReportErrors reportErrors) { var errors = new List(); try { if (null == that) { throw new ArgumentNullException($"cannot set this object's properties from null serialization test module reference"); } Description = that.Description; AaFilterRateHz = that.AaFilterRateHz; Number = that.Number; DasSerialNumber = that.SerialNumber; NumberOfSamples = that.NumberOfSamples; UnsubsampledNumberOfSamples = that.UnsubsampledNumberOfSamples; RequestedPostTriggerSeconds = that.RequestedPostTriggerSeconds; RequestedPreTriggerSeconds = that.RequestedPreTriggerSeconds; PostTriggerSeconds = that.PostTriggerSeconds; PreTriggerSeconds = that.PreTriggerSeconds; RecordingMode = that.RecordingMode; SampleRateHz = that.SampleRateHz; StartRecordSampleNumber = that.StartRecordSampleNumber; TriggerSampleNumbers = that.TriggerSampleNumbers; UnsubsampledTriggerSampleNumbers = that.UnsubsampledTriggerSampleNumbers; BaseSerialNumber = that.BaseSerialNumber; try { StartRecordTimestampSec = that.StartRecordTimestampSec; } catch (System.Exception ex) { APILogger.Log("failed to get StartRecordTimestampSec", ex); } //TODO: inappropriate using try/catch!!! try { StartRecordTimestampNanoSec = that.StartRecordTimestampNanoSec; } catch (System.Exception ex) { APILogger.Log("failed to get StartRecordTimestampSec", ex); } //TODO: inappropriate using try/catch!!! try { TriggerTimestampSec = that.TriggerTimestampSec; } catch (System.Exception ex) { APILogger.Log("failed to get TriggerTimestampSec", ex); } //TODO: inappropriate using try/catch!!! try { TriggerTimestampNanoSec = that.TriggerTimestampNanoSec; } catch (System.Exception ex) { APILogger.Log("failed to get TriggerTimestampNanoSec", ex); } //TODO: inappropriate using try/catch!!! try { PTPMasterSync = that.PTPMasterSync; } catch (System.Exception ex) { APILogger.Log("failed to get PTPMasterSync", ex); } //TODO: inappropriate using try/catch!!! try { SystemID = that.SystemID; SystemLocation = that.SystemLocation; TargetAxisOne = that.TargetAxisOne; TargetAxisTwo = that.TargetAxisTwo; } catch (System.Exception ex) { APILogger.Log("failed to get tilt sensor config attributes", ex); } //TODO: inappropriate using try/catch!!! try { TiltSensorAxisXDegreesPre = that.TiltSensorAxisXDegreesPre; TiltSensorAxisYDegreesPre = that.TiltSensorAxisYDegreesPre; TiltSensorAxisZDegreesPre = that.TiltSensorAxisZDegreesPre; TiltSensorAxisXDegreesPost = that.TiltSensorAxisXDegreesPost; TiltSensorAxisYDegreesPost = that.TiltSensorAxisYDegreesPost; TiltSensorAxisZDegreesPost = that.TiltSensorAxisZDegreesPost; } catch (System.Exception ex) { APILogger.Log("failed to get tilt information", ex); } //TODO: inappropriate using try/catch!!! try { TemperatureLocation1Pre = that.TemperatureLocation1Pre; TemperatureLocation2Pre = that.TemperatureLocation2Pre; TemperatureLocation3Pre = that.TemperatureLocation3Pre; TemperatureLocation4Pre = that.TemperatureLocation4Pre; TemperatureLocation1Post = that.TemperatureLocation1Post; TemperatureLocation2Post = that.TemperatureLocation2Post; TemperatureLocation3Post = that.TemperatureLocation3Post; TemperatureLocation4Post = that.TemperatureLocation4Post; InputVoltage = that.InputVoltage; BatteryVoltage = that.BatteryVoltage; } catch (System.Exception ex) { APILogger.Log("failed to get temperature information", ex); } //APILogger.DoPerformanceLog("DTS.Slice.Control.Event.Module:FromDTSSerializationTestModule:6"); var absoluteChannelNumber = ParentEvent.LastAbsoluteChannelNumberInEvent + 1; Channels.Clear(); foreach (var thatChannel in that.Channels) { // // Create a Slice Control channel corresponding to the specified serialization // channel and populate its relevant properties. // try { if (thatChannel.AbsoluteDisplayOrder != -2) { //Have to count the channels this way as the module isn't a part of the event yet. var emc = Channel.CreateChannel(thatChannel, this, absoluteChannelNumber++); Channels.Add(emc); thatChannel.emc = emc; Trace.WriteLine("Created EMC: " + absoluteChannelNumber.ToString()); } } catch (System.IO.InvalidDataException ex) { errors.Add(ex.Message); } } foreach (var thatCalculatedChannel in that.CalculatedChannels) { //Have to count the channels this way as the module isn't a part of the event yet. var emc = Channel.CreateChannel(thatCalculatedChannel, this, absoluteChannelNumber++); Trace.WriteLine("Created EMC: " + absoluteChannelNumber.ToString()); Channels.Add(emc); thatCalculatedChannel.emc = emc; } } catch (System.Exception ex) { throw new Exception("encountered problem initializing " + GetType().FullName + " using " + typeof(Serialization.Test.Module).FullName, ex); } if (errors.Count > 0 && null != reportErrors) { reportErrors(errors); } } } } }