This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -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
}
}
}

View File

@@ -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; }
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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);
}
}
}
}
}