using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace DatabaseExport.ISO { public class TestObject { private List _allChannels = new List(); public TestObjectChannel[] AllChannels { get => _allChannels.ToArray(); set { _allChannels = new List(value); SortChannels(); } } public void SortChannels() { _allChannels.Sort(); } public TestObjectChannel GetChannel(string channelid) { return Array.Find(AllChannels, ch => ch.GetID() == channelid || ch.Name == channelid); } public override string ToString() { return Embedded ? DisplaySerialNumber : SerialNumber; } public string DisplaySerialNumber => SysBuilt ? SerialNumberConverted : OriginalSerialNumber; public string SerialNumberConverted { get; set; } public string SerialNumber { get; set; } public string SerialNumberOrOriginalSerialNumber => Embedded ? OriginalSerialNumber : SerialNumber; public string TestObjectType { get; set; } public string ParentObject { get; set; } public bool SysBuilt { get; set; } // public string TextL1 { get; set; } private List _hardwareIds = new List(); public string[] HardwareIds { get => _hardwareIds.ToArray(); set { _hardwareIds.Clear(); _hardwareIds.AddRange(value); } } public string Template { get; set; } public void SetTemplateOnly(string value) { Template = value; } public void SetTemplate(string value, ref ISO13499FileDb db) { Template = value; var template = ISO.TestObjectTemplate.GetTemplate(ref db, Template); SetTemplate(template); } public void SetTemplate(ISO.TestObjectTemplate template) { _allChannels.Clear(); if (null == template) return; Template = template.TemplateName; AllChannels = template.Channels.Select(c => new TestObjectChannel(c, this, template)).ToArray(); } private bool _localOnly; public bool LocalOnly { get => _localOnly; set => _localOnly = value; } private string _lastModifiedBy; public string LastModifiedBy { get => _lastModifiedBy; set => _lastModifiedBy = value; } private DateTime _lastModified; public DateTime LastModified { get => _lastModified; set => _lastModified = value; } private TestObject(DataRow dr, ref ISO13499FileDb db) { OriginalTemplate = ""; OriginalSerialNumber = ""; SerialNumberConverted = string.Empty; TestObjectGuts(dr, ref db); } public bool Embedded { get; set; } /// /// original serial number of this group (the serial number will be changed once it's embedded in a test setup) /// public string OriginalSerialNumber { get; set; } /// /// the original template for this group (the template is also changed once it's embedded in a test setup) /// public string OriginalTemplate { get; set; } private void TestObjectGuts(DataRow dr, ref ISO13499FileDb db) { SerialNumber = (string)dr["SerialNumber"]; LocalOnly = Convert.ToBoolean(dr["LocalOnly"]); SetTemplate((string)dr["Template"], ref db); LastModifiedBy = (string)dr["LastModifiedBy"]; LastModified = Convert.ToDateTime(dr["LastModified"]); SysBuilt = Convert.ToBoolean(dr["SysBuilt"]); var o = dr["Embedded"]; if (!DBNull.Value.Equals(o)) { Embedded = Convert.ToBoolean(o); } o = dr["OrigSerialNumber"]; if (!DBNull.Value.Equals(o)) { OriginalSerialNumber = Convert.ToString(o); } o = dr["OrigTEmplate"]; if (!DBNull.Value.Equals(o)) { OriginalTemplate = Convert.ToString(o); } try { if (!DBNull.Value.Equals(dr["ParentObject"])) { ParentObject = (string)dr["ParentObject"]; } } catch (Exception) { /*APILogger.Log(ex);*/ } try { using (var sql = DbOperations.GetCommand()) { DbOperations.CreateParam(sql, string.Format("@{0}", DbOperations.TestObjectChannelSettings.Fields.TestObjectSerial), SqlDbType.NVarChar, SerialNumber); sql.CommandText = string.Format("SELECT * from [{0}] where [{1}]=@{1}", DbOperations.TestObjectChannelSettings.TableName, DbOperations.TestObjectChannelSettings.Fields.TestObjectSerial); using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (ds.Tables[0].Rows.Count <= 0) return; foreach (DataRow row in ds.Tables[0].Rows) { try { var channelId = (string)row[DbOperations.TestObjectChannelSettings.Fields.ChannelId.ToString()]; var sensor = (string)row[DbOperations.TestObjectChannelSettings.Fields.SensorSerial.ToString()]; var settings = (string)row[DbOperations.TestObjectChannelSettings.Fields.Setting.ToString()]; if (string.IsNullOrEmpty(channelId) || string.IsNullOrEmpty(sensor) || string.IsNullOrEmpty(settings)) continue; var sensorsettings = GetSettingsFromString(settings, sensor, channelId); foreach (var setting in sensorsettings) { SetSensorSetting(channelId, sensor, setting); } } catch (Exception) {/* APILogger.Log(ex);*/ } } } } } catch (Exception) { /*APILogger.Log(ex); */} } public static SensorSetting[] GetSettingsFromString(string s, string sensor, string channelid) { var tokens = s.Split(','); return (from token in tokens select token.Split('=') into subtokens let setting = (SensorSettings)Convert.ToInt32(subtokens[0]) select new SensorSetting(setting, subtokens[1], channelid, sensor)).ToArray(); } public TestObject() { OriginalTemplate = ""; OriginalSerialNumber = ""; SerialNumberConverted = string.Empty; _allChannels = new List(); _hardwareIds = new List(); LastModified = DateTime.MinValue; LastModifiedBy = "N/A"; LocalOnly = false; SerialNumber = ""; Template = ""; ParentObject = ""; } public enum SensorSettings { Range, CFC, Polarity, Position, LimitDuration, Duration, Delay, OutputMode, SQMode, DIMode, DefaultValue, ActiveValue } public class SensorSetting { public string ChannelId { get; set; } public string SerialNumber { get; set; } public SensorSettings Setting { get; set; } public string Value { get; set; } public SensorSetting(SensorSettings setting, string value, string channelId, string serialNumber) { ChannelId = channelId; Value = value; Setting = setting; SerialNumber = serialNumber; } public SensorSetting(SensorSetting copy) { ChannelId = copy.ChannelId; Value = copy.Value; Setting = copy.Setting; SerialNumber = copy.SerialNumber; } } private Dictionary>> _sensorSettings = new Dictionary>>(); public SensorSetting[] GetSensorSettings(string channelId, string serialNumber) { if (!_sensorSettings.ContainsKey(channelId)) return new SensorSetting[0]; return _sensorSettings[channelId].ContainsKey(serialNumber) ? _sensorSettings[channelId][serialNumber].Values.ToArray() : new SensorSetting[0]; } public void SetSensorSetting(string channelId, string serialNumber, SensorSetting setting) { if (!_sensorSettings.ContainsKey(channelId)) { _sensorSettings[channelId] = new Dictionary>(); } if (!_sensorSettings[channelId].ContainsKey(serialNumber)) { _sensorSettings[channelId][serialNumber] = new Dictionary(); } _sensorSettings[channelId][serialNumber][setting.Setting] = setting; } public TestObject(TestObject copy, ref ISO13499FileDb db) { SerialNumberConverted = string.Empty; OriginalSerialNumber = copy.OriginalSerialNumber; OriginalTemplate = copy.OriginalTemplate; Embedded = copy.Embedded; _allChannels = new List(); var t = TestObjectTemplate.GetTemplate(ref db, Template); copy.SortChannels(); foreach (var c in copy.AllChannels) { _allChannels.Add(new TestObjectChannel(c, this, t)); } for (var i = 0; i < copy.AllChannels.Length && i < _allChannels.Count; i++) { _allChannels[i].ChannelIDX = i; } _hardwareIds = new List(copy.HardwareIds); LastModified = copy.LastModified; LastModifiedBy = copy.LastModifiedBy; LocalOnly = copy.LocalOnly; SerialNumber = copy.SerialNumber; Template = copy.Template; ParentObject = copy.ParentObject; SysBuilt = copy.SysBuilt; var e = copy._sensorSettings.GetEnumerator(); _sensorSettings = new Dictionary>>(); while (e.MoveNext()) { if (!_sensorSettings.ContainsKey(e.Current.Key)) { _sensorSettings[e.Current.Key] = new Dictionary>(); } var e2 = copy._sensorSettings[e.Current.Key].GetEnumerator(); while (e2.MoveNext()) { if (!_sensorSettings[e.Current.Key].ContainsKey(e2.Current.Key)) { _sensorSettings[e.Current.Key][e2.Current.Key] = new Dictionary(); } var e3 = copy._sensorSettings[e.Current.Key][e2.Current.Key].GetEnumerator(); while (e3.MoveNext()) { _sensorSettings[e.Current.Key][e2.Current.Key][e3.Current.Key] = new SensorSetting(e3.Current.Value); } } } } private const char CHANNEL_SEPARATOR = 'x'; private void GetHardwareAndSensors() { using (var sql = DbOperations.GetCommand()) { DbOperations.CreateParam(sql, "@TestObject", SqlDbType.NVarChar, SerialNumber); sql.CommandText = "SELECT [HardwareId] from [tblTestObjectHardware] WHERE [TestObject]=@TestObject"; using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (null != ds && ds.Tables.Count > 0) { var ids = new List(); for (var i = 0; i < ds.Tables[0].Rows.Count; i++) { var id = (string)ds.Tables[0].Rows[i]["HardwareId"]; var tokens = id.Split('_'); if (tokens.Length == 3) { var sb = new StringBuilder(); sb.AppendFormat("{0}_{1}", tokens[0], tokens[1]); var index = tokens[2].IndexOf(CHANNEL_SEPARATOR); if (index >= 0) { sb.Append(tokens[2].Substring(index)); } id = sb.ToString(); } if (!ids.Contains(id)) { ids.Add(id); } } _hardwareIds = ids; } } } var channelLookup = AllChannels.ToDictionary(ch => ch.GetID()); using (var sql = DbOperations.GetCommand()) { DbOperations.CreateParam(sql, "@TestObjectId", SqlDbType.NVarChar, SerialNumber); sql.CommandText = "SELECT [UIChannelID],[SensorId],[ZoneId],[HardwareId],[ChannelIdx] FROM [tblTestObjectSensors] WHERE [TestObjectId]=@TestObjectId"; using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (null != ds && ds.Tables.Count > 0) { foreach (DataRow dr in ds.Tables[0].Rows) { var id = Convert.ToString(dr[0]); var sensorId = ""; var hardwareId = ""; var channelIdx = -1; if (!DBNull.Value.Equals(dr["ChannelIdx"])) { channelIdx = Convert.ToInt32(dr["ChannelIdx"]); } if (!DBNull.Value.Equals(dr[1])) { sensorId = Convert.ToString(dr[1]); } if (!DBNull.Value.Equals(dr[3])) { hardwareId = Convert.ToString(dr[3]); var tokens = hardwareId.Split('_'); if (3 == tokens.Length) { var sb = new StringBuilder(); sb.AppendFormat("{0}_{1}", tokens[0], tokens[1]); var index = tokens[2].IndexOf('x'); if (index >= 0) { sb.Append(tokens[2].Substring(index)); } hardwareId = sb.ToString(); } } if (!channelLookup.ContainsKey(id)) continue; channelLookup[id].SensorSerialNumber = sensorId; channelLookup[id].HardwareId = hardwareId; channelLookup[id].ChannelIDX = channelIdx; } } } } SortChannels(); } public string GetSerializedSetting(SensorSetting[] settings) { var sb = new StringBuilder(); var bNeedComma = false; foreach (var setting in settings) { if (bNeedComma) { sb.Append(","); } bNeedComma = true; sb.AppendFormat("{0}={1}", (int)setting.Setting, setting.Value); } return sb.ToString(); } public static TestObject GetTestObject(string serialNumber, ref ISO13499FileDb db) { try { TestObject testObject = null; using (var sql = DbOperations.GetCommand()) { DbOperations.CreateParam(sql, "@1", SqlDbType.NVarChar, serialNumber); sql.CommandText = "Select * FROM [tblTestObjects] WHERE [SerialNumber] = @1"; using (var ds = DbOperations.Connection.QueryDataSet(sql)) { if (null != ds && ds.Tables[0].Rows.Count > 0) { //var testObject = new TestObject(ds.Tables[0].Rows[0], ref db); testObject = new TestObject(ds.Tables[0].Rows[0], ref db); testObject.GetHardwareAndSensors(); //return testObject; } } } return testObject; } catch (Exception) { /*APILogger.Log("failed to retrieve test objects", ex);*/ } return null; } } }