init
This commit is contained in:
@@ -0,0 +1,545 @@
|
||||
using DTS.Common.Attributes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
|
||||
namespace DTS.Common.Enums.Sensors
|
||||
{
|
||||
/// <summary>
|
||||
/// holds information for all CSV import/export fields and their versions
|
||||
/// </summary>
|
||||
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<int> _SensorTagsVersions = new HashSet<int>()
|
||||
{
|
||||
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 || 0 == fieldInfo.CustomAttributes.Count()) { return string.Empty; }
|
||||
var attributes = fieldInfo.GetCustomAttributes(false).OfType<DisplayAttribute>();
|
||||
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 || 0 == fieldInfo.CustomAttributes.Count()) { return int.MaxValue; }
|
||||
var attributes = fieldInfo.GetCustomAttributes(false).OfType<VersionAttribute>();
|
||||
if (null == attributes || !attributes.Any()) { return int.MaxValue; }
|
||||
return attributes.FirstOrDefault().Version;
|
||||
}
|
||||
/// <summary>
|
||||
/// gets all tags for a given version of import
|
||||
/// </summary>
|
||||
/// <param name="version"></param>
|
||||
/// <returns></returns>
|
||||
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<string, Tags> _stringToTag = null;
|
||||
private static Dictionary<Tags, string> _tagToString = null;
|
||||
private static Dictionary<int, List<Tags>> _versionToTags = null;
|
||||
private static Dictionary<Tags, int> _tagToVersion = null;
|
||||
/// <summary>
|
||||
/// gets a display string given a tag
|
||||
/// </summary>
|
||||
/// <param name="tag"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetStringForTag(Tags tag)
|
||||
{
|
||||
lock (MY_LOCK)
|
||||
{
|
||||
if (null == _tagToString) { PopulateLookups(); }
|
||||
return _tagToString.ContainsKey(tag) ? _tagToString[tag] : string.Empty;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// returns a tag given a display string
|
||||
/// </summary>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
public static Tags GetTagForString(string s)
|
||||
{
|
||||
lock (MY_LOCK)
|
||||
{
|
||||
if (null == _stringToTag) { PopulateLookups(); }
|
||||
return _stringToTag.ContainsKey(s) ? _stringToTag[s] : Tags.Unknown;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// returns a version the tag was used in given a tag
|
||||
/// </summary>
|
||||
/// <param name="t"></param>
|
||||
/// <returns></returns>
|
||||
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<string, Tags>();
|
||||
var lookup2 = new Dictionary<Tags, string>();
|
||||
var lookup3 = new Dictionary<int, List<Tags>>();
|
||||
var lookup4 = new Dictionary<Tags, int>();
|
||||
|
||||
var allTags = Enum.GetValues(typeof(Tags)).Cast<Tags>().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<Tags>());
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
namespace DTS.Common.Interface.DASFactory.Download
|
||||
{
|
||||
public interface IDownloadRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// From which event do we want to download data?
|
||||
/// </summary>
|
||||
ushort EventNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Which channel? (set to ALL_CHANNELS for all)
|
||||
/// </summary>
|
||||
byte DASChannelNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The first sample you want.
|
||||
/// </summary>
|
||||
ulong StartSample { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The last sample you want.
|
||||
/// </summary>
|
||||
ulong EndSample { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// This is used for sub-sampling data, 0 (or 1) means don't sub-sample, 2 means
|
||||
/// give me every other sample and so on. The number of samples requested
|
||||
/// (EndSample-StartSample+1) must be an multiple of SamplesToSkip.
|
||||
/// </summary>
|
||||
ulong SamplesToSkip { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
double StartRecordTimestampSec { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
double TriggerTimestampSec { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
double StartRecordTimestampNanoSec { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
double TriggerTimestampNanoSec { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
bool PTPMasterSync { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
namespace DTS.Common.Enums.Sensors.SensorsList
|
||||
{
|
||||
public enum StreamOutSettingFields
|
||||
{
|
||||
Included,
|
||||
SerialNumber,
|
||||
Description,
|
||||
LastModifiedBy,
|
||||
LastModified,
|
||||
UDPProfile,
|
||||
UDPAddress,
|
||||
UDPTimeChannelId,
|
||||
UDPDataChannelId,
|
||||
UDPTmNSConfig,
|
||||
IRIGTimeDataPacketIntervalMs,
|
||||
TMATSIntervalMs
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Windows;
|
||||
using System.Windows.Interactivity;
|
||||
using TriggerBase = System.Windows.Interactivity.TriggerBase;
|
||||
|
||||
namespace DTS.Common.Behaviors
|
||||
{
|
||||
public class InteractivityTemplate : DataTemplate
|
||||
{
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// Holder for interactivity entries
|
||||
/// </summary>
|
||||
public class InteractivityItems : FrameworkElement
|
||||
{
|
||||
private List<Behavior> _behaviors;
|
||||
private List<TriggerBase> _triggers;
|
||||
|
||||
/// <summary>
|
||||
/// Storage for triggers
|
||||
/// </summary>
|
||||
public new List<TriggerBase> Triggers => _triggers ?? (_triggers = new List<TriggerBase>());
|
||||
|
||||
/// <summary>
|
||||
/// Storage for Behaviors
|
||||
/// </summary>
|
||||
public List<Behavior> Behaviors => _behaviors ?? (_behaviors = new List<Behavior>());
|
||||
|
||||
#region Template attached property
|
||||
|
||||
public static InteractivityTemplate GetTemplate(DependencyObject obj)
|
||||
{
|
||||
return (InteractivityTemplate)obj.GetValue(TemplateProperty);
|
||||
}
|
||||
|
||||
public static void SetTemplate(DependencyObject obj, InteractivityTemplate value)
|
||||
{
|
||||
obj.SetValue(TemplateProperty, value);
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty TemplateProperty = DependencyProperty.RegisterAttached("Template", typeof(InteractivityTemplate), typeof(InteractivityItems), new PropertyMetadata(default(InteractivityTemplate), OnTemplateChanged));
|
||||
|
||||
private static void OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.NewValue == null) return;
|
||||
var interactivityTemplate = (InteractivityTemplate)e.NewValue;
|
||||
var interactivityItems = (InteractivityItems)interactivityTemplate.LoadContent();
|
||||
var bc = Interaction.GetBehaviors(d);
|
||||
var tc = Interaction.GetTriggers(d);
|
||||
|
||||
foreach (var behavior in interactivityItems.Behaviors)
|
||||
bc.Add(behavior);
|
||||
|
||||
foreach (var trigger in interactivityItems.Triggers)
|
||||
tc.Add(trigger);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,632 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml.Linq;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using DTS.Common.Enums.Sensors;
|
||||
using DTS.Common.Interface.Sensors.SoftwareFilters;
|
||||
using DTS.Common.Interface.Sensors;
|
||||
using System.Linq;
|
||||
|
||||
namespace DTS.Common.Classes.Sensors
|
||||
{
|
||||
public class FilterClass : INotifyPropertyChanged, IFilterClass
|
||||
{
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
protected bool SetProperty<T>(ref T storage, T value, String propertyName = null)
|
||||
{
|
||||
if (Equals(storage, value)) return false;
|
||||
|
||||
storage = value;
|
||||
OnPropertyChanged(propertyName);
|
||||
return true;
|
||||
}
|
||||
protected void OnPropertyChanged(string propertyName = null)
|
||||
{
|
||||
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
public FilterClassType FClass { get; set; }
|
||||
|
||||
//FB 13120 used for filter options drop down localization
|
||||
public string FilterName
|
||||
{
|
||||
get
|
||||
{
|
||||
string name = "";
|
||||
|
||||
if (FClass == FilterClassType.None)
|
||||
{
|
||||
name = Strings.Strings.FilterClassType_None;
|
||||
}
|
||||
else if (FClass == FilterClassType.Unfiltered)
|
||||
{
|
||||
name = Strings.Strings.FilterClassType_Unfiltered;
|
||||
}
|
||||
else if (FClass == FilterClassType.AdHoc)
|
||||
{
|
||||
name = Frequency.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
name = Frequency + " (" + FClass.ToString() + ")";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the numeric filter class value for the filter class; EX CFC60 returns 60, CFC1000 returns 1000
|
||||
/// </summary>
|
||||
/// <returns>integer for filter class name</returns>
|
||||
public int GetFilterClassNumericValue()
|
||||
{
|
||||
switch (FClass)
|
||||
{
|
||||
|
||||
case FilterClassType.CFC10:
|
||||
return 10;
|
||||
case FilterClassType.CFC60:
|
||||
return 60;
|
||||
case FilterClassType.CFC180:
|
||||
return 180;
|
||||
case FilterClassType.CFC600:
|
||||
return 600;
|
||||
case FilterClassType.None:
|
||||
return 0;
|
||||
case FilterClassType.Unfiltered:
|
||||
return -2;
|
||||
default: // adhoc and cfc1000 enter here
|
||||
return 1000;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private double _Frequency;
|
||||
public double Frequency
|
||||
{
|
||||
get { return _Frequency; }
|
||||
set { _Frequency = value; }
|
||||
}
|
||||
|
||||
#region Tags
|
||||
|
||||
internal const string FilterClassTag = "FilterClass";
|
||||
internal const string ClassTag = "Class";
|
||||
internal const string FrequencyTag = "Frequency";
|
||||
|
||||
#endregion
|
||||
private string TableName;
|
||||
public FilterClass(XElement elem, string prefix, string tblName, string id)
|
||||
{
|
||||
TableName = tblName;
|
||||
XElement inner = null;
|
||||
try
|
||||
{
|
||||
inner = elem.Element(mkTag(prefix));
|
||||
}
|
||||
catch (ArgumentNullException)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(id))
|
||||
{
|
||||
throw new System.Exception(string.Format("{0}: Can't find tag {1} for entry {2}", TableName, prefix + "-" + FilterClassTag, id));
|
||||
}
|
||||
throw new System.Exception(string.Format("{0}: Can't find tag {1} in file", TableName, prefix + "-" + FilterClassTag));
|
||||
}
|
||||
FClass = (FilterClassType)Enum.Parse(typeof(FilterClassType), inner.Attribute(ClassTag).Value);
|
||||
switch (FClass)
|
||||
{
|
||||
case FilterClassType.None:
|
||||
_Frequency = (double)FilterClassType.None;
|
||||
break;
|
||||
case FilterClassType.Unfiltered:
|
||||
_Frequency = (double)FilterClassType.Unfiltered;
|
||||
break;
|
||||
case FilterClassType.CFC10:
|
||||
_Frequency = (double)FilterClassType.CFC10;
|
||||
break;
|
||||
case FilterClassType.CFC60:
|
||||
_Frequency = (double)FilterClassType.CFC60;
|
||||
break;
|
||||
case FilterClassType.CFC180:
|
||||
_Frequency = (double)FilterClassType.CFC180;
|
||||
break;
|
||||
case FilterClassType.CFC600:
|
||||
_Frequency = (double)FilterClassType.CFC600;
|
||||
break;
|
||||
case FilterClassType.CFC1000:
|
||||
_Frequency = (double)FilterClassType.CFC1000;
|
||||
break;
|
||||
case FilterClassType.AdHoc:
|
||||
if (!double.TryParse(inner.Value, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _Frequency))
|
||||
{
|
||||
throw new System.Exception(string.Format("{0}: Invalid filter frequency {1}", TableName, inner.Value));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public FilterClass(FilterClassType fc, double freq)
|
||||
{
|
||||
FClass = fc;
|
||||
Frequency = freq;
|
||||
}
|
||||
|
||||
public static FilterClassType GetFilterClassTypeFromNumericFC(int fc)
|
||||
{
|
||||
switch (fc)
|
||||
{
|
||||
case 1000:
|
||||
case -1:
|
||||
return FilterClassType.CFC1000;
|
||||
case 600:
|
||||
return FilterClassType.CFC600;
|
||||
case 180:
|
||||
return FilterClassType.CFC180;
|
||||
case 60:
|
||||
return FilterClassType.CFC60;
|
||||
case 10:
|
||||
return FilterClassType.CFC10;
|
||||
case 0:
|
||||
return FilterClassType.None;
|
||||
case -2:
|
||||
return FilterClassType.Unfiltered;
|
||||
default:
|
||||
return FilterClassType.None;
|
||||
}
|
||||
}
|
||||
|
||||
public FilterClass(double freq)
|
||||
{
|
||||
Frequency = freq;
|
||||
if (freq == (double)FilterClassType.CFC10)
|
||||
{
|
||||
FClass = FilterClassType.CFC10;
|
||||
}
|
||||
else if (freq == (double)FilterClassType.CFC60)
|
||||
{
|
||||
FClass = FilterClassType.CFC60;
|
||||
}
|
||||
else if (freq == (double)FilterClassType.CFC180)
|
||||
{
|
||||
FClass = FilterClassType.CFC180;
|
||||
}
|
||||
else if (freq == (double)FilterClassType.CFC600)
|
||||
{
|
||||
FClass = FilterClassType.CFC600;
|
||||
}
|
||||
else if (freq == (double)FilterClassType.CFC1000)
|
||||
{
|
||||
FClass = FilterClassType.CFC1000;
|
||||
}
|
||||
else if (freq == 0)
|
||||
{
|
||||
FClass = FilterClassType.None;
|
||||
}
|
||||
else if (freq == (double)FilterClassType.Unfiltered)
|
||||
{
|
||||
FClass = FilterClassType.Unfiltered;
|
||||
}
|
||||
else
|
||||
{
|
||||
FClass = FilterClassType.AdHoc;
|
||||
//FB 13120 set the frequency for ad hoc filters
|
||||
Frequency = freq;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///FB 13120 Specify and return the default filter class
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static FilterClass GetDefaultFilterClass(List<ISoftwareFilter> softwareFilters)
|
||||
{
|
||||
if (softwareFilters == null)
|
||||
{
|
||||
return new FilterClass(FilterClassType.CFC1000);
|
||||
}
|
||||
|
||||
var softwareFilter = softwareFilters.FirstOrDefault(p => p.IsDefault);
|
||||
FilterClass fc = null;
|
||||
|
||||
switch (softwareFilter?.ISOCode)
|
||||
{
|
||||
case '0':
|
||||
fc = new FilterClass(FilterClassType.Unfiltered);
|
||||
break;
|
||||
case 'P':
|
||||
fc = new FilterClass(FilterClassType.None);
|
||||
break;
|
||||
case 'S':
|
||||
fc = new FilterClass(FilterClassType.AdHoc, softwareFilter.Frequency);
|
||||
break;
|
||||
case 'A':
|
||||
fc = new FilterClass(FilterClassType.CFC1000);
|
||||
break;
|
||||
case 'B':
|
||||
fc = new FilterClass(FilterClassType.CFC600);
|
||||
break;
|
||||
case 'C':
|
||||
fc = new FilterClass(FilterClassType.CFC180);
|
||||
break;
|
||||
case 'D':
|
||||
fc = new FilterClass(FilterClassType.CFC60);
|
||||
break;
|
||||
default:
|
||||
fc = new FilterClass(FilterClassType.CFC1000);
|
||||
break;
|
||||
}
|
||||
|
||||
return fc;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// FB 13120 Get the filter class based on the isoCode provided
|
||||
/// </summary>
|
||||
/// <param name="isoCode"></param>
|
||||
/// <param name="frequency">this frequency will be used for AdHoc filter</param>
|
||||
/// <returns></returns>
|
||||
public static FilterClass GetFilterClassFromIsoCode(string isoCode, double frequency = 0)
|
||||
{
|
||||
if (string.IsNullOrEmpty(isoCode))
|
||||
{
|
||||
return new FilterClass(FilterClassType.CFC1000);
|
||||
}
|
||||
FilterClass fc = null;
|
||||
|
||||
switch (isoCode.ToUpper())
|
||||
{
|
||||
case "0":
|
||||
fc = new FilterClass(FilterClassType.Unfiltered);
|
||||
break;
|
||||
case "P":
|
||||
fc = new FilterClass(FilterClassType.None);
|
||||
break;
|
||||
case "S":
|
||||
fc = new FilterClass(FilterClassType.AdHoc, frequency);
|
||||
break;
|
||||
case "A":
|
||||
fc = new FilterClass(FilterClassType.CFC1000);
|
||||
break;
|
||||
case "B":
|
||||
fc = new FilterClass(FilterClassType.CFC600);
|
||||
break;
|
||||
case "C":
|
||||
fc = new FilterClass(FilterClassType.CFC180);
|
||||
break;
|
||||
case "D":
|
||||
fc = new FilterClass(FilterClassType.CFC60);
|
||||
break;
|
||||
default:
|
||||
fc = new FilterClass(FilterClassType.CFC1000);
|
||||
break;
|
||||
}
|
||||
|
||||
return fc;
|
||||
}
|
||||
/// <summary>
|
||||
/// FB 15574 Get the FilterClass setting from cfc iso code
|
||||
/// </summary>
|
||||
/// <param name="cfcIsoCode">cfc iso code ex: A</param>
|
||||
/// <returns>filter class setting on format of FilterType,Frequency ex: None,0 </returns>
|
||||
public static string GetFilterClassSettingFromCFC(string cfcIsoCode)
|
||||
{
|
||||
var filterClass = GetFilterClassFromIsoCode(cfcIsoCode);
|
||||
return $"{filterClass.FClass.ToString()},{filterClass.Frequency}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///FB 15574 Get the FilterClass setting from FilterClass
|
||||
/// </summary>
|
||||
/// <param name="filterClass"></param>
|
||||
/// <returns>filter class setting on format of FilterType,Frequency ex: None,0 </returns>
|
||||
public static string GetFilterClassSettingFromFilterClass(IFilterClass filterClass)
|
||||
{
|
||||
return $"{filterClass.FClass.ToString()},{filterClass.Frequency}";
|
||||
}
|
||||
|
||||
public static double GetFrequencyFromFilterClassType(FilterClassType filterClassType)
|
||||
{
|
||||
if (filterClassType == FilterClassType.AdHoc)
|
||||
{
|
||||
throw new Exception("GetFrequencyFromFilterClassType: AdHoc FilterClassType does not have frequency associated");
|
||||
}
|
||||
return (double)filterClassType;
|
||||
}
|
||||
|
||||
public static FilterClass GetFilterClassFromFilterClassType(FilterClassType filterClassType, double adHocFrequency = 0)
|
||||
{
|
||||
if (filterClassType == FilterClassType.AdHoc)
|
||||
{
|
||||
return new FilterClass(filterClassType, adHocFrequency);
|
||||
}
|
||||
return new FilterClass(filterClassType);
|
||||
}
|
||||
|
||||
public static FilterClass GetFilterClassFromFilterClassSetting(string filterClassSetting)
|
||||
{
|
||||
if (string.IsNullOrEmpty(filterClassSetting))
|
||||
{
|
||||
return GetFilterClassFromFilterClassType(FilterClassType.Unfiltered);
|
||||
}
|
||||
|
||||
var setting = filterClassSetting.Split(',');
|
||||
|
||||
if (Enum.TryParse(setting[0], out FilterClassType fct))
|
||||
{
|
||||
return GetFilterClassFromFilterClassType(fct, Convert.ToDouble(setting[1]));
|
||||
}
|
||||
|
||||
return GetFilterClassFromFilterClassType(FilterClassType.Unfiltered);
|
||||
}
|
||||
public FilterClass(FilterClassType fc)
|
||||
{
|
||||
FClass = fc;
|
||||
switch (fc)
|
||||
{
|
||||
case FilterClassType.None:
|
||||
Frequency = 0;
|
||||
break;
|
||||
case FilterClassType.AdHoc:
|
||||
Frequency = (double) FilterClassType.AdHoc;
|
||||
break;
|
||||
case FilterClassType.Unfiltered:
|
||||
Frequency = (double)FilterClassType.Unfiltered;
|
||||
break;
|
||||
case FilterClassType.CFC10:
|
||||
Frequency = (double)FilterClassType.CFC10;
|
||||
break;
|
||||
case FilterClassType.CFC60:
|
||||
Frequency = (double)FilterClassType.CFC60;
|
||||
break;
|
||||
case FilterClassType.CFC180:
|
||||
Frequency = (double)FilterClassType.CFC180;
|
||||
break;
|
||||
case FilterClassType.CFC600:
|
||||
Frequency = (double)FilterClassType.CFC600;
|
||||
break;
|
||||
case FilterClassType.CFC1000:
|
||||
Frequency = (double)FilterClassType.CFC1000;
|
||||
break;
|
||||
default:
|
||||
throw new System.Exception("FilterClass: unknown class");
|
||||
}
|
||||
}
|
||||
|
||||
public XElement ToXElement(string prefix)
|
||||
{
|
||||
var element = new XElement(mkTag(prefix), Frequency);
|
||||
element.SetAttributeValue(ClassTag, FClass.ToString());
|
||||
return element;
|
||||
}
|
||||
|
||||
public void Update(XElement elem, string prefix)
|
||||
{
|
||||
elem.SetElementValue(mkTag(prefix), Frequency);
|
||||
var element = elem.Element(mkTag(prefix));
|
||||
element.SetAttributeValue(ClassTag, FClass.ToString());
|
||||
}
|
||||
|
||||
public static string mkTag(string prefix)
|
||||
{
|
||||
return prefix + "-" + FilterClassTag;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
switch (FClass)
|
||||
{
|
||||
case FilterClassType.None:
|
||||
return "None";
|
||||
case FilterClassType.Unfiltered:
|
||||
return "Unfiltered";
|
||||
case FilterClassType.CFC10:
|
||||
return string.Format("{0} (CFC10)", (int)FilterClassType.CFC10);
|
||||
case FilterClassType.CFC60:
|
||||
return string.Format("{0} (CFC60)", (int)FilterClassType.CFC60);
|
||||
case FilterClassType.CFC180:
|
||||
return string.Format("{0} (CFC180)", (int)FilterClassType.CFC180);
|
||||
case FilterClassType.CFC600:
|
||||
return string.Format("{0} (CFC600)", (int)FilterClassType.CFC600);
|
||||
case FilterClassType.CFC1000:
|
||||
return string.Format("{0} (CFC1000)", (int)FilterClassType.CFC1000);
|
||||
case FilterClassType.AdHoc:
|
||||
return ((int)Frequency).ToString();
|
||||
}
|
||||
throw new System.Exception("FilterClass.ToString: Invalid class=" + FClass.ToString());
|
||||
}
|
||||
|
||||
public FilterClass(string fclass)
|
||||
{
|
||||
int fc;
|
||||
if (int.TryParse(fclass, NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out fc))
|
||||
{
|
||||
switch (fc)
|
||||
{
|
||||
case 17:
|
||||
FClass = FilterClassType.CFC10;
|
||||
_Frequency = (double) FClass;
|
||||
return;
|
||||
case 100:
|
||||
FClass = FilterClassType.CFC60;
|
||||
_Frequency = (double) FClass;
|
||||
return;
|
||||
case 300:
|
||||
FClass = FilterClassType.CFC180;
|
||||
_Frequency = (double) FClass;
|
||||
return;
|
||||
case 1000:
|
||||
FClass = FilterClassType.CFC600;
|
||||
_Frequency = (double) FClass;
|
||||
return;
|
||||
case 1650:
|
||||
FClass = FilterClassType.CFC1000;
|
||||
_Frequency = (double) FClass;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (string.IsNullOrEmpty(fclass) || fclass == "None")
|
||||
{
|
||||
FClass = FilterClassType.None;
|
||||
}
|
||||
else if (fclass.Contains("Unfiltered"))
|
||||
{
|
||||
FClass = FilterClassType.Unfiltered;
|
||||
_Frequency = (double)FilterClassType.Unfiltered;
|
||||
}
|
||||
else if (fclass.Contains("CFC1000"))
|
||||
{
|
||||
FClass = FilterClassType.CFC1000;
|
||||
_Frequency = (double)FilterClassType.CFC1000;
|
||||
}
|
||||
else if (fclass.Contains("CFC600"))
|
||||
{
|
||||
FClass = FilterClassType.CFC600;
|
||||
_Frequency = (double)FilterClassType.CFC600;
|
||||
}
|
||||
else if (fclass.Contains("CFC60"))
|
||||
{
|
||||
FClass = FilterClassType.CFC60;
|
||||
_Frequency = (double)FilterClassType.CFC60;
|
||||
}
|
||||
else if (fclass.Contains("CFC180"))
|
||||
{
|
||||
FClass = FilterClassType.CFC180;
|
||||
_Frequency = (double)FilterClassType.CFC180;
|
||||
}
|
||||
else
|
||||
{
|
||||
//FB 13120 parse and set frequncy
|
||||
double freq = 0;
|
||||
if (double.TryParse(fclass, out freq))
|
||||
{
|
||||
FClass = FilterClassType.AdHoc;
|
||||
_Frequency = freq;
|
||||
}
|
||||
else
|
||||
{
|
||||
FClass = FilterClassType.CFC1000;
|
||||
_Frequency = (double)FilterClassType.CFC1000;
|
||||
}
|
||||
}
|
||||
}
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (obj == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!(obj is FilterClass))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var filterObj = obj as FilterClass;
|
||||
//FB 13120 needs this since the frequency would be different (-2 & 0) for unfiltered case
|
||||
if (FClass == filterObj.FClass && FClass == FilterClassType.Unfiltered)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return FClass == filterObj.FClass && Frequency == filterObj.Frequency;
|
||||
}
|
||||
|
||||
public int CompareTo(object filterClass)
|
||||
{
|
||||
IFilterClass fc = filterClass as FilterClass;
|
||||
if (this == null)
|
||||
{
|
||||
if (fc == null)
|
||||
{
|
||||
// both null, equal
|
||||
return 0;
|
||||
}
|
||||
// left null but not right
|
||||
return -1;
|
||||
}
|
||||
if (fc == null)
|
||||
{
|
||||
// left not null, right null
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (this.FClass != FilterClassType.None)
|
||||
return fc.FClass == FilterClassType.None ? 1 : this.Frequency.CompareTo(fc.Frequency);
|
||||
if (fc.FClass == FilterClassType.None)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
/// <summary>
|
||||
/// returns an identical hash index for any two "equal" filterclass objects
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override int GetHashCode()
|
||||
{
|
||||
//.equals compares frequency and class, but we just need to guarantee that
|
||||
//equal objects hash to the same index
|
||||
return Convert.ToInt32(Frequency);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// FB 13120 Factory method to create a filter class
|
||||
/// </summary>
|
||||
/// <param name="fc"></param>
|
||||
/// <param name="frequency"></param>
|
||||
/// <returns></returns>
|
||||
public static IFilterClass CreateFilterClass(FilterClassType fc, double frequency = 0)
|
||||
{
|
||||
if (fc == FilterClassType.AdHoc)
|
||||
{
|
||||
return new FilterClass(frequency);
|
||||
}
|
||||
else
|
||||
{
|
||||
return new FilterClass(fc);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the filter class based on the string cfc
|
||||
/// </summary>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
public static IFilterClass GetFilterClassFromString(string s)
|
||||
{
|
||||
if (string.IsNullOrEmpty(s)) return new FilterClass(FilterClassType.Unfiltered);
|
||||
s = s.ToLower().Replace("cfc", "").Replace("hz", "").Trim();
|
||||
double freq = 0;
|
||||
if (double.TryParse(s, out freq))
|
||||
{
|
||||
switch (freq)
|
||||
{
|
||||
case 10:
|
||||
return new FilterClass(FilterClassType.CFC10);
|
||||
case 60:
|
||||
return new FilterClass(FilterClassType.CFC60);
|
||||
case 180:
|
||||
return new FilterClass(FilterClassType.CFC180);
|
||||
case 600:
|
||||
return new FilterClass(FilterClassType.CFC600);
|
||||
case 1000:
|
||||
return new FilterClass(FilterClassType.CFC1000);
|
||||
default:
|
||||
return new FilterClass(FilterClassType.AdHoc, freq);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (s.ToLower())
|
||||
{
|
||||
case "unfiltered":
|
||||
return new FilterClass(FilterClassType.Unfiltered);
|
||||
case "none":
|
||||
return new FilterClass(FilterClassType.None);
|
||||
default:
|
||||
return new FilterClass(FilterClassType.Unfiltered);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user