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,187 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace ISO
{
/// <summary>
/// a simple setting in a test
/// can have a default value, a value, and an id
/// default value is used by TestSettingsDictionary for when
/// the setting doesn't currently exist or have a value
/// </summary>
public class TestSetting
{
//public string Id { get; }
public int Id { get; }
public string Value { get; set; }
public string DefaultValue { get; }
private const string SEPARATOR = "_x_";
public TestSetting(TestSetting copy, string value)
{
Id = copy.Id;
DefaultValue = copy.DefaultValue;
Value = value;
}
public TestSetting(TestSetting copy)
{
Id = copy.Id;
DefaultValue = copy.DefaultValue;
Value = copy.Value;
}
public TestSetting(int id, string value, string defaultValue)
{
Id = id;
Value = value;
DefaultValue = defaultValue;
}
public TestSetting(TestSettingsEnum id, string value, string defaultValue)
{
Id = (int)id;
Value = value;
DefaultValue = defaultValue;
}
public string ToSerializeString()
{
return $"{Id}={Value.Replace("=", SEPARATOR)}";
}
public static bool TryParse(string s, out TestSetting ts)
{
ts = null;
var tokens = s.Split(new[] { "=" }, StringSplitOptions.None);
if (tokens.Length < 2) { return false; }
var id = tokens[0].Replace(SEPARATOR, "=");
var val = tokens[1].Replace(SEPARATOR, "=");
if (Enum.TryParse(id, out TestSettingsEnum enumValue))
{
ts = new TestSetting(enumValue, val, val);
return true;
}
if (int.TryParse(id, out var iTemp))
{
ts = new TestSetting(iTemp, val, val);
return true;
}
return false;
}
}
/// <summary>
/// list of all non columned test settings
/// </summary>
public enum TestSettingsEnum
{
ArmCheckListStep,
CheckListInputVoltageCheck,
CheckListBatteryVoltageCheck,
CheckListSquibResistanceCheck,
CheckListSensorIDCheck,
CheckListTriggerStartCheck,
CheckListTiltSensorCheck,
CheckListTemperatureCheck,
CheckListClockSyncCheck,
EW,//ExcitationWarmup
CheckListMustPass
}
/// <summary>
/// holds all possible settings for a test
/// </summary>
public class TestSettingDictionary
{
public TestSettingDictionary()
{
}
public TestSettingDictionary(TestSettingDictionary copy)
{
using (var e = copy._lookup.GetEnumerator())
{
while (e.MoveNext())
{
_lookup[e.Current.Key] = new TestSetting(e.Current.Value);
}
}
}
private const string SEPARATOR = "_X_";
private readonly Dictionary<int, TestSetting> _lookup = new Dictionary<int, TestSetting>();
public string GetValue(int id, string defaultValue)
{
if (!_lookup.ContainsKey(id)) { return defaultValue; }
return _lookup[id].Value ?? _lookup[id].DefaultValue;
}
public string GetValue(TestSettingsEnum id, string defaultValue)
{
return GetValue((int)id, defaultValue);
}
public void UnLoad()
{
_lookup.Clear();
}
/// <summary>
/// used to change the value in the dictionary (just the value, leave everything else the same)
/// </summary>
/// <param name="setting"></param>
/// <param name="value"></param>
public void SetValue(TestSetting setting, string value)
{
//we do it this way to avoid Add() and also to avoid accidentally reusing the input setting inappropriately
_lookup[setting.Id] = new TestSetting(setting, value);
}
/// <summary>
/// used to initialize a value in the dictionary
/// </summary>
/// <param name="setting"></param>
public void SetValue(TestSetting setting)
{
_lookup[setting.Id] = setting;
}
public void SetValue(TestSettingsEnum id, string value)
{
SetValue((int)id, value);
}
public void SetValue(int id, string value)
{
if (!_lookup.ContainsKey(id))
{
_lookup[id] = new TestSetting(id, value, value);
}
else { _lookup[id].Value = value; }
}
public string ToSerializeString()
{
var sb = new StringBuilder();
foreach (var s in _lookup.Values)
{
var sVal = s.ToSerializeString();
// ReSharper disable once StringIndexOfIsCultureSpecific.1
System.Diagnostics.Trace.Assert(sVal.IndexOf(SEPARATOR) < 0);
sVal = sVal.Replace(System.Globalization.CultureInfo.InvariantCulture.TextInfo.ListSeparator, SEPARATOR);
if (sb.Length > 0) { sb.Append(System.Globalization.CultureInfo.InvariantCulture.TextInfo.ListSeparator); }
sb.Append(sVal);
}
return sb.ToString();
}
public void LoadSettings(string s)
{
if (string.IsNullOrWhiteSpace(s)) { return; } //nothing to deserialize
var tokens = s.Split(new[] { System.Globalization.CultureInfo.InvariantCulture.TextInfo.ListSeparator }, StringSplitOptions.None);
foreach (var token in tokens)
{
var tok = token.Replace(SEPARATOR, System.Globalization.CultureInfo.InvariantCulture.TextInfo.ListSeparator);
//we prefer the default settings from the application
//if for some reason this key is no longer used, we can still stick it in the storage and use it as is
if (!TestSetting.TryParse(tok, out var ts)) continue;
if (!_lookup.ContainsKey(ts.Id))//no longer has a default setting, just use as is
{
_lookup[ts.Id] = ts;
}
else { _lookup[ts.Id].Value = ts.Value; }//default setting exists, just set the value
}
}
}
}

View File

@@ -0,0 +1,502 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Data.SqlClient;
using System.Data;
using System.ComponentModel;
using DTS.Common.Interface.GroupTemplate;
using DTS.Common.Storage;
using DTS.Common.Utilities.Logging;
namespace DTS.Common.ISO
{
public class TestObjectTemplateChannel : INotifyPropertyChanged, IGroupTemplateChannel, IComparable<TestObjectTemplateChannel>
{
#region INotifyPropertyChanged
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)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
#region constants and enums
public const string NONISOCHANNELTYPE = "NONISO";
public const string SEPARATOR = "_X_";
public const string TEST_SPECIFIC_DOUT = "TSD_";
public enum ReferenceChannelTypes { IMPLICIT, EXPLICIT, NOVALUE };
public enum DataSourceTypes
{
Transducer,
Calculation,
Camera,
Simulation,
Parameter
};
public enum DataStatusTypes
{
OK,
ChannelFailed,
MeaninglessData,
NoData,
QuestionableData,
ScalingFactorApplied,
SystemFailed,
LinearisedData,
NOVALUE
}
public enum StandardChannelProperties
{
NameOfTheChannel,
DisplayOrder
}
#endregion
#region properties
public bool Custom => null == Channel || Channel.MMEChannelType == (int)MMEPossibleChannels.MMEChannelTypes.SQL;
public int DisplayOrder
{
get => Convert.ToInt32(_channelProperties[StandardChannelProperties.DisplayOrder.ToString()].Value, System.Globalization.CultureInfo.InvariantCulture);
set
{
_channelProperties[StandardChannelProperties.DisplayOrder.ToString()].Value = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
OnPropertyChanged("DisplayOrder");
}
}
public int TemplateChannelId { get; set; }
public string NameOfTheChannel
{
get
{
var s = _channelProperties[StandardChannelProperties.NameOfTheChannel.ToString()].Value as string;
if (!string.IsNullOrWhiteSpace(s) && s != DataStatusTypes.NOVALUE.ToString()) return s;
if (Name.StartsWith(TEST_SPECIFIC_DOUT))
{
return $"(Digital Output Setting){Name}";
}
return Name;
}
set
{
_channelProperties[StandardChannelProperties.NameOfTheChannel.ToString()].Value = value;
OnPropertyChanged("NameOfTheChannel");
}
}
public string Name
{
get
{
var tokens = Channel.Text_L1.Split(new[] { SEPARATOR }, StringSplitOptions.None);
return tokens.Last();
}
}
public TestObjectTemplate Template { get; private set; }
private readonly List<string> _channelPropertyNames = new List<string>();
private Dictionary<string, ChannelProperty> _channelProperties = new Dictionary<string, ChannelProperty>();
public MMEPossibleChannels Channel { get; private set; }
public bool LocalOnly { get; set; }
public string ISOCode => null != Channel ? IsoCodeStatics.GetString(Channel, false) : "????????????????";
#endregion
#region methods
public bool Filter(string term)
{
if (Name.ToLower().Contains(term.ToLower()))
{
return true;
}
if (NameOfTheChannel.ToLower().Contains(term.ToLower()))
{
return true;
}
return false;
}
protected object GetProperty(string name, object defaultValue)
{
if (!_channelProperties.ContainsKey(name)) { _channelProperties[name] = new ChannelProperty(name, defaultValue); }
return _channelProperties[name].Value;
}
protected void SetProperty(string name, object value)
{
if (!_channelProperties.ContainsKey(name)) { _channelProperties[name] = new ChannelProperty(name, value); }
else { _channelProperties[name].Value = value; }
OnPropertyChanged("name"); // ? variable name instead of "name"
}
public void SetChannel(MMEPossibleChannels channel)
{
Channel = channel;
}
public void SetDisplayText(string objectSerial, string channelNumber, string text)
{
var name = text;
// In either case we will eventually split this display text to parse out "text", so dont allow separator
System.Diagnostics.Trace.Assert(!(name.Contains(SEPARATOR) || objectSerial.Contains(SEPARATOR) || channelNumber.Contains(SEPARATOR)), "SetDisplayText fed invalid characters");
if (string.IsNullOrEmpty(objectSerial) && string.IsNullOrEmpty(channelNumber))
{
// custom ISO channel name creation. no need for special sparator
Channel.SetText1($"{name}");
}
else
{
if (name?.Length > Constants.MAX_USER_CHANNEL_NAME_LENGTH)
{
name = name.Substring(0, Constants.MAX_USER_CHANNEL_NAME_LENGTH);
}
// Non ISO custom channel name creation
Channel.SetText1(string.Format("{0}{1}{2}{1}{3}", objectSerial, SEPARATOR, channelNumber, name));
}
}
public void SetID(long id)
{
Channel = new MMEPossibleChannels(Channel);
Channel.SetId(id);
}
public override string ToString()
{
return null != Channel ? $"{Name}({Channel.Id})" : Name;
}
private void AddStandardProperties()
{
if (null != _channelProperties) { _channelProperties.Clear(); _channelProperties = null; }
_channelProperties = new Dictionary<string, ChannelProperty>();
var scp = Enum.GetValues(typeof(StandardChannelProperties)).Cast<StandardChannelProperties>().ToArray();
foreach (var p in scp)
{
ChannelProperty cp;
switch (p)
{
case StandardChannelProperties.DisplayOrder: cp = new ChannelProperty(p.ToString(), "-1"); break;
case StandardChannelProperties.NameOfTheChannel: cp = new ChannelProperty("Name of the channel", "NOVALUE"); break;
default: cp = new ChannelProperty(p.ToString(), "NOVALUE"); break;
}
_channelProperties.Add(p.ToString(), cp);
}
}
public void SetTemplate(TestObjectTemplate template) { Template = template; }
#endregion
#region Required
private bool _bRequired;
/// <summary>
/// Required channel property raises the OnRequiredChanged event
/// </summary>
public bool Required
{
get => _bRequired;
set
{
_bRequired = value;
OnRequiredChanged(new RequiredChangedEventArgs { NewValue = value });
SetProperty(ref _bRequired, value, "Required");
}
}
/// <summary>
/// Event and event handler provide "client" side functionality
/// to add required channels to the list
/// See also RequiredChangedEventArgs class
/// </summary>
public event EventHandler<RequiredChangedEventArgs> RequiredChanged;
public virtual void OnRequiredChanged(RequiredChangedEventArgs e)
{
RequiredChanged?.Invoke(this, e);
}
public int CompareTo(TestObjectTemplateChannel other)
{
if (null == other)
{
return 1;
}
if (Equals(other))
{
return 0;
}
var displayOrder = DisplayOrder.CompareTo(other.DisplayOrder);
if (0 == displayOrder)
{
var channelId = Channel.Id.CompareTo(other.Channel.Id);
return 0 == channelId ? string.Compare(Name, other.Name, StringComparison.Ordinal) : channelId;
}
return displayOrder;
}
#endregion Required
#region constructors and initializers
public TestObjectTemplateChannel(DataRow dr, TestObjectTemplate template, ref ISO13499FileDb db)
{
Template = template;
AddStandardProperties();
TemplateChannelId = Convert.ToInt32(dr["TemplateChannelId"]);
_channelProperties[StandardChannelProperties.NameOfTheChannel.ToString()].Value = (string)dr["NameOfTheChannel"];
_channelProperties[StandardChannelProperties.DisplayOrder.ToString()].Value = -1;
if (!DBNull.Value.Equals(dr["DisplayOrder"]))
{
_channelProperties[StandardChannelProperties.DisplayOrder.ToString()].Value = Convert
.ToInt32(dr["DisplayOrder"]).ToString(System.Globalization.CultureInfo.InvariantCulture);
}
else
{
DisplayOrder = -1;
}
_bRequired = Convert.ToBoolean(dr["Required"]);
LocalOnly = Convert.ToBoolean(dr["LocalOnly"]);
var channelId = Convert.ToInt64(dr["MMEChannelId"]);
var channelType = Convert.ToInt32(dr["MMEChannelType"]);
Channel = db.GetPossibleChannel(channelId, channelType);
}
public TestObjectTemplateChannel(TestObjectTemplateChannel copy, TestObjectTemplate template)
{
TemplateChannelId = copy.TemplateChannelId;
LocalOnly = copy.LocalOnly;
_bRequired = copy.Required;
Channel = new MMEPossibleChannels(copy.Channel);
_channelProperties = new Dictionary<string, ChannelProperty>();
using (var e = copy._channelProperties.GetEnumerator())
{
while (e.MoveNext())
{
_channelProperties[e.Current.Key] = new ChannelProperty(e.Current.Value);
}
}
_channelPropertyNames = new List<string>(copy._channelPropertyNames.ToArray());
Template = template;
}
public TestObjectTemplateChannel(MMEPossibleChannels channel)
{
Channel = channel;
AddStandardProperties();
DisplayOrder = -1;
var scp = Enum.GetValues(typeof(StandardChannelProperties)).Cast<StandardChannelProperties>().ToArray();
foreach (var p in scp)
{
switch (p)
{
//case StandardChannelProperties.DisplayOrder: _channelProperties[StandardChannelProperties.DisplayOrder.ToString()].Value = Convert.ToInt32(Channel.Id).ToString(System.Globalization.CultureInfo.InvariantCulture); break;
case StandardChannelProperties.NameOfTheChannel: break;
}
}
}
#endregion
#region Unused Properties/meta data
public string LaboratoryCode
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string CustomerChannelCode
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string ChannelCode
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string Comments1
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string Location
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string Dimension
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string Direction
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string ChannelFrequencyClass
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string Unit
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string ReferenceSystem
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string TestObjectNumber
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string TransducerType
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string TransducerId
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string PreFilterType
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string CutOffFrequency
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string ChannelAmplitudeClass
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public ReferenceChannelTypes ReferenceChannel
{
get => ReferenceChannelTypes.NOVALUE;
set { }
}
public string ReferenceChannelName
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public DataSourceTypes DataSource
{
get => DataSourceTypes.Parameter;
set { }
}
public DataStatusTypes DataStatus
{
get => DataStatusTypes.NOVALUE;
set { }
}
public string SamplingInterval
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string BitResolution
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string TimeOfFirstSample
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string NumberOfSamples
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string OffsetPostTest
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string TransducerNaturalFrequency
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string TransducerDampingRatio
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string Comments2
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string FirstGlobalMaximumValue
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string TimeOfMaximumValue
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string FirstGlobalMinimumValue
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string TimeOfMinimumValue
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string StartOffsetInterval
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
public string EndOffsetInterval
{
get => DataStatusTypes.NOVALUE.ToString();
set { }
}
#endregion
//TODO: move to separate class
public class ChannelProperty : ISerializable
{
public string Name { get; }
public object Value { get; set; } = "NOVALUE";
public ChannelProperty(ChannelProperty copy)
{
Name = copy.Name;
Value = copy.Value;
}
public ChannelProperty(string name, object value)
{
Name = name;
Value = value;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("PropertyName", Name);
info.AddValue("PropertyValue", Value, Value.GetType());
}
}
}
public class RequiredChangedEventArgs : EventArgs
{
public bool NewValue { get; set; }
}
}