using DTS.Common.Attributes; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; namespace DTS.Common.Enums.Sensors { /// /// holds information for all CSV import/export fields and their versions /// public abstract class CSVImportTags { public const int MIN_VALID_VERSION = 0; public const int MAX_VALID_VERSION = 6; private static readonly object MY_LOCK = new object(); private static HashSet _SensorTagsVersions = new HashSet() { 0, 2, 3, 4 }; public static bool IsSensorTag(int version) { return _SensorTagsVersions.Contains(version); } private static string TagToDisplayString(Tags tag) { var enumType = tag.GetType(); var name = Enum.GetName(enumType, tag); if (string.IsNullOrEmpty(name)) { return string.Empty; } var fieldInfo = enumType.GetField(name); if (null == fieldInfo || !fieldInfo.CustomAttributes.Any()) { return string.Empty; } var attributes = fieldInfo.GetCustomAttributes(false).OfType(); if (null == attributes || !attributes.Any()) { return string.Empty; } return attributes.FirstOrDefault().Name; } private static int TagToVersion(Tags tag) { var enumType = tag.GetType(); var name = Enum.GetName(enumType, tag); if (string.IsNullOrEmpty(name)) { return int.MaxValue; } var fieldInfo = enumType.GetField(name); if (null == fieldInfo || !fieldInfo.CustomAttributes.Any()) { return int.MaxValue; } var attributes = fieldInfo.GetCustomAttributes(false).OfType(); if (null == attributes || !attributes.Any()) { return int.MaxValue; } return attributes.FirstOrDefault().Version; } /// /// gets all tags for a given version of import /// /// /// public static Tags[] GetVersionTags(int version) { lock (MY_LOCK) { if (null == _versionToTags) { PopulateLookups(); } return _versionToTags.ContainsKey(version) ? _versionToTags[version].ToArray() : new Tags[0]; } } private static Dictionary _stringToTag = null; private static Dictionary _tagToString = null; private static Dictionary> _versionToTags = null; private static Dictionary _tagToVersion = null; /// /// gets a display string given a tag /// /// /// public static string GetStringForTag(Tags tag) { lock (MY_LOCK) { if (null == _tagToString) { PopulateLookups(); } return _tagToString.ContainsKey(tag) ? _tagToString[tag] : string.Empty; } } /// /// returns a tag given a display string /// /// /// public static Tags GetTagForString(string s) { lock (MY_LOCK) { if (null == _stringToTag) { PopulateLookups(); } return _stringToTag.ContainsKey(s) ? _stringToTag[s] : Tags.Unknown; } } /// /// returns a version the tag was used in given a tag /// /// /// public static int GetVersionForTag(Tags t) { lock (MY_LOCK) { if (null == _tagToVersion) { PopulateLookups(); } return _tagToVersion.ContainsKey(t) ? _tagToVersion[t] : int.MaxValue; } } private static void PopulateLookups() { var lookup1 = new Dictionary(); var lookup2 = new Dictionary(); var lookup3 = new Dictionary>(); var lookup4 = new Dictionary(); var allTags = Enum.GetValues(typeof(Tags)).Cast().ToArray(); foreach (var tag in allTags) { var s = TagToDisplayString(tag); var version = TagToVersion(tag); lookup1[s] = tag; lookup2[tag] = s; if (!lookup3.ContainsKey(version)) { lookup3.Add(version, new List()); } lookup3[version].Add(tag); lookup4[tag] = version; } lock (MY_LOCK) { _stringToTag = lookup1; _tagToString = lookup2; _versionToTags = lookup3; _tagToVersion = lookup4; } } public enum Tags { [Display(Name = "Database Reference Number")] [Version(0)] DatabaseReferenceNumber, [Display(Name = "Sensor SN")] [Version(0)] SensorSN, [Display(Name = "Channel Name")] [Version(0)] ChannelName, [Display(Name = "Location")] [Version(0)] Location, [Display(Name = "Laboratory Code")] [Version(0)] LaboratoryCode, [Display(Name = "Customer Code")] [Version(0)] CustomerCode, [Display(Name = "Partial ISO Code")] [Version(0)] PartialISOCode, [Display(Name = "Comment Field")] [Version(0)] CommentField, [Display(Name = "Sensor Type")] [Version(0)] SensorType, [Display(Name = "Manufacturer")] [Version(0)] Manufacturer, [Display(Name = "Model")] [Version(0)] Model, [Display(Name = "Axis (X, Y, Z)")] [Version(0)] Axis, [Display(Name = "Dimension")] [Version(0)] Dimension, [Display(Name = "EU")] [Version(0)] EU, [Display(Name = "Full Scale (EU)")] [Version(0)] FullScale, [Display(Name = "Exc (VDC)")] [Version(0)] Exc, [Display(Name = "Output @ EXC & FS (mV)")] [Version(0)] OutputAtEXCFSmV, [Display(Name = "Sensitivity (mV/V/EU)")] [Version(0)] Sensitivity, [Display(Name = "Output Proportional to EXC? (Yes, No)")] [Version(0)] Proportional, [Display(Name = "Desired Range (EU)")] [Version(0)] DesiredRange, [Display(Name = "BRIDGE (Full, Half)")] [Version(0)] BRIDGE, [Display(Name = "Use Shunt Cal? (Yes, No)")] [Version(0)] UseShuntCal, [Display(Name = "Bridge Res. (Ohm)")] [Version(0)] BridgeResistance, [Display(Name = "Shunt Resistor Value (Ohms)")] [Version(0)] ShuntResistorValue, [Display(Name = "Equivalent EU for Shunt Resistor")] [Version(0)] EquivalentEUShuntResistor, [Display(Name = "Bypass AA Filter? (Yes, No)")] [Version(0)] BypassAAFilter, [Display(Name = "Invert Signal? (Yes, No)")] [Version(0)] InvertSignal, [Display(Name = "Remove Sensor Offset? (Yes, No)")] [Version(0)] RemoveOffset, [Display(Name = "Sensor Offset Low (mV)")] [Version(0)] OffsetToleranceLow, [Display(Name = "Sensor Offset High (mV)")] [Version(0)] OffsetToleranceHigh, [Display(Name = "SAE Filter Class")] [Version(0)] FilterClass, [Display(Name = "Software Zero Reference (Pre, Avg, 0mV)")] [Version(0)] SoftwareZeroReference, [Display(Name = "Software Zero Equivalent EU")] [Version(0)] SoftwareZeroEquivalentEU, [Display(Name = "16 Byte Dallas Sensor ID")] [Version(0)] SensorID, [Display(Name = "Received")] [Version(0)] Received, [Display(Name = "Last Cal")] [Version(0)] LastCal, [Display(Name = "Due Cal")] [Version(0)] DueCal, [Display(Name = "Due")] [Version(0)] Due, [Display(Name = "Tech")] [Version(0)] Tech, [Display(Name = "Group 1")] [Version(0)] Group1, [Display(Name = "Group 2")] [Version(0)] Group2, [Display(Name = "Group 3")] [Version(0)] Group3, [Display(Name = "Group 4")] [Version(0)] Group4, [Display(Name = "Group 5")] [Version(0)] Group5, [Display(Name = "Category")] [Version(0)] Category, [Display(Name = "IRTRACC Exponent")] [Version(0)] IRTRACCExponent, [Display(Name = "unknown")] [Version(0)] Unknown, [Display(Name = "Version")] [Version(1)] Version, [Display(Name = "Test Setup Name")] [Version(1)] TestSetupName, [Display(Name = "Test Setup Description")] [Version(1)] TestSetupDescription, [Display(Name = "Recording Mode")] [Version(1)] RecordingMode, [Display(Name = "SampleRate")] [Version(1)] SampleRate, [Display(Name = "PreTriggerSec")] [Version(1)] PreTriggerSec, [Display(Name = "PostTriggerSec")] [Version(1)] PostTriggerSec, [Display(Name = "Tags")] [Version(1)] Tags, [Display(Name = "Two Volt Exc.")] [Version(2)] TwoVoltExcSensitivity, [Display(Name = "Five Volt Exc.")] [Version(2)] FiveVoltExcSensitivity, [Display(Name = "Ten Volt Exc.")] [Version(2)] TenVoltExcSensitivity, [Display(Name = "Range Low")] [Version(2)] RangeLow, [Display(Name = "Range Medium")] [Version(2)] RangeMedium, [Display(Name = "Range High")] [Version(2)] RangeHigh, [Display(Name = "Supported Excitation")] [Version(2)] SupportedExcitation, [Display(Name = "Bridge Type")] [Version(2)] BridgeType, [Display(Name = "Unipolar")] [Version(2)] Unipolar, [Display(Name = "Axis Number")] [Version(2)] AxisNumber, [Display(Name = "Number of Axes")] [Version(2)] NumberOfAxes, [Display(Name = "Cal Interval")] [Version(2)] CalInterval, [Display(Name = "Polarity")] [Version(2)] Polarity, [Display(Name = "Physical Dimension")] [Version(2)] PhysicalDimension, [Display(Name = "Direction")] [Version(2)] Direction, [Display(Name = "InitialOffset")] [Version(2)] InitialOffset, [Display(Name = "NonLinear")] [Version(2)] NonLinear, [Display(Name = "Software Zero Method")] [Version(2)] ZeroMethod, [Display(Name = "Zero Averaging Window Start")] [Version(2)] ZeroMethodStart, [Display(Name = "Zero Averaging Window End")] [Version(2)] ZeroMethodEnd, [Display(Name = "Bridge Leg Mode")] [Version(2)] BridgeLegMode, [Display(Name = "Created")] [Version(2)] Created, [Display(Name = "Times Used")] [Version(2)] TimesUsed, [Display(Name = "IEPE Coupling Mode")] [Version(2)] CouplingMode, [Display(Name = "DelayMS")] [Version(2)] DelayMS, [Display(Name = "DigitalOutputDelayMS")] [Version(2)] DigitalOutputDelayMS, [Display(Name = "DurationMS")] [Version(2)] DurationMS, [Display(Name = "DigitalOutputDurationMS")] [Version(2)] DigitalOutputDurationMS, [Display(Name = "Digital Output Mode")] [Version(2)] DigitalOutputMode, [Display(Name = "LimitDuration")] [Version(2)] LimitDuration, [Display(Name = "Squib Fire Mode")] [Version(2)] SquibFireMode, [Display(Name = "Squib Measurement Type")] [Version(2)] SquibMeasurementType, [Display(Name = "Squib Output Current")] [Version(2)] SquibOutputCurrent, [Display(Name = "Digital Scale Multiplier")] [Version(2)] DigitalScaleMultiplier, [Display(Name = "Digital Input Mode")] [Version(2)] DigitalInputMode, [Display(Name = "NonLinear Cal")] [Version(2)] NonLinearCalibration, [Display(Name = "DisplayUnits")] [Version(2)] DisplayUnits, [Display(Name = "At Capacity")] [Version(2)] AtCapacity, [Display(Name = "Capacity Ouptut Is Based On")] [Version(2)] CapacityOutputIsBasedOn, [Display(Name = "Sensitivity Units")] [Version(2)] SensitivityUnits, [Display(Name = "CheckOffset")] [Version(2)] CheckOffset, [Display(Name = "Broken")] [Version(2)] Broken, [Display(Name = "Do Not Use")] [Version(2)] DoNotUse, [Display(Name = "ISOChannelName")] [Version(2)] ISOChannelName, [Display(Name = "UserCode")] [Version(2)] UserCode, [Display(Name = "UserChannelName")] [Version(2)] UserChannelName, [Display(Name = "Addl Linear Sensitivity")] [Version(2)] AdditionalLinearSensitivity, [Display(Name = "Addl Linear Zero Method")] [Version(2)] AdditionalLinearZeroMethod, [Display(Name = "Addl Linear Zero Method Start")] [Version(2)] AdditionalLinearZeroMethodStart, [Display(Name = "Addl Linear Zero Method End")] [Version(2)] AdditionalLinearZeroMethodEnd, [Display(Name = "Addl Initial Offsets")] [Version(2)] AdditionalInitialOffsets, [Display(Name = "Group Name")] [Version(3)] GroupName, [Display(Name = "Group Type")] [Version(3)] GroupType, [Display(Name = "DAS serial number")] [Version(4)] DASSerialNumber, [Display(Name = "DAS channel index")] [Version(4)] DASChannelIndex, [Display(Name = "Stream profile")] [Version(4)] StreamProfile, [Display(Name = "UDP address")] [Version(4)] UDPAddress, [Display(Name = "Time channel Id")] [Version(4)] TimeChannelId, [Display(Name = "Data channel Id")] [Version(4)] DataChannelId, [Display(Name = "Stream output configuration")] [Version(4)] TmNSConfig, [Display(Name = "IRIG time packet interval ms")] [Version(4)] IRIGTimeDataPacketIntervalMS, [Display(Name = "TMATS packet interval ms")] [Version(4)] TMATSIntervalMS, [Display(Name = "Baud rate")] [Version(4)] BaudRate, [Display(Name = "Data bits")] [Version(4)] DataBits, [Display(Name = "Stop bits")] [Version(4)] StopBits, [Display(Name = "Parity")] [Version(4)] Parity, [Display(Name = "Data format")] [Version(4)] DataFormat, [Display(Name = "Test user code")] [Version(4)] TestUserCode, [Display(Name = "Test user channel name")] [Version(4)] TestUserChannelName, [Display(Name = "Test isocode")] [Version(4)] TestIsoCode, [Display(Name = "Test iso channel name")] [Version(4)] TestIsoChannelName, [Display(Name = "Clock master input type")] [Version(5)] ClockMasterInputType, [Display(Name = "Clock master output type")] [Version(5)] ClockMasterOutputType, [Display(Name = "Manage master clocks outside of DP")] [Version(5)] ManageClocksOutsideDPMaster, [Display(Name = "Manage slave clocks outside of DP")] [Version(5)] ManageClocksOutsideDPSlave, [Display(Name = "Clock slave input type")] [Version(5)] ClockSlaveInputType, [Display(Name = "Clock slave output type")] [Version(5)] ClockSlaveOutputType, [Display(Name = "DAS serial")] [Version(6)] DASSerial, [Display(Name = "DAS sample rate")] [Version(6)] DASSampleRate, [Display(Name = "PTP domain id")] [Version(6)] PTPDomainId, [Display(Name = "Clock master")] [Version(6)] ClockMaster } } }