init
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
using DTS.Common.Base;
|
||||
|
||||
namespace DTS.Common.Interface
|
||||
{
|
||||
public interface IDBViewModel : IBaseViewModel
|
||||
{
|
||||
IDBImportView ImportView { get; set; }
|
||||
IDBExportView ExportView { get; set; }
|
||||
/// <summary>
|
||||
/// file name to import from
|
||||
/// we may not need this in the viewmodel if the viewmodel is capable of doing all the operations it needs to do
|
||||
/// but for now I leave it here so it can be initialized
|
||||
/// </summary>
|
||||
string ImportFileName { get; set; }
|
||||
string ImportStatusText { get; set; }
|
||||
/// <summary>
|
||||
/// file name to export to
|
||||
/// same caveat as above
|
||||
/// </summary>
|
||||
string ExportFileName { get; set; }
|
||||
/// <summary>
|
||||
/// for now this is formatted xml string to write to the file
|
||||
/// </summary>
|
||||
string ExportData { get; set; }
|
||||
/// <summary>
|
||||
/// for now this is the formatted xml string read from the file
|
||||
/// </summary>
|
||||
string ImportData { get; set; }
|
||||
/// <summary>
|
||||
/// Exports ExportData to ExportFileName
|
||||
/// </summary>
|
||||
void Export();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using DTS.Common.Utilities.Logging;
|
||||
|
||||
namespace DTS.Common.Utils
|
||||
{
|
||||
public class SecureQueue<T> : IDisposable where T : new()
|
||||
{
|
||||
public enum NullPolicy
|
||||
{
|
||||
DenyNull, // throw an exception if try to Enqueue null or zero length
|
||||
SkipNull, // don't complain but don't enqueue null or zero length
|
||||
AllowNull // let null's in too
|
||||
}
|
||||
|
||||
protected Queue<T[]> ByteQueue;
|
||||
protected object ByteQueueLock;
|
||||
protected ManualResetEvent ByteQueueEvent;
|
||||
protected NullPolicy _NullPolicy;
|
||||
protected string Name;
|
||||
protected Stopwatch StopWatch;
|
||||
|
||||
public SecureQueue(NullPolicy policy, string name)
|
||||
{
|
||||
StopWatch = new Stopwatch();
|
||||
StopWatch.Start();
|
||||
ByteQueue = new Queue<T[]>();
|
||||
ByteQueueLock = new object();
|
||||
ByteQueueEvent = new ManualResetEvent(false);
|
||||
_NullPolicy = policy;
|
||||
Name = name;
|
||||
}
|
||||
|
||||
public void ResetEvent()
|
||||
{
|
||||
//latestReset = GetCaller();
|
||||
ByteQueueEvent.Reset();
|
||||
}
|
||||
|
||||
public void Enqueue(T[] newData)
|
||||
{
|
||||
try
|
||||
{
|
||||
lock (ByteQueueLock)
|
||||
{
|
||||
if (newData == null || newData.Length == 0)
|
||||
{
|
||||
switch (_NullPolicy)
|
||||
{
|
||||
case NullPolicy.DenyNull:
|
||||
throw new ArgumentException("SecureQueue_Enqueue_Err1");
|
||||
case NullPolicy.SkipNull:
|
||||
return;
|
||||
}
|
||||
}
|
||||
ByteQueue.Enqueue((T[])newData?.Clone());
|
||||
if (Enums.DASFactory.DFConstantsAndEnums.ExtraCommunicationLogging)
|
||||
{
|
||||
APILogger.Log("Enqueing data", newData);
|
||||
}
|
||||
ByteQueueEvent.Set();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
APILogger.LogString("SecureQueue.Enqueue: The queue(" + Name + ") threw an exception. " + ex.Message + " " + ex.StackTrace);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wait for TimeoutMillisec milliseconds for data to arrive in the buffer. Returns false if it times out.
|
||||
/// </summary>
|
||||
/// <param name="timeoutMillisec"></param>
|
||||
/// <returns>true if data has arrived, false if it times out</returns>
|
||||
public bool WaitForData(int timeoutMillisec)
|
||||
{
|
||||
try
|
||||
{
|
||||
var result = ByteQueueEvent.WaitOne(timeoutMillisec, false);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
APILogger.LogString("SecureQueue.WaitForData: The queue(" + Name + ") threw an exception. " + ex.Message + " " + ex.StackTrace);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public WaitHandle QueueWaitHandle => ByteQueueEvent;
|
||||
|
||||
public T[] Dequeue(bool resetEvent)
|
||||
{
|
||||
try
|
||||
{
|
||||
lock (ByteQueueLock)
|
||||
{
|
||||
ByteQueueEvent = new ManualResetEvent(false);
|
||||
|
||||
if (ByteQueue.Count == 0)
|
||||
{
|
||||
return new T[0];
|
||||
}
|
||||
if (ByteQueue.Count == 1)
|
||||
{
|
||||
var ret = ByteQueue.Dequeue();
|
||||
return ret;
|
||||
}
|
||||
|
||||
// count how much data we have
|
||||
var totalBytes = ByteQueue.Sum(arr => arr.Length);
|
||||
if (totalBytes == 0)
|
||||
{
|
||||
APILogger.LogString("SecureQueue.Dequeue: The queue(" + Name + ") has 0 bytes!");
|
||||
}
|
||||
// allocate that much
|
||||
var result = new T[totalBytes];
|
||||
var index = 0;
|
||||
// now make one large array
|
||||
while (ByteQueue.Any())
|
||||
{
|
||||
var element = ByteQueue.Dequeue();
|
||||
Array.Copy(element, 0, result, index, element.Length);
|
||||
index += element.Length;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
APILogger.LogString("SecureQueue.Dequeue: The queue(" + Name + ") threw an exception. " + ex.Message + " " + ex.StackTrace);
|
||||
}
|
||||
return new T[0];
|
||||
}
|
||||
|
||||
public void Flush()
|
||||
{
|
||||
try
|
||||
{
|
||||
lock (ByteQueueLock)
|
||||
{
|
||||
//latestFlush = GetCaller();
|
||||
ByteQueueEvent = new ManualResetEvent(false);
|
||||
ByteQueue.Clear();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
APILogger.LogString("SecureQueue.Flush: The queue(" + Name + ") threw an exception. " + ex.Message + " " + ex.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsEmpty()
|
||||
{
|
||||
return ByteQueue.Count == 0;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace DTS.Common.Converters
|
||||
{
|
||||
class ErrorToBooleanConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||
{
|
||||
// For a more sophisticated converter, check also the targetType and react accordingly..
|
||||
if (value is string)
|
||||
{
|
||||
|
||||
return string.IsNullOrEmpty(value.ToString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||
{
|
||||
// If necessary, here you can convert back. Check if which brush it is (if its one),
|
||||
// get its Color-value and return it.
|
||||
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,425 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Windows.Media;
|
||||
using DTS.Common.Base;
|
||||
using DTS.Common.Enums.Sensors;
|
||||
using DTS.Common.Interface;
|
||||
// ReSharper disable CheckNamespace
|
||||
// ReSharper disable RedundantDefaultMemberInitializer
|
||||
// ReSharper disable RedundantCast
|
||||
|
||||
namespace DTS.Common.Classes.Viewer.TestMetadata
|
||||
{
|
||||
[Serializable]
|
||||
public class TestChannel : BasePropertyChanged, ITestChannel
|
||||
{
|
||||
public string Group { get; set; }
|
||||
public string SubGroup { get; set; }
|
||||
|
||||
private bool _isGraphChannel = false;
|
||||
public bool IsGraphChannel { get => _isGraphChannel; set { _isGraphChannel = value; OnPropertyChanged("IsGraphChannel"); } }
|
||||
public string GraphName { get; set; }
|
||||
public string TestId { get; set; }
|
||||
|
||||
public string TestSetupName { get; set; }
|
||||
public string ModuleSerialNumber { get; set; }
|
||||
public string SerialNumber { get; set; }
|
||||
public string ChannelId { get; set; }
|
||||
private string _channelDisplayName = string.Empty;
|
||||
public string ChannelDisplayName
|
||||
{
|
||||
get => _channelDisplayName;
|
||||
set => SetProperty(ref _channelDisplayName, value, "ChannelDisplayName");
|
||||
}
|
||||
public string Description { get; set; }
|
||||
public string IsoCode { get; set; }
|
||||
public string IsoChannelName { get; set; }
|
||||
public string UserCode { get; set; }
|
||||
public string UserChannelName { get; set; }
|
||||
public string ChannelGroupName { get; set; }
|
||||
public string ChannelType { get; set; }
|
||||
private bool _isCalculatedChannel = false;
|
||||
|
||||
public bool IsCalculatedChannel
|
||||
{
|
||||
get => _isCalculatedChannel;
|
||||
set => SetProperty(ref _isCalculatedChannel, value, "IsCalculatedChannel");
|
||||
}
|
||||
|
||||
public int Number { get; set; }
|
||||
public string DigitalMultiplier { get; set; }
|
||||
public string DigitalMode { get; set; }
|
||||
public DateTime Start { get; set; }
|
||||
public string Bridge { get; set; }
|
||||
public double BridgeResistanceOhms { get; set; }
|
||||
public double ZeroPoint { get; set; }
|
||||
private string _channelDescriptionString;
|
||||
public ulong T1Sample { get; set; } = 0;
|
||||
public ulong T2Sample { get; set; } = 0;
|
||||
public double HIC { get; set; } = 0D;
|
||||
public bool UseEUScaler { get; set; }
|
||||
public double ScaleFactorEU { get; set; } = 0D;
|
||||
|
||||
public string ChannelDescriptionString
|
||||
{
|
||||
get => _channelDescriptionString;
|
||||
set => SetProperty(ref _channelDescriptionString, value, "ChannelDescriptionString");
|
||||
}
|
||||
|
||||
public void SetChannelDescriptionAndDisplayName(string channelDescription)
|
||||
{
|
||||
ChannelDescriptionString = channelDescription;
|
||||
ChannelDisplayName = $"{ChannelName2} {ChannelDescriptionString}";
|
||||
}
|
||||
public string ChannelName2 { get; set; }
|
||||
public string HardwareChannelName { get; set; }
|
||||
public double DesiredRange { get; set; }
|
||||
public double ActualMaxRangeEu { get; set; }
|
||||
public double ActualMinRangeEu { get; set; }
|
||||
public double ActualMaxRangeAdc => short.MaxValue;
|
||||
public double ActualMinRangeAdc => short.MinValue;
|
||||
public double ActualMaxRangeMv { get; set; }
|
||||
public double ActualMinRangeMv { get; set; }
|
||||
public double Sensitivity { get; set; }
|
||||
public string SoftwareFilter { get; set; }
|
||||
public bool ProportionalToExcitation { get; set; }
|
||||
public bool IsInverted { get; set; }
|
||||
public string LinearizationFormula { get; set; }
|
||||
public bool IsSubsampled { get; set; }
|
||||
public int AbsoluteDisplayOrder { get; set; }
|
||||
public DateTime LastCalibrationDate { get; set; }
|
||||
public string SensorId { get; set; }
|
||||
public int OffsetToleranceLowMv { get; set; }
|
||||
public int OffsetToleranceHighMv { get; set; }
|
||||
public int DataFlag { get; set; }
|
||||
public string ExcitationVoltage { get; set; }
|
||||
public string Eu { get; set; }
|
||||
public bool CalSignalEnabled { get; set; }
|
||||
public bool ShuntEnabled { get; set; }
|
||||
public bool VoltageInsertionCheckEnabled { get; set; }
|
||||
public bool RemoveOffset { get; set; }
|
||||
public string ZeroMethod { get; set; }
|
||||
public double ZeroAverageWindowBegin { get; set; }
|
||||
public double ZeroAverageWindowEnd { get; set; }
|
||||
public int InitialEu { get; set; }
|
||||
public string InitialOffset { get; set; }
|
||||
public int UnsubsampledSampleRateHz { get; set; }
|
||||
public double MeasuredShuntDeflectionMv { get; set; }
|
||||
public double TargetShuntDeflectionMv { get; set; }
|
||||
public double MeasuredExcitationVoltage { get; set; }
|
||||
public double FactoryExcitationVoltage { get; set; }
|
||||
public double TimeOfFirstSample { get; set; }
|
||||
public double Multiplier { get; set; }
|
||||
public double UserOffsetEu { get; set; }
|
||||
public int UnitConversion { get; set; }
|
||||
public bool AtCapacity { get; set; }
|
||||
public int CapacityOutputIsBasedOn { get; set; }
|
||||
public string SourceChannelNumber { get; set; }
|
||||
public string SourceModuleNumber { get; set; }
|
||||
public string SourceModuleSerialNumber { get; set; }
|
||||
public string Calculation { get; set; }
|
||||
public int SampleRateHz { get; set; }
|
||||
public string SensitivityUnits { get; set; }
|
||||
public int SensorCapacity { get; set; }
|
||||
public string SensorPolarity { get; set; }
|
||||
public int ChannelNumber { get; set; }
|
||||
public string BinaryFileName { get; set; }
|
||||
public string BinaryFilePath { get; set; }
|
||||
public double Xmax { get; set; }
|
||||
public double Xmin { get; set; }
|
||||
public int SequentialNumbers { get; set; }
|
||||
public ITestSetupMetadata ParentTestSetup { get; set; }
|
||||
public ITestModule ParentModule { get; set; }
|
||||
public IBaseViewModel Parent { get; set; }
|
||||
|
||||
private Color _channelColor = Colors.Transparent;
|
||||
|
||||
public Color ChannelColor
|
||||
{
|
||||
get => _channelColor;
|
||||
set => SetProperty(ref _channelColor, value, "ChannelColor");
|
||||
}
|
||||
|
||||
private string _errorMessage = string.Empty;
|
||||
|
||||
public string ErrorMessage
|
||||
{
|
||||
get => _errorMessage;
|
||||
set
|
||||
{
|
||||
_errorMessage = value;
|
||||
_isError = !string.IsNullOrEmpty(_errorMessage);
|
||||
OnPropertyChanged("ErrorMessage");
|
||||
}
|
||||
}
|
||||
|
||||
private bool _isError = false;
|
||||
public bool IsError
|
||||
{
|
||||
get => _isError;
|
||||
set => SetProperty(ref _isError, value, "IsError");
|
||||
}
|
||||
|
||||
private Color? _errorColor = Colors.Black;
|
||||
|
||||
public Color? ErrorColor
|
||||
{
|
||||
get { _errorColor = _isError ? Colors.Red : Colors.Black; return _errorColor; }
|
||||
set => SetProperty(ref _errorColor, value, "ErrorColor");
|
||||
}
|
||||
|
||||
|
||||
private bool _isLocked = false;
|
||||
|
||||
public bool IsLocked
|
||||
{
|
||||
get => _isLocked;
|
||||
set
|
||||
{
|
||||
_isLocked = value;
|
||||
if (!_isLocked && !_isSelected && !_isGraphChannel) { ChannelColor = Colors.Transparent; }
|
||||
if (CanSelectChannel)
|
||||
{
|
||||
var parent = Parent;
|
||||
if (parent.GetType().GetInterfaces().Contains(typeof(IGraphMainViewModel))) { ((IGraphMainViewModel)parent).AddLockedChannel(this, _isLocked); }
|
||||
}
|
||||
OnPropertyChanged("IsLocked");
|
||||
}
|
||||
}
|
||||
|
||||
private bool _bCanLock = true;
|
||||
public bool CanLock
|
||||
{
|
||||
get => _bCanLock;
|
||||
set => SetProperty(ref _bCanLock, !IsError && value, "CanLock");
|
||||
}
|
||||
private bool _canSelectChannel = true;
|
||||
|
||||
public bool CanSelectChannel
|
||||
{
|
||||
get => _canSelectChannel;
|
||||
set => SetProperty(ref _canSelectChannel, !IsError && value, "CanSelectChannel");
|
||||
}
|
||||
|
||||
private bool _isExpanded = true;
|
||||
|
||||
public bool IsExpanded
|
||||
{
|
||||
get => _isExpanded;
|
||||
set => SetProperty(ref _isExpanded, value, "IsExpanded");
|
||||
}
|
||||
|
||||
private bool _isSelected = false;
|
||||
|
||||
public bool IsSelected
|
||||
{
|
||||
get => _isSelected;
|
||||
set
|
||||
{
|
||||
var parent = Parent;
|
||||
_isSelected = value;
|
||||
|
||||
if (!_isLocked && !_isSelected && !_isGraphChannel) { ChannelColor = Colors.Transparent; }
|
||||
|
||||
if (_isSelected && CanSelectChannel)
|
||||
{
|
||||
if (parent.GetType().GetInterfaces().Contains(typeof(IGraphMainViewModel))) { ((IGraphMainViewModel)parent).AddSelectedChannel(this); }
|
||||
OnPropertyChanged("IsSelected");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ITestChannel Copy() { return (TestChannel)MemberwiseClone(); }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
if( SensorConstants.IsTestSpecificEmbedded(ChannelDescriptionString)) { return Strings.Strings.Table_NA; }
|
||||
return ChannelDescriptionString;
|
||||
}
|
||||
|
||||
|
||||
private double _minADC = double.NaN;
|
||||
/// <summary>
|
||||
/// Min value of ADC for entire dataset
|
||||
/// </summary>
|
||||
public double MinADC
|
||||
{
|
||||
get => _minADC;
|
||||
set => SetProperty(ref _minADC, value, "MinADC");
|
||||
}
|
||||
private double _maxADC = double.NaN;
|
||||
/// <summary>
|
||||
/// Max value in ADC for entire dataset
|
||||
/// </summary>
|
||||
public double MaxADC
|
||||
{
|
||||
get => _maxADC;
|
||||
set => SetProperty(ref _maxADC, value, "MaxADC");
|
||||
}
|
||||
private double _aveADC = double.NaN;
|
||||
/// <summary>
|
||||
/// Average value in ADC for entire dataset
|
||||
/// </summary>
|
||||
public double AveADC
|
||||
{
|
||||
get => _aveADC;
|
||||
set => SetProperty(ref _aveADC, value, "AveADC");
|
||||
}
|
||||
private double _stdDevADC = double.NaN;
|
||||
/// <summary>
|
||||
/// STD DEV in ADC for entire dataset
|
||||
/// </summary>
|
||||
public double StdDevADC
|
||||
{
|
||||
get => _stdDevADC;
|
||||
set => SetProperty(ref _stdDevADC, value, "StdDevADC");
|
||||
}
|
||||
private double _t0ADC = double.NaN;
|
||||
/// <summary>
|
||||
/// Value @ T0 in ADC
|
||||
/// </summary>
|
||||
public double T0ADC
|
||||
{
|
||||
get => _t0ADC;
|
||||
set => SetProperty(ref _t0ADC, value, "T0ADC");
|
||||
}
|
||||
private double _minMV = double.NaN;
|
||||
/// <summary>
|
||||
/// Minimum value in mV for entire dataset
|
||||
/// </summary>
|
||||
public double MinMV
|
||||
{
|
||||
get => _minMV;
|
||||
set => SetProperty(ref _minMV, value, "MinMV");
|
||||
}
|
||||
private double _maxMV = double.NaN;
|
||||
/// <summary>
|
||||
/// Maximum value in mV for entire dataset
|
||||
/// </summary>
|
||||
public double MaxMV
|
||||
{
|
||||
get => _maxMV;
|
||||
set => SetProperty(ref _maxMV, value, "MaxMV");
|
||||
}
|
||||
private double _aveMV = double.NaN;
|
||||
/// <summary>
|
||||
/// average value in mV for entire dataset
|
||||
/// </summary>
|
||||
public double AveMV
|
||||
{
|
||||
get => _aveMV;
|
||||
set => SetProperty(ref _aveMV, value, "AveMV");
|
||||
}
|
||||
private double _stdDevMV = double.NaN;
|
||||
/// <summary>
|
||||
/// std dev in mV for entire dataset
|
||||
/// </summary>
|
||||
public double StdDevMV
|
||||
{
|
||||
get => _stdDevMV;
|
||||
set => SetProperty(ref _stdDevMV, value, "StdDevMV");
|
||||
}
|
||||
private double _t0MV = double.NaN;
|
||||
/// <summary>
|
||||
/// value in mV at T0
|
||||
/// </summary>
|
||||
public double T0MV
|
||||
{
|
||||
get => _t0MV;
|
||||
set => SetProperty(ref _t0MV, value, "T0MV");
|
||||
}
|
||||
|
||||
private double _minEU = double.NaN;
|
||||
/// <summary>
|
||||
/// minimum value in EU for entire dataset
|
||||
/// </summary>
|
||||
public double MinEU
|
||||
{
|
||||
get => _minEU;
|
||||
set => SetProperty(ref _minEU, value, "MinEU");
|
||||
}
|
||||
private double _maxEU = double.NaN;
|
||||
/// <summary>
|
||||
/// maximum value in EU for entire dataset
|
||||
/// </summary>
|
||||
public double MaxEU
|
||||
{
|
||||
get => _maxEU;
|
||||
set => SetProperty(ref _maxEU, value, "MaxEU");
|
||||
}
|
||||
private double _aveEU = double.NaN;
|
||||
/// <summary>
|
||||
/// average value in EU for entire dataset
|
||||
/// </summary>
|
||||
public double AveEU
|
||||
{
|
||||
get => _aveEU;
|
||||
set => SetProperty(ref _aveEU, value, "AveEU");
|
||||
}
|
||||
private double _stdDevEU = double.NaN;
|
||||
/// <summary>
|
||||
/// std dev in EU
|
||||
/// </summary>
|
||||
public double StdDevEU
|
||||
{
|
||||
get => _stdDevEU;
|
||||
set => SetProperty(ref _stdDevEU, value, "StdDevEU");
|
||||
}
|
||||
private double _t0EU = double.NaN;
|
||||
/// <summary>
|
||||
/// value at T0 in EU
|
||||
/// </summary>
|
||||
public double T0EU
|
||||
{
|
||||
get => _t0EU;
|
||||
set => SetProperty(ref _t0EU, value, "T0EU");
|
||||
}
|
||||
|
||||
private double _minY = double.NaN;
|
||||
/// <summary>
|
||||
/// minimum value for whatever current units are for entire dataset
|
||||
/// </summary>
|
||||
public double MinY
|
||||
{
|
||||
get => _minY;
|
||||
set => SetProperty(ref _minY, value, "MinY");
|
||||
}
|
||||
private double _maxY = double.NaN;
|
||||
/// <summary>
|
||||
/// maximum value for whatever current units are for entire dataset
|
||||
/// </summary>
|
||||
public double MaxY
|
||||
{
|
||||
get => _maxY;
|
||||
set => SetProperty(ref _maxY, value, "MaxY");
|
||||
}
|
||||
private double _aveY = double.NaN;
|
||||
/// <summary>
|
||||
/// average value for whatever current units are for entire dataset
|
||||
/// </summary>
|
||||
public double AveY
|
||||
{
|
||||
get => _aveY;
|
||||
set => SetProperty(ref _aveY, value, "AveY");
|
||||
}
|
||||
private double _stdDevY = double.NaN;
|
||||
/// <summary>
|
||||
/// std deviation for whatever current units are
|
||||
/// </summary>
|
||||
public double StdDevY
|
||||
{
|
||||
get => _stdDevY;
|
||||
set => SetProperty(ref _stdDevY, value, "StdDevY");
|
||||
}
|
||||
|
||||
private double _T0Value = double.NaN;
|
||||
/// <summary>
|
||||
/// Value at T0 in whatever current units are
|
||||
/// </summary>
|
||||
public double T0Value
|
||||
{
|
||||
get => _T0Value;
|
||||
set => SetProperty(ref _T0Value, value, "T0Value");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user