1098 lines
49 KiB
C#
1098 lines
49 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows;
|
|
using DataPROWin7.DataModel.Classes.Hardware;
|
|
using DTS.Common.Enums;
|
|
using DTS.Common.Storage;
|
|
using DTS.Common.Utilities.Logging;
|
|
using DTS.Common.ISO;
|
|
using DTS.Common.Classes.GroupTemplates;
|
|
using DTS.Common.Enums.Hardware;
|
|
using DTS.Common.Enums.Sensors;
|
|
using DTS.SensorDB;
|
|
using DTS.Common.Classes.Sensors;
|
|
using DTS.Common.DataModel;
|
|
using DTS.Common.SharedResource.Strings;
|
|
|
|
// ReSharper disable ConvertToAutoProperty
|
|
// ReSharper disable PossibleMultipleEnumeration
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
namespace DataPROWin7.DataModel
|
|
{
|
|
public class TestObject : DTS.Common.Base.BasePropertyChanged, IComparable<TestObject>
|
|
{
|
|
public enum Tags
|
|
{
|
|
SerialNumber,
|
|
SerialNumberConverted,
|
|
TestObjectType,
|
|
ParentObject,
|
|
SysBuilt,
|
|
Channels,
|
|
Hardware,
|
|
LastModifiedBy,
|
|
LastModified,
|
|
LastModifiedText,
|
|
AllTemplates,
|
|
Template,
|
|
TemplateIndex,
|
|
ChannelsDescription,
|
|
TemplateDescription,
|
|
TemplateImage,
|
|
Zones,
|
|
SelectedGlobalRangeCACOption,
|
|
ZoneNames,
|
|
CurrentZone,
|
|
CurrentZoneIndex,
|
|
ChannelVisibility,
|
|
ChannelTypesIndex
|
|
}
|
|
private bool? _isComplete = null;
|
|
public void MarkIsCompleteUnchecked()
|
|
{
|
|
_isComplete = null;
|
|
}
|
|
private readonly string _errorMessage = "";
|
|
|
|
public int CompareTo(TestObject rhs)
|
|
{
|
|
if (null == rhs) { return 1; }
|
|
return rhs == this ? 0 : string.Compare(SerialNumber, rhs.SerialNumber, StringComparison.Ordinal);
|
|
}
|
|
|
|
//http://fogbugz/fogbugz/default.asp?11910,
|
|
//I noticed channel name and channel id were alternatively being used to lookup sensors
|
|
//rather than trying to force them all to use channel name, I merely allowed it to pass in channel id as well.
|
|
public SensorData GetSensor(string channelId, string serialNumber, string alternateChannelId = null)
|
|
{
|
|
var sd = SensorsCollection.SensorsList.GetSensorBySerialNumber(serialNumber);
|
|
|
|
if (null == sd) { return null; }
|
|
sd = new SensorData(sd);
|
|
var settings = GetISOTestObject().GetSensorSettings(channelId, sd.SerialNumber);
|
|
if (null == settings || !settings.Any() && !string.IsNullOrWhiteSpace(alternateChannelId))
|
|
{
|
|
settings = GetISOTestObject().GetSensorSettings(alternateChannelId, sd.SerialNumber);
|
|
}
|
|
var isoTo = GetISOTestObject();
|
|
var channel = isoTo.GetChannel(channelId);
|
|
if (null != channel)
|
|
{
|
|
//preset the channel iso fields, these can be filter can be overwritten by to settings below
|
|
sd.TestObject = channel.Channel.Test_Object;
|
|
sd.Position = channel.Channel.Position;
|
|
sd.OriginalPosition = channel.Channel.Position;
|
|
if (channel.Channel.Default_Filter_Class != "?")
|
|
{
|
|
//If ISO says "?", then use the sensor's filter class (but still overwrite with any settings below)
|
|
sd.FilterClassIso = channel.Channel.Default_Filter_Class;
|
|
}
|
|
sd.FineLocation1 = channel.Channel.Fine_Loc_1;
|
|
sd.FineLocation2 = channel.Channel.Fine_Loc_2;
|
|
sd.FineLocation3 = channel.Channel.Fine_Loc_3;
|
|
sd.MainLocation = channel.Channel.Trans_Main_Loc;
|
|
sd.PhysicalDimension = channel.Channel.Physical_Dimension;
|
|
sd.Direction = channel.Channel.Direction;
|
|
}
|
|
if (null != settings)
|
|
{
|
|
foreach (var setting in settings)
|
|
{
|
|
switch (setting.Setting)
|
|
{
|
|
case SensorConstants.SensorSettings.CFC:
|
|
sd.FilterClassIso = setting.Value;
|
|
//FB 15574 assign both FilterClass and Filter to the same filter class
|
|
sd.FilterClass = FilterClass.GetFilterClassFromIsoCode(sd.FilterClassIso);
|
|
sd.Filter = FilterClass.GetFilterClassFromIsoCode(sd.FilterClassIso);
|
|
break;
|
|
//FB 13120 set filter class setting
|
|
case SensorConstants.SensorSettings.FilterClass:
|
|
sd.FilterClass = FilterClass.GetFilterClassFromFilterClassSetting(setting.Value);
|
|
break;
|
|
case SensorConstants.SensorSettings.Position:
|
|
sd.Position = setting.Value;
|
|
break;
|
|
case SensorConstants.SensorSettings.Polarity:
|
|
sd.Invert = setting.Value == "-";
|
|
break;
|
|
case SensorConstants.SensorSettings.Range:
|
|
sd.Capacity = double.Parse(setting.Value, CultureInfo.InvariantCulture);
|
|
break;
|
|
case SensorConstants.SensorSettings.LimitDuration:
|
|
if (!string.IsNullOrWhiteSpace(setting.Value))
|
|
{
|
|
sd.DigitalOutputLimitDuration = bool.Parse(setting.Value);
|
|
sd.LimitDuration = bool.Parse(setting.Value);
|
|
sd.LimitSquibFireDuration = bool.Parse(setting.Value);
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.Delay:
|
|
if (!string.IsNullOrWhiteSpace(setting.Value))
|
|
{
|
|
sd.DigitalOutputDelayMS = double.Parse(setting.Value, CultureInfo.InvariantCulture);
|
|
sd.DelayMS = double.Parse(setting.Value, CultureInfo.InvariantCulture);
|
|
sd.SquibFireDelayMS = double.Parse(setting.Value, CultureInfo.InvariantCulture);
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.Duration:
|
|
if (!string.IsNullOrWhiteSpace(setting.Value))
|
|
{
|
|
sd.DigitalOutputDurationMS = double.Parse(setting.Value, CultureInfo.InvariantCulture);
|
|
sd.DurationMS = double.Parse(setting.Value, CultureInfo.InvariantCulture);
|
|
sd.SquibFireDurationMS = double.Parse(setting.Value, CultureInfo.InvariantCulture);
|
|
}
|
|
break;
|
|
|
|
case SensorConstants.SensorSettings.OutputMode:
|
|
if (!string.IsNullOrWhiteSpace(setting.Value))
|
|
{
|
|
if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture,
|
|
out int iValue))
|
|
{
|
|
sd.DigitalOutputMode = (DigitalOutputModes)iValue;
|
|
}
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.DigitalOutDelay:
|
|
{
|
|
if (double.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var d)) { sd.DigitalOutputDelayMS = d; }
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.DigitalOutDuration:
|
|
{
|
|
if (double.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var d)) { sd.DigitalOutputDurationMS = d; }
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.DigitalOutLimitDuration:
|
|
{
|
|
if (bool.TryParse(setting.Value, out var b)) { sd.DigitalOutputLimitDuration = b; }
|
|
}
|
|
break;
|
|
|
|
case SensorConstants.SensorSettings.SQMode:
|
|
if (!string.IsNullOrWhiteSpace(setting.Value))
|
|
{
|
|
if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture,
|
|
out var iValue))
|
|
{
|
|
sd.SquibFireMode = (SquibFireMode)iValue;
|
|
}
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.SquibDelay:
|
|
{
|
|
if (double.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var d))
|
|
{
|
|
sd.SquibFireDelayMS = d;
|
|
}
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.SquibDuration:
|
|
{
|
|
if (double.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var d))
|
|
{
|
|
sd.SquibFireDurationMS = d;
|
|
}
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.SquibLimitDuration:
|
|
{
|
|
if (bool.TryParse(setting.Value, out var b)) { sd.LimitSquibFireDuration = b; }
|
|
}
|
|
break;
|
|
|
|
case SensorConstants.SensorSettings.DIMode:
|
|
if (!string.IsNullOrWhiteSpace(setting.Value))
|
|
{
|
|
if (int.TryParse(setting.Value, NumberStyles.Any, CultureInfo.InvariantCulture,
|
|
out var iValue))
|
|
{
|
|
sd.InputMode = (DigitalInputModes)iValue;
|
|
}
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.DefaultValue:
|
|
if (!string.IsNullOrWhiteSpace(setting.Value))
|
|
{
|
|
if (double.TryParse(setting.Value, out var defaultValue))
|
|
{
|
|
sd.ScaleMultiplier.DefaultValue = defaultValue;
|
|
}
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.ActiveValue:
|
|
if (!string.IsNullOrWhiteSpace(setting.Value))
|
|
{
|
|
if (double.TryParse(setting.Value, out var activeValue))
|
|
{
|
|
sd.ScaleMultiplier.ActiveValue = activeValue;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException();
|
|
}
|
|
}
|
|
}
|
|
if (sd.FilterClassIso == "?")
|
|
{
|
|
sd.FilterClassIso = "P"; // "Prefiltered > CFC 1000" (Unfiltered)
|
|
}
|
|
return sd;
|
|
}
|
|
|
|
public void SetSensor(string channelName, SensorData sensor)
|
|
{
|
|
var settings = new List<DTS.Common.ISO.TestObject.SensorSetting>();
|
|
var fields = Enum.GetValues(typeof(SensorConstants.SensorSettings)).Cast<SensorConstants.SensorSettings>().ToArray();
|
|
foreach (var field in fields)
|
|
{
|
|
var value = "";
|
|
switch (field)
|
|
{
|
|
case SensorConstants.SensorSettings.CFC: value = sensor.FilterClassIso; break;
|
|
//FB 13120 set filter class setting
|
|
case SensorConstants.SensorSettings.FilterClass: value = $"{sensor.FilterClass.FClass},{sensor.FilterClass.Frequency}"; break;
|
|
case SensorConstants.SensorSettings.Position: value = sensor.Position; break;
|
|
case SensorConstants.SensorSettings.Polarity: value = sensor.Invert ? "-" : "+"; break;
|
|
case SensorConstants.SensorSettings.Range: value = sensor.Capacity.ToString(CultureInfo.InvariantCulture); break;
|
|
case SensorConstants.SensorSettings.Duration:
|
|
value = sensor.DurationMS.ToString(CultureInfo.InvariantCulture);
|
|
if (sensor.IsSquib())
|
|
{
|
|
value = sensor.SquibFireDurationMS.ToString(CultureInfo.InvariantCulture);
|
|
}
|
|
else if (sensor.IsDigitalOutput())
|
|
{
|
|
value = sensor.DigitalOutputDurationMS.ToString(CultureInfo.InvariantCulture);
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.Delay:
|
|
value = sensor.DelayMS.ToString(CultureInfo.InvariantCulture);
|
|
if (sensor.IsSquib())
|
|
{
|
|
value = sensor.SquibFireDelayMS.ToString(CultureInfo.InvariantCulture);
|
|
}
|
|
else if (sensor.IsDigitalOutput())
|
|
{
|
|
value = sensor.DigitalOutputDelayMS.ToString(CultureInfo.InvariantCulture);
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.LimitDuration:
|
|
value = sensor.LimitDuration.ToString(CultureInfo.InvariantCulture);
|
|
if (sensor.IsSquib())
|
|
{
|
|
value = sensor.LimitSquibFireDuration.ToString(CultureInfo.InvariantCulture);
|
|
}
|
|
else if (sensor.IsDigitalOutput())
|
|
{
|
|
value = sensor.DigitalOutputLimitDuration.ToString(CultureInfo.InvariantCulture);
|
|
}
|
|
break;
|
|
case SensorConstants.SensorSettings.OutputMode: value = ((int)sensor.DigitalOutputMode).ToString(CultureInfo.InvariantCulture); break;
|
|
case SensorConstants.SensorSettings.SQMode: value = ((int)sensor.SquibFireMode).ToString(CultureInfo.InvariantCulture); break;
|
|
case SensorConstants.SensorSettings.DIMode: value = ((int)sensor.InputMode).ToString(CultureInfo.InvariantCulture); break;
|
|
case SensorConstants.SensorSettings.DefaultValue: value = sensor.ScaleMultiplier.DefaultValue.ToString(CultureInfo.InvariantCulture); break;
|
|
case SensorConstants.SensorSettings.ActiveValue: value = sensor.ScaleMultiplier.ActiveValue.ToString(CultureInfo.InvariantCulture); break;
|
|
default: continue; // If we don't know about a setting we shouldn't overwrite it with blank.
|
|
}
|
|
settings.Add(new DTS.Common.ISO.TestObject.SensorSetting(field, value, channelName, sensor.SerialNumber));
|
|
}
|
|
|
|
foreach (var setting in settings)
|
|
{
|
|
GetISOTestObject().SetSensorSetting(channelName, sensor.SerialNumber, setting);
|
|
}
|
|
}
|
|
|
|
public TestObject()
|
|
{
|
|
//PopulateTemplates();
|
|
_isoTestObject = new DTS.Common.ISO.TestObject();
|
|
Template = new TestObjectTemplate();
|
|
ParentObject = "";
|
|
SysBuilt = false;
|
|
}
|
|
|
|
public DASHardware[] Hardware
|
|
{
|
|
get
|
|
{
|
|
var hardware = new List<DASHardware>(_hardware.Values.ToArray());
|
|
hardware.Sort();
|
|
return hardware.ToArray();
|
|
}
|
|
}
|
|
|
|
public void Initialize(TestObject copy)
|
|
{
|
|
//PopulateTemplates();
|
|
var db = ApplicationProperties.IsoDb;
|
|
_isoTestObject = new DTS.Common.ISO.TestObject(copy.GetISOTestObject(), ref db);
|
|
SerialNumber = copy.SerialNumber;
|
|
if (null != copy.Template)
|
|
{
|
|
SetTemplateDontResetISOObject(new TestObjectTemplate(copy.Template, ref db));
|
|
}
|
|
copy.GetISOTestObject();
|
|
GetISOTestObject();
|
|
|
|
var hardware = copy.Hardware.Select(das => new DASHardware(das, null)).ToList();
|
|
foreach (var h in hardware)
|
|
{
|
|
_hardware.Add(h.SerialNumber, h);
|
|
}
|
|
ParentObject = copy.ParentObject;
|
|
SysBuilt = copy.SysBuilt;
|
|
if (SysBuilt)
|
|
{
|
|
_isoTestObject.SerialNumberConverted = copy.SerialNumberConverted;
|
|
SerialNumberConverted = copy.SerialNumberConverted;
|
|
}
|
|
PurgeChannels();
|
|
}
|
|
|
|
// 11287 Out of memory exception when importing large CSV Test Setup files
|
|
// cleans up any channels in the template which aren't required
|
|
private void PurgeChannels()
|
|
{
|
|
var channels = Template.TemplateAllChannels.ToList();
|
|
for (var i = channels.Count - 1; i >= 0; i--)
|
|
{
|
|
if (!channels[i].Required)
|
|
{
|
|
channels.RemoveAt(i);
|
|
}
|
|
}
|
|
Template.TemplateAllChannels = channels.ToArray();
|
|
}
|
|
public TestObject(TestObject copy)
|
|
{
|
|
Initialize(copy);
|
|
}
|
|
|
|
public void SetAllSensors()
|
|
{
|
|
var to = GetISOTestObject();
|
|
foreach (var ch in to.AllChannels)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(ch.SensorSerialNumber) || !ch.Required) continue;
|
|
var sd = GetSensor(ch.Name, ch.SensorSerialNumber, ch.GetId());
|
|
if (null != sd)
|
|
{
|
|
SetSensor(ch.Name, sd);
|
|
}
|
|
}
|
|
}
|
|
|
|
public SensorData[] GetSensors(SensorsCollection list)
|
|
{
|
|
var to = GetISOTestObject();
|
|
|
|
return (from channel in to.AllChannels where !string.IsNullOrEmpty(channel.SensorSerialNumber) select GetSensor(channel.Name, channel.SensorSerialNumber, channel.GetId()) into s where null != s select s).ToArray();
|
|
}
|
|
|
|
public string TemplateDescription => null == _template ? "N/A" : _template.TemplateDescription;
|
|
|
|
private string _serialNumber = string.Empty;
|
|
|
|
public string SerialNumber
|
|
{
|
|
get => _serialNumber;
|
|
set
|
|
{
|
|
SetProperty(ref _serialNumber, value, Tags.SerialNumber.ToString());
|
|
GetISOTestObject().SerialNumber = value;
|
|
}
|
|
}
|
|
|
|
public string SerialNumberOrOriginalSerialNumber
|
|
{
|
|
get
|
|
{
|
|
if (GetISOTestObject().Embedded)
|
|
{
|
|
return GetISOTestObject().OriginalSerialNumber;
|
|
}
|
|
return string.IsNullOrWhiteSpace(SerialNumberConverted) ? SerialNumber : SerialNumberConverted;
|
|
}
|
|
}
|
|
|
|
private string _serialNumberConverted = string.Empty;
|
|
|
|
public string SerialNumberConverted
|
|
{
|
|
get => _serialNumberConverted;
|
|
set => SetProperty(ref _serialNumberConverted, value, Tags.SerialNumberConverted.ToString());
|
|
}
|
|
|
|
public string DisplaySerialNumber
|
|
{
|
|
get
|
|
{
|
|
if (string.IsNullOrWhiteSpace(SerialNumberConverted) && !SysBuilt)
|
|
{
|
|
return SerialNumberOrOriginalSerialNumber;
|
|
}
|
|
return SerialNumberConverted;
|
|
}
|
|
set
|
|
{
|
|
//We assume that this is an Added Group being renamed
|
|
SerialNumber = TestSetupName + "_" + value;
|
|
SerialNumberConverted = value;
|
|
GetISOTestObject().OriginalSerialNumber = SerialNumber;
|
|
Template.OriginalTemplateName = SerialNumber + "_Template";
|
|
GetISOTestObject().OriginalTemplate = Template.OriginalTemplateName;
|
|
}
|
|
}
|
|
|
|
public Visibility StaticGroupTextBlockVisibility => SysBuilt ? Visibility.Hidden : Visibility.Visible;
|
|
|
|
public Visibility AddedGroupTextBoxVisibility => SysBuilt ? Visibility.Visible : Visibility.Hidden;
|
|
|
|
public string TestSetupName { get; set; } = string.Empty;
|
|
|
|
private string _testObjectType = "?";
|
|
|
|
public string TestObjectType
|
|
{
|
|
get => _testObjectType;
|
|
set => SetProperty(ref _testObjectType, value, Tags.TestObjectType.ToString());
|
|
}
|
|
|
|
private string _parentObject = "";
|
|
|
|
public string ParentObject
|
|
{
|
|
get => _parentObject;
|
|
set
|
|
{
|
|
MarkIsCompleteUnchecked();
|
|
SetProperty(ref _parentObject, value, Tags.ParentObject.ToString());
|
|
GetISOTestObject().ParentObject = value;
|
|
}
|
|
}
|
|
|
|
private bool _sysBuilt;
|
|
|
|
public bool SysBuilt
|
|
{
|
|
get => _sysBuilt;
|
|
set => SetProperty(ref _sysBuilt, value, Tags.SysBuilt.ToString());
|
|
}
|
|
|
|
|
|
|
|
private Dictionary<string, DASHardware> _hardware = new Dictionary<string, DASHardware>();
|
|
|
|
public bool ContainsHardware(DASHardware h)
|
|
{
|
|
return _hardware.ContainsKey(h.SerialNumber);
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// this call is intended to be available to test template to update the hardware for the group in memory
|
|
/// it is not intended to have that hardware stored in the db currently
|
|
/// </summary>
|
|
/// <param name="hardware"></param>
|
|
public void SetHardware(DASHardware[] hardware)
|
|
{
|
|
_hardware.Clear();
|
|
var hids = new List<string>();
|
|
foreach (var h in hardware)
|
|
{
|
|
_hardware[h.SerialNumber] = h;
|
|
if (!hids.Contains(h.SerialNumber))
|
|
{
|
|
hids.Add(h.SerialNumber);
|
|
}
|
|
}
|
|
GetISOTestObject().HardwareIds = hids.ToArray();
|
|
}
|
|
|
|
public void AddHardware(DASHardware hardware)
|
|
{
|
|
//just making sure we have a copy and not the original hardware record
|
|
hardware = new DASHardware(hardware.GetHardware());
|
|
MarkIsCompleteUnchecked();
|
|
var toAdd = hardware;
|
|
if (hardware.IsDummy())
|
|
{
|
|
var key = hardware.SerialNumber;
|
|
if (_hardware.ContainsKey(key))
|
|
{
|
|
int current = 1;
|
|
while (_hardware.ContainsKey(key))
|
|
{
|
|
current++;
|
|
key = $"{hardware.SerialNumber}({current:00})";
|
|
}
|
|
toAdd = new DASHardware(hardware.GetHardware());
|
|
toAdd.SerialNumber = key;
|
|
}
|
|
else
|
|
{
|
|
toAdd = new DASHardware(hardware.GetHardware());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
toAdd = new DASHardware(hardware.GetHardware());
|
|
}
|
|
if (_hardware.ContainsKey(toAdd.SerialNumber))
|
|
{
|
|
return;
|
|
}
|
|
_hardware.Add(toAdd.SerialNumber, toAdd);
|
|
OnPropertyChanged(Tags.Hardware.ToString());
|
|
_isoTestObject.HardwareIds = Hardware.Select(h => h.GetHardware().GetId()).ToArray();
|
|
}
|
|
|
|
public void Commit()
|
|
{
|
|
MarkIsCompleteUnchecked();
|
|
SetAllSensors();
|
|
}
|
|
|
|
public DTS.Common.ISO.TestObject GetISOTestObject()
|
|
{
|
|
return _isoTestObject;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// to be called in non iso mode, will modify the test object, creating channels foreach of the sensors
|
|
/// when the user presses save, we in turn need to create custom channels and update the template for the object accordingly
|
|
/// and assigns the hardwarechannel as necessary
|
|
/// </summary>
|
|
/// <param name="sensors"></param>
|
|
/// <param name="insertAtRow">row to insert at (-1 for append to end)</param>
|
|
public void CreateMoreChannels(SensorData[] sensors, int insertAtRow, HardwareChannel[] hardwareChannels, string[] displayNames = null)
|
|
{
|
|
var sensorToChannelName = new Dictionary<SensorData, string>();
|
|
|
|
var currentInsertPoint = insertAtRow;
|
|
var isoobj = GetISOTestObject();
|
|
var existingChannels = new List<TestObjectChannel>();
|
|
if (_template == null)
|
|
{
|
|
_template = new TestObjectTemplate();
|
|
}
|
|
var isoTemplate = _template.ToISOTestObjectTemplate();
|
|
|
|
var existingNames = new Dictionary<string, bool>();
|
|
foreach (var c in isoobj.AllChannels)
|
|
{
|
|
if (c.Channel.Id < 1)
|
|
{
|
|
c.Channel.SetId(-1 * (existingChannels.Count + 1));
|
|
}
|
|
existingChannels.Add(c);
|
|
existingNames[c.Name] = true;
|
|
}
|
|
|
|
for (var i = 0; i < sensors.Length; i++)
|
|
{
|
|
var s = sensors[i];
|
|
var hw = hardwareChannels[i];
|
|
|
|
if (s.ToString().Contains(TestObjectTemplateChannel.SEPARATOR))
|
|
{
|
|
APILogger.Log("Skipped sensor [", s.ToString(), "] as it contains invalid characters for a non iso channel");
|
|
continue;
|
|
}
|
|
|
|
|
|
var mme = new MMEPossibleChannels(-1 * (1 + existingChannels.Count), "", "?", "?", "????", "??", "??", "??", "??", "?", s.FilterClassIso, "", "", 1, DateTime.Now, "NON ISO Channel", false, "", "", DateTime.Now, "Created", "", (int)MMEPossibleChannels.MMEChannelTypes.SQL);
|
|
|
|
var totc = new TestObjectTemplateChannel(mme) { Required = true };
|
|
|
|
// FB5960 New channels "Channel Name" in Non-ISO Group editor should only include Channel Name
|
|
// now also checks for duplicates
|
|
var channelName = s.ToDisplayString();
|
|
if (null != displayNames && i < displayNames.Length)
|
|
{
|
|
channelName = displayNames[i];
|
|
}
|
|
var idx = 2;
|
|
while (existingNames.ContainsKey(channelName))
|
|
{
|
|
channelName = $"{s.ToDisplayString()} {idx}";
|
|
idx++;
|
|
}
|
|
sensorToChannelName[s] = channelName;
|
|
existingNames[channelName] = true;
|
|
totc.SetDisplayText("", "", channelName);
|
|
if (SensorConstants.IsTestSpecificDigitalOut(s.SerialNumber))
|
|
{
|
|
totc.NameOfTheChannel = StringResources.SensorTableControl_DigitalOutputSetting;
|
|
}
|
|
var toc = new TestObjectChannel(totc, isoobj, /*ref db,*/ isoTemplate) { Required = true };
|
|
|
|
if (null != hw)
|
|
{
|
|
toc.HardwareId = hw.GetId();
|
|
}
|
|
|
|
toc.SensorSerialNumber = s.SerialNumber;
|
|
if (-1 == currentInsertPoint)
|
|
{
|
|
existingChannels.Add(toc);
|
|
}
|
|
else
|
|
{
|
|
existingChannels.Insert(insertAtRow, toc);
|
|
insertAtRow++;
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < existingChannels.Count; i++)
|
|
{
|
|
existingChannels[i].DisplayOrder = i;
|
|
existingChannels[i].ChannelIdx = i;
|
|
}
|
|
isoobj.AllChannels = existingChannels.ToArray();
|
|
using (var e = sensorToChannelName.GetEnumerator())
|
|
{
|
|
while (e.MoveNext())
|
|
{
|
|
SetSensor(e.Current.Value, e.Current.Key);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class CustomSort : IComparer<TestObjectChannel>
|
|
{
|
|
public int Compare(TestObjectChannel left, TestObjectChannel right)
|
|
{
|
|
if (left == right)
|
|
{
|
|
return 0;
|
|
}
|
|
if (null == left)
|
|
{
|
|
return 1;
|
|
}
|
|
if (null == right)
|
|
{
|
|
return -1;
|
|
}
|
|
if (left.Required)
|
|
{
|
|
if (right.Required)
|
|
{
|
|
return 0 == left.ChannelIdx.CompareTo(right.ChannelIdx) ? left.DisplayOrder.CompareTo(right.DisplayOrder) : left.ChannelIdx.CompareTo(right.ChannelIdx);
|
|
}
|
|
return -1;
|
|
}
|
|
if (right.Required)
|
|
{
|
|
return 1;
|
|
}
|
|
{
|
|
return 0 == left.ChannelIdx.CompareTo(right.ChannelIdx) ? left.DisplayOrder.CompareTo(right.DisplayOrder) : left.ChannelIdx.CompareTo(right.ChannelIdx);
|
|
}
|
|
}
|
|
}
|
|
|
|
private string _lastModifiedBy = "N/A";
|
|
|
|
public string LastModifiedBy
|
|
{
|
|
get => _lastModifiedBy;
|
|
set => SetProperty(ref _lastModifiedBy, value, Tags.LastModifiedBy.ToString());
|
|
}
|
|
|
|
private DateTime _lastModified = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
|
|
public DateTime LastModified
|
|
{
|
|
get => _lastModified;
|
|
set => SetProperty(ref _lastModified, value, Tags.LastModified.ToString());
|
|
}
|
|
public string LastModifiedText => _lastModified.Year < 1900 ? "N/A" : $"{_lastModified.ToLongDateString()} {_lastModified.ToShortTimeString()}";
|
|
|
|
public void SetLastModified(DateTime time)
|
|
{
|
|
_lastModified = time;
|
|
OnPropertyChanged(Tags.LastModifiedText.ToString());
|
|
}
|
|
|
|
public string ChannelsDescription
|
|
{
|
|
get
|
|
{
|
|
if (null == _template)
|
|
{
|
|
return "N/A";
|
|
}
|
|
var requiredChannels = 0;
|
|
var reqs = (from c in _template.TemplateAllChannels where c.Required select c);
|
|
requiredChannels = reqs.Count();
|
|
|
|
return string.Format(StringResources.TestObject_ChannelsDescription, _template.TemplateAllChannels.Length, requiredChannels);
|
|
}
|
|
}
|
|
|
|
private TestObjectTemplate _template = null;
|
|
|
|
public TestObjectTemplate Template
|
|
{
|
|
get => _template;
|
|
set
|
|
{
|
|
if (value == _template)
|
|
{
|
|
return;
|
|
}
|
|
if (null == value)
|
|
{
|
|
_template = null;
|
|
return;
|
|
}
|
|
if (GetISOTestObject().Template != value.TemplateName)
|
|
{
|
|
var db = ApplicationProperties.IsoDb;
|
|
GetISOTestObject().SetTemplate(value.TemplateName, ref db);
|
|
}
|
|
SetProperty(ref _template, value, Tags.Template.ToString());
|
|
OnPropertyChanged(Tags.TemplateIndex.ToString());
|
|
OnPropertyChanged(Tags.ChannelsDescription.ToString());
|
|
OnPropertyChanged(Tags.LastModifiedText.ToString());
|
|
OnPropertyChanged(Tags.TemplateDescription.ToString());
|
|
OnPropertyChanged(Tags.TemplateImage.ToString());
|
|
OnPropertyChanged(Tags.Zones.ToString());
|
|
OnPropertyChanged(Tags.SelectedGlobalRangeCACOption.ToString());
|
|
}
|
|
}
|
|
|
|
public void SetTemplateDontResetISOObject(TestObjectTemplate value)
|
|
{
|
|
if (value == _template)
|
|
{
|
|
return;
|
|
}
|
|
if (null == value)
|
|
{
|
|
_template = null;
|
|
return;
|
|
}
|
|
try
|
|
{
|
|
_isoTestObject?.SetTemplateOnly(value.TemplateName);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
APILogger.Log(ex);
|
|
}
|
|
|
|
var db = ApplicationProperties.IsoDb;
|
|
_template = null;
|
|
SetProperty(ref _template, new TestObjectTemplate(value, ref db), Tags.Template.ToString());
|
|
OnPropertyChanged(Tags.TemplateIndex.ToString());
|
|
OnPropertyChanged(Tags.ChannelsDescription.ToString());
|
|
OnPropertyChanged(Tags.LastModifiedText.ToString());
|
|
OnPropertyChanged(Tags.TemplateDescription.ToString());
|
|
OnPropertyChanged(Tags.TemplateImage.ToString());
|
|
OnPropertyChanged(Tags.Zones.ToString());
|
|
OnPropertyChanged(Tags.SelectedGlobalRangeCACOption.ToString());
|
|
}
|
|
|
|
public static DTS.Common.ISO.TestObject ReadXML(System.Xml.XmlElement node, Dictionary<string, DTS.Common.ISO.TestObjectTemplate> templatelookup,
|
|
List<SensorCalibration> calibrations, List<SensorData> sensors)
|
|
{
|
|
var testobject = new DTS.Common.ISO.TestObject();
|
|
|
|
foreach (var child in node.ChildNodes)
|
|
{
|
|
if (child is System.Xml.XmlElement)
|
|
{
|
|
ProcessXMLElement(child as System.Xml.XmlElement, ref testobject, templatelookup, calibrations, sensors);
|
|
}
|
|
}
|
|
|
|
return testobject;
|
|
}
|
|
|
|
private static void ProcessXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObject testObject, Dictionary<string, DTS.Common.ISO.TestObjectTemplate> templatelookup,
|
|
List<SensorCalibration> calibrations, List<SensorData> sensors)
|
|
{
|
|
if (Enum.TryParse(node.Name, out DbOperations.TestSetups.TestObjectsFields field))
|
|
{
|
|
switch (field)
|
|
{
|
|
case DbOperations.TestSetups.TestObjectsFields.LastModified: testObject.LastModified = DateTime.Parse(node.InnerText, CultureInfo.InvariantCulture); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.LastModifiedBy: testObject.LastModifiedBy = node.InnerText; break;
|
|
case DbOperations.TestSetups.TestObjectsFields.LocalOnly: testObject.LocalOnly = Convert.ToBoolean(node.InnerText); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.ParentObject: testObject.ParentObject = node.InnerText; break;
|
|
case DbOperations.TestSetups.TestObjectsFields.SerialNumber: testObject.SerialNumber = node.InnerText.Trim(); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.SysBuilt: testObject.SysBuilt = Convert.ToBoolean(node.InnerText); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.Embedded: testObject.Embedded = Convert.ToBoolean(node.InnerText); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.OriginalSerialNumber: testObject.OriginalSerialNumber = node.InnerText; break;
|
|
case DbOperations.TestSetups.TestObjectsFields.OriginalTemplate: testObject.OriginalTemplate = node.InnerText; break;
|
|
case DbOperations.TestSetups.TestObjectsFields.Template:
|
|
{
|
|
if (templatelookup.ContainsKey(node.InnerText.Trim()))
|
|
{
|
|
testObject.SetTemplate(templatelookup[node.InnerText.Trim()] /*, ref isodb*/);
|
|
}
|
|
else
|
|
{
|
|
var db = ApplicationProperties.IsoDb;
|
|
var template = DTS.Common.ISO.TestObjectTemplate.GetTemplate(ref db, node.InnerText.Trim());
|
|
templatelookup[node.InnerText.Trim()] = template;
|
|
testObject.SetTemplate(template);
|
|
}
|
|
}
|
|
break;
|
|
default: throw new NotSupportedException("TestObject::ProcessXMLElement unsupported field: " + field.ToString());
|
|
}
|
|
}
|
|
else if (node.Name == "HardwareList")
|
|
{
|
|
foreach (var child in node.ChildNodes)
|
|
{
|
|
if (child is System.Xml.XmlElement)
|
|
{
|
|
ProcessHardwareXMLElement(child as System.Xml.XmlElement, ref testObject);
|
|
}
|
|
}
|
|
}
|
|
else if (node.Name == "Sensors")
|
|
{
|
|
foreach (var child in node.ChildNodes)
|
|
{
|
|
if (child is System.Xml.XmlElement)
|
|
{
|
|
ProcessSensorXMLElement(child as System.Xml.XmlElement, ref testObject);
|
|
}
|
|
}
|
|
}
|
|
else if (node.Name == "ChannelSettings")
|
|
{
|
|
foreach (var child in node.ChildNodes)
|
|
{
|
|
ProcessChannelXMLElement(child as System.Xml.XmlElement, ref testObject, calibrations, sensors);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void ProcessHardwareXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObject testobject)
|
|
{
|
|
var hid = node.GetAttribute("Id");
|
|
node.GetAttribute("LocalOnly"); //note needed?
|
|
var hids = new List<string>(testobject.HardwareIds) { hid };
|
|
testobject.HardwareIds = hids.ToArray();
|
|
}
|
|
|
|
private static void ProcessSensorXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObject testobject)
|
|
{
|
|
//<Sensor ChId="D1 HIII 50_0_1" SId="A088118" HId="" LocalOnly="False" />
|
|
var chId = node.GetAttribute("ChId").Trim();
|
|
var sId = node.GetAttribute("SId");
|
|
var hId = node.GetAttribute("HId");
|
|
|
|
node.GetAttribute("LocalOnly");
|
|
var ch = from c in testobject.AllChannels where c.GetId() == chId select c;
|
|
if (!ch.Any()) return;
|
|
ch.First().SensorSerialNumber = sId;
|
|
ch.First().HardwareId = hId;
|
|
}
|
|
|
|
private static void ProcessChannelXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObject testobject,
|
|
List<SensorCalibration> calibrations, List<SensorData> sensors)
|
|
{
|
|
var chId = node.GetAttribute("ChId").Trim();
|
|
var sId = node.GetAttribute("SId");
|
|
var setting = node.GetAttribute("Setting");
|
|
|
|
//18861 When migrating from pre-2.0 add these settings
|
|
var settingsDict = new Dictionary<string, string>();
|
|
var zeroMethodString = SensorConstants.DefaultZeroMethodType.ToString();
|
|
var zeroMethodStartString = SensorConstants.DefaultZeroMethodStart.ToString();
|
|
var zeroMethodEndString = SensorConstants.DefaultZeroMethodEnd.ToString();
|
|
var userValue1String = string.Empty;
|
|
var userValue2String = string.Empty;
|
|
var userValue3String = string.Empty;
|
|
var initialOffset = new InitialOffset();
|
|
var initialOffsetString = $"{initialOffset.Form},{initialOffset.EU},{initialOffset.MV}";
|
|
SensorCalibration sensorCalibration = calibrations.LastOrDefault(calibration => calibration.SerialNumber == sId);
|
|
SensorData sensor = sensors.Find(s => s.SerialNumber == sId);
|
|
|
|
if (sensorCalibration != null)
|
|
{
|
|
zeroMethodString = sensorCalibration.ZeroMethods.Methods.ToList().LastOrDefault().Method.ToString();
|
|
zeroMethodStartString = sensorCalibration.ZeroMethods.Methods.ToList().LastOrDefault().Start.ToString();
|
|
zeroMethodEndString = sensorCalibration.ZeroMethods.Methods.ToList().LastOrDefault().End.ToString();
|
|
|
|
userValue1String = sensor.UserValue1;
|
|
userValue2String = sensor.UserValue2;
|
|
userValue3String = sensor.UserValue3;
|
|
|
|
initialOffset = sensorCalibration.InitialOffsets.Offsets.ToList().LastOrDefault();
|
|
initialOffsetString = $"{initialOffset.Form},{initialOffset.EU},{initialOffset.MV}";
|
|
}
|
|
settingsDict[SensorConstants.SensorSettings.ZeroMethod.ToString()] = zeroMethodString;
|
|
settingsDict[SensorConstants.SensorSettings.ZeroMethodStart.ToString()] = zeroMethodStartString;
|
|
settingsDict[SensorConstants.SensorSettings.ZeroMethodEnd.ToString()] = zeroMethodEndString;
|
|
settingsDict[SensorConstants.SensorSettings.UserValue1.ToString()] = userValue1String;
|
|
settingsDict[SensorConstants.SensorSettings.UserValue2.ToString()] = userValue2String;
|
|
settingsDict[SensorConstants.SensorSettings.UserValue3.ToString()] = userValue3String;
|
|
settingsDict[SensorConstants.SensorSettings.InitialOffset.ToString()] = initialOffsetString;
|
|
|
|
var allsettings = DTS.Common.ISO.TestObject.GetSettingsFromString(setting, sId, chId);
|
|
foreach (var s in allsettings)
|
|
{
|
|
testobject.SetSensorSetting(chId, sId, s);
|
|
}
|
|
}
|
|
|
|
public void WriteXML(ref System.Xml.XmlWriter writer)
|
|
{
|
|
writer.WriteStartElement("TestObject");
|
|
|
|
var isoTestObject = GetISOTestObject();
|
|
|
|
var fields = Enum.GetValues(typeof(DbOperations.TestSetups.TestObjectsFields)).Cast<DbOperations.TestSetups.TestObjectsFields>().ToArray();
|
|
|
|
foreach (var f in fields)
|
|
{
|
|
writer.WriteStartElement(f.ToString());
|
|
switch (f)
|
|
{
|
|
case DbOperations.TestSetups.TestObjectsFields.LastModified: writer.WriteString(isoTestObject.LastModified.ToString(CultureInfo.InvariantCulture)); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.LastModifiedBy: writer.WriteString(isoTestObject.LastModifiedBy); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.LocalOnly: writer.WriteString(isoTestObject.LocalOnly.ToString()); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.OriginalSerialNumber: writer.WriteString(isoTestObject.OriginalSerialNumber); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.OriginalTemplate: writer.WriteString(isoTestObject.OriginalTemplate); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.Embedded: writer.WriteString(isoTestObject.Embedded.ToString(CultureInfo.InvariantCulture)); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.ParentObject: writer.WriteString(ParentObject ?? ""); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.SerialNumber: writer.WriteString(SerialNumber.Trim()); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.SysBuilt: writer.WriteString(SysBuilt.ToString()); break;
|
|
case DbOperations.TestSetups.TestObjectsFields.Template: writer.WriteString((null != Template) ? Template.TemplateName.Trim() : ""); break;
|
|
default: throw new NotSupportedException("TestObject::WriteXML unsupported field: " + f.ToString());
|
|
}
|
|
writer.WriteEndElement(); //f.ToString()
|
|
}
|
|
|
|
writer.WriteStartElement("HardwareList");
|
|
foreach (var h in Hardware)
|
|
{
|
|
var isoh = h.GetHardware();
|
|
writer.WriteStartElement("Hardware");
|
|
|
|
writer.WriteAttributeString("Id", isoh.GetId());
|
|
writer.WriteAttributeString("LocalOnly", h.LocalOnly.ToString());
|
|
writer.WriteEndElement();
|
|
}
|
|
writer.WriteEndElement(); //hardwarelist
|
|
|
|
writer.WriteStartElement("Sensors");
|
|
foreach (var ch in isoTestObject.AllChannels)
|
|
{
|
|
if (!ch.Required || string.IsNullOrEmpty(ch.SensorSerialNumber)) continue;
|
|
writer.WriteStartElement("Sensor");
|
|
writer.WriteAttributeString("ChId", ch.GetId().Trim());
|
|
writer.WriteAttributeString("SId", ch.SensorSerialNumber);
|
|
writer.WriteAttributeString("HId", ch.HardwareId);
|
|
writer.WriteAttributeString("LocalOnly", ch.LocalOnly.ToString());
|
|
writer.WriteEndElement();
|
|
}
|
|
writer.WriteEndElement();
|
|
|
|
writer.WriteStartElement("ChannelSettings");
|
|
foreach (var ch in isoTestObject.AllChannels)
|
|
{
|
|
if (!ch.Required || string.IsNullOrWhiteSpace(ch.SensorSerialNumber)) continue;
|
|
var settings = isoTestObject.GetSensorSettings(ch.Name, ch.SensorSerialNumber);
|
|
if (null == settings || settings.Length <= 0) continue;
|
|
writer.WriteStartElement("ChannelSetting");
|
|
writer.WriteAttributeString("ChId", ch.GetId());
|
|
writer.WriteAttributeString("SId", ch.SensorSerialNumber);
|
|
writer.WriteAttributeString("Setting", isoTestObject.GetSerializedSetting(settings));
|
|
writer.WriteEndElement();
|
|
}
|
|
|
|
writer.WriteEndElement();
|
|
|
|
writer.WriteEndElement(); //testobject
|
|
}
|
|
|
|
public string TemplateType => null == Template ? "" : Template.TestObjectType;
|
|
|
|
public bool LocalOnly { get; } = false;
|
|
|
|
private DTS.Common.ISO.TestObject _isoTestObject = null;
|
|
|
|
public TestObject(DTS.Common.ISO.TestObject to, bool sysBuilt, TestObjectTemplate template, Dictionary<string, DASHardware> includedHardware)
|
|
{
|
|
var db = ApplicationProperties.IsoDb;
|
|
_isoTestObject = new DTS.Common.ISO.TestObject(to, ref db);
|
|
SerialNumber = to.SerialNumber;
|
|
Template = template;
|
|
_isoTestObject = to;
|
|
if (sysBuilt)
|
|
{
|
|
SerialNumberConverted = to.TextL1;
|
|
TestObjectType = to.TestObjectType;
|
|
SysBuilt = true;
|
|
}
|
|
|
|
LocalOnly = to.LocalOnly;
|
|
_lastModifiedBy = to.LastModifiedBy;
|
|
_lastModified = to.LastModified;
|
|
foreach (var id in to.HardwareIds)
|
|
{
|
|
if (includedHardware.ContainsKey(id))
|
|
{
|
|
if (!ContainsHardware(includedHardware[id]))
|
|
{
|
|
AddHardware(includedHardware[id]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var da = DASHardwareList.GetList().GetHardware(id);
|
|
if (null != da && !ContainsHardware(da))
|
|
{
|
|
AddHardware(da);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private Visibility _channelVisibility = Visibility.Visible;
|
|
|
|
public Visibility ChannelVisibility
|
|
{
|
|
get => _channelVisibility;
|
|
set => SetProperty(ref _channelVisibility, value, Tags.ChannelVisibility.ToString());
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
var sb = new StringBuilder();
|
|
if (string.IsNullOrWhiteSpace(TemplateDescription))
|
|
{
|
|
sb.Append(SerialNumberOrOriginalSerialNumber);
|
|
}
|
|
else
|
|
{
|
|
sb.AppendFormat("{0} - {1}", SerialNumberOrOriginalSerialNumber, TemplateDescription);
|
|
}
|
|
return sb.ToString();
|
|
}
|
|
}
|
|
}
|