Files
DP44/Common/DTS.Common.Import/.svn/pristine/19/19fec8373761466340f11683e6bfca60acdd3d37.svn-base
2026-04-17 14:55:32 -04:00

392 lines
18 KiB
Plaintext

using DTS.Common.Classes.Sensors;
using DTS.Common.DAS.Concepts;
using DTS.Common.DataModel;
using DTS.Common.Enums.Sensors;
using DTS.Common.Import.Interfaces;
using DTS.Common.SharedResource.Strings;
using DTS.Common.Utilities.Logging;
using DTS.SensorDB;
using System;
using System.Globalization;
using System.Linq;
namespace DTS.Common.Import.Parsers.CSV
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Acronym")]
public class Version0CSVSensorParser : AbstractCSVParser
{
/// <summary>
/// handles the Version 0 Channel name tag
/// </summary>
/// <param name="val"></param>
/// <param name="pp"></param>
private static void HandleVersion0ChannelName(string val, ParseParameters pp)
{
pp.SensorData.Comment = val;
if (string.IsNullOrWhiteSpace(pp.SensorData.ISOChannelName))
{
pp.SensorData.ISOChannelName = val;
}
if (string.IsNullOrEmpty(pp.SensorData.UserChannelName))
{
pp.SensorData.UserChannelName = val;
}
}
public override int Version => 0;
public override void ParseVersion(CSVImportTags.Tags field, string val, ParseParameters pp)
{
var sd = (SensorData)pp.SensorData;
try
{
#region and another very long switch statement
switch (field)
{
case CSVImportTags.Tags.Axis: break;
case CSVImportTags.Tags.BRIDGE:
//FB 41817 if bridge value is type don't override it, the bridge type will have a value and it will assign it later
if (!string.IsNullOrWhiteSpace(val))
{
pp.SensorData.Bridge = val.ToLower() == "full" ? SensorConstants.BridgeType.FullBridge : SensorConstants.BridgeType.HalfBridge;
}
break;
case CSVImportTags.Tags.BridgeResistance:
{
if (!string.IsNullOrWhiteSpace(val))
{
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out var d))
{
pp.SensorData.BridgeResistance = d;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidBridgeResistance, val)); }
}
}
break;
case CSVImportTags.Tags.BypassAAFilter: pp.SensorData.ByPassFilter = val.ToLower() == "yes"; break;
case CSVImportTags.Tags.Category:
{
if (string.IsNullOrWhiteSpace(val)) { return; }
if (int.TryParse(val, NumberStyles.Any, pp.ImportCulture, out var temp))
{
pp.SensorData.SensorCategory = temp;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidCategory, val)); }
}
break;
case CSVImportTags.Tags.ChannelName:
HandleVersion0ChannelName(val, pp);
break;
case CSVImportTags.Tags.CommentField: pp.SensorData.UserValue1 = val; break;
case CSVImportTags.Tags.CustomerCode: pp.SensorData.UserValue2 = val; break;
case CSVImportTags.Tags.DatabaseReferenceNumber: break;
case CSVImportTags.Tags.DesiredRange:
{
if (string.IsNullOrWhiteSpace(val)) { return; }
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out double d))
{
pp.SensorData.RangeHigh = d;
pp.SensorData.RangeMedium = d;
pp.SensorData.RangeLow = d;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidDesiredRange, val)); }
}
break;
case CSVImportTags.Tags.Dimension: break;
case CSVImportTags.Tags.Due: break;
case CSVImportTags.Tags.DueCal: break;
case CSVImportTags.Tags.EquivalentEUShuntResistor: break;
case CSVImportTags.Tags.EU:
{
foreach (var r in pp.SensorCal.Records.Records)
{
r.EngineeringUnits = val;//FB16398: set units on all records, not just first
}
//removed dependency to unity framework
//sc.Records.Records.ForEach(record => record.EngineeringUnits = val); //FB16398: set units on all records, not just first
sd.DisplayUnit = val;
}
break;
case CSVImportTags.Tags.Exc:
{
if (string.IsNullOrWhiteSpace(val))
{
return;
}
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out var d))
{
try
{
pp.SensorData.SupportedExcitation = new[] { Test.Module.Channel.Sensor.GetExcitationVoltageEnumFromMagnitude(d) };
}
catch (Exception ex)
{
if (ex is NotSupportedException)
{
pp.Errors.Add(string.Format(StringResources.InvalidExcitation, val));
}
}
}
else { pp.Errors.Add(string.Format(StringResources.InvalidExcitation, val)); }
}
break;
case CSVImportTags.Tags.FilterClass:
{
if (string.IsNullOrWhiteSpace(val)) { return; }
if (val.Contains(CFC))
{
ParseFilterClassCFC(val, pp, sd);
}
else { ParseFilterClassInt(val, pp, sd); }
}
break;
case CSVImportTags.Tags.FullScale:
{
if (string.IsNullOrWhiteSpace(val)) { return; }
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out double d))
{
pp.SensorData.Capacity = d;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidFullScale, val)); }
}
break;
case CSVImportTags.Tags.Group1: break;
case CSVImportTags.Tags.Group2: break;
case CSVImportTags.Tags.Group3: break;
case CSVImportTags.Tags.Group4: break;
case CSVImportTags.Tags.Group5: break;
case CSVImportTags.Tags.InvertSignal: pp.SensorData.Invert = val.ToLower() == "yes"; break;
case CSVImportTags.Tags.IRTRACCExponent:
{
if (!string.IsNullOrWhiteSpace(val))
{
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out var d))
{
if (d < 1) { pp.IrtraccExponent = d; }
}
else { pp.Errors.Add(string.Format(StringResources.InvalidIRTRACCExponent, val)); }
}
else { pp.IrtraccExponent = 1; }
}
break;
case CSVImportTags.Tags.LaboratoryCode: pp.SensorData.UserValue3 = val; break;
case CSVImportTags.Tags.LastCal:
{
if (string.IsNullOrWhiteSpace(val)) { return; }
if (DateTime.TryParse(val, pp.ImportCulture, DateTimeStyles.AssumeLocal, out var dt))
{
pp.SensorCal.CalibrationDate = dt;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidLastCal, val)); }
}
break;
case CSVImportTags.Tags.Location: break;
case CSVImportTags.Tags.Manufacturer: pp.SensorData.Manufacturer = val; break;
case CSVImportTags.Tags.Model: pp.SensorData.Model = val; break;
case CSVImportTags.Tags.OffsetToleranceHigh:
{
if (string.IsNullOrWhiteSpace(val)) { return; }
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out var d))
{
pp.SensorData.OffsetToleranceHigh = d;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidOffsetToleranceHigh, val)); }
}
break;
case CSVImportTags.Tags.OffsetToleranceLow:
{
if (string.IsNullOrWhiteSpace(val)) { return; }
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out var d))
{
pp.SensorData.OffsetToleranceLow = d;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidOffsetToleranceLow, val)); }
}
break;
case CSVImportTags.Tags.OutputAtEXCFSmV: break;
case CSVImportTags.Tags.PartialISOCode: sd.ISOCode = val; break;
case CSVImportTags.Tags.Proportional:
pp.SensorCal.IsProportional = val.ToLower() == "yes";
//Since this could get get set to False if the sensor is non-linear, save it in
//case there is also a linear calibration for this sensor and set it to what is saved.
pp.SavedIsProportional = pp.SensorCal.IsProportional;
break;
case CSVImportTags.Tags.Received: break;
case CSVImportTags.Tags.RemoveOffset:
pp.SensorCal.RemoveOffset = val.ToLower() == "yes";
//Since this could get get set to False if the sensor is non-linear, save it in
//case there is also a linear calibration for this sensor and set it to what is saved.
pp.SavedRemoveOffset = pp.SensorCal.RemoveOffset;
break;
case CSVImportTags.Tags.Sensitivity:
{
if (string.IsNullOrWhiteSpace(val))
{
return;
}
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out var d))
{
//13810 Sensor ID and sensitivity are degraded to scientific notation when editing
if (val.ToLower().Contains("e"))
{
pp.Errors.Add(string.Format(StringResources.InvalidSensitivity,
pp.SensorData.SerialNumber, val));
return;
}
pp.Sensitivity = d;
//FB 41820 set sensitivity in sensor data
pp.SensorData.Calibration.Records.Records[0].Sensitivity = d;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidSensitivity, sd.SerialNumber, val)); }
}
break;
case CSVImportTags.Tags.SensorID:
//13810 Sensor ID and sensitivity are degraded to scientific notation when editing
if (!string.IsNullOrWhiteSpace(val) && val.ToLower() != "none" && !val.ToLower().Contains("e+") && !val.ToLower().Contains("e-"))
{
pp.SensorData.EID = val;
}
break;
case CSVImportTags.Tags.SensorSN:
if (string.IsNullOrEmpty(val)) { val = string.Concat(Constants.ISO_CH_ONLY_PREFIX, Guid.NewGuid().ToString()); }
if (pp.StripBackslash)
{
//14772 Sanitize sensor serials when performing TDC sensor import
var splits = val.Split('\\');
val = splits.Last();
}
pp.SensorData.SerialNumber = val;
pp.SensorData.UUID = val;
break;
case CSVImportTags.Tags.SensorType: break;
case CSVImportTags.Tags.ShuntResistorValue: break;
case CSVImportTags.Tags.SoftwareZeroEquivalentEU:
{
if (!string.IsNullOrWhiteSpace(val))
{
if (double.TryParse(val, NumberStyles.Any, pp.ImportCulture, out double d))
{
pp.OriginalOffset = d;
}
else { pp.Errors.Add(string.Format(StringResources.InvalidZeroEquivalentEU, val)); }
}
}
break;
case CSVImportTags.Tags.SoftwareZeroReference:
switch (val)// (Pre, Avg, 0mV)
{
case SensorDatabaseExport.ZM_STRING_DIAGNOSTICS: pp.ZeroType = ZeroMethodType.UsePreEventDiagnosticsZero; break;
case SensorDatabaseExport.ZM_STRING_NONE: pp.ZeroType = ZeroMethodType.None; break;
default:
pp.ZeroType = ZeroMethodType.AverageOverTime;
break;
}
break;
case CSVImportTags.Tags.Tech: pp.SensorCal.Username = val; break;
case CSVImportTags.Tags.Unknown: break;
case CSVImportTags.Tags.UseShuntCal:
sd.Shunt = val.ToLower() == "yes" ? ShuntMode.Emulation : ShuntMode.None;
break;
}
#endregion and another very long switch statement
}
catch (Exception)
{
pp.Errors.Add(string.Format(StringResources.InvalidField, field, val));
}
}
private const string CFC = "CFC";
private static void ParseFilterClassCFC(string val, ParseParameters pp, SensorData sd)
{
try
{
var idx = val.IndexOf(CFC);
if (0 > idx)
{
pp.Errors.Add(string.Format(StringResources.InvalidFilterClass, val));
return;
}
val = val.Substring(idx + CFC.Length);
val = val.Trim();
}
catch (Exception ex) { APILogger.Log(ex); }
ParseFilterClassInt(val, pp, sd);
}
private static void ParseFilterClassInt(string val, ParseParameters pp, SensorData sd)
{
try
{
if (int.TryParse(val, NumberStyles.Any, pp.ImportCulture, out var numericFilterClassValue))
{
sd.Filter = new FilterClass(FilterClass.GetFilterClassTypeFromNumericFC(numericFilterClassValue));
var fc = new FilterClass(FilterClass.GetFilterClassTypeFromNumericFC(numericFilterClassValue));
if (null != fc)
{
// http://manuscript.dts.local/f/cases/16440/CSV-Import-should-respect-IS
// 16440 - CSV Import should respect ISO Code Filter Mapping setting
if (pp.UseISOCodeFilterMapping)
{
sd.SetFilterAndFilterClassISO(fc, pp.UseZeroForUnfiltered, false);
}
else
{
sd.Filter = fc;
}
}
}
else { pp.Errors.Add(string.Format(StringResources.InvalidFilterClass, val)); }
}
catch (Exception ex)
{
APILogger.Log(ex);
pp.Errors.Add(string.Format(StringResources.InvalidFilterClass, val));
}
}
}
}