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,268 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.ComponentModel;
using System.Globalization;
namespace DatabaseImport
{
public class SensorCalibration : IComparable<SensorCalibration>, INotifyPropertyChanged, ISensorCalibration
{
public long CalVersion { get; set; } = long.MinValue;
public InitialOffset InitialOffset { get; set; } = new InitialOffset();
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));
}
private bool _nonLinear;
public bool NonLinear
{
get => _nonLinear;
set
{
_nonLinear = value;
if (!value) return;
Records.Records[0].Sensitivity = 1D;
IsProportional = false;
RemoveOffset = false;
}
}
public static SensorCalibration NewDigitalSC()
{
var sc = new SensorCalibration
{
RemoveOffset = false,
CalibrationDate = DateTime.Now.Date,
IsProportional = false,
LocalOnly = false,
NonLinear = false
};
sc.Records.Records[0].Sensitivity = 1;
sc.Records.Records[0].EngineeringUnits = "V";
sc.Records.Records[0].Excitation = ExcitationVoltageOptions.ExcitationVoltageOption.Volt5;
sc.ZeroMethod = new ZeroMethod(ZeroMethodType.None, 0, 0);
return sc;
}
public static SensorCalibration GetLatestCalibrationBySerialNumberAndExcitation(SensorData sd, ExcitationVoltageOptions.ExcitationVoltageOption exc)
{
return SensorCalibrationList.GetLatestCalibrationBySerialNumberAndExcitation(sd, exc);
}
private string _serialNumber = "";
public string SerialNumber
{
get => _serialNumber;
set => SetProperty(ref _serialNumber, value, "SerialNumber");
}
private DateTime _calibrationDate; // these two are the keys
public DateTime CalibrationDate
{
get => _calibrationDate;
set => SetProperty(ref _calibrationDate, value, "CalibrationDate");
}
private string _username = "";
public string Username
{
get => _username ?? string.Empty;
set => SetProperty(ref _username, value, "Username");
}
private CalibrationRecords _records = new CalibrationRecords();
public CalibrationRecords Records
{
get => _records;
set => _records = value;
}
private DateTime _modifyDate;
public DateTime ModifyDate
{
get => _modifyDate;
set => _modifyDate = value;
}
private bool _isProportional = true;
public bool IsProportional
{
get => !NonLinear && _isProportional;
set => _isProportional = value;
}
private bool _bRemoveOffset = true;
public bool RemoveOffset
{
get => !NonLinear && _bRemoveOffset;
set => _bRemoveOffset = value;
}
private List<string> _certificationDocuments = new List<string>();
public string[] CertificationDocuments
{
get => _certificationDocuments.ToArray();
set => _certificationDocuments = new List<string>(value);
}
public static int DefaultZeroMethod = 0;
private ZeroMethod _zeroMethod;
public ZeroMethod ZeroMethod
{
get
{
if (null == _zeroMethod)
{
_zeroMethod = new ZeroMethod((ZeroMethodType)DefaultZeroMethod, -.05, -.02);
}
try
{
if (NonLinear)
{
switch (Records.Records[0].Poly.NonLinearStyle)
{
case NonLinearStyles.IRTraccAverageOverTime: _zeroMethod.Method = ZeroMethodType.AverageOverTime; break;
case NonLinearStyles.IRTraccDiagnosticsZero: _zeroMethod.Method = ZeroMethodType.UsePreEventDiagnosticsZero; break;
}
}
}
catch (Exception) { /*APILogger.Log(ex);*/ }
return _zeroMethod;
}
set => _zeroMethod = value;
}
public bool LocalOnly { get; set; }
public SensorCalibration()
{
if (!NonLinear) return;
Records.Records[0].Sensitivity = 1D;
IsProportional = false;
RemoveOffset = false;
}
public SensorCalibration(string s)
{
FromSerializedString(s);
if (!NonLinear) return;
Records.Records[0].Sensitivity = 1D;
IsProportional = false;
RemoveOffset = false;
}
public SensorCalibration(DataRow dr)
{
try
{
CalibrationDate = Convert.ToDateTime(dr[DbOperations.SensorDB.SensorCalibrationFields.CalibrationDate.ToString()]);
LocalOnly = Convert.ToBoolean(dr[DbOperations.SensorDB.SensorCalibrationFields.LocalOnly.ToString()]);
SerialNumber = (string)dr[DbOperations.SensorDB.SensorCalibrationFields.SerialNumber.ToString()];
Username = (string)dr[DbOperations.SensorDB.SensorCalibrationFields.Username.ToString()];
Records = new CalibrationRecords((string)dr[DbOperations.SensorDB.SensorCalibrationFields.CalibrationRecords.ToString()]);
IsProportional = Convert.ToBoolean(dr[DbOperations.SensorDB.SensorCalibrationFields.IsProportional.ToString()]);
ModifyDate = Convert.ToDateTime(dr[DbOperations.SensorDB.SensorCalibrationFields.ModifyDate.ToString()]);
NonLinear = Convert.ToBoolean(dr[DbOperations.SensorDB.SensorCalibrationFields.NonLinear.ToString()]);
CertificationDocuments = ((string)dr[DbOperations.SensorDB.SensorCalibrationFields.CertificationDocuments.ToString()]).Split(new[] { CultureInfo.InvariantCulture.TextInfo.ListSeparator }, StringSplitOptions.None).ToArray();
RemoveOffset = Convert.ToBoolean(dr[DbOperations.SensorDB.SensorCalibrationFields.RemoveOffset.ToString()]);
ZeroMethod = new ZeroMethod((string)dr[DbOperations.SensorDB.SensorCalibrationFields.ZeroMethod.ToString()]);
InitialOffset = new InitialOffset(); InitialOffset.FromDbSerializeString((string)dr[DbOperations.SensorDB.SensorCalibrationFields.InitialOffset.ToString()]);
//this is downright silly, but because the linearization formula marks itself valid when it deserializes with data in it, we go and correct it here.
Records.Records[0].Poly.MarkValid(NonLinear);
if (!NonLinear) return;
Records.Records[0].Sensitivity = 1D;
IsProportional = false;
RemoveOffset = false;
}
catch (Exception)
{
//APILogger.Log("Failed to process Sensor Calibration record", ex);
}
}
public void FromSerializedString(string s)
{
var fields = Enum.GetValues(typeof(DbOperations.SensorDB.SensorCalibrationFields)).Cast<DbOperations.SensorDB.SensorCalibrationFields>().ToArray();
var tokens = s.Split(new[] { CultureInfo.InvariantCulture.TextInfo.ListSeparator }, StringSplitOptions.None);
for (var i = 0; i < tokens.Length && i < fields.Length; i++)
{
var field = fields[i];
var token = tokens[i].Replace(SEPARATOR_REPLACEMENT, CultureInfo.InvariantCulture.TextInfo.ListSeparator);
switch (field)
{
case DbOperations.SensorDB.SensorCalibrationFields.CalibrationDate: CalibrationDate = DateTime.FromFileTimeUtc(Convert.ToInt64(token)); break;
case DbOperations.SensorDB.SensorCalibrationFields.CalibrationRecords: Records = new CalibrationRecords(token); break;
case DbOperations.SensorDB.SensorCalibrationFields.IsProportional: IsProportional = Convert.ToBoolean(token); break;
case DbOperations.SensorDB.SensorCalibrationFields.LocalOnly: LocalOnly = Convert.ToBoolean(token); break;
case DbOperations.SensorDB.SensorCalibrationFields.ModifyDate: ModifyDate = DateTime.FromFileTimeUtc(Convert.ToInt64(token)); break;
case DbOperations.SensorDB.SensorCalibrationFields.NonLinear: NonLinear = Convert.ToBoolean(token); break;
case DbOperations.SensorDB.SensorCalibrationFields.RemoveOffset: RemoveOffset = Convert.ToBoolean(token); break;
case DbOperations.SensorDB.SensorCalibrationFields.SerialNumber: SerialNumber = token; break;
case DbOperations.SensorDB.SensorCalibrationFields.Username: Username = token; break;
case DbOperations.SensorDB.SensorCalibrationFields.ZeroMethod: ZeroMethod = new ZeroMethod(token); break;
case DbOperations.SensorDB.SensorCalibrationFields.InitialOffset: InitialOffset = new InitialOffset(); InitialOffset.FromDbSerializeString(token); break;
case DbOperations.SensorDB.SensorCalibrationFields.CertificationDocuments: CertificationDocuments = token.Split(new[] { CultureInfo.InvariantCulture.TextInfo.ListSeparator }, StringSplitOptions.None); break;
}
}
}
public const string SEPARATOR_REPLACEMENT = "__SC__";
public SensorCalibration(SensorCalibration sc)
{
_serialNumber = sc.SerialNumber;
_username = sc.Username;
_calibrationDate = sc.CalibrationDate;
ModifyDate = sc.ModifyDate;
NonLinear = sc.NonLinear;
IsProportional = sc.IsProportional;
Records = new CalibrationRecords(sc.Records);
RemoveOffset = sc.RemoveOffset;
ZeroMethod = new ZeroMethod(sc.ZeroMethod);
InitialOffset = new InitialOffset(sc.InitialOffset);
CertificationDocuments = sc.CertificationDocuments;
}
public int CompareTo(SensorCalibration other)
{
if (null == other) { return 1; }
if (Equals(this, other)) { return 0; }
if (CalibrationDate.Date != other.CalibrationDate.Date)
return other.CalibrationDate.CompareTo(CalibrationDate);
var modifyCompare = other.ModifyDate.CompareTo(ModifyDate);
return 0 == modifyCompare ? other.CalVersion.CompareTo(CalVersion) : modifyCompare;
}
public void ReadXML(System.Xml.XmlElement root)
{
foreach (var node in root.ChildNodes)
{
if (node is System.Xml.XmlElement) { ProcessXmlElement(node as System.Xml.XmlElement); }
}
}
private void ProcessXmlElement(System.Xml.XmlElement node)
{
if (!Enum.TryParse(node.Name, out DbOperations.SensorDB.SensorCalibrationFields field)) return;
switch (field)
{
case DbOperations.SensorDB.SensorCalibrationFields.CalibrationDate: CalibrationDate = DateTime.Parse(node.InnerText, CultureInfo.InvariantCulture); break;
case DbOperations.SensorDB.SensorCalibrationFields.CalibrationRecords: Records = new CalibrationRecords(node.InnerText); break;
case DbOperations.SensorDB.SensorCalibrationFields.CertificationDocuments: CertificationDocuments = new string[0]; break;
case DbOperations.SensorDB.SensorCalibrationFields.IsProportional: IsProportional = Convert.ToBoolean(node.InnerText); break;
case DbOperations.SensorDB.SensorCalibrationFields.LocalOnly: LocalOnly = Convert.ToBoolean(node.InnerText); break;
case DbOperations.SensorDB.SensorCalibrationFields.ModifyDate: ModifyDate = DateTime.Parse(node.InnerText, CultureInfo.InvariantCulture); break;
case DbOperations.SensorDB.SensorCalibrationFields.NonLinear: NonLinear = Convert.ToBoolean(node.InnerText); break;
case DbOperations.SensorDB.SensorCalibrationFields.RemoveOffset: RemoveOffset = Convert.ToBoolean(node.InnerText); break;
case DbOperations.SensorDB.SensorCalibrationFields.SerialNumber: SerialNumber = node.InnerText; break;
case DbOperations.SensorDB.SensorCalibrationFields.Username: Username = node.InnerText; break;
case DbOperations.SensorDB.SensorCalibrationFields.ZeroMethod: ZeroMethod = new ZeroMethod(node.InnerText); break;
case DbOperations.SensorDB.SensorCalibrationFields.InitialOffset: InitialOffset = new InitialOffset(); InitialOffset.FromDbSerializeString(node.InnerText); break;
default: throw new NotSupportedException("SensorCalibration::ProcessXMLElement unsupported tag: " + field);
}
}
}
}